Byla vydána nová major verze 28.0 programovacího jazyka Erlang (Wikipedie) a související platformy OTP (Open Telecom Platform, Wikipedie). Přehled novinek v příspěvku na blogu.
Český telekomunikační úřad zveřejnil Výroční zprávu za rok 2024 (pdf), kde shrnuje své aktivity v loňském roce a přináší i základní popis situace na trhu. Celkový objem přenesených mobilních dat za rok 2024 dosáhl dle odhadu hodnoty přibližně 1,73 tis. PB a jeho meziroční nárůst činí zhruba 30 %. Průměrná měsíční spotřeba dat na datovou SIM kartu odhadem dosáhla 12,5 GB – v předchozím roce šlo o 9,8 GB.
Z novinek představených na Google I/O 2025: Přehledy od AI (AI Overviews) se rozšiřují do dalších zemí. Užitečné, syntetizované přehledy od generativní AI jsou nově k dispozici i českým uživatelům Vyhledávače.
Šestice firem označovaných jako „MAMAAN“ – tedy Meta (Facebook, Instagram), Alphabet (Google), Microsoft, Apple, Amazon a Netflix – je zodpovědná za více než padesát procent světového internetového provozu. Dalšími velkými hráči jsou TikTok a Disney+. Společně tak zásadně určují podobu digitálního prostředí, spotřebitelského chování i budoucích trendů v oblasti technologií. I přesto, že se podíl těchto gigantů od roku 2023 o něco snížil, jejich dominantní postavení zvyšuje volání po regulaci.
Evropská komise (EK) navrhuje zavést plošný poplatek ve výši dvou eur (zhruba 50 Kč) za každý malý balík vstupující do Evropské unie. Poplatek se má týkat balíků v hodnotě do 150 eur (zhruba 3700 Kč), které v EU nepodléhají clu. V loňském roce bylo do EU doručeno kolem 4,6 miliardy takovýchto balíků. Poplatek má krýt náklady na kontroly rostoucího počtu zásilek levného zboží, které pochází především z Číny.
Dnes a zítra probíhá vývojářská konference Google I/O 2025. Sledovat lze na YouTube a na síti 𝕏 (#GoogleIO).
V Bostonu probíhá konference Red Hat Summit 2025. Vybrané přednášky lze sledovat na YouTube. Dění lze sledovat na síti 𝕏 (#RHSummit).
Společnost Red Hat oficiálně oznámila vydání Red Hat Enterprise Linuxu 10. Vedle nových vlastností přináší také aktualizaci ovladačů a předběžné ukázky budoucích technologií. Podrobnosti v poznámkách k vydání.
Tuto sobotu 24. května se koná historicky první komunitní den projektu Home Assistant. Zváni jsou všichni příznivci, nadšenci a uživatelé tohoto projektu. Pro účast je potřebná registrace. Odkazy na akce v Praze a v Bratislavě.
Troy Hunt představil Have I Been Pwned 2.0, tj. nový vylepšený web služby, kde si uživatelé mohou zkontrolovat, zda se jejich hesla a osobní údaje neobjevily v únicích dat a případně se nechat na další úniky upozorňovat.
Vennův diagram porovnávající nástroje curl a wget.
Tiskni
Sdílej:
#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.so
jsou 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.