Jít na obsah Jít na navigaci Jít na vyhledávání

Balíčkovací software Paludis se chce zbavit Paludise

Typicky bulvární titulek, ale v tomto případě jsem si ho nemohl odpustit, jelikož cituji přímo blog vývojáře. Kdo neví, Paludis je alternativní balíčkovací systém s podporou více formátů, momentálně ebuildů pro distribuce Gentoo a Exherbo. Vývoj se žene kupředu rychlostí blesku a již před rokem jím bylo bez větších problémů možné z velké části nahradit současný Portage. Vývojáři však nyní uvedli nový klientský program cave, který by měl jednou provždy umlčet věčné flamewary ohledně příkazové nekompatibility mezi těmito systémy.

Paludis, paludis a paludis

Paludis již od počátku disponoval klientským programem paludis, na kterém jsme všichni společně vyrostli a vžili si do paměti příkazy typu:

paludis -pi world
paludis --dl-blocks discard -i world

A nebo mé oblíbené:

paludis -pu --with-unused-dependencies --permit-unsafe-uninstalls cat/some-pkg

… a oni nám to chtějí zrušit!

Představuje se cave

Dle mého názoru naprosto nevhodně zvolené jméno programu, ale jinak cave vypadá mnohem robustněji a elegantněji. Elegance na nás srší již od prvního pohledu, kupříkladu příkaz install neexistuje, jmenuje se resolve. A když se chceme podívat do nápovědy, cave resolve --help vypíše neuvěřitelných 151 řádků! V tom aby se prase vyznalo, je tedy lepší používat man. Manuálovým stránkách dávám bod za rozčlenění, další krátkému příkazu help za jednoduchý a stručný výpis nejčastějších funkcí. Mile mě potěšil fix-linkage, díky kterému je vyřazen další klient, a to reconcilio. Pamatuji si, jak jsem prvních několik měsíců používání Paludise měl neskutečný problém vzpomenout si na ten připitomělý název, abych opravil špatné linkování knihoven. Příkaz purge zjednodušuje původní paludis -u --uninstall-unused, hlavně je hned v základní nápovědě, a tak ho člověk nemusí hledat kdesi v manuálu. Za zmínku už snad stojí jen sync, uninstall a search, jehož hledání je snad ještě zdlouhavější než dřív – a u toho se zastavím, odjakživa je nepoužitelné.

Obecná vsuvka o vyhledávání

Vyhledat jeden balíček mi trvá přibližně 5 minut, takže kešovaná SQLite databáze v programu eix je k nezaplacení. Stále se ptám, proč při operacích hledání Paludis kontroluje strukturu všech ebuildů a ještě k tomu drze vypisuje, abych přepsal řádek se SLOT="0" na SLOT=""? K čemu mi to je, běžnému uživateli? To si snad tohoto problému vývojáři nevšimli a nebo je to jen hluboký defekt ext3 filesystému v kombinaci s mým strojem, diskem či tak?

Závěrem

Před pár dny vyšla nová verze Paludise, která oficiálně publikovala i výše zmíněný cave. Zhruba hodinu jsem studoval dokumentaci a možnosti tohoto klienta a nakonec upravil svůj synchronizační skript tak, aby ho používal. Na závěr uvádím ukázky nové příkazové syntaxe včetně starších ekvivalentů:

cave sync || paludis -s --multitask
cave resolve -c world || paludis -pi world
cave resolve -cx world || paludis -i world
cave fix-linkage || reconcilio

Nutno podotknout, že při updatu world oba klienti řeší závislosti trochu odlišně. To ostatně možná zjistíte sami hned při prvním použití :)

Odkazy

Štítky:

Hezké nastavení GNU Screenu

GNU Screen je textový skoro window manager umožňující uchování otevřených terminálů uvnitř jediného okna s možností použití jako vzdálené session. Jednoduše řečeno, vezmu-li SSH spojení, screen udrží spuštěné např. irssi, centerim, SSH na další stroj a mnohem více.

Bohužel ve výchozí konfiguraci je poněkud nešťastný, protože ihned nevidíte např. otevřená okna nebo ve kterém okně momentálně jste. Navíc jsou některé klávesové zkratky nepřirozené, a proto jsem kdysi začal zkoumat manuál a možnosti konfigurace. Naneštěstí jsem dlouho nebyl úspěšný. Nakonec mi však kamarád Jedjisch poslal svůj konfigurační soubor, který téměř vyřešil veškeré mé problémy.

Celý konfigurační soubor se do článku nevejde, proto prosím použijte odkaz pro stažení na konci článku. Za zmínku stojí přemapované klávesy pro aktivaci okna 0 a 10, ke kterým se na české klávesnici přistupovalo špatně, upravený řádek hardstatus, který na spodním řádku screenu ukazuje barevně výpis oken (barevné kódy dalo práci zjistit, nakonec vyhrála metoda pokus-omyl), nastavení monitorování aktivity a výchozího okna v posledních řádcích souboru.

Konfigurační soubor je k dispozici zde. Přejmenujte na .screenrc a umístěte do domovského adresáře. Pro načtení do již běžícího screenu použijte příkaz:

^a :source ~/.screenrc

kde ^ značí klávesu Control.

Štítky:

E-mailové logování v syslog-ng

K tomuto nápadu mě kdysi přivedl kamarád Chytrex během jednoho z mnoha povídání o své náplni práce. Ve stručnosti, přijde tiket (v konkrétním příkladu mi byl ukázán řádek ze systémového logu), a jeho úkolem je problém vyřešit. A to mi vnuklo nápad nechat si zasílat problémy ze syslogu na e-mail.

Chvíli jsem googlil a nakonec našel jednoduchý perl skript (zdroj již bohužel neznámý), který se nechá pouštět od syslog-ng a hloupě přeposílá zprávu přes sendmail. Několik let mi to takto stačilo, ale pak mě začaly obtěžovat zprávy s nesmyslně vysokou facility (prioritou) bez jakékoli informační hodnoty. Rekompilovávat upravené zdrojové kódy několika balíčků mě po chvilce přestalo bavit, a tak jsem skript obohatil o pár řádků s podporou klíčových slov k vyloučení (viz pole @exclude).

#!/usr/bin/perl -n
# thanks to Brian Dowling for an example with security in mind.

$TO = 'admin@dragonjake.net';
$FROM = 'system@dragon.dragonjake.net';
@exclude = ("_nss_mysql_getspnam_r conf file parsing failed", # nss-mysql
            "Statement may not be safe to log in statement format", # mysql-server
            "Error getting poly dir context, No data available", # pam
            "sshd.+(already in use|cannot listen to port)", # sshd
            "pam_namespace.+Unmount" # pam
           );

foreach $item (@exclude) {
        if ($_ =~ m/$item/i == 1) {
                exit;
        }
}

s/^<\d{1,2}>//;

open(MAIL, "|/usr/sbin/sendmail -t -i");

print MAIL << "EOT";
To: $TO
From: $FROM
Subject: Log Alert: $_

$_

EOT

close(MAIL);

Skript by sám o sobě nefungoval, a tak je potřeba syslog-ng sdělit, že ho chceme používat. Vlastní filtry f_grsec a f_nmail používám pro omezení zbytečného spamu generovaného grsec patchem a mailserverem. Představte si totiž případ, kdy se mailserver rozbije a syslog-ng začne jeho chybové hlášky ukládat jako e-maily k odeslání. Výsledkem je téměř nekonečná smyčka chyb a fronta přesahující velikost několika tisíců e-mailů. Konfigurace v útržcích vypadá následovně:

...
# e-mail alert
destination da_admin { program("/home/bin/syslog-alert.pl"); };
...
# ignore grsec spam
filter f_grsec { not match("grsec"); };
filter f_nmail { not facility(mail); };
...
# e-mail alert with at least err priority
log {
        source(s_all);
        filter(f_grsec);
        filter(f_nmail);
        filter(f_at_least_err);
        destination(da_admin);
};

Filtr f_at_least_err je v mé distribuci (Debian, Ubuntu) nativně, pro jistotu uvedu jeho definice:

filter f_at_least_err { level(err..emerg); };

Štítky:

Zrádné Ctrl+S a Ctrl+Q při práci v terminálu

Stává se vám, že se při práci emulátor terminálu zasekne? Nereaguje, bušení do klávesnice nepomáhá a jediná možnost je tvrdý kill? Možná jste omylem narazili na kouzelnou klávesovou zkratku Ctrl+S

Proč?

Zkratka Ctrl+S (dále jen ^S) a její opačný ekvivalent Ctrl+Q (dále jen ^Q) řídí funkce takzvaného flow control, v překladu řízení toku. V dobách minulých a již dávno zapomenutých totiž neexistovaly emulátory terminálů. Hádáte správně, byly pouze terminály. Takový terminál je obecně vzato kus hardware s monitorem, klávesnicí a komunikačním portem (foto). Terminál se pak připojí k cílovému počítači a práce může začít. Avšak aby komunikace mohla probíhat správně, je potřeba definovat protokol. A zde přichází kámen úrazu. Řízení toku musí být implementováno oběma komunikujícími stranami, což je splněno i v dnešní době na nám moc dobře známých softwarových emulátorech.

Jak se toho zbavit?

Obecně vzato, příkaz ^S potlačuje výstup a příkaz ^Q toto potlačení ruší. Někteří by mohli namítat, ale je důležité si uvědomit, že výstup v chápání terminálu znamená i vytištění napsaného textu. Proto se ^S chová, jako by způsobil úplné zamrznutí.

Naštěstí je řešení jednodušší, než by se mohlo zdát. Černou magii odstraní příkaz:

stty -ixon -ixoff

Tento řádek doporučuji umístit do .bashrc či do jiného souboru vykonávaného při inicializaci vašeho oblíbeného shellu.

Odkazy

Štítky:

Šetříme interní paměť v T-Mobile G1 - Android

Po updatu na CyanogenMod 4.2.7 se mi v trayi telefonu opět objevila nepříjemná ikonka signalizující nedostatek místa v interní paměti telefonu. Na tom by nebylo zas až tak nic špatného, kdyby mi z nenadání přestala fungovat synchronizace a download aplikací v Marketu. Obětoval jsem celé odpoledne na to, abych zjistil, že onu nefunkční synchronizaci má za následek právě nedostatek místa, na který jsem byl non-stop upozorňován. Takže co s tím?

Apps2sd

Řešení integrované přímo do CyanogenModu spočívající v jednoduchém shell skriptu, který pří bootu telefonu na základě předpokládané existence druhého diskového oddílu na SD kartě tento oddíl použije a přesune na něj veškeré nainstalované aplikace a data s nimi související. Nevýhodou je předchozí úprava karty pomocí nástrojů na dělení disku a naformátování na linuxový filesystém ext2/3/4. Za odměnu ale dostanete přenositelné aplikace i s nastavením. Skript pracuje zcela automaticky, tudíž stačí jen mít připravenou partition.

Mé vlastní řešení

Přišel jsem na něj doslova metodou pokus-omyl. Při šťourání se v datové partition jsem si všiml adresáře /data/dalvik-cache, který zabíral úctyhodných 40 MB a tím pádem byl ihned nominován za největšího žrouta místa. Tento adresář slouží běhovému prostředí Dalvik VM jako cache optimalizovaného bytekódu, jinými slovy jako úložiště překompilovaných a upravených binárek používaných aplikací. Do detailu Dalvik buduje strom závislostí jednotlivých tříd (funkčních celků aplikace) tak, aby nainstalovaná aplikace běžela co možná nejlépe. Tento strom je regenerován při každé aktualizaci ROM, proto první boot po updatu trvá i několik minut.

Dalším zajímavým místem je adresář /cache, který je stále téměř prázdný. V dosavadním Androidu je použit výhradně jako dočasné úložiště pro stahované aplikace v Marketu, jenže v poměru velikosti celé parititon (~60 MB) a jednoho stahovaného balíčku (řádově jednotky MB) je až škoda toto místo nevyužít. Proto jsem si napsal krátký skript, který dalvik-cache přesune do tohoto volného prostoru.

#!/system/bin/sh

# move dalvik cache from internal data memory to /cache
if [ ! -d /cache/dalvik-cache ];
then
    mkdir /cache/dalvik-cache
fi

busybox chown 1000:1000 /cache/dalvik-cache
busybox chmod 771 /cache/dalvik-cache

if [ -d /data/dalvik-cache ] && [ ! -h /data/dalvik-cache ];
then
    busybox cp -a /data/dalvik-cache/* /cache/dalvik-cache
    busybox rm -f /data/dalvik-cache/*

# bind mount dalvik-cache
busybox mount -o bind /cache/dalvik-cache /data/dalvik-cache

Tento skript stačí umístit např. jako /etc/init.d/06custom. Toho můžeme efektivně docílit vytvořením souboru na SD kartě a následným zkopírováním do systému těmito příkazy:

mount -o remount,rw /system
cp /sdcard/06custom /etc/init.d
chmod 755 /etc/init.d/06custom

… a pokračovat rebootem telefonu.

Pokud jste vše udělali správně, máte nyní v interní paměti (aka /data) okolo 40 MB volného místa. Povedlo se!

Pozn.: Uvedený postup je třeba opakovat po každém updatu ROM, kdy dojde k přepsání systémové partition a tedy i vlastního skriptu. Doporučuji proto skript na SD kartě ponechat a před bootem do updatlé ROM spustit konzoli a zopakovat příkazy uvedené výše.

Štítky:

Polyinstancování adresáře /tmp

Trocha teorie

Dlouholetým problémem UNIXově založených operačních systémů je adresář /tmp sloužící jako dočasné úložiště pro všechny. Tento adresář má práva nastavená na rwxrwxrwx, tedy zápis pro kohokoli. Nevýhodou však byl i absolutní přístup k datům jiných uživatelů, a proto byl zaveden tzv. sticky bit, který omezuje zápis pouze na soubory a adresáře vlastněné patřičným uživatelem. Každý tedy může zapisovat nové soubory, ale jen do těch existujících, které vlastní.

Novou možnost fyzické separace pak nabízí tzv. polyinstantia­tion. Každému uživateli namapuje daný adresář na jiný, pro něj v původní cestě nepřístupný. V případě adresáře /tmp by se např. jednalo o mapu z /tmp-inst nebo klidně i /tmp/users. Mechanismus, který polyinstancování zajišťuje, automaticky vytvoří adresář dle uživatelského jména a jím nahradí cílový adresář dle mapy.

Ukázka z praxe

Nastavení se provádí v konfiguračním souboru /etc/security/namespace.conf prostřednictvím PAM modulu pam_namespace.so:

# /etc/security/namespace.conf
#
# See /usr/share/doc/pam-*/txts/README.pam_namespace for more information.
#
#/tmp     /tmp-inst/            both      root,adm
#/var/tmp /var/tmp/tmp-inst/    both      root,adm
#$HOME    $HOME/$USER.inst/inst- context
/tmp      /tmp/users/           user      root

Zakomentované příklady zahrnují polyinstancing /tmp, /var/tmp (který osobně doporučuji nastavit jako symbolický odkaz do /tmp) a domovského adresáře uživatele. Důležitý parametr je typ, který zpravidla může být:

  • user (na základě uživatelského jména)
  • context (na základě bezpečnostního kontextu, pouze SElinux)
  • both (obojí)

Poslední čtvrtý parametr udává výjimky. V mém případě bude na základě uživatelského jména namapován adresář /tmp z /tmp/users s výjimkou uživatele root.

Jak na to

Nejprve vytvoříme adresář, ze kterého budeme mapovat, v mém případě /tmp/users. Tomuto adresáři nastavíme z bezpečnostních důvodů nulová práva a zadáme mapu v konfiguračním souboru /etc/security/namespace.conf.

Nyní je třeba pečlivě zvážit nastavení modulů PAM. Po zkušenostech z praxe nedoporučuji spouštět PAM modul ve všech případech autentizace (soubor /etc/pam.d/common-session, způsobí to více problémů než užitku. Polyinstancování jsem proto zúžil na dva jediné typy autentizace – login a sshd.

Ukázka začlenění PAM modulu do souboru s autentizací:

# Enable polyinstantiation
session    required   pam_namespace.so

Je třeba dát si pozor na to, kam modul umístíme. Existují místa, kdy je moc brzy a kdy zase moc pozdě – lepší je si to párkrát zkusit a pozorně sledovat logy (např. auth.log). Pokud se mechanismus aplikuje, měli bychom po novém přihlášení mít adresář /tmp v ideálním případě prázdný. Přihlásíme-li se na roota, měli bychom vidět /tmp/users a v něm adresář s naším a případně dalšími uživatelskými jmény. Máme hotovo.

Osobně mám přímé přihlášení na root uživatele zakázané a přistupuji přes sudo. Bohužel v tomto případě se mi nepodařilo sudo nijak donutit vyvolat čistý login (nejspíše proto, že sudo je spouštěno z shellu, na který již bylo polyinstacování aplikované), takže ani po přihlášení na roota mi /tmp neodhalil žádná svá tajemství. Pokud nedejbože nutně potřebuji vidět obsah neořezaného /tmp, obejdu bezpečnostní mechanismus mountnutím root partition např. do /mnt a podívám se tam :)

Štítky:

Awstats rychle a jednoduše

Awstats je skript v Perlu, který zpracovává logy (nejen) webserveru a ve výsledku vyplivne pěknou statistiku přístupů. Dnes si ukážeme, jak Awstats lehce a efektivně nastavit.

Awstats

Standardní konfigurace Awstats se nachází v adresáři /etc/awstats, kde je i ukázkový soubor awstats.conf. Jelikož konfigurace podporuje funkci Include, využijeme tento soubor jako základ pro naše vlastní konfigurace.

Vytvoříme nový soubor awstats.domain.tld.conf:

# hlavní config, nejprve jej vhodně nastavíme (formát logů, pluginy atd.)
Include "/etc/awstats/awstats.conf"
# log soubor Apache (v mém případě)
LogFile="/home/www/logs/domain.tld.log"
# doména, povinný parametr, který se spíše uplatní při použití spojeného logu (o tom později)
SiteDomain="domain.tld"
# aliasy pro SiteDomain, doporučuji tento formát
HostAliases="REGEX[domain\.tld$]"

Apache 2

Nastavíme Apache, aby logoval. Direktiva CustomLog se může nacházet uvnitř i vně direktivy <VirtualHost>, podle toho, co všechno chceme logovat.

Jeden log pro každou doménu

Direktivu přidáme do odpovídajícího VirtualHosta:

<VirtualHost *:80>
    ServerName domain.tld
    ...
    CustomLog /home/www/logs/domain.tld.log combined
</VirtualHost>

Jeden log pro celý server

Přidáme mimo VirtualHost:

# vlastní formát logu, prefixem je jméno VirtualHosta
LogFormat "%{Host}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" cplus
CustomLog /home/www/logs/server.log cplus

V případě této konfigurace musíme Awstats říct o novém formátu logu, což provedeme přímo v konfiguraci awstats.conf úpravou řádky LogFormat:

LogFormat="%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"

Další nastavení

Alias /awstats-icon/ /usr/share/awstats/icon/
<Directory /usr/share/awstats/icon>
    Options None
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

Namapuje adresář s obrázky Awstats do URL adresy /awstats-icon/.

Zpracování

K periodické aktualizaci dat nastavíme cron (pokud již tak distributor neudělal):

*/15 *  * * *   root    /home/bin/awstats_updateall.pl now --excludeconf=awstats.conf > /dev/null 2>&1

Skript awstats_updateall.pl a dalších pár šikovných skriptů nalezneme v adresáři /usr/share/doc/awstats/examples. Tento skript zpracovává všechny konfigurační soubory, takže aktualizuje všechny domény.

Máme-li správně nastavené CGI, což ve výchozí konfiguraci obvykle bývá, nalezneme webový frontend awstats na adrese http:domain.tld/cgi-bin/awstats.pl?con­fig=domain.tld//. Kromě řešení na bázi Perl frontendu a awstats_updateall.pl skriptu je však možné využít awstats_buildstaticpages.pl, který přímo vygeneruje HTML soubory do adresáře zadaného v parametru. Toto řešení převážně využívám na webhostingách, má však tu nevýhodu, že není možné zobrazit statistiky za jiná období a zákazník vždy vidí pouze aktuální měsíc.

Vylepšení

Napsal jsem rewrite, který podstatně zkrášluje adresu a parametr předávaný skriptu /cgi-bin/awstats.pl na webu:

RewriteEngine On
RewriteRule ^/?([^/]+)/$ /cgi-bin/awstats.pl?config=$1 [PT,L,QSA]

Výše zmíněný kód je vhodné aplikovat na určitou subdoménu, např. stats. Statistiky pak nalezneme na adrese http://stats.anotherdomain.tld/domain.tld/.

Statistiky subdomén

Awstats se samozřejmě dá nastavit tak, aby u určité domény logoval i každou subdoménu. Tento přístup kombinuje a upravuje formáty logů popsané výše. Každá subdoména musí mít svůj VirtualHost a definovaný log, v optimálním případě budou logy pro každou doménu zvlášť a v nich spojené logy subdomén s upraveným formátem (viz. jeden log pro celý server).

Štítky:

Vlastní chybové hlášky v Apachi a PHP

Standardní chybové hlášky v Apachi jsou z informativního charakteru naprosto dostačující, avšak z toho estetického nikoli. Kdekoho posléze napadne, jak tyto chybové hlášky přenastavit. Na tom samozřejmě není nic těžkého, stačí vhodná úprava do souboru .htaccess typu:

ErrorDocument 404 /neexistuje.html

Mít pro každý kód chyby jinou stránku je pak zbytečně komplikované. Naštěstí existuje řešení, jak různé kódy efektivně zpracovat na úrovni PHP. Základní zjednodušené nastavení souboru .htaccess pak bude vypadat obdobně:

ErrorDocument 400 http://400.dragonjake.net
# speciální hack pro 401 Authorization Required
Alias /401/ /var/www/html/
ErrorDocument 401 /401/index.php

ErrorDocument 403 http://403.dragonjake.net
ErrorDocument 404 http://404.dragonjake.net
ErrorDocument 500 http://500.dragonjake.net

Ve svém řešení využívám externí http:// adresy pro jednotlivé kódy zvlášť, v Apachi nastavené zhruba takto:

<VirtualHost *:80>
        ServerName dragonjake.net
        ServerAlias 400.dragonjake.net 403.dragonjake.net 404.dragonjake.net 500.dragonjake.net
        DocumentRoot /var/www/html
</VirtualHost>

V adresáři /var/www/html se nachází nejočekávanější soubor, skript index.php, který chybové kódy zpracovává. Klíčová je superglobální proměnná $_SERVER['REDIRECT_STATUS'], která vrací HTTP stavový kód, podle kterého následně skript rozlišuje typ chyby.

Bohužel pro chybu 500 nevrátí proměnná z nepochopitelných důvodů nic. Skript používám i jako výchozí lokaci pro požadavky, které neodchytne žádný <VirtualHost>, např. když někdo zadá přímo IP adresu do prohlížeče. Zjištění chyby jsem tedy oprasil díky URL přes regulární výraz.

if (empty($code)) {
        preg_match('~(\d+)\.dragonjake\.net$~', $_SERVER['HTTP_HOST'], $m);
        $code = $m[1];
}

Úmyslně ve své implementaci nepoužívám žádný výpis URL adresy, která se běžně u podobných chybových hlášení objevuje. Zvědavcům napovím, že se jedná o proměnné $_SERVER['REQUEST_URI'] a $_SERVER['REDIRECT_URL']. Na závěr přikládám celý kód „chybového“ skriptu.

# determine status code, 500 does not work :(
if (empty($code)) {
        preg_match('~(\d+)\.dragonjake\.net$~', $_SERVER['HTTP_HOST'], $m);
        $code = $m[1];
}

# set text by status code
switch ($code) {
        case 400:
                $h = '400 Bad Request';
                $t = 'Err... what did you say?!';
                break;
        case 401:
                $h = '401 Authorization Required';
                $t = 'You haven\'t given me a gold!';
                break;
        case 403:
                $h = '403 Forbidden';
                $t = 'Step back before you get eaten!';
                break;
        case 404:
                $h = '404 File Not Found';
                $t = 'Are you looking for something?!';
                break;
        case 500:
                $h = '500 Internal Server Error';
                $t = 'Whops! Something got wrong!';
                break;
        default:
                $h = '';
                $t = 'Server is up and running.';
}

# send header
if (!empty($h))
        header($_SERVER['SERVER_PROTOCOL'] . ' ' . $h, TRUE, $code);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="cs" lang="cs" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="content-language" content="cs" />
<meta name="author" content="Dragon Jake; e-mail: admin@dragonjake.net" />
<meta name="copyright" content="© 2006 Dragon Jake" />
<meta name="robots" content="noindex,nofollow" />
<link rel="stylesheet" type="text/css" href="/401/main.css" />
<link rel="shortcut icon" type="image/x-icon" href="/401/favicon.ico" />
<title><?php if (!empty($h)) echo $h . ' | '; ?>Dragon's Server</title>
</head>
<body>
<div id="logo"></div>
<h1><?php echo htmlspecialchars($t); ?></h1>
<a href="http://www.dragonjake.net">www.dragonjake.net</a>
</body>
</html>

Štítky:

Blog založen

Založil jsem blog, skutečně blog! Další? A proč?

Proč?

To je dobrá otázka a těžko se na ni odpovídá. Již delší dobu je můj prvotní dračí web docela mrtvý, psaní dalších článků do něj je spíše utrpením. Může za to především zastaralost kódu a jeho nejistá funkčnost, což má za následek výrazné nepohodlí něco rychle napsat. Když jsem tedy psal článek, znamenalo to minimálně 2 hodiny úmorné práce, kterou jsem raději vykonával předem do textového souboru, včetně formátování. Nakonec to dopadlo tak, že byl článek 10× delší, než jsem původně zamýšlel.

Cíle tohoto blogu

Tento blog bude čistě IT. Nebudu zde prezentovat své názory na dění ve světě, nekonečné pochody mých nesmyslných myšlenek ani zcela fiktivní a nemožné pokusy o literaturu, které jsem vlastně nikdy pořádně nezveřejnil :-)

Naopak by měl blog sloužit jako rychlé know-how pro mě a pro všechny. Budu se pokoušet o časté aktualizace kratšími blogposty ze všech možných okruhů v problematice IT, kterým se věnuji.

Textpattern?

Ano. Aniž bych měl v lásce různé Wordpressy, Joomly či Drupaly, sáhl jsem pro tentokrát po otevřeném CMS.

A teď krátká vsuvka – zadal jsem do Googlu „lehký blog texy“, protože Texy! je prostě sexy a bez ní nedokážu normálně psát a Textpattern byl jednoznačně na prvním místě. Byť byl prezentován jako lehký, po prvním seznámení mi ani zdaleka lehký nepřijde a proto se nyní vzdávám veškerých pokusů a přizpůsobení. Jsem rád, že se mi povedlo nastavit rubriky a nějaké další základní věci jsem strávil dalších několik hodin přizpůsobením designu, až jsem skončil v úpravách samotného HTML kódu a přidávání další funkcionality, přesto „to“ ještě není ono.

V dnešní době bohužel nemám přespříliš času, abych si naprogramoval vlastní, rychlejší a jednodušší blogovací systém, přestože jsem obětoval celých 30 minut vymýšlení základní struktury a funkcionality. Časem bych byť zajímavý Textpattern samozřejmě rád nahradil vlastním řešením… ale čas je silně relativní ;-)

Štítky: