Byla vydána nová verze 11.9 webového prohlížeče Midori (Wikipedie, GitHub). S novým centrem ovládání, pokročilejším blokováním reklam, optimalizací výkonu…
Na Crowd Supply běží kampaň na podporu open source čtečky elektronických knih Open Book Touch. Postavena je na ESP32-S3. Má 4,26palcový dotykový e-papírový displej s rozlišením 480×800 pixelů, podsvícení, slot na microSD kartu. Cena je 149 dolarů a poštovné 12 dolarů. Dodání je plánováno na duben 2027.
Na Humble Bundle běží akce Linux: All the Things by O'Reilly a Picos, HATs, and More by Raspberry Pi Press. Elektronické knihy lze koupit se slevou a současně podpořit organizace Code for America a Raspberry Pi Foundation.
FreeCAD (Wikipedie), tj. svobodný multiplatformní parametrický 3D CAD, má nový vtipný a současně užitečný doplněk Banana For Scale (GitHub). Aktuálně umožňuje do výkresu vložit banán nebo plechovku pro porovnání a určení měřítka.
Blender Studio nedávno oznámilo plán vytvořit svůj první otevřený (open source) celovečerní film. Film by se měl jmenovat Overgrown (YouTube). Film vznikne, pokud se zajistí financování. Prvním krokem je získat 7 000 předplatitelů Blender Studia. Cena je od 11,50 eur měsíčně. Aktuálně počet předplatitelů je 5 289. Předplatné pokryje 20 % nákladů. Zbytek, 80 % nákladů, má být financován externími producenty nebo distributory.
Byl vydán Debian 13.6, tj. šestá opravná verze Debianu 13 s kódovým názvem Trixie a Debian 12.15, tj. poslední patnáctá opravná verze Debianu 12 s kódovým názvem Bookworm, k dispozici je LTS. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 13 a Debianu 12 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.
V jádře Linux byla nalezena a v upstreamu již byla opravena kritická zranitelnost GhostLock aneb CVE-2026-43499. Lokálnímu uživateli umožňuje získat práva roota a také obejít kontejnerovou izolaci. Zranitelnost existovala v Linuxu 15 let, tj. od roku 2011, od Linuxu verze 2.6.39.
Evropská komise předběžně shledala, že návykový design aplikací Instagram a Facebook od americké společnosti Meta porušuje unijní nařízení o digitálních službách (DSA). Návykový design zahrnuje například takzvané nekonečné posouvání, automatické přehrávání videí, tzv. push notifikace, kdy aplikace uživatele vybízí k návratu do jejího prostředí, či vysoce personalizovaný algoritmus, který rychle pozná, co uživatele baví a snaží
… více »Byla vydána verze 1.97.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.
Švýcarská společnost Punkt. má nově v nabídce telefon Punkt. MC03. Telefon byl navržen ve Švýcarsku s důrazem na soukromí a digitální suverenitu a vyroben v Německu. V telefonu běží operační systém AphyOS (Apostrophy OS) založený na AOSP (Android Open Source Project) 15. Cena telefonu je 745 eur.
Vennův diagram porovnávající nástroje curl a wget.
Tiskni
Sdílej:
V kazdem jakzyku budete mrvit neco jineho, kdyz nebudete poradne investovat do kvality.
#ifdef zapnout/vypnout, ale mít jasně definované rozhraní pro moduly (např. jeden hlavičkový soubor) a mít možnost je dynamicky přidávat/odebírat (když už ne za chodu – což tady není moc potřeba – tak aspoň při startu programu bez nutnosti ho překompilovat).
Modul pak závisí jen na tom rozhraní a ne na celém programu. Program (jeho jádro) pak závisí taky jen na tom rozhraní a moduly si načte podle toho, které jsou k dispozici / nakonfigurované. Dobrým příkladem, že tohle jde dělat i v céčku, je třeba SQLite. Každá část se dá kompilovat nezávisle a poskládá se to až na počítači uživatele dle jeho potřeb.
Rozhraní modulů je definováno v souboruTzn. kdybych chtěl přidat např. podporusqlite3ext.h(neplést ssqlite3.h), který má cca 500 řádek kódu a obsahuje jen signatury funkcí a komentáře – není zde tedy žádný spustitelný kód a jedná se o čistě abstraktní rozhraní. Když píšeme modul, závisíme jen na tomto souboru a kompilátoru, ale nikoli na SQLite jako takovém – náš modul je po kompilaci dynamickou knihovnou a není linkovaný klibsqlite3.so. Dá se říct, že funkce zlibsqlite3.sojsou v době běhu do našeho modulu injektovány zvenčí.
ipfs:// do programu typu curl / wget, tak by to mělo znamenat, že vezmu jeden hlavičkový soubor čítající pár řádek (abstraktní rozhraní), implementuji jeho funkce, zkompiluji z toho sdílenou knihovnu a hodím ji do nějakého adresáře (případně přiložím nějaký popisný soubor typu Turtle, jako to má např. LV2).
Zvláštní, že jsem ještě neviděl distribuci, která by kompilovala SQLite modulárně.
Rozhraní modulů je definováno v souboru sqlite3ext.h (neplést s sqlite3.h), který má cca 500 řádek kódu a obsahuje jen signatury funkcí a komentáře – není zde tedy žádný spustitelný kód a jedná se o čistě abstraktní rozhraní. Když píšeme modul, závisíme jen na tomto souboru a kompilátoru, ale nikoli na SQLite jako takovém – náš modul je po kompilaci dynamickou knihovnou a není linkovaný k libsqlite3.so. Dá se říct, že funkce z libsqlite3.so jsou v době běhu do našeho modulu injektovány zvenčí.
Tohle je snůška nesmyslů. SQLite si za běhu přilinkuje modul a zavolá z něj sqlite3_*_init(), která zpětně volá sqlite3_create_module_v2() nacházející se v SQLite. Jak modul najde sqlite3_create_module_v2()? Inu, sqlite3ext.h includuje sqlite3.h, který jej deklaruje. To znamená, že sqlite3.h je rozhraním pro moduly. A jak modul získá adresu sqlite3_create_module_v2()? V době překladu ponechá symbol nedefinovaný a slepě se spolehne, že aplikace, která modul zavede přes dlopen(), ten symbol už budeme mít v adresním prostoru. Typická bezpečností chyba late bindingu (vašimi slovy „modul je po kompilaci dynamickou knihovnou a není linkovaný k libsqlite3.so“). Stejně blbě jako to dělá Python nebo Perl a distributoři to po nich pak musí opravovat.
#include <sqlite3.h>, by šlo ještě napravit/vylepšit. Nicméně by se odtamtud měly používat jen struktury - žádné funkce by se neměly volat na přímo. Od toho je tam ta struktura plná ukazatelů na funkce + ta makra typu:
#define sqlite3_bind_int sqlite3_api->bind_intTzn. modul není linkovaný proti
libsqlite3.so, závisí jen na:
linux-vdso.so.1 (0x00007ffe40d77000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f88fc15d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f88fc3ac000)
a funguje to díky tomu, že ty signatury metod v té struktuře v sqlite3ext.h se nemění a pasuje na ně reálná implementace, se kterou se to propojí až za běhu (SQLite naplní do té struktury ukazatele na skutečné funkce).
která zpětně volá sqlite3_create_module_v2() nacházející se v SQLite. Jak modul najde sqlite3_create_module_v2()? Inu, sqlite3ext.h includuje sqlite3.h, který jej deklaruje.Viz výše - přes makro:
#define sqlite3_create_module_v2 sqlite3_api->create_module_v2zavolá funkci, na kterou ukazuje ukazatel v této struktuře:
struct sqlite3_api_routines {
...
int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*,
void (*xDestroy)(void *));
Podobným způsobem funguje JNI a .so knihovny implementující nativní metody, které se pak volají z Javy - ani zde to moje .so nezávisí na konkrétním libjvm.so. Podobně, když používám JNI opačným směrem a mám program v C/C++ a uvnitř něj si ručně spustím JVM – ta moje binárka taky není při kompilaci linkovaná proti knihovnám konkrétní Javy, ale přes dlopen() si načte libjvm.so, kterou jí zadám (to může být třeba parametr na příkazové řádce nebo si to odvodím z $JAVA_HOME atd.). A funkce/metody JNI se pak volají přes JNIEnv, což je zase struktura, uvnitř které jsou ukazatele na funkce, které se tam dosadí dynamicky. Tzn. klidně si tu nativní část můžu zkompilovat s hlavičkovými soubory z Javy 17 a pak si to pouštět s libjvm.so z Javy 8 a bude to fungovat.
To znamená, že sqlite3.h je rozhraním pro moduly.S tímhle tedy souhlasím. Ano, bylo by lepší, kdyby v
sqlite3ext.h řádek #include <sqlite3.h> vůbec nebyl a případné společné konstanty/signatury byly třeba ve třetím souboru.
Nicméně si myslím, že to na věci nic nemění, protože hlavní „trik“ spočívá v tom, že se funkce nevolají přímo, ale přes ukazatele v té struktuře, které se naplní za běhu tak, aby ukazovaly tam, kde ty funkce skutečně jsou (a ne tam, kde byly funkce nějaké jiné verze, když se to kompilovalo).
$ cat /usr/lib/jvm/java-17-openjdk-amd64/include/jni.h | grep '#include' #include <stdio.h> #include <stdarg.h> #include "jni_md.h" $ cat /usr/lib/jvm/java-17-openjdk-amd64/include/linux/jni_md.h | grep '#include'Tzn. můžu si zkopírovat tyhle dva hlavičkové soubory na počítač, kde Javu vůbec nemám, tam si v klidu vyvinout program/modul, a pak to dát někomu, kdo si to se svojí Javou spustí. Kdybych si např. chtěl od tebe objednat vývoj nějakých nativních metod, tak bych ti dal jen tohle + hlavičkový soubor se signaturami těch metod, které se mají implementovat (
javac -h ...) a ty bys vůbec nemusel mít Javu a byl bys schopný to vyvinout jen na základě specifikace. Tohle je podle mého ideál, jak by to mělo vypadat – vývojář modulu není zatěžován komplexitou celku a vyvíjí jen proti nějakému izolovanému a stručnému rozhraní.
A k čemu to všechno…?Třeba abys mohl ten svůj modul načíst i z programů, které SQLite linkují staticky, což je typicky i příkaz
sqlite3. Pokud by se tvůj modul vázal na libsqlite3.so, zatímco program (např. sqlite3) by v sobě měl zakompilované SQLite staticky, tak by tam ty funkce/struktury byly dvakrát a nespojilo by se to.
Díky tomu, jak je to udělané (struktura plná ukazatelů na funkce), tak můžu mít jednou zkompilovaný modul, který nezávisí na libsqlite3.so, a ten si načíst jednou do staticky linkovaného programu (např. sqlite3), který má SQLite zakompilované v sobě, a jindy do dynamicky linkovaného (např. ODBC ovladač pro SQLite), který se váže na libsqlite3.so.
Původně (#23) jsi tu naznačoval nějaký problém, tak jsem se snažil vysvětlit, jak to SQLite řeší… a najednou to problém není a mohlo by to být standardní dynamické linkování? Tak jak tedy?
Naznačoval jsem, že modul volá (některé) funkce z SQLite a hledá je pomocí dynamického linkování.
Třeba abys mohl ten svůj modul načíst i z programů, které SQLite linkují staticky
Ano, tady to smysl dává. Ono obvykle to fungovat bude, i když by se modul spolehl na late binding dynamického linkování bez explicitního linkování k libsqlite3.so. Ale stačí aby se do procesu přimotala libsqlite3.so z jiného důvodu (třeba jako tranzitivní závislost), a pak se to rozsype, jak jste popsal. To by musel dynamický linker všechny zaváděné knihovny izolovat pomocí RTLD_LOCAL. Ale to by asi přineslo jiné problémy.