Category Archives: Internet

Internet webmastering

Pułapka referencji w foreach

Napi­szę o cieka­wym proble­mie, który przy odro­bi­nie pośpie­chu, nieuwagi, mody­fi­ka­cji czyje­goś kodu może dawać solidną dawkę WTF podczas testo­wa­nia (mnie dało). Żeby nie było, w doku­men­ta­cji fore­ach pisze jak byk: Refe­rence of a $value and the last array element remain even after the fore­ach loop. It is recom­men­ded to destroy it by unset().

Powiedzmy, że mamy tablicę jedno­wy­mia­rową, którą chcemy prze­ite­ro­wać w celu zmiany warto­ści. Nic prost­szego powiecie:

$array = ['arr_item1', 'arr_item2', 'arr_item3'];
 
foreach ($array as &$item) { // $item z referencją
  // modyfikuje elementy
}

Na tym etapie wszystko jest OK. Jedziemy sobie z kodem dalej.

// 150 linii niżej, kiedy zapomnieliśmy już o $item
 
foreach ($array as $item) { // $item BEZ referencji
  // robie cokolwiek z $item
}

W tym momen­cie poja­wia się WTF. Zawar­tość $array1 to arr_item1, arr_item2, arr_item2. Jeśli za drugim razem robimy jakąś agre­ga­cję danych w stylu wyli­cza­nie śred­niej czy sumy, błąd może przez długi czas pozo­stać niezau­wa­żony (mediana) lub wynik deli­kat­nie prze­ina­czony (śred­nia aryt­me­tyczna dla dużej liczby elementów).

Pyta­nie dlaczego tak się dzieje? To nie bug, to ficzer!
$item po zakoń­cze­niu pierw­szej itera­cji w dalszym ciągu trzyma refe­ren­cję do $array[2]. Wobec tego w czasie drugiej itera­cji przy­pi­suje kolejne elementy do $array[2]. Wszystko jest OK dopóki nie docie­ramy do ostat­niego elementu. Mamy tam do czynie­nia z instruk­cją w stylu „przy­pisz do $item[2] wartość $item[2]”. Jako iż $item[2] ma aktu­al­nie wartość z $item[1] to buch i mamy arr_item2.

Iteru­jąc po kilku różnych tabli­cach za pomocą tej samej zmien­nej zawsze powo­du­jemy nadpi­sa­nie ostat­niego elementu pierw­szej tablicy.

Jak się przed tym uchronić?

  • użyć unset($item) po fore­ach (najlep­sze wyjście)
  • unikal­nie nazy­wać zmienne $item (ryzy­kowny krok)
  • rozbić funk­cję wyko­rzy­stu­jącą itera­cje na kilka mniej­szych, praw­do­po­dob­nie robi kilka różnych rzeczy
Internet

Nokia USB 21M-02 Dual Band współpracuje z Aero2 i Ubuntu

Dzisiej­szy krótki wpis bardziej nadaje się na jakie­goś mikro­bloga. Nie posia­dam tako­wego, więc piszę tu. Od razu disklaj­mer: ani Nokia, ani Agito nic mi nie dały za wychwa­la­nie swoich produktów/usług. Wychwa­lam z czystej dobroci serca :-)

Niedawno przy­słali mi pocztą kartę SIM w ramach darmo­wego inter­netu z Aero2. Z reko­men­do­wa­nych przez Aero urzą­dzeń współ­pra­cu­ją­cych z usługą domi­nują same Huaweje kosz­tu­jące często powy­żej 300 zł. Posta­no­wi­łem uderzyć w nieznane i kupi­łem coś innego — tańszego. Zdecy­do­wa­łem się na zakup „gwizdka” firmy Nokia USB 21M-02 Dual Band za 199 zł w Agito.pl. Pracuję nieda­leko punktu odbioru osobi­stego w Kato­wi­cach, więc wybór był czysto prag­ma­tyczny (bo po co płacić za przesyłkę?)

Kilka słów o samym urządzeniu:

  • przyj­muje zwykłe karty SIM, więc nie radzę całkiem wyła­my­wać obudowy karty Aero do końca aby paso­wało do microSIM,
  • można zrobić z tego pendrive za pomocą karty microSD (WTF jak oni to wszystko zmieścili),
  • posiada własną pamięć, na której są instalki programu obsłu­gu­ją­cego modem pod Windows, pakiet DEB pod Ubuntu i skrypt shella dla pozo­sta­łych dystrybucji,
  • świeci ładnie na niebie­sko gdy złapie 3G.

Ogól­nie jestem trochę w szoku, że produ­cent nie potrak­to­wał użyt­kow­ni­ków Linuksa jak zwykle: „tu masz stery do Windowsa, a jak jesteś taki cwany, że używasz czegoś innego to radź sobie sam”.

Jakość darmo­wego inter­netu to dla mnie rozwią­za­nie na sytu­acje awaryjne. Po stro­nach pocho­dzisz, maila spraw­dzisz, ale YouTuba powy­żej 240p płyn­nie nie pooglą­dasz. Dla ludzi często podró­żu­ją­cych i z małych miej­sco­wo­ści jak znalazł.

Internet

Ciekawostki związane z IPv6

6 czerwca mieli­śmy oficjalny dzień urucho­mie­nia proto­kołu IP w wersji 6 — World IPv6 Launch. Przez 24 godziny ponad 1000 witryn inter­ne­to­wych dzia­łało na proto­kole IPv6. Było to pierw­sze na masową skalę wyko­rzy­sta­nie nowego proto­kołu. Oczy­wi­ście całość była raczej symbo­licz­nym wyda­rze­niem, niemniej wyzna­cza koniec pewnej epoki. Wobec kończą­cej się puli wolnych adre­sów IP całko­wite przej­ście na IPv6 jest nieunik­nione. Właści­wie to pod koniec 2011 roku stra­szono, że już się skończyły…

Dzisiaj wzią­łem na warsz­tat RFC 2460, Inter­net Proto­col, Version 6 (IPv6) Speci­fi­ca­tion, który opisuje IPv6. Wspar­łem się lite­ra­turą z uwagi na bardzo hard­co­rowy żargon RFC. Żeby nie zanu­dzać wycią­gną­łem co ciekaw­sze rzeczy. Czytać i błysz­czeć wśród geeków:

  • przez jakiś czas nie zabrak­nie nam adre­sów IP; zamiast trochę ponad 4 miliardy będziemy mieli do dyspo­zy­cji 340,282,366,920,938,463,463,374,607,431,768,211,456 adre­sów IP,
  • podsta­wowy nagłó­wek IPv6 liczy sobie 40 bajtów, z których 32 bajty stano­wią dwa 128 bitowe adresy nadawcy i odbiorcy; w IPv4 nagłó­wek „bez dodat­ków” to 20 bajtów,
  • tylko pole Version działa i nazywa się tak samo jak w IPv4,
  • nie ma pola Header Check­sum zawie­ra­ją­cego sumę kontro­lną nagłówka IP (w obec­nych czasach świa­tło­wo­dów prze­kła­ma­nia bitowe zdarzają się dosyć rzadko, a odpo­wie­dzial­ność za inte­gral­ność danych i tak pilnują sobie proto­koły wyższych pozio­mów, np. TCP ma własny checksum),
  • pole Time-To-Live w IPv4 pier­wot­nie było zapro­jek­to­wane do prze­cho­wy­wa­nia liczby sekund pozo­sta­łego „życia” data­gramu1, jednakże szybko z tego zrezy­gno­wano na korzyść prze­sko­ków pomię­dzy route­rami; polu osta­tecz­nie zmie­niono nazwę na Hop Limit w IPv6,
  • 20 bitowy Flow Label zapewni znaczną „ulgę” route­rom: dla pierw­szego pakietu stru­mie­nia zostaje wyty­czona trasa, a suma kontro­lna tej trasy zostaje zapi­sana do pola i cache routera, dzięki czemu pozo­stałe pakiety ozna­czone tak samo mogą wędro­wać tą samą trasą bez potrzeby każdo­ra­zo­wego wyzna­cza­nia drogi; inna możli­wość wyko­rzy­sta­nia pola to gwaran­to­wa­nie pręd­ko­ści trans­feru, tzn. jedne pakiety mogą mieć pierw­szeń­stwo przed innymi2,
  • pole Options z IPv4 zostało zamie­nione na łańcuch Exten­sion Headers o okre­ślo­nej kolejności,
  • maksy­malna wiel­kość prze­no­szo­nych danych to 4 GB (tzw. Jumbogram).
  1. Kevin R. Fall, W. Richard Stevens : TCP/IP Illu­stra­ted, Volume 1 : The Proto­cols. — 2 ed. Upper Saddle River, NJ (i in.), 2011, s. 185
  2. L. Dostálek, A. Kabe­lová : Under­stan­ding TCP/IP : A clear and compre­hen­sive guide to TCP/IP proto­cols. Birming­ham ; Mumbai, 2006, s. 215