studium 0.18.7

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