Iker widzi Barcelonę w lusterku wstecznym

Musiał kiedyś nadejść. Dzień, w którym Iker w lusterku wstecznym nie widzi Rozpędzonego Walca, a tylko oddalający się jego zarys.

Sobotnie Gran Derbi wywoływały we mnie duże obawy. Już jakiś czas temu na blogu red. Wołowskiego pisałem, że nie zdziwi mnie jeśli Real wygra to starcie. Oczywiście, nadzieja była, poparta statystyką i wspaniałym zespołem. Niestety, nawet najlepsze zespoły miewają zadyszki, no i każda era ma swój schyłek. Nie wiem, o czym można mówić w przypadku Barcelony – oczywistym jest jednak, że ten mecz im się po prostu nie udał*.

Daleko mi jednak do deprecjonowania osiągnięcia Realu Madryt. Po pierwsze nareszcie był to mecz piłki nożnej; bez brutalności, dziwnych zachowań piłkarzy i nielubianego przeze mnie trenera. Po drugie uważam, że zagrali rewelacyjnie taktycznie. Mocny pressing, szczelna obrona, bez zbędnego biegania za setką podań graczy FCB, no i przede wszystkim z wyjątkową skutecznością w ataku. Wprawdzie można podważać pierwszego gola mówiąc o błędzie Puyola lub o ewentualnym mikrospalonym (którego sędzia nie miał prawa zauważyć), ale na pewno nie można mówić, że Real wygrał szczęśliwie. Ciężko to pisać, ale wygrał zasłużenie (Barca pomimo bardzo wysokiego procentu posiadania piłki nie dominowała w tym meczu). To nie jest tak, że madrycki klub miał 1,5 okazji i strzelił 2 gole – równie dobrze mogli dobić Blaugranę w 92 minucie, wystarczyło żeby Ronaldo lepiej przyłożył nogę. Były też inne sytuacje, w których podnosiło się ciśnienie i naprawdę nie ma co umniejszać klasy Królewskim – są mocnym zespołem i to było oczywiste, że kiedyś przerwą tę fatalną passę starć z drużyną Guardioli. Szkoda tylko, że zrobili to akurat teraz.

A może nie szkoda? Wszystko zależy od tego co wydarzy się w Lidze Mistrzów. Jeśli Barcelona, która może już sobie podarować Primera Division, skupi się na rywalizacji w Europie, przejdzie Chelsea, a później wygra finał – będzie można mówić o kolejnym historycznym sezonie, bez względu na wynik w La Liga. Słowo klucz: jeśli. Co do tego mam jednak równie duże obawy, ponieważ Chelsea zagra bardzo podobnie jak Real – obrona całym zespołem, groźne kontry, symulujący Drogba (jak już w miarę podbudował u mnie swoją ocenę, to meczem na Stamford Bridge przypomniał mi dlaczego go nie znoszę). Będą gryźć trawę by wykorzystać tę olbrzymią szansę, być może ostatnią w karierze wielu z piłkarzy tego zespołu. We wtorek czeka więc Barcelonę epicka bitwa o uratowanie sezonu, utrzymanie się na szczycie, być może o zatrzymanie Pepa.

Gdybym miał pogdybać, to zastanowiłbym się jak by to wszystko mogło wyglądać, gdyby grali Abidal (myślę, że przy nim nie padł by gol Ronaldo) i Villa (ten Villa w formie), a Pedro byłby tym fantastycznym zawodnikiem, który zdobywał gole we wszystkich możliwych rozgrywkach. Z nimi być może można by mówić o najwspanialszej Barcelonie w historii, ale bez nich jest to tylko bardzo mocny zespół. Sięgając głębiej – ciekawe jak w drużynie odnalazł by się Eto’o, którego odżałować nie mogę do tej pory (wymiana na Zlatana była chyba najgorszym transferem w historii piłki nożnej). Tak czy siak wyraźnie widać, że brakuje w katalońskiej drużynie typowego snajpera, pazernego na gole. Sanchez, przy całym moim szacunku do niego, nie jest typem goleadora i bardzo ciekawi mnie jak Więcej Niż Klub załata tę dziurę na przyszły sezon.

Bez względu na wszystko ostatnie sezony Barcelony to błogi sen okraszony tyloma trofeami, że aż ciężko w to uwierzyć. Dlatego nie ma co się denerwować, że tym razem nie udało się wygrać ligi – nie można wiecznie wygrywać wszystkiego co się da. Teraz trzeba „przyjąć na klatę” mistrzostwo Realu, pogratulować im oraz ich kibicom i trzymać kciuki za Ligę Mistrzów i za Copa del Rey (chociaż to akurat nie będzie zbyt dużym pocieszeniem w przypadku przegrania obu najważniejszych trofeów). I oczywiście za dobre okienko transferowe i przyszły sezon ;)

ps. Zabawna karykatura użyta we wpisie przypomina, że kiedyś bywało ciut lepiej ;)

* Fatalna postawa Iniesty, który tracił mnóstwo piłek. Tello może i w teorii był dobrym pomysłem, ale w praktyce zupełnie to nie wypaliło (zwód na lewą nogę i piłka poza boiskiem), wprawdzie miał dobre momenty, ale jednak myślę że nie wytrzymał rangi meczu. Valdes niezbyt dobrze zachował się przy obu golach. Puyol powinien wykopać piłką z linii bramkowej bez chwili namysłu. Xavi bez błysku w rozegraniu, zmarnował rewelacyjne podanie Messiego. Leo zagrał nieźle, ale dopadł go syndrom reprezentacyjny – musiał robić wszystko, z czego wychodziło (prawie) nic. Patrząc na jego minę wydawało mi się, że jest wściekły na partnerów z zespołu, załamany ich postawą. Alves został zneutralizowany przez Coentrao (duże zaskoczenie).

Enter: znaki nowej linii

Znaki końca linii to, wydawać by się mogło, sprawa trywialna. Zapewne wiele osób w ogóle nie ma pojęcia, że coś takiego istnieje ;) Są jednak momenty, gdy znaki te mają znaczenie i decydują o działaniu skryptu czy też aplikacji.

Sposobów na zmianę znaków końca linii zapewne jest mnóstwo, ja postaram się przedstawić te najbardziej użytkowe – z użyciem IDE i gotowych skryptów. To, który sposób najlepiej w danym momencie zastosować, zależy tylko i wyłącznie od upodobań i aktualnych potrzeb. Co innego przecież skonwertować jeden plik, a co innego napakowany nimi katalog.

Na początek troszeczkę teorii. Znaki końca linii to \r (return) oraz \n (new line), które mogą pojawiać się pojedynczo lub razem. W zależności od systemu operacyjnego ich użycie jest inne, a wyróżnić można trzy rodzaje:

  • CR – wykorzystuje tylko \r, skrót pochodzi od anglojęzycznego zwrotu carriage return (powrót karetki)
  • LF – wykorzystuje tylko \n, skrót pochodzi od anglojęzycznego zwrotu line feed (w wolnym tłumaczeniu: nowa linia)
  • CRLF – połączenie obu powyższych, wykorzystuje \r\n

Tak prozaiczna sprawa potrafi wprowadzić niemały zamęt – otwieraliście kiedyś w windowsowym notatniku pliki pochodzenia unixowego? Wszystko jest wyświetlone ciurkiem i nie można się połapać co jest gdzie. Dlatego współdzielenie danych w plikach wykorzystywanych przez aplikacje uruchamiane na różnych systemach bywa kłopotliwe i nieprawidłowa obsługa znaków końca linii może doprowadzić do tego, że coś, co teoretycznie zaprogramowane jest prawidłowo, nie będzie działało. Można też natknąć się na inne problemy związane ze znakami końca linii, jak choćby „błąd składni” w plikach po klonowaniu repozytorium Git.

Przeczytaj resztę tego wpisu »

GIT

O tym, czym tak naprawdę jest Git-Flow postaram się napisać kiedy indziej. Dzisiaj przejdę do konkretów – jak go zainstalować na Cygwinie i rozwiązać ewentualny problem z „błędem składni” pliku wykonywalnego.

Instalacja pakietu Git-Flow opisana jest bardzo telegraficznie na githubowym wiki projektu. Wprawdzie podkreślone jest, że wymagane są pakiety git, util-linux i wget, ale jedno nie jest sprecyzowane – że komenda

wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash

która instaluje Git-Flow jednocześnie klonuje repozytorium do miejsca, w którym została wywołana. Warto więc odpalić ją tam, gdzie chcemy, by takie repo się zadomowiło.

Jeśli wykonamy git flow i ukaże się usage: git flow <subcommand> z całą resztą opisu pakietu, to znaczy, że wszystko poszło dobrze i możemy korzystać z dobrodziejstw git-flow. Jednak nie zawsze jest tak kolorowo… Przeczytaj resztę tego wpisu »

QtADB

Ten wpis rozpoczyna cykl notek o aplikacjach ułatwiających zarządzanie zawartością telefonu opartego na Androidzie (bazuję na posiadanym LG GT540) poprzez komputer z systemem Windows. Jako pierwszy na tapetę idzie QtADB – bardzo ciekawy menedżer stworzony przez Polaków.

QtADB to aplikacja z kilkoma zastosowaniami, z czego jako główne wymieniłbym menedżer plików oraz aplikacji. Program posiada stosunkowo prosty, lecz przejrzysty interfejs oparty na bibliotece Qt. Nie wymaga instalacji, bo dostarczany jest jako paczka typu portable – wystarczy rozpakować i uruchomić plik QtADB.exe.

Z naszym telefonem może się połączyć na dwa sposoby: poprzez USB (wymaga włączonego debugowania USB: Ustawienia » Aplikacje » Dla programistów) lub przez wi-fi (wymaga zainstalowania w telefonie adbWireless). Połączenie bezprzewodowe na pewno jest wygodniejsze, ale po pierwsze wymaga telefonu z dostępem root (a konkretniej wymaga tego adbWireless), po drugie demonem prędkości w tym trybie program raczej nie jest… W przypadku połączenia przez USB wszystko działa szybciej, co w sumie jest nieco zaskakujące. Przeczytaj resztę tego wpisu »

Digitizer LG GT540

W pewnym momencie telefon zaczął mi świrować. Naciskałem ekran, a on reagował jakbym palec miał 3 centymetry dalej – wymazałem więc dane użytkownika, wgrałem oryginalny rom operatora i chciałem odnieść do serwisu… okazało się jednak, że okres gwarancji już minął. Pogooglowałem więc i odnalazłem problem – uszkodzony digitizer. Postanowiłem więc kupić go i wymienić własnoręcznie, a co!

Na wstępie zaznaczę – operacja udana, pacjent przeżył ;) To w razie gdyby ktoś miał wątpliwości lub posiadał wewnętrznego leniuszka, który nie pozwalałby mu na doczytanie do końca. Ale do rzeczy, jak wymienić ekran w LG GT540 Swift?

Odpowiedź nie może być jednoznaczna, bo również zdecydowanie różne są umiejętności każdego z nas. Powiem więc tak: jest z tym sporo dłubaniny, bo żeby wymienić ekran trzeba w zasadzie całkowicie rozłożyć telefon, ale jednocześnie stosunkowo proste – poza jednym krokiem, o którym za chwilę – i wykonalne dla każdego, kto nie boi się śrubokręta i majsterkowania.

Uwaga, nie odpowiadam za szkody wyrządzone w Waszych telefonach – jeśli nie jesteście pewni, że potraficie wykonać opisane tu czynności, zostawcie to fachowcom.

Przeczytaj resztę tego wpisu »

Symfony2

Jako, że jakiś czas temu w pracy na warsztat trafiła do mnie aplikacja oparta o Symfony (1.2), z którym nie miałem wcześniej do czynienia, musiałem trochę zgłębić temat i zaowocowało to tym, że spodobał mi się ten framework. Z kolei chyba stosunkowo niedawno ukazała się nowa wersja, więc chcąc zgłębić temat jeszcze bardziej, postanowiłem przygotować sobie środowisko spełniające wymagania Symfony2. I tu natrafiłem na problemy….

Już na starcie okazało się, że mam za niską wersję PHP (wymagana jest 5.3.2), więc trzeba było sięgnąć po bardziej aktualną. O ile instalacja nowej wersji WampServer 2.2 przebiegła bezproblemowo, jak również przeniesienie istniejących deklaracji wirtualnych hostów o dziwo poszło jak z płatka (no poza jednym błędem szybko wyłapanym dzięki C:\wamp_server\logs\apache_error.log), o tyle dołączony do Symfony2 skrypt sprawdzający kompatybilność z wymaganiami (symfony2/app/check.php) pokazał dodatkowo dwa ostrzeżenia. Jedno udało się wyeliminować błyskawicznie, wystarczyło włączyć rozszerzenie intl w PHP. Z drugim nie było tak łatwo.

Wprawdzie bez tego Symfony2 również by działało, ale taki komunikat:

[[WARNING]] Checking that a PHP accelerator is installed: FAILED
*** Install a PHP accelerator like APC (highly recommended) ***

a zwłaszcza „highly recommended” robi swoje ;) Podrażniło to moją ambicję i zabrzmiała nutka pedantyzmu ;) Ale do rzeczy. Przeczytaj resztę tego wpisu »

GIT

Wszelakie pliki tymczasowe, przeważnie także obrazy i inne media, dodaje się do pliku .gitignore po to by w ogóle nie były indeksowane. A co jeśli plik jest wymagany, by aplikacja działała poprawnie, ale jego zawartość może ulegać zmianie, np. w zależności od instancji lub chwilowych zmian w konfiguracji?

Gdy plik zostanie już raz zaindeksowany, można przestać śledzić jego stan usuwając wszystkie informacje z repozytorium dotyczące tego pliku, wykonując komendę git rm --cached nazwa_pliku i dodając odpowiedni wpis do pliku .gitignore. Nie jest to jednak to, co chcielibyśmy osiągnąć w przypadku plików, bez których aplikacja przestaje działać – bo co w przypadku, gdy zrobimy git clone? Nasza nowa instancja nie będzie zawierała tego pliku i grozi nam fatal error. Samo dodanie do .gitignore również nie rozwiązuje problemu, bo Git tak czy siak podpowiada zmiany w pliku i z łatwością można nieświadomie zatwierdzić zmiany w tym pliku używając git commit -a. Przeczytaj resztę tego wpisu »

GIT

Rozwlekły tytuł notki niejako obrazuje skalę mojego problemu – dłuuuugi czas męczyłem się z dziwnym zachowaniem Gita, który zamiast aktualizować aplikacje nad którymi pracowałem, aktualizował jedynie historię wersji, a katalog roboczy musiałem poprawiać ręcznie. Bardzo upierdliwa robota, gdy problem dotyczy wielu aplikacji, z których każda może mieć więcej niż jedną zdalną instancję…

To, co dla mnie było błędem Gita, okazało się przemyślaną strategią. Tak właśnie zachowuje się Git podczas wpychania zmian do aktywnej gałęzi – dla pewności zostawia nienaruszony katalog roboczy, a jego aktualizację należy wymusić ręcznie za pomocą komendy git checkout -f. Zupełnie nie skojarzyłem tej zależności i za każdym razem zastanawiałem się czemu raz katalog roboczy aktualizuje się wraz ze zmianą w repozytorium, a raz wymaga ode mnie bym logował się przez ssh i dokańczał robotę własnoręcznie. Dziś postanowiłem zwalczyć problem i proszę, sukces!

Przeczytaj resztę tego wpisu »

Firefox - about memory

Gdy Chrome był jeszcze w powijakach jednym z koronnych argumentów za tą przeglądarką była niska zasobożerność. W porównaniu do innych przeglądarek, zwłaszcza do Firefoxa, wydawał się lekki jak piórko. A jak jest teraz?

Prawdopodobnie najlepszym benchmarkiem dla przeglądarek jest…. moja żona ;) Sposób, w jaki przegląda Internet, stawia komputery i przeglądarki pod ścianą – dziesiątki, czy też setki, otwartych zakładek w kilku przeglądarkach jednocześnie. Całkiem niezły komputer potrafi tak zamulić, że na jego reakcję po naszej aktywności trzeba chwilę poczekać.

Nie jest to jednak Jej wina; trendy webowe, bazujące na ciągłym aktualizowaniu zawartości w tle (zawołania ajax), wodotryskach (przesuwane tła, zmieniane rozmiary elementów) – wszystko to realizowane jest przez setki linii kodu JavaScript. Jak łatwo można się domyślić, sporo witryn tworzonych przez domorosłych webmasterów zawiera duże partie nieoptymalnego kodu, któremu nawet najlepszy garbage collection nie pomoże. Nawet najlepsi i najwięksi gracze Internetu czasem muszą znaleźć kompromis między wydajnością, zużyciem zasobów, a tym co chcą osiągnąć. Jak bardzo JavaScript obciąża pamięć? Szybki rzut oka na about:memory i co:

Firefox - about memory

Połowa zużywanej pamięci to JavaScript! Przeczytaj resztę tego wpisu »

Website access log visualization

Wyobrażaliście sobie kiedyś log serwera jako walkę zawołań z obsługującą je maszyną, walkę realizowaną w stylu legendarnej gry Pong? Zapewne nie, ja zresztą też nie :)

Jak się jednak okazało, ktoś wpadł na tak szalony pomysł i w dodatku fantastycznie go zrealizował. Zawsze zdumiewa mnie, gdy ludzie potrafią spędzać wiele godzin nad czymś, co w praktyce nie ma wielkiego zastosowania, ale po prostu ładnie wygląda, oferuje swojemu autorowi dobrą zabawę i rozwój osobisty. Taka sztuka dla sztuki poniekąd, ale jaka ładna:

I jeszcze jak „romantycznie” się nazywa: Logstalgia ;) Bliźniaczym projektem, do którego trafiłem najpierw przeklikując się przez repozytorium w GitExtensions jest Gource. On z kolei przedstawia historię zmian aplikacji jako rozwój drzewka, z centralnie umieszczonym folderem głównym, gdzie na każdej gałęzi rosną pliki:

Genialne jest to, że autorzy commitów latają wokół drzewa jak pracowite owady. Naprawdę, w kategorii „zrobienie sztuki z czegoś trywialnego”, oba wspomniane narzędzia dostają Złote Globy i Oskary jednocześnie ;)