Prawdopodobnie niedługo zmienię przeglądarkę… Nie wiedziałem że do tego dojdzie, dalej w to nie wierzę, a jednak jestem tego prawie pewien ;)

Jedynym sensownym kandydatem jest Windows Internet Explorer 7… No dobra, żartowałem, Opera 9 :) Najważniejszym czynnikiem jest jej dużo mniejsza zasobożerność. Nawet nie ma czego porównywać jeśli chodzi o pracę na linuksie. Otworzenie kilku (często, w moim wypadku, kilkunastu) zakładek równocześnie w Ff (niezależnie, czy to starsza wersja, 1.0.x czy też obecna, 1.5.x) powoduje doslownie przestoje systemu. Przełączanie się pomiędzy takimi zakładkami to też średnia przyjemność. Sprzęt nie aż taki tragiczny, bo A1600+, 768MB RAM, szybki dysk 7200RPM i 8 MB cache, karta graficzna GeForce 4 MX440. Środowisko żadne KDE czy Gnome, tylko leciutki Fvwm2 wraz z fvwm-crystal. Czyli powinno śmigać… Ale nie śmiga.

Opera pod tym względem rządzi dla mnie. Szybka, lekka, sprawna. Używam jej po trochu już od dłuższego czasu, ale bez najważniejszego dla mnie narzędzia: odpowiednika AdBlock’a dla Ff jest mało używalna. Wersja 9.0 ma tą funkcjonalność wbudowaną, ale tutaj jeszcze nie jestem całkiem przekonany, bo nie oglądałem tego dokładniej - być może jej funkcjonalność będzie zbyt mała dla mnie. Okaże się.

Oczywiście z Ff nie jestem w stanie całkowicie zrezygnować: WebDeveloper jest niezastąpiony przy budowaniu layoutu. Poza tym jednak podgląd stron w Gecko jest czymś o czym nie wolno mi zapominać (Gecko na tą chwilę ma 18.5% polskiego rynku - żródło: ranking.pl). Ale dla normalnej pracy Gecko i oparte na nim browsery są zdecydowanie za wolne.

OK, lekko przesadziłem, Epiphany i tego typu są całkiem szybkie i miłe, ale bez zwiększonej funkcjonalności nie mają dla mnie szansy bytu (a Kazehakase mi segfaultuje ;) więc nie mam jak potestować ;) ).


Jako, że nie mam możliwości dopisania komentarza do właściwego postu (o, tutaj), dodam go u siebie (czemu nie mam możliwości tam? Nie wiem, po ‘Dodaj komentarz’ pojawia mi się biała strona i tyle…). Trackbacka chyba też tam nie ma.

Ja stosuję troszkę inną sztuczkę odnośnie sytuacji opisanej u Jarosława Mężyka. Tak jak on, przetrzymuję login, hasło i inne dane dotyczące bazy w stałych. Ale samo rozdzielenie konfiguracji jest bardziej automatyczne. Mianowicie, sprawdzam wartość zmiennej $_SERVER['HTTP_HOST']. Jeśli równa jest ona ciągowi znaków ‘localhost’, to stosuje ustawienia lokalne, w przeciwnym wypadku - docelowe. Przykład kodu:

<?php
if ($_SERVER['HTTP_HOST'] == 'localhost') {
  define('DATABASE_LOGIN', 'login');
  define('DATABASE_PASSWD', 'passwd');
  define('DATABASE_HOST', 'localhost');
  define('DATABASE_NAME', 'db');
} else {
  define('DATABASE_LOGIN', 'login_docelowy');
  define('DATABASE_PASSWD', 'passwd_docelowy');
  define('DATABASE_HOST', 'host_docelowy');
  define('DATABASE_NAME', 'db_docelowa');
}
?>

Właśnie zaimplementowałem proste sprawdzanie typów w PHP5. Oczywiście, nie jest to C++, gdzie kontrola ta jest bardziej ścisła, ale myślę że w wielu wypadkach starczy. Jest to o tyle wygodne, że łatwiej nieco będzie wykrywać nieścisłości (zresztą, po to jest sprawdzanie typów).

Przykład kodu:

class Test
{
  protected $properties = array(
    'var1' => array('tralala', 'string'),
    'var2' => array(3, 'integer'),
    'var3' => array(array('tralala', 'bulcykcyk), 'array')
  );
  public function __set($key, $value)
  {
    if (!array_key_exists($key, $this->properties)) {
      throw new Exception(sprintf('"%s" property doesn\'t exists.', $key));
    }
    if (gettype($value) != $this->properties[$key][1]) {
      throw new Exception(sprintf('"%s" property must be an "%s" type, is "%s".',
          $key,
          $this->properties[$key][1],
          gettype($value)
      ));
    }
    $this->properties[$key][0] = $value;
  }
}

Najtrudniejszym elementem jest tutaj każdorazowe ustawianie właściwej konstrukcji zmiennej $properties, ponieważ ta tablica ma konkretny format:

$properties = array(
  'nazwa_zmiennej' => array('wartość', 'typ')
)

Jako ‘wartość‘ wstawiamy tam wartość właściwości (obojętnie, czy obiekt, int, string, tablicę czy coś innego), a jako ‘typ‘ - wartość zwracana przez funkcję getttype() wywołaną na przechowywanym obiekcie. Dla napisów będzie to wartość ‘string‘, dla liczb całkowitych: ‘integer‘, a dla obiektów: ‘object‘.

Ta kontrola typów jest o tyle uproszczona, że nie sprawdza, czy przechowywany obiekt jest instancją danej klasy (tej która ma być przechowywana), oraz czy tablica przechowuje żądany typ obiektów. O ile pierwsze czasem warto, i łatwo zrobić za pomocą is_a() czy też get_class(), o tyle drugie może być trudniejsze i wymagać funkcji dodatkowych (jeśli sprawdzanie ma być niezależne od ilości zagłębień tablicy).

Przykład użycia:

$a = new Test;
try {
  $a->var1 = 'asd';               //ok
  $a->var2 = 1;                   //ok
  $a->var3 = array(1, 2, 3);  //ok

  //$a->var1 = 1;              //exception!
  //$a->var2 = 'a';             //exception!
  //$a->var3 = 1;              //exception!
} catch (Exception $e) {
  echo $e->getMessage();
}

W moim wypadku najlepszym rozwiązaniem było utworzenie klasy ‘Test‘ jako abstrakcyjnej (’abstract‘) i tworzenie kolejnych klas jako dziedziczących z niej. Każde z dzieci musi oczywiście mieć swoją wersję tablicy ‘$properties‘.


Wcześniej zrobiłem błąd, że próbowałem wstawić tenże tutorial jako osobną stronę, nie powiązaną z diary. Później, po przenosinach diary na inny serwer, zupełnie o tym zapomniałem, i trzy tłumaczenia tutoriala Django niespecjalnie działały…

Niniejszym naprawiam tenże błąd, i umieszczam je tam gdzie zawsze powinny być już dostępne:

Na razie więcej części nie ma, zająłem się innymi rzeczami, i zapomniałem o przetłumaczeniu ostatniej, czwartej części tutoriala. Postaram się to nadrobić za jakieś 2 tygodnie, jak wrócę do więzienia…

Przeniosłem też kilka działów (vimtips, humor) do kategorii ‘wszystkie’, zostawiając, tak jakby poza głównym nurtem, świeże kategorie: urzenia.net gdzie są informacje odnośnie samego diary, i Artykuły, gdzie będą umiesczane tłumaczenia i artykuły różnej maści.


Przejdź do reszty tego wpisu »


Przejdź do reszty tego wpisu »


Przejdź do reszty tego wpisu »


Całkiem niezła biblioteka, podoba mi się jak na razie bardzo. Oczywiście, nie jest bezbłędna, ale takie rzeczy nie istnieją. Zgłosiłem bugreporta, zobaczymy czy i jak szybko zarezgują ;)

Generalnie wrażenia jak najbardziej pozytywne. Używa się całkiem przyjemnie, trochę ułatwiają pracę w stosunku do FT (heh, całkiem dużo…). Jeszcze nie mam biegłości w posługiwaniu się OPT-ami, ale dokumentacja jest pięknie opisana, zarówno po polsku jak i po angielsku, co całkiem dobrze mówi o twórcach :)

Wspomniany wcześniej błąd dotyczy instrukcji {foreach}, a konkretnie części {foreachelse}, która powinna wykonywać się gdy tablica przekazywana jako parametr jest pusta. Aplikacja po prostu się wysypuje, gdy dyrektywa {foreachelse} występuje w kodzie szablonu… No nic, bywa.

A teraz czas spać…

AKTUALIZACJA
Nie jest źle. Wczoraj bugreport, w tej chwili sprawdziłem FlySpraya, poprawka tymczasowa podana na tacy, i obietnica naprawy w najnowszym RC ;)


Strona 1 z 2