Po více než roce vývoje od vydání verze 5.40 byla vydána nová stabilní verze 5.42 programovacího jazyka Perl (Wikipedie). Do vývoje se zapojilo 64 vývojářů. Změněno bylo přibližně 280 tisíc řádků v 1 500 souborech. Přehled novinek a změn v podrobném seznamu.
Byla vydána nová stabilní verze 7.5 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 138. Přehled novinek i s náhledy v příspěvku na blogu.
Sniffnet je multiplatformní aplikace pro sledování internetového provozu. Ke stažení pro Windows, macOS i Linux. Jedná se o open source software. Zdrojové kódy v programovacím jazyce Rust jsou k dispozici na GitHubu. Vývoj je finančně podporován NLnet Foundation.
Byl vydán Debian Installer Trixie RC 2, tj. druhá RC verze instalátoru Debianu 13 s kódovým názvem Trixie.
Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za červen (YouTube).
Libreboot (Wikipedie) – svobodný firmware nahrazující proprietární BIOSy, distribuce Corebootu s pravidly pro proprietární bloby – byl vydán ve verzi 25.06 "Luminous Lemon". Přidána byla podpora desek Acer Q45T-AM a Dell Precision T1700 SFF a MT. Současně byl ve verzi 25.06 "Onerous Olive" vydán také Canoeboot, tj. fork Librebootu s ještě přísnějšími pravidly.
Licence GNU GPLv3 o víkendu oslavila 18 let. Oficiálně vyšla 29. června 2007. Při té příležitosti Richard E. Fontana a Bradley M. Kuhn restartovali, oživili a znovu spustili projekt Copyleft-Next s cílem prodiskutovat a navrhnout novou licenci.
Svobodný nemocniční informační systém GNU Health Hospital Information System (HIS) (Wikipedie) byl vydán ve verzi 5.0 (Mastodon).
Open source mapová a navigační aplikace OsmAnd (OpenStreetMap Automated Navigation Directions, Wikipedie, GitHub) oslavila 15 let.
Vývojář Spytihněv, autor počítačové hry Hrot (Wikipedie, ProtonDB), pracuje na nové hře Brno Transit. Jedná se o příběhový psychologický horor o strojvedoucím v zácviku, uvězněném v nejzatuchlejším metru východně od všeho, na čem záleží. Vydání je plánováno na čtvrté čtvrtletí letošního roku.
Pracujem na jednom projekte, v ktorom sa spúšťa jeden malý program veľký počet krát (rádovo stovky) a pri každom spustení potrebuje vygenerovať unikátne meno výstupného súboru a odovzdať ho inému procesu. Utilitka môže bežať na viacerých klientoch naraz a výstupný súbor bude vznikať na serveri v čase, keď už utilitka nebeží.
Čo s tým? Jednoduché. Meno sa generuje podľa aktuálneho času s presnosťou na milisekundu, prihodí sa meno klienta, celé sa to zabalí do mutexu a v mutexe sa počká dlhšie ako 1ms. Akurát, že to nefunguje. Teda väčšinou to funguje. Na mojom stroji je to OK. Na testovacom stroji 700 km ďaleko tiež. Ale na nejakom stroji kdesi v XY v necelom percente pripadov to vygeneruje opakujuci sa identifikator.
Záhada.
Tu je kód:
void UniqueName(char *buffer)
{
struct timeval tv;
sem_t *mutex=NULL;
char hostname[100];
if (!gethostname(hostname,sizeof(hostname)))
{
mutex=sem_open("MyMutex",O_CREAT,0700,1);
if (mutex!=SEM_FAILED)
{
sem_wait(mutex);
gettimeofday(&tv,NULL);
sprintf(buffer,"%s-%d-%d\n",hostname,tv.tv_sec,tv.tv_usec);
usleep(5000);
sem_post(mutex);
sem_close(mutex);
}
else
perror("sem_open");
}
}
Pôvodný kód je na Win32, takže som sa povŕtal v tom, ako sa to robi na Linuxe. Treba mať jadro 2.6, glibc s NPTL, bežiaci udev a permission na /dev/shm. V originále sú ošetrené všetky systémové volania a žiadne nezlyhá.
No a pointa? Mám teóriu, prečo ten kód zlyháva. A je taká bláznivá, že som chcel počuť najprv nápady od vás. Tak čo si myslíte?
Tiskni
Sdílej:
Utilitka môže bežať na viacerých klientoch naraz a výstupný súbor bude vznikať na serveri v čase, keď už utilitka nebeží.Aha, to jsem prve pochopil špatně. Teď už to nechápu vůbec. Jméno generuješ na klientech?
To by som tú pamäť musel zdieľať medzi viacerými strojmi v sieti.To přece ne, stačí, když ty klienty očísluješ. Čísla jim buď může přiřazovat server nebo jde-li o uzavřený systém, tak je můžeš očíslovat předem.
Ale na nejakom stroji kdesi v XY v necelom percente pripadov to vygeneruje opakujuci sa identifikator.A nebeží na tom stroji náhodou nejaký démon na synchronizáciu času alebo niečo také?
Stavite na predpokladech, ze
A obecne spat v kriticke sekci je opravdu zavrzenihodne.
> Kazdy stroj ma jedinecny hostname To je, podľa mňa, celkom pravdivý predpoklad. Keby neplatil, tak by to spôsobovalo kadejaké iné problémy, ktoré by sa prejavili skôr. Môžem mať v NT doméne dva stroje s rovnakým hostname?Stroj moze mat iny hostname a iny zaznam v dns (inac sa vidi on sam a inac ho vidia ostatne stroje).
Cas na na kazdem stroji bezi jednim smeremTento predpoklad je skutočne mylný, pretože ten stroj, kde problém vzniká si synchronizuje čas (čo je defaultne vypnuté) a mňa to jednoducho nenapadlo.
Rozumne implementace synchronizatoru casu meni cas postupnym spomalovanim nebo zrychlovanim a to na urovni jadra, takze by se cas nemel vracet zpet. (Tj. spoustet kazdou hodinu ntpdate je spatne, ale nechat bezet ntpd je dobre.)
usleep() se muze ovlivnovat s jinymi funkcemi, napr. s alarm()emTo je pravda, ale o tom, že dôjde k alarm()-u, by som sa dozvedel z toho, že sa urobí jeho obsluha.
Nejde jen o alarm(), tech nebezpecnych funkci je mnohem vice. Ale predpokladam, ze vite, co delate.
Rozumne implementace synchronizatoru casu meni cas postupnym spomalovanim nebo zrychlovanim a to na urovni jadra, takze by se cas nemel vracet zpet. (Tj. spoustet kazdou hodinu ntpdate je spatne, ale nechat bezet ntpd je dobre.)Což platí jen v případě, že je čas posunutý jen málo. Pokud se čas od přesného času liší třeba o několik dní, není možné jej synchronizovat tak, že několik týdnů poběží hodiny rychleji/pomaleji.
jak moc se mi ty hodiny v HW vlastne predbihaji?Některé dost
ntpd
nemá moc rádo výpadky internetu – dokáže v takovém případě přestat synchronizovat čas, ale démon běží dál, takže na první pohled nic nepoznáte. Jednou mi tahle kombinace způsobila to, že na serveru, který s ejinak normálně synchronizoval, běžel démon ntpd
, ale čas byl posunut o několik měsíců…
while ! (ntpdate ser.ver); do true; done
dd if=/dev/urandom bs=256 count=1 2>/dev/null | md5sum --binary| cut -d ' ' -f 1