Podpowiedzi w wyszukiwarce i PHP

Posted on kwiecień 20th, 2008 in php, programowanie | No Comments »

Podpowiedzi w stylu googlowego „Czy chodziło Ci o” to napewno przydatny dodatek do wyszukiwarki. Omówię dzisiaj w skrócie najprostszy znany mi sposób stworzenia takiego mechanizmu. Będziemy potrzebować: PHP4 lub późniejszy z biblioteką pspell. Niestety nie na każdym serwerze hostingowym pspell jest dostępny w standardzie. Na szczęście nie jest on taki rzadki.

Najpierw musimy stworzyć słownik słów użytych na stronie. Poniższy kod dodaje jedno słowo $word do słownika.

PHP:
  1. $pspell_config = pspell_config_create("pl");
  2. pspell_config_personal($pspell_config, "./sugestie2.slownik");
  3. $pspell_link = pspell_new_config($pspell_config);
  4. pspell_add_to_personal($pspell_link, $word); // dodajemy słowo do słownika
  5. pspell_save_wordlist($pspell_link);

Oczywiście gdy chcemy dodać więcej słów, wystarczy użyć pętli.

W poniższym kodzie dosyć istotna jest linia 3. Funkcja pspell_config_dict_dir wymusza na pspellu użycie tylko i wyłącznie naszego słownika. Bez niej funkcja pspell_suggest w wyniku zwróciłaby wszystkie polskie słowa podobne do tego, które zostało wpisane w wyszukiwarkę.

PHP:
  1. $pspell_config = pspell_config_create("pl");
  2. pspell_config_dict_dir($pspell_config, "~/public_html/slownik/");
  3. pspell_config_personal($pspell_config, "./sugestie2.slownik");
  4. $pspell_link = pspell_new_config($pspell_config);
  5.  
  6. $suggestions = pspell_suggest($pspell_link, $word);
  7. foreach ($suggestions as $suggestion) {
  8.     echo "Być może chodziło Ci o: $suggestion<br />";
  9. }

PHP i uruchomienie procesu w tle

Posted on luty 26th, 2008 in linux, php | No Comments »

Czasami zachodzi potrzeba, żeby z poziomu aplikacji WWW napisanej w PHP uruchomić jakąś czasochłonną operację. Może to być na przykład tworzenie kopii zapasowej jakichś danych.

Ponieważ taka operacja może trwać długo, jest bardzo prawdopodobne, że dojdzie do przekroczenia limitu wykonywania strony. W takim przypadku najlepiej uruchomić tą operację w tle.

Na pewnym forum znalazłem, że wystarczy użyć funkcji exec() i na końcu polecenia, które uruchamiamy dodać znak ampersanda &.

PHP:
  1. <?php
  2.    echo exec("sleep 1 && echo Koniec skryptu BASH &");
  3.    echo "\nKoniec skryptu PHP\n";
  4. ?>

Jednak po wykonaniu skryptu widać, że nie działa on tak, jakbyśmy tego chcieli.

CODE:
  1. $ php5 test.php
  2. Koniec skryptu BASH
  3. Koniec skryptu PHP

Aby rozwiązać problem należy posłużyć się innymi funkcjami: proc_open() i proc_close().

PHP:
  1. <?php
  2.    proc_close(proc_open ("sleep 1 && echo Koniec skryptu BASH &", array(), $pipes));
  3.    echo "\nKoniec skryptu PHP\n";
  4. ?>

A wynik wygląda tak.

CODE:
  1. $ php5 test.php
  2. Koniec skryptu PHP
  3. $
  4. Koniec skryptu BASH

ROWNUM w MySQL

Posted on luty 19th, 2008 in bazy danych, programowanie | No Comments »

Ostatnio, z powodu zmiany w kodzie pewnego CMSa, musiałem dopisać do bazy danych (MySQL) kilkadziesiąt bardzo podobnych do siebie rekordów. Największym problemem było to, że każdy wiersz musiał dostać swój kolejny numer (powiększony o stałą). Ponieważ w MySQL nie ma odpowiednika Oracle'owego ROWNUM musiałem ten problem obejść.

Numer wiersza można obliczyć tworząc sobie zmienną.

MySQL:
  1. SELECT @rownum := @rownum + 1 rownum, i.*
  2. FROM (SELECT @rownum := 0) r, informacja i

Po skorzystaniu z dobrodziejstw INSERT ... SELECT moje ostateczne zapytanie dodające operacje do modułów CMSa, które tej operacji jeszcze nie mają, wyglądało tak.

MySQL:
  1. INSERT INTO operacja(priorytet, id_modul, nazwa, kod)
  2. SELECT @rownum := @rownum + 1 priorytet, m.id_modul, 'lista', 'lista'
  3. FROM (
  4.     SELECT @rownum := (
  5.         SELECT max(id_operacja) FROM operacja
  6.     )
  7. ) r, ecms_modul m
  8. WHERE id_modul NOT IN (
  9.     SELECT id_modul FROM operacja WHERE kod = 'lista'
  10. );

Noworoczne postanowienia

Posted on grudzień 31st, 2007 in bez kategorii | No Comments »

Witam na tym dogorywającym blogu. Zazdroszczę ludziom, którzy biorą czas na aktywne prowadzenie swoich blogów. Skąd Wy bierzecie na to czas? :)

Jutro nowy rok i jak każdy z Was mam swoje noworoczne postanowienia.

  1. Zaktualizować swoje CV i zmienić pracę.
  2. Zacząć pisać tu na blogu, lub go usunąć i nie śmiecić w Internecie.
  3. Przejść Wiedźmina
  4. Napisać jakąkolwiek aplikację w jakimkolwiek języku programowania dla samego siebie, nie za pieniądze i na zlecenie (mam kilka pomysłów).

Szczęśliwego Nowego Roku! :)

P.S.
Szukasz programisty z doświadczeniem do pracy w Warszawie? Napisz do mnie. Mój JabberID/e-mail to michal@lipek.net. Preferuję języki PHP5, Python, Java jednak nic nie stoi na przeszkodzie, żebym także pisał w .NET/Mono, C++ czy Delphi. Bazy danych, praca w grupie też nie są mi obce.

DBDesigner4 i Ubuntu 7.04

Posted on sierpień 1st, 2007 in bazy danych, ubuntu | 1 Comment »

DBDesigner 4 to aplikacja (dostępna na licencji GPL) umożliwiająca stworzenie modelu fizycznego bazy danych. Aplikacja pozwala na proste tworzenie tabel oraz relacji między nimi. Dodatkowo program sam, na podstawie relacji, tworzy odpowiednie klucze obce. Potrafi także połączyć się z wieloma bazami danych, na przykład MySQL lub Oracle i wyeksportować tam dane lub zsynchronizować model z istniejącą już bazą. Oczywiście można także wygenerować zwykły skrypt tworzący bazę.

Program jest prosty, ale do małych projektów wystarczający. I co najważniejsze, jest darmowy.

DBDesigner 4

Dzięki temu, że została napisana w Kyliksie, działa zarówno pod Windowsem, jak i GNU/Linuksem. Niestety z tego samego powodu nie zawsze działa jak należy. Pod Ubuntu 7.04 i386 nie ma większych problemów. Wystarczy doinstalować dwa pakiety.

CODE:
  1. sudo apt-get install libstdc++2.10-glibc2.2 libxft1

Niestety pod 64-bitowym Ubuntu jest więcej zabawy (ale do tego wszyscy posiadacze 64-bitowych Linuksów dawno się przyzwyczaili, prawda?). Jednak jest dosyć proste rozwiązanie. Wystarczy do katalogu DBDesigner4/Linuxlib dorzucić brakujące biblioteki. Same biblioteki możemy na przykład wyciągnąć z pakietów dla 32-bitowego Ubuntu. Aby oszczędzić Wam przyjemności szukania odpowiednich paczek i wypakowywania z nich plików, po prostu umieszczam tutaj DBDesignera z odpowiednimi bibliotekami. :)

Na koniec jeszcze dwie sprawy. Po pierwsze, po uruchomieniu prawdopodobnie trzeba będzie zmienić domyślną czcionkę (w menu Options/DBDesigner Options). Polecam Bitstream Vera Sans. Po drugie, ciągle mam problem z bibliotekami łączącymi się z bazą MySQL (u siebie mam wersję 5). Jeżeli ktoś zna rozwiązanie, proszę żeby umieścił je w komentarzu. :)

Powiadamianie SMSem o nowych wiadomościach na koncie GMail

Posted on lipiec 29th, 2007 in gmail, internet, programowanie, python | 5 Comments »

Konto pocztowe od Google to świetna sprawa. Jakiś czas temu zrezygnowałem z Thunderbirda na rzecz GMaila i nie narzekam, a nawet sobie tą zmianę chwalę. Jednak nic nie stoi na przeszkodzie, żeby konto Googla ulepszyć. :)

Pomysł

Kilka dni temu Adriano na swoim blogu przedstawił świetny sposób na darmowe powiadamianie o nowych wiadomościach na Gmailu. Jeśli ktoś nie czytał, to przedstawię w skrócię ideę. Wystarczy ustawić przekazywanie maili z konta od Google, na inne konto, na którym mamy włączone powiadamianie o nowych wiadomościach poprzez SMS. Pomysł świetny, choć osobiście z podanej metody nie skorzystałem. Postanowiłem, że pokombinuję po swojemu.

Idea

Zastanawialiście się po co Google udostępnił kanał Atom w usłudze Gmail?? Zbędny „ficzer”? Do niedawna tak właśnie uważałem.

Gmail2Sms, bo tak się nazywa program, który napisałem, wykorzystuje kanał Atom, do pobrania informacji o nowych wiadomościach na skrzynce pocztowej. Jeżeli znajdzie nowe, wysyła SMSa. Proste, prawda?

Brzmi świetnie, jednak nie jest do końca różowo. Program potrzebuje:

  1. Pythona
  2. Telefonu w Plusie;
  3. Konta w Mieście Plusa;
  4. Komputera, który działa 24/7 najlepiej z Linuksem.

Program Gmail2Sms tworzyłem z myślą o wykorzystaniu na screenie. Wszystko co trzeba zrobić, żeby program działał, to ustawić kilka zmiennych w pliku konfiguracyjnym i wpisać ./gmail2sms.py.

Przetestuj Gmail2Sms

Program jest w bardzo wczesnej fazie rozwoju, więc nie należy spodziewać się cudów. Za jakiekolwiek szkody wynikłe z jego użytkowania nie ponoszę szkody. Jeśli się nie przestraszyłeś(aś), możesz pobrać i przetestować Gmail2Sms stąd. :)

Aktualizacja

[wtorek 7 sierpnia 2007, 19:52]

Udostępniam poprawioną wersję. Ta, w przeciwieństwie do poprzedniej wysyła SMS. Dodatkowo nie zawiesza się, gdy napotka problem z plikiem konfiguracyjnym.
Ściągnij Gmail2Sms 0.02.

Różne wersje IE i jeden Windows

Posted on lipiec 28th, 2007 in internet, internet explorer, windows | 1 Comment »

Do niedawna żyłem w w przekonaniu, że na jednym systemie Windows nie można zainstalować kilku wersji przeglądarki Internet Explorer. A tu proszę, okazało się, że się da. Wiadomość ta napewno ucieszy wszystkich ludzi zajmujących się tworzeniem stron internetowych. :)

Instalka i opis instalacji Multiple IE znajduje się na stronie TradoSoft. Paczka zawiera różne wersje Internet Explorera (3, 4, 5, 5.5, 6), działające niezależnie od zainstalowanego w systemie głównego Interet Explorera. Nie musimy się więc bać, że coś się stanie z naszym systemem. Aby to wszystko działało, należy posiadać zainstalowany system Windows 2000/XP/2003.

W Windows Vista powyższe rozwiązanie oczywiście nie działa. W tym przypadku pozostaje użyć darmowego obrazu dysku do Virtual PC z zainstalowanym Windows XP z IE6 o sympatycznie brzmiącej nazwie Internet Explorer Application Compatibility VPC Image. Należy się jednak śpieszyć, bo po 17 sierpnia i to nie będzie działać.

Offline przez tydzień

Posted on maj 15th, 2007 in internet, prywatne | 3 Comments »

Od 6 do 12 maja blog miał przerwę w działaniu. Sześć dni w Internecie, to naprawdę długo. Najpierw mój hosting padł na dwa dni. Pozostałe cztery dni blackoutu wynikły ze złej konfiguracji domeny.

Przy okazji chciałem Was ostrzec. Po pierwsze, nie kupujcie hostingu na boo.pl, chyba że lubicie regularne, kilkudniowe pady co parę miesięcy. I mimo, że właśnie zmienili providera i obiecują poprawę, to na zaufanie muszą sobie zasłużyć. Po drugie, nie kupujcie domeny w az.pl. Panel do konfiguracji domeny jest tak nieżyciowy, że bardziej nieżyciowy być nie może. Polecam na przykład home.pl, gdzie możemy sobie poustawiać co chcemy i jak chcemy w prosty i czytelny sposób.

Grafy i LaTeX

Posted on kwiecień 21st, 2007 in latex, studia, tutorial | 4 Comments »

Ostatnio stanąłem przed koniecznością narysowania grafu i wstawienia go do dokumentu LaTeXa. Ze względu na mój antytalent do rysowania, odpuściłem sobie zewnętrzne programy typu Corel Draw czy OpenOffice Picture. Rozwiązanie, które wybrałem, ma też jedną ogromną zaletę. Mój dokument kompiluje się bez problemów do DVI, PS i PDF. Read the rest of this entry »

Denerwujący DSL Dialogu

Posted on kwiecień 5th, 2007 in internet | 2 Comments »

Ostatnio nie działał mi Flickr, Yahoo, IMDB i MySpace, dzisiaj przyszła pora na Download Center Microsoftu.

Przykład:

CODE:
  1. renq@ezri:~$ wget http://download.microsoft.com/download/f/b/5/fb5a69f3-91af-4c00-a415-ac37c5601f85/PowerPointViewer.exe
  2. --23:45:38--  http://download.microsoft.com/download/f/b/5/fb5a69f3-91af-4c00-a415-ac37c5601f85/PowerPointViewer.exe
  3.            => `PowerPointViewer.exe'
  4. Translacja download.microsoft.com... 84.53.138.91, 84.53.138.98, 84.53.138.57, ...
  5. Łączenie się z download.microsoft.com|84.53.138.91|:80... nieudane: Connection timed out.
  6. Łączenie się z download.microsoft.com|84.53.138.98|:80... nieudane: Connection timed out.
  7. Łączenie się z download.microsoft.com|84.53.138.57|:80... nieudane: Connection timed out.
  8. Łączenie się z download.microsoft.com|84.53.138.58|:80... nieudane: Connection timed out.
  9. ...

I tak bez końca...

Pojęcia nie mam, czy problemy ma tylko zielonogórski Dialog, czy może cała sieć, ale powoli zaczyna mnie to naprawdę denerwować. Jedynym sposobem na obejście problemu jest użycie proxy, a mi takie rozwiązanie nie odpowiada. >< Czy ktoś, prócz mnie, też ma takie problemy?

P.S. PowerPoint Viewera 2007 ściągam tylko i wyłącznie dla kursorów. Więcej na blogu Pawła Wimmera. :)