Od dobrych paru tygodni mam jakiś wstręt do androidowych wnętrzności. Po części to efekt presji rzeczywistości, po części – jakaś głupia blokada. Waham się czy przejść już na kolejną wersję Androida (Gingerbread czyli 2.3) czy pozostać z FroYo. Jednak odłóżmy rozterki 'młodego’ wyrobnika na bok i zajmijmy się tępieniem robali czyli dezynsekcją właśnie.
Chyba przedostatnia wersja Androidowego ROMu Laszlo opublikowana na forum XDA miała dość ciekawy błąd mianowicie nie widziała aplikacji zainstalowanych na partycji Ext.
Dorabiając z Fireratem natywną obsługę SdExt prawie w ogóle nie zwracaliśmy uwagi na to czy stosowna partycja karty w ogóle istnieje (o podmontowaniu jej we właściwym miejscu nawet nie wspomnę). Ubocznym efektem (i, do pewnego stopnia, powodem moich programistycznych wypocin) był fakt, że telefon potrafił wpadać w bootloop (czyli w kółko się restartował).
Pierwszym krokiem było zmodyfikowanie Volda (VOLume Daemon – usługa systemowa zarządzająca 'dyskami’), tak by montował odpowiednią partycję pod /sd-ext i sprzedał informację o sukcesie (lub porażce) reszcie systemu. Jak już umiał przekazać informację to trzeba było sprawić by framework wiedział co z tą informacją zrobić i tak powstała funkcja o nazwie getSdExtState(). Tak prosta, że nie sposób popełnić w niej błędu. Od razu też wykorzystałem ją do sprawdzania dostępności /sd-ext przed próbą skanowania zainstalowanych tam aplikacji przy starcie systemu. Kawałek kodu tak trywialny, że nawet nie przyszło mi do głowy jakieś większe testowanie.
if (Environment.getSdExtState().equals(Environment.MEDIA_MOUNTED)) { scanDirLI(mSdExtInstallDir, PackageParser.PARSE_ON_SDEXT, scanMode); }
Jak podmontowane to skanuj, jak nie – to nie. Prawda, że proste? W samym frameworku jest parę newralgicznych miejsc (związanych z instalacją aplikacji) w których użyłem identycznego testu. Świat stał się lepszym miejscem :-) a ja mogłem się zająć dorabianiem informacji o SdExt w Ustawieniach czy czymś takim. Mniej więcej w tym momencie Laszlo zapewne zsynchronizował swoje źródła z moimi i wypuścił na świat kolejną wersję swojego ROMu. Chyba w sobotę Firerat dał mi znać na Twitterze, że ludzie mają kłopoty z Apps2SdExt na najnowszym FbL. Zerknąłem na forum i, na podstawie zamieszczonych tam postów, doszedłem do wniosku, że dochodzi do tzw race condition. Vold działa asynchronicznie względem reszty systemu i w czasie gdy jeszcze zajmuje się sprawdzaniem systemów plikowych uruchamiane są pozostałe komponenty systemu takie jak usługa PackageManagera. To ona właśnie przeprowadza początkowy skan katalogów z aplikacjami. Skoro nie widać aplikacji zainstalowanych na SdExt to (patrząc na powyższy kawałek kodu) getSdExtState zwraca coś innego niż MEDIA_MOUNTED i system nawet nie próbuje zajrzeć do /sd-ext/app. Wniosek z tego jest taki, że Vold jeszcze nie zdążył pozałatwiać swoich spraw z /sd-ext. Problem znany zatem teraz wystarczy znaleźć rozwiązanie. Na szybko Firerat przekompilował framework.jar z wywalonym sprawdzaniem getSdExtState(), wrzucił na XDA i 'rozwiązał’ problem (to był akurat weekend i, zdaje się, byłem po jakimś większym maratonie Singstara w towarzystwie sąsiadów i paru butelek Dark Whisky :-)).
To, co zrobił Firerat było jednak tylko obejściem problemu a nie jego rozwiązaniem. Poczytałem jeszcze raz posty na forum, popsioczyłem, że nikt z pomstujących nie zdobył się na złapanie logów ze startu systemu i doszedłem do identycznego wniosku jak wcześniej: Race condition. Na swoim telefonie nie miałem problemu z brakiem aplikacji z SdExt ale też miałem wtedy zainstalowaną wersję bardzo rozwojową (czyt: powiązaną sznureczkiem i podpartą patyczkiem z każdej strony). Złapałem logi z restartu swojego telefonu i patrzyłem w nie jak sroka w gnat. No nijak nie było szans na race condition. Zgodnie z tym co widziałem w logach /sd-ext było już dawno podmontowane. Przecież nie da się zrobić błędu w 6 linijkach kodu z jakich składa się getSdExt():
/** * Gets the current state of SD-Ext * Note: this call should be deprecated as it doesn't support * multiple volumes. */ public static String getSdExtState() { try { if (mMntSvc == null) { mMntSvc = IMountService.Stub.asInterface(ServiceManager.getService("mount")); } return mMntSvc.getVolumeState(getSdExtDirectory().toString()); } catch (Exception rex) { return Environment.MEDIA_REMOVED; } }
Poza tym w innych miejscach kodu funkcja ta działa perfekcyjnie. Tak się zafiksowałem na tym race condition, że dobre dwa dni nad tym spędziłem. Albo raczej zmarnowałem. Zmarnowałem bo z całego logu (około 150+ KB tekstu) skoncentrowałem się wyłącznie na części związanej ze PackageManagerem i skanowaniem /sd-ext/app. W końcu mój umysł zaczął rejestrować inne linijki logu i wyłapał coś takiego:
I/sysproc ( 147): System server: starting Android runtime. I/sysproc ( 147): System server: starting Android services. I/SystemServer( 147): Entered the Android system server! I/sysproc ( 147): System server: entering thread pool. I/SystemServer( 147): Entropy Service I/SystemServer( 147): Power Manager I/SystemServer( 147): Activity Manager I/ActivityManager( 147): Memory class: 16 D/dalvikvm( 147): GC_FOR_MALLOC freed 641 objects / 80848 bytes in 138ms D/dalvikvm( 147): GC_FOR_MALLOC freed 2131 objects / 317920 bytes in 159ms I/SystemServer( 147): Telephony Registry I/SystemServer( 147): Package Manager D/dalvikvm( 147): GC_FOR_MALLOC freed 5971 objects / 222640 bytes in 181ms I/dalvikvm( 147): DexOpt: source file mod time mismatch (3e4c9ef4 vs 3e618cf4) D/installd( 101): DexInv: --- BEGIN '/system/framework/android.test.runner.jar' --- D/dalvikvm( 163): DexOpt: load 111ms, verify 722ms, opt 13ms
Kilkanaście linijek niżej pojawia się:
I/PackageManager( 147): Pruning dalvik file: sd-ext@[email protected]@classes.dex I/PackageManager( 147): Pruning dalvik file: sd-ext@[email protected]@classes.dex D/PackageManager( 147): Scanning app dir /system/framework D/PackageManager( 147): Scanning app dir /system/app D/dalvikvm( 147): GC_FOR_MALLOC freed 4987 objects / 280408 bytes in 193ms W/PackageParser( 147): No actions in intent filter at /system/app/Bluetooth.apk Binary XML file line #124 I/PackageManager( 147): /system/app/CMParts.apk changed; collecting certs
I jeszcze kilkadziesiąt linijek niżej:
D/dalvikvm( 147): GC_EXPLICIT freed 7597 objects / 563168 bytes in 221ms I/SystemServer( 147): Account Manager I/SystemServer( 147): Content Manager I/SystemServer( 147): System Content Providers I/SystemServer( 147): Battery Service I/SystemServer( 147): Lights Service I/SystemServer( 147): Vibrator Service I/SystemServer( 147): Alarm Manager D/AlarmManagerService( 147): Kernel timezone updated to -60 minutes west of GMT I/SystemServer( 147): Init Watchdog I/SystemServer( 147): Sensor Service I/SystemServer( 147): Window Manager I/SystemServer( 147): Bluetooth Service I/SystemServer( 147): Device Policy I/bluedroid( 147): Starting hciattach daemon I/SystemServer( 147): Status Bar I/SystemServer( 147): Clipboard Service I/SystemServer( 147): Input Method Service I/SystemServer( 147): NetStat Service I/SystemServer( 147): NetworkManagement Service I/SystemServer( 147): Connectivity Service V/ConnectivityService( 147): ConnectivityService starting up D/ConnectivityService( 147): getMobileDataEnabled returning true V/ConnectivityService( 147): Starting Wifi Service. I/WifiService( 147): WifiService starting up with Wi-Fi disabled D/Tethering( 147): Tethering starting D/NetworkManagmentService( 147): Registering observer I/bluedroid( 147): Starting bluetoothd deamon I/SystemServer( 147): Throttle Service I/SystemServer( 147): Accessibility Manager I/SystemServer( 147): Mount Service I/SystemServer( 147): Notification Manager
Widać?
Nie widać?? Hmmm… A teraz?
I/SystemServer( 147): Entropy Service I/SystemServer( 147): Power Manager I/SystemServer( 147): Activity Manager I/SystemServer( 147): Telephony Registry I/SystemServer( 147): Package Manager I/SystemServer( 147): Account Manager I/SystemServer( 147): Content Manager I/SystemServer( 147): System Content Providers I/SystemServer( 147): Battery Service I/SystemServer( 147): Lights Service I/SystemServer( 147): Vibrator Service I/SystemServer( 147): Alarm Manager I/SystemServer( 147): Init Watchdog I/SystemServer( 147): Sensor Service I/SystemServer( 147): Window Manager I/SystemServer( 147): Bluetooth Service I/SystemServer( 147): Device Policy I/SystemServer( 147): Status Bar I/SystemServer( 147): Clipboard Service I/SystemServer( 147): Input Method Service I/SystemServer( 147): NetStat Service I/SystemServer( 147): NetworkManagement Service I/SystemServer( 147): Connectivity Service I/SystemServer( 147): Throttle Service I/SystemServer( 147): Accessibility Manager I/SystemServer( 147): Mount Service
Jeszcze nie widać? No, dobra. Widzisz kiedy jest startowany Mount Service? A teraz zobacz gdzie jest Package Manager. Między jednym a drugim wpisem mija dobrych kilkanaście – kilkadziesiąt sekund. W tym czasie skanowane są aplikacje systemowe (/system/app) i użytkownika (/data/app i ewentualnie /sd-ext/app). Poprawność działania getSdExtState() jest uzależniona od działania Mount Service a w chwili próby skanowania /sd-ext/app ta usługa jeszcze nie działa. I to właśnie było źródło problemu :-)
W systemie Android część usług została zaliczona do usług krytycznych (w powyższym wyciągu z logów od Entropy Service do Bluetooth Service). Na moje nieszczęście Mount Service nie trafił do tej kategorii. Z punktu widzenia twórców Androida nie było takiej potrzeby. Usługa ta jest potrzebna tylko do dostępu do kart pamięci. Zmiana kategorii tej usługi nie jest za bardzo możliwa bez potężnej ingerencji w nią samą i szereg innych komponentów a to oznacza więcej potencjalnych bugów. Najprostszym rozwiązaniem było porozmawianie (prawie) bezpośrednio z Voldem. Ubocznym skutkiem jest potencjalne wydłużenie startu systemu o maksymalnie 20 sekund. W skrajnej sytuacji może się okazać, że i tak aplikacje zainstalowane na SdExt się nie pokażą (w przypadku kłopotów z filesystemem). Wygląda to mniej więcej tak. Zdaję sobie sprawę z braków tego rozwiązania. Właściwie jest to tylko nieco hakerskie obejście. Prawidłowym rozwiązaniem jest skanowanie aplikacji z SdExt już po starcie systemu, tak jak to jest robione z aplikacjami zainstalowanymi na partycji FAT karty. Mam już nawet mgliste pojęcie jak to zrobić :-) Jako bonus dostaniecie wtedy możliwość odmontowania i wyjęcia karty pamięci bez wyłączania telefonu :-) Cieszycie się?
]]>
Tytuł wpisu wyjaśni się pewnie gdzieś niżej (bo jak zwykle zaczynam pisanie bez konkretnego planu, zaledwie z mglistym zarysem tego co ma się pojawić). Ogólnie rzecz ujmując będzie o Androidzie. Taki śmieszny system operacyjny stworzony przez Google dla urządzeń mobilnych. Chyba od samego początku Android kusił mnie swoją otwartością. Jakoś tak w połowie 2009 roku stałem się właścicielem aparatu Era G1 – znanego bardziej jako HTC Dream. Z Androidem 1.5.
Zdaje się, że z niezmodyfikowanym systemem wytrzymałem jakieś 2-3 miesiące. Proces rootowania/odblokowania Dreama był wówczas nieco skomplikowany i wymagał przygotowania specjalnej karty. Bodaj w sierpniu pokazała się malutka aplikacja, dzięki której można było jednym kliknięciem odblokować Dream. No i się zaczęło.
Zainstalowałem wtedy jakiegoś CyanogenMod-a 4-coś. Przez jakiś czas wystarczało mi instalowanie kolejnych aktualizacji CM4, potem CM5 i wreszcie CM6. Jakoś w wakacje zwróciłem uwagę na inne ROMy pojawiające się na forum XDA-Developers. Początkowo traktowałem je identycznie jak CMy czyli wipe i flash. Zainwestowałem nawet w Titanium Backup, żeby nie tracić danych. Raz mnie jednak podkusiło, że zajrzeć do środka zipa. Wydaje mi się, że to był jakiś SpeedTeam Froyo. Numerka nie pamiętam, za to głównym hmmm… „developerem” był (sympatyczny skąd inąd) Jacob Chu-Hing bardziej znany jako XxKOLOHExX.
Developement w wykonaniu SpeedTeam polegał na podmianie paru grafik i xml-i (tzw theming) i dorzuceniu (nieco na oślep) paru cudownych skryptów do /system/etc/init.d. Dodatki typu „apps2sdext-out-of-the-box!” robione były poprzez wywoływanie (przy każdym starcie telefonu) bardzo popularnego (i przy okazji bardzo dobrze napisanego) skryptu Firerata o nazwie All in One Patch. Ten właśnie fakt sprawił, że zacząłem się bawić w modyfikowanie ROMów. Pierwsze kroki robiłem w znanym sobie terenie skryptów shellowych i ogólnie w tej części Androida, która leży na samiusieńkim spodzie i jest po prostu, przyciętym na miarę, Linuxem.
Parę tygodni później miałem na dysku komplet źródeł CyanogenModa a na telefonie samodzielnie skompilowany ROM. Znowu parę tygodni minęło i delikatnie zacząłem gmerać w kodzie. Pierwszym zupełnie samodzielnym dziełkiem było dołożenie możliwości kontrolowania swapu do CyanogenMod Settings. Trywialna modyfikacja javowego kodu i jeden czy dwa skrypty w shellu. Nic skomplikowanego. Dołożenie obsługi CPUFreq było trochę bardziej pracochłonne (i nie obyło się bez pomocy Joëla Bourquarda – autora Titanium Backup) ale się udało :)
W międzyczasie SpeedTeam zawiesił działalność a XxKOLOHExX przeszedł do Biff Squad. Wersja 2.0 BiffModa była w całości oparta o moją kompilację i pewnie byłaby sukcesem ale RoyalKnight zdecydował się na inny kernel i trochę niefortunnie wkleił go w przygotowaną przeze mnie paczkę. Zdarza się a ja się czegoś nowego nauczyłem :) Potem był BiffMod 2.1 przygotowany przez Ezterry’ego, z jego kernelem i moimi dodatkami. Mogłem spocząć na laurach i grzecznie czekać na Gingerbreada.
I pewnie bym spoczął gdyby nie twitterowa rozmowa najpierw z Cyanogenem a potem Fireratem. Jakoś tak wyszło, że razem z Fireratem zajęliśmy się tzw natywnym apps2sdext. Do tej pory możliwość instalacji aplikacji na partycji Ext2/3/4 karty była realizowana przy pomocy skryptów shellowych i polegała na oszukiwaniu systemu co do faktycznej lokalizacji plików apk. Gdybym miał chociaż blade pojęcie jak skomplikowany to projekt pewnie bym sie nigdy nie odważył za to zabrać. Prace nad wbudowanym w system apps2sdext trwały dobrze ponad 2 miesiące. Choć rozwiązań kolejnych problemów poszukiwaliśmy wspólnie, to jednak gross rozwiązań znajdował Firerat. Wiele razy zdarzało się, że dłubaliśmy nad jakimś kawałkiem kodu i już miałem rozwiązanie problemu na końcu języka gdy Firerat zaćwierkał „Ok, I made it”. Nigdy go nie spytałem czy kiedyś przydarzyła mu się podobna sytuacja ale ze mną w roli głównej. Mam nadzieję, że tak :D jest w tym wszystkim ładnych parę linijek mojego autorstwa.
No dobra ale co to ma wspólnego z tytułem wpisu? Ermm… zdradzę pewną tajemnicę… Nie znam Javy. Serio! Nie znam Javy. Nigdy wcześniej nie używałem tego języka (jestem przecież adminem a nie programistą!). Tymczasem całe to apps2sdext wymagało grzebania w jednym z kluczowych komponentów (framework.jar) napisanym w całości w Javie. Dziesiątki razy oglądałem kawałek kodu, dopisywałem kawałek kodu i bez przerwy odpytywałem Google na okoliczność składni tego czy innego polecenia Javy. Sprawdzałem dostępne funkcje, metody i temu podobne sprawy. O, właśnie! Metody! Dodatkowym smaczkiem jest to, że nigdy wcześniej nie pisałem niczego w jakimkolwiek obiektowo zorientowanym języku programowania :) Największym zaskoczeniem dla mnie jest to, że #LearningJavaUsingGoogle działa! :P Nie wierzysz? To zerknij na
Miłego haczenia Androida!!
NameLess
the Jedi
Ci, co zaglądają tu częściej niż raz na rok, być może zauważyli, że nagle zniknęło parę wpisów (dosłownie parę!) z zeszłego roku. Powód jest prosty: admin z 15-letnim stażem zignorował kwestię backupów =o( „Zignorował” to może ciut za mocne słowo ale efekt jest właściwie identyczny. Backupy się robiły a i owszem. Nawet automat je robił, żebym głowy sobie nie zaprzątał… Ba! Automat nawet przerzucał je na serwerek do domu! Tyle, że akurat ta część automatu się wzięła i popsuła. Miałem ją naprawić. Proszę zwróćcie uwagę na „miałem„. Miałem na to z pół roku ale jakoś się nie zdarzyło naprawić. Backupy więc były tylko lokalnie. Leżały sobie grzecznie w /var/backups i czekały na koniec świata. No i koniec świata nadszedł nieco wcześniej niż się spodziewałem (tzn jakoś tak w styczniu 2010 czy coś a miał być w 2012 i jak tu wierzyć Majom, hę?). Jeden z dysków (fakt, że wysłużony co nieco) sypnął błędami a następnie odszedł do Krainy Wiecznego Przepływu Informacji. Zabrał ze sobą cały /var.
Przyznam się, że jak już postawiłem mój flagowy serwerek na nogi (z nowym dyskiem!!) poważnie rozważałem nie reaktywowanie tego bloga. Nie chciało mi się zaczynać od zera. Znowu. Życie jednak trochę zdecydowało za mnie. Blog, oprócz rzadkich okazji do wywnętrzania, stanowił również mój serwer autoryzacyjny OpenID. Przypomniał mi o tym Filmaster. Ciasteczko autoryzacyjne zakończyło żywot i nie mogłem się już zalogować. Odtworzyłem co mogłem (czyli stan z czerwca 2009) i dalej nie mogłem się zalogować… Ech.. Dobrze, że Michuk pomógł. Blog jednak już powstał z martwych więc pewnie sobie zostanie.
No to do poczytania! =o)
]]>W moim własnym mniemaniu jestem geekiem czy też nerdem. Jedną z cech idących w parze z geekowatością jest gadżetomania. Uwielbiam gadżety. Najbardziej te realne ale czasem trafia się taki bardziej wirtualny. Pierwszy raz zwrócił moją uwagę w postaci maila na liście debian-mentors albo debian-devel. W pierwszej chwili pomyślałem, że to trochę głupie. Pierwsze wrażenie jednak mnie zwiodło.Gadżet zwie się blueproximity. Idea jego działania zasadza się na sprawdzaniu dystansu między dwoma urządzeniami BT. Jednym z nich jest komputer, drugim – na przykład telefon komórkowy. Po co to? Na przykład można automatycznie zablokować sesję w komputerze, w chwili gdy telefon komórkowy oddali się od komputera. Dla kogoś patrzącego na to z boku wygląda jakby komputer wykrywał (nie)obecność właściciela. Sprytne, nie?
Od razu podkreślę jedną rzecz. Bezpieczeństwo komputera może na tym ucierpieć. W domyślnej konfiguracji blueproximity nie tylko blokuje ekran, gdy się oddalisz, ale również odblokowuje sesję bez pytania o hasło, gdy się pojawisz w pobliżu. Podobnie jak przy innych technikach sieciowych, tak i tu, można się, w miarę łatwo, podszyć pod telefon. Dobrze jest więc wyłączyć widoczność urządzenia w menu telefonu.
Sam programik jest banalny tak w obsłudze jak i w konfiguracji. Nie podam swoich ustawień, bo dla każdego zestawu nadajnik – odbiornik będą inne. Dojście do nich zajęło mi nie więcej jak 20 minut i trochę kręcenia się po pokoju =o) Domyślnie blueproximity kontroluje gnome-screensaver, nic nie stoi na przeszkodzie by uruchomić dowolny inny programik czy skrypt. Parę przykładów można znaleźć pod koniec tego postu.
]]>Nadchodzi taki dzień, gdy trzeba powiedzieć sobie jasno: To koniec! Nie ma już wspólnej przyszłości.Trzeba się rozstać. Z żalem, bólem serca ale trzeba. Zaczyna się od drobiazgów. Nic szczególnego ale najpierw uwiera, potem drażni aż w końcu wkurza niemiłosiernie. Oczywiście wspólna przeszłość jest bardzo ważna, nie można jej odrzucić. Nie można jednak łudzić się, że znów będzie tak jak kiedyś. Nie będzie. Jak juz się to zaakceptuje, kolejny krok jest prosty i logiczny. Jedyny możliwy. Chyba lepiej rozstać się spokojnie niż trzasnąć drzwiami i pójść.
Nie twierdzę, że to łatwe.
Nie chcę się tłumaczyć.
Po prostu nadszedł taki dzień.
Dzień pożegnania ze starą przyjaciółką.
Toyota Carina II (wyżej) była ze mną przez ostatnie 10 lat. W zeszłym roku stała sie pełnoletnia, w tym roku licznik pokazał 300 tys km. Niby autko swoje już przeszło ale było całkiem dziarskie. Z rozrzewnieniem patrzę na powyższe zdjęcie. Lubię tą Toyotę. To nie pierwsze moje auto ale pierwsze, które darzę taką sympatią. Taka przytulanka dla dorosłego faceta :) Najgorsze w tym, że z przytulanek się wyrasta a ja z Toyoty nie wyrosłem tylko musiałem się z nią rozstać. Zastąpić ją. Miała być następna Toyota. Myślałem też o FreeLanderze. Koniec końców zwyciężyła pewność źródła pochodzenia samochodu a nie marka czy model (oczywisty współczynnik ceny pomijam). Srebrne auto ma teraz dokładnie tyle samo lat co Toyota, gdy ją kupowałem. Czy znajomość z Passatem też potrwa 10 lat? Czas pokaże… Na razie cieszę się klimą, przestrzenią i lekkością działania z domieszką niemieckiej toporności. Do zobaczenia na drodze (i do poczytania za czas jakiś ;)
]]>Jak mawiał Pawlak (albo Kargul ale raczej ten pierwszy) „nadejszła wiekopomna chwila…”. Dla nas nadejszła, nieco znienacka, wczoraj w okolicach godziny 13.O tej porze właśnie podpisaliśmy akt notarialny sprzedaży mieszkania. Mieszkaliśmy tam 8 lat. Trochę żal się rozstawać ale nikt z nas nie chciałby tam wrócić. Ot, jest tam teraz za głośno, za tłoczno i za ciasno. Do dobrego szybko się człowiek przyzwyczaja. Nasze mieszkanko przysłuży się teraz w nieco inny sposób. Zrobimy drugą łazienkę, elewację i pewnie część drobiazgów typu żyrandole, karnisz, firanki, szklanki… A nie szklanki już mamy ;)
PS.
Tytuł wpisu to okrzyk kończący wygraną rozgrywkę w mojej (nadal) ulubionej strzelance sieciowej BattleField: Bad Company. Yes! The Gold is mine! Margeritas and Malibus boys! :)
]]>Tytuł tego wpisu wymyśliłem dobrych parę miesięcy temu. Tylko okazji nie było. Jak wymyślałem tytuł, to byłem pewny, że będę miał świetny humor i generalnie będę prawie w siódmym niebie.O co chodzi? W gruncie rzeczy o nic wielkiego. Od ponad pół roku próbujemy sprzedać mieszkanie. Parę razy byliśmy blisko podpisania umowy przedwstępnej ale… Właśnie. Byliśmy blisko. Tylko blisko. Raz gość się wystraszył, że nie wyrobi się z załatwieniem kredytu, raz się starsze małżeństwo pokłóciło (sic!). Ot, wymówki. Jedne bardziej wiarygodne, inne mniej. Tym razem jednak mam już w ręku podpisaną umowę przedwstępną, zaliczkę mam na koncie i widzę determinację kupujących. Nic tylko się cieszyć. I pewnie by tak było, gdyby cieniem nie kładły się wcześniejsze „przygody” ze sprzedażą. Umowa przedwstępna nie gwarantuje zakupu. Na zadatek (choć nie mały) zawsze można machnąć ręką. Ten głupi lęk, nie pozwala się cieszyć. A szkoda. Jedyną ekstrawagancją z okazji umowy była wizyta w komisie, po drodze do domu. Ech… I tak muszę poczekać.
Jeszcze tylko wyjaśnienie tytułu. Ostanimi czasy namiętnie (co nie znaczy, że często ;o) ) grywam w Battlefield: Bad Company na Xbox Live. Sieciowa strzelanka w realiach współczesnego pola walki. Super rzecz. Gorąco polecam. Jednym z trybów rozgrywki jest „Gold Crates”. Dwie drużyny walczą ze sobą o skrzynie ze złotem. Jedna z nich atakuje i próbuje zdobyć skrzynie, druga – broni tychże skrzyń. Każda mapka składa się z 3 -4 etapów, a każdy etap to zdobycie dwóch skrzyń. Po zdobyciu jednej z takich skrzyń, w „radiu” słychać zadowolony głos obwieszczający „Gold Crate One taken!”. Połowa etapu. Ani łatwiejsza, ani trudniejsza. Po prostu: połowa.
]]>Pierwszy post w Nowym Roku. Styczeń się jeszcze nie skończył więc mogę jeszcze, w miarę bezpieczenie, złożyć wszystkim zaglądającym życzenia Wszystkiego Najlepszego. Oby ten Nowy Rok był lepszy od poprzedniego ale gorszy od następnego.
Tym ostatnim zdaniem, od dobrych paru lat, zwykłem witać Nowy Rok i żegnać Stary. Jednak chyba nigdy, słowa te nie były lepiej dopasowane do rzeczywistości – mojej rzeczywistości – niż teraz. Och! Nie! Nie chcę narzekać! Może tylko trochę się użalić. Tylko, kurna, największym winowajcą jestem ja sam. Za późno wziąłem się za sprzedaż mieszkania, trochę przeceniłem możliwości finansowe i stało się… Grudzień był zdecydowanie najgorszym miesiącem od… od… Hmm… chyba odkąd pamiętam. Przysłowiowym gwoździem do trumny był rachunek z Energetyki na kwotę 5800 zł (przyszedł 30 grudnia 2008 – termin płatności 5 stycznia 2009!). Taryfa budowlana jest mordercza. Za tą samą ilość kWh, przy normalnej taryfie, zapłaciłbym niecałe 1700 zł. Spora różnica, co nie? Oczywiście to jest rachunek za cały zeszły rok (w taryfach budowlanych – okres rozliczeniowy to 12 miesięcy i nie ma możliwości jego zmiany). Końcówka zeszłego roku to była kompletna finansowa porażka. Taki zdołowany i zdeprymowany zacząłem pisać ten tekst. Szedł jak z kamienia więc przestałem i wróciłem do niego po trzech czy czterch dniach. Już w nieco lepszym humorze.
Coś się zmieniło? Właściwie nie. Finansowo dalej jesteśmy w d…ie ale widać światełko w tunelu. Słabe, odległe ale jest. I nie jest to nadjeżdżający pociąg. Zdaje się, że spory wkład w zmianę nastroju miał mój własny wpis popełniony w Wigilię. Przeczytałem go jeszcze raz bawiąc się jakimiś wtyczkami do WP. Końcówka roku była kiepskawa ale rok był całkiem całkiem:
So… HNY! Dear Reader, HNY!
]]>„Gdybyście mniej martwili się o to czego nie macie, bardziej byście docenili to co posiadacie”
To cytat z pewnego dość kameralnego filmu. Chciałbym go wykorzystać jako moje życzenia świąteczne dla wszystkich moich przyjaciół, znajomych i wszystkich, którzy tu zajrzeli przez zupełny przypadek.
Boże Narodzenie to chyba najbardziej rodzinne ze świąt. Radość, prezenty, rodzina i przyjaciele. To chyba najlepszy opis tych paru dni. Zatem rozejrzyjcie się wokół i popatrzcie co posiadacie i cieszcie się tym. Nie tylko przez Święta.
]]>Ten post miał powstać w zeszłym tygodniu. Nie powstał. Miał być o stricte o Linuksie. Nie będzie. Kilka zupełnie różnych rzeczy mnie ostatnio zaskoczyło i o tym właśnie będzie.Największe zaskoczenie sprawili mi łódzcy drogowcy. Pomyślisz sobie, że znowu będzie narzekanie a tu nie! Nic z tego! Ale po koleji. Do pracy jadę między innymi ulicą Traktorową. Od jej remontu, jakieś 3 lata temu, jechało się nią dość sprawnie i właściwie bez większych zatorów (to jedna z dwóch arterii wyjazdowych z Teofilowa w stronę centrum i ten brak zatorów właściwie zaskakiwał). Jakieś 2 tygodnie temu jadąc do pracy zauważyłem silną ekipę drogowców, kombinujących coś na pasie obok. „No to będzie nieźle” pomyślałem sobie i zacząłem się zastanawiać co też będą wyczyniać na bądź co bądź niedawno remontowanej jezdni (o wymyślaniu nowej, w miarę szybkiej trasy do pracy nie wspomnę). Już wracając do pracy dowiedziałem się co wymyślili. Cały pas jezdni został pozbawiony asfaltu. Z jednej strony byłem pełen podziwu dla tempa pracy, z drugiej strony tempo jazdy na tym wygolonym odcinku (jakieś 800 metrów) spadło dziesięciokrotnie. Przez następne parę dni nie było ani drogowców, ani wahadłowego ruchu ot jedynie wracając jechałem wolniej niż zwykle. W zeszłym tygodniu wracając wieczorem do domu zauważyłem zbierające się ekipy drogowców po lewej stronie drogi (czyli tej gdzie jeszcze był asfalt). Raptem dwa auta i paru ludzi w odblaskowych kamizelkach. Jakież było moje zdziwienie gdy następnego dnia stwierdziłem, że asfaltu nie ma już w ogóle. Oba pasy były po prostu nagie. Żadnych maszyn, żadnych drogowców i żadnych (pomijając jakość „nawierzchni”) utrudnień w ruchu! Dalej jeździłem ul. Traktorową bo dalej była to najszybsza trasa przejazdu do/z pracy. Dziś, dojeżdżając do felernego odcinka, szykowałem się już na otrzęsiny serwowane mi przez wysłużoną Toyotę. Zamiast tego jednak zobaczyłem równo ułożony asfalt! Nawet łączenie do tych niezerwanych kawałków porządnie zrobione bez jakichś garbów/dołków itp Normalnie szok! Jednak daje się przeprowadzić remont nawierzchni bez jakiegoś specjalnego zakłócania ruchu!! Dziękuję Wam łódzcy drogowcy! Tak trzymać!!
Drugie zaskoczenie nie jest już takie miłe. Moja maszynka (serwująca m.in. te strony) o wdzięcznej nazwie Coruscant poinformowała mnie, że jeden z dysków sypie błędami. Rzut oka na komunikaty i wiedziałem, że jest źle. Próbowałem podratować nieco sytuację ale bez efektu. Póki co Korek (tak go zdrobniale nazwał jeden z moich przyjaciół) dycha ale najbliższego restartu to już nie przeżyje (i tu się pochwalę, że od ostatniego jego restartu minęło ponad 400 dni). Maszyna jest już zdrowo przestarzała (Pentium III @ 500MHz) i czasem już niedomagała wydajnościowo jednak rolę serwera WWW, poczty i paru mniej lub bardziej prywatnych pierdółek spełniała znakomicie przez ostatnich 5 czy 6 lat. Z półtora roku temu padł jeden z dysków a dziś zaczyna padać drugi. Po jakichś 4 latach ciągłej pracy. Niby nie powinno dziwić ale jednak…. Jedyna dobra strona tej awarii to taka, że być może Korek powstanie z popiołów i będzie ciut szybszy i nowocześniejszy (z naciskiem na „być może” niestety)
Jak już jesteśmy przy tych złych to zaskoczeniem była dla mnie również śmierć Jana Machulskiego. A jeszcze 3 tygodnie temu (no, może 4) widziałem go w Empiku… Chyba nie ma się co rozwodzić nad tym jak dobrym był aktorem bo jest to oczywista oczywistość. Myślę, że, jako jeden z niewielu polskich aktorów, zasłużył sobie na Oscara za całokształt twórczości. Szczere wyrazy współczucia dla rodziny i bliskich. Dla polskiego kina też.
Zostały jeszcze takie zeszłotygodniowe drobiazgi w postaci 64-bitowej wersji (beta co prawda ale zawsze) Adobe Flash Playera. Zabawne ale pokazał się on tylko pod Linuksa i Mac OS-a (z drugiej strony co się dziwić skoro 64-bitowe Windowsy to nadal ciekawostka bardziej niż system). Nie przepadam za flashem i dlatego używam Firefoksowej wtyczki FlashBlock. Niestety wszystkie filmiki z gier konsolowych są właśnie w tym formacie. Korzystanie z atrapy w postaci 32-bitowej wersji i specjalnej wtyczki było bardziej loterią niż czymkolwiek innym (flash raz się odpalał a raz nie; nawet nie było wiadomo czemu). Zainstalowałem tą wersję beta i… no żeby wszystkie bety były tak stabilne!
Kolejny „drobiazg” to wersja beta binarnych (tzw closed-source) sterowników graficznych NVidii. Z powodów filozoficznych nie przepadam za czymś co nie jest open-source a na codzień z uśmiechem na twarzy korzystam m.in. z tych sterowników (po to by cieszyć oczy przezroczystością okienek i innymi „słodkościami dla oczu”(*) oferowanymi przez Compiz Fusion). Cechą szczególną akurat tej bety jest VDPAU. Skrót dziwny ale daje Linuksom to co Windowsy mają od wiek wieków. Wspomaganie odtwarzania multimediów przez procesor karty graficznej. Co więcej, po wypuszczeniu produkcyjnej wersji tych sterowników, NVidia obiecała przekazać wszelkie łatki/patche/poprawki dwóm największym projektom mulitmedialnym w świecie Open Source (ffmpeg i mplayer). Drobiazg ale cieszy.
Ot i tyle tych zaskoczeń. Jak na 7 dni to chyba aż nadto… ;o)
* – kiepska próba przetłumaczenia zwrotu eye-candy
]]>