Přesně před 34 lety, 25. srpna 1991, oznámil Linus Benedict Torvalds v diskusní skupině comp.os.minix, že vyvíjí (svobodný) operační systém (jako koníček, nebude tak velký a profesionální jako GNU) pro klony 386 (486), že začal v dubnu a během několika měsíců by mohl mít něco použitelného.
86Box, tj. emulátor retro počítačů založených na x86, byl vydán ve verzi 5.0. S integrovaným správcem VM. Na GitHubu jsou vedle zdrojových kódů ke stažení také připravené balíčky ve formátu AppImage.
Vláda Spojených států získala desetiprocentní podíl v americkém výrobci čipů Intel. Oznámili to podle agentur americký prezident Donald Trump a ministr obchodu Howard Lutnick. Společnost Intel uvedla, že výměnou za desetiprocentní podíl obdrží státní dotace v hodnotě 8,9 miliardy dolarů (zhruba 186 miliard Kč). Částka podle Intelu zahrnuje dříve přislíbené subvence 5,7 miliardy dolarů z programu CHIPS na podporu výroby čipů v USA,
… více »Organizace Apache Software Foundation (ASF) vydala verzi 27 integrovaného vývojového prostředí a vývojové platformy napsané v Javě NetBeans (Wikipedie). Přehled novinek na GitHubu. Instalovat lze také ze Snapcraftu a Flathubu.
Knihovna FFmpeg byla vydána ve verzi 8.0 „Huffman“. Přibyla mj. podpora hardwarově akcelerovaného kódování s využitím API Vulcan, viz seznam změn.
Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB) vydal Zprávu o stavu kybernetické bezpečnosti ČR za rok 2024 (pdf). V loňském roce NÚKIB evidoval dosud nejvíce kybernetických bezpečnostních incidentů s celkovým počtem 268. Oproti roku 2023 se však jedná pouze o drobný nárůst a závažnost dopadů evidovaných incidentů klesá již třetím rokem v řadě. V minulém roce NÚKIB evidoval pouze jeden velmi významný incident a významných incidentů bylo zaznamenáno 18, což oproti roku 2023 představuje pokles o více než polovinu.
Byl publikován aktuální přehled vývoje renderovacího jádra webového prohlížeče Servo (Wikipedie). Servo mimo jiné nově zvládne animované obrázky APNG a WebP.
Na chytré telefony a počítačové tablety v Rusku bude od začátku příštího měsíce povinné předinstalovávat státem podporovanou komunikační aplikaci MAX, která konkuruje aplikaci WhatsApp americké společnosti Meta Platforms. Oznámila to dnes ruská vláda. Ta by podle kritiků mohla aplikaci MAX používat ke sledování uživatelů. Ruská státní média obvinění ze špehování pomocí aplikace MAX popírají. Tvrdí, že MAX má méně oprávnění k přístupu k údajům o uživatelích než konkurenční aplikace WhatsApp a Telegram.
Společnost PINE64 stojící za telefony PinePhone nebo notebooky Pinebook publikovala na svém blogu srpnový souhrn novinek. Kvůli nedostatečnému zájmu byla ukončena výroba telefonů PinePhone Pro.
Po pěti měsících vývoje byla vydána nová verze 0.15.1 programovacího jazyka Zig (GitHub, Wikipedie). Verze 0.15.0 byla přeskočena. Přispělo 162 vývojářů. Přehled novinek v poznámkách k vydání.
function random(min, max) { var num = Math.floor(Math.random() * (max - min + 1)) + min; return num; }Já jsem si usmyslel, že když ji budu volat v rozmezí čísel -3 až 3 (tedy random(-3, 3)), nechci jako výsledek dostat nulu. Tak jsem funkci upravil následovně:
function random(min, max) { var num = Math.floor(Math.random() * (max - min + 1)) + min; if (num == 0) {random(min, max)} else {return num}; }Jenže jsem zjistil, že funkce kromě celých čísel v zadaném rozsahu občas vrací i undefined. Tak jsem hledal čím to a našel jsem diskuse, zda je vhodné psát return do bloku else. Z nich jsem sice nepochopil, proč dostávám jako výslednou hodnotu někdy undefined, ale stejně jsem funkci upravil na
function random(min, max) { var num = Math.floor(Math.random() * (max - min + 1)) + min; if (num == 0) random(min, max); return num; }Výsledkem této úpravy bylo, že undefined se už mezi výslednými hodnotami funkce nevyskytovalo, zato se mezi ostatními čísly vyskytovala nula; čili jako by podmínka ve funkci nebyla. Už ani nevím, proč mě napadlo udělat ještě jednu úpravu, a to
var num; function random(min, max) { num = Math.floor(Math.random() * (max - min + 1)) + min; if (num == 0) random(min, max); return num; }a teprve potom funkce fungovala tak, jak jsem si představoval na začátku, to znamená, že při volání random(-3, 3) vracela čísla -3, -2, -1, 1, 2, 3, ale nikdy nulu (a taky nikdy undefined). Moje otázka zní, proč je to tak, jak to je. Tuším, že to nějak souvisí s platností proměnné num, ale nevím, jak. Děkuji za vysvětlení.
Řešení dotazu:
Proměnná num
je lokální pro daný běh funkce. Pokud tu funkci zavoláš (třeba rekurzivně) víckrát, má každý běh této funkce svoji nezávislou proměnnou num
. Tudíž ten řádek:
if (num == 0) random(min, max);
změní hodnotu num
jen v tom vnitřním volání random()
, zatímco tady zůstane hodnota nezměněná. Funkce sice na tomhle řádku vrátí hodnotu, ale ta se okamžitě zahodí, protože ji nepřiřazuješ do žádné proměnné. Musel bys tam mít:
if (num == 0) num = random(min, max);
aby to něco dělalo.
Před rekurzivním voláním random(min, max)
chybí return
. Od toho se celý problém odvíjí. Hodnota vrácená rekurzivním voláním se tím pádem zahodí a nikam dál se nevrací.
Vůbec nepíšeš, co přesně má ta funkce dělat, jaké vstupy má podporovat a jaké výstupy má generovat. Mají to být všechno integery? Libovolná čísla? Něco jiného? Hint: Co když bude min
mít (zhruba) hodnotu pí? Na takový dotaz se pak odpovídá těžko.
Budu tedy dál předpokládat, že argumenty mají být integery. (To by se ale mělo v prakticky použitelném kódu ověřit, případně specifikovat, co se má stát, pokud to nebudou integery.) Takže první iterace:
function random(min, max) { var num = Math.floor(Math.random() * (max - min + 1)) + min; return num == 0 ? random(min, max) : num; }
To^^^ je ale pořád ještě fujtajbl, protože dobu běhu té funkce a počet úrovní rekurze je potřeba deterministicky omezit. Sice je krajně nepravděpodobné, že by hloubka rekurze překročila povolenou hloubku zásobníku, ale spoléhat se tímto způsobem na náhodu je ošklivé. Vznikají tak chyby, kvůli kterým pak software jednou za rok za podivných okolností zařve. Takové chyby jsou těžko reprodukovatelné a těžko odhalitelné.
Takový jednoduchý nápad: Co takhle zjistit, jestli zadaný rozsah čísel obsahuje nulu, a pokud ano, jednoduše se jí při generování náhodného čísla vyhnout?
function random(min, max) { if (min > max) [min, max] = [max, min]; var num = function(range) { return Math.floor(Math.random() * range) + min; }; if (min > 0 || max < 0) { return num(max - min + 1); } else { var result = num(max - min); return result >= 0 ? result + 1 : result; } }Tohle^^^ je pořád hodně ošklivé, ale vrací to náhodné číslo z celého rozsahu kromě nuly a nemá to v sobě žádnou náhodnou rekurzi.
function random(min, max) { var num = Math.floor(Math.random() * (max - min)) + min; return (num >= 0) ? (num + 1) : num; }
Tohle přece nefunguje. Pro záporné rozsahy nikdy nevrací max
(random(-2, -1)
) a pro kladné rozsahy nikdy nevrací min
(random(1, 2)
). Jo, kdyby se to aspoň chovalo konzistentně co do vyloučení / zahrnutí mezí, ale ani to ne.
Nazývejme prosím věci pravými jmény. Korektní řešení problému se nejmenuje „komplikace“ a vracení čísel z jiného než požadovaného rozsahu se nejmenuje „řešení“.
Takže v tomto případě nevidím nic špatného ve spolehání se na náhodu.
Ne, spoléhat se na náhodu není nikdy přijatelné. Programování je přesná technická disciplína, nikoliv modlitba k bohu slunce.
Ještě pár reakcí na tyhle nesmysly těžkého kalibru:
Za prvé, abych nepokoušel dobrou vůli těch, kteří jsou ochotni odpovědět, jsem se zeptal jen na jednu izolovanou věc, po nikom jsem nechtěl, aby řešil ještě spoustu dalších věcí kolem.
Není jistější způsob, jak pokoušet dobrou vůli těch, kdo chtějí odpovědět, než ptát se nepřesně a vágně.
Proč bych tedy psal, jaké vstupy má funkce přijímat či jaké očekávané hodnoty má vracet, když to s jádrem problému nesouvisí?
Protože to s jádrem problému nejen souvisí, ale dokonce to je samotné jádro problému. Jádrem samotného programování je totiž přesné pochopení problému, přesná specifikace problému a rozdělení problému do menších celků, které lze vyjádřit ve formě zdrojového kódu. Pokud první dvě fáze celého procesu selhaly (a zjevně selhaly), jaký má potom smysl zabývat se nějak izolovaně tou třetí fází?
Za druhé ovšem stejně nechápu ta dodatečná bezpečnostní opatření.
To nejsou žádná „bezpečnostní opatření“; jde o nezbytnou součást korektního řešení daného problému. Je zkrátka několik jednoduchých zásad, bez kterých se člověk při programování neobejde. Zásada číslo jedna: Na náhodu se nikdy nespoléhá.
Funkce má přece volat samu sebe jen v případě, kdy se do proměnné num dosadí hodnota 0 - a to sice může nastat několikrát po sobě, ale rozhodně ne tolikrát, aby kvůli tomu hrozila nějaká havárie.
Kde přesně je tohle zaručeno a jak? Znova: Pokud si můžu být něčím naprosto jistý, neexistuje důvod spoléhat na náhodu.
…maximálně třikrát nebo čtyřikrát…Čím je to maximum omezené? Pětkrát se to stát nemůže? Šestkrát taky ne? Jak to? Kdyby programátoři uvažovali takhle, použitelný počítač by se na světě hledal velmi těžko.
function random(min, max) { var num = Math.floor(Math.random() * (max - min + 1)) + min; return (num == 0) ? random(min, max) : num; }
Tiskni
Sdílej: