Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: singles, dodany: 14.05.2011 23:52, tagi: javascript

O języku JavaScript można mówić dobrze jak i źle, ale na pewno nie można odmówić mu rozkwitu w ostatnich latach. I nie mam na myśli tego, że webmasterzy ponownie zaczęli implementować zegarki latające za kursorem (ah te początki 2000 roku ;) JavaScript na serwerze staje się coraz bardziej naturalny za sprawą narzędzi typu node.js, silniki JS są coraz szybsze, powstaje coraz więcej aplikacji pisanych tylko i wyłącznie w tym języku.

Jednak im więcej kodu piszemy, tym częściej zauważamy, że niektóre konstrukcje językowe powtarzają się coraz częściej. Wydaje mi się, że głównie chęć zaoszczędzenia czasu jest motorem do powstania takich narzędzi jak CoffeeScript, które to chciałbym w tym wpisie krótko przedstawić.

„Ale o so chodzi?”

Jak piszą autorzy, CoffeeScript jest małym językiem, który kompiluje się do JavaScript’u. Przykładowy kod wygląda tak (zaczerpnięty z głównej strony projektu):

# Assignment:
number   = 42
opposite = true
 
# Conditions:
number = -42 if opposite
 
# Functions:
square = (x) -> x * x
 
# Objects:
math =
  root:   Math.sqrt
  square: square
  cube:   (x) -> x * square x
 
# Splats:
race = (winner, runners...) ->
  print winner, runners
 
# Existence:
alert "I knew it!" if elvis?

Najpierw piszemy kod za pomocą składni CoffeeScript, a następnie kompilujemy do najzwyklejszego JavaScriptu, który to automatycznie przechodzi testy JavaScript Lint. Możliwości narzędzia najlepiej będzie przedstawić na kilku przykładach:

Instrukcje warunkowe

Programistom Ruby poniższa składania powinna wydawać się jak najbardziej naturalna. Mianowicie kod:

number = 42
opposite = true
number = -42 if opposite

da nam wynikowo:

var number, opposite;
number = 42;
opposite = true;
if (opposite) {
  number = -42;
}

Szybka definicja funkcji

square = (x) -> x * x
cube   = (x) -> square(x) * x

zamienia się w:

var cube, square;
square = function(x) {
  return x * x;
};
cube = function(x) {
  return square(x) * x;
};

Funkcje z nieokreśloną liczbą parametrów

Czasami zdarza się tak, że funkcja przyjmuje jeden parametr, a następne mogą być dowolne. Tutaj CoffeeScript wprowadza coś, co nazwane jest splats i prezentuje się tak:

gold = silver = rest = "unknown"
awardMedals = (first, second, others...) ->
	gold   = first
	silver = second
	rest   = others

Wynikowo dostaniemy jednak:

var awardMedals, contenders, gold, rest, silver;
var __slice = Array.prototype.slice;
gold = silver = rest = "unknown";
awardMedals = function() {
	var first, others, second;
	first = arguments[0], second = arguments[1], others = 3 <= arguments.length ? __slice.call(arguments, 2) : [];
	gold = first;
	silver = second;
	return rest = others;
};

Zauważcie takie rzeczy jak automatyczne pobranie metody slice z prototypu Array czy też zainicjowanie zmiennej others pustą tablicą, kiedy nie zdefiniowano parametrów dodatkowych.

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

Autor wpisu: Tomasz Kowalczyk, dodany: 13.05.2011 23:17, tagi: framework, php

Kiedy programuję aplikacje z wykorzystaniem różnego rodzaju frameworków, zawsze zastanawiam się, jak to jest, że ich twórcy potrafią wymyślić rozwiązania, dzięki którym codziennie oszczędzamy cenny czas. Na pewno jest to doświadczenie, na pewno swój wkład ma także talent danego programisty, ale istotną częścią jest także dogłębna znajomość języka programowania, w którym rzeczony framework jest tworzony. [...]

Autor wpisu: sokzzuka, dodany: 12.05.2011 15:41, tagi: php

Od czasu rozpoczęcia się wątku o PHP 5.4 na liście php.internals, jak bumerang powrócił temat adnotacji. Nasi drodzy deweloperzy doszli do nowego konsensusu (poprzedni odrzucał adnotację) i stwierdzili, że może nie są jednak one takie złe. W efekcie tego powstała nowa propozycja RFC, główne zmiany jakie w niej widzę, to zmiany składniowe (o które były największe bitwy ostatnim razem). W nowej propozycji adnotacje mają postać miksu phpDoc i formatu JSON. Nowa składnia behold:

/**
 * Foo class.
 *
 * @Entity {repositoryClass: "FooRepository"}
 * @Table  {name: "foos"}
 *
 * @author "Guilherme Blanco"
 */
class Foo
{
  // ...
}

Na pierwszy rzut oka zdaję się być kompatybilna z istniejącym rozwiązaniem (phpDoc). Jednak wszystko zależy od konkretnej implementacji parsera. Wykorzystanie:

$reflClass = new \ReflectionClass('Foo');
var_dump($reflClass->getAnnotations());

/*
array(3) {
  ["Entity"]=>
  object(ReflectionAnnotation)#1 (1) {
    ["value"]=>
    object(stdClass)#1 (1) {
      ["repositoryClass"]=>
      string(13) "FooRepository"
    }
  }
  ["Table"]=>
  object(ReflectionAnnotation)#2 (1) {
    ["value"]=>
    object(stdClass)#1 (1) {
      ["name"]=>
      string(4) "foos"
    }
  }
  ["author"]=>
  object(ReflectionAnnotation)#3 (1) {
    ["value"]=>
    string(16) "Guilherme Blanco"
  }
}
*/

Propozycja będzie jeszcze pewnie wiele razy dyskutowana, oczekujcie więc więcej informacji z tego pola bitwy ;)

Autor wpisu: sokzzuka, dodany: 11.05.2011 11:00, tagi: php

Ostatnio w pracy zajmuję się ciekawym projektem, przy okazji którego, będziemy zbierać pewne dane statystyczne. Danych tych będzie z pewnością bardzo dużo. Wobec tego bazując na swoich poprzednich doświadczeniach, zdecydowaliśmy, że najlepiej będzie przenieść nasze statystyki w chmury. Wybór padł na bardzo popularną i znaną usługę Amazona, a konkretnie – SimpleDb. Jest to nierelacyjny magazyn danych, idealnie nadający się do naszych zastosowań – nieograniczona pojemność i duża szybkość. Jego zaletą również jest to, że w każdym miesiącu dostajemy 25 maszyno-godzin i 1Gb storage’u za free. Można więc go testować w zasadzie za darmo bez ograniczeń. Ile to jest maszyno-godzina mnie nie pytajcie, ale sądzę, że do testów tak czy inaczej wystarczy :) . By używać usługi SimpleDb, najłatwiej zaopatrzyć się w jakiś napisany w PHP adapter, ponieważ „czysta” komunikacja z jej API odbywa się za pomocą REST lub SOAP-a, co może być trochę uciążliwe. Mój wybór padł na komponent w ramach Zend Framework – Zend_Service_Amazon_SimpleDb. Niestety nie ma do niego żadnej oficjalnej dokumentacji. Pomyślałem więc, że to dobry temat na wpis.

By zacząć zabawę z SimpleDb, należy przede wszystkim  utworzyć sobie konto, przy okazji czego zostanie nam wygenerowana para kluczy – accessKey i secretKey, które potem posłużą do autoryzacji przy łączeniu się z dowolnymi usługami Amazona. Muszę jeszcze nadmienić, że do korzystania z tej chmury potrzebujemy karty kredytowej i bez podania jej numeru nie uda nam się z niej skorzystać. Z innych kwestii bilingowo-finansowych warto jeszcze zwrócić uwagę na pewien szczegół – każdy xml (przynajmniej dla SimpleDb) zawiera pole „box usage”, w którym zwraca nam czas jaki zajęło chmurze wykonanie zapytania. Dzięki temu możemy odliczać sobie ile jeszcze z darmowych 25 maszyno-godzin nam zostało do zabawy ;) .

Czas przejść do najbardziej interesującej nas części – kodu. Zanim pokaże jak używać Zend_Service_Amazon_SimpleDb, pragnąłbym ostrzec Was przed jedną rzeczą, mianowicie, z tego jak korzystałem z tej klasy mam wrażenie, że jest ona jeszcze w fazie beta i jest tam sporo błędów implementacyjnych (nie mówiąc już o mało intuicyjnym API).

By skorzystać z klasy Zend_Service_Amazon_SimpleDb należy najpierw utworzyć jej instancję w następujący sposób:


$accessKey = 'SampleAccessKey';
$secretKey = 'SampleSecretKey';

$service = new Zend_Service_Amazon_SimpleDb($accessKey, $secretKey);

Gdzie secretKey i accessKey są odpowiednio kluczami, które dostaliśmy przy zakładaniu konta.

Nim wprowadzimy jakieś dane do naszej bazy należy utworzyć tzw. domenę. Czym jest owa domena ? Domena jest tak-jakby odpowiednikiem tabeli w klasycznej bazie danych, z tą różnicą, że nie ma żadnego schematu, tj. dane które w niej przechowujemy nie muszą (ale powinny) być w jakikolwiek sposób podobne. By pobrać listę domen należy wykonać następujący kod:

$page = $service->listDomains();
$domains = $page->getData();
var_dump($domains); //array(0 => 'domena1',  1=> 'domena2');

Oczywiście rozpoczynając naszą zabawę z SimpleDb nie mamy jeszcze żadnych domen utworzonych dla naszej instancji bazy. By je utworzyć należy wykonać:

$result = $service->createDomain('test');
var_dump($result); //boolean true

Gdy mamy już utworzoną domenę, możemy zapisywać dane w naszej bazie. By coś zapisać, najpierw należałoby się zapoznać ze strukturą danych jakie przyjmuje SimpleDb. Każdy „wiersz” w tej bazie składa się z identyfikatora (nazwy) oraz atrybutów. Pojedynczy atrybut dla wiersza, może mieć wiele wartości (być tablicą). Nazwę / identyfikator niestety (a może i stety) musimy wygenerować sobie sami. Osobiście moja strategia generacji ID polega na hashowaniu aktualnego czasu z mikrosekundami (microtime(true)). Skoro już wiemy jak wygląda struktura naszych danych, czas by coś wpisać.

$itemName = sha1(microtime(true));
$data = array(
    'foo' => 'bar',
    'baz' => 'boo',
    'gaz' => array(1,2,3,4,5)
);

$attributes = array();
foreach($data as $name => $values){
    $attributes [] = new Zend_Service_Amazon_SimpleDb_Attribute($itemName, $name, $values);
}
$service->putAttributes('test', $itemName, $attributes);

Jedna mała uwaga co do zapisywania pól, które mają więcej niż jedną wartość – jeżeli będzie to tablica asocjacyjna to klucze zostaną utracone. W takim przypadku najlepiej po prostu serializować takie pole (o ile nie będziemy po nim wyszukiwać).

Zapisane dane można wydobywać z bazy na dwa sposoby. Pierwszy:

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

Autor wpisu: Tomasz Kowalczyk, dodany: 10.05.2011 21:28, tagi: internet

Cygwin to bardzo przydatne narzędzie każdego użytkownika Windowsa, który chce poczuć "zew Linuksa" na swojej maszynie bez instalacji tego systemu. Jest jednak mały haczyk - nie wszystkie programy są dostępne jako wersje dla Cygwina, a te, które są, bardzo często są poukrywane w różnych dziwnych miejscach, przez co ich instalacja sprawia sporo problemów. Cygwin: Jak [...]

Autor wpisu: singles, dodany: 10.05.2011 19:45, tagi: mysql

MySQL i porównywanie ciagów z zachowaniem wielkości znaków

Zdarza się, że podczas programowania aplikacji internetowej opartej na MySQL potrzebujemy porównania z zachowaniem wielkości znaków, gdyż domyślnie porównanie wykonane jest bez zwracania uwagi an wielkość liter. Wpis ten przybliży metody, w jaki sposób można tą funkcjonalność osiągnąć.

Wprowadzenie

Zachowanie takie wynika z tego, że ogromna większość tworzonych tabel posiada ustawiony tryb porównania z końcówką ci – co znaczy nie mniej nie więcej case insensitive. Kiedy wylistujemy dostępne typy porównań za pomocą polecenia SHOW COLLATION;, otrzymamy listę bez przyrostków cs, czyli case sensitive. MySQL udostępnia kilka porównań tego typu. Wpisanie polecenia:

SHOW COLLATION LIKE '%_cs';

zwróci następujące rekordy:

+--------------------+---------+----+---------+----------+---------+
| Collation          | Charset | Id | Default | Compiled | Sortlen |
+--------------------+---------+----+---------+----------+---------+
| latin1_general_cs  | latin1  | 49 |         | Yes      |       1 |
| latin2_czech_cs    | latin2  |  2 |         | Yes      |       4 |
| cp1250_czech_cs    | cp1250  | 34 |         | Yes      |       2 |
| latin7_estonian_cs | latin7  | 20 |         | Yes      |       1 |
| latin7_general_cs  | latin7  | 42 |         | Yes      |       1 |
| cp1251_general_cs  | cp1251  | 52 |         | Yes      |       1 |
+--------------------+---------+----+---------+----------+---------+
6 rows in set (0,00 sec)

Jak widać, nie ma tutaj żadnego typu, którego moglibyśmy użyć w polskojęzycznych aplikacjach. Dlatego musimy sobie poradzić inaczej – poniżej przedstawiam kilka sposobów.

Użyjemy prostej tabeli:

CREATE TABLE demo (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(100) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Do tabeli dodane zostały dwa rekordy:

mysql> select * from demo;
+----+------+
| id | name |
+----+------+
|  1 | Foo  |
|  2 | FOO  |
|  3 | Bar  |
+----+------+
3 rows in set (0,00 sec)

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

Autor wpisu: batman, dodany: 10.05.2011 08:00, tagi: php

Nie tak dawno temu pisałem na gorąco o PHP Fog, a już są pojawiły się pierwsze interesujące tematy z tym projektem związane. Dzisiaj na Twitterze PHP Fog zadał pytanie o nieznanym mi frameworku PHP o nazwie Agile Toolkit. Poświęciłem kilka minut na przejrzenie przykładów oraz zerknąłem do licencji. Okazało się, iż twórcy frameworka wymyślili sobie, że będą pobierać za niego opłatę (i to nie małą). Odłóżcie pochodnie, albowiem dostępna jest również wersja darmowa, która różni się tym, iż nie posiada wsparcia technicznego. Niemniej żądanie sporej gotówki za framework PHP spowodowało, że krew się we mnie zagotowała i odćwierkałem, dosyć niegrzecznie, co myślę o takiej licencji. Dosyć szybko moje ćwierknięcie zostało zauważone przez osoby związane z Agile Toolkit i wywiązała się krótka dyskusja na temat frameworka. Koniec końców, ściągnąłem ATK (skrót od Agile Toolkit) i zacząłem w nim dłubać.

Po godzinie zabawy z ATK okazało się, że jest to bardzo interesująca pozycja dla osób tworzących małe stronki. Agile w nazwie frameworka jest tutaj jak najbardziej na miejscu. Byłem w stanie bez większego problemu stworzyć prostą stronę z kilkoma podstronami.

Ciekawie prezentuje się funkcjonalność polegająca na dodawaniu nowych elementów do aplikacji. ATK rozwiązał to przy pomocy metody add, która jest w stanie dodać wszystko do wszystkiego. Możemy stworzyć stronę (klasę dziedziczącą po Page) i osadzić ją jako fragment większej całości w innej stronie. Do strony możemy dodać (również przy pomocy tej samej metody add) formularz, kod HTML, model, itd.

Skoro przy modelach już jesteśmy, nie można nie wspomnieć możliwości powiązania widoku z modelem. W najprostszej postaci wygląda to następująco.

$f=$p->add('MVCForm');
$f->setModel('Employee',array('name','salary'));
if($f->isSubmitted()){
    $f->update();
    $f->js()->univ()
        ->successMessage('Employee added')
        ->execute();
}

Prawda, że proste?

Kolejnym interesującym elementem frameworka jest możliwość tworzenia skryptów JavaScript z poziomu PHP. Co więcej, mamy do dyspozycji bibliotekę jQuery, która również została opakowana w PHP.

Godzina to za mało aby poznać framework. Po tak krótkim czasie jedyne co mogę stwierdzić, to to, że nie była to stracona godzina. ATK sprawia wrażenie dobrze przemyślanego. Spróbuję stworzyć w nim coś większego i bardziej wymagającego. Jeśli ATK się sprawdzi, to w końcu będę miał coś małego, do błyskawicznego tworzenia niewielkich projektów.

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