Vasárnapi MÁV időállitásos hiba, programozáshoz nem értő embernek elmagyarázva
Posted by shakashakabi@reddit | programmingHungary | View on Reddit | 62 comments
Sziasztok!
Nem értek a programozáshoz, azonban érdekel, hogy hogyan történhetett meg a vasárnapi MÁV-os hiba.
Ez az idő adat valamilyen központi adatbázisból, vagy rendszerből érkezik, ami alapján automatikusan kellene frissülnie az alkalmazás rendszerében is, és ez valahogy elcsúszott? Vagy erre van valamilyen más megoldás?
Elnézést, ha hülye a kérdés, csak kiváncsi voltam rá, hogy ez egy komplexebb probléma, esetleg egyszerűen kezelhető-e.(ha már egy több milliárdos fejlesztésű alkalmazásról van szó)
salkopi@reddit
Sokféleképpen bele lehet szaladni, aki már néhány éve programozott biztosan találkozott ilyen jellegű tünettel.
A legnaivabb hiba csak simán a helyi időban számolnak mindent, kivonták az érkezés idopontjabol az indulást és nem vették figyelembe hogy változik az UTC offset. De bele lehet keveredni könnyen úgy is, hogyha próbálták kezelni.
arnyekbocs@reddit
Ezt csak egyféleképpen lehet elkövetni, hogy nem veszed figyelembe az időzónát. Az hogy ezt el lehet rosszul meg nagyon rosszul is követni az már lényegtelen.
salkopi@reddit
Ez sem feltétlenül igaz, mert nem kell tudnod a konkrét időzónát, ha UTC offsettel együtt tárolod mindkét időbélyeget; szóval volt egy indulási UTC +2 meg egy érkezési UTC +1, az hogy ez konkrétan CET és CEST között váltott és melyik nap tök mindegy, az utc offsetet figyelembe vevő matek helyes lesz.
arnyekbocs@reddit
De hát ez az időzóna, az teljesen lényegtelen hogy offsettel, rövidítéssel, tz kóddal vagy GPS koordinátával határozod meg. Vagy nem tudom mire gondolsz.
salkopi@reddit
Időzóna != Offset. Az időzóna azt mondja meg, hogy ahol azt használják, az év adott időpontjában mi az offset. Lehet két helyen ugyanaz az offset és más az időzóna.
arnyekbocs@reddit
Miben más?
Szerintem ezt gondold végig még egyszer.
salkopi@reddit
Ez volt köztünk a félreértés, hogy az időzónát a "CEST" vagy a "Europe/Budapest" tz database időzónákra használjuk.
arnyekbocs@reddit
Mondom, te nem tudsz elvonatkoztatni a jelölésektől. Időzóna az ahol ugyanannyi a helyi idő. Ha veszel egy adott időt, akkor ez meghatároz egy zónát.
salkopi@reddit
Például Cairoban most ugyanannyi idő van mint nálunk (utc +2), de ők a máshogy állítják az órát, 2 hét múlva előrébb lesznek. (Budapest CEST, Cairo EEST)
arnyekbocs@reddit
De ez nem számít, mert az adott pillanatban tudod, hogy hol ír le egy zónát. Időzóna = idő + zóna
salkopi@reddit
Azt kell megérteni, hogy az offset egy adott pillanatban érvényes egy adott helyre, az időzóna meg az egész évet írja le.
arnyekbocs@reddit
De pont ez a lényeg, hogy nem írja le az egész évet.
salkopi@reddit
Szóval nem kell itt azt tudnod hogy Budapest időzonában volt végig, a lényeg hogy elindult valamikor, az az időpont offsettel együtt lett elmentve (még csak nem is kell hogy az az offset legyen ami akkor volt érvényes budapesten, mentheti utc-ben is), és megérkezett valamikor ami szintén offsettel együtt van lekérdezve (barmilyennel). A matek helyes lesz. Ennek ellentéteként írtam hogy "helyi" időben kezelhettek mindent, ami pongyola, de arra értettem hogy offset nélkül (vö. DateTime és DateTimeOffset)
arnyekbocs@reddit
A UTC a nullás offset. Szerintem te kevered a szöveges formátumot a koncepciókkal.
salkopi@reddit
Nope, csak nem érted a különbséget az offset és az időzóna között. Az offset önmagában kevesebb információt hordoz, mert csak egy adott pillanatban igaz egy adott helyen.
arnyekbocs@reddit
De ha én megmondom neked, mennyi az idő Honoluluban, akkor tudod, hogy nálunk mennyi az idő, teljesen univerzális, ugyanúgy igaz.
One-Throat-38@reddit
alap hogy utc-ben tárolunk mindent nem?
Equivalent-Role-6130@reddit
Mit tárolsz UTC-ben? A scheduling egy komplex probléma.
Letárolod minden vonat minden állomásra való érkezését és indulását, minden napra az elkövetkezendő X évre? Ki fogja ezt neked letárolni hibamentesen, úgy hogy ne legyen hasonló hiba? Hogyan updateled ha egy szakaszon 1 percel megnövekedik a menetidő?
arnyekbocs@reddit
Nincs ilyen szintű scheduling a mávnál, maximum a menetrend tervezésnél. Vannak a fővonalak, és ahhoz igazodik a többi vonal, ott pedig az állunk és várunk módszerrel van kiigazítva. Túlgondolod.
halkszavu@reddit
Menetrend esetén nem. A múltbeli érkezések/indulások esetén van értelme az UTC-nek, de amíg csak tervezett a menet, addig nem, mivel napot nem biztos, hogy tudsz hozzárendelni. A fenti hibánál a hozzárendelés csúszott el.
Ildicow@reddit
Az alapelv szerintem az, hogy ahol idővel számolunk, és nem csak egy indikátort mutatunk a DBA-nak vagy logba írunk, ott epoch time / time() / gettimeofday() / monotonic clock kell, nem string time.
Egy szerver default localtime-ja nem kellene, hogy bármit számítson egy production alkalmazásnál.
Különböző rendszerek között stringként utaztatni az időt általában csak hibák forrása. Lehet bármilyen modern ISO szabvány string, előbb-utóbb lesz olyan komponens, ami rosszul parseolja, timezone-t rosszul kezeli, DST-t elrontja stb. Timestampot kell küldeni, stringet csak a UI-nak.
Különösen akkor lesz ebből nagy probléma, amikor bekerül egy 3rd party vagy legacy rendszer a láncba, amire nincs ráhatásunk, és utólag kell workaroundokkal és hackekkel kezelni a különböző time formatokat és timezone hibákat.
nagy-eggplant-joska@reddit
Time - Time in the HH:MM:SS format (H:MM:SS is also accepted). The time is measured from "noon minus 12h" of the service day (effectively midnight except for days on which daylight savings time changes occur). For times occurring after midnight on the service day, enter the time as a value greater than 24:00:00 in HH:MM:SS.
Example: 14:30:00 for 2:30PM or 25:35:00 for 1:35AM on the next day
kivéve, amikor nem 🙃
iambackit@reddit
Tasty-Rent7138@reddit
Nem a helyi idő szokott a baj lenni, hanem az időzóna hiánya. Bármilyen időzónában lehet azért már kényelmesen kivonni, összeadni, offsetelni.
Cool-Ad552@reddit
def more_than_hour_ago_dst(ts: datetime) -> bool: now = datetime.now() return (now.hour - ts.hour) > 1
Ez évente két órán keresztül hazudhat, amúgy ha még nem szoptad be óraátállításnál akkor simán átsiklik felette a figyelmed.
sztomi@reddit
Ezzel aztán remekül elmagyaráztad egy programozáshoz nem értő embernek.
daytimedarkness@reddit
Egyébként ez egész évben hazudhat nem? Pl ha 14:40 helyett 15:50kor érkezett be a vonat
Zeenu29@reddit
Sok megoldás van rá, de nem tudhatjuk hogy mi ment félre vagy hogy van megoldva náluk és miért jött ez elő.
infuriating_question@reddit
Arra tippelek, hogy a már közlekedő vonatoknál úgy csúszott be a hiba, hogy mondjuk 2-kor indult egy vonat aminek tegyük fel 5-re kellett volna megérkeznie csak közben az 5-ből 6 lett.
Azaz a szerelvény hiába csak 2 órát volt úton, 3-nak számolta a rendszer.
Halal0szto@reddit
Ha a menetrendben 5 van érkezésnek, akkor a 6os érkezés az késés, nincs mese. A menetrendet kell módosítaniuk.
charlie_hun@reddit
Az oszinel ilyenkor szoktak egy orat megallitani a vonatot, hogy menetrend szerint erkezzen.
hungarian_astronaut@reddit
Most meg lejtőről kellett volna indítani.
Avdonin_Naomi@reddit
Van egy olyan érzésem, hogy static const lett az a currentTime(). De ne legyen igazam..
Apart_Economist_7955@reddit
de hisz az idő állandó 🤓
strongfeld@reddit
Azok vonatok is késtek amelyek óraátállítás után indultak vagy csak azok amelyek előtte?
Flat_Cartographer_25@reddit
Nekem az a legerősebb tippem, hogy írtak egy saját dátum beolvasó modult és nem a programozási nyelv által biztosítottat használták.
halkszavu@reddit
Én úgy tudom, hogy COBOL-ban van megírva az alap rendszer. Pár éve dolgoznak C-re való áttérésben, de nem tudom, hogy hogyan haladnak.
Normal-Record2439@reddit
El lehetett adni jó áron:)
Bledike@reddit
Én is pont ezen gondolkodtam, hogy azért ehhez tenni kell, hogy rossz legyen :)
ern0plus4@reddit
Úgy számolta ki a menetidőt, hogy Érkezési_Idő mínusz Indulási_Idő, ami valahogyan egy órával hosszabb lett, mint a tervezett menetidő.
Pl. este 11-kor indul, 1-kor van a tervezett érkezés... de... csak 2-kor érkezett meg. Pedig valójában csak 2 órát ment, nem késett, de ha kiszámoljuk 11 és 2 között 3 óra a különbség.
Dependent_Fishing_28@reddit
Komolyan azt hiszitek, hogy nem kézzel állítják be ezt évente kétszer a terkep-ido.php-ben???
Tsi19K@reddit
Szerintem a következő történt.
A programozó a késés mértékét az indulási idő és az érkezési idő különbségéből számolta ki. Mivel az átállításkor az idő előrecsúszott egy órát, és ő valószínűleg a helyi idővel számolt, ezért egy órával hosszabb menetidő jött ki. Tehát az 1:30-kor induló 45 perces menetidővel bíró vonat valójában késett egy órát, mert 2:15 helyett 3:15-kor érkezett meg a számítás szerint.
A UTC és egyéb véleményekkel nem értek egyet, szerintem a megoldás az lett volna, hogy nem helyi időkkel, időzónákkal kellett volna dolgozni, hanem az EPOC-hal, ami egy adott dátum óta eltelt másodperceket tartalmazza hasonlóan az Excel dátum-idő kezeléséhez. Ezt független értékként ismerem, és úgy tudom, a rendszerek általában a helyi időt ennek időzóna+időszámítás korrekciójával állítják elő.
Ezt használva szerintem nem állt volna elő a hiba.
Megjegyzem, hogy bár körülöttem többen állítják, hogy ez egy alapvető hiba volt, én inkább sajnálatos esetnek tartom, de nem csodálkozom, hogy kifelejtették a tesztesetek közül. Egyébként meg az előállt hiba kárt okozott, ha tényleg kompenzálták a jegyek árát, de hát van ilyen, ettől nem dőlt össze a világ. Nagyobb problémát jelent most a negatív reputáció, amire végképp nem volt szüksége sem a MÁV-nak, sem a kormányzatnak. Nem tudom őket sajnálni, de a kérdés szempontjából ez másodlagos.
sisisisi1997@reddit
Egyébként mindenben teljesen igazad van, de egy dologhoz hozzá szeretnék szólni: a Unix Time UTC-ben van, és azt a tulajdonságát, hogy megakadályozta volna ezt a hibát nem onnan nyeri, hogy egy nyers szám reprezentáció a komplex emberi olvasásra szánt reprezentáció helyett, hanem onnan, hogy UTC-ben van.
charlie_hun@reddit
Akkor is kesett volna, mert tenylegesen akkor is csak 3:15-re tud beerni.
charlie_hun@reddit
Node, menetrend szerint kestek a vonatok, nem? Osszel nem gond, akkor van plusz egy ora.
Node tavasszal nem tudnak hiperugorni, es menetrend szerintihez kepest egy oraval kesobb fognak beerni. Ami a menetrend szemszogebol keses.
Nem is biztos, hogy irt ora/datum kezelesi problema van, hanem menetrendi.
wombatstuffs@reddit
Alkalmatlan Business analyst, alkalmatlan PO, nem túl okos programozók, stb. A MÁV ezt definiálta, ők tudták hogy erre oda kell figyelni, csak a másik oldalon nem fogták fel. Aki 7/24 üzemre már egyszer is írt valamit, az valahogy megpróbálja ezt kezelni. Mondok egy egyszerű példát: jönnek a gyárba be/ki a kamionok, éjjel-nappal. Nem álldogálhatnak egy órát a kapunál, csak azért mert valami félremegy daytime-saving nél.
Terrible_Bug_388@reddit
De most komolyan ennyire már ne kényeztetessük el a népet, hogy a visszatérítés nem ér rá másnap reggel, mikor a Pisti megnézi? Na persze, végülis közpénz, ki nem szarja le?
Amazing_Amoeba_2784@reddit
Azt olvastam: ki nem szorja el
gabor_legrady@reddit
Üdv, én programozó vagyok, és nincs nagyon jó "egységes kezelés", bevallom, megszenvedek az időzónákkal.
Viszont minden olyan rendszernél, ahol a tevékenység egy időzónán belül történik igazából az a jó megközelítés, hogy az összes komponensben azt használják.
Mivel a konkrét rendszert nem ismerem, a legnagyobb esélye annak van, hogy legalább két rendszer komponensnél ezt sikerült eltérően beállítani.
Bevallom, egy ilyen fontos projekt esetén ezt illett volna tesztelni, ezért fájó ez a probléma.
Dolgoztam olyan helyen is, ahol mivel tudták, hogy nincsenek az óraátállításra felkészülve betettek egy két órás szünetet - ez a MÁV esetén nem fér bele.
szornyu@reddit
Bennem csak az merült fel, hogy ha egy közepesen komplex feladatot ennyire pongyolán implementáltak, milyenek lehetnek a komplexebb folyamatok, döntési fák, algoritmusok.
Attól félek, hogy hamarosan kiderül, csupa ilyet hagyományoz ránk a NER-informatika. https://hu.wikipedia.org/wiki/A_T%C3%B6r%C3%B6k
Halal0szto@reddit
Kellett volna arra a napra speciális menetrendet csináljanak, hiszen falióra szerint nézve tényleg egy órával hosszabb lett a menetidő.
atleta@reddit
Hogy mi okozta a hibát, azt kívülről csak tippelni lehetne. Hogy hogy lehet elkerülni, arra viszont van egy rettentő egyszerű válasz (legalábbis, ha az alapoktól így építed fel a rendszert): mindenhol, ahol időt (időpontot) kezel a rendszer, UTC-t és idozonat kell használni a helyi idő helyett.
A UTC az pongyolan fogalmazva a Greenwich-i idő, az, amihez képest a többi idozonat számolják, ideértve a nyári időszámítást is. Ezert aztán nem érinti az átállás. Ott, ahol (és amikor) meg kell jelenteni egy időpontot (pl. a menetrendet a felhasznalonak), at kell váltani a megfelelő idozonara. Ha bárhogy máshogy okoskodik az ember, akkor idővel valami ilyesmibe fut bele. (Maguknak az idozonaknak, teli-nyari időszámításnak a kezelése nem trivialis, tele van kivételekkel, meg változik is időnként, de erre vannak kész, előre megírt, mások által karbantartott eszközök.)
AvailableTangerine29@reddit
Szerintem profi programozóként is könnyű ilyen hibát elkövetni. De ilyen esetekre szoktak beépíteni biztonsági hálót, hogyha a rendszer rövid időn belül akar kezdeményezni több mint 100 utalást, akkor azt jóvá kelljen hagyni
In-Whisky@reddit
A MÁV-nál? Szerintem folyamatos az utalás...
Jakabxmarci@reddit
Szia!
A legpontosabb időt a GPS műholdak szolgáltatják - ez mikorszekundumig pontos.
Erre általában nincs szükség, az okos programozó egy mások által megírt időkezelő szoftvert/ könyvtárt használ az idő másodpercre pontos betartására. Ennek a feladata az ilyesmi esetek kezelése, a MÁV fejlesztőinek meg csak okosan kellene használni ezt a funkciót. Mérnökileg nagyon bonyolult feladat egyébként a pontos idő betartása a sok időzóna, szökőév, óraátállítás miatt, és könnyű elrontani.
szornyu@reddit
Felcsútollak, mert az állításod helyes, a GPS mūholdak szolgáltatják a legpontosabb idõt, de mint fentebb írta valaki, a földi atomórák generálják hozzá az adatot.
ilor144@reddit
A földön lévő atomórák a legpontosabbak
Plenty_Whole6578@reddit
Mondjuk elég kibaszott sokat elmond a MÁV programozóiról hogy ilyen alapszintű problémába még nem futottak bele ebben a domainben. Nyilván nem várható el tőlük hogy időt, inzervallumokat meg ilyeneket kezeljenek.
/s
the-cat-7000@reddit
Miért kellene a MÁV-nál időket kezelni? Majd ha odaért a vonat, akkor ott lesz.
StayExciting2895@reddit
Management oldalrol fognam meg a problemat, mert biztos mindenki belefutott mar ilyen hibaba a programozoi palyaja soran. Volt problema az idoallitassal osszel is, csak az nem ekkora gondot okozott.
Ha tudnak rola, hogy ennyire kritikus ez a pontja a rendszernek/rendszereknek(ha jol ertem amugy tobb kulonallo rendszer osszehangolva mukodik a kliensek alatt, kitudja melyik hasalt el) es volt mar gond, akkor nem letolt gatyaval, keresztbefont ujjakkal varom a csodat(vagy eppen nyugodtan aludva), hogy hatha siman megy minden.
Ket embernek ugyeletben kellett vonlna figyelni az atallast, aztan ha latja a gebaszt akkor kb egy 10 perces fixxel meg azelott megoldja a problemat, hogy elindulnanak az elso vonatok vagy a jegyvasarlas.
Nagy valoszinuseggel senki nem is vett volna eszre semmit ebbol hajnalban.
Rich-Worker1868@reddit
Amikor én elbasztam zöldfülű koromban, akkor az volt a gond, hogy azt hittem, hogy aktuális idő +24 óra az pontosan egy nap múlva lesz. Mint rájöttem, óraállításkor nem így van.
Itt olvashatsz a dátumok programozásával kapcsolatos lehetséges problémákról:
https://github.com/kdeldycke/awesome-falsehood?tab=readme-ov-file#dates-and-time
Blackmore1030@reddit
A részleteket nem ismerjük, mert nem látunk bele a kódba vagy a szerverbeállításba, de valószínűleg valahol fixen be volt égetve egy téli időszámítás szerinti időzóna.