Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.
Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.
Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových
… více »Richard Stallman přednáší ve středu 7. května od 16:30 na Technické univerzitě v Liberci o vlivu technologií na svobodu. Přednáška je určená jak odborné tak laické veřejnosti.
Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.04.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.
TmuxAI (GitHub) je AI asistent pro práci v terminálu. Vyžaduje účet na OpenRouter.
Byla vydána nová verze R14.1.4 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5, Wikipedie). Přehled novinek i s náhledy v poznámkách k vydání. Podrobný přehled v Changelogu.
Bylo vydáno OpenBSD 7.7. Opět bez písničky.
V Tiraně proběhl letošní Linux App Summit (LAS) (Mastodon). Zatím nesestříhané videozáznamy přednášek jsou k dispozici na YouTube.
Víte že můžete odebírat mé blogy pomocí RSS? (Co je to RSS?)
Od určité doby jsou všechny texty které zde publikuji verzované na Githubu.
Jestliže najdete chybu, nepište mi do diskuze a rovnou jí opravte. Github má online editor, není to skoro žádná práce a podstatně mi tím usnadníte život. Taky vás čeká věčná sláva v commit logu :)
Rád bych tímto blogpostem trochu přiblížil projekt nazvaný Brython. Jedná se o python běžící v prohlížeči, který je dynamicky za běhu transformován do JavaScriptu, jehož engine má pak na starosti interpretaci.
Brython se na rozdíl od podobných projektů (LLVM cPython) nesnaží o překlad intepreteru. Naopak je založen na podobnosti JavaScriptu s pythonem. Brython tedy funguje jako transformátor (nevím zda tomu říkat crosscompiler, metacompiler, či jak vlastně), který vezme python kód a přeloží ho na JavaScript. Ten je poté vykonán JavaScriptovým enginem v browseru, díky čemuž dosahuje podstatně většího výkonu než zmiňovaný LLVM cPython, kde je emulován celý interpreter.
V praxi to vypadá nějak takto:
def foo(bar, baz): return str(bar) + str(baz)
Kód po překladu Brythonem:
function foo(){ document.$func_info=["__main__","foo"] $ns=$MakeArgs("foo",arguments,['bar','baz'],{},null,null) for($var in $ns){eval("var "+$var+"=$ns[$var]")} return str(bar).__add__(str(baz)) }
Brython má několik tisíc řádek v JavaScriptu a můžete ho stáhnout z SVN repozitáře projektu na google code:
svn checkout http://brython.googlecode.com/svn/trunk/ brython-read-only
Z uživatelského hlediska je použití velmi jednoduché. Stačí jen do vaší HTML stránky vložit soubor brython.js (127kB) a následně zavolat v příhodný okamžik funkci brython(), která ho inicializuje. Pak vám již nic nebrání používat python scripty v definované v příslušném tagu <script type="text/python">.
Celé to může vypadat následovně:
.. <script src="./brython.js" type="text/javascript"></script> .. <body onLoad="brython()"> .. <script type="text/python"> # .. váš python script, který pracuje se stránkou a případným JavaScriptem na ní použitým </script> .. </body> ..
Jakmile začnete s Brythonem koketovat, narazíte velice rychle na potřebu hrabat se v DOMu konkrétní stránky, kde ho spouštíte.
K tomu přesně slouží objekt doc, který se do jisté míry chová jako slovník (key:val storage), jenž je možné indexovat id atributy html tagů. Pokud si necháte pomocí pythonní funkce dir() vypsat jeho vnitřnosti, zjistíte, že se jedná o přemapovaný document z JavaScriptu.
Rada:
Z nějakého důvodu není možné používat samotný document. Pokud tedy z Brythonu chcete přistupovat k položce document.$object, alternativa by měla být doc.$object (nikoliv doc["$object"], protože $object není id, ale název objektu). To bohužel nefunguje, protože $ není validní název, takže vám to Brython zarazí SyntaxErrorem.
Nebudu vás dále napínat - stačí k tomu použít python metody, které se uplatňují jako settery a gettery:
doc.__setattr__("$object", val) doc.__getattr__("$object")
Autor Brythonu se rozhodl přetížit operátor <= tak, aby sloužil jako přidávátko HTML tagů do DOMu. Stále se s ním dá porovnávat, ale pokud použijete jako operand jednu z vyhrazených funkcí, nedochází k porovnání, ale k přidání prvku do DOMu dle následujícího schématu:
TAG([content,[attributes]])
Přičemž za TAG si můžete dosadit následující funkce:
A ABBR ACRONYM ADDRESS APPLET AREA ARTICLE ASIDE AUDIO B BASE BASEFONT BDO BIG BLOCKQUOTE BODY BR BUTTON CANVAS CAPTION CENTER CITE CODE COL COLGROUP COMMAND DATALIST DD DEL DETAILS DFN DIR DIV DL DT EM FIELDSET FIGURE FONT FOOTER FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HEADER HGROUP HR HTML I IFRAME IMG INPUT INS ISINDEX KBD LABEL LEGEND LI LINK MAP MARK MENU META METER NAV NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION OUTPUT P PARAM PRE PROGRESS Q RP RT RUBY S SAMP SCRIPT SECTION SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD TEXTAREA TFOOT TH THEAD TIME TITLE TR TT U UL VAR VIDEO
Ukázka:
doc <= DIV("Obsah divu", id="id_divu")
import funguje skoro tak, jak by jeden čekal. Můžete importovat jak JavaScriptové zdrojáky, tak pythonní, problém ovšem je, že se tak děje pomocí Ajax requestu do složky /libs. To je sice pěkné, ovšem díky SOP (Same Origin Policy) vám browser zabraňuje stahovat zdrojáky z cizích webů.
To je možné částečně obejít přidáním nového <script src=".."> tagu do DOMu, což způsobí načtení zdrojového souboru z jiného serveru. Bohužel, takto načtený soubor nemůžete jednoduše importnout jako modul, řešení je tedy načíst ho jako řetězec (což musí být provedeno přímo v daném souboru) a ten pak prohnat importovací funkcí.
Je možné, že časem narazíte na potřebu použít funkci print() pro výpis výsledků. K tomu aby je vypisovala tam kam chcete je zapotřebí provést přesměrování stdout a stderr, které jsou definovány v modulu sys:
class StdOut: def __init__(self, target): self.target = doc[target] def write(self, data): self.target.innerHTML += str(data) class StdErr(StdOut): def __init__(self, target): self.target = doc[target] def write(self, data): self.target.innerHTML += "<font color='red'>" + str(data) + "</font>" sys.stdout = StdOut("id_tagu_kam_chceme_vystup_presmerovat") sys.stderr = StdErr("id_tagu_kam_chceme_vystup_presmerovat")
Pokud z nějakého důvodu (SOP) nemůžete importnout modul sys, dá se to udělat i takhle:
doc.__setattr__("$stdout", StdOut("id_tagu_kam_chceme_vystup_presmerovat")) doc.__setattr__("$stderr", StdErr("id_tagu_kam_chceme_vystup_presmerovat"))
Třídy je nutné nadefinovat, protože print() očekává metody .write(). Čistě teoreticky by na to mohly stačit funkce, ale takhle se dá kód rozšiřovat až jednou budete potřebovat cosi jako .flush() atd..
Pokud chcete uložit data trvalejšího rázu, můžete je nacpat do proměnné nazvané local_storage. Je to HTML5 výmysl a většina uživatelů se dat sem umístěných nebude umět zbavit, což se nedá říct o cookies a sessions.
Používá se to jako slovník, s tím že v momentální implementaci neumí metodu .keys(), která normálně vrací seznam položek ve slovníku uložených.
local_storage["foo"] = 1 # set local_storage["foo"] # get
Kód generovaný Brythonem je možné zaměňovat za JavaScript. Díky tomu není problém navěsit si na příslušné HTML tagy různé callbacky, které povedou na váš python kód, jako je třeba onload, onclick a další, běžně používané v JavaScriptu.
Z praktického hlediska se nejedná tak úplně o python. Píši záměrně více/méně, protože je zde několik změn (operátor <=) a hlavně obrovský počet položek na TODO listu.
V současnosti neexistuje podpora dědičnosti (před cca měsícem nebyla ani podpora tříd), vyjímky fungují jen v základním režimu, kdy se nedají odchytávat konkrétní instance. Ve chvíli kdy jsem na projekt poprvé narazil například neuměl Brython používat k odsazení tabulátory, nebo do nedávna nebyla u stringu přítomna metoda .splitlines().
Přítomny jsou tisíce bugů. Pokud vám kus kódu vrátí do pythonu JavaScriptovou hodnotu <undefined>, máte se na co těšit, protože se jedná o z pythonu neporovnatelný Cthulhu typ, se kterým je skutečně sranda pracovat. Zábavné je také chování .replace(), pokud mu dáte replacovat znak $ či ?.
Pokud na podobnou chybu nebo nedostatek narazíte, doporučuji jí nahlásit. Tohle bylo poprvé kdy jsem se takto zapojoval, takže mě docela překvapila jednoduchost postupu, kdy prostě popíšete co vás trápí a autoři projektu to do pár dní či hodin vyřeší.
Nic vám samozřejmě nebrání v hlubším zapojení se do vývoje a v zaslání patche jenž chybu přímo opraví, tedy samozřejmě pokud ovládáte JavaScript na dostatečné úrovni.
Na světě existuje podobný projekt, nazvaný pyjamas, který před nějakou dobou vyvíjel google. Těžko říct co se mu stalo, protože jsem o něm dlouho neslyšel.
Naposledy když jsem si s ním zkoušel hrát, tak jsem nebyl schopný ho nějak kloudně zprovoznit. Nakonec se mi tenkrát tuším povedlo vygenerovat Hello world příklad, ze kterého vypadl blob o desítkách kB a jeho použitelnost byla silně diskutabilní.
Abych to shrnul: Všechno to čím Brython vyniká (jednoduchost, komunita, přehledný kód) pyjamas dle mého názoru postrád(alo/á).
Co se licence týče, projekt používá BSD licenci.
Ačkoliv poslední kapitola může vypadat docela pesimisticky a stavit Brython do pozice nepoužitelné hračky, nerad bych vzbuzoval tento dojem.
Brython se rozhodně dá používat na jednodušší projekty a pokud jste tak jako já programátoři, pro které je python přirozeností, uvidíte, že se vám bude líbit víc než JavaScript. Jen to nechce očekávat revoluci která vytlačí JS, ale spíš zajímavou technologickou alternativu ve stádiu vývoje.
Možná je to dáno tím, že v poslední době tíhnu k poněkud hipsterským projektům, možná jednoduchostí, či přátelskou a zatím nezkurvenou komunitou kolem celého projektu, ale Brython mi přijde jako skvělý projekt, který rozhodně stojí za prozkoumání.
http://brython.info - stránky projektu
http://brython.info/doc/en/index.html - nějaká ta základní dokumentace
http://brython.info/tests/console_en.html - cosi jako brython konzole - momentálně mám rozepsaný použitelnější kousek
http://brython.info/gallery/gallery_en.html - ukázky a příklady
https://groups.google.com/forum/?fromgroups=#!forum/brython - mailová konference (pokud se chcete zapojit bez použití hnusného webového rozhranní, pošlete mail na brython+subscribe@googlegroups.com).
http://code.google.com/p/brython/ - projekt na google code
http://code.google.com/p/brython/issues/list - seznam nahlášených chyb
Tiskni
Sdílej:
Ako myšlienka pekné ... ale ja neviem. Vývoj webov ma pomaly zabíja ... všetko je tu kompletne zlé. Jazyky sú zlé, ich použitie je zlé a ťažko sa niečo zmení prevodom python kódu na javascript. Nechápem ako niekto môže robiť weby. Nechápem ako je možné, že na obyčajnom google.com mi občas nefunguje história (majú tam riadenie back / forward pomocou js a občas to jednoducho nefunguje). Nechápem ako je možné, že nič nefunguje poriadne, nič nie je poriadne dotiahnuté, všetko funguje ako by tak na oko.
To víš. Jdou s dobou.Nechápem ako je možné, že nič nefunguje poriadne, nič nie je poriadne dotiahnuté, všetko funguje ako by tak na oko.
Ale dokazal bych si predstavit, ze i Python na tom bude lepe - napriklad by mohl byt ve standardni knihovne nejaky parsovaci/lexerovaci modul, neco jako pyparsing.Jo, pyparsing je fajn.
Co konkretne se ti v Pythonu tak libi na praci s retezci?Slices, různé metody, jako .replace() atd.. Celkově prostě jednoduchost a intuitivnost, kdy píšu subjektivně polovinu toho, co třeba v javě.
No me treba konkretne u regularnich vyrazu vadi, ze se porad musi testovat, jestli match == None. To je trochu nesikovne, ale mozna to pisu spatne.Mně u nich vadí, že je vždy do příště zapomenu, navíc je to nepřehledná slitá prasárna. BNF u pyparsing mi přijde jako mnohem čistější řešení.
Nedovedu si predstavit, jak by tohle rozumne mohl cist textovy parser.souhlas – binární a textové formáty jsou úplně jiné světy *) tudíž k němu jsou i parsery a knihovny
DSL ktery popisuje bezne pripadyJenže co jsou to běžné případy? Obávám se, že takový popisný jazyk by musel* být natolik bohatý, že by to byl běžný programovací jazyk… Spíš bych to řešil jako framework, do kterého by se daly psát moduly pro různé formáty – vstupem by byl proud bajtů a výstupem DOM, SAX nebo něco podobného. Framework by poskytoval funkce pro běžné úlohy (parsování různých číselných formátů, různé dekódování atd.), které by modul mohl volat a tím si ušetřit práci – ale kdyby na něco funkce nebyla, bylo by možné si ji v modulu napsat zcela bez omezení. S tímhle si trochu hraju** v Javě: abys mohl načítat různé formáty, abstrahovat od nich a pracovat s těmi daty jednotným způsobem – data pak můžeš transformovat pomocí XSLT nebo nad nimi dělat XPath dotazy, i když to původně byly třeba INI soubory, JSON nebo třeba ASN.1. *) jinak asi nepokryješ dost formátů, ale jen nějakou nezajímavou podskupinu (samozřejmě záleží, za jakým účelem to děláš – třeba máš vyhlídnuté formáty, pro které by to šlo – ale jako zcela obecné řešení mi to přijde utopie) **) už je to nějakou dobu, teď to leží rozpracované v šuplíku
data pak můžeš transformovat pomocí XSLTWow, on někdo XSLT skutečně používá? Nedávno jsem se o to trochu zajímal a podle toho co jsem našel to působilo jako technologie, která nějak nenápadně umřela.
v některých ohledech je XSLT stále nepřekonané
Třeba v ukrutné syntaxi
Je fakt, že nutnost psát if+else* pomocí tří elementů může některé slabší povahy odradit (ale má to svoje důvody a i něco do sebe…)
XSLT považuji za nepřekonané ze dvou důvodů:
<xsl:template match="…">
. Těch může být více a vybere se ta s nejlepší shodou (XPath dotazem). Šablona si udělá, co potřebuje, a pak může zase předat řízení dál pomocí <xsl:apply-templates/>
. To, co by se v jiných jazycích muselo řešit pomocí spousty ifů, switchů a cyklů, máš tady bez práce.*) nebo if, else if…, else – zatímco samotný if je jen na jeden element
xsltproc
). Pak jsou obvykle podporovaná rozšíření EXSLT. Verze 2.0 je toho umí ještě víc, ale potřebuješ procesor, který ji podporuje – třeba Saxon (aptitude install libsaxonb-java
, licence: Mozilla Public License version 1.0).
Taky koukni na knihovnu XSLT Standard Library.
Jako IDE se dá použít jEdit (spuštění transformace na jedno kliknutí) nebo cokoli na příkazové řádce (stačí zavolat xsltproc nebo saxon). V neposlední řadě můžeš použít běžný webový prohlížeč® jako např. Firefox a mít na začátku XML souboru:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="šablona.xsl"?>a prohlížeč udělá transformaci sám a není potřeba ji dělat do souboru – stačí mačkat F5 v prohlížeči. (příklad BTW: takhle by podle mého měly vypadat konfigurační soubory – uživatel by k nim měl dostat schéma, aby vědět co tam psát, a taky šablonu, aby si mohl konfigurák zobrazit v prohlížeči v lidsky čitelné podobě a s výkladem)
from jquery import jQuery if __name__ == '__main__': jQuery('input[type="button"]').click(lambda but: but.css('display', 'none'))
deb http://ftp.cz.debian.org/debian jessie main contrib non-free
deb http://ftp.cz.debian.org/debian jessie main contrib non-free
Kde se zastavit? To je jednoduche - predevsim oddelit jazyk a VM.+1