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