Opis przypadku: Upgrade Ubuntu (to Hardy Heron)

Tak, późno, ale jednak tego dokonałem. Bynajmniej nie z własnej woli, update potrzebny mi był do pozbycia się nieciekawego problemu wysypującego się Eclipse, za każdym razem, kiedy ten chciał wyświetlić podpowiedź (tooltipa). Błąd powodowała biblioteka GTK+, ale po updatecie systemu problem zanikł.

Update przebiegł w bez problemowo. Problemy to się pojawiły po restarcie:

  • Pierwsze co się rzuciło w oczy, to brak programu Pidgin oraz Transmission. W przypadku tego drugiego, zmieniła się nazwa z której program był wywoływany. Z tym pierwszym, no było trochę zabawy, ale w sumie rozwiazanie było trywialne; usunięcie profilu
    rm -rf ~/.purple
    

    Tutaj jednak dopowiem (o ile ktoś nie wyrzucił jeszcze), że śmiało można poprzenosić pliki przechowujące konta, kontakty, logi itp między profilami (nazw łatwo się domyślić), podejrzewam, że problemem był plik ~/.purple/prefs.xml

  • Inną rzeczą były wielkie ikonki na pasku programu Thunar. Ukryłem ten pasek:P
  • Trzecie co zauważyłem, to znikły dodatkowe partycje z drugiego dysku – tutaj z pomocą przybyła lektura man mount.
  • Jako czwarte: brak programu xmms – okazał się on przestarzały, zainstalowałem BMP, ale chyba nie dla mnie. Później poszukam czegoś lepszego – może ktoś mi coś poleci?
  • Pięć: Aplikacje Javy w SWINGu choć się uruchamiają, to jednak czerwienią mi w Eclipsie konsolę:
Locking assertion failure.

Co zyskałem?

  • Nowe Ubuntu
  • Działający Eclipse
  • Nowy Pidgin (skompilowałem nowego) +wtyczka z tlenem, (fajnie, że jeszcze jest rozwijana)
  • Nowe wersje programów
  • Dzień pełen wrażeń i ten wpis

Jeśli ktoś miał podobne przeżycia, lub potrafi mi coś w niektórych kwestiach doradzić – chętnie posłucham.

Wyprowadzając wampira na spacer – kilka uwag

Jako, że nie mogłem zasnąć zastosowałem się do rady niejakiego pana Osho, zaprzestałem więc zmuszania mojego organizmu do snu; zechce, to sam poprosi. Czas mi podarowany postawiłem zużyć na zaśmiecanie Joggera (mała aluzja do wpisu w sąsiedztwie).

Przeczytałem dzisiaj na gazeta.pl (tak, na “wybiórczej” jak wolą niektórzy) o nowym serialu HBO, o nazwie “True Blood”. Ogólnie jest to i współczesnym świecie tyle, ze z tą różnica, że ujawniła się publicznie pewna grupa osób nazywających się wampirami i… o dziwo w istocie nimi będąca (czyli żadni tam wariaci), teraz kiedy nie muszą pić prawdziwej krwi, bo wystarczy im owa tytułowa True Blood (japoński wynalazek), to chcą wyjść z cienia i wieść “normalne” życie.

Pomysł nie jest zbyt oryginalny; były (są) takie książki, w którym również wampiryzm był czymś normalnym w społeczeństwie, tyle, że tam, działo się to podczas I wojny światowej (a może i drugiej), wampiry służyły w armii, w wampiry przemieniali się bogatsi, pojawili się ludzie za pieniądze sprzedający swoją krew itp (w końcu była wojna). Ale wróćmy do tego serialu, na materiałach promocyjnych skupiona się na pokazywaniu “jakby to był, gdyby naprawdę się objawili” czyli wywiady, konferencje prasowe, występy w talkshow (nie znam się na nich, bo i nie oglądam, ale chyba biorą udział tam prawdziwi prezenterzy takich programów). I choćby dlatego zapewne zajrzę na ten serial kiedy będę miał sposobność.

Ale przejdźmy do sensu:

Ja, próbując zasnąć bezskutecznie, zastanawiałem się, czy było to mądre na miejscu owych wampirów się tak ujawniać. Zwłaszcza, że tyle lat udało im się przetrwać w ukryciu zgodnie z prawami Maskarady. Będą wampirem raczej nie chciałbym, żeby jakiś rząd nagle zaczął finansować badania nad moim “rodzajem”, zwłaszcza nad takimi zagadnieniami jak: jak zabijać, jak rozróżniać, jak wykorzystać (np.: militarnie). Albo inaczej: czemu oni są nieśmiertelni, jak do tego doszło, etc.

Inną sprawą będą zapewne ludzie którzy chcieli by się wampirami stać (co tam picie krwi, kiedy jest się nieśmiertelnym), albo tacy którzy chcieli by wybić ten szatański pomiot. Albo o rodzinach osób zaginionych, którzy zaczną się zastanawiać, czy to aby przypadkiem nie wyjaśnienie owego zniknięcia itp.

Może kwestie te zostaną w serialu poruszone. A może i nie. Bo podobno ma tam być przemoc i seks (fabuła krąży – jak zrozumiałem – wokoło romansu kelnerki-telepatki i wampira, zresztą teraz o wszystkim tak mówią, zapewne nowy sezon Teletubisiów też będzie dla starszych dzieci). Pożyjemy-zobaczymy.

Wniosek na koniec: tak więc wampirki, moja rada taka: lepiej będzie jak pozostaniecie sobie w ukryciu.

PS: Tytuł to aluzja do gry ZAngband.

“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.

Google Chrome

Cześć

Wiem, że za niedługo pojawi się wiele wpisów, której mają w nazwie powyższy tytuł. Kilka groszy ode mnie w tej sprawie: nie pobrałem, nie zamierzam, przynajmniej przez najbliższy czas.

Nie chce być później w reklamach “bo pierwszego dnia (drugiego etc.) pobrało nas ile tam użytkowników”, widzicie jacy fajni jesteśmy?”. No co? MS tak robi.

Dziękuję za uwagę

PS.: Dowiedziałem się przypadkiem, że ten “pogromiciel IE8 i Firefoxa3” nie ma nawet wersji na system Linux – komentarz jest tu zbyteczny.