Jak se učím španělsky?

Před nějakou dobou jsem psal o učení němčiny, ale to jsem na jaře zapauzoval a začal jsem se učit španělsky. Proč? Strávil jsem měsíc v Las Palmas na Gran Canarii a zjistil jsem, že mnohem víc chci umět španělsky než německy :-) Hlavně proto, že tam s angličtinou dost často nepochodíte.

Jako první jsem se pustil do základních slovíček každodenní potřeby – čísla, jídlo, dny v týdnu atd. Na to jsem si na Quizletu našel nějaké hotové sady, protože jsem je potřeboval zvládnout, co nejrychleji.

Dál jsem pokračoval na Duolingo, které už jsem znal z učení němčiny. Nevýhoda je, že tam není moc vysvětlená gramatika. Zároveň věty, na kterých se učíte, jsou dost hloupé (a většinou nepoužitelné v běžném životě).

Zkoušel jsem tedy najít něco lepšího a podařilo se. Objevil jsem aplikaci Fluencia, která je trochu podobná Duolingu, ale je specializovaná na učení španělštiny pro anglicky mluvící studenty. Takže si mohli dovolit rozmanitější obsah, když ho nemuseli napasovat na univerzální systém jako v Duolingu. Sice je to placená aplikace, stojí $15 na měsíc, ale v porovnání s cenou jazykových kurzů, je to skoro zadarmo. Po registraci si můžete vyzkoušet několik lekcí bez placení, a pokud se vám líbí Duolingo, tak věřím, že Fluencia se vám bude líbit ještě víc :-)

Po návratu domů jsem se přihlásil na základní kurz do jazykovky eŠko. Od dubna do června jsem tedy chodil tam. Nová slovíčka jsem si dával do Quizletu a průběžně se je učil. Velkou nevýhodou skupinového kurzu je, že pokud to ostatní flákají (třeba se neučí slovíčka), tak to jednotlivé lekce brzdí. Nicméně kurz hodnotím jako super.

Přes léto jsem pokračoval v učení pomocí Fluencie, kdy jsem si nová slovíčka vypisoval do Quizletu a gramatiku na web

Nejrychlejší posun v učení jsem zvládl poslední dva týdny v září. Učitel španělštiny z toho kurzu, na který jsem chodil na jaře, totiž pořádal studijní pobyt na Ibize. Za dva týdny jsme měli 50 vyučovacích hodin, což se prostě projevit muselo :-)

Jedinou nevýhodou bylo, že jsem nestihl letošní Webexpo…

Po návratu z Ibizy už jsem se na další kurz nepřihlásil a místo toho jsem začal hodit na soukromé lekce. Výhoda oproti skupinovému kurzu je, že se toho během jedné lekce stihne hrozně moc. Soukromá lekce je samozřejmě dražší, než jedna lekce v rámci skupinového kurzu (myslím, že mi to vychází o něco více než 2×). Ale přínos je větší několikanásobně, takže se to vážně vyplatí. Pokud se tedy chcete jazyk naučit a ne jen učit (a třeba mít kurz i jako společenskou událost), tak soukromé lekce určitě zvažte.

Když jsem se španělštinou začínal, tak jsem myslel, že to bude těžké a půjde to pomalu – na gymplu jsem totiž měl 6 let němčinu a výsledek nic moc. Ale opak je pravdou – po půl roce učení španělštiny (a to jsem to zas tak moc nehrotil), se myslím docela pěkně domluvím (líp než německy). A samozřejmě budu v učení pokračovat dál.

Pokud někdo přemýšlíte o naučení se nového jazyka, tak se nebojte a určitě se do toho pusťte!

Jaký byl Rockaway AWS Hackaton 2015?

V pátek a v sobotu jsem se zúčastnil Rockaway AWS HackatonuImpact Hubu v Praze. Akce měla ukázat vývojářům, kolik práce s nasazováním a škálováním aplikace je možné ušetřit použitím AWS (Amazon Web Services) technologií.

Na výběr byla hromada témat, nicméně nakonec jsme se dali do týmu s Tomášem a zvolili si vlastní téma. Témata na výběr byla totiž hodně programovací, takže bychom velkou část hackatonu strávili vývojem aplikace a jen malou část zkoumáním AWS. Místo toho jsme využili hackaton k tomu, že jsme v AWS rozjeli Shopio (e-shopové řešení, které vyvíjíme ve w3w).

(Selfie ze závěrečné prezentace)

Než se pustím do popisu technologií, které jsme vyzkoušeli, tak bych rád poděkoval:

  • Rockaway za zorganizování akce
  • Mentorům za to, že i po probdělé noci byli ochotni vysvětlovat, jak co v AWS funguje
  • Hubu za servis

A teď už k samotným AWS technologiím, které jsme vyzkoušeli.

Jak si ukládat API klíče?

V případě použití AWS není potřeba mít API klíče v kódu aplikace. Stačí si v profilu vytvořit soubor a do něj je vložit ve struktuře podobné INI souboru. Viz dokumentace.

~/.aws/creden­tials

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

SDK je potom automaticky používá. Na serverech jsou poté přístupné prostřednictvím ENV proměnných (aspoň myslím, jen jsme serveru povolili přístup do S3 a nemuseli jsme nikde kopírovat API klíče).

AWS má dobře řešené nastavování oprávnění, takže konkrétní API klíče mohou sloužit jen pro zápis do S3. Nebo pro jinou jednoúčelovou věc. Nestane se vám potom (jako se to povedlo i jednomu týmu na hackatonu), že si klíče používané jen pro S3 nahrajete na github a robot s jejich pomocí spustí desítky EC2 instancí pro minování bitcoinů – protože tomu konkrétnímu klíči dáte oprávnění k čemukoliv (článek z ledna na theregister.co.uk)

Soubory do S3

Aplikace v AWS (a koneckonců ani jinde), by neměla ukládat data přímo do své adresářové struktury na svůj server. V AWS je na to k dispozici neomezené úložiště S3, které je účtováno podle objemu uložených dat a datových přenosů.

Pro PHP je k dispozici AWS SDK for PHP, které umí vytvořit tzv. stream wrapper. Vytvoří virtuální souborový protokol a pak je možné pracovat se soubory pomocí standardních souborových funkcí, takto:

file_put_contents('s3://bucket/jmeno-souboru.jpg', $data)

Integrace do Shopia byla jednoduchá, změnil jsem cestu, kam se ukládají soubory a bylo to.

Generování náhledů Lambdou

Na webu se samozřejmě nepoužívají obrázky nahrané uživateli, ale vygenerované zmenšené náhledy. Na to jsem využil Lambdu (novinka na re:invent 2014). Jde o obrovsky škálovatelnou platformu pro spouštění skriptů. Funguje to docela jednoduše – vytvoříte vlastní funkci (lambdu) v Node.js (Javě, Pythonu) a nastavíte ji, aby poslouchala na události PutObject v daném S3 bucketu. Takže se do jednoho bucketu uploadne obrázek, S3 pošle eventu Lambdě, ta si obrázek stáhne, vygeneruje náhledy a uloží je do druhého S3 bucketu. Hrozně super věc, umí totiž prostřednictvím ApiGateway (další kus AWS) fungovat jako běžné API. Mám o ní rozepsaný samostatný článek.

CDN CloudFront

Obrázky a podobné statické soubory se uživatelům běžně neservírují z S3, ale prostřednictvím CDN. Amazon nabízí svou CDN pod názvem CloudFront a aktivace v AWS administraci zabrala jen chvilku. Poté je potřeba počkat, než se váš S3 bucket rozdistribuuje po světě a pak stačí na webu změnu URL, odkud se načítají obrázky. CloudFront standardně nabízí https na jejich doméně s jejich certifikátem, případně je možné použít vlastní (doménu i certifikát).

Databáze na RDS

V AWS se na provoz relačních databází používá služba RDS. Je možné si vybrat MySQL, MariaDB, Oracle, SQL Server, PostgreSQL a nebo Auroru (MySQL kompatibilní cloudová DB od Amazonu). Výhodou je, že se nemusíte starat o server, kde DB běží, snadno si zapnete replikaci atd.

Web na EC2

Samotný web jsme spustili na EC2 (víceméně běžné VPS) na nginxu a php-fpm. Výhodou AWS je snadno vytvořitelný image pro spouštění dalších takových serverů. Ale samozřejmě je nejlepší automatizovaná instalace (ve w3w používáme SaltStack, obdobou je Puppet nebo Chef). AWS pro orchestraci serverů nabízí OpsWorks (kompatibilní s Chefem). Během hackatonu na to nebyl čas, pro produkční nasazení by to bylo potřeba.

Super věc je Elastic Load Balancing, který rozděluje zátěž mezi více EC2 instancí. Jde totiž propojit s AutoScalingem, kde jde nastavit automatické spouštění a vypínání dalších EC2 instancí podle zátěže. Takže v rámci hackatonu jsme nastavili pravidlo na load na 50% a spustili na web siege AWS postupně spouštělo další instance až do maximálního nastaveného počtu. A po vypnutí „útoku“ (tedy po vykrytí nečekané návštěvnosti), je zase postupně povypínalo.

DNS v Route 53

Pro testování jsme u jedné domény nastavili jako nameservery Route 53 z AWS. Výhoda správy DNS záznamů v AWS je, že je možné je nasměrovat na alias Elastic Load Balanceru, takže předpokládám, že v případě nějakých problémů si to samí přehodí, kam bude potřeba

A už to běží

Tím jsme měli víceméně hotovo, a oproti stávajícím VPS to pěkně automaticky škálovalo. A byl tedy čas na vychytávky, které se v AWS dají udělat snadněji, než bez něj. Já jsem si hrál s SES a přijímáním e-mailů, Tomáš zkoušel SNS (messaging service).

SES pro příjem e-mailů

SES je primárně určený pro odesílání e-mailů (podobně jako Mandrill, Mailgun, Sendgrid). Ale kromě toho umí e-maily i přijímat a nějak s nimi naložit. Třeba je umí uložit do S3. A na S3 události může poslouchat lambda, která ho stáhne, naparsuje a vloží do databáze jako zprávu z kontaktního formuláře. Trvá to 5–10s od chvíle, co odešlu e-mail. I se zdrojákama to bude v tom článku o Lambdě, co mám rozdělaný. Bez AWS by to bylo mnohem víc práce. Musel bych mít nějaký e-mail, ten bych cronem přes IMAP vybíral a zpracovával.

Shrnutí

Hackaton byl super. Jsem rád, že jsem se zúčastnil. Rozhodnutí neprogramat novou věc a jen nasadit hotovou hodnotím pozitivně, protože jsme si toho z AWS vyzkoušeli hrozně moc. Pokud se ještě vejdete, tak se přihlašte na Hackaton v Brně nebo Ostravě.

Pár fotek z Hackatonu

A těšte se na článek o Lambdě, je to fakt supr věc :-)

Jak jsem si chtěl psát gramatiku

Na jaře jsem se začal učit španělsky (o tom se rozepíšu později) a postupně jsem zjišťoval, že papírový sešit není optimální řešení. Především proto, že jsem ho ne vždy měl u sebe, zapomínal jsem si ho vzít na hodinu a na opakování v tramvaji také nebyl ideální. Potřeboval jsem to tedy mít elektronicky, snadno prohlížitelné i na mobilu offline a s možností tisku (protože nejlíp se stejně učí z papíru). 

Varianty Word nebo OneNote jsem zavrhl jako první – Word by se těžko synchronizoval a ani jedno není příjemné na čtení na mobilu.

Další variantou, kterou jsem zvažoval, byl Markdown. Tam mě překvapilo, že vytváření tabulek není standardizované a každý dialekt Markdownu to má jinak. Vzhledem k tomu, že gramatika jsou samé tabulky, jsem Markdown také vynechal.

Jak tedy nakonec?

Nakonec jsem použil HTML + Twitter Bootstrap + HTML5 AppCache + Github Pages.

  • Bootstrap jsem použil, abych nemusel řešit typografii a stylování tabulek.
  • AppCache mi umožní používat stránku offline na mobilu
  • Github pages se mi starají o hostování (tím, že to je celé jen statické HTML)

Přegenerovávání AppCache

AppCache funguje tak, že si stáhne soubor cache.manifest a věci v něm nacachuje. A pokud se soubor nezměnil, tak nic nestahuje. Takže nepozná, že se změnil nějaký soubor tam uvedený. Nakonec jsem skončil u jednoduchého skriptu, který mám nastavený jako pre-commit hook a do cache.manifest mi do komentáře vloží md5 hash HTML souboru a manifest nastaguje do gitu.

Stejný skript jsem si přidal jako FileWatcher v PHPStormu, abych mohl kontrolovat, že se vše zobrazuje správně i bez commitování.

Další drobnosti

Na většinu věcí používám standardní classy z Bootstrapu, přidal jsem si dvě vychytávky:

Koncovky sloves si obaluju do <strong class="vs">, kdy class vs, kromě nastavení pozadí, vloží před koncovku spojovník:

.vs:before {
    content: '-';
}

A ten se ignoruje, pokud pak ve stránce hledám celé sloveso trabajaron

Protože si dokument chci i tisknout, přidal jsem si dvě drobnosti:

table {
    page-break-inside: avoid;
}
.break {
    page-break-before: always;
}

Zaprvé jsem nastavil, aby se tabulky vždy nechaly na jednom listu. A druhá věc je class, kterou si můžu dorovnat některá špatně udělaná zalomení před tím, než si uložím PDF.

Celou tu nádheru najdete na espanol.martin­hujer.cz (a na githubu)

Co vy, také pro jednoduché věcí používáte komplikovaná hi-tech řešení? ;-)

Sencha Touch je mrtvá. Zabil ji Ext JS 6

Ještě před krátkou dobou jsem jako docela dobrý způsob tvorby mobilních aplikací doporučoval vytvoření webové aplikace pomocí Sencha Touch a její následné zabalení jako nativní pomocí Apache Cordova. Nicméně vzhledem k novinkám už to za dobrý způsob nepovažuju. Konkrétně kvůli Senche.

Sencha Touch vyvíjela společnost Sencha Inc a byla k dispozici zdarma i pro komerční použití. Samozřejmě bylo možné si od nich dokoupit komerční podporu. Kromě Sencha Touch prodávali jako hlavní produkt framework Ext JS (na kterém byla Sencha Touch částečně postavena).

Na podzim Sencha změnila licenční model Ext JS a místo jednovývojářské licence začala nabízet nejméně bundle pro pět vývojářů (za necelých $5000 ročně – překlikněte si QTY). Na fóru je k tomu více než stostránková diskuze Když se někdo ptal sales oddělení, co má dělat, pokud ve firmě vyvíjí v Ext JS sám nebo ve dvou a nepotřebují licenci pro pět vývojářů. Prý jim nezbývá nic jiného než si koupit licenci pro pět vývojářů, že se jim bude hodit až budou růst. Sencha se zřejmě chce více zaměřit na velké firmy a malé firmy a jednotlivce trochu hází přes palubu.

Dokud byla Sencha Touch k dispozici zdarma i pro komerční použití, tak mi to jako problém nepřišlo. V létě vyšel Ext JS 6, který jako jednu z hlavních novinek přinesl zaintegrování Sencha Touch, takže je na jednom frameworku možné snadno vytvářet jak desktopové, tak mobilní aplikace. Zní to sice dobře, ale problém je, že to znamená konec vývoje Sencha Touch, která byla k dispozici zdarma. A Ext JS jde koupit jen v tom epicky drahém bundlu pro pět vývojářů.

Výsledkem je, že pokud jste samostatný vývojář nebo mobilní aplikace vytváříte jen občas, tak nedává smysl Sencha Touch, resp. Ext JS používat.

Jako rozumná náhrada Sencha Touch se zdá Ionic Framework, který je postavený na Angularu a vývoj se posouvá hodně rychle dopředu. Případně je možné opustit Cordovu a pro vývoj zvolit Xamarin, který umožňuje vytvářet nativní aplikace pro více platform z jednoho (C#) kódu a jen různých UI.

Další dva rozlobené články v angličtině:

Seznamy na balení věcí

Když balíte věci na výlet, dovolenou nebo služební cestu a nemáte na to moc času, tak se vám snadno stane, že sebou vezete spoustu nepotřebných věcí a některé důležité zapomenete.

Jednoduchým způsobem, jak odbourat stres při balení a zároveň s sebou mít jen a právě všechny potřebné věci, je používání seznamů. Někomu možná stačí si den předem na papír poznamenat základní věci, co vzít sebou. Mně se místo takových ad-hoc seznamů osvědčila dlouhodobější práce s nimi.

Pro každou akci (výlet, dovolenou, atd.) si vytvořím seznam věcí, které si budu brát s sebou. Seznam je rozdělený do sekcí jako „oblečení“, „vybavení“, „jídlo“ atd. a dávám si tam opravdu všechno, co budu balit. Seznamy vytvářím jakou obyčejné textové soubory, ale stejně dobře poslouží i OneNote nebo Evernote. Název seznamu prefixuju rokem a měsícem (takže třeba 2015–07-Otava, výhoda je, že se pak správně chronologicky řa­dí).

Že zatím není vidět, v čem je tady ta výhoda? Ano, za chvíli se k tomu dostanu.

Po návratu z dovolené je potřeba seznam doladit a upravit podle toho, co jsme opravdu potřebovali. Samozřejmě je nutné to brát rozumně, takže pokud bylo pěkně a pláštěnka nebyla potřeba, tak neznamená, že ji škrtneme. Ale pokud jsme zpět přivezli pět čistých triček, tak to už stojí za zvážení. Taky berte v úvahu, jestli je to dovolená pod stanem, kam se jedem vlakem s krosnou nebo jedete autem do penzionu – to vás pár triček navíc nezabije. Pokud jedete ve skupině, tak je dobré si psát i věci, které vezli ostatní (třeba: „sekyrka – bere Tomáš“). Osvědčilo se mi také do seznamu připsat negativní věci – třeba „nebrat si tolik jídla“.

Ve chvíli, kdy příště začnete balit, tak by prvním krokem mělo být vybrání nejpodobnějšího minulého seznamu a jeho zkopírování do nového a upravení podle aktuální situace. Výhodou je, že stačí jen upravit počty oblečení podle plánované délky a ostatní položky mohou zůstat tak, jak byly.

Jak si balíte vy? Narychlo sesbíráte věci, které by mohly být potřeba, nebo v tom máte podobný systém?

Správce schránky – Ditto Clipboard manager

Prozradím vám další střípek ze své mozaiky efektivity. Pokud vám následující věty jsou povědomé, tak je článek určen přímo pro vás:

Tyjo, vždyť jsem si to kopíroval, jaktože mi to nejde vložit?

Tyjo, tohle jsem si před chvílí někam kopíroval, kde to teď budu sakra hledat?

Pokud používáte schránku (CTRL+C, CTRL+V) na ukládání něčeho, co budete potřebovat až za chvilku, určitě se vám stalo, že jste si to omylem přepsali dalším kopírováním. Nebo když kopírujete víc údajů z jednoho místa do druhého, tak pořád musíte přepínat okna. Říkáte si, že by bylo fajn, kdyby si to pamatovalo víc věcí, co tam uložíte. A ono může…

Windows to neumí samy od sebe, je potřeba nainstalovat aplikaci Ditto (alternativně můžete vyzkoušet ClipX nebo CLCL, ale oba vypadají už dál nerozvíjené).

Ditto

Ditto je jednoduchá aplikace, která sleduje, co vložíte do schránky a pomocí klávesové zkratky vám umožní vložit i věci, které už z běžné schránky zmizely.

  1. Nejdříve si Ditto stáhněte (odkaz Download) a nainstalujte.
  2. Potom přejděte do nastavení a v záložce „General“ zaškrtněte „Start Ditto on System Startup“.
  3. Dále v záložce „Keyboard Shortcuts“ si klikněte do pole „Activate Ditto“ a zmáčkněte levý Alt + C (jako klávesovou zkratku).
  4. Ditto teď bude sledovat schránku a pamatovat si, co jste tam vložili.
  5. Až budete potřebovat něco, co jste měli v běžné schránce, ale už nemáte, tak stačí zmáčknout levý Alt + C a vybrat si:

Používáte Ditto? Nebo jiný clipboard manager? Nebo nic…a proč? Podělte se v komentářích!

Jak na levnější kontaktní čočky od VašeČočky díky Heuréce?

Když jsem začal nosit kontaktní čočky, tak jsem je nejdříve nakupoval u oční doktorky za 1 200 Kč na půl roku. Pak jsem zjistil, že se ty stejné dají kupovat na internetu skoro za polovinu, což je docela velká úspora. Od začátku jsem nakupoval na VašeČocky.cz, kteří zboží doručovali hodně rychle a bez problémů. (Teď už čočky nenosím, ale o tom budu psát až někdy jindy).

Náhodou jsem pak zjistil, že na Heuréce nabízejí stejné zboží za nižší cenu, která se vám aktivuje při prokliku z Heuréky.

Základní cena čoček je 539 Kč (proklik přímo na zboží):

Na Heuréce je mají za 487 Kč (proklik na Heuréku):

A pokud se z Heuréky prokliknete, tak jsou za tu cenu i na eshopu:

(dřív ten rozdíl býval třeba 649 → 530 Kč, což při dvou baleních už je docela dost).

Obdobně to funguje u roztoků na čočky, které to zlevní z 679 na 575 Kč.

Takže pokud jsem objednával dvoje čočky a roztoky, tak se dalo ušetřit tři stovky, což je docela příjemné (kdo vám to dá). Na jednu stranu jsem chápal, že pro získávání nových zákazníků musí bojovat cenou na Heuréce. Na druhou stranu to je celkem podraz na stálé zákazníky, kteří jdou rovnou k nim na web.

Pokud jim chcete ušetřit za prokliky z Heuréky, tak si stačí nastavit cookie ps_id=1 (Heuréka). Pro Zboží je to ps_id=2 (takže je možné, že některé věci mají ještě s rozdílnou cenou podle srovnávače, ale to už se mi zkoumat nechtělo).

VašeČocky určitě nejsou jediní, kteří cenově segmentují návštěvnost z Heuréky/Zboží. Víte o nějakých dalších?

Ruším účet u mBank

(proti mBank nic nemám, dotlačili do ČR módu účtů zadarmo, jen mi už jejich podmínky nevyhovují)

V mBank jsem byl relativně early-adopter – přišla do ČR v listopadu 2007, účet jsem si zřizoval v březnu 2008. Důvodem pro mBank pro mě bylo mít druhý účet s menším zůstatkem, ke kterému budu mít kartu na placení online. A v tu dobu tam myslím byl i výhodný spořící. Zároveň jsem ji různě doporučoval jako alternativu ke „starým“ bankám.

mBank byla první, která v ČR měla předčíslí účtu, takže třeba ještě na gymplu měla paní provozní v jídelně problém ho nastavit pro inkaso, protože na předčíslí neměla kolonku :-) (i když to byl asi ještě tátův účet)

mBank ze začátku byla cool banka, brzy zavedla bezkontaktní karty apod. Ale pak postupně zhoršili podmínky spořícího účtu (pro udržení úrokové míry byly nějaké další podmínky a bylo to celé nějaké složitější). Pak zrušili 3 výběry zdarma z jakéhokoliv bankomatu a zavedli je zdarma jen při dosažení objemu plateb kartou v daném měsíci. Jenže u těch plateb kartou nezáleží na tom, kdy byly provedeny, ale kdy byly zaúčtovány (což u off-line bezkontaktních plateb může být klidně i týden nebo dva), takže na nějaké sledování to je zbytečně složité. Třešničkou už byl nový e-banking, který mi moc nesedl.

od března 2015 mBank zavádí poplatek za vedení karty, pokud tou kartou nebude měsíčně zaplaceno (a zaúčtováno!) alespoň za 500 Kč. Což sice není nijak závratný objem, ale je to takové to, že když s ní budete hodně platit a pak měsíc ne, tak dostanete „pokutu“.

Na mBank se mi dříve líbilo, že nemusím řešit, jestli mi při běžných činnostech (převody, trvalé příkazy, inkasa, …) nenaúčtují nějaký poplatek, což teď už neplatí. A abych to nemusel řešit, tak účet zruším a přejdu k Fio – stejně jsem si tam chtěl účet zřídit, tak mě tohle je pošťouchnulo. (účet ve Fio jsem si dnes zřídil na pobočce za 15 minut)

Pokud mBanku moc nepoužíváte, ale nechcete rovnou ručit celý účet, tak by mělo stačit zrušit kartu v ebankingu. Ale než účet nechat ladem, tak ho doporučuji spíš zrušit úplně (kdo ví, třeba zavedou poplatek za nepoužívání účtu).

Na webu info o rušení účtu nemají, takže jsem se musel doptat na Twitteru:

Jsem zvědavý, jestli tímto mBank odradí klienty s málo používanými účty a ti je budou rušit. Protože klienti mBank už minimálně jednou ukázali, že změna banky pro ně není problém.

A co vy? Také ještě máte účet u mBank nebo už někde jinde?

Checking a custom coding standard with PHP_CodeSniffer

PHP_CodeSniffer is a tool for checking source code compliance with a defined coding standard. There are some predefined standards (PEAR, Zend, PSR1, PSR2, etc.), but the true power of PHP_CodeSniffer lies in the possibility of defining custom standards.

We've been using PHPCS on Shopio for a long time, but we've utilized just the Zend coding standard provided within the PHPCS distribution. I recently found some time to dig deeper into PHPCS and I played a lot with custom standards.

How can I define a custom PHPCS standard?

A custom standard is just an XML file (usually located in the project directory) which imports rules that already exist in PHPCS. It's usually better to import an existing standard and customize it with additional rules. And if there are some rules that you don't like, you can disable them (or reconfigure their parameters). The following example shows a custom ruleset that just imports the Zend coding standard:

<?xml version="1.0"?>
<ruleset name="My Custom Standard">
    <rule ref="Zend" />
</ruleset>

Using the custom ruleset is also simple, as you just need to pass the path to the XML file with the custom standard: phpcs --standard=ruleset.xml file.php.

As I've already mentioned, you can reconfigure the way that some of the rules behave. The first one I tried was the line length. We all use fullHD screens for development, so there is no need to limit the line length to 80 characters. With the following snippet, you can get errors and warnings only for extremely long lines (which usually indicates code-smell):

<rule ref="Generic.Files.LineLength">
    <properties>
        <property name="lineLimit" value="250" />
        <property name="absoluteLineLimit" value="300" />
    </properties>
</rule>

Other often-discovered issues are mixed indentation (tabs and spaces), and mixed newlines (you should always use Unix EOLs). It can be a tedious task to fix them manually, but I've got good news for you: there is a tool called SFK (Swiss File Knife) which can easily handle such changes in a second.

If you are still getting hundreds of coding standards violations, I would suggest that you disable some rules by setting their severity to 0 and fix the remaining errors. When you have more time for codebase cleaning, enable some of previously disabled rules and repeat the process until you get 0 errors with all ‚sniffs‘ (rules) enabled.

<rule ref="Generic.Files.LineLength">
    <severity>0</severity>
</rule>

Ignoring some of the errors

You can exclude specific parts of the source code from being scanned by PHPCS by wrapping the problematic part with //@codingStandardsIgnoreStart and //@codingStandardsIgnoreEnd comments. You should reach for those as a last resort, such as when the piece of the code cannot be refactored or rewritten. It is also good to include a reason for exclusion in the comment.

Adding more rules to the ruleset

When you (and the whole team) are comfortable with writing code according to specified coding standard and the PHPCS is run regularly (typically as a part of a Jenkins CI build), you can be more strict and add more rules to the ruleset. It can be easily done by checking some already existing standards and choosing some rules from them. You can do it incrementally – choose one rule that looks good, add it to your ruleset and see what happens after you run PHPCS.

You can check out the coding standard we use for Shopio.cz to see everything that can be checked by PHPCS.

Enable realtime PHP_CodeSniffer checking in PHPStorm

PHPStorm (great IDE btw.) has integrated support for PHP_CodeSniffer. It can work easily with standards predefined in PHP_CodeSniffer. But it can also check the code with your custom standard. The only thing you need to do is to select the „Custom“ standard, which allows you to select the directory where the standard definition file is located. You can select your project directory (you have to have your custom standard file called ruleset.xml) and it will load the standard automatically!

See the detailed guide, Using PHP Code Sniffer Tool

Conclusion

Are you using PHP_CodeSniffer for your projects? Do you want to show off your ruleset file? Or if you are not using PHP_CodeSniffer, I would be happy to hear why.