Francouzský prezident Emmanuel Macron chce zakázat přístup na sociální sítě pro děti do 15 let. Francie podle něj tento krok udělá sama do několika měsíců, i pokud se na něm neshodnou další státy Evropské unie. Reaguje tak na úterní vraždu vychovatelky, kterou ve východofrancouzském městě Nogent pobodal 14letý mladík. Jednotlivé sociální sítě podle něj mají možnost věk ověřit a vymáhat zákaz pomocí systémů na rozpoznávání tváří.
Byl aktualizován seznam 500 nejvýkonnějších superpočítačů na světě TOP500. Nejvýkonnějším superpočítačem zůstává El Capitan od HPE (Cray) s výkonem 1,742 exaFLOPS. Druhý Frontier má výkon 1,353 exaFLOPS. Třetí Aurora má výkon 1,012 exaFLOPS. Nejvýkonnější český počítač C24 klesl na 165 místo. Karolina, GPU partition klesla na 195. místo a Karolina, CPU partition na 421. místo. Další přehledy a statistiky na stránkách projektu.
Oficiálně byl vydán Android 16. Detaily na blogu a stránkách věnovaných vývojářům.
Byla vydána nová verze 14.3 svobodného unixového operačního systému FreeBSD. Podrobný přehled novinek v poznámkách k vydání.
CSIRT.CZ upozorňuje, že na základě rozhodnutí federálního soudu ve Spojených státech budou veškeré konverzace uživatelů s ChatGPT uchovávány. Včetně těch smazaných.
Ač semestr ve škole právě končí, bastlíři ze studentského klubu Silicon Hill neodpočívají a opět se jako každý měsíc hlásí s pravidelným bastlířským setkáním Virtuální Bastlírna, kde si můžete s ostatními techniky popovídat jako u piva o novinkách, o elektronice, softwaru, vědě, technice obecně, ale také o bizarních tématech, která se za poslední měsíc na internetu vyskytla.
Z novinek za zmínku stojí Maker Faire, kde Pájeníčko předvedlo … více »Na WWDC25 byl představen balíček Containerization a nástroj container pro spouštění linuxových kontejnerů na macOS. Jedná se o open source software pod licencí Apache 2.0 napsaný v programovacím jazyce Swift.
Do 16. června do 19:00 běží na Steamu přehlídka nadcházejících her Festival Steam Next | červen 2025 doplněná demoverzemi, přenosy a dalšími aktivitami. Demoverze lze hrát zdarma.
Apple na své vývojářské konferenci WWDC25 (Worldwide Developers Conference, keynote) představil řadu novinek: designový materiál Liquid Glass, iOS 26, iPadOS 26, macOS Tahoe 26, watchOS 26, visionOS 26, tvOS 26, nové funkce Apple Intelligence, …
Organizátoři konference LinuxDays 2025, jež proběhne o víkendu 4. a 5. října 2025 v Praze na FIT ČVUT, spustili přihlašování přednášek (do 31. srpna) a sběr námětů na zlepšení.
Odkazy
V poslednej dobe sa dosť často hovorí o javascripte na serveri (node.js
). Jeho súčasťou je non blocking IO čo sa využíva prevažne v realtimových webových aplikáciách. V tomto blogu sa pozrieme na pomerne starú alternatívu k non blocking io - kooperatívny multitasking.
V dnešnom príklade budeme chcieť vypísať výrok dňa. Ten bude uložený v memcache. Aby to nebolo tak jednoduché pre každý deň bude citát v samostatnej premennej a jej názov nájdeme taktiež v memcache v premennej msg_var
.
var http = require('http'); var Memcached = require('memcached'); var memcached = new Memcached('127.0.0.1:11211'); // pripojenie na memcache // Nastavenie premenných, toto by mal riešiť externý skript memcached.set("msg_var", "vyrok_2013-07-12") memcached.set("vyrok_2013-07-12", "vyrok pre dnesok") http.createServer(function (req, res) { // IO operácia - načítanie msg var memcached.get('msg_var', function(err, msg_var) { // callback po načítaní msg_var if (err) { sys.puts('Error!'); return; } // IO operácia - načítanie konkrétneho výroku memcached.get(msg_var, function(err, msg) { if (err) { sys.puts('Error!'); return; } res.writeHead(200, {'Content-Type': 'text/plain'}); res.end(msg); // výpis výroku }); }); }).listen(8888, '127.0.0.1');
Pre spustenie musíme nainštalovať memcache (npm install memcached
), spustiť memcached server (pomocou obľúbeného init systému) a spustiť node server (node server.js
).
from gevent.wsgi import WSGIServer import umemcache as memcache mc = memcache.Client('127.0.0.1:11211') mc.connect() mc.set("msg_var", "vyrok_2013-07-12") mc.set("vyrok_2013-07-12", "vyrok pre dnesok") def application(environ, start_response): start_response("200 OK", [('Content-Type', 'text/plain')]) msg_var = mc.get("msg_var")[0] msg = mc.get(msg_var)[0] yield msg WSGIServer(('127.0.0.1', 8888), application, log=None).serve_forever()
Pre spustenie musíme nainštalovať závislosti umemcache
a gevent
(pomocou easy_install alebo pip) Server sa spustí príkazom python server.py
.
Pre oba servery bolo vypálených 10 000 požiadaviek pričom paralelne bolo udržiavaných 100 spojení (ab2 -n 10000 -c 100 127.0.0.1:8888
).
Node:
Concurrency Level: 100 Time taken for tests: 16.881 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 1180000 bytes HTML transferred: 170000 bytes Requests per second: 592.38 [#/sec] (mean) Time per request: 168.811 [ms] (mean) Time per request: 1.688 [ms] (mean, across all concurrent requests) Transfer rate: 68.26 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 3.1 0 46 Processing: 20 168 65.8 179 413 Waiting: 19 168 65.7 179 412 Total: 65 168 65.9 179 413 Percentage of the requests served within a certain time (ms) 50% 179 66% 204 75% 216 80% 220 90% 254 95% 281 98% 303 99% 389 100% 413 (longest request)
gevent:
Concurrency Level: 100 Time taken for tests: 19.746 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 1180000 bytes HTML transferred: 170000 bytes Requests per second: 506.42 [#/sec] (mean) Time per request: 197.464 [ms] (mean) Time per request: 1.975 [ms] (mean, across all concurrent requests) Transfer rate: 58.36 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 1.6 0 24 Processing: 16 196 13.9 197 219 Waiting: 15 196 13.9 197 219 Total: 32 196 12.7 198 219 Percentage of the requests served within a certain time (ms) 50% 198 66% 201 75% 203 80% 204 90% 207 95% 209 98% 211 99% 212 100% 219 (longest request)
Kód s non blocking io je prakticky ekvivalentný python kódu s geventmi. Rozdiel v počte riadkov a zložitosti kódu je úplne jasný. Preto pre node.js vznikajú knižnice, ktoré umožňujú zapisovať trochu rozumnejšie (async).
Rozdiel vo výkone bol pomerne malý - 592.38 requestov za sekundu v prípade node.js proti 506.42 v pythone s knižnicou gevent. Rozdiel by bol o niečo menší ak by bol použitý python s jit (pypy) a v prípade použitia memcache knižnice s lepšou implementáciou socketov bol by python o kúsok vpredu.
Non blocking io neprináša oproti kooperatívnemu multitaskingu žiadne výhody, len výrazne zneprehľadnenie kódu. Na druhej strane python nemá knižnice pripravené na to, aby plne využívali kooperatívny multitasking. To je jediný rozumný dôvod prečo zvoliť nodejs pred pythonom.
Tiskni
Sdílej:
V mojom príklade memcache používa skutočne blokujúce sockety (nepoužíl som gevent.monkey.patch_socket).
Pojem non blocking io sa používa hlavne v súvislosti s node.js ale je to prakticky to isté, čo som ukázal v python kóde (to je ekvivalentné s kooperatívnym multitaskingom kde sa pri volaní i/o prepne úloha a obnoví sa znovu až keď budú buffery patrične naplnené). Rozdiel je len v tom, že v pythone sa to isté dá zapísať bez callbackov.
Cieľom blogu bolo ukázať, že to, čo je dnes akože novinka tu bolo dávno pred tým, len sa to volalo trochu inak.
Prepínanie úlohy pri I/O sa dá dosiahnuť rôznymi spôsobmi - systémové vlákna, nejaké pseudovlákna v interpretovanom jazyku, alebo eventmi riadený loop s callbackmi ako v node.js. Rozdiel je len v spôsobe zápisu (ktorý je v prípade node.js podstatne zložitejší).
Samozreme teraz nehovorím, že rýchlo prepíšme všetko do pythonu pretože tam oproti node.js nie sú knižnice na neblokujúce volania pripravené. Príkladom môže byť napr. memcache, ktorý by pri nahradení socketu neblokujúcimi socketmi spôsobil odpojenie od memcached servera. Súčasné riešenie ktoré som ukázal pracuje s memcache korektne tj. požiadavka, odpoveď, požiadavka, odpoveď
na tom istom sockete. Ak by som povolil prerušenie dvojíc požiadavka - odpoveď dostal by som na tom istom sockete požiadavka, požiadavka ... chyba
. Tu je potrebné teda použiť špeciálnu memcache knižnicu, ktorá obaľuje dvojice do synchronizačných primitív a aby to celé nefungovalo ako úzke hrdlo treba vytvoriť niekoľko spojení a používať connection poll.
Pojem non blocking io sa používa hlavne v súvislosti s node.jsTen pojem se používal v době, kdy o node.js ještě nikdo neslyšel.
Áno, akurát v poslednej dobe sa z toho stal taký buzzword. Ako som písal všetko tu už bolo dávno, neblokujúce IO sa riešili väčšinou vláknami a to že v nodejs funguje tak, že IO operácie okamžite vracajú undefined a vrtátená hodnota IO sa podstrčí callbacku je len obídenie obmedzení nodejs, žiadna zázračná technológia. To isté som ukázal v inom jazyku (konkrétne python, ale kľudne som mohol použiť čokoľvek iné, čo pozná vlákna) ale s jednoduchším a kratším kódom (vďaka tomu, že sa nemusia používať callbacky). Takže podčiarknuté a sčítané - node.js sa oplatí jedine vďaka knižniciam, ale samotný komfort pri písaní a čitateľnosť kódu tu netreba hľadať.
Áno, akurát v poslednej dobe sa z toho stal taký buzzword.Buzzwordy si nech pro personalistky a management.
Ako som písal všetko tu už bolo dávno, neblokujúce IO sa riešili väčšinou vláknamiVzhledem k tomu, že neblokující IO, tak jak je známý z POSIXových a podobných systémů, je v podstatě jedinou možností, jak se vláknům (či procesům) vyhnout, zní mi tato věta dost komicky. Jediné, co ti můžu doporučit je přestat se snažit o vysvětlení a něco si o tom přečíst. Třeba na anglickou wikipedii ta tvoje buzzwordová verze ještě nedošla. Já jsem srozuměn s tím, že za „neblokující“ se dá označit ledacos včetně toho vláknování, ale pod „neblokujícím IO“ si představuju neblokující vstupní a výstupní operace. A to jsou kupodivu IO operace, které neblokují proces (vlákno), které je spustilo. Alternativou k tomu je spuštění blokující operace v samostatném vlákně. Jenže to musí být skutečné vlákno operačního systému, jinak nelze vůbec samostatně ze strany OS zablokovat. Takže pokud se jedná o nějaká kooperativní falešná vlákna na úrovni bajtkódových instrukcí (tak jsem to ze zápisku pochopil), tak za tím bude mezivrstva, která používá právě neblokující IO operace.
V prípade pythonu je to skutočne kooperatívny multitasking a na asynchrónne operácie sa používa knižnica libev (v tomto konkrétnom prípade, neplatí všeobecne).
> [1, 2, 3, 10].sort() [1, 10, 2, 3]Tohle jinde nenajdeš
import vibe.d; import memcache; shared static this() { auto memcache = new Memcache("127.0.0.1:11211"); memcache.set("msg_var", "vyrok_2013-07-12"); memcache.set("vyrok_2013-07-12", "vyrok pre dnesok"); auto settings = new HTTPServerSettings; settings.bindAddresses = ["::1", "127.0.0.1"]; settings.port = 8080; listenHTTP(settings, (HTTPServerRequest req, HTTPServerResponse res) { auto msg_var = memcache.get("msg_var"); auto msg = memcache.get(msg_var); res.writeBody(msg, "text/plain"); }); }BTW. je to skoro 2x rychlejsi nez node.js