V uplynulých dnech byla v depu Českých drah v Brně-Maloměřicích úspěšně dokončena zástavba speciální antény satelitního internetu Starlink od společnosti SpaceX do jednotky InterPanter 660 004 Českých drah. Zástavbu provedla Škoda Group. Cestující se s InterPanterem, vybaveným vysokorychlostním satelitním internetem, setkají například na linkách Svitava Brno – Česká Třebová – Praha nebo Moravan Brno – Břeclav – Přerov – Olomouc.
Byla vydána nová verze 8.7.0 správce sbírky fotografií digiKam (Wikipedie). Přehled novinek i s náhledy v oficiálním oznámení (NEWS). Nejnovější digiKam je ke stažení také jako balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo ke spuštění a spustit.
Před 30 lety, k 1. 7. 1995, byl v ČR liberalizován Internet - tehdejší Eurotel přišel o svou exkluzivitu a mohli začít vznikat první komerční poskytovatelé přístupu k Internetu [𝕏].
Byla vydána (𝕏) nová verze 7.4 open source monitorovacího systému Zabbix (Wikipedie). Přehled novinek v oznámení na webu, v poznámkách k vydání a v aktualizované dokumentaci.
Balíček s příkazem sudo byl vydán ve verzi 1.9.17p1. Řešeny jsou zranitelnosti CVE-2025-32462 (lokální eskalace práv prostřednictvím volby host) a CVE-2025-32463 (lokální eskalace práv prostřednictvím volby chroot).
Do služeb Seznam.cz se lze nově přihlásit pomocí služby MojeID [𝕏].
Bezpečnostní výzkumníci zveřejnili informace o osmi zranitelnostech, které postihují více než 700 modelů tiskáren, skenerů a štítkovačů značky Brother. Bezpečnostní upozornění vydali také další výrobci jako Fujifilm, Ricoh, Konica Minolta a Toshiba. Nejzávažnější zranitelnost CVE-2024-51978 umožňuje útočníkovi vzdáleně a bez přihlášení získat administrátorská oprávnění prostřednictvím výchozího hesla, které lze odvodit ze
… více »Společnost Oracle vlastní ochrannou známku JAVASCRIPT. Komunita kolem programovacího jazyka JavaScript zastoupena společností Deno Land vede právní bitvu za její osvobození, viz petice a otevřený dopis na javascript.tm. Do 7. srpna se k nim má vyjádřit Oracle (USPTO TTAB).
Byl představen samostatný rádiový modul Raspberry Pi Radio Module 2 s Wi-Fi a Bluetooth.
Certifikační autorita Let’s Encrypt ukončila k 4. červnu zasílání e-mailových oznámení o vypršení platnosti certifikátů. Pokud e-maily potřebujete, Let’s Encrypt doporučuje některou z monitorovacích služeb.
rád si nechám v diskuzi poradit
Co je šokujícího na tom, že na feature request, který nemá nijak zásadní vliv na funkčnost hry, odpovím "tak to napiš sám a pošli mi patch"? Ze 144 commitů v mojí větvi jsou jen tři patche od někoho jiného, z toho jeden jsou ikonky a další jsem musel sám z poloviny přepsat, protože autor se mi na žádost o vylepšení patche už neozval.
BTW, měl bych Jardíkovi poděkovat. Při opravování typů proměnných a návratových hodnot, co přímo pracují se sizeof, se mi podařilo najít a opravit jeden bug v pointerové aritmetice.
// skeldal/branches/next_ghost/unix/init.cpp void Sys_SetPath(unsigned idx, const char *path) { size_t len = strlen(path); // tady byl int assert(idx < PATHTABLE_SIZE); if (pathtable[idx]) { free(pathtable[idx]); } // tady nebyl test *path == 0, což mohlo způsobit pád v kódu // níže, protože len-1 by šlo na neplatný index SIZE_MAX if (!*path || *path == 0) { pathtable[idx] = (char*)malloc(1); pathtable[idx][0] = '\0'; return; } if (path[len - 1] != '/') { len++; } pathtable[idx] = (char*)malloc(len + 1); strcpy(pathtable[idx], path); pathtable[idx][len-1] = '/'; pathtable[idx][len] = '\0'; }Ještě tam teda chybí kontrola návratových hodnot z malloc(), to už se mi nechce dělat. Další chyby:
// není reentrant char *Sys_FullPath(unsigned idx, const char *file) { static char ret[PATH_MAX]; assert(idx < PATHTABLE_SIZE); // tady může dojít k přetečení fixně velikého bufferu strcpy(ret, pathtable[idx]); strncat(ret, file, PATH_MAX - strlen(ret) - 1); return ret; } // není reentrant char *Sys_DOSPath(unsigned defdir, const char *path) { static char ret[PATH_MAX]; int i, length; // "má" být size_t assert(defdir < PATHTABLE_SIZE); // možnost přetečení bufferu strcpy(ret, pathtable[defdir]); length = strlen(ret); strncat(ret + length, path, PATH_MAX - length - 1); strupr(ret + length); for (i = length; ret[i]; i++) { if (ret[i] == '\\') { ret[i] = '/'; } } return ret; } void Sys_Init(void) { char home[PATH_MAX]; // smyšlená hodnota maximální velikosti cesty int len; // size_t // možnost přetečení bufferu, getenv() může vrátit NULL strcpy(home, getenv("HOME")); len = strlen(home); // neplatný index při len == 0 if (home[len-1] != '/') { home[len++] = '/'; } // další možnost přetečení bufferu strcpy(home + len, ".skeldal/");Nakonec dotaz: znáš třeba std::map a std::string? Když je to C++ kód, proč to nepoužít? Ušetřil bys si spoustu starostí, např. Sys_SetPath by mohl vypadat nějak takto:
typedef std::map<unsigned, std::string> Mapa; Mapa mapa; void Sys_SetPath(unsigned id, const std::string& path) { std::string& oldVal = mapa[id]; std::string::size_type len; oldVal = path; len = oldVal.size(); if (len > 0 && oldVal[len-1] != '/') oldVal += '/'; }A při chybné alokaci ti to prostě vyprskne std::bad_alloc
STL znám a odmítám to použít, protože bych tím akorát zablokoval možnost portovat Skeldal na mobilní platformy s omezenou pamětí.To je škoda. Já si trochu procházel ten kód a místama jsou tam takové čuňárny a je to tak nepřehledné, všude možně chybí kontrola chyb, některé funkce vůbec neupozorní na chyby (ani nějakým kódem, ani výjimkou, ani vypsáním) a vypadá to fakt neudržitelně. Ale snaha se cení.
Proč děláme takovou hloupost? Stručná, byť možná trochu nesrozumitelná, odpověď na tuto otázku by se dala shrnout do věty: "Protože STL vás nutí si přát, aby C++ mělo automatickou správu paměti (garbage collector - GC)". Problém je v tom, že do STL kontejneru můžete vkládat pouze objekty, které mají definovanou kopii. Navíc, pokud aspoň trochu dbáte na rychlost aplikace, musí tato kopie pokud možno být jednoduše proveditelná (rychlá). To v praxi znamená, že do STL kontejneru je možné efektivně ukládat fundamentální typy, možná ještě tak řetězce a pár dalších jednoduchých typů. Všechno ostatní lze uložit pouze nepřímo pomocí ukazatele. Tím se ztrácí jedna ze základních výhod, kterou používaní kontejnerových šablon přináší - automatická správa paměti.
AC_ARG_WITH(gamedata-prefix,
[AS_HELP_STRING([--with-gamedata-prefix=PREFIX], [Prefix for game data.])],
)
ad 5)set -e
: ${AUTORECONF:=autoreconf}
if test "$*"; then
ARGS="$*"
else
if test -f config.log ; then
ARGS=`grep '^ \$ \./configure ' config.log | sed 's/^ \$ \.\/configure //' 2> /dev/null`
fi
fi
echo "Running ${AUTORECONF}..."
$AUTORECONF --install --verbose
test x$NOCONFIGURE = x && echo "Running ./configure $ARGS" && ./configure $ARGS
ad 1) a 5) Neznám moc balíků, které by tohle dělaly, a UNIXový standard je ./configure; make; make install. Dokud se ze "svaté trojice" nestane čtveřice, která začíná ./autogen.sh nebo něčím podobným, budu mít configure skript přímo v repozitáři, stejně jako většina ostatních projektů. Navíc takový skript GNU Coding Standards nevyžaduje.
ad 2) Díky za tip, tohle jsem neznal.
ad 3) Podle GNU Coding Standard je to zcela v pořádku a já se s dovolením budu držet GNU Coding Standards. Freedesktop si může vymýšlet, co chce, ale to ještě neznamená, že to má smysl používat.
ad 4) -Dcosi je flag preprocesoru, takže AM_CPPFLAGS je naprosto správné umístění. CPPFLAGS se používá při kompilaci C i C++, CXXFLAGS jen pro C++.
Tiskni
Sdílej: