Prechod k Octopressu, koncim s WordPressom

Ako som uz stihol napisat na svojom novom blogu, po niekolkych rokoch prechadzam od WordPressu ku Octopressu. Dovody su jednoduche — kontrola nad svojim vlastnym serverom, moznost hrabat sa v kode (a moznost domrvit funkcne veci :) ) a prilezitost naucit sa nieco nove. Naviac, uz dlhsie som planoval pisat v anglictine a novy blog je skvelou prilezitostou zacat.

Vlastny GIT server: 2. cast

V predchadzajucej casti sme si zabezpecili manazment GIT repozitarov vdaka gitolite. V tomto diele nastavime webserver — gitlist je lightweight nahrada za gitorious alebo github. Zobrazuje repozitare, ich obsah, commity, jednoduche statistiky a ma v sebe este par dalsich drobnosti.

Gitlist je PHP aplikacia. Na serveri mi bezi nginx spolu s php-fpm, takze konfiguraciu budem ukazovat pre tietu sluzby.

Stiahnutie gitlistu a zavislosti

Predpokladam, ze nginx spolu s php-fpm je uz nastaveny. Ak nie, tak navodov na googli je hojne. Naklonujme si gitlist:

git clone https://github.com/klaussilveira/gitlist.git
#gitlist je moderna aplikacia, zavislosti projektu riesi composer, da sa pouzit na sposob ruby gems
curl -s http://getcomposer.org/installer | php
#nainstaluje zavislosti projektu do adresara vendor
php composer.phar install

Nginx

Tu je moj konfigurak:

server {
    server_name ~^git.moja_masina.tld$;
    access_log /var/log/nginx/git.access.log;
    error_log /var/log/nginx/git.error.log;

    root /srv/http/git/;
    index index.php;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location ~* ^/index.php.*$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include /etc/nginx/fastcgi_params;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    }

    location / {
        try_files $uri @gitlist;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        add_header Vary "Accept-Encoding";
        expires max;
        try_files $uri @gitlist;
        tcp_nodelay off;
        tcp_nopush on;
    }

#   location ~* \.(git|svn|patch|htaccess|log|route|plist|inc|json|pl|po|sh|ini|sample|kdev4)$ {
#       deny all;
#   }

    location @gitlist {
        rewrite ^/.*$ /index.php;
    }
 }

Nastavenia pristupu gitlistu ku repozitarom

Nech nginx daemon bezi pod usero, ktory patri do skupiny http. Nech repozitare su ulozene v /home/git/repositories. Logicky je nutne zabezpecit citanie suborov v tomto adresari. Zmenme vlastnikov skupin adresara /home/git a /home/git/repositories na http a nastavme prava na citanie.

chgrp http /home/git
chmod g=rx /home/git
chgrp http -R /home/git/repositories
chmod g=rX -R /home/git/repositories # nastavim atribut x len pre adresare

Tu sa treba zamysliet nad buducnostou. Ked gitolite vytvori nove repozitare, mali by byt citatelne http daemonom. Takze spravme toto:

chmod g+s -R /home/git/repositories #nove subory budu dedit vlastnika skupiny

Pre dokonalost upravme /home/git/.gitolite.rc; hodnotu “UMASK” zmenme na 0027. Vlastnikovi suborov ponechame povodne prava, skupina bude mat atributy r-s a ostatni nic.

Nastavenia gitlistu

Gitlist sa nastavuje cez subor config.ini. Skopirujeme teda config.ini-example do config.ini a rozumne ho upravme.

Polozka “repositories” ukazuje na adresar, kde su vsetky repozitare. Ak si, drahy citatel, sledoval prvy diel navodu, tak cesta je “/home/git/repositories/”.

Upravme aj hidden[] a priradme mu tuto hodnotu: “/home/git/repositories/gitolite-admin.git”.

Polozka debug zapina alebo vypina cachovanie, takze pri hackovani aplikacie treba mat debug nastaveny na false, inak je true rozumna volba.

A to je vlastne vsetko. Teraz by gitlist mal bezat ako po masle. Bezi aj na mojom serveri, tu.

Trochu som sa hral s kodom aplikacie, a pridal link na hlavnej stranke kazdeho repozitara pre read-only pristup, podobne to ma aj github. Na to treba git-daemon, o tom bolo tiez pisane v prvom diele. Pozri commit.

Vlastny GIT server: 1. cast

Od kupy virtualneho servera zazivam po nociach (a v skorych rannych hodinach) neuveritelne mnozstvo zabavy. Jednou takou uzitocnou zabavkou, pri ktorej sa clovek comusi priuci a aj realne vyuzije, je rozbehanie vlastneho GIT serveru. Budeme chciet jednoducho vytvarat nove repozitare a nastavovat pravomoci pouzivatelom (do akych repozitarov mozu citat/zapisovat). Tiez sa budeme chciet pochvalit svojimi projektami, preto rozbehame webove rozhranie.

Tento navod je urceny pre Linuxy, BSD a asi aj OS X. Zjednodusene, pre krasny UNIXovy svet. Na server sa budeme pripajat cez SSH a pochopitelne treba mat nainstalovany GIT.

Git user

Zacnime vytvorenim git usera na serveri. Na tohoto usera sa budeme neskor pripajat cez SSH, v jeho domovskom adresari budu ulozene repozitare a ine pomocne veci, o ktorych budem pisat.

useradd -m -U git

Z ne-serverovej masiny (odkial sa pripajame na server cez SSH) treba skopirovat ssh pubkey do domoskeho adresara git usera. Odkazem na navod, kedze toto je rutinna zalezitost. Osobne sa na server pripajam bez hesla, na autentifikaciu pouzivam svoj verejny kluc (je to pohodlnejsie, bezpecnejsie a vhodne pre skriptovanie, kedze sa skript nemusi pytat na heslo). Cielom je, aby som svoj verejny kluc (napr ~/.ssh/id_rsa.pub) dostal na server (/home/git/admin.pub).

Gitolite

Gitolite sluzi na spravu pouzivatelov, ktori sa mozu pracovat s repozitarmi, a na spravu repozitarov (vytvaranie napriklad). Vdaka nemu kvoli nastavovaniu repozitarov sa nepotrebujem rucne pripajat cez SSH na git usera, vytvarat repozitare cez “git init –bare” a podobne veci. O vsetko sa postara gitolite a este mi usetri pracu.

Dalsie veci bude vykonavat git user:

su - git
git clone git://github.com/sitaramc/gitolite.git
mkdir -p $HOME/bin #pripravim si adresar, kde sa ulozi binarka gitolite
gitolite/install -to $HOME/bin #skopirujem subory z naklonovaneho repozitara do adresara bin
bin/gitolite setup -pk admin.pub #nastavim gitolite a poviem, ze sa gitolite-adminom bude clovek, ktoreho verejny kluc je ulozeny v subore admin.pub

Teraz by v /home/git mali existovat nove adresare: bin, gitolite, repositories. V adresari repositories sa vytvoril dolezity repozitar gitolite-admin.git (a asi aj testing.git, ale ten je nepodstatny).  Subor admin.pub uz nie je potrebny, skopiroval sa do .gitolite/keydir/admin.pub a nachadza sa tiez v .ssh/authorized_keys.

V tomto stadiu je gitolite nainstalovany a je pripraveny na pouzivanie. Na ne-serverovej masine napisme toto a stlacme enter :)

git clone git@moj_server:gitolite-admin

V naklonovanom repozitari su dva adresare, jeden na nastavenie pristupov k repozitarom a druhy na ukladanie ssh klucov pouzivatelov, ktori chcu mat pristup k repozitarom. Spravme si teda repozitar playwithme (subor conf/gitolite.conf):

repo playwithme
  RW+ = admin

A potom:

git commit -a
git push origin master

Na serveri sa vdaka hookom vytvori novy repozitar. Ak by sme chceli pridat dalsieho pouzivatela (povedzme nebuchadnezzar), tak ho pripiseme do gitolite.conf (riadok sa zmeni na “RW+ = admin nebuchadnezzar”, ak mu chceme zabezpecit plny pristup) a jeho pubkey ulozime do adresara keydir pod menom nebuchadnezzar.pub. Commit & push. Gitolite nastavi repozitar a aktualizuje ~/.ssh/authorized_keys. Teraz by mal pouzivatel nebuchadnezzar vediet klonovat, pullovat, pushovat a co ja viem co este repozitar playwithme (ale nema pristup ku gitolite-admin, co je dobre a je to tak spravne, lebo gitolite.conf je tak nastaveny).

Read-only pristup pre vsetkych

Na tuto ulohu sluzi git-daemon. Gitolite take nieco nevie zabezpecit, lebo na git pouzivatela sa pripajame cez SHH a v ~/.ssh/authorized_keys neexistuje nieco ako “public access for all”. Git-daemon je sucastou balika git a jeho nastavenie je velmi jednoduche. V zavislosti od distribucie najprv treba upravit jeho konfiguracny subor (v Arch Linuxe je to /etc/conf.d/git-daemon.conf). Daemon pri spustani pouziva parameter “–base-path=<path>”. V nasom pripade zmenime <path> na “/home/git/repositories/”. Spustime daemona. To vsak nie je vsetko :) Aby git-daemon mohol citat repozitar, musi byt v repozitari existovat subor “git-daemon-export-ok”. Do repozitarov nechceme rucne zasahovat, preto na ne-serverovej masine upravime “conf/gitolite.conf” a pridame do kazdeho repozitara, ktory ma byt public, novy riadok “R = daemon”. Commit & push. Gitolite vytvoril v pozadovanych repozitaroch prazdne subory “git-daemon-export-ok” a tym padom si ich git-daemon dovoli citat.

Skusme naklonovat nejaky repozitar:

git clone git://moj-server/moj-public-repo.git

Co bude v dalsej casti?

Nastavime webove rozhranie (nie, nepouzijeme odstrasujuci git-web).

Mozne chyby

Neviem naklonovat repozitar gitolite-admin.git

Nuz, treba sa najprv skusit pripojit cez ssh na git usera. Ak toto funguje, tak je nieco zle s gitolite. Ak toto nefunguje, je zle nastaveny SSH server.

Klonovanie repozitara zamrzlo

Mozno je len zle nastaveny firewall. Git pouziva port 9418.

Instalacia Archlinuxu s GPT, LVM a GRUB2 konfiguraciou

Instalacia Archlinuxu sa v poslednych mesiacoch trosku stazila, kedze instalator bol odstraneny a vsetko sa musi robit rucne. Nastastie je dost navodov (link na oficialny navod), ako co urobit. Jednym z nich je mierne zastarale video popisujuce vytvorenie particii v tabulke GPT, vytvorenie LVM oddielov, instalaciu a konfiguraciu GRUB2. K dnesnemu dnu sa da pouzit len cast o rozdeleni disku, navod na instalaciu a nastavenie GRUBu je aktualny na wiki.

Casti, ktore su vo videu zastarale, som prepisal do tychto prikazov, ktore su spustitelne na live CD verzie 2012.11.01:

  1. pacman -S grub-bios #narozdiel od videa sa balik vola inak
  2. modprobe dm-mod
  3. grub-install --target=i386-pc --recheck --debug /dev/sda #vo videu boli ine parametre
  4. mkdir -p /boot/grub/locale #vo videu chyba
  5. cp /usr/share/locale/en\@quot/LC_MESSAGES/grub.mo /boot/grub/locale/en.mo #vo videu chyba
  6. grub-mkconfig -o /boot/grub/grub.cfg

Pulseaudio ekvalizer len pre MPD daemona, a pre nic ine

Hudbu hrajucu cez MPD daemon chcem prehnat cez ekvalizer, ale ostatne zvuky (napr. z filmu) chcem pocut neupravene tymto ekvalizerom. Riesenim je nastavit MPD tak, aby pouzival ekvalizer (zmenim pulseaudio sink) a ostatne aplikacie necham pouzivat defaultny sink.

Najprv nastavim defaultny sink. Na to potrebujem vediet nazvy sinkov. Tie ziskam z vypisu prikazu “pacmd list-sinks”. U mna vyzera takto:

>>> 2 sink(s) available.
* index: 0
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
driver: <module-alsa-card.c>
flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY DYNAMIC_LATENCY
state: RUNNING

...

index: 1
name: <ladspa_output.mbeq_1197.mbeq>
driver: <module-ladspa-sink.c>
flags: HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY DYNAMIC_LATENCY
state: RUNNING

Mam teda dva sinky: alsa_output.pci-0000_00_1b.0.analog-stereo (toto bude defaultny sink) a ladspa_output.mbeq_1197.mbeq (to je ekvalizer). Ich nazvy su napisane v polozke ‘name’. Do ~/.pulse/default.pa pridam riadok “set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo” a restartujem pulseaudio server. Pripadne mozem zmenit defaultny sink aj za behu, bez restartu, prikazom “pacmd set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo”. Teraz mam nastaveny defaultny sink.

Este treba spravne nastavit MPD vystup. Toto som uz robil v tomto clanku (prvy odstavec, predposledny riadok konfiguraku (sink “ladspa_output.mbeq_1197.mbeq”)). Jednoducho povedane, treba k nastaveniu Pulseaudio vystupu pridat riadok hovoriaci o tom, aky sink sa ma pouzit. Ja som si teda vybral ekvalizer.

Parovanie viacerych Logitech s jednym USB prijimacom pod Linuxom

Logitech sa chvali svojim Unifying receiverom. Je to USB prijimac, ktory umoznuje prijimat signal od viacerych periferii. Netreba mat teda pre mys jeden receiver a pre klavesnicu druhy — staci jeden. Pre sparovanie zariadeni s prijimacom vsak treba nastavit zariadenie (mys, klavesnica, cokolvek ine). Pre Windows a Mac je software priamo na webe (http://www.logitech.com/unifying), na slobodne operacne systemy sa (ako zvycajne) zabudlo. Nastastie riesenie je jednoduche a priamociare.

Staci skompilovat tento program, ktory som pouzil nasledovne

  1. najprv som vypol logitech zariadenia
  2. spustil som program
  3. zapol som mys
  4. znova zapol program
  5. zapol klavesnicu
  6. spokojne fungujem s jednym USB prijimacom.

Zdrojak:

/*
 * Copyright 2011 Benjamin Tissoires <benjamin.tissoi...@gmail.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <linux/input.h>
#include <linux/hidraw.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>

#define USB_VENDOR_ID_LOGITECH                  (__u32)0x046d
#define USB_DEVICE_ID_UNIFYING_RECEIVER         (__s16)0xc52b
#define USB_DEVICE_ID_UNIFYING_RECEIVER_2       (__s16)0xc532

int main(int argc, char **argv)
{
        int fd;
        int res;
        struct hidraw_devinfo info;
        char magic_sequence[] = {0x10, 0xFF, 0x80, 0xB2, 0x01, 0x00, 0x00};

        if (argc == 1) {
                errno = EINVAL;
                perror("No hidraw device given");
                return 1;
        }

        /* Open the Device with non-blocking reads. */
        fd = open(argv[1], O_RDWR|O_NONBLOCK);

        if (fd < 0) {
                perror("Unable to open device");
                return 1;
        }

        /* Get Raw Info */
        res = ioctl(fd, HIDIOCGRAWINFO, &info);
        if (res < 0) {
                perror("error while getting info from device");
        } else {
                if (info.bustype != BUS_USB ||
                    info.vendor != USB_VENDOR_ID_LOGITECH ||
                    (info.product != USB_DEVICE_ID_UNIFYING_RECEIVER &&
                     info.product != USB_DEVICE_ID_UNIFYING_RECEIVER_2)) {
                        errno = EPERM;
                        perror("The given device is not a Logitech "
                                "Unifying Receiver");
                        return 1;
                }
        }

        /* Send the magic sequence to the Device */
        res = write(fd, magic_sequence, sizeof(magic_sequence));
        if (res < 0) {
                printf("Error: %d\n", errno);
                perror("write");
        } else if (res == sizeof(magic_sequence)) {
                printf("The receiver is ready to pair a new device.\n"
                "Switch your device on to pair it.\n");
        } else {
                errno = ENOMEM;
                printf("write: %d were written instead of %ld.\n", res,
                        sizeof(magic_sequence));
                perror("write");
        }
        close(fd);
        return 0;
}

Program sa skompiluje a spusti nasledovne:

gcc -o pair <subor_so_zdrojakom>

sudo ./pair /dev/hidraw0

Cesta ku hidraw sa moze lisit (napr. /dev/hidraw1). Treba skusat.

Posielanie notifikacii cez dbus v Pythone

Posielanie upozorneni/notifikacii cez notify-send alebo kdialog nie je nic tazke, avsak ani jeden program neumoznuje nahradit existujucu notifikaciu tou novou. Cez kdialog si posielam notifikaciu o atualnej pesnicke, ako som pisal v clanku o Ncmpc++ (hudobny prehravac). Avsak, ked preskakujem pesnicky, teda na 2 sekundy hra pesnicka ‘A’, potom sekundu pesnicka ‘B’ a az na pesnicku ‘F’ mam naladu, vytvori sa fronta 6 notifikacii, z ktorych kazda trva napr. 3 sekundy. Jednak to otravuje (dokopy 18 sekund trvajuce notifikacie v rohu obrazovky) a jednak notifikacie nezodpovedaju skutocnosti (vsetky notifikacie okrem najnovsej su zastarale). Rozne hudobne prehravace, napr. Amarok, notifikacie neradia do fronty, ale vzdy sa nahradi posledna notifikacia tou najnovsou. Takze ja to tiez takto spravim.

Problem som chcel vyriesit volanim qdbus takymto sposobom:

qdbus org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.Notify '' 0 '' 'NADPIS' 'TELO' '' 0 0

Ta prva 0 je cislo notifikacie, ktoru chcem nahradit. Info o ostatnych argumentoch je k dispozicii cez program ‘qdbus’ alebo graficky ‘qdbusviewer’. Horny prikaz skonci chybou

Sorry, can't pass arg of type 'QVariantMap'

Podla mudrych ludi na internete je to riesitelne jedine tak, ze si napisem vlastny skript v C/Pythone/nieco_ine, ktory by volal metodu org.freedesktop.Notifications.Notify().

Vystraha ;) Nie som pythonista a kod nizsie je v poradi druhy subor v pythone, ktory som kedy napisal.

Kod pre Python2.7 je stiahnutelny tu. Okrem volania metody Notify() si musim pamatat aj ID poslednej notifikacie, ktore na zaciatku citam a na konci zapisujem do suboru cat /tmp/dbus-notify-id-file. Kod ako taky funguje, a pouzivam ho spolu s ncmpcpp (dolezity riadok v ~/.ncmpcpp/config:

execute_on_song_change = "/home/cinan/system/bin/dbus-notify.py \"`ncmpcpp --now-playing %t{\ \(%l\)}`\" \"`ncmpcpp --now-playing {%a}{\ -\ %b}`\""
Sleduj

Prijímaj upozornenia na nové články na tvoj email.

Join 57 other followers