wtorek, 3 kwietnia 2012

Jak "pingować" serwer na konkretnym porcie?

Zdarzają się czasem przypadki, że chcemy sprawdzić, czy konkretna usługa na naszym serwerze działa prawidłowo. Przykładowo: skonfigurowaliśmy na serwerze usługę FTP. Oczywiście możemy zrobić test przy pomocy jakiegoś klienta FTP, np. FileZilli. Jednakże użycie normalnego, "produkcyjnego" narzędzia komplikuje sytuację i utrudnia "debugowanie", czyli szukanie przyczyny w razie pojawienia się błędu. (Np. przy logowaniu via klient FTP musimy podać nazwę i hasło użytkownika - jeśli coś będzie się komplikować przy identyfikacji podanych wartości, trudniej będzie rozpoznać, czy winny jest cały serwer FTP, który na nic nie reaguje, czy też może jest błąd w bazie użytkowników albo może odpowiedzialny jest jakiś błąd w kliencie, którego używamy.) Najbezpieczniej jest przeprowadzić zatem test w warunkach surowych, tj. "spingować" serwer na konkretnym porcie, na którym pracuje dana usługa. Jak wiadomo jednak poleceniem ping nie uda nam się tego zrobić: działa ono na protokole UDP, więc sprawdza konkretny port, odpowiadający za ten protokół. Jeśli jednak sprawdzamy inne porty (choćby ów przykładowy port 21 dla FTP), musimy skorzystać z innego narzędzia. Oczywiście w sukurs przychodzi nam internet i gotowe narzędzia, z których możemy korzystać online. Przedstawiam Wam, drodzy Czytelnicy, sprawdzony skaner portów, dostępny pod tym adresem: http://www.t1shopper.com/tools/port-scan/. Obsługa jest więcej niż intuicyjna: podajemy adres IP serwera oraz wybieramy numery portów, które chcemy przeskanować. To wszystko - po chwili otrzymujemy odpowiedź, z której dowiemy się o stanie danego portu (portów).

czwartek, 1 marca 2012

[Biblioteka] W. Stallings, Organizacja i architektura systemu komputerowego


W. Stallings, Organizacja i architektura systemu komputerowego. Projektowanie systemu a jego wydajność, wyd. WNT 2000.
ss. 769.

+ ZALETY
  • przebogaty, elementarny podręcznik dotyczący architektury i organizacji komputerów: wyjaśnia przejrzyście, ale w pełni profesjonalnie, jak działa komputer; przy nauce do przedmiotu "ARKO" - niezbędny :)
  • podzielony na solidne, dobrze wydzielone rozdziały - można czytać od deski do deski, jak i wybrać sobie tylko interesujący rozdział/podrozdział;
  • bardzo dużo schematów i rysunków, które przejrzyście objaśniają te zagadnienia, których opisywanie słowami mogłoby być niejasne i trudne;
  • twarda oprawa - książka nie ma szans się rozpaść, nawet jeśli bardzo intensywnie z niej korzystamy.
- WADY
  • wady? hm... może tylko duża waga... (ponad kilogram!) ;)
  • jednak mówiąc serio - książka jest już trochę zdezaktualizowana - wydana w 2000 roku, jest tłumaczeniem amerykańskiego wydania z pierwszej połowy lat 90. ubiegłego wieku - proszę się nie zdziwić, że najnowszą technologią są w niej procesory Pentium II... (Hm... Może na Święta napiszę list do Świętego Mikołaja z prośbą o nową edycję tego typu publikacji?)

środa, 15 lutego 2012

Google Maps - Zapisywanie dużej mapy do pliku graficznego

Zastanawiałeś się kiedyś, jak zapisać dużą mapę (np. cała Warszawa w dużym przybliżeniu) do jednego pliku graficznego? Pierwsza myśl to robienie zrzutów ekranu i sklejanie ich w programie graficznym. Praca żmudna, benedyktyńska wręcz - i wymaga dużego monitora i anielskiej cierpliwości tudzież precyzji przy sklejaniu. Przy większych mapach - porażka.
Tymczasem wykonanie tego zadania w sposób zautomatyzowany jest banalnie proste - rozwiązanie znalezione na jakimś polskim forum studentów architektury:


niedziela, 12 lutego 2012

Zdarzyło się jutro... - w PHP

Jak łatwo pobrać jutrzejszą datę w PHP? Oto najprostszy sposób:

$jutro = mktime(date("G"),date("i"),date("s"),date("m"),date("d")+1,date("Y"));

I w efekcie otrzymujemy w zmiennej $jutro datę (i czas) przesunięty w przyszłość o dokładnie 24 godziny.

P.S. Tytuł posta nawiązuje do puszczanego kiedyś w polskiej telewizji serialu "Zdarzyło się jutro". ;)

piątek, 3 lutego 2012

XML w PHP

Potrzebowałem niedawno łatwo parsować pliki XML w PHP. Narzędzi do tego trochę jest, mnie się jednak udało znaleźć narzędzie tak proste, że prostszego znaleźć chyba się nie da. I co więcej - jest ono wbudowane w PHP, nie trzeba więc nic instalować ani ściągać dodatkowych bibliotek z klasami. Gdyby ktoś był w podobnej potrzebie - oto rozwiązanie podane na tacy:

Do parsowania plików XML potrzebujemy obiektu klasy SimpleXmlElement. Konstruktor tejże w najprostszej postaci pobiera jeden argument - string, w którym zapisany jest kod XML. To wszystko. Jak teraz dostać się do konkretnych elementów drzewa dokumentu XML? To łatwiejsze niż myślisz. Po prostu poruszamy się po nim jak tak, jakbyśmy mieli wszystkie te XML-owe elementy zaimplementowane obiektowo. Poniżej wyjaśniający wszystko przykład.
Jeśli mamy taki kod XML:

<?xml version='1.0' standalone='yes'?>
<ksiazka>
 <tytul>Pan Tadeusz</tytul>
 <autor>Adam Mickiewicz</autor>
</ksiazka>
<ksiazka>
 <tytul>Dziady</tytul>
 <autor>Adam Mickiewicz</autor>
</ksiazka>

I będziemy mieć go w stringu np. $xml, to poniższy kod:

<?php
$dokument=new SimpleXmlElement($xml);
echo $dokument->ksiazka[0]->tytul;
?>

da nam w wyniku wydruk "Pan Tadeusz". Czyli składnia jest taka, jak byśmy mieli w obiekcie dokument obiekt ksiazka, a ten z kolei miałby pole tytul. Prawda, że zachwycająco proste? :)
Porada byłaby jednak niepełna, gdybym nie napisał, jak można sobie "wrzucić" XML do stringa, gdy nie chcemy go wpisywać ręcznie, ale pobrać z pliku. Otóż - tu także zostaniemy porażeni prostotą. Jeśli bowiem chcemy korzystać z pliku na naszym serwerze, to wystarczy użyć wbudowanej w PHP funkcji simplexml_load_file, jako argument podając ścieżkę do pliku. Trochę trudniej jest, gdy potrzebny plik XML znajduje się na innym serwerze - tu jednak z pomocą przychodzi nam CURL. Sprawdzałem to "na własnej skórze" - działa bezproblemowo (o ile się poprawnie przygotuje CURL-a, ale to insza inszość).

Bibliografia:
http://ditio.net/2008/06/19/using-php-curl-to-read-rss-feed-xml/
http://www.php.net/manual/en/function.simplexml-load-file.php
http://www.php.net/manual/en/simplexml.examples-basic.php

piątek, 27 stycznia 2012

Tajniki crona

Każdy administrator strony, nawet ten parający się tym amatorsko, zna pojęcie zadań cron. Dotyczy to głównie osób korzystających z hostingu, a nie administrujących własnymi serwerami. Jak wiadomo owo czteroliterowe słowo oznacza mechanizm uruchomiony na serwerze, umożliwiający na planowe uruchamianie własnych skryptów na serwerze - nawet jeśli nie ma się kontroli nad serwerem (czyli np. ma się wykupiony jedynie hosting). Niby wszystko jest oczywiste i jasne, ale gdy przychodzi potrzeba dodania konkretnego zadania cron, to nierzadko pojawia się problem: albo z prawidłowym zapisem ścieżki do naszego skryptu, albo z właściwym opisaniem reguł częstotliwości jego uruchamiania. Poniżej garść wskazówek w tej materii.
Po pierwsze - reguły częstotliwości. W większości paneli administracyjnych formularz dodawania nowego zadania wygląda mniej więcej tak (tutaj przykład z webd.pl):
(Oczywiście układ pól może być inny, zawsze jednak jest sześć pól, opisujących: minuty, godziny, dni, miesiące, dni tygodnia oraz ścieżkę do polecenia.)
W polach dotyczących czasu i daty możemy wpisywać wartości liczbowe lub znaki specjalne, które umożliwiają wprowadzenie bardziej wyrafinowanych konfiguracji. Najważniejszy znak to *. Jest on równoznaczny ze słowem "każdy(a)". Jeśli zatem postawimy * w polu godziny, oznaczać to będzie uruchamianie skryptu dla każdej godziny. Kolejne znaki specjalne to - oraz , (przecinek). Myślnik pozwala na wprowadzenie przedziałów (np. zapis "12-30" w polu minut oznacza - co minutę pomiędzy 12 a 30 minutą, włącznie), przecinek zaś na podanie listy pojedynczych wartości ("1,4,11" w polu miesięcy to inaczej w styczniu, kwietniu i listopadzie). Kolejny przydatny znak to / (slash, łamana). Jego użycie jest już "wyższą szkołą jazdy". Mianowicie pozwala on na wybór co którejś wartości. Przykładowo zapis "5/11" w polu minut oznacza "w 5 minucie oraz potem co 11 minut (w ramach danej godziny)", czyli ostatecznie w 5, 16, 27, 38 i 49 minucie. (Warto tu podkreślić, że ten odstęp co-ileś-tam np. minut dotyczy tylko konkretnego jednego przedziału czasowego z wyższego rzędu. Czyli np. co 11 minuta, ale w ramach jednej godziny; jeśli zaczynamy nową godzinę, to liczymy to od nowa.) W praktyce najczęściej spotykanym (i wartym do zapamiętania) jest zapis np. "*/3", który oznacza po prostu co trzeci - np. co trzeci dzień.
Niektóre specyfikacje crona przewidują także takie opcje, jak określanie w polu dnia np. ostatniego dnia wtorku miesiąca (zapis "2L" w polu "dzień tygodnia") lub ostatniego dnia w miesiącu (zapis "L" w polu "dzień"). Trzeba mieć na uwadze także to, że o ile w polu "miesiąc" wpisujemy - dosyć intuicyjnie - liczby pomiędzy 1 a 12, to jeśli chodzi o dni tygodnia, metoda liczenia jest inna: 0 to niedziela, 1 wtorek i tak aż do szóstki odpowiadającej sobocie.
Najważniejsze jest to, żeby pamiętać, że zapis reguły jest logiczną koniunkcją warunków we wszystkich polach czasu i daty. Oznacza to, że jeśli wpiszemy w polu "minuta" *, ale w polu "dzień" 1, to nie mamy skryptu uruchamianego co minutę zawsze, lecz jedynie w pierwszy dzień miesiąca co minutę (przez całą dobę, jeśli wpisaliśmy także * w polu "godzina"), a inne dni - wcale. Jest to łatwe do stosowania, ale przy bardziej skomplikowanych regułach można się trochę i zamotać, lepiej więc dwa razy się upewnić, czy nasza reguła ma zamierzony przez nas sens.
Dla lepszego oglądu podaję przykładowe zapisy:
0 17 * * * - codziennie o godzinie 17.00
0 */3 * * 5 - w piątki przez całą dobę co 3 godziny o pełnej godzinie
0 9-17 * * 1-5 - od poniedziałku do piątku co godzinę o pełnej godzinie od 9.00 do 17.00
- i tak dalej.
Odnośnie ostatniego pola w formularzu dodawania nowego zadania - czyli pola ścieżki do skryptu - sprawa jest zależna od konkretnej realizacji na danym serwerze. Niektóre bowiem firmy oferujące hosting wymagają tu podania URL naszego skryptu, inne ścieżki do pliku taka, jak jest na serwerze. Pierwszą metodę stosuje np. wspomniany wyżej webd.pl, drugą natomiast - hekko.pl. (W tym drugim przypadku ścieżka powinna mieć postać: /usr/local/bin/php /home/nazwa_użytkownika/dalsza_ścieżka_do_pliku/plik.php) Ponadto niektóre serwery domagają się podania im przed adresem polecenia wget (to raczej wtedy, gdy podajemy ścieżkę w postaci adresu URL, czyli np. http://moja_domena.pl/moje_skrypty/moj_plik.php).
Domyślnie program obsługujący harmonogram zadań cron (linuksiarze powiedzieliby zamiast program - deamon ;)) wysyła swoje wyjście (czyli wszystko to, co wydrukujemy np. poleceniami echo lub print() w PHP), a także ewentualne komunikaty błędu - na podany mejl administratora hostingu. To może być przydatne w czasie testów, gdy chcemy mieć np. informację "Udało się"/"Nie udało się", w zależności, czy skrypt zadziałał poprawnie, czy nie. Gdy jednak uruchomimy takie zadanie już w normalnej pracy, z dużą częstotliwością, to nasza skrzynka pocztowa zostanie błyskawicznie (jeśli ustawimy zadanie cron np. co minutę...) zasypana potwierdzeniami typu "Udało się wykonać skrypt!". Można oczywiście usunąć wszystkie instrukcje drukujące cokolwiek w naszym cronowym skrypcie, jeśli jednak chcemy mieć pewność, że nic nam nie będzie zasypywać skrzynki, to możemy wybrać opcję, aby program obsługujący harmonogram w ogóle nam nie wysyłał mejli. W panelu administracyjnym na hostingu w hekko.pl realizuje się to poprzez kliknięcie w klawisz "Nie wysyłaj mejli" lub dopisanie w polu polecenia, po ścieżce do skryptu poniższej komendy: >> /dev/null 2>&1

Bibliografia:
http://www.pomoc.hekko.pl/content/5/37/pl/jak-uruchomi%E6-skrypty-php-w-cron-.html
http://markus.revti.com/2008/06/meaning-of-devnull-21-in-crontab%E2%80%99s-cron-job/
http://en.wikipedia.org/wiki/Cron

sobota, 21 stycznia 2012

Co zrobić, gdy pendrive nie da się odczytać?

PROBLEM:
Wsadzamy pendrive'a do komputera z radosną nadzieją, że będziemy mogli zeń skorzystać, a tu nagle - zonk! W Eksploratorze Windowsa zamiast dodatkowego dysku z charakterystycznym opisem (np. [H: - KINGSTON]), widzimy jedynie napis "Dysk przenośny". Dwukrotne kliknięcie i próba zobaczenia jego zawartości kończy się wyskoczeniem okienka z komunikatem, że dysk jest nieczytelny. Tak po prostu Windows podczas próby odczytu się zakrztusił i wypluwa na nas niestrawione bity. Pół biedy, gdy na uszkodzonym, pendrive'ie były mało istotne dane, jakaś muzyka, albo zgrane od kogoś filmy. Jeśli jednak na owym małym czymś zachowana jest jedyna kopia tekstu pracy magisterskiej albo inne najcenniejsze dane - ciśnienie może gwałtownie podskoczyć. Jak poradzić sobie w takiej sytuacji i nie postradać zmysłów z rozpaczy?

ROZWIĄZANIE:
Pierwszym odruchem jest poszukiwanie w internecie programów do odzyskiwania danych. Z reguły za pierwszym razem nie trafimy na ten odpowiedni i w efekcie tracimy sporo czasu na sprawdzanie kolejnych programów, które okażą się bezużyteczne. Istnieje jednak bardzo dobry program, z którego można w takim wypadku skorzystać: nazywa się on Pendrive Data Doctor Recovery (wersja demo do ściągnięcia np. stąd). (Trzeba zwrócić uwagę przy pobieraniu go z internetu na właściwą nazwę - jest on bowiem elementem całej serii narzędzi do odzyskiwania danych; jeśli potrzebujemy uratować pendrive'a, musimy wybrać przeznaczony do tego program.) Jednakże bezpłatna wersja demonstracyjna tego softu niestety nie pozwala na skopiowanie odzyskanych plików, czyli jest de facto bezużyteczna. Spokojnie, możemy jednak dzięki niemu zobaczyć, czy w ogóle poszukiwany plik jest dostępny na tym dysku. Możemy również pokusić się o zakup wersji pełnej, za 45$.
Co zrobić, gdy jednak nie chcemy wydawać tych pieniędzy, albo chcemy maksymalnie oszczędzić czas (nie dość, że zakup programu może potrwać - przelew pieniędzy na zagraniczne konto producenta - to jeszcze sam program ze dwie godziny skanuje naszego pendrive'a)? Jest rozwiązanie i to nie dosyć, że dostępne za darmo, to jeszcze nie wymaga ściągania ani instalowania żadnego oprogramowania. Otóż, drodzy Czytelnicy, wystarczy skorzystać z wbudowanego w Windows narzędzia chkdsk. Tak! To nieprawdopodobne, ale moim przypadku zadziałał on bezbłędnie - w ciągu kilkudziesięciu sekund przeskanował pendrive'a, naprawił uszkodzone sektory i przywrócił "penka" do życia (co więcej, po takiej operacji dostępne pendrive powrócił dokładnie do stanu sprzed awarii - gdy tymczasem narzędzia do odzyskiwania nie radziły sobie z ratunkiem dla wszystkich plików, a przede wszystkim wyciągały na światło dzienne mnóstwo dawno temu skasowanych plików).
Żeby jednak wszystko się udało, musimy wykonać te czynności według konkretnej procedury, mianowicie:
1. Uruchamiamy konsolę (Start->Uruchom i wpisujemy cmd).
2. Wpisujemy chkdsk z: /f /r (gdzie zamiast z wpisujemy literę dysku, która reprezentuje ten podpięty pendrive).
3. Idziemy do lodówki po Colę, wracamy i mamy wszystko przywrócone do stanu sprzed awarii. :)

Metoda ta nie jest niezawodna, wszystko zależy od przyczyny awarii pendrive'a. W moim przypadku jednak - gdybym wiedział, że wystarczy użycie windowsowego checkdiska, to oszczędziłbym sobie pół nocy i pół dnia szukania akuratnych programów do odzyskiwania danych. A tak to po takim kilkusekundowym działaniu checkdiska został mi tylko facepalm (i radość, że udało się wszystko odzyskać). ;)

P.S. Wniosek z tej przygody jest również taki, że na pendrive'ie nie należy trzymać ważnych, niepowtarzalnych danych i lepiej korzystać z innych narzędzi do przenoszenia danych: dyski przenośne (duuuuuuużo mniej awaryjne niż pendrive'y), trzymanie plików na poczcie, w "chmurze" etc.