PHP i GeoIP od MaxMind w wersji Lite

Opublikowano: 20.06.2010 | Kategoria: Apple, Programowanie | Tagi: , | Brak komentarzy »
geoip_record_by_name(): Required database not available at /opt/local/share/GeoIP/GeoIPCity.dat

Oto co mnie przywitało po instalacji modułu GeoIP dla PHP na Snow Leopardzie i wywołaniu kodu:

$record = geoip_record_by_name('www.zak.lodz.pl');
if ($record) print_r($record);
else echo 'error';

Brak odpowiedniej bazy… Ściągamy zatem bazę GeoIP miast w wersji Lite i tworzymy odpowiednie pliki.

$ cd; mkdir temp; cd temp;
$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
$ gunzip GeoLiteCity.dat.gz
$ sudo mv GeoLiteCity.dat /opt/local/share/GeoIP/GeoIPCity.dat

GeoIP, PECL, Zend Server z PHP 5.3 i SnowLeopard

Opublikowano: 19.06.2010 | Kategoria: Apple, Programowanie | Tagi: , , | Brak komentarzy »

Potrzebowałem na maszynie developerskiej (z jabłkiem na obudowie) rozpoznawania lokalizacji klientów na podstawie adresów IP. Rozwiązanie manualowe zakończyło się błędem:

$ sudo /usr/local/zend/bin/pecl install geoip
(...)
configure: error: Please reinstall the geoip distribution
ERROR: `/private/tmp/pear/temp/geoip/configure' failed

Próba instalacji przez PEAR, skierowała mnie na nowo do PECLa. Wniosek prosty – czegoś brak. Poszukałem rozwiązania w mac portach:

$ port search geoip
libgeoip @1.4.6 (devel, net)
    Gets country code by IP address

ISTOTNA UWAGA. Ponieważ Zend Server na MacOSX jest tylko w wersji 32 bit, musimy na chwilę namieszać, bo inaczej Zend nie łyknie nowego modułu, ze względu na niezgodność architektury (PHP będzie pluło ostrzeżeniami: PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/local/zend/lib/php_extensions/geoip.so’ – dlopen(/usr/local/zend/lib/php_extensions/geoip.so, 9): no suitable image found. Did find: /usr/local/zend/lib/php_extensions/geoip.so: mach-o, but wrong architecture in Unknown on line 0). W pliku /opt/local/etc/macports/macports.conf musimy odkomentować build_arch i386:

# CPU architecture to compile for. Defaults to i386 or ppc on Mac OS X 10.5
# and earlier, depending on the CPU type detected at runtime. On Mac OS X 10.6
# the default is x86_64 if the CPU supports it, i386 otherwise.
build_arch                      i386

Zapisujemy zmiany i instalujemy port z libgeoip.

$ sudo port install geoip
--->  Computing dependencies for libgeoip
--->  Fetching libgeoip
--->  Attempting to fetch GeoIP-1.4.6.tar.gz from http://lil.fr.distfiles.macports.org/libgeoip
--->  Verifying checksum(s) for libgeoip
--->  Extracting libgeoip
--->  Configuring libgeoip
--->  Building libgeoip
--->  Staging libgeoip into destroot
--->  Installing libgeoip @1.4.6_0
--->  Activating libgeoip @1.4.6_0
--->  Cleaning libgeoip

$ geoiplookup technicznie.miastofabryk.pl
GeoIP Country Edition: NL, Netherlands

$ file /opt/local/bin/geoiplookup
/opt/local/bin/geoiplookup: Mach-O executable i386

Śmiga. I jest w wersji 32 bitowej. Wstawiamy ponownie komentarz w /opt/local/etc/macports/macports.conf:

# build_arch                      i386

Wracamy do PECLa… ściągamy paczkę i ją rozpakowujemy:

$ cd; mkdir temp; cd temp
$ /usr/local/zend/bin/pecl download geoip
downloading geoip-1.0.7.tgz ...
Starting to download geoip-1.0.7.tgz (9,416 bytes)
.....done: 9,416 bytes
File /Users/skar/temp/geoip-1.0.7.tgz downloaded
$ tar xvf geoip-1.0.7.tgz
(...)
$ cd geoip-1.0.7

Teraz czas na konfigurację i kompilację modułu geoip dla PHP:

$ export "CFLAGS=-arch i386"
$ /usr/local/zend/bin/phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626

$ ./configure --with-php-config=/usr/local/zend/bin/php-config --disable-shared
(...)
$ make
(...)
$ sudo make install
Password:
Installing shared extensions:     /usr/local/zend/lib/php_extensions/

W katalogu /usr/local/zend/lib/php_extensions/ powinien pojawić się plik geoip.so. Jeżeli plik istnieje, to wszystko przebiegło prawidłowo. Odpalamy teraz konfigurację Zend Server (http://localhost:10081/ZendServer) i wchodzimy w Server Setup/Extensions i klikamy Turn On przy geoip. Restartujemy PHP. Powinno działać.


Xinha 0.95 – problem z wysyłaniem danych formularza

Opublikowano: 04.11.2008 | Kategoria: Internet, Programowanie | Tagi: , | Brak komentarzy »

Nie sądziłem, że na taką “pierdołę” stracę ponad 4 godziny. Z różnych przyczyn i nowych założeń, musiałem w pewnym projekcie zmienić javascriptowy edytor WYSIWYG. Dotychczas “najprzyjemniejszy” wydawał mi się TinyMCE. Spora ilość pluginów, praktycznie brak różnic w przeglądarkach. Posiada kilka niedociągnięć i drobnych błędów, ale jest użyteczny i używalny – nie spotkałem jeszcze edytora doskonałego.

Zmiana edytora wynikła głównie z potrzeby wykorzystania bardziej zaawansowanego uploadera plików, z możliwością zarządzania folderami i plikami na serwerze. Do TinyMCE jest w tym celu wykorzystywany płatny plugin MCFileManager, a ja w miarę możliwości szukałem czegoś “otwartego”. Przypomniałem sobie o edytorze Xinha, z którego gdzieś tam kiedyś korzystałem.

Miłe zaskoczenie. Wszystko na dzień dobry w języku polskim – wystarczy zmienić wartość zmiennej podczas konfiguracji. Dokumentacja może nie jest zbyt rozbudowana, ale wystarczająca do pierwszego odpalenia. To co najbardziej mnie zainteresowało, to funkcje do prostej obróbki plików graficznych – skalowanie, przycinanie (crop), obracanie. Zmodyfikowany plik możemy zapisać w innym formacie graficznym i w innej jakości – super. Ponadto wygodne zarządzanie plikami na serwerze – można tworzyć nowe foldery, usuwać i edytować stare, modyfikować pliki graficzne wcześniej wgrane.

Oczywiście nie mogło się obyć bez problemów przy “wkładaniu” edytora do projektu. Otóż problem okazał się wynikać z tak prozaicznej przyczyny, że był dość trudny do wykrycia i usunięcia. Zatem używając Xinha, nigdy nie wkładaj formularza do tabelki. Rób odwrotnie – wkładaj tabelkę do formularza.

Tak jest ŹLE:

<table>
<form>
<tr>
<td><input type="text" name="jakies_pole"/></td>
</tr>
</form>
</table>

Tak jest DOBRZE:

<form>
<table>
<tr>
<td><input type="text" name="jakies_pole"/></td>
</tr>
</table>
</form>

Banał, ale można stracić na niego sporo czasu.


CodeIgniter 1.7.0 – problem z DB_utility

Opublikowano: 02.11.2008 | Kategoria: Programowanie | Tagi: , | Brak komentarzy »

Po upgradzie z 1.6.3 do wersji 1.7.0 zaczęły się pojawiać dziwne problemy przy przetwarzaniu wyników zapytania do bazy na xml i csv (funkcje xml_from_result i csv_from_result):

You must submit a valid result object

Pomogła mała modyfikacja pliku system/database/DB_utility.php

Zmieniamy w tym pliku linię 178 i 220 z

if ( ! is_object($query) OR ! method_exists($query, 'field_names'))

na

if ( ! is_object($query) OR ! method_exists($query, 'result_object'))

Nie wiem, czy to dobre i ostateczne rozwiązanie, ale działa…


Forum Vanilla – obrazki w profilach a https…

Opublikowano: 11.09.2008 | Kategoria: Internet, Programowanie | Tagi: , , | 1 komentarz »

W Vanilla 1.1.4 występuje problem z obsługą obrazków serwowanych przez zewnętrzny serwer http, jeżeli samo forum działa na serwerze https. Przeanalizowałem problem i znalazłem rozwiązanie.

W pliku ./library/People/People.Class.User.php (~ linia 251) zmieniamy linijki:

$this->Icon = PrependString($this->Context->Configuration['HTTP_METHOD'].'://', ForceIncomingString('Icon',''));
$this->Picture = PrependString($this->Context->Configuration['HTTP_METHOD'].'://', ForceIncomingString('Picture',''));

na:

$this->Icon = PrependString('http://', ForceIncomingString('Icon',''));
$this->Picture = PrependString('http://', ForceIncomingString('Picture',''));

Jeżeli mieliśmy już jakichś użytkowników, to wypadało by im ręcznie zmienić adresy avatarów/ikon i obrazków w bazie danych – tabela LUM_User, kolumny Icon i Picture.

P.S. W wersji 1.5 rc3 zapowiedziano:
Added support for ssl hosted images and icons on profiles
Być może problem zostanie rozwiązany w inny sposób.