studium 0.18.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +3310 -0
- data/bin/all_passed_exams +14 -0
- data/bin/check_description_of_these_lectures +7 -0
- data/bin/curriculum_module_displayer +7 -0
- data/bin/cycle +7 -0
- data/bin/d10 +7 -0
- data/bin/d100 +7 -0
- data/bin/d15 +7 -0
- data/bin/d150 +7 -0
- data/bin/d20 +7 -0
- data/bin/d25 +7 -0
- data/bin/d3 +7 -0
- data/bin/d30 +7 -0
- data/bin/d5 +7 -0
- data/bin/determine_curricula +7 -0
- data/bin/display_lecture_url +7 -0
- data/bin/exam_registration_at +7 -0
- data/bin/exam_statistics +7 -0
- data/bin/exams_per_month +9 -0
- data/bin/finished_exams_at_this_university +7 -0
- data/bin/flashcards +7 -0
- data/bin/from_curriculum_id_to_university +9 -0
- data/bin/location_to_this_exam_topic.rb +7 -0
- data/bin/mandatory_continuous_assessment +7 -0
- data/bin/mandatory_upcoming_courses +10 -0
- data/bin/n_ECTS +7 -0
- data/bin/n_exam_questions_already_answered +15 -0
- data/bin/names_of_all_solved_exams +7 -0
- data/bin/not_completed_exams +7 -0
- data/bin/nquestions +7 -0
- data/bin/nsolved +7 -0
- data/bin/open_last_exam_question_asked_file +7 -0
- data/bin/passed_exams +7 -0
- data/bin/passed_pr/303/274fungsimmanente_courses +7 -0
- data/bin/passed_this_exam_on +10 -0
- data/bin/pdf_for +7 -0
- data/bin/question_answer +7 -0
- data/bin/random_exam_topic +7 -0
- data/bin/registered_for_this_exam +15 -0
- data/bin/report_solved_topics +7 -0
- data/bin/return_n_ects_from_this_file +7 -0
- data/bin/return_n_questions_solved_in_total +7 -0
- data/bin/rti_conflict +7 -0
- data/bin/search_for_n_ects +7 -0
- data/bin/show_lectures_on_the_commandline +7 -0
- data/bin/show_passed_exams_having_this_grade +7 -0
- data/bin/show_themes +7 -0
- data/bin/solved +9 -0
- data/bin/solved_ects +7 -0
- data/bin/studienkennzahl +7 -0
- data/bin/studium +7 -0
- data/bin/studium_actions +7 -0
- data/bin/studium_skeleton +7 -0
- data/bin/ufind +7 -0
- data/bin/upcoming_exams +7 -0
- data/bin/week_parser +7 -0
- data/doc/ECTS_CONSIDERATIONS/ECTS_CONSIDERATIONS.md +85 -0
- 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
- data/doc/README.gen +3263 -0
- data/doc/SQL_database_specification/SQL_database_specification.md +46 -0
- data/doc/deprecated_components/deprecated_components.md +46 -0
- data/doc/documentation_for_the_file_lecture_information/documentation_for_the_file_lecture_information.md +311 -0
- data/doc/elegant_colours/elegant_colours.md +21 -0
- data/doc/statistics/yearly_statistics.md +8 -0
- data/doc/todo/todo_for_the_graphical_parts_of_the_studium_gem_including_www_related_aspects.md +92 -0
- data/doc/todo/todo_for_the_studium_gem.md +55 -0
- data/img/STUDIES.png +0 -0
- data/lib/studium/actions/actions.rb +134 -0
- data/lib/studium/autoinclude.rb +7 -0
- data/lib/studium/base/base.rb +3554 -0
- data/lib/studium/base/commandline_arguments_module/commandline_arguments_module.rb +115 -0
- data/lib/studium/base/html_colours_module.rb +632 -0
- data/lib/studium/base/runmode_module/runmode_module.rb +103 -0
- data/lib/studium/c/README.md +2 -0
- data/lib/studium/c/a.out +0 -0
- data/lib/studium/c/obtain_random_entry.c +11 -0
- data/lib/studium/check_and_sanitize/README.md +15 -0
- data/lib/studium/check_and_sanitize/check_curriculum_for_correct_separation_of_bachelor_and_master.rb +141 -0
- data/lib/studium/check_and_sanitize/check_for_all_exam_topics_being_registered.rb +118 -0
- data/lib/studium/check_and_sanitize/check_for_correct_themes_of_each_course.rb +100 -0
- data/lib/studium/check_and_sanitize/check_for_existing_description_of_this_lecture.rb +194 -0
- data/lib/studium/check_and_sanitize/check_important_exams.rb +138 -0
- data/lib/studium/check_and_sanitize/check_the_lecture_information_file.rb +166 -0
- data/lib/studium/check_and_sanitize/correct_all_dates_in_the_file_lecture_information.rb +115 -0
- data/lib/studium/check_and_sanitize/date_sanitizer.rb +350 -0
- data/lib/studium/check_and_sanitize/find_duplicate_lectures.rb +124 -0
- data/lib/studium/check_and_sanitize/missing_priority_entry.rb +44 -0
- data/lib/studium/check_and_sanitize/sanitize_lecture_information.rb +434 -0
- data/lib/studium/colours/colours.rb +1711 -0
- data/lib/studium/commandline/commandline.rb +1848 -0
- data/lib/studium/constants/constants.rb +2063 -0
- data/lib/studium/css/project.css +273 -0
- data/lib/studium/curricula/attribute_lecture_to_curriculum/attribute_boku_lecture_to_curriculum.rb +384 -0
- data/lib/studium/curricula/attribute_lecture_to_curriculum/attribute_lecture_to_curriculum.rb +238 -0
- data/lib/studium/curricula/curricula_from_this_website/curricula_from_this_website.rb +141 -0
- data/lib/studium/curricula/curriculum.rb +213 -0
- data/lib/studium/curricula/curriculum_as_string.rb +280 -0
- data/lib/studium/curricula/curriculum_module_displayer/constants.rb +33 -0
- data/lib/studium/curricula/curriculum_module_displayer/curriculum_module_displayer.rb +417 -0
- data/lib/studium/curricula/curriculum_module_displayer/initialize.rb +25 -0
- data/lib/studium/curricula/curriculum_module_displayer/menu.rb +45 -0
- data/lib/studium/curricula/curriculum_module_displayer/reset.rb +74 -0
- data/lib/studium/curricula/curriculum_module_displayer/run.rb +20 -0
- data/lib/studium/curricula/curriculum_module_displayer/set_use_this_curriculum.rb +93 -0
- data/lib/studium/curricula/curriculum_module_displayer/show_and_report.rb +190 -0
- data/lib/studium/curricula/determine_curricula/constants.rb +11 -0
- data/lib/studium/curricula/determine_curricula/determine_curricula.rb +36 -0
- data/lib/studium/curricula/determine_curricula/help.rb +39 -0
- data/lib/studium/curricula/determine_curricula/initialize.rb +48 -0
- data/lib/studium/curricula/determine_curricula/menu.rb +151 -0
- data/lib/studium/curricula/determine_curricula/misc.rb +403 -0
- data/lib/studium/curricula/determine_curricula/report.rb +141 -0
- data/lib/studium/curricula/determine_curricula/reset.rb +59 -0
- data/lib/studium/curricula/determine_curricula/run.rb +19 -0
- data/lib/studium/curricula/determine_elective_courses_in_this_curriculum.rb +112 -0
- data/lib/studium/curricula/display_bachelor_curricula.rb +90 -0
- data/lib/studium/curricula/handle_curricula/README.md +9 -0
- data/lib/studium/curricula/handle_curricula/handle_curricula.rb +99 -0
- data/lib/studium/curricula/handle_curricula/misc.rb +798 -0
- data/lib/studium/curricula/mitteilungsbl/303/244tter/mitteilungsbl/303/244tter.rb +323 -0
- data/lib/studium/curricula/modules/display_on_the_commandline.rb +319 -0
- data/lib/studium/curricula/modules/return_n_ects_in_this_module.rb +74 -0
- data/lib/studium/curricula/n_percent_solved_in_this_curriculum.rb +73 -0
- data/lib/studium/curricula/prepare_individual_curriculum.rb +304 -0
- data/lib/studium/curricula/random_curriculum_creator/random_curriculum_creator.rb +164 -0
- data/lib/studium/curricula/show_all_unfinished_courses_of_this_curriculum/show_all_unfinished_courses_of_this_curriculum.rb +116 -0
- data/lib/studium/curricula/show_lectures_of_this_curriculum.rb +114 -0
- data/lib/studium/curricula/show_lectures_of_this_curriculum_id/show_lectures_of_this_curriculum_id.rb +554 -0
- data/lib/studium/curricula/show_solved_percentage_among_the_registered_curricula.rb +87 -0
- data/lib/studium/curricula/sorted_individual_curricula.rb +121 -0
- data/lib/studium/ects/boku_ects_splitter.rb +128 -0
- data/lib/studium/ects/ects_per_university/ects_per_university.rb +179 -0
- data/lib/studium/ects/ects_scanner.rb +141 -0
- data/lib/studium/ects/ects_to_university_parser.rb +142 -0
- data/lib/studium/ects/last_entry_is_curriculum.rb +150 -0
- data/lib/studium/ects/n_ects_in_these_lectures.rb +196 -0
- data/lib/studium/ects/n_ects_points_in_mandatory_presence_courses.rb +47 -0
- data/lib/studium/ects/return_n_ects_from_this_file.rb +59 -0
- data/lib/studium/ects/return_n_ects_from_this_url.rb +197 -0
- data/lib/studium/ects/search_for_n_ects/search_for_n_ects.rb +719 -0
- data/lib/studium/ects/show_completed_ects_in_all_curricula.rb +245 -0
- data/lib/studium/ects/show_passed_credits_per_curriculum.rb +276 -0
- data/lib/studium/ects/simple_total_ects_points.rb +135 -0
- data/lib/studium/ects/solved_ects/constants.rb +19 -0
- data/lib/studium/ects/solved_ects/reset.rb +50 -0
- data/lib/studium/ects/solved_ects/solved_ects.rb +325 -0
- data/lib/studium/ects/solved_ects_per_university/reset.rb +25 -0
- data/lib/studium/ects/solved_ects_per_university/solved_ects_per_university.rb +116 -0
- data/lib/studium/ects/still_missing.rb +129 -0
- data/lib/studium/ects/sum_of_ects.rb +144 -0
- data/lib/studium/encoding/encoding.rb +109 -0
- data/lib/studium/exam_topics/RNAi_siRNA_and_miRNA +100 -0
- data/lib/studium/exam_topics/abfall_als_ressource +86 -0
- data/lib/studium/exam_topics/advanced_biochemistry +937 -0
- data/lib/studium/exam_topics/advanced_biotechnology +234 -0
- data/lib/studium/exam_topics/advanced_cellbiology +251 -0
- data/lib/studium/exam_topics/advanced_chemistry +547 -0
- data/lib/studium/exam_topics/advanced_immunology +225 -0
- data/lib/studium/exam_topics/advanced_microbiology +49 -0
- data/lib/studium/exam_topics/advanced_topics_in_plant_sciences +117 -0
- data/lib/studium/exam_topics/advanced_virology +273 -0
- data/lib/studium/exam_topics/ageing +154 -0
- data/lib/studium/exam_topics/agrar_ecology +67 -0
- data/lib/studium/exam_topics/agrarmarkt +73 -0
- data/lib/studium/exam_topics/agrarphysik +35 -0
- data/lib/studium/exam_topics/alcohols +30 -0
- data/lib/studium/exam_topics/algorithms +104 -0
- data/lib/studium/exam_topics/allergie +76 -0
- data/lib/studium/exam_topics/allgemeine_genetik +1006 -0
- data/lib/studium/exam_topics/allgemeine_mikrobiologie +1012 -0
- data/lib/studium/exam_topics/aminoacids +469 -0
- data/lib/studium/exam_topics/analytische_chemie_1 +134 -0
- data/lib/studium/exam_topics/analytische_chemie_2 +31 -0
- data/lib/studium/exam_topics/anatomie +378 -0
- data/lib/studium/exam_topics/anorganische_chemie +357 -0
- data/lib/studium/exam_topics/anthropologie +239 -0
- data/lib/studium/exam_topics/antibodies_and_antigens +790 -0
- data/lib/studium/exam_topics/apoptosis +35 -0
- data/lib/studium/exam_topics/archaea +112 -0
- data/lib/studium/exam_topics/archaeo_viruses +7 -0
- data/lib/studium/exam_topics/archaeology +5 -0
- data/lib/studium/exam_topics/architecture +8 -0
- data/lib/studium/exam_topics/artificial_intelligence +90 -0
- data/lib/studium/exam_topics/atomemissionsspektrometrie +6 -0
- data/lib/studium/exam_topics/audio +11 -0
- data/lib/studium/exam_topics/bacteriophages +266 -0
- data/lib/studium/exam_topics/basic_biochemistry +1008 -0
- data/lib/studium/exam_topics/basic_biotechnology +1011 -0
- data/lib/studium/exam_topics/basic_chemistry +1007 -0
- data/lib/studium/exam_topics/basic_virology +1008 -0
- data/lib/studium/exam_topics/bauwesen +6 -0
- data/lib/studium/exam_topics/betriebssysteme +128 -0
- data/lib/studium/exam_topics/betriebswirtschaftslehre +29 -0
- data/lib/studium/exam_topics/bioanalytik_und_biosensoren +451 -0
- data/lib/studium/exam_topics/biochips +80 -0
- data/lib/studium/exam_topics/bioelektrochemie +57 -0
- data/lib/studium/exam_topics/biofilms +58 -0
- data/lib/studium/exam_topics/bioinformatics +523 -0
- data/lib/studium/exam_topics/biological_therapeutics +156 -0
- data/lib/studium/exam_topics/biologie +152 -0
- data/lib/studium/exam_topics/biomarkers +137 -0
- data/lib/studium/exam_topics/biomaterials +90 -0
- data/lib/studium/exam_topics/biomedical_studies +16 -0
- data/lib/studium/exam_topics/biomembranes +6 -0
- data/lib/studium/exam_topics/bionik +65 -0
- data/lib/studium/exam_topics/biophysik +34 -0
- data/lib/studium/exam_topics/biopolymers +10 -0
- data/lib/studium/exam_topics/bioprozesstechnik +149 -0
- data/lib/studium/exam_topics/bioressourcenmanagement +78 -0
- data/lib/studium/exam_topics/birds +5 -0
- data/lib/studium/exam_topics/bodenkunde +384 -0
- data/lib/studium/exam_topics/bodenmikrobiologie +40 -0
- data/lib/studium/exam_topics/cancerbiology +488 -0
- data/lib/studium/exam_topics/cell_cultures +229 -0
- data/lib/studium/exam_topics/cellbiology +1011 -0
- data/lib/studium/exam_topics/cellular_transport_and_protein_secretion +27 -0
- data/lib/studium/exam_topics/cellular_vesicles +11 -0
- data/lib/studium/exam_topics/cellulose +6 -0
- data/lib/studium/exam_topics/chemische_technologie_anorganischer_stoffe +210 -0
- data/lib/studium/exam_topics/chemische_technologie_organischer_stoffe +25 -0
- data/lib/studium/exam_topics/chemisches_labor +60 -0
- data/lib/studium/exam_topics/chemokines_and_cytokines +45 -0
- data/lib/studium/exam_topics/chemotaxis_quorum_sensing_and_motility_in_prokaryotes +116 -0
- data/lib/studium/exam_topics/citric_acid_cycle +84 -0
- data/lib/studium/exam_topics/clinical_microbiology +520 -0
- data/lib/studium/exam_topics/computer_science +309 -0
- data/lib/studium/exam_topics/computer_vision_and_computer_graphics +15 -0
- data/lib/studium/exam_topics/crispr +51 -0
- data/lib/studium/exam_topics/cyanobacteria +45 -0
- data/lib/studium/exam_topics/cytogenetics_and_chromosome_biology +598 -0
- data/lib/studium/exam_topics/databases_and_sql +126 -0
- data/lib/studium/exam_topics/dna_mutation_and_dna_repair +186 -0
- data/lib/studium/exam_topics/dna_replication +80 -0
- data/lib/studium/exam_topics/ecogenetics +26 -0
- data/lib/studium/exam_topics/ecological_agriculture +12 -0
- data/lib/studium/exam_topics/ecology +332 -0
- data/lib/studium/exam_topics/economy +226 -0
- data/lib/studium/exam_topics/electron_microscopy +7 -0
- data/lib/studium/exam_topics/elektronenmikroskopie +356 -0
- data/lib/studium/exam_topics/elektrophorese +132 -0
- data/lib/studium/exam_topics/elektrotechnik_und_elektrizit/303/244t +42 -0
- data/lib/studium/exam_topics/elisa +55 -0
- data/lib/studium/exam_topics/embryologie_und_entwicklung +657 -0
- data/lib/studium/exam_topics/endospores_and_spores +104 -0
- data/lib/studium/exam_topics/enzymes_and_cofactors +395 -0
- data/lib/studium/exam_topics/epigenetik +188 -0
- data/lib/studium/exam_topics/erste_hilfe +414 -0
- data/lib/studium/exam_topics/ethik +143 -0
- data/lib/studium/exam_topics/evolution_and_evolutionary_genetics +372 -0
- data/lib/studium/exam_topics/excel +7 -0
- data/lib/studium/exam_topics/fish +19 -0
- data/lib/studium/exam_topics/fluorescence_microscopy +10 -0
- data/lib/studium/exam_topics/food_microbiology_and_food_biotechnology +92 -0
- data/lib/studium/exam_topics/forensik +65 -0
- data/lib/studium/exam_topics/forstwirtschaft +53 -0
- data/lib/studium/exam_topics/fortgeschrittene_genetik +692 -0
- data/lib/studium/exam_topics/fortgeschrittene_gentechnik +221 -0
- data/lib/studium/exam_topics/fortgeschrittene_physik +6 -0
- data/lib/studium/exam_topics/fungi +119 -0
- data/lib/studium/exam_topics/genetische_krankheiten +209 -0
- data/lib/studium/exam_topics/genexpression +1008 -0
- data/lib/studium/exam_topics/genomics_and_metagenomics +290 -0
- data/lib/studium/exam_topics/gentechnik_und_praktische_biochemie +961 -0
- data/lib/studium/exam_topics/geochemistry +67 -0
- data/lib/studium/exam_topics/geography +9 -0
- data/lib/studium/exam_topics/geologie_und_mineralogie +624 -0
- data/lib/studium/exam_topics/geometrie +56 -0
- data/lib/studium/exam_topics/geschichte +95 -0
- data/lib/studium/exam_topics/gluconeogenesis +72 -0
- data/lib/studium/exam_topics/glycogen +45 -0
- data/lib/studium/exam_topics/glycolysis +118 -0
- data/lib/studium/exam_topics/glykomik +131 -0
- data/lib/studium/exam_topics/glyoxylatzyklus +31 -0
- data/lib/studium/exam_topics/grassland_cultivation +32 -0
- data/lib/studium/exam_topics/hormone +152 -0
- data/lib/studium/exam_topics/html +8 -0
- data/lib/studium/exam_topics/human_ecology +8 -0
- data/lib/studium/exam_topics/hygiene +224 -0
- data/lib/studium/exam_topics/imaging_and_microscopy +270 -0
- data/lib/studium/exam_topics/immunanalytik +94 -0
- data/lib/studium/exam_topics/immunologie +1011 -0
- data/lib/studium/exam_topics/informatik +117 -0
- data/lib/studium/exam_topics/innate_immunity +52 -0
- data/lib/studium/exam_topics/insekten +66 -0
- data/lib/studium/exam_topics/insulin_and_diabetes +57 -0
- data/lib/studium/exam_topics/java +624 -0
- data/lib/studium/exam_topics/javascript +29 -0
- data/lib/studium/exam_topics/klima +6 -0
- data/lib/studium/exam_topics/kryptographie +10 -0
- data/lib/studium/exam_topics/landtechnik +26 -0
- data/lib/studium/exam_topics/lebensmittel_und_getr/303/244nke +224 -0
- data/lib/studium/exam_topics/lebensmitteltechnologie +16 -0
- data/lib/studium/exam_topics/light_microscopy +19 -0
- data/lib/studium/exam_topics/linux_and_unix +36 -0
- data/lib/studium/exam_topics/lipids +145 -0
- data/lib/studium/exam_topics/macroeconomics +39 -0
- data/lib/studium/exam_topics/marketing +53 -0
- data/lib/studium/exam_topics/mathematics +311 -0
- data/lib/studium/exam_topics/medizin_und_biomedizinische_technik +254 -0
- data/lib/studium/exam_topics/medizinische_chemie_und_pharmazie +441 -0
- data/lib/studium/exam_topics/messtechnik_und_regeltechnik +104 -0
- data/lib/studium/exam_topics/metabolismus +482 -0
- data/lib/studium/exam_topics/meteorologie_und_atmosph/303/244re +120 -0
- data/lib/studium/exam_topics/microbial_ecology +37 -0
- data/lib/studium/exam_topics/microcontrollers +11 -0
- data/lib/studium/exam_topics/mikrobielle_lebensgemeinschaften +58 -0
- data/lib/studium/exam_topics/mikrobielle_physiologie +313 -0
- data/lib/studium/exam_topics/mitochondria +57 -0
- data/lib/studium/exam_topics/mixed +287 -0
- data/lib/studium/exam_topics/molecular_biology_of_plants +281 -0
- data/lib/studium/exam_topics/molekulare_medizin +133 -0
- data/lib/studium/exam_topics/nanotechnologie +456 -0
- data/lib/studium/exam_topics/nature_conservation_and_biodiversity +247 -0
- data/lib/studium/exam_topics/naturstoffe +9 -0
- data/lib/studium/exam_topics/netzwerke +63 -0
- data/lib/studium/exam_topics/neuroanatomie +25 -0
- data/lib/studium/exam_topics/neurobiology +356 -0
- data/lib/studium/exam_topics/nucleotide_sequencing +41 -0
- data/lib/studium/exam_topics/nutztierethologie +11 -0
- data/lib/studium/exam_topics/object_oriented_modeling +15 -0
- data/lib/studium/exam_topics/obstbau +249 -0
- data/lib/studium/exam_topics/organische_chemie +1007 -0
- data/lib/studium/exam_topics/organische_chemie_2 +137 -0
- data/lib/studium/exam_topics/paleobiology +39 -0
- data/lib/studium/exam_topics/parasitic_diseases_and_molecular_infection_biology +336 -0
- data/lib/studium/exam_topics/patent_law +55 -0
- data/lib/studium/exam_topics/pathologie +761 -0
- data/lib/studium/exam_topics/pcr +155 -0
- data/lib/studium/exam_topics/pentosephosphatweg +61 -0
- data/lib/studium/exam_topics/peroxisomes_glycosomes_and_lysosomes +66 -0
- data/lib/studium/exam_topics/pflanzenanatomie +262 -0
- data/lib/studium/exam_topics/pflanzenbau +24 -0
- data/lib/studium/exam_topics/pflanzenschutz +35 -0
- data/lib/studium/exam_topics/pflanzenwissenschaften +1009 -0
- data/lib/studium/exam_topics/pharmaceutical_biotechnology +252 -0
- data/lib/studium/exam_topics/physik +449 -1
- data/lib/studium/exam_topics/physikalische_chemie +79 -0
- data/lib/studium/exam_topics/physiology_and_histology +592 -0
- data/lib/studium/exam_topics/phytochemie +33 -0
- data/lib/studium/exam_topics/plant_biotechnology +132 -0
- data/lib/studium/exam_topics/plant_breeding +64 -0
- data/lib/studium/exam_topics/plant_development +50 -0
- data/lib/studium/exam_topics/populationsgenetik +143 -0
- data/lib/studium/exam_topics/posttranslationale_modifikation_von_proteinen +198 -0
- data/lib/studium/exam_topics/programming +41 -0
- data/lib/studium/exam_topics/projektmanagement +226 -0
- data/lib/studium/exam_topics/prokaryote_genetics +587 -0
- data/lib/studium/exam_topics/protein_engineering +35 -0
- data/lib/studium/exam_topics/proteolyse +39 -0
- data/lib/studium/exam_topics/proteomik +42 -0
- data/lib/studium/exam_topics/protozoans +24 -0
- data/lib/studium/exam_topics/prozesstechnik +95 -0
- data/lib/studium/exam_topics/psychologie +21 -0
- data/lib/studium/exam_topics/python +391 -0
- data/lib/studium/exam_topics/quality_management +266 -0
- data/lib/studium/exam_topics/rechtsgrundlagen +126 -0
- data/lib/studium/exam_topics/research_topics_in_immunobiology +42 -0
- data/lib/studium/exam_topics/rna_and_dna +535 -0
- data/lib/studium/exam_topics/rna_seq +13 -0
- data/lib/studium/exam_topics/robotics +12 -0
- data/lib/studium/exam_topics/ruby +240 -0
- data/lib/studium/exam_topics/ruby_on_rails +63 -0
- data/lib/studium/exam_topics/scientific_writing_and_publishing +38 -0
- data/lib/studium/exam_topics/semisynthese_von_proteinen_und_nukleotiden +120 -0
- data/lib/studium/exam_topics/sexualbiologie +327 -0
- data/lib/studium/exam_topics/signal_transduction_and_laser_systems +215 -0
- data/lib/studium/exam_topics/sozialbiologie +17 -0
- data/lib/studium/exam_topics/soziologie +5 -0
- data/lib/studium/exam_topics/splicing_exons_and_introns +67 -0
- data/lib/studium/exam_topics/sport_und_sportverletzungen +6 -0
- data/lib/studium/exam_topics/statistik +306 -0
- data/lib/studium/exam_topics/stemcells +182 -0
- data/lib/studium/exam_topics/stickstofffixierung +91 -0
- data/lib/studium/exam_topics/structural_bioinformatics +54 -0
- data/lib/studium/exam_topics/strukturbiologie +445 -0
- data/lib/studium/exam_topics/system_biology_and_synthetic_biology +108 -0
- data/lib/studium/exam_topics/systematische_zoologie +446 -0
- data/lib/studium/exam_topics/technical_ecology +144 -0
- data/lib/studium/exam_topics/technik +5 -0
- data/lib/studium/exam_topics/technische_chemie +208 -0
- data/lib/studium/exam_topics/technische_grundlagen_der_informatik +43 -0
- data/lib/studium/exam_topics/technische_mikrobiologie +393 -0
- data/lib/studium/exam_topics/technisches_zeichnen +5 -0
- data/lib/studium/exam_topics/the_bacterial_cell_wall +98 -0
- data/lib/studium/exam_topics/the_c_plus_plus_programming_language +531 -0
- data/lib/studium/exam_topics/the_c_programming_language +133 -0
- data/lib/studium/exam_topics/the_cellcycle +102 -0
- data/lib/studium/exam_topics/the_european_union +121 -0
- data/lib/studium/exam_topics/the_interferon_system +40 -0
- data/lib/studium/exam_topics/the_microbiome +164 -0
- data/lib/studium/exam_topics/the_universe +32 -0
- data/lib/studium/exam_topics/theoretische_chemie +5 -0
- data/lib/studium/exam_topics/theoretische_informatik +161 -0
- data/lib/studium/exam_topics/thermodynamics +21 -0
- data/lib/studium/exam_topics/tierzucht +139 -0
- data/lib/studium/exam_topics/toxikologie +508 -0
- data/lib/studium/exam_topics/transcription +188 -0
- data/lib/studium/exam_topics/translation_ribosomes_and_translational_control +155 -0
- data/lib/studium/exam_topics/umweltbiotechnologie +64 -0
- data/lib/studium/exam_topics/umweltchemie +233 -0
- data/lib/studium/exam_topics/urbanism_and_traffic +19 -0
- data/lib/studium/exam_topics/urea_cycle +56 -0
- data/lib/studium/exam_topics/vaccines_and_vaccination +253 -0
- data/lib/studium/exam_topics/vectors_and_gene_therapy +247 -0
- data/lib/studium/exam_topics/verfahrenstechnik +37 -0
- data/lib/studium/exam_topics/verhaltensbiologie +79 -0
- data/lib/studium/exam_topics/veterinary_medicine +10 -0
- data/lib/studium/exam_topics/vitamine +32 -0
- data/lib/studium/exam_topics/wasserkunde +144 -0
- data/lib/studium/exam_topics/weinbau +86 -0
- data/lib/studium/exam_topics/wissenschaft +20 -0
- data/lib/studium/exam_topics/yeast +104 -0
- data/lib/studium/exam_topics/zoologie +338 -0
- data/lib/studium/exams/afterburn/afterburn.rb +304 -0
- data/lib/studium/exams/ask_exam_from_the_upcoming_exams_pool.rb +150 -0
- data/lib/studium/exams/ask_exam_topic_question.rb +112 -0
- data/lib/studium/exams/ask_question_from_alias.rb +141 -0
- data/lib/studium/exams/ask_question_from_any_of_the_still_missing_lectures.rb +130 -0
- data/lib/studium/exams/ask_question_from_grouped_themes.rb +141 -0
- data/lib/studium/exams/ask_question_from_last_topic.rb +91 -0
- data/lib/studium/exams/ask_random_question.rb +195 -0
- data/lib/studium/exams/autoinclude.rb +7 -0
- data/lib/studium/exams/average_grade/average_grade.rb +404 -0
- data/lib/studium/exams/csv/create_csv_passed_exams_file.rb +217 -0
- data/lib/studium/exams/cycle.rb +291 -0
- data/lib/studium/exams/dataset/dataset.rb +126 -0
- data/lib/studium/exams/designate_ten_random_exam_topics/designate_ten_random_exam_topics.rb +88 -0
- data/lib/studium/exams/exam/exam.rb +130 -0
- data/lib/studium/exams/exam_bubble/exam_bubble.rb +444 -0
- data/lib/studium/exams/exam_bubble/menu_for_the_main_loop.rb +111 -0
- data/lib/studium/exams/exam_question/README.md +3 -0
- data/lib/studium/exams/exam_question/exam_question.rb +434 -0
- data/lib/studium/exams/exam_registration_at/constants.rb +49 -0
- data/lib/studium/exams/exam_registration_at/exam_registration_at.rb +242 -0
- data/lib/studium/exams/exam_registration_at/help.rb +46 -0
- data/lib/studium/exams/exam_registration_at/menu.rb +81 -0
- data/lib/studium/exams/exam_registration_at/report_and_show.rb +133 -0
- data/lib/studium/exams/exam_registration_at/reset.rb +54 -0
- data/lib/studium/exams/exam_statistics_from_this_file/exam_statistics_from_this_file.rb +119 -0
- data/lib/studium/exams/exam_topics.rb +194 -0
- data/lib/studium/exams/exams.rb +20 -0
- data/lib/studium/exams/exams_per_month/exams_per_month.rb +2442 -0
- data/lib/studium/exams/exams_this_week.rb +182 -0
- data/lib/studium/exams/fix_exam_dates.rb +121 -0
- data/lib/studium/exams/frozen.rb +36 -0
- data/lib/studium/exams/last_exams/last_exams.rb +479 -0
- data/lib/studium/exams/lectures_without_exam_entry.rb +137 -0
- data/lib/studium/exams/mandatory_continuous_assessment/mandatory_continuous_assessment.rb +1358 -0
- data/lib/studium/exams/move_all_unsolved_exam_questions_to_the_top_of_the_file.rb +173 -0
- 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
- data/lib/studium/exams/n_exams_in_these_topics.rb +477 -0
- data/lib/studium/exams/next_exam.rb +106 -0
- data/lib/studium/exams/next_exams.rb +378 -0
- data/lib/studium/exams/not_completed/README.md +5 -0
- data/lib/studium/exams/not_completed/not_completed.rb +143 -0
- data/lib/studium/exams/open_exam_associated_url/open_exam_associated_url.rb +154 -0
- data/lib/studium/exams/open_last_exam_question_asked_file/constants.rb +15 -0
- data/lib/studium/exams/open_last_exam_question_asked_file/initialize.rb +29 -0
- data/lib/studium/exams/open_last_exam_question_asked_file/open_last_exam_question_asked_file.rb +110 -0
- data/lib/studium/exams/push_solved_questions_on_top.rb +180 -0
- data/lib/studium/exams/question_answer/question_answer.rb +2936 -0
- data/lib/studium/exams/questions_solved_from_day_to_day/questions_solved_from_day_to_day.rb +379 -0
- data/lib/studium/exams/remote_ftp_url.rb +52 -0
- data/lib/studium/exams/repeat_last_question.rb +78 -0
- data/lib/studium/exams/report_total_amount_of_questions_and_answers_for.rb +116 -0
- data/lib/studium/exams/show_all_passed_exams_of_this_university.rb +252 -0
- data/lib/studium/exams/show_backlog_of_exams/show_backlog_of_exams.rb +114 -0
- data/lib/studium/exams/show_exams_for/show_exams_for.rb +172 -0
- data/lib/studium/exams/show_themes/constants.rb +28 -0
- data/lib/studium/exams/show_themes/menu.rb +61 -0
- data/lib/studium/exams/show_themes/misc.rb +538 -0
- data/lib/studium/exams/show_themes/reset.rb +62 -0
- data/lib/studium/exams/show_themes/show_themes.rb +27 -0
- data/lib/studium/exams/show_upcoming_exams/show_upcoming_exams.rb +1537 -0
- data/lib/studium/exams/solve_all_questions_from_this_topic.rb +114 -0
- data/lib/studium/exams/solved/solved.rb +434 -0
- data/lib/studium/exams/timetable/constants.rb +142 -0
- data/lib/studium/exams/timetable/timetable.rb +448 -0
- data/lib/studium/exams/unsolve_all_questions_from_this_topic.rb +163 -0
- data/lib/studium/exams/upcoming_exams/upcoming_exams.rb +555 -0
- data/lib/studium/exams/upcoming_exams_at_the_boku/constants.rb +23 -0
- data/lib/studium/exams/upcoming_exams_at_the_boku/html.rb +64 -0
- data/lib/studium/exams/upcoming_exams_at_the_boku/upcoming_exams_at_the_boku.rb +194 -0
- data/lib/studium/exams/upcoming_exams_dataset.rb +247 -0
- data/lib/studium/exams/upcoming_registered_exams/upcoming_registered_exams.rb +257 -0
- data/lib/studium/exams/upload_exam_topics.rb +360 -0
- data/lib/studium/graphviz/README.md +4 -0
- data/lib/studium/graphviz/bachelor_vector_based_strategies.dot +160 -0
- data/lib/studium/graphviz/master_vector_based_strategies.dot +46 -0
- data/lib/studium/gui/gtk3/control_panel/control_panel.rb +40 -0
- data/lib/studium/gui/gtk3/lecture_information/lecture_information.rb +191 -0
- data/lib/studium/gui/java/exam_question/ExamQuestion$1.class +0 -0
- data/lib/studium/gui/java/exam_question/ExamQuestion.class +0 -0
- data/lib/studium/gui/java/exam_question/ExamQuestion.java +215 -0
- data/lib/studium/gui/javafx/exam_question_widget/exam_question_widget.rb +58 -0
- data/lib/studium/gui/jruby/exam_trainer/exam_trainer.rb +637 -0
- data/lib/studium/gui/jruby/show_upcoming_exams/show_upcoming_exams.rb +85 -0
- data/lib/studium/gui/libui/ask_exam_question/ask_exam_question.rb +347 -0
- data/lib/studium/gui/shared_code/control_panel/control_panel_module.rb +305 -0
- data/lib/studium/gui/shared_code/exam_trainer/exam_trainer_widget_module.rb +0 -0
- data/lib/studium/gui/shared_code/information_about_a_lecture/information_about_a_lecture_module.rb +0 -0
- data/lib/studium/gui/shared_code/show_upcoming_exams/show_upcoming_exams_module.rb +129 -0
- data/lib/studium/gui/universal_widgets/curriculum_viewer/curriculum_viewer.rb +549 -0
- data/lib/studium/gui/universal_widgets/ects_per_university/ects_per_university.rb +302 -0
- data/lib/studium/gui/universal_widgets/exam_trainer/exam_trainer.config +6 -0
- data/lib/studium/gui/universal_widgets/exam_trainer/exam_trainer.rb +3266 -0
- data/lib/studium/gui/universal_widgets/exam_trainer/manifest.yml +12 -0
- data/lib/studium/gui/universal_widgets/expand_time_range/expand_time_range.rb +309 -0
- data/lib/studium/gui/universal_widgets/information_about_a_lecture/information_about_a_lecture.rb +242 -0
- data/lib/studium/gui/universal_widgets/show_upcoming_exams/show_upcoming_exams.rb +252 -0
- data/lib/studium/images/libui_ask_exam_question.png +0 -0
- data/lib/studium/images/outdated.png +0 -0
- data/lib/studium/images/small_logos/DNA.png +0 -0
- data/lib/studium/images/small_logos/README.md +2 -0
- data/lib/studium/images/small_logos/solved.png +0 -0
- data/lib/studium/images/studies_favicon.png +0 -0
- data/lib/studium/java/README.md +5 -0
- data/lib/studium/java/studium/AskExamQuestion.java +461 -0
- data/lib/studium/java/studium/Base.java +123 -0
- data/lib/studium/java/studium/Constants.java +122 -0
- data/lib/studium/java/studium/EnsureThatTheLogDirectoryExists.java +57 -0
- data/lib/studium/java/studium/Mkdir.java +13 -0
- data/lib/studium/java/studium/OpenLastExamQuestionurlLinkViaTheBrowser.java +90 -0
- data/lib/studium/java/studium/ReturnNQuestionsSolvedInTotal.java +69 -0
- data/lib/studium/java/studium/Solved.java +112 -0
- data/lib/studium/java/studium/Test.java +60 -0
- data/lib/studium/java/studium/studium/AskExamQuestion.class +0 -0
- data/lib/studium/java/studium/studium/Base.class +0 -0
- data/lib/studium/java/studium/studium/Constants.class +0 -0
- data/lib/studium/java/studium/studium/EnsureThatTheLogDirectoryExists.class +0 -0
- data/lib/studium/java/studium/studium/Mkdir.class +0 -0
- data/lib/studium/java/studium/studium/OpenLastExamQuestionurlLinkViaTheBrowser.class +0 -0
- data/lib/studium/java/studium/studium/ReturnNQuestionsSolvedInTotal.class +0 -0
- data/lib/studium/java/studium/studium/Solved.class +0 -0
- data/lib/studium/java/studium/studium/Test.class +0 -0
- data/lib/studium/jobs/jobs.rb +80 -0
- data/lib/studium/logging/README.md +2 -0
- data/lib/studium/logging/ensure_that_the_log_directory_exists.rb +58 -0
- data/lib/studium/logging/html_log_directory.rb +42 -0
- data/lib/studium/logging/log_directory.rb +112 -0
- data/lib/studium/logging/store_last_question_asked_into_file.rb +138 -0
- data/lib/studium/parsers/README.md +2 -0
- data/lib/studium/parsers/custom_exam_results_parser.rb +209 -0
- data/lib/studium/parsers/parse_remote_lecture.rb +331 -0
- data/lib/studium/project/project.rb +88 -0
- data/lib/studium/requires/common_popular_requires.rb +37 -0
- data/lib/studium/requires/commonly_used_requires.rb +14 -0
- data/lib/studium/requires/require_class_exams_solved.rb +7 -0
- data/lib/studium/requires/require_ects_scripts.rb +27 -0
- data/lib/studium/requires/require_encoding.rb +7 -0
- data/lib/studium/requires/require_the_check_and_sanitize_files.rb +31 -0
- data/lib/studium/requires/require_the_curricula_files.rb +28 -0
- data/lib/studium/requires/require_the_exam_question_class.rb +7 -0
- data/lib/studium/requires/require_the_exams_files.rb +46 -0
- data/lib/studium/requires/require_the_logging_files.rb +23 -0
- data/lib/studium/requires/require_the_parsers.rb +28 -0
- data/lib/studium/requires/require_the_studium_constants.rb +7 -0
- data/lib/studium/requires/require_the_studium_project.rb +72 -0
- data/lib/studium/requires/require_the_toplevel_methods.rb +27 -0
- data/lib/studium/requires/require_the_utility_scripts.rb +34 -0
- data/lib/studium/requires/require_upcoming_exams.rb +7 -0
- data/lib/studium/requires/require_yaml.rb +7 -0
- data/lib/studium/requires/return_remote_homepage_of_this_lecture.rb +7 -0
- data/lib/studium/requires/with_GUI.rb +13 -0
- data/lib/studium/requires/www_mode.rb +17 -0
- data/lib/studium/statistics/README.md +4 -0
- data/lib/studium/statistics/best_exam_months.rb +92 -0
- data/lib/studium/statistics/curriculum_comparer/curriculum_comparer.rb +423 -0
- data/lib/studium/statistics/determine_exam_statistics_from_this_file.rb +142 -0
- data/lib/studium/statistics/exam_topics_that_are_about_to_be_completed.rb +117 -0
- data/lib/studium/statistics/max_stats.rb +169 -0
- data/lib/studium/statistics/new_questions_per_year.rb +147 -0
- data/lib/studium/statistics/report_how_many_ects_points_per_curriculum_were_completed.rb +167 -0
- data/lib/studium/statistics/report_how_many_exam_questions_were_answered.rb +473 -0
- data/lib/studium/statistics/show_exam_statistics.rb +75 -0
- data/lib/studium/statistics/show_which_courses_are_in_a_bachelor_or_master_curriculum_respectively.rb +104 -0
- data/lib/studium/statistics/top_stats.rb +126 -0
- data/lib/studium/toplevel_methods/e_and_esystem.rb +34 -0
- data/lib/studium/toplevel_methods/find_exam_topic_and_exam_title.rb +3986 -0
- data/lib/studium/toplevel_methods/install_the_project_on_the_given_hostsystem.rb +31 -0
- data/lib/studium/toplevel_methods/return_remote_homepage_of_this_lecture.rb +11611 -0
- data/lib/studium/toplevel_methods/return_remote_moodle_link_of_this_lecture.rb +2405 -0
- data/lib/studium/toplevel_methods/roebe.rb +16 -0
- data/lib/studium/toplevel_methods/runmode.rb +45 -0
- data/lib/studium/toplevel_methods/toplevel_methods.rb +7295 -0
- data/lib/studium/universities_in_austria/README.md +2 -0
- data/lib/studium/universities_in_austria/boku/README.md +4 -0
- data/lib/studium/universities_in_austria/boku/boku_/303/266ffnungszeiten.rb +28 -0
- data/lib/studium/universities_in_austria/boku/show_three_pillars_of_these_lectures.rb +110 -0
- data/lib/studium/universities_in_austria/boku/three_pillars.rb +237 -0
- data/lib/studium/universities_in_austria/tu_vienna/README.md +6 -0
- data/lib/studium/universities_in_austria/tu_vienna/tu_ferien.rb +42 -0
- data/lib/studium/universities_in_austria/tu_vienna/tu_/303/266ffnungszeiten.rb +34 -0
- data/lib/studium/university_course/university_course.rb +409 -0
- data/lib/studium/utility_scripts/attribute_lectures_to_university/attribute_lectures_to_university.rb +375 -0
- data/lib/studium/utility_scripts/audio_stats.rb +171 -0
- data/lib/studium/utility_scripts/auto_stud/auto_stud.rb +252 -0
- data/lib/studium/utility_scripts/auto_stud/constants.rb +18 -0
- data/lib/studium/utility_scripts/auto_stud/initialize.rb +23 -0
- data/lib/studium/utility_scripts/auto_stud/misc.rb +18 -0
- data/lib/studium/utility_scripts/autogeneration/autogeneration.rb +158 -0
- data/lib/studium/utility_scripts/autopurge_this_lecture_date.rb +100 -0
- data/lib/studium/utility_scripts/average_grade_of_this_curriculum.rb +153 -0
- data/lib/studium/utility_scripts/blocked_courses.rb +146 -0
- data/lib/studium/utility_scripts/calendar/README.md +2 -0
- data/lib/studium/utility_scripts/calendar/calendar.rb +251 -0
- data/lib/studium/utility_scripts/calendar/misc.rb +35 -0
- data/lib/studium/utility_scripts/check_description_of_these_lectures.rb +221 -0
- data/lib/studium/utility_scripts/course_registrations/course_registrations.rb +98 -0
- data/lib/studium/utility_scripts/courses/courses.rb +177 -0
- data/lib/studium/utility_scripts/create/README.md +2 -0
- data/lib/studium/utility_scripts/create/webpage_of_university.rb +129 -0
- data/lib/studium/utility_scripts/create/webpage_of_university_BOKU.rb +61 -0
- data/lib/studium/utility_scripts/create/webpage_of_university_TU.rb +60 -0
- data/lib/studium/utility_scripts/create/webpage_of_university_UniWien.rb +60 -0
- data/lib/studium/utility_scripts/create_database/create_database.rb +126 -0
- data/lib/studium/utility_scripts/current_lectures_belonging_to_both_bachelor_and_master_curriculum.rb +113 -0
- data/lib/studium/utility_scripts/currently_participating_in_these_lectures/currently_participating_in_these_lectures.rb +104 -0
- data/lib/studium/utility_scripts/display_lecture_url/display_lecture_url.rb +176 -0
- data/lib/studium/utility_scripts/expand_time_range/expand_time_range.rb +521 -0
- data/lib/studium/utility_scripts/finished_exams_at_this_university/finished_exams_at_this_university.rb +171 -0
- data/lib/studium/utility_scripts/foreign_language_percentage/constants.rb +23 -0
- data/lib/studium/utility_scripts/foreign_language_percentage/foreign_language_percentage.rb +149 -0
- data/lib/studium/utility_scripts/foreign_language_percentage/help.rb +31 -0
- data/lib/studium/utility_scripts/foreign_language_percentage/initialize.rb +25 -0
- data/lib/studium/utility_scripts/foreign_language_percentage/menu.rb +158 -0
- data/lib/studium/utility_scripts/foreign_language_percentage/report.rb +62 -0
- data/lib/studium/utility_scripts/foreign_language_percentage/reset.rb +50 -0
- data/lib/studium/utility_scripts/foreign_language_percentage/run.rb +19 -0
- data/lib/studium/utility_scripts/generate_spreadsheet/generate_spreadsheet.rb +353 -0
- data/lib/studium/utility_scripts/generate_spreadsheet/misc.rb +144 -0
- data/lib/studium/utility_scripts/holidays/holidays.rb +154 -0
- data/lib/studium/utility_scripts/homepage_of_these_courses/homepage_of_these_courses.rb +125 -0
- data/lib/studium/utility_scripts/lectures_attributed_to_universities/lectures_attributed_to_universities.rb +336 -0
- data/lib/studium/utility_scripts/lva_dates_of_the_important_courses.rb +111 -0
- data/lib/studium/utility_scripts/lva_nummer/lva_nummer.rb +427 -0
- data/lib/studium/utility_scripts/mandatory_lectures_in_this_month/mandatory_lectures_in_this_month.rb +316 -0
- data/lib/studium/utility_scripts/moodle/moodle.rb +214 -0
- data/lib/studium/utility_scripts/name_of_this_lva_id/name_of_this_lva_id.rb +110 -0
- data/lib/studium/utility_scripts/new_stud.rb +324 -0
- data/lib/studium/utility_scripts/next_week/next_week.rb +103 -0
- data/lib/studium/utility_scripts/not_yet_registered/not_yet_registered.rb +120 -0
- data/lib/studium/utility_scripts/open_last_exam_question_url_link_via_the_browser.rb +76 -0
- data/lib/studium/utility_scripts/passed_ects_per_year/passed_ects_per_year.rb +313 -0
- data/lib/studium/utility_scripts/passed_pr/303/274fungsimmanente_courses/passed_pr/303/274fungsimmanente_courses.rb +181 -0
- data/lib/studium/utility_scripts/pdf/README.md +2 -0
- data/lib/studium/utility_scripts/pdf/create_pdf_file_for_this_exam_topic.rb +352 -0
- data/lib/studium/utility_scripts/pdf/hexapdf_support.rb +50 -0
- data/lib/studium/utility_scripts/preparatory_meetings/preparatory_meetings.rb +317 -0
- data/lib/studium/utility_scripts/priority/priority.rb +164 -0
- data/lib/studium/utility_scripts/priority_points/priority_points.rb +261 -0
- data/lib/studium/utility_scripts/publish_my_exams/publish_my_exams.rb +174 -0
- data/lib/studium/utility_scripts/regexes/README.md +1 -0
- data/lib/studium/utility_scripts/regexes/generate_regex.rb +314 -0
- data/lib/studium/utility_scripts/regexes/generate_regexes_for_the_available_moodle_links.rb +55 -0
- data/lib/studium/utility_scripts/regexes/generate_regexes_for_the_registered_lectures.rb +48 -0
- data/lib/studium/utility_scripts/report_outdated_timetable_entries/report_outdated_timetable_entries.rb +142 -0
- 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
- data/lib/studium/utility_scripts/resolve_practical_courses_date_conflicts/individual_resolve_practical_courses_date_conflicts.rb +254 -0
- data/lib/studium/utility_scripts/resolve_practical_courses_date_conflicts/resolve_practical_courses_date_conflicts.rb +265 -0
- data/lib/studium/utility_scripts/scrape_remote_university_url.rb +138 -0
- data/lib/studium/utility_scripts/semester_schedule_creator/semester_container.rb +144 -0
- data/lib/studium/utility_scripts/semester_schedule_creator/semester_schedule_creator.rb +373 -0
- data/lib/studium/utility_scripts/semesterplaner/semesterplaner.rb +311 -0
- data/lib/studium/utility_scripts/set_aliases_based_on_this_file.rb +96 -0
- data/lib/studium/utility_scripts/show_all_passed_master_lectures/show_all_passed_master_lectures.rb +126 -0
- data/lib/studium/utility_scripts/show_conflicting_lva_lectures/show_conflicting_lva_lectures.rb +1385 -0
- data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/constants.rb +23 -0
- data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/menu.rb +63 -0
- data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/reset.rb +33 -0
- data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/run.rb +50 -0
- data/lib/studium/utility_scripts/show_descriptions_of_lectures_belonging_to_this_module/show_descriptions_of_lectures_belonging_to_this_module.rb +145 -0
- data/lib/studium/utility_scripts/show_lecturers/show_lecturers.rb +147 -0
- data/lib/studium/utility_scripts/show_lectures/show_lectures.rb +906 -0
- data/lib/studium/utility_scripts/show_lectures_fitting_to_this_language/show_lectures_fitting_to_this_language.rb +121 -0
- data/lib/studium/utility_scripts/show_lectures_fitting_to_this_theme/show_lectures_fitting_to_this_theme.rb +105 -0
- data/lib/studium/utility_scripts/show_lectures_on_the_commandline/show_lectures_on_the_commandline.rb +3160 -0
- data/lib/studium/utility_scripts/show_lectures_on_this_day/show_lectures_on_this_day.rb +150 -0
- data/lib/studium/utility_scripts/show_lva_dates_of_this_lecture/show_lva_dates_of_this_lecture.rb +182 -0
- data/lib/studium/utility_scripts/show_mixed_bachelor_master_courses/show_mixed_bachelor_master_courses.rb +92 -0
- data/lib/studium/utility_scripts/show_outdated_lva_dates/show_outdated_lva_dates.rb +214 -0
- data/lib/studium/utility_scripts/show_passed_exams_having_this_grade/show_passed_exams_having_this_grade.rb +91 -0
- data/lib/studium/utility_scripts/show_solved_english_lectures/show_solved_english_lectures.rb +139 -0
- data/lib/studium/utility_scripts/steop/README.md +4 -0
- data/lib/studium/utility_scripts/steop/show_all_steop_lectures.rb +93 -0
- data/lib/studium/utility_scripts/steop/steop_lectures_in_this_curriculum.rb +284 -0
- data/lib/studium/utility_scripts/steop/steop_lva_dates.rb +119 -0
- data/lib/studium/utility_scripts/studienkennzahl/studienkennzahl.rb +116 -0
- data/lib/studium/utility_scripts/studium_skeleton/studium_skeleton.rb +241 -0
- data/lib/studium/utility_scripts/stundenplan.rb +600 -0
- data/lib/studium/utility_scripts/sync_studium_relevant_entries_one_level_downwards.rb +217 -0
- data/lib/studium/utility_scripts/ufind/ufind.rb +106 -0
- data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/constants.rb +26 -0
- data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/run.rb +20 -0
- data/lib/studium/utility_scripts/upcoming_mandatory_presence_courses/upcoming_mandatory_presence_courses.rb +187 -0
- data/lib/studium/utility_scripts/video_lecture_downloader/video_lecture_downloader.rb +107 -0
- data/lib/studium/utility_scripts/week_parser/constants.rb +23 -0
- data/lib/studium/utility_scripts/week_parser/help.rb +32 -0
- data/lib/studium/utility_scripts/week_parser/menu.rb +59 -0
- data/lib/studium/utility_scripts/week_parser/misc.rb +373 -0
- data/lib/studium/utility_scripts/week_parser/reset.rb +65 -0
- data/lib/studium/utility_scripts/week_parser/run.rb +18 -0
- data/lib/studium/utility_scripts/week_parser/show.rb +236 -0
- data/lib/studium/utility_scripts/week_parser/week_parser.rb +49 -0
- data/lib/studium/utility_scripts/weekday_parser.rb +155 -0
- data/lib/studium/utility_scripts/weekly_schedule.rb +198 -0
- data/lib/studium/utility_scripts/wochenplanung/wochenplanung.rb +267 -0
- data/lib/studium/version/version.rb +46 -0
- data/lib/studium/www/exams/exams.cgi +54 -0
- data/lib/studium/www/fast_ask_exam_question/fast_ask_exam_question.cgi +156 -0
- data/lib/studium/www/handle_curricula/handle_curricula.cgi +154 -0
- data/lib/studium/www/next_generation_exam_question_trainer/next_generation_exam_question_trainer.cgi +112 -0
- data/lib/studium/www/next_generation_exam_question_trainer/solved.cgi +26 -0
- data/lib/studium/www/sinatra/app.rb +231 -0
- data/lib/studium/www/sinatra/curriculum_displayer/curriculum_displayer.rb +162 -0
- data/lib/studium/www/sinatra/misc.rb +115 -0
- data/lib/studium/www/statistics/statistics.cgi +82 -0
- data/lib/studium/www/upcoming_exams/upcoming_exams.cgi +36 -0
- data/lib/studium/yaml/ad_hoc_trainer/README.md +2 -0
- data/lib/studium/yaml/ad_hoc_trainer/exam_topics.md +22 -0
- data/lib/studium/yaml/allowed_themes_for_courses/allowed_themes_for_courses.yml +348 -0
- data/lib/studium/yaml/array_allowed_entries_for_the_file_lecture_information/array_allowed_entries_for_the_file_lecture_information.yml +71 -0
- data/lib/studium/yaml/available_exam_topics/available_exam_topics.yml +234 -0
- data/lib/studium/yaml/backlog_of_exams.yml +37 -0
- data/lib/studium/yaml/colours/custom_colours.yml +50 -0
- data/lib/studium/yaml/colours/use_colours.yml +1 -0
- data/lib/studium/yaml/current_exams.yml +30 -0
- data/lib/studium/yaml/curricula/README.md +39 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_agrarwissenschaften_033255.yml +147 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_basisblock_033630.yml +71 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_botanik_033630.yml +100 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_ecology_033630.yml +74 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_mikrobiologie_und_genetik_033630.yml +122 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_molekulare_biologie_033630.yml +106 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_biologie_zoologie_033630.yml +87 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_chemie_033662.yml +165 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_dummy_curriculum.yml +182 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_elektrotechnik_und_informationstechnik_033235.yml +13 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_forstwirtschaft_033225.yml +115 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_informatik_033521.yml +134 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_ktww_033231.yml +84 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_lmbt_033217.yml +121 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_medizinische_informatik_033533.yml +283 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_molekularbiologie_033665.yml +95 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_nutrition_science_033638.yml +119 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_pharmazie_033305.yml +170 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_technische_chemie_033290.yml +131 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_technische_informatik_033535.yml +23 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_ubrm_033227.yml +142 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_verfahrenstechnik_033273.yml +167 -0
- data/lib/studium/yaml/curricula/bachelor/bachelor_wirtschaftsinformatik_033526.yml +29 -0
- data/lib/studium/yaml/curricula/experimental/bachelor_informatik_in_den_lebenswissenschaften.yml +137 -0
- data/lib/studium/yaml/curricula/individual/bachelor_formale_logik.yml +88 -0
- data/lib/studium/yaml/curricula/individual/bachelor_informatik_und_molekulare_biologie.yml +1161 -0
- data/lib/studium/yaml/curricula/individual/bachelor_vector_based_strategies_in_life_sciences_molecular_medicine_and_biotechnology.yml +1157 -0
- data/lib/studium/yaml/curricula/individual/master_bioinformatics_and_nanobiotechnology_in_molecular_medicine.yml +306 -0
- data/lib/studium/yaml/curricula/individual/master_vector_based_strategies_in_life_sciences_molecular_medicine_and_biotechnology.yml +741 -0
- data/lib/studium/yaml/curricula/master/master_bioinformatik_066875.yml +75 -0
- data/lib/studium/yaml/curricula/master/master_biologie_molekulare_mikrobiologie_mikrobielle_oekologie_und_immunbiologie_066830.yml +78 -0
- data/lib/studium/yaml/curricula/master/master_biologische_chemie_066863.yml +66 -0
- data/lib/studium/yaml/curricula/master/master_dummy_curriculum.yml +197 -0
- data/lib/studium/yaml/curricula/master/master_genetik_und_entwicklungsbiologie_066877.yml +89 -0
- data/lib/studium/yaml/curricula/master/master_lmbt_066418.yml +112 -0
- data/lib/studium/yaml/curricula/master/master_molecular_biology_066865.yml +72 -0
- data/lib/studium/yaml/curricula/master/master_molekulare_biologie_066834.yml +151 -0
- data/lib/studium/yaml/curricula/master/master_pharmazie_066605.yml +176 -0
- data/lib/studium/yaml/curricula/master/master_technische_chemie_066490.yml +123 -0
- data/lib/studium/yaml/curricula/outdated/master_bioinformatics_and_molecular_biotechnology_including_aspects_from_molecular_medicine.yml +438 -0
- data/lib/studium/yaml/curricula/outdated/master_food_science_and_plant_biotechnology.yml +31 -0
- data/lib/studium/yaml/curricula.yml +562 -0
- data/lib/studium/yaml/daily_questions_solved/daily_questions_solved.yml +2019 -0
- data/lib/studium/yaml/daily_questions_solved/daily_questions_solved.yml~ +1983 -0
- data/lib/studium/yaml/default_delay.yml +4 -0
- data/lib/studium/yaml/default_encoding.yml +1 -0
- data/lib/studium/yaml/directory_to_the_exam_topics.yml +0 -0
- data/lib/studium/yaml/editor.yml +1 -0
- data/lib/studium/yaml/exams/next_exams_to_do.md +9 -0
- data/lib/studium/yaml/file_for_exam_questions.yml +1 -0
- data/lib/studium/yaml/german/README.md +2 -0
- data/lib/studium/yaml/german/german_to_english_month_names.yml +16 -0
- data/lib/studium/yaml/grouped_themes/grouped_themes.yml +264 -0
- data/lib/studium/yaml/holidays/holidays.yml +201 -0
- data/lib/studium/yaml/important_exams.yml +286 -0
- data/lib/studium/yaml/inscription_dates_of_universities.yml +60 -0
- data/lib/studium/yaml/lecture_aliases.yml +138 -0
- data/lib/studium/yaml/lecture_information/lecture_information.yml +66145 -0
- data/lib/studium/yaml/log_dir.yml +1 -0
- data/lib/studium/yaml/main_topic/main_topic.yml +11 -0
- data/lib/studium/yaml/max_stats/max_stats.yml +262 -0
- data/lib/studium/yaml/max_stats.yml +263 -0
- data/lib/studium/yaml/meta_themes +1 -0
- data/lib/studium/yaml/mitbelegung/README.md +4 -0
- data/lib/studium/yaml/mitbelegung/mitbelegung.yml +21 -0
- data/lib/studium/yaml/mitteilungsbl/303/244tter/mitteilungsbl/303/244tter.yml +363 -0
- data/lib/studium/yaml/n_total_questions.yml +1 -0
- data/lib/studium/yaml/rename_konsole_tab.yml +1 -0
- data/lib/studium/yaml/roebe/ad_hoc_exam_topics.md +19 -0
- data/lib/studium/yaml/roebe/sommersemester_2024_opportunities.md +441 -0
- data/lib/studium/yaml/semester_planner/README.md +4 -0
- data/lib/studium/yaml/semester_planner/semester_planner.yml +189 -0
- data/lib/studium/yaml/show_topic.yml +1 -0
- data/lib/studium/yaml/statistics/lecture_information.yml +1 -0
- data/lib/studium/yaml/statistics/max_stats.yml +239 -0
- data/lib/studium/yaml/statistics/statistics.yml +77 -0
- data/lib/studium/yaml/week/01_monday.yml +25 -0
- data/lib/studium/yaml/week/02_tuesday.yml +68 -0
- data/lib/studium/yaml/week/03_wednesday.yml +63 -0
- data/lib/studium/yaml/week/04_thursday.yml +20 -0
- data/lib/studium/yaml/week/05_friday.yml +31 -0
- data/lib/studium/yaml/week/06_saturday.yml +16 -0
- data/lib/studium/yaml/week/07_sunday.yml +0 -0
- data/lib/studium/yaml/week/README.md +10 -0
- data/lib/studium.rb +5 -0
- data/studium.gemspec +82 -0
- data/test/testing_colourized_question_and_answer.rb +18 -0
- data/test/testing_studium.rb +244 -0
- data/test/testing_studium_base_class.rb +31 -0
- data/test/testing_the_file_lecture_information.rb +18 -0
- data/test/testing_time_component.rb +29 -0
- 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 <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 <slateblue> this will be in
|
1766
|
+
slateblue colour. The latter variant may become shorter in the
|
1767
|
+
future, such as <slateblue >foo</> 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
|
+
|