Edvard Rejthar na blogu zaměstnanců CZ.NIC představil svou aplikaci SlideRshow (GitHub). Funguje jako prohlížeč fotek, ale i jako jejich organizér a prezentátor. Neinstaluje se, běží přímo v prohlížeči. Bez serveru. Offline.
Kermit, tj. protokol pro přenos souborů, vznikl před 45 lety. Při této příležitosti byla po 15 letech od vydání poslední stabilní verze 9.0.302 vydána nová stabilní verze 11 implementace C-Kermit. S podporou IPv6.
První verze konverzního nástroje Pandoc byla vydána před 20 lety. Jeho autor John MacFarlane při tomto výročí rekapituluje jednotlivé etapy vývoje a přidávání nových funkcí – rozšíření nejen Markdownu a podporu mnoha dalších formátů.
Srpen přinesl nejen další spalující vedro, ale také Virtuální Bastlírnu s neméně žhavými novinkami. Využijte tedy předpovědi na deštivý čtvrteční večer a od 20:00 se připojte online k tomuto neformálnímu setkání kutilů, techniků a vědců, kde se strahovskými bastlíři proberete nejzajímavější věci, na které jste narazili za poslední měsíc. Pokud jde o novinky, řeč zcela jistě přijde na systém INDX pro tiskárny Průša, který na konci
… více »Firma T-Mobile blokovala „dezinformační web“ AC24 bez toho, aniž by k tomu měla závazný pokyn orgánů veřejné moci. Píše to ve svém rozsudku Městský soud v Praze, který po čtyřech letech uzavřel kauzu blokace zmíněného webu. Operátor musí uhradit škodu ve výši 35 tisíc korun. Advokát společnosti T-Mobile se snažil i u odvolacího senátu argumentovat tím, že firma jednala v dobré víře, když na stránky omezila přístup poté, co ji k tomu vyzvalo
… více »Padla obžaloba v bitcoinové kauze. Státní zástupkyně chce pro Blažka 6,5 roku vězení, pro Titze 8 let.
Z aktuálních globálních statistik společnosti Statcounter: na desktopu má Linux celosvětově podíl 7,53 % (USA 11,92 %, Česko 4,31 %, Slovensko 4,36 %) a Firefox celosvětově podíl 6,51 % (USA 10,86 %, Česko 11,07 %, Slovensko 13,61 %).
Na GitHubu byl publikován seznam 55 kritických bezpečnostních chyb v SQLite s přiřazenými CVE čísly. JFrog Security informuje, že se jedná jenom o AI slop, části kódu na které CVE odkazují, v daných verzích vůbec neexistují. Upozorňuje také, že čísla CVE jsou přiřazována bez ověřování.
Příspěvek na blogu Google Security popisuje, jak tým Chrome Security využívá umělou inteligenci k zásadnímu zrychlení a zlepšení procesu odhalování, třídění a opravování bezpečnostních chyb v prohlížeči Chrome. Díky AI byla nalezena kritická chyba, která byla v kódu přes 13 let. Ve verzích Chrome 149 a 150 bylo opraveno více chyb než v předchozích 23 verzích dohromady.
Firmy v EU musí počínaje dnešním dnem označovat obsah vytvořený umělou inteligencí. Znamená to povinnost informovat uživatele, že člověk komunikuje s chatbotem či jiným systémem AI. Rovněž obrázky, audia či videa, které jsou vytvořené nebo zmanipulované pomocí umělé inteligence a které mohou působit jako autentické, musejí být jasně označeny jako uměle vytvořené.
void funkce1(int chTime) // chTime - jak dlouho má cykl běžet.
{
unsigned int t0 = CurrentTick(); // začatek cyklu - neměnná hodnota
unsigned int t1 = CurrentTick(); // aktuální doba cyklu
unsigned int overFlow = 0; // detekuje přeteceni CurrentTick
while((t0+chTime)>(t1+overFlow))
{
// ZDE BUDE KÓD, KTERÝ CHCI ČASOVAT
// 1 CYKLUS MŮŽE TRVAT AŽ 2s
t1=CurrentTick(); // aktualizace času smyčky - "aktuální čas"
if(t1 < t0) // kontrola proti přetečení
{
overFlow = 65535;
}
}
}
time(2), gettimeofday(2), alarm(2), setitimer(2), …
Ten kód je celkově dost problematický, není třeba jasné, kde přesně se vzala magická konstanta 65535 (není to spíš 65536?) a počítá se jen s jedním přetečením. Pokud "vrátí okamžitě" znamená, že se cyklus neprovede ani jednou, šlo by to vysvětlit např. tím, že překladač prohodil pořadí těch dvou inicializací a t1 se inicializovala na 65535, ale t0 už na nulu. V každém případě je nesmysl na začátku CurrentTick() (Co to vůbec je? Standardní systémová funkce určitě ne.) volat dvakrát, spíš použijte pro t1 hodnotu, kterou už máte v t0.
šlo by to vysvětlit např. tím, že překladač prohodil pořadí těch dvou inicializací
Nejspíš nešlo. Tím, že je tam volání funkce, tak to udělat nemůže. Jedině že by ta funkce byla inline a prováděla něco jako čtení z nějaké globální proměnné, kterou cosi na pozadí aktualizuje.
Na druhou stranu si lze snadno představit, jak by cyklus neskončil nikdy: pokud se t0 inicializuje na nulu, podmínka "t1 < t0" nebude nikdy splněná a přetečení nedetekujete.
ale v principu by to nemělo vadit
Může, protože pak překladači nic nebrání ty dvě inicializace prohodit. Proto existují věci jako bariéry, abyste mu v tom zabránil. V každém případě ale není sebemenší důvod při inicializaci tu funkci volat dvakrát, prostě použijte stejnou hodnotu pro obě proměnné, je to jednodušší a nebudete riskovat překvapení.
Kdyby se t0 inicializovalo na 0 (což je pouze před započetím časového cyklu), vůbec by to nevadilo, vlastně by to byl ideální případ. Jelikož max časování je jak jsem psal 50 sekund.
Holt si asi každý musí natlouct sám, aby pochopil, jakou trvanlivost tyhle skryté předpoklady mají a jak nepříjemné je pak hledat chyby, které se začnou objevovat, když jednoho dne přestanou platit (v době, kdy už jste dávno zapomněl, kde všude jste to předpokládal). Pokud mermomocí trváte na tom, že to nechcete napsat pořádně, tak aspoň kontrolujte ten argument, ať aspoň víte proč, až to "bouchne".
if(t1 <= t0) a následně overFlow inkrementovat o 65536 kvůli vícenásobnému přetečení.
t0, pro vás je spíš důležité, jestli je menší než minulá hodnota t1 (pokud se můžeme spolehnout, že vám to během jednoho cyklu nenaskočí o 65536 a víc).
Ještě jedna praktická rada:
Ohledně toho CurrenTick() - tohle je programované pro řídicí jednotku robota.
Pokud se dotaz týká nějakého velmi specifického prostředí, kde nelze použít běžné nástroje a obraty, je dobré na to hned na začátku upozornit.
uint16_t t0 = CurrentTick();
while (chTime > 0)
{
...
uint16_t t1 = CurrentTick();
chTime -= t1 - t0;
t0 = t1;
}
Nějak divně tam inicializuješ ty časové proměnné. Když si normálně v běžném userspace naimplementuju CurrentTicks(), daří se mi to vyzkoušet takhle:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <inttypes.h>
static const size_t BILLION = 1000000000;
static const size_t MILLION = 1000000;
static const uint32_t TIME_MASK = 0xffff;
static const uint32_t TIME_MAX = TIME_MASK + 1;
static const struct timespec PAUSE = {
.tv_sec = 0,
.tv_nsec = 500000000,
};
static uint32_t CurrentTick() {
struct timespec ts;
if (clock_gettime(CLOCK_MONOTONIC, &ts)) {
perror("clock error");
exit(1);
}
const uint64_t ns = (uint64_t)ts.tv_sec * BILLION +
(uint64_t)ts.tv_nsec;
return (uint32_t)(ns / MILLION) & TIME_MASK;
}
static void funkce1(int chTime) {
if (chTime > 0) {
uint32_t t0 = CurrentTick();
do {
/* Tady začíná časovaný kód. */
printf("\tZbývá: %d ms, CurrentTick: %u ms\n", chTime, t0);
struct timespec remaining;
if (nanosleep(&PAUSE, &remaining))
while (nanosleep(&remaining, &remaining));
/* Tady končí časovaný kód. */
const uint32_t t1 = CurrentTick();
chTime -= t1 > t0 ? t1 - t0 : TIME_MAX - t0 + t1;
t0 = t1;
} while (chTime > 0);
}
}
int main() {
const int times_sec[] = {1, 2, 4, 8, 16, 32, 64, 65, 66, 99};
for (size_t i = 0; i < sizeof(times_sec) / sizeof(int); ++i) {
printf("Spouštím časovač na %d s.\n", times_sec[i]);
funkce1(1000 * times_sec[i]);
}
return 0;
}
Tohle^^^ si můžeš rovnou spustit, sledovat, kdy čas přeteče, a zkoušet různé alternativy. Klíčové je, jak se v tom cyklu aktualizuje uplynulý čas.
Pokud by jedna iterace toho časovacího kódu trvala déle než 65536 milisekund, bude samozřejmě tohle řešení nepoužitelné a časování by se muselo řešit jinak.
Tiskni
Sdílej: