sobota, lipca 31, 2010

A może jutro?

Kiedyś sprzedałem wam tutaj sposób [nie mój :-)] pozwalający na wykorzystanie "zasady kopernikańskiej" do wyznaczenia z pewnym prawdopodobieństwem tego ile coś jeszcze będzie trwało.
W skrócie idzie to tak, że jeżeli wiemy, że coś już trwa L to w 60% przypadków będzie trwało jeszcze od L/4 do L*4. Mówiąc inaczej, jeżeli weźmiecie pod uwagę wszystkie zjawiska, które trwają już L, to 60% z nich będzie trwała jeszcze od L/4 do L*4.

Bierze to się stąd, że nasze L znajduje się najprawdopodobniej w "nieszczególnym" momencie czasu trwania zjawiska, gdzieś bliżej środka niż początku lub końca, dla 60% oznacza to, że nasza chwila znajduje się, w odległości od -30% do 30% od środka jakiegoś rzeczywistego czasu trwania zjawiska, czyli że w najkrótszym przypadku jeszcze 20% czasu jest przed nami, a w najdłuższym 20% jest dopiero za nami.

Tyle tytułem wstępu.

Dziś inne wykorzystanie tego niecnego tricku ;-)
Jak już tu [i w innych miejscach ;-)] pisałem, czekam na zaproszenie do Google AppInventor for Android. Nie wiem ile trwa zwykle oczekiwanie.

Chciałbym więc wiedzieć jaka jest szansa, że to będzie jutro :-)

Opisuje to zależność P(L,A)=(1+L/A)-1=A/(A+L), gdzie L to czas trwania zjawiska do chwili obecnej, a A to czas "do zakończenia". P(L,A) to zaś prawdopodobieństwo tego, że zjawisko trwające L zakończy się w czasie nie dłuższym niż A.

Ja czekam 18.5 dnia, a chciałbym poznać szanse na to, że moje oczekiwanie skończy się w ciągu najbliższego dnia.

Podstawiamy i dostajemy wynik, którym jest P(18.5,1)=5.128% :-)
Mam więc trochę ponad 5% szans na to, że jutro przyjdzie zaproszenie.
Jeszcze inaczej to przedstawiając, z 20 osób które już czekają 18.5 dnia, 1 powinna dostać zaproszenie ;-)

Chcę być tą jedną osobą ;-)

[To liczenie to pewne nadużycie ;-), bo w rzeczywistości moje wyliczenie mówi tylko tyle, że 5.128% ze wszystkich zjawisk we wszechświecie trwających już 18.5 dnia skończy się w ciągu następnego dnia. Jednak można pewnie przyjąć, że te obliczenia mają sens o tyle, że Google prawdopodobnie losuje osoby do zaproszenia, jeśli jest to losowanie, w którym ciągle są zapisy to zawsze zostanie ktoś w ogonie ;-)]
Tu zastrzeżenie jeszcze, jest 3 w nocy i mogłem coś źle policzyć czy samemu sobie wyobrazić ;-)

A tutaj "narzędzie" do liczenia ;-)



Podobne postybeta
Sztuczka - ile to jeszcze potrwa?
Reality Check
OAuth mnie denerwuje ;-)
Modale nie takie dobre dla Androida ;-)
Całkujący Dart ;-)

Paradoks Java'y - domyślny poziom widoczności jest stosowany najrzadziej ;-)

Nie mam twardych danych, ale już trochę kodu w Java'ie widziałem i ciekawa sprawa, najrzadziej używanym zakresem widoczności stosowanym w kodzie Java'owym wydaje się być default :-)
Najpowszechniej używane są public i private, z czego większość metod jest zwykle public, a większość pól w klasach jest private. Bardziej wysublimowani programiści używają jeszcze protected, ale default wydaje się być stosowane najrzadziej ;-)

To chyba świadczy o tym, że idea by przy pomocy pakietów i widoczności budować API jest zbyt mało oczywista.

Ok, jednak podam trochę liczb bo w tzw. międzyczasie zajrzałem do Google Code Search i "pomierzyłem" trochę ;-) i okazuje się, że wygląda to tak [hostowanie w Google Docs, eksport z OpenOffice.org przy pomocy OOo2GD]:


Czyli byłem bliski w moich przewidywaniach, okazuje się, że default jest używany jako modyfikator dostępu tylko dla 11.5% metod ze zwracanym wynikiem jako void, int, String czy boolean, rzadziej używany jest tylko protected, bo w 7.6% przypadków :-).
Blisko 70% wszystkich metod w Java'ie jest publiczna i dostępna dla wszystkich, a 75% kodu dostępne jest poza pakietem pochodzenia.

Nie świadczy to o nas programistach za dobrze ;-)

Twórcy języka tworząc defaulta dali nam sygnał, że jest to najbardziej pożądany poziom widoczności, a my to olewamy ;-)

W klasach wygląda to ciut lepiej, bo aż 18.7% klas ma dostęp domyślny, 77.18% jest publicznych, 3.66% jest prywatna i tylko niecałe 0.5% klas jest protected [czyli są to też klasy wewnętrzne bo tylko one mogą mieć widoczność protected].

Cała ta enkapsulacja, ukrywanie implementacji i podobne są chyba zbyt trudne do stosowania w normalnym życiu ;-)

A, i to może być dyskusyjne, wydaje mi się, że kod, który można przeglądać w Google Code Search jest kodem pisanym przez statystycznie lepszych programistów niż normalny kod produkcyjny.

Potwierdza się moje twierdzenie, że jako programiści niedouczeni jesteśmy ;-)

W ramach sprzedaży metodologii "badania", np. tak szukamy klas protected, a tak metod publicznych zwracających String.


Podobne postybeta
Klasa statyczna - ki diabeł?;-)
protected - powinni tego zakazać...
Przeszacowany Linux, Niedoszacowany Windows i Ukryty MacOS ;-) czyli o tym na jakich systemach używa się głównie OOo2GD
Metapost o pisaniu posta, albo moje próby z Obsidianem
Electron + Airly = wskaźnik jakości powietrza w pasku ;-) - part 2, źródła ;-)

piątek, lipca 30, 2010

Rozszyfrowałem w końcu znaczenie słowa "socjalizm" dla przeciętnego "libertarianina" ;-)

Zawsze mnie fascynowało jak różnego rodzaju "libertarianie" rozumieją pojęcie "socjalizm", wydawało mi się, że ich definicja jest mniej więcej taka "jeżeli coś jest wg. mnie złe to jest socjalistyczne". Definicja głupia, ale ma swoje zalety w stosunku do takiej którą wyznają ;-)

Dziś mi jeden przedstawił taką oto definicję:
Dla mnie socjalizm ma prostą definicję, która składa się z dwóch punktów: 1) Istnieje grupa, która uważa, że wie lepiej od innych ludzi jak tamci mają żyć (to akurat jest typowe dla wszystkich systemów) 2) Grupa ta jest u władzy i wdraża swoje idee w życie.

Czyli de facto dla dowolnego "libertarianina" wszystko jest socjalizmem. Gdyby "libertarianie" doszli do władzy i wprowadzili swoje zasady w życie staliby się wg. tej "libertariańskiej" definicji socjalistami......

Piękne!


Podobne postybeta
"Herbatka"
Jak socjaliści stworzyli globalne ocieplenie by uderzyć po kieszeni islamistów i Rosję ;-)
OpenOffice.org2GoogleDocs na Apple - pierwsze podejście ;-)
Noc
Otwarty umysł - definicja ;-)

czwartek, lipca 29, 2010

zVATowani :-)

Właśnie widziałem w telewizorze jakiegoś gościa z PiS, który komentował pomysł podniesienia VAT słowami w stylu "rząd chce spłacać długi z kieszeni Polaków"... a kurde niby z czyje kieszeni ma spłacać? Szwedów?
Jak państwo zaciąga długi na działanie i beneficjentami tych pieniędzy są obywatele, to nie kto inny jak ci obywatele musi spłacać te długi. Inaczej się nie da.

Mnie się pomysł podnoszenia VAT nie podoba, ale skądś trzeba kasy na działanie, a państwo ma tylko tyle ile dostanie od obywateli, ani złotóweczki więcej. Jak pożycza to później musi spłacić. Podoba nam się, że buduje się aktualnie ponad 1000 km autostrad, że mamy darmowe studia, policje i inne takie, to trzeba za to płacić.



Podobne postybeta
Szympansy
Dołożę się do budżetu Rybnika ;-)
Wpis próbny, czyli rozproszona wirtualna maszyna Java'y
"Herbatka"
zVATowani 2

Karciane dylematy

Właśnie przyszły do mnie koszulki, które ostatnio kupiłem. Jednak przed zakupem miałem poważny problem, bo sprzedawca wspierał zakupy przez kartę kredytową przez RBS WorldPay (czy podobnie), i dla mnie, mieszkańca dzikiego kraju na wschodzie Europy (chociaż w centralnej Europie ;-)) tajemnicą było czy mogę im bezpiecznie powierzyć numer karty kredytowej.
Nawet to, że jak później odkryłem jest to Royal Bank of Scotland niewiele mówi, bo w internecie można nazwać się jak chcesz ;-)
Dlatego stwierdzam, że przydałaby się nowa usługa u operatorów kart kredytowych. Weryfikacja pośrednika. Wchodziłoby się na stronę operatora karcianego, wpisywało adres a oni podawaliby informację czy znają daną stronę i czy można jej ufać. Jeszcze informacja o średnim wolumenie sprzedaży i już byłby czad :-)

A teraz zostaje nam tylko używanie własnego osądu i korzystanie ze znanych sprzedawców, z Amazona, z PayPala i Google Checkout.



Podobne postybeta
PayPal - rozczarowuje
Integracja
Gotówka jest już niepotrzebna (prawie)
No i jest problem natury logistyczno-temporalnej....
Czciciele słońca?

Wyznanie, wyjaśnienie i coś z zupełnie innej beczki ;-)

Wyznanie.
Wyznam, że ostatnimi dniami gdy widzę, że na Gmailu pojawił się nowy mail to z nadzieją patrzę bo może to jest mail z zaproszeniem do Google AppInvetor for Android ;-)
Nie jest to jeszcze ten poziom oczekiwania i radosnej niepewności przeradzającej się w smutek gdy nie jest to jednak ten mail, co w przypadku maila od przebywającej daleko dziewczyny, ale jakaś namiastka tamtych uczuć jest ;-)
No i tamte zawsze przychodziły prędzej ;-)

Gwoli wyjaśnienia.
W moim poprzednim-poprzednim poście [nie ma to jak adresowanie względne ;-), czyli w poście @-2 jeżeli użyć oznaczeń z RedCode [chyba tak to się oznaczało ;-)]] o ziarenkach specjalnie napisałem, że w rozważaniach abstrahuję od problemu wyższości życia człowieka nad życiem rośliny, bo moim celem było pokazanie dysonansu w terminologii.
Jak ścinamy drzewo to mówimy o zabiciu drzewa, ale jak ktoś nie sadzi nasionek drzewa to wcale o zabijaniu drzewa nie mówimy i nie myślimy, ot po prostu jakieś nasiona nie będą miały okazji na zbudowanie drzewa.
Ale ideolodzy ruchów zwanych dla zmyły pro-life dokonali takiego gwałtu na logice i znaczeniu słów, że w przypadku jednego specjalnego rodzaju "nasionek" nieposadzenie ich nazywają zabijaniem.
To jest clue tamtego postu - nie dajmy sobą manipulować.

Teraz z innej beczki :-)
Zawsze uwielbiałem książki Arthura C. Clarke'a za taki głęboko osadzony w nich optymizm (OK, za wyjątkiem Końca Dzieciństwa i może paru nowszych książek, ale w tych nowszych też tam był). Optymizm objawiający się wiarą w moc Nauki. Prawie zawsze bohaterowi czy bohaterki byli kimś związanym z nauką lub techniką i zawsze to działało dla dobra ludzkości.
Podobnie się poczułem czytając dziś w nocy artykuł w lipcowym numerze Świata Nauki, o pomyśle budowy masy urządzeń do wychwytywania CO2. Jest Nauka, jest pomysł na wykorzystanie, jest nadzieja na lepszy świat.
Piękne, i chcę by tak było! :-)


Podobne postybeta
Książkowa faza - stare hard SF :-)
A jednak jest nadzieja :-)
"W przededniu" pierwsza książka Orsona Scott Carda, która jest SF ;-)
Ewolucja technologii i obyczajów w SF
Kura immunologiczna ;-)

wtorek, lipca 27, 2010

Plan lekcji - wersja hard ;-)

Swego czasu pisanie programów do wyświetlania planu lekcji czy zajęć to był mój odpowiednik hello world ;-) [to i całkowanie numeryczne ;-)].

Pamiętam, że używałem do tego paru języków, ale największym hardcorem była wersja w assemblerze skompilowana przy pomocy TASMa, dla Win16 i Win32 ;-)

Najważniejsza część programu zaczyna się od labelki obsluga101_107 [tak, wtedy pisałem jeszcze w kodzie po polsku, przestałem dopiero gdy zacząłem pracować w Motoroli ;-)].
Najpierw ustawiany jest nowy tytuł okienka, który odpowiada wybranemu dniowi tygodnia, a następnie otwierany jest plik nazwa_tygodnia.txt [który musi się chyba znajdować na dysku C:, ale głowy tu nie dam ;-)], którego zawartość jest wkładana do okienka prezentującego plan ;-)
Ciekawe może też być to co zaczyna się od labelki wmcreate, tam jest obsługa komunikatu WM_CREATE, który dostaje funkcja okna w momencie gdy system pragnie by okienko się stworzyło. Mamy tam najpierw 8 wywołań makra BUTTON, z parametrami takimi jak nazwa, koordynaty X i Y, wymiary (długość i wysokość) oraz numerem komunikatu podpiętego do guziczka :-) [dokładniej tego co chyba w wParam leci w momencie gdy obsługiwany jest komunikat WM_COMMAND].

locals
jumps
.model large, WINDOWS PASCAL
include windows.inc
include winmak.mak
.586p


extrn BEGINPAINT:PROC
extrn CREATEWINDOW:PROC
extrn DEFWINDOWPROC:PROC
extrn DISPATCHMESSAGE:PROC
extrn ENDPAINT:PROC
extrn GETMESSAGE:PROC
extrn GETSTOCKOBJECT:PROC
extrn INITAPP:PROC
extrn INITTASK:PROC
extrn INVALIDATERECT:PROC
extrn LOADCURSOR:PROC
extrn MESSAGEBEEP:PROC
extrn MESSAGEBOX:PROC
extrn POSTQUITMESSAGE:PROC
extrn REGISTERCLASS:PROC
extrn SHOWWINDOW:PROC
extrn TEXTOUT:PROC
extrn TRANSLATEMESSAGE:PROC
extrn UPDATEWINDOW:PROC
extrn WAITEVENT:PROC
extrn SETWINDOWTEXT:PROC
extrn GETWINDOWTEXT:PROC
extrn SENDMESSAGE:PROC
extrn GETDLGITEM:PROC
.data

db 16 dup (0)
psp dw ?
pszCmdline dw ?
hPrev dw ?
hInstance dw ?
cmdShow dw ?

newhwnd dw 0
lppaint PAINTSTRUCT <0>
msg MSGSTRUCT <0>
wc WNDCLASS <0>
mbx_count dw 0

szClassName db 'PLC',0
INCLUDE winconst.inc
szMon db 'Poniedziałek',0
szTue db 'Wtorek',0
szWed db 'Środa',0
szThu db 'Czwartek',0
szFri db 'Piątek',0
szSat db 'Sobota',0
szSun db 'Niedziela',0
szKoniec db 'Koniec',0
szBrakLekcji db 'Nie ma lekcji!!!',0
szPathName db 'd:\plan\'
szFileName db ' .txt',0
szTitleName db 'Plan lekcji - '
szDzien db 14 dup(0)
acDNI db '12345',0
hwndSTATIC dw 0
.code
.286
;-----------------------------------------------------------------------------
start:

mov ax, @data
mov ds, ax ; set up data segment

;Windows initialization. Sets up registers and stack.

;INITTASK returns:
; Failure:
; AX = zero if it failed
; Success:
; AX = 1
; CX = stack limit
; DX = cmdShow parameter to CreateWindow
; ES:BX = -> DOS format command line (ES = PSP address)
; SI = hPrevinstance
; DI = hinstance

call INITTASK
or ax,ax
jnz @@OK
jmp @@Fail
@@OK: mov [psp],es
mov word ptr [pszCmdline],bx
mov [hPrev],si
mov [hInstance],di
mov [cmdShow],dx

;Initialize the Windows App

xor ax,ax
push ax
call WAITEVENT
push [hInstance]
call INITAPP
or ax,ax
jnz @@InitOK

@@Fail:
mov ax, 4CFFh
int 21h ; terminate program


@@InitOK:
;-----------------------------------------------------------------------------
; This is generally where WinMain is called. We won't use a WinMain, since
; this app is 100% assembly.

cmp [hPrev], 0
jne already_running

; initialize the WndClass structure
mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW
mov word ptr [wc.clsLpfnWndProc], offset WndProc
mov word ptr [wc.clsLpfnWndProc+2], seg WndProc
mov [wc.clsCbClsExtra], 0
mov [wc.clsCbWndExtra], 0
mov ax, [hInstance]
mov [wc.clsHInstance], ax
mov [wc.clsHIcon], 0

push 0
push IDC_ARROW
call LOADCURSOR
mov [wc.clsHCursor], ax

push WHITE_BRUSH
call GETSTOCKOBJECT
mov [wc.clsHbrBackground], ax

mov word ptr [wc.clsLpszMenuName], 0
mov word ptr [wc.clsLpszMenuName+2], 0

mov word ptr [wc.clsLpszClassName], offset szClassName
mov word ptr [wc.clsLpszClassName+2], ds


push ds
push offset wc
call REGISTERCLASS

already_running:

push ds
push offset szClassName ; Class name
push ds
push offset szTitleName ; Title string
push WS_OVERLAPPEDWINDOW+WS_VISIBLE and WS_SYSMENU; high word of Style
push 0 ; low word of Style
push CW_USEDEFAULT ; x
push CW_USEDEFAULT ; y
push 400
push 220
push 0 ; parent hwnd
push 0 ; menu
push [hInstance] ; hInstance
push 0 ; lpParam
push 0 ; lpParam

call CREATEWINDOW

mov [newhwnd], ax

push [newhwnd]
push [cmdShow]
call SHOWWINDOW

push [newhwnd]
call UPDATEWINDOW

msg_loop:
push ds
push offset msg
push 0
push 0
push 0
call GETMESSAGE

cmp ax, 0
je end_loop

push ds
push offset msg
call TRANSLATEMESSAGE

push ds
push offset msg
call DISPATCHMESSAGE

jmp msg_loop

end_loop:
mov ax, [msg.msWPARAM]
mov ah, 4Ch
int 21h

;-----------------------------------------------------------------------------
WndProc proc hwnd:WORD, wmsg:WORD, wparam:WORD, lparam:DWORD

cmp [wmsg], WM_DESTROY
je wmdestroy
cmp [wmsg], WM_CREATE
je wmcreate
cmp [wmsg], WM_COMMAND
je wmcommand
; cmp [wmsg], WM_PAINT
; je wmpaint

jmp defwndproc


wmcreate:

BUTTON szMon,0,0,100,25,101
BUTTON szTue,0,25,100,25,102
BUTTON szWed,0,50,100,25,103
BUTTON szThu,0,75,100,25,104
BUTTON szFri,0,100,100,25,105
BUTTON szSat,0,125,100,25,106
BUTTON szSun,0,150,100,25,107
BUTTON szKoniec,0,175,100,25,108

STATIC '',0,112,12,200,200-12,-1
mov hwndSTATIC,ax

mov ah,2ah
int 21h
mov ah,0
cmp ax,0
jne dalej
mov ax,7
dalej: add ax,100
push [hwnd]
push WM_COMMAND
push ax
push 0
push 0

call SENDMESSAGE

mov ax, 0
jmp finish

wmcommand: cmp [wparam],108
je koniecprogramu
cmp [wparam],101
jge test107


jmp koncz

test107: cmp [wparam],107
jle obsluga101_107

koncz: mov ax,0
jmp finish


koniecprogramu:
push [hwnd]
push WM_CLOSE
push 0
push 0
push 0

CALL SENDMESSAGE

jmp koncz


obsluga101_107:
push [hwnd]
push [wparam]

call GETDLGITEM

push ax
push ds
push offset szDzien
push 13

call GETWINDOWTEXT

push [hwnd]
push ds
push offset szTitleName

call SETWINDOWTEXT

cmp [wparam],106
je niemalekcji
cmp [wparam],107
je niemalekcji


push es
push ds
pop es
mov di,offset szText
cld
mov cx,50
mov ax,0
rep stosw

pop es

mov bx,[wparam]
sub bx,101
mov ah,acDNI[bx]
mov bx,offset szFileName
mov BYTE PTR [bx],ah
mov ah,3dh
mov al,0
mov dx,offset szPathName
int 21h
mov bx,ax
mov ah,3fh
mov cx,1023
mov dx,offset szText
int 21h
mov ah,3eh
int 21h
push hwndSTATIC
push ds
push offset szText

CALL SETWINDOWTEXT

jmp koncz

niemalekcji:
push hwndSTATIC
push ds
push offset szBrakLekcji

CALL SETWINDOWTEXT

jmp koncz


defwndproc:
push hwnd
push wmsg
push wparam
push lparam
call DEFWINDOWPROC
jmp finish

wmdestroy:
push 0
call POSTQUITMESSAGE
mov ax, 0
jmp finish


finish:
mov dx, 0
ret
WndProc endp
;-----------------------------------------------------------------------------
szText db 100 dup(?)
public WndProc
ends
end start


No i czyż nie jest to wersja hard? ;-)

Niestety nigdzie na dysku nie mogę zlokalizować skompilowanej wersji tego programu. W ogóle wszystkie moje programy w assemblerze mam tylko w postaci źródeł :-( widać kiedyś starałem się zaoszczędzić trochę miejsca i pokasowałem EXEki :-(
Jakby ktoś chciał spróbować kompilacji to trzeba próbować z TASMem :-)

Obiecuję, że jeżeli dostanę konto do Google AppInventora for Android to postaram się zrobić i plan lekcji dla Androida ;p


Podobne postybeta
.asm - to było fajne rozszerzenie plików z programami ;-)
Manipulowanie statystyką
Celeron M353 900MHz vs. Intel Atom 1.6GHz, czyli o tym czemu jest remis? ;-)
Rammstein :-)
git push -f

O ziarenkach

Dla odmiany nie będzie o Androidzie ;-)

Mam za to pytanie do przeciwników in vitro, którzy są mu przeciwni "bo się zabija zarodki nadmiarowe".

Czy niesadzenie nasion jest zabójstwem?

Czy jak jesz pomarańczę albo wyciskasz cytrynę do herbaty i wyrzucasz lub zjadasz pestkę to czy zabijasz pomarańczę lub cytrynę?

A przecież nasiona to nic innego jak zarodki.

Zarodek musi znaleźć się w odpowiednim środowisku by mógł zbudować cały organizm. W przypadku zarodów zwierząt potrzebuje olbrzymiej ilości sygnałów chemicznych i to nadanych w odpowiednim czasie, potrzebuje odpowiedniej temperatury, potrzebuje specjalnych działań by mógł zbudować organizm docelowy. Pozostawienie zarodka samemu sobie oznacza tylko tyle, że stwierdziwszy, że nie ma odpowiednich warunków do rozwoju zaprzestanie ten rozwój i obumrze.
W przypadku in vitro właśnie implantacja zarodka to takie specjalne działanie, które jeśli dopisze szczęście spowoduje, że zarodek odpali program pod nazwą "zbuduj człowieka".


Podobne postybeta
Zarodek to nie dziecko
Wyznanie, wyjaśnienie i coś z zupełnie innej beczki ;-)
Mistrzowie political fiction
Wegetarianizm kaizen - czyli ja bywać wegetarianinem bez zbytniego wysiłku ;-)
Iluminacja... czyli "Oświeciło mnie"...

Google AppInventor for Android, ktoś się już bawił?

Zaraz gdy przeczytałem o Google AppInventor for Android poprosiłem o zaproszenie, do teraz czekam ;-)

Posunąłem się nawet do tego, że poprosiłem też przy pomocy innego konta ;-)

Ciekaw jestem czy tym razem się uda. Google próbowało już kiedyś czegoś podobnego, był to Google Mashup Editor, który niestety jakiś czas później umarł. Dla developerów był zbyt ograniczony, dla amatorów zbyt trudny.

Znalazłem na YouTube pełny film pokazujący tworzenie aplikacji, którą możemy obejrzeć w filmiku prezentującym GAI4A ;-) Wszystko trwało 4 minuty, a środowisko z tego co było widać wykorzystuje Java Web Start do edycji bloczków.

Aplikację pobiera się przy pomocy kodu QR. Zresztą spróbowałem pobrać coś spod kodu QR widocznego w filmiku, ale zostałem opluty przez serwer Google prośbą o zalogowanie się, z jak się zalogowałem to dostałem stronę na której można prosić o zaproszenie ;-)

Wygląda jednak na to, że kod "źródłowy" aplikacji będzie na serwerach Google i to one udostępnią nam skompilowany plik APK.

Widziałem też na YouTube przykładową aplikację, która miała 2 guziczki "1" i "0", klikając je można było wprowadzać liczbę binarną, która pokazywana była też w postaci dziesiętnej. Proste, ale ma potencjał.

Tyle wiem na teraz, dlatego jak ktoś ma możliwość ;-) to niech pchnie moje zaproszenie ;-)

Mam nadzieję, że na G1 programy z tego pojadą :-)




Podobne postybeta
Allegro to jest banda amatorów.
USB-C w iPhonie dobra rzecz :-)
30 baniek na piramidę
Jak to rzeczy proste okazują się trudnymi ;-)
Rury odetkane :-)

poniedziałek, lipca 26, 2010

O tym w czym iOS jest lepszy od Androida

Może ktoś z osób programujących iPhone'a zweryfikuje moje twierdzenie, ale wydaje mi się, że tam problem zmiany orientacji ekranu jest jakby lepiej rozwiązany niż w Androidzie.

Tam system wysyła do ichniej "aktywności" informację o zmianie orientacji, jeżeli kod odpowie, że wspiera taką orientację to proszony jest (i tutaj są domysły bo nie wiem tego na 100% ;-)) o odrysowanie się.

Jest prosto.

W Androidzie jest trudniej, można poprosić system by nam nie zmieniał orientacji, ale jak tego nie zrobimy to w momencie zmiany orientacji nasza aktywność zostanie zamordowana, a po chwili odpali się jej nowa kopia.

Razem z naszą aktywnością zginął wszystkie okienka postępu czy dialogi, a wszystkie wątki odpalone przez tą aktywność będą miały "linkę" do umarłej aktywności... czyli, że poleci nam wyjątek jak spróbujemy na niej coś zrobić ;-)

Z progresami i dialogami można sobie poradzić przez "podniesienie" ich na podstawie zapisanego stanu aktywności, ale to i tak nic nam nie da bo nasze wątki wystartowane ze starej aktywności i tak nie mają sposobu na kontakt z tymi oknami ;-)

Dlatemu trzeba się tu odwołać do serwisu i startować go w momencie gdy zaczynamy coś co chcielibyśmy zwątkować.

Strasznie to namotali. To powoduje, że programowanie dla Androida jest trudniejsze i o wiele prościej zrobić błąd straszący użytkownika.

Dodatkowo trzeba motać kod, a przez to łatwiej o kolejne błędy.

Dlatego wydaje mi się, że żeby napisać dobrą aplikację dla Androida trzeba świetnego kodera, w przypadku iPhone'a wystarczy dobry.

Tam jest ograniczenie nie od strony umiejętności, a finansów ;-)




Podobne postybeta
Modale nie takie dobre dla Androida ;-)
Czemu oglądam filmy i seriale po angielsku z napisami po angielsku
Programowanie jako sztuka oszukiwania ;-)
ISS poraz kolejny :-) tym razem poprzedzona HTV :-)
Androidowe boje... ale nie takie morskie ;-)

Serwis dobry na wszystko ;-)

Bloggeroid ma jednego poważnego babola. Jeżeli zablogujemy i zamkniemy aplikację to czasem będziemy widzieli info o odbywającej się publikacji, ale wątek publikujący zginie...

Rozwiązaniem powinien być serwis ;-) Na razie go unikałem z racji tego, że tak mi było wygodniej, oraz przez to, że czuję niechęć przed dodawaniem nadmiarowego kodu. Chciałbym by Bloggeroid był jak najmniejszy :-)

Znów zapewne ukradnę sobie trochę kodu z Blipusia ;-)

Oczywiście to już kolejny raz gdy działa to ciut inaczej na telefonie, a inaczej na emulatorze. Emulator jest zdecydowanie bardziej "porządny", nie zabija wątków, nie wyrzuca błędów z pamięcią na stercie i ogólnie taki milszy jest ;-)




Podobne postybeta
Zwłoki na plakatach... brrr...
Jakiej jodyny???
Książeczki :-)
Raport z boju z Androidem ;-)
I jak "po bożemu" zrobić updatowanie widoku na podstawie danych z sieci w Androidzie?

niedziela, lipca 25, 2010

Programowanie na Androida trudne ;-)

Jak się tu już chwaliłem wiele razy piszę sobie właśnie aplikację do blogowania z Androida.

Moja aplikacja niewiele potrafi, dlatego zainstalowałem w końcu jedną z najpopularniejszych aplikacji do blogowania z Android Market... i okazało się, że wygląda ładniej i wiele potrafi, ale wywala się np. w momentach zmiany orientacji ekranu :-) sam się na to natknąłem i wiem, że najłatwiej to "naprawić" przy pomocy zapisywania stanu aktywności ;-)

Także pisanie boldem albo kursywą jest tam dużo trudniejsze ;-)

Nie wspominając o tym, że w mojej aplikacji można dodać wiele zdjęć i samemu zdecydować o tym gdzie mają być w tekście :-)

Zaprawdę powiadam wam, że mimo wszystko jest jeszcze miejsce dla developerów na tym rynku ;-)

Aha, jeszcze moja aplikacja liczy sobie tylko około 30KB, a nie 500KB :-)

Jeżeli ktoś chciałby ją obejrzeć i poużywać to proszę bardzo, oto link :-)

A tutaj film pokazujący działanie Bloggeroida [nagrany przy pomocy emulatora]






Podobne postybeta
Zmienne Go ;-)
Facebook vs. Ja, tym razem 1:0 dla Facebooka ;-)
Bloggeroid - spróbujmy to zrobić ładniej ;-)
OOo2GD 1.5.1 Edycja Urodzinowa :-)
Bloggeroid 1.0 :-)

Wyznania programoholika ;-)

Stwierdzam, że ja to jednak walnięty jestem.

Jest weekend, a ja jak głupi siedzę i sobie program piszę ;-)

Że w pracy to robię (tylko program inny ;-)) to rozumiem, tam mi płacą, ale w domu? Chociaż im więcej w mojej pracy leadowania (i nie chodzi o ołowienie ;-)) to tym mniej kodowania, i co prawda rozumiem, że w tworzeniu oprogramowania "zarządzanie" jest ważne (piszę "zarządzanie" bo ja nie zarządzam, raczej ustalam co trzeba zrobić, albo wykonuję specjalne poruczenia ;-)) to kodowanie jest zabawniejsze.

Ja to chyba po prostu lubię, choć jak mi się wydaje dziś 8 godzin jak nic przessdziałem walcząc z dodaniem narzędzia do zarządzania obrazkami w Bloggeroidzie ;-) i to jest chyba jednak jakaś przesada.

Z drugiej strony gdybym nie siedział i nie kodował to uważałbym, że dzień zmarnowałem, a to jest jedno z gorszych uczuć.

Mogę siedzieć nad głupią zabawką (byle była zabawna, a nie nudna), nad zadaniami z TopCoder czy nawet programem na kalkulator, ale jak sobie coś napiszę to czuję się lepiej.

Jak napiszę post na bloga to czuję, że to forma oszustwa ;-) zamiast kodować piszę sobie coś, a to przecież dużo prostsze, więc musi być złe ;-)

Najgorsze jest jak jest 2-3 w nocy, oczy się kleją, ale chciałoby się jeszcze tyle zrobić... Nauczyć się Fork-Join, pokodować zadania z TopCoder, pouczyć się do SCWCD (coś mi się wydaje, że się do tego zobowiązałem w moich pracowych planach rocznych w części poświęconej rozwojowi własnej osoby), poczytać, pobawić się kalkulatorem, poAndroidzić ;-)

Ktoś kiedyś powiedział, że czuje przygnębienie gdy wchodzi do biblioteki bo wie, że nie starczy mu życia na przeczytanie nawet części tych wszystkich książek (nie dam głowy, ale kojarzy mi się to z Richardem Walkefiledem z serii Rama Arthur'a C. Clarke'a), ja mam podobnie, chociaż raczej z pisaniem programów :-) tyle tego jest, a nie ma czasu ;-)




Podobne postybeta
Marudzenie nocne ;-)
Amoralna modlitwa
Niska cena
Jak masz doła to nawet rozwiązanie problemu niezbyt cieszy ;-)
Sarkania na C++

sobota, lipca 24, 2010

Piszemy sobie Bloggeroida dla Androida ;-)

Tak sobie piszę tego mojego Bloggeroida (nazwa miała być tymczasowa, ale jak na razie mi się podoba ;-)) i stwierdzam, że na Androidzie pisanie aplikacji przypomina składanie jej z klocków ;-)

Ja co jakiś czas albo wykorzystuję ponownie jakiś kawałek z Bloggeroida, albo wykradam sobie samemu kod z Blipusia. Przez to pisanie jest takie, że najpierw się walczy z danym problemem, a później wykorzystuje się ten sam kod kilka razy.

Niby normalnie też tak to wygląda, ale chyba w mniejszej skali.

Np. w Androidzie do przesyłania danych między aktywnościami można wykorzystać Intent'y, które "robią" tu za coś w stylu formularzy/requestów z Weba. Dzięki temu praktycznie ten sam kod obsługuje mi dodawanie obrazków z Galerii otwartej przez Bloggeroida, z wykorzystania opcji do "podzielenia" się obrazkiem jak i z ikonki notyfikacji w razie problemu.

Sam Bloggeroid niewiele jeszcze potrafi, można napisać post, opublikować go na dowolnym z Bloggerowych blogów skojarzonych z naszymi kontami w Google, dodać konto, wrzucić obrazki do posta i tyle ;-)

Teraz próbuję dodać możliwość "zarządzania" obrazkami, bo jeżeli chciałbym dodać możliwości edycji istniejących wpisów to trzeba sobie będzie umieć dać radę z obrazkami, a i sama aktywność pewnie nada się na zrobienie selektora dostępnych postów i blogów ;-)

Pod pojęciem "zarządzania obrazkami" rozumiem możliwość ich obejrzenia (coby sprawdzić czy to ten obrazek) , podmiany i wyrzucenia z posta.

Udało mi się również dodać wrzucanie filmów do Picassa'y co oznaczało wrzucanie do Google Video, ale jakoś nie wyszło mi wygenerowanie na podstawie odpowiedzi kodu do osadzenia filmu na stronie, więc kod wyleciał. Dlatego myślę o dodaniu wsparcia do wrzucania filmów do YouTube... jedyne co mnie blokuje to to, że nie wiem czy chcę przekształcać swoje konto na YouTube w konto developerskie... no i konieczność męczenia użytkownika informacją co mu wolno wrzucić do YouTube, a czego nie, oraz sama długość całego procesu wrzucania. To ostatnio mnie trochę martwi bo nie jestem do końca pewien czy mogę mieć pewność, że Android mi wątku wrzucającego nie zabije, a wtedy użytkownik straci posta i nawet może o tym nie wiedzieć.

Ogólnie zabawa z pisaniem Bloggeroida jest całkiem miła choć bywa męcząca ;-) Bo jak na razie piszę to dla siebie, czyli cudownego klienta, który nie marudzi i wie czego chce ;-)




Podobne postybeta
Prototypowanie dla Androida
Bloggeroid 1.0 :-)
Android - nawet platofrma potrafi przeciwko Tobie knuć ;-)
Robimy z telefonu/tabletu z Androidem serwer WebDAV ;-)
Bloggeroid - wersja 1.0 tuż, tuż ;-)

czwartek, lipca 22, 2010

Toperz ;-) czyli OCR + Android odsłona 2 albo któraś tam

[mały edit, zdecydowałem, że toperz powinno się pisać przez rz, a nie ż, wziął się od nietoperza choć myślałem też o pisowni topesz ;-) i tak, to nie ma żadnego wpływu na resztę postu ;-)]

Dziś pochwalę się wynikami mojego eksperymentu z użyciem Androida i OCRa w Google Docs do tworzenia dokumentów w Google Docs na podstawie zdjęć ;-)

Jest to moim prywatnym zdaniem jedno z najmniej przydatnych narzędzi jakie sobie kiedykolwiek popełniłem ;-)

Znajdziecie je pod tym linkiem.

Obsługa jest prosta, po zainstalowaniu idziemy do galerii i wybieramy zdjęcie, które chcielibyśmy zOCeRować, wybieramy dzielenie się tym zdjęciem i z listy wybieramy OCRDroid, przy pierwszym uruchomieniu zostaniemy poproszeni o hasło do Google Docs, tutaj lepiej się nie pomylić bo program jest "jednorazowy" jeśli chodzi o wprowadzanie danych o koncie :-) [To dlatego, że oryginalnie miał namiary na konto zahardkodowane, ale "ukradłem" sobie okienko dodawania kont z Bloggeroida i teraz już nie muszę nic hardkodować], po wprowadzeniu nazwy konta i hasła klikamy Save i czekamy, przez jakiś czas będziemy widzieli czarny ekran z napisem OCRDroid, możemy też zobaczyć informację, że aktywność zbyt długo nie odpowiada, wtedy klikamy Czekaj. W końcu dostaniemy informację, że możemy sobie pójść do Google Docs żeby obejrzeć nasz dokument ;-)

W większości przypadków dokument ten nie będzie się do niczego nadawał ;-)

W trakcie działania programu lepiej nie robić żadnych zmian orientacji telefonu, to jest prosty program, a całe wysyłanie obrazka odbywa się bardzo nieprofesjonalnie w onCreate() aktywności, a Android ma tak, że jak zmienia się orientacja ekranu to zabija aktywność i tworzy ją od nowa. Dlatego w trakcie zabaw z Toperzem ;-) nie machać telefonem ;-)

Jak ktoś chciałby źródła to proszę się do mnie zgłosić :-)
Tutaj chyba najciekawszy kawałek odpowiedzialny za zalogowanie się i wrzucenie zdjęcia do Google Docs do przeprocesowania go przez OCR.

// Najwpierw logowanie
// W email jest adres e-mail usera, w password hasło
URL url = new URL("https://www.google.com/accounts/ClientLogin");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setAllowUserInteraction(true);
connection.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
connection.setDoOutput(true);
connection.connect();
OutputStream os = connection.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
// Logujemy się do Google Docs, czyli nazwa serwisu to writely
bw.write("\r\naccountType=HOSTED_OR_GOOGLE&Email="+email+"&Passwd="+password+"&service=writely&source=RMK-OCRDroid-0.01\r\n");
bw.flush();
is = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = "";
String auth = "";
// Teraz serwer nam odpowiada, linia zaczynająca się od Auth= zawiera token
// do autoryzacji
while ((line=br.readLine())!=null) {
if (line.startsWith("Auth=")) {
auth = line.replace("Auth=", "");
}
}

// Przesyłanie do Google Docs

// To ocr=true jest najważniejsze :-)
String uploadUrlStr = "https://docs.google.com/feeds/default/private/full?ocr=true";

URL uploadUrl = new URL(uploadUrlStr);

HttpURLConnection conn = (HttpURLConnection)uploadUrl.openConnection();

conn.setRequestMethod("POST");
conn.setRequestProperty("Authorization", "GoogleLogin auth="+auth);
conn.setRequestProperty("GData-Version", "3.0");
conn.setRequestProperty("Content-Type", "image/jpeg");
// wg. teorii Slug to nazwa pliku, ale coś nie działa tak jakbym chciał
conn.setRequestProperty("Slug", "OCRDoc "+new Date());
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();

long contentLength = baos.size();
conn.setRequestProperty("Content-Length", ""+contentLength);

conn.setDoOutput(true);
conn.connect();
// baos to zmienna zawierająca ByteArrayOutputStream z binarnymi danymi
// naszego obrazka
conn.getOutputStream().write(baos.toByteArray());

// W bardzo nieprofesjonalny sposób czytamy odpowiedź Google Docs,
// ale szczegół bo i tak ją zignorujemy ;-)
BufferedReader br2 = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line2 = "";
while ((line2=br2.readLine())!=null) {
System.out.println(line2);
}


Używam tutaj najbardziej podstawowej metody walki z połączeniami HTTP, na Androidzie wypada to robić ciut inaczej, ale szczerze nie miałem jeszcze czasu się temu przyjrzeć, a podejście takie jak moje ma tą zaletę, że można dość swobodnie kod testować poza Androidem na PC, a to pomaga ;-)
Przy okazji jak ktoś nie wierzy to przy pomocy HttpURLConnection można wysyłać też wieloczęściowe requesty co można zobaczyć np. w źródłach OOo2GD (Plik ZohoWrapper.java linia 357, metoda uploadDocumentForUrl).
Dlatego jak już piszesz jakąś wspaniałą aplikację na Androida to nie używaj przyciężkich bibliotek, to dla Ciebie pikuś, a zyskasz miłość userów ;-)


Podobne postybeta
Wredne Google Docs
Programowanie trudne ;-)
Wysyłamy pliki do Google Docs przy pomocy Go :-)
PROPFIND, czyli jak przechytrzyć HttpURLConnection
Chrome OS, Chrome2Chrome i w ogóle Chrome ;-)

środa, lipca 21, 2010

Siesta by się przydała

Kolejny już dzień po 5-6 godzinach snu i zaczyna mi się to dawać we znaki ;-) Nawet słuchanie ostrej muzyki nie pomaga ;-)

Tak kryzys przychodzi koło 14 i trwa z 2-3 godziny, w trakcie których spokojnie by się można było przespać by mieć znów refleks lepszy niż mucha w smole ;-)

A przydałoby się to bo właśnie piszę kawałek związany z liczeniem podatków w Kanadzie ;-) a wierzcie mi, takie proste to to nie jest ;-)




Podobne postybeta
Ewolucja.org - Fajna strona :-)
Co widuję w drodze z pracy... ;-)
A może zarwać noc?
Przydatne narzędzia ;-)
Google Listen

Takie tam przemyślenia i refleksje ;-)

Parę refleksji przed snem ;-)

Algebra FX 2.0 Plus jest wielka! Tak dosłownie (ledwo mi się w dłoni mieści, a ja duży jestem ;-)) jak i w przenośni. Potrafi nawet znaleźć największy wspólny podzielnik z 2 wielomianów w postaci wielomianu :-) (nie muszą to być zresztą wielomiany ;-) dowolne funkcje mogą być). Ten kalkulator zna matematykę o wiele lepiej niż ja... co akurat nie jest powodem do zadowolenia ;-)

G1 ma jedną wadę związaną z klawiaturą. Literki na klawiaturze widać albo w normalny świetle, albo w ciemnościach. Jak światło jest dziwne to podświetlenie literek powoduje, że nie do końca wiadomo gdzie jest jaki znak (nie jest to problem w przypadku literek czy cyfr, ale znaki "pod ALTem" dość skutecznie się w takich warunkach ukrywają ;-))

Jeszcze jedno z G1, albo raczej z Androidem jako takim. Jakiś szalony pęd za nowym sprzętem mamy, a to głupie i dziwne, bo w smartfonach, featurefonach, appfonach czy jak to zwał aplikacje są najważniejsze. A tu jest jeszcze miejsce do popisu.

W ogóle pogoń za sprzętem powoduje, że niektórym developerom odbija ;-) Odbija w taki sposób, że proste aplikacje zajmują po 1MB... a to tylko przez to, że developer użył jakiejś "standardowej" na PC biblioteki. Wieloczęściowego requesta można spokojnie zbudować ręcznie z wykorzystaniem standardowej klasy HttpUrlConnection (tak się chyba ta klasa nazywa), nie trzeba od razu dodawać całych commonsów Apache'a. Szczerze to da się to nawet zrobić w JavaScript'cie ;-) (wiem bo robiłem)

Piwo, nie piję a co chwilę ktoś mi je proponuje ;-) fenomen jakiś :-)

W ogóle mój team zażyczył sobie dziś (a właściwie to wczoraj) bym przekonał nasz management, że release się zbliża ku końcowi (na mnie czeka ;-)) to może by jakąś imprezę? No i będę musiał zasugerować ;-)

Rola team leada ciężką jest ;-)

Linia na ekranie laptopa jakoś szczególnie na razie mi nie przeszkadza, za to w niedzielę jadąc z domu do KRK miałem schizę na punkcie wycieraczek. To był pierwszy raz od naprawy gdy jechałem całe 150 km z włączonymi wycieraczkami i jak ich czubek niknął mi z oczu to byłem bliski paniki.... Mam nadzieję, że naprawa będzie skuteczna i schizowanie mi przejdzie ;-) inaczej dojdzie do poważnego mechanikobójstwa ;-) (fani i fanki Buffy zauważą tutaj nawiązanie do serialu ;-))

A jak o serialach mowa to na dniach będzie w Amazon.co.uk That 70's Show (nigdy nie mogę spamiętać jak to się pisze), pełne 8 sezonów... i już je chcę :-)

Na koniec jeszcze wyznanie, że przy takiej pogodzie jak teraz siedzenie w pracy w klimatyzowanym pomieszczeniu ma swój urok ;-) Jak temperatura dojdzie do 40 stopni to pewnie po nocach będę śnił by już był dzień i praca ;-)

Na koniec moje dzieło z poprzedniej pracy ;-)




Podobne postybeta
Social media to nie jest świat dla introwertyków/ambiwertyków ;-)
Błysnęło, huknęło i zepsuło telewizje :-(
Chyba wiem czemu widzę Gdynie z Juraty ;-)
"Pokochałem me Atari....", a właściwie G1 :-)
4 rzeczy ;-)

wtorek, lipca 20, 2010

Trzeba będzie zrobić eksperyment :-)

[Ku pamięci Bloggeroid potrzebuje jakiegoś zapisywania postów w edycji, bo tego muszę pisać drugi raz ;-)]

Muszę przeprowadzić eksperyment, który ustali jaki jest czas ważności tokena używanego do autentykacji aplikacji używających Google API z autentykacją ClientLogin.

W OOo2GD używam tego tokena do oporu i chyba dopiero jeżeli coś się nie uda to loguję się ponownie... tzn. chyba ;-) nie pamiętam dokładnie.

Ale jak narazie nie spotkałem się z błędami przez to spowodowanymi, coby pewnie znaczyło, że każde użycie tokena go odnawia, czyli że działa to podobnie do sesji.

W Bloggeroidzie loguję się za każdym razem co takie dobre nie jest, bo zajmuje więcej czasu i kosztuje transfer. Ale dzięki temu unikam problemu wysłania danych bez ważnego tokena.

Dlatego chciałbym móc to zmierzyć i używać tej wiedzy ;-) Niestety Google nie chwali się tym czasem, chwalą się ważnością jakiegoś tokena w OAuth, ale to chyba wynika ze specyfikacji.

Pomiar tego czasu może być trudny, ze względu na to, że zachowuje się to jak sesja... trzeba będzie pewnie potrenować ;-)




Podobne postybeta
Allegro to jest banda amatorów.
Automatyczne tłumaczenie - Automatic translation
OAuth pokonany, wersja 0.0.1 TimeToRead gotowa ;-)
Bloggeroid - spróbujmy to zrobić ładniej ;-)
Bawię się GPT4All

Google Listen

Na krótko z tramwaju ;-)

Google Listen dobre.

Podcasów praktycznie nie słucham, przy komputerze nie jest to po prostu zbyt zabawne, człowiek chętnie by coś innego robił, a jak zaczyna robić coś innego niż słuchanie podcastów to po prostu gubi treść.

Ale w tramwaju podcasty to już coś innego :-) Zawsze to jakieś zajęcie ;-)

Ja jeżeli słucham to słucham praktycznie tylko podcastów z Scientific American, zwykle znam już treść z gazety, ale zawsze człowiek sobie ćwiczy zdolność słuchania po angielskiemu :-)




Podobne postybeta
Out of książka ;-)
Początki życia wg. Shapiro ;-)
Co lubię
I znów widziałem The Internship :-)
Pomysł dla wydawców gazet i magazynów

Ikonki złe ;-)

Jestem teraz na najgorszym [w sensie najmniej zabawnym] etapie tworzenia projektu, którym jest Bloggeroid ;-)
Chodzi o ikonki......

Ikonkę dla programu już mam, nie jest najśliczniejsza ale i paskudna nie jest, a kojarzy się tak z Bloggerem jak i z Androidem ;-)



Teraz potrzebuję ikonek do notyfikacji o tym, że właśnie coś się publikuje na blogu i do notyfikacji o problemach.

W ikonkach najgorsze jest ich tworzenie, bo pomysły miewam, nie mam za to talentów graficznych i "się mnie to sypie" :-(
Najbardziej zaawansowanym programem graficznym, którego umiem użyć jest MS Paint :-) Mam co prawda Paint.NET czy GIMPa, ale one są ponad moje zdolności ;-)

Co do ikonek to Android ma specjalny guideline jak je należy tworzyć, ale całkowicie go ignoruję ;-)


Podobne postybeta
StrengthsFinder 2.0 - ja tu widzę lekką ściemę
EEE Planet ;-)
Zabawy z Zoomem - ikonki ;-)
Linux po miesiącu
Java i Chrome OS....

poniedziałek, lipca 19, 2010

Mój pierwszy program na nowym kalkulatorze :-)

GCD, czy jak kto woli NWD, czyli programik liczący największy wspólny dzielnik aka Greatest Common Divisor.




Podobne postybeta
Chumbawamba "Charlie" - wypijmy za Darwina :-)
Kalkulator
Rok Darwina czas zacząć :-)
Najwspanialsze Widowisko Świata - Świadectwa Ewolucji
Tagi NFC w ubraniu..

Telewizor w laptopie się psuje :-(

Dziś po przyjeździe do KRK zauważyłem, że w 1/3 ekranu mam taki brzydki niebieski pasek :-(

Jest to albo wynik obluzowania kabla/kabli podpinających matrycę, albo strzelona matryca... ani to, ani to mi się nie podoba, bo oznacza zapewne kontakty z serwisem i brak laptopa przez miesiąc...

Ten tydzień i tak muszę odczekać bo nie mam tu gwarancji na laptopa.

Btw. ciekawe ile kosztuje gwarancja? Tzn. o ile tańszy byłby taki laptop bez gwarancji?

Zastanawiam się tak nad tym bo miesiąc nieobecności laptopa oznacza tyle, że możliwe że opłaca mi się już kupić nowego.... miesięczne przedłużenie gwarancji mi nic nie da, a miesiąc bez laptopa to miesiąc bez laptopa...

Pewnie się pomęczę z tą "szramą" do września i wyślę laptopa na urlop do serwisu wtedy gdy ja będę (jeśli się uda) na jakimś zagramanicznym urlopie....

No zły jestem...



Podobne postybeta
Gapa ;-)
Twitter
Zgryz laptopowy ;-)
Door-to-door - niezły spryciarz to musiał stworzyć
Elektryczna kanapka....

niedziela, lipca 18, 2010

Dieta niedźwiedziowa ;-)

Ostatnio tak wyglądała moja dieta :-)

Niedźwiedzie te są o tyle oryginalne, że są podobno z glonów :-)

A cały ten post to tylko kolejny test mojego programu do blogowania ;-)

Zwykle bloguję na inne blogi, nawet mam specjalnie 1 testowy, ale nie chcę się zbliżać do limitu 50 postów dziennie bo to jest taki sztywny limit Bloggera. Nic złego się nie dzieje, ale smutno wtedy trochę ;-)

Co ciekawe updatować posty na bloggerze można bez limitów co zresztą robi mój program do "wyliczania" podobnych postów :-)




Podobne postybeta
Mroczne Materie - polecam, gorąco polecam :-)
Nieznane ścieżki Garbage Collectora :-)
PayPal - rozczarowuje
A może by tak potrząsnąć drzewem zależności? ;-)
Nie kłóć się z użytkownikiem! ;-)

Jak socjaliści stworzyli globalne ocieplenie by uderzyć po kieszeni islamistów i Rosję ;-)

Ostatnio prawica ma trzy koniki, socjalistyczną Europę, ekspansję islamu i oszustwo z globalnym ociepleniem.
Oczywiście dobry prawicowy oszołom, wróć publicysta potrafi wszystkie te 3 rzeczy połączyć w jedną całość.
Zawsze stoi też za tym jakiś mistyczny spisek.
To ja dziś przedstawię alternatywne spojrzenie na problem :-)
Socjalistyczna Europa, socjalistyczne USA i wiele innych socjalistycznych [socjalistycznych wg. doktryny JKM i mu podobnych] krajów szerzy na świecie pogląd, że globalne ocieplenie wynika z działalności człowieka, głównie zaś ze spalania paliw kopalnych. W Europie to, w połączeniu z doświadczeniami z kryzysu energetycznego w latach 70 powoduje, że mamy jedne z najwyższych jeżeli nie najwyższe podatki na energię w świecie. Przez to spalamy mniej ropy naftowej na 1 mieszkańca niż np. USA czy Australia, spalmy jej nawet mniej na 1 mieszkańca niż Korea Południowa czy Japonia.
A to oznacza, że przeciętny Europejczyk płaci krajom produkującym ropę naftową w ciągu roku jakieś 750 dolarów [przy cenie baryłki 75,3 USD], a Amerykanin 1821,73 USD.
Czyli złe socjalistyczne podatki w Europie uderzają po kieszeni nie kogo innego jak tych znienawidzonych przez prawicę islamistów.
Czyli teraz ta część ze spiskiem - socjaliści z ekologami na świecie zawiązali spisek nazywający się "globalne ocieplenie" w celu zmniejszenia wpływów do kasy państw islamskich i Rosji.
Nie dziwota zresztą, że największy płacz przeciwko "propagandzie" globalnego ocieplenie słychać z krajów które żyją z ropy naftowej. Np. uwolnienie maili, które miało zacząć climategate było dziełem rosyjskich hackerów ;-)
Dlatego zwolenniku prawicy, musisz wybrać kogo nienawidzisz bardziej - islamu, socjalistów czy ekologów.
Jeżeli najbardziej nienawidzisz ekologów to spalaj jak najwięcej ropy naftowej, niestety oznacza to, że jeżeli spalasz tą ropę to tuczysz kiesy socjalistów [z podatków] i islamistów bo palisz ich ropę.
Jeżeli najbardziej nienawidzisz socjalistów to spalaj jak najmniej ropy i w ogóle zużywaj jak najmniej energii bo dzięki temu zagłodzisz ich bo nie "ukradną" Twoich pieniędzy w postaci podatków, tutaj jednak robisz dobrze ekologom i pośrednio dokopiesz islamistom.
Jeżeli zaś najbardziej nienawidzisz islamistów, to przestań w ogóle używać ropy naftowej i tu znów robisz dobrze ekologom, ale przy okazji dokopujesz socjalistom.
I co wybrałeś/wybrałaś? ;-)


Podobne postybeta
A mnie tam jednak prosty model klimatyczny przekonuje do twierdzenia, że mamy wpływ na zmiany klimatyczne i że globalne ocieplenie może być faktem
Strach się bać
Google vs terroryści
Dziwne.
Szlak mnie trafia jak emocje sprzedają się lepiej od rozumu.

piątek, lipca 16, 2010

PKP - Polskie Koleje Pozorne ;-)

Wierzycie patrząc na to zdjęcie, że stacja w Wodzisławiu Śląskim to był kiedyś ważny węzeł kolejowy? ;-)

Teraz nawet kas nie ma ;-)

A w ciągu doby jest łącznie jakieś 20 pociągów ;-) albo i mniej :-)




Podobne postybeta
Tajemnica PKP....
Jakieś święto, czy co?
Dokładniejsze mapy Polski w Google Maps
JDK8 na Rasbperry Pi rządzi :-)
Ingress i moje portale... ;-)

Książeczki :-)

Ponieważ nie chciałem płacić 75 złotych za kartę kredytową to wybrałem się do Amazon.co.uk w celu zwiększenia obrotów ;-) (nie ma to jak racjonalizować ;-))

No i dziś przyszła nagroda (po przejściach z DHL), oto ona :-)

Teraz można będzie zacząć czytać :-)




Podobne postybeta
Marudzenie nocne ;-)
Tęcza :-)
Wirtualna wycieczka po Los Angeles :-)
Noble
Ku pamięci ;-)

środa, lipca 14, 2010

Modale nie takie dobre dla Androida ;-)

W niedzielę pisałem o oknach modalnych i zaprezentowałem jak można w Androidzie zrobić sobie okno modalne, które blokuje przepływ, a więc upraszcza też logikę aplikacji.........Niestety rozwiązanie, które sprzedałem ma pewien problem.W Androidzie konfiguracja sprzętu może zmieniać się w locie, głównie chodzi o orientację ekranu [choć nie zdziwiłbym się jakby za jakiś czas doszła też zmiana ekranu ;-) gdy np. pojawią się tablety ze złączem HDMI].Taka zmiana powoduje zaś odrysowanie UI aplikacji. Oznacza to tyle, że nasza stara aktywność jest niszczona, a nowa jest uruchamiana i wołane są jej metody onCreate() a następnie onResume().Niestety to odrysowywanie UI ma też konsekwencję dla okien dialogowych. Znikają.Moja metoda polegała na tym, że tworzyłem okno dialogowe, które z wątkiem "głównym" komunikowało się przez pewien obiekt, a żeby wątek "główny" głupio procesora nie żarł to czekał na monitorze związanym z obiektem do przekazywania rezultatów. Naciśnięcie któregoś z klawiszy dialoga powodowało zaś ustawienie rezultatu, a następnie zawołanie notifyAll() na tym obiekcie dzięki czemu wątek "główny" był budzony i sterowanie wracało do naszego zatrzymanego kodu.Rozwiązanie genialne ;) ale ma wadę.Ponieważ dialog znika po zmianie orientacji ekranu to zostajemy z ekstra wątkiem [tym "głównym", który czeka na wynik dialoga], który wisi i czeka na obiekcie rezultatu. Nie zostanie on jednak nigdy celowo obudzony przez nasz kod, a nawet jeśli się to jakoś zdarzy to po sprawdzeniu, że użytkownik nie kliknął na żaden z guziczków dialoga wróci do czekania na obiekcie rezultatu.Dodatkowo w pamięci będą siedziały też wszystkie obiekty używane przez nasz wątek, czyli aktywność dla której stworzono i pokazano dialog [ta aktywność, która została "zamknięta" po zmianie orientacji] i wszystko co zostało już jakoś w tym wątku użyte...... a ponieważ wątek to zwykle wewnętrzna klasa anonimowa i to taka złośliwa, że nie jest statyczna (dla przypomnienia, wewnętrzna klasa musi mieć dodatkowe mechanizmy do trzymania kontaktów z klasą zewnętrzną, dlatego gdy chcemy mieć klasę wewnętrzną, a nie wymaga ona związku z klasą zewnętrzną to używamy modyfikatora static do zerwania tego łącza co wpływa na performance ;-)) więc trzymamy w pamięci de facto wszystko związane ze starą aktywnością......... A to nie jest fajne.Dlatego mimo wszystko odradzam używanie mojego confirm() :-)Co prawda nie jest do końca powiedziane, że nie da się tego obejść ;-) wystarczyłoby sprawić by wątek "główny", który czeka na rezultat nie robił wait() a robił wait(int), czyli czekał przez zadany czas, po czym sprawdzałby czy jego aktywność w ogóle działa i jeżeli by działała wracałby do czekania, a w przeciwnym przypadku wywalałby wyjątek..... nie jest to ładne, ale dalej pozwoliłoby się cieszyć w miarę wygodnym confirm().Ale jak na razie moje próby ugryzienia problemu spełzły na niczym bo nie potrafię wykryć tego stanu gdy aktywność została zgubiona........Z dodatkowych bonusów, także ProgressDialog na to choruje, tzn. znika po zmianie orientacji ekranu :-( Jeżeli kontroluje go jakiś zewnętrzny wątek to wątek ten nadal sobie biegnie, ale już jego aktywność nie żyje, a dokładniej nie żyje tak jak powinna ;-) dlatego zawołanie na niej np. finish() spowoduje wywalenie wyjątku......Android trudny.......


Podobne postybeta
Modale dobre - confirm dla Androida :-)
Prototypowanie dla Androida
O wyższości klas anonimowych
wait() i notify()/notifyAll() - najbardziej nierozumiane metody klasy Object ;-)
O tym w czym iOS jest lepszy od Androida

Blogowanie z Androida z obrazkami 2 :-)

Poprzednia wersja mojego programu do blogowania miała błąda ;-) zamiast miniaturki wrzucała jako link do miniaturki link do pełnego obrazka.

To tutaj to znów test :-) tym razem widok z mojego miejsca spania w Krakowie :-)




Podobne postybeta
No i potrafię już blogować z Androida z obrazkami :-)
Wytrzymałość baterii w EEE Pad Transformer - test przy pomocy "potworów" ;-)
Nie kłóć się z użytkownikiem! ;-)
Los Angeles ;-)
Nigdy nie zapominaj o FSM! ;-)

No i potrafię już blogować z Androida z obrazkami :-)

Poniższy obrazek nie ma nic wspólnego z postem, poza tym, że jest obrazkiem :-)

Dla ciekawych to była kiedyś jedna z fontann w Wodzisławiu Śląskim, podobno działała przez kilka miesięcy w latach 70 :-)

Jeżeli ten post się opublikuje będzie to znaczyło, że moja aplikacja do blogowania dla Androida, którą sobie piszę potrafi uploadować już obrazki :-)

Jak na razie jeden i trzeba blogowanie zacząć z Galerii, ale pierwsze koty za płoty :-)

Ze złych wiadomości z tego co widzę za oknem wkrótce będzie świtać ;-)

Jak ktoś ciekawy to aplikacja zajmuje teraz 25.5 KB :-)




Podobne postybeta
Nowy Gadacz v0.2
Ktoś instalował Androida 2+ na G1?
Dzielenie się z Bloggeroida...
Bloggeroidujemy ;-)
Piszemy sobie Bloggeroida dla Androida ;-)

wtorek, lipca 13, 2010

Czekamy na kalkulator :-)

Czaiłem się na kalkulator od roku albo i dłużej, ale w końcu zamówiłem sobie Casio Algebra FX 2.0 Plus :-)

Teraz tylko męczę serwer sprzedawcy sprawdzając czy już zmienił się status mojego zamówienia :-)

Na razie ciągle jest to zły stan ;-)

Podoba mi się to, że kalkulator ten ma tryb pracy CAS. Nie żeby był mi on jakoś niezbędnie potrzebny, ale miło będzie go mieć :-)

Nie zdecydowałem się na zakup kabelka do podłączania kalkulatora do PC, głównie przez to, że i tak nie mam nigdzie RS232, a nie czuję bluesa by kupować adapter USB-RS232.

Będzie nowa zabawka :-)




Podobne postybeta
Kalkulator
Kalkulator marzeń ;-)
Małe USB jest wielkie :-)
Kiedy tablet zmieni się w dobry kalkulator?
Wiedźmin mnie pokonał ;-)

Taki mały sekret, czyli jak to czasem lubie się pobowaić user experience ;-)

Z serii wstydliwe wyznania ;-)
Ostatnio zauważam u siebie z niepokojem to, że dziką satysfakcję powoduje u mnie taka prosta analiza user experience i dążenie do tego by przestrzegać zasady najmniejszego zdziwienia.
Nie twierdzę, że mi się to udaje. Ale co dodaję jakiś nowy ficzer do aplikacji [swojej lub pracowej] to próbuję zaatakować rozwiązanie związane z UX od strony prześledzenia wszystkich możliwych przypadków użycia i jak się da to staram się wyrzucać te nadmiarowe.
I nawet chyba efekty widać ;-)
Ja, czyli ktoś kto nie znosi pracować nad UI, myślę o tym i próbuję to robić dobrze......... przerażające ;-)
Mam tylko nadzieję, że moje pomysły nie są później przerażające dla użytkowników ;-)


Podobne postybeta
Google I/O 2021....
Walka z DDE
Ewolucja.org - Fajna strona :-)
Meh....
O ziarenkach

Wkurzają mnie obłudni i źli hipokryci mizogini.

Z dwa dni temu na National Geographic HD oglądałem film Koran, o jak się łatwo domyśleć Koranie właśnie. Dziś w TVP Info widziałem kawałki programu o problemie gwałtów w wielu państwach afrykańskich.Wczoraj znów na WP i Onecie pojawiły się newsy o sondażach dotyczących akceptacji aborcji [tutaj zresztą ciekawa sprawa, w Onet tytuł był "Sondaż: połowa Polaków przeciw aborcji" na WP za to "Prawie połowa Polaków chce prawa do aborcji", w Onecie tytuł zawierał sugestię, że Połowa Polaków jest przeciwko aborcji, a WP, że mniej niż połowa akceptuje aborcję, choć w samych "artykułach" [były chyba identyczne bo jak przypuszczam były to po prostu newsy z PAP czy czegoś podobnego] była mowa o tym, że przeciwne aborcji jest chyba 14% populacji, reszta dopuszcza aborcję z różnymi ograniczeniami, a ta połowa z obu tytułów oznacza po prostu, że blisko 50% Polaków jest za dopuszczalnością aborcji z przyczyn społecznych, czyli takiej gdzie kobieta jeżeli uzna, że to będzie najlepsze rozwiązanie, może pójść i dokonać zabiegu].I tak patrząc na to, czy czytając zastanawiam się nad tym jak można być tak obłudnym, jak można być takim hipokrytą.Obłudnym jak pan kapłan w tym filmie Koran, który uzasadnia jedną z najbardziej barbarzyńskich praktyk na naszej planecie, czyli obrzeżanie kobiet [obrazowo, dziewczynkom tak zwykle od 8 do 13 roku życia wycina się łechtaczkę przy pomocy "domowych sposobów" po czym wiąże się jej nogi na parę tygodni żeby wszystko się zagoiło i zarosło. Radzę to przeczytać kilka razy żeby dotarło jakie to jest okropieństwo. Jaki to musi być ból, jakie musi zostawić ślady na psychice. Mówiąc jeszcze inaczej, niezależnie jakie okropieństwa przeżyłeś czy przeżyłaś w Polsce, na 99.999% nie były one tak straszne jak to co robi się wielu dziewczynkom na świecie w imię chorego przekonania, że dzięki temu będą bardziej cnotliwe] bo są dzięki temu bardziej cnotliwe........ [specjalnie nie piszę tu o braku higieny w trakcie takich "zabiegów" bo to szczegół, kara śmierci nie staje się bardziej humanitarna prze to, że skazańcowi się wstrzyknie truciznę strzykawką jednorazową, jest tak samo barbarzyńska jak taka gdzie rozrywa się go końmi. Tak samo w przypadku tego obrzezania nie jest istotne czy robi się to przy pomocy kawałka szkła czy noża, na klepisku czy w sali operacyjnej]Obłudy "obrońców życia", którzy praktycznie zawsze budują w naszych głowach obraz kobiet, które poddają się aborcji jako "puszczalskich" bo przecież "pies nie weźmie jak suka nie da". Obłudy która stawia na piedestale zarodek czy płód, a gnoi kobietę.Tak btw. sondaży to w sprawie aborcji powinny się mieć prawo wypowiadać tylko kobiety, to ich ciała.Ta obłuda sugerująca, że kobiety są złe, puszczalskie, nieczyste, amoralne. Ten obraz tworzony przez bandę ludzi z obsesją na punkcie seksu. Zresztą tak przy okazji, wielu zwolenników prawicy nienawidzi islamu, co jest o tyle śmieszne, że poglądy na wiele spraw związanych z seksem to chrześcijaństwo ma bardzo zbieżne z islamem, bo "moralność chrześcijańska" w swojej pierwotnej postaci to przecież twór ludzi żyjących w podobnej kulturze jak tych, którzy później tworzyli islam. Chrześcijaństwo to moralność i zwyczaje przyniesione z bliskiego wschodu, wzbogacone o tytuły z Rzymu (Ponitfex Maximus to był kierownik kapłanów w Rzymie, i teraz tym kierownikiem jest papież), ok jeszcze trochę błyskotek i symboliki zostało z rzymskich.Dlatego stwierdzam wszem i wobec, że rzygać mi się chce jak widzę moralistów mówiących pięknymi słowami rzeczy, które mają tłumaczyć ich mizoginię.Najlepiej to podsumowuje dowcip, który brzmi tak:- Kto to jest puszczalska?- Kobieta podchodząca do spraw seksu tak jak przeciętny mężczyzna.Dla ludzi, którzy nie zrozumieli aluzji. Jeżeli coś wolno facetowi, to wolno to i kobiecie. Koniec kropka, nie podoba się? No to masz problem.


Podobne postybeta
In vitro
Kopernik i zasada kopernikańska, później Darwin i Teoria Ewolucji... co będzie kolejne? Silne AI czy synetyczne życie?
Studia wyższe
O Android Market
Forma nad treścią

Google App Inventor for Android - co to będzie? ;-)

Zapisałem się na konto w Google App Inventor for Android, najnowszym pomyśle Google, czyli narzędziu które nie programistom da możliwość pisania prostych aplikacji.

Ciekawe czy i kiedy dostanę konto ;-)

Nie wiem do końca co o tym sądzić. Z jednej strony pomysł genialny, z drugiej jak widziałem w filmie pokazującym tą aplikację wynikowa aplikacja nie poraża ;-)

Przez część blogów przetacza się fala obaw, że takie wyklikane aplikacje mogą zalać Android Market i obniżyć jakość aplikacji.

Coś w tym jest (tutaj trzeba powiedzieć jedno "ale" :-) nie publikowałem jeszcze żadnych moich aplikacji w Android Markecie, ale zdarzyło mi się już to robić z rozszerzeniem dla Chrome, i w przypadku rozszerzenia konieczne było zuploadowanie kodu źródłowego... możliwe więc, że i Android Market tego wymaga, a wtedy nie powinno być takiego zalewu słabych aplikacji), bo nawet teraz gdy do publikacji aplikacji na Android Market trzeba wykazać się choć minimalnymi umiejętnościami, mamy tam wiele słabych programów.

Z drugiej jednak strony takie otwarcie to szansa na małe użyteczne cosie :-)

To użytkownicy wiedzą czego im brakuje i tutaj dostaną do swoich rąk zabawkę do zbudowania tych brakujących rzeczy.

Myślę, że wprowadzenie po prostu w markecie nowej kategorii aplikacji wyklikanych pozwoliłoby na to by wilk był syty i owca cała :-)




Podobne postybeta
Zakaz handlu w niedzielę jest głupi
Traf to za userem... ;-)
OO.org i Google Docs bez konwersji są tuż tuż ;-)
Jak się topologicznie wprowadzać ;-)
Markety

niedziela, lipca 11, 2010

Modale dobre - confirm dla Androida :-)

Dla niezorientowanych, w komputerach mamy 2 typy okienek z komunikatami. Okienka modalne i niemodalne.
Modalne to takie, które blokują interfejs użytkownika i często też przepływ programu, niemodalne to takie, które niczego nie blokują.
Zwykle niemodalne są lepsze.
Jest jednak kilka sytuacji gdy okienka modalne w najbardziej klasycznej wersji ułatwiają życie.

W JavaScrip'cie możemy mieć taki fragment:
if (confirm("Czy mam coś zrobić?")) {
// coś robię
}

Który wyświetli modalne okienko z pytaniem "Czy mam coś zrobić", jeżeli użytkownik odpowie tak to zostanie wykonany kod opisany jako "coś robię".

Jeżeli jednak użyjemy okienka niemodalnego to już tak prosto nie jest:
function code4Yes() {
// coś robię
}
myConfirm("Czy mam coś zrobić?",{onYes:code4Yes});


Jeszcze gorzej w takim przypadku:
if (confirm("Czy mam coś zrobić?")) {
// coś robię
} else {
// robię coś innego
}
// robię część wspólną


Bo wtedy rozwiązanie niemodalne się jeszcze bardziej komplikuje:

function restOfOperations() {
// robię część wspólną
}
function code4Yes() {
// coś robię
restOfOperations();
}
function code4No() {
// robię coś innego
restOfOperations();
}
myConfirm("Czy mam coś zrobić?",{onYes:code4Yes,onNo:code4No});


W JavaScript możemy po prostu nie chcieć użyć confirm bo okienko jest brzydkie, ale w takim Androidzie sprawa ma się tak, że po prostu nie wolno nam użyć "klasycznego" modala :-(
Tak się składa, że nie możemy z wątku nie związanego z UI nic z tym UI robić. W ogóle w modelu wątków/pamięci Java'y trudno byłoby zrealizować takie zachowanie jak to z klasycznym confirm.

Spróbowałem sobie coś takiego zakodować przed chwilą i okazało się to być jeszcze bardziej skomplikowane od rozwiązania z okienkiem modalnym, którego używa się normalnie ;-)

final StringBuilder sb = new StringBuilder();
v.post(new Runnable() {
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(AddAccount.this);
builder.setMessage("I know this account!\nDo you want me to refresh list of blogs for this account?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
synchronized (sb) {
sb.append("1");
}
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
AddAccount.this.finish();
}
});
AlertDialog alert = builder.create();
alert.show();
}
});
while (1==1) {
Log.i("toster", "waiting....");
synchronized (sb) {
if (sb.length()>0) {
Log.i("toster","done :-)");
break;
}
}
try {
Thread.sleep(100);
} catch (InterruptedException ie) {

}
}

W tym kodzie jest na dodatek błąd, który spowodowałby, że w razie kliknięcia przez użytkownika "No" watek sprawdzający długość StringBuildera nadal by biegał, nawet po zamknięciu aktywności ;-)
Bardziej klasycznie to powinno wyglądać tak:
v.post(new Runnable() {       
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(AddAccount.this);
builder.setMessage("I know this account!\nDo you want me to refresh list of blogs for this account?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Log.i("toster","done :-)");
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
AddAccount.this.finish();
}
});
AlertDialog alert = builder.create();
alert.show();
}
});


To poprzednie rozwiązanie z blokowaniem przepływu można by było jednak tak ubrać by wyglądało to tak, że wołalibyśmy tylko confirm, które już wewnętrznie tworzyłoby StringBuildera [albo StringBuffera czy coś innego, StringBuffer pozwoliłby nam wywalić synchronizację ;-)] oraz ukrywał przed oczami kodera to sprawdzanie czy button został kliknięty.
Dla kodera wyglądałoby to jak klasyczny confirm z JavaScript. Czyli wykonanie kodu zostałoby wstrzymane do momentu gdy użytkownik nie kliknąłby na Yes.
Na pewno byłoby to rozwiązanie brzydkie od strony czytelności kodu, ale zdecydowanie ułatwiałoby to życie ;-)

Zakodowałem to i kod wygląda teraz tak:
private boolean confirm(final String msg) {
class Result {
int result;
};
final Result result = new Result();
runOnUiThread(new Runnable() {
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(AddAccount.this);
builder.setMessage(msg)
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
synchronized(result) {
result.result=1;
result.notifyAll();
}
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
synchronized(result) {
result.result=2;
result.notifyAll();
}
}
});
AlertDialog alert = builder.create();
alert.show();
}
});
while (result.result==0) {
synchronized (result) {
try {
result.wait();
} catch (InterruptedException e) {
// OK, nothing important happen
}
}
}
}


Wywołanie takiego kodu mogłoby wyglądać wtedy tak:
if (confirm("I know this account!\nDo you want me to refresh list of blogs for this account?")) {
Log.i("toster","done :-)");
}


Zwróćcie uwagę na przebiegłe wykorzystanie wait i notifyAll ;-)
Mój confirm działa tak, że przy użyciu przekazanego widoku wątek UI proszony jest o wykonanie kodu, w którym tworzony i wyświetlany jest dialog. W tym samym czasie wątek "proszący" sprawdza czy zwrócono jakiś rezultat, a jeżeli nie zwrócono to synchronizuje się na obiekcie rezultatu i mówi JVM "poczekam sobie na monitorze podpiętym do result". JVM przesuwa ten wątek do śpiących/czekających. W tym samym czasie jakiś wątek UI obserwuje czy użytkownik nie kliknął nam na któryś z guziczków, jeżeli klikną to wywoływany jest kod anonimowych listenerów, które działają w taki sposób, że synchronizują się na obiekcie rezultatu, ustawiają odpowiednią wartość na tym rezultacie i wysyłają notifyAll() budząc wszystkie wątki czekające na monitorze podpiętym do result. W tym momencie nasz wątek jest budzony i zaczyna znów biec.

Ktoś mi powie czemu takie rozwiązane jest złe? Czy może jest OK? A jeżeli jest OK to dlaczego nie ma czegoś takiego "w standardzie"? :-)


Podobne postybeta
Modale nie takie dobre dla Androida ;-)
Przepływ sterowany danymi - A takie Java'owe coś ;-)
wait() i notify()/notifyAll() - najbardziej nierozumiane metody klasy Object ;-)
Potfór ;-) czyli generator z yield w Java'ie
Sztuczki tropiciela błędów, part 4