{"id":217,"date":"2020-10-27T11:16:37","date_gmt":"2020-10-27T10:16:37","guid":{"rendered":"https:\/\/mtymejczyk.wordpress.com\/?p=217"},"modified":"2024-02-15T14:11:01","modified_gmt":"2024-02-15T14:11:01","slug":"program-dla-dziekana","status":"publish","type":"post","link":"https:\/\/tymejczyk.net\/index.php\/2020\/10\/27\/program-dla-dziekana\/","title":{"rendered":"Program dla Dziekana"},"content":{"rendered":"\n<p><strong>K<\/strong>ilka tygodni temu uczniowie na zaj\u0119ciach u dziekana spytali sie czy b\u0119d\u0105 dodatkowe punkty na egzaminie za obecno\u015b\u0107 na wyk\u0142adach. W poprzednich semestrach na innych przedmiotach tego prowadz\u0105cego zawsze tak by\u0142o, dawa\u0142o to ~10-15% za &#8222;darmo&#8221; przy pe\u0142nych obecno\u015bciach.<br>Dziekan jest osob\u0105 bardzo zabiegan\u0105 i stwierdzi\u0142, \u017ce nie ma czasu na liczenie obecno\u015bci, dlatego te\u017c poprosi\u0142 student\u00f3w, \u017ce w ramach ich inicjatywy kto\u015b z nich przygotowa\u0142by tego typu program kt\u00f3ry dodatkowo liczy\u0142by jeszcze ile minut dana osoba by\u0142a na spotkaniu.<\/p>\n\n\n\n<p>Na platformie Teams, z kt\u00f3rej korzystamy do zaj\u0119\u0107, jest opcja eksportu listy wej\u015b\u0107 i wyj\u015b\u0107 z danego spotkania.<\/p>\n\n\n\n<p> Przyk\u0142adowy wygl\u0105d takiego pliku: (oczywi\u015bcie z zachowaniem RODO \ud83d\ude09 )<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"607\" height=\"209\" src=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-2.png?w=607\" alt=\"\" class=\"wp-image-226\" srcset=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-2.png 607w, https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-2-300x103.png 300w\" sizes=\"auto, (max-width: 607px) 100vw, 607px\" \/><figcaption class=\"wp-element-caption\">example-meet.csv<\/figcaption><\/figure>\n\n\n\n<p>Jak wida\u0107 Teams zapisuje nawet tymczasowe roz\u0142\u0105czenia. I ka\u017cda osoba mo\u017ce mie\u0107 takich dowoln\u0105 ilo\u015b\u0107 w trakcie trwania spotkania z przypadku np. s\u0142abego \u0142\u0105cza.<br><br>Pierwsz\u0105 rzecza jak\u0105 chcia\u0142em zrobi\u0107 by\u0142o zmapowanie kom\u00f3rek na obiekty. U\u017cy\u0142em do tego biblioteki <a href=\"https:\/\/joshclose.github.io\/CsvHelper\/\">CsvHelper<\/a>, kt\u00f3ra bardzo ale to bardzo uprasza ca\u0142y proces \ud83d\ude00 <\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/MichaelStett\/2831618f7c48d2cabea860253fde82c5.js\"><\/script>\n\n<script src=\"https:\/\/gist.github.com\/MichaelStett\/a04692bb0f263b2ffba41a32e9f905ff.js\"><\/script>\n\n\n\n<p>Dodatkowo zrobi\u0142em prost\u0105 walidacje czy u\u017cytkownik podaje poprawne dane na wej\u015bcie programu, kt\u00f3rej kodu nie ma potrzeby pokazywa\u0107. <br>Ostatecznie przyk\u0142ad wywo\u0142ania programo b\u0119dzie wygl\u0105da\u0142 tak: <br><em>program.exe example-meet.csv Attendance.csv 2137 10:10:00 11:45:00<\/em><\/p>\n\n\n\n<p>Przypisa\u0142em argsy odpowiednio do zmiennych:<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/MichaelStett\/586d5e1e0e6dc0ccc3b229571d4302ab.js\"><\/script>\n\n\n\n<p>Dodatkowo u\u017cywam zmiennych <em>lectureStartDateTime <\/em>i <em>lectureEndDateTime<\/em>, kt\u00f3re s\u0105 przesuni\u0119te odpowiednio o -5 i 10 minut aby rozszerzy\u0107 pule minut wyk\u0142adu wymaganych do zaliczenia obecno\u015bci.<br>Ten czas jest przechowywany w <em>timeForAttendanceToCount<\/em> gdzie, dla zaj\u0119\u0107 w godzinach<br>np.  <em>10:10:00 11:45:00<\/em> czas w jaki musimy przebywac na spotkaniu aby mie\u0107 zaliczon\u0105 obecno\u015b\u0107 wyniesie<em> 110 * .75 = <strong>82.5<\/strong><\/em> pamietaj\u0105c o wcze\u015bniej dodanych wide\u0142kach (-5, 10) minut.<br><br>Teraz zajmiemy sie stworzeniem prostej struktury, tu s\u0142ownik, kt\u00f3ra b\u0119dzie przechowywa\u0107 jako klucz imiona uczesnik\u00f3w a jak warto\u015b\u0107 liczby godzin w jakich byli na spotkaniu.<br>Nast\u0119pnie sumujemy ten czas kt\u00f3ry mie\u015bci si\u0119 w wy\u017cej oznaczonych ramach.<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/MichaelStett\/baf861da84ead34745048447b067ae62.js\"><\/script>\n\n\n\n<p>Teraz w zmiennej <em>usersWithMinutes <\/em>mamy uczestnik\u00f3w wraz z wykazem ile minut byli obecni na zaj\u0119ciach. <\/p>\n\n\n\n<p>Nast\u0119pnym krokiem bedzie spisanie warto\u015bci z poprzedniej listy kt\u00f3r\u0105 podawali\u015bmy jako drugi parametr. Do tego r\u00f3wnie\u017c u\u017cyjemy opcji mapowania kolumn na pola.<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/MichaelStett\/8cda38ad9434486702824c525041a3e6.js\"><\/script>\n\n\n\n<p>Teraz musimy napisa\u0107 metode czytaj\u0105c\u0105 dane z pliku.<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/MichaelStett\/f80717124a3955152fb4d3d254672977.js\"><\/script>\n\n\n\n<p>I j\u0105 u\u017cy\u0107 a nastepnie zaj\u0105\u0107 si\u0119 logik\u0105 odpowiedzaln\u0105 za sprawdzenie czy liczba minut z wyk\u0142adu jest wystarczaj\u0105ca \u017ceby dosta\u0107 obecno\u015b\u0107.<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/MichaelStett\/ba431d79ffc6846918b1917b374dfb0d.js\"><\/script>\n\n\n\n<p>Nast\u0119pnym krokiem jest znalezienie w poprzednim pliku osoby o tym samym imieniu i nazwisku co bie\u017c\u0105cy, je\u015bli wystapi\u0142 to sprawdzamy jego poprzednie obecno\u015bci oraz d\u0142ugo\u015b\u0107 czasu obecno\u015bci na poprzednich wyk\u0142adach.<br>Ostatecznie tworzymy nowy obiekt typu <em>RecordOutput<\/em> sprawdzaj\u0105c czy obecno\u015b\u0107 powinna by\u0107 policzona oraz dopisuj\u0105c nowe dane do trzeciej kolumny.<br>Je\u015bli osoba by\u0142a nie obecna na danym wyk\u0142adzie warto\u015bci dla niej sa przepisywane.<br><br>I na sam koniec musimy wpisa\u0107 te dane do nowego pliku.<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/MichaelStett\/6b13eaa90290ffcb4f0f116937526e4c.js\"><\/script>\n\n\n\n<p>Dziekan poprosi\u0142 r\u00f3wnie\u017c \u017ceby plik by\u0142 posortowany wg nazwisk rosn\u0105co dlatego w pierwszej linijce <em>Select<\/em> wcze\u015bniej odwr\u00f3cili\u015bmy kolejno\u015b\u0107 wyraz\u00f3w w napisie.<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/MichaelStett\/c7198d6e553079565e963db39039ddb9.js\"><\/script>\n\n\n\n<p>Teraz przetestujmy dzia\u0142anie:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"505\" height=\"47\" src=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-3.png?w=505\" alt=\"\" class=\"wp-image-250\" style=\"width:591px;height:55px\" srcset=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-3.png 505w, https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-3-300x28.png 300w\" sizes=\"auto, (max-width: 505px) 100vw, 505px\" \/><figcaption class=\"wp-element-caption\">git bash &#8211; u\u017cycie programu<\/figcaption><\/figure>\n\n\n\n<p>Wynikiem powy\u017cszego programu jest plik z zawarto\u015bci\u0105:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"391\" height=\"125\" src=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-4.png?w=391\" alt=\"\" class=\"wp-image-252\" style=\"width:429px;height:137px\" srcset=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-4.png 391w, https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-4-300x96.png 300w\" sizes=\"auto, (max-width: 391px) 100vw, 391px\" \/><figcaption class=\"wp-element-caption\">Attendance-2020-10-27_09-33-27.csv.<\/figcaption><\/figure>\n\n\n\n<p>Zmodyfikuje teraz plik <em>example-meet.csv<\/em> \u017ceby zasymulowac now\u0105 liste:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"406\" height=\"169\" src=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-6.png?w=406\" alt=\"\" class=\"wp-image-256\" srcset=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-6.png 406w, https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-6-300x125.png 300w\" sizes=\"auto, (max-width: 406px) 100vw, 406px\" \/><figcaption class=\"wp-element-caption\"><em>example-meet.csv<\/em> &#8211; zmodyfikowane<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"557\" height=\"63\" src=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-8.png?w=557\" alt=\"\" class=\"wp-image-260\" style=\"width:557px;height:63px\" srcset=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-8.png 557w, https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-8-300x34.png 300w\" sizes=\"auto, (max-width: 557px) 100vw, 557px\" \/><figcaption class=\"wp-element-caption\">git bash &#8211; u\u017cycie programu<\/figcaption><\/figure>\n\n\n\n<p>Wynik:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"445\" height=\"149\" src=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-7.png?w=445\" alt=\"\" class=\"wp-image-258\" srcset=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-7.png 445w, https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/10\/image-7-300x100.png 300w\" sizes=\"auto, (max-width: 445px) 100vw, 445px\" \/><figcaption class=\"wp-element-caption\">Attendance-2020-10-27_09-53-59.csv<\/figcaption><\/figure>\n\n\n\n<p>Jak widzimy jedna osoba z poprzedniej listy by\u0142a nieobecna wi\u0119c nie zosta\u0142a dla niej dodana warto\u015b\u0107 w trzeciej kolumnie, natomiast osoba kt\u00f3rej nie by\u0142o na li\u015bcie wcze\u015bniej zosta\u0142a dodana.<br><\/p>\n\n\n\n<p>Dzi\u0119kuje za Twoj\u0105 uwag\u0119 \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kilka tygodni temu uczniowie na zaj\u0119ciach u dziekana spytali sie czy b\u0119d\u0105 dodatkowe punkty na egzaminie za obecno\u015b\u0107 na wyk\u0142adach. W poprzednich semestrach na innych przedmiotach tego prowadz\u0105cego zawsze tak by\u0142o, dawa\u0142o to ~10-15% za &#8222;darmo&#8221; przy pe\u0142nych obecno\u015bciach.Dziekan jest osob\u0105 bardzo zabiegan\u0105 i stwierdzi\u0142, \u017ce nie ma czasu na liczenie obecno\u015bci, dlatego te\u017c poprosi\u0142 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":266,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-217","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programming"],"_links":{"self":[{"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/posts\/217","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/comments?post=217"}],"version-history":[{"count":4,"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/posts\/217\/revisions"}],"predecessor-version":[{"id":360,"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/posts\/217\/revisions\/360"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/media\/266"}],"wp:attachment":[{"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/media?parent=217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/categories?post=217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/tags?post=217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}