studium 0.14.16

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of studium might be problematic. Click here for more details.

Files changed (883) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +2987 -0
  3. data/bin/ask_exam_question +7 -0
  4. data/bin/check_description_of_these_lectures +7 -0
  5. data/bin/curriculum_module_displayer +7 -0
  6. data/bin/cycle +7 -0
  7. data/bin/d10 +7 -0
  8. data/bin/d100 +7 -0
  9. data/bin/d15 +7 -0
  10. data/bin/d20 +7 -0
  11. data/bin/d25 +7 -0
  12. data/bin/d3 +7 -0
  13. data/bin/d30 +7 -0
  14. data/bin/d5 +7 -0
  15. data/bin/determine_curricula +7 -0
  16. data/bin/display_lecture_url +7 -0
  17. data/bin/exam_registration_at +7 -0
  18. data/bin/exam_statistics +7 -0
  19. data/bin/exams_per_month +9 -0
  20. data/bin/finished_exams_at_this_university +7 -0
  21. data/bin/flashcards +7 -0
  22. data/bin/from_curriculum_id_to_university +9 -0
  23. data/bin/location_to_this_exam_topic.rb +7 -0
  24. data/bin/mandatory_continuous_assessment +7 -0
  25. data/bin/mandatory_upcoming_courses +10 -0
  26. data/bin/n_ECTS +7 -0
  27. data/bin/n_exam_questions_already_answered +16 -0
  28. data/bin/nquestions +7 -0
  29. data/bin/nsolved +7 -0
  30. data/bin/open_last_exam_question_asked_file +7 -0
  31. data/bin/passed_exams +7 -0
  32. data/bin/passed_pr/303/274fungsimmanente_courses +7 -0
  33. data/bin/pdf_for +7 -0
  34. data/bin/random_exam_topic +7 -0
  35. data/bin/report_solved_topics +7 -0
  36. data/bin/return_n_ects_from_this_file +7 -0
  37. data/bin/search_for_n_ects +7 -0
  38. data/bin/show_lectures_on_the_commandline +7 -0
  39. data/bin/show_themes +7 -0
  40. data/bin/solved +9 -0
  41. data/bin/solved_ects +7 -0
  42. data/bin/studienkennzahl +7 -0
  43. data/bin/studium +7 -0
  44. data/bin/studium_skeleton +7 -0
  45. data/bin/ufind +7 -0
  46. data/bin/upcoming_exams +7 -0
  47. data/bin/week_parser +7 -0
  48. data/doc/ECTS_CONSIDERATIONS.md +82 -0
  49. data/doc/HOW_TO_DETERMINE_WHICH_PART_IS_THE_QUESTION_AND_WHICH_PART_IS_THE_ANSWER.md +44 -0
  50. data/doc/README.gen +2947 -0
  51. data/doc/SQL_database_specification.md +46 -0
  52. data/doc/deprecated_components.md +24 -0
  53. data/doc/documentation_for_the_file_lecture_information.md +311 -0
  54. data/doc/elegant_colours.md +21 -0
  55. data/doc/statistics/yearly_statistics.md +5 -0
  56. data/doc/todo/todo_for_the_graphical_parts_of_the_studium_gem_including_www_related_aspects.md +32 -0
  57. data/doc/todo/todo_for_the_studium_gem.md +58 -0
  58. data/img/STUDIES.png +0 -0
  59. data/lib/studium/autoinclude.rb +7 -0
  60. data/lib/studium/base/base.rb +3054 -0
  61. data/lib/studium/base/prototype.rb +592 -0
  62. data/lib/studium/c/README.md +2 -0
  63. data/lib/studium/c/a.out +0 -0
  64. data/lib/studium/c/obtain_random_entry.c +11 -0
  65. data/lib/studium/check_and_sanitize/README.md +15 -0
  66. data/lib/studium/check_and_sanitize/check_curriculum_for_correct_separation_of_bachelor_and_master.rb +141 -0
  67. data/lib/studium/check_and_sanitize/check_for_all_exam_topics_being_registered.rb +118 -0
  68. data/lib/studium/check_and_sanitize/check_for_correct_themes_of_each_course.rb +100 -0
  69. data/lib/studium/check_and_sanitize/check_for_existing_description_of_this_lecture.rb +191 -0
  70. data/lib/studium/check_and_sanitize/check_important_exams.rb +113 -0
  71. data/lib/studium/check_and_sanitize/check_the_lecture_information_file.rb +163 -0
  72. data/lib/studium/check_and_sanitize/find_duplicate_lectures.rb +124 -0
  73. data/lib/studium/check_and_sanitize/missing_priority_entry.rb +44 -0
  74. data/lib/studium/check_and_sanitize/sanitize_lecture_information.rb +428 -0
  75. data/lib/studium/check_and_sanitize/sanitize_this_string_containing_the_lva_dates.rb +79 -0
  76. data/lib/studium/colours/colours.rb +572 -0
  77. data/lib/studium/colours/sfancy.rb +46 -0
  78. data/lib/studium/colours/sfile.rb +35 -0
  79. data/lib/studium/colours/simp.rb +40 -0
  80. data/lib/studium/colours/use_colours.rb +39 -0
  81. data/lib/studium/colours/use_this_colour_for_exam_questions_and_exam_answers.rb +80 -0
  82. data/lib/studium/commandline/commandline.rb +932 -0
  83. data/lib/studium/commandline/menu.rb +906 -0
  84. data/lib/studium/constants/colours.rb +14 -0
  85. data/lib/studium/constants/constants.rb +1708 -0
  86. data/lib/studium/constants/image_constants.rb +271 -0
  87. data/lib/studium/constants/regexes.rb +44 -0
  88. data/lib/studium/constants/web_constants.rb +28 -0
  89. data/lib/studium/css/project.css +267 -0
  90. data/lib/studium/curricula/curriculum.rb +210 -0
  91. data/lib/studium/curricula/curriculum_as_string.rb +280 -0
  92. data/lib/studium/curricula/curriculum_module_displayer/constants.rb +33 -0
  93. data/lib/studium/curricula/curriculum_module_displayer/curriculum_module_displayer.rb +417 -0
  94. data/lib/studium/curricula/curriculum_module_displayer/initialize.rb +25 -0
  95. data/lib/studium/curricula/curriculum_module_displayer/menu.rb +45 -0
  96. data/lib/studium/curricula/curriculum_module_displayer/reset.rb +74 -0
  97. data/lib/studium/curricula/curriculum_module_displayer/run.rb +20 -0
  98. data/lib/studium/curricula/curriculum_module_displayer/set_use_this_curriculum.rb +93 -0
  99. data/lib/studium/curricula/curriculum_module_displayer/show_and_report.rb +190 -0
  100. data/lib/studium/curricula/determine_curricula/constants.rb +11 -0
  101. data/lib/studium/curricula/determine_curricula/determine_curricula.rb +36 -0
  102. data/lib/studium/curricula/determine_curricula/help.rb +39 -0
  103. data/lib/studium/curricula/determine_curricula/initialize.rb +48 -0
  104. data/lib/studium/curricula/determine_curricula/menu.rb +151 -0
  105. data/lib/studium/curricula/determine_curricula/misc.rb +403 -0
  106. data/lib/studium/curricula/determine_curricula/report.rb +143 -0
  107. data/lib/studium/curricula/determine_curricula/reset.rb +59 -0
  108. data/lib/studium/curricula/determine_curricula/run.rb +19 -0
  109. data/lib/studium/curricula/determine_elective_courses_in_this_curriculum.rb +112 -0
  110. data/lib/studium/curricula/display_bachelor_curricula.rb +90 -0
  111. data/lib/studium/curricula/handle_curricula/README.md +9 -0
  112. data/lib/studium/curricula/handle_curricula/handle_curricula.rb +179 -0
  113. data/lib/studium/curricula/handle_curricula/misc.rb +705 -0
  114. data/lib/studium/curricula/mitteilungsbl/303/244tter/mitteilungsbl/303/244tter.rb +323 -0
  115. data/lib/studium/curricula/modules/display_on_the_commandline.rb +319 -0
  116. data/lib/studium/curricula/modules/return_n_ects_in_this_module.rb +75 -0
  117. data/lib/studium/curricula/n_percent_solved_in_this_curriculum.rb +75 -0
  118. data/lib/studium/curricula/prepare_individual_curriculum.rb +304 -0
  119. data/lib/studium/curricula/random_curriculum_creator/random_curriculum_creator.rb +163 -0
  120. data/lib/studium/curricula/show_lectures_of_this_curriculum.rb +114 -0
  121. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/constants.rb +11 -0
  122. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/initialize.rb +27 -0
  123. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/menu.rb +35 -0
  124. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/misc.rb +264 -0
  125. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/report.rb +163 -0
  126. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/reset.rb +64 -0
  127. data/lib/studium/curricula/show_lectures_of_this_curriculum_id/show_lectures_of_this_curriculum_id.rb +38 -0
  128. data/lib/studium/curricula/show_solved_percentage_among_the_registered_curricula.rb +87 -0
  129. data/lib/studium/curricula/sorted_individual_curricula.rb +121 -0
  130. data/lib/studium/ects/boku_ects_splitter.rb +128 -0
  131. data/lib/studium/ects/ects_per_university.rb +179 -0
  132. data/lib/studium/ects/ects_scanner.rb +141 -0
  133. data/lib/studium/ects/ects_to_university_parser.rb +142 -0
  134. data/lib/studium/ects/last_entry_is_curriculum.rb +150 -0
  135. data/lib/studium/ects/n_ects_in_these_lectures.rb +196 -0
  136. data/lib/studium/ects/n_ects_points_in_mandatory_presence_courses.rb +50 -0
  137. data/lib/studium/ects/return_n_ects_from_this_file.rb +59 -0
  138. data/lib/studium/ects/return_n_ects_from_this_url.rb +196 -0
  139. data/lib/studium/ects/search_for_n_ects.rb +614 -0
  140. data/lib/studium/ects/show_completed_ects_in_all_curricula.rb +191 -0
  141. data/lib/studium/ects/show_passed_credits_per_curriculum.rb +276 -0
  142. data/lib/studium/ects/simple_total_ects_points.rb +135 -0
  143. data/lib/studium/ects/solved_ects/constants.rb +19 -0
  144. data/lib/studium/ects/solved_ects/reset.rb +51 -0
  145. data/lib/studium/ects/solved_ects/solved_ects.rb +325 -0
  146. data/lib/studium/ects/solved_ects_per_university/reset.rb +25 -0
  147. data/lib/studium/ects/solved_ects_per_university/solved_ects_per_university.rb +106 -0
  148. data/lib/studium/ects/still_missing.rb +129 -0
  149. data/lib/studium/ects/sum_of_ects.rb +144 -0
  150. data/lib/studium/encoding/encoding.rb +108 -0
  151. data/lib/studium/exam_topics/RNAi_siRNA_and_miRNA +100 -0
  152. data/lib/studium/exam_topics/abfall_als_ressource +86 -0
  153. data/lib/studium/exam_topics/advanced_biochemistry +793 -0
  154. data/lib/studium/exam_topics/advanced_biotechnology +225 -0
  155. data/lib/studium/exam_topics/advanced_cellbiology +105 -0
  156. data/lib/studium/exam_topics/advanced_chemistry +518 -0
  157. data/lib/studium/exam_topics/advanced_microbiology +44 -0
  158. data/lib/studium/exam_topics/advanced_topics_in_plant_sciences +85 -0
  159. data/lib/studium/exam_topics/advanced_virology +229 -0
  160. data/lib/studium/exam_topics/ageing +117 -0
  161. data/lib/studium/exam_topics/agrar_ecology +63 -0
  162. data/lib/studium/exam_topics/agrarmarkt +74 -0
  163. data/lib/studium/exam_topics/agrarphysik +35 -0
  164. data/lib/studium/exam_topics/alcohols +29 -0
  165. data/lib/studium/exam_topics/algorithms +59 -0
  166. data/lib/studium/exam_topics/allergie +76 -0
  167. data/lib/studium/exam_topics/allgemeine_genetik +1006 -0
  168. data/lib/studium/exam_topics/allgemeine_mikrobiologie +977 -0
  169. data/lib/studium/exam_topics/aminoacids +447 -0
  170. data/lib/studium/exam_topics/analytische_chemie_1 +132 -0
  171. data/lib/studium/exam_topics/analytische_chemie_2 +31 -0
  172. data/lib/studium/exam_topics/anatomie +292 -0
  173. data/lib/studium/exam_topics/anorganische_chemie +323 -0
  174. data/lib/studium/exam_topics/anthropologie +117 -0
  175. data/lib/studium/exam_topics/antibodies_and_antigens +770 -0
  176. data/lib/studium/exam_topics/apoptosis +35 -0
  177. data/lib/studium/exam_topics/archaea +95 -0
  178. data/lib/studium/exam_topics/architecture +8 -0
  179. data/lib/studium/exam_topics/artificial_intelligence +85 -0
  180. data/lib/studium/exam_topics/atomemissionsspektrometrie +6 -0
  181. data/lib/studium/exam_topics/audio +11 -0
  182. data/lib/studium/exam_topics/bacteriophages +243 -0
  183. data/lib/studium/exam_topics/basic_biochemistry +1005 -0
  184. data/lib/studium/exam_topics/basic_biotechnology +1004 -0
  185. data/lib/studium/exam_topics/basic_chemistry +1007 -0
  186. data/lib/studium/exam_topics/basic_virology +1010 -0
  187. data/lib/studium/exam_topics/bauwesen +6 -0
  188. data/lib/studium/exam_topics/betriebssysteme +126 -0
  189. data/lib/studium/exam_topics/betriebswirtschaftslehre +29 -0
  190. data/lib/studium/exam_topics/bioanalytik_und_biosensoren +389 -0
  191. data/lib/studium/exam_topics/biochips +79 -0
  192. data/lib/studium/exam_topics/bioelektrochemie +57 -0
  193. data/lib/studium/exam_topics/biofilms +24 -0
  194. data/lib/studium/exam_topics/bioinformatics +507 -0
  195. data/lib/studium/exam_topics/biological_therapeutics +155 -0
  196. data/lib/studium/exam_topics/biologie +139 -0
  197. data/lib/studium/exam_topics/biomarkers +135 -0
  198. data/lib/studium/exam_topics/biomaterials +89 -0
  199. data/lib/studium/exam_topics/biomembranes +6 -0
  200. data/lib/studium/exam_topics/bionik +65 -0
  201. data/lib/studium/exam_topics/biophysik +34 -0
  202. data/lib/studium/exam_topics/biopolymers +10 -0
  203. data/lib/studium/exam_topics/bioprozesstechnik +149 -0
  204. data/lib/studium/exam_topics/bioressourcenmanagement +78 -0
  205. data/lib/studium/exam_topics/birds +3 -0
  206. data/lib/studium/exam_topics/bodenkunde +373 -0
  207. data/lib/studium/exam_topics/bodenmikrobiologie +40 -0
  208. data/lib/studium/exam_topics/cancerbiology +454 -0
  209. data/lib/studium/exam_topics/cell_cultures +221 -0
  210. data/lib/studium/exam_topics/cellbiology +1011 -0
  211. data/lib/studium/exam_topics/cellular_transport_and_protein_secretion +27 -0
  212. data/lib/studium/exam_topics/cellular_vesicles +11 -0
  213. data/lib/studium/exam_topics/cellulose +6 -0
  214. data/lib/studium/exam_topics/chemische_technologie_anorganischer_stoffe +209 -0
  215. data/lib/studium/exam_topics/chemische_technologie_organischer_stoffe +25 -0
  216. data/lib/studium/exam_topics/chemisches_labor +60 -0
  217. data/lib/studium/exam_topics/chemotaxis_quorum_sensing_and_motility_in_prokaryotes +91 -0
  218. data/lib/studium/exam_topics/citric_acid_cycle +80 -0
  219. data/lib/studium/exam_topics/clinical_microbiology +506 -0
  220. data/lib/studium/exam_topics/computer_science +284 -0
  221. data/lib/studium/exam_topics/computer_vision_and_computer_graphics +12 -0
  222. data/lib/studium/exam_topics/crispr +48 -0
  223. data/lib/studium/exam_topics/cyanobacteria +43 -0
  224. data/lib/studium/exam_topics/cytogenetics_and_chromosome_biology +570 -0
  225. data/lib/studium/exam_topics/cytokines +6 -0
  226. data/lib/studium/exam_topics/databases_and_sql +116 -0
  227. data/lib/studium/exam_topics/dna_mutation_and_dna_repair +69 -0
  228. data/lib/studium/exam_topics/dna_replication +57 -0
  229. data/lib/studium/exam_topics/ecogenetics +26 -0
  230. data/lib/studium/exam_topics/ecological_agriculture +12 -0
  231. data/lib/studium/exam_topics/ecology +317 -0
  232. data/lib/studium/exam_topics/economy +211 -0
  233. data/lib/studium/exam_topics/elektronenmikroskopie +356 -0
  234. data/lib/studium/exam_topics/elektrophorese +89 -0
  235. data/lib/studium/exam_topics/elektrotechnik_und_elektrizit/303/244t +41 -0
  236. data/lib/studium/exam_topics/elisa +54 -0
  237. data/lib/studium/exam_topics/embryologie_und_entwicklung +603 -0
  238. data/lib/studium/exam_topics/endospores_and_spores +104 -0
  239. data/lib/studium/exam_topics/enzymes_and_cofactors +353 -0
  240. data/lib/studium/exam_topics/epigenetik +184 -0
  241. data/lib/studium/exam_topics/erste_hilfe +158 -0
  242. data/lib/studium/exam_topics/ethik +138 -0
  243. data/lib/studium/exam_topics/evolution_and_evolutionary_genetics +356 -0
  244. data/lib/studium/exam_topics/excel +7 -0
  245. data/lib/studium/exam_topics/fish +19 -0
  246. data/lib/studium/exam_topics/fluorescence_microscopy +7 -0
  247. data/lib/studium/exam_topics/food_microbiology_and_food_biotechnology +83 -0
  248. data/lib/studium/exam_topics/forensik +11 -0
  249. data/lib/studium/exam_topics/forstwirtschaft +53 -0
  250. data/lib/studium/exam_topics/fortgeschrittene_genetik +576 -0
  251. data/lib/studium/exam_topics/fortgeschrittene_gentechnik +217 -0
  252. data/lib/studium/exam_topics/fortgeschrittene_physik +6 -0
  253. data/lib/studium/exam_topics/fungi +80 -0
  254. data/lib/studium/exam_topics/genetische_krankheiten +187 -0
  255. data/lib/studium/exam_topics/genexpression +1008 -0
  256. data/lib/studium/exam_topics/genomics_and_metagenomics +272 -0
  257. data/lib/studium/exam_topics/gentechnik_und_praktische_biochemie +928 -0
  258. data/lib/studium/exam_topics/geochemistry +67 -0
  259. data/lib/studium/exam_topics/geography +8 -0
  260. data/lib/studium/exam_topics/geologie_und_mineralogie +626 -0
  261. data/lib/studium/exam_topics/geometrie +54 -0
  262. data/lib/studium/exam_topics/geschichte +94 -0
  263. data/lib/studium/exam_topics/gluconeogenesis +64 -0
  264. data/lib/studium/exam_topics/glycogen +25 -0
  265. data/lib/studium/exam_topics/glycolysis +109 -0
  266. data/lib/studium/exam_topics/glykomik +101 -0
  267. data/lib/studium/exam_topics/glyoxylatzyklus +31 -0
  268. data/lib/studium/exam_topics/grassland_cultivation +32 -0
  269. data/lib/studium/exam_topics/hormone +139 -0
  270. data/lib/studium/exam_topics/html +7 -0
  271. data/lib/studium/exam_topics/human_ecology +8 -0
  272. data/lib/studium/exam_topics/hygiene +224 -0
  273. data/lib/studium/exam_topics/imaging_and_microscopy +265 -0
  274. data/lib/studium/exam_topics/immunanalytik +94 -0
  275. data/lib/studium/exam_topics/immunologie +998 -0
  276. data/lib/studium/exam_topics/informatik +103 -0
  277. data/lib/studium/exam_topics/innate_immunity +24 -0
  278. data/lib/studium/exam_topics/insekten +64 -0
  279. data/lib/studium/exam_topics/insulin_and_diabetes +57 -0
  280. data/lib/studium/exam_topics/java +597 -0
  281. data/lib/studium/exam_topics/javascript +14 -0
  282. data/lib/studium/exam_topics/klima +6 -0
  283. data/lib/studium/exam_topics/kryptographie +9 -0
  284. data/lib/studium/exam_topics/landtechnik +26 -0
  285. data/lib/studium/exam_topics/lebensmittel +222 -0
  286. data/lib/studium/exam_topics/lebensmitteltechnologie +16 -0
  287. data/lib/studium/exam_topics/linux +5 -0
  288. data/lib/studium/exam_topics/lipids +95 -0
  289. data/lib/studium/exam_topics/macroeconomics +40 -0
  290. data/lib/studium/exam_topics/marketing +7 -0
  291. data/lib/studium/exam_topics/mathematics +280 -0
  292. data/lib/studium/exam_topics/medizin_und_biomedizinische_technik +251 -0
  293. data/lib/studium/exam_topics/medizinische_chemie_und_pharmazie +416 -0
  294. data/lib/studium/exam_topics/messtechnik_und_regeltechnik +104 -0
  295. data/lib/studium/exam_topics/metabolismus +423 -0
  296. data/lib/studium/exam_topics/meteorologie_und_atmosph/303/244re +91 -0
  297. data/lib/studium/exam_topics/microbial_ecology +35 -0
  298. data/lib/studium/exam_topics/microcontrollers +11 -0
  299. data/lib/studium/exam_topics/mikrobielle_lebensgemeinschaften +33 -0
  300. data/lib/studium/exam_topics/mikrobielle_physiologie +204 -0
  301. data/lib/studium/exam_topics/mitochondria +33 -0
  302. data/lib/studium/exam_topics/mixed +286 -0
  303. data/lib/studium/exam_topics/molecular_biology_of_plants +249 -0
  304. data/lib/studium/exam_topics/molekulare_medizin +133 -0
  305. data/lib/studium/exam_topics/nanotechnologie +453 -0
  306. data/lib/studium/exam_topics/nature_conservation_and_biodiversity +211 -0
  307. data/lib/studium/exam_topics/naturstoffe +9 -0
  308. data/lib/studium/exam_topics/netzwerke +34 -0
  309. data/lib/studium/exam_topics/neurobiology +272 -0
  310. data/lib/studium/exam_topics/nucleotide_sequencing +38 -0
  311. data/lib/studium/exam_topics/nutztierethologie +11 -0
  312. data/lib/studium/exam_topics/object_oriented_modeling +14 -0
  313. data/lib/studium/exam_topics/obstbau +249 -0
  314. data/lib/studium/exam_topics/organische_chemie +1007 -0
  315. data/lib/studium/exam_topics/organische_chemie_2 +125 -0
  316. data/lib/studium/exam_topics/paleobiology +39 -0
  317. data/lib/studium/exam_topics/parasitic_diseases_and_molecular_infection_biology +336 -0
  318. data/lib/studium/exam_topics/patent_law +55 -0
  319. data/lib/studium/exam_topics/pathologie +723 -0
  320. data/lib/studium/exam_topics/pcr +152 -0
  321. data/lib/studium/exam_topics/pentosephosphatweg +41 -0
  322. data/lib/studium/exam_topics/peroxisomes_glycosomes_and_lysosomes +66 -0
  323. data/lib/studium/exam_topics/pflanzenanatomie +255 -0
  324. data/lib/studium/exam_topics/pflanzenbau +24 -0
  325. data/lib/studium/exam_topics/pflanzenschutz +35 -0
  326. data/lib/studium/exam_topics/pflanzenwissenschaften +1009 -0
  327. data/lib/studium/exam_topics/pharmaceutical_biotechnology +251 -0
  328. data/lib/studium/exam_topics/physik +443 -1
  329. data/lib/studium/exam_topics/physikalische_chemie +86 -0
  330. data/lib/studium/exam_topics/physiology_and_histology +520 -0
  331. data/lib/studium/exam_topics/phytochemie +33 -0
  332. data/lib/studium/exam_topics/plant_biotechnology +129 -0
  333. data/lib/studium/exam_topics/plant_breeding +64 -0
  334. data/lib/studium/exam_topics/plant_development +50 -0
  335. data/lib/studium/exam_topics/populationsgenetik +137 -0
  336. data/lib/studium/exam_topics/posttranslationale_modifikation_von_proteinen +195 -0
  337. data/lib/studium/exam_topics/projektmanagement +220 -0
  338. data/lib/studium/exam_topics/prokaryote_genetics +547 -0
  339. data/lib/studium/exam_topics/protein_engineering +16 -0
  340. data/lib/studium/exam_topics/proteolyse +36 -0
  341. data/lib/studium/exam_topics/proteomik +40 -0
  342. data/lib/studium/exam_topics/prozesstechnik +95 -0
  343. data/lib/studium/exam_topics/psychologie +14 -0
  344. data/lib/studium/exam_topics/python +355 -0
  345. data/lib/studium/exam_topics/quality_management +263 -0
  346. data/lib/studium/exam_topics/rechtsgrundlagen +116 -0
  347. data/lib/studium/exam_topics/research_topics_in_immunobiology +42 -0
  348. data/lib/studium/exam_topics/rna_and_dna +457 -0
  349. data/lib/studium/exam_topics/rna_seq +11 -0
  350. data/lib/studium/exam_topics/robotik +6 -0
  351. data/lib/studium/exam_topics/ruby +183 -0
  352. data/lib/studium/exam_topics/ruby_on_rails +63 -0
  353. data/lib/studium/exam_topics/scientific_writing_and_publishing +38 -0
  354. data/lib/studium/exam_topics/semisynthese_von_proteinen_und_nukleotiden +120 -0
  355. data/lib/studium/exam_topics/sexualbiologie +108 -0
  356. data/lib/studium/exam_topics/signal_transduction_and_laser_systems +197 -0
  357. data/lib/studium/exam_topics/splicing_exons_and_introns +63 -0
  358. data/lib/studium/exam_topics/statistik +241 -0
  359. data/lib/studium/exam_topics/stemcells +159 -0
  360. data/lib/studium/exam_topics/stickstofffixierung +76 -0
  361. data/lib/studium/exam_topics/structural_bioinformatics +54 -0
  362. data/lib/studium/exam_topics/strukturbiologie +387 -0
  363. data/lib/studium/exam_topics/system_biology_and_synthetic_biology +103 -0
  364. data/lib/studium/exam_topics/systematische_zoologie +436 -0
  365. data/lib/studium/exam_topics/technical_ecology +144 -0
  366. data/lib/studium/exam_topics/technische_chemie +204 -0
  367. data/lib/studium/exam_topics/technische_grundlagen_der_informatik +39 -0
  368. data/lib/studium/exam_topics/technische_mikrobiologie +393 -0
  369. data/lib/studium/exam_topics/technisches_zeichnen +5 -0
  370. data/lib/studium/exam_topics/the_bacterial_cell_wall +97 -0
  371. data/lib/studium/exam_topics/the_c_plus_plus_programming_language +491 -0
  372. data/lib/studium/exam_topics/the_c_programming_language +129 -0
  373. data/lib/studium/exam_topics/the_cellcycle +89 -0
  374. data/lib/studium/exam_topics/the_european_union +119 -0
  375. data/lib/studium/exam_topics/the_interferon_system +39 -0
  376. data/lib/studium/exam_topics/the_microbiome +164 -0
  377. data/lib/studium/exam_topics/the_universe +26 -0
  378. data/lib/studium/exam_topics/theoretische_chemie +5 -0
  379. data/lib/studium/exam_topics/theoretische_informatik +157 -0
  380. data/lib/studium/exam_topics/thermodynamics +3 -0
  381. data/lib/studium/exam_topics/tierzucht +139 -0
  382. data/lib/studium/exam_topics/toxikologie +447 -0
  383. data/lib/studium/exam_topics/transcription +164 -0
  384. data/lib/studium/exam_topics/translation_ribosomes_and_translational_control +144 -0
  385. data/lib/studium/exam_topics/umweltbiotechnologie +64 -0
  386. data/lib/studium/exam_topics/umweltchemie +233 -0
  387. data/lib/studium/exam_topics/urbanism_and_traffic +19 -0
  388. data/lib/studium/exam_topics/urea_cycle +55 -0
  389. data/lib/studium/exam_topics/vaccines_and_vaccination +246 -0
  390. data/lib/studium/exam_topics/vectors_and_gene_therapy +246 -0
  391. data/lib/studium/exam_topics/verfahrenstechnik +37 -0
  392. data/lib/studium/exam_topics/veterinary_medicine +10 -0
  393. data/lib/studium/exam_topics/vitamine +25 -0
  394. data/lib/studium/exam_topics/wasserkunde +137 -0
  395. data/lib/studium/exam_topics/weinbau +82 -0
  396. data/lib/studium/exam_topics/wissenschaft +18 -0
  397. data/lib/studium/exam_topics/yeast +102 -0
  398. data/lib/studium/exam_topics/zoologie +333 -0
  399. data/lib/studium/exams/afterburn/afterburn.rb +257 -0
  400. data/lib/studium/exams/ask_exam_from_the_upcoming_exams_pool.rb +150 -0
  401. data/lib/studium/exams/ask_exam_topic_question.rb +112 -0
  402. data/lib/studium/exams/ask_question_from_alias.rb +141 -0
  403. data/lib/studium/exams/ask_question_from_any_of_the_still_missing_lectures.rb +131 -0
  404. data/lib/studium/exams/ask_question_from_grouped_themes.rb +141 -0
  405. data/lib/studium/exams/ask_question_from_last_topic.rb +91 -0
  406. data/lib/studium/exams/ask_random_question.rb +195 -0
  407. data/lib/studium/exams/autoinclude.rb +7 -0
  408. data/lib/studium/exams/average_grade.rb +396 -0
  409. data/lib/studium/exams/csv/create_csv_passed_exams_file.rb +217 -0
  410. data/lib/studium/exams/cycle.rb +291 -0
  411. data/lib/studium/exams/dataset.rb +124 -0
  412. data/lib/studium/exams/designate_ten_random_exam_topics/designate_ten_random_exam_topics.rb +88 -0
  413. data/lib/studium/exams/exam/exam.rb +130 -0
  414. data/lib/studium/exams/exam_question/README.md +3 -0
  415. data/lib/studium/exams/exam_question/answer.rb +193 -0
  416. data/lib/studium/exams/exam_question/constants.rb +111 -0
  417. data/lib/studium/exams/exam_question/exam_question.rb +1136 -0
  418. data/lib/studium/exams/exam_question/menu.rb +333 -0
  419. data/lib/studium/exams/exam_question/misc.rb +898 -0
  420. data/lib/studium/exams/exam_question/question.rb +91 -0
  421. data/lib/studium/exams/exam_question/reset.rb +96 -0
  422. data/lib/studium/exams/exam_registration_at/constants.rb +49 -0
  423. data/lib/studium/exams/exam_registration_at/exam_registration_at.rb +242 -0
  424. data/lib/studium/exams/exam_registration_at/help.rb +46 -0
  425. data/lib/studium/exams/exam_registration_at/menu.rb +81 -0
  426. data/lib/studium/exams/exam_registration_at/report_and_show.rb +133 -0
  427. data/lib/studium/exams/exam_registration_at/reset.rb +54 -0
  428. data/lib/studium/exams/exam_statistics_from_this_file/exam_statistics_from_this_file.rb +119 -0
  429. data/lib/studium/exams/exam_topics.rb +194 -0
  430. data/lib/studium/exams/exams.rb +20 -0
  431. data/lib/studium/exams/exams_per_month/exams_per_month.rb +2438 -0
  432. data/lib/studium/exams/exams_this_week.rb +182 -0
  433. data/lib/studium/exams/fix_exam_dates.rb +121 -0
  434. data/lib/studium/exams/frozen.rb +36 -0
  435. data/lib/studium/exams/last_exams/last_exams.rb +398 -0
  436. data/lib/studium/exams/lectures_without_exam_entry.rb +137 -0
  437. data/lib/studium/exams/mandatory_continuous_assessment/mandatory_continuous_assessment.rb +1359 -0
  438. data/lib/studium/exams/move_the_last_exam_question_to_the_top_of_the_file/move_the_last_exam_question_to_the_top_of_the_file.rb +111 -0
  439. data/lib/studium/exams/n_exams_in_these_topics.rb +404 -0
  440. data/lib/studium/exams/next_exam.rb +107 -0
  441. data/lib/studium/exams/next_exams.rb +378 -0
  442. data/lib/studium/exams/open_exam_associated_url.rb +154 -0
  443. data/lib/studium/exams/open_last_exam_question_asked_file/constants.rb +15 -0
  444. data/lib/studium/exams/open_last_exam_question_asked_file/initialize.rb +29 -0
  445. data/lib/studium/exams/open_last_exam_question_asked_file/open_last_exam_question_asked_file.rb +109 -0
  446. data/lib/studium/exams/push_solved_questions_on_top.rb +180 -0
  447. data/lib/studium/exams/questions_solved_from_day_to_day/questions_solved_from_day_to_day.rb +377 -0
  448. data/lib/studium/exams/remote_ftp_url.rb +52 -0
  449. data/lib/studium/exams/repeat_last_question.rb +78 -0
  450. data/lib/studium/exams/show_all_passed_exams_of_this_university.rb +252 -0
  451. data/lib/studium/exams/show_backlog_of_exams.rb +117 -0
  452. data/lib/studium/exams/show_next_exams_for.rb +133 -0
  453. data/lib/studium/exams/show_themes/constants.rb +28 -0
  454. data/lib/studium/exams/show_themes/menu.rb +61 -0
  455. data/lib/studium/exams/show_themes/misc.rb +537 -0
  456. data/lib/studium/exams/show_themes/reset.rb +62 -0
  457. data/lib/studium/exams/show_themes/show_themes.rb +27 -0
  458. data/lib/studium/exams/show_upcoming_exams/show_upcoming_exams.rb +1146 -0
  459. data/lib/studium/exams/solve_all_questions_from_this_topic.rb +114 -0
  460. data/lib/studium/exams/solved/constants.rb +32 -0
  461. data/lib/studium/exams/solved/help.rb +24 -0
  462. data/lib/studium/exams/solved/initialize.rb +55 -0
  463. data/lib/studium/exams/solved/menu.rb +41 -0
  464. data/lib/studium/exams/solved/reset.rb +28 -0
  465. data/lib/studium/exams/solved/solved.rb +317 -0
  466. data/lib/studium/exams/timetable/timetable.rb +510 -0
  467. data/lib/studium/exams/unsolve_all_questions_from_this_topic.rb +162 -0
  468. data/lib/studium/exams/upcoming_exams/upcoming_exams.rb +556 -0
  469. data/lib/studium/exams/upcoming_exams_at_the_boku/constants.rb +23 -0
  470. data/lib/studium/exams/upcoming_exams_at_the_boku/html.rb +64 -0
  471. data/lib/studium/exams/upcoming_exams_at_the_boku/upcoming_exams_at_the_boku.rb +194 -0
  472. data/lib/studium/exams/upcoming_exams_dataset.rb +247 -0
  473. data/lib/studium/exams/upcoming_registered_exams/upcoming_registered_exams.rb +257 -0
  474. data/lib/studium/exams/upload_exam_topics.rb +360 -0
  475. data/lib/studium/graphviz/README.md +4 -0
  476. data/lib/studium/graphviz/bachelor_vector_based_strategies.dot +160 -0
  477. data/lib/studium/graphviz/master_vector_based_strategies.dot +46 -0
  478. data/lib/studium/gui/gtk3/README.md +1 -0
  479. data/lib/studium/gui/gtk3/ask_exam_question/ask_exam_question.config +6 -0
  480. data/lib/studium/gui/gtk3/ask_exam_question/ask_exam_question.rb +760 -0
  481. data/lib/studium/gui/gtk3/ask_exam_question/manifest.yml +12 -0
  482. data/lib/studium/gui/gtk3/control_panel/control_panel.rb +39 -0
  483. data/lib/studium/gui/gtk3/curriculum_viewer/curriculum_viewer.rb +510 -0
  484. data/lib/studium/gui/gtk3/ects_per_university/ects_per_university.rb +217 -0
  485. data/lib/studium/gui/gtk3/exam_question_widget/exam_question_widget.rb +1888 -0
  486. data/lib/studium/gui/gtk3/expand_time_range/expand_time_range.rb +34 -0
  487. data/lib/studium/gui/gtk3/information_about_a_lecture/information_about_a_lecture.rb +34 -0
  488. data/lib/studium/gui/gtk3/lecture_information/lecture_information.rb +200 -0
  489. data/lib/studium/gui/gtk3/show_upcoming_exams/show_upcoming_exams.rb +34 -0
  490. data/lib/studium/gui/java/exam_question/ExamQuestion$1.class +0 -0
  491. data/lib/studium/gui/java/exam_question/ExamQuestion.class +0 -0
  492. data/lib/studium/gui/java/exam_question/ExamQuestion.java +215 -0
  493. data/lib/studium/gui/javafx/exam_question_widget/exam_question_widget.rb +58 -0
  494. data/lib/studium/gui/jruby/exam_question_widget/exam_question_widget.rb +317 -0
  495. data/lib/studium/gui/libui/ask_exam_question/ask_exam_question.rb +349 -0
  496. data/lib/studium/gui/shared_code/control_panel/control_panel_module.rb +314 -0
  497. data/lib/studium/gui/shared_code/exam_question_widget/exam_question_widget_module.rb +39 -0
  498. data/lib/studium/gui/shared_code/expand_time_range/expand_time_range.css +0 -0
  499. data/lib/studium/gui/shared_code/expand_time_range/expand_time_range_module.rb +190 -0
  500. data/lib/studium/gui/shared_code/information_about_a_lecture/information_about_a_lecture_module.rb +180 -0
  501. data/lib/studium/gui/shared_code/show_upcoming_exams/show_upcoming_exams_module.rb +206 -0
  502. data/lib/studium/images/libui_ask_exam_question.png +0 -0
  503. data/lib/studium/images/outdated.png +0 -0
  504. data/lib/studium/images/small_logos/DNA.png +0 -0
  505. data/lib/studium/images/small_logos/README.md +2 -0
  506. data/lib/studium/images/small_logos/solved.png +0 -0
  507. data/lib/studium/images/studies_favicon.png +0 -0
  508. data/lib/studium/java/Mkdir.java +15 -0
  509. data/lib/studium/java/README.md +2 -0
  510. data/lib/studium/java/ask_exam_question/AskExamQuestion.class +0 -0
  511. data/lib/studium/java/ask_exam_question/AskExamQuestion.java +480 -0
  512. data/lib/studium/java/constants/Constants.class +0 -0
  513. data/lib/studium/java/constants/Constants.java +77 -0
  514. data/lib/studium/java/solved/Solved.class +0 -0
  515. data/lib/studium/java/solved/Solved.java +110 -0
  516. data/lib/studium/java/utility_scripts/OpenLastExamQuestionurlLinkViaTheBrowser.class +0 -0
  517. data/lib/studium/java/utility_scripts/OpenLastExamQuestionurlLinkViaTheBrowser.java +80 -0
  518. data/lib/studium/logging/README.md +2 -0
  519. data/lib/studium/logging/ensure_that_the_log_directory_exists.rb +47 -0
  520. data/lib/studium/logging/html_log_directory.rb +41 -0
  521. data/lib/studium/logging/log_directory.rb +112 -0
  522. data/lib/studium/logging/store_last_question_asked_into_file.rb +137 -0
  523. data/lib/studium/parsers/README.md +2 -0
  524. data/lib/studium/parsers/custom_exam_results_parser.rb +206 -0
  525. data/lib/studium/parsers/parse_lva_dates.rb +233 -0
  526. data/lib/studium/parsers/parse_remote_lecture.rb +331 -0
  527. data/lib/studium/project/project.rb +76 -0
  528. data/lib/studium/requires/common_popular_requires.rb +37 -0
  529. data/lib/studium/requires/commonly_used_requires.rb +14 -0
  530. data/lib/studium/requires/require_class_exams_solved.rb +7 -0
  531. data/lib/studium/requires/require_ects_scripts.rb +27 -0
  532. data/lib/studium/requires/require_encoding.rb +7 -0
  533. data/lib/studium/requires/require_the_check_and_sanitize_files.rb +31 -0
  534. data/lib/studium/requires/require_the_curricula_files.rb +28 -0
  535. data/lib/studium/requires/require_the_exam_question_class.rb +7 -0
  536. data/lib/studium/requires/require_the_exams_files.rb +45 -0
  537. data/lib/studium/requires/require_the_logging_files.rb +23 -0
  538. data/lib/studium/requires/require_the_parsers.rb +28 -0
  539. data/lib/studium/requires/require_the_studium_constants.rb +10 -0
  540. data/lib/studium/requires/require_the_studium_project.rb +60 -0
  541. data/lib/studium/requires/require_the_toplevel_methods.rb +27 -0
  542. data/lib/studium/requires/require_the_utility_scripts.rb +49 -0
  543. data/lib/studium/requires/require_upcoming_exams.rb +7 -0
  544. data/lib/studium/requires/require_yaml.rb +7 -0
  545. data/lib/studium/requires/return_remote_homepage_of_this_lecture.rb +7 -0
  546. data/lib/studium/requires/with_GUI.rb +13 -0
  547. data/lib/studium/requires/www_mode.rb +17 -0
  548. data/lib/studium/statistics/README.md +4 -0
  549. data/lib/studium/statistics/best_exam_months.rb +92 -0
  550. data/lib/studium/statistics/curriculum_comparer.rb +337 -0
  551. data/lib/studium/statistics/determine_exam_statistics_from_this_file.rb +142 -0
  552. data/lib/studium/statistics/exam_topics_that_are_about_to_be_completed.rb +119 -0
  553. data/lib/studium/statistics/max_stats.rb +170 -0
  554. data/lib/studium/statistics/new_questions_per_year.rb +147 -0
  555. data/lib/studium/statistics/report_how_many_ects_points_per_curriculum_were_completed.rb +167 -0
  556. data/lib/studium/statistics/report_how_many_exam_questions_were_answered.rb +473 -0
  557. data/lib/studium/statistics/show_exam_statistics.rb +66 -0
  558. data/lib/studium/statistics/show_which_courses_are_in_a_bachelor_or_master_curriculum_respectively.rb +104 -0
  559. data/lib/studium/statistics/top_stats.rb +127 -0
  560. data/lib/studium/toplevel_methods/all_passed_exams.rb +37 -0
  561. data/lib/studium/toplevel_methods/already_solved_this_lecture.rb +100 -0
  562. data/lib/studium/toplevel_methods/available_topics.rb +156 -0
  563. data/lib/studium/toplevel_methods/calculate_pr/303/274fungsimmanente_lectures_from_this_file.rb +55 -0
  564. data/lib/studium/toplevel_methods/copy_the_last_backup_of_file_lecture_information.rb +34 -0
  565. data/lib/studium/toplevel_methods/curriculum_related_code.rb +1082 -0
  566. data/lib/studium/toplevel_methods/determine_local_directory_of_this_lecture.rb +72 -0
  567. data/lib/studium/toplevel_methods/does_this_course_require_mandatory_presence.rb +51 -0
  568. data/lib/studium/toplevel_methods/download.rb +163 -0
  569. data/lib/studium/toplevel_methods/e.rb +16 -0
  570. data/lib/studium/toplevel_methods/ects_from_lectures.rb +250 -0
  571. data/lib/studium/toplevel_methods/editor.rb +65 -0
  572. data/lib/studium/toplevel_methods/esystem.rb +22 -0
  573. data/lib/studium/toplevel_methods/filter_away_invalid_questions.rb +77 -0
  574. data/lib/studium/toplevel_methods/find_exam_topic_and_exam_title.rb +3538 -0
  575. data/lib/studium/toplevel_methods/handle_archive_of_the_exam_questions.rb +136 -0
  576. data/lib/studium/toplevel_methods/has_this_lecture_been_already_passed_but_the_id_was_changed_lateron.rb +42 -0
  577. data/lib/studium/toplevel_methods/has_this_module_been_completed.rb +206 -0
  578. data/lib/studium/toplevel_methods/install_the_project_on_the_given_hostsystem.rb +32 -0
  579. data/lib/studium/toplevel_methods/is_on_roebe.rb +26 -0
  580. data/lib/studium/toplevel_methods/is_this_exam_topic_included.rb +46 -0
  581. data/lib/studium/toplevel_methods/is_this_homepage_registered.rb +31 -0
  582. data/lib/studium/toplevel_methods/is_this_lecture_a_practical_course.rb +93 -0
  583. data/lib/studium/toplevel_methods/is_this_lecture_registered_in_upcoming_exams.rb +42 -0
  584. data/lib/studium/toplevel_methods/java.rb +32 -0
  585. data/lib/studium/toplevel_methods/lecture_information.rb +108 -0
  586. data/lib/studium/toplevel_methods/lva_numbers.rb +355 -0
  587. data/lib/studium/toplevel_methods/main_dataset.rb +73 -0
  588. data/lib/studium/toplevel_methods/map_input_to_this_curriculum_filename.rb +595 -0
  589. data/lib/studium/toplevel_methods/methods_related_to_directories.rb +225 -0
  590. data/lib/studium/toplevel_methods/methods_related_to_files.rb +209 -0
  591. data/lib/studium/toplevel_methods/misc.rb +288 -0
  592. data/lib/studium/toplevel_methods/n_questions_available.rb +137 -0
  593. data/lib/studium/toplevel_methods/n_topics_available.rb +63 -0
  594. data/lib/studium/toplevel_methods/names_of_all_solved_exams.rb +71 -0
  595. data/lib/studium/toplevel_methods/note_down_the_start_time_and_how_many_exams_have_been_already_solved.rb +69 -0
  596. data/lib/studium/toplevel_methods/opnn.rb +25 -0
  597. data/lib/studium/toplevel_methods/passed_this_exam_on.rb +105 -0
  598. data/lib/studium/toplevel_methods/pristine.rb +69 -0
  599. data/lib/studium/toplevel_methods/read_delay_between_questions_from_file.rb +34 -0
  600. data/lib/studium/toplevel_methods/regexes.rb +90 -0
  601. data/lib/studium/toplevel_methods/registered_for_this_exam.rb +82 -0
  602. data/lib/studium/toplevel_methods/remove_comments.rb +26 -0
  603. data/lib/studium/toplevel_methods/remove_exam_topics_that_were_already_answered.rb +27 -0
  604. data/lib/studium/toplevel_methods/remove_tags.rb +32 -0
  605. data/lib/studium/toplevel_methods/report.rb +435 -0
  606. data/lib/studium/toplevel_methods/return_all_exams_on_this_day.rb +66 -0
  607. data/lib/studium/toplevel_methods/return_dataset_for_this_exam_topic.rb +41 -0
  608. data/lib/studium/toplevel_methods/return_ects_from_this_lecture_stored_in_the_file_lecture_information.rb +194 -0
  609. data/lib/studium/toplevel_methods/return_hash_of_already_solved_lectures.rb +46 -0
  610. data/lib/studium/toplevel_methods/return_last_exam_question.rb +34 -0
  611. data/lib/studium/toplevel_methods/return_local_path_of_this_pwdstud.rb +60 -0
  612. data/lib/studium/toplevel_methods/return_lva_number_of_this_lecture.rb +72 -0
  613. data/lib/studium/toplevel_methods/return_n_percent_solved_from_this_topic.rb +90 -0
  614. data/lib/studium/toplevel_methods/return_n_questions_were_answered_for_this_topic.rb +60 -0
  615. data/lib/studium/toplevel_methods/return_proper_university_image.rb +86 -0
  616. data/lib/studium/toplevel_methods/return_question_answer_string_from_this_topic.rb +63 -0
  617. data/lib/studium/toplevel_methods/return_remote_homepage_of_this_lecture.rb +10951 -0
  618. data/lib/studium/toplevel_methods/return_remote_moodle_link_of_this_lecture.rb +2201 -0
  619. data/lib/studium/toplevel_methods/return_sanitized_dataset_from_the_file_lecture_information.rb +110 -0
  620. data/lib/studium/toplevel_methods/return_theme_of_the_next_upcoming_exam.rb +38 -0
  621. data/lib/studium/toplevel_methods/rinstall2.rb +34 -0
  622. data/lib/studium/toplevel_methods/rti_conflict.rb +35 -0
  623. data/lib/studium/toplevel_methods/runmode.rb +87 -0
  624. data/lib/studium/toplevel_methods/sanitized_dataset_from_file_passed_exams_per_month.rb +52 -0
  625. data/lib/studium/toplevel_methods/set_last_file_for_exam_questions.rb +64 -0
  626. data/lib/studium/toplevel_methods/set_this_cd_alias_to.rb +86 -0
  627. data/lib/studium/toplevel_methods/show_passed_exams_having_this_grade.rb +34 -0
  628. data/lib/studium/toplevel_methods/spacer.rb +18 -0
  629. data/lib/studium/toplevel_methods/time.rb +297 -0
  630. data/lib/studium/toplevel_methods/total_ects_points_passed.rb +72 -0
  631. data/lib/studium/toplevel_methods/try_to_guess_the_most_likely_lva_id.rb +57 -0
  632. data/lib/studium/toplevel_methods/try_to_return_the_expanded_name_of_this_lecture.rb +63 -0
  633. data/lib/studium/toplevel_methods/unfinished.rb +51 -0
  634. data/lib/studium/toplevel_methods/url.rb +100 -0
  635. data/lib/studium/toplevel_methods/verbose_truth.rb +36 -0
  636. data/lib/studium/toplevel_methods/when_was_this_lecture_passed.rb +54 -0
  637. data/lib/studium/toplevel_methods/word_wrap.rb +56 -0
  638. data/lib/studium/toplevel_methods/write_into_file_related_functionality.rb +195 -0
  639. data/lib/studium/toplevel_methods/yes_or_no_ja_oder_nein.rb +33 -0
  640. data/lib/studium/universities_in_austria/README.md +2 -0
  641. data/lib/studium/universities_in_austria/boku/README.md +4 -0
  642. data/lib/studium/universities_in_austria/boku/boku_/303/266ffnungszeiten.rb +28 -0
  643. data/lib/studium/universities_in_austria/boku/show_three_pillars_of_these_lectures.rb +110 -0
  644. data/lib/studium/universities_in_austria/boku/three_pillars.rb +237 -0
  645. data/lib/studium/universities_in_austria/tu_vienna/README.md +6 -0
  646. data/lib/studium/universities_in_austria/tu_vienna/tu_ferien.rb +42 -0
  647. data/lib/studium/universities_in_austria/tu_vienna/tu_/303/266ffnungszeiten.rb +34 -0
  648. data/lib/studium/university_course/university_course.rb +384 -0
  649. data/lib/studium/utility_scripts/attribute_lecture_to_curriculum/attribute_boku_lecture_to_curriculum.rb +384 -0
  650. data/lib/studium/utility_scripts/attribute_lecture_to_curriculum/attribute_lecture_to_curriculum.rb +238 -0
  651. data/lib/studium/utility_scripts/attribute_lectures_to_university/attribute_lectures_to_university.rb +375 -0
  652. data/lib/studium/utility_scripts/audio_stats.rb +171 -0
  653. data/lib/studium/utility_scripts/auto_stud/auto_stud.rb +252 -0
  654. data/lib/studium/utility_scripts/auto_stud/constants.rb +18 -0
  655. data/lib/studium/utility_scripts/auto_stud/initialize.rb +23 -0
  656. data/lib/studium/utility_scripts/auto_stud/misc.rb +18 -0
  657. data/lib/studium/utility_scripts/autopurge_this_lecture_date.rb +93 -0
  658. data/lib/studium/utility_scripts/average_grade_of_this_curriculum.rb +143 -0
  659. data/lib/studium/utility_scripts/blocked_courses.rb +141 -0
  660. data/lib/studium/utility_scripts/calendar/README.md +2 -0
  661. data/lib/studium/utility_scripts/calendar/calendar.rb +251 -0
  662. data/lib/studium/utility_scripts/calendar/misc.rb +35 -0
  663. data/lib/studium/utility_scripts/check_description_of_these_lectures.rb +221 -0
  664. data/lib/studium/utility_scripts/course_registrations/course_registrations.rb +98 -0
  665. data/lib/studium/utility_scripts/create/README.md +2 -0
  666. data/lib/studium/utility_scripts/create/webpage_of_university.rb +129 -0
  667. data/lib/studium/utility_scripts/create/webpage_of_university_BOKU.rb +59 -0
  668. data/lib/studium/utility_scripts/create/webpage_of_university_TU.rb +58 -0
  669. data/lib/studium/utility_scripts/create/webpage_of_university_UniWien.rb +57 -0
  670. data/lib/studium/utility_scripts/create_database/create_database.rb +106 -0
  671. data/lib/studium/utility_scripts/current_lectures_belonging_to_both_bachelor_and_master_curriculum.rb +113 -0
  672. data/lib/studium/utility_scripts/currently_participating_in_these_lectures/currently_participating_in_these_lectures.rb +104 -0
  673. data/lib/studium/utility_scripts/display_lecture_url.rb +176 -0
  674. data/lib/studium/utility_scripts/expand_time_range/expand_time_range.rb +488 -0
  675. data/lib/studium/utility_scripts/finished_exams_at_this_university.rb +94 -0
  676. data/lib/studium/utility_scripts/foreign_language_percentage/constants.rb +23 -0
  677. data/lib/studium/utility_scripts/foreign_language_percentage/foreign_language_percentage.rb +149 -0
  678. data/lib/studium/utility_scripts/foreign_language_percentage/help.rb +31 -0
  679. data/lib/studium/utility_scripts/foreign_language_percentage/initialize.rb +25 -0
  680. data/lib/studium/utility_scripts/foreign_language_percentage/menu.rb +158 -0
  681. data/lib/studium/utility_scripts/foreign_language_percentage/report.rb +62 -0
  682. data/lib/studium/utility_scripts/foreign_language_percentage/reset.rb +50 -0
  683. data/lib/studium/utility_scripts/foreign_language_percentage/run.rb +19 -0
  684. data/lib/studium/utility_scripts/generate_spreadsheet/generate_spreadsheet.rb +354 -0
  685. data/lib/studium/utility_scripts/generate_spreadsheet/misc.rb +144 -0
  686. data/lib/studium/utility_scripts/holidays/holidays.rb +150 -0
  687. data/lib/studium/utility_scripts/homepage_of_these_courses.rb +118 -0
  688. data/lib/studium/utility_scripts/lecture_downloader.rb +107 -0
  689. data/lib/studium/utility_scripts/lectures_attributed_to_universities.rb +336 -0
  690. data/lib/studium/utility_scripts/lva_dates_of_the_important_courses.rb +111 -0
  691. data/lib/studium/utility_scripts/lva_nummer.rb +431 -0
  692. data/lib/studium/utility_scripts/mandatory_lectures_in_this_month/mandatory_lectures_in_this_month.rb +316 -0
  693. data/lib/studium/utility_scripts/name_of_this_lva_id.rb +110 -0
  694. data/lib/studium/utility_scripts/new_stud.rb +324 -0
  695. data/lib/studium/utility_scripts/next_week.rb +103 -0
  696. data/lib/studium/utility_scripts/open_last_exam_question_url_link_via_the_browser.rb +76 -0
  697. data/lib/studium/utility_scripts/passed_ects_per_year/passed_ects_per_year.rb +288 -0
  698. data/lib/studium/utility_scripts/passed_pr/303/274fungsimmanente_courses/passed_pr/303/274fungsimmanente_courses.rb +181 -0
  699. data/lib/studium/utility_scripts/pdf/README.md +2 -0
  700. data/lib/studium/utility_scripts/pdf/create_pdf_file_for_this_exam_topic.rb +355 -0
  701. data/lib/studium/utility_scripts/pdf/hexapdf_support.rb +50 -0
  702. data/lib/studium/utility_scripts/preparatory_meetings/preparatory_meetings.rb +312 -0
  703. data/lib/studium/utility_scripts/priority.rb +164 -0
  704. data/lib/studium/utility_scripts/priority_points/priority_points.rb +263 -0
  705. data/lib/studium/utility_scripts/publish_my_exams.rb +174 -0
  706. data/lib/studium/utility_scripts/regexes/README.md +1 -0
  707. data/lib/studium/utility_scripts/regexes/generate_regex.rb +314 -0
  708. data/lib/studium/utility_scripts/regexes/generate_regexes_for_the_available_moodle_links.rb +55 -0
  709. data/lib/studium/utility_scripts/regexes/generate_regexes_for_the_registered_lectures.rb +48 -0
  710. data/lib/studium/utility_scripts/report_outdated_timetable_entries/report_outdated_timetable_entries.rb +142 -0
  711. data/lib/studium/utility_scripts/report_total_amount_of_questions_and_answers_for.rb +116 -0
  712. data/lib/studium/utility_scripts/report_whether_this_lecture_is_registered_in_the_file_lecture_information.rb +128 -0
  713. data/lib/studium/utility_scripts/resolve_practical_courses_date_conflicts/individual_resolve_practical_courses_date_conflicts.rb +254 -0
  714. data/lib/studium/utility_scripts/resolve_practical_courses_date_conflicts/resolve_practical_courses_date_conflicts.rb +265 -0
  715. data/lib/studium/utility_scripts/scrape_remote_university_url.rb +138 -0
  716. data/lib/studium/utility_scripts/semester_schedule_creator/semester_container.rb +144 -0
  717. data/lib/studium/utility_scripts/semester_schedule_creator/semester_schedule_creator.rb +374 -0
  718. data/lib/studium/utility_scripts/semesterplaner.rb +289 -0
  719. data/lib/studium/utility_scripts/set_aliases_based_on_this_file.rb +97 -0
  720. data/lib/studium/utility_scripts/show_all_passed_master_lectures.rb +119 -0
  721. data/lib/studium/utility_scripts/show_conflicting_lva_lectures/show_conflicting_lva_lectures.rb +1339 -0
  722. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/constants.rb +23 -0
  723. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/menu.rb +63 -0
  724. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/reset.rb +33 -0
  725. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/run.rb +50 -0
  726. data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/show_descriptions_of_lectures_belonging_to_this_module.rb +145 -0
  727. data/lib/studium/utility_scripts/show_lecturers/show_lecturers.rb +147 -0
  728. data/lib/studium/utility_scripts/show_lectures/constants.rb +11 -0
  729. data/lib/studium/utility_scripts/show_lectures/help.rb +35 -0
  730. data/lib/studium/utility_scripts/show_lectures/initialize.rb +23 -0
  731. data/lib/studium/utility_scripts/show_lectures/menu.rb +138 -0
  732. data/lib/studium/utility_scripts/show_lectures/misc.rb +606 -0
  733. data/lib/studium/utility_scripts/show_lectures/reset.rb +89 -0
  734. data/lib/studium/utility_scripts/show_lectures/run.rb +28 -0
  735. data/lib/studium/utility_scripts/show_lectures/show_lectures.rb +49 -0
  736. data/lib/studium/utility_scripts/show_lectures_fitting_to_this_language/show_lectures_fitting_to_this_language.rb +121 -0
  737. data/lib/studium/utility_scripts/show_lectures_fitting_to_this_theme/show_lectures_fitting_to_this_theme.rb +105 -0
  738. data/lib/studium/utility_scripts/show_lectures_on_the_commandline/show_lectures_on_the_commandline.rb +3142 -0
  739. data/lib/studium/utility_scripts/show_lectures_on_this_day.rb +149 -0
  740. data/lib/studium/utility_scripts/show_lva_dates_of_this_lecture.rb +169 -0
  741. data/lib/studium/utility_scripts/show_mixed_bachelor_master_courses/show_mixed_bachelor_master_courses.rb +91 -0
  742. data/lib/studium/utility_scripts/show_outdated_lva_dates/show_outdated_lva_dates.rb +210 -0
  743. data/lib/studium/utility_scripts/show_solved_english_lectures/show_solved_english_lectures.rb +139 -0
  744. data/lib/studium/utility_scripts/steop/README.md +4 -0
  745. data/lib/studium/utility_scripts/steop/show_all_steop_lectures.rb +93 -0
  746. data/lib/studium/utility_scripts/steop/steop_lectures_in_this_curriculum.rb +284 -0
  747. data/lib/studium/utility_scripts/steop/steop_lva_dates.rb +119 -0
  748. data/lib/studium/utility_scripts/studienkennzahl.rb +116 -0
  749. data/lib/studium/utility_scripts/studium_skeleton/studium_skeleton.rb +231 -0
  750. data/lib/studium/utility_scripts/stundenplan.rb +595 -0
  751. data/lib/studium/utility_scripts/sync_studium_relevant_entries_one_level_downwards.rb +217 -0
  752. data/lib/studium/utility_scripts/ufind/ufind.rb +98 -0
  753. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/constants.rb +26 -0
  754. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/run.rb +20 -0
  755. data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/upcoming_mandatory_presence_courses.rb +187 -0
  756. data/lib/studium/utility_scripts/week_parser/constants.rb +23 -0
  757. data/lib/studium/utility_scripts/week_parser/help.rb +32 -0
  758. data/lib/studium/utility_scripts/week_parser/menu.rb +59 -0
  759. data/lib/studium/utility_scripts/week_parser/misc.rb +373 -0
  760. data/lib/studium/utility_scripts/week_parser/reset.rb +65 -0
  761. data/lib/studium/utility_scripts/week_parser/run.rb +18 -0
  762. data/lib/studium/utility_scripts/week_parser/show.rb +236 -0
  763. data/lib/studium/utility_scripts/week_parser/week_parser.rb +49 -0
  764. data/lib/studium/utility_scripts/weekday_parser.rb +155 -0
  765. data/lib/studium/utility_scripts/weekly_schedule.rb +198 -0
  766. data/lib/studium/utility_scripts/wochenplanung.rb +261 -0
  767. data/lib/studium/version/version.rb +46 -0
  768. data/lib/studium/www/curriculum_displayer.rb +162 -0
  769. data/lib/studium/www/exams.cgi +54 -0
  770. data/lib/studium/www/fast_ask_exam_question.cgi +156 -0
  771. data/lib/studium/www/handle_curricula/handle_curricula.cgi +154 -0
  772. data/lib/studium/www/next_generation_exam_question_trainer/next_generation_exam_question_trainer.cgi +79 -0
  773. data/lib/studium/www/sinatra/app.rb +231 -0
  774. data/lib/studium/www/sinatra/misc.rb +115 -0
  775. data/lib/studium/www/statistics/statistics.cgi +70 -0
  776. data/lib/studium/yaml/ad_hoc_trainer/README.md +2 -0
  777. data/lib/studium/yaml/ad_hoc_trainer/exam_topics.md +15 -0
  778. data/lib/studium/yaml/allowed_themes_for_exams/allowed_themes_for_exams.yml +347 -0
  779. data/lib/studium/yaml/array_allowed_entries_for_the_file_lecture_information.yml +71 -0
  780. data/lib/studium/yaml/available_exam_topics/available_exam_topics.yml +234 -0
  781. data/lib/studium/yaml/backlog_of_exams.yml +37 -0
  782. data/lib/studium/yaml/colours/custom_colours.yml +28 -0
  783. data/lib/studium/yaml/colours/use_colours.yml +1 -0
  784. data/lib/studium/yaml/current_exams.yml +30 -0
  785. data/lib/studium/yaml/curricula/README.md +39 -0
  786. data/lib/studium/yaml/curricula/bachelor/bachelor_agrarwissenschaften_033255.yml +147 -0
  787. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_basisblock_033630.yml +71 -0
  788. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_botanik_033630.yml +100 -0
  789. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_ecology_033630.yml +74 -0
  790. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_mikrobiologie_und_genetik_033630.yml +122 -0
  791. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_molekulare_biologie_033630.yml +106 -0
  792. data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_zoologie_033630.yml +87 -0
  793. data/lib/studium/yaml/curricula/bachelor/bachelor_chemie_033662.yml +165 -0
  794. data/lib/studium/yaml/curricula/bachelor/bachelor_dummy_curriculum.yml +182 -0
  795. data/lib/studium/yaml/curricula/bachelor/bachelor_elektrotechnik_und_informationstechnik_033235.yml +13 -0
  796. data/lib/studium/yaml/curricula/bachelor/bachelor_forstwirtschaft_033225.yml +115 -0
  797. data/lib/studium/yaml/curricula/bachelor/bachelor_informatik_033521.yml +136 -0
  798. data/lib/studium/yaml/curricula/bachelor/bachelor_ktww_033231.yml +84 -0
  799. data/lib/studium/yaml/curricula/bachelor/bachelor_lmbt_033217.yml +121 -0
  800. data/lib/studium/yaml/curricula/bachelor/bachelor_medizinische_informatik_033533.yml +283 -0
  801. data/lib/studium/yaml/curricula/bachelor/bachelor_molekularbiologie_033665.yml +95 -0
  802. data/lib/studium/yaml/curricula/bachelor/bachelor_nutrition_science_033638.yml +119 -0
  803. data/lib/studium/yaml/curricula/bachelor/bachelor_pharmazie_033305.yml +170 -0
  804. data/lib/studium/yaml/curricula/bachelor/bachelor_technische_chemie_033290.yml +131 -0
  805. data/lib/studium/yaml/curricula/bachelor/bachelor_technische_informatik_033535.yml +23 -0
  806. data/lib/studium/yaml/curricula/bachelor/bachelor_ubrm_033227.yml +143 -0
  807. data/lib/studium/yaml/curricula/bachelor/bachelor_verfahrenstechnik_033273.yml +167 -0
  808. data/lib/studium/yaml/curricula/bachelor/bachelor_wirtschaftsinformatik_033526.yml +29 -0
  809. data/lib/studium/yaml/curricula/experimental/bachelor_informatik_in_den_lebenswissenschaften.yml +137 -0
  810. data/lib/studium/yaml/curricula/individual/bachelor_formale_logik.yml +88 -0
  811. data/lib/studium/yaml/curricula/individual/bachelor_informatik_und_molekulare_biologie.yml +1161 -0
  812. data/lib/studium/yaml/curricula/individual/bachelor_vector_based_strategies_in_life_sciences_molecular_medicine_and_biotechnology.yml +1157 -0
  813. data/lib/studium/yaml/curricula/individual/master_bioinformatics_and_nanobiotechnology_in_molecular_medicine.yml +306 -0
  814. data/lib/studium/yaml/curricula/individual/master_vector_based_strategies_in_life_sciences_molecular_medicine_and_biotechnology.yml +741 -0
  815. data/lib/studium/yaml/curricula/master/master_bioinformatik_066875.yml +75 -0
  816. data/lib/studium/yaml/curricula/master/master_biologie_molekulare_mikrobiologie_mikrobielle_oekologie_und_immunbiologie_066830.yml +78 -0
  817. data/lib/studium/yaml/curricula/master/master_biologische_chemie_066863.yml +66 -0
  818. data/lib/studium/yaml/curricula/master/master_dummy_curriculum.yml +197 -0
  819. data/lib/studium/yaml/curricula/master/master_genetik_und_entwicklungsbiologie_066877.yml +89 -0
  820. data/lib/studium/yaml/curricula/master/master_lmbt_066418.yml +112 -0
  821. data/lib/studium/yaml/curricula/master/master_molecular_biology_066865.yml +72 -0
  822. data/lib/studium/yaml/curricula/master/master_molekulare_biologie_066834.yml +151 -0
  823. data/lib/studium/yaml/curricula/master/master_pharmazie_066605.yml +176 -0
  824. data/lib/studium/yaml/curricula/master/master_technische_chemie_066490.yml +123 -0
  825. data/lib/studium/yaml/curricula/outdated/master_bioinformatics_and_molecular_biotechnology_including_aspects_from_molecular_medicine.yml +438 -0
  826. data/lib/studium/yaml/curricula/outdated/master_food_science_and_plant_biotechnology.yml +31 -0
  827. data/lib/studium/yaml/curricula.yml +562 -0
  828. data/lib/studium/yaml/daily_questions_solved.yml +1654 -0
  829. data/lib/studium/yaml/default_delay.yml +4 -0
  830. data/lib/studium/yaml/default_encoding.yml +1 -0
  831. data/lib/studium/yaml/directory_to_the_exam_topics.yml +0 -0
  832. data/lib/studium/yaml/editor.yml +1 -0
  833. data/lib/studium/yaml/exams/next_exams_to_do.md +9 -0
  834. data/lib/studium/yaml/file_for_exam_questions.yml +1 -0
  835. data/lib/studium/yaml/german/README.md +2 -0
  836. data/lib/studium/yaml/german/german_to_english_month_names.yml +16 -0
  837. data/lib/studium/yaml/grouped_themes.yml +192 -0
  838. data/lib/studium/yaml/holidays.yml +201 -0
  839. data/lib/studium/yaml/important_exams.yml +266 -0
  840. data/lib/studium/yaml/inscription_dates_of_universities.yml +60 -0
  841. data/lib/studium/yaml/lecture_aliases.yml +138 -0
  842. data/lib/studium/yaml/lecture_information/lecture_information.yml +61740 -0
  843. data/lib/studium/yaml/log_dir.yml +1 -0
  844. data/lib/studium/yaml/main_topic.yml +11 -0
  845. data/lib/studium/yaml/max_stats.yml +249 -0
  846. data/lib/studium/yaml/meta_themes/README.md +13 -0
  847. data/lib/studium/yaml/meta_themes/biochemistry.md +6 -0
  848. data/lib/studium/yaml/meta_themes/bioinformatics.md +6 -0
  849. data/lib/studium/yaml/meta_themes/biotechnology.md +9 -0
  850. data/lib/studium/yaml/meta_themes/cellbiology.md +9 -0
  851. data/lib/studium/yaml/meta_themes/chemistry.md +9 -0
  852. data/lib/studium/yaml/meta_themes/genetics.md +10 -0
  853. data/lib/studium/yaml/meta_themes/immunology.md +5 -0
  854. data/lib/studium/yaml/meta_themes/metabolic_pathways.md +12 -0
  855. data/lib/studium/yaml/meta_themes/molecular_biology.md +9 -0
  856. data/lib/studium/yaml/meta_themes/protein_engineering.md +10 -0
  857. data/lib/studium/yaml/meta_themes/statistics.md +2 -0
  858. data/lib/studium/yaml/mitbelegung/README.md +4 -0
  859. data/lib/studium/yaml/mitbelegung/mitbelegung.yml +21 -0
  860. data/lib/studium/yaml/mitteilungsbl/303/244tter/mitteilungsbl/303/244tter.yml +363 -0
  861. data/lib/studium/yaml/n_total_questions.yml +1 -0
  862. data/lib/studium/yaml/rename_konsole_tab.yml +1 -0
  863. data/lib/studium/yaml/semester_planner/README.md +4 -0
  864. data/lib/studium/yaml/semester_planner/semester_planner.yml +189 -0
  865. data/lib/studium/yaml/show_topic.yml +1 -0
  866. data/lib/studium/yaml/statistics/lecture_information.yml +1 -0
  867. data/lib/studium/yaml/statistics/max_stats.yml +239 -0
  868. data/lib/studium/yaml/statistics/statistics.yml +75 -0
  869. data/lib/studium/yaml/week/01_monday.yml +25 -0
  870. data/lib/studium/yaml/week/02_tuesday.yml +68 -0
  871. data/lib/studium/yaml/week/03_wednesday.yml +63 -0
  872. data/lib/studium/yaml/week/04_thursday.yml +20 -0
  873. data/lib/studium/yaml/week/05_friday.yml +31 -0
  874. data/lib/studium/yaml/week/06_saturday.yml +16 -0
  875. data/lib/studium/yaml/week/07_sunday.yml +0 -0
  876. data/lib/studium/yaml/week/README.md +10 -0
  877. data/lib/studium.rb +5 -0
  878. data/studium.gemspec +82 -0
  879. data/test/testing_studium.rb +244 -0
  880. data/test/testing_studium_base_class.rb +31 -0
  881. data/test/testing_the_file_lecture_information.rb +18 -0
  882. data/test/testing_time_component.rb +29 -0
  883. metadata +1094 -0
data/README.md ADDED
@@ -0,0 +1,2987 @@
1
+ [![forthebadge](https://forthebadge.com/images/badges/built-with-love.svg)](https://www.gobolinux.org/)
2
+ [![forthebadge](https://forthebadge.com/images/badges/made-with-ruby.svg)](https://www.ruby-lang.org/en/)
3
+ [![Gem Version](https://badge.fury.io/rb/studium.svg)](https://badge.fury.io/rb/studium)
4
+
5
+ This gem was <b>last updated</b> on the <span style="color: darkblue; font-weight: bold">19.03.2023</span> (dd.mm.yyyy notation), at <span style="color: steelblue; font-weight: bold">00:32:18</span> o'clock.
6
+
7
+ <img src="https://i.imgur.com/9HrOT5B.png" style="border: 1px solid black">
8
+ <img src="https://i.imgur.com/tbKS413.png" style="margin-left: 0.3em">
9
+ <img src="https://i.imgur.com/vwo4UuK.jpg" style="border: 2px solid black">
10
+ <img src="https://i.imgur.com/Jcf9yoh.jpg" style="border: 3px solid black">
11
+ <img src="https://i.imgur.com/SSIPq4l.jpg" style="border: 3px solid black">
12
+ <img src="https://i.imgur.com/YG8V0hE.png" style="border: 3px solid black">
13
+
14
+ ## Introduction to the studium-gem
15
+
16
+ Welcome to the legendary <span style="color: darkgreen; font-weight: bold">
17
+ Studium</span> project! This project makes our brains go <b>epic-mode</b>
18
+ (via oldschool training, though).
19
+
20
+ This is the documentation that refers to the 0.12.x release series. This
21
+ release series was started in **July 2022** and obsoleted the older
22
+ 0.11.x release series that was started in <b>May 2022</b>.
23
+
24
+ The primary focus of the 0.11.x series was a clean-up - old code that
25
+ was no longer in use was removed. The primary focus of the 0.12.x
26
+ series, though, is to extend the project while doing clean-up work.
27
+ For instance, the java-bindings were started, and the ruby-libui
28
+ bindings were improved on windows in particular. In fact: libui
29
+ has been one big reason why the 0.12.x series was started. I really
30
+ wanted to solve the libui GUI situation finally, so that we can
31
+ use this project on windows as well.
32
+
33
+ On **rubygems.org** the 0.11.x release series will be made
34
+ available for a few more months. Consider updating to the
35
+ 0.12.x release series when possible, though.
36
+
37
+ ## Major and minor Goals and Objectives for the studium-gem
38
+
39
+ This subsection will attempt to detail what the point of
40
+ this project is. It will be a fairly long paragraph.
41
+
42
+ The **Studium project**, first and foremost, attempts to help
43
+ with **study-** and **exam-related topics** in general.
44
+
45
+ What is meant with this?
46
+
47
+ Well - consider the possibility that you wish to prepare for some
48
+ upcoming exam, going to occur in a few weeks from today. Perhaps you
49
+ did build up some "flash card" mnemonics to remember questions and
50
+ associated answers to these questions more easily. You want to
51
+ train your theoretical knowledge in regards to these exam
52
+ questions. Let's pick one exam topic, say: **general
53
+ chemistry**. Ok, so ... this will be about chemistry-related
54
+ knowledge.
55
+
56
+ You will probably learn more about atoms, the electrons that can
57
+ be found in these atoms, the chemical reactions that the outer
58
+ electrons may undergo in the course of a chemical reaction.
59
+
60
+ From this point of view, the **studium** gem is somewhat similar to
61
+ other projects, such as **Studyflix** or **StuDocu** - these projects
62
+ may also try to be of help in exam-related situations.
63
+
64
+ The **primary** purpose of the studium gem is to distribute the code
65
+ (in ruby, and to some extent in java), the associated dataset (mostly
66
+ text files, in particular yaml files) and also **interconnect** the
67
+ various ruby files that are distributed with this project under the
68
+ same "umbrella-project", for a unified approach and a unified use
69
+ case.
70
+
71
+ The original goal for the **Studium project**, that is **why** it
72
+ was started, was to bundle together **knowledge** from different
73
+ topics - be these topics related to **ruby**, **informatics**,
74
+ **biology**, **chemistry**, **biotechnology**, **molecular
75
+ biology**, **virology** or **physics**, as an **exam trainer**
76
+ mostly.
77
+
78
+ The objective here in this regard, as a trainer-for-upcoming-exams,
79
+ was to improve the grades of the student at hand, and to be able
80
+ to pass more exams within a given time span, thus making the time
81
+ spent **more "efficient"** or worthwhile in this regard. (Evidently
82
+ the user still has to invest time into learning on his or her own,
83
+ so the studium-gem can only play a **supportive** role in this
84
+ regard; it can not replace one's own impetus for wanting to learn
85
+ more.)
86
+
87
+ Since then, this original use case has been **extended** quite a
88
+ lot, including online-related aspects (make the dataset available
89
+ via a web-interface, such as through sinatra), or via **GUI
90
+ bindings** (primarily via **ruby-gtk**, but also via **libui**).
91
+
92
+ The **Studium** gem is made up of several different classes, that
93
+ could potentially be of **help** to the user. The main toplevel
94
+ "namespace" for the **studium** gem, in ruby, is simply <b>"module
95
+ Studium"</b>.
96
+
97
+ Note that not all the code may be needed for all use cases, so it
98
+ is recommended to focus only on those parts that may be relevant
99
+ for the user at hand, and simply ignore the other parts that seem
100
+ of no use. People are different, so they may need different parts
101
+ more so than others.
102
+
103
+ As a by-product of ruby being OOP-centric in nature, lots of
104
+ different classes may typically reside in the same
105
+ project; the studium project is no exception to that rule.
106
+ In the event that you are curious about these classes, feel
107
+ free to have a look at the right hand side of this gem's
108
+ homepage, the **Table of Contents**. The direct URL for
109
+ this is as follows:
110
+
111
+ https://www.rubydoc.info/gems/studium/
112
+
113
+ Furthermore, some classes are described in more detail in that
114
+ file here (**README.md**), or respectively doc/README.gen, which
115
+ is the template from which the **README.md** file is
116
+ autogenerated upon publishing a new version of this gem. However
117
+ had, do not expect a full explanation for all classes here; only
118
+ some classes will be discussed in more detail.
119
+
120
+ Note that there are **a LOT** of different classes and it is rather
121
+ unlikely that you will need all of them, so don't focus on all
122
+ classes with the assumption that they will all be equally useful.
123
+ Some of these classes have only **a very limited scope** and
124
+ use case, and thus are not too overly useful. Other classes are
125
+ more important, though, and the page here **attempts to focus
126
+ primarily on these more useful classes**, or rather, the
127
+ **functionality** that these classes ultimately provide. It is
128
+ hoped that this functionality may be of benefit to other people
129
+ as well.
130
+
131
+ But not every feature is described there; it would make the
132
+ listing way too long.
133
+
134
+ The **major** focus of the studium gem lies in regards to
135
+ "flashcards", mnemo-cards, anki-cards - aka entries that have
136
+ a registered **question**, and an **associated answer** to
137
+ that question. (anki-cards are a bit different in that they
138
+ focus on a **GUI** and allow such fancy things like embedding
139
+ pictures; the studium project here also has this as a minor
140
+ goal, but this comes **only** via GUI bindings, not the
141
+ commandline variant, obviously. It is of a lower priority,
142
+ though.)
143
+
144
+ These exam-related questions can be asked on the commandline,
145
+ via a **delay** - usually a three seconds delay, but this
146
+ can be toggled and changed by the end user on the commandline.
147
+
148
+ First, the question will appear on the commandline, and then,
149
+ after that specified **delay** has passed, the answer will be
150
+ revealed (and shown) on the commandline. This way the user can
151
+ improve his/her knowledge on a daily basis. In fact: although
152
+ I have not been studying at a university in many years, I
153
+ still use this project almost daily to expand my own local
154
+ knowledgebase.
155
+
156
+ You can query the current **set delay** via:
157
+
158
+ studium --delay?
159
+
160
+ Note that, in order for the question-answer "exam trainer" to work, you
161
+ need to have written down these questions and answers somewhere. By
162
+ default, I have bundled the dataset that I personally use, but this
163
+ will probably be very useless to most other people, so I recommend
164
+ to keep your own entries. (Many of my own entries are in german rather
165
+ than english, so ... feel free to re-use any of these questions as
166
+ you like to, if you find them useful. As of **March 2019**,
167
+ there are over **32.500** question-answers registered in the studium
168
+ project, in various different topics).
169
+
170
+ The **format** for question-answers is very simple:
171
+
172
+ - **One question** and **one answer** per given line. For example:
173
+
174
+ '- How does Rails call a "footer" on every page? "Partials".'
175
+
176
+ The above would constitute a question-answer exam entry.
177
+
178
+ The first part there constitutes the question; and the part after the
179
+ first '?' character is the answer. The '?' token is not mandatory though;
180
+ you can also substitute with 'A:' (which stands short for "Answer") and
181
+ not make use of '?' at all.
182
+
183
+ Note that any words enclosed in double quotes "" will be colourized differently
184
+ when displayed on the commandline. The reason for this is mostly so that it
185
+ provides a stronger visual cue as to what may be more important in the given
186
+ question/answer at hand. I found this helpful for memorizing when having these
187
+ questions asked on the commandline; for some reason my brain reacts more
188
+ strongly to colours. Probably does so for other people too, but again - if
189
+ you dislike anything there, you can (and should) always use your own
190
+ exam-dataset here.
191
+
192
+ ## Namespaces in the project
193
+
194
+ The main namespace for this gem is simply called **Studium**, which is
195
+ german for **studies**. The gem could be renamed to **Studies** but
196
+ considering the fact that the original use case was for universities
197
+ in central europe, and many of the lectures stored in the main yaml
198
+ file are for lectures in german, I think it would make sense to retain
199
+ that name; you can always "alias" it like so, anyway:
200
+
201
+ Studies = Studium
202
+
203
+ The **exam-relevant part** resides under the **Studium::Exams** namespace.
204
+ So when you see that latter namespace, you know that it has to be code
205
+ that is specific to exams.
206
+
207
+ There are also some auxiliary classes, such as a primitive
208
+ "statistical analyzer" of some sort, to rate the performance
209
+ per day (from day to day, in regards to exam-questions that
210
+ were answered).
211
+
212
+ ## Showing helpful information on the commandline
213
+
214
+ A **general overview on the commandline**, as to what the main
215
+ functionality is, can be obtained through this entry point,
216
+ aka **--help**:
217
+
218
+ studium --help
219
+
220
+ This will query **bin/studium**.
221
+
222
+ ## Constants and toplevel-variables used in the Studium project
223
+
224
+ The Studium project makes use of lots of constants, in the ruby
225
+ code. This subsection mentions a few noteworthy ones - in particular
226
+ those that may be useful to know in some later situations when you
227
+ wish to "globally" change an aspect of the project.
228
+
229
+ The constant called MAKE_USE_OF_UNICODE_SYMBOLS_WHENEVER_POSSIBLE
230
+ refers to unicode symbols. Elements such as the right-facing arrow,
231
+ aka →. This can be useful as a visual cue.
232
+
233
+ If you wish to make use of more unicode symbols than retaining this
234
+ constant to true is good. This is the default value too (true).
235
+
236
+ A toplevel query method exists as well - see:
237
+
238
+ Studium.shall_we_make_use_of_unicode_symbols?
239
+
240
+ The old constant called ARRAY_EXCLUDE_THESE was removed for the 0.10.x
241
+ series. The old content was [ '[]','[skip]','[done]','X' ] but I
242
+ decided that a trailing [] is ideal. The trailing [] marks the
243
+ exam question at hand as "answered and thus solved". Back then I
244
+ experimented with different, simple ways to mark an exam question
245
+ as solved, but I came to the conclusion that a trailing " []"
246
+ is probably the best way to indicate that. A trailing "X" alone
247
+ can lead to confusion, when the answer itself has some upcased
248
+ characters near the end and such. A unicode symbol could be used,
249
+ but not every keyboard makes it easy to use that, so trailing
250
+ [] seems better. The other variants, such as [skip] or [done]
251
+ seem too long.
252
+
253
+ To query **where** the last exam question will be stored, use
254
+ this method:
255
+
256
+ Studium.file_last_question_asked? # => "/root/Studium/last_question_asked.md"
257
+
258
+ This could be used if you forgot which question was the last one
259
+ that was asked; or to automatically solve this question, via
260
+ other scripts in the **studium gem**.
261
+
262
+ There is a very important file, called **lecture_information.yml**.
263
+
264
+ Since that file is so important for the Studium project, a toplevel
265
+ instance variable keeps track of the path to this file (the **location**
266
+ to that file):
267
+
268
+ @file_lecture_information = nil # nil here means "not yet initialized to any value"
269
+
270
+ On my home system and home setup, I also keep all exam-files stored in a
271
+ specific location, which is revealed via:
272
+
273
+ Studium.file_exams? # => "/home/x/studium/YAML/exams.yml"
274
+
275
+ The path to this can be modified via:
276
+
277
+ Studium.set_file_exams()
278
+ Studium.set_file_exams(insert_path_here)
279
+
280
+ The Studium gem defaults to the UTF-8 encoding. As we require a bit
281
+ of flexibility here (some users may want to use another encoding),
282
+ the toplevel variable called **@use_this_encoding** stores which
283
+ encoding is to be used for all code and data within the studium
284
+ gem.
285
+
286
+ To query the current encoding in use, try this method:
287
+
288
+ Studium.encoding?
289
+
290
+ ## Exam dataset
291
+
292
+ The **individual exam topics**, such as for **genetics** or **physics**
293
+ are stored in the subdirectory called <b>exam_topics/</b>.
294
+
295
+ I distribute the dataset for the topics that I have an interest in
296
+ with this gem, which explains why the gem is quite large. This dataset
297
+ will probably not be very useful for other people - after all you
298
+ may not necessarily share my own interest in different topics - but
299
+ if you want to use this project (such as for a base-system, and then
300
+ modify and adapt it to your needs) then you are very much encouraged
301
+ to build up your own dataset, anyway.
302
+
303
+ The primary reason as to why I have distributed my own dataset with
304
+ this gem is to simply show how it can be done; it is just more
305
+ convenient that way in the event that other people want to use the
306
+ project and adapt it to their own needs. It makes it easier for
307
+ people to figure out how to work with the project, by adding new
308
+ questions. And, of course, since I use the gem almost on a daily
309
+ basis, I polish the existing set of exam questions, so there is
310
+ some **quality control** ongoing here as well.
311
+
312
+ The **format** for these exams must be a **simple** one, that is - **one
313
+ question and one answer per registered line**. I currently encourage
314
+ you to use not more than **1000 question-answer entries per such a file**,
315
+ as it becomes unwieldy otherwise, but if you want to, you can ignore
316
+ this limitation as well. I just personally found it useful to have.
317
+
318
+ Whenever I have more than 1000 questions, I tend to **create a new
319
+ file** with "advanced" exam-questions, or simply split things up
320
+ in several different files. I did so for the metabolic pathways,
321
+ for instance, such as for glycolysis, the citric acid cycle,
322
+ and so forth. This started with a single file for **biochemistry**. Since
323
+ then I split it up into several sub-topics, such as **metabolism**,
324
+ **advanced biochemistry** and **aminoacids**, so the total question-answers
325
+ for biochemistry is close to about 4000 as of now. (It may be even more
326
+ than that if you also include molecular techniques and genetics into the
327
+ field of **biochemistry**, which some university lectures may do. But I
328
+ found it easier to use separate topics here, such as **genetics**,
329
+ **genomics** and **gene technology** instead.)
330
+
331
+ If you want to **query** which exam-topic is the current default (the
332
+ <b>current studyset</b>), then you can use the following invocation
333
+ on the commandline:
334
+
335
+ studium --current-studyset?
336
+
337
+ **How to best prepare for exams?**
338
+
339
+ This probably depends on the type of person you are, how your brain works,
340
+ how you memorize content. I can not give a general recommendation as to
341
+ how that should be for everyone - you need to determine this on your
342
+ own, for your particular case at hand.
343
+
344
+ But - what I believe may work very well for many different people, are
345
+ so called "flash-cards", that is: you have the question on one side,
346
+ and then the answer or answers on the other side of that card
347
+ (flip card). For looking at the answer you simply flip around the
348
+ card.
349
+
350
+ In my opinion, such mnemo cards or flash cards, are **quite effective**
351
+ and may also work for you. This was the primary goal for the studium
352
+ project too; it was built around that central concept for the most
353
+ part, at the least in regards to **exam questions**.
354
+
355
+ Note that the python-software **anki** (anki cards) uses a somewhat
356
+ related concept, although it is more sophisticated, e. g. you can
357
+ embed images into the dataset, and so forth.
358
+
359
+ ## Flashcards (deprecated and removed)
360
+
361
+ Since as of **March 2018**, the studium project also supports
362
+ flashcards formally.
363
+
364
+ Flashcards are **mnemonic-cards**, where a question may be on the
365
+ front of a paper, and the answer to that question is on the backside.
366
+
367
+ Obviously computers can simulate this more easily without wasting
368
+ paper - but some people may prefer oldschool paper for memorizing
369
+ content.
370
+
371
+ At any rate, if you wish to add a new question-answer, then you
372
+ can use this commandline invocation:
373
+
374
+ flashcards add
375
+
376
+ You can also add a new question via the bin/studium file:
377
+
378
+ studium --add-a-new-question
379
+
380
+ Internally this will call class <b>AddExamQuestion</b>. As of
381
+ October 2020 I am not sure whether the namespace Flashcards
382
+ will be retained, though. We may have to look how useful these
383
+ flashcards are; at a later time it may be decided what to do
384
+ with that, but it could be removed as well.
385
+
386
+ In March 2022 support for flashcards in the above described
387
+ manner has been removed. Exam-question cards are similar to
388
+ flashcards, so the functionality is not completely gone -
389
+ but it is gone in the sense of "flashcard-centric design".
390
+
391
+ ## The main dataset (Studium.main_dataset?)
392
+
393
+ The file called **lecture_information.yml** is the most important
394
+ yaml-file in this project. It stores all lectures that are tracked
395
+ by the studium-gem.
396
+
397
+ Loading a big yaml file can take some time. Having to do so again
398
+ and again may really slow down a project; it also makes little
399
+ sense to want to do so, because you already had to load it up
400
+ before, so why do it again?
401
+
402
+ Due to this situation, it seemed to make sense to allow a way to
403
+ store the dataset in an instance variable on the toplevel
404
+ namespace.
405
+
406
+ require 'studium/toplevel_methods/main_dataset.rb'
407
+ dataset = ::Studium.main_dataset? # ← Store it in a variable if you would like to.
408
+
409
+ ## lecture_information.yml
410
+
411
+ The file <b>lecture_information.yml</b> is extremely important and rather
412
+ central to the studium gem, so this subsection will detail the rationale
413
+ for this file and what information can be found in that file.
414
+
415
+ The file **lecture_information.yml** is distributed as part of the **studium
416
+ gem**, in the <b>yaml/</b> **subdirectory** specifically. You can have a
417
+ look at it if you don't quite know the structure; perhaps use the editor
418
+ nano or vim or emacs for a quick look.
419
+
420
+ In order to obtain the **full path to this file**, via the commandline,
421
+ the following command can be used (**commandline instruction**):
422
+
423
+ studium --path-to-file-lecture-information
424
+
425
+ Essentially, lectures of universities can be **registered** in that file.
426
+
427
+ The basic **format** of that file is quite simple:
428
+
429
+ - The first line of every lecture-related entry, within enclosed "" quotes,
430
+ constitutes the **name** of the lecture. <b>Make sure that the name is
431
+ exactly, 1:1, the official name of the lecture at hand.</b> Make sure
432
+ that the name really is the name of the lecture, too - awkward errors
433
+ may otherwise be the consequence. From experience I can tell that the
434
+ more accurate the dataset is in that yaml file, the better.
435
+
436
+ Then, **additionally**, you must **prepend* the LV ID as the first entry
437
+ in that particular line.
438
+
439
+ Complete example for this follows:
440
+
441
+ <b>"301617 Strukturbiologie I":</b>
442
+
443
+ So - first comes the particular **LV ID** entry and then comes the
444
+ **name of the lecture**.
445
+
446
+ This is the **main entry** for that lecture in the **.yml** file.
447
+
448
+ Then, you can denote the content of the lecture at hand, via a
449
+ Hash. You can use !ruby/symbol to use a symbol; it is a yaml file
450
+ after all, with all pros and cons that come with it.
451
+
452
+ The **three main entries** are presently:
453
+
454
+ !ruby/symbol ects: 3.0
455
+ !ruby/symbol university: BOKU
456
+ !ruby/symbol language: german
457
+
458
+ More information can be added to describe the particular lecture
459
+ at hand. See the file
460
+ **studium/doc/documentation_for_the_file_lecture_information.md**
461
+ for more information pertaining to this.
462
+
463
+ Why is this information about the available lectures so important?
464
+
465
+ The information stored in the file **lecture_information.yml** is
466
+ important because it allows us to automatically calculate the ECTS
467
+ points in a given curriculum, and also keep track whether a
468
+ particular exam has already been passed successfully. (The latter
469
+ part has to be adjusted to your own exam-dataset of course;
470
+ it makes no sense for others to re-use my own dataset, as
471
+ that is specific to my use case. Obviously different people
472
+ will have totally other use cases.)
473
+
474
+ Some **helper classes** exist to sanitize or check the validity
475
+ of the information contained in that file. For example,
476
+ <b>class Studium::AutopurgeThisLectureDate</b> can be used to
477
+ purge outdated lva-entries from the file, allowing you to
478
+ more easily stay up-to-date with ongoing lectures.
479
+
480
+ (Obviously, for all of this to work, you need to have a
481
+ file that keeps track of these different lectures in the
482
+ first place.)
483
+
484
+ You can also check the validity of the file lecture_information.yml,
485
+ from the commandline, through
486
+ <b>class Studium::CheckTheLectureInformationFile</b>. This
487
+ is described in the subsection <b>checks and sanitizing
488
+ information</b>, in this document.
489
+
490
+ Note that you can also directly load the dataset from this file
491
+ via the following method:
492
+
493
+ Studium.lecture_information
494
+
495
+ ## class Studium::FinishedExamsAtThisUniversity
496
+
497
+ class Studium::FinishedExamsAtThisUniversity can be used to show
498
+ which exams at a university have been passed successfully.
499
+
500
+ require 'studium/utility_scripts/finished_exams_at_this_university.rb'
501
+ Studium::FinishedExamsAtThisUniversity.new(ARGV)
502
+ Studium::FinishedExamsAtThisUniversity.new('uniwien')
503
+ Studium::FinishedExamsAtThisUniversity.new('tu')
504
+
505
+ Note that there are a few other classes that have a similar
506
+ functionality. It just seemed useful to also have an additional
507
+ class that is dedicated to that particular task.
508
+
509
+ ## Regex-search for exams
510
+
511
+ You can search for passed exams via a "pseudo-regex", aka //
512
+ in a string:
513
+
514
+ studium /Partial name of exam goes in here/
515
+ studium /Elektronen/
516
+ studium /Bioinf/
517
+
518
+ Let's look at the last example, on the commandline. This will
519
+ send the first argument <b>"/Bioinf/"</b> to the ruby code that
520
+ handles the commandline. ARGV is an Array that will hold the
521
+ arguments given to a ruby .rb file as Strings, so we have a
522
+ pseudo-regex there - a String object that starts and ends with
523
+ the character '/'. We assume this String to be a regex, which
524
+ conveniently allows us to query for the name of passed exams.
525
+
526
+ This may be helpful if you want to find all exams that you have
527
+ passed successfully (and registered somewhere) but do not quite
528
+ remember the full name of the exam. Or, as in the last example,
529
+ to show all exams passed with a title that includes "Bioinf"
530
+ (meaning **Bioinformatics** or **Bioinformatik**).
531
+
532
+ Of course this should be tailored to your exams, not mine or
533
+ anyone else's exams. :)
534
+
535
+ You can also see the passed exams that belong to a given theme.
536
+
537
+ So for example, to show all exams that fit to the theme
538
+ "chemistry", you can use this call to output these exams:
539
+
540
+ studium --passed-exams=chemistry
541
+
542
+ ## Flashcards / Mnemo-cards
543
+
544
+ The core of the studium project is to simulate the behaviour of
545
+ mnemo-cards, memo-cards or flashcards (we will assume these names
546
+ to be all <b>synonymous</b> to one another).
547
+
548
+ The project can thus ask the user a **random exam question**.
549
+
550
+ Then, if the correct answer to that exam question has been given,
551
+ this question can be marked as "solved" - the code for the
552
+ latter solved action resides in the file called **solved.rb**.
553
+ It can be used from the commandline, or simply use
554
+ **bin/solved** which provides this functionality.
555
+
556
+ Any exam question that has been marked as "solved" will no longer
557
+ be within the total pool of questions that the computer will ask
558
+ the user.
559
+
560
+ In other words, we can toggle on/off on a per question basis, via
561
+ a <b>trailing []</b> to a line in that file.
562
+
563
+ This allows you to systematically work through an exam dataset for
564
+ a given topic at hand.
565
+
566
+ Currently there is a cap in effect - 1000 questions to the same topic,
567
+ not more than that. This was mostly because I found it better to split
568
+ up the topics, e. g. "basic chemistry", and then "advanced chemistry",
569
+ and so on and so forth.
570
+
571
+ The exam dataset that I use myself is distributed with the studium
572
+ gem, but it is probably not very useful to other users. I recommend
573
+ that you maintain your own exam dataset - this will be much better
574
+ suited to your own needs, so me providing my own exam dataset is
575
+ mostly meant to serve as a "starter" for other people to do the
576
+ same.
577
+
578
+ ## class Studium::AutoStud
579
+
580
+ The class AutoStud can automatically modify the cd_aliases yaml
581
+ file. cd_aliases are part of another project and bundle together
582
+ my cd-aliases, that is - aliases that help me navigate through
583
+ my local filesystem quickly. I make heavy use of aliases in
584
+ general.
585
+
586
+ If there is a file called exams.yml, then we can put numbers,
587
+ so called "tag-identifiers", into these. So for example, we
588
+ may have the entry '# === (13)' there. This means that
589
+ pwdstud13 is an alias to this directory, which will correspond
590
+ to an exam entry. These entries should be sorted in a way so
591
+ that entry 1 means the next upcoming exam, entry 2 the one
592
+ after that, and so forth and so on.
593
+
594
+ In the past, before 20.01.2018, I manually did most of the
595
+ work there - first, by modifying exams.yml, and then by
596
+ navigating towards the target directory, and then invoking
597
+ "newstud NUMBER" here, such as newstud 13. This was tedious
598
+ and somewhat error-prone, but mostly unnecessary. I then
599
+ created class AutoStud, which allowed me to navigate to
600
+ the directory at hand, and just take the name of the working
601
+ directory to determine the number. But even that was too
602
+ cumbersome, so I added a range specifier, such as:
603
+
604
+ autostud 1-15
605
+
606
+ This will, similar to a Range in ruby, work through from 1
607
+ to 15, and invoke class NewStud. This class is the one
608
+ that will modify the cd-aliases file.
609
+
610
+ Even the range specifier was unnecessary since I added:
611
+
612
+ autostud --max
613
+
614
+ This will automatically guess what is the max entry and use
615
+ that.
616
+
617
+ If the above subsection is a bit confusing, don't worry, it
618
+ really is simple once you understand it. It essentially
619
+ serves two purposes:
620
+
621
+ (a) to be able to show which exames are upcoming, via
622
+ say, <b>d25</b> (see bin/d25 for that)
623
+ (b) to just quickly navigate to these directories
624
+ for upcoming exams
625
+
626
+ I can then e. g. do "to4" to navigate to exam number 4
627
+ and look at the directory as to what material has been
628
+ collected for this exam.
629
+
630
+ Obviously this works for the exam dataset on my system -
631
+ you may have to maintain your own exams.yml file. I am
632
+ willing to make improvements to this part, both in
633
+ regards to code, but also in regards to the <b>documentation</b>.
634
+
635
+ ## Determine which curricula are used for which lecture
636
+
637
+ One of the most important files for this project, file
638
+ <b>lecture_information.yml</b>, also contains the assigned
639
+ curricula for a given lecture at hand.
640
+
641
+ The class <b>Studium::DetermineCurricula</b> can then be used
642
+ to automatically output, on the commandline, in which curricula
643
+ a certain lecture is listed. This allows us to batch-calculate
644
+ the curricula used in an individual curriculum - e. g. if you
645
+ design such a curriculum, the class may help you to
646
+ automatically output from which other curricula certain lectures
647
+ were used/re-used. This constitutes the <b>"statistics"</b>
648
+ part of that class.
649
+
650
+ ## class Studium::ForeignLanguagePercentage
651
+
652
+ class <b>Studium::ForeignLanguagePercentage</b> can be used
653
+ to show which lectures are in a given language, such as
654
+ the english language.
655
+
656
+ This requires that the entry called "!ruby/symbol language: english"
657
+ in the file <b>lecture_information.yml</b> has been set.
658
+
659
+ ## class Studium::ShowLecturesOnTheCommandline
660
+
661
+ This class will show lectures that are part of the given
662
+ curriculum on the commandline. Additionally, a .html file
663
+ can be autogenerated (and will be opened in the browser,
664
+ if a certain constant has been set to true).
665
+
666
+ If a lecture has already been passed, then the remote URL
667
+ will not be shown. This behaviour can be overruled from
668
+ the commandline like so:
669
+
670
+ show_lectures_on_the_commandline --show-all-URLs --tuwienbiotech
671
+
672
+ This will show all remote URLs, even for lectures that were
673
+ already solved.
674
+
675
+ Do note that you can also design any arbitrary "curriculum"
676
+ on your own, and then load this dataset up.
677
+
678
+ Say that you have stored this into the file called **foo.md**.
679
+
680
+ To load this up, you can do:
681
+
682
+ studium --use-this-curriculum=foo.md
683
+
684
+ Remember to use only registered lectures (in the file
685
+ **lecture_information.yml**), and only one lecture per
686
+ line in that .md file (or any other text file).
687
+
688
+ ## class Studium::ShowLectures
689
+
690
+ <b>class Studium::ShowLectures</b> will show lectures according
691
+ to a particular <b>theme</b>. For example, say that you want to
692
+ see all lectures that have something to do with
693
+ <b>"analytical chemistry"</b>.
694
+
695
+ You could then invoke this class and pass in a commandline option
696
+ such as the following one:
697
+
698
+ --analytical_chemistry
699
+
700
+ I have aliased the <b>show_lectures.rb file</b>, to the alias called
701
+ <b>show_lectures</b>, and then I can do this from the commandline:
702
+
703
+ show_lectures --analytical_chemistry
704
+
705
+ (Actually, I even have this aliased, to "tanalytical" - the <b>t</b> stands
706
+ for "theme". I use this for all the themes, e. g. "tgenetics" for all themes
707
+ belonging to the theme genetics, "tinformatics" for all themes belonging
708
+ to the theme informatics, and so forth.)
709
+
710
+ This class will also show a split between bachelor and master lectures.
711
+ Bachelor lectures are shown first, then we will show the lectures belonging
712
+ to a master curriculum.
713
+
714
+ This class thus allows us to quickly find out which lectures belong to a
715
+ certain theme. It can then help when you wish to create an individual
716
+ curriculum based on one or several <b>certain themes</b> - or when you
717
+ simply want to see which lectures are available belonging to a particular
718
+ theme. (I used it to see which exams I may do next, to fulfil a certain
719
+ theme criteria.)
720
+
721
+ Note that this class acts on information, which must have been added prior
722
+ to the file <b>lecture_information</b>, which is also distributed with
723
+ this project. Always keep that file up to date - a lot of code in this
724
+ project depends on that file.
725
+
726
+ Since as of <b>10.03.2018</b>, you can also pass in the options --timetable
727
+ or --upcoming. This will then autogenerate a .html file listening the coming
728
+ exams. That functionality depends on class <b>ShowLecturesOnTheCommandline</b>.
729
+
730
+ ## class Studium::Exams::Cycle
731
+
732
+ The class <b>Studium::Exams::Cycle</b> can be used to
733
+ cycle through the yaml file that holds which exams may
734
+ be upcoming.
735
+
736
+ Since as of <b>March 2018</b>, the yaml file is distributed with the studium
737
+ gem and can be found in the respective yaml directory, such as at:
738
+
739
+ studium/yaml/current_exams.yml
740
+
741
+ Obviously if you wish to make use of it, you will have to modify that
742
+ file to fit your own preferences rather than mine. This also depends
743
+ on the exam topics that you want to be exercising next.
744
+
745
+ The way how the class operates is really simple:
746
+
747
+ - After having asked one question from the current main
748
+ topic, the class will move towards the next topic at
749
+ hand, and so forth. When it reaches the "end", it will
750
+ resume at the beginning, so in other words this is a
751
+ cyclic array and the class operates via a "cyclic modus
752
+ operandi" - which thus explains he name of this class:
753
+ <b>Cycle</b>.
754
+
755
+ If you want to find out where the main .yml file resides,
756
+ you can do so via:
757
+
758
+ Studium::Exams::Cycle.main_file?
759
+
760
+ If you want to display which entries are part of the current exam-cluster,
761
+ you can do so from the commandline via:
762
+
763
+ studium --collage?
764
+
765
+ ## class Studium::ShowOutdatedLvaDates
766
+
767
+ <b>class Studium::ShowOutdatedLvaDates</b> can be used
768
+ to show which lectures (lva aka "lehrveranstaltung")
769
+ have outdated lva_dates entries.
770
+
771
+ That way the outdated entries can be updated (or removed).
772
+
773
+ This then allows other classes in the project to more
774
+ reliably show only lectures that are up-to-date.
775
+
776
+ You can also query this from the commandline via the <b>bin/studium</b>
777
+ executable, by issuing:
778
+
779
+ studium --outdated
780
+
781
+ ## class Studium::ShowLecturesOnThisDay
782
+
783
+ This class will show all lectures that occur on a given day. The format
784
+ for that day must be in dd.mm.yyyy format such as <b>18.06.2018</b>. (In
785
+ the future this requirement may change and allow for other formats, such
786
+ as yyyy.mm.dd; but for now, this is the only supported time format.)
787
+
788
+ The class will then proceed to check the file <b>lecture_information.yml</b>
789
+ for matching entries. If found, they will be retained and lateron displayed,
790
+ via the <b>.report</b> method.
791
+
792
+ You can either invoke the clas directly - it resides at
793
+ <b>studium/utility_scripts/show_lectures_on_this_day.rb</b> -
794
+ or you can invoke this functionality from the commandline.
795
+
796
+ The syntax for the commandline invocation can be in two formats.
797
+
798
+ studium --lectures-on-this-day=05.05.2018
799
+ studium 07.05.2018
800
+
801
+ The latter is significantly shorter and is recommended. It is the
802
+ current default action for input in the form dd.mm.yyyy. Do note
803
+ that this may, however had, also change in the future - but for
804
+ now (<b>March 2018</b>), this is the documented default behaviour for
805
+ input like the above. Use the more explicit one with the --
806
+ flags, since that one will be supported forever.
807
+
808
+ ## class Studium::NExamsInTheseTopics
809
+
810
+ class <b>Studium::NExamsInTheseTopics</b> can report how many exam
811
+ topics are registered in the given input-topics at hand, and how many
812
+ of these were solved.
813
+
814
+ Several topics are combined together.
815
+
816
+ For example, for basic **biochemistry**, you can pass the argument
817
+ <b>meta_biochemistry</b> to this class, as a **String**.
818
+
819
+ class **Studium::NExamsInTheseTopics** will then output how many
820
+ questions were registered in that topic in total, and how many of
821
+ these questions were already solved.
822
+
823
+ For the "meta-topic" meta_biochemistry, we group together many
824
+ biochemistry-related topics - basic biochemistry, advanced
825
+ biochemistry, structural biology, proteomics, metabolism,
826
+ enzymes, glycolysis and so forth.
827
+
828
+ I created this class so that I can have a look at combined topics.
829
+ Otherwise it is quite similar to the statistics shown when a single
830
+ question is asked on the commandline, through <b>class AskExamQuestion</b>
831
+ (full name is: <b>Studium::Exams::AskExamQuestion</b>).
832
+
833
+ Since as of <b>August 2018</b>, you can also use this as exam-trainer,
834
+ by providing the number of the sub-topic at hand.
835
+
836
+ So for example, if the main topic is meta-genetics, and you pass in
837
+ the argument 3, then the entry at the 3rd place will be used as means
838
+ to ask a question.
839
+
840
+ Examples:
841
+
842
+ metagen 2
843
+ metagen 5
844
+
845
+ Where "metagen" is my alias to:
846
+
847
+ n_exams_in_this_topic meta_genetics
848
+
849
+ By default, lines that end via "[]" are ignored, but you can also
850
+ ask a question from ALL available questions, even if they end
851
+ with a "[]" token.
852
+
853
+ Commandline example:
854
+
855
+ ask_exam_questions amg1 --all-questions
856
+
857
+ This would ask a random question from the **amg1-dataset**.
858
+
859
+ ## Studium.pristine
860
+
861
+ The toplevel-method made available through <b>Studium.pristine</b> can
862
+ be used to create a new <b>lecture_information</b> file, from scratch.
863
+
864
+ The one that is, by default, bundled with the studium-gem is/was tailored
865
+ to my own needs and use case. So if you want to use the file, it may be
866
+ better to generate it once, and then modify that newly generated file on
867
+ your own. (Don't forget to keep a backup of it available as well, in case
868
+ it is deleted or overwritten accidentally.)
869
+
870
+ Note that you can invoke **Studium.pristine()** via the commandline as
871
+ well, via:
872
+
873
+ studium --pristine
874
+ studium --new-lecture-information
875
+
876
+ You can then copy this file into the default location, where the file
877
+ <b>lecture_information.yml</b> is normally stored, via:
878
+
879
+ studium --merge
880
+
881
+ ## Commandline examples of the studium gem
882
+
883
+ This subsection shows some commandline examples, in a succinct
884
+ manner.
885
+
886
+ Display **bachelor curricula**, via the syntax --bachelor=NAME_HERE
887
+
888
+ studium --bachelor=vektorx
889
+ studium --bachelor=genetics
890
+
891
+ Display **master curricula**, via the syntax --master=NAME_HERE
892
+
893
+ studium --master=vektorx
894
+ studium --master=immunobio
895
+
896
+ Note that in both cases, the curriculum has to be registered.
897
+
898
+ If you wish to see which exams have been passed, that is,
899
+ completed successfully, then use this invocation style:
900
+
901
+ studium --passed-exams?
902
+ studium --passed-exams
903
+
904
+ If you want to show how many ECTS points have been completed
905
+ in the registered curricula, do either of the following:
906
+
907
+ studium --passed-ects?
908
+ studium --passed-ects
909
+
910
+ To show how many question-answers I added per year, on my
911
+ own exam dataset, this can be used:
912
+
913
+ studium --questions-per-year
914
+
915
+ ## Studium.return_div_timetable_of_upcoming_exams
916
+
917
+ This module-method can show the upcoming exams, as a html table.
918
+
919
+ This allows you to look at the upcoming exams in a <b>browser</b>.
920
+
921
+ The priority of the given lecture must be among these values:
922
+
923
+ 1, 2, 3, 4, 5
924
+
925
+ Thus, a priority value of higher than 5 will <b>not</b> be
926
+ shown/considered.
927
+
928
+ ## Aliases
929
+
930
+ The studium-gem uses several aliases. These exist mostly for
931
+ convenience.
932
+
933
+ For example, bin/studium has an entry point called <b>--master-curricula</b>.
934
+ This variant also works via <b>--master</b> alone. The latter option
935
+ is not explicitely mentioned since it is just an alias. If you think
936
+ that a specific alias is missing, let me know and I will add it (as
937
+ long as it does not conflict with any other entry point.)
938
+
939
+ ## Return all passed exams
940
+
941
+ If you need to obtain a list (an <b>Array</b>) of all exams passed,
942
+ you can use any of the following two methods:
943
+
944
+ Studium.all_passed_exams
945
+ Studium.return_all_passed_exams
946
+
947
+ On the commandline, you can invoke this via:
948
+
949
+ studium --passed-exams
950
+ studium --all-passed-exams
951
+ studium --return-all-passed-exams
952
+
953
+ Note that this will <b>only</b> honour exams that have been
954
+ registered in the file <b>lecture_information.yml</b>.
955
+
956
+ To show how many ECTS you have passed in all curricula,
957
+ use this method:
958
+
959
+ Studium.show_passed_credits_per_curriculum
960
+
961
+ ## curricula.yml and registered curricula
962
+
963
+ The file <b>curricula.yml</b> collects the <b>id-numbers</b> of different
964
+ bachelor/master curricula, from <b>different universities</b>, in
965
+ <b>Austria</b>. It can be found under the <b>yaml/</b> subdirectory.
966
+
967
+ In theory this file could be extended to also include EU-wide curricula
968
+ listed, but I only limited it to my own potential use cases or that of
969
+ (former) colleagues.
970
+
971
+ If other people want to add different curricula numbers, subdirectories
972
+ may have to be created for each country - but for now, since nobody else
973
+ may need more curricula, the current structure will remain as it is.
974
+
975
+ Do also note that within the <b>yaml/ subdirectory</b>, there is another
976
+ directory called <b>curricula/</b>. The latter directory includes
977
+ several curricula with the respective lectures that belong to
978
+ this particular curriculum. These files are used to keep track of
979
+ which lectures are part of these curricula and whether you have already
980
+ successfully passed these or whether you have not.
981
+
982
+ ## Improving this project
983
+
984
+ If other people would like to make use of this this project, I am open
985
+ for suggestions on how to make it more flexible.
986
+
987
+ Otherwise, I will just keep it here as it is, as I do (or rather, did)
988
+ require it in a few of my other projects. And if nobody else uses it
989
+ then this is also fine because I used to be the number one user here
990
+ anyway - the project had to solve existing problems, and it did so
991
+ fairly well. Extra work past this point (in the year **2018**) is
992
+ mostly done just to polish existing functionality, and to add a
993
+ tiny bit of new functionality every now and then, or to improve the
994
+ documentation. :)
995
+
996
+ I am also adding some code now and then for GUI and www-related use,
997
+ as this interests me personally; but other than that, I consider the
998
+ project mostly "done" in regards to time investment.
999
+
1000
+ ## The method obtain_this_value_from_hash()
1001
+
1002
+ This method resides in the file <b>studium/base/base.rb</b>.
1003
+
1004
+ It was created in order to access the main Hash - that is, the
1005
+ Hash that is returned from the file <b>lecture_information.yml</b>.
1006
+
1007
+ I had to access the various entries from said file and this was
1008
+ becoming a bit tedious. It became even more tedious because some
1009
+ keys are Strings and some keys are Symbols. Since I did not want
1010
+ to look up all the time whether I am dealing with Strings or
1011
+ with Symbols, I transitioned into using that method instead.
1012
+
1013
+ It is thus a bit similar to <b>HashWithIndifferentAccess</b>, except
1014
+ that it is just a simple method (and the main name is actually
1015
+ <b>obtain()</b>).
1016
+
1017
+ ## Download the exam dataset
1018
+
1019
+ You can download the exam dataset by making use of this commandline
1020
+ option:
1021
+
1022
+ studium --download-exam-dataset
1023
+ studium --download-dataset
1024
+
1025
+ This will copy into the exam_topics/ subdirectory, so make sure
1026
+ that you want this BEFORE calling the above. If in doubt, backup
1027
+ your exam dataset and store it elsewhere on top of that (which
1028
+ may be a good idea in general).
1029
+
1030
+ ## class Studium::ShowLecturesOfThisCurriculumId
1031
+
1032
+ **class Studium::ShowLecturesOfThisCurriculumId** can be used to output
1033
+ all lectures that **belong to a particular curriculum ID**. That way
1034
+ you can see which lectures could be done for a particular curriculum;
1035
+ and which lectures have already been passed in this curriculum, too.
1036
+
1037
+ You can input either the curriculum ID to this class; or some
1038
+ shortcuts.
1039
+
1040
+ The following input works on my home system, where
1041
+ show_lectures_of_this_curriculum_id is alias to the .rb file that
1042
+ holds **class Studium::ShowLecturesOfThisCurriculumId** can be used to output:
1043
+
1044
+ show_lectures_of_this_curriculum_id 066875
1045
+ show_lectures_of_this_curriculum_id Bioinformatik
1046
+ show_lectures_of_this_curriculum_id MolBio
1047
+ show_lectures_of_this_curriculum_id Landschaftsplanung
1048
+
1049
+ ## Description of lectures
1050
+
1051
+ Some lectures are described in the file **lecture_information.yml**, but not
1052
+ all are. I have described only some which were of relevance to me. Most of
1053
+ these descriptions are in german, because the teaching language for most of
1054
+ these lectures is in german.
1055
+
1056
+ If you ever want to add your own descriptions, you can do so, by populating
1057
+ the entry called:
1058
+
1059
+ !ruby/symbol description: |
1060
+
1061
+ ## KDE Konsole support
1062
+
1063
+ In the past we could rename KDE Konsole tabs, but this behaviour is presently
1064
+ (November 2018) slightly buggy. I have thus disabled it.
1065
+
1066
+ It may be re-enabled one day in the future, but via a configuration setting,
1067
+ so that users can disable/enable it. By default it will then be disabled.
1068
+
1069
+ ## Studium::PassedEctsPerYear
1070
+
1071
+ If you need to find out how many ECTS points have been passed per given
1072
+ year for a particular curriculum then you can use class
1073
+ **Studium::PassedEctsPerYear**.
1074
+
1075
+ The input is the name of that curriculum. Obviously for this to work, the
1076
+ curriculum has had to be registered first.
1077
+
1078
+ You can also invoke it from the commandline, via:
1079
+
1080
+ studium --passed-ects-per-year
1081
+
1082
+ ## Display the amount of ECTS points passed in Bachelor/Master lectures
1083
+
1084
+ You can find out how many ECTS points were passed in Bachelor and
1085
+ Master lectures so far via:
1086
+
1087
+ studium --ects-bachelor-master
1088
+
1089
+ ## Using an environment variable to specify your replacement for lecture_information.yml
1090
+
1091
+ Some people may wish to use the project but wish to use another .yml
1092
+ file, other than the default one called **lecture_information.yml**.
1093
+ This is normally done so that you can, for example, add your own exam
1094
+ dataset into this .yml file (and have it persistent, that is, stored
1095
+ somewhere else on your filesystem, rather than use the bundled
1096
+ variant that comes distributed with the **studium** gem itself).
1097
+
1098
+ For people who require this, there exists an **environment variable**
1099
+ called **STUDIUM_FILE_LECTURE_INFORMATION**. Simply assign to this
1100
+ variable the full path to your dataset, which must be a .yml file
1101
+ in the same format.
1102
+
1103
+ Example for bash:
1104
+
1105
+ STUDIUM_FILE_LECTURE_INFORMATION=/opt/foo/bar.yml
1106
+
1107
+ ## class Studium::ShowCompletedEctsInAllCurricula
1108
+
1109
+ **class Studium::ShowCompletedEctsInAllCurricula** can be used
1110
+ to show the completed ECTS per curriculum, sorted by n ECTS (maximum
1111
+ amount of ECTS) first. This is really just an "overview" class that
1112
+ shall quickly tell you how many different curricula exist.
1113
+
1114
+ A threshold value ("cut off") exists, which is set to 5.0 ECTS
1115
+ by default. Only if you have passed exams worth a total of at
1116
+ the least 5.0 ECTS will they be shown. This is set via a constant
1117
+ which can be toggled.
1118
+
1119
+ ## class Studium::ShowConflictingLvaLectures
1120
+
1121
+ **class Studium::ShowConflictingLvaLectures** resides at the internal
1122
+ location <b>studium/utility_scripts/show_conflicting_lva_lectures.rb</b>,
1123
+ within the **studium** gem.
1124
+
1125
+ The purpose of this class is to **show conflicting lva-lecture dates**.
1126
+
1127
+ For example, say that you want to know whether there are any conflicts on
1128
+ the day **16.10.2018** (16th October in the year **2018**). Then you would
1129
+ simply pass that string into <b>class Studium::ShowConflictingLvaLectures</b>
1130
+ and that class will then display which exams and which lectures are on
1131
+ that date, **sorted by time**.
1132
+
1133
+ Example:
1134
+
1135
+ conflict 16.10.2018
1136
+
1137
+ (I use the alias called **conflict** to invoke that .rb file from the
1138
+ commandline.)
1139
+
1140
+ The result, on the commandline, may look like this (for another
1141
+ day):
1142
+
1143
+ <img src="https://i.imgur.com/4YI1Y2k.png" style="margin: 1em">
1144
+
1145
+ You can pass in any number of dates in the **dd.mm.yyyy** format, and the
1146
+ class will iterate through all of them and report which lectures and
1147
+ exams happen on each respective day.
1148
+
1149
+ You can use a range of dates too, if you pass in a **-** between two
1150
+ such dates.
1151
+
1152
+ Example:
1153
+
1154
+ conflict 16.10.2018-20.10.2018
1155
+
1156
+ This will be treated as if you would have given input from the
1157
+ 16th, 17th, 18th, 19th and 20th. That can thus be used as a
1158
+ sort of "mini-calendar", on the commandline, in regards to
1159
+ important lectures/exams. (Remember that you will have to
1160
+ populate and maintain the dataset in the file called
1161
+ **lecture_information.yml** for this to work.)
1162
+
1163
+ You can also use a few **abbreviations** for **class Studium::ShowConflictingLvaLectures**.
1164
+
1165
+ For example, the capital letter **A** is a hardcoded entry that I may
1166
+ change to indicate which is the starting day of university in a given
1167
+ semster, such as **01.10.2018** or any such day. The capital letter B
1168
+ then refers to the day after that day, the capital letter C refers to
1169
+ the day after B, and so forth. The idea here is to use just a one-letter
1170
+ abbreviation rather than have to input **4 - 10** characters instead.
1171
+
1172
+ As already stated in this subsection, the file **lecture_information.yml**
1173
+ needs to have these lectures/exams registered first, before <b>class
1174
+ Studium::ShowConflictingLvaLectures</b> is able to display them.
1175
+
1176
+ Why was this class added? I needed that functionality to plan **exam-dates**
1177
+ ahead of time. That way I could display which exams may be upcoming
1178
+ and so forth - helped me in regards to **time management**.
1179
+
1180
+ ## Underline-support for exam questions
1181
+
1182
+ You can use **ud**test**/ud** or **u**test**/u** to use underline-support
1183
+ in KDE konsole for question-answer combinations. (I can not use tags
1184
+ here in markdown, or so it seems, so assume that **ud** stands for the
1185
+ corresponding tag.)
1186
+
1187
+ ## Studium::ShowLecturers
1188
+
1189
+ class **Studium::ShowLecturers** will show the lecturers of each lecture
1190
+ in a given curriculum, on the commandline/terminal.
1191
+
1192
+ If an entry is missing the lectures then this will be reported on
1193
+ the commandline.
1194
+
1195
+ The idea behind this class is mostly to allow you to quickly find out
1196
+ which lecturer holds which particular lecture (and when).
1197
+
1198
+ It is not a too terribly useful class, though - mostly exists just
1199
+ for **sake of completeness**.
1200
+
1201
+ ## Registered URL entries to the (registered) lectures
1202
+
1203
+ Since as of 15.04.2019 (<b>April 2019</b>) it is possible to
1204
+ return the remote URL of a given registered lecture,
1205
+ through the **Studium** module.
1206
+
1207
+ Let's first show an example for this, including the toplevel API:
1208
+
1209
+ Studium.return_remote_homepage_of_this_lecture "270016 Massenspektrometrie" # => "https://ufind.univie.ac.at/de/course.html?lv=270016&semester=2019S"
1210
+ Studium.return_remote_homepage_of_this_lecture "Massenspektrometrie" # => "https://ufind.univie.ac.at/de/course.html?lv=270016&semester=2019S"
1211
+
1212
+ As you may be able to see, we take a shorter input string, aka the name
1213
+ of the lecture at hand, and then return the remote URL for that lecture.
1214
+ In particular the second example shows how you can use a partial input,
1215
+ and still obtain the current remote URL associated with that course.
1216
+
1217
+ This requires that a key called <b>:homepage</b> registered
1218
+ exists for that particular lecture in the file
1219
+ **lecture_information.yml**.
1220
+
1221
+ Right now only a very few lectures contain such an entry, but I
1222
+ will extend on this slowly, as time permits. The long term goal
1223
+ will be to provide a remote URL to **all** registered lectures.
1224
+ (This was already possible through the BeautifulUrl project,
1225
+ but I realized that it may be better to a) register this directly
1226
+ within the Studium project and b) to not depend on other projects
1227
+ if possible).
1228
+
1229
+ ## Encoding
1230
+
1231
+ The default encoding for the **Studium** gem used to be
1232
+ the **encoding ISO-8859-1**, aliased onto the constant
1233
+ called **ENCODING_ISO**. This setting (constant) can be found
1234
+ in the file **studium/encoding/encodings.rb**
1235
+
1236
+ Since as of **May 2019** the default encoding is now **UTF-8**.
1237
+
1238
+ In the event that you may wish to use another encoding, you
1239
+ can modify the yaml file called <b>default_encoding.yml</b>,
1240
+ at **studium/yaml/default_encoding.yml**. Simply add the name
1241
+ of the constant there.
1242
+
1243
+ The reason why I personally used **ISO-8859-1** as encoding is because
1244
+ german umlauts can be a hassle under UTF when combined with an
1245
+ old editor I used to use. I finally abandoned that editor in 2019
1246
+ and am now using another editor, so it was also possible to
1247
+ switch to UTF-8. Unicode/UTF has quite a massive
1248
+ <b>intrinsic complexity</b>, but it also has some useful things,
1249
+ such as emojis and unicode characters, which can be used on the
1250
+ terminal in a colourized manner. That was actually the primary
1251
+ reason why I switched into UTF-8, as odd as that may sound.
1252
+
1253
+ The Studium project will continue to allow any other encoding
1254
+ though, as long as it is supported by ruby itself.
1255
+
1256
+ For the time being, there also exists a commandline way to change
1257
+ the encoding in use for the Studium project.
1258
+
1259
+ studium --encoding=utf
1260
+ studium --encoding=iso1
1261
+
1262
+ If you are fine with UTF-8 then obviously you do not have to change
1263
+ anything.
1264
+
1265
+ ## Studium::SolvedEctsPerUniversity
1266
+
1267
+ If you have solved ECTS credits at different universities, and
1268
+ registered this in the file **lecture_information.yml**, then
1269
+ this class will give a little summary on the commandline as to
1270
+ the number of ECTS points solved at different universities.
1271
+
1272
+ ## Logging activities done within the Studium project
1273
+
1274
+ The **Studium project** will try, by default, to log a lot of
1275
+ information that may be useful in some cases. This is not a
1276
+ trivial task, because there are many different classes that
1277
+ make up this project.
1278
+
1279
+ The paragraph here aims to explain some of the rationale behind
1280
+ the logging.
1281
+
1282
+ class **Studium::Log::StoreLastQuestionAskedIntoFile** will store
1283
+ the last exam-question asked into a file, together with the time
1284
+ stamp. This can then be used to answer questions such as "have I
1285
+ already asked myself this question today?". So this may help
1286
+ for training purposes, e. g. when you wish to acquire some knowledge,
1287
+ and learn for new questions that way.
1288
+
1289
+ ## Studium.find_corresponding_exam_topic
1290
+
1291
+ The toplevel method <b>Studium.find_corresponding_exam_topic</b> is
1292
+ mostly a convenience method. It will accept an input, ideally
1293
+ a **String**, and return back the **official, registered name
1294
+ of the particular exam topic at hand**.
1295
+
1296
+ For example, 'genetik' as input to this method will become
1297
+ 'allgemeine_genetik', which is also the locally existing
1298
+ name for the exam-file at hand.
1299
+
1300
+ The idea behind that method is that we can take a shorter
1301
+ input, and still obtain the real filename. This is convenient
1302
+ because you can type just a few characters, and have the
1303
+ name of the exam-file returned. It allows us to be lazy here.
1304
+
1305
+ This is especially useful on the commandline, but it is also
1306
+ useful to aggregate it together in different ruby files of
1307
+ this project, and present a "unified" API for this topic.
1308
+
1309
+ Note that since as of 09.11.2019 (9th of November), the number of
1310
+ available exam-topics as part of this project are calculated
1311
+ automatically. Prior to that a constant was used that was
1312
+ hand-counted manually by me, which was too tedious and error-prone -
1313
+ so the new approach should work better for more exam topics in
1314
+ the future.
1315
+
1316
+ ## Studium.find_corresponding_exam_title
1317
+
1318
+ The method <b>Studium.find_corresponding_exam_title()</b> can be used
1319
+ to return the full, spelled out name of the exam topic at hand.
1320
+
1321
+ Let's showcase two examples next - these may explain what this method
1322
+ does more succinctly so:
1323
+
1324
+ title = Studium.find_corresponding_exam_title('technische_grundlagen_der_informatik') # => "Technische Grundlagen der Informatik"
1325
+ title = Studium.find_corresponding_exam_title('mphysio') # => "Mikrobielle Physiologie"
1326
+
1327
+ As can be seen, a short input, such as **mphysio**, will be translated
1328
+ into **Mikrobielle Physiologie** properly. I needed this in order
1329
+ to show the exam topic at hand; showing **mphysio** was not as
1330
+ useful as showing **Mikrobielle Physiologie** instead (which,
1331
+ by the way, is german for **microbial physiology**, that is
1332
+ metabolic pathways used by microorganisms).
1333
+
1334
+ ## Studium::Exams::PushSolvedQuestionsOnTop
1335
+
1336
+ **class Studium::Exams::PushSolvedQuestionsOnTop** has a very simple
1337
+ objective: it will move all lines ending with ' []' to the top of
1338
+ a given file, if at the least one ' []' is encountered in that
1339
+ file. Note that "top of the given file" specifically excludes
1340
+ comments, that is lines starting with **#** in that file, and the
1341
+ first line after that '#' comment, which is just a newline for
1342
+ readability reasons usually.
1343
+
1344
+ The idea behind this class is really just to be able to quickly
1345
+ reshuffle all solved questions towards the top of the file;
1346
+ the unsolved questions will then be at the bottom of the file.
1347
+
1348
+ I needed this functionality because it allows me to quickly
1349
+ re-structure existing question-answers, into different
1350
+ topics/themes.
1351
+
1352
+ On my home system, I aliases it to <b>ontop</b> simply.
1353
+
1354
+ ## Display the upcoming exams, via the timetable
1355
+
1356
+ You can show the list of <b>upcoming exams</b> via:
1357
+
1358
+ studium --timetable
1359
+
1360
+ Note that this makes use of the information stored in the file called
1361
+ <b>lecture_information.yml</b>, which has to be maintained by someone.
1362
+ In this case, I am still maintaining the dataset stored in that
1363
+ file (in the year **2019**) - but this may not be the case at a later
1364
+ time, so ideally someone else should be able to maintain that file,
1365
+ or just anyone. I will add sufficient documentation to explain what
1366
+ has to be done, in order to maintain that single file.
1367
+
1368
+ At any rate, the class that is responsible for interpreting the dataset
1369
+ stored in that .yml file, is **class Studium::Exams::UpcomingImportantExams**.
1370
+
1371
+ This is the very same class that is invoked by issuing
1372
+ <b>studium --timetable</b>.
1373
+
1374
+ The exam dates should ideally follow the **dd.mm.yyyy notation**,
1375
+ that is <b>day.month.year</b>.
1376
+
1377
+ An example will be given next. Say that you have a course called
1378
+ <b>Physics for Engineers</b>. Two exams for this course are upcoming,
1379
+ which you may wish to **register** in the above-mentioned yaml
1380
+ file, like in such a way:
1381
+
1382
+ "Physics for Engineers":
1383
+ - "02.02.2018"
1384
+ - "02.03.2018"
1385
+
1386
+ The above means that the next exam for the course "**Physics for
1387
+ Engineers**" will occur at the beginning of february; and then
1388
+ the next exam will be at the beginning of march, and so
1389
+ forth. You should sort this by date.
1390
+
1391
+ In the .yml file, the exam-related entries are called
1392
+ <b>exams:</b> and should denote an **Array**.
1393
+
1394
+ Once the exam has been registered like that,
1395
+ **class Studium::Exams::UpcomingImportantExams**
1396
+ will make use of the information. That's about it for
1397
+ that class. :)
1398
+
1399
+ ## Graphviz: generating module dependencies
1400
+
1401
+ Since as of December 2019 it is possible to generate a module
1402
+ dependency image (as a .png file). This depends on the project
1403
+ called **ImageParadise**, and on the program called graphviz.
1404
+
1405
+ The code works, but it is not really optimized or very flexible.
1406
+ Consider it more as a proof-of-concept for the time being -
1407
+ perhaps in the future this may be extended.
1408
+
1409
+ (Note that most of the code for this can be found in the
1410
+ image_paradise gem; the studium gem only generates the
1411
+ Hash that is passed into image_paradise, and it is
1412
+ then the responsibility of image_paradise to generate
1413
+ the image file at hand.)
1414
+
1415
+ ## Evaluating the progress in different curricula
1416
+
1417
+ You can evaluate your progress in different curricula via class
1418
+ <b>Studium::CurriculumComparer</b>. This class resides within the
1419
+ <b>statistics/</b> subdirectory of this gem.
1420
+
1421
+ In order for this class to work properly, all your successfully completed
1422
+ lectures have to be registered in the file <b>lecture_information.yml</b>
1423
+ prior to using that class. (Thus, you need to use your own dataset,
1424
+ but this is the only sensible thing to do; it would not make a lot of
1425
+ sense for you to use my dataset, since that makes no sense for
1426
+ **your** particular progress in your own studies. People will have
1427
+ to maintain their own dataset here.)
1428
+
1429
+ The class will then output which curricula have the highest amount
1430
+ of successfully completed ECTS points, sorted first. That way you
1431
+ can assess how far you have gotten in this or that curriculum so
1432
+ far.
1433
+
1434
+ ## Deprecations within the Studium gem
1435
+
1436
+ This subsection may eventually contain deprecations within the
1437
+ Studium gem itself.
1438
+
1439
+ - class Studium::Exams::ShowExamThemes was deprecated on
1440
+ 01.06.2020; most of its functionality was integrated into
1441
+ class Studium::Exams::ShowThemes. The new code is better
1442
+ than the old code, in my opinion. Less confusing.
1443
+
1444
+ The file **participating_in_these_courses.yml** was removed.
1445
+ Users now have to designate whether they participate in a
1446
+ university course with the corresponding LV-entry in the
1447
+ file **lecture_information.yml**.
1448
+
1449
+ The two constants **STORE_LAST_QUESTION_ASKED_WHERE** and
1450
+ **FILE_LAST_QUESTION_ASKED** were removed. Use the toplevel-method
1451
+ **Studium.file_last_question_asked?** instead if you want
1452
+ to find out where the last exam question is stored.
1453
+
1454
+ ## Sinatra interface
1455
+
1456
+ The Studium project has a small sinatra interface, which can
1457
+ be started like this from the commandline:
1458
+
1459
+ studium --sinatra
1460
+
1461
+ (If this fails, try to reload again. On my system I have
1462
+ tied this to open it in the browser the moment sinatra
1463
+ is started, and this takes perhaps two or there seconds.)
1464
+
1465
+ Note that the sinatra-interface is fairly minimal, but it
1466
+ can be used to display different curricula. Expect this
1467
+ to be improved in the long run (past **June 2020**).
1468
+
1469
+ ## Determining the name of a curriculum
1470
+
1471
+ If you have a use case for determining (and returning) the
1472
+ name of a curriculum, you can do this:
1473
+
1474
+ require 'studium/toplevel_methods/name_of_this_curriculum.rb'
1475
+
1476
+ Studium.name_of_this_curriculum
1477
+ Studium.name_of_this_curriculum(:indi2)
1478
+ Studium.name_of_this_curriculum(:tu_wien_chem) # => "Technische Chemie"
1479
+
1480
+ ## class Studium::Exams::UpcomingExams
1481
+
1482
+ class Studium::Exams::UpcomingExams can report which exams are
1483
+ upcoming, via a HTML table.
1484
+
1485
+ ## class Studium::Calendar
1486
+
1487
+ class **Studium::Calendar** attempts to display which courses are
1488
+ upcoming, so that you can plan ahead. It currently works only on
1489
+ the commandline, but in the future ruby-gtk bindings and a
1490
+ sinatra-web-interface may be added - we'll see.
1491
+
1492
+ The main dataset for this class is derived from the file
1493
+ called **participating_in_these_courses.yml**. The key
1494
+ that is listed there will become the full name.
1495
+
1496
+ The class was added in September 2020, so expect things
1497
+ to not work pefectly well for the time being - it will
1498
+ be improved upon at a later time.
1499
+
1500
+ ## Showing all STEOP lectures of a curriculum
1501
+
1502
+ You can show all STEOP lectures that are in a curriculum.
1503
+
1504
+ Issue something like the following on the commandline:
1505
+
1506
+ steop_lectures --curriculum1
1507
+ steop_lectures --curriculum2 # number-input should work
1508
+ steop_lectures --ktww
1509
+ steop_lectures --lbt # Bachelor Biotech-Curriculum at the BOKU
1510
+ steop_lectures --AW # as should abbreviations; AW is "Agrarwissenschaften"
1511
+ steop_lectures_in_this_curriculum --ktww
1512
+
1513
+ Where **steop_lectures** is an alias to where class
1514
+ **Studium::SteopLecturesInThisCurriculum** resides - usually
1515
+ in the file **studium/steop/steop_lectures_in_this_curriculum.rb**.
1516
+
1517
+ If you want to show all steop-lectures in the current semester,
1518
+ consider using <b>Studium::SteopLvaDates.new</b>.
1519
+
1520
+ ## Semesterplaner - planning a given semester (half-year) at a university
1521
+
1522
+ There is a class that may try to plan ahead for a given semester
1523
+ at a university. This class is not very flexible and such but
1524
+ the code could be improved.
1525
+
1526
+ See:
1527
+
1528
+ require 'studium/utility_scripts/semesterplaner.rb'
1529
+ Studium::Semesterplaner.new
1530
+
1531
+ ## Display exam statistics
1532
+
1533
+ To show the exam statistics, try:
1534
+
1535
+ Studium.show_exam_statistics
1536
+
1537
+ ## class Studium::ShowLvaDatesOfThisLecture
1538
+
1539
+ If you need to show the **LVA dates** of a given lecture at hand, on
1540
+ the <b>commandline</b>, then you may want to use <b>class
1541
+ Studium::ShowLvaDatesOfThisLecture</b>, defined in the file
1542
+ <b>studium/utility_scripts/show_lva_dates_of_this_lecture.rb</b>.
1543
+
1544
+ The usage for this class is quite simple - pass in the name of the
1545
+ lecture that you are interested in, such as "Primatologie".
1546
+
1547
+ If you want to get the most accurate information, then you should
1548
+ ideally also pass in the lecture ID; such as in the above example
1549
+ with "Primatologie", the input string should be in the form of:
1550
+
1551
+ "300227 Primatologie"
1552
+
1553
+ We call the "300227 Primatologie" variant as the <b>full
1554
+ input</b> and the variant with "Primatologie" alone as
1555
+ <b>partial input</b>. If only a partial input is provided,
1556
+ then the script will try to be <b>greedy</b> and find as
1557
+ many relevant entries as possible. This can be used as a
1558
+ feature too.
1559
+
1560
+ For example, consider that <b>show_lva_dates_of_this_lecture</b>
1561
+ is an alias to the above .rb file, then the following
1562
+ commandline use:
1563
+
1564
+ show_lva_dates_of_this_lecture Geneti
1565
+
1566
+ would show all lectures that have the tag "Geneti"
1567
+ included.
1568
+
1569
+ Note that you do not necessarily need an alias such as
1570
+ <b>show_lva_dates_of_this_lecture</b>; you can also invoke
1571
+ it from the commandline, as the following example shows:
1572
+
1573
+ studium --show-lva-dates-of-this-lecture=Primatologie
1574
+ studium --show-lva-dates-of-this-lecture="300227 Primatologie"
1575
+
1576
+ To use it in ruby code, try something like this:
1577
+
1578
+ require 'studium/utility_scripts/show_lva_dates_of_this_lecture.rb'
1579
+ result = Studium::ShowLvaDatesOfThisLecture.new("802300 Biological nanosciences and nanotechnology (in Eng.)")
1580
+
1581
+ ## Expanding time ranges
1582
+
1583
+ Consider the situation where a student participates in a lecture
1584
+ requiring practical work time, such as by being active in a
1585
+ laboratory, with a time schedule requiring the students to
1586
+ begin early morning, and work until the late evening, over a
1587
+ time period of three weeks. (This is just an example to illustrate
1588
+ this subsection here; the *use case* is explained.)
1589
+
1590
+ You may see that the school/university displays the specific dates
1591
+ online via something like:
1592
+
1593
+ 15.10. - 2.11.2020,
1594
+
1595
+ **Exactly** like this (this is actually a copy/pasted "real-world"
1596
+ example, including the trailing ',').
1597
+
1598
+ What does the above mean? Well, it means that the course will
1599
+ **begin** at the 15th of october, in the year 2020 (this is
1600
+ the dd.mm.yyyy notation which is in general used in europe).
1601
+
1602
+ The **-** in between means "up until" and the end date is
1603
+ specified to be at the second of november, in 2020.
1604
+
1605
+ Since I needed to quickly convert such short, one-line
1606
+ dates of a given course into a specific time for use in a
1607
+ **calendar-like application**, I needed a class that can output
1608
+ an Array of dates where this course will be held. So, class
1609
+ <b>Studium::ExpandTimeRange</b> was created to tackle this
1610
+ problem.
1611
+
1612
+ This class will accept such odd input as the last example, and
1613
+ then output an Array that can be used in a yaml file, of the specific
1614
+ dates, weekend-names associated with that day and the time. This
1615
+ then allows me to quickly copy/paste this into the corresponding
1616
+ yaml file. (I needed to have this expanded to every day because
1617
+ I also visually have to look at that yaml file. For this, it
1618
+ does help to have every day listed as-is, rather than specify
1619
+ a range such as **02.11-04.12**.)
1620
+
1621
+ Internally you can also use the following toplevel-method:
1622
+
1623
+ Studium.expand_time_range()
1624
+ Studium.expander()
1625
+
1626
+ Use whichever variant you prefer - the last method is quite short
1627
+ though, so you can use it like this:
1628
+
1629
+ Studium.expander('15.10. - 2.11.2018')
1630
+
1631
+ This also works over the **commandline**, of course:
1632
+
1633
+ studium --expand-time-range="15.10. - 2.11.2018,"
1634
+ studium --expander="15.10.-2.11.2018"
1635
+
1636
+ ## Querying whether a student is registered for a particular exam
1637
+
1638
+ To query and thus determine whether you are registered for a
1639
+ particular exam, use this method:
1640
+
1641
+ Studium.registered_for_this_exam?
1642
+ Studium.registered_for_this_exam? "892104 Physik (LBT)"
1643
+
1644
+ Note that in order for this to work, the information has
1645
+ to be registered for that particular course, e. g. as
1646
+ **registered** - that is typically found right above the
1647
+ **exams** setting, if it exists.
1648
+
1649
+ ## class Studium::GenerateSpreadsheet
1650
+
1651
+ The idea for class Studium::GenerateSpreadsheet was to
1652
+ generate a spreadsheet (LibreOffice excel file) for
1653
+ individual curricula automatically. This works partially
1654
+ in the sense that the generated file is correct, but
1655
+ its visual looks are not necessarily ... awesome. If
1656
+ you need to use it, I recommend to use this only as
1657
+ a blueprint, and make enhancement to the generated
1658
+ file manually.
1659
+
1660
+ ## Reporting all lectures that match to a specific lecture type
1661
+
1662
+ If you need to find out all registered lectures that match
1663
+ a particular type, such as 'VO', or 'UE' or 'VO+SE', then you
1664
+ can use the following toplevel-method:
1665
+
1666
+ Studium.report_all_lectures_matching_this_lecture_type('VO+SE')
1667
+
1668
+ The latter was the primary reason why this method has been
1669
+ added; I needed to find out all lecture types that are
1670
+ of combined VO + SE style ("VO" for "Vorlesung", "SE"
1671
+ for "Seminar").
1672
+
1673
+ ## Report how many ECTS were solved per university
1674
+
1675
+ This can be done via:
1676
+
1677
+ Studium::EctsPerUniversity.new
1678
+
1679
+ Or via the **commandline**, through <b>bin/studium</b>:
1680
+
1681
+ studium --ects-per-university
1682
+
1683
+ ## Showing the weekly lectures
1684
+
1685
+ In order to show the weekly lectures, you can use **class WeekParser**.
1686
+
1687
+ ## class Studium::UpcomingMandatoryPresenceCourses.new
1688
+
1689
+ class Studium::UpcomingMandatoryPresenceCourses.new can be
1690
+ used to show the upcoming courses that require your physical
1691
+ presence. By default this class will "peek ahead" 40 days
1692
+ into the future; this can be modified via the method
1693
+ **.set_n_days_into_the_future()**.
1694
+
1695
+ You can also invoke this on the commandline via:
1696
+
1697
+ studium --mandatory
1698
+
1699
+ ## Working with a curriculum
1700
+
1701
+ From the ruby side, you can do this:
1702
+
1703
+ require 'studium'
1704
+
1705
+ this_curriculum = Studium::Curriculum.new(:bachelor_vektoren)
1706
+
1707
+ ## Studium.backup_this_exam_file
1708
+
1709
+ The method **Studium.backup_this_exam_file()** may be used from
1710
+ various classes, but most importantly it is used by
1711
+ **class AskExamQuestion**. The idea here is to first back up
1712
+ the **old** exam question file, before making any changes. That
1713
+ way you can restore to the prior file, if you ever need to.
1714
+
1715
+ ## Marking all exam questions of a given topic to solved
1716
+
1717
+ If you want to mark all questions of a particular topic to
1718
+ "solved" then you can try this:
1719
+
1720
+ qa agrarmarkt --ALL_SOLVED
1721
+ qa agrarmarkt --all-solved
1722
+
1723
+ This will solve all topics from agrarmarkt to **solved**.
1724
+
1725
+ Internally this will ensure that each line has a trailing
1726
+ **[]**.
1727
+
1728
+ ## Colours
1729
+
1730
+ The **colours** within the Studium project are handled in two main ways:
1731
+
1732
+ (1) By an external gem called colours
1733
+
1734
+ (2) Internally in most classes of this project via the @use_colours instance variable.
1735
+
1736
+ In other words, if the toplevel instance variable **@use_colours** is set
1737
+ to **false** then the Studium project/namespace will not use colours at
1738
+ all. That way you can **disable colours** for the whole project. This may
1739
+ be useful if you use the project in sinatra or rails and so forth.
1740
+
1741
+ In ruby code you could invoke the following method in order to achieve
1742
+ this:
1743
+
1744
+ Studium.disable_colours
1745
+
1746
+ By default, on the **commandline**, for exam questions and exam answers
1747
+ to said question, colours can be defined by the user, through the file
1748
+ called <b>studium/yaml/custom_colours.yml</b>.
1749
+
1750
+ That file has ***keys*** such as <b>colour_for_answers</b> and
1751
+ <b>colour_for_answers</b>, which denotes the colour to be used for
1752
+ when a question is asked and an answer to that question is revealed,
1753
+ on the commandline.
1754
+
1755
+ Currently this defaults to <b>olivedrab</b> for exam-questions and
1756
+ <b>lightslategray</b> for exam-answers, but you can use any other
1757
+ colour code here if you would like to. These HTML names are the
1758
+ preferred variants; if you need a link to these names, you could
1759
+ use this one here https://www.w3schools.com/colors/colors_hex.asp.
1760
+
1761
+ So, for example, that yaml file will have these entries:
1762
+
1763
+ colour_for_questions: olivedrab
1764
+ colour_for_answers: lightslategray
1765
+
1766
+ You can also change these colours through the commandline,
1767
+ as the next examples will demonstrate.
1768
+
1769
+ Examples:
1770
+
1771
+ studium --use-this-colour-for-exam-answers=slateblue
1772
+ studium --use-this-colour-for-exam-questions=grey
1773
+
1774
+ Do note that you can "style" exam questions and exam
1775
+ answers in various ways. For example, if you use "" quotes,
1776
+ then another colour will be used (this is no longer the
1777
+ case as of October 2020, though; you need to use HTML
1778
+ names instead, or special tags such as &#60;one>).
1779
+
1780
+ If you use a tag such as <u> and </u> (a html pseudo-tag, u meaning
1781
+ **underline**), then the word will be underlined. You can also
1782
+ add HTML colours, such as &#60;slateblue&#62; this will be in
1783
+ slateblue colour. The latter variant may become shorter in the
1784
+ future, such as &#60;slateblue &#62;foo</&#62; or something
1785
+ like that - but for now, you have to use the name of the HTML
1786
+ colour both in the opening and in the closing tag.
1787
+
1788
+ ## class Studium::Exams::ShowUpcomingExams
1789
+
1790
+ The fairly useful **class ShowUpcomingExams** will display **the next n
1791
+ upcoming exams**, where n should be a number from 3-20, simply as that
1792
+ is more convenient to digest and read on the commandline. There are also
1793
+ files such as d10 or d20 in the **bin/** subdirectory of this gem, which
1794
+ defaults to e. g. 10 or 20 upcoming exams. That way you can, for example,
1795
+ type d100 and the next 100 upcoming exams are shown (I never had such
1796
+ a high number; the 100 here simply stands, sort of, for "show me all
1797
+ upcoming exams".)
1798
+
1799
+ Don't forget to keep the "register:" entry in the lecture_information.yml
1800
+ file, to indicate which exams are upcoming. In the past a separate
1801
+ file called **exams.yml** was used, but since some years this information
1802
+ is all unified and presented via the file called **lecture_information.yml**.
1803
+
1804
+ If you want to designate another file or location, have a look
1805
+ at the file **file_constants.rb**. You can also invoke this
1806
+ method to set another file position:
1807
+
1808
+ Studium.set_file_exams()
1809
+
1810
+ Simply pass the **location** of your exams-file, which must be
1811
+ a yaml file, into that method.
1812
+
1813
+ If you simply need the dataset of upcoming exams, you can use
1814
+ the following API for this:
1815
+
1816
+ require 'studium'
1817
+ dataset = Studium::ShowUpcomingExams.return_all_registered_upcoming_exams
1818
+
1819
+ ## GUI - Graphical User Interface
1820
+
1821
+ The **studium gem** comes with a few GUI bindings, primarily based
1822
+ on those bindings available to ruby. Although using java is an
1823
+ option - and then using **swing** - at present no effort is made
1824
+ to add a GUI in java or jruby.
1825
+
1826
+ The current focus in this project, in regards to graphical user
1827
+ interfaces (in the year **2021**) is on GTK, in particular via the
1828
+ ruby-gtk3 bindings, which in turn depend on gobject-introspection.
1829
+
1830
+ Since as of <b>July 2022</b> the older ruby-gtk2 bindings were
1831
+ removed. The ruby-gtk3 bindings were of a much higher quality
1832
+ anyway and it is a waste of time to maintain ruby-gtk2 code.
1833
+ Note that my other project called <b>gtk_paradise</b> will
1834
+ continue to support ruby-gtk2 - I just don't think ruby-gtk2
1835
+ will be useful for the studium gem anymore past <b>July 2022</b>.
1836
+
1837
+ Further GUI elements may be added in the future, such as
1838
+ more sinatra-specific code, more .cgi files, perhaps rails
1839
+ as well, and libui. The latter works on windows
1840
+ out-of-the-box if you do "gem install libui", which
1841
+ is a huge plus.
1842
+
1843
+ If you want to make use of the GTK bindings then you currently need
1844
+ the **gtk_paradise** gem, so make sure to install it first. Prior to that
1845
+ you will also need to have the necessary gtk-files, headers and what not.
1846
+ Your distribution (if you use Linux) may have packaged these for you,
1847
+ so research this a little how to obtain all necessary files. I myself
1848
+ tend to compile from source, so I don't really know the names of
1849
+ the packages different distributions use here.
1850
+
1851
+ The **main GUI widget** for **asking exam questions** currently
1852
+ (at the least past **February 2021**) looks like this:
1853
+
1854
+ <img src="https://i.imgur.com/LOmMhht.png" style="margin: 1em; margin-left: 3em">
1855
+
1856
+ In **September 2021** this was enhanced a bit and should look slightly
1857
+ better now:
1858
+
1859
+ <img src="https://i.imgur.com/zpgUCVR.png" style="margin: 1em; margin-left: 3em">
1860
+
1861
+ (Don't mind the answer in the above screenshot being wrong; the lower
1862
+ input-field is just for giving an answer before hitting the reveal
1863
+ button to check whether you gave the correct answer. It's a training
1864
+ system, so of course wrong answers may be given. The above image is
1865
+ mostly about showcasing the **functionality** as such.)
1866
+
1867
+ Note that a **.css** file covers most of the display settings, so users of
1868
+ the studium gem could, in principle, **adjust it to their liking via
1869
+ a CSS file**. I am willing to change the widget composition and
1870
+ functionality as-is, and offer ad-hoc loading of .css files if this
1871
+ is wanted, but most of the time I just use the commandline variant
1872
+ only, anyway.
1873
+
1874
+ Since as of September 2021 a variation exists, called FastAskExamQuestion.
1875
+ The old GUI was becoming slow, for some awkward reason, so I simplified
1876
+ it, removed some features - it should now be more responsive. It may
1877
+ not be as convenient to use, but if you only want a simple GUI for
1878
+ exam-questions then consider making use of FastAskExamQuestion
1879
+ rather than AskExamQuestion.
1880
+
1881
+ It now looks like this:
1882
+
1883
+ <img src="https://i.imgur.com/oPTItPy.png" style="margin: 1em; margin-left: 2em">
1884
+
1885
+ It now has fewer features, but I think it looks better organized now, and most
1886
+ importantly it is faster. Perhaps the issue was unrelated to that widget; either
1887
+ way this new variant will probably retained in the long run.
1888
+
1889
+ The current (August 2021) variant of libui looks like this:
1890
+
1891
+ <img src="https://i.imgur.com/ZLsymdN.png" style="margin-left: 1em">
1892
+
1893
+ Yes, that looks like crap and it is incomplete - but the big win is that this
1894
+ will also work on windows, out of the box, without any further ado. The idea
1895
+ here is that windows users can now work via a GUI tool past this point.
1896
+ **ruby-gtk3** works very well on Linux, but I could not get GTK to
1897
+ work on windows, despite the so-called 'official guide' for msys2. Thanks
1898
+ to libui it is no longer necessary to wait until I get gtk to work on
1899
+ windows - it now works **as-is**.
1900
+
1901
+ You may still want to distribute - or use - an **.exe** file on
1902
+ windows. This is possible if you use the **ocra** gem.
1903
+
1904
+ If you are on windows, then run **bin/studium** like this:
1905
+
1906
+ ruby studium --create-executable
1907
+
1908
+ This should build an .exe file that can be started.
1909
+
1910
+ (That .exe currently, in August 2021, does not work perfectly
1911
+ well. I have to fix some related ruby code first, but starting
1912
+ the libui-widget directly via **ruby** works fine - I tested
1913
+ that on windows too.)
1914
+
1915
+ ## The toplevel-method Studium.filter_away_invalid_questions
1916
+
1917
+ The toplevel-method **Studium.filter_away_invalid_questions()**,
1918
+ defined in the file **studium/toplevel_methods/filter_away_invalid_questions.rb**,
1919
+ is used to filter away invalid questions.
1920
+
1921
+ This essentially removes any empty lines or lines starting with the
1922
+ **#** character, which is assumed to be a comment.
1923
+
1924
+ After this method has been invoked on a dataset, it is assumed
1925
+ that this dataset will contain only valid (legal) exam
1926
+ questions.
1927
+
1928
+ You can tap into the following method to determine the path to
1929
+ the exam topics:
1930
+
1931
+ Studium.path_to_the_exam_topics?
1932
+
1933
+ So you can then read in the exam-topic file, call
1934
+ the Studium.filter_away_invalid_questions() method,
1935
+ and then randomly select a remaining exam topic to
1936
+ ask.
1937
+
1938
+ To obtain a random exam topic, use this API:
1939
+
1940
+ Studium.random_exam_topic? # => "epigenetik"
1941
+ Studium.random_exam_topic? # => "abfall_als_ressource"
1942
+ Studium.random_exam_topic? # => "embryologie_und_entwicklung"
1943
+
1944
+ ## Statistical information within the Studium project
1945
+
1946
+ The Studium project also allows for a few **statistical information**
1947
+ in regards to the project, e. g. such as how many exams were passed
1948
+ in this or that period of time. You can also show the curricula used
1949
+ for any given individual curriculum at hand.
1950
+
1951
+ The latter feature can be invoked such as is shown next:
1952
+
1953
+ studium --statistics
1954
+
1955
+ This will tap into <b>class Studium::DetermineCurricula</b>.
1956
+
1957
+ What about "how many exam questions can a human being solve
1958
+ per given day"? Well, this is a generic question really, and
1959
+ it will depend on the individual. Some people learn faster
1960
+ than others, for many reasons. The dataset I compiled for
1961
+ myself is not applicable to many other people - you'd need
1962
+ to do so consistently and study a whole cohort of people,
1963
+ in order to answer this question.
1964
+
1965
+ But if we ignore the cohort-situation, just for me, personally,
1966
+ I found a few interesting facts. In November 2021 the maximum
1967
+ exam-questions answered for me were **10.729**. In
1968
+ February of 2020 I reset that counter to 0, for various
1969
+ reasons. Then I resumed answering exam questions. In November
1970
+ 2021 I broke 10.000 again, so the number of 10.729 is not
1971
+ a fluke - it's a real number for at the least my own situation.
1972
+ So, answering 10.000 exam questions may take me about a year
1973
+ and a half, give or take. (Remember that I did not necessarily
1974
+ answer the same exam questions again, so I may be above
1975
+ 11.000 right now, most likely.)
1976
+
1977
+ So, if I estimate, in 18 months I answer 10.000 questions,
1978
+ and 18 months have roughly 18*30 540 days, then I can answer
1979
+ 10_000 / 540.0 **18.5 exam questions per day**. Keep in mind
1980
+ that I did not answer exam questions on every day, and I wasn't
1981
+ really pushing this every day either, so this is more a relaxed
1982
+ approach. So a human being can very easily learn something
1983
+ new every day, with about 20 exam questions per day at minimum.
1984
+ (I consider myself average in this regard, so tons of people
1985
+ will have better numbers than these.)
1986
+
1987
+ This statistic may be fairly useless for others to know, but I
1988
+ find it quite interesting nonetheless. Imagine if I would have started
1989
+ with this when I was a little kid - my current knowledge would
1990
+ be significantly larger than what I have available right now.
1991
+ Whether the time investment pays off in the long run is hard
1992
+ to say - after all you also learn something new anyway, even
1993
+ without exam questions. Think about mechanical repair knowledge,
1994
+ which you can not easily obtain just from reading text; you need
1995
+ the physical practice too. But specifically for exam-related topics,
1996
+ where only theoretical knowledge is to be considered, this is
1997
+ quite helpful, in my opinion.
1998
+
1999
+ My next goal is to break 15.000 and then 20.000. Let's see
2000
+ how long this will take. :)
2001
+
2002
+ ## class Studium::Exams::ExamQuestion
2003
+
2004
+ class **Studium::Exams::ExamQuestion** has been written in **January
2005
+ 2022**. It replaced two older classes which formed the foundation of
2006
+ the "ask an exam-question" functionality.
2007
+
2008
+ The primary reason why it was rewritten was because there were
2009
+ several bugs in regards to coloured output on the commandline,
2010
+ via **ANSI escape sequences**. These bugs were fixed during
2011
+ the rewrite. \o/
2012
+
2013
+ The class, called from the commandline, may generate a question/answer
2014
+ output such as the following:
2015
+
2016
+ <img src="https://i.imgur.com/6D7KBHe.png" style="margin: 1em;">
2017
+
2018
+ This shows the question on top, and then the revealed answer
2019
+ below, via colours. The colours can be customized a little via
2020
+ a .yml file.
2021
+
2022
+ ## class Studium::Exams::Solved
2023
+
2024
+ Since as of **January 2022**, class **Studium::Exams::Solved** will
2025
+ be more verbose if you call it from the commandline via:
2026
+
2027
+ solved --be-verbose
2028
+
2029
+ I needed this because there were some bugs that had to be
2030
+ removed, and it seemed more convenient to let this class
2031
+ respond to some user-given commands.
2032
+
2033
+ ## Creating a SQL database
2034
+
2035
+ The exam-questions that are distributed by the studium gem can be
2036
+ turned into a **.sql database** (**SQL**).
2037
+
2038
+ A helper script exists to do this, at the file location
2039
+ **studium/database/create_database.rb**. If you run it
2040
+ a .sql file will be created, which is quite large - around
2041
+ 8MB in size or more. This can then be read into a
2042
+ sqlite database.
2043
+
2044
+ Creating a new .sql database takes quite some time, though.
2045
+ Presently (in 2022) I don't have a better solution for this
2046
+ problem.
2047
+
2048
+ If you want to create it on your own host system, first invoke
2049
+ that .rb file, which is possible via the commandline via:
2050
+
2051
+ studium --create-database
2052
+
2053
+ Then a new .db file will be automatically created. But again,
2054
+ be warned, this takes quite some time.
2055
+
2056
+ ## The file allowed_themes_for_exams.yml
2057
+
2058
+ The file <b>allowed_themes_for_exams.yml</b> lists the allowed themes
2059
+ for exams. For instance, a lecture that deals with Genetics and
2060
+ Cell Biology, may have as allowed themes at the least these two
2061
+ topics (e. g. **- genetics** and **- cell biology**).
2062
+
2063
+ The reason why this yaml file exists is so that we can use this
2064
+ to search for lectures that include these topics. So, in some
2065
+ ways, this is for the use case as a **meta-tagger**.
2066
+
2067
+ ## The file curricula.yml
2068
+
2069
+ The file curricula.yml will keep all Curricula entries for
2070
+ curricula in **Austria**. This is mostly done so that we
2071
+ have these curricula registered, via number mapping to the
2072
+ corresponding name.
2073
+
2074
+ ## Last saved into which file
2075
+
2076
+ Whenever you ask an exam-question, it is kept track into which
2077
+ file that exam-question will be stored. The toplevel API
2078
+ <b>Studium.last_saved_into_which_file?</b> can be used
2079
+ to query this.
2080
+
2081
+ It would then yield a path such as:
2082
+
2083
+ /home/x/programming/ruby/src/studium/lib/studium/exam_topics/basic_chemistry
2084
+
2085
+ ## class Studium::SearchFor_nECTS
2086
+
2087
+ **class Studium::SearchFor_nECTS** can be used to show all lectures having the
2088
+ specified n ECTS credits.
2089
+
2090
+ So for example:
2091
+
2092
+ Studium::SearchFor_nECTS.new(1)
2093
+
2094
+ would show all lectures having **1.0 ECTS points**.
2095
+
2096
+ You can invoke this class from the commandline as well, of course. The name
2097
+ of the executable is **n_ECTS**, residing at **bin/n_ECTS**.
2098
+
2099
+ I aliased this executable to **nects** on my home system, and can then
2100
+ do the following as-is:
2101
+
2102
+ nects 1.0 --master --show-numbers
2103
+
2104
+ This would show all lectures belonging to a master-curriculum
2105
+ having 1.0 ECTS points. Additionally, the leading LVA ID numbers
2106
+ will be shown as well.
2107
+
2108
+ ## Studium::Exams.report_nquestions_of
2109
+
2110
+ The method Studium::Exams.report_nquestions_of() can be used to quickly
2111
+ report how many exam questions are available in a particular exam
2112
+ topic. If you pass in an Array of exam-topics, such as 'bem1',
2113
+ 'bem2', 'metabolism', then the method will report the total amount of
2114
+ exam-questions in all these exam topics combined. I use this to
2115
+ query "meta"-topics combined, such as biochemistry1, biochemistry2,
2116
+ and so forth.
2117
+
2118
+ ## Studium::Statistics::TopStats
2119
+
2120
+ class **Studium::Statistics::TopStats** can be used to
2121
+ display the percentage value of questions answered in the
2122
+ registered exam topics. The purpose is to, simply and quickly,
2123
+ show the performance over the registered exam-topics in use.
2124
+
2125
+ Invocation example from ruby code:
2126
+
2127
+ Studium::Statistics::TopStats.new(ARGV)
2128
+
2129
+ The following small image shows how this may look, being
2130
+ applied onto the exam-dataset that I use normally:
2131
+
2132
+ <img src="https://i.imgur.com/rhOyyuF.png" style="margin: 1em; margin-left: 3em; border: 2px solid black">
2133
+
2134
+ ## Studium.report_solved_topics
2135
+
2136
+ The solved topics can be quickly displayed if you use the
2137
+ following file and code:
2138
+
2139
+ require 'studium/toplevel_methods/report_solved_topics.rb'
2140
+ Studium.report_solved_topics
2141
+
2142
+ ## class Studium::Exams::MandatoryContinuousAssessment
2143
+
2144
+ class <b>Studium::Exams::MandatoryContinuousAssessment</b> can
2145
+ be used to handle lectures that require mandatory attendance
2146
+ (in german "prüfungsimmanente Lehrveranstaltungen").
2147
+
2148
+ The section here does not include all options that this class
2149
+ is able to handle; instead, only a select subset will be shown
2150
+ and explained here.
2151
+
2152
+ If you want to show which mandatory courses may be upcoming,
2153
+ sorted on the assigned priority, then you can do this:
2154
+
2155
+ mandatory --upcoming
2156
+
2157
+ The command <b>mandatory</b> is an alias I use to
2158
+ the .rb file that holds
2159
+ <b>class Studium::Exams::MandatoryContinuousAssessment</b>.
2160
+
2161
+ You can also compare (some of) the registered curricula,
2162
+ by issuing:
2163
+
2164
+ mandatory --compare
2165
+
2166
+ This will output the amount of ECTS points stored in
2167
+ courses that require a mandatory attendance.
2168
+
2169
+ If you want to also see the individual lectures and courses
2170
+ that were used to determine all courses requiring mandatory
2171
+ presence, you can use the following commandline switch:
2172
+
2173
+ mandatory --compare-detail
2174
+ mandatory --compare-stats
2175
+ mandatory --details
2176
+
2177
+ On a side-note: if you wish to see some mandatory lectures,
2178
+ such as those that belong to the lecture type VO+SE, you
2179
+ can pass this as input to **bin/studium**, like so:
2180
+
2181
+ studium VO+SE
2182
+
2183
+ You can also query "which mandatory lectures are offered
2184
+ in the summer semester" and combine it with "which
2185
+ mandatory lectures are offered at the TU Vienna, via:
2186
+
2187
+ mandatory --tuwien --summer
2188
+
2189
+ Of course you need to have them registered first, such
2190
+ as in the file **lecture_information.yml**, if you wish
2191
+ to adapt it to your own universities. The default datset
2192
+ focuses on universities in Austria only. But that yaml
2193
+ file can be of help if you want to adjust it to your
2194
+ own use cases.
2195
+
2196
+ ## Studium::SetAliasesBasedOnThisFile
2197
+
2198
+ This class can be used to batch-assign the main aliases used for
2199
+ asking exam questions, if a file called "exam_topics.md" exists.
2200
+ Alternatively you can pass in another file that is then used
2201
+ instead.
2202
+
2203
+ So, rather than doing:
2204
+
2205
+ setalias1 chem1
2206
+
2207
+ I can batch-assign different exam topics based on one-entry-per-line
2208
+ instead.
2209
+
2210
+ This file allows me to store exam topics in an ordered manner,
2211
+ such as first line is topic1, second line is topic2 and so
2212
+ forth. Then, once that has been done, I can hit the number 1,
2213
+ and the first exam question will be asked (belonging to
2214
+ topic2). Or I hit number 2 and the second exam topic will be
2215
+ asked, and so forth.
2216
+
2217
+ The idea behind this is that I can use the keys 1, 2, 3, 4,
2218
+ 5, 6, 7, 8 and 9 to ask exam questions and thus train my
2219
+ memory in this regard. It's like an interactive trainer.
2220
+ If I want another dataset then I modify the .md file
2221
+ and re-assign. I also keep exam themes together, e. g.
2222
+ all subtopics that belong to biochemistry as a topic,
2223
+ or to cellbiology, or to genetics and so forth. It may
2224
+ be a bit difficult to explain if you have never tried this,
2225
+ so you can give it a try from the commandline perhaps -
2226
+ I use this almost daily on linux, so it has become
2227
+ "second nature" really.
2228
+
2229
+ ## class ExamRegistrationAt
2230
+
2231
+ class ExamRegistrationAt can show upcoming exams. You need to
2232
+ store this information in the file lecture_information.yml, so
2233
+ there is some time investment to be done, before class
2234
+ ExamRegistrationAt is useful for you. But, once you register
2235
+ upcoming exams there, class ExamRegistrationAt can show
2236
+ which exams are the next upcoming ones. This helps allow to
2237
+ plan time for these exams.
2238
+
2239
+ Now - there are two constants that determine how many days
2240
+ ahead into the future this class will "look". So, for
2241
+ instance, if you want to see only upcoming exams for the
2242
+ next 90 days, then you should store this information in
2243
+ one of these two constants.
2244
+
2245
+ The two constants are:
2246
+
2247
+ LOOK_N_DAYS_INTO_THE_FUTURE
2248
+ LOOK_N_DAYS_INTO_THE_PAST
2249
+
2250
+ The first one is much more relevant; the second one is
2251
+ not so relevant (and it was only added fairly recently,
2252
+ in May 2022. The primary reason why the second constant
2253
+ was added was as an ad-hoc solution to not show outdated
2254
+ exam entries.).
2255
+
2256
+ ## The following curricula have been completely integrated into the Studium gem so far
2257
+
2258
+ The following **table** lists which curricula have been **integrated fully** so far,
2259
+ as of **June 2022**:
2260
+
2261
+ Number | Name of the Curriculum | Curriculum Number | University | URL to the curriculum
2262
+ --------|----------------------------------------------------|--------------------|--------------------------|---------------------------------------------------------------------------------------------------------
2263
+ **1** | **Bachelor LMBT** | **033 217** | **BOKU** | https://boku.ac.at/fileadmin/data/H01000/mitteilungsblatt/MB_2019_20/MB17/033_217_Bachelorcurriculum_LMBT_2020U.pdf
2264
+ **2** | **Bachelor Umweltingenieurwissenschaften** | **033 231** | **BOKU** | https://boku.ac.at/fileadmin/data/H01000/mitteilungsblatt/MB_2020_21/MB17/Bachelorcurriculum_UIW_033_231_2021U.pdf
2265
+ **3** | **Bachelor Agrarwissenschaften** | **033 255** | **BOKU** | https://www.boku.ac.at/fileadmin/data/H01000/mitteilungsblatt/MB_2017_18/MB20/033_255_Bachelorcurriculum_AW_2018U.pdf
2266
+ **4** | **Bachelor Technische Chemie** | **033 290** | **TU** | http://www.tuwien.ac.at/fileadmin/t/studabt/downloads/Studienplaene/Oktober_2017/BachelorstudiumTechnischeChemieE033290.pdf
2267
+ **5** | **Bachelor Pharmazie** | **033 305** | **University of Vienna** | http://senat.univie.ac.at/fileadmin/user_upload/s_senat/konsolidierte_Bachelorcurricula/BA_Pharmazie.pdf
2268
+ **6** | **Bachelor Molekulare Biologie** | **033 630** | **University of Vienna** | https://senat.univie.ac.at/fileadmin/user_upload/s_senat/konsolidierte_Bachelorcurricula/BA_Biologie_Version2015_Juni2018.pdf
2269
+ **7** | **Bachelor Ernährungswissenschaften** | **033 638** | **University of Vienna** | https://nutrition.univie.ac.at/fileadmin/user_upload/i_ernaehrung/Download/Bachelor/Curriculum/Curriculum_Bachelor_Ernaehrungswissenschaften_2013__geringfuegige_AEnderung__2017_2018_40.pdf
2270
+ **8** | **Bachelor Chemie** | **033 662** | **University of Vienna** | http://senat.univie.ac.at/fileadmin/user_upload/s_senat/konsolidierte_Bachelorcurricula/BA_Chemie.pdf
2271
+ **9** | **Bachelor Molekularbiologie** (Graz) | **033 665** | **University Graz** | https://online.uni-graz.at/kfu_online/wbMitteilungsblaetter_neu.display?pNr=14602&pDocNr=3627868&pOrgNr=14190
2272
+ ________|____________________________________________________|____________________|__________________________|___________________________________________________________________________________________________________________________________________________________________________________
2273
+ **10** | **Master LMBT** | **066 418** | **BOKU** | https://www.boku.ac.at/fileadmin/data/H01000/mitteilungsblatt/MB_2017_18/MB21/066_417_Mastercurriculum_LMWT_2018U.pdf
2274
+ **11** | **Master TU Vienna Biotechnology** | **066 490** | **TU** | https://www.tuwien.ac.at/fileadmin/t/studabt/downloads/Studienplaene/Oktober_2018/MasterTechnischeChemie.pdf
2275
+ **12** | **Master Pharmazie** | **066 605** | **University of Vienna** | http://senat.univie.ac.at/fileadmin/user_upload/s_senat/konsolidierte_Masterstudien/MA_Pharmazie.pdf
2276
+ **13** | **Master Immunobiologie** | **066 830** | **University of Vienna** | http://senat.univie.ac.at/fileadmin/user_upload/s_senat/konsolidierte_Masterstudien/MA_Molekulare_Mikrobiologie_Mikrobielle_Oekologie_und_Immunbiologie.pdf
2277
+ **14** | **Master Biologische Chemie** | **066 863** | **University of Vienna** | http://senat.univie.ac.at/fileadmin/user_upload/s_senat/konsolidierte_Masterstudien/MA_BiologischeChemie.pdf
2278
+ **15** | **Master Bioinformatik** | **066 875** | **University of Vienna** | http://senat.univie.ac.at/fileadmin/user_upload/s_senat/konsolidierte_Masterstudien/MA_Bioinformatik.pdf
2279
+ **16** | **Master Genetik und Entwicklungsbiologie** | **066 877** | **University of Vienna** | http://senat.univie.ac.at/fileadmin/user_upload/s_senat/konsolidierte_Masterstudien/MA_GenetikEntwicklungsbiologie.pdf
2280
+ ________|____________________________________________________|____________________|__________________________|___________________________________________________________________________________________________________________________________________________________________________________
2281
+
2282
+
2283
+ **BOKU** stands short for "Universität für Bodenkultur" (Wien / Vienna).
2284
+
2285
+ **TU** stands short for "Technische Universität" (Wien / Vienna), aka the
2286
+ "Technical University" in Vienna.
2287
+
2288
+ Keep in mind that the above table currently **only** lists curricula organized in
2289
+ **Austria**. If anyone else wants to extend this table to include other
2290
+ **european universities**, such as in Germany, feel free to do so - but the
2291
+ dataset for these universities will have to be registered **externally**
2292
+ (or at the least maintained by someone else for these other european
2293
+ universities).
2294
+
2295
+ I am willing to add required code to the studium gem, in order to make
2296
+ available any external dataset (and thus add other universities),
2297
+ though. I just can not maintain the dataset itself, since it will require
2298
+ constant adjustments. (In theory we could obtain the dataset dynamically,
2299
+ via HTTP-queries and parsing of the result, but no code doing this in
2300
+ an automated manner is presently part of the studium gem itself.)
2301
+
2302
+ Note that the studium gem keeps these "Mitteilungsblätter" stored
2303
+ in the file called <b>studium/yaml/mitteilungsblätter.yml</b>.
2304
+
2305
+ ## Showing all lectures that belong to a particular curriculum
2306
+
2307
+ You can show all lectures that belong to a particular curriculum via:
2308
+
2309
+ studium --lectures-from-this-curriculum=geodäsie
2310
+ studium --lectures-from-this-curriculum=217
2311
+
2312
+ This does not work perfectly well, so if in doubt use the
2313
+ curriculum id, as a number.
2314
+
2315
+ ## The very important file called lecture_information.yml
2316
+
2317
+ Since as of <b>July 2022</b> the very important file called
2318
+ <b>lecture_information.yml</b> now resides at:
2319
+
2320
+ studium/lib/studium/lecture_information/lecture_information.yml
2321
+
2322
+ It seemed better to me to put it into a separate directory, considering
2323
+ it is just about <b>the most important .yml file of this project</b>.
2324
+
2325
+ Remember that the file caters primarily to universities in Austria,
2326
+ but since it is ultimately just one huge hash (see the content),
2327
+ you can simply add more .yml files to it, or modify the hash that
2328
+ you get to your liking - so the studium gem is, in principle
2329
+ extensible to <b>accomodate datasets from different universities</b>.
2330
+ I may even add more web-scraping means to allow users to automatically
2331
+ determine all lectures from a given curriculum at other universities -
2332
+ but for now (2022) this is not yet possible.
2333
+
2334
+ ## Determining the runmode of the Studium gem
2335
+
2336
+ The runmode can be determined via <b>Studium.set_runmode()</b>.
2337
+
2338
+ ## Deprecations within the Studium gem
2339
+
2340
+ This subsection keeps track of some deprecations of this project.
2341
+
2342
+ The constant <b>EXAM_TOPICS</b>, which used to be:
2343
+
2344
+ EXAM_TOPICS = "#{Studium.project_base_directory?}exam_topics/"
2345
+
2346
+ as well as "aliases" to it, such as DIRECTORY_TO_THE_EXAM_TOPICS
2347
+ or EXAM_TOPICS_DIRECTORY, was deprecated as of <b>July 2022</b>.
2348
+
2349
+ If you want to obtain the exam-topics directory then you should
2350
+ consistently use the following method instead:
2351
+
2352
+ Studium.exam_topics_directory?
2353
+
2354
+ The old code will be published here for some time longer, but
2355
+ eventually it may be removed entirely:
2356
+
2357
+ # ========================================================================= #
2358
+ # === EXAM_TOPICS
2359
+ #
2360
+ # This constant will store where the exam topics are stored on a
2361
+ # given computer system.
2362
+ #
2363
+ # The path will be relative to the PROJECT_BASE_DIRECTORY constant.
2364
+ #
2365
+ # Note that this is a constant though - it is recommended to use
2366
+ # the @exam_topics variable instead if you need the variable
2367
+ # to be dynamic.
2368
+ #
2369
+ # This may, for example, have a value such as:
2370
+ #
2371
+ # /Programs/Ruby/2.5.1/lib/ruby/site_ruby/2.5.0/studium/exam_topics/
2372
+ #
2373
+ # ========================================================================= #
2374
+ EXAM_TOPICS = "#{Studium.project_base_directory?}exam_topics/"
2375
+ # ======================================================================= #
2376
+ # === DIRECTORY_TO_THE_EXAM_TOPICS
2377
+ # ======================================================================= #
2378
+ DIRECTORY_TO_THE_EXAM_TOPICS = EXAM_TOPICS
2379
+ # ======================================================================= #
2380
+ # === EXAM_TOPICS_DIRECTORY
2381
+ #
2382
+ # Same as above.
2383
+ # ======================================================================= #
2384
+ EXAM_TOPICS_DIRECTORY = EXAM_TOPICS
2385
+
2386
+ In <b>July 2022</b> the old method called <b>Studium.ensure_main_encoding()</b>
2387
+ was deprecated. It did no longer seem necessary to have it, as UTF-8
2388
+ is used by default now.
2389
+
2390
+ However had, perhaps in the future this may have to be re-enabled in
2391
+ one way or another. I will keep the code here, but it may also be that
2392
+ this code will never be re-added, in which case a future release of
2393
+ the studium gem may remove the following subsection. Either way here
2394
+ goes:
2395
+
2396
+ # ========================================================================= #
2397
+ # === Studium.ensure_main_encoding
2398
+ #
2399
+ # This method will try to ensure the main encoding in use. This
2400
+ # presently works for both Arrays and Strings; other classes are
2401
+ # not supported (but they are also not as important as Arrays
2402
+ # and Strings really; possibly excluding class Hash).
2403
+ # ========================================================================= #
2404
+ def self.ensure_main_encoding(i)
2405
+ copy = i
2406
+ use_this_encoding = @use_this_encoding
2407
+ # ======================================================================= #
2408
+ # === Handle Array next
2409
+ # ======================================================================= #
2410
+ if copy.is_a? Array
2411
+ copy = copy.map {|entry|
2412
+ if entry.is_a? String
2413
+ unless entry.encoding.to_s.include? use_this_encoding
2414
+ entry = entry.force_encoding(use_this_encoding)
2415
+ end
2416
+ end
2417
+ entry
2418
+ }
2419
+ # ======================================================================= #
2420
+ # === Handle Hash next
2421
+ # ======================================================================= #
2422
+ elsif copy.is_a? Hash
2423
+ new_hash = {}
2424
+ copy.each_pair {|key, value|
2425
+ unless key.encoding.to_s.include? use_this_encoding
2426
+ key = key.dup if key.frozen?
2427
+ unless key.is_a? Symbol
2428
+ key = key.force_encoding(use_this_encoding)
2429
+ end
2430
+ end
2431
+ if value.is_a? Array
2432
+ array = Studium.ensure_main_encoding(array)
2433
+ end
2434
+ new_hash[key] = ensure_main_encoding(value)
2435
+ }
2436
+ copy = new_hash
2437
+ # ======================================================================= #
2438
+ # === Handle String next
2439
+ # ======================================================================= #
2440
+ elsif copy.is_a? String
2441
+ unless copy.encoding.to_s.include? use_this_encoding
2442
+ copy = copy.dup if copy.frozen?
2443
+ copy = copy.force_encoding(use_this_encoding)
2444
+ end
2445
+ end
2446
+ return copy
2447
+ end
2448
+
2449
+ In <b>July 2022</b> the constant:
2450
+
2451
+ FILE_LECTURE_INFORMATION = "#{PROJECT_YAML_DIRECTORY}lecture_information.yml"
2452
+
2453
+ was deprecated. Use the toplevel instance variable @file_lecture_information
2454
+ instead, or the method <b>Studium.file_lecture_information</b>.
2455
+ The constant <b>FILE_LECTURE_ALIASES</b> was also deprecated in <b>July
2456
+ 2022</b>, as well as the constant <b>FILE_CURRICULA</b>.
2457
+
2458
+ The same counts for the constant <b>FILE_IMPORTANT_EXAMS</b>. In general,
2459
+ methods are now more important, so use the replacement method called
2460
+ <b>Studium.file_important_exams</b>.
2461
+
2462
+ The constant:
2463
+
2464
+ ALPHABET = ('a'..'z').to_a
2465
+
2466
+ was moved into the only .rb file that needs it - it was part of
2467
+ constants.rb before <b>July 2022</b>.
2468
+
2469
+ The following constant was removed in <b>July 2022</b>:
2470
+
2471
+ # ========================================================================= #
2472
+ # === FILE_UPCOMING_PRACTICAL_COURSES
2473
+ #
2474
+ # This file is for a .yml file that keeps track of upcoming practical
2475
+ # courses. In particular, this may be helpful in order to determine
2476
+ # which practical courses may overlap with one another.
2477
+ # ========================================================================= #
2478
+ # FILE_UPCOMING_PRACTICAL_COURSES =
2479
+ # "#{STUDIUM_YAML_DIR}WS2017/upcoming_practical_courses.yml"
2480
+
2481
+ It is probably no longer needed, because the file lecture_information.yml
2482
+ can indicate in which practical courses we are registered now.
2483
+
2484
+ The constant ARRAY_TITLE_OF_THE_INDIVIDUAL_CURRICULA was also disabled
2485
+ as of <b>July 2022</b> - each individual curricula now has the title
2486
+ on its very second line:
2487
+
2488
+ # ========================================================================= #
2489
+ # === ARRAY_TITLE_OF_THE_INDIVIDUAL_CURRICULA
2490
+ #
2491
+ # This constant is mostly on an ad-hoc basis in that we will register
2492
+ # the title of all individual curricula. This can then be used by
2493
+ # Studium::DetermineCurricula in particular to determine which
2494
+ # courses ought to be shown.
2495
+ # ========================================================================= #
2496
+ ARRAY_TITLE_OF_THE_INDIVIDUAL_CURRICULA = [
2497
+ 'Bachelorcurriculum Informatik und molekulare Biologie',
2498
+ 'Bachelorcurriculum (Bio)Informatik und molekulare Biotechnologie, unter Berücksichtigung medizinisch-immunologischer Aspekte',
2499
+ 'Bachelorcurriculum Vector-based strategies in Life Sciences, Molecular Medicine and Biotechnology'
2500
+ ]
2501
+
2502
+ The constant <b>PASSED_EXAMS_PER_MONTH</b>:
2503
+
2504
+ PASSED_EXAMS_PER_MONTH = FILE_PASSED_EXAMS_PER_MONTH
2505
+
2506
+ Was just an alias in the past. It has been removed in <b>July 2022</b>.
2507
+
2508
+ If you have to, use the longer constant name called
2509
+ <b>FILE_PASSED_EXAMS_PER_MONTH</b>. The constant called
2510
+ <b>FILE_DIRECTORY_TO_THE_EXAM_TOPICS</b> was also
2511
+ removed.
2512
+
2513
+ The constant <b>DIRECTORY_EXAM_TOPICS</b> was removed as well.
2514
+
2515
+ # ========================================================================= #
2516
+ # === DIRECTORY_EXAM_TOPICS
2517
+ #
2518
+ # Determine where we can find the exam topics, as constant.
2519
+ # ========================================================================= #
2520
+ DIRECTORY_EXAM_TOPICS = MY_EXAM_TOPICS
2521
+
2522
+ ## Vorbesprechungen / Preparatory meetings
2523
+
2524
+ Some courses require a date before the actual course week, which we
2525
+ will call "preliminary meetings" (in german, "Vorbesprechung" or
2526
+ "Vorbesprechungstermin"). In July 2022 the name was changed to
2527
+ preparatory_meeting.
2528
+
2529
+ The Studium project supports this keeping track of such a preparatory
2530
+ meeting. The corresponding entry that has to exist, in the
2531
+ file **lecture_information.yml**, is called
2532
+ "preparatory_meeting:".
2533
+
2534
+ The **class PreparatoryMeeting** can show upcoming preliminary
2535
+ meetings. That way you should not miss the mandatory attendance
2536
+ part anymore of some courses.
2537
+
2538
+ The name <b>Vorbesprechungen</b> is kept as a backwards "alias"
2539
+ to this new class.
2540
+
2541
+ If you wish to designate this in the file <b>lecture_information.yml</b>
2542
+ then you can use something like the following, adapted to your use
2543
+ case:
2544
+
2545
+ !ruby/symbol preparatory_meeting:
2546
+ - "05.10.2023, 09:15-10:15, Ort: An der BOKU, Muthgasse 7"
2547
+
2548
+ ## Returning the dataset of a specific exam topic
2549
+
2550
+ If you have a need to return the dataset of a specific
2551
+ exam topic, as an Array, then you can use the following
2552
+ API:
2553
+
2554
+ array = Studium.return_dataset_for_this_exam_topic('geology')
2555
+ array = Studium.return_dataset_for_this_exam_topic('genetics')
2556
+
2557
+ And so forth. This method appeared to be useful to use it on
2558
+ some website, for instance.
2559
+
2560
+ ## Displaying curriculum modules on the commandline
2561
+
2562
+ <b>class Studium::Curricula::Modules::DisplayOnTheCommandline</b>
2563
+ can display each module of a specific curriculum on the commandline.
2564
+
2565
+ This only really works very well for individual curricula. But in
2566
+ principle this class could be extended to work with <b>all</b>
2567
+ curricula in general.
2568
+
2569
+ ## class Studium::ReturnNEctsFromThisUrl
2570
+
2571
+ <b>class Studium::ReturnNEctsFromThisUrl</b> can be used to
2572
+ determine the number of ECTS points of a given lecture.
2573
+
2574
+ Pass the remote URL to this class in order for this to
2575
+ work.
2576
+
2577
+ Example:
2578
+
2579
+ Studium::ReturnNEctsFromThisUrl.new('https://online.boku.ac.at/BOKUonline/wbLv.wbShowLVDetail?pStpSpNr=278600')
2580
+
2581
+ ## Java code pertaining to the studium gem
2582
+
2583
+ Since about two years, give or take, say starting in
2584
+ the year 2020, Java code has been added to the
2585
+ studium gem - both for the commandline, as well as
2586
+ GUIs. This is highly experimental still and not
2587
+ very extensive.
2588
+
2589
+ Most work goes into <b>AskExamQuestion.java</b>
2590
+ right now, until it is possible to work with the
2591
+ Studium gem from the commandline, in particular
2592
+ on Windows. Then when this works alright, we may
2593
+ extend the Swing and JavaFX bindings, to make it
2594
+ more convenient to work with the project via a
2595
+ GUI - but first the commandline has to work
2596
+ very well.
2597
+
2598
+ Once that works ok-ish the studium gem should be
2599
+ more useful on windows too; Java works fairly
2600
+ well on windows and is quite fast. Speed is one
2601
+ of the few things Java is better than ruby. In
2602
+ the long run, though, it may be ideal to use
2603
+ truffleruby or jruby to bridge the gap between
2604
+ these two worlds. Stay tuned for more to come
2605
+ in this regard.
2606
+
2607
+ ## Generating .pdf files
2608
+
2609
+ You can generate some .pdf files about exam-topics.
2610
+
2611
+ For example, for the topic **amg**, you can generate a .pdf file
2612
+ through:
2613
+
2614
+ studium --generate-pdf-for=amg1
2615
+
2616
+ Do note that this functionality depends on the gem called **prawn**.
2617
+
2618
+ Here are more examples for pdf-generation:
2619
+
2620
+ studium --generate-pdf-for=biotech1
2621
+ studium --generate-pdf-for=biotech2
2622
+ studium --generate-pdf-for=virus1
2623
+ studium --generate-pdf-for=virus2
2624
+
2625
+ Note that most of the functionality related to PDF-files can be
2626
+ found under the directory <b>studium/utility_scripts/pdf/</b>.
2627
+
2628
+ Since as of <b>August 2022</b> it is now possible to
2629
+ generate a huge .pdf file that contains ALL the exam
2630
+ questions. So this is using the same functionality as
2631
+ above, but it will integrate **all** topics. Beware,
2632
+ this will lead to a truly huge .pdf file:
2633
+
2634
+ The commandline for this functionality can be invoked
2635
+ by issuing any of the following:
2636
+
2637
+ studium --mega-pdf
2638
+ studium --monster-pdf
2639
+ studium --monster
2640
+
2641
+ Note that this may take about 30 seconds or longer,
2642
+ and the generated .pdf file will easily have more
2643
+ than 1449 pages. So this is not too terribly useful
2644
+ for most people, but just in case this functionality
2645
+ exists, so there you go.
2646
+
2647
+ ## class Studium::ParseLvaDates
2648
+
2649
+ This class (<b>class Studium::ParseLvaDates</b>) can be
2650
+ used to sanitize lecture data, for lva dates, aka when
2651
+ a lecture is occurring. This only works for a few
2652
+ universities right now; perhaps it will be improved
2653
+ in the future.
2654
+
2655
+ ## class Studium::BlockedCourses
2656
+
2657
+ A <b>blocked course</b> is something like a practical lab-course
2658
+ that occupies a week or two weeks, en-bloc in one go. Such a course
2659
+ requires <b>mandatory presence</b> (that is the student has to be
2660
+ there), and is spanning over a limited time - less than the whole
2661
+ semester (half-year).
2662
+
2663
+ The reason why this class was written in <b>October 2022</b> was
2664
+ to be able to indicate which courses are blocked. Perhaps you may
2665
+ want to register only for some blocked course, so in this case
2666
+ that class may be useful.
2667
+
2668
+ Note that you have to populate the lecture with the correct
2669
+ "lva_dates:" entries by yourself. Perhaps in the future this
2670
+ may be changed to automatically determine the LVA-dates, but
2671
+ for now this has to be done manually.
2672
+
2673
+ ## class Studium::DisplayLectureUrl
2674
+
2675
+ This class can display lectures and their associated remote URL
2676
+ (the homepage) via the commandline.
2677
+
2678
+ Basic usage example from within Ruby:
2679
+
2680
+ require 'studium/utility_scripts/display_lecture_url.rb'
2681
+ Studium::DisplayLectureUrl.new(ARGV)
2682
+ Studium::DisplayLectureUrl.new('--indi2')
2683
+
2684
+ This class can either output just one lecture's course
2685
+ URL, or operate in a batch-mode where all lectures of
2686
+ a curriculum are displayed.
2687
+
2688
+ Studium::DisplayLectureUrl.new('
2689
+ 301586 Molekulare Medizin 2:
2690
+ 301585 Molekulare Medizin 1:
2691
+ 301407 DNA-Tumorviren, vom Krebsauslöser zum Therapeutikum:
2692
+ 301589 Literaturseminar Molekulare Medizin:
2693
+ 322052 Nukleinsäure-Therapeutika: Antisense, RNA Interferenz, CRISPR - M14:
2694
+ 301586 Translation und Translationskontrolle bei Eukaryonten II:
2695
+ 322083 Zelluläre und molekulare Pharmakologie und molekulare Medizin - M14:
2696
+ ')
2697
+
2698
+ The latter functionality was added to simplify working with "raw"
2699
+ data, e. g. if you have this listed in a .md text file and want
2700
+ to copy/paste it. See also the executable at
2701
+ <b>bin/display_lecture_url</b>.
2702
+
2703
+ ## class Studium::UniversityCourse
2704
+
2705
+ class Studium::UniversityCourse was added to represent a university-course,
2706
+ in December 2022. It remains to be seen how useful this class will be.
2707
+
2708
+ I needed such a class because I wanted to determine the next exams or the
2709
+ next exam via:
2710
+
2711
+ .next_exams? # Obtain all upcoming exams, as Array.
2712
+ .next_exam? # Obtain the next upcoming exam, as String. nil otherwise.
2713
+
2714
+ It is not difficult to obtain the list of upcoming exams without such
2715
+ a class, but I found it was easier to read, so I added this class.
2716
+
2717
+ ## Studium.map_input_to_this_curriculum_filename
2718
+
2719
+ In <b>December 2022</b> the method <b>Studium.map_input_to_this_curriculum_filename()</b>
2720
+ was added.
2721
+
2722
+ The reason as to why this method was added was because the studium gem
2723
+ used many different ways, in different files, to determine which input
2724
+ is valid (that is, can be mapped to a locally existing file containing
2725
+ a curriculum) and which input is not.
2726
+
2727
+ For instance, a given input such as <b>genetik</b> or <b>genetic</b>
2728
+ should be mapped to the following target file:
2729
+
2730
+ studium/yaml/curricula/bachelor/bachelor_biologie_mikrobiologie_und_genetik_033630.yml
2731
+
2732
+ But, internally, there were methods and case/when menus that would
2733
+ work on :genetik (as a symbol), and some others that would
2734
+ assume 'genetik' - but then omit the alternative aliases, such
2735
+ as genetic, and other aliased names. So it was a very big mess
2736
+ really.
2737
+
2738
+ Since as of December, with that now documented method, all parts
2739
+ of the Studium gem that require such a mapping, should make
2740
+ use of that method instead. Internally the method will convert
2741
+ all input to a String - it seems easier to work with Strings
2742
+ here.
2743
+
2744
+ Right now not all the code used in the Studium gem will make
2745
+ use of the method here, but one reason why this method is
2746
+ documented is so that I can eventually transition all code
2747
+ parts to this new method over time. So at some point in the
2748
+ future this will become the new default.
2749
+
2750
+ A related method, called <b>Studium.return_file_for_this_curriculum()</b>
2751
+ exists, but this method may eventually be deprecated, or rather,
2752
+ assimilated into the new method. Right now it still exists,
2753
+ though.
2754
+
2755
+ ## class Studium::ParseRemoteLecture
2756
+
2757
+ In <b>December 2022</b> it was decided that class <b>Studium::ParseRemoteLecture</b>
2758
+ will be improved and extended in the near future.
2759
+
2760
+ Up until December 2022 I mostly added courses manually into the
2761
+ big .yml file (lecture_information.yml). However had, that is
2762
+ quite cumbersome and takes away a **lot** of time. Furthermore
2763
+ this also leads to more errors, so I really needed a way to
2764
+ parse a remote homepage, and turn this information into a
2765
+ correct, sanitized yaml-format. That way I can also assemble
2766
+ whole curricula offered at different universities, so different
2767
+ people could extend the dataset. Perhaps one day we could
2768
+ include all curricula at every university in europe, or even
2769
+ world-wide. But the latter may be for other people - I only
2770
+ want to focus on a dataset that focuses on central europe,
2771
+ while giving other users the option to extend and maintain
2772
+ their **own** datasets here.
2773
+
2774
+ Note that right now class Studium::ParseRemoteLecture isn't quite
2775
+ as solid and useful yet - it still has to be improved.
2776
+
2777
+ ## class Studium::Exams::UpcomingRegisteredExams
2778
+
2779
+ <b>class Studium::Exams::UpcomingRegisteredExams</b> can be used
2780
+ to quickly show all exams you registered for. In order for this
2781
+ to work you need to have added the entry <b>registered:</b>
2782
+ in the file <b>lecture_information.yml</b>.
2783
+
2784
+ ## Grades
2785
+
2786
+ Exams at universities are typically graded. Different countries make
2787
+ use of different systems. For example, germany uses 6 grades whereas
2788
+ Austria uses 5 grades.
2789
+
2790
+ If you want to output which exams fit to a certain grade, such as
2791
+ <b>grade 2</b>, then you can use code written in
2792
+ <b>studium/toplevel_methods/show_passed_exams_having_this_grade.rb</b>:
2793
+
2794
+ The API is:
2795
+
2796
+ Studium.show_passed_exams_having_this_grade
2797
+ Studium.show_passed_exams_having_this_grade(2)
2798
+ Studium.show_passed_exams_having_this_grade(3)
2799
+ Studium.show_passed_exams_having_this_grade(4)
2800
+
2801
+ Simply pass the <b>number</b> to that method, corresponding to the
2802
+ grade that is sought. In order for this to work, you must use some
2803
+ file where the grades are stored. This can be either in the file
2804
+ <b>lecture_information.yml</b> (I recommend this approach), but it
2805
+ could also be a local .csv file. (The latter is mostly still there
2806
+ for legacy reasons; when this project was started, a .csv file was
2807
+ used rather than a .yml file. Lateron it was realized that the yaml
2808
+ file would be much better, since it can also include native and
2809
+ nested data structures, which makes it a lot easier to parse
2810
+ as-is, via the yaml wrapper that ruby has.)
2811
+
2812
+ If you want to display the <b>average</b> grades of passed exams
2813
+ then you can use <b>class Studium::Exams::AverageGrade</b>.
2814
+
2815
+ ## Checks and sanitizing information stored in the studium gem
2816
+
2817
+ The studium gem contains a LOT of information - the biggest
2818
+ data-file is the file called <b>lecture_information.yml</b>.
2819
+ But this is not the only file that contains information - there
2820
+ are various other YAML files (mostly) that contains important
2821
+ information as well. Furthermore, the studium gem depends
2822
+ on information made available on the world wide web, that is,
2823
+ on other computers.
2824
+
2825
+ Naturally when a project depends on a lot of information,
2826
+ errors may exist or show up over time. Sometimes old classes
2827
+ are removed or changed, and then we should still ensure
2828
+ that the existing functionality remains in a working state.
2829
+ The whole projects should remain in a working state, anyway.
2830
+
2831
+ Thus, in order to cope with this situation, and **reduce
2832
+ the number of errors and problems** that the studium gem
2833
+ faces, various helper-scripts are available that should
2834
+ help the user, but also developers (including myself)
2835
+ with the project. We want to verify that the information
2836
+ we use is correct.
2837
+
2838
+ This is done primarily by the .rb files stored in the
2839
+ <b>studium/check_and_sanitize/</b> subdirectory of this
2840
+ project.
2841
+
2842
+ For instance, say that you wish to check for problems
2843
+ in the file <b>lecture_information.yml</b>. This
2844
+ can be done as follows from the commandline:
2845
+
2846
+ studium --check-file-information
2847
+
2848
+ ## class Studium::Exams::UpcomingExamsDataset
2849
+
2850
+ The **class Studium::Exams::UpcomingExamsDataset** is a **helper**-class.
2851
+
2852
+ It wraps over the file <b>exams.yml</b> and allows a simple query to
2853
+ the upcoming exams, based on that file (which, as exam, must be
2854
+ registered in the file <b>exams.yml</b>).
2855
+
2856
+ This information can then be used to query which exams are upcoming
2857
+ on which day, at which time. This information can also be re-used
2858
+ in different classes, which was one important reason as to why
2859
+ this class has been created in the first place.
2860
+
2861
+ Take note that by default this file is <b>not</b> distributed
2862
+ via the studium gem, as it is only useful for my own use
2863
+ case. Other users may have to create their own exams.yml
2864
+ files. The format is simple - first comes the date of the
2865
+ exam at hand, then the description, such as:
2866
+
2867
+ 26.01.2012: "TU Wien, 185.AAA java course 101, 18:30-20:00"
2868
+
2869
+ ## Showing upcoming exams (exams that will be held in the future, from today)
2870
+
2871
+ **class Studium::ShowUpcomingExams.new** can show **upcoming exams**,
2872
+ on the commandline.
2873
+
2874
+ The **first input argument** should be a number, e. g. 10, which
2875
+ means that the first 10 upcoming exams will be shown. For the
2876
+ next 20 exams, it would be **d20**.
2877
+
2878
+ Note that this **depends on aliases** called "**pwdstud1**" or
2879
+ "**pwdstud2**". These have to exist in a yaml file (on my system
2880
+ this is the yaml file named **cd_aliases.yml**). The display is
2881
+ on the commandline but in principle, a **GUI** could be used as
2882
+ well for this task.
2883
+
2884
+ Do note that when this class is invoked, it will additionally store
2885
+ the result into a file called, e. g. **d20.md** or **d10.md**. This
2886
+ would allow you to upload that file if you want to. I needed that
2887
+ functionality because I wanted to display the upcoming exams
2888
+ somewhere else other than on my machine, for when I am not at home.
2889
+
2890
+ Note that there does exist another class, which can show upcoming
2891
+ exams, via a **.html** file. This class is called
2892
+ <b>Studium::Exams::UpcomingImportantExams</b>.
2893
+
2894
+ You can invoke class <b>Studium::Exams::UpcomingImportantExams</b>
2895
+ from the commandline by issuing something like the following:
2896
+
2897
+ studium --upcoming-exams
2898
+
2899
+ The display will be a HTML table essentially. In order for this
2900
+ to work, the file **lecture_information.yml** must contain the
2901
+ information for these upcoming exams - it is the only file
2902
+ that you may have to update, though. (In theory code could
2903
+ be added to automatically check for new exams, but this
2904
+ requires more code to be written. I am not sure if I will
2905
+ add this, simply due to time constraints alone.)
2906
+
2907
+ You can pass in some other commands to the file from the
2908
+ commandline, such as **--do-not-exit** - see the **--help
2909
+ option** for more information pertaining to class
2910
+ <b>Studium::Exams::UpcomingImportantExams</b>.
2911
+
2912
+ If you want an Array of upcoming exams, consider using the
2913
+ following method:
2914
+
2915
+ Studium::Exams::UpcomingExams.in_this_curriculum()
2916
+ Studium::Exams::UpcomingExams.in_this_curriculum(:bachelor_agrarwissenschaften)
2917
+
2918
+ Remember that this will only work if lecture_information.yml
2919
+ contains that information, so always maintain this .yml
2920
+ file properly.
2921
+
2922
+ ## The yaml file array_allowed_entries_for_the_file_lecture_information.yml
2923
+
2924
+ The yaml file <b>array_allowed_entries_for_the_file_lecture_information.yml</b>
2925
+ contains all entries that are allowed in the file <b>lecture_information.yml</b>.
2926
+
2927
+ A few entries will be explained next.
2928
+
2929
+ Let's start with the entry
2930
+ <b>!ruby/symbol course_registration_time_limit</b>
2931
+ which was added in February 2023.
2932
+
2933
+ This entry simply specifies at which point one can register for
2934
+ the given course. This is especially important for courses
2935
+ that have a specific time limitation.
2936
+
2937
+ Usage example:
2938
+
2939
+ !ruby/symbol course_registration_time_limit:
2940
+ - 01.02.2023-23.02.2023
2941
+
2942
+ A middle '-' is mandatory here. First entry is <b>the starting day</b>;
2943
+ second entry (after the '-') is <b>the end</b> day, that is the very
2944
+ last day that can be used for <b>course registration</b> still.
2945
+
2946
+ Note that this entry is experimental as of February 2023 - at a
2947
+ later time it will be determined how useful this entry is. But I
2948
+ think it is sufficiently useful to keep it available.
2949
+
2950
+
2951
+
2952
+ ## Contact information and mandatory 2FA coming up in 2022
2953
+
2954
+ If your creative mind has ideas and specific suggestions to make this gem
2955
+ more useful in general, feel free to drop me an email at any time, via:
2956
+
2957
+ shevy@inbox.lt
2958
+
2959
+ Before that email I used an email account at Google gmail, but in **2021** I
2960
+ decided to slowly abandon gmail, for various reasons. In order to limit the
2961
+ explanation here, allow me to just briefly state that I do not feel as if I
2962
+ want to promote any Google service anymore when the user becomes the
2963
+ product (such as via data collection by upstream services). I feel this is
2964
+ a hugely flawed business model.
2965
+
2966
+ Do keep in mind that responding to emails may take some time, depending on
2967
+ the amount of work I may have at that moment.
2968
+
2969
+ In <b>2022</b> rubygems.org, or rather the corporate overlords who control the
2970
+ rubygems.org infrastructure these days, decided to make 2FA mandatory for every
2971
+ gem owner eventually: see
2972
+ https://blog.rubygems.org/2022/06/13/making-packages-more-secure.html
2973
+
2974
+ Mandatory 2FA will eventually be extended to all rubygems.org developers and
2975
+ maintainers. As I can not use 2FA, for reasons I will skip explaining here,
2976
+ this means that my projects will eventually be taken over by shopify (or,
2977
+ correspondingly, whoever effectively controls the rubygems.org ecosystem).
2978
+ At that point, I no longer have any control what is done to my projects
2979
+ since shopify (respectively those controlling the gems ecosystem) took away
2980
+ control here. Not sure at which point ruby became corporate-controlled -
2981
+ that was not the case several years ago.
2982
+
2983
+ Ruby also only allows 2FA users to participate on the issue tracker these
2984
+ days:
2985
+
2986
+ https://bugs.ruby-lang.org/issues/18800
2987
+