poniedziałek, 26 listopada 2012

Zaslyszane w necie - blad chrystusowy

"To jest tak zwany błąd chrystusowy. Myślisz, że go przygwoździłeś, tymczasem mija parę dni i on znów wyskakuje."

Nie wiem, kto jest autorem, przeczytalam dzis to na jakiejs stronie :)

Nieplanowany odstep miedzy obrazkami

Mam sobie <figure> a w srodku 2 <img>. <figure> ma ustawiona szerokosc, zeby obrazki wyswietlaly sie jeden pod drugim. Wszystko niby gra i buczy, ale... pomiedzy obrazkami pojawila sie przestrzen. Tak na oko jakies 2 pixele szerokosci.

No ki diabel... zaczelam sprawdzac moje style, czy aby nie mam gdzies jakiegos marginesu, paddinga czy innej ramki ustawionej, ale nic, czysto.

Roywiazanie oczywiscie jest banalnie proste. Wystarczy dodac obrazkom wlasciwosc display: block; i wszystkie tajemnicze odstepy, przestrzenie itp znikaja :D

wtorek, 13 listopada 2012

CSS3 media queries nie dzialaja?!?

No wlasnie, zakodowalam layout dla wersji mobilnej naszej strony, pod zwykla przegladarka moje czary z fluid layout i CSS3 media queries dzialaja az milo. Ale zanim pokaze komukolwiek wyniki swojej pracy postanowilam sama przetestowac. No i zonk... Strona i owszem laduje sie... ale... w stylach dla szerokosci ekranu 481-980px, a skrypt JS mi wyswietla, ze ekran ma 320px.

No ki diabel??

Szukam i szukam, sprawdzam, czego mi zabraklo i...

<meta name="viewport" content="width=device-width, initial-scale=1.0">

Winowajca sie znalazl. meta viewport jest jednak niezbedne :)

wtorek, 6 listopada 2012

funkcje w JavaScript, part 4 - funkcje prywatne

W poscie zasieg zmiennych (scope) w JavaScript pisalam o zasiegu zmiennych. Tworzenie funkcji prywatnych (lub wewnetrznych - private, inner functions) dziala w opisany w wyzej wymienionym poscie sposob:
function a {
  var abc = 12;
  function b () {
    console.log(abc);
  }
  b();
}

Funkcje sa danymi, wiec mozemy je definiowac wewnatrz innych funkcji. I zachowuja sie dokladnie tak samo jak zmienne. Jesli teraz wywolamy funkcje a:
a();

to na konsoli zostanie wypisana liczba 12. Jesli natomiast sprobujemy wywolac b:
b();

to otrzymamy ReferenceError: b is not defined. Ten sam blad (tylko z nazwa innej zmiennej) pojawi sie, jesli sprobujemy wyswietlic wartosc zmiennej abc. Zarowno funkcja b jak i zmienna abc sa zdefiniowane wewnatrz funkcji a, wiec sa widoczne tylko w jej wnetrzu, a poza nia srodowisko ich nie zna.

środa, 31 października 2012

funkcje w JavaScript, part 3 - samowywolujace sie funkcje

Czyli self-invoking functions. Coz to takiego? Tak na prawde to kontynuacja tematu o funkcjach anonimowych.

Jak wyglada samowywolujaca sie funkcja? Jest to anonimowa funkcja otoczona nawiasami okraglymi, po ktorych jest jeszcze jedna para nawiasow okraglych i srednik.
(
  function() {
    // cialo funkcji
  }
)();

Jak to dziala? Otoz sama definicja funkcji anonimowej nie wnosi nic. Kod sie nie wykona automagicznie. Pierwsza para nawiasow opakowuje funkcje anonimowa, jako kod wykonywalny, a druga sluzy do przekazywania parametrow. Dosc czesto mozna spotkac sie z nastepujacym zapisem:
(
  function ($) {
    // cialo funkcji
  }
)(jQuery);

Jest to jeden z wielu sposobow na unikniecie konfliktu w przestrzeni nazw, gdy uzywa sie wiecej niz jednej biblioteki pozwalajacej na uzywanie znaku $ jako nazwy zmiennej. W pokazanym przykladzie sytuacja jest bardzo czysta. Wewnatrz funkcji znak dolara istnieje tylko jako obiekt jQuery.

Powyzszy zapis ma jedna zasadnicza wade. Ten kod mozna wykonac tylko raz, poniewaz nie ma nazwy. Uzycie funkcji anonimowej eliminuje zasmiecanie globalnej przestrzeni nazw, ale rownoczesnie uniemozliwia powtorne wykorzystanie kodu. Do czego wiec uzywa sie samowolajacych sie funkcji? Ogolnie do ustawiania srodowiska, jest to operacja wykonywana zazwyczaj raz, przy inicjalizacji.

poniedziałek, 29 października 2012

funkcje w JavaScript, part 2 - funkcje anonimowe

We wczesniejszym poscie pisalam, ze funkcje mozna definiowac, jak zmienne. Tak wiec skoro zapis:
var a = 5;

jest poprawny, tak samo zapis:
var b = function(){};

tez jest poprawny. Ale idac za ciosem, zapis:
5;

tez jest poprawny, choc nic nie wnosi. Ot sama wartosc. W takim badz razie zapis:
function(){};

tez jest poprawny, choc w takiej postaci tez nic nie wnosi. Powyzsza definicja funkcji bez podania nazwy jest okreslana funkcja anonimowa (anonymous function).

Do czego mozna uzyc takiego tworu? Najczesciej przekazuje sie jako parametr do innej funkcji (funkcje sa danymi, wiec mozna je przekazywac jako parametry), tzw anonymous callback function, lub wywoluje w specyficzny sposob.

Anonymous callback function:
function fa () {

var a = 12;

var b = function(va, vb) {
  console.log("va = " + va);
  console.log("vb() returns " + vb());
}

b(a, function(){ return a + 2;});

}

fa();

Kod stosunkowo prosty. Ot mamy funkcje fa. W srodku definiujemy zmienna a oraz funkcje prywatna b (niewidoczna z zewnatrz, ale o tym w innym poscie). Funkcja b przyjmuje 2 parametry, drugi jest funkcja. Oba parametry wyswietla na konsoli. Nastepnie wolamy funkcje b przekazujac jako pierwszy parametr zmienna a, a jako drugi funkcje anonimowa w ktorej modyfikujemy a dodajac do niej 2. Na koncu wywolujemy fa.

I tu pojawia sie pytanie, po co przekazywac funkcje anonimowa jako parametr do innej funkcji? Przeciez mozna zapisac (a + 2) i przekazac jako zwykla liczbe. To oczywiscie byl prosty przyklad. Funkcja anonimowa dziala, jak kazda inna, ma swoj wlasny scope, ale i widzi zmienne ze srodowiska w ktorym sie znajduje. Daje nam to duze mozliwosci uzywania zmiennych dostepnych i manipulowania nimi bez zasmiecania przestrzeni nazw kolejna nazwa funkcji uzyta w jednym tylko miejscu. Opakowuje ladnie kod, dzieki czemu wprowadzanie zmian jest latwiejsze.

Wyobrazmy sobie, ze mamy tablice po ktorej sie iterujemy i kazdy element modyfikujemy. Iteracja po tablicach czy obiektach jest zasobozerna. Im wieksza tablica, tym wiekszy czas wykonania iteracji i tym wiecej zasobow jest wykorzystanych. Optymalizacja w takich wypadkach polega na tym, aby ograniczyc sie do jednej iteracji i zmniejszyc czas wykonania operacji na kazdym elemencie. Najszybciej wykonuje sie kod napisany inline, ale kazdy programista z choc minimalnym doswiadczeniem wie, jak trudno jest utrzymac kod napisany inline. Dlatego wykorzystuje sie funkcje anonimowe, ktore daja swoj narzut na wykonanie kodu, ale go rownoczesnie porzadkuja i ulatwiaja wprowadzanie zmian i utrzymanie.

Jak widac, powodow uzywania funkcji anonimowych jako parametrow jest wiele, najczesciej zwiazane sa one z optymalizacja kodu i/lub jego czytelnoscia.

A tutaj przykład użycia samowywołujacej się funkcji anonimowej

piątek, 26 października 2012

funkcje w JavaScript, part 1 - sposoby definiowania

W JavaScript mamy dwa sposoby definiowania funkcji. Jeden to znany z innych jezykow sposob polegajacy na uzyciu slowa kluczowego function:
function abc () {
  // cialo funkcji
  return;
}

Drugi wymaga krotkiego wprowadzenia. W JavaScript funkcje sa nie tylko funkcjami, ale rowniez danymi, w zwiazku z powyzszym mozna je zdefiniowac, jak zmienna:
var xyz = function() {
  // cialo funkcji
  return;
};

W obu przypadkach wywoluje sie je tak samo:
abc();
xyz();

Tak wiec funcje w JavaScript sa danymi, ale specyficznymi i posiadaja dwie bardzo wazne wlasciwosci: zawieraja kod i sa wykonywalne.

Jesli uzyjemy operatora typeof na nazwach obu funkcji, za kazdym razem dostaniemy wynik "function".
console.log("abc jest typu " + typeof(abc));
console.log("xyz jest typu " + typeof(xyz));

Tak wiec mimo roznicy w sposobie definiowania jest to wciaz funkcja.

wtorek, 23 października 2012

zasieg zmiennych (scope) w JavaScript

Czytam sobie ostatnio do poduszki obiektowy JS, tak w ramach powtorzenia. Poniewaz dziergam w tym jezyku kilka lat juz coraz mniej mnie dziwi. Aczkolwiek kwestia, z ktora sobie dosc dlugo nie moglam poradzic byl zasieg zmiennych.

Zalozmy ze mamy kod:
var a = 1;
function f() {
   console.log('1. ' + a);
   var a = 2;
   console.log('2. ' + a);
}

f();

Zasieg zmiennych w JS jest ograniczony nie do nawiasow klamrowych, a do funkcji (od ES6 tylko dla słowa kluczowego var). Jesli zmienna jest w globalnej przestrzeni nazw (bez slowka var) to jest osiagalna praktycznie z dowolnego miejsca. Slowko var ogranicza zasieg, np do danego pliku czy funkcji.

Co bedzie wynikiem dzialania takiego kodu? Otoz zmienne sa widoczne w srodowiskach zawartych, ale nie na zewnatrz. Wiec jesli na zewnatrz funkcji mamy zdefiniowana zmienna a, a wewnatrz funkcji tworzymy ja jeszcze raz (slowko var), to JavaScript bedzie widzialo ta zmienna wewnatrz funkcji, jako zmienna o zasiegu tylko na te funkcje. Zaskutkuje to tym, ze pierwszy console.log wypisze nam undefined. Dlaczego? Bo wewnatrz funkcji ta zmienna JESZCZE nie ma wartości (interpreter już wie, że będzie stworzona, ale jeszce w tej linii kodu nie ma wartości; stąd dobra praktyka tworzyć WSZYSTKIE zmienne na początku funkcji/bloku kodu, żeby uniknąć takich sytuacji), wiec by default ma przypisana wartosc undefined. Drugi console.log wypisze juz, zgodnie z oczekiwaniami wartosc 2.


Zmodyfikujmy troche nasz kod:
var a = 1;
function f() {
   console.log('1. ' + a);
   a = 2;
   console.log('2. ' + a);
}

f();

Mala roznica. Wenatrz funkcji usunelam slowo var przed definicja zmiennej lokalnej a. Co to zmienia z punktu widzenia naszego programu? Wszystko. Przede wszytkim JavaScript sprawdzi, czy w zasiegu dostepnym z wnetrza funkcji nie ma juz zmiennej a. Jesli jest (jak w naszym przypadku) to zmieni jej wartosc.

Nasz program wypisze dwa razy wartosc zmiennej a widoczna wewnatrz funkcji. Za pierwszym razem bedzie to 1, a za drugim 2 (wartosc zmieniona juz wewnatrz funkcji)


To teraz tylko sprawdzenie, jak to wyglada na zewnatrz funkcji:
var a = 1;
function f() {
   console.log('1. ' + a);
   a = 2;
   console.log('2. ' + a);
}

console.log('3. ' + a);

f();

console.log('4. ' + a);

Zgodnie z oczekiwaniami zmienna istnieje w kazdym przypadku i zmiana jej wartosci wewnatrz funkcji skutkuje zmiana rowniez poza funkcja, bo operujemy na zmiennej o zakresie szerszym niz zakres tej funkcji.

niedziela, 14 października 2012

CSS3 Media Queries, IE 8 i starsze oraz fixy w js

Frontendowcy bawiacy sie w responsive design znaja pojecie media queries bardzo dobrze, podobnie jak i fluid layout. Tym razem zajmiemy sie css3 media queries i ich wykrywalnoscia przez... the winner is... IE8 i starsze, jak zwykle.

Na stronie Can I use? mozna sprawdzic dostepnosc roznych elementow CSS3 i HTML5 w roznych przegladarkach (rowniez mobilnych). Jak widac, CSS3 Media Queries nie sa obslugiwane przez IE8 i starsze (co nas w sumie nie dziwi...). To co ma zrobic frontendowiec chcacy zrobic strone zgodna ze wszystkimi zasadami i ladnie wyswietalajaca sie w roznych rozdzielczosciach?

Jak zwykle w takich przypadkach siegamy po pomoc JS. Polecam skrypt respond.js. Wystarczy sciagnac wersje mini, wrzucic do sekcji head i...

No wlasnie i wszystko zalezy od tego, czy nasza responsywna stronke piszemy lokalnie czy na serwerze. Bo jesli lokalnie, to nasze zabiegi majace na celu nauczenie IE 8 i starszych jak rozumiec CSS3 Media Queries nie odniosa zadnego skutku. Zeby cokolwiek zadzialalo, pliki musza byc serwowane z serwera.

filter: progid:DXImageTransform.Microsoft.gradient nie dziala w IE7

A zdarza sie, ze mamy, kilka dzialajacych gradientow i jeden ni z gruszki ni z pietruszki nie dziala. Co pomoze?

Dodanie wysokosci w kontenerze lub overflow:auto;.

czwartek, 11 października 2012

Puste miejsca miedzy <LI> w IE 7/8

W internecie znalazlam milion piecset rozwiazan. Ale najlepsze, bez komplikowania kodu, jest usuniecie znakow entera, spacji czy innych spomiedzy LI w kodzie.

Czyli zamiast:
<LI>text</LI>
<LI>text</LI>
<LI>text</LI>

zrobmy:
<LI>text</LI><LI>text</LI><LI>text</LI>

Juz slysze te glosy niezadowolenia, ze wtedy dluga linia, ze nieczytelne, trudne w utrzymaniu... Zgadzam sie, dlatego w ramach ulepszania kodu wystarczy zrobic cos takiego:
<LI>text</LI><LI>
text</LI><LI>
text</LI>

Gra i buczy.

czwartek, 13 września 2012

IE7 i praca na stringach

Mamy sobie string i chcemy sie po nim przeiterowac. Zupelnie automatycznie napisalam takie cos:

var max = txt.length;
for (var i = 0; i < max; i++){
  var letter = txt[i];
}

Sprawdzam w Operze, Chrome, FF, ktos tam przetestowal pod IE8. Bangla.

Nastepnego dnia mail od uzyszkodnika, ze zamiast tekstu widzi "undefinedundefinedundefinedundefinedundefinedundefined". O zesz ty... User korzysta z jakze nowoczesnej przegladarki IE7. Postawilam Viste na virtualboxie i testuje. Fakt... nie bangla jak trzeba.

Internet Twoim przyjacielem. IE7 nie umie poruszac sie po stringu przy uzyciu indexow, najpierw trzeba mu string zamienic na tablice...

txt2 = txt.split('');

No coz, czlowiek uczy sie cale zycie.

wtorek, 11 września 2012

rekruterska akwizycja

Dzwoni rekruter. Odbieram. Wysluchuje przydlugiego wstepu z jaka to zajebista oferta do mnie dzwoni. Gdy tylko trafia sie opcja wtracenia czegos od siebie, prosze zeby zadzwonil/a po 17. Pada pytanie, czy jestem w pracy, potwierdzam (liczac na zrozumienie, ewidentnie gleboko nieslusznie) i ponawiam prosbe. Pada kolejne pytanie czym sie zajmuje, wiec cedze przez zacisniete zeby, zeby zadzwonil/a po 17 i nie czekajac na odpowiedz mowie 'bye' i przerywam polaczenie. Dlaczego rekruterzy zachowuja sie jak nachalni akwizytorzy?? Czy to takie dziwne, ze ktos bedac w pracy nie chce rozmawiac z rekruterem o innej 'incredible opportunity'??

poniedziałek, 10 września 2012

Goraco...

Ostatnie podrygi nieswiezej ostrygi... Lato sie konczy, w zwiazku z powyzszym na zewnatrz mamy jakies 30 stopni, a na naszym pracowym poddaszu jakies 35... i temperatura rosnie, bo sloneczko akurat swieci w pape, ktora pokryta jest nasza czesc dachu, tudziez w nasze szybki :P

Kilka miesiecy temu przeprowadzilismy sie tu i... w upalne dni, nie dalo sie wytrzymac. Najpierw wschodnia strona biura nie dzialala, pozniej moja, czyli zachodnia. Masakra. Kilka dni temu na zewnatrz bylo kolo 10 stopni, padalo i wial chlodny wiatr. Sciany wychlodzily sie momentalnie i ciagnelo od nich zimnem... Siedze obok okna i kaloryfera. Mam nadzieje, ze zima beda grzali na pelen sicher, bo inaczej ja tu uswirkne z zimna.

Poki jest goraco radzimy sobie za pomoca wentylatorow, ale co tu sie bedzie dzialo, jak temperatura spadnie ponizej 0 to nawet myslec nie chce :P

czwartek, 30 sierpnia 2012

Impreza firmowa

Wczoraj firma urzadzila nam Sommerfest. Nikt tutaj nie nazywa tego impreza integracyjna, bo integracja lezy u samych podstaw funkcjonowania tej firmy, to po prostu impreza letnia.

Calosc startowala o 19 w jakims tajemniczym miejscu (dopiero wczoraj tuz przed wyjazdem dostalismy na maila mapki z trasa dojazdu i powrotu). Od 17 w firmie zapanowalo kompletne rozluznienie. Ludzie snuli sie grupkami i zywo rozmawiali, komputery powoli byly wylaczane a ostatnie spotkania konczone. Wreszcie o 18 zapakowalismy sie w 4 autka i w droge.

Dojazd (na kompletne peryferia Berlina, gdzies na polnocy) zajal nam kolo 40 minut. Dojechalismy i... och... Wszystkim wyrwalo sie zduszone westchnienie. Naszym oczom ukazal sie tor wodny, z wyciagiem i linkami (cos jak kolejka orczykowa dla narciarzy). Narty wodne.

Osoby zainteresowane (wiekszosc) wskoczyla w stroje kapielowe (jak sie dowiedzielismy o tych strojach to snulismy domysly, miedzy innymi pojawila sie sugestia, ze to bedzie nurkowanie z rekinami :D), wypozyczyla (w zastaw za imienny dokument, ja dalam karte ubezpieczeniowa, bo ambitnie zadnego id ze soba nie wzielam) piankowy kombinezon, kask i kamizelke, pobrala sprzet (narty) i zaczelismy nauke.

Najpierw Panowie zafundowali nam krotkie szkolenie, jak startowac, co kiedy robic i takie tam. Wiedza teoretyczna to jedno, a zastosowanie jej w praktyce to cos zupelnie innego. Ustawilismy sie w kolejke i wystartowalismy, po kolei w odpowiednio duzych odstepach, zeby w razie wywrotki jeden drugiemu krzywdy nie zrobil.

Przyznam sie bez bicia, ze moje umiejetnosci narciarskie jakies tam sa, ale tutaj, to pierwsze szarpiecie na starcie powodowalo, ze lezalam jak dluga w wodzie. Ale mili Panowie z obslugi i na taka sierote, jak ja, byli przygotowani. Dostalam duza szeroka deske, wylozona miekka guma, na ktorej sie klekalo. Bingo :D. Z tym juz sobie poradzilam i wykonywalam 3/4 toru... niestety na ostatnich lukach szarpiecia, gdy linka przeskakiwala, byly tak silne dla mnie, ze nie dawalam rady.

Ale co tam, po wywrotce, zbieralo sie sprzet i plynelo do brzegu. Tam w niewielkich odstepach lezaly maty, z progami o ktore mozna bylo zaprzec stopy i wdrapac sie na brzeg. Brzeg wylozony byl kamieniami, wiec trzeba bylo korzystac z mat, a maty, mimo progow sliskie byly jak jasna cholera :D, wiec kupa smiechu byla nawet z samego wypelzania z wody.

Od godziny 19 osrodek byl zarezerwowany tylko dla nas. Dwaj Panowie z obslugi toru byli tylko dla nas, smiali sie i zartowali razem z nami. Obaj mowili plynnie po angielsku, co stanowilo dla naszej mieszanej zalogi zasadniczy plus. Tor byl czynny do 21.

Od 19 mielismy dostepny bar z napojami (poza twardymi alkoholami, schwepsem i redbullem), o 21, jak zamkneli tor, otwarto kuchnie, czyli olbrzymi buffet z grillowanym miesem, warzywami, salatkami, pieczonymi ziemniakami, owocami i deserem panna cota. Jedzenie bylo przepyszne, a wczesniejszy wysilek skutecznie podbudowal apetyty. Jednak mimo wszelkich wysilkow nie udalo nam sie zjesc wszystkiego.

Impreza byla swietna, bawilismy sie przednio (nawet ci, ktorzy z roznych powodow zostali na brzegu), smialismy sie non stop. Ludzie, mimo iz spedzaja ze soba 8-9 godzin dziennie chetnie rozmawiali na rozne tematy, rowniez zahaczajace troche o prace. Firma wykazala sie pelnym zrozumieniem i bez oporow dala cale lub pol dnia wolnego na dzis dla wszystkich chetnych :)

To byla najlepsza integracja, jaka widzialam. Zadnych wymuszonych zabaw, ot zespol (zaproszenie dostaly nawet osoby, ktore dopiero zaczna z nami prace (maja juz podpisana umowe) jak i te, ktore odeszly od nas na przestrzeni ostatnich miesiecy) bawil sie, jadl i pil razem. Kazdemu kibicowalismy i nagradzalismy brawami i okrzykami zarowno udane starty jak i te zakonczone kapiela :)

Bylo genialnie, juz nie moge sie doczekac imprezy za rok :D

niedziela, 26 sierpnia 2012

jak zlikwidowac podwojne ramki w miejscu stykania sie dwoch elementow?

Wlasciwosc border-collapse: collapse; rozwiaze wszystkie Wasze problemy :) U mnie przy okazji zmotywowala przegladarki, zeby w ogole pokazywaly ramki dla elementu tr (cos mi sie skonfliktowalo w baaardzo starych cssach).

środa, 22 sierpnia 2012

ready... steady... go!!

Long long time ago, in a galaxy far away...

Maybe not in a galaxy, but it was long time ago, when I've played Deathmaze first time. What it is? Nice RPG for long winter evenings made by Encore 33 years ago. Here you can read something more about this.

So... After 2 years of thinking about this I just started to build browser game based on Deathmaze. So wish me luck and check my progress here on my blog :)

poniedziałek, 20 sierpnia 2012

Nadgorliwy rekruter

Kilka dni temu nawiazal ze mna kontakt niejaki James z firmy rekrutacyjnej. Zafascynowany moimi osiagnieciami (w sumie to nie do konca rozumiem w czym rzecz, 12 lat doswiadczenia brzmi dumnie, ale bez przesady) zaczal sie dopytywac czego szukam. Pierwszy zonk zaliczyl na samym poczatku rozmowy, albowiem stwierdzilam, ze nie szukam pracy. Co prawda mam profil na linkedIn i monsterze, ale pracy nie szukam, bo obecna mnie satysfakcjonuje.

Mam wrazenie, ze to co powiedzialam nie miescilo sie mu sie w glowie, ale nie dyskutowal ze mna, tym bardziej, ze dodalam, ze jestem otwarta na nowe mozliwosci, o ile beda ciekawe i rozwijajace, zwlaszcza w zakresie Agile a dokladniej Scruma.

Wyslalam mu swoje CV, probke kodu i... nastepnego dnia (czwartek) zadzwonil, ze wyslal moje CV do jakiejs firmy i ze chca sie ze mna spotkac, najlepiej teraz zaraz. Powiedzialam, ze jak teraz zaraz to zeby wyslal mi opis stanowiska i nazwe firmy i w piatek po 12 moge sie przejsc. Przemilczalam fakt, ze bardzo mi sie nie spodobalo, ze wyslal moje CV bez uprzedniej konsultacji. W sumie w obecnej firmie pracuje tylko dlatego, ze Andy zrobil dokladnie to samo.

Kilka godzin pozniej James zadzwonil ponownie. Druga firma chce ze mna gadac. Odmowilam drugiego interview w piatek i ustawilismy rozmowe przez skype w poniedzialek. Dopiero w piatek rano mialam czas zeby wreszcie dokladnie przyjrzec sie wymaganiom na stanowiska, na ktore wyslal moje CV. Szczerze mowiac szlag mnie trafil. Napisalam mu, ze nie spelniam podstawowych wymagan (bardzo dobra znajomosc Zend Framework i TDD) i ze uwazam, ze powinnismy odwolac obie rozmowy. Chwile pozniej zadzwonil. Probowal mnie przekonywac. Wiec wprost powiedzialam, ze te oferty nie sa niczym specjalnym. Ot kolejne oferty dla Senior PHP Developera. Nie ma w nich niczego, co mogloby mnie skusic, zebym myslala o zmianie pracy.

Na Jamesa podzialalo to jak plachta na byka. Argumentowal, ze o tym, co firma moze mi zaoferowac, dowiem sie na rozmowie. Na moje pytanie po co tam mam isc skoro w opisie stanowiska nie bylo niczego, co mogloby mnie zainteresowac i dodatkowo nie spelniam podstawowych wymagan stwierdzil, ze przeciez opis stanowiska jest ogolnymi wytycznymi i ze jesli firma po obejrzeniu CV chce ze mna rozmawiac to powinnam isc.

Rozmawialismy chyba ze 20 minut. Do Jamesa nie docieral fakt, ze Zend Framework jest podstawowym srodowiskiem, w jakim firma pracuje, wiec nie przyjma mnie na stanowisko senioralne, co najwyzej zanotuja co umiem i wrzuca w baze danych. A nie o to mi chodzi i nie chce marnowac swojego czasu i dwoch CTO. James byl jednak nieprzejednany. Uparl sie.

Koniec koncow wprost mu powiedzialam, ze to nie sa stanowiska, ktorych szukam. Ze czuje, ze do nich nie pasuje, a jako, ze mam prace, to nie chce sie zmuszac. James sie chyba wkurzyl, bo mi wygarnal, ze go rozczarowalam. Na moja slaba obrone, ze powinien mnie najpierw spytac zanim gdziekolwiek wysle moje CV dowiedzialam sie, ze nie to jest tematem rozmowy. Dodatkowo rzucil, ze w ten sposob postepujac nigdy nie znajde pracy (przeciez ja nie szukam pracy...) a on nie chce miec z tym nic wspolnego i odwoluje moje spotkania.

Tak wiec piatek mialam wolny, dzisiejszy wieczor tez. James sie do mnie nie odzywa, a ja realizuje w pracy kolejny projekt.

Tylko skad sie biora tacy nawiedzeni rekruterzy?

piątek, 3 sierpnia 2012

Po deszczu

Opera i document.write() w funkcji pod onclick

Siedzal sobie w jirze taki bug, ktory wreszcie przypadl mnie do rozwiazania. Na naszej stronie mamy kilka linkow, ktore w onclick maja pewna funkcje, nazwijmy ja myFoo().

Po kliknieciu w link, funkcja powinna zrobic swoje, zwrocic true i user powinien przejsc do wskazanej w atrybucie href strony. I owszem, tak sie dzialo wszedzie, ale nie w Operze. Opera, przy linkach z ta konkretna funkcja w onclick, stawala deba i odmawiala wspolpracy pokazujac pusta strone.

Juz jakis czas temu odkrylam, ze to zachowanie Opery bylo forma protestu na document.write(), ktory w opisywanej funkcji znajdowal sie tuz przez return true; Ewidentnie true nie bylo tym co ta funkcja wedlug Opery zwracala. Zakomentowanie document.write() przywracalo Operze zdolnosc dzialania.

Dzis (w sumie piatek, bug fixing day) wzielam ten task na tapete. Kolega z biurka obok zasugerowal, zeby document.write zamienic na ajaxa (w document.write znajdowal sie img, wiec zeby osiagnac ten sam efekt trackingowy, mozna by adres obrazka wywolac ajaxem). Doszlam do wniosku, ze jak nie bedzie innego wyjscia, to siegne po ajaxa, ale poki co poszukamy czegos prostszego.

Zasiegnelam opinii internetu i skorzystalam z sugestii zamieszczonej na jednej z grup. Zamienilam document write na operacje na DOM. Poprostu dodalam ten obrazek do kontenera body. Opera pochwalila mnie za ten pomysl prawidlowym dzialaniem, a ja wyslalam task do testow :)

Zabawy z kodem napisanym kilka lat temu i to niekoniecznie przez osobe, ktora ma o tym jakies pojecie to dla mnie nieustajace zrodlo nowej wiedzy na temat przegladarek, roznic miedzy nimi oraz tego, jak kodu nie powinno sie pisac.

wtorek, 17 lipca 2012

ladowanie elementow po zaladowaniu strony

Nie wszystkie elementy strony powinny pojawic sie w tym samym momencie. Jedne sa wazniejsze, jak na przyklad menu, tresc strony itp, a inne mniej wazne - np reklamy, dodatkowe integracje. Co wiecej, dodatkowe elementy najczesciej nie powinny byc widziane przez googla. Tak wiec upieczemy 2 pieczenie przy jednym ogniu.

W firmie w ktorej pracuje uzywamy albo vanilla JS albo jQuery. jQuery nie oferuje obslugi zdarzenia onLoad. jQuery.ready() jest PRAWIE tym o co nam chodzi, ale nie do konca. Jesli rzucimy okiem na zakladke 'net' w firebugu, to dosc wyraznie widac, ze dzialania wykonywane w ramach tej metody sa zaczynane jeszcze w trakcie ladowania strony. A nie o to nam chodzi.

Tak wiec skorzystamy z vanilla JavaScript:

if (window.attachEvent) {window.attachEvent('onload', myFoo);}
else {window.addEventListener('load', myFoo, false);}


Innymi slowy pod event onLoad podpinamy wykonanie funkcji myFoo. Funkcja oczywiscie musi byc zdefiniowana (najlepiej przed zaprezentowanym powyzej kodem).

poniedziałek, 16 lipca 2012

Programista kontra ajax, czyli 'dlaczego nie dziala?'

Ostatnio ajax to co najmniej polowa, jak nie wiecej wyzwan, jakie mam w pracy. Postanowilam zebrac to wszystko jakos do kupy i napisac mini poradnik dla osob ktore musza z ajaxem zawrzec blizsza znajomosc.

Jesli napisalismy request ajaxowy, ktory powinien cos zwrocic a nic sie nie dzieje to powinnismy:
1. sprawdzic, czy przekazany adres w ogole odpowiada, np kopiujac go do przegladarki;
2. sprawdzic w firebugu czy innym srodowisku wspomagajacym prace dewelopera, czy JS nie rzuca nam jakims bledem;
3. jesli oczekujemy jsona, to trzeba sprawdzic, czy dane sa wyslane jako application/json. Kazdy typ danych ma swoj content-type, z jakim serwer powinien go zwrocic;
4. jesli request jest wysylany do strony w innej domenie lub subdomenie to jedyny sluszny typ danych to jsonp, a parametry mozna przeslac tylko getem (hint dla userow jQuery - w porzypadku cross-domain zapytan najlepiej mi dziala metoda jQuery.getJSON());
5. przegladarka cache'uje js, wiec warto dobrze odswiezac strone podczas sprawdzania rezultatow.

To tyle. Mnie zabawa za zapytania pomiedzy domenami zajela 2 dni... ale jestem bogatsza o te wiedze :)

czwartek, 7 czerwca 2012

zmiana gildii

Przerzucilam Wronke na Burning Legion i to na strone Hordy. Jest teraz Blood Elfka :D. Od razu dostalam inva do gildii, z ktora w nocy gadalam. Inna gildia tez sie do mnie odezwala, zobaczymy co z tego wyjdzie. Dzis najprawdopodobniej pierwszy raid z nowa gildia i to od razu 25. Chyba przestane spac, bo to stanowczo zajecie mocno przereklamowane :P

środa, 6 czerwca 2012

Nocne przemyslenia

Jakoś ostatnio często wracam w domu myślami do problemów które rozwiązuję w pracy. Jutro mam tech call z agencją reklamową z Hiszpanii w sprawie reklam, jakie chcą u nas zamieszczać. Jedną taką dziś nam wysłali. Na serwerze testowym nie zabanglała, live (szybki test) też nie. Co gorsza, jak próbuję wszystko wrzucić w zdarzenie onload to już totalnie nic nie działa... jak wrzucam na żywca w kod, to co prawda biblioteki się doładowują, ale strona mieli się kilka ładnych sekund dłużej. Nasz spec od SEO, SEM itp nie będzie zachwycony...

wtorek, 5 czerwca 2012

po przerwie :)

Od lutego pracuje w dooyoo GmbH jako, uwaga, frontend developer :D. I nawet jakos idzie :) Bede teraz czesciej pisala notki z racji tego, ze codziennie borykam sie z jakimis problemami powiazanymi z css i js.