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.
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.
Databáza ľubovoľná (MySQL nepovažujem za databázu), ja som pre ukážky použil SQLite.Uff.
Mysql má veľa vecí implementovaných akože. SQLite sa na nič nehraje, je to embedded blbosť a tým to končí.
Urobiť ORM nad MySQL je na vytrhanie vlasov. Chcem napr. cez ORM získať komentáre najnovších 10 užívateľov:
Comment.objects.filter(author__in=User.objects.order_by('-id')[:10])
MySQL sa síce tvári, že subselecty podporuje, ale v subselecte sa nedá použiť napr. limit. SQL kompilátor musí vziať do úvahy toto obmedzenie a vykonať najskôr vnútorný select a potom použiť operátor IN s vymenovanými hodnotami. Lenže mysql má akosi limit na vymenované hodnoty. Korektne sa to vyriešiť nedá, môžem len dúfať že to väčšinou pôjde.
Kapitolou samou o sebe je v mysql kódovanie. Do varchar(100) nemôžem vložiť 100 znakov, ale dĺžka je v bytoch. Ako to validovať pred uložením? No korektne veľmi ťažko. Čo vlastne zobraziť užívateľovi? Používateľ zadá 80 unicode znakov a validácia bude kričať, človeče pozor, môžeš max 100 bytov, ale spočítaj si byty nie znaky.
MySQL je proste typická ukážka "celé zle". Nevadí mi keď je niečo sprosté. Vadí mi keď je implementácia odfláknutá a nerieši špeciálne situácie.
V príkladoch zvyčajne volím SQLite, ak niekto chce narýchlo vyskúšať kód nemusí nič riešiť.
Konkrétne na MySQL nadávam pretože mám rád ľudí Nedávno sme v práci použili na väčšom projekte MySQL (nie môj výber). Nakoniec sme sa dostali do stavu keď sme riešili viacej MySQL špecifických problémov než zvyšné problémy aplikácie. Takže za pochodu sme migrovali na PostgreSQL. Fakt ak máte možnosť vyhnite sa MySQL. Fakt, fakt, možno na začiatku vyzerá fajn ale tie bugy sa tam nabaľujú a nabaľujú.
Na malé projekty kde si zákazník chce editovať web s max 20 podstránkami používame MySQL ... ale postaršiu verziu. Chcel by som vidieť toho experta ktorý riešil InnoDB. Mať podporovaný fulltext iba v Myisam je na zbláznenie. No čo si mám vybrať, referenčnú integritu, či fulltext? Veľké fulltextové riešenia ako lucene na web kde príde 10 ľudí denne a má dokopy 20 podstránok je kanón na vrabca.
Takže za pochodu sme migrovali na PostgreSQL+100
Osobne preferuji postgresql.Vlastne me to ani neprekvapuje, protoze jste jen nekonzistentni 1/2 sudetonemecky blafal. Takze pro Vasi informaci. Postgres byla vyvinuta na statni univerzite a vyvoj byl placen z penez danovych poplatniku. Michael Stonebraker (vedouci toho projektu) je typicky zcela zrejme pripad vysokoskolskeho ucitele, ktery by v privatnim sektoru umrel hlady.
Michael Stonebraker (vedouci toho projektu) je typicky zcela zrejme pripad vysokoskolskeho ucitele, ktery by v privatnim sektoru umrel hlady.Zajimave, ze stihl zalozit/prodat hned nekolik firem.
Autor si stezuje na na problemy s mysql pod ORM.
Nepovažoval by som ich za problémy s ORM. Sú to všeobecné problémy. To, že nemôžem použiť fulltext pri InnoDB nemá s ORM nič spoločné. To, že nastavím poľu dĺžku 100 znakov a databáza mi negarantuje, že tam môžem uložiť 100 znakov nie je problém ORM. Mne to však robí zásadný problém, že nemôžem validovať formulár pred pokusom o uloženie. Nemôžem tomu kto zadáva do poľa nejaký text garantovať akú dĺžku môžem uložiť do db. V žiadnom prípade netolerujem ak mi databáza vyhodí bez príčiny výnimku keď jej dám validný vstup, netolerujem keď mi v tichosti odstrihne znaky v reťazci a už vôbec nie ak mi unicode reťazec odstrihne v polovici znaku.
Problem vidim v pouziti ORM jako zasadne 'problematicke' technologii, jak se vyhnout specifikum jednotlivych databazi.
To netvrdím. Je mi relatívne jedno, či moja aplikácia beži v jedinej správnej db, alebo na všetkom možnom. Stačí mi, že beží s DB ktorú som si nainštaloval na server. ORM používam kvôli úplne iným vlastnostiam a tu sa trochu rozpíšem.
Ako som na začiatku spomínal Django ORM som nemal zo začiatku rád. Bola obmedzená a naučiť sa ju trvalo dlho (porovnateľne dlho s učením sa samotného SQL). V prvom rade nie je to žiadna zázračná vecička ktorú hneď začnete používať a ste majstri sveta. Je to samostatný jazyk nad SQL a jeho učenie trvá aj v prípade znalosti SQL približne rovnakú dobu.
Dlhú dobu som ORM nútil do vecí ktoré neovládalo (použitím metódy extra, alebo v najhoršom prípade napísaním celého raw SQL a obalením do objektov). V súčasnosti to už robím len veľmi výnimočne. Pred pár dňami som robil selecty nad zoznamkou a filtrovanie. Vyšiel z toho dotaz ktorý mal po rozpísaní asi 100 riadkov. Dosť komplikovaný s pár joinmi, pár CASEmi, ale bol presne taký ako by som ho napísal ručne až na názvy aliasov tabuliek. Čas kým som vyskladal dotaz bol porovnateľný s vyskladaním SQL dotazu, zase žiadna zázračna skratka na všetko sa nekoná.
Teraz k silným stránkam: postupne budem skladať trochu zložitejší dotaz:
qs = (Article.objects .all()) SELECT "article_article"."id", "article_article"."title", "article_article"."slug", "article_article"."category_id", "article_article"."perex", "article_article"."annotation", "article_article"."content", "article_article"."author_id", "article_article"."authors_name", "article_article"."pub_time", "article_article"."updated", "article_article"."published", "article_article"."top", "article_article"."image" FROM "article_article" WHERE ( "article_article"."published" = True AND "article_article"."pub_time" <= 2015-10-04 11:45:29.155657 ) ORDER BY "article_article"."id" DESC
Implicitne sa vyberajú všetky polia. Vo väčšine prípadov je to presne to, čo potrebujem. Ak mi však vadí nejaké pole (napr. content obsahuje priveľký text a na zoznam ho nepotrebujem) stačí použiť defer.
qs = (Article.objects .defer('content')) # rovnaké SQL akurát vynechaný stĺpec content
Ak chcem len vybrané stĺpce môžem použiť metódu only:
qs = (Article.objects .only('title')) SELECT "article_article"."id", "article_article"."title" FROM "article_article" WHERE ("article_article"."published" = True AND "article_article"."pub_time" <= 2015-10-04 11:49:48.960429) ORDER BY "article_article"."id" DESC
U článkov mám štandarnde nastavené filtrovanie publikovaných. Ak by som chcel všetky použijem all_articles
qs = (Article.all_articles .only('title')) SELECT "article_article"."id", "article_article"."title" FROM "article_article"
Povedzme, že chcem vo výpise zobraziť aj kategórie:
qs = (Article.all_articles .select_related('category') .only('title', 'category')) SELECT "article_article"."id", "article_article"."title", "article_article"."category_id", "article_category"."id", "article_category"."name", "article_category"."slug", "article_category"."description" FROM "article_article" INNER JOIN "article_category" ON ( "article_article"."category_id" = "article_category"."id" )
Z kategórií sú zase implicintne vyberané všetky stĺpce. Ak by som chcel len názov kategórie tak do only zapíšem namiesto 'category' hodnotu 'category__name'.
Ďalej by som mohol chcieť napríklad zobraziť počet komentárov k článkom:
qs = (Article.all_articles .select_related('category') .only('title', 'category__name') .annotate(comments_count=Count('comments'))) SELECT "article_article"."id", "article_article"."title", "article_article"."category_id", COUNT("django_comments"."id") AS "comments_count", "article_category"."id", "article_category"."name" FROM "article_article" LEFT OUTER JOIN "django_comments" ON ( "article_article"."id" = "django_comments"."object_id" AND ("django_comments"."content_type_id" = 13) ) INNER JOIN "article_category" ON ( "article_article"."category_id" = "article_category"."id" ) GROUP BY "article_article"."id", "article_article"."title", "article_article"."category_id", "article_category"."id", "article_category"."name"
Z príkladov je asi jasné, že django ORM ušetrí veľkú časť písania kódu. O rozmýšľaní to však neplatí
V poslednom príklade si asi zaslúži jedná časť joinu vysvetlenie. Konkrétne ide o "django_comments"."content_type_id" = 13
. Django umožňuje používať generické foreign kľúče. Všetky tabuľky, ktoré django vytvorí majú zároveň záznam v tabuľke django_content_type. Ak mám generické komentáre, ktoré môžu byť ku každému objektu v databáze stačí mi urobiť foreign key content_type_id na túto tabuľku a object_id na tabuľku ku ktorej je priradený komentár.
V príkladoch som pužil dokopy 3 metódy čo je len špička ľadovca. Bez problémov môžem vyskladať omnoho zložitejšie výrazy. Stále mám pomerne slušnú kontrolu nad dotazmi a čo je najdôležitejšie dotazy vyzerajú prakticky rovnako ako keby som ich písal ručne. Dotazy sa reálne spúšťajú až keď cez queryset iterujem.
Skutočnou killer featurou je pre mňa možnosť pracovať s predžúvaným dotazom. Môžem postupne aplikovať filtre:
if only_published: qs = qs.filter(is_published=True) if only_author: qs = qs.filter(author=only_author) ...
Nad takto predžúvaným dotazom si môžem vytiahnuť štatistiky (ORM mi automaticky doplní všetky tie nechutnosti ako group by kde by som musel všetko vymenúvať znovu). Môžem nad predžúvaným querysetom vykonať limit a poslať do šablóny len časť ktorá ma zaujíma (limit, offset, alebo rownum between, proste čo daná db podporuje).
Existuji i jine metody, jak vyse uvedeny cil dosahnout (software je mozno provozovat s vice databazemi).
Aké? Nie že by to bolo pre mňa nejako dôležité, ale rád sa učím nové veci. Kvôli tomu vlastne blogujem na abclinuxu.cz, je tu skvelá komunita ktorá sa nehanbí kritizovať. V práci programujem sám, takže nejaký feedback zbieram už len kvôli tomu aby som sa dozvedel čo v mojom kóde / štýle programovania zlepšiť. Občas oponujem, ale neznamená to, že by som argument nebral do úvahy
To, že nastavím poľu dĺžku 100 znakov a databáza mi negarantuje, že tam môžem uložiť 100 znakovZkusil jsem si to, funguje to správně:
DROP TABLE IF EXISTS `a`; CREATE TABLE `a` ( `str1` varchar(10) COLLATE utf8mb4_czech_ci NOT NULL, `str2` varchar(10) COLLATE utf8_czech_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; INSERT INTO `a` (`str1`, `str2`) VALUES ('1234567890', '1234567890'), ('qwertyuiop', 'qwertyuiop'), ('+ěščřžýáíé', '+ěščřžýáíé'), ('+ěščřžýáíé+ěščřžýáíé', '+ěščřžýáíé+ěščřžýáíé'); SELECT * FROM `a`; DROP TABLE IF EXISTS `a`; CREATE TABLE `a` ( `str1` varchar(10) COLLATE utf8mb4_czech_ci NOT NULL, `str2` varchar(10) COLLATE utf8_czech_ci NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; INSERT INTO `a` (`str1`, `str2`) VALUES ('1234567890', '1234567890'), ('qwertyuiop', 'qwertyuiop'), ('+ěščřžýáíé', '+ěščřžýáíé'), ('+ěščřžýáíé+ěščřžýáíé', '+ěščřžýáíé+ěščřžýáíé'); SELECT * FROM `a`;V obou případech dostanu výsledek:
str1 | str2 |
---|---|
1234567890 | 1234567890 |
qwertyuiop | qwertyuiop |
+ěščřžýáíé | +ěščřžýáíé |
+ěščřžýáíé | +ěščřžýáíé |
Máme staršiu verziu bez utf8mb4.
XML, JSON (áno nejaká paródia na JSON tam je, ale nedá sa napríklad indexovať), funkcionálne indexy, ACID, indexy nad viewmi, sekvencie, spatiálne vyhľadávanie (postgis, viem, že má aj mysql ale nekompletné), perl / python / javascript triggery, odolnosť voči poškodeniu dát, ...
MySQL sa síce tvári, že subselecty podporuje, ale v subselecte sa nedá použiť napr. limit.
CREATE TABLE `a` ( `str1` varchar(10) COLLATE utf8mb4_czech_ci NOT NULL, `str2` varchar(10) COLLATE utf8_czech_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci; INSERT INTO `a` (`str1`, `str2`) VALUES ('1234567890', '1234567890'), ('qwertyuiop', 'qwertyuiop'), ('+ěščřžýáíé', '+ěščřžýáíé'); SELECT * FROM (SELECT * FROM `a` LIMIT 2) AS `b`;
str1 str2 1234567890 1234567890 qwertyuiop qwertyuiop
Máme staršiu verziu ktorá to považuje za chybu syntaxe.
Čo urobím s pokazenými DDL? MySQL musí kvôli tomu locknúť tabuľky (down time), nedá sa to uzatvoriť do transakcie (ak sa niečo škaredo pokazí nemôžem urobiť rollback). Nepodporuje funkcionálne indexy. Väčšinou chcem správanie unique indexov ako utf8_bin ale zoraďovanie podľa slovenčiny ... Poriadna podpora viewov s indexmi nad viewmi mi tiež chýba. Každá vec ktorú som chcel kedysi použiť bola akosi papierovo tam, ale bola tak neskutočne pokazená, že som sa na celú ich db vykašlal.
Tiskni
Sdílej: