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