Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: singles, dodany: 20.04.2011 12:15, tagi: javascript, php

Krótko. Jetbrains zrobiło świąteczną niespodziankę i oferuje kilka swoich produktów po naprawdę dobrych cenach – spójrzcie tylko. Obniżka tyczy się licencji prywatnych. Jest to taki typ licencji, na który nie dostaniecie faktury, i który jest przypisany do Was. Ale można ją instalować na dowolnej liczbie maszyn (byle w jednym momencie chodziła tylko jedna kopia) i używać do projektów komercyjnych. Dla potwierdzenia odpowiedź, jaką dostałem na swoje pytanie, kiedy kupowałem swoją licencję:

I work in a company, and using company’s notebook to develop. Can I use personal license on that machine, and when I change company use it there? From what I’ve read, license is ‘attached’ to me, not to machine, so theoretically it’s possible, but I ask for confirmation.

I odpowiedź:

Yes, you can install the software on as many machines as you like but you can use it only on one of them concurrently. Furthermore no company funds may be involved in the purchase at any time.

Jeśli czekaliście na okazję, aby tanio kupić PHPStorm (albo inny produkt z listy) – ta okazja właśnie nadeszła.

Nie, nie mam umowy z JetBrains. Po prostu uważam, że PHPStorm to najlepsze IDE do PHP jakie miałem w rękach ;)

Autor wpisu: Aiv, dodany: 19.04.2011 23:28, tagi: php

Dzisiaj w cyklu „Ataki na web aplikacje” mam kod który atakuje ostatnio oprogramowanie osCommerce.[...]Ataki na web aplikacje – cz. 5

Autor wpisu: Tomasz Kowalczyk, dodany: 19.04.2011 23:24, tagi: symfony, framework, php

Witajcie. Programuję ostatnio we frameworku symfony i ze względu na sporą przerwę trafiam na różne problemy związane ze białymi plamami wiedzy na temat funkcjonowania pewnych małych trybików, bez których jednak ciężko byłoby ogarnąć działanie całego projektu. Niedawno niemałą zagwozdkę dał mi komponent sfWidgetFormI18nDate, który jest odpowiedzialny za wyświetlanie elementu formularza pozwalającego na wprowadzenie daty, a [...]

Autor wpisu: batman, dodany: 19.04.2011 08:00, tagi: jquery

W październiku zeszłego roku, ekipa odpowiedzialna za jQuery powiadomiła o zaakceptowaniu trzech pluginów autorstwa Microsoftu i możliwości dodania jednego z nich do jądra biblioteki. Pluginy te miały pojawić się wraz z wydaną trzy miesiące temu nową wersją jQuery, oznaczoną numerem 1.5. Mimo, iż na horyzoncie widać już wersję 1.6, pluginy nadal nie trafiły do biblioteki i raczej się w niej nie znajdą.

Okazało się bowiem, iż na przestrzeni wielu miesięcy, jeśli nie lat, oficjalne pluginy jQuery były traktowane po macoszemu, przez co nie powstała grupa za nie odpowiedzialna. Ludzie związani z jQuery postanowili to zmienić i rozdzielili oficjalne pluginy pomiędzy zespoły wchodzące w skład “team jQuery”, powodując tym samym jeszcze większy bałagan w pluginach i uzasadnione obawy o ich przyszłość. Plugin jquery-tmpl, autorstwa Microsoftu, trafił do ekipy odpowiedzialnej za jQuery UI, podobnie jak Globalization i bgiframe. Ludzie z jQuery Core Dev Team będą zajmować się pluginami Color, Easing oraz Mousewheel, a Microsoftowi pozostanie Data Link. Czyżby na nieskazitelnym monumencie jQuery pojawiła się pierwsza rysa? Wygląda na to, że zabrakło pomysłów na oficjalne pluginy, a te co już są próbuje się gdzieś upchnąć.

Autor wpisu: l3l0, dodany: 18.04.2011 23:26, tagi: php, symfony

Varnish logo

Przygotowania: Przed instalacją oraz zabawą z Varnishem zapoznałem się najpierw z oficialną dokumentacją http://www.varnish-cache.org/docs/2.1/index.html oraz ze specyfikacją HTTP 1.1 (http://tools.ietf.org/html/rfc2616), gdyż Varnish cache w dużym stopniu polega na tym protokole, a odświeżyć informacje zawsze można. Obejrzałem też prezentacje o Varnishu z sflive2011 http://symfony.com/video/Paris2011/56. Naprawdę polecam te źródła wszystkim którzy są nowi w temacie.

Instalacja: Jako że jestem szczęśliwym posiadaczem Ubuntu z rodziny surykatek (Meerkat) instalacja była naprawdę skąplikowana czyli “sudo apt-get install varnish”. Zainstalowana została wersja (varnish-2.1.3 SVN)

Konfiguracja Po próbie odpalenia demona przez “sudo /etc/init.d/varnish start” dostałem:

 * Not starting HTTP accelerator varnishd   [ OK ]

Troche mnie to skołowało ponieważ dopiero co zainstalowałem, a już nie działa.;) Naszczęscie na pomoc przyszedł wujek Google przez co znalazłem tego posta

http://vladgh.com/blog/varnish-nginx-and-php-533-ubuntu-1010.

Okazało się że wystarczy zmienić “START=no” na “START=yes” w “/etc/default/varnish” i po wywołaniu “sudo /etc/init.d/varnish start” dostajemy

 * Starting HTTP accelerator varnishd  [ OK ]

od razu lepiej!

Konfiguracje ESI wziąłem z http://symfony.com/doc/2.0/cookbook/cache/varnish.html więc mój plik /etc/varnish/varnish.vcl wygląda tak

# This is a basic VCL configuration file for varnish.  See the vcl(7)
# man page for details on VCL syntax and semantics.
#
# Default backend definition.  Set this to point to your content
# server.
#
backend default {
    .host = "127.0.0.1";
    .port = "80";
}

sub vcl_recv {
    set req.http.Surrogate-Capability = "abc=ESI/1.0";
}

sub vcl_fetch {
    if (beresp.http.Surrogate-Control ~ "ESI/1.0") {
       esi;
    }
}

sub vcl_hit {
    if (req.request == "PURGE") {
        set obj.ttl = 0s;
        error 200 "Purged";
    }
}

sub vcl_miss {
    if (req.request == "PURGE") {
        error 404 "Not purged";
    }
}

Postanowiłem też zmienić domyślne ustawienia demona varnisha. Musiałem wyedytować plik “/etc/default/varnish” i zdefinować własne DEAMON_OPS które wygląda tak

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: Tomasz Kowalczyk, dodany: 17.04.2011 21:56, tagi: javascript, jquery, php

Nie znam biblioteki, która bardziej podbiłaby serca programistów stron internetowych niż jQuery właśnie. Wielu ją polubiło od pierwszej linijki kodu, wielu nienawidzi, chociaż nie zna. Nie zmienia to jednak faktu, że projekt rozpoczęty przez Johna Resiga okazał się być strzałem w dziesiątkę, rozwiązującym setki problemów związanych z różnicami w implementacji silników JavaScriptu w przeglądarkach internetowych. [...]

Autor wpisu: Śpiechu, dodany: 16.04.2011 19:16, tagi: php, mysql

Ostatnio mnie ostro zjechaliście. Dzięki za komentarze, szczególnie te negatywne (yyy wszystkie?). Wszystkie starannie przeczytałem. Poczytałem co nieco i zdecydowałem się uderzyć z tematem jeszcze raz. Tym razem uwzględniając zadania takie jak „a co jak będę miał kilka serwerów: testowy, produkcyjny, itp.”, „a co jak chcę połączyć się z dwiema bazami na raz”?

Punktem wyjścia stał się Twittee, czyli kontener stworzony w 2009 r. przez Fabiena Potenciera zajmujący 140 znaków (tyle żeby całość dała się przesłać w postaci pojedynczej wiadomości w serwisie Twitter). Podstawą kontenera jest magia __set() i __get(), czyli to co Zyx lubi najbardziej :-) Całość została przeze mnie mocno zmodyfikowana. Dodałem np. rzucanie wyjątkami jeżeli wymagana wartość nie została ustawiona plus obsługę domknięć w przypadku gdy ustawiona wartość jest funkcją anonimową.

Parę linijek dotyczących ustawienia PDO wcisnąłem do funkcji anonimowej plus dodałem możliwość trzymania pojedynczej instancji PDO w razie potrzeby (zwrócę potem uwagę na static w domknięciu). Obiekt PDO „nie wie”, że jest w kontenerze i dobrze. Istotą DI jest to żeby klas nie trzeba było specjalnie dostosowywać do współpracy z kontenerem.

Obsługę wyjątków w całości zrzucam na klientów nie mieszając kompetencji kontenera, który ma ustawiać/zwracać zmienne/fabrykować obiekty.

class DBContainer {
 
  protected $values = array();
 
  public function __construct() {
        $this->loadDefaults();
  }
 
  protected function loadDefaults() {
    $this->pdo_driver = 'mysql';
    $this->pdo_host = 'localhost';
    $this->pdo_dbname = 'nazwabazy';
    $this->pdo_user = 'user';
    $this->pdo_pass = 'haslo';
    $this->pdo_charset = 'SET NAMES utf8';
    $this->pdo_persist = false;
 
    $this->pdo_getpdo = function(DBContainer $cont) {
 
      // static w kontekscie funkcji anonimowej
      static $persistentPDO;
 
      $pdoCreator = function() use ($cont) {
        if (!extension_loaded('PDO')) throw new Exception('Brak modulu PDO');
        $pdo = new PDO(
                    $cont->pdo_driver . ':host=' . $cont->pdo_host . ';dbname=' . $cont->pdo_dbname,
                    $cont->pdo_user,
                    $cont->pdo_pass,
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => $cont->pdo_charset));
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        return $pdo;
      };
 
      if ($cont->pdo_persist && $persistentPDO instanceof PDO) {
        return $persistentPDO;
      }
      elseif ($cont->pdo_persist) {
        $persistentPDO = $pdoCreator();
        return $persistentPDO;
      }
      else {
        return $pdoCreator();
      }
    };
 
    public function __set($key,$val) {
        $this->values[$key] = $val;
    }
 
    public function __get($key) {
        if (!isset($this->values[$key])) {
            throw new Exception("Wartosc {$key} nie istnieje");
        }
        if ($this->values[$key] instanceof Closure) {
            return $this->values[$key]($this);
        }
        else {
            return $this->values[$key];
        }
    }
}

Przykłady użycia:

$c = new DBContainer();
 
// PDO na domyslnych ustawieniach
$pdo = $c->pdo_getpdo;
 
// przestawiam baze danych
$c->pdo_dbname = 'testowa baza';
$nowePDOdlaBazyTestowa = $c->pdo_getpdo;
 
// znowu przestawiam baze danych, przestawiam na zapis PDO na stale
$c->pdo_dbname = 'baza produkcyjna';
$c->pdo_persist = true;
 
// sprawdzam czy na pewno obiekty PDO sa tej samej instancji
echo spl_object_hash($c->pdo_getpdo) . '<br>' . spl_object_hash($c->pdo_getpdo);
// zwroci taki sam hash

Na raz następny pokażę jak można fajnie korzystać z tego dla obiektów korzystających z pdo wewnętrznie.

Osoby nielubiące magii uprasza się o powstrzymanie od wylewania żalu. Po to zrobili __get(), __set() i dynamiczne typy zmiennych żeby z nich korzystać. Dobra dokumentacja wg mnie załatwia sprawę.

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.