Autor blogu: Sergej Chodarev

twitter · github · 500px · instagram

Inštalácia LaTeXu vo Fedore

Fedora obsahuje typografický systém TeX v štandardnom repozitáre balíkov. Je však rozdelený na približne 6000 samostatných balíkov s jednotlivými komponentmi. Pre jednoduchšiu inštaláciu sú tieto balíky zoskupené do schém a kolekcií, takže najdôležitejšie balíky pre systém LaTeX a podporu slovenčiny (vrátane definície rozdeľovania slov) môžeme nainštalovať pomocou jedného príkazu :

dnf install texlive-collection-latexrecommended \
            texlive-collection-langczechslovak

Okrem toho odporúčam nainštalovať latexmk, ktorý zabezpečí správne spúšťanie LaTeXu a súvisiacich nástrojov pre preklad dokumentu:

dnf install latexmk

Na inštaláciu doplňujúcich balíkov a štýlov pre LaTeX je možné použiť trik. Ak v dokumente použijete balík, ktorý nie je nainštalovaný, LaTeX vypíše chýbové hlásenie, kde uvedie aj názov chýbajúceho súboru, napríklad „multirow.sty“. Ten môžete použiť namiesto názvu RPM balíka:

dnf install 'tex(multirow.sty)'

Funguje to vďaka tomu, že každý RPM balík špecifikuje sadu „schopností“ (capabilities), ktoré zabezpečuje a tie sa dajú zadať pri inštalácii namiesto názvu balíka. Balíky s komponentmi pre LaTeX definujú schopnosti pre poskytované súbory .sty v tváre „tex(súbor.sty)“. Viac o schopnostiach môžete prečítať v príručke k RPM.

Fedora 21 a VPN certifikáty používajúce MD5

Ak používate Fedoru 21, mohli ste sa stretnúť s chybou pri pripojení na VPN. Chybové hlásenie hovorí, že nastal problém pri verifikácii certifikátu (VERIFY ERROR: depth=0, error=certificate signature failure...) a to aj napriek tomu, že predchádzajúca verzia OS s nim nemála problém. Dôvod je ten, že Fedora 21 prestala podporovať VPN certifikáty používajúce algoritmus MD5, ktorý už dlhšiu dobu nie je považovaný za dostatočne bezpečný. Ak však musíte stále používať staršie certifikáty a nemate možnosť to nijak ovplyvniť, v tomto článku nájdete spôsob, ako toto obmedzenie (aspoň dočasne) obísť.

Daný problém je opísaný v hlásení v bugzille RedHatu, kde je uvedené aj riešenie: nastaviť premennú prostredia OPENSSL_ENABLE_MD5_VERIFY. Podarilo sa mi tiež nájsť návod pre zapnutie podpory MD5 v NetworkManager, čo umožni pripájať sa na VPN priamo pomocou nastavení siete v Gnome. Jeho nedostatok je však v tom, že vyžaduje zmenu systémového konfiguračného súboru, ktorý bude prepísaný pri aktualizácii NetworkManageru.

Lepší spôsob spočíva vo vytvorení samostatného konfiguračného súboru, ktorý doplní štandardnú konfiguráciu. Potrebujete vytvoriť adresár /etc/systemd/system/NetworkManager.service.d/ a v ňom súbor md5vpn.conf. Obsah súboru má byť takýto:

[Service]
Environment="OPENSSL_ENABLE_MD5_VERIFY=1 NSS_HASH_ALG_SUPPORT=+MD5"

Tento súbor doplní konfiguráciu uvedenú v /usr/lib/systemd/system/NetworkManager.service. Podrobnejšie informácie o tom, ako je možné doplniť alebo upraviť štandardnú konfiguráciu služieb systemd je možné nájsť v manuálových stránkach.

Posledné, čo musíte spraviť je opätovné načítanie konfigurácie a reštartovanie služby NetworkManager pomocou príkazu systemctl:

systemctl daemon-reload
systemctl restart NetworkManager.service

Konverzia zo Subversion do Gitu

Nedávno som dostal do spravy existujúci projekt a jednou z prvých veci, ktoré som sa rozhodol urobiť bol prechod na použitie Gitu namiesto Subversion. Pritom som, samozrejme, potreboval konvertovať existujúcu históriu zmien. Projekt nebol veľký, takže celý proces bol pomerne jednoduchý. Svoje postrehy a riešenia problémov som zhrnul v tomto článku.

Celý proces konverzie sa skladal z dvoch krokov:

  1. prevodu repozitára pomocou git-svn a
  2. „upratania“ výsledného repozitára.

Príkaz git svn umožňuje používať Git ako klient pre Subversion. Je teda možné vytvoriť lokálny Git repozitár, ktorý bude kópiou Subversion repozitára a zmeny urobené v Gite je možné nahrať naspäť do Subversion.

Pritom musíte brať do úvahy to, že model ukladania histórie v Subversion je vo viacerých ohľadoch odlišný od Gitu. Napríklad, zatiaľ čo Git používa na označenie autorov revízii ich meno a e-mailovú adresu, Subversion zaznamenáva len ich prihlasovacie mena.

Na základný prevod som teda použil príkaz v tvare:

git svn clone -s -A authors.txt <svn-repository-url> <local-repository-path>

Prepínač -s alebo --stdlayout označuje to, že repozitár používa štandardné rozloženie s podadresármi trunk, tags a branches a tie sa použijú pre správnu konverziu vetiev a značiek. Za prepínačom -A alebo --authors-file= je uvedený súbor s priradením mien a e-mailových adries autorov ich prihlasovacím menám v Subversion. Záznamy v tomto súbore sú v tváre:

svn-login = Meno <email>

Po tomto je repozitár konvertovaný a je možné začať jeho čistenie. Keďže git-svn zabezpečuje obojsmernú konverziu, do každej revízie sú zaznamenané informácie identifikujúce zodpovedajúcu revíziu v Subversion. Tie sú súčasťou komentára a začínajú reťazcom „git-svn-id:“. Ja som neplánoval ďalej používať Subversion, takže tieto identifikátory boli pre mňa zbytočné. Na druhej strane som chcel zachovať pôvodné číslo revízie. Inšpirovaný článkom Treya Hunnera som ich nahradil za značky v tváre svn: <číslo revízíe> pomocou príkazu:

git filter-branch -f --msg-filter \
        'sed -E "s/^git-svn-id:.*@([0-9]*).*$/svn: \1/"'

Príkaz git filter-branch prechádza všetky revízie a upravuje ich komentáre pomocou zadaného programu. V dánom prípade je to jednoduché nahradenie textu pomocou regulárneho výrazu.

Pôvodné čísla revízii majú nielen historickú hodnotu. Subversion totiž podporuje aj revízie bez komentára a v danom projekte takýchto revízii bolo viacero. Tieto revízie teraz získali aspoň komentár s poradovým číslom v starom systéme.

JavaScript — jazyk budúcnosti?

JavaScript sa zo škaredého kačiatka medzi programovacími jazykmi stal jedným z najpopulárnejších jazykov súčasnosti. Začína sa teraz „epocha JavaScriptu“?

História

JavaScript bol vytvorený v roku 1995 v spoločnosti Netscape ako jazyk pre skriptovanie webových stránok na strane klienta. Ako spomína Brendan Eich, autor jazyka, pôvodne sa uvažovalo o zabudovaní do prehliadača jazyka Scheme. Ale počas vývoja bol niekoľko krát zmenený nielen názov jazyka ale tiež jeho koncept. Po dohode so Sun Microsystems sa rozhodlo, že jazyk sa bude volať JavaScript a bude sa podobať na Javu. Malo isť o akýsi doplňujúci jazyk pre Javu, určený pre menej skúsených programátorov.

JavaScript umožnil pridávať na stránky rôzne dynamické efekty, ako je napríklad kontrola správnosti vyplnenia formulárov na strane klienta alebo jednoduché animácie. Ale efekty vytvárané pomocou neho boli často rušivé a nevkusné.

Samotný jazyk tiež mál viacero nedostatkov. Navyše jeho implementácie v rôznych prehliadačoch neboli úplne rovnaké a v rozhraniach, pre manipuláciu s obsahom HTML stránky, boli značné rozdiely. Spolu to viedlo k zlej povesti JavaScriptu medzi programátormi.

Okolo roku 2005 sa situácia zmenila. S príchodom popularity AJAXu, technológie umožňujúcej asynchronnú komunikáciu klientského kódu so serverom, sa JavaScript začal dostávať do popredia. Vynikajúcimi ukážkami jeho možnosti boli služby Google Maps a GMail, ktoré predviedli možnosti interaktívnych webových aplikácií.

Popularita jazyka sa odvtedy zvyšovala. Vzniklo množstvo knižníc a rámcov (napríklad jQuery a Prototype), ktoré zakrývali rozdiely medzi rozhraniami v rôznych prehliadačoch a zjednodušovali mnohé operácie. To umožnilo jednoduchšie využívať bohaté možnosti poskytované JavaScriptom.

Najviac nepochopený programovací jazyk

Aj napriek rozšírenosti JavaScriptu, dlhu dobu nebolo tak veľa ľudí, ktorí ho poznali dobre. Douglas Crockford ho dokonca označil za najviac nepochopený programovací jazyk. Jedným z dôvodov je to, že napriek syntaktickej podobnosti s jazykmi Java a C++, JavaScript sa od nich výrazne líši.

JavaScript obsahuje množstvo prvkov, ktoré ho radia k funkcionálnym jazykom. Funkcie sú v ňom prvotriednymi objektmi a je možné s nimi manipulovať ako s hodnotami. Podporuje tiež uzávery (angl. closure) — možnosť definovať funkciu vo vnútri inej funkcie s tým, že vnútorná funkcia môže pristupovať k lokálnym premenným vonkajšej funkcie (a to aj po tom, čo vykonávanie vonkajšej funkcie bolo ukončené).

Zároveň je to objektovo-orientovaný jazyk, ale pritom je značne odlišný od bežne používaných objektových jazykov. Namiesto dedičnosti na základe tried, používa prototypovú dedičnosť. Objekt dedí spoločné vlastnosti z objektu prototypu, ktorý je pripojený ku konštruktoru triedy.

Tieto vlastnosti pridávajú jazyku značnú flexibilitu, ale na druhej strane odlišnosti spôsobujú problémy a nepochopenie. Programátori vzhľadom na slovo „Java“ v názve jazyka a podobnú syntax, očakávajú podobné vlastnosti jazyka a pritom narážajú na nečakané problémy.

JavaScript je všade

Napriek všetkým problémom sa JavaScript stáva stále populárnejším. Hlavným dôvodom je samozrejmé to, že je štandardným jazykom pre skriptovanie vo webových prehliadačoch. Pričom s príchodom skupiny štandardov HTML5 sa jeho možnosti v tejto oblasti značne rozširujú. JavaScript sa stál základom pre stále rastúce množstvo webových aplikácií, ktoré poskytujú čoraz bohatšie používateľské rozhranie v mnohých prípadoch už porovnateľné s bežnými grafickými aplikáciami.

JavaScript ale začal prenikať aj do iných oblastí, často spolu s HTML a CSS. Tieto technológie sa používajú napríklad na vytváranie widgetov pre Dashboard v MacOS. Je tiež hlavným jazykom pre vytváranie aplikácií pre mobilný operačný systém WebOS1 a jedným zo štandardných jazykov pre Metro — nové používateľské rozhranie pre Microsoft Windows. Je v ňom napísané aj nové rozhranie pre spúšťanie aplikácií a prepínanie medzi úlohami v prostredí Gnome 3. Nesmieme zabudnúť ani na to, že je populárnym jazykom pre rozšírovanie aplikácií.

A v neposlednom ráde JavaScript preniká aj na server. Tam sa v poslednom čase stáva populárnou platforma node.js. Jej výnimočnou vlastnosťou je originálny prístup k vstupno-výstupným operáciám a paralelizmu. Všetok kód napísaný programátorom v JavaScripte beží v jednom vlákne, ale na druhej strane všetky vstupno-výstupné operácie sú asynchrónne a vykonávané paralelne. Kód programu sa potom skladá z callbackov — funkcií ktoré sú volané po dokončení určitej operácie. Výhodou tohto prístupu je to, že zbavuje od obrovských problémov spojených s prácou s viacerými vláknami. Na druhej strane je programovanie s intenzívnym využívaním callbackov pomerne neobvyklé, ale pre programátorov v JavaScripte je tento štýl bežný, keďže sa používa aj na klientskej strane.

Ako je vidieť, JavaScript sa postupne stáva jedným z najrozšírenejších programovacích jazykov. Jeho oblasť použitia už nie je obmedzená len na webové prehliadače, ale preniká aj na servery, desktopy a mobily. Takýmto spôsobom má šancu dostať sa do pozície univerzálneho jazyka pre aplikačné programovanie. Túto pozíciu sa neúspešne snažila obsadiť Java.


  1. Treba poznamenať, že budúcnosť WebOS je dosť neistá po tom, čo spoločnosť HP (súčasný majiteľ firmy Palm kde WebOS vznikol) oznámila o ukončení vývoja zariadení s týmto systémom. Zdrojové kódy WebOS ale majú byť zverejnené pod open-source licenciou. 

LaTeX a slová so spojovníkom

Ako zabezpečiť, aby LaTeX správne rozdeľoval slová so spojovníkom v súlade s Pravidlami slovenského pravopisu.

Nedávno som písal text, ktorý obsahoval veľa slov obsahujúcich spojovník. Napríklad „doménovo-špecifický“ alebo „jazykovo-orientovaný“. Sú to dlhé slová, preto je často potrebné rozdeliť ich na dva riadky.

LaTeX, ktorý obvykle veľmi dobre rieši takúto úlohu, tento ráz ostal bezradný. Takéto slová vedel rozdeliť len na mieste spojovníka. Pri tom dokonca porušoval Pravidlá slovenského pravopisu, v ktorých sa uvádza: „Ak zložené slová písané so spojovníkom rozdeľujeme na mieste tohto rozdeľovacieho znamienka, spojovník píšeme na konci prvého aj na začiatku nasledujúceho riadka …“

Nesprávne rozdeľovanie

Ako teda vyriešiť tento problém? Po dlhom pátraní som zistil, že riešenie poskytuje balík babel zabezpečujúci podporu pre rôzne jazyky. V režime pre slovenčinu definuje špeciálnu kombináciu "=, ktorá sa má uvádzať namiesto spojovníka. Takto označený spojovník sa potom správne rozdeľuje (podľa PSP) a navyše slovo sa môže rozdeliť aj na iných miestach.

Správne rozdeľovanie

Podrobnosti o spojovníkoch a iných príkazoch a špeciálnych kombináciách poskytovaných balíkom babel si môžete prečítať v jeho dokumentácii.