11 Cze

Kiedy parsowanie XML w Pythonie crashuje Apache...

Ostatnio podczas próby napisania webowej aplikacji w Pythonie, która miała między innymi parsować pliki XML natrafiłem na bardzo dziwny problem. Skrypt oparty był o framework Django. Podczas użycia metody xml.dom.minidom.parse() aplikacja się wykładała - nie zwracała żadnych błędów, a w przeglądarce widać było tylko białe okno. Jak zwykle przekopywanie polskiego internetu w poszukiwaniu odpowiedzi nic nie dało.

Czytaj dalej...
22 Maj

Trochę o OOP

OOP jest już dostępne w coraz to większej ilości języków programowania. Właściwie język bez obsługi OOP, chociaż w podstawowym stopniu, nie ma już racji bytu. Prawdziwy bum na programowanie obiektowe miał miejsce, gdy pojawiła się nowa wersja PHP oznaczona numerem 5 (co prawda wcześniejsze wersje też udostępniały klasy i obiekty, ale nie można było tego nazwać nawet szczątkową obsługą OOP). Gros osób piszących właśnie w tym języku odkryło możliwości jakie niosła ze sobą, zupełnie nowa dla niektórych, funkcjonalność. Zauważyłem jednak, że wielu młodych programistów nie rozumie na czym tak na prawdę polega programowanie obiektowe. W internecie znajduje się wiele "kursów" używających sławnych już przykładów "pojazd - rower" lub "roślina - kwiat". Nie zawsze jednak takie porównania pozwalają w pełni zrozumieć ideę OOP.

Czytaj dalej...
23 Kwi

J2ME problem z nagłówkiem http Content-Length

Próbując napisać prostą aplikację na komórki, która łączyłaby się z zewnętrznym serwerem natknąłem się na dość interesujący problem. Serwer za każdym zwracał błąd 411 - Content Length Required. Kod wydawał mi się poprawny, headery zgodne ze specyfikacją, dlatego postanowiłem zasięgnąć rady Pana Googla. Wyniki jego poszukiwań były dość marne. W sumie dowiedziałem się tylko tyle, że problem jest znany. Nie znalazłem jednak żadnej konkretnej informacji jak sobie z nim poradzić.

Czytaj dalej...
28 Lut

Projektowanie serwisu cz.2 - layout

Ten wpis miał się pojawić dobry miesiąc temu. Niestety pokonał mnie brak czasu, za co przepraszam. Żeby nie przedłużać od razu przejdę do właściwego tematu.

Layout w dużym uproszczeniu jest planem jak ma wyglądać nasza strona internetowa. Zazwyczaj umieszcza się na nim jedynie statyczny model strony. Z własnego doświadczenia wiem jednak, że dobrze jest także zaznaczyć sobie wygląd linku po najechaniu myszką, czy linku do strony już odwiedzanej.

Czytaj dalej...
09 Sty

Projektowanie serwisu cz.1 - ogólny zarys

Pierwszy wpis z tej serii będzie nieco ogólny i teoretyczny. Co należy sobie przygotować zanim w ogóle zacznie się pracę z pisaniem kodu? Przede wszystkim należy mieć pomysł. Trzeba wcześniej już sobie wyobrazić jak serwis ma funkcjonować, jakie ma spełniać zadania itp. - oczywiście dość ogólnie.

Czytaj dalej...
26 Lis

Python vs PHP

Jeśli wszystko potoczy się po mojej myśli niedługo zacznę pracę nad nowym, sporym projektem. Podczas rozmowy z "szefem" rzuciłem pomysł napisania wszystkich skryptów w Pythonie. Później sam zacząłem się zastanawiać dlaczego właściwie odstąpić od dobrze wszystkim znanego PHP na rzecz stosunkowo mało popularnego Pythona.

Poczytałem trochę w internecie i rozszerzyłem swoją wiedzę na ten temat. Wcześniej miałem już styczność z pajtonem, ale nie można było tego nazwać tworzeniem skryptów, a raczej dziecinną zabawą. Z PHP za to walczę już od kilku dobrych lat, więc raczej nic mnie już zaskoczyć nie może (choć mogę się mylić :P ). Postanowiłem zebrać w punktach dlaczego warto zostać przy PHP:

  • język znam już od dawna
  • duże doświadczenie w tworzeniu skryptów
  • łatwość implementacji algorytmów
  • posiadam masę gotowych funkcji, metod i klas, które znacznie ułatwiają mi pracę

Dla równowagi zebrałem sobie też punkciki przemawiające za tym, aby odejść od PHP:

  • pod względem ilości funkcji dostępnych w języku PHP zostaje w tyle (brak przestrzeni nazw, raczkująca obiektowość)
  • PHP jest stosunkowo wolno rozwijane minie dużo czasu, zanim PHP nadrobi te straty
  • czasem dziwne i nieintuicyjne nazwy funkcji

Python i Django oferują programiście połączenie łatwego i schludnego języka, oraz rozbudowanego frameworka do tworzenia serwisów WWW. Na wstępie mamy do dyspozycji prosty (ale zawsze!) panel admina, oraz interface do implementacji systemu użytkowników. Poza tym ORM wysokiego poziomu, który według mnie jest łatwiejszy w obsłudze, bardziej intuicyjny, a przede wszystkim bardziej obiektowy niż PHP-owy PDO. Aplikacje w Pythonie mogą być wielowątkowe, co także pozwala na zwiększenie wydajności naszej aplikacji. Dodatkowym atutem przemawiającym za przestawieniem sie na pajtona jest to, że nie jest on językiem stworzonym przede wszystkim do pisania stron. Dzięki temu będzie można łatwo zintegrować np. bota gg/irc z serwisem WWW.

Podsumowująć... PHP jest stworzony do pisania stron internetowych i jest do tego celu bardzo dobry. Z drugiej strony nie oferuje on programiście funkcjonalności dostępnych w innych językach już od bardzo dawna. Co prawda developerzy wypuszczają nowe wersje, jednak jak sami twierdzą implementacja niektórych funkcjonalności nie jest możliwa bez całkowitego przebudowania języka. Python nie był tworzony z myślą o podboju internetu. Dzięki takim frameworkom jak Django, czy Pylons stał się do tego celu dobrym narzędziem. Na wstępie oferuje narzędzia przydatne podczas tworzenia serwisów internetowych. Odciąża programistę od zabawy z SQL-em, wiele rzeczy robi automatycznie. Dlatego moim zdaniem warto jest zmienić przyzwyczajenia i poznać alternatywne rozwiązania.

14 Lis

JAGallery 1.0

Jak pisałem wcześniej prace nad skryptem prostej galerii zostały zakończone. Do nowych ficzerów należy zaliczyć możliwość wyświetlenia losowego zdjęcia i ilości plików w folderze w ekranie wyboru galerii. Całość przetestowałem i działa sprawnie w (chyba) każdej możliwej konfiguracji. Do najważniejszych założeń na przyszłość należy skrypt, który podczas wyświetlania dużego zdjęcia skaluje je tak, aby nie wychodziło poza ekran. W następnej wersja ta opcja będzie już na pewno dostępna.

Skrypt udostępniony jest na zasadach licencji by-sa.

  • Co można:
  • kopiować, rozpowszechniać, odtwarzać i wykonywać
  • tworzyć utwory zależne
  • Czego nie można:
  • modyfikować skryptu i rozpowszechniać go jako własny
  • rozpowszechniać skryptu i jego modyfikacji na innej licencji

Download: JAGallery.rar Sample: http://jony.com.pl/galeria

25 Wrz

Data - jako kartka z kalendarza

Robiąc dla kolegi szablon pod WordPress podpatrzyłem łatwy sposób na zrobienie daty wpisu w postaci kartki z kalendarza. Rozwiązanie mi się spodobało i wstawiłem takie coś u siebie na blog. Moim zdaniem prezentuje się o wiele lepiej niż wcześniejszy format daty. Jak wstawić takie coś na swojego joggera? Wystarczy wykonać kilka kroków: 1. Wgrywamy plik kalendarz.png na serwer 2. Do arkusza styli dodajemy kod:

div.data {
        height: 36px;
        width: 26px;
        background-image: url('/files/kalendarz.png');
        font: normal 10px Arial, Helvetica, sans-serif;
        color: #666666;
        text-align: center;
        line-height: 100%;
        float: left;
        margin: 2px 2px 0px 0px;
}
div.data span {
        height: 16px;
        display: block;
        font: normal 12px Arial, Helvetica, sans-serif;
        color: black;
        text-align: center;
        padding-top: 5px;
}

3. W miejsce gdzie ma się wyświetlić data wklejamy:

<div class="data"><span><ENTRY_DATE_DAY/></span> <ENTRY_DATE_MONTH/></div>

Aby nazwa miesiąca ukazywała się w postaci 3 liter należy w panelu administracyjnym w zakładce Szablony | Nazwy własne | Miesiące wyedytować pola stycznia, lutego, marca itp.

02 Wrz

TinyMCE - prosty edytor WYSIWYG

WYSIWYG (ang. What You See Is What You Get co znaczy dosłownie To Co Widzisz Jest Tym Co Otrzymasz) to akronim stosowany w informatyce dla określenia metod, które pozwalają uzyskać wynik w publikacji identyczny lub bardzo zbliżony do obrazu na ekranie. [Źródło: pl.wikipedia.org]

W skrócie mówiąc jest to tym, co mamy w edytorach tekstu (np. Word). Aby określić wygląd dokumentu umieszczonego w formularzu na stronie internetowej trzeba stosować html, lub znaczniki BBCode. Nie każdy jednak zna html i nie każda strona obsługuje znaczniki BBCode. Od niedawna dostępne są komponenty na stronę internetową, które pozwalają z bardzo prosty sposób umieścić edytor WYSIWYG w oknie przeglądarki. Mnie zainteresował projekt TinyMCE. Jest on bardzo prosty w instalacji i wymaga niewielkiej ingerencji w kod źródłowy strony. Nawet początkującemu webmasterowi dodatnie takiego edytora nie powinno zająć dłużej niż 3-4 minuty. Aby umieścić TinyMCE na stronie należy pobrać pliki oraz pakiet językowy. Folder z plikamy umieszczamy na serwerze. W kodzie strony, na której chcemy umieścić edytor należy w sekcji head dodać kod:

<script language="javascript" type="text/javascript" src="sciezka_do_pliku/tiny_mce.js"></script>
<script language="javascript" type="text/javascript">
tinyMCE.init({
    mode : "textareas",
    theme : "advanced",
    language : "pl",
    entity_encoding : "raw",
    theme_advanced_toolbar_location : "top",
    theme_advanced_toolbar_align : "left",
    theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,bullist,numlist,indent,separator,undo,redo,separator,link,unlink,anchor,image,separator,code", 
    theme_advanced_buttons2 : "",
    theme_advanced_buttons3 : "",
    auto_cleanup_word : true,
    plugins : "table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,zoom,flash,searchreplace,print,contextmenu,fullscreen", 
    plugin_insertdate_dateFormat : "%m/%d/%Y",
    plugin_insertdate_timeFormat : "%H:%M:%S",
    extended_valid_elements : "a[name|href|target=_blank|title|onclick],img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name],hr[class|width|size|noshade],font[face|size|color|style],span[class|align|style]", 
    fullscreen_settings : {
        theme_advanced_path_location : "top",
        theme_advanced_buttons1 : "fullscreen,separator,preview,separator,cut,copy,paste,separator,undo,redo,separator,search,replace,separator,code,separator,cleanup,separator,bold,italic,underline,strikethrough,separator,forecolor,backcolor,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,help", 
        theme_advanced_buttons2 : "removeformat,styleselect,formatselect,fontselect,fontsizeselect,separator,bullist,numlist,outdent,indent,separator,link,unlink,anchor",
        theme_advanced_buttons3 : "sub,sup,separator,image,insertdate,inserttime,separator,tablecontrols,separator,hr,advhr,visualaid,separator,charmap,emotions,iespell,flash,separator,print" 
    }
});
</script>

I gotowe. Od tej pory w każdym polu textarea będzie widoczny edytor. Można zmieniać jego ustawienia zgodnie z instrukcjami zamieszczonymi na stronie producenta. Kod który podałem wyświetla jedynie najważniejsze funkcje, aby rozmiary panelu edytora były jak najmniejsze.

Edit: Na własnym przykładzie przekonałem się, że domyślne kodowanie znaków zawiera błąd w wyświetlaniu litery "ó", która pokazywana jest jako &oacute; Sposobem na to okazało się dodanie

entity_encoding : "raw" 

do kodu wywołującego. Treść artykułu jest już poprawiona.

02 Wrz

Twitter

Na świecie, a ostatnio także w Polsce zagościła moda na twitter`a. Jest to system powiadamiania znajomych o czynności, którą w tej chwili wykonujemy. Mojego twitter`a można znaleźć pod opcją szukaj. Przedstawię łatwy sposób na umieszczenie takiego skryptu na swojej stronie/blogu. Pierwszą rzeczą jaką należy zrobić jest rejestracja na stronie http://twitter.com. Serwis ten posiada możliwość dodawania nowych wpisów poprzez Jabbera. Wystarczy podać swój identyfikator podczas rejestracji lub w ustawieniach oraz wysłać podaną treść do twitter@twitter.com . Przejdźmy teraz do samego skryptu. Serwis Twitter udostępnia API do skryptów JavaScript, dzięki któremu można znacznie przyspieszyć wstawienie gadżetu na stronę/blog. Na końcu strony (przed tagami) </body></html> należy umieścić kod:

<script type="text/javascript" src="http://twitter.com/statuses/user_timeline/TWÓJ_NICK.json?callback=twitterCallback&count=1"></script>

gdzie TWÓJ_NICK zastępujemy tym, podanym podczas rejestracji. Kod ten wywoła funkcję twitterCallback (o niej za chwilę) jako parametr zwracając obiekt z danymi zawierającymi nasze wpisy. Wspomnianą funkcję musimy napisać sami. Ja posłużyłem się przerobionym nieco przykładem z oficjalnej strony serwisu. Stwórzmy zatem plik twitter.js z taką oto zawartością:

function przetworzCzas(dodane) {
  var teraz = new Date();
  var roznica = (teraz - dodane)/1000;

  if (roznica < 60) {
    return 'mniej niż minutę temu';
  } else if(roznica < 120) {
    return 'minutę temu';
  } else if(roznica < (60*60)) {
    return (parseInt(roznica / 60)).toString() + ' minut temu';
  } else if(roznica < (120*60)) {
    return 'godzinę temu';
  } else if(roznica < (24*60*60)) {
    return 'około ' + (parseInt(roznica / 3600)).toString() + ' godzin temu';
  } else if(roznica < (48*60*60)) {
    return 'dzień temu';
  } else {
    return (parseInt(roznica / 86400)).toString() + ' dni temu';
  }
}

function twitterCallback(Obiekt) {
        var kodHTML = '';
        var blok = $('twitter');
        for(i = 0; i < Obiekt.length; i++) {
                var date = new Date(Obiekt[i].created_at);
                var czas = przetworzCzas(date);
                kodHTML +=  "<li><span>[ " + czas + " ]</span><br/>" +Obiekt[i].text+"</li>";
        }
        blok.innerHTML = kodHTML;
}

Jak widać oprócz funkcji twitterCallback(); umieściłem także przetworzCzas(), która wyświetli nam nie datę, a czas jaki upłynął od dodania wpisu. W powyższym przykładzie posłużyłem się biblioteką prototype, która nieco ułatwia tworzenie skryptów JS. Jej kod można pobrać z http://jony.jogger.pl/files/prototype.js. W kodzie HTML naszej strony należy umieścić odwołania do tych skryptów. W sekcji <head> umieszczamy kod:

<script type="text/javascript" src="twitter.js"></script>
<script type="text/javascript" src="prototype.js"></script>

Ostatnią rzeczą jaka nam została jest ustalenie miejsca, w którym ma się wyświetlać nasz twitter. W wybrane miejsce w kodzie HTML należy wstawić:

<h2>Twitter</h2>
<ul id="twitter">
</ul>

Można także określić odpowiednie style dla tych elementów, które poprawią wygląd naszego twittera.