Archive

Archive for the ‘Programowanie’ Category

Bajki o FastCGI w PHP

December 22nd, 2009 3 comments

Ostatnio docierały do mnie głosy o FastCGI w PHP. Jednak ja w bajki nie wierzę. To co znalazłem w PHP tylko przypomina FastCGI.

Otóż, jak sama nazwa wskazuje FastCGI powinno być szybsze od CGI. Tymczasem, FastCGI dla PHP nie ma wpływu na szybkość działania a na zużycie pamięci. Czyli może działać szybciej, ale nie musi zależy od sposobu mierzenia. Tutaj jest porównanie szybkości mod_php i php-fpm.

Brodaci i brzuchaci programiści, tacy jak ja, którzy pamiętają jeszcze czasy Perla, wyobrażają sobie że FastCGI działa w następujący sposób. Serwer WWW uruchamia proces aplikacji, aplikacja startuje (co zwykle trochę trwa) i czeka na kolejne żądania. Aplikacja staje się jedną częścią z serwerem. W porównaniu z CGI lub standardowym sposobem uruchamiania PHP pozwala to zaoszczędzić czas potrzebny na start aplikacji. Wymaga to jednak specjalnego sposobu programowania i sumienności w zarządzaniu zasobami. Tymczasem sumienność w zarządzaniu zasobami nie była potrzebna w świecie PHP. W świecie PHP serwer WWW uruchamia aplikację, aplikacja drukuję stronę, kończy pracę i serwer po niej sprząta. Programista programuje szybciej, bo nie traci czasu na programowanie zarządzania pamięcią. Jednak aplikacja działa wolniej, bo nie może korzystać z dobrodziejstw FastCGI. Coś za coś. Programiści piszą szybko lub aplikacja działa szybko. Wybór należy do biznesu. W PHP nie ma FastCGI takiego, jak znają programiści Perla. W PHP nie ma FastCGI które było by szybsze i pozwalało zaoszczędzić czas potrzebny na inicjalizację aplikacji.

PHP działa tak:

Tak działa prawdziwe, szybkie i brodate FastCGI:

 

Nie wiem jak działa FastCGI w PHP ale na pewno nie tak gdyż nie ma do tego API i biblioteki w PHP nie są przystosowane do takiej pracy. Jeżeli FastCGI w PHP będzie działać tak jak w Perlu, to chcę o tym wiedzieć.

Tu jest info o FastCGI dla Perla.

Categories: PHP Tags:

Facebook API

December 9th, 2009 3 comments

Ostatnio mam przyjemność walczyć z interfejsami programistycznymi serwisów internetowych takich jak: Facebook, MySpace, Twitter, Digg, Flickr, YouTube, Vimeo czy Open Social. Muszę przyznać, że API które zrobiło na mnie największe wrażenie to Facebook XFBML.

Szczerze mówiąc, nie wiedziałem że tak się da zrobić… Spodziewałem się takich technologii jak REST, WebServices czy osadzenie pływających ramek… Ale to co zrobił Facebook po prostu mnie zaskoczyło. Nie wiedziałem wcześniej że tak się da… I że to takie proste.

Otóż na swojej stronie XHTML osadzam specjalne tagi, które są rozszerzeniami Facebooka dla XHTML. Dodaję kilka linii JavaScriptu i działa. Moja przeglądarka internetowa wyświetla tagi Facebooka, na przykład kod strony: <fb:prompt-permission perms="publish_stream,offline_access">Czy zgadzasz się aby publikować na Facebooku</fb:prompt-permission> wyświetli mi pytanie o prawa dostępu. Inne tagi wyświetlają zdjęcia użytkowników, formularze komentowania i logowania lub przyciski zostań fanem.

Oczywiście, to jest proste tylko z pozoru. Programiści Facebook musieli się nieźle nagimnastykować, chociażby po to żeby współpracować z poziomami bezpieczeństwa przeglądarek internetowych. Podziwiam za odważny pomysł i dobrą realizację.

csplit a olbrzymie pliki

December 2nd, 2009 No comments

Moim zadaniem było naprawić uszkodzony plik kopii bezpieczeństwa bazy danych PostgreSQL. Wiedziałem w której linii jest błąd i na czym polega, jednak plik kopi bezpieczeństwa był na tyle olbrzymi, że edycja jego edycja była bardzo utrudniona. Z pomocą przyszedł mi program csplit znaleziony w pakiecie GnuWin32. Program ten potrafi podzielić plik na mniejsze na podstawie dopasowania przez wyrażenie regularne. Wydałem następujące polecenie:

csplit –f "out_" nazwa_pliku_backup.sql "/^COPY /" {*}
head –n 1 out_*

W wyniku pracy programu csplit uzyskałem kilkadziesiąt mniejszych plików – po jednym dla każdej tabeli w bazie.

Categories: Bazy danych, Programowanie Tags:

Codility vs JavaBlackBelt

November 9th, 2009 4 comments

Jakiś czas temu napisałem, że nie lubię testowania programistów tak jak się testuje kompilatory. Dobry programista nie musi wiedzieć czym różni się i++ od ++i, jednak musi czuć respekt przed takimi niuansami. Szkoda, że ta zasada nie jest znana społeczności JavaBlackBelt.

JavaBlackBelt to platforma do nauki Javy. Zawiera między innymi testy wymyślane przez społeczność programistów. Dzięki nim można wczuć się w rolę kompilatora:

Po co programista ma wiedzieć coś takiego? Żaden programista przy zdrowych zmysłach nie napiszę takiego kodu – intuicyjnie. A jak już napisze, to powinien dostać czarnym pasem po d….

Dlatego nie podoba mi się JavaBlackBelt. Czarnego pasa w karate nie dostaje się za nauczenie się nazw ciosów: “Mawashi Tobi Geri”.

Dlatego spodobał mi się polski program Codility. Dzięki Codility możemy sprawdzić jak programista poradzi sobie z napisaniem prawdziwego programu. Do wyboru mamy kilka języków programowania w których trzeba rozwiązać zadania algorytmiczne. Webowa aplikacja skompiluje podane rozwiązanie i sprawdzi wyniki przy pomocy testu jednostkowego. Genialne J.

Należy jednak pamiętać, że testy są zawsze pewnym uproszczeniem. Prawdziwych programistów poznaje się w pracy nad projektami a nie podczas rozwiązywania testów i zagadek algorytmicznych.

Categories: Programowanie, Recenzje Tags:

Własny renderer dla DataGrid (FLEX)

September 26th, 2009 No comments

Adobe FLEX posiada komponent do wyświetlania tabelek który nazywa się DataGrid. W komórce tabeli możemy wyświetlić tekst, tekst HTML lub inny prosty komponent. Mi jednak tego było mało. Postanowiłem więc napisać swój własny renderer dla komórek tabeli. Z początku wydawało mi się to proste: napiszę nową klasę dziedziczącą po DataGridItemRenderer i w niej upakuję logikę do wyświetlania mojej komórki tabeli. Niestety rzeczywistość okazała się niezwykle zagmatwana i zmusiła mnie do dokopania się do nieprzyzwoitych paskudztw ukrytych wewnątrz FLEX.

Nie mogłem zrobić klasy pochodnej z DataGridItemRenderer, gdyż tak klasa dziczy po UITextField czyli potrafi wyświetlać tekst. A ja potrzebowałem tekst i coś jeszcze. Spróbowałem więc pisać na płótnie Canvas. Okazało się, że Canvas prawie działa. Problemem były wartości, które poprzez interfejs IDataRenderer otrzymywała moja klasa: zamiast spodziewanego obiektu reprezentującego konkretną komórkę tabeli otrzymywałem obiekt reprezentujący cały wiersz. Zastanowiło mnie też dlaczego klasa Canvas – czyli obiekt reprezentujący płótno implementuje interfejs IDataRenderer – może Wy widzicie związek? Dla mnie to tak jak mercedes standardowo wyposażony w pieska kiwającego głową.

Analizując przykłady, odkryłem że klasa CheckBox powinna zachowywać się w tej materii właściwie, czyli gdy chciałem aby komórka tabeli była wyświetlana obiektem klasy CheckBox – to obiekt ten otrzymywał dane reprezentujące konkretną komórkę a nie cały wiersz. To mnie zastanowiło, dlaczego Canvas dostaje do wyświetlenia wiersz a CheckBox dostaje wartość komórki. Pomyślałem, że problem leży gdzieś w interfejsach. Pomyślałem sobie, że może DataGrid wpisując dane do komórek swojej tabeli sprawdza – czy klasa odpowiedzialna za wyświetlenie tej komórki implementuje wskazany interfejs – i w zależności od tego wysyła do nie odpowiednie dane. To by brzmiało rozsądnie. Niestety, debugger nie potwierdził moich przeczuć.

Zajrzałem więc do źródła CheckBox i oto co znalazłem. Jest tam sobie funkcja setter na pole data wymagana przez interfejs IDataRenderer. Oto ona:

W moim odczuciu, to nie wygląda jak zwykły setter. Dla mnie to wygląda jak na kod zepsutego projektu. Taka napisana funkcja zachowuje się w sposób nieprzewidywalny. W dodatku, po co ktoś projektował interfejs skoro większość klas FLEXa go odziedziczy?

Wracając do sprawy, aby napisać własną klasę służącą do wyświetlania komórek tabeli powinniśmy zaimplementować interfejsy: IDataRendererIDropInListItemRenderer. Aby dostać wartość wiersza potrzebny jest nam IDataRenderer, jednak ten interfejs implementują prawie wszystkie komponenty FLEXa. Aby dobrać się do wartości komórki, potrzebujemy IDropInListItemRenderer. Możemy do zrobić na przykład tak:

Martwię się o FLEX. To wspaniała technologia, która umożliwia tworzenie wspaniałych rzeczy. Jednak bałagan który w niej panuje może być dla tej niej zabójczy. Bałagan, o którym wie każdy programista, który programował w FLEX. Bałagan oczywiście zawsze towarzyszy pracy programistów, jednak w niektórych projektach jest czasami nie do zniesienia.

Categories: FLEX Tags:

Druga noc z Hero

August 29th, 2009 6 comments

Postanowiłem przetestować, jak mój nowy telefon poradzi sobie w sytuacji kryzysowej.

Kryzys wyobrażam sobie tak. Jestem sobie na wakacjach w górach. Właśnie jadę wyciągiem, by za chwilę zjechać z górki na pazurki. Dzwoni klient. Wykonuję cyrkowe akrobacje by odebrać rozmowę i nie zgubić rękawiczek. Dowiaduję się, że aplikacja nie działa a zaraz jest prezentacja. I że to wyjątkowa sytuacja i czy nie mógł bym sprawdzić o co chodzi bo pewnie zepsuła się jakaś drobnostka… Oczywiście to nie jest wyjątkowa sytuacja, bo aplikacje zwykle psują się wtedy gdy programiści mają wakacje i wtedy gdy będę prezentowane – tak jakby wstydziły się sławy.

Czy z moim HTC Hero poradził bym sobie w tej sytuacji? Oczywiście musiałbym dojechać do jakiegoś baru, schroniska. Następnie zobaczyć co jest nie tak z aplikacją WWW. Zalogować się po SSH na serwer. Sprawdzić co jest nie tak. Może ubić kilka procesów, może zrestartować aplikację – nie wiadomo. No i oczywiście nie chciał bym tracić na to całego dnia. Normalnie, siedząc przy komputerze w domu wykonanie tych czynności zajęło by chwilę. Będąc w górach nie mam laptopa ale mogę liczyć na ślamazarne łącze internetowe mojego telefonu.

Postanowiłem zrobić symulacje naprawy. Wyobraźmy sobie, że nieszczęście spowodowane było brakiem miejsca na dysku: “df –h” wyjaśnia sprawę, bo jakiś dziennik gdzieś spuchł i bo ktoś zapomniał przełączyć logowania z trybu odrobaczania na tryb produkcyjny. Przyczyna awarii brzmi sensownie, co?

Wcześniej zainstalowałem klienta SSH ConnectBot. Wczoraj miałem problemy z klawiaturą, jednak dziś udało mi się je pokonać. ConnectBot lepiej pracuje w pionowej pozycji telefonu a gdy klawiatura ginie, to można ją włączyć przyciskiem MENU. Problem w tym, że na HTC Hero to nie działa. Jednak klawiatura włączy się gdy cofniemy i przywrócimy konsole. Klawiatura pionowa jest mniej wygodna niż pozioma ale można się przyzwyczaić i o ile herbata rozmrozi palce to wszystko będzie dobrze.

Tak więc, wczoraj wygenerował w ConnectBot parę kluczy SSH. Zalogowałem się na serwer. Troszkę się męcząc wyedytowałem plik vim .ssh/authorized_keys. Tu niezastąpiona jest znajomość edytora vim. Bez niego było by dużo trudniej. Do pliku wkleiłem wygenerowany klucz publiczny po to by następnym razem logować się z telefonu bez podawania trudnego hasła. Do pracy w Vimie potrzebny jest nam przycisk ESC, który nie jest dostępny na klawiaturze ekranowej. Dlatego zapoznałem się ze skrótami klawiatury i gestami dostępnymi w ConnectBot. ESC osiągamy wciskając dwa razu kulkę. CTRL to wciśnięcie kulki. TAB to kulka później “i”. Wyjście z VIMa to: ESC :wq. J

Przerwałem połączenie, zalogowałem się ponownie. Tym razem obeszło się już bez trudnego podawania trudnego hasła do serwera, czyli szybciej. Postanowiłem zobaczyć jak działa polecenie top. Wynik jest akceptowalny. Polecenie top możemy zakończyć wciskając przycisk “q”. (W przypadku problemów z dyskiem polecenie top wskaże wysoki load i niskie zużycia procesora – procesy czekają na dostęp do dysku). Ekran możemy powiększać i zmniejszać korzystając z przycisków głośności.

Spróbowałem przelogować się na roota. Wprowadzenie hasła może być palcołomne, jednak wytrwałem się to uda. Pewnie trzeba wywalić z dysku jakieś logi lub przestarzałe backupy. Tylko to można zrobić na szybko. Tylko ostrożnie!

Naprawa mojej wyimaginowanej awarii polegała by na poprawieniu pliku konfiguracyjnego. Znów wracam więc do VIMa. VIMa naprawdę warto znać. Gdy ponad 30 lat temu powstawał Vi, pewnie nikt nie pomyślał, że będę wychwalał ten edytor w kontekście telefonów z ekranem dotykowym. VIM rządzi!

Tak więc, dzięki mojemu nowemu bohaterowi, udało mi się zażegnać wyimaginowany kryzys. W prawdziwym kryzysie, nie było by tak łatwo, ale jakaś szansa istnieje. Dzięki telefonowi mogłem sprawdzić działanie strony WWW. Mogłem zalogować się na serwer. Mogłem przelogować się na super użytkownika. Mogłem wykonywać polecenia powłoki. Mogłem też edytować pliki. Dokładnie o to mi zawsze chodziło. Od czasów mojej Nokii 3210 zawsze chciałem mieć takie możliwości. Teoretycznie Nokia E70 której używałem wcześniej też by sobie z tym zadaniem poradziła, jednak Symbian i te diabelne certyfikaty zniechęcały mnie.

Przy okazji, odkryłem wczoraj jeszcze jedną fajną cechę programu ConnectBot. ConnectBot oferuje również terminal lokalny, który wybornie zastępuje programy Terminal oraz Better Terminal z którymi miałem problem wcześniej.

 

 

Categories: Android, Programowanie, Recenzje Tags:

RTMP jak to robi YouTube

July 6th, 2009 3 comments

Z protokołem RTMP jest związany pewien problem. Standardowo działa on na porcie 1935. Właściwie, to nie jest problem z protokołem RTMP ale z ISP. Firmy, które sprzedają nam Internet lubią filtrować i kolejkować pakiety. Dlatego połączenia na porcie 1935 – który jest mało znany w Internecie działają dużo gorzej niż połączenia na porcie 80. Adobe wiedziało o tym, i wprowadziło protokół RTMPT, który jest opakowaniem protokołu RTMP w protokół HTTP, który działa na porcie 80 i który może doprowadzić do połamania języka.

YouTube zrobił coś innego. Otóż, You Tube ma w sobie coś takiego jak nagrywanie z kamery webowej. Do tego celu używają protokołu RTMP. Jednak wydaje mi się, że na porcie 80. Powiedział mi to NetLimiter – skąd inąd fajny program który polecam.

Postanowiłem więc dokładnie sprawdzić czy na pewno jest to protokół RTMP – na co wyglądało, czy też może zwyczajnie RTMPT. Zanurkowałem głęboko w system a jako butli tlenowej użyłem Wireshark. Wireshark to program który umożliwia podglądanie danych przekazywanych w połączeniach sieciowych. Chciałem sprawdzić, co tam się przesyłam z mojego komputera na serwery YouTube. Gdyby był to protokół RTMPT to podczas nagrywania wideo znalazło by się tam sporo żądań POST. Nie było ich… Było za to coś takiego:

rtmp://…:80/ – na 99% YouTube korzysta z protokołu RTMP na porcie 80.

Dotychczas z serwerem Red5 łączyłem się na porcie 1935 po protokole RTMP. Jeżeli połączenie działało źle – to próbowałem przełączyć się w na połączenie RTMPT na porcie 80 – sterowałem tym ręcznie lub pozwalałem aby Flash robił to automatycznie. Być może nie potrzebnie, skoro YouTube używa RTMP na porcie 80 to ja też powinienem spróbować.

 

 

Categories: FLEX Tags:

Javarsowia a i++ czy ++i

July 6th, 2009 8 comments

W sobotę odbyła się konferencja Javarsowia. Darmowa warszawska konferencja była naprawdę znakomicie zorganizowana i niczym nie ustępowała płatnej krakowskiej konferencji JDD. Wykłady, materiały, prezenty i jedzenie – które wygłodniali informatycy wyskrobywali z garnków – wszystko było na bardzo dobrym poziomie. Mi najbardziej spodobał się wygład Pawła Szulca o Apache Wicket. Dziękuje organizatorom, wykładowcom i sponsorom!!!

Zauważyłem, że ostatnio na konferencjach Java pojawił się trend na konkursy. Konkursy są najzupełniej w porządku, jednak nie podobają mi się pytania konkursowe. Uważam je za głupie. Nie chciałem brać udziału w tych konkursach, ale zobaczyłem małe czarne pudełeczka z tajemniczą nagrodą. Nie wytrzymałem, spróbowałem i nie rozwiązałem poprawnie. Na szczęście – dwa małe czarne pudełeczka udało mi się i tak dostać. Dzięki!!! Oto konkurs.

Metoda main wypisze: “Koń… Krowa, kura, kaczka… Kura, kaczka, drób…(…) O! Jest! Widzę! Droga…“. “Głupota – niedostatek rozumu przejawiający nieumiejętnością rozpoznawania istoty rzeczy“. To nie jest istota programowania. Tak precyzyjna wiedza o klasach, dziedziczeniu i przysłanianiu metod jest konieczna tylko dla programistów maszyny wirtualnej Java – którzy muszą trzymać się standardów. Programiści Java – nie powinni nigdy w życiu napisać takiego kodu. Programiści Java, gdy zobaczą taki kod powinni zaalarmować. Przypomina mi to trochę Perlowego Golfa. Jednak pomiędzy Perlowym Golfem a takim konkursami jest pewna różnica – Perlowy Golf polega na napisaniu najkrótszego programu co samo w sobie może być pewnym celem. Tymczasem celem tego programiku, zagadki – jest wyłącznie zagmatwanie. Nie o to chodzi. To nie jest istota programowania. W programowaniu nie chodzi o to żeby zagmatwać, ale żeby zarządzać informacją. ++i lub i++.

Krytykując, zawsze należy podać alternatywę. Jak napisałem wcześniej, konkursy uważam za fajne. Jednak takie pytania uważam za uwłaczający godności programistów. Moją godność kupili czarnymi pudełeczkami… No cóż… O co więc należy pytać na konferencjach, żeby nie obrażać uczestników? O istotę rzeczy!!! Na przykład styl kodowania: if(coś.equals("Antek")) czy if("Antek".eqauls(coś)) lub if(coś==null) czy if(null==coś). W tych dwóch króciutkich pytaniach prawidłowy jest tylko jeden styl kodowania – czy wiecie który i czy wiecie czemu? O co jeszcze można pytać na konferencjach. Na przykład o bardzo ważna metodę "equals" – gdyż pisząc ją łatwo jest się pomylić.

Istotą programowania nie jest wiedza, jaka jest różnica pomiędzy i++ czy ++i. Dobry programista nie musi tego wiedzieć. Dobry programista musi wiedzieć natomiast to, że inni mogą nie wiedzieć. Programowanie, to język który wykonują maszyny. Programowanie to język który muszą zrozumieć ludzie. Dlatego istotą programowania nie jest zapis if(7==i++) ale zapis: i++;if(7==i). Istotą programowania jest taki zapis myśli, aby ludzie mogli go odczytać a maszyny wykonać.

Chodzi mi tylko o to, aby ludzie którzy przyjdą na konferencje, którzy wystartują w konkursie i którzy dostaną czarne pudełeczko, nauczyli się przy okazji czegoś pożytecznego.

Programista to taki informatyk. Informatyka to zarządzanie wiedzą. Zarządzanie wiedzą to umiejętność rozpoznania istoty wiedzy. Skończmy z głupimi konkursami. Czas na dobre konkursy. Czekam na Wasze przykłady…

 

Categories: Programowanie, Recenzje Tags:

Co nowego w Red5 0.9?

June 16th, 2009 2 comments

Kilka dni temu świat ujrzał Red5 w wersji 0.8. W zasadzie Red5 0.8 nie wnosi nic nowego – uporządkowano jednak kod i dodano instalator aplikacji. Red5 0.8 to były ważne zmiany dla programistów a nie dla użytkowników.

Dopiero Red5 0.9 to będzie coś!!! Popatrzyłem na komentarz programistów w systemie kontroli wersji i znalazłem tam:

Jak widać programiści Red5 pracują pełną parą. Zachęciło mnie to do zaktualizowania projekt jakubiak-red5 – budowanie Red5 z maven2. Utworzyłem gałąź 0.8.0. Utworzyłem repozytorium maven. Posprzątałem trochę kod.

Uważam, że wersja 0.9 Red5 będzie przełomowa. Dotychczas Red5 zostawał w tyle za Wowza i FMS. Nowa wersja i potęga Xuggle wypchną ten serwer daleko przed konkurencje – przynajmniej w dziedzinie przetwarzania strumieni wideo.

Categories: Red5 Tags:

wagon-svn

June 2nd, 2009 No comments

wagon-svn to rozszerzenie do Maven2 które umożliwia publikowanie bibliotek do zdalnego repozytorium SVN. Może być ono szczególnie użyteczne dla osób korzystających z Google Code, na przykład dla mnie J. Instalacja biblioteki jest prosto, nie będę jej opisywał, gdyż zrobiło to już kilku boglerów, na przykład Don Brown.

W skrócie, maven2 pozwala określić jakie biblioteki potrzebne są do skompilowania naszej aplikacji. Biblioteki dostępne są w repozytoriach. Aby umieścić nasz projekt w repozytorium możemy korzystać właśnie z wagon-svn.

Z mojego odkrycia cieszę się niezmiernie, gdyż pamiętam że rok temu jeszcze nie było z tym tak prosto.

Categories: Maven Tags: