Technologie pro webovou aplikaci

gll

Re:Technologie pro webovou aplikaci
« Odpověď #60 kdy: 29. 01. 2017, 22:35:00 »
Samotný jedno node na jednom CPU dokáže utáhnout pěkně velký množství spojení
To umí cokoliv, co používá kqueue nebo epoll.

To ano, ale jen v Javascriptu je tento model defaultní a používají ho všechny knihovny.


v

Re:Technologie pro webovou aplikaci
« Odpověď #61 kdy: 29. 01. 2017, 22:38:06 »
Samotný jedno node na jednom CPU dokáže utáhnout pěkně velký množství spojení
To umí cokoliv, co používá kqueue nebo epoll.

To ano, ale jen v Javascriptu je tento model defaultní a používají ho všechny knihovny.
co ghc?

andy

Re:Technologie pro webovou aplikaci
« Odpověď #62 kdy: 29. 01. 2017, 22:53:11 »
ORM objekty jsou typované. Špatná data do nich nacpete jen dost těžko. Zrovna u DB aplikací dokáží testy podstatně urychlit vývoj. S databází, která se vám mění pod rukama se vyvíjí špatně. Je třeba, aby testy byly replikovatelné. Kontrolovat správnost výsledků po každém spuštění jen očima také moc dobře nejde. Určetě to chce praxi. Naučit se efektivní TDD chvíli trvá. IMHO naučit se dělat weby v haskellu trvá déle.
Tak konkrétní příklad - mám tu (v pythonu) třídu - nějaký "objekt" (obsahuje nějaké časovéinfo, jméno, nějaký geopolygon). Jaké má vlastně atributy? No...abych prošel __init__ metodu a hledal. Co se stane, když ten atribut bude chybět? Bůhví. Jaké jsou možné typy těch atributů? Tohle jsou všechno věci, které bych vlastně měl testovat.

A teď nějaký typovaný jazyk (jakýkoliv, to vůbec nemusí být haskell) - podívám se na deklaraci a vidím. Je jasné, co to má za atributy, jaký mají typ. Když něco smažu a rekompiluju to, tak mi překladač poslušně nahlásí, kde to všude používám. Když něco neinicializuju, tak mě překladač varuje. Takže testovat, jestli má objekt určité atributy je sice hezké, ale pravděpodobnost, že v tomhle dojde k nějaké chybě se blíží nule, takže to vlastně testovat smysl nemá.

TDD používám - třeba u parsingu. Nebo třeba u serializací (QuickCheck je na tohle docela geniální věc). Ale u těch DB přístupů, které v drtivé většině jsou typu "zapiš něco do databáze", resp. "přečti něco z databáze" mi to připadá dost zbytečné.

Ono naučit se Haskell není zrovna lehké... ale TDD v node.js apod. je řešení problému hrubou silou. Naštěstí se třeba Java, ale myslím i C++ hodně FP inspiruje, takže spousta důležitých věcí už to umí...

Citace: v
co ghc?
http://haskell.cs.yale.edu/wp-content/uploads/2013/08/hask035-voellmy.pdf

gll

Re:Technologie pro webovou aplikaci
« Odpověď #63 kdy: 29. 01. 2017, 23:19:38 »
ORM objekty jsou typované. Špatná data do nich nacpete jen dost těžko. Zrovna u DB aplikací dokáží testy podstatně urychlit vývoj. S databází, která se vám mění pod rukama se vyvíjí špatně. Je třeba, aby testy byly replikovatelné. Kontrolovat správnost výsledků po každém spuštění jen očima také moc dobře nejde. Určetě to chce praxi. Naučit se efektivní TDD chvíli trvá. IMHO naučit se dělat weby v haskellu trvá déle.
Tak konkrétní příklad - mám tu (v pythonu) třídu - nějaký "objekt" (obsahuje nějaké časovéinfo, jméno, nějaký geopolygon). Jaké má vlastně atributy? No...abych prošel __init__ metodu a hledal. Co se stane, když ten atribut bude chybět? Bůhví. Jaké jsou možné typy těch atributů? Tohle jsou všechno věci, které bych vlastně měl testovat.

Invarianty objektů můžete kontrolovat v __setattr__. Atributy ORM modelů se nespecifikují v __init__. Používal jste SqlAlchemy nebo Django? Můžete provádět mnohem složitější validace než by vám umožnil typový systém.

gll

Re:Technologie pro webovou aplikaci
« Odpověď #64 kdy: 29. 01. 2017, 23:34:20 »
A teď nějaký typovaný jazyk (jakýkoliv, to vůbec nemusí být haskell) - podívám se na deklaraci a vidím. Je jasné, co to má za atributy, jaký mají typ. Když něco smažu a rekompiluju to, tak mi překladač poslušně nahlásí, kde to všude používám. Když něco neinicializuju, tak mě překladač varuje. Takže testovat, jestli má objekt určité atributy je sice hezké, ale pravděpodobnost, že v tomhle dojde k nějaké chybě se blíží nule, takže to vlastně testovat smysl nemá.

Dokážete pomocí typové kontroly validovat nějaký dlouhý formulář, kde jsou validace jednotlivých položek na sebe navázány? Jak překladač kontroluje, že jste při ukládání do databáze nepřehodil názvy položek? Jak překladač zjistí, že jste neudělal chybu v regulárním výrazu?


andy

Re:Technologie pro webovou aplikaci
« Odpověď #65 kdy: 30. 01. 2017, 00:16:11 »
Invarianty objektů můžete kontrolovat v __setattr__. Atributy ORM modelů se nespecifikují v __init__. Používal jste SqlAlchemy nebo Django? Můžete provádět mnohem složitější validace než by vám umožnil typový systém.
Jenže mě ani nešlo o nic složitého (navíc to nebyl ORM objekt). Jde o to, že se podívám na definici třídy a nevím vůbec nic. Init metoda je na stránku, a teď abych hledal přiřazení do "self", jaké to má vlastně atributy a pak ještě vymýšlel, jaký asi mají typ (nedejbože, že bych použil atribut různých typů....), případně ještě prolézal funkce, které ten __init__ volá, jestli se náhodou někde něco nepřiřazuje.

Konkrétně teda v Haskellu je ten objekt imutable, a pokud chci, aby byly dodrženy invarianty, tak nevyexportuju konstruktor, ale vyexportuju "inteligentní konstruktor", který je vynutí. V Javě se to řeší private atributama a konstruktorem, který to vynutí (a kvantem getterů/setterů...) v C++ také...

Citace
Dokážete pomocí typové kontroly validovat nějaký dlouhý formulář, kde jsou validace jednotlivých položek na sebe navázány?
No asi použiju ten inteligentní konstruktor viz výše...
Citace
Jak překladač kontroluje, že jste při ukládání do databáze nepřehodil názvy položek?
Já teda nechtěl, aby tohle dopadlo jako promo haskellu (ani jsem to Jakubovi nedoporučoval)...ale pokud to je přes nějaké ORM, použijí se generické funkce na přístup do databáze resp. konverzi do JSONu. Takže tam zrovna moc nic na spletení není. Ale tohle IMO funguje snad i v Javě, není to nic objevného. A když je to všechno generované automaticky, tak opět není moc důvod tyhle věci testovat....

V Haskellu je trošku anti-pattern mít funkci, která bere více parametrů stejného typu, takže se to pak řeší tím, že má každá položka separátní typ - tzn. např. typ "Jméno", "Příjmení", "Adresa". Takže se pak nestane, že se funkce, která má parametr "Příjmení", zavolá místo toho s "adresou". Takže se opět zmenšuje prostor pro chybu a snižuje "benefit" testování.

Citace
Jak překladač zjistí, že jste neudělal chybu v regulárním výrazu?
Pokud jde o regexpy - v haskellu se regexpy prakticky nepoužívají (napsat si parser je výrazně jednodušší a není to write-only jako regexpy... ať žije udržovatelnost kódu...). Nicméně je na to nějaká knihovna, která to compile-time zkompiluje (možná i zkontroluje korektní počet group)...

Asz

Re:Technologie pro webovou aplikaci
« Odpověď #66 kdy: 31. 01. 2017, 20:24:58 »
Co myslíte, má větší smysl zabejvat se Node.JS nebo ASP.NET Core? Chci svůj další projekt experimentálně postavit na jedný z těchle dvou technologií. Popularita JS ve mě budí pocit, že je to něco úžasnýho a kdo v něm dneska nedělá, neni cool. Chvíli jsem si s nim hrál, ale vůbec mě nezaujal - neustálenej ekosystém, každej fw řeší jen úplnej základ a na zbytek je potřeba hromada knihoven, absence typů - po dlouholetym programování v PHP stíhnu spíš k typovanejm jazykum, leda s využitim TypeScriptu, což je ale zase jen jeden z několika transpilerů. Další věc je asynchronní styl programování, sice mu moc nerozumim, ale neni při rozsáhlejších projektech spíš komplikací? Docela se vidim v tom, ž bych dopadl podobně - https://blog.geekforbrains.com/after-a-year-of-using-nodejs-in-production-78eecef1f65a#.yhw7n5k4r.

C# se mi jako jazyk líbí, má podporu na Linuxu, vzniká pořádný konkurenční IDE 3. strany - JetBrainsu.. I když zase .NET Core je tu jen chvilku.

Další možností byla Java, ale přijde mi, že se třeba v i takovym Springu dělá všechno zdlouhavě a složitě. Stavět na Javě malou stránku by bylo nejspíš postavený na hlavu.

Python neberu v úvahu, to můžu zustat u PHP.

Lemming

Re:Technologie pro webovou aplikaci
« Odpověď #67 kdy: 31. 01. 2017, 23:23:00 »
Node.JS (obecně Javascriptové frameworky typu Angular / React) ti umožňují přenést část aplikace do prohlížeče uživatele. To je zásadní výhoda, proto přes všechny JS nectnosti tak frčí. Takže jde v první řadě o to, jaký styl aplikace chceš dělat.

A taky jak velká ta aplikace bude. Dál píšeš "Stavět na Javě malou stránku by bylo nejspíš postavený na hlavu". Pokud opravdu chceš dělat malou stránku, tak na to je fakt to PHPko. .NET není o moc vhodnější na malé stránky než Java.

Když zmiňuješ Spring, tak ten dělá model, controller a třeba servisní vrstvu, na webovou aplikaci potřebuješ v něčem dělat views a to něco může být JSP/JSF/Tiles/...

Dál může být zajímavý Wicket, který k celé věci přistupuje dost jinak než většina ostatních frameworků (v různých jazycích). Webovou aplikaci v něm stavíš z javových komponent/tříd podobně jako kdyby to byla desktopová aplikace. A má dobrou podporu AJAXu.