Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: Śpiechu, dodany: 16.05.2012 19:26, tagi: php

Od tygodnia na poważnie wziąłem się za rozpracowywanie protokołów sieciowych. Dzisiaj schodzimy na poziom najniższy jaki się da w programowaniu, czyli zer i jedynek. Ja jako osoba za 2 miesiące rozpoczynająca zawodowo przygodę z programowaniem (ojej, wydało się ;-) ) muszę mieć dosyć dobre pojęcie jak to się dzieje, że wpisuję adres www w pasku adresu przeglądarki, naciskam enter i pokazuje się Fejsbuk. Oczywiście zwykli użytkownicy internetu nie muszą wiedzieć jak to dokładnie działa w myśl zasady „nie muszę być mechanikiem samochodowym żeby jeździć autem”.

Wobec tego na warsztat wziąłem na początek rzecz dosyć prostą: ICMP, a nawet tylko jego wycinek pod nazwą Echo request/Echo reply. Komunikaty ICMP stanowią podstawę działania internetu. Każda maszyna podłączona do sieci potrafi zadawać pytania i otrzymywać odpowiedzi w postaci ICMP. Tak naprawdę zdubluję funkcjonalność wbudowaną w każdy system operacyjny pod powszechnie znaną nazwą ping.

Ręczne tworzenie pakietów w PHP nie ma oczywiście większego sensu poza edukacyjnym (no chyba, że tworzymy coś nietypowego lub dostosowujemy się do już istniejącego protokołu). Jeśli potrzebujemy coś „pingnąć”, wywołujemy polecenie ping shella z poziomu skryptu PHP i tyle.

W Gist zamieściłem klasę gotową do użytku. Na Linuksie będzie problem z jej odpaleniem, gdyż bez roota nie wywołamy funkcji socket_create(). Ten temat jest na tyle ciekawy, że zostawię sobie na następny wpis.

Sama struktura protokołu jest dosyć prosta. Mamy 6 elementów:

  • 8 bitów typ żądania (0x08 w przypadku echo request, 0x00 w przypadku echo reply),
  • 8 bitów kod żądania (0x00),
  • 16 bitów suma kontrolna (tzw. internet checksum, o którym trochę niżej),
  • 16 bitów identyfikator (losowa liczba z zakresu 0x000 - 0xFFFF),
  • 16 bitów nr sekwencyjny (0x00),
  • 8– bitów dane (znaki ASCII).

Operując niskopoziomowo musimy zaprzyjaźnić się z funkcjami pack() i unpack() w celu stworzenia i odczytu reprezentacji bitowej ciągu. W przypadku ICMP będzie to wyglądało tak:

const PACKET_REQUEST_TEMPLATE = 'CCnnnA*';
const PACKET_RESPOND_TEMPLATE = 'Ctype/Ccode/nchecksum/nuid/nseq/A*message';

Widać, że 1 bajt możemy odzwierciedlić w postaci typu unsigned char, a 2 bajty w postaci unsigned short.

Teraz może nasunąć się pytanie jak wypełnić pole checksum, skoro jest gdzieś w środku? Odpowiedź jest prosta: w pole wpisujemy tymczasowo 0x00, obliczamy sumę kontrolną dla całości, a następnie zastępujemy wynikiem. Jest to dokładnie 3 i 4 bajt. Jak obliczyć sumę kontrolną? Jest do tego RFC z 1988 r. pod nazwą Computing the Internet Checksum. Jednak zanim zniechęcicie się suchym żargonem informatycznym wytłumaczę po ludzku:

  1. Cały pakiet ćwiartujemy na kawałki po 16 bitów,
  2. sumujemy wszystko,
  3. jeśli w wyniku powstaje nam jakaś nadwyżka w postaci 17 i więcej bitu, odcinamy ją, a następnie dodajemy do pozostałych 16tu,
  4. ponownie sprawdzamy czy nie powstała nam nadwyżka,
  5. odwracamy wynik.

Zapis w PHP:

protected function computeChecksum($packet) {
 
  // treat the whole packet as 16 bits unsigned short integers
  $seqPer16bits = unpack('n*', $packet);
  $sum = array_sum($seqPer16bits);
 
  // if there is a carry above 16 bit, add it at the beginning
  $sum = ($sum >> 16) + ($sum & 0xFFFF);
 
  // double check if there is no new carry after previous addition
  $sum += ($sum >> 16);
 
  // return 16 bits negate
  return pack('n', ~$sum);
}

Jak „wkleić” wynik w dobre miejsce? Mała sztuczka:

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

Autor wpisu: singles, dodany: 06.05.2012 19:51, tagi: php

„Słyszałem, że programiści dobrze zarabiają, to kupię sobie jedną książkę, naucze się i ja też będę tyle zarabiał. W końcu jestem zaj****sty. ” Niektórzy z Was tak myślą. Naprawdę. Po przeprowadzeniu ponad 20 rozmów kwalifikacyjnych, nie przychodzi mi do głowy inne wyjaśnienie fenomenu tego, co się dzieje podczas rekrutacji. Albo ze mną jest coś nie tak, a nie z tymi, z którymi rozmawiam.

Wpis ten kieruję raczej do początkujących programistów (aczkolwiek, wg ich CV to wcale takimi nie są) planujących szukać pracy. Nie będzie tutaj nazwisk (chociaż niektóre pamiętam do dzisiaj) – jednak niektóre sytuacje (w tym wszystkie cytaty) opisane sytuacje prawdziwe. Jeśli to czytasz, a miałeś podobą sytuację (a jest nawet bardzo mała szansa, że jeden z przypadków jest właśnie o Tobie), to mam prośbę – nie obrażaj się na mnie, tylko zrób coś dla siebie – wyciągnij wnioski.

Wpis oczywiście 100% subiektywny, przedstawiający MOJE podejście do kandydatów na rozmowie. Nie twierdzę, że jest ono jedyne słuszne – jest MOJE. Tylko tyle i równocześnie aż tyle.

Tak więc, lecimy z listą „grzechów głównych” programistów popełnianych na rozmowach kwalifikacyjnych (nie ogólnie, to temat na inny wpis).

Papier toaletowy

Tak, to Twoje CV. I nie mam na myśli tego, do czego służy, bo nie ma takiego przeznaczenia jak papier toaletowy. Mam na myśli raczej jego długość. Ogólnie, ludzie na siłę próbują wcisnać tutaj jak najwięcej. I robią to na dwa sposoby.

Wersja pierwsza: opisują każdą firmę, w której pracowali na pół strony (w tym takie rzeczy, jak przerabianie strony internetowej na temat kota szefa, bo ten tak go uwielbiał, że zrobił mu takową). Z tego wychodzi 8 stron doświadczenia, którego nie mam ani czasu i ochoty czytać. A jeśli kandydat nie ma dużo doświadczenia, a ma na liście ma sporo firm, to zastanówcie się – jakbyście to zinterpretowali?

Wersja druga: wypisują rzeczy, które są totalnie niepowiązane z pracą, którą chcą dostać – np. stanie na promocji mleka dla dzieci w Tesco 3,5 roku temu jak był studentem. Nie interesuje mnie to. Jeśli zależy mi na dużym doświadczeniu, to i tak ten fragment pominę, a na resztę spojrzę podejrzliwie, skoro ktoś na siłe dodaje coś jeszcze.

Problemy z liczeniem

Dla tych, którzy piszą ile mają lat doświadczenia w danej technologii. Na przykładzie i krótko.

Swój pierwszy skrypt PHP napisałem jakoś w roku 2002 w technikum. Potem nie pisałem w nim kilka lat. Pracuje programując w PHP powiedzmy od roku 2007. To nie znaczy, że mam 10 lat doświadczenia w PHP, tylko ok. czterech.

„Oooo. Mogę wszystko!”

Dosłownie. Ile już CV widziałem, gdzie ludzie programowali w 1532 językach i w ogóle znali wszystkie technologie (oczywiście, wszędobylski Pascal). Patrząc na takie CV często zastanawiam się, czy na takiej rozmowie nie powinniśmy się zamienić miejscami i to ja nie powinienem być po drugiej stronie biurka. Do czasu, aż rozmowa się nie zacznie.

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

Autor wpisu: Łukasz Socha, dodany: 06.05.2012 10:19, tagi: php

pobierz w .pdf(przeznaczone do wydruku)

PHP ze względu na swoją specyfikę (brak wskaźników) nie ułatwia tworzenia abstrakcyjnych struktur danych, takich jak drzewa, grafy (możemy opierać się tylko na tablicach). Tworząc aplikacje internetowe relatywnie rzadko istnieje potrzeba użycia bardziej zaawansowanych struktur danych (Ba! Programiści piszący tylko w PHP w znacznej części nie słyszeli nigdy o B-Drzewach, drzewach AVL, grafach i innych tego typu strukturach). Mimo tego warto zaznajomić się z typami struktur jakie oferuje podstawowa biblioteka SPL.

Lista dwukierunkowa

Lista dwukierunkowa jest jedną z najprostszych struktur. Umożliwia przemieszczanie się po liście do przodu oraz do tyłu. Dlaczego do tego nie użyć zwykłych tablic? W PHP tablice są dynamiczne, więc nie ogranicza nas ich stały rozmiar. Jednak, jeżeli chcielibyśmy wstawić element pośrodku, musielibyśmy przesuwać pozostałe elementy tablicy co nie jest zbyt wygodne.

Jeżeli chcemy stworzyć listę dwukierunkową wystarczy zainicjować obiekt klasy SplDoublyLinkedList.

Kolejka

Kolejka rożni się od listy tylko tym, że dane pobierane są z początku kolejki, a zapisywane na końcu (bufor typu FIFO, First In, First Out; pierwszy na wejściu, pierwszy na wyjściu).

Jeżeli chcemy stworzyć kolejkę wystarczy zainicjować obiekt klasy SplQueue.

Kolejka priorytetowa

Kolejka priorytetowa jest szczególnym przypadkiem kolejki. Dodając element podajemy wartość priorytetu, według którego kolejka jest uporządkowana. Na wyjściu mamy element o najwyższym priorytecie.

Jeżeli chcemy stworzyć kolejkę priorytetową wystarczy zainicjować obiekt klasy SplPriorityQueue.

Stos

Stos jest strukturą danych, w której dane dokładane są na wierzch stosu i z wierzchołka stosu są pobierane (bufor typu LIFO, Last In, First Out; ostatni na wejściu, pierwszy na wyjściu). Ideę stosu danych można zilustrować jako stos położonych jeden na drugim talerzy – nowy talerz kładzie się na wierzch stosu i z wierzchu stosu zdejmuje się kolejne talerze. Elementy stosu poniżej wierzchołka można wyłącznie obejrzeć, aby je ściągnąć, trzeba najpierw po kolei ściągnąć to, co jest nad nimi.

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

Autor wpisu: Kamil, dodany: 02.05.2012 01:21, tagi: php

W ostatnim czasie odbyła się konferencja 4Developers, w której miałem okazję uczestniczyć. W poprzednim wpisie napisałem kilka słów o tej konferencji, m.in. opisałem tematy prelekcji. Teraz wypadałoby napisać kilka słów podsumowania :-) Muszę jednak dodać, iż jest to moja pierwsza konferencja i nie mam porównania do innych tego typu spotkań (o ile to w ogóle [...]

Autor wpisu: bastard13, dodany: 01.05.2012 20:38, tagi: oop

O tym, że warto tworzyć własne wyjątki pisałem już tutaj. Dzisiaj pozwolę sobie na kontynuację tematu dotyczącego wyjątków, a mianowicie będzie kilka słów na temat tego czy i dlaczego warto otaczać wyjątki niskiego poziomu. Czytaj więcej »
Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.