Lidi dělají divné věci. Například spouští Linux v Excelu. Využít je emulátor RISC-V mini-rv32ima sestavený jako knihovna DLL, která je volaná z makra VBA (Visual Basic for Applications).
Revolut nabídne neomezený mobilní tarif za 12,50 eur (312 Kč). Aktuálně startuje ve Velké Británii a Německu.
Společnost Amazon miliardáře Jeffa Bezose vypustila na oběžnou dráhu první várku družic svého projektu Kuiper, který má z vesmíru poskytovat vysokorychlostní internetové připojení po celém světě a snažit se konkurovat nyní dominantnímu Starlinku nejbohatšího muže planety Elona Muska.
Poslední aktualizací začal model GPT-4o uživatelům příliš podlézat. OpenAI jej tak vrátila k předchozí verzi.
Google Chrome 136 byl prohlášen za stabilní. Nejnovější stabilní verze 136.0.7103.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 8 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.
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.
Viem že neprinášam na stránkach tohto blogu žiadnu novinku ale napriek tomu sa chcem podeliť o skúsenosti z vývoja WebUI aplikácie s pomocou GWT. Google Web Toolkit GWT je nástroj na vývoj WebUI aplikácie, ktorý je založený na myšlienke krížovej kompilácie Java -> JavaScript. Pre javovských vývojárov prináša jednoduchú cestu ako písať WebUI aplikáciu, v známom jazyku, bez toho aby sa museli učiť JavaScript. Určite sa ale nevyhnú CSS a HTML.
Vývojové kroky:
webAppCreator -out HelloWorld sk.dominanz.gwt.HelloWorld'
čo vytvorí kostru aplikácie v súborovom systémeant devmode
. (Krížová kompilácia je pri väčšom projekte dosť dlhý proces.)ant war
.Dôvodov prečo sme sa rozhodli používať GWT bolo niekoľko. Vymenujem ich v poradí od toho s najväčšou váhou.
Projekt, ktorý sme pomocou GWT realizovali možme v automobilovej terminológii nazvať nižšia stredna trieda. Rozsah projektu je cca. 1400 súborov/160000 riadkov z toho *.java je cca. 1100 súborov/ 135000riadkov. Projekt rieši problematiku DMS klienta.
Kód klienta, je časť kódu, ktorá je prekladaná kr. prekladačom do JS. Obsahuje UI časť aplikácie. Funkcionalita je obmedzená možnosťami JRE emulation library.
Serverová časť, je Java kód, ktorý beží na strane servlet kontajnera napr. Tomcat. V tejto časti je prístupná Java v plnej funkcionalite.
Zdielana časť, slúži na prepojenie serverovej a klientskej časti. Platia pre ňu obmedzenia ako v klientskej časti. Na tomto mieste definuje triedy, ktoré sú jednoduché, väčšinou iba zapúzdruju dáta a používajú sa v GWT-RPC volaniach.
DMS systém poskytuje SOAP-WS API definované vo wsdl súbore. Klientské triedy sme generovali utilitou wsimport, označme ich ako skupina A. Problém na ktorý sme narazili bola nepoužiteľnosť niektorých tried zo skupiny A na klientskej strane kódu kvôli obmedzeniam JRE emulation library. Kedže dochádza k úpravam wsdl definície a tým pádom k regenerovaniu WS klienta ako jedine schopné riešenie sa ukázalo vygenerovanie tried zo schémy vo wsdl utilitou xjc
, označme túto skupinu ako B. Skupinu tried B sme potom pomocou starých dobrých utilít ako sed, awk, grep
upravili triedy do formy vhodnej pre klientskú časť kódu. Takto sme získali dva typy tried vygenerovaných z tej istej schémy ale problémom nebol koniec. Ešte bolo potrebné vyriešiť mapovanie z A do B a naopak. Použili sme niečo čo sa volá modelmapper. S obmedzeniami, ale pomohol.
Použili sme asi všetky dostupné metódy štýlovania dostupné v GWT aplikáciach kým sme našli podľa naších kritérii optimum. Všeobecné štýly a redefinície GWT štýlov sme umiestnili do statického css súboru. V deklaratívnych definíciach UI komponentov sme definovali štýly riadiace rozloženie. Štýly spoločné pre deklaratívne definície UI sme definovali v triedach odvodených z CssResource
.
Spôsob definície UI komponentov deklaráciou v xml formáte. Ku každému xml existuje Java trieda implemetujúca funkcionalitu. Viď komentovaný príklad.
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:c="urn:import:com.google.gwt.user.cellview.client" xmlns:cw="urn:import:sk.dominanz.gwt.ui.client" ui:generateFormat='com.google.gwt.i18n.rebind.format.PropertiesFormat' ui:generateKeys="com.google.gwt.i18n.server.keygen.MD5KeyGenerator" ui:generateLocales="default"> <!-- xmlns:g - namespace Google GWT komponentov --> <!-- xmlns:cw - namespace vyvojara, package obsahuje komponent view --> <!-- ui:generate* - podpora pre generovanie jazykových resourcov --> <ui:with type="sk.dominanz.coarui.client.ui.CoarUIResources" field="coaruires"></ui:with> <!-- coaruires - resources zdielane v UI komponentoch, obsahuje retazce, CSS, obrazky --> <!-- lokálny štýl komponentu --> <ui:style field="style" type="sk.dominanz.coarui.client.ui.logoutWidget.LogoutWidget.Style"> .mainPanel { width: 54.5em; background-color: white; box-shadow: rgba(0, 0, 0, 0.5) 0 2px 6px; margin-top: 1.2em; } </ui:style> <!-- GWT komponent panel, renderovany ako div. {style.mainPanel} - volanie metody getMailPanel objektu style, vrati meno stylu ako je deklarovany v lokalnych styloch --> <g:HTMLPanel addStyleNames=' {style.mainPanel} '> <!-- HTML komponent div {coaruires.style.dialogTitle} - volanie metody coauires.getStyle().getDialogTitle(), vrati meno stylu ako je deklarovany v zdielanych stýloch --> <div class='{coaruires.style.dialogTitle} '> <!-- Kompilátor generuje pre ui:msg deklaracne subory pre jazykove mutacie --> <ui:msg key="title">Logout</ui:msg> </div> <div class='{coaruires.style.buttonPanel}'> <!-- ui:field vazba na premenu v java triede --> <g:Button addStyleNames=' {coaruires.style.button}' ui:field="logoutButton"> <ui:msg key="logoutButton">Logout</ui:msg> </g:Button> <g:Button addStyleNames=' {coaruires.style.button}' ui:field="cancelButton"> <ui:msg key="cancelButton">Cancel</ui:msg> </g:Button> <g:Button addStyleNames=' {coaruires.style.button}' ui:field="saveButton"> <ui:msg key="saveButton">Save objects</ui:msg> </g:Button> </div> </g:HTMLPanel> </ui:UiBinder>
Vytváranie komponentov deklaráciou je veľmi výhodné. Urychľuje vývoj, sprehľadňuje kód, rozloženie komponentu je zo zdrojového kódu aspoň predstaviteľné. Komponent sa dá použiť v iných deklaráciach alebo priamo imperatívne v programe Comp c = new Comp();
. Imperatívný spôsob vytvárania UI sme prakticky nepoužili.
Ako veľmi výhodná sa ukázala typová kontrola kompilátora najmä pri častých zmenách WS. V Jave samozrejmosť, čo sa nedá povedať o kombinácii JS,JSON.
Volanie serverovej funkcie je na strane klienta redukované na volanie funkcie a definovanie handlera pre onSuccess a onFailure
prípady. Všetky volania servera sú asynchrónne.
demoService.rpcFunction(textToServer, new AsyncCallback<String>() { public void onFailure(Throwable caught) { // Show the RPC error message to the user dialogBox.setText("Remote Procedure Call - Failure"); } public void onSuccess(String result) { dialogBox.setText("Remote Procedure Call"); } });
Mechanizmus šírenia udalostí v GWT nazvaný Event Bus sa ukázal ako veľmi výhodný, pretože umožňuje spracovanie udalostí v oddelenom režime. To znamená že nie je nutné aby príjimateľ poznal objekt od ktorého udalosti chce spracovávať a stačí aby sa zaregistroval na príjem určitého typu udalosti na EventBus. Event Bus sme najviac ocenili pri spracovaní globálnych udalostí pochádzajúcich napríklad z menu a udalostí generovaných v handleroch asynchrónnych volaní.
Základné informácie o SuperDevMode nájdete tu. Na veľkú časť vývoja sme použili spomínaný SuperDevMode ale vyskytli sa situácie keď bol potrebný návrat ku klasickému devmode. Tu sú tie situácie:
Vývoj GWT aplikácie splnil naše očakávania a nelíšil sa od zverejnených hodnotení. Bolo pár vecí, ktoré znepríjemňovali život, napríklad ešte nie dokonalý SuperDevMode alebo zmena mien štýlov v deklaratívnych UI. Porovnať GWT s JS frameworkom nedokážem preto neviem ani posúdiť efektivitu vývoja snáď okrem jedného aspektu a to je výhoda statického typovania. Celkovo možem povedať že na ďalší WebUI projekt zvolíme GWT opäť.
Tiskni
Sdílej:
Tvrdiť, že kód prekladaný z jedného jazyka do druhého je lepší než ručne písaný kód je asi ako tvrdiť, že C je lepšie než assembler. Keby to bola pravda neoptimalizovalo by sa napríklad enkódovanie / dekódovanie videa v assembleri.
Takže späť od marketingových kecov k realite. Neviem kto používa GWT (rád by som si pozrel ukážku generovaného kódu na nejakej stredne veľkej webovej aplikácii). Neviem, či google používa niekde GWT, ale tipol by som, že google hangouts / google + ... sú postavené práve na tom. Ak je to tak potom ten kód ktorý z toho lezie je mnohonásobne horší než čokoľve čo som predtým videl. Je katastrofálne veľký s katastrofálnym výkonom. Ale to je len úvaha, neviem v čom to píšu ;)
Kedysi som uvažoval o písaní js aplikácií v coffee scripte / typescripte. Tie sú lightweight a viem čo z toho lezie. Nemôžem však ovplyvňovať spôsob generovania niektorých výrazov napr. list comprehension sa vždy preloží na for namiesto forEach (forEach má podstatne vyšší výkon vo firefoxe, ale v chrome je pomalý, v mnohých benchmarkoch chrome podáva lepšie výsledky lebo je kód písaný na mieru chromu). Nakoniec skončím s niekoľkonásobne pomalším kódom vo firefoxe pretože autor prekladača bol chromofil.
Jedinú výhodu písania aplikácie v inom jazyku vidím v tom, že je to iný jazyk ;) Javascript je hnusný, má hnusnú syntax, hnusnú podporu objektov, default unsafe, ignoruje chyby ktoré vybublú niekde úplne inde než sa stali ... Argumentovať použitie prekladača tým, že z toho lezie dobrý kód je blbosť, jediný dôvod pre výber iného jazyka pohodlie a rýchlosť vývoja.
Neviem či si pamätate na prekladač Watcom C/C++, ten bol príkladom že kompilátor môže generovať lepší kód ako ručne písaný asm.(nebavme sa o konkrétnych algoritmoch ako encode videa, na nich pracujú vývojari aj niekoľko rokov)
Nie. Rovnaké kecy ako kecy typu java je rýchlejšia net X. Všetko závisí od konkrétneho človeka ktorý optimalizuje. Videl som mnoho katastrofálne "optimalizovaného" javascriptu. To, že väčšina ľudí netuší ako písať kód poriadne nevypovedá to nič o kvalite prekladu.
Tá vzorka na analýzu ako vážne 2 MB kódu ktorý sa načítava a inicializuje naraz?
Aký je v tom problém? Mne to načítava 3 minúty (EDGE). Ďalších 10s je parsovanie v browseri na to aby som zobrazil 2 inputy. Nazývať taký kód "lepší než ručne písaný" je jednoducho blbosť.
Keby mi ktokoľvek napísal 2MB javascriptu a načítal to naraz pre zobrazenie loginu tak ho asi pošlem kade ľahšie.
Takže ešte raz, ako nástroj na statickú kontrolu kódu fajn, ale tvrdiť, že to generuje dobrý kód je blbosť. Generuje to rovnaký odpad ako keby som sa assembler snažil strojovo preložiť na C (java je nižší jazyk než javascript, v js sa dajú využiť rôzne dynamické vlastnosti jazyka, ktoré nespomalia kód, ale niekoľkonásobne zmenšia veľkosť). Vo výsledku z toho vylezie možno niečo čo po stiahnutí a spustení o pár % prekoná js kód priemerného frontend developera, ale samotné parsovanie bude trvať podstatne dlhšie.
Je mi jasné, že je to celá aplikácia, práve o tom to je ;) Ak píšem aplikáciu tak jednoducho použijem spoločnú knižnicu (cca 10kB) kde mám pár utilít a asynchrónny loader. Pre jednotlivé časti webu potom dotiahnem samostatné skripty podľa potreby. Jednoducho js mi na to dá prostriedky a ja môžem písať efektívnejší kód.
Ps. 4MB je šialene veľa. Keď si vezmem, že môj linuxový portál má okolo 500kB a to je tam mnoho zbytočného kódu ktorý pôjde preč. Čo sa týka viacej javascriptových vecí to nemám nikde zverejnené, ale mám nejaké tie intranetové veci podstatne podstatne rozsiahlejšie a celkovo serverová aj klientská časť je menšia než 500kB.
Mne vadilo generické tvrdenie. Priemerných webdeveloperov aj javistov poznám, majú toho spoločného celkom dosť. Minule som omylom na jednom webe vypol ghostery vďaka čomu nedošlo v behu javascriptu k výnimke a skončilo to namiesto prázdnej stránky OOM-kom. Web mal 16MB prevažne javascriptu čo bola celkom bomba na spravodajský web s 1 fotografiou a pár riadkami textu.
Ešte celkom zaujímavý materiál na túto tému je tu. Tomu kto by chcel písať celkom slušne optimalizovaný js v inom jazyku by som odporúčal scala-js.
Čistí javascripťáci sú idioti. Ja už pekných pár rokov validujem len na serveri a klientovi posielam chyby v jsone. O zobrazenie sa stará cca 100 riadkov javascriptu, ktorý používam u väčšiny nových projektov. Podpora na serveri je cca 50 riadkov. Celý kód vyzerá napr. takto:
# serverová časť class ArticleCreateView(AjaxFormMixin, CreateView): model = Article fields = ('title', 'content') # klientská časť <form class="ajaxform" method="post" action="{{ request.path }}">{% csrf_token %} {% form form %} </form>
Validáciu rieši server automaticky podľa modelu + možnosť dopísať vlastné validácie. Kód na serveri a u klienta je univerzálny. Generovanie formulára automatické podľa modelu + možnosť čokoľvek customizovať. Všetko s plnou podporou fallbacku (teda ide aj s vypnutým js). Pri zapnutom js funguje ako moderná aplikácia, ktorá je schopná vadlidovať počas písania. Layout formulára je buď automatický, alebo sa ručne napíše ({% formrow form.title %}, {% formrow form.content %}
). Ako vyzerá výsledok som posielal tu.
Není ta serverová validace moc pomalá?
Došiel som k záveru, že 100% validácia u klienta je vúčšinou nemožná. Príklad: vkladám PSČ - musím kontrolovať v db, vkladám mesto, ulicu - kontrolujem db, vyberám kategóriu - kontrolujem db, vyberám username - kontrolujem db ... Jednoducho skoro všetko, čo robím potrebuje kontrolu dát v db (či už existenciu alebo duplicitu). Má zmysel robiť v takom prípade validáciu na 2 miestach, 2x písať kód ...? Samozrejme veci ako email, regexy, čísla sú validované cez html5 validáciu, ak to klient nepodporuje kontaktuje server, všetko nad rámec toho čo zvláda HTML5 ide na server.
Samotná serverová časť je fakt blbá ak je to písané vo frameworku, ktorý podporuje validáciu - ukážka AjaxFormMixin-u
class AjaxFormMixin(object): def post(self, request, *args, **kwargs): if request.is_ajax(): response = super(AjaxFormMixin, self).post(request, *args, **kwargs) return self.get_form_status(response.context_data['form']) else: return super(AjaxFormMixin, self).post(request, *args, **kwargs) def get_form_status(self, form): if form.is_valid() and not 'only_validate' in self.request.POST: return self.form_valid(form) else: if form.is_valid(): data = {'status': 'ok'} else: data = {'status': 'error', 'errors': form.errors.as_json()} return HttpResponse(json.dumps(), content_type='application/json')
Reálny kód ktorý používam je trochu dlhší, hlavne podporuje veci ako viacej formulárov na jednej stránke a ich selektívnu validácia a pod. Toto je len náčrt fungovania. Reálne mi potom v aplikácii stačí pridať AjaxFormMixin do každého viewu, v ktorom chcem obsluhovať formulár ajaxom, alebo pridať rovno do globálnych CreateView/UpdateView/DeleteView. Pri validácii musí klient posielať only_validate pre rozlíšenie medzi odoslaním a validáciou. Úspešnú akciu indikujem stavom 3xx, ktorý zase odchytáva iný mixin a posiela klientovi ako json (keďže javascript nedokáže odchytiť 3xx).
Ešte pre istotu aby moje komentáre neboli zle pochopené ... reagoval som len na jednu vec, ktorá ma irituje, inak je blog dobrý, rozhodne by som nechel autora odradiť. Dozvedel som sa niečo o technológii, ktorú som prakticky nepoznal čo je dobré, programátor sa musí nonstop učiť nové veci. Jednoducho blog je svetelné roky pred napríklad seriálom JavaFX na rootovi (odporúčam pozrieť, ale pred tým si radšej vylúpnite oči) kde som sa o JavaFX nedozvedel nič, ale hlavne som sa dozvedel ako sa dá katastrofálne zmrviť PostgreSQL.
Momentálne sa tu tak trohu tvárim ako majster sveta na optimalizáciu, ktorý ani neukáže svoj kód ... no pokúsim sa to napraviť niekedy v budúcnosti v blogu. Nedávno som robil jednu intranetovú aplikáciu s cca 50. tabuľkami a asi 200 pohľadmi riešenú ako one page za necelé 2 mesiace, ale totálne iným spôsobom než to býva u väčšiny one page aplikácií. Časť z kódu by som chcel obaliť do knižnice a dať ako open source, potom hádam o tom napíšem blog.
…Dozvedel som sa niečo o technológii, ktorú som prakticky nepoznal čo je dobré, programátor sa musí nonstop učiť nové veci.…Programátor který se umí učit nové věci si přece přečte něco o javascriptu, vybere si nějaký framework a může bouchat. Tohle je šaškárna.
Pre programátorov je typická snaha uľahčovať si prácu. Nechcem pitvať či autor ovláda javascript. Sám si myslím, že ovládam javascript na akej-takej úrovni. Napriek tomu som sa pohrával s myšlienkou generovania js kódu z iného jazyka. Nakoniec som to nikdy neurobil.
Prvý problém, ktorý vidím v generovanom kóde je to, čo z toho lezie ;) Možno raz začnem písať v coffeescripte / typescripte, ktoré majú jednoduchú transformáciu do js. Písať v jave sa mi zdá ako keby som písal v assembleri a ten strojovo prechrúmal do C. Akonáhle píšem v nejakom jazyku a prekladám to do iného jazyka som obmedzený prienikom vlastností daných jazykov. JS je dynamický jazyk, zdá sa mi blbé nevyužiť to na skrátenie kódu.
Druhý problém vidím v tom, že aj tak nemôžem zdieľať kód medzi serverom a klientom. Malé fragmenty kódu sa síce dajú zdieľať, ale napríklad kompletnú validáciu formulára u klienta neurobím. U väčšiny formulárov musím reálne kontaktovať server kvôli kontrole duplicít a pod. Nakoniec som teda aj tak skončil s malým ajaxovým kódom ktorý pošle serveru formulár (na pozadí počas vypĺňania) a server vráti v jsone zoznam chýb. Celá podpora ajaxových formulárov má cca 100 riadkov u klienta a 50 riadkov na serveri (vrátane fallbacku vďaka ktorému to ide aj na linkse).
taktéž přináší přidanou hodnotu sledování vývoje širokého spektra prohlížečů atd...
To je dvojsečná zbraň. Staré js kódy ktoré som kedysi písal zvyčajne fungujú. Frameworky sú písané podľa aktuálneho stavu prehliadačov a snažia sa ohackovať jednotlivé chyby / špecifiká prehliadačov tak, aby sa to správalo konzistentne. Po určitom čase sa tieto chyby môžu opraviť a ḱód ktorý danú chybu ohackoval do kódu zanesie novú chybu.
Takže zatiaľ čo js kód napísaný tak, aby sa vyhol špcifikám / chybám browserov bude bez problémov fungovať aj po 10 rokoch, o kóde, ktorý používa framework sa to isté prehlásiť nedá. Upgrade frameworku je kapitola sama o sebe. Niekedy to prebehne v poriadku, inokedy sa musí časť kódu prepísať.
Nevěřím, prostě ne, už jenom protože mluvíme o technologiích které byly specifikovány >2010 a jejich podpora do browserů je použitelná několik posledních let.
Nerobím moc často propagáciu zmien klientom v reálnom čase. Pred cca 10 rokmi som to robil len raz. Pred 10 rokmi bola jediná možnosť long http polling. Vtedy bola požiadavka aby to išlo aj na IE 6 a pri troche snahy to dokonca bez hackov to aj fungovalo. Záťaž servera bola trochu vyššia než s websocketmi (myslím, že tam bol timeout 25s po ktorom sa vytváralo nové HTTP spojenie). Kód funguje dodnes.
Websockety sú typickým príkladom technológie, ktorú keby som použil pred pár rokmi dnes musím kód prepísať, alebo upgradnúť knižnicu na ktorom beží.
Nemám rád optimalizáciu pre konkrétne browsery. Skúsenosti ma naučili, že je to cesta do pekla. V použití v súčasnosti už odladenej technológie nevidím problém.
Ešte ma napadla jedna taká vec ... neberte to akorýpanie ale zaujíma ma to ako to funguje.
Chcel by som zobrazovať live údaje v tabuľke. Tabuľka má pár miliónov záznamov (jedna z tých menších). Chcel by som vedieť ako vaadin propaguje zmeny v takejto tabuľke.
V súčasnosti sa v mojej aplikácii musí klient sám prihlasovať / odhlasovať na počúvanie. Ak teda otvorím konkrétny záznam pošle sa serveru id záznamu ktorý má poslať klientovi. Po zatvorení sa zase odregistruje. Po ukončení spojenia sa všetky dáta a udalosti asociované so session zrušia. Na jednotlivých záznamoch to funguje skvele ...
Pri zobrazení tabuľky sa pri vkladaní / mazaní musí pre každého klienta zistiť či bol záznam vložený pred, alebo za zobrazovanú časť (podľa toho upraviť ktoré záznamy sa zobrazujú) pričom sa musí vziať do úvahy stránkovanie, zoradenie, filtrovanie ...). Zoraďovanie pri takomto množstve dát rieši samozrejme databáza. Ako sa to rieši v takomto prípade?
Netvrdil som, že nerobím, len som popisoval čo som na to používal pred 10 rokmi. V súčasnosti fungujem buď na vlastnom custom riešení pre špecialitky (pár riadkov asynchrónneho kódu v tornade na serveri + sockjs na klientovi), alebo pre bežné veci swampdragon + redis + tornadoio kde funguje aktualizácia podľa popisu rovnako ako vo vaadine s tým rozdielom, že stav aplikácie je client side záležitosť, server rieši len zoznam listenerov a práva na jednotlivé kanály.
Inak dík za vysvetlenie.
S pythonom je to ťažké. Používam ho pekných pár rokov a ako-tak mu prichádzam na chuť až teraz. Keby som mal konvertovať nejaký tím na python asi by som rovno vybral nový tím ;)
Teraz trochu k efektivite vývoja. V pythone sa dajú pomerne rýchlo robiť pomerne komplexné aplikácie, ale človek na to musí mať prax aby to dokázal fakt rýchlo. V prílohe je screenshot projektu (work in progress). Všetký viewy, tabuľky, zoznamy, filtre, sortovania ... sú tam funkčné len zatiaľ chýba pár prepojení na api. Aktualizácie sú v reálnom čase, všetko je pekne ajaxové, kontrola sa vykonáva na serveri, stav filtrov / tabuliek je tak isto na serveri (preto som sa pýtal ako to rieši vaadin), ale samotná manipulácia s DOM a vykresľovanie je písané v js. Teraz trochu štatistiky. Tím tvorím +/- ja (viacej než 90% kódu je môjho). Čas realizácie zatiaľ mesiac a pol. Počet riadkov je celkom zaujímavá štatistika:
-------------------------------------------------------------------------------- Language files blank comment code -------------------------------------------------------------------------------- Javascript 48 2435 641 11311 SASS 64 1968 2560 8910 Python 118 1865 181 6183 CSS 3 622 236 5675 HTML 161 371 0 4198 Bourne Again Shell 6 9 1 73 -------------------------------------------------------------------------------- SUM: 400 7270 3619 36350 --------------------------------------------------------------------------------
Ukladanie neprebieha hneď pretože zákazník chce mať pekný čistý záznam udalostí typu užívateľ ... zmenil polia ... v dátum. Ukladanie po každej zmene by zbytočne zasieralo záznam (tých položiek v tomto konkrétnom formulári je vyše 100). V ľavom menu aby nebolo rozoznateľné čo tam je povedzme menu typov objektov. Čiže pod každou položkou sa skrýva zoznam (grafik je blázon takže každý je vyčačkaný tak trochu svojim spôsobom, niektoré majú aj rôzne typy zobrazení ako podrobný zoznam, krátky zoznam alebo napríklad kalendár podľa dní, týždňov, mesiacov, responzívne aj na malých patlatkách, všetko s filtrovaním, zoraďovaním ...), detaily objektov, formuláre pre úpravu...
----------------------------------------------------------------------------------- Language files blank comment code ----------------------------------------------------------------------------------- Java 227 3493 2050 17161 JSP 75 55 505 6242 CSS 8 223 128 1649 SQL 2 1248 1719 1531 Maven 1 1 12 411 XSLT 2 9 0 400 XML 3 0 0 17 Visualforce Component 1 0 0 10 ----------------------------------------------------------------------------------- SUM: 327 9850 14226 57173 -----------------------------------------------------------------------------------taktéž více než 95% kódu ode mě, čas realizace cca 427 hodin po dobu 6 měsíců(včetně konzultací, specifikace, analýzy a managementu designerů/html, účtována každá započatá hodina), rozpočet 15k euro.
Jenže pak musíš definovat, jak DOM ovlivňuje model.Ano, jistě, to je součástí.
Tyhle frameworky, jako je React a Angular, ti tu práci ušetří.Tomu právě moc nevěřim. Angular určitě ne, ten je příšerně překomplikovanej snad ve všech ohledech. React taky úplně nevidím, jak mi pomůže, protože bych v něm musel psát např. ty renderovací funkce, což je přesně to, co dělat nechci, to mi akorát zkomplikuje život. Obojí vyžaduje spoustu infrastruktury a spoustu boilerplate kódu.
Moustache/Handlebars má opodstatnění v okamžiku, kdy chceš mít na serveru i na klientovi jednu šablonu.Hm, to zrovna mě asi moc nepomůže, vzhledem k tomu, že server akorát dodává data v JSONu...
Trochu offtopic. Netuší niekto čím google generuje ten bordel v productforums? Viacej než 5MB komprimovaného javascriptu na obsluhu 1 tlačidla a zobrazenie textu nikto normálny hádam nemôže napísať, takže predpokladám, že je to generované.