Portál AbcLinuxu, 25. dubna 2024 19:21

Brython

5.3.2013 00:49 | Přečteno: 1920× | Obecné IT | Výběrový blog | poslední úprava: 5.3.2013 01:38

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.

Jak to funguje

Technicky

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 

Uživatelsky

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>
..

doc

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

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í.

print

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..

local_storage

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

Callbacky

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.

Prakticky

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.

pyjamas

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/á).

Licence

Co se licence týče, projekt používá BSD licenci.

Slovo závěrem

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í.

Odkazy

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

       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

Bystroushaak avatar 5.3.2013 00:54 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Brython
Odpovědět | Sbalit | Link | Blokovat | Admin
Ani nevím proč jsem to vlastně nepublikoval už dřív, teď jsem byl nějak líný to po sobě znova číst, tak doufám že to za ten měsíc a půl není moc outdated.
blog.rfox.eu
Jendа avatar 5.3.2013 01:42 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Brython
Odpovědět | Sbalit | Link | Blokovat | Admin
Proč tak složitě? Nestačí si prostě spustit ve stránce počítač s Linuxem a Python provádět v něm?
Já to s tou denacifikací Slovenska myslel vážně.
Bystroushaak avatar 5.3.2013 01:54 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Brython
Rychlost..

BTW; Zkoušel jsi do něj někdy dostat python? :) Já jo a moc sranda to není.
xkucf03 avatar 5.3.2013 18:53 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Brython
Hlavně bych uvítal, kdyby se konečně začaly psát pluginy pro nativní podporu „alternativních“ skriptovacích jazyků. Tohle překládání z jednoho do druhého je šíleně neefektivní, v podstatě se staví akorát další a další vrstvy abstrakce a systém se akorát zesložiťuje. Překlad do JS může zůstat jako náhradní řešení pro případ, že bude chybět nativní interpret.
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
Jendа avatar 5.3.2013 19:07 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Brython
Vždyť v tom linuxovém počítači si můžeš spustit libovolnou aplikaci v libovolném jazyce.

(pozn.: vlákno jsem začal jako vtip, ale přijde mi, že se to tak fakt dělá)
Bystroushaak avatar 5.3.2013 19:16 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Brython
Jenže to je plugin, tedy něco, co musíš uživatele donutit nainstalovat. Osobně jsem třeba k pluginům velmi skeptický a jen tak něco si do počítače nenainstaluji, už vůbec ne proto, že se v tom někomu chtělo programovat víc než v javascriptu.

Brython na druhou stranu funguje tak, že si toho uživatel ani nevšimne a jede slušně i na slabších strojích, jako je moje 5 let staré EEE.
5.3.2013 07:24 xxxxxxxxxxx | skóre: 13 | blog: rhrtshrth
Rozbalit Rozbalit vše Re: Brython
Odpovědět | Sbalit | Link | Blokovat | Admin
dík, bude se hodit. :-)
mirec avatar 5.3.2013 08:49 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
Rozbalit Rozbalit vše Re: Brython
Odpovědět | Sbalit | Link | Blokovat | Admin

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.

LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
5.3.2013 09:10 Aleš Kapica | skóre: 51 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: Brython

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.
5.3.2013 10:44 xxxxxxxxxxx | skóre: 13 | blog: rhrtshrth
Rozbalit Rozbalit vše Re: Brython
Nic není dokonalé a nikdy nebude. Všechno je to neustálý hon za dokonalým cílem, "fatamorgánou"...
mirec avatar 5.3.2013 11:15 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
Rozbalit Rozbalit vše Re: Brython
Nejde o to, aby to bolo dokonalé, ale aby to aspoň nesmerovalo k horšiemu. Žiaľ ako tak sledujem vývoj webov tak to k horšiemu ide ...
LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
5.3.2013 13:21 JS
Rozbalit Rozbalit vše Re: Brython
I kdyz priklon k webaplikacim chapu (je pro to mnoho praktickych duvodu), mate naprostou pravdu. HTML/CSS/Javascript jsou na psani slozitejsich aplikaci nevhodne. Data, ktera by v tlustem klientovi byla ulozena v pameti, se musi ve webove aplikaci serializovat/deserializovat a posilat po siti; a vymenou za tuto praci navic (ktera stoji pomerne drahou mobilni energii) dostanete bezpecnostni rizika a nutnost pripojeni k internetu.

Dale, desktopove aplikace scheduluje operacni system; na to, aby se browser stal rovnocennym operacnimu systemu zatim doba nedozrala. Vsechno, co uz v OS existuje leta, se na urovni browseru vynaleza znovu - bezpecnost, filesystem, izolace procesu..
5.3.2013 17:53 Kvakor
Rozbalit Rozbalit vše Re: Brython
Občas si říkám, že by minimálně u některých webů, co obsahují spousty Javascriptu, bylo opravdu výhodnější nechat běžet každý tab jako samostatn0 vlákno, protože potom by ho už plánoval systém a ne prohlížeč, kterému to jde jako kočce pastva. Nejhorší to je, když nějaký tab spotřebuje sto procent času jádra, na kterém prohlížeč běží, zatímco ostatní jádra jsou nevyužitá a přesto se nedá koukat na jiné taby.
Bystroushaak avatar 5.3.2013 18:41 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Brython
Mě spíš zaráží, že to tak není. Mám úplně nový 6 jádrový počítač a stejně se firefox dokáže sekat na pitomé webovce, což je dost smutné.
Jendа avatar 5.3.2013 19:08 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Brython
S webovkou, která dokáže vytížit i jen jedno jádro, je něco špatně.
5.3.2013 13:14 JS
Rozbalit Rozbalit vše Re: Brython
Odpovědět | Sbalit | Link | Blokovat | Admin
Podle me je to beznadejne. Javascript nema poradne knihovny, a hlavni sila Pythonu je prave v nich. I kdybychom si odmysleli vsechny problemy s prekladem, tohle zustane zasadnim problemem. Daleko uzitecnejsim a jednodussim projektem by bylo proste napsat (nebo slozit z uz existujicich) JS knihovny podobne Pythonu.
Bystroushaak avatar 5.3.2013 13:20 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Brython
Vtip je tak nějak v tom, že můžeš vzít python zdroják a prostě ho importnout. Druhá věc je, že spousta z nich ti teď nepůjde importnout kvůli vnitřním bugům, další spousta pak bude k ničemu, protože práce s diskem, sockety atd.. se v prohlížeči nekoná.
5.3.2013 13:24 JS
Rozbalit Rozbalit vše Re: Brython
No prave, me prijde, ze dost podstatna a zajimava cast Python knihoven je napsana nativne v C, nebo na nich zavisi. Co treba pouzivam dost v posledni dobe je zabudovane sqlite. Takze je opravdu namiste otazka, kolik zdrojaku se takto da importovat.
5.3.2013 13:25 JS
Rozbalit Rozbalit vše Re: Brython
Navic, zase - nebylo to tu uz s Javou, pokus napsat skoro vsechno v Jave? Nakonec to bylo pomale, a proto je JVM tak velke. U noveho jazyka se tento pristup da pochopit. Ale nakonec se stejne bez nejake formy kompilace JS do nativniho kodu patrne neobejdeme.
Bystroushaak avatar 5.3.2013 13:29 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Brython
No, já od toho neočekávám světovou dominanci, ani nic zázračného. Je to pro mě prostě jen zajímavý projekt.

Jinak velká výhoda pythonu je snadná manipulace s řetězci. Vždy když mám kus pythonu, ve kterém dělám různou řetězcovou magii přepisovat do něčeho jiného s vyjímkou D, tak bych brečel.
5.3.2013 15:34 JS
Rozbalit Rozbalit vše Re: Brython
No, k te manipulaci s retezci - nevim, jak je to treba v Perlu, ale s regularnimi vyrazy je nekdy docela opruz. Ale mozna opravdu patri k tem lepsim, co ja vim. 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.

Co konkretne se ti v Pythonu tak libi na praci s retezci?
Bystroushaak avatar 5.3.2013 15:55 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Brython
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ě.
5.3.2013 17:21 JS
Rozbalit Rozbalit vše Re: Brython
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.

Jinak standardni metody Pythonu (a slicy) na retezcich mi chybi v mnoha jazycich. Treba v .NETu. :-)
Bystroushaak avatar 5.3.2013 17:41 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Brython
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í.
pavlix avatar 5.3.2013 15:59 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Brython
Nějaké ty pythoní parsery jsem zkoušel, ale momentálně je mým naprostým favoritem Augeas.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
5.3.2013 17:16 JS
Rozbalit Rozbalit vše Re: Brython
Tenhle Augeas? To jsem neznal.. Moc popisu tam neni, ale jestli to chapu spravne, ma to vlastni DSL jazyk na parsovani.. Docela pekne zda se, nevis, jestli existuje neco podobneho i na binarni soubory?
pavlix avatar 5.3.2013 19:01 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Brython
Jo, tenhle. Na binární soubory netuším. Ale většinou se zpracovávají líp a pokud by byly komplikovanější, tak by možná stálo za to zkusit, zda by Augeas nakonec nešel i na ně, popřípadě ho upravit tak, aby šel.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
6.3.2013 10:55 JS
Rozbalit Rozbalit vše Re: Brython
Ja myslim, ze mezi textovymi a binarnimi soubory jsou znacne rozdily, takze je tezko predstavitelne, ze muze DSL na popis jednech bude fungovat na ty druhe. Napr. v binarnich souborech je bezne, ze velikost nebo pozice zaznamu je ulozena ja binarni cislo (zatimco u textu se pouziva oddelovac). Nedovedu si predstavit, jak by tohle rozumne mohl cist textovy parser.
pavlix avatar 6.3.2013 11:06 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Brython
Je fakt, že ty velikosti budou peklo. Ale stejně bych se jich zkusil zeptat, třeba budou vědět o nějakém jiném projektu.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
xkucf03 avatar 6.3.2013 15:08 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Brython
Viz co jsem psal ve vedlejší diskusi – IMHO nemá cenu dělat na koleně nějaké vlastní parsování zvlášť u binárních formátů – binárních formátů či protokolů je už celkem dost a nemá valný smysl vymýšlet další – rozumné řešení je si vybrat nějaký existující* (meta)formát a k němu si dopsat vlastní slovník – řešit pouze tu sémantiku, názvy polí, struktury, datové typy… ale už ne, jak se to zakóduje (to už bylo vyřešeno a mnohokrát).
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
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
6.3.2013 15:32 JS
Rozbalit Rozbalit vše Re: Brython
Ale ty jsi nepochopil, proc to chci - prave proto, ze jich je mnoho, by se hodil parsovaci DSL ktery popisuje bezne pripady. To neni o tom vymyslet vlastni format, ale byt schopen uniformne cist existujici formaty.

K cemu by takova vec mohla byt dobra? Napr. k inteligentnimi porovnavani, vyhledavani rozdilu, kompresi, atd.
xkucf03 avatar 9.3.2013 12:53 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Brython
DSL ktery popisuje bezne pripady
Jenž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
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
Bystroushaak avatar 9.3.2013 15:25 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Brython
data pak můžeš transformovat pomocí XSLT
Wow, 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.
xkucf03 avatar 9.3.2013 15:31 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Brython
To má být vtip? Je tu sice XQuery, ale v některých ohledech je XSLT stále nepřekonané.
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
9.3.2013 15:35 Radek Miček | skóre: 23 | blog: radekm_blog
Rozbalit Rozbalit vše Re: Brython
v některých ohledech je XSLT stále nepřekonané

Třeba v ukrutné syntaxi :-)

xkucf03 avatar 9.3.2013 16:06 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Brython

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ů:

  • XSLT šablonu lze pojmout mj. tak, že odpovídá výslednému dokumentu (např. XHTML stránce, konfiguráku, ISDOC, SVG, LaTeX, TXT atd.) a sem tam obsahuje příkazy pro doplnění dynamických dat nebo nějaké větvení a cykly. Je to podobné jako původní myšlenka PHP – ale udělané lépe. Díky tomu se používá velice jednoduše – nízká vstupní bariéra, a XSLT šablony si tak může začít psát nebo upravovat i administrátor nebo obecně neprogramátor.
  • Na elementy ze vstupu se aplikují šablony <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

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
Bystroushaak avatar 9.3.2013 21:19 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Brython
Tak jsem na to teď koukal a začíná se mi to čím dál tím víc líbit. Máte někdo tip na dobrý tutoriál?
xkucf03 avatar 9.3.2013 22:38 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Brython
:-)

XSLT v příkladech od Jirky Koska. A taky se můžeš inspirovat u zdrojáků mého XML Web generátoru. Až se prokoušeš úplnými základy (celkem brzy) a začneš řešit konkrétní otázky, tak je stejně nejlepší STFW a většinu odpovědí najdeš na Stackowerflow nebo podobných webech.

Co se týče verzí XSLT: nejpřenositelnější je 1.0, ta funguje všude (např. 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)
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
pavlix avatar 10.3.2013 14:05 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Brython
Touto fází jsem si taky prošel. A pak jsem začal přepisovat stromy rovnou z Pythonu. Výsledek byl méně standardizovaný, ale mnohem dříve hotový.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
Bystroushaak avatar 9.3.2013 17:08 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Brython
Nevím, to je jen můj dojem, který jsem získal po chvíli googlení před pár týdny.
mirec avatar 9.3.2013 17:09 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
Rozbalit Rozbalit vše Re: Brython
Ja používam bežne (hlavne keď mi niekto mieri zbraňou na hlavu a chce po mne nejaký importný / exportný plugin pre libreoffice calc). No dobre, tú zbraň som si vymyslel ;-)
LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
Josef Kufner avatar 5.3.2013 13:50 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Brython
O knihovny nejde. Vem si napŕíklad, že máš na serveru kus kódu, který přepočítává nějaké datové struktury a pak je zobrazí do HTML. Udělá se HTTP GET, spustí se na serveru kus Pythonu, přepočítá se, pošle se klientovi vísledek. No a v okamžiku, kdy chceš udělat suprmoderní Javascriptovou aplikaci (třeba jen kvůli tomu, že server nestíhá), tak musíš tenhle kus Pyuthonu přepsat do Javascriptu, aby se klient nemusel ptát na každou blbost serveru, ale mohl si to spočítat sám. A to je přesně okamžik, kdy ti takovýto nástroj přijde vhod.

Další pěkným použitím je validace formulářů, kdy máš funkci, které dáš data z formuláře a ona řekne, co je špatně. To musí být bezpodmínečně na serveru, ale je velmi žádoucí to mít i na klientovi, aby to rovnou ukazovalo, co uživatel podělal. Nyní se taková pravidla píšou dvakrát, obvykle se použije knihovna se sadou běžných pravidel a speciality se řeší jen na serveru.

Další ukázkou je náhled komentáře před odesláním tady na AbcLinuxu. Kdyby bylo možné snadno vzít kód ze serveru a spustit ho na klientovi, tak bychom nemuseli mačkat čudlík "Zopakuj náhled komentáře" ;-)
Hello world ! Segmentation fault (core dumped)
5.3.2013 15:42 JS
Rozbalit Rozbalit vše Re: Brython
Uznavam, ze tohle je asi dobry use case. Otazka ale je, jak moc to takhle pujde, pokud s tim nebudu dopredu pocitat..

Ono o tohle se snazila uz Java.. Jenom o duvod vic proc jsou webove aplikace krok zpet.
7.3.2013 00:49 __dark__
Rozbalit Rozbalit vše Re: Brython
node.js :)
Josef Kufner avatar 7.3.2013 13:42 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Brython
Jo, tohle jsem čekal ;-)
Hello world ! Segmentation fault (core dumped)
5.3.2013 21:50 diverman | skóre: 32 | blog: život s tučňáčkem
Rozbalit Rozbalit vše Re: Brython
Odpovědět | Sbalit | Link | Blokovat | Admin
To, že prohlížeče neumějí nativně python, případně perl, ruby, apod. považuji největší handikep současného webu. Jen si představte programovat pro prohlížeč ve svém oblíbeném jazyce.
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
Bystroushaak avatar 5.3.2013 22:52 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Brython
Jo, to by bylo dost dobré, jenže pak by byla otázka, kde se vlastně zastavit. U pythonu? U ruby? U c? U bashe? Výsledný prohlížeč by pak mohl být krapet nekonečně veliký :)
5.3.2013 23:44 diverman | skóre: 32 | blog: život s tučňáčkem
Rozbalit Rozbalit vše Re: Brython
Osobne by mi stacil ten python.
deb http://ftp.cz.debian.org/debian jessie main contrib non-free
Josef Kufner avatar 6.3.2013 00:07 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Brython
Jo, pak přijde někdo další, že chce Ruby, pak další, že PHP, pak další... bleeee.
Hello world ! Segmentation fault (core dumped)
6.3.2013 05:16 JS
Rozbalit Rozbalit vše Re: Brython
Kde se zastavit? To je jednoduche - predevsim oddelit jazyk a VM. Takova reseni uz tu byla - JVM, Flash (i kdyz ani jedno neni idealni). A nakonec obe padla z politickych duvodu.
Acci avatar 6.3.2013 08:55 Acci | skóre: 3 | blog: Jen na chvíli…
Rozbalit Rozbalit vše Re: Brython
Něco takového se chystá: asm.js.
6.3.2013 10:56 JS
Rozbalit Rozbalit vše Re: Brython
Jenze to neresi ten politicky duvod.. Pokud ten standard nepodpori MS, Apple a Google, nema to sanci.
Acci avatar 6.3.2013 19:52 Acci | skóre: 3 | blog: Jen na chvíli…
Rozbalit Rozbalit vše Re: Brython
Právě že řeší: program přeložený do asm.js dokáže zpracovat jakýkoliv JavaScriptový engine – jen Mozilla Firefox tyto aplikace bude zpracovávat rychleji.
Acci avatar 6.3.2013 19:53 Acci | skóre: 3 | blog: Jen na chvíli…
Rozbalit Rozbalit vše Re: Brython
A až se začnou objevovat benchmarky na webech, kde bude Firefox dvakrát rychlejší než Chrome, Google jej bude muset implementovat též.
Grunt avatar 6.3.2013 19:54 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
Rozbalit Rozbalit vše Re: Brython
Petr Tomeš si změnil nick?
Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
pavlix avatar 6.3.2013 09:53 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Brython
Kde se zastavit? To je jednoduche - predevsim oddelit jazyk a VM.
+1
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
Grunt avatar 6.3.2013 16:31 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
Rozbalit Rozbalit vše Re: Brython
Pamatujete operační systém EMACS? Tohle je dost podobné. Není nad to vypadnout s mobilem do přírody a při spuštění kalkulačky dostat hlášku o nepřipojení k síti a nebo naopak si nepřečíst kus textu v linksu, protože musí být ten text u klienta vygenerován (o pokročilých úkonech jako je třeba ebaniking z konzole nemluvím vůbec, to je víceméně vlhký sen).
Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.