PHP i Python – środowisko developerskie

Jakiś czas temu zacząłem pracować dla klienta, który realizuje swój projekt w oparciu o koncepcję mikroserwisów Martina Fowlera. Nowe serwisy pisane są w Pythonie ale utrzymanie i dalszy rozwój starszych częściej architektury wymaga znajomości języka PHP. Mam ponad pięcioletnie, ciągłe doświadczenie w programowaniu w PHP, ale sięga ono czasów kiedy użycie JavaScriptu na serwerze wydawało się być pomysłem absurdalnym, kiedy konto na Naszej Klasie było tak powszechne jak dziś profil na Facebooku, a na współdzielonych hostingach królowało PHP w wersji 5.3, która zasłynęła m.in z wprowadzenia instrukcji goto.

Odkąd porzuciłem PHP na rzecz Pythona nie tylko zacząłem tworzyć bardziej pythoniczny kod, ale wzbogaciłem też swój warsztat deweloperski o nowe narzędzia, praktyki i metodologie. Po tych kilku latach patrzę już na PHP przez pryzmat doświadczeń zdobytych w trakcie programowania w innych językach. Nie dawno miała miejsce premiera PHP w wersji 7, która zbiera dobre recenzje i ma rewelacyjne wyniki w benchmarkach. Postanowiłem zapoznać się z tą nową odsłoną – dla mnie zapomnianego już lekko – języka. Pierwsza krok jaki musiałem wykonać to instalacja najnowszej wersji PHP na komputerze.

PHPbrew

Dwie wersje Pythona 2 i 3 zainstalowane równolegle w systemie to standard jednak chcąc mieć możliwość skorzystania z mniej popularnych wersji warto posłużyć się dodatkowym oprogramowaniem takim jak pythonz będącego forkiem nie wspieranego już projektu pythonbrew, który oficjalnie odsyła do pyenv (nie mylić z pyvenv, o którym za chwilę).

PHP ma swój odpowiednik pythonbrew – PHPbrew. Instalacja tego narzędzia jest bezproblemowa i szczegółowo opisana na stronie projektu http://phpbrew.github.io/phpbrew/ więc nie będę jej powielał. Po instalacji PHPbrew możemy przystąpić do instalacji samego PHP w różnych wersjach. Podobnie jak analogiczne narzędzia Pythona – PHPbrew do zainstalowania PHP oraz jego rozszerzeń wymaga także zadbania o zależności. Ja np. spotkałem się z komunikatem configure: error: Please reinstall readline – I cannot find readline.h, który w uprzejmy sposób poinformował mnie o konieczności doinstalowania pakietu deweloperskiego redline

sudo aptitude install libreadline-dev
phpbrew install php-5.5.9

albo instalacji PHP bez obsługi tego rozszerzenia np w wersji 7.

phpbrew install php-7.0.6 -readline

Przełączenie się na wybraną wersję PHP wymaga wydania prostej komendy w konsoli:

phpbrew use php-7.0.6

Od tej chwili możemy rozpocząć pracę z wybraną wersją PHP w konsoli lub też odpalić wbudowany w PHP od wersji 5.4 serwer, a po zakończeniu pracy wrócić do domyślnie zainstalowanej w systemie wersji.

phpbrew off

virtPHP

Zarówno Python, jak i PHP stale się rozwijają. Wciąż dochodzą mniejsze lub większe usprawnienia, pojawiają się nowe rozszerzenia, biblioteki, moduły. Przełomowe zmiany, takie jak w przypadku wydania siódmej odsłony PHP następują stosunkowo rzadko, a co za tym idzie mechanizmy zarządzania wersjami danego języka w systemie przydają się sporadycznie. O wiele częściej deweloperzy spotykają się z potrzebą konfiguracji środowiska deweloperskiego dobraną specjalnie pod dany projekt.

Python ze swoim wirtualnym środowiskiem virtualenv trochę mnie rozpieścił jako dewelopera. Virtualenv lub też jego funkcjonalny następca – wbudowany w Pythona 3 moduł pyvenv pokazał mi że praca nad różnymi aplikacjami, wymagającymi często odmiennego zestawu bibliotek i konfiguracji może być łatwa i przyjemna.

Instalacja, utworzenie wirtualnego środowiska – w tym wypadku w katalogu projektu – i uruchomienie go poprzez wywołanie skryptu, który ustawia wszelkie zmienne środowiskowe.

sudo apt-get install python-virtualenv
cd ~/my_project/
virtualenv .ve
source .ve/bin/activate

Do wersji 3.3 Pythona zalecane jest używanie virtualenv zamiast pyvenv bo dopiero w wersji 3.4 pyvenv ma wbudowanego menagera pakietów pip umożliwiającego łatwą instalację zależności.

pip install django

Pip umożliwia zrzucenie listy zainstalowanych pakietów do pliku dzięki czemu możliwe jest np. zachowanie konfiguracji wirtualnego środowiska w repozytorium Git

pip freeze > requirements.txt

i późniejsze jego odtworzenie na innej maszynie.

pip install -r requirements.txt

Komfort pracy, jaki daje wirtualne środowisko jest nie do przecenienia. W katalogu projektu mamy tylko i wyłącznie pliki projektu. Wszystkie zależności – niezbędne moduły i biblioteki dostarczane przez zewnętrznych developerów trzymane są w odmiennej lokalizacji i jedyne czego potrzebujemy do odtworzenia środowiska niezbędnego do uruchomienia projektu jest plik requirements.txt. Python dał mi zupełnie odmienne doświadczenie w tej kwestii w stosunku do projektów realizowanych w PHP gdzie wszelkie zależności – nie licząc wbudowanych funkcji języka oraz wkompilowanych w niego rozszerzeń – były trzymane, najczęściej w podkatalogu „vendors” i razem z plikami projektu do repozytorium pchane były całe feameworki i inne rozbudowane biblioteki, ewentualnie zaciągane zewnętrzne repozytoria.

Jak wspomniałem przez ostatnie lata nie obcowałem z PHP zbyt intensywnie więc szukałem funkcjonalnego odpowiednika virtualenv. Znalazłem virtPHP. Twórcy virtPHP nie ukrywają, że wzorowali się na swym pythonowym odpowiedniku starając się stworzyć narzędzie równie łatwe a nawet podobne w użyciu. Biblioteka ta nie została jeszcze ustabilizowana. Ostatnia póki co wersja virtPHP 0.5.2-alpha jest dedykowana jedynie na systemy unixopochodne. Trochę martwi brak aktywności developerów przez ostatni rok – nie mniej zachęcam do wypróbowania możliwości wirtualnych środowisk w PHP.

Kiedy już uporamy się z zainstalowaniem virtPHP, możemy przystąpić do utworzenia pierwszego wirtualnego środowiska dla projektu w PHP.

cd ~/my_php_project/
php virtphp.phar create .my-ve
source .my-ve/bin/activate

VirtPHP można łaczyć także z PHPbrew

php virtphp.phar create --php-bin-dir="/home/user/.phpbrew/php/php-5.5.9/bin" .my-ve

Od tej chwili można instalować biblioteki z repozytoriów PECL i PEAR

pecl install mongo
pear install pear.phpunit.de/PHPUnit

Potencjał tego narzędzia oceniałbym jako wysoki gdyby nie problem z repozytoriami PHP. PECL to repozytorium rozszerzeń PHP napisanymi w języku C. Trudno mi ocenić jego aktualność – zwłaszcza w związku z wydaniem wersji PHP 7. PEAR to biblioteki napisane w PHP tyle, że to staroć nieuaktualniany o nowe wydania bibliotek (np. Symfony Framework). Ponieważ trzymanie zależności w podkatalogu „vendor” stało się powszechnie stosowaną praktyką w świecie PHP popularność zdobył sobie menadżer zależności, który niejako podtrzymał tradycję.

Composer

Menadżer zależności Composer może być uruchomiony w kontekście wirtualnego środowiska virtPHP co niesie ze sobą dodatkowe korzyści, ale równie dobrze może być używany niezależnie. Koncepcyjnie Composerowi najbliżej do npm znanego z Node.js.

Instalacja Composera sprowadza się do ściągnięcia pliku composer.phar do katalogu głównego projektu.

cd ~/my_php_project/
php -r "readfile('https://getcomposer.org/installer');" | php

Zależności są instalowane w podkatalogu vendors.

php composer.phar require monolog/monolog
php composer.phar require twig/twig

natomiast w katalogu głównym tworzone są trzy pliki:

./vendors/autoload.php
./composer.json
./composer.lock

Plik composer.json, zawiera bieżącą konfigurację zależności.

{
    "require": {
        "monolog/monolog": "^1.19",
        "twig/twig": "^1.24"
    }
}

Z kolei w pliku composer.lock – również w formacie json – zapisane są szczegóły na temat zainstalowanych paczek i ich wersji. Tan plik jest bardzo rozbudowany. W repozytorium kodu zalecane jest przechowywanie obu plików, gdyż w przypadku próby odwzorowania konfiguracji na innej maszynie,

php composer.phar install

polecenie composer install korzysta właśnie z pliku composer.lock i dopiero w przypadku jego braku, z konfiguracji zapisanej w composer.json, ale wtedy nie ma pewności, że dostaniemy dokładnie taki sam wynik.

Deweloperzy PHP są leniwi jak przystało na każdego szanującego się programistę i unikają pisania zbędnego kodu związanego z dołączaniem wymaganych klas i funkcji. Mają do dyspozycji autoloader. Sam byłem zakochany w koncepcie autoloadera dopóki nie zacząłem na full etat kodować w Pythonie. Okazało się, że importy są całkowicie wystarczające a do tego stanowią jeden z aspektów samodokumentującego się kodu. Jeśli unikasz tzw. importowania z gwiazdką, nie potrzebujesz zaawansowanego IDE aby wiedzieć, gdzie co jest i czego możesz się spodziewać w danym module. Pythonowcy nie wiedzą co to autoloader. PHP-owcy nie potrafią bez niego żyć tak więc Composer wspiera również ten mechanizm. Po zainstalowaniu zależności w katalogu vendors generowany jest plik autoload.php, który wystarczy tylko zaimportować.

require __DIR__ . '/vendor/autoload.php';

PHP przez wiele lat królowało na współdzielonych hostingach dając PHP dużą przewagę nad innymi językami skryptowymi używanymi w web developmencie. Wystarczyło połączenie FTP do przesłania plików na serwer i początkujący webmaster mógł się cieszyć z działającej strony www. Composer wymaga dostępu do shella tak więc z pełni jego zalet będą cieszyć się osoby pracujące nad serwisami publikowanymi na kontach z dostępem przez ssh np. na VPN-ach albo serwerach dedykowanych.

Docker

Przez ostatnie parę lat mocno rozwinęła się wirtualizacja. Deweloperzy bardzo chętnie sięgają dziś po narzędzia typu Vagrant lub Docker, które umożliwiają utworzenie niemal całkowicie odseparowanego środowiska deweloperskiego, niezależnego od konfiguracji komputera programisty, dającego się przenieść na inną maszynę. W kontenerze można dziś zamknąć zarówno aplikacje pisane w PHP, Pythonie jak i w wielu innych językach programowania więc to nie czyni różnicy między nimi. Docker ma ogromne możliwości, których nie zamierzam tutaj opisywać. Jest to temat na grubą książkę. Chcę jedynie zaprezentować przykład podstawowego użycia kontenera, w którym zamknięte jest PHP w wersji 7 do sprawdzenia możliwości nowej odsłony tego języka.

PHP ma swoje oficjalne obrazy w repozytorium Dockera i w domyślnej konfiguracji, wraz z pełni funkcjonalnym Apachem daje się uruchomić po wydaniu zaledwie dwóch komend .

docker pull php:7.0.6-apache
docker run -p 8080:80 -v "~/my_php_project":/var/www/html --name my-php7-container php:7.0.6-apache

Po wrzuceniu pliku do katalogu my_php_project

echo '<?php phpinfo();' > ~/my_php_project/info.php

I wybranie w przeglądarce adresu

localhost:8080/info.php

możemy obejrzeć sobie konfigurację PHP 7.

Naturalnie trzeba mieś już zainstalowanego i skonfigurowanego Dockera. Warto ten wysiłek podjąć i rozpocząć przygodę z kontenerami. Już najprostsze przypadki użycia są przydatne i wcale nie trzeba pracować nad wielkim projektem o rozbudowanej architekturze aby docenić zalety konteneryzacji. Choć rozwiązanie to nie jest bez wad – obrazy Dockera sporo ważą, a uruchomione instancje zabierają sporo zasobów będąc bądź co bądź pełnoprawnymi systemami – w zamian dostajemy odseparowane pudełko, w którym możemy zamknąć np. wersję 2.4 blendera, która jako ostatnia obsługuje skrypty pisane w Pythonie 2.

Każdy człowiek ucząc się nowej rzeczy czerpie ze swoich dotychczasowych doświadczeń. Programiści rozpoczynający pisanie oprogramowania w nowym dla nich języku starają się zorganizować swój warsztat pracy w sposób, który jest im znany. Udaje się to mniej lub bardziej bo każdy język programowania ma swoją specyfikę uwarunkowaną przyjętymi założeniami, filozofią, techniczną implementacją i wypracowaną praktyką. To co jest przyjęte za standard w jednej technologii w innej może być uważane za niemile widziane. Sztuką jest dostosować się i nauczyć poprawnie każystać z dedykowanych narzędzi. Zarówno PHP, jak i Python umożliwiają organizację pracy dewelopera w sposób umożliwiający łatwe przełączanie się pomiędzy różnymi projektami posiadającymi swoją konfigurację i zależności. Choć robią to w nieco odmienny sposób w mojej ocenie wygoda rozwiązań stoi na porównywalnym poziomie.

Domyślne uruchamianie Windowsa za pomocą GRUB boot loadera

Jakiś czas temu kupiłem nowego kompa i stary w schedzie przypadł mojej żonie. Mimo moich usilnych działań uświadamiających nadal przedkłada ona Windowsa ponad Linuxa więc jak tylko dostała laptopa w swoje władanie wierciła mi dziurę w brzuchu aby usunąć z dysku Ubuntu, a przynajmniej sprawić aby domyślnie uruchamiał się Windows 7.

Zmiana kolejności uruchamiania w GRUB boot loaderze jest dość prostą czynnością wielokrotnie opisywaną w necie. Należy jednak zwrócić uwagę na wersję GRUB-a, gdyż w przypadku np. najnowszego Ubuntu używany jest GRUB2, w którym zmianę kolejności bootowania robi się nieco inaczej.

Przede wszystkim należy wyedytować odpowiedni plik

sudo /etc/default/grub

i odnaleźć w nim opcję GRUB_DEFAULT domyślnie ustawioną na 0

GRUB_DEFAULT=0

Liczba odnosi się do pozycji w menu bootowania. Taka lista wpisów może wyglądać następująco:

Ubuntu, Linux 3.0.0-17-generic
Ubuntu, Linux 3.0.0-17-generic (recovery mode)
memory test (memtest86+)
memory test (memtest86+, serial console 115200)
Windows 7 (loader) (on /dev/sda1)

Tak więc aby ustawić Windowsa jako domyślnie uruchamiany system należało by opcji GRUB_DEFAULT przypisać 4

GRUB_DEFAULT=4

Na koniec niezbędnym jest jeszcze aktualizacja ustawień GRUBA2 poprzez wykonanie polecenia

sudo update-grub

To wystarcza by zmienić kolejność bootowania. Jednak jest mały problem. Polega na tym, że przy aktualizacji kernela do nowej wersji do menu dodawane są nowe linie i wpis dotyczący Windowsa przesuwa się na dalszą pozycję. Można oczywiście każdorazowo aktualizować ustawienia GRUB2-a jednak jest lepsze rozwiązanie.

W pliku /boot/grub/grub.cfg odszukujemy sekcję odpowiedzialną za uruchamianie Windowsa

menuentry "Windows 7 (loader) (on /dev/sda1)" --class windows --class os {
	insmod part_msdos
	insmod ntfs
	set root='(hd0,msdos1)'
	search --no-floppy --fs-uuid --set=root 24B2367EB2365510
	chainloader +1
}

i do opcji GRUB_DEFAULT przypisujemy tytuł wpisu zamiast jego numeru

GRUB_DEFAULT="Windows 7 (loader) (on /dev/sda1)"

W ten sposób co prawda pozycja wpisu w menu się nie zmieni, ale za to przy inicjalizacji domyślnie zaznaczona będzie pozycja w menu dotycząca Windowsa i jeżeli nie zareagujemy to po czasie określonym w opcji GRUB_TIMEOUT uruchomi się Windows.

Jak już pisałem aktualizację ustawień GRUB2 kończy polecenie sudo update-grub. Bez jego wykonania zmiany w ustawieniach nie zostaną uwzględnione.

Instalacja (downgrade) php 5.2.x w Ubuntu 10.04 Lucid

W końcu zdecydowałem się zaktualizować Ubuntu do nowszej wersji 10.04. Ku mojemu zaskoczeniu upgradowi uległ też PHP do wersji 5.3. Nie jest to przeze mnie koniecznie porządane w tym momęcie gdyż mam masę projektów, które nie zadziałają (jeszcze) z PHP w najnowszej wersji. Dlatego koniecznym stał sie downgrade do wersji 5.2. Na necie można znaleść wiele wskazówek jak tego dokonać.

Ja początkowo skorzystałem z artykułu pt. [Install (downgrade) php 5.2.x in Ubuntu 10.04 Lucid](http://mrkandy.wordpress.com/2010/04/16/install-php-5-2-x-in-ubuntu-10-04-lucid/). Niestety PHP po restarcie Apacha się nie odpalił. Ponieważ czasu miałem mało, nie zagłębiałem się w przyczynę niepowodzenia. Poszukałem i na jednym z forów o Ubuntu znalazłem gotowy skrypt bash-a.

#!/bin/bash
# by Ruben Barkow (rubo77) http://www.entikey.z11.de/
 
# Originally Posted by Bachstelze http://ubuntuforums.org/showthread.php?p=9080474#post9080474
# OK, here's how to do the Apt magic to get PHP packages from the karmic repositories:
 
echo "Am I root?  "
if [ "$(whoami &2>/dev/null)" != "root" ] && [ "$(id -un &2>/dev/null)" != "root" ] ; then
  echo "  NO!
 
Error: You must be root to run this script.
Enter
sudo su
"
  exit 1
fi
echo "  OK";
 
 
# finish all apt-problems:
apt-get -f install
 
# remove all your existing PHP packages. You can list them with dpkg -l| grep php
PHPLIST=$(for i in $(dpkg -l | grep php|awk '{ print $2 }' ); do echo $i; done)
echo these pachets will be removed: $PHPLIST 
# you need not to purge, if you have upgraded from karmic:
aptitude remove $PHPLIST
# on a fresh install, you need purge:
# aptitude remove --purge $PHPLIST
 
 
#Create a file each in /etc/apt/preferences.d like this (call it for example /etc/apt/preferences.d/php5_2);
#
#Package: php5
#Pin: release a=karmic
#Pin-Priority: 991
#
#The big problem is that wildcards don't work, so you will need one such stanza for each PHP package you want to pull from karmic:
 
echo ''>/etc/apt/preferences.d/php5_2
for i in $PHPLIST ; do echo "Package: $i
Pin: release a=karmic
Pin-Priority: 991
">>/etc/apt/preferences.d/php5_2; done
 
# duplicate your existing sources.list replacing lucid with karmic and save it in sources.list.d:
#sed s/lucid/karmic/g /etc/apt/sources.list | sudo tee /etc/apt/sources.list.d/karmic.list
 
# better exactly only the needed sources, cause otherwise you can get a cachsize problem:
echo "# needed sources vor php5.2:
deb http://de.archive.ubuntu.com/ubuntu/ karmic main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ karmic main restricted
 
deb http://de.archive.ubuntu.com/ubuntu/ karmic-updates main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ karmic-updates main restricted
 
deb http://de.archive.ubuntu.com/ubuntu/ karmic universe
deb-src http://de.archive.ubuntu.com/ubuntu/ karmic universe
deb http://de.archive.ubuntu.com/ubuntu/ karmic-updates universe
deb-src http://de.archive.ubuntu.com/ubuntu/ karmic-updates universe
 
deb http://de.archive.ubuntu.com/ubuntu/ karmic multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ karmic multiverse
deb http://de.archive.ubuntu.com/ubuntu/ karmic-updates multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ karmic-updates multiverse
 
deb http://security.ubuntu.com/ubuntu karmic-security main restricted
deb-src http://security.ubuntu.com/ubuntu karmic-security main restricted
deb http://security.ubuntu.com/ubuntu karmic-security universe
deb-src http://security.ubuntu.com/ubuntu karmic-security universe
deb http://security.ubuntu.com/ubuntu karmic-security multiverse
deb-src http://security.ubuntu.com/ubuntu karmic-security multiverse
" >> /etc/apt/sources.list.d/karmic.list
 
aptitude update
 
apache2ctl restart
 
echo install new from karmic:
aptitude -t karmic install $PHPLIST
 
# at the end retry the modul libapache2-mod-php5 in case it didn't work the first time:
aptitude -t karmic install libapache2-mod-php5
 
apache2ctl restart

Powyższy kod wystarczy zapisać w pliku o dowolnej nazwie np. phpdowngrade.sh, nadac mu prawa wykonalności

chmod +x ./phpdowngrade.sh

… i odpalić.

UWAGA!
Aktualizacja PHP przez Synaptica przywróci nam z powrotem wersję 5.3. Doinstalowywanie wszelkich dodatków powinniśmy wykonywać z uwzględnieniem wydania. Najprościej to zrobić uzywając konsolowego programu aptitude.

sudo aptitude -t karmic install php5-mysql
sudo aptitude -t karmic install phpmyadmin

Posted in GNOME by Zbigniew Heintze

Motorola Milestone

Nareszcie moja. Czekalem dlugo, ale bylo warto. Moje pierwsze wrazenie kiedy dostalem go w swoje rece, to zaklopotanie. Wczesniej nie mialem aparatu z pelna klawiatura „qwerty” nie mowiac juz o ekranie dotykowym. Trzeba siege bylo nauczyc obslugiwac te piekielna maszyne.

Mysle ze wybor telefonu z fizyczna klawiatura byl dobrym pomyslem. Probowalem pisac na wirtualnej, ale bylo to mniej wygodne i do tego ograniczalo wielkosc ekranu. Moim skromnym zdaniem cztery podstawowe przyciski tj. „powrot”, „ustawienia”, „home” i „szukaj” tez mogly by byc fizyczne – tak jak w G1.

Ekran dotykowy to rewelacja tylko te slady paluchow widoczne zwlaszcza pod swiatlo… Chcac byc obiektywnym musze jednak stwierdzic, ze dla osoby czesto odbierajacej telefon, a do tego jeszcze robiacej to w malo sprzyjajacych warunkach („w biegu”, w samochodzie, jedna reka) aparat z ekranem dotykowym nie jest najlepszym rozwiazaniem. Obsluga takiego telefonu wymaga patrzenia na ekran i dosc precyzyjnych ruchow do tego rozmiar fona nie ulatwia sprawy. Inna kwestia jest pojemnosc baterii, ktora wymaga codziennego ladowania. Z drugiej strony mozliwosci jakie daje android warte sa rozwazenia opcji posiadania dwoch telefonow.

Mam to cacko zaledwie tydzien. Do czego zdazylem w Tym czasie uzyc telefonu?
– zdobilem pare fajnych fotek i kilka filmikow na komunii chrzesniaka mojej zony
– na wyjazd do Norymbergi nie zdazylem sciagnanc map do nawigacji bo kupilem telefon dzien przed wyjazdem, ale w jezdzie po Poznaniu aplikacja motoroli swietnie sie sprawdzila
– zsynchronizowalem swoje kontakty z kontem na gmailu oraz facebooku
– odebralem poczte z 3 skrzynek mailowych, oraz wyslalem email do kilku znajomych
– dodalem kilka wpisow do kalendarza google
– wgralem kilkanascie mp3-jek oraz innych plikow korzystajac z aplikacji motoroli, a takze poprzez ftp lub przegladarke internetowa (zarowno pod Windowsem, jak i Linuksem)
– wymienilem sie kontaktami uzywajac programu do generowania foto kodu
– zainstalowalem kilka przeroznych aplikacji i gier
– zmienilem ustawienia swojego kontakt na playmobile
– dodaje wpis do bloga postawionego na wordpresie

Nie liczac dwoch gluchaczy, ktore wyslalem dla proby nie wykonalem jak dotad zadnego telefonu.

Telefon w urzadzeniu z zainstalowanym androidem to jedynie jedna z wielu funkcji i jak dla mnie – przynajmniej narazie – nie najwazniejsza.

Posted in System by Zbigniew Heintze

Krusader w Ubuntu – jak podpiąć terminal?

Krusader jest dydykowany KDE jednak jeśli ktoś lubi dwa panele to równie dobrze można go uruchomić pod GNOME. Konfiguracja nie różni się właściwie od tej pod KDE poza kilkoma drobiazgami. W GNOME domyślnym edytorem jest „gedit” a konsolą „gnome-terminal” w związku z czym w zakładce Ustawienia -> Konfiguracja Krusadera -> Ogólne na karcie Podstawowe operacje w polu Edytor zamiast

internal editor

warto wpisać

gnome

natomiast w polu Terminal zamiast

konsole --workdir %d

powinniśmy wpisać

gnome-terminal --working-directory=%d

.

Tyle że po zapisaniu i wybraniu F2 terminal się uruchomi, ale bynajmniej nie w bieżącej lokalizacji. W Krusaderze jest błąd, który po zapisaniu zmienia %d na %25d czyli dostajemy gnome-terminal –working-directory=%25d. Można ten problem obejść edytując ręcznie plik konfiguracyjny ~/.kde/share/config/krusaderrc. W sekcji [General] wpisujemy

Terminal=gnome-terminal --working-directory %d

Proszę zwrócić uwagę na brak znaku równości „=”.

Dropbox KDE

Instalacja [Dropboxa](https://www.dropbox.com) w Ubuntu to banał. Wystarczy wyedytować listę repozytoriów:

sudo gedit /etc/apt/sources.list

wkleić adresy repozytoriów Dropboxa

deb http://linux.dropbox.com/ubuntu karmic main
deb-src http://linux.dropbox.com/ubuntu karmic main

i zainstalować pakiet nautilus-dropbox

sudo apt-get install  nautilus-dropbox

Pakiet po zainstalowaniu pojawia się w menu->internet. Wystarczy uruchomić i postępować zgodnie z instrukcjami uruchomionego wizarda. Po przelogowaniu mamy działającego i synchronizującego pliki Dropboxa.

W KDE nie mamy jednak nautiliusa a Dropbox nie oferuje pakietów dla Dolphina o Krusaderze nie wspominając. Co zatem? Alternatywne metody instalcji opisane są w zakładce [TipAndTricks](http://wiki.dropbox.com/TipsAndTricks/TextBasedLinuxInstall) na stronie Dropboxa.

Mając zainstalowane Kubuntu operacja nie jest tak trudna jakby się można tego spodziewać po oficjalnym „poradniku”.

Przede wszystkich wchodzimy do katalogu domowego.

cd ~/

Następnie przy pomocy wget-a ściągamy klienta [32](http://www.dropbox.com/download?plat=lnx.x86) lub [64](http://www.dropbox.com/download?plat=lnx.x86_64) bitowego.

wget -O dropbox.tar.gz http://www.dropbox.com/download?plat=lnx.x86

Ściągnięte archiwum rozpakowujemy

tar -zxof dropbox.tar.gz

W katalogu domowym powinien nam się pojawić katalog *.dropbox-dist*. W tym momencie archiwum można już usunąć. Aby uruchomić Dropboxa wystarczy wywołać

~/.dropbox-dist/dropboxd &

znak „&” na końcu komendy spowoduje uruchomienie w tle

Lepiej jednak utworzyć link w autostarcie KDE dzięki czemu Dropbox wystartuje każdorazowo wraz z X-ami.

ln -sf ~/.dropbox-dist/dropboxd ~/.kde/Autostart/

Wzrokowcom polecam filmowy tutorial.

W Nautiliusie po wrzuceniu pliku do Dropboxa z menu kontekstowego można wybrać internetowy adres do udostępnionego w ten sposób zasobu i podesłać go znajomemu mailem lub też wkleić w okno komunikatora. Po wejściu na podany adres w oknie przeglądarki znajomy będzie mógł zobaczyć opublikowane przez nas zdjęcia lub też ściągnąć plik. W Dolphinie taką funkcjonalność możemy uzyskać dzięki niewielkiemu programowi [dropbox-servicemenu-kde](http://linux.softpedia.com/get/Desktop-Environment/Tools/dropbox-servicemenu-kde-52232.shtml).

Po ściągnięciu ze strony paczkę należy rozpakować, wejść do katalogu z narzędziem i zainstalować wywołując komędę.

chmod 755 install.sh
./install.sh

Skrypt ściągnie niewielki programik napisany w Pythonie, który wzbogaci menu kontekstowe Dolphina o dodatkowe opcje.

Właściwie jedyne czego brakuje to ikonek wskazujących stan synchronizacji poszczególnych plików i katalogów. Poza tym funkcjonalność Dropboxa w KDE nie odbiega od tej w Ubuntu.

Jak wyłączyć/zrestartować Kubuntu 9.10

Od jakiegoś czasu klikanie przycisków wyłącz, zrestartuj, wyloguj itp. w KDE mija się z celem. Pojawia się okienko z odliczaniem po czym kiedy czas mija znika i puplit rozświetla się jakbym całą operacje anulował. Wcześniejsze potwierdzenie niczego nie zmienia. Jedyną działającą opcją jest „Przełącz użytkownika”. Po jej wybraniu zostaje wylogowany, pojawia się ekran logowania i na tym etapie mogę już wyłączyć system. Oczywiście zostanę jeszcze poinformowany o istnieniu sesji innego użytkownika (tej z której się właśnie ratowałem ucieczką ;)). Taki sposób wyłączania komputera bynajmniej nie jest najwygodniejszy i lepiej otworzyć konsolę i użyć komendy.

sudo shutdown -h -P now

Tym razem google nie przyszło mi z pomocą.

Posted in KDE by Zbigniew Heintze · Tag:

Aktualizacja Kubuntu do wersji 9.10 Karamic Koala

Zwykle podejmuję ryzyko aktualizacji systemu do nowszej wersji choć zawsze wtedy drżę czy wszystko pójdzie dobrze i czy znów nie spędzę paru godzin do doprowadzenia systemu do pełnej używalności.

Ostatnio tj. po aktualizacji do wersji 9.10 Jaunty Jackalope obyło się bez przygód. Byłem w niebo wzięty. Liczyłem, że i tym razem będzie podobnie. Niestety nie. Zaczęło się od tego, że nie mogłem nawiązać połączenia z netem. Nie bardzo rozumiem dlaczego system po aktualizacji gubi wszystkie dotychczasowe ustawienia, ale widać taki jest koszt aktualizacji KNetworkManagera. Niby pojawiło się w tym programie więcej opcji, niby zwiększyła się jego funkcjonalność, ale naprawdę nie wiem od czego zależy jego działanie. Nie dość że raz pokazuje wykryte sieci a innym razem nie to jeszcze już się skonfiguruje połączenie człowiek nie zawsze wie czy już się połączył czy jeszcze nie. Nie wspomnę, że KNetworkManager nie wykrywa rodzaju zabezpieczeń i nie potrafi połączyć się z siecią bezprzewodową z ukrytym SSID. Nie udało mi się skonfigurować połączenia przy zabezpieczeniu WPA2 Personal. Byłem już bliski sięgnięcia po wypróbowanego [WICD](http://wicd.sourceforge.net/) tyle, że bez netu nie mogłem go zainstalować 😉 W końcu udało mi się skonfigurować połączenie na WPA.

Przy wcześniejszych aktualizacjach zdarzało mi się, że musiałem na nowo konfigurować Apache-a lub też PHP. Widać, poradzono sobie z tym jednak ku mojemu zaskoczeniu problem pojawił się w miejscu, w którym absolutnie bym się go nie spodziewał. Po uruchomieniu [Eclipse-a](http://www.eclipse.org/) nagle przestało mi działać wyszukiwanie. Dokładniej rzecz biorąc to przyciski okien dialogowych przestały reagować na kliknięcie całkowicie je ignorując. Zrestartowałem Eclipse-a i nic. Zaciągnąłem sun-owskie środowisko uruchomieniowe sun-java6-jre i też to nic nie dało. W końcu (może powinienem od tego zacząć) sięgnąłem do googla i na [forum Ubuntu](http://forum.ubuntu.pl/) znalazłem [rozwiązanie](http://forum.ubuntu.pl/showthread.php?t=112148&highlight=eclipse). Dlatego właśnie używam tej dystrybucji. Wszelkie problemy szybko znajdują rozwiązanie.

Wracając jednak do Eclipse-a. Do czasu poprawienia błędu napisałem sobie skrypcik **eclipse.sh** ułatwiający uruchamianie eclipsa

export GDK_NATIVE_WINDOWS=1
/opt/eclipse/eclipse

Puki co więcej niespodzianek nie stwierdziłem i ogólnie rzecz biorąc jestem zadowolony z aktualizacji.

Nie wiem czy to tylko subiektywne wrażenie bo nie dokonywałem pomiarów, ale wydaje mi się, że system startuje szybciej. Po uruchomieniu pierwsze co się rzuca w oczy to poprawiony wygląd i usprawnienia w KDE 4.3.

Z dużym zadowoleniem przyjąłem ikonkę powiadomień, która na stałe zagościła na tatce systemowej. Teraz już nie ma problemu z przejrzeniem komunikatów o zdarzeniach mających miejsce w naszym systemie. Można je obejrzeć kiedy już znikną i samodzielnie zadecydować o ich usunięciu. Tego mi brakowało czemu dałem wyraz w jednym z wcześniejszych wpisów.

Cieszy też aktualizacja firefoxa do wersji 3.5, która nota bene powinna nastąpić już parę tygodni temu.

Czytałem, że zmiany nastąpiły co do wyboru domyślnego komunikatora. Ja mam to osobiście gdzieś gdyż używam tlen-a. O ile na Ubuntu nie miałem z nim nigdy większych problemów (nie licząc niedoskonałości wersji beta) o tyle na Kubuntu miałem wręcz permanentny kłopot, kiedy przychodziło do aktualizacji. Zwyczajnie po wpisaniu hasła nic się nie działo i trzeba było ręcznie ściągać nową wersję komunikatora – wiem, że to nie wina programistów Cannonical. Teraz ku mojemu zaskoczeniu aktualizacja po prostu się wykonała :D.

Zauważyłem parę zmian w menadżerze pakietów KPackageKit – zwłaszcza przy aktualizacji. Doceniam przede wszystkim możliwość sortowania wyników alfabetycznie. Do instalowania nowego oprogramowania jakoś mi ten program jednak nie pasuje i dalej sięgam do konsolowego aptitude.

To paradoks ale im dłużej używam Linuksa tym częściej sięgam do konsoli.

Jednak VirtualBox

Po moich próbach z qemu i KVM postanowiłem wypróbować VirtualBox. Obsługa qemu z konsoli okazała się na dłuższą metę niewygodna z kolei KVM działało zbyt niestabilnie.

Sama instalacja VirtualBoxa pod Kubuntu nie sprawiła trudności.

sudo aptitude install virtualbox

Jednak zaraz po stworzeniu wirtualnego dysku i podjęciu próby instalacji na nim Windowsa otrzymałem komunikat błędu:

VirtualBox can’t operate in VMX root mode. Please disable the KVM kernel extension, recompile your kernel and reboot (VERR_VMX_IN_VMX_ROOT_MODE).

Cuż pozostało uruchomić Boot-up Managera i wyłączyć usługę „Full virtualization on i386 and amd64 hardware – kvm”. Boot-up Manager nie jest domyślnie instalowany (przynajmniej w Kubuntu), ale to nie problem.

sudo aptitude install bum

Dalej poszło już bez niespodzianek. Windows zainstalował się i od razu miał połączenie z netem, widział CDROM-a (z czym była problem w KVM). Współdzielenie katalogów też nie okazało się trudnym do osiągnięcia. Właściwie wszystko załatwił dodatek Guest Additions instalowany na systemie gościu. O ile katalog, który ma być współdzielony wyklikuje się po wybraniu opcji „Urządzenia -> Współdzielone katalogi” w menu VirtualBoxa o tyle dostęp do tego katalogu z poziomu systemu gościa w przypadku windowsa uzyskuje się wklepując w linii komend następujące polecenie

net use x: \\\vboxsvr\shared

gdzie shared jest nazwą nadaną współdzielonemu katalogowi. Jeszcze tylko restart Windowsa i wszystko hula 🙂

Troszkę mnie to rozbawiło, że lokalizację w Linuksie wyklikuję a w Windowsie wklepuję 😉

Upierdliwości KDE

##Zablokowane aktualizacje w Kubuntu

Komunikat o zablokowanych aktualizacjach w KPackageKit miałem od samego początku. Strasznie mnie irytował, ale ponieważ wszystko co chciałem działało odsuwałem tę drobną niedogodność na później licząc, że w końcu problem sam się rozwiąże. Wiem to naiwne i nieprofesjonalne podejście, ale co dziwne parę razy już się sprawdziło :D.

Minęło już kilka miesięcy (od czerwca), sprawa dojrzała i w końcu wpisałem w googlach „zablokowane aktualizacje”. Rozwiązanie otrzymałem, jak na tacy otwierając już pierwszy link. Wystarczyło wpisać:

sudo aptitude update
sudo aptitude safe-upgrade

Teraz wszystko działa jak trzeba.

##Znikające powiadomienia

W domu używam Kubuntu, ale na komputerze w pracy mam Ubuntu i muszę przyznać, że coraz bardziej się do niego przekonuje. Jakoś ta plasma w KDE4 mnie nie przekonuje. Mimo, że pracuję na tej wersji okien już całkiem sporo to jak muszę coś ustawić to zawsze szukam. Niby wszystko powinno być w settings ale te ustawienia wydają mi się wyjątkowo ubogie. Ostatnio działa mi na nerwy system powiadomień. Informacje pokazują się w jednym miejscu nad tray-em i są grupowane. Przeczytałem gdzieś, że powinna się cały czas pokazywać ikona powiadomień, i że można je jakoś skonfigurować wpływając m.in. na długość wyświetlania. U mnie nie dość, że taka ikona się nie pokazuje to zazwyczaj jak już jakieś info wyskoczy to nim zdążę je przeczytać znika i ni jak nie mogę go wywołać. Jak mnie to wkurza.

##Kopiuj wklej

Kolejną upierdliwością, która negatywnie wpływała na komfort pracy na KDE był problem z kopiowaniem fragmentów tekstów. Jako że programuję, często zdarza mi się zaznaczać fragment tekstu, wciskać Ctrl+C, a następnie stawiając w innym miejscu kursor wklejać tekst za pomocą skrótu Crl+V. Wszystko fajnie tylko, że niekiedy zanim wcisnę to Ctrl+V zaznaczam jeszcze fragment tekstu, który ma zostać nadpisany. I tu wyskakiwał zonk bo zaznaczony tekst automatycznie kopiował się do schowka i po wywołaniu akcji wklejania dostawałem nie to co chciałem. Początkowo myślałem, że to coś nie tak z eclipsem, ale pracując na Ubuntu nic takiego się nie dzieje. Winnym okazał się aplet Klipper. Na [dev.eclipse.org](http://dev.eclipse.org) udało mi się szybko znaleźć odpowiedź:

*You should either deactivate Klipper or uncheck ‚Prevent empty clipboard’ in Klipper’s settings.*

Szerzej problem ten jest opisany w artykule [Fixing Copy-Paste issues on Eclipse and KDE](http://techtavern.wordpress.com/2008/08/10/fixing-copy-paste-issues-on-eclipse-and-kde/)