piątek, października 30, 2009

Zapamiętywanie haseł jest pokręcone ;-)

Szukałem dziś pracowo listy pól na formularzach HTML, które mogą zostać zapamiętane przez przeglądarkę w celu ułatwienia logowania.
Nie mogłem nigdzie znaleźć informacji jak to działa....
Zrobiłem więc eksperyment ;-) i okazuje się, że:
  • w Firefoksie działa to tak, że zapamiętywane jest pierwsze pole o typie "password", oraz pole o typie "text" znajdujące się nad tym polem z hasłem, i wypełnianie odbywa się wg. tego samego mechanizmu, nazwy pól mogą się zmienić a i tak zostaną wypełnione wg. tego mechanizmu, dodatkowo samo pole typu "password" też zostanie zapamiętane i wypełnione
  • w Google Chrome zapamiętywanie włączy się tylko gdy w formularzu jest dokładnie jedno pole typu "password", jeżeli jest pole typu "text" nad polem z hasłem to też jest zapamiętywane
  • w Operze działa to znów tak, że zapamiętywane zadziała tylko gdy w formularzu jest dokładnie jedno pole typu "password", za to zapamiętane zostaną wszystkie pola typu "text", jednak ich wypełnienie odbędzie się dopiero po kliknięciu ikonki z kluczykiem [w Opera 10.00], co ważne wypełnianie odbywa się na podstawie nazw pól.

To jak to działa w IE jest tajemnicą bo akurat mój IE na tym laptopie jest jakiś paranoiczny i jego paranoja objawia się na różne dziwne sposoby, np. na taki, że za każdym razem potrafi mnie pytać o to czy ActiveX może zostać użyty chociaż w konfiguracji mu na to pozwoliłem. Trzeba jednak zaznaczyć, że to paranoiczne podejście jest spowodowane tym, że mój IE8 choruje na schizofrenię, którą mu zaaplikowałem dawno temu instalując na nim Multi-IE.

Sprawę utrudnić jeszcze mogą cuda w postaci narzędzi do auto-wypełniania formularzy.


Podobne postybeta
Bloggeroid 1.2 - zróbmy to ciut bardziej przewidywalne ;-)
A może by tak wsparcie dla Zoho w OpenOffice.org2GoogleDocs?
Sudoku - wstyd mi ;-)
Sztuczki tropiciela błędów, part 3 - hackujemy klasy finalne ;-)
Naprawdę nienawidzę...

czwartek, października 29, 2009

A JavaScript i tak szybszy ;-)

Gdy pisałem posta o prędkości różnych języków w pewnym specyficznym zastosowaniu, którym było liczenie całki z e-x2 kusiło mnie by zrobić test z JavaScriptem, ale uznałem, że to przecież tak wolne jest, że nie ma sensu.........

Jakże się myliłem! :-)

Na moim laptopie [czyli profesor 2.2 GHz Core 2 Duo z 4GB RAM pod Windows 7] średni wyniki wykonania 1 iteracji w której całkowana była funkcja f(x)=e-x2 w przedziale lewostronnie domkniętym od -10 do 10 w 10 tysiącach kroków, a samych iteracji wykonanych było tysiąc, przedstawiają się następująco:
Mozilla Firefox 3.5.4 - 1.380 ms
Google Chrome 4.0.223.11 - 2.514 ms

IE 8 odpadło bo za każdym razem krzyczało, że skrypt wykonuje się zbyt długo, ale gdy trochę go zmieniłem [przez zmniejszenie ilości iteracji z 1000 do 100] to IE 8 potrzebował 15.28 ms.

Jak nie wierzycie to tutaj macie "tester" :-) [Jedna uwaga, odpalajcie go w FF lub Chrome, IE odpada i Opera raczej też].

Dla porównania na tym laptopie wyniki poprzedniego testu wyglądają tak [dane podałem już w komentarzach do poprzedniego posta, ale sprawdziłem je ponownie i w przypadku C przez głupi błąd były one mniejsze o 1 rząd]:
C 32bit [kompilator z Dev-Cpp] - 1.54 ms
C 64bit [lcc-win32 64bit] - 6.97 ms
Java 32bit - 4.7 ms
Java 64bit - 3.8 ms
.NET 64bit - 14 ms
Python 2.5.2 32bit - 10.3 ms
Python 2.5.4 64bit - 10.16 ms

Wyszło więc, że akurat w tym zastosowaniu JavaScript jest wydajniejszy od C ;-)
Nie potrafię wyjaśnić dlaczego tak jest, ale i tak to cieszy ;-)


Podobne postybeta
Java 32 bit vs. Java 64 bit
32 bity vs. 64 bity, tym razem C++ ;-)
C# i Java okazały się szybsza od Pythona :-) [było Java okazała się szybsza od C# i Pythona]
Koszmarek - Small Basic ;-)
Piszemy serwis społecznościowy w Google App Engine

wtorek, października 27, 2009

Sposób na upierdliwych użyszkodników

Wczoraj w pracy zostałem jak zwykle zaatakowany przez jakiegoś użyszkodnika Gadacza lub Nowego Gadacz, jednego z tych co to dodają mnie do listy kontaktów choć w życiu się do mnie nie odezwali, a później gdy robią w ramach jakiegoś głęboko niezrozumiałego procesu przegląd znajomych na Gadu-Gadu to nie mają pojęcia kto to jest więc zadają głupie pytania.
Szło to mniej więcej tak:

<natręt> 12:30 kto ty?
widzę co pisze to zamykam okienko
<natręt> 15:30 może ten od nowego gadacza?
nadal milczę
<natręt> 15:40 gdfgdfgdfgdfpeprweprwepwerwerpwe
<natręt> 15:41 sll;we;w;e;weew;weewewewe
[..]
<Ja> 15:43 właśnie zarabiasz sobie na dopisanie do listy ignorowanych
<natręt> 15:44 ty idioto!

I wtedy wpadłem na pomysł!
A może by tak dodać do Nowego Gadacza i Gadacza ficzer, który pozwalałby mi na tworzenie czarnej listy użyszkodników którym program NIGDY by nie działał? :-)
Z ładnym komunikatem:

Niestety z jakichś powodów trafiłeś/trafiłaś na moją czarną listę, dlatego najlepiej zrobisz odinstalowując ten program bo i tak się nim nie nacieszysz.

To tak podły pomysł, że aż zabawny ;-)


Podobne postybeta
No to posprzątane, pójdę siedzieć, za obrazę uczuć religijnych....
I po wyborach :-)
Książeczki :-)
Pocieszna reklama - Kurs programowania za 1999 złote
Sen daje dobry humor ;-)

Taka tam sztuczka z dyskami - sposób na "Parametr jest niepoprawny"

Gdyby ktoś z was miał problem z Windows 7 [ale pewnie i z Vista i XP] polegającym na tym, że każda uparta próba zmiany litery dysku USB kończyłaby się komunikatem błędu "Parametr jest niepoprawny" to mam rozwiązanie ;-)
  1. Wyłączyć dysk
  2. uruchomić konsole [cmd.exe]
  3. wpisać komendę: subst C:\, czyli np. gdy chcecie mieć dysk pod E:, a uparcie włazi pod F:, piszemy subst f: c:\
  4. uruchomić dysk
  5. wydać polecenie subst /d
I po problemie ;-) W każdym bądź razie u mnie zadziałało ;-)


Podobne postybeta
Zaskoczenie
Lepsze formatowanie kodu w Obsidian'ie - trick
Paradoks SSD ;-)
Taka sobie sztuczka pozwalająca pobrać Picase 3.5
A ja wybrałem Xbox One ;-)

Windows 7 - łał :-)

Powiem krótko, Windows 7 Home Premium wygląda nieziemsko :-) to całe Areo jest na tyle ładne, że jak na razie zdecydowałem się zostać przy nim, zamiast przenieść się do standardowego ustawienia jakie stosowałem na XP czyli do "klasyczny Windows".


Jak widać nawet OOo2GD i OpenOffice.org [nadal 2.4 bo przezornie instaluje taką wersję z którą będę prowadził development OOo2GD ;-)] wyglądają ładnie w Windows 7 :-)

Tak btw. jakbyście kupowali jakiegoś laptopa z Windows 7 i MS Office w wersji 60 dniowej to zastanówcie się czy nie lepiej odinstalować MS Office przed ściąganiem poprawek :-) [oczywiście mówię o sytuacji gdy nie potrzebujecie MS Office] bo ja nie byłem taki sprytny i mi się dziś tak łącznie z 1GB poprawek do Windows 7 [i oczywiście MS Office] ściągnął, co jest wkurzające przy korzystaniu z Blueconnecta gdzie mam limit w wysokości chyba 5 GB miesięcznie ;-)

Podoba mi się w Windows 7 to, że chociaż jest takie "nowe" to jednak stare sztuczki działają :-) Np. chcąc usunąć coś z autostartu nie trzeba wbrew pozorom drania szukać po wszystkich możliwych miejscach, tylko w menu start trzeba wpisać msconfig, a następnie wcisnąć Enter :-)
Podobnie chcąc zmienić literę jakiegoś napędu, w końcu w Panelu Sterowania znajdziemy stare i znane z XP narzędzia do administrowania komputerem i zarządzania dyskami :-)

Jedyna rzecz przed która czuję obawę z 64 bitowym Windows 7 to sterowniki do mojego modemu HSDPA. Niby są takie dla 64 bitowej Visty, ale kto wie czy będą działać ;-)

Aha, z tego co zauważyłem to nadal dzięki zainstalowaniu VMware Playera można się pozbyć autostartu płyt, kart i pendrive'ów ;-)

Aha, a z Windows 7 dotykam się na moim nowym laptopie ;-) Asus N61VG-JX025V. Całkiem miły gadżet.


Podobne postybeta
Wyłączanie komputera
Nie rozumiem, czyli czemu niektórzy ludzie pytają jak przejść z Windows 7 na XP?
Ostatni dzień
Jeszcze o Chrome OS... a mądrość ludu po premierze sugeruje porażkę Chrome...
Chromium OS na Asus EEE PC 900

niedziela, października 25, 2009

OOo2GD 1.8.2

Dziś 2 małe zmiany w UI, po pierwsze usunąłem wkurzający komunikat "File Uploaded"/"File Updated" wyświetlany po wrzuceniu pliku do Google Docs/Zoho/WebDAV.Druga zmiana jest dyskusyjna, to guzik Download, który służyć ma pobieraniu plików z Google Docs/Zoho bez ich otwierania w OpenOffice.org. W przypadku pobierania plików z Google Docs, przycisk Download powoduje pobranie pliku w formacie.Nie jest to może nazbyt intuicyjne, ale powinno działać.Jest też mała poprawka, dzięki której pliki z # w nazwie będą otwierane przez OpenOffice.org.Standardowo :-) zapraszam do pobierania i na stronę projektu :-)


Podobne postybeta
Nie takie złe API ;-)
OpenOffice.org2GoogleDocs v1.0.0 :-)
Wrrr.... złe API ;-)
OpenOffice.org2GoogleDocs 1.4.0
Symlink zamiast zmiany nazwy usera ;-)

sobota, października 24, 2009

&amp;quot;Cywlizacja białego człowieka&amp;quot; - WTF?

Prawica, ta najzabawniejsza, czyli faszy... wróć!... narodowo-katolicka lubi mówić o "cywilizacji białego człowieka" i jej upadku pod zalewem hord ze wschodu i południa. Nawet jeden z przedstawicieli takiej partii w polskim Sejmie o tym mówił.Ostatnio największym zagrożeniem "cywilizacji białego człowieka" jest islam i islamizacja Europy.....Hello!?!?! Jest tam kto? W tych zakutych prawicowych łbach?Islam to religia, czy ogólnie kultura BIAŁEGO CZŁOWIEKA. Mahomet był biały, większość wyznawców islamu też jest i była biała. Arabia Saudyjska, Iran, wszystkie te państwa zamieszkane są w większości przez przedstawicieli białej odmiany człowieka.A ta zła Rosja i tamtejsze hordy? Też biali! Indie też. Dopiero Chiny, Korea, Wietnam, tam już więcej przedstawicieli żółtej odmiany człowieka.Ale z drugiej strony rozumiem, dawno doszedłem do tego, że jednym z podstawowych testów jakie muszą przejść kandydaci do takich faszy.. wróć!... narodowo-katolickich partii jest umiejętność całkowitego i bezwzględnego ignorowania faktów i rzeczywistości. Test, albo dobór naturalny, bo każdemu normalnemu człowiekowi pękła by jakaś żyłka w głowie z racji stresu wywołanego dysonansem poznawczym ;-) zostają tam więc tylko ci nieskażeni logicznym myśleniem ;-)


Podobne postybeta
Podwójne standardy - Tybet a Arabia Saudyjska.
Jak socjaliści stworzyli globalne ocieplenie by uderzyć po kieszeni islamistów i Rosję ;-)
Imigranci nas nie zaleją
Z jednej strony ludzie żyją dłużej i lepiej, z drugiej "upadek moralny"... to co w tym "upadku" złego?
Wydało się ;-)

Moja teoria o updatowaniu G1 padła ;-) - falsyfikacja w działaniu ;-)

Kombinowanie to fajna sprawa. Z tym, że nie zawsze działa ;-)Usłyszałem jakiś czas temu, że updatowanie telefonów Era G1 do Androida 1.6 odbywa się na podstawie numerów IMEI.Z tego co dowiedziałem się w Wikipedii IMEI koduje w sobie dużo danych, ale od 9 cyfry zaczyna się coś w stylu kolejnego numery telefonu [zajmuje to to 6 cyfr].Wykombinowałem sobie więc [i tu mamy kombinowanie ;-)], że może updatowanie odbywa się na podstawie tego numeru. W celu sprawdzenia mojej wykombinowanej teorii odpytałem obserwatorów tagów #Android i #G1 na Blipie o to czy ich G1 zostały zupdatowane do 1.6 i o to jakie mają 9 i 10 cyfrę IMEI.Z odpowiedzi wynikało, że te z 9 i 10 cyfrą równymi 14 i 15 już są zupdatowane...Wyszło mi więc, że jest szansa na to, że już wkrótce i ja dostane update :-) bo mój telefon ma te cyfry równe 21.Wrzuciłem "zarys" teorii na Blipa i szybko została sfalsyfikowana ;-) okazało się, że są telefony z 9 i 10 cyfrą równymi 07 i nadal radośnie hasają z Androidem 1.5, a nie 1.6. To można by było jeszcze wytłumaczyć w ramach mojej teorii, przecież można by przyjąć, że może w danym momencie inkryminowany telefon był np. wyłączony i nie załapał się na swoje "okienko" updatowania, albo coś podobnego. Ale okazało się, że istnieją telefony z 9 i 10 cyfrą równymi 26 i 32 i tak moja teoria padła totalnie.Moja teoria się sypła na falsyfikacji.To dobra teoria była, tłumaczyła obserwowane fakty, pozwoliła na zbudowanie eksperymentu, który mógł ją sfalsyfikować.No i nie przeżyła tego testu ;-)Oczywiście mógłbym uznać, że teoria jest słuszna, a że np. posiadacze telefonów z numerami 26 i 32 kłamią, albo że źle odczytali numery, w końcu łatwo się pomylić.Ale szczerze, jakie są na to szanse?Na kłamanie, powiedzmy hmmm... 2% populacji to psychopaci, wredni ludzie mogą stanowić większą liczbę, powiedzmy z 10%, czyli nawet przy założeniu, że mamy 10% wrednych ludzi i to jeszcze takich, którzy chcą zniszczyć moją teorię, mamy tylko 10% szans na TAK. Z pomyłką jest trudniej, trudno to oszacować, z 10-20% szans na pomyłkę w liczeniu, i powiedzmy z drugie tyle na złe zrozumienie, to daje od 20 do 40% na TAK, ale... ale gdyby, załóżmy, że 40% ludzi się myliło, głosów za moją teorią były 3 lub 4, czyli 1.2-1.6 głosu było błędne, przeciwnych były 3, wśród nich błędnych mogło być 1.2. No to 4-1.6=2.4 za teorią, 3-1.2=1.8 przeciw. Jakoś tak mało przekonująco to wygląda ;-) Szczególnie, że powinno być w okolicach 95% za tak i góra 5 na nie, a tutaj mamy 57% do 43%, słabo ;-)


Podobne postybeta
Chrome2ChromeV2 - działamy przez chrome.storage.sync :-)
Bio"etyka"
Czasem człowiek musi napisać dekodowanie Base64 w JavaScript ;-)
Atak kreacjonistów
Go wolniejsze od C i JavaScript, i ciut szybsze niż Java ;-) [a jednak od Java'y też wolniejsze]

czwartek, października 22, 2009

C# i Java okazały się szybsza od Pythona :-) [było Java okazała się szybsza od C# i Pythona]

[update: 15/01/2010 - okazało się, że pomiary dla C# były źle przeprowadzane co zaniżało jego wydajność mniej więcej o 10 razy!!!! Błędnie użyłem DateTime.Now.Ticks zakładając, że zwraca ilość naonsekund, a zwraca ilość ticków, których w nanosekundzie mieści się dziesięć. Niestety nikt tego wcześniej nie zauważył i złe wyniki poszły w świat. [tytuł posta też zmieniony ;-)]]
Nowe wyniki prezentują się tak [wyniki dla procesora Intel Core 2 Duo T6600 2.20 GHz [2 rdzenie 64 bitowe pod 64 bitowym Windows 7]:
C# z .NET 4.0 - 1.17 ms
Java 1.5 z przełącznikiem -server - 1.096 ms
Java 1.6 z przełącznikiem -server - 2.8895 ms
Python 2.6 - 10.88 ms
Z radością jednak odnotowuję, że słuszne były moje przewidywania i słuszne zdziwienie słabym wynikiem C# :-) szkoda tylko, że wszystkiemu winien był taki błąd :-)

[update: 23/10/2009 - dodałem informacje o wynikach programu w C i parę uwag]


Tak nie miałem pomysłu na to co dziś napisać ;-) więc zrobiłem sobie szybki test co jest szybsze [w obliczeniach] Java, Python czy C#, kontrolnie postanowiłem dodać też C :-).
Przyznam, że z języków wykonywanych w wirtualnych maszynach stawiałem na C#.

W każdym z języków napisałem program, którego celem było policzenie numerycznie 1000 razy całki oznaczonej w przedziale od -10 do 10 [niedomkniętym z prawej] w 10000 krokach z funkcji:
f(x)=e-x2

Wynikiem jest coś bliskiego pierwiastkowi z liczby pi [swoją drogą to była rzecz na analizie matematycznej która mnie zachwyciła, całka z funkcji w której użyta jest e, a wynikiem jest pierwiastek z pi, czyli istnieje związek między niektórymi stałymi matematycznymi... może to zrobiło na mnie takie wrażenie bo byłem wtedy świeżo po czytaniu Kontaktu Carla Sagana? :-)].

No i wyniki wyglądają tak [wszystkie czasy dla pojedynczego policzenia całki]:

.


Język/ProcesorAMD Turion64 ML-30*Intel Core Duo 2.16 GHzCeleron 900 MHz [Asus EEE]

.


Cb/d4 ms4 ms

.


Java18 ms10 ms10 ms

.


C# [wyniki powinny zostać prawdopodobnie podzielone przez 10 z racji błędu w programie testowym]45 ms32 ms34 ms

.


Python60-74 ms**27 ms30.5 ms

Przyznam, że byłem zaskoczony. Przed uruchomieniem testów dałbym sobie rękę obciąć za to, że z języków wykonywanych przez maszyny wirtulane wygra C#, bo coś mi się po głowie kołatało, że .NET swobodnie korzysta z koprocesora [kto jeszcze pamięta co to jest? ;-) ja pamiętam, że moją przygodę z PC zaczynałem na komputerze bez koprocesora i że były nawet softwareowe emulatory tegoż :-)], czego Java nie może robić bo jej matematyka zmiennoprzecinkowa nie jest do końca zgodna z tą stosowaną w x86 [dla pewności w przypadku Java'y uruchomiłem jeszcze test z arytmetyką zgodną ze strictfp, i wtedy czas jednej iteracji to 20 ms dla Turiona 64].
A tu proszę, Java okazała się w tym przypadku 2.5-3 raza szybsza od C# :-) i 2.85 do 3.33 razy szybsza od Pythona [testy z Pythonem 3000, czy może 3.1? pokazują, że Python troszkę przyśpieszył].

Do testów użyłem Sun Java 1.6.0_15 [czyli chyba najnowszej], dla Pythona był to ActiveState Python 2.5 i oryginalny Python 2.5 z Python.org, w przypadku .NET użyłem wersji 3.5 z włączoną optymalizacją.

Programy wyglądały tak [umieszczam tylko funkcje obliczające całkę, N=10000, kody źródłowe i wersje skompilowane znajdziecie w archiwum, chętnie poznam Wasze wyniki :-)].

Java:
static double calc() {
double sum = 0;
for (int i=0; i<N; i++) {
double x = 20.0*i/N-10.0;
sum+=Math.pow(Math.E, -x*x)*(20.0/N);
}
return sum;
}

C#:
static double calc() {
double sum = 0;
for (int i = 0; i < N; i++) {
double x = 20.0f * i / N - 10.0f;
sum += Math.Pow(Math.E, -x * x) * (20.0 / N);
}
return sum;
}

Python:
def calc():
sum=0
for i in range(0,N):
x=20.0*i/N-10
sum=sum+math.e**(-x**2)*(20.0/N)
return sum

C:
double calc() {
int i;
double sum = 0;
for(i=0; i<N; i++) {
double x = 20.0*i/N-10.0;
sum+=pow(M_E, -x*x)*(20.0/N);
}
return sum;
}


Przyznam, że jestem pozytywnie zaskoczony wynikiem Java'y :-)
Jest co prawda wolniejsza od C, ale "tylko" o 2.5 raza, w przypadku C vs. C# mamy różnicę prawie 1 rzędu w wydajności, a to już coś.

Wszystkie testy odbywały się na moim laptopie, z procesorem Turion 64ML-30 1.6 GHz ściętym do 800 MHz.

Jak komuś się będzie chciało to prosiłbym o Wasze wyniki :-)



* Turion 64ML-30 o nominalnym taktowaniu do 1.6 GHz, ale softwareowo "obcięty" do 800 Mhz
** ActivePython wydaje się być wolniejszy od "oryginalnego" Pythona.



Podobne postybeta
Raspberry Pi to nie jest demon prędkości ;-)
Całkujący Dart ;-)
Plus dla Scala, minus dla Groovy ;-)
A JavaScript i tak szybszy ;-)
Język Go dla Windows :-)

środa, października 21, 2009

The Greatest Show on Earth: The Evidence for Evolution

Czytam od paru dni najnowszą książkę Dawkinsa "The Greatest Show on Earth: The Evidence for Evolution" i powiem wprost - jest super! :-)

Na początku jakoś mi nie wchodziła, ale po paru stronach zaczęła :-)



Świetnie się to czyta, jak zresztą Dawkinsa zawsze ;-)

Jak sam pisze, ta książka ma być właśnie o tym, że ewolucja to fakt. Nie przypuszczenie, nie "tylko teoria" ale fakt.
Zaczyna od wyjaśnienia co to właściwie jest teoria naukowa, a następnie pokazuje dlaczego i jak teoria ewolucji świetnie wypełnia ramy teorii naukowej.

Materiału przedstawia tak wiele, że trudno coś wybrać do takiego opisu :-) Ale przyznam, że co wieczór od paru dni mam ochotę napisać na bloga o paru przykładach z książki, bo co chwila trafiam na coś nowego i interesującego :-)

Np. dopiero teraz dowiedziałem się, bo w szkole mi tego nie powiedziano [ale z racji tego, że było to już parę lat temu, a wtedy badania filogenetyczne były jeszcze chyba tylko ryzykowną koncepcją badawczą, a nie uznaną metodą], że człowiek i tuńczyk są bliżej spokrewnieni, niż tuńczyk z rekinem :-) [czyli człowiek i tuńczyk mają bliższego sobie wspólnego przodka, niż tuńczyk z rekinem]. Ze szkoły wiedziałem, że z ryb wyszły płazy, z płazów gady, z gadów ssaki, a później ptaki [z gadów], ale nie wiedziałem, że w odróżnieniu do ssaków i ptaków, które są między sobą wzajemnie bardziej spokrewnione [czyli dowolne ssaki są ze sobą bardziej spokrewnione, lub dowolne ptaki są ze sobą bardziej spokrewnione] niż z gadami, czy starszymi, to już wśród gadów mogą być takie, które są między sobą mniej spokrewnione niż jeden z tych gadów z ptakami, albo ssakami, to samo w przypadku płazów, a już szczególnie ryb...
Wychodzi na to, że stary dowcip:
"- Tata, co to jest hipopotam?
- Widzisz synku, to jest taka zwariowana ryba.
- Ryba? Przecież one żyją na lądzie!
- No i właśnie na tym polega ich wariactwo."

ma racje :-) Czworonogi to takie zwariowane ryby, które wylazły na ląd [a później w wielu przypadkach znów wróciły do wody, a jak się okazuje prawdopodobnie niektóre z nich znów z tej wody wylazły, a niektóre z tych "wylaźniętych" wlazły tam ponownie...].
Dawkins wyjaśnia też dość obrazowo, że podział na gatunki jaki stosujemy to bardziej wynik naszego sposobu postrzegania świata, tego że lubimy wszystko dokładnie nazwać i rozdzielić, niż tego jak to tak w rzeczywistości funkcjonuje.

Ogólnie książkę polecam :-) Sam kupiłem na Amazon UK i jestem zadowolony :-)
Polskie wydanie przygotowuje wydawnictwo CIS. Wg. zapowiedzi polski tytuł ma brzmieć "Najwspanialsze przedstawienie w dziejach świata. Świadectwa ewolucji".
Nie mogę się go doczekać :-) ponieważ mimo wszystko czytając wersję angielską muszę się momentami zastanawiać nad znaczeniem niektórych słów ;-) szczególnie gdy chodzi o nazwy gatunków.


Podobne postybeta
Najwspanialsze Widowisko Świata - Świadectwa Ewolucji
A tak sobie ;-)
Kopernik i zasada kopernikańska, później Darwin i Teoria Ewolucji... co będzie kolejne? Silne AI czy synetyczne życie?
Książki, książeczki, książunie ;-)
Śmierdząca ryba wolności ;-)

poniedziałek, października 19, 2009

My Tracks mówi "budujmy więcej autostrad" ;-) albo jakoś tak ;-)

Ostatnio jeżdżąc z Krakowa do Wodzisławia i z Wodzisławia do Krakowa zacząłem zapisywać swoje trasy przy pomocy narzędzia My Tracks dla Androida [którego to narzędzia autorem jest Google].Jedną z fajniejszych opcji tego programu jest możliwość eksportu trasy do Google Maps i Google Docs.W Google Maps ślad GPS widoczny jest na mapie, np. takiej jak ta poniżej:
View Wodzisław - Kraków (Z Pętelką) in a larger map
W Google Docs zaś uzupełniany jest arkusz z parametrami naszej trasy takimi jak czas poruszania się, średnia prędkość, średnia prędkość w ruchu [czyli tylko średnia prędkość liczona z czasu gdy byliśmy w ruchu], prędkość maksymalna i podobne.I ciekawą rzecz zauważyłem patrząc na wpisy w tym arkuszu.Okazuje się, że gdy prędkość średnia [tudzież średnia przejazdu] rośnie to maleje prędkość maksymalna :-)W każdym bądź razie na mojej trasie.Gdy sprawdziłem korelację między prędkością średnią w ruchu, a prędkością maksymalną to współczynnik korelacji wyszedł równy -0.93, dla prędkości średniej z prędkością maksymalną współczynnik jest nawet lepszy i wynosi -0.94, czyli związek jakiś chyba jest ;-)Widać to na wykresie [choć przyznam, że rzeczywiście wysnuwanie wniosków na podstawie 4 pomiarów może być cokolwiek ryzykowne ;-)]Wg. mnie potwierdza to moją hipotezę, o której już tu chyba kilka razy pisałem ;-) mówiącą, że gdy droga jest luźniejsza - czytaj mogę mieć wyższą prędkość średnią, bo nie muszę zwalniać i przyśpieszać, ale nie muszę się też z nikim ścigać - to jeżdżę wolniej :-)Wniosek stąd taki, że trzeba w Polsce budować dużo szerokich autostrad, dzięki czemu Polacy w swym ogóle będą jeździli wolniej*, a przez to bezpieczniej :-)
* - jeździć wolniej, oznacza tutaj niższą prędkość maksymalną.


Podobne postybeta
RDrive w działaniu ;-) czyli kolejny raport z prac nad Kolczatką ;-)
Cena benzyny w górę, wydatki na paliwo w dół ;-)
"Demon" prędkości
120 km/h, czyżby nowe 140 km/h? ;-)
Autostrada dowiezie mnie do domu dopiero za 2 lata :-(

niedziela, października 18, 2009

Nowy Gadacz v0.7 - gadać czy nie gadać? ;-)

OK, w wersji 0.7 kilka zmian w UI [dość szumna nazwa na jedno menu], od teraz obok aktywnego syntezatora będzie "ptaszek". Dzięki temu łatwiej się będzie "dopatrzeć" który syntezator będzie używany.

Druga zmiana to dodanie 2 opcji w menu, które pozwolą na zdecydowanie czy Nowy Gadacz powinien czytać wiadomości wychodzące i przychodzące. Dzięki temu możliwe będzie np. wyłączenie czytania wiadomości wychodzących, w końcu jak samemu się coś pisze to niekoniecznie chcemy to jeszcze raz usłyszeć wypowiadane przez syntezator ;-)

Zapraszam do pobierania i "instrukcji".

"Instalacja" przebiega standardowo. Rozpakować plik ZIP do dowolnego katalogu, np. do C:\Program Files\NowyGadacz\ i uruchomić plik NowyGadacz.jar przez dwuklik na nim.

Z pieśni przyszłości, jedynymi hamulcami przed tym bym dodał do Nowego Gadacza możliwość uruchamiania przez niego komunikatora [wtedy wystarczyłoby uruchomić Nowego Gadacza, a ten uruchomiłby komunikator] jest fakt, że Nowy Gadacz współpracuje nie tylko z Nowym Gadu-Gadu ale i z innymi komunikatorami i nie wiadomo co uruchamiać.
Pomysł jest taki by w trakcie pierwszego uruchamiania Nowy Gadacz skanował domyślną lokalizację Nowego Gadu-Gadu [i np. Gadu-Gadu 7.7] i w razie wykrycia odpowiednich plików prosiłby o wybór komunikatora który ma być uruchamiany automatycznie razem z Nowym Gadaczem, w razie braku takowego prosiłby o wskazanie lokalizacji pliku wykonywalnego komunikatora...... Ma to sens?


Podobne postybeta
Totalna beta ;-) czyli Nowy Gadacz v 0.1
Nowy Gadacz - raport z prac
Nowy Gadacz v0.2
Jestem u mechanika i mi się nudzi...
Nowy Gadacz v0.6 - gadamy przez DDE ;-)

sobota, października 17, 2009

Java i liczby pierwsze, odsłona druga

Dużo osób trafia na mojego bloga szukając czegoś o liczbach pierwszych i Java'ie.

Pisałem tu już kiedyś o użyciu klasy BigInteger z JDK w celu testowania czy liczba jest pierwsza.
Dziś będzie o prostszym teście, choć o wiele mniej dokładnym ;-)

Kod przedstawia się tak:
public class PrimeTest {
private static int modExp(int a, int b, int n) {
int d=1;
for (int i=31; i>=0; i--) {
int v = 1<<(i);
d=(d*d)%n;
if ((v & b)==v) {
d=(d*a)%n;
}
}
return d;
}

public static boolean test(int a) {
int v = modExp(2,a-1,a);
return (v==1);
}
}


A wszystko opiera się na wykorzystaniu małego twierdzenia Fermata, które mówi, że każda liczba pierwsza p spełnia równanie:

ap-1≅1 (mod p)


jeżeli tylko a jest liczbą całkowitą i nie jest podzielne przez p.

Okazuje się, że stwierdzenie odwrotne, jest prawie zawsze prawdziwe. Czyli, że prawie zawsze gdy liczba spełnia ten warunek to jest pierwsza :-) [w tym miejscu chciałoby się zakrzyknąć TADAM! ;-)]
Np. dla liczb od 2 do 1000, nasz test wskaże błędnie liczby 341, 561 i 645 [także przy 2 się pomyli, bo powie, że 2 nie jest pierwsze].
Ale dodanie testowania też dla innych a niż 2, zmniejsza szansę wyniku false positive.

 public static boolean test(int i) {
boolean b = true;
for (int a=1; a<=((i<5)?i:5)-1; a++) {
int v = modExp(a,i-1,i);
if (a!=i) {
b&=(v==1);
if (!b) break;
}
}
return b;
}


Zresztą sama metoda test(int) dla przypadku z testowanie tylko względem 2 może zostać zastąpiona przez taką:

 public static boolean test(int i) {
return (Math.pow(2, i-1)%i)==1;
}


Ta z pierwszego listingu bazuje na algorytmie obliczania potęgi modulo, który to algorytm jak i zresztą ten test poznałem dzięki książce "Wprowadzenie do algorytmów" [świetna książka, nie czyta się jej może tak lekko jak Pratchetta czy Dawkinsa, ale jest nieźle napisana].

Teraz pytanie "Po co to?".
Żeby wiedzieć :-)


Podobne postybeta
Go, a łatwość czytania kodu
Czy to jeszcze dynamic programming? ;-)
Zdradliwa Java i 8 królowych ;-)
Czemu od 30 godzin nie piję Coli - Eksperyment ;-)
Lubię bity, czyli jak dodawać, odejmować, mnożyć i dzielić na bitach ;-)

Kocham "eurosceptyków" ;-)

Kocham "eurosceptyków", są tacy przewidywalni.

Gdy Komisja Europejska zagroziła Apple, że jak nie przekażą informacji o tym dlaczego iPhone'om zdarza się czasem wybuchnąć to każe je wycofać z rynku, to ogólna reakcja była "jak ta Unia może zakazywać? To prawo klienta decydować czy chce kupić czy nie".

Jak teraz Komisja Europejska poinformowała Polskę, że łamie zasady wolnego handlu bo w Polsce nie można rejestrować samochodów z kierownicą po prawej stronie to znów reakcje są "jak ta Unia może żądać by nie zakazywano rejestracji takich samochodów?"

Czyli jak KE coś zakazuje to źle bo wtrąca się do wolnego rynku, jak KE sugeruje zmianę przepisów by zasady wolnego rynku były przestrzegane, to też źle....

Czy tylko ja wyczuwam tu takie proste, dziecinne działanie "na nie"? ;-)


Podobne postybeta
Chlebowy relatywizm ;-)
Hodowla ;-)
Części samochodowe
Atak kreacjonistów
Ciągnie prawicę do Broni ;-)

piątek, października 16, 2009

Lubię PKO BP :-)

Nie wiem czemu PKO BP ma taką złą opinię wśród ludzi.
Ja mam tam konto od jakichś 10 lat i jestem zadowolony. Na obsługę klienta nie mogę narzekać.
Np. przed chwilą zadzwoniła moja komórka, odebrałem a tu miła głos powiedział "Dzień dobry Panie Przemysławie, jutro kończy się panu jedna z lokat, i odnowi się z niższym oprocentowaniem, dlatego jeśli jest Pan zainteresowany to może wybierze się Pan do banku i Pan ją zerwie, po czym założy nową 3+3?", na moje pytanie czy można przez Internet głos odpowiedział "Ależ oczywiście, więc jak jutro się skończy, to musi Pan ją tylko zerwać, a następnie założyć nową 3+3, która ma lepsze oprocentowanie. To samo może Pan zrobić z innymi lokatami".
Wszystko miło i grzecznie.

A co najlepsze, nie mam złotego konta i nie mam doradcy :-)


Podobne postybeta
Lokaty, liczymy podatek Belki :-)
Warto dla 57 złotych?
Chwalmy chciejstwo ;-)
Szaleństwo kolorów - kolorujemy Google+ ;-)
12 lat ;-)

czwartek, października 15, 2009

Apostazja - wyjaśnienie dla wierzących

Dziś wierzący kolega z poprzedniej firmy zapytał mnie po co ateistom apostazja.

To proste. Z przynależnością do kościoła jest tak jak z przynależnością do klubu geja, albo organizacji neofaszystowskiej. Jak komuś to pasuje, to jego prawo [choć akurat przynależność do organizacji neofaszystowskich jest jakoś tak niezgodna z prawem, choć bardziej to takie organizacje się niezgodne z prawem]. Różnica polega na tym, że z tego co mi wiadomo kluby geja czy organizacje neofaszystowskie nie zapisują ludzi bez ich zgody.
Gdybym dowiedział się, że jakaś organizacja neofaszystowska czy klub gejowski uznają mnie za swojego członka, to starałbym się z nich wypisać. To samo dotyczy kościoła katolickiego.
To nie jest nienawiść do kościoła, czy gejów lub neofaszystów. Nie czuję się w żaden sposób związany z żadną z tego typu organizacji. Nie wierzę w Boga czy bogów, nie podobają mi się mężczyźni i nie czuję niechęci do innych. Mam swoje opinie o ludziach, którzy wierzą w Boga, takich którym podobają się ludzie tej samej płci, i o takich którzy czują niechęć do innych. Jednych w większości lubię, drugich prawie nie znam, a trzecich uważam za skończonych idiotów. Ale puki swoimi działaniami nie wpływają na moją wolność, ani nie ograniczają innym ich wolności to każdy z nich ma prawo należeć do swojej organizacji. Ja nie uznaję ich wartości i nie chcę do żadnej z tych organizacji należeć.
Jednak w przypadku organizacji neofaszystowskiej i klubu geja mam prosto, żadna z takich organizacji nie ma mnie w sowich rejestrach. Kościół katolicki ma.

Apostazja to po prostu akt wypisania się z organizacji z którą nie czuje się żadnej więzi. Nie ma nic wspólnego z niechęcią czy nienawiścią. Po prostu wynika z braku zainteresowania daną organizacją.

Nie należę do harcerstwa, ani do klubu kibica jakiejś drużyny. Czy to znaczy, że nienawidzę harcerstwa albo jakiejś drużyny? Nie, nie znaczy.

Pewnie tutaj ktoś kto jest gorliwym członkiem organizacji neofaszystowskiej, klubu geja albo kościoła katolickiego powie, że przecież jest znacząca różnica między jego organizacją a pozostałymi dwoma.....

Właśnie, że dla mnie nie ma. Wszystkie je łączy to, że w żadnej z nich nie chcę być.

Czuję niechęć do organizacji neofaszystowskich, to fakt, ale z wiekiem doszedłem do etapu na którym uważam, że każdy ma prawo być zwariowanym na swój własny i unikalny sposób. Puki swoimi działaniami nie wyrządzasz innym krzywdy, to proszę bardzo, należ sobie gdzie chcesz. To Twój wybór i Twoje prawo.

Więc do cholery jasnej nie odbieraj mi prawa do decyzji, że ja sobie nie życzę!


Podobne postybeta
Największy sekret demokracji
Bóg, Honor, Ojczyzna
Chcę sankcji UE
Stare = do zniszczenia?
A co jeśli jesteśmy jedyni?

wtorek, października 13, 2009

Markety

Podoba mi się idea marketów. Rozpoczął ją chyba Apple z App Marketem, a później doszedł Android Market, Sun coś próbuje, jest chyba też coś Noki.

Podoba mi się idea dostarczenia programistom w miarę spójnego środowiska, które dostarcza z jednej strony sposobu dystrybucji aplikacji, zarabiania na nich, i zabezpieczania interesów autorów.

Marzą mi się takie markety dla Java'y [to ma podobno dać Sun], Windows, Linuksa i np. OpenOffice.org. Ogólnie dla każdej w miarę spójnej platformy.

Wydaje mi się, że mogłaby to być szansa dla małych firm softwarowych i dla niezależnych programistów, którzy mogliby zmniejszyć koszty związane z dystrybucją, tworzeniem zabezpieczeń i instalatorów.
Teraz małe firmy i niezależni programiści muszą się specjalizować głównie w pisaniu aplikacji na zamówienie, i tworzą głównie aplikacje do fakturowania. Bo wejście na rynek masowy oznacza zwykle konieczność obsługi sprzedaży oraz tworzenie zabezpieczeń przed piractwem, a to zabiera czas i kosztuje.
A taki market mógłby rozwiązać te problemy :-)
A więcej programistów na rynku aplikacji masowych to potencjalnie więcej pomysłów :-)

Ciekawe czy świat pójdzie w tym kierunku?


Podobne postybeta
Tydzień 27 (jeżeli dobrze liczę ;-))
Jakieś święto, czy co?
Złe Markety ;-)
W przemyśle filmowym muszą pracować idioci...
Pomysł na film

Pluralizm

TVP to jednak prawdziwy wzór pluralizmu.
Np. ostatnio w dyskusji o islamie w Europie z jednej strony był konserwatywny katolik [pan Terlikowski], a z drugiej konserwatywny cholera wie kto [w tej roli Wolniewicz].
Albo teraz, na TVP1 mamy program Wildsteina, a na TVP Polonia Pospieszalskiego.

Jak widać w TVP każdy punkt widzenia jest przedstawiany... Znaczy każdy prawicowy ;-)


Podobne postybeta
Funeral TV
Atak UFO, czy co?
Dziwna konkurencja
Telewizyjne zastanawianie
TVP HD - najsmutniejszy program TV

poniedziałek, października 12, 2009

A tak sobie ;-)

Z fajnych rzeczy OOo2GD zostało pobrane ze strony z rozszerzeniami dla OpenOffice.org ponad 180 tysięcy razy :-) A ze strony rozszerzenia na Google Code ponad 218 tysięcy razy ;-) co daje łącznie 398 tysięcy pobrań :-)
Przyznam, że robi to na mnie wrażenie :-)

Dla porównania Nowy Gadacz został łącznie pobrany z jakieś 8 tysięcy razy [przy okazji, obecnie nie ma go w GaduDodatki bo mają tak genialny system, że update istniejącego rozszerzenia powoduje wyrzucenie go z listy dostępnych rozszerzeń i wróci tam dopiero po akceptacji, co ostatnio zajęło blisko tydzień...], ale używa go codziennie góra 200 osób [w każdym bądź razie tyle jest pytań o nową wersję].

Mnie nosi, że coś bym sobie napisał, ale mam też lenia ;-) Na tapecie jest rozwijanie OOo2GD i dodanie mu możliwości zarządzania dzieleniem się swoimi dokumentami oraz ich synchronizacja. Program który wyrzuci funkcje OOo2GD poza OO.org, czyli coś siedzącego w zasobniku i pozwalającego pobierać i wrzucać pliki do Google Docs, Zoho i serwerów WebDAV [+ synchronizacja], oraz program, który to wszystko pozwoliłby robić przy pomocy interfejsu WebDAV [co powinno pozwolić na w miarę wygodne używanie tego z MS Office]. Po głowie chodzi mi też coś do OO.org co pozwoliłoby na współpracę z Google Sites..... a również dodanie do zrobionego kiedyś bardzo dawno temu "rozszerzenia" łączącego OO.org z syntezatorem mowy Expressivo wsparcia dla innych syntezatorów mowy......... ale to wszystko są plany i życzenia, bo na razie nie umiem wykrzesać w sobie energii by coś z tych rzeczy zrobić ;-)
Ogólnie męczy mnie idea zrobienia czegoś dużego, albo czegoś na czym mógłbym zarobić jakieś złotówki ;-) ale w obu przypadkach brak mi weny i chęci do pracy ;-) Jednak w tym wieku już 8 godzin w pracy nad kodem i Outlookiem powoduje, że człowiek nie jest już taki chętny do kodzenia czegokolwiek ;-)
Np. ostatnio męczyło mnie żeby napisać sobie cokolwiek co używałoby algorytmu DFS albo BFS, na chwilę TopCoder pozwoliło mi tego użyć w jednym z zadań związanych z tworzeniem planu zajęć, ale powód zabawy z TopCoder już minął. Zresztą byłem "świnia" i całe układanie planu zajęć rozwiązałem przez lekko zmodyfikowane sortowanie topologiczne.

Jest jeszcze projekt do wyszukiwania podobnych postów i nie mam jakoś chęci do dodania mu GUI, mnie wystarcza to, że w razie czego podmieniam adresy bloga i znaczniki ręcznie w źródle, a jak na razie nie wydaje mi się bym znalazł zbyt wielu chętnych do testowania tego narzędzia ;-) więc brak mi motywacji.

Chyba się muszę zakochać, albo co, żeby znów coś mi się na umysł rzuciło ;-)
Może ktoś mi za sponsoruje wyprawę w kosmos? ;-)

Ale liczę, że już pod koniec października albo w listopadzie kupię sobie nowego laptopa z Windows 7 :-) i będę miał kopa do działania, bo jednak teraz często nie chce mi się nic robić, bo jak mam czekać n minut na głupie przekompilowanie, czy uruchomienie środowiska to mi się nie chce nawet zaczynać ;-)

OK, koniec narzekania. Z plusów, z Amazona przyszło 7 sezonów Buffy, i kupiłem też z tego powodu odtwarzacz DVD i już 2 płyty z 39 obejrzałem :-) i jakość jest świetna :-) Jest też najnowsza książka Dawkinsa "The Greatest Show On Earth - The Evidence For Evolution" i choć na początku nie była jakaś super, to teraz już jest. W kolejce czeka "Blind Watchmaker" tegoż samego autora, a później "Wisdom of Crowds" i najnowszy Terry Pratchett "Unseen Academicals".

Jak ktoś ma pomysł jak odpalić coś co wyłącza lenia i zniechęcenie to proszę o kontakt ;-)


Podobne postybeta
Książki które zmieniły moje życie
Przybijające cosie.......
Lenię się :-)
Chromium OS na Asus EEE PC 900
Gadające Gadu-Gadu

niedziela, października 11, 2009

Nowy Gadacz v0.6 - gadamy przez DDE ;-)

No i Nowy Gadacz w wersji 0.6 wzbogacił się o umiejętność "gadania" poprzez syntezatory mowy dostępne przez DDE, czyli przez:
  • System Syntezy Mowy WP
  • Spiker/UniSpiker firmy IVO
  • Syntalk

A ponieważ UniSpiker potrafi komunikować się np. z RealSpeak'iem to i Nowy Gadacz w wersji 0.6 to potrafi poprzez UniSpikera ;-)

Jak zainstalować?
Po pobraniu pliku NowyGadacz-0.6.zip należy go rozpakować w dowolnym katalogu, np. C:\Program Files\NowyGadacz.
Ważne by rozpakować plik NowyGadacz.jar i NowyGadaczJNI.dll!

Uruchomić można przez dwuklik na NowyGadacz.jar ;-) reszta konfiguracji taka sama jak to co opisałem w "instrukcji".

Zapraszam do pobierania i czekam na uwagi ;-)

Jeśli nic nie wyskoczy w ciągu następnych kilku dni to zapewne wersja 0.6 trafi "do kanału" i posiadacze starszych wersji będą informowani o dostępności nowej wersji.


Podobne postybeta
Nowy Gadacz v0.7 - gadać czy nie gadać? ;-)
Projekty ;-)
Totalna beta ;-) czyli Nowy Gadacz v 0.1
Gadające Gadu-Gadu
JNI i łańcuchy ;-)

JNI i łańcuchy ;-)

Kto by przypuszczał, że najtrudniejszą sprawą w sprzężeniu Java'y z syntezatorami mowy pracującymi w oparciu o DDE okaże się kodowanie znaków? :-)

Ugryzienie połączenia między Nowym Gadaczem, a syntezatorami mowy na DDE [czyli Systemem Syntezy Mowy WP, UniSpikerem/Spikerem, SynTalkiem, ale też Expressivo :-)] to sprawa użycia JNI (Java Native Interface) i włączenie wygenerowanego przez Java'ę pliku nagłówkowego do projektu w C, ale problemy zaczęły się na sprawie polskich znaków.

Java łańcuchy tekstowe trzyma w UTF-8, co jest dobre i słuszne. Windows jest tutaj bardziej szalony, bo używa zwykle Windows-1250 a czasem Unicode. Do tego DDE dodaje jeszcze swoje własne wariactwa.

Pierwsze podejście polegające na przekazywaniu Java'owego String'a do kodu w C, działa ale syntezatory głupieją na polskich znakach.
JNIEXPORT void JNICALL Java_pl_przemelek_gadacz_tts_DDE_speakViaDDE(JNIEnv * env, jobject obj, jint currentSpeachSynthezier, jstring string) {
const char *str = (*env)->GetStringUTFChars(env, string, 0);


Myślałem o przekodowywaniu znaków, ale to też nie jest najlepszy pomysł.

Na razie okazuje się, że najlepiej przesyłać do JNI łańcuch w postaci tablicy znaków utworzonej w taki sposób:
public void speak(String text) throws SpeachException {
text+=(char)0;
speakViaDDE(currentSpeachSynthezier,text.getBytes());
}

Dodanie zrzutowanego na typ char zera daje nam pewność, że tablica będzie zakończona zerem jak to lubi C w przypadku łańcuchów ;-)

Pod koniec zaś pracy z łańcuchem w C, dla pewności wołamy ReleaseByteArrayElements :-)


Podobne postybeta
C# miewa swoje plusy ;-)
Nowy Gadacz v0.6 - gadamy przez DDE ;-)
Sekrety klasy String ;-)
Pomysł
Nowy Gadacz - raport z prac

piątek, października 09, 2009

Noblowisko

Ktoś kojarzy skąd to oburzenie, że Obama dostał Nobla?I jeszcze pretensje do samego Obamy, tak jakby sam sobie przyznał tą nagrodę ;-)Dali mu, nie prosił się.Czy zasłużył? Nie wiem, ale wydaje mi się, że więcej mu szkody zrobią tą nagrodą niż dobrego. W USA pewnie część ludzi uzna, że to dowód na to, że Obama to agent ONZ, który ma za zadanie zlikwidować stany co będzie przygotowaniem do Armagedonu [też nie wiem co palą, ale choć sam jestem bezużywkowy to chętnie bym spróbował ;-)].Już zresztą jakaś prawicowa grupka zaczęła nawoływać do impeachmentu.W Europie zaś jakiś włoski i katolicki dziennikarz już zakrzyknął, że to lewicowe lobby przejęło komisję noblowską [widzicie ten sam rys co u zwolenników teorii o Armagedonie? ;-)].Ja trzymam kciuki za Obamę i za USA, jednak wolę świat w którym to oni grają pierwsze skrzypce, niż taki w którym robić to będą np. Chiny.A co do Nobla z fizyki to super :-) bo w mojej dziedzinie, czyli optoelektronice :-) Nobel z chemii za rybosomy to też super bo rzeczywiście to jeden z podstawowych elementów zrozumienia życia.


Podobne postybeta
A może by tak Macbooka Air?
2.68 tryliona nanomaszyn....
Dziwne.
#100 ;-)
Jak apokalipsa to nie w Warszawie ;-)

środa, października 07, 2009

Google Wave - pierwsze wrażenia

Najpierw plusy :-)Podoba mi się możliwość wrzucenia do Wave'a gadżetów Google'a [co ćwiczyłem na moich gadżetach].Podoba mi się również to, że zmiany rzeczywiście widać on-line, niby jest to już podobnie zrobione w Google Docs, ale tutaj działa to lepiej.Podobają mi się sugestie widoczne jako małe żaróweczki np. gdy damy linka do filmu na YouTube to Wave sugeruje nam by film osadzić.Lekkie wady:Nie podoba mi się to, że nie można wrzucić obrazków z sieci...Nie podoba mi się to, że nie mogę nikogo zaprosić [choć to specyfika mojego konta ;-)]Na razie link zapisane jako tekst bez użycia "Link" nie jest sprytnie rozpoznawany jako link.Domyślnie Wave jest przystosowane do większych ekranów ;-) W standardowym widoku na ekranie 1024x768 i 1280x1024 nie widać wszystkich ikonek dotyczących Wave'aW full screen widać wszystkie ikonki dotyczące Wave'a:W widoku standardowym ostatnią z ikonek jest "Link"Ogólnie:Narzędzie ma sens gdy ma się wiele osób z którymi można "waveować", czy używając nomenklatury Google "blipać".Na pewno Wave może stać się świetnym narzędziem w pracy używanym w trakcie spotkań projektowych, albo do szybkiej wymiany wrażeń na temat designu czy podobnych.Jeżeli Wave pozwoli na łączenie go z dokumentami Google i kalendarzem, do którego dojdą jakieś proste mechanizmy zarządzania projektami to będzie to świetne narzędzie do zarządzania projektami.Większość swoich zabaw przeprowadzałem w Google Chrome, ale Wave działa też dobrze w Firefoksie 3.5, nie udało mi się jednak uruchomić Wave na Androidzie, co prawda strona się wyświetlała, ale Wava'y jakoś już nie.Zapowiada się całkiem ciekawe narzędzie, ale wydaje mi się, że w pełni z jego możliwości korzystać będzie tylko kilka procent użytkowników, cała reszta ograniczy się jednak do maila i komunikatora...... choć jeśli Google uda się Wave sprytnie połączyć z mailem i GTalkiem to Wave może stać się o wiele bardziej popularny.Osoby, które mają konta na Wave zapraszam do wspólnego blipania ;-) Mój adres to przemelek a dalej małpa i googlewave po czym idzie kropka i com :-)

Podobne postybeta
Google zabij już Google+
Ile to jest 1+1 w Java'ie?
IE8 beta 1
Eventy na żywo nie zawsze są bardziej wow niż w TV ;-)
Co bym zmienił w produktach Google.. Part 1

Czemu wait() i notify()/notifyAll() w ogóle działają?

W nawiązaniu do wpisu o wait() i notify()/notifyAll(). Nikt nie zapytał dlaczego to w ogóle działa ;-)

Skoro wait() i notify() muszą być w kodzie, który jest synchronizowany na obiekcie w którego kontekście wołane są te metody to jak to może działać? Przecież synchronizacja działa mniej więcej tak, że gdy jeden wątek jest w sekcji synchronizowanej na danym obiekcie to inny zostanie zablokowany w momencie gdy spróbuje wejść do takiej sekcji... Jak więc możliwe jest by jeden wątek wszedł do tej sekcji i zawołał wait()/wait(int), a następnie inny wątek znów wszedł do sekcji synchronizowanej i zawołał notify()/notifyAll()?

Działa to ponieważ w momencie wywołania wait() obiekt jest przesuwany ze stanu w którym jest aktywny do stanu w którym śpi. Dopiero notify() lub coś co spowoduje wyrzucenie z wait() wyjątku InterruptedException może przywrócić go do wątków aktywnych [może, ale nie musi w przypadku notify(), która wybudzi dowolny [ale tylko jeden] z wątków które wiszą na danym monitorze, notifyAll() wybudzi je wszystkie, ale to JVM zdecyduje czy, kiedy i który wątek zostanie wykonany w jakimś momencie].

Mam nadzieję, że to trochę rozjaśni mroki wątków ;-)


Podobne postybeta
wait() i notify()/notifyAll() - najbardziej nierozumiane metody klasy Object ;-)
Google Play Services dobre jest :-)
Modale nie takie dobre dla Androida ;-)
Potfór ;-) czyli generator z yield w Java'ie
Chrome2ChromeV2 na GitHub :-)

wtorek, października 06, 2009

OOo2GD 1.8.1 - i znów poprawki

Dwie poprawki.Pierwsza to zmiana adresu skąd OOo2GD pobiera prezentacje, niestety uległ zmianie przez co pobieranie prezentacji nie działało.Druga to filtrowanie elementów w oknie importu, od teraz widoczne tam będą tylko dokumenty tekstowe, arkusze i prezentacje, nie będzie za to widać np. PDFów.Jak zwykle zapraszam do pobierania ze strony OOo2GD w repozytorium rozszerzeń OpenOffice.org [do teraz pobrano rozszerzenie prawie 177 tysięcy razy :-)] albo na stronę projektu.


Podobne postybeta
Pobierz swoje dokumenty z Google Docs w wybranym w formacie, czyli OOo2GD 1.8.0 :-)
OOo2GD 2.1.0 - filtrowanie, sortowanie [dla niektórych ;-)] i bardziej *nixowe nazwy
Co umie OpenOffice.org2GoogleDocs ;-)
DevoXX 2022
OOo2GD 2.1.2 i malutka poprawka :-)

poniedziałek, października 05, 2009

wait() i notify()/notifyAll() - najbardziej nierozumiane metody klasy Object ;-)

Zrobiłem sobie wersję 1.8.1 OOo2GD, ale "jak zwykle" strona rozszerzeń padła więc nie mogę jej tam wrzucić [ale dostępna jest na stronie rozszerzenia ;-)], a że męczy mnie katar to chciałbym sobie coś zakodować albo chociaż napisać coś na blogu [w tracie pisania strona zaczęła znów działać ;-)].

Będzie więc dziś o chyba 2 najbardziej nierozumianych metodach klasy Object. Czyli o wait() i notify()/notifyAll().
Spróbuję to wytłumaczyć prostymi słowami ;-)

Po pierwsze wolno tych metod używać tylko w sekcji synchronized, tudzież w metodach synchronizowanych i wołać je wolno tylko z obiektów na których odbywa się synchronizacja.
public class Fred { 
public static void main(String[] args) {
final Fred fred = new Fred();
final Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println("t1 start :-)");
System.out.println("t1 will wait...");
synchronized (fred) {
try {
fred.wait();
} catch (InterruptedException ie) {
System.out.println("t1 interrupted...");
}
}
System.out.println("t1 stop :-)");
}
});
t1.start();
Thread t2 = new Thread(new Runnable() {
public void run() {
System.out.println("t2 start :-)");
synchronized (fred) {
System.out.println("t2 notifyAll!!!");
fred.notifyAll();
System.out.println("t2 done ;-)");
}
System.out.println("t2 stop :-)");
}
});
t2.start();
}
}


Co się dzieje w tym programie wyżej?
Najpierw tworzymy obiekt, na którym będziemy się synchronizować, zwany jest on dla niepoznaki monitorem... OK, dokładniej monitor jest na obiekcie, ale to szczegół.
Następnie tworzymy sobie wątek t1, który ma za zadanie wypisać parę rzeczy i następnie ma wywołać na obiekcie fred metodę wait(). Po tym wszystkim startujemy wątek t1 [tak naprawdę mówimy tylko, że chcielibyśmy aby ten wątek został uruchomiony], po czym tworzymy wątek t2, który ma zawołać na obiekcie fred metodę notifyAll(). Ma więc obudzić wszystkie wątki które czekają na sygnał na danym monitorze. Gdybyśmy w tym miejscu zawołali notify() to JVM wybudziłaby "któryś" z wątków wiszących na tym monitorze.
W większości systemów wynik działania programu będzie wyglądał tak:
t1 start :-)
t1 will wait...
t2 start :-)
t2 notifyAll!!!
t2 done ;-)
t1 stop :-)
t2 stop :-)}

Choć mogą być i takie gdzie t2 wystartuje przed t1, znotyfikuje wszystkie wątki wiszące na monitorze [czyli 0], a dopiero wtedy t1 zacznie czekać ;-) Choć jest to jednak mało prawdopodobne. Wątki nie są deterministyczne, ale z dużym przybliżeniem można często bazować na zdrowym rozsądku.

Zamiast używać freda jako jawnego monitora moglibyśmy po prostu w klasie Fred stworzyć 2 metody:
synchronized void method1() {
try {
wait();
} catch (InterruptedException ie) {
}
}

synchronized method2() {
notifyAll();
}

i wołać je z naszych wątków.

Teraz tłumaczenie do czego to się może przydać ;-)

Mamy np. coś co chcemy by wykonywało się co najmniej raz na 5 minut, ale w razie potrzeby żebyśmy mogli to wywołać na żądanie. Może chodzić np. o wysyłanie maili, możemy np. zdecydować, że normalne maile są kolejkowane i raz na 5 minut w orgii mailowej wysyłamy je wszystkie, a maile o błędach czy np. z przypomnieniem haseł wysyłane są na bieżąco.
Wtedy w naszym mailerze możemy użyć wait() i notify() [a dokładniej wait(int)]...
choć i tu mogą pojawić się problemy, możemy np. nieszczęśliwie znotyfikować 0 wątków bo akurat wątek pocztowy wysyła maile....

A co gdy chcemy by wątek poczekał na inny? ;-)
Wtedy używamy metody join() i tym razem bez synchronizacji i wołamy ją na wątku na który chcemy poczekać.
Jeżeli chcemy czekać pewien czas, a później nawet jeśli wątek na który czekamy się jeszcze nie skończył chcemy działać dalej to używamy join(int).

Gdy chcemy by wątek poszedł spać na zadany czas i nie interesuje nas to by go budzić, wtedy używamy sleep(int).

Używajac wait(), wait(int), join(), join(int) i sleep(int) musimy łapać InterruptedException.
Kiedy ten wyjątek może zostać rzucony? Wtedy gdy wątek który woła daną metodę zostanie przerwany. Przyznam, że jedyną mi znaną tego przyczyną może być zawołanie na tym wątku metody interrupt(), ale zapewne JVM jest w stanie czasem spowodować ten wyjątek w innych okolicznościach ;-)
Dlatego gdy chcecie by wątek spał/czekał/oczekiwał przez zadany czas to bezpieczniej wołać te metody w pętli i sprawdzać czy zadany czas już minął.

Nie do końca jestem pewien czy to dobrze wytłumaczyłem.... ;-) Jakby co to pytać w komentarzach :-)


Podobne postybeta
Dodajmy 3 klasy do SDK Java'y ;-)
Kwiatek ;-)
Modale dobre - confirm dla Androida :-)
Potfór ;-) czyli generator z yield w Java'ie
Przepływ sterowany danymi - A takie Java'owe coś ;-)

Kolektywna awaria? ;-)

Jakaś kolektywna awaria internetu dzisiaj. Nie działa strona z rozszerzeniami do OpenOffice.org i strona z rozkładami jazdy MPK w Krakowie.Ta pierwsza potrzebna mi jest do sprawdzenia jak dużo było pobrań najnowszej wersji OOo2GD [zgaduje, że teraz nic się nie pobiera ;-)], a druga po to by móc dokładnie ustalić o której trzeba jutro wstać ;-) niby pamiętam rozkład, a w każdym bądź razie te najistotniejsze jego elementy, ale zawsze to się bezpieczniej upewnić.Niby to sprawy całkiem niezależne, ale jednak człowiek wietrzy spisek ;-)Trace Route pokazał, że jednak obie awarie nie maja wspólnej przyczyny sieciowej.


Podobne postybeta
Roboty są trudne ;-)
Wszystko jeden pies ;-)
Android, lokalizacja i koszty
Zły samochód i PKP, czyli koncert narzekania;-)
Maruda mode post ;-)

sobota, października 03, 2009

Pobierz swoje dokumenty z Google Docs w wybranym w formacie, czyli OOo2GD 1.8.0 :-)

Dziś dwie zmiany w OOo2GD, pierwsza to dodanie możliwości pobierania plików w wybranym formacie :-)Wybór mamy dla arkuszy i dokumentów tekstowych, dla prezentacji wybrać możemy tylko format PPT :-)Samo rozwiązanie w GUI nie jest może najbardziej oczywiste, ale działa.Druga zmiana to powrót "ikonki" na guziczek odświeżania listy w oknie eksportu do Google Docs. Ikonka piękna nie jest ;-)Mamy też małe wewnętrzne zmiany, z których najistotniejsza to zmiana tego jak OOo2GD przedstawia się Google Docs.Jak zwykle zapraszam do pobierania ze strony OOo2GD w repozytorium rozszerzeń OpenOffice.org [do teraz pobrano rozszerzenie prawie 177 tysięcy razy :-)] albo na stronę projektu.


Podobne postybeta
OOo2GD 1.8.1 - i znów poprawki
Swing i GUI znów "przeszkadzają" ;-)
OOo2GD 1.5.0 - drżyjcie arkusze! ;-)
OOo2GD 2.1.2 i malutka poprawka :-)
Zamotka