Jak na webu co nejšíleněji zadávat datum? Jak to uživatelům co nejvíce znepříjemnit? V Bad UX World Cup 2025 (YouTube) se vybíraly ty nejšílenější UX návrhy. Vítězným návrhem se stal Perfect Date.
Společnost Collabora vydala (YouTube) na LibreOffice založený desktopový kancelářský balík Collabora Office. Pro Windows, macOS a Linux. Se stejným uživatelským rozhraním jako Collabora Online. Svůj desktopový kancelářský balík s rozhraním LibreOffice pojmenovala Collabora Office Classic.
Glen MacArthur vydal AV Linux (AVL) a MX Moksha (MXM) 25. S linuxovým jádrem Liquorix. AV Linux (Wikipedie) je linuxová distribuce optimalizována pro tvůrce audio a video obsahu. Nejnovější AV Linux vychází z MX Linuxu 25 a Debianu 13 Trixie. AV Linux přichází s desktopovým prostředím Enlightenment 0.27.1 a MX Moksha s prostředím Moksha 0.4.1 (fork Enlightenmentu).
Ubuntu pro testování nových verzí vydává měsíční snapshoty. Dnes vyšel 1. snapshot Ubuntu 26.04 LTS (Resolute Raccoon).
Zástupci členských států EU se včera shodli na návrhu, který má bojovat proti šíření materiálů na internetu zobrazujících sexuální zneužívání dětí. Nařízení známé pod zkratkou CSAM a přezdívané chat control mělo množství kritiků a dlouho nebyla pro jeho schválení dostatečná podpora. Pro schválení byla potřeba kvalifikovaná většina a dánské předsednictví v Radě EU se snažilo dosáhnout kompromisu. Návrh nakonec po dlouhých týdnech
… více »Britské herní studio Facepunch stojící za počítačovými hrami Garry's Mod a Rust uvolnilo svůj herní engine s&box (Wikipedie) jako open source. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT. Herní engine s&box je postavený nad proprietárním herním enginem Source 2 od společnosti Valve.
Vývoj programovacího jazyka Zig byl přesunut z GitHubu na Codeberg. Sponzoring na Every.
Stejně jako GNOME i KDE Plasma končí s X11. KDE Plasma 6.8 poběží už pouze nad Waylandem. Aplikace pro X11 budou využívat XWayland.
Poslanci Evropského parlamentu dnes vyzvali k výraznému zvýšení ochrany nezletilých na internetu, včetně zákazu vstupu na sociální sítě pro osoby mladší 16 let. Legislativně nezávazná zpráva, kterou dnes odsouhlasil Evropský parlament poměrem 493 hlasů pro ku 92 proti, kromě zavedení věkové hranice 16 let pro využívání sociálních sítí, platforem pro sdílení videí či společníků s umělou inteligencí (AI) vyzývá také k zákazu … více »
Doom v KiCadu nebo na osciloskopu? Žádný problém: KiDoom: Running DOOM on PCB Traces a ScopeDoom: DOOM on an Oscilloscope via Sound Card.
Všechny zápisy v blogu jsou pod licencí Creative Commons BY-SA 3.0 CZ
Tentokrát jsem se vrtal v build systému Skeldalu a dodělal dlouho slibovanou možnost nastavit cesty k datovým souborům přes configure skript. Má to ale jeden háček: od revize 160 se mění defaultní cesta k datovým souborům hry.
Při updatu na nejnovější revizi tak máte na výběr ze dvou možností: Buď si herní data přesunete/nasymlinkujete do adresáře /usr/local/share/skeldal, nebo budete spouštět configure skript takto:
./configure --datadir='${prefix}/games'
Pokud někdo víte, jak autoconf rozumným způsobem donutit změnit default proměnné ${datadir} na ${prefix}/games, rád si nechám v diskuzi poradit. Hlavní podmínka je, že tahle změna musí bez vnějšího zásahu přežít následný autoreconf.
Další změny od minula jsou spíše technického charakteru. První změna potěší autory dobrodružství, protože nový kód na načítání textů korektně řeší spoustu okrajových případů, na kterých by předchozí kód zbytečně selhal. Navíc teď správně hlásí číslo řádku, na kterém je chyba. Druhá změna potěší majitele starších strojů. Pokusil jsem se zoptimalizovat nejvytíženější renderovací funkce a všechny kromě jedné se mi podařilo zrychlit skoro na dvojnásobek. Změna se ale projeví jen zvýšením frameratu. Kvůli implementaci hlavní smyčky podle všeho hra místo častějšího uspání jen častěji kreslí. Někdy se budu muset do vnitřností hry podívat trochu hlouběji a konečně pořádně oddělit vykreslování od přepočítávání herního stavu.
Do první stabilní verze portu tak zbývá už jen mapování kláves a dořešení několika technických drobností.
Tiskni
Sdílej:
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++.