Linux, slobodny software, konfiguraky, skripty
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.
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.
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
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; } }
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.
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.
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.
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 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).
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
Nastavime webove rozhranie (nie, nepouzijeme odstrasujuci git-web).
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.
Mozno je len zle nastaveny firewall. Git pouziva port 9418.
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:
pacman -S grub-bios #narozdiel od videa sa balik vola inak
modprobe dm-mod
grub-install --target=i386-pc --recheck --debug /dev/sda #vo videu boli ine parametre
mkdir -p /boot/grub/locale #vo videu chyba
cp /usr/share/locale/en\@quot/LC_MESSAGES/grub.mo /boot/grub/locale/en.mo #vo videu chyba
grub-mkconfig -o /boot/grub/grub.cfg
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.
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
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 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}`\""
Okrem KDE, vsetky ostatne kompenenty nasledovnej konfiguracie, su nenarocne na systemove prostriedky aj pri rozsiahnej hudobnej kolekcii. Obrovsky rozdiel oproti prehravacom ako Clementine, Amarok, alebo Rhythmbox.
Ako integrovat hudobny daemon MPD a prehravac Ncmpc++ do KDE? Predpoklad je, ze MPD funguje (moze pomoct predchadzajuci clanok, ako nastavit Pulseaudio spolu s MPD). Takze hudba vdaka daemonovi moze hrat, len chyba prehravac :)
Ncmpc++ je silno konfigurovatelny, nenarocny ale mocny prehravac. Ponuka celkom prijemne nastavenia ihned po instalacii. Tu je moj konfigurak so screenshotom.
Ako nastavit notifikacie v KDE pri zmene pesnicky? Podobne ako to ma Amarok alebo Clementine alebo Rhythmbox alebo… Nainstaloval som si Colibri a nastavil podla pokynov na https://gitorious.org/colibri/pages/SetupHowto. Ak teda bezi Colibri, staci poslat z Ncmpc++ notifikaciu. V konfiguraku je to uz spravene, je to option ‘execute_on_song_change’. Namiesto kdialog sa da pouzit aj notify-send. V mojom pripade notifikacia nastavi titulok na ‘(dlzka) nazov_piesne’, telo notifikacie tvori ‘skupina – album’.
Kedze krkolomny prikaz ncmpcpp sa tazko pise, vytvoril som si funkciu n(), ktoru volam ako alias. Uryvok z .zshrc (alebo .bashrc):
function n { SESSION_ID=`qdbus org.kde.konsole /Konsole org.kde.konsole.Window.currentSession` qdbus org.kde.konsole /Sessions/$SESSION_ID org.kde.konsole.Session.setTitle 1 "ncmpc++" ncmpcpp }
O co vo funkcii ide? Okrem toho, ze sa spusti ncmcpp, este pred tym sa nastavi v aktivnom tabe v Konsole titulok ‘ncmpc++’.
V Systemsettings->Shortcuts and Gestures->Custom Gestures staci pridat vlastne skratky, u mna to vyzera takto:
Ako je vidiet, na ovladanie sluzi prikaz ‘ncmpcpp <akcia>’ . Ten isty vysledok sa da dosiahnut aj programom mpc, ktory sluzi vlastne len na ovladanie MPD cez terminal.
Konfiguracia MPD jednoducha. Sprievodca konfiguracnym suborom /etc/mpd.conf:
# Kde je ulozena hudobna kolekcia music_directory "/media/data/hudba" # Kde sa budu ukladat playlisty playlist_directory "/var/lib/mpd/playlists" # Subor s informaciami o kolekcii db_file "/var/lib/mpd/mpd.db" # Zapisovanie logov log_file "/var/lib/mpd/mpd.log" pid_file "/var/lib/mpd/mpd.pid" state_file "/var/lib/mpd/mpdstate" # Fiktivny pouzivatel, ktory bude pustat hudbu/pod ktorym bude bezat mpd. # Je dobre nechat tuto hodnotu nezmenenu. # Pre ilustraciu, vypis `ps aux | grep mpd': # mpd 27842 2.8 0.3 697716 14600 ? Ssl 21:16 0:28 /usr/bin/mpd --no-daemon user "mpd" # Skupinu nie je nutne nastavovat #group "nogroup" # Dobrym zvykom je dat jasne najavo svoju prislusnost a hrdost k adrese a portu. bind_to_address "127.0.0.1" port "6600" # Nutne pre spojenie s pulseaudiom. audio_output { type "pulse" name "My Pulse Output" # Tato adresa nema suvis s bind_to_address. Musi byt rovnaka, ako adresa nastavena v pulseaudio. server "127.0.0.1" # Nazov vystupu, na ktorom je zapnuty pulseaudio-ekvalizer. sink "ladspa_output.mbeq_1197.mbeq" }
Takato konfiguracia nam zaruci to, ze mpd bude pouzivat ekvalizer (teda ten ladspa_output.mbeq_1197.mbeq sink), zatial co ostatne aplikacie nemusia.
Do suboru ~/.pulse/default.pa staci pridat tento riadok:
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1
Adresa 127.0.0.1 sa musi zhodovat s adresou v mpd.conf v casti audio_output.
Ako ekvalizer pouzivam stary http://aur.archlinux.org/packages.php?ID=48316. Funguje out-of-the-box a ma aj GUI. Dokonca automaticky urobi potrebne zmeny v ~/.pulse/default.pa, priblizne taketo:
### BEGIN: Equalized audio configuration ### Generated from: pulseaudio-equalizer load-module module-ladspa-sink sink_name=ladspa_output.mbeq_1197.mbeq master=alsa_output.pci-0000_00_1b.0.analog-stereo plugin=mbeq_1197 label=mbeq control=5.3,2.6,2.6,-8.5,-10.5,-11.2,-16.0,-14.7,-6.6,-5.7,-3.0,3.0,6.7,7.3,7.3 set-default-sink ladspa_output.mbeq_1197.mbeq set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo 65536 set-sink-mute alsa_output.pci-0000_00_1b.0.analog-stereo 0 ### END: Equalized audio configuration
Dolezita je hodnota sink_name, ktora sa musi zhodovat s nastavenim mpd.conf (sekcia audio_output).
Teraz je vsetko nastavene a staci spustit/restartovat Pulseudio a MPD.
Toto riesim v tomto clanku.
Posledny mesiac som pouzival namiesto Netbeans pre vyvoj webovych aplikacii postavenych na PHP/JS zaujimave IDE PhpStorm. PhpStorm kombinuje WebStorm s podporou PHP a stoji za nim JetBrains (ma centralu aj v CR, JetBrains bolo zalozene v CR v roku 2000). Fakty a moje zistenia:
Som smutny, ze PhpStorm nie je opensource (aspon platforma IntelliJ Platform je kompletne otvorena…). Kedze PhpStorm pouzivam pre komercne ucely, planujem si kupit licenciu (treba sa nejak odmenit vyvojarom za to, ze mozem pomocou ich softwaru zarabat peniaze). Bohuzial, plati len pre jednu verziu programu -hoci na neobmedzenu dobu (a verziu uvolnenu do 1 roka od kupy licencie). To je dost zle. Poplatok za upgrade je lacnejsi. Hasin na http://hasin.me/2012/01/03/getting-comfy-with-phpstorm/ pisal, ze pri troche stastia sa da ziskat zlava :)
Kazdopadne, PhpStorm aj Netbeans su kvalitny software a o rok budem porovnavat zase (lebo Netbeans je free).