OpenChaos.dev je 'samovolně se vyvíjející open source projekt' s nedefinovaným cílem. Každý týden mohou lidé hlasovat o návrzích (pull requestech), přičemž vítězný návrh se integruje do kódu projektu (repozitář na GitHubu). Hlasováním je možné změnit téměř vše, včetně tohoto pravidla. Hlasování končí vždy v neděli v 9:00 UTC.
Byl vydán Debian 13.3, tj. třetí opravná verze Debianu 13 s kódovým názvem Trixie a Debian 12.13, tj. třináctá opravná verze Debianu 12 s kódovým názvem Bookworm. Ř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.
Na stránkách Evropské komise, na portálu Podělte se o svůj názor, se lze do 3. února podělit o názor k iniciativě Evropské otevřené digitální ekosystémy řešící přístup EU k otevřenému softwaru.
Společnost Kagi stojící za stejnojmenným placeným vyhledávačem vydala (𝕏) alfa verzi linuxové verze (flatpak) svého proprietárního webového prohlížeče Orion.
Firma Bose se po tlaku uživatelů rozhodla, že otevře API svých chytrých reproduktorů SoundTouch, což umožní pokračovat v jejich používání i po plánovaném ukončení podpory v letošním roce. Pro ovládání také bude stále možné využívat oficiální aplikaci, ale už pouze lokálně bez cloudových služeb. Dokumentace API dostupná zde (soubor PDF).
Jiří Eischmann se v příspěvku na svém blogu rozepsal o open source AdGuard Home jako domácí ochraně nejen před reklamou. Adguard Home není plnohodnotným DNS resolverem, funguje jako DNS forwarder s možností filtrování. To znamená, že když přijme DNS dotaz, sám na něj neodpoví, ale přepošle ho na vybraný DNS server a odpovědi zpracovává a filtruje dle nastavených pravidel a následně posílá zpět klientům. Dá se tedy používat k blokování reklamy a škodlivých stránek a k rodičovské kontrole na úrovni DNS.
AI Claude Code od Anthropicu lépe rozumí frameworku Nette, tj. open source frameworku pro tvorbu webových aplikací v PHP. David Grudl napsal plugin Nette pro Claude Code.
Byla vydána prosincová aktualizace aneb nová verze 1.108 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Ve verzi 1.108 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Na lasvegaském veletrhu elektroniky CES byl předveden prototyp notebooku chlazeného pomocí plazmových aktuátorů (DBD). Ačkoliv se nejedná o první nápad svého druhu, nepochybně to je první ukázka praktického použití tohoto způsobu chlazení v běžné elektronice. Co činí plazmové chladící akční členy technologickou výzvou je především vysoká produkce jedovatého ozonu, tu se prý podařilo firmě YPlasma zredukovat dielektrickou
… více »Patchouli je open source implementace EMR grafického tabletu (polohovací zařízení). Projekt je hostován na GitLabu.
Když se tady tak rojí zápisky o Pythonu a C++, musím přispěchat se svou troškou do mlýna - totiž s postem, který je o obojím.
Občas zde prudím se svojí Žirafou, což je indexátor souborového systému, prostě parodie na locate. Používám ji převážně jako "media library" k XMMS.
Taková grafická aplikace, to je soft-realtime záležitost. Na čase odpovědi totiž záleží, pokud se to zasekne, uživatel (tedy já) sice počká, ale je naštvaný. Žirafa navíc zobrazuje výsledky vyhledávání hned během psaní dotazu - takže na výkonu záleží, protože mezi dvěma stisky kláves je tak desetina sekundy.
Žirafa je celá v Pythonu (+GTK). Ze snahy napsat rychlou aplikaci v "pomalém" Pythonu jsem získal některá ponaučení, o která se teď hodlám podělit.
Что такое Python? Python je především, moji milí čtenáři, skriptovací jazyk. Co to vlastně znamená? Přiznám se, že osobně tento termín nemám rád, raději bych řekl, že je to dynamicky typovaný objektově orientovaný jazyk velmi vysoké úrovně.
Skriptovací jazyk je typicky prostředek pro rozšíření funkčnosti nějaké aplikace. Počítá se s tím, že s ním pracuje přímo koncový uživatel oné aplikace, nikoli pouze původní vývojář. Uživatel si naprogramuje novou funkci tak, že manipuluje s objekty té aplikace. Samotná aplikace je obvykle napsána v nějakém jiném jazyce (třeba C++) a některé objekty prostě zpřístupní ke skriptování (tím definuje API).
Jenže Python není nějaký Visual Basic zašitý do Excelu, je to univerzální samostatný jazyk. Chyba lávky. Když programujete v Pythonu tak v podstatě neděláte nic jiného, než že přistupujete k objektům, které jsou implementované v C. Vy prostě skriptujete prostředí, které se sestává ze seznamů, slovníků, stringů, integerů - a žádný z těchto objektů není napsaný v Pythonu.
Srovnejte nyní, moji milí hackeři, s Javou, od které si odmyslíte just-in-time kompilaci (java -Xint). Program v takovéto Javě se skládá z bajtkódu, jehož instrukce se interpretují. Python má taky svůj bajtkód, který interpretuje. Zásadní rozdíl je v tom, že celá standardní knihovna Javy je napsaná v Javě samotné.
Co z toho plyne pro chudáka programátora, který se snaží napsat rychlou aplikaci? Když si napíše nějaký svůj kontejner (třeba variaci na ArrayList), tak má šanci být rychlejší než knihovní implementace (protože si to napsal optimalizovaně pro své konkrétní potřeby). Když se ale o stejnou věc pokusí Pythonista, s velkou pravděpodobností pohoří, protože interpretovanou implementací nemůže konkurovat nativnímu kódu vylezlému z GCC.
Ústřední zásada pro tvorbu rychlých aplikací v Pythonu zní: drž se standardní knihovny. Standardní knihovna bývají dobře optimalizované (platí pro všechny jazyky), v Pythonu je to zvýrazněné tím, že její výkonově kritická část je v C.
V Žirafě jsem potřeboval následující věc: mám dva seznamy integerů (idčka dokumentů) a potřebuji vytvořit jejich množinové sjednocení. Nejrychlejší způsob, jak tohle udělat v Pythonu je takovýto:
def union(a,b):
return list(set(a).union(set(b)))
a to přesto, že oba vstupní seznamy jsou seřazené a stačil by tedy jednoprůchodový algoritmus. Když si takovýto (myslím že optimální) algoritmus napíšete v Pythonu, bude to mnohem pomalejší, než řešení, které oba listy nejprve zkonvertuje na množiny a pak z toho zase vytvoří seznam. (Zmíněný jednoprůchodový algoritmus taky dojede na to, že seznam, do kterého akumulujeme výsledek, se během výpočtu bude muset mnohokrát realokovat.)
V situaci, kdy optimální algoritmus je pomalý, je potřeba vyrobit kýženou implementaci v C nebo něčem podobném. Jak se to dělá v Céčku se můžete dočíst například zde. Není to moc hezké, je potřeba spousta balastoidního kódu starajícího se o vnitřnosti Pythonu. Posléze jsem objevil boost_python, což hromada C++ šablonové magie, která udělá většinu práce za vás.
Kus zdrojáku vydá za tisíc slov; zde je implementace třídy World:
#include <boost/python.hpp>
using namespace boost::python;
struct World
{
std::string msg;
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
int my_sum(list lst) //sums all integers in the list
{
int result = 0;
for(int i = 0; i < len(lst); i++)
{
int val = extract<int>(lst[i]);
result += val;
}
return result;
};
};
BOOST_PYTHON_MODULE(world)
{
class_<World>("World")
.def("greet", &World::greet)
.def("set", &World::set)
.def("my_sum", &World::my_sum)
;
};
Přeloží se to nějak takhle:
g++ world.cpp -I/usr/include/python2.5 -shared -o world.so -lboost_python
a používá následovně:
>>> import world
>>> w = world.World()
>>> w.set("hi!")
>>> w.greet()
'hi!'
>>> w.my_sum([1,2,100])
103
>>>
Python je skvělý jazyk a líbí se mi čím dál víc. Je ale dobré vědět, jaké jsou jeho vlastnsti a možnosti. Když už jste donuceni udělat rozšíření v kompilovaném jezyce, použijte šikovnou knihovnu.
Tiskni
Sdílej:
Posléze jsem objevil boost_python, což hromada C++ šablonové magie, která udělá většinu práce za vás.Pamatuju si, že jsem si před 5 lety hrál s boost_python pod MSVC a můj relativně jednoduchý program o dvou .cpp souborech to kompilovalo 10 minut
paskma@paskma:boost$ time g++ world.cpp -I/usr/include/python2.5 -shared -o world.so -lboost_python real 0m3.387s user 0m2.656s sys 0m0.140sGenuine Intel(R) CPU T2300 @ 1.66GHz
>>> import util >>> util.union(range(1, 10, 2), range(2, 10, 2)) [1, 2, 3, 4, 5, 6, 7, 8, 9]