poniedziałek, grudnia 27, 2010

Pieróg alegorią polaka

Taka mnie filozoficzna myśl naszła, przy kontemplacji michy wigilijnych pierogów. Jak dużo jedzący ma wspólnego z jedzeniem - wszak jesteś tym co jesz. Pieróg tak jak ja lubi być napchany ziemniakami albo mięsem. Gdy jest zbyt ciepło to się rozkleja, gdy jest zimno twardnieje, a gdy ktoś go przypiecze to się pokrywa nieprzeniknioną skorupą skarmelizowanego makaronu.
Mogą być leniwe, mogą być rozlazłe,  mogą być słodkie. Głównie są żarciem, jednak gdy się w nie włoży serce, to nie może być nic lepszego do jedzenia pod słońcem. W końcu to tylko klucha z farszem, ale czyż nie o to w życiu chodzi?



środa, listopada 17, 2010

Myśl dnia

Robienie wydmuszek interfejsu jest jak umawianie się na randki z transseksualistami - wszystko jest w porządku dopóki nie zaczniesz klikać.

ActivityIndicator & TextInput - interactive search field

In asynchronous world there is often a need to show user, that application is doing something in the background, and it is not hang. When we can determine amount of time needed to perform some action, we should use ProgressBar controll, when there is no such possibility we should use ActivityIndicator.

ActivityIndictator class does not have many usefull functions,  the most interesting function one is animate(doAnimate:boolean). It starts (or stops) animation of indicator, this is used to produce impression that application is working on something.

We will create simple search field with appriopriate icon and indicator. Let's start from TextInput:

with(textInput) {
   x = 50;
   y = 50;
   width = 200;
   
   leftIcon = searchImage;
   leftIconMode = TextInputIconMode.ALWAYS;
   rightIcon = activityIndicator;
   rightIconMode = TextInputIconMode.NEVER;                
}
 
We are using here the most usefull feature of TextInput control: left and right icon. These icons are inserted in the text input and does not hide text inserted. The only limitation (maybe bug) is that the right icon is not correctly showed when clear icon is present (they are in the same position). That's why we are showing search button on left side of the controll. Above code will result in creation of this piece of interface:
TextInput with clear and search icons
When user press the search icon, we should start animation and start doing background operations.

protected function startSearch(event:Event) : void 
{
    //disable search box and start animation
    textInput.enabled = false;
    textInput.rightIconMode = TextInputIconMode.ALWAYS;
    textInput.leftIconMode = TextInputIconMode.NEVER;
    activityIndicator.animate(true);

    //start background job
    setTimeout(stopSearch, 5000, textInput.text);

    //visual improvement
    textInput.text = "Searching...";
    resultLabel.text = "";
}
We are hiding search icon, show and start animation, and do some background operations - here it is simulated by few seconds of delay before the results will be displayed.
TextInput with ActivityIndicator
Field is disabled, so user cannot change inserted text additonally we may change background of disabled controll by changing it's skin. When background job is finished, we should enable it for user input:

protected function stopSearch(text:String):void
{
   //display results
   resultLabel.text = "Sorry, nothing has been found for \"" + text + "\".";
   textInput.text = "";

   //enable search box for user
   textInput.enabled = true;
   textInput.rightIconMode = TextInputIconMode.NEVER;
   textInput.leftIconMode = TextInputIconMode.ALWAYS;
   activityIndicator.animate(false);
}

ActivityIndicator animation can be changed by skin, with it we are able to create consistent activitiy indication in whole application. TextInput icons placeholders can be used in many ways, for validation indication, type hinting, help and many other non crutial items. Inserting them in text input box will keep interface small and clear.

czwartek, listopada 04, 2010

Czeladnika do zawodu programisty przyuczę

O tym, że uczelnie techniczne w Polsce oderwane są od rzeczywistości wiadomo od dawna. Skostniałe kumoterskie układy, narzędzia i technologie pamiętające czasy króla Ćwieczka, program nauczania dostosowany do posiadanych naukowców zamiast do wymaganej na rynku pracy wiedzy. Doskonałym przykładem tej patologii są studia informatyczne - programistyczne. Studenci marnują swoje żywota starając się zrozumieć algorytmikę opartą o grafy, całkując oraz wykonując modele cyfrowych zapalników.
Patrząc z perspektywy mojego kilkuletniego doświadczenia, wiedza ta (pomimo tego, że ciekawa) nigdy nie była przeze mnie użyta. Ileż w końcu jest aplikacji w których można to zastosować? Jedna lub dwie i one są już napisane i używane. Nikt nie poszukuje kolejnego systemu przetwarzania audio, jest kilka płatnych, kilka darmowych, a używane są co najwyżej do wycinania kawałków dźwięków na dzwonki do komórek (jeśli aż tyle).
Zdarzało mi się pracować, ze świeżo upieczonymi studentami, zdarzało mi się też pracować z doświadczonymi pracownikami pozbawionymi podstawowej wiedzy. Metoda prowadzenia zajęć z programowania w językach wysokiego poziomu wypełnia studentów fałszywym przeczuciem, że problemy z którymi się borykają są nowe i całkowicie unikatowe. Nikt nie stara się nawet poruszać kwestii wbudowanych w kompilator albo system operacyjny bibliotek - nauka oparta jest o rozwiązywanie znanych i starych problemów. Przykładem zagadnienia gdzie ta metodologia przynosi największe straty to operacje na napisach (ciągach liter) - prześledźmy to  na przykładzie bardzo popularnej biblioteki strings (albo array) w porównaniu do najpopularniejszych problemów. Podstawą jest długość napisu (to wie każdy, bo każdy to widział), podmiana jednego ciągu na inny (tu już kusi wymyślić koło na nowo), złączenie tablicy w napis przy pomocy jakiegoś separatora (np. przecinka) - tutaj już pełna samowolka, o takich rzeczach jak uzupełnianie znakiem do długości, zamiana małych na duże litery, policzenie słów i tak dalej. Tysiące programistów na świecie opracowuje właśnie własne procedury, do rozwiązywania takiego typu problemów, nikomu nie przyjdzie do głowy sprawdzić czy, a nóż-widelec, ktoś to zrobił wcześniej, może nawet (o zgrozo!) jest to wbudowane w kompilator.
Jeśli absolwent ma szczęście trafić zaraz po studiach do środowiska które w dość szybki (a często i brutalny) sposób uświadomi mu jego braki oraz niedociągnięcia - jeśli tego szczęścia nie ma, trafi do firmy wypełnionej takimi samymi jak on, grupowo będą legitymizować swoje błędy tracąc czas oraz pieniądze inwestora na odtwarzanie dawno zoptymalizowanych i rozwiązanych problemów - tylko dlatego, że wszyscy uczestnicy tej gry pozbawieni zostali praktycznej wiedzy, którą miał im dostarczyć uniwersytet. Uniwersytet wypełniony teoretykami nie ma zaś możliwości przekazania studentom wiedzy praktycznej, gdyż najzwyczajniej jej nie posiada. Programowanie  można porównać do produkcji skrzypiec: można spędzić kilka ładnych lat ucząc się zjawiska rezonansów, wyliczając idealne grubości oraz długości strun, poznając historię ludwisarskiego fachu. Czy może to skutkować tym, że tak wyedukowany człowiek wyprodukuje dobre skrzypce? Nie, w żadnym wypadku, najwyżej będzie to pudełko ze sznurkami. By móc rzeźbić w czymkolwiek, trzeba ten materiał poczuć, drewno musi leżeć w dłoni, trzeba poznać jego twardość plastykę i zachowanie pod uciskiem, trzeba wielu lat praktyki aby produkować dobre skrzypce, jednak nikt nie wpada na pomysł studiowania tego, gdyż wiedza taka byłaby zupełnie zbyteczna i płacenie za takie studia to całkowity idiotyzm.
W dzisiejszych czasach prawie całkowicie zaniknął proces przyuczania do zawodu w praktyce. Nie było szkół dla kowali, szewców, ludwisarzy czy też piekarzy - czeladnik pomagając przy pracy, patrząc na ręce nabierał wiedzy, tak by w końcu sam mógł uczyć. Czemu nikt nie prowadzi czeladniczych praktyk programistycznych? Komitywa firm z uczelniami mogłaby skutkować produkcją studentów, którzy po wyjściu z uczelni byliby już zaznajomieni z rynkiem, zżyci z jego oczekiwaniami i przystosowani do nauki przez praktykę, nie baliby się przy tym nauki nowych rzeczy, byłby to naturalny sposób dla nich na rozwijanie swoich umiejętności. Firmy w takim układzie miałyby ewidentny zysk - filtrację najlepszych oraz ewidentny wpływ na to w jakim kierunku szkoleni są studenci, uczelnie wzbogaciłyby znacząco swoją ofertę edukacyjną, takie studia nie byłyby tanie, jednakże ich unikatowy charakter gwarantowałby praktycznie zatrudnienie w branży po ukończeniu. Ścisła współpraca doprawiłaby majonez teorii szczyptą (albo i garścią) pieprzu praktyki - tak potrzebnej w tym dość specyficznym zawodzie.

piątek, października 22, 2010

Co to jest Ꭰ:ᏲᏍᏗ?

Firefox od czasu aktualizacji do Ubuntu 10.10 tak właśnie wita mnie na ekranie wyszukiwarki Google. Ten dziwny ciąg znaczków ma oznaczać guzik "Szukaj" - niby fajnie, tylko czemu akurat tak? Poszukiwanie rozwiązania prowadzi do wniosku, że ten szatański zestaw znaków jest zapisany w języku indian Cherokee. Tylko, na brud na klawiaturze, czemu akurat ten język. Rozwiązanie zagadki siedzi w oknie dialogowym wyboru języków (Edycja -> Preferencje - Zakładka Treść):
Zapis chrome jest mylnie interpretowany jako oznaczenie ISO języka Cherokee. Wywalam błędny wpis, dodaje "pl" i "en" (w tej kolejności) i tadam! Mam odpowiedni język wybrany.

czwartek, października 21, 2010

Kawa - zbawicielka świata

Pewnemu uczonemu udało się odkryć nową własność w kawie, od wielu lat znanej już w Europie. Doktor Szalian uważa, że kretynizm (osłabienie umysłu bliskie głupowatości) od dwudziestu lat znacznie się zmniejsza w okręgu Briantońskim; tłumaczy to powszechnym użyciem kawy, w ubogich nawet chatach. Kawa ma własność ożywiania omdlałego ciała i ożywiania mózgu u osób, usposobionych do kretynizmu.

"Opiekun domowy" z roku 1866, numer trzeci

środa, października 06, 2010

Kisiel w wannie

Ile mąki trzeba by wypełnić wannę kisielem? W przepisie, oprócz zwyczajowego ple, ple, ple jest też taka informacja:

dwie łyżki mąki na dwie szklanki wody
Czyli:
30g na 0.5l wody / 60g na 1l wody

Typowa wanna ma około 200 litrów pojemności (moja ma 120 bo jest taka mała), żeby siedząc w niej być otoczonym kisielem, trzeba odjąć od pojemności tyle litrów wody ile się waży (prawo Archimedesa). Powinno wystarczyć jakieś 80 litrów kisielu by być zanurzonym w nim po szyję, czyli jakieś 4.5 kilograma mąki (co prawda na zdrowy rozsądek nie ma sensu wypełniać wanny wyżej niż w 1/3, jednak cytując mistrza: "jak się nie wyleje, znaczy za mało nalane").

Pamiętaj, aby doprawić kisiel sokiem w ulubionym smaku!

IBM w Rzeszowie?

W branży krąży plotka, że w Rzeszowie (najprawdopodobniej w strefie ekonomicznej na Jasionce) będzie inwestował sam wielki IBM. Plotki te, podchwyciły niektóre lokalne portale, kierując się własnymi informacjami na temat spotkania przedstawicieli firmy z władzami lokalnymi. Wypowiadane jest to najczęściej z przeświadczeniem, że wejście takiego giganta na lokalny rynek pracy spowoduje jego natychmiastowe wywrócenie, wywinduje pensje i uczyni z nas, ludu IT krezusów. Przy czym ignoruje się zupełnie doświadczenia innych miast: Łodzi z Dellem (sprzedanym ostatnio po wycyckaniu miejskiej kasy chińczykom), Tychów z Fiatem (który uciekł do Włoch z powodów politycznych). Wszystkie tego typu inwestycje nie są realizowane po to, by poszukiwać najlepszych pracowników, tylko dlatego, że w danym miejscu pracownicy są najtańsi, a miasto najbardziej chojne.

Nikt nie inwestuje po to, by czynić niebo na ziemi, tylko po to by zarobić więcej. Nic się nie zmieni na rynku pracy, najwyżej część absolwentów zamiast wyjeżdżać zostanie by pracować za tysiąćczysta z wielkim koncernem.

niedziela, października 03, 2010

Niechciane funkcjonalności

- Mam taką delikatną sprawę. Zdjęcia komórką umiesz pan robić?
- Panie, jak nie jak tak. Pewnie, że umiem. Nawet dzisiaj, żem se zrobił jedno zdjęcie, jak gołębie se srali.
Jest pakiet funkcji które każdy nowoczesny przedmiot masowego pożądania musi posiadać. Ten zasób funkcji powiększa się z każdym rokiem, o rzeczy coraz bardziej odległe od pierwotnego zamierzenia. W czasach gdy kobiety były kobietami, mężczyźni mężczyznami, a koń był taki jak każdy widzi, telefony służyły głównie do dzwonienia, później niektórzy wpadli na pomysł, żeby dołożyć krótkie wiadomości tekstowe. Potem poszło z górki, kalendarze, budziki, notatki głosowe. Super, nie można się obejść bez możliwości nagrywania notatek głosowych, sprawa gardłowa - ta funkcjonalność jest dostępna w każdym telefonie. Tu dochodzimy do czegoś, czym jedni producenci telefonów pragną odróżnić się od drugich. Aparat fotograficzny o mocy piętnastu ochtylionów megapikseli. Przejrzałem specjalnie swój folder zrobionych zdjęć w telefonie i wyszło mi, że robiłem mniej niż jedno zdjęcie tygodniowo. W przypadku prawdziwego aparatu ten współczynnik dochodzi do kilku zdjęć dziennie - nie porównując jakości. Telefon komórkowy pozbawiony tych wszystkich bajerów, wyposażony w pikselowy, najprostszy wyświetlacz potrafi być aktywny tygodniami (miesiącami), nowoczesne telefony trzeba ładować najrzadziej raz na tydzień (a często jest to codziennie). Przypomina to trochę rozwój motoryzacji, na samym początku samochody były napędzane nastokonnymi silnikami, w Polonezie silnik ma moc 75 koni mechanicznych (niektóre kosiarki dysponują większą mocą). Teraz samochody są wyposażone w potężne jednostki, jednak spalanie nie spadło, nie wzrosła też prędkość maksymalna. Tylko wszystko stało się większe, cięższe, wypełnione bajerami. Dochodzi do wynaturzonej hedonizacji funkcji, odchodzimy od pierwotnych założeń, tracimy cel z oczu. Gdzie leży granica? W którym momencie dojdzie do załamania tego pędu we wzbogacaniu przedmiotów o możliwości? Czy unifikacja jest końcową granicą? Czy dojdzie do zaniku większości elektronicznych gadżetów i zostanie tylko jeden przenośny mikrokomputer którym będzie można zrobić wszystko?

Wieki temu, gdy byłem szczylem, a w telewizji zaczęły pojawiać się reklamy przeróżnych rzeczy, między innymi pieluch zauważyłem dziwną rzecz. Sztuczne pieluchy istnieją już ponad sześćdziesiąt lat i jak oni są w stanie co pół roku wymyślić coś nowego, niesamowicie rewolucyjnego. No jak? Jak to się dzieje, że co pół roku widzę rewolucję w pieluchach. Czy jest tak już od pół wieku i ile to jeszcze potrwa?

niedziela, września 05, 2010

Ymiana klawiaturz

Czyżbyś miał zamienione "Y" z "Z"? Jeśli stało się to nagle, niespodziewanie i nie wiesz dlaczego spróbuj wcisnąć Ctrl+Shift. Spowoduje to przełączenie strony kodowej z maszynistki (214) na programistę. Jeśli nie pomogło, szukaj dalej.

środa, lipca 28, 2010

Hrabia potocki sprzedaje lokum

Panie hrabio! Opchnij pan lokum!


W sumie to nie jest zamek hrabiego, tylko odbudowany na tamtej podstawie, remontowany i zmieniony. Coś jak zamek w Warszawie, tylko bez planów, jednak ogłoszenie takiej treści, w tym miejscu wydało mi się ciut absurdalne (ale jak widać ktoś myśli opchnąć celę w tej miejscówie).

środa, lipca 21, 2010

Igor

Pomocnik szalonego naukowca - Igor, połatany pozszywany garbus z wyłupiastymi oczyma. Pomocnik, a może i wynik jakiegoś eksperymentu. Ten wyżej jest pierwszym misiem produkcji własnej (nie do końca własnej - każda pomoc mile widziana), napchany kocim futrem, z odczepianymi łapkami i nóżkami. Obiekt pożądania młodzieży miast i wsi. 

Cud natury...

niedziela, lipca 18, 2010

Optional Fields

Creating user interface for Blackberry devices sometimes I have to create field which will hide and show themselves on forms. There are functions like insert, delete and add, but they usage require a lot's of effort because you have to specify index at which field has to be inserted. When there is a single optional dynamic field there is no big deal, but when there is two or more calculations for indexes take too much space and time. Reading javadoc I have found a very interesting function: replace. It will replace one field from manager with other unmanaged field.

placeHolderField.  getManager().  replace(placeHolderField, optionalField);
Placeholder field may be any field, I have used NullField - it has no width and no height. It is perfect for marking place where field should be inserted. To hide optional field replace field with placeholder.
Programując interfejs użytkownika na urządzenie Blackberry spotykam się czasem z potrzebą dynamicznego pokazywania i ukrywania kontrolek. Istnieją takie funkcje jak insert, delete oraz add, jednakże ich użycie jest kłopotliwe ze względu na to, że trzeba podać indeks na którym ma się znaleźć dany element. Przy jednym dynamicznie tworzonym polu nie jest to żadnym problemem, jednak, gdy tych pól jest więcej wyliczenia odpowiedniego indeksu zajmują zbyt dużo czasu i miejsca. Przeglądając dokumentację natrafiłem na bardzo interesującą funkcję: replace. Zamienia ono jedno z pól aktualnie będących wyświetlonych na inne, nie wyświetlane.

placeHolderField.  getManager().  replace(placeHolderField, optionalField);
Pole placeholdera może być dowolnym polem, ja użyłem pola NullField, bez szerokości, bez wysokości. Idealne do zapamiętania miejsca w którym znajdować będzie się dana kontrolka. Aby ukryć opcjonalne pole robimy odwrotną zamianę, zamieniamy pole na placeholder.

środa, lipca 07, 2010

Moja gęba pełna sznurka

Wychodząc od dentysty usłyszałem pochwałę: "byłeś dzielny". Ostatni raz coś takiego od dentysty usłyszałem w dzieciństwie, choć równie dobrze może to być moja fantazja i takie zdarzenie nigdy nie miało miejsca. Mogłem dostać lizaka i być pogłaskanym po głowie, trzydzieści lat na karku i takie wyróżnienie, może już jestem aż tak stary, że aż zdziecinniały, może też tak młodo wyglądam.

Lizak od dentysty, taki mały sabotaż. Naprawią Ci zęby, ale dadzą coś, żebyś wrócił. Nie zapomnij umyć zębów po zjedzeniu lizaka! Nie miałem ochoty sprawdzać jakie inne branże popełniają podobne fopa prezentowe, choć wydaje mi się, że karta kredytowa dla najlepiej oszczędzających pasuje pod ten przypadek. Dwa miesiące bez odsetek najczęściej skutkuje zadłużeniem niemożliwym do spłacenia z jednej pensji, zwłaszcza gdy wysoka roczna opłata jest zwracana za wykonanie transakcji na kwotę równą cztero-pięciokrotnościom limitu.  Próbowałem już kilka razy otrzymać kartę kredytową, bez opłat oczywiście z limitem na jedną czwartą, jedną piątą swoich zarobków. Niestety większość banków odmawia - nie dziwi mnie to zresztą, taki klient jest wyjątkowo niedochodowy, skoro może cały czas korzystać z bezodsetkowego kredytu.

Tytułowe sznurki w gębie to szwy, z obrzydzeniem wyjmujemy włosy z zupy, jednak gotowi jesteśmy tygodniami paradować z całymi kłębem sznura powciskanego w dziąsła.

poniedziałek, czerwca 28, 2010

Advanced DB Restoration Method

Halo? Administracja? Usunąłem kilka rekordów z bazy danych, czy moglibyście odłączyć zasilanie od serwera?


Kreatywne wykorzystanie buforowania danych do zabezpieczania przed przypadkową utratą danych.

wtorek, czerwca 15, 2010

Plan "B"

Trzeba być przygotowanym na każdą ewentualność. To do czego jesteśmy przyzwyczajeni może odejść w niepamięć razem z kawałkiem tego świata którym się otaczami.

Oto mój plan "B", wyszukany i zakupiony na alledrogo, w bardzo atrakcyjnej cenie:


Z tej książki dowiedziałem się bardzo wielu przydatnych rzeczy. Tego, że skrzynie dzielimy na klatki, szczelne i bardzo szczelne, tego, że pokostowane gwoździe najtrudniej wyjmuje się z drzewa brzozowego. Jest tam też opisane jak urządzić zakład produkcyjny oraz jak wyliczać dzienne normy dla robotników.

Mój plan "B" wygląda zatem tak: gdy zawiedzie wszystko inne, zacznij zbijać drewniane skrzynki.

niedziela, maja 23, 2010

Dysguglia

Nasza kochana współczesna młodzież zmaga się z przeróżnymi chorobami i ułomnościami które nasi dziadkowie nazywali jednym krótkim imieniem: "głupota". Mamy więc ułomności związane z pisaniem, czytaniem, liczeniem, myśleniem...

Dzisiaj nikt już się nie uczy w końcu google zna odpowiedź na wszystko, trzeba tylko zadać odpowiednie pytanie. Czekam na chwilę w której jakiś zaradny rodzic załatwi swojemu dziecku odpowiedni papierek, że nie mogło wykonać pracy domowej, gdyż ma naturalną niemożność nauczenia się korzystania z wyszukiwarek internetowych.

Może ktoś dorobiłby się lęku przed wyszukiwarką? Może przycisk szukaj wywoła paniczny lęk przed szpiegowaniem? Jest tyle nowych jednostek chorobowych do zdiagnozowania i tyle nowych leków które można sprzedawać chorowitym owieczkom.

niedziela, maja 09, 2010

Indywidualna oferta - nakład sto tysięcy egzemplarzy

Wygrzebałem ze swojej skrzynki pocztowej list, przesłany mi przez mojego ukochanego telekoma - tego samego który ustami swoich pracowników radził mi co bym sobie telefon na allegro kupił zamiast wymagać od nich poważnej oferty.
No i ta światła niesamowicie indywidualna oferta nie uwzględniała moich wykupionych aktualnie usług, lepiej, gdybym z niej skorzystał, obniżyłbym swoje miesięczne opłaty o połowę, ze względu na wartość usług, z których musiałbym zrezygnować. Zadziwiła mnie taka nieroztropność więc postanowiłem zadzwonić do konsultanta, chciałem złożyć reklamację na tę ofertę, przy okazji prosząc o numer tej reklamacji (jak się numerku nie dostanie, to no cóż, nie było reklamacji). Dziumdzia mocno zalękniona przełączyła mnie na kilkanaście minut na muzyczkę, jak wróciła to stwierdziła, że to taka ogólna oferta. "Czyli ta informacja o indywidualnej ofercie to bujda?", "Tak, dokładnie tak". Super, poprosiłem ją zatem o przygotowanie jakiejś oferty z interesującym mnie telefonem i jak zwykle okazało się, że na allegro są one co najmniej dwieście złotych tańsze.
Kupuj telefon na allegro, pracownicy plusa tak robią i sobie to chwalą.

niedziela, kwietnia 25, 2010

Szczęśliwy bocian - czyli jak zostać dostawcą aplikacji w AppWorld?

Nadeszła ta wiekopomna chwila w której postanowiłem zarejestrować się w sklepie aplikacji na urządzenia Blackberry jako niezależny dostawca. Nie jest to skomplikowany proces, jednak opiszę go tutaj, z tego względu, że nie nie znalazłem żadnych informacji na ten temat w polskojęzycznym internecie. Tyle tytułem wstępu, jedziemy z treścią:


Udajemy się na stronę https://appworld.blackberry.com/isvportal/, gdzie rejestrujemy się jako dostawca aplikacji. Nie jest to wielgachny formularz, podczas rejestracji podajemy dane do konta PayPal, z którego zostanie pobrana opłata rejestracyjna (200 USD). Na to samo konto będą też spływać zyski ze sprzedaży aplikacji. Po wypełnieniu wszystkich pól, opłaceniu opłaty nasze konto zostanie poddane procesowi weryfikacji, jakiś pracownik ze strony RIM się przyjrzy i poinformuje nas o dalszych krokach. Weryfikacja mojego konta potrwała kilka godzin (dwie, góra trzy), po niej otrzymałem na maila formularz (po angielsku), który należy wypełnić i potwierdzić u notariusza.
Niestety, nie jest to możliwe (różnice w prawie anglosaskim i europejskim), tak czy inaczej udałem się do notariusza, gdzie potwierdził on zgodność mojego dowodu osobistego z kserokopią, oraz przyjął moje oświadczenie o pozostawaniu przy życiu (serio, napisałem oświadczenie  w którym stwierdzam, że żyję i mam się dobrze). Te dokumenty zeskanowałem i odesłałem na adres maila z którego przyszedł formularz do wypełnienia. Kilka godzin później byłem już zarejestrowanym dostawcą aplikacji.

Cały proces przebiegł bardzo szybko, można go przeprowadzić w dzień lub dwa. Jest to zupełnie różne od tego co się słyszy na temat rejestracji w sklepie bodajże Apple lub Google.

wtorek, kwietnia 20, 2010

Reinstalacja

Ze względu na okoliczności przyrody zmuszony zostałem migrować ze starego poczciwego XP na zupełnie nowego Windows7. Pomimo tego, że instalacja przebiegła prawie bezproblemowo, pierwsze uruchomienie przebiegło gładko, później jednak, podczas normalnego używania zaczęły wyłazić tak durne błędy, że aż zadziwiające. Postanowiłem co bardziej kuriozalne opisać, nie bardzo wiem po co. Może po to, żeby bez problemu móc mówić: a nie mówiłem?

Moja osobista lista najdurniejszych błędów:
  • przeciąganie zajętego okienka: jest okienko kopiowania plików i ono popada w chwilową zadumę, próbuję je przesunąć - bezskutecznie, jednak jak się budzi to przeskakuje pod myszkę (pomimo tego, że żaden klawisz myszy nie jest wciśnięty), aby je puścić, trzeba je ciapnąć myszką (musi dostać sygnał puszczenia klawisza)
  • gadżet na pulpicie: klasa sama w sobie, dodałem sobie gadżecik - pogodynkę, na dzieńdobry pokazało mi pogodę z Warszawy, no to zmieniamy na Rzeszów - pokazuje ładnie, ale coś mały ten gadżet, powiększam, i znowu jest Warszawa - nosz ku...., no nic, wpisuję znowu Rzeszów, hmmm, do czego służy ten znaczek 'x', aaa, zamyka, no to otwieramy ponownie i co, ku.... znowu Warszawa
  • no i mój number one, błąd nad błędami - nowy mechanizm się pojawił (nowy dla tego systemu, widziałem to w Ubuntu jakieś 2-4 lata temu, no ale), można zmieniać głośność poszczególnych aplikacji korzystających z systemu dźwięku (dość przydatne, można osobno sterować głośnością przeglądarki i odtwarzacza), aplikacje w mikserze są ilustrowane swoją ikonką, co się stanie jednak jeśli ta ikonka jest duża (np. jest ustawiony na nią avatar rozmówcy z komunikatora)? Wtedy ten mikser wygląda tak:
    albo tak:
Pięknie panowie programiści - ikonka mi się zaaawsze zmieści, w końcu nie może być większa, pogratulować pomyślunku. Pogratulować.

piątek, kwietnia 02, 2010

Kulka, sir!


Mój Bold mnie wczoraj niesamowicie wkurzył i to kuleczką. Taką małą kuleczką. Tak, to wszystko przez kulkę, innym winnym jest naturalny wydzielany przez moje dłonie tłuszcz. Osadza się on bezczelnie na kulce oraz na toczonych przez nią rolkach (chodzi o trackballa z mojej komórki). No i pewnego pięknego dnia kulka traci całkowicie swój poślizg - najczęściej w jednym kierunku, w innych działając zupełnie normalnie. Co można z tym zrobić?
  • rozebrać i wyczyścić, potrzebujemy odpowiedniego klucza oraz tutoriala z sieci - ważna rzecz, po rozebraniu kulki warto sobie narysować ułożenie rolek, można ją łatwo złożyć w zły sposób i wtedy działa w lustrzany sposób
  • wymienić kulkę - zamawiamy nową np. na eBay'u - kilka funciaków, rozbieramy i wymieniamy - działa
  • metoda na szczoteczkę do zębów - najdziwniejsza z dziwnych metod, bierzemy starą szczoteczkę do zębów, z miękkim włosiem i szorujemy kulkę (w nierozebranej komórce oczywiście) - powinno pomóc
Taka technika, taki postęp, a niektóre rzeczy nadal trzeba "młotkiem" naprowadzać na odpowiednie tory.

Bonus:
Nigdy, przenigdy, za żadne skarby nie próbuj używać funkcji setFocus na polu zawartym w ekranie z wnętrza konstruktora. To nie zadziała i już. To nie programowanie Windowsa.





piątek, marca 19, 2010

Wiosna! Wiosna! Wiosna!

Jeszcze trzy miesiące temu, w środku głębokiej zimy, gdy śniegu było po pas, a ptaki marły w locie (z zimna oczywiście). Wysłałem maila do firmy RIM z zapytaniem, czy programista nieinstytucjonalny ma możliwość nauczenia się oraz korzystania z największego dobrodziejstwa tej platformy mobilnej: technologii push.

Otrzymałem taką odpowiedź: planujemy wprowadzić otwartą ewaluację na wiosnę.

Właśnie dostałem maila który informuje mnie, że moja prośba o dostęp do programu ewaluacji technologii push na Blackberry została zaakceptowana. Dla mnie właśnie przyszła wiosna.

poniedziałek, marca 15, 2010

Magia Kompletów

Czasem robię coś, ale nie wiem dlaczego. Ostatnio kupowałem filiżanki, a dokładniej czajnik do kawy mocca, taki ciśnieniowy co to się gotuje w nim woda a on parą wodną tę wodę przez kawę przepycha. No i przy kupowaniu tych filiżanek pojawiła się myśl, czemu wszystkie są takie same. Co mnie pcha w kierunku kupowaniu kilkunastu taki samych rzeczy, pomimo tego, że są przecież sprzedawane na sztuki. Cóż mam zrobić jeśli podobają mi się dwa zupełnie odmienne wzory? Może, trzy, albo cztery różne wzory filiżanek?
Przełamałem ten wzorzec kulturowy (bo jakaż to jest inna cholera?), kupiłem stado całkiem różnych filiżanek. Skończą się te wieczne pytania, która czyja była. Każdy ma inną i gra gitara. Ktoś może powiedzieć, to brzydko wygląda, ja się zapytam, czy zastanawiał się kiedyś, dlaczego w ogrodzie można mieć różne kwiaty, a pole zboża jest uważane za nudne?
Filiżanki to mój kwietny klomb.

środa, lutego 24, 2010

Geologia

Obserwujemy tutaj ustępowanie lądolodu śródpolskiego, w lokalizacji rzeszowskiej. Wyraźnie widoczne lodowe ostańce chowające się przed słońcem w obszarze ciemności bezpośrednio pod latarnią. Widać lodowcowy brud, chroniący wnętrze lodowca przed słońcem, a powstały przez wchłanianie materiału pylastego w obszarze operacji lodowca.

Należy zwrócić uwagę na znajdujący się na pierwszym planie wózek narzutowy. Cofający się lądolód pozostawił wiele takich artefaktów które cieszą wprawne oko. Przykładowo mikroorganiczne otoczaki zwane potocznie psią kupią. Ich kolekcjonerzy biją się o każdy niezwykły okaz, ich aukcje na holenderskich giełdach kończą się astronomicznymi cenami. Kobiety marzą o tym, aby otrzymać zaręczynowy pierścionek z kupiatym oczkiem. Chyba mamy 'diamond killera' na którego wszyscy czekaliśmy!

poniedziałek, lutego 22, 2010

Dysharmonia Karmiczna

Kawał czasu temu miałem znajomego, Przemysława, który wprowadził mnie w meandry nierównowagi - dysharmonii karmicznej. W każdej dziedzinie życia można wprowadzać zasady równowagi, zacznijmy od gotowania. Porównajmy wielkością kurę oraz krowę: w bezpośrednim starciu, kura nie ma szans, jednak gdy robimy jajecznicę to cząstkę karmy kury - jajko mieszamy w złych proporcjach z cząstką karmy krowy - masłem. W jajecznicy karma kury wygrywa z karmą krowy, te małe przegrane bitwy kumulują się, w końcu eksplodują w jednym rozładowującym napięcie wybuchu karmy. Najczęściej wiąże się to z zemstą krowiej karmy na kurzej, często na ludziach, gdyż ludzie to kury światowego podwórka - niektórzy sugerują, że taką wyrównującą eksplozją jest uciekające mleko. Jak uniknąć takiego niefortunnego zdarzenia w kuchni? Do każdego jajka brać kostkę masła - wtedy zachowana jest odpowiednia proporcja karmy i nie ma potrzeby niwelować dysproporcji.
Przykłady takich dysproporcji można mnożyć: dowcipy bez puenty, obiad bez deseru, zakup bez reszty, podróż bez celu. Strzeżcie się rozładowujących się dysharmonii karmicznych - nie znacie dnia ani godziny, gdy dopadnie was zemsta karmy.

piątek, lutego 19, 2010

GPS

Praktycznie każdy bardziej zaawansowany telefon, lub każdy, nawet najgłupszy smartfon jest wyposażony w kostkę pozwalającą na korzystanie z dobrodziejstw systemu GPS.

Dowiedzmy się zatem, jak można dobrać się do danych o naszym położeniu, w prostej aplikacji, pokazującej nam gdzie aktualnie się znajdujemy.
Pierwsze co musimy zrobić, to uzyskać dostęp do klasy LocationProvider, klasa ta wystawia jedną metodę, getLocationProvider. Funkcję tę należy nakarmić kryterium, w którym definiujemy wymaganą dokładność. W tym przykładzie, nie potrzebujemy informacji na temat wysokości oraz prędkości i kierunku (przydatne gdy chcemy stworzyć coś na kształt nawigacji, albo trackera).


Criteria cr = new Criteria();
cr.setAddressInfoRequired(false);
cr.setAltitudeRequired(false);
cr.setPreferredResponseTime
        (Criteria.NO_REQUIREMENT);
cr.setSpeedAndCourseRequired(false);
cr.setCostAllowed(true);
cr.setHorizontalAccuracy
        (Criteria.NO_REQUIREMENT);
cr.setPreferredPowerConsumption
        (Criteria.NO_REQUIREMENT);
cr.setVerticalAccuracy
        (Criteria.NO_REQUIREMENT);

LocationProvider lp =
LocationProvider.getInstance(cr);


Gdy usługa ta jest niedostępna albo wyłączona, funkcja ta zwróci nam null, który musimy ładnie obsłużyć, musimy też uważać na wyjątki - no ale to jest chyba dla wszystkich oczywiste. Obsługę i pobieranie danych należy zepchnąć na wątek chodzący w tle, próba pobrania lokalizacji z wnętrze dystrybutora zdarzeń (event dispatcher) spowoduje wygenerowanie wyjątku, gdyż aplikacja nie zezwoli nam się zablokować na tak długi czas (czas oczekiwania na synchronizację z danymi satelitarnymi może być baaardzo długi).

Location location = lp.getLocation(180);

if (location.isValid()) {
 Coordinates c =
       location.getQualifiedCoordinates();
 if (c != null) {
  double latitude = c.getLatitude();
  double longitude = c.getLongitude();
  // przetwórz otrzymane dane
 }
}


W wyniku tych akcji otrzymamy suche dane, które użytkownikowi nic nie mówią. Zamienimy je w podgląd terenu pobrany z pomocą Google Maps API (wersja statyczna). W ten sam sposób stworzono ten obrazek, który jest generowany na żądanie przez serwery Google, w sposób określony adresem URL:


http://maps.google.com/maps/api/\ staticmap?center=49.232611,20.015083\ &size=200x200&maptype=terrain\ &sensor=true&zoom=15\ &markers=size:mid|49.232611,20.015083

Zbieramy wszystko do kupy i w wyniku otrzymujemy taką oto zgrabną aplikacyjkę, które nie ma większego praktycznego sensu, jednak jako demonstracja zupełnie wystarczy.


Kilka uwag:
  • jeśli ustawiasz obserwatora na zdarzenia zmiany lokacji to obsłuż również zdarzenie zmiany dostawcy lokalizacji - może nagle zniknąć
  • obsłuż zdarzenie odebrania rozmowy - po jej zakończeniu od nowa ustaw obserwatora na zmiany lokalizacji

Kod źródłowy aplikacji jest dostępny o tutaj.

czwartek, lutego 11, 2010

PHP-E

Walcząc z amerykańską dominacją na rynku oprogramowania Unia Europejska postanowiła wprowadzić innowacyjną zmianę: zupełnie nowy język programowania PHP-E. Specjalną odmianę języka PHP dostosowaną do realiów Unii Europejskiej, jej rynku oraz klientów. Poniżej mamy przykładowy kod źródłowy w tym innowacyjnym języku programowania:

<php-e
   €zmienna
= "hello";    €druga = "world";    echo €zmienna." ".€druga."\n";
?>

Na poziomie bibliotek kod ma być zgodny z php, jednakże planowane są w nim rewolucyjne zmiany, które uczynią go lepszym. Niestety, żaden z moich rozmówców nie był w stanie podać przykładu ulepszenia z tego prostego względu, że nie rozpisano jeszcze przetargu na projekt ulepszeń. Dodatkowo zostaną rozpisane przetargi na interpreter języka, dokumentację oraz szkolenia dla programistów. Unia zamierza wyłożyć na to kilkaset milionów euro z programu "Społeczeństwo Informacyjne - Jeden naród, jedna unia, jedna droga".

Ma to ożywić nowoczesną gospodarkę, spowodować też ożywienie w przemyśle papierniczym i wydawniczym - zwiększy się produkcja oraz sprzedaż książek, zwiększą się też płace w tym sektorze gospodarki. Docelowo wszelkie oprogramowanie serwerowe ma być dostarczane właśnie w php-e. Chłodne komentarze w tej sprawie docierają zza oceanu, komentujący biorą w obronę amerykański monopol, bezpodstawnie insynuując marnotrawstwo pieniędzy podatników, ignorując pozytywny wpływ takich inicjatyw na wewnętrzny rynek unii. Polscy komentatorzy wypowiadają się entuzjastycznie, nieoficjalnie dowiedziałem się, że jeden z dużych serwisów zamierza w przyszłości przejść właśnie na ten język, ze względu właśnie na jego rewolucyjne zmienione podejście do sposobu pisania programów.

Jako ciekawostkę warto dodać, że php-e (czytaj pi-ejdż-pi-juro) będzie reklamowane europejskimi nacjami, igrając ze stereotypami: jurnego juhasa oraz jurnego wikinga.

czwartek, stycznia 28, 2010

Problem z Selenium

Selenium server w wersji 1.0.1
Firefox w wersji 3.6

Dzisiaj przekonałem się, że zautomatyzowane testy, w ramach nieustającej integracji to nie taka prosta sprawa. Jak w przypadku IE (tfu, tfu - kysz, kysz) wszystko działa dobrze i tak jak powinno, to w przypadku Firefoxa Selenium raczyło mnie takim oto uroczym błędem:
Today, I realized that automated tests, withing continuous integration build are not easy task to do. When it comes to IE, everything works well and as it was expected, but in Firefox it ends with very nice error:
RuntimeException: Firefox refused shutdown while preparing a profile
No pięknie, z tego co widać w menedżerze zadań, przeglądarka się uruchamia jednak nie wykonuje żadnych testów. Pogrzebawszy w Internecie, znalazłem rozwiązane, niestety nie jestem w stanie podać linka do źródła - zagubił mi się gdzieś.
When I opened task manager, I can see that browser is up and running, but it refuse to make any tests. After short intercourse with Internet I found solution, but I'm unable to put a link to it because I lost it somewhere in the meantime.

Winnym całego zamieszania jest niedawny update Firefoxa do wersji 3.6, zaszyte wewnątrz Selenium pluginy do przeglądarki są przycięte do wersji 3.5., przy uruchamianiu pojawia się okienko z informacją o niezgodnych pluginach i na tym przeglądarka zawisa. Aby to naprawić (tymczasowo), należy przejrzeć katalogi wewnątrz jara selenium zaczynające się od customProfileDir..., i w każdym pliku install.rdf zamienić odwołanie 3.5.* na 3.6.*, lub jak kto woli 4.*. Po zmianie należy te pliki wrzucić z powrotem do pakietu serwera i dzięki temu wszystko powinno działać prawidłowo.
Guilt for this whole mess is the last update for Firefox to version 3.6. Inside of Selenium there is a pack of browser plugins which will work in Firefox 3.5, but not higher than that. When browser starts it shows window, that some plugins are to old and it hangs in this window waiting for user reaction. To fix this (temporary), you should browse inside server package (jar), inside of directories starting at customProfileDir.., and inside of every single plugin directory, in each install.rdf file change required version from 3.5.* to 3.6.* or when it is necessary to 4.*. After change files should be inserted inside of jar archive, and after this everything should work correctly.

sobota, stycznia 23, 2010

GUI

Intuicyjny interfejs - Święty Graal projektowania interfejsu. Główna bolączka Linuchowych dystrybucji, tworzonych przez programistów zapaleńców. Większość moich kolegów uważa tworzenie interfejsu graficznego aplikacji za uwłaczającą, durną robotę. Zapominają o tym, że większość aplikacji jest używana przez nie-programistów, którzy zderzeni z nielogicznym interfejsem dostają po prostu świra.

Poniżej jest przykład dwóch interfejsów, tę po lewej mam w domu, tę po prawej w pracy. Od razu widać którą projektowali inżynierowie dla inżynierów, a która zrobiona została dla ludzi. Warto o tym pamiętać, gdy następnym razem ktoś wpadnie na pomysł, żeby aplikację zamykać wciskając guzik "Start".



piątek, stycznia 22, 2010

Nazwa projektu

Nazwa projektu w Blackberry Eclipse Plugin nie może zaczynać się od liczby. Zostanie to po cichu zamienione na podkreślenie-liczba podczas generowania różnych plików (między innymi dla debuggera), jednak wynikowy plik .cod nadal będzie zaczynał się od cyfry. Skutecznie uniemożliwia to wszelkie debuggowanie.
Project name in the Blackberry Eclipse Plugin cannot start with number. It will be automagically changed into underscore-number during generation of some files (especially for debugger), but resulting .cod file still will start with number. This make debugging almost impossible.

czwartek, stycznia 21, 2010

Leśny domek



W czasie ostatniego pobytu na prowincji na skraju lasu znalazłem opuszczone zabudowania. Co prawda, znam je od dość dawna, jednak teraz, pokryte śniegiem i lodem oraz otoczone bezlistnymi gałęziami wygląda to naprawdę złowieszczo. Ciekawe jaka się za tym wszystkim historia kryje?

sobota, stycznia 16, 2010

Pan Kleks na sankach

Będąc starym dziadem nie nawykłem do wykazywania jakiejkolwiek aktywności fizycznej, jednakże, potrzeba chwili, natchnienie oraz leżąca odłogiem górka pchnęły mnie do czynienia szalonych rzeczy.
Sanki w dłoń, łuki w juki ostrogi na nogi. Kto żyw zjeżdża z górki na pazurki. Widać było, że górka pomimo swojej dawnej świetności teraz jest mało uczęszczana, większość dzieciarni spędza tę zimę przed komputerem. Tylko takim starym prykom jak ja chce się zjeżdżać jeszcze na sankach. Niestety szybko zapadł zmrok i zabawa skończyła się szybciej niż się zaczęła.


poniedziałek, stycznia 11, 2010

Prolog, XPCE, pce_main_loop

SWI-Prolog w wersji 5.9.5-121-gcd55e6b

Jest bardzo dobry podręcznik do XPCE. Jest w nim opisane, jak konstruować okna, ramki, menu i całą resztę okienkowego szyku. Jednak trudno jest znaleźć schemat, szablon standardowego punktu startowego aplikacji. Dokumentacja wspomina predykat pce_main_loop/1, jednak nie ma z nim wielu przykładów (help też milczy na jego temat), poniżej jest przykład jego użycia.

:- [load]. main :- pce_main_loop(main). main(Argv):-    new(W, mainwindow),    send(W, status, full_screen).

Pierwsza linia ładuje plik load.pl, standardowo dołączający wszystkie pliki potrzebne do uruchomienia programu. Predykat main/0 służy do uruchomienia aplikacji przy wykorzystaniu kompilatora:

pl --goal=main --stand_alone=true -o bin/application -c application.pl

To polecenie można umieścić w pliku Makefile, po to by wyprodukować samodzielną zdolną do uruchomienia binarną wersję aplikacji.

Uruchomiona przy pomocy main. aplikacja będzie działała tak długo, jak długo będą działały jakiekolwiek utworzone okienka. Wraz z zamknięciem ostatniego z nich XPCE wyda polecenie halt które zakończy sesję Prologa. Chcąc testowo uruchomić nasz program wystarczy wydać polecenie main(_)., uruchomi to aplikację, jednak nie zamknie środowiska wraz z zamknięciem ostatniego utworzonego okienka.

SWI-Prolog version 5.9.5-121-gcd55e6b

There is a very good manual for XPCE. It has very descriptive in place where their describe creating windows, frames, menus and all this visual stuff, but there is hard to find a schema for standard entry point for XPCE application. Manual mention pce_main_loop/1, but there is no example usage (help is missing description for it too). Here is an example of usage:

:- [load]. main :- pce_main_loop(main). main(Argv):-    new(W, mainwindow),    send(W, status, full_screen).

First line consults load.pl, it is a standard file which will load all files required for program startup. main/0 predicate is used for compilator as a standard entry point:

pl --goal=main --stand_alone=true -o bin/application -c application.pl

This command may be a part of Makefile, and may be used to create standalone, executable binary program version.

Application started with main. will be working as long as there will be any XPCE object existing which has been created inside of main/1. When last of it will be closed XPCE will call halt and whole Prolog session will be over. To run application in test mode you have to just call main(_)., it will run application, but Prolog session will remain after close of last window.

sobota, stycznia 02, 2010

Granice świąt

Znowu mnie wzięło na wspomnienia, chyba się robię starą nudną dupą. Ostatnio pisałem o tym, że większość przyjemnych zdarzeń ma dla mnie przypisany swój indywidualny charakterystyczny zapach. Tak jak wyprawa na Kasprowy powiązana jest z zapachem kremu na odmrożenia, tak święta Bożego Narodzenia kojarzą mi się z zapachem woskowej pasty do podłogi oraz obieranych pomarańczy. Tym razem jest coś, co nie jest zapachem, a służy do wyznaczania granicy, wiem kiedy się zaczynają, a kiedy kończą święta.

Wydarzeniem które rozpoczyna je, dla mnie, to chwila z którą choinka zostaje ubrana. Czasem ta chwila jest bardzo wcześnie, na początku grudnia albo i nawet pod koniec listopada. Lubię czuć świąteczną atmosferę, a te migoczące prądożerne lampeczki wyjątkowo dobrze mnie w tym wspomagają. Chwila w której święta definitywnie i nieodwołalnie się kończą to koncert noworoczny z Wiednia. Pamiętam jak oglądałem go, będąc jeszcze gówniarzem, razem z ojcem i było to w czasach gdy w TV było tylko kilka programów, a Kevin tak bardzo nie nużył. Teraz, gdy jestem już na swoich włościach, obwieszczam koniec świąt oglądając ten koncert.

Zastanawiające jest, jak bardzo świeckie się robi Boże Narodzenie...