Uwalnianie pulpitu Ubuntu od ikonek woluminów

W standardowych ustawieniach GNOME, na pulpicie wyświetlają ikonki zamontowanych dysków, partycji etc. Jeśli chcesz się ich pozbyć to uruchom narzędzie gconf-editor, następnie przeklikaj ścieżkę /apps/nautilus/desktop/, wyszukaj opcję volumes_visible i odznacz.

Można też geekowo poleceniem:

gconftool-2 -s /apps/nautilus/desktop/volumes_visible -t bool false

Zrestartuj Firefoksa

Wstaje sobie rano, po kilku perypetiach włączam w końcu Firefoksa, a ten wyskakuje mi z komunikatem wysuwanym z góry zakładki:
Your browser has been updated and needs to be restarted

No dobra, restartuje i nic, dalej to samo, w dodatku pokazuje się co chwile na każdej zakładce. Mi pomogło rozwiązanie znalezione na stronie: Bug #270303 in ubufox (Ubuntu): “MASTER – firefox (intrepid/jaunty): “your browser has been updated and needs to be restarted”“. A wygląda ono tak:

Wyłączamy Firefox, a następnie wpisujemy w konsoli:

sudo killall -9 -r firefox
sudo apt-get purge firefox firefox-3.0 ubufox
sudo apt-get install --reinstall firefox firefox-3.0 firefox-3.0-gnome-support

Jak zainstalować obsługę MPI na Ubuntu?

Mam tu na myśli na jednym nie połączonej z innymi maszynami komputerze, który ma tylko jeden rdzeń. Podejrzewam jednak, że zadziała dla posiadaczy kilku.

Problem wydać mógłby się banalny, ale jednak już dwa razy nad nim siedziałem; raz przypadkiem trafiłem, a za drugim nie mogłem sobie przypomnieć co zrobiłem za pierwszym. Dlatego wolę to sobie teraz zapisać.

Message Passing Interface na Ubuntu, czy na innych dystrybucjach, jest zainstalować łatwo, trochę ciężko za to skłonić go emulowania równoległości. Jak instalowałem mpich, czy openmpi, to wyglądało to jakby ten sam program został uruchomiony ileś tam razy, z tym, że każdy z nich nie był połączony z zresztą – każda instancja postrzegała się jako uruchomiona samotnie.

Aby móc cieszyć się poprawnie działającym wynikami działania kompilatora mpicc, należy zainstalować pakiet lam4-dev:

sudo apt-get install lam4-dev

Powinno wystarczyć. Jakby się nie zainstalował automatycznie, to trzeba ręcznie dorzuć pakiet lam-runtime. “Klaster” inicjujemy przez wpisanie lamboot, od tej pory powinno działać polecenie mpirun.

Tak nawiasem: można też skorzystać z dystrybucji PelicanHPC GNU Linux, która jako przerobiony Knoppix uruchamia się z płytki, wzbogacona o liczne narzędzia do programowania równoległego.

Dodane:

Przykładowy plik Hello World dla MPI można znaleźć np. na stronie: Hello World MPI Examples (pierwszym wynik w Google). Uwaga! tam jest: int rank, size, a powinno być: int rank, size;.

HP 6735s FU601ES – oesy w natarciu

Od kilku dni instaluje na tym lapku różne dziwne programiki. Z żalem muszę przyznać, że używanie Ubuntu bardzo mnie rozleniwiło, ten system praktycznie po instalacji ma już prawie wszystko co jest mu potrzebne – pozostają instalacje “niewolnych” sterowników, kodeków itp, oraz szczególne używane przeze mnie aplikacje. Windows z kolei, to niekończące się pasmo: “szukaj w necie”, pobierz, włącz instalator, klikaj dalej i uważaj, żeby instalator nie porobił kretynizmów w systemie (po kiego grzyba tyle badziewia pcha się do autostartu?), a jak już przepełza ten pasek, to nie, nie uruchamiaj się/nie uruchamiaj ponownie komputera. No, ale po kolei…

No to zaczynamy

Zacząłem od instalacji Windows. Jak wiadomo, ma on brzydki zwyczaj nadpisywania boot sektora. I – jak to Windows – zgrzyty. Po tym, jak w końcu miał raczyć mi wyświetlić menu “to czemu włożyłeś płytę z instalatorem”, wywalił mi biało na niebieskim, że on nie będzie ze mną współpracował i żebym sprawdził dysk – ok – restart, do BIOSu i uruchamiamy testy. Chwilę to trwało.

A skoro o BIOSie mowa, wbrew oczekiwaniu nie był taki “tekstowy”, z ramkami w ASCII. Całość jest graficzna, dość prosta, ale jednak + obsługa touchpada. Moja Pani tutaj okazała się zatwardziałą konserwatystką – BIOS bez ASCII, nie podobał jej się. Mnie nie przeszkadzał, dopóki można było dostać to czego się chciało. W miarę to się udawało.

Z tym Windowsem to miałem sporo zabawy, bo na początku myślałem, że winna jest płytka, więc wypróbowałem kilka. Potem jednak się wkurzyłem i zainstalowałem Ubuntu, które żadnych problemów z instalacją nie miało. Na wybrzydzający Windows pomógł stojący obok komputer, na którym wyszukałem, że trzeba zmienić w BIOSie "SATA Device Mode" na “IDE.

No poszedł jaśniepan… inna sprawa, że tym razem ja schrzaniłem sprawę i przez przypadkiem zainstalowałem go na FAT32. Co z kolei spowodowało, że całość nie dostrzegła pliku ntldr. Może go tam faktycznie nie było. Ponieważ nie chciało mi się z tym wszystkim bawić, to zainstalowałem go raz jeszcze – tym razem na NTFS – ufff… jest i Windows. W końcu.

Krajobraz po instalacji

Uruchomił się Windows i … pustka. Dokładnie, na tym systemie nic nie ma. Wszystko trzeba dociągać. A przede wszystkim – sterowniki. Te akurat udostępnia producent na swoje stronie, wstydliwie ukrywając go pod zbiorami przeznaczonymi dla Visty – a zapomniałem napisać – instalowałem XP. Jedyne co mogłem zrobić po pierwszym uruchomieniu to pooglądać swoją gębę z kamerki.

Taki widok po instalacji, bardzo mnie zaskoczył, zwłaszcza, że to po Ubuntu spodziewałem się problemów. Przypomnę, że to je pierwsze zainstalowałem. Dopiero po zainstalowaniu systemu Windows, mogłem zauważyć, że na Ubuntu na wstępie miałem skonfigurowanego touchpada, jakiś domyślny sterowniki karty graficznej (wyglądało to zdecydowanie lepiej od tego co wyświetlał mi Windows), połączenie sieciowe przez kabel itp. Pierwsze co zauważyłem, że nie działa to dźwięk. O nim napiszę trochę więcej później. A nie wiem też w sumie, gdzie jest kamerka obsługiwana w Ubuntu i czy działa.

Głębiej w las

Pomijając wtórność procesu instalacji sterowników na Windows, to w zasadzie nic trudnego, z wyjątkiem sterownika dźwięku. Żeby zainstalować sterowniki do tej karty, trzeba było najpierw zainstalować coś co się nazywa KB835221. Podobno dodają to do SP3, ale akurat tego dodatku moja płytka instalacyjna nie posiadała. Tutaj jednak dopowiem, że trzeba było najpierw wyszukać tej informacji i kiedy już zainstalował mi się sterownik dźwięku, gorzko zapłakałem nad losem tych, tzw. “zwykłych użytkowników” – żartowałem, po prostu zastanawiałem się jakby taki jeden z drugim sobie poradził.

A skoro już o dźwięku zacząłem – głośniki na tym laptopie są bardzo głośne… i to nawet na połowie głośności. A sam dźwięk – jak na moje przydeptane ucho – jest czysty. I dobrze, to było jedno z kryteriów doboru tego właśnie laptopa.

W Ubuntu sprawa z dźwiękami wyglądała na początku nieco tragicznie. Przynajmniej na początku, jednak po chwili poszukiwań natrafiłem na rozwiązanie. Należało na końcu pliku /etc/modprobe.d/alsa-base.conf dopisać: options snd-hda-intel model=laptop (mimo, że procek to AMD:P) i działa. Podobno, jakby podłączył słuchawki, to by działały. Akurat ich nie miałem, więc nie testowałem.

Na stronie producenta oprócz sterowników do XP, jest jeszcze kilka(naście) programów dodatkowych. Ja z tego zainstalowałem tylko wskaźnik baterii, bo Windows żadnego mi nie świetlał – może trzeba było go wyszukać? No, ale w Sapera na touchpadzie można było zagrać – polecam bicie rekordów!

Goście

Jak pisałem, luksus używania Linuksa, sprawił, że straciłem część użytecznych dla każdego “windziarza” instynktów i po jakimś czasie dopiero przypomniałem sobie, że wypadało by zainstalować coś co się zwie “antywirusem”. Na pierwszym skanowaniu pokazały się jakieś cztery robaczki.

Koniec na dziś

Oba systemy jakoś działają. Bardziej bezproblemowe w instalacji okazało się Ubuntu – chyba, że ta kamerka nie będzie działać. Jednak tak naprawdę instalacja to proces jednorazowy. Prawdziwy test, to dopiero przed nami – życie i jego problematyka. Ale to nie ja będę testował.

Do poczytania dla tych, którzy niedawno rozpakowali swojego hp6735s może się przydać:

PS

Tak sobie przypomniałem: wiatraczek jest nieco głośny, jak działa, a nie zawsze. Baterie trzymają jakieś 3 2h (sorry, nie zauważyłem pomyłki), na Ubuntu szybciej się wyczerpują, nie szukałem jeszcze jakiś rozwiązań.

EDIT: Posłowie

Kamerka w Ubuntu była skonfigurowana na dzień dobry. Sprawdziłem, bez problemów działał w Skype, czy w Cheese. A odnośnie baterii, to ostatnio w Windowsie wskazała mi 1.5h pracy – a była pełna. Po 10 minuta przełączyłem się na Ubuntu, które oszacowało, że bateria wytrzyma jeszcze 2 godziny z groszami – tutaj jednak nie testowałem.

Moje poprawki do Arthemia

Lista moich poprawek do szablonu Arthemia. Edytujemy plik style.css.

  • Wystające tagi “em” w miniblogu, w linii 625:

    #sidebar-miniblog em {position: absolute;right:5px;font-style:normal; font-weight: normal; font-size: 0.9em;}

    Należy dopisać h4 przed em:

    #sidebar-miniblog h4 em {position: absolute;right:5px;font-style:normal; font-weight: normal; font-size: 0.9em;}

  • Duża czcionka w polu wpisywania komentarza – z tym to jest jazda, jak zmniejszyłem font-size elementu textarea#commbody do 1.5em to ładnie wyglądało w przeglądarce Firefox, ale czcionka w Operze dalej była za duża. Zmniejszenie do 1em powodowało, że pod Firefox wychodziło to bardzo małe. Tutaj pomógł powrót do korzeni – w tej wersji Arthemia nie posiada żadnych ustawień czcionki w elemencie textarea#commbody.

No, zobaczymy jak radzi sobie miniblog z tagami “code” i “pre”

EDIT: no… wywaliłem elementy pre. To będzie wyższa szkoła jazdy…

Cups-pdf nie działa świeżo po instalacji (Ubuntu)

Wczoraj wieczorem, naszła mnie nagła potrzeba wydrukowania pliku do PDF, potrzebowałem czegoś, czego odpowiednikiem na systemie Windows jest zwykle PDFCreator.

W Ubuntu jest coś takiego, nazywa się to cups-pdf i jest dostępne w repozytorium. Tak więc instalacja polegała na wstukaniu:

sudo apt-get install cups-pdf

No i trzeba by jeszcze zrestartować CUPS. U mnie (Ubuntu 8.10):

sudo /etc/init.d/cups restart

U mnie, bo na niektórych notkach, na których się wzorowałem polecenie dotyczyło cupsys, nie cups.

Jak do tej pory wszystko gra i buczy. Tylko nic się nie drukuje. Status drukarki wskazywał na:

Bezczynna - /usr/lib/cups/backend/cups-pdf failed

Ponieważ nie chciałem marnować tak pięknego wieczora, po kilku nieudanych próbach szukania pomocy zostawiłem to sobie na rano. Mówi się, że sen przynosi rady. Mi akurat nic nie przyniósł w kwestii mojej pedefowej drukarki, ale rankiem trafiłem na notkę Bazyla.

To akurat wyszło bardziej przez przypadek, niż z treści wspomnianej notki, ale okazało, że zawinił brak folderu PDF w katalogu użytkownika. Standardowe ustawienia z pliku /etc/cups/cups-pdf.conf nakazują generować pliki PDF właśnie do katalogu ~/PDF. Można to zmienić edytując ten plik.

sudo vim /etc/cups/cups-pdf.conf

I tak skończyła się moja batalia z wirtualną drukarką. Ciekawe, jak Ubuntu rodzi sobie z prawdziwymi. W sumie z okazji świąt mogę się tym pobawić…

Czy liczba jest liczbą? (PHP)

Nie dawno chciałem się dowiedzieć, jak najlepiej jest sprawdzać, czy tekst jest liczbą w Javie. Szybko trafiłem na ten oto wpis, którego autor sprawdził dostępne metody pod względem szybkości wykonywania. Wyszło, że najlepiej jest chałupniczo – przejrzeć znaki w stringu po kolei.

Zamieszczony wyżej link grzebie koncepcje używania wyrażeń regularnych do prostych celów w Javie. Zalecano mi ją w jednej z moich poprzednich notek, choć nawet wtedy całość nie wydawał mi się dobrym pomysłem (nie tylko mi).

Jak jednak wyrażenia regularne radzą sobie w językach skryptowych? Na warsztacie dzisiaj PHP.

Test jest prosty, kod zamieszczam poniżej. Poniżej przykładowe wyniki. Jak widać, nie ma w tym wielkiej filozofii, najlepiej sprawują się metody predefiniowane do wykrywania liczby w stringu. Wyrażenia regularne (zarówno preg_match jak i eregi) są gorsze. Najgorzej radzi sobie moja własnoręcznie napisana funkcja.

ctype_digit = 5.85733890533
is_numeric = 6.05098295212
preg_match = 8.32741999626
isNumber = 10.1650650501
eregi = 9.09768795967

Wnioski: jeśli można, używamy funkcji wbudowanych! Ale odkrycie. A wyrażanie regularne itp. zostawiamy na złożone zadania. Nie ma więc sensu wpychać ich wszędzie gdzie się da. Najgorzej jest wyłamywać otwarte drzwi – czyli klepać od początku takie funkcje których implementacje już istnieją.

Może ktoś, albo ja w wolnym czasie zajrzę jak sobie radzi z tym Python (i jego kompilowane wzorce). Można też sprawdzać jak radzą sobie funkcje wykrywające liczby z przecinkiem, albo heksadecymalne.

A i jeszcze jedno – w niektórych próbach eregi miało wyniki słabsze od preg_match, choć rzadziej.

Na koniec kod (choć nie jest zbyt odkrywczy).

<?php
$amount = 999999;
$strings = array();

for($i = 0; $i < $amount; $i++) {
        $strings[] = (string)(rand(111111,999999) * (rand(0,1)) ? -1 : 1);
}

$start = microtime(get_as_float);
for($i = 0; $i < $amount; $i++) {
        ctype_digit($string[i]);
}
echo 'ctype_digit = '.(microtime(get_as_float) - $start) ."\n";

$start = microtime(get_as_float);
for($i = 0; $i < $amount; $i++) {
        is_numeric($string[i]);
}
echo 'is_numeric = '.(microtime(get_as_float) - $start) ."\n";

$start = microtime(get_as_float);
for($i = 0; $i < $amount; $i++) {
        preg_match('!^[-+]?[0-9]+$!', $string[i]);
}
echo 'preg_match = '.(microtime(get_as_float) - $start) ."\n";

function isNumber($string)
{
        if (($string[0] !== '-') && ($string[0] !== '+') && ($string[0]  9))
                return false;

        for($i = 1; $i < strlen($string); $i++)
                if ($string[$i]  9)
                        return false;
        return true;
}

$start = microtime(get_as_float);
for($i = 0; $i < $amount; $i++) {
        isNumber($string[i]);
}
echo 'isNumber = '.(microtime(get_as_float) - $start) ."\n";

$start = microtime(get_as_float);
for($i = 0; $i 

PS. zżera sporo pamięci.

“Kompilacja” pliku konfiguracyjnego – PHP

Dzisiejszy wpis ma wbrew pozorom niewiele wspólnego z tym wpisem, pomijając to, że to jakiś tam związek z plikami ini.

Najłatwiej plik konfiguracyjny jest zrobić w postaci pliku php, który sobie przyłączamy do projektu. Praktyczne nie ma z tym problemów. No może po za jednym; jak już go przyłączysz do wielu plików i w zasadzie oprzesz o niego zasadę działania całości skryptu, może się okazać, że warto by użyć owego nieszczęsnego (“wymarłego“) pliku ini do przechowywania konfiguracji.

W pierwszym odruchu chciałem parsować plik – nazwijmy go config.ini – za każdym razem i przypisywać odpowiednie wartości odczytane z niego, pewnym zmiennym dostępnym globalnie. No ale rozwiązanie to jest trochę nieoptymalnie. Stąd pomysł, by zorganizować całość na podobieństwo Smarty, czyli na podstawie pliku pliku ini generować sobie plik php do bezpośredniego przyłączenia.

Edit (2008.09.09 17:32): zaprezentowane rozwiązanie, po części wynikało z twz. “kompatybilności wstecznej”. Może być jednak ulepszone – zapoznaj się z komentarzami do wpisu.

Tak więc zakładamy, ot mamy plik ini (config.ini), mamy plik config.php który jest skryptem przeprowadzającym “kompilacje”, oraz plik który ma zostać w jej wyniku wygenerowany – config.inc.php. Tutaj uwaga: includować do skryptów będziemy tylko plik config.php.

Pierwsze co trzeba zrobić po wywołaniu pliku config.php to sprawdzić, czy mamy wygenerowany plik config.inc.php i czy ma późniejszą datę modyfikacji niż plik config.ini. Wykorzystamy do tego funkcję filemtime:

Nie trzeba sprawdzać, czy plik config.inc.php w ogóle istnieje, dzięki @ nie zgłosi ona błędu, a w wyniku da wartość FALSE (które zostanie potraktowane jako 0).

Przejdźmy do wczytania pliku konfiguracyjnego, to też trudne nie jest:

{geshi lang=php}$configArray = parse_ini_file('config.ini.php', true);

Teraz w zmiennej $configArray mamy wczytany w postaci tablicy wielowymiarowej (dzięki 2giemu parametrowi – szczegóły w opisie funkcji parse_ini_file). Otwieramy plik wynikowy:

Można zapisywać zmienne. Szkoda by jednak robić to z palca dla każdej osobno. Napisałem więc małą funkcję:

{geshi lang=php}function writeSection($defaultArray, $sectionName) { global $configArray, $configFile; foreach($defaultArray as $key => $value) { if (isset($configArray[$sectionName][$key])) $entry = $configArray[$sectionName][$key]; else $entry = $value; if (!is_numeric($entry)) $entry = '\''.$entry.'\''; fwrite($configFile, "\$$key = ".$entry.";\n"); } }

To teraz jak to działa: pierwszy parametr to tablica wartości domyślnych, drugi parametr to nazwa sekcji (konsekwencja drugiego parametru w funkcji parse_ini_file. Skupmy się na tym pierwszym. Funkcja przegląda każdą z par klucz => wartość tej tablicy, sprawdzając, czy klucz został też zdefiniowany w pliku konfiguracyjnym (config.ini). Jeśli tak, funkcja pobiera jego wartość z tablicy $configArray, jeśli nie, wstawia wartość domyślną z tablicy jaką dostarczyliśmy. Pytania?

Po co jest is_numeric?
To taka tylko zmiana w sumie kosmetyczna – sprawia, że liczby nie są zapisywane jako tekst w pojedyńczych cudzysłowach.

Czy drugi parametr jest konieczny?
Nie, ale też wczytać plik konfiguracyjny trzeba bez podziału na sekcje.

Jakiś przykład?

Trzeba pamiętać oczywiście jeszcze o zamknięciu pliku config.inc.php

{geshi lang=php}fwrite($configFile, '?>'); fclose($configFile);

To jeszcze nie wszystko w pliku config.php na końcu, za tym całym głównym ifem (patrz wyżej), trzeba wczytać plik config.inc.php:

<pre lang="php}require_once('config.inc.php'){/geshi}

To”>;

Jako komentarz nie zostanie sparsowane, a sam plik wywołany jako php wyświetli tylko średnik no i tekst komunikatu die.

Są inne metody, ale mi to akurat wystarczyło.

Zalety takiego rozwiązania, są takie, że w pliku config.ini nie trzeba zamieszczać wszystkich parametrów i ich wartości, a i tak będę one widoczne w skrypcie. Po za tym to na pewno jest ciut szybsze niż wczytywanie za każdym razem konfiguracji.

Wady: trochę to naciągane;) Nie zawsze trzeba kombinować z plikami ini.

Chętnie poczytam jakiś konstruktywnych uwag. Pozdrawiam.

Dziękuje też za nie wszystkie.

Ochrona skryptów PHP przed wywołaniem

Skrypt nad którym pracowałem sobie dzisiaj, wymaga aby pewna jego czynność była wykonywana codziennie – w sumie to nie zaszkodziło by jakby wykonywała się więcej niż jeden raz – ale tak dla przyszłych, być może, rozwiązań trzeba by nieco zawyżyć wymagania.

Na szczęście na serwerze dostępny był cron, którym można by wywoływać skrypty php (czasem są z tym małe problemy) – coś takiego jak tutaj mamy. Pojawił się inny problem – jak zabezpieczyć skrypt przed wywołaniem go paska adresu – w przeglądarce.

Jednym ze sposobów jest coś takiego:

/**
* Check remote address (allow only from localhost). If not working - write here 'localhost' or IP your server
*/
if ($_SERVER['REMOTE_ADDR'] != 'localhost')
{
	die("Ciekawe co chciałeś tutaj zrobić?");
}

(zapożyczone ze strony wiki projektu Vallheru)

A… byłbym zapomniał: edycja pliku .htaccess odpada w moim przypadku.

Ja z kolei wymyśliłem coś innego, sprawdzam czy istnieje zmienna (isset) $argv – jeśli tak, plik php został wywołany z linii poleceń (czyli cron np.), jeśli nie, ktoś wywołał go prawdopodobnie przez przeglądarkę.

if (isset($argv))
	echo "Z konsoli.\n";
else
	echo "Server.\n";

Uwaga: jak wykazano w 2gim komentarzu do tej notki nie jest to za najlepsza metoda. Po szczegóły odsyłam do wspomnianego komentarza.

Jeśli ktoś ma jakieś doświadczenia w powyższej materii, chętnie posłucham.