Svobodný citační manažer Zotero (Wikipedie, GitHub) byl vydán v nové major verzi 8. Přehled novinek v příspěvku na blogu.
Byla vydána verze 1.93.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.
Svobodný operační systém ReactOS (Wikipedie), jehož cílem je kompletní binární kompatibilita s aplikacemi a ovladači pro Windows, slaví 30. narozeniny.
Společnost Raspberry Pi má nově v nabídce flash disky Raspberry Pi Flash Drive: 128 GB za 30 dolarů a 256 GB za 55 dolarů.
Technologie Skip pro multiplatformní mobilní vývoj, která umožňuje vývojářům vytvářet iOS a Android aplikace z jediné Swift a SwiftUI kódové základny, se s vydáním verze 1.7 stala open source.
Na GitHubu byl zveřejněn algoritmus "Pro vás" sociální sítě 𝕏.
Byla vydána nová major verze 34.0.0 webového prohlížeče Pale Moon (Wikipedie) vycházejícího z Firefoxu. Přehled novinek v poznámkách k vydání.
Win8DE je desktopové prostředí pro Wayland, inspirované nechvalně proslulým uživatelským rozhraním Metro z Windows 8. Nabízí dlaždicové rozhraní s velkými tlačítky a jednoduchou navigací, optimalizované pro dotyková zařízení. Cílem projektu je přetvořit design operačního systému Windows 8 do funkčního a minimalistického rozhraní vhodného pro každodenní použití na Linuxu.
Laboratoře CZ.NIC vydaly Datovku 4.28.0 a Mobilní Datovku 2.6.0. Hlavní novinkou je ukládání rozpracovaných datových zpráv do konceptů. Datovka je svobodné multiplatformní aplikace pro přístup k datovým schránkám a k trvalému uchovávání datových zpráv v lokální databázi.
Unix Pipe Game je vzdělávací karetní hra zaměřená na děti a rodiče, která děti učí používat unixové příkazy prostřednictvím interaktivních úkolů. Klíčovým prvkem hry je využití symbolu | pro pipeline neboli 'rouru', který umožňuje propojit výstupy a vstupy jednotlivých unixových příkazů, v tomto případě vytištěných na kartičkách. Předpokládá se, že rodič má alespoň nějaké povědomí o unixových příkazech a jejich provazování pomocí |.
… více »
typedef void* ndata_t;
struct node {
struct node *left; /* left child */
struct node *right; /* right child */
struct node *parent; /* parent */
uint64_t ID;
ndata_t data; /* data */
};
typedef int (*f_stn_deldata)(ndata_t ndata); /* splaytree node delete data*/
static f_stn_deldata stn_deldata;
kde stn_deldata je pointer na userom zadefinovanu funkciu na zmazanie dat - ak by tieto data boli vytvorene dynamicky. pri mazani stromu volam funkciu, ktora prechadza rekurzivne nody a nasledne ich maze .. a tu sa zacina moja uvaha .. pseudokod pri mazani:
destroy(struct node* n) {
..
..
if (n->left) destroy(n->left);
if (n->right) destroy(n->right);
/* tu prichadza na rad moja uvaha */
if ( stn_deldata ) stn_deldata (n->data);
..
zmaz nodu
..
}
jedna sa mi o to, ze ten if sa bude vykonavat pri kazdom jednom mazani .. pri par polozkach je to jedno, pri 10mil, pripadne 1 mild. to uz aj stoji za uvahu ..
riesenie by bolo jednoduche - vytvorit dalsiu fciu destroy_nodata a tu volat rekurzivne .. logika, kt. fciu volat by bola v hlavnej st_destroy fcii
teoreticka otazka - ma zmysel sa zaoberat takouto optimalizaciou ? je to best practice ci ..?
compare(n1,n2), a mam nasledovny kod:
..
if ( (compare(n1,n2)) <0 ) {
/* do something */
}
else if ( (compare(n1,n2))== 0) {
/* do something else */
}
..
ci sa bude compare volat zadazkym, alebo si to vie zoptimalizovat a bude sa volat len raz a potom sa uz bude odkazovat na vysledok .. gcc a gcc -O3 na trivialnom priklade:
int main()
{
int x = 0;
if ( x ) return 1;
return 0;
}
raz skompilovane gcc -c test.c, druhy krat gcc -O3 -c test.c
spatne som sa pozrel cez objdump -d test.o - jasne bolo vidno, ze podmienku uz ani nekontroluje a rovno vrati 0 v druhom pripade:
test.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <main>:
0: 31 c0 xor %eax,%eax
2: c3 retq
k tej mojej otazke - neda sa povedat pri kompilacii, ci je alebo nie je def. - to sa zisti az pri linkovani .. resp., striktne asi vzato, stn_deldata je zadef. ako neinicializovana premenna pri kompilovani (az st_init ju nastavi bud na NULL alebo na adresu user fcie)
st_destroy sa vola vzdy, ta potom "spusti" hlavnu destroy fciu, ktoru som spominal hore .. user teda v kode pouzije:
/* init s user def. compare/dump/destroy fciami */
struct splaytree *st = st_init(mycompare, mydump, mydestroy);
..
..
/* konecny destroy */
st_destroy(st);
kde st_destroy(struct splaytree *st) vola st_destroy_nodes(struct node* n), ktora sa vola rekurzivne (to je prave to telo fcie, ktore som v mojom prispevku nazval len destroytakze v hlavnej st_destroy by som sa rozhodol, ci sa bude volat rekurznivne "s data delete", alebo len "node delete" ..
ano, mozno je to moc spekulativne, zaujima ma vsak nazor, priapdne skusenosti druhych
Tiskni
Sdílej: