niedziela, października 31, 2010

Nowość ostatniej szansy, czyli Czysta Krew sezon 3 w HBO OnDemand


HBO OnDemand mogłoby się zdecydować ;-)
Bo kilka odcinków 3 sezonu Czystej Krwi jest dostępne teraz jednocześnie jako "Ostatnia szansa" i "Nowość" ;-)

Obejrzałem 1 epa i nie porwało mnie, ale i tak lepsze od większości seriali.



Podobne postybeta
Nexus zawstydza Internetię ;-)
TVP HD - najsmutniejszy program TV
Google Goggles w działaniu :-)
"Harry Potter and the Deathly Hallows" - przeczytane :-)
Taniej :-)

sobota, października 30, 2010

Programowanie jest stresujące

A dokładniej wypuszczanie nowych wersji softu jest stresujące.

W pracy to mogę zrozumieć bo tam mi płacą, ale w moich prywatnych to mnie zawsze dziwi ;-)

Dziś wypuściłem Bloggeroida 1.3.3, który nabawił się testowo autosave'a [który jest wynikiem tego, że w czasie gdy bateria mojego G1 była chora to zdarzyło mi się stracić wpis z powodu tej "choroby", dlatego dodałem Bloggeroidowi ficzer powodujący nagrywanie do pliku co 15 sekund [gdy aplikacja jest widoczna] treści aktualnie edytowanego postu], ładniejsze ikonki oraz tego, że w razie problemów z publikacją Bloggeroid proponuje wysłanie do mnie mailem raportu z błędem.

No i teraz czekam na reakcje w ocenach.....
A Androidowi użytkownicy jacyś bardzo nerwowi są.

I drżę.

Jakby ktoś chciał pobrać to tutaj QRCode :-)



A nowa ikona w wersji super dużej wygląda tak :-)




Podobne postybeta
Wernyhora mode.... któryś tam.. co to jest Occam? ;-)
Tablet mi notebookieje...
Android Marketowi odbiło
Chrome staje się lepszy
Bloggeroid 1.5.0 - czas lokalizacji ;-)

środa, października 27, 2010

Defragmentacja SSD - o tym dlaczego nie należy jej robić

Co jakiś czas ktoś do mnie trafia szukając terminu "defragmentacja dysków SSD" dlatego napiszę to znowu, choć kiedyś już pisałem ;-)
Dysków SSD się nie defragmentuje!

Dlaczego?

Bo po pierwsze to nie ma w ich przypadku sensu, i po drugie bo im to szkodzi.

O co chodzi?

Najpierw krótki opis jak zapisujemy dane na dysku.

Dysk to nic innego jak zbiór "komórek", zwanych sektorami, w których można trzymać jakieś dane, te komórki mają zwykle długość kilku-kilkuset bajtów.
Możemy to sobie wyobrazić w taki sposób:

|sektor 0|sektor 1|sektor 2|sektor 3|....|sektor N-1|sektor N

gdzie N to maksymalna liczba sektorów na dysku.

Te sektory są "nawinięte" na dysk, i dla ułatwienia możemy sobie przyjąć, że sektor 0 jest przy środku dysku, a sektor N na zewnątrz, a same dane są zapisane tak jak to wyglądało w przypadku płyty gramofonowej, czyli robią ślimaka (czy jak ktoś bardziej obyty matematycznie ;-) spiralę ;)) od środka dysku. [To uproszczenie, w rzeczywistości to nie jest ślimak, a zbiór okręgów, z których każdy składa się z pewnej liczby sektorów].
Żeby odczytać dane z dysku zamontowano w nim głowicę, która porusza się na ramieniu i odczytuje dane z dysku. To poruszanie się zabiera czas.

I teraz wracamy do sektorów :-)
W idealnym świecie gdybyśmy zapisywali dane to byłyby one zapisane po kolei, w taki sposób:

|dane pliku A w sektorze 0|dane pliku A w sekotrz 1|dane pliku B w sektorze 2|....

czyli:
AAB....

Oczywiście w świecie rzeczywistym nie jest tak różowo. Gdy najpierw zapisujemy coś na dysku to mamy to tak ładnie ułożone:
AABCCCCDDE
Ale po jakimś czasie część danych skasowaliśmy:
AA.CCCCD.E [czyli skasowaliśmy plik B i część pliku D]
Po czym znów zapisujemy, tym razem plik F o długości 4:
AAFCCCCDFEFF
zapisujemy nasz nowy plik w "wolne" miejsca po starych plikach.
Teraz jednak głowica chcąc odczytać plik F musi pójść do sektora 2, później do 8, a następnie do 10 i 11, gdzie między 2 i 8, i 8 i 10 musi poruszać się niepotrzebnie bo wtedy nic nie czyta.

Dlatego czasem chcemy powrócić do idealnego świata i chcemy uporządkować dysk, bo przecież wystarczy w naszym przypadku np. w miejsce pierwszego kawałka F wrzucić D, E przesunąć na miejsce 2 kawałka F i po E zapisać całe F.

Proces, który do tego prowadzi to właśnie defragmentacja.

I jest super....

Do czasu gdy nie jest to dysk SSD :-)

W dyskach SSD po pierwsze nie ma czegoś takiego jak głowica. Odczyta z grubsza trwa tyle samo niezależnie w jakiej kolejności odczytujemy "sektory". Czyli to jak dane są ułożone na SSD nie jest dlań istotne, odczytanie pliku zajmie za każdym razem mniej więcej tyle samo.

Trochę inaczej będzie z zapisem, bo akurat w przypadku zapisu z powodu fizycznej budowy pamięci Flash zapisywanie jest ciut bardziej skomplikowane. W ogólności chodzi o to, że tylko czasami można dopisać coś do "sektora", zwykle trzeba go wymazać i zapisać od nowa, nawet jeśli doszedł do niego tylko 1 bajt, albo zmienił się tylko 1 bit w którymś z bajtów.

Dodatkowo w dyskach SSD istnieje limit zapisów do sektora..... zwykle to 10 tysięcy zapisów do sektora, po czym dochodzi do fizycznego zniszczenia takiej komórki. Dlatego dyski starają się "kombinować". Gdyby zapisanie do sektora 3 odbywało się kilka razy to po jakimś czasie sektor ten mógłby niebezpiecznie zbliżyć się do limitu.
Dlatego dyski SSD gdy uznają to za stosowne to przenoszą sektory. To co było przed chwilą sektorem 3, teraz już nim może nie być i może być oznaczone jako czysty sektor 9873 albo inny. Zaś sektor widoczny dla komputera jako sektor 3 może znajdować się tam gdzie przed chwilą był sektor 7001 albo inny :-)

Stąd gdy będziemy próbować defragmentować dysk SSD to zrobi on kupę głupich rzecz. Po pierwsze będzie się starał umieścić pliki blisko siebie, ale tylko w warstwie logicznej, czyli dla komputera plik będzie w sektorach 0-10, ale w rzeczywistości może być rozrzucony po całym obszarze SSD.... co nam nie przeszkadza zbytnio.
Po drugie, rozmieszczając pliki w taki sposób jak sobie wymyśli defragmentator będziemy zmuszać dysk SSD do przenoszenia danych i niepotrzebnego zapisywania ich, co będzie zmniejszać limity zapisów na dysku. Czyli defragmentacja dysku SSD prowadzi wprost do spadku jego żywotności....


Dlatego powtórzę ;-)

NIE DEFRAGMENTUJEMY DYSKÓW SSD!!!!

Sam tego nie wiedziałem i na początku posiadania Asus EEE PC 900 z dyskami SSD zdarzyło mi się je defragmentować, dopiero później zrozumiałem swój błąd :-)


Podobne postybeta
Algorytm ;-)
Teoretyczny limit życia dysku SSD w Asus EEE.
Zrób krzywdę swoim danym ;-)
SSD a programowanie
Referencje w Java'ie

Archos 101 i zgryz ;-)

I mam zgryza ;-) Bo jakiś czas temu stwierdziłem sobie, że jeżeli tablet Archos 101 będzie kosztował do 1600 złotych to sobie go kupię.
I wg. tej strony tyle kosztuje ;-)

Podoba mi się to, że ma 10 calowy wyświetlacz o rozdzielczości 1024x600, że ma Androida 2.2 i że ma HDMI........... nie podoba mi się, że nie ma Android Marketu [niezależnie jak na niego narzekam to jest on w chwili obecnej najlepszym źródłem aplikacji dla Androida :-)], nie ma GPS [przez to nie ma zresztą Marketu bo nie spełnia minimalnych wymagań dla sprzętu, który Google jest w stanie zaakceptować], kamerka ma tylko 0.3 MPiksela i, co chyba najważniejsze, nie wiem w ogóle co to za firma ten Archos.
Nie chciałbym utknąć z czymś w porównaniu do czego moje G1 byłoby demonem prędkości ;-)

Chociaż z dobrych rzeczy, po tym jak jeszcze z półtora miesiąca temu chciałem mieć tablet "już, teraz!" to teraz aż takiego ciśnienia nie czuję ;-)
Ale zgryza mam nadal ;-)


Podobne postybeta
3 plusy ;-)
Zgryz laptopowy ;-)
Edukator ;-)
Oswajanie tableta
EEE PC 900 - warto rozszerzać czy nie? ;-)

niedziela, października 24, 2010

Terminy

Czuję się rozpieszczony przez Amazon.
Zawsze podają po dokonaniu zamówienia datę wysłania, a później datę dotarcia produktu.
I zwykle są szybsi niż to deklarują.
Gdy zamawiałem Buffy to przyszła chyba tydzień przed tym gdy miała przyjść, dziś wysłali mi przesyłkę na dzień przed deklarowaną datą.
Polski Merlin nigdy nie był tak szybki, ale zwykle dostawałem przesyłki w deklarowanym czasie lub 1-2 dni później.
Za to urzędy, choć zwykle mieściły się w deklarowanym czasie to czasem nie wydalały ;-)

Najbardziej spektakularne to było z prawem jazdy, które wymieniałem na prawie 2 miesiące przed terminem, a i tak musiałem czekać jeszcze chyba z pół miesiąca po tym jak wg. prawa moje z powodu blankietu stało się nieważne ;-)
Wtedy czas załatwienia sprawy wzrósł im chyba 2.5-3 krotnie....

Dlatego zastanawiam się jak są ustalane terminy. Tak Amazon robi to chyba tak, że na podstawie swojej historii podaje czas, w który mieści się np. 98% podobnych zamówień historycznych. Ale jak to robi się z terminami w ustawach, albo aktach wykonawczych? Czy te terminy są narzucane przez osoby tworzące ustawy, czy wynikają z konsultacji ministerialnych? Czy może stoi za tym jakaś matematyka?

Ja się obawiam, że większość terminów jest narzucana bez sprawdzenia jak to będzie wyglądało w praktyce. Taki wniosek przychodzi mi przez analogię. Parę lat temu gdy zmieniano prawa jazdy dodano w ustawie, albo przepisach wykonawczych możliwość odebrania prawa jazdy przez pocztę, żeby ułatwić obywatelowi życie.
Na skutek tego na formularzach pojawiła się opcja, w której można było zaznaczyć, że chce się dostać dokument do domu. I niby fajnie, ale okazało się, że inne przepisy są tak skonstruowane, że urzędy nie mogły z tego korzystać, bo nie wiadomo było jak potwierdzić, że dokument odebrał ten kto powinien.
No i przez to kratka na formularzu była, ale jej zaznaczenie niczego nie powodowało, poza może komentarzem odporniejszych na niechęć urzędniczek, że trzeba jednak odebrać dokument osobiście.
Podobna sytuacja jest z obowiązkiem meldunkowym, którego od 2011 czy 2012 ma nie być, ale ma być obowiązkowa rejestracja pobytu ;-)
Dlatego wydaje mi się, że jak w ustawie jest termin to podany jest on często z sufitu...

Btw. terminów to ja się pytam kiedy będzie otwarcie odcinka A1 Bełk-Świerklany.

A co do wysyłania dokumentów pocztą, to wizę amerykańską dostałem kurierem już następnego dnia :-)



Podobne postybeta
Kto ustala datę świąt wielkanocnych?
Gorzkie żale zegarowe
Gdy Kindle zachoruje, część 2 - Następca...
Linux umiera?
Todo - Efekt ciążenia ku dołowi listy ;-)

sobota, października 23, 2010

Android Market jest.... taki sobie ;-)

Algorytm decydujący o tym gdzie pojawia się aplikacja w Android Market jest zabawny ;-)
W polskiej wersji awansowałem z Bloggeroidem z ostatniego miejsca dla słowa Blogger na 4 czy jakoś tak tylko dzięki temu, że wpisałem w pierwszej linii opisu słowo Blogger ;-)
Ciekawe czy biorą pod uwagę np. to jak wiele osób instaluje aplikację z danego słowa kluczowego, choć może to by niczego nie zmieniło?
W ogóle Android Market to najsłabszy element Androida. Ostatnio na liście dyskusyjnej o developmencie dla Androida była informacja o tym, że ktoś komuś ukradł aplikację. Zachował kod, wymienił grafikę i podmienił kod do AdMob i autor oryginału nieźle się musi męczyć by móc uzyskać pomoc w tej sprawie. A najlepsze, że ta osoba, która miała tą aplikację ukraść ma kilkadziesiąt aplikacji w markecie i wiele wskazuje, że po prostu ma tony takich aplikacji, które mają wyrabiać "punkty" w AdMobie.
Słynny przypadek kradzieży danych odbywał się przy pomocy podobnego manewru, autor miał kilka czy kilkadziesiąt podobnych aplikacji z różnymi tapetami i wszystkie z nich kradły dane.
Za dużo w Android Markecie spamu, przez co trudno znaleźć fajne aplikacje.
Mogliby dodać jakąś formę weryfikacji, chociaż wybierać losowo co 100 aplikację do przejrzenia przez kogoś z Google i jeżeli coś im się nie spodoba to usuwać z Android Market po wcześniejszym poinformowaniu autora, bo mogłoby pewnie często wystarczyć jego oświadczenie tłumaczące czemu np. aplikacja wysyła gdzieś dane.
Albo jeszcze przymusowe przejrzenie przez kogoś z Google każdej aplikacji z więcej niż 1000 czy 10000 pobrań i wysłanie do developera recenzji z informacjami co winno zostać w niej poprawione by była lepsza :-)



Podobne postybeta
Windows mnie jednak nie lubi ;-)
Złe Markety ;-)
Disconnect, Facebook, PayPal i wykop, czyli 1 plus i 3 minusy ;-)
Linux umiera?
Jak ukraść kraj?

piątek, października 22, 2010

Nowa ba(k)teryjka dla G1 :-)

Moje G1 dostało nową ba(k)teryjkę, bo poprzednia zachorowała :-( choroba objawiała się tym, że w momencie gdy się rozgrzała po kilkuminutowym poborze prądu to telefon się wyłączał.
Nowa nie wydaje się mieć takiego problemu :-)
Jeśli o nowych rzeczach mowa to Świat Nauki za Scientific American zmienił szatę. Dlatego jeśli ktoś zaczynał lekturę od felietonów to felietony Shermera i Mirsky'ego trafiły bardziej pod koniec. Zniknęły też felietony dwóch panów, których nazwisk nie pamiętam choć ich lubiłem, jeden z nich to ten kto opracował założenia do planu Balcerowicza (tego mniej czytałem), a drugi to był fizyk, który pisywał dla SciAm od tamtego roku, tego drugiego mi będzie brakować.

Bateryjka nadal działa :-)



Podobne postybeta
No i chyba wyleczyłem EEE Pad Transformera z mega czkawki
Śnieg - brrr
Nieznane ścieżki Garbage Collectora :-)
Pan Euroentuzjasta ;-)
Ustępstwa

środa, października 20, 2010

Strzeż się podstępnych setterów

Właśnie przed chwilą spotkałem się z takim.
Niby coś ustawiał, ale najpierw liczył na podstawie innych danych obiektu...... sęk w tym, że był wołany PRZED ustawieniem jednej z danych używanych do obliczeń i ustawiał 0, choć powinien inną wartość :-)

Podstępna bestia!


Podobne postybeta
Nie ufajcie mergerowi z Mercuriala...
110000 km.....
Refactoring bez testów to proszenie się o problemy ;-)
Comfort zone to zło!
Strzeż się uses-feature

poniedziałek, października 18, 2010

Jak się profesjonalnie kłamie

Robi się rysunek jak ten:


[oryginał na demotywatorach.pl]

W którym pisze się, że przy pensji wynoszącej 3000 złotych brutto na emeryturę odprowadza się 975,60 złotych, po czym przeprowadza się wyliczenia udowadniające jak to ZUS nas rżnie.

Umieszcza się to na jakimś portalu gdzie ludzie przyjmują opinie jako fakty, bez analizy. Demotywatory są dobre, może być wykop, może być Pardon, albo Niezależni. Ogólnie coś od poppaki.

I już jest dyskusja jak to ZUS nas rżnie, jak to kradną urzędnicy i wszyscy.

Jest tylko jedno ale, abstrahując od tego czy ktoś kradnie czy nie, całe te wyliczenia są o kant dupy potłuc :-)

Bo z 3000 złotych brutto, łączna składka emerytalna do ZUS od pracownika i pracodawcy to 585.60 złotego, a nie 975.60.
Przez co przy użytych do obliczeń danych emerytura wynosiłaby nie 6170 zł miesięcznie, a 3904 złote.
Do tego założenia do obliczeń są błędne, bo po pierwsze mało który mężczyzna pracuje do 65 roku życia, dodatkowo średnia życia to nie 71, a 71.65 lat [na teraz, a będzie rosła] co powoduje już spadek tak liczonej emerytury do 3603 złotych, po drugie teraz do wora z napisem ZUS wrzucają się mężczyźni i kobiety, mężczyźni dłużej wrzucają, krócej wyjmują, kobiety krócej wrzucają, dłużej wyjmują, często też po śmierci męża wyjmują tyle ile "należało się" mężowi [dla kobiety, która pracowała nietypowo bo do 60 roku życia i będzie średnio żyła jeszcze 18.85 roku tak wyliczona emerytura wyniesie 1087.32 złotego].
Od tych kwot trzeba odjąć jeszcze koszty ubezpieczenia zdrowotnego i podatek co w przypadku emerytury wynoszącej 3603 złote brutto będzie wynosiło 279.81 złotego na NFZ i 252 złote na podatek, w przypadku kobiety z 1087,32 złotymi na NFZ pójdzie 84.44, a na podatek 30 złotych. Dla mężczyzny zostanie więc 3071.19 złotego, dla kobiety 972.88 złote.
To się normalnie wszystko jeszcze uśrednia, tak że kobiety dostają z wora dużo więcej niż tam włożyły, a mężczyźni mniej.
I w wyniku dostaniemy liczby odpowiadające plus minus temu co jest w rzeczywistości.

Ale i tak teraz się ludzie będą powoływali na wyliczenia jak to nas ZUS rżnie, że lepiej byłoby te pieniądze przeznaczać na piwo i żyć z butelek i podobne.
A wszystko to sprytne kłamstwa.


Podobne postybeta
zVATowani 2
A ja jestem przeciwny prywatyzacji służby zdrowia.
Płatnik czy beneficjent?
Interakcje
O prywatnej i publicznej służbie zdrowia.

Wysyłamy pliki do Google Docs przy pomocy Go :-)

W ramach szukania pomysłów na wpis do bloga, a i nauki Go chciałem napisać sobie uploadowarkę plików do Google Docs przy pomocy Go........
I częściowo mi się to udało ;-)

Częściowo, bo działa tylko pod Linuskem, pod portem dla Windows nie działa.

Błąd na Windows pojawia się w trakcie próby zalogowania się do Google Docs, a dokładniej do Writely bo tak nazywa się serwis związany z Google Docs [bez arkuszy] dostaję błąd "could not find root certificate for chain", a przez to reszta zabawy nie ma sensu :-(

Na Linuksie jednak wszystko działa :-) i cały program wygląda tak:

package main

import ("fmt";"http";"os";"strings";"io";"net";"bufio")

type nopCloser struct {
io.Reader
}

func (nopCloser) Close() os.Error { return nil }

type readClose struct {
io.Reader
io.Closer
}


func main() {
var user string
var password string
if len(os.Args)==3 {
user = os.Args[1]
password = os.Args[2]
} else {
fmt.Println("Sorry, you need to provide your Google Account credentials")
return
}
fmt.Println(password)
fmt.Println(user)

// OK, tutaj zaczyna się logowanie do serwisów Google, tym razem do "writely" czyli składowiska dla dokumentów, prezentacji i obrazków Google Docs

bodyType:="application/x-www-form-urlencoded"
appName:="RMKGOTest"
appVersion:="0.01"
service:="writely"
var loginRequestBody = "accountType=HOSTED_OR_GOOGLE&Email="+user+"&Passwd="+password+"&service="+service+"&source="+appName+"-"+appVersion;
r,err:=http.Post("https://www.google.com/accounts/ClientLogin",bodyType,strings.NewReader(loginRequestBody))
fmt.Println(err)
reader := r.Body
var buf []byte = make([]byte,r.ContentLength)
reader.Read(buf)
fmt.Println(string(buf))
elems:=strings.Split(string(buf),"\n",-1)
fmt.Println(len(elems))

// OK, już jesteśmy zalogowani, teraz musimy pobrać nagłówki autoryzacji

var authHeader string
for i:=range elems {
if strings.Index(elems[i],"Auth=")==0 {
authHeader=strings.Replace(elems[i],"Auth=","GoogleLogin auth=",1)
}
}

// Teraz przygotowujemy się do wysłania naszego "pliku" do Google Docs :-)

// treść pliku
documentBody:="This is only a test\nSend from Go to Google Docs :-)"
// MIME type
bodyType="text/plain"

// Tworzymy requesta

req:=new(http.Request)
req.Method="POST"
req.RawURL="https://docs.google.com/feeds/default/private/full"
req.ProtoMajor = 1
req.ProtoMinor = 1
req.Host="docs.google.com"
req.Close = true
req.Body=nopCloser{strings.NewReader(documentBody)}
req.Header = make(map[string]string)
req.Header["Content-Type"]=bodyType
req.Header["Authorization"]=authHeader
req.Header["Slug"]="toster.txt"
req.Header["GData-Version"]="3.0"
req.ContentLength=int64(len(documentBody))
c,errNet:=net.Dial("tcp","","docs.google.com:80")

fmt.Println(errNet)
fmt.Println(c)

err2:=req.Write(c)
fmt.Println(err2)
reader2 := bufio.NewReader(c)
resp, err3 := http.ReadResponse(reader2, req.Method)
if err3 != nil {
c.Close()
fmt.Println(err3)
return
}

resp.Body = readClose{resp.Body, c}

fmt.Println(resp.Body)
fmt.Println(resp.ContentLength)
cLen:=resp.ContentLength
if cLen==-1 {
cLen = 8192
}
var buf2 []byte = make([]byte,cLen)
reader2.Read(buf2)
fmt.Println(string(buf2))

c.Close()

}


W celu jego uruchomienia kompilujemy go standardem:
8g httpTest2.go
8l httpTest2.8

i uruchamiamy:
./8.out eMail HasłoDoKontaGoogle

Gdzie eMail to adres którego używamy w Google Docs, a HasłoDoKontaGoogle to hasło do konta związanego z tym mailem.
Ta wersja programu wysyła plik do Google Docs przy pomocy HTTP, jeśli chcemy użyć HTTPS, to trzeba w sekcji import zmienić "net" w "crypto/tls", a w linii z net.Dial trzeba zmienić to net.Dial na tls.Dial, do tego trzeba zmienić docs.google.code:80 na docs.google.code:443.
Po skompilowaniu działa :-)

Efektem działania programu jest pojawienie się nowego pliku toster.txt w Google Docs :-)

Wszystko działa także z kontami w Google Apps.

Teraz parę słów krytyki ;-)
Po pierwsze zwracanie wielu wartości z funkcji jest super, ale tylko do czasu. Bo zawsze trzeba pobrać wszystkie wartości, a że Go chce być pomocne i uznaje za błąd istnienie niewykorzystanej zmiennej to trzeba też używać tych zwracanych wartości. Ja oszukałem bo błędy w większości przypadków tylko wypisuję, w rzeczywistości za każdym razem powinienem stosować taki "idiom":
coś, err = cośIo
if err!=nil {
// obsłuż błąd
return
}

Który jest jak najbardziej OK, ale to, że język do tego zmusza to przeszkadzajka. W ogólnym rozrachunku nie jest to może takie złe, bo w kodzie produkcyjnym trzeba się upewniać czy wszystko poszło OK, ale to męczy. Zresztą często w takich sytuacjach stosuje się sterowanie przepływem przy pomocy wyjątków, co nie jest ładne, ale jest szybsze w pisaniu, czyli robi się serie rzeczy, które mogą spowodować wyjątek, i jeśli wyjątek nie poleci to sterowanie przechodzi do następnej linii, aż wystąpi wyjątek, albo wszystko się uda zrobić.

Po drugie, pomieszanie światów. Raz używając http można stworzyć cały request POST i go wysłać, drugim razem trzeba zniżyć się do net albo crypto/tls czyli do poziomu socketów bo zechcieliśmy wykonać jedną nietypową rzecz, czyli ustawić nagłówki requesta.
W tym miejscu może nawet więcej sensu miałoby użycie tylko net albo crytpo/tls bez bawienia się w requesty.

Po trzecie, to wkurzające wymaganie jawnej konwersji typów. Java robi to milej. Przez tą konwersję trzeba ciągle kombinować. Przez co mam taką linię:
req.ContentLength=int64(len(documentBody))
Bo oczywiście do ContentLength trzeba włożyć int64, a len zwraca "tylko" int.
Strasznie to upierdliwe.

Po czwarte, nadużywanie struktur. Jak widać w źródle, musiałem ukraść ze źródeł Go 2 struktury, nopCloser i readClose, bo komuś się ubzdurało, żeby strumień i jego zamykanie były oddzielnymi bytami, ale akurat do wielu bibliotek trzeba dostarczać strumienie, które są jednocześnie czytalne czy zapisywalne i zamykalne......

Po piątek, zmiany w kompilatorze. To jest na razie język eksperymentalny, choć Google podobno pisze w nim niektóre swoje wewnętrzne narzędzia.
Np. to, że teraz nie używa się średnika bo kompilator sam sobie go potrafi włożyć, nie działa z kompilatorem sprzed pół roku czy jakoś tak. Biblioteki też się zmieniają.

Po szóste, port dla Windows. Nie ma oficjalnego, jest taki mniej oficjalny, który ma np. problemy z HTTPSem.

Dla ciekawskich, ten program wyżej to dziecko jakichś 4 godzin, czyli dość długo powstawał.


Podobne postybeta
Zmienne Go ;-)
Chrome OS, Chrome2Chrome i w ogóle Chrome ;-)
Toperz ;-) czyli OCR + Android odsłona 2 albo któraś tam
Go dla Java'owca ;-) odcinek 1 "klasy"
Wredne Google Docs

niedziela, października 17, 2010

Gabinet Ipsalorda

Jak człowiek jest mały, ma te 3 czy 5 lat to patrzy na świat i stara się go zrozumieć.

Mając te 3-7 lat lubiłem gdy mama opowiadała mi jak to było jak była dzieckiem (zwykle widziałem jej opowieści jak czarno-biały film:-)) albo o czasach gdy mnie jeszcze nie było, czyli np. o czasach gdy moi rodzice zamieszkali w Chorzowie na ulicy Dzierżyńskiego. Ich mieszkanie to były 2 pokoje i kuchnia wydzielone z większego mieszkania, które zostało podzielone na 2 mniejsze mieszkania.
Sąsiedzi nie byli najmilsi ;-) i moja mama opowiadając o nich mówiła nieraz "... mieli gabinet ipsalorda".... To ipsalorda wydawało mi się jakimś określeniem "technicznym", które coś znaczyło... dopiero wiele lat później gdy usłyszałem to stwierdzenie jeszcze raz dotarło do mnie, że moja mama mówiła "... mieli gabinet i psa lorda" :-)

Inny przykład to Zakopane. Mając te 5 lat zachodziłem w głowę czemu się w końcu nie wezmą do roboty i go nie odkopią! Na moje usprawiedliwienie, jakoś w tym czasie usłyszałem w radio lub TV o jakiejś lawinie czy czymś podobnym i przez to zakopanie wydawało mi się sensowne ;-)

Gdy miałem 3 lata to byłem na wczasach w Szklarskiej Porębie. Pamiętam stamtąd niewiele, głównie to, że siedziałem na psie i nadepnąłem na nogę psa, pamiętam jakiegoś żuka czy ślimaka, pamiętam jazdę autobusem (niebieskim ogórkiem gdzie pozwolono mi siedzieć przez chwilę, a może i dłużej na tym takim wybrzuszeniu z przodu (tam był chyba wał jakiś albo skrzynia?)) i pamiętam wyprawę na Zakręt Śmierci.
Leźliśmy tam i leźliśmy, a ja ciągle wypatrywałem jakichś trupich czaszek czy podobnego znacznika, który jak mi się wydawało POWINIEN być na zakręcie śmierci ;-)

Z rzeczy, których nie pamiętam a znam tylko z opowieści to morze, które mi się zepsuło ;-) Gdy jadąc pociągiem do Władysławowa zobaczyłem zatokę, na której nie widziałem fal i ogłosić miałem "o cocute morze" co wzbudziło podobno entuzjazm wśród współpodróżnych ;-)

Był też dowcip, którego nie mogłem zrozumieć mając lat 7 czy 8. Szedł tak:
Do baru wchodzi kościotrup, podchodzi do baru i mówi, 2 setki i szmatę do podłogi.......
Fakt, że Masztalski zapowiadał ten dowcip, jako pierwszy dowcip dla intelektualistów ;-) ale nie mogłem go zrozumieć. Wydawało mi się, że ten kościotrup może chce posprzątać bo nie ma pieniędzy? ;-)
Dopiero później zrozumiałem o co chodziło w tym dowcipie ;-)

Znów będąc młodszym, gdy miałem 3, może 4 lata, idąc na wycieczkę z przedszkolem zacząłem sobie zadawać pytanie. Szło mniej więcej tak, tłumacząc to na dzisiejsze słowa ;-)
OK, mama i tata mają z milion lat, przed nimi była wojna, i to pewnie babcia wtedy była, co było zapewne wiele milionów lat temu........... ale OK, co było wcześniej? Skąd się te wszystkie budynki i podobne wzięły? No kto to zbudował? Przecież raczej nie pokolenie babć i dziadków tylko....

Pamiętam też jak pierwszy raz świadomie jechałem w samochodzie. Mogłem mieć wtedy nawet z 4 albo i 5 lat. Mój tata akurat przyjechał ze Szczytna [tak, dziecko resortu jestem ;-)] i spotykał się z kolegami z komisariatu. Jechaliśmy wtedy z jednym z jego kolegów jego maluchem i zauważyłem, że jak dojechaliśmy do czerwonego światła to na desce rozdzielczej świeciła się czerwona lampka, a później jak dojeżdżaliśmy do innego skrzyżowania, gdzie było zielone to migała zielona... Logiczne wydało mi się, że to jakiś system, który pokazuje jakie będą światła...... niestety na następnym skrzyżowaniu moja teoria runęła :-(

Byłem też pytany przez mojego tatę, gdy miałem te 3 lata czy mnie buzia nie boli. Spowodowane to było tym, że praktycznie cały czas pytałem "Dlaczemu?".
Jakież musiało być zdziwienie mojego taty gdy po serii "Dlaczemu?", gdy spytał "Przemek, nie boli Cię już buzia od tego pytania?" zadałem pytanie "Dlaczemu ma boleć?" ;-)

Gdy w 1 klasie SP, mając te 7 lat oglądałem stary podręcznik do Astronomii mojej mamy z LO to największym moim problemem było to, że jakaś złośliwa bestia napisała tak dużo o Plutonie....... to było może 5 linijek tekstu ;-)

W tym samym czasie uparłem się, że będę chodził na religię. Więc moja mama mnie prowadzała, choć zawsze podpadała bo czytała książki, a nie słuchała baj... wróć, tego co mówiła katechetka.
Pewnego razu podpadłem też ja gdy dostałem lekkiego ataku śmiechu gdy popatrzałem na figurkę Matki Boskiej i przypomniał mi się dowcip, chyba też od Masztalskiego ;-) szedł tak:
Na lekcji religii Pani pyta "Dzieci a jak wygląda Matka Boska", na to dzieci odpowiadają "Chodzi w długiej powłóczystej błękitnej szacie" i podobne, na co Jaś podnosi rękę i mówi "Nie prawda", na co katechetka zachęca i prosi by opisał, na co Jaś opisuje "To taka pani o blond włosach w krótkiej spódniczce i obcisłej bluzeczce", katechetka zbladła i resztkami sił pyta "Ale skąd Ci to przyszło do głowy??", na co Jaś odpowiada "Widziałem, jak wczoraj wychodziła od księdza proboszcza a on do niej mówił ''tylko niech Cię Matko Boska nikt nie zobaczy'' ;-)

"Kajko i Kokosz" też stanowili dla mnie wyzwanie.
Pierwszy zeszyt dostałem jeszcze w przedszkolu, w starszakach [gdy byłem tam drugi rok, po tym jak moja mama uznała, że nie chce bym szedł rok wcześniej do szkoły], czytać umiałem, ale czytanie było trudne więc ograniczałem się do "Nagle!" albo "Łups!" czy podobnych.
I nie mogłem z tego mojego niby czytania i oglądania obrazków zrozumieć jednej rzeczy. Ewidentnie Kajko i Kokosz byli głównymi bohaterami, ale przecież wchodzili w konflikt z panami w mundurach (Zbójcerzami), a wydawało mi się, że w mundurach mogą być tylko dobrzy ludzie :-) Co wywoływało u mnie głębokie zdziwienie ;-)

W przedszkolu padłem też ofiarą donosu ;-) Gdy Panie wychowawczynie w ramach pilnowania nas pod koniec dnia by nas zająć kazały nam zbierać paprochy z dywanu...... Skomentowałem to do innych dzieci mówiąc coś w stylu "same najpierw rozrzuciły, a teraz my musimy zbierać"...... i ktoś na mnie doniósł ;-)
Racja była po mojej stronie, bo widziałem tego dnia jak któraś z Pań zrzuciła na ziemie jakiś urwany kawałek papieru, albo właśnie paprocha z ubrania ;-)

Chociaż to mogłem zrozumieć, więc to zły przykład był. Nie mogłem zrozumieć czegoś później, gdy w tym samym przedszkolu była taka sytuacja, że w mojej szafce pojawiła się makieta kopalni, którą wykonać miałem po wycieczce do kopalni.......... z tym, że ja na wycieczce nie byłem bo albo byłem chory, albo na wczasach ;-)
Miałem poważne problemy ze zrozumieniem "o co biega" ;-)


A to wszystko wyżej [i wiele innych rzeczy pewnie też ;-)] przez to, że jak się jest dzieckiem to jednak świat wygląda ciut inaczej ;-)

A ipsalorda i tak nic nie pobije ;-)


Podobne postybeta
Nazwy
Religia w szkole
A różne takie...
Kartka i ołówek
Teoria biurokracji ;-)

czwartek, października 14, 2010

Google Apps Scripts - to może być fajne :-)

Może wszyscy już wiedzą, ale wychodzi na to, że ze skryptów z Google Docs operować można na innych serwisach Google.
Dziś udało mi się stworzyć takim skryptem event w Google Calendar, a z tego co widać na liście dostępnych serwisów helpie to jest tego trochę.
Widziałem zapowiedzi tych Google Apps Scripts ale nie wiedziałem, że tego będzie aż tyle :-)

Wg. pomocy teraz można oskryptowić takie serwisy:
  • Base Services
  • Calendar Services
  • Contacts Services
  • DocsList Services*
  • Finance Services
  • Jdbc Services*
  • Language Services
  • Mail Services
  • Maps Services*
  • Properties Services*
  • Sites Services
  • Soap Services
  • Spreadsheet Services
  • Ui Services*
  • UrlFetch Services
  • Utilities Services
  • Xml Services

Teraz jeszcze tylko automatyzacja uruchamiania i można szaleć :-)
Te serwisy z gwiazdką to serwisy eksperymentalne.


Przykładowy skrypt dodany do arkusza w Google Docs, który stworzy w kalendarzu eventa wygląda tak:
function testCalendar() {
var cc = CalendarApp.getAllCalendars()[0].createEvent("Test", new Date("2010/10/14 15:10:00"), new Date("2010/10/14 16:00:00"));
}


Co prawda godziny są przyjmowane wg. czasu Montain View, ale to można przeskoczyć pewnie przez dodanie nazwy strefy czasowej ;-) [chyba nie można, w każdym bądź razie tak jak myślałem, bo jak dodałem CET to mi nie stworzyło eventa]

Ale wygląda na to, że będzie się czemu przyglądać :-)


Podobne postybeta
Wpisy z Bloggera jako eventy w Google Calendar 4 - nowa wersja aplikacji ;-)
Google Play Services dobre jest :-)
Regresja liniowa w Google Docs
ToDo od Trello jako "oddzielna aplikacja"
Jak nie zapomnieć kupić biletu miesięcznego ;-)

Regresja liniowa w Google Docs

Na bardzo szybko ;-)

Ostatnio potrzebne mi było policzenie regresji liniowej..
OK, dokładniej chodziło mi o to by przybliżyć pewien zestaw punktów [moją pensję w czasie ;-)] linią.
Z tego co pamiętam w Excelu była taka możliwość, ale Excela nie mam, w OpenOffice.org Calc nie znalazłem [choć nie szukałem jakoś szczególnie], w końcu policzyłem na kalkulatorze :-) [inne rodzaje regresji zresztą też ;-)]
Ale po wszystkim stwierdziłem, że zobaczę sobie czy da się to zrobić w Google Docs :-)

Wprost się chyba nie da, w każdym bądź razie nie znalazłem niczego, ale za to napisałem sobie skrypt :-)

Coby go dodać do naszego arkusza to wybieramy Tools -> Scripts -> Script editor i wklejamy do niego poniższy skrypt.

function linearRegression() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var myValue = Browser.inputBox("Enter a range");
var sumXY = 0.0;
var sumX = 0.0;
var sumY = 0.0;
var sumX2 = 0.0;
var myRange = sheet.getRange(myValue);
var n = myRange.getHeight();
for (var i=0; i<n; i++) {
var xi = myRange.getCell(i+1, 1).getValue();
var yi = myRange.getCell(i+1, 2).getValue();
sumXY+=xi*yi;
sumX+=xi;
sumY+=yi;
sumX2+=xi*xi;
}
var a = (n*sumXY-sumX*sumY)/(n*sumX2-sumX*sumX);
var b = 1/n*(sumY-a*sumX);
Browser.msgBox("a="+a+"\nb="+b);
}


Działanie polega na tym, że po nagraniu i uruchomieniu skryptu [w okienku edytora, jak to się robi bez edytora jeszcze nie wiem, używam tego od 20 minut :-)] podajemy zakres w którym są nasze dane (w postaci w stylu A1:B100). Muszą to być 2 kolumny danych, w pierwszej kolumnie będzie X, w drugiej Y.
Po chwili zobaczymy wyniki, czyli wartość współczynników a i b równania:
y=a*x+b


I to by było na tyle...
Aha, nie dam głowy że to dobrze działa ;-) ale powinno.


Podobne postybeta
EEEBateria ;-)
Logistic Regression wykrywa clickbaity lepiej od Bayesa ;-)
Całkujący Dart ;-)
Algorytmy Genetyczne szukają Symbolu Newtona ;-)
Po Google I/O - TensorFlow, App Maker, Kotlin i Firebase ;-)

środa, października 13, 2010

Amazon fajny jest

Kilka dni temu pojawiła się informacja, że zakupy w Amazon.co.uk powyżej 25 funtów będą wysyłane do Polski za darmo.....
Ciekaw jest to, że od tego momentu złożyłem 2 zamówienia, każde za mniej niż 25 funtów i dostawę mam za darmo :-)
Czyli albo jestem super, hiper klient, albo WSZYSTKIE dostawy z Amazon.co.uk do Polski są za darmo :-)



Podobne postybeta
Ku pamięci ;-)
Dużo książeczek :-)
Wyrocznia od siedmu boleści
Za co lubię Amazona
Jest coraz gorzej i będzie jeszcze gorzej 

Konstruktory

[Tu uwaga, już to raz dziś pisałem, ale wysiadła mi bateria w G1 i muszę pisać od nowa, co oznacza też, że do Bloggeroida dodam nagrywanie co jakiś czas edytowanego posta do Bloggera albo na SD w ramach autosave :-), nowa bateria już zamówiona na Amazon.co.uk :-)]

Dziś trafił do mnie ktoś szukający czegoś o dziedziczeniu konstruktorów.
Konstruktorów się nie dziedziczy! Koniec i kropka!
Odpowiedź na pytanie o dziedziczenie konstruktorów brzmi - NIE!

Dlaczego?

To proste, nie dziedziczmy konstruktorów bo to bez sensu ;-)

Po pierwsze. Co miałby zrobić taki "zadziedziczony" konstruktor z polami nowego obiektu? Oczywiście może jest zostawić tak jak są, ale to znaczy, że obiekt będzie potencjalnie nie w pełni zainicjowany.
Oczywiście jako programista można uznać, że to jest OK, ale w takim przypadku wystarczy dodać własny konstruktor, który wywoła po prostu odpowiedni konstruktor z nadklasy.
Po drugie. Dziedziczenie konstruktorów ograniczałoby możliwość tworzenia nowych klas potomnych. Trzeba by było nieść ze sobą cały bagaż wcześniejszych konstruktorów. Robi się tak w przypadku metod. Z tym, że metody używając polimorfizmu operują na pewnym fragmencie obiektu wypełniając kontrakt interfejsu. Jeśli przez jakieś pokrzywione ścieżki rozumowania dotrzemy do etapu, że klasa Kwadrat będzie rozszerzać Prostokąt to metoda liczObwód ma sens w obu przypadkach, ale z konstruktorami tak łatwo nie jest, jeśli mieliśmy Prostokąt(float, float) to teraz mielibyśmy też Kwadrat(float, float), czyli potencjalnie moglibyśmy mieć kwadrat o różnych bokach ;-)
Po trzecie. Nie dałoby się np. zrobić singletona, bo do tego trzeba schować wszystkie konstruktory, a gdyby były dziedziczone to by się tego nie dało zrobić, gdyż z dziedziczeniem dopuszczalne jest tylko zwiększanie widoczności, nie zmniejszanie widoczności.
Inna sprawa, że konstruktorowi trudno byłoby być polimorficznym, jakby to miało działać? Jak miałoby wyglądać wywołanie?

Teraz jeszcze o zamęcie w Java'ie, który może powodować, że wydaje się, że konstruktory są dziedziczone.
Po pierwsze, gdy Twoja klasa nie ma jawnie zadeklarowanego konstruktora to kompilator Java'y doda jej bezparametrowy konstruktor domyślny, który będzie składał się z 1 linii, w której będzie wołany konstruktor bezparametrowy z nadklasy (przez super()). Dlatego jeśli nadklasa nie ma konstruktora bezparametrowego to sorry Winetou, dostaniesz błąd czasu kompilacji.
Po drugie, konstruktor klasy potomnej musi wołać konstruktor nadklasy. Może to robić jawnie przez wołanie super z odpowiednimi parametrami, albo jeśli to się nie dzieje to Java doda sama wołanie super() do konstruktora. Co znów nie zadziała jeśli Twoja nadklasa nie ma konstruktora domyślnego, wtedy trzeba będzie jawnie zawołać super z odpowiednimi parametrami.

Na koniec jeszcze raz to napiszę bo to ważne, a wiele osób o tym nie pamięta - KONSTRUKTORÓW SIĘ NIE DZIEDZICZY!


Podobne postybeta
Refleksje i serializacja w Java'ie - podstawy i obalanie mitów ;-)
Drugi klasyfikator jako "sanity check"
Giń konstruktorze! Giń! ;-)
Go dla Java'owca ;-) odcinek 1 "klasy"
Android nie taki zły ;-)

poniedziałek, października 11, 2010

Ciekawe czy ktoś zajmuje się "testowaniem" czy może "próbkowaniem" rynku nieruchomości? :-)

Ciekaw jestem czy firmy zajmujące się handlem nieruchomościami przeprowadzają próbkowanie czy może testowanie rynku? :-)

Np. czy zdarza im się wystawiać lewe oferty sprzedaży w stylu 3 pokoje, 60 m2 w takiej i takiej okolicy za X ze zdjęciami jakichś innych mieszkań tylko po to by sprawdzić jakie jest zainteresowanie ofertą?

Chcąc np. sprzedać mieszkanie w jakiejś okolicy mogliby najpierw zaoferować kilka podobnych z różnymi cenami jako osoby prywatne tylko po to by sprawdzić jaki jest odzew na te oferty. Dodatkowo mogliby się nawet posilić danymi dotyczącymi tego jak dobrze "sprzedawały" się słowa kluczowe w ofercie, forma oferty i rodzaj zdjęć.
Szczególnie gdyby sami szukali mieszkań w danej okolicy.

A ileż tu miejsca do manipulowania cenami? Zrobić wysyp ofert w koło ceny która by nas interesował, które są super, ale mają jakieś mankamenty i sprawdzać zainteresowanie nimi, a jak ktoś będzie chciał obejrzeć mieszkanie to przeprosić, że się wyjechało, albo że oferta już nieaktualna....
Albo zaoferować swoje mieszkanie czy mieszkania w dość wysokiej cenie i wrzucić dużo ofert na podobne lub mniejsze mieszkania z dużą różnicą w cenie, a w głównym ogłoszeniu zaznaczyć, że sprzedający się śpieszy i dlatego mu zależy ;-)

Chociaż, skoro ja sobie zadaje pytanie czy ktoś to robi, to już pewnie co najmniej kilka firm się tym zajmuje ;-)

No i przy samym handlu to pikuś, ale przy byciu developerem to mogłoby mieć jeszcze większy sens. Sprawdzić jak rynek reaguje na jakaś cenę dla realizowanej i podobnych do niej inwestycji.

W końcu skoro to działa na rynku kapitałowym to czemu nie na mieszkaniowym? ;-)

A ja dziś obejrzałem pierwsze mieszkanie i raczej nie, cena przeszacowana o co najmniej 15-20%, a choć lokalizacja wydaje się niezła to też nie jest to.


Podobne postybeta
Światełko w tunelu :-)
Czekanie na mieszkanie ;-)
Spóźnialskie Google Latitude ;-)
2 kolejne rzeczy ;-)
Samolubna Tajemnicza Wyspa Genów ;-)

niedziela, października 10, 2010

A jednak jest nadzieja :-)

Wiecie co? Świat to chyba jednak zmierza w dobrym kierunku :-)

Powstają pierwsze udane próby przywracania ludziom po wypadkach zdolności chodzenia.
Google testuje swoje automatyczne samochody.
Chyba w końcu znaleźli winowajcę epidemii zabijającej pszczoły w USA.
I pojawiają się jakieś promyczki nadziei na to, że może jednak problem globalnego ocieplenia nie będzie taki straszny [mam nadzieję, choć puki nie wiemy tego na 100% lepiej zakładać, że jest realne], bo ostatnie badania wskazują, że może być tak, że mimo spadku ilości energii słonecznej docierającej do Ziemi, to Słońce może mieć przemożny wpływ na ocieplenie z powodu tego, że choć energii jest mniej, to więcej jej jest w postaci promieniowania widzialnego, które jest lepiej pochłaniane przez atmosferę i powierzchnię Ziemi przez co może dochodzić do ich ogrzania. [Chociaż z drugiej strony, jeżeli to gazy cieplarniane są w głównej mierze winne, możemy trzymać temperaturę w ryzach zmniejszając ich emisję, jeżeli to wina Słońca to hmm.. co nam zostaje? budowanie w kosmosie wielkich tarcz, które będą przesłaniały Słońce? Dość radykalne rozwiązanie ;-)]

I to wszystko dzięki rozwojowi nauki i techniki :-)

Jest nadzieja!

I może optymizm z książek Arthura C. Clarke'a znajdzie uzasadnienie i okaże się, że to wynik tej pozytywistycznej pracy u podstaw, że jednak społeczeństwa lepiej wyedukowane są lepsza [tak wierzę w to, ale jedno wiara czy przekonanie, drugie dowody wprost]? :-)

Z innych dobrych rzeczy, dziś przyszedł pierwszy mail od użytkownika Bloggeroida z opisem błędu :-) To cieszy, bo znaczy, że ktoś tego używa ;-)


Podobne postybeta
Komputery w ubraniu....
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
Historia jednego #....
Wyznania programoholika ;-)
Wyznanie, wyjaśnienie i coś z zupełnie innej beczki ;-)

Dobre IDE bywa złe ;-)

Dobre IDE bywa złe ;-)

Bo rozleniwia.
W czasach Pascala gdy nie wiedziałem jak podzielą się głosy w wyborach to napisałem sobie program który to symulował [zgodnie z metodą d'Hondta i listą krajową], wychodziło mu to tak sobie, ale działało [najlepiej dla listy krajowej, co zrozumiałe, bo znając łączną liczbę głosów na poszczególne ugrupowania mogłem stosować algorytm podziału bez żadnych modyfikacji].
Teraz nie chce mi się czasem odpalać po to Eclipse'a, a znów dla żadnego innego języka, w stylu Pythona nie znalazłem IDE tak dobrego jak Eclipse :-)

Chociaż może to nie wina IDE, a tego że jednak z wiekiem człowiekowi się ciut mniej chce? ;-)

A najwięcej takich cosiów do sprawdzania różnych rzeczy piszę teraz w JavaScript'cie, i to tym wykonywanym w przeglądarce ;-)


Podobne postybeta
DVDowe pytanie ;-)
1 na 9 głosów
Idziesz grać w ingres, kończysz jako obsługiwant parasola chroniącego kamerę TV ;-)
"Analiza" zysków i strat dla 500+... nie wygląda to różowo
Statystyki Android Marketu mijają się ciut z prawdą ;-)

środa, października 06, 2010

LibreOffice - takie sobie

Zainstalowałem dziś LibreOffice, czyli fork OpenOffice.org i hmmm... nie jestem zadowolony ;-)
Instalacja OOo2GD 3 razy powodowała zwiechę całego LibreOffice, dopiero użycie Extension Managera i jego guziczka Add spowodowało, że OOo2GD się zainstalowało. Ale i to nie wygląda dobrze bo ikonki zrobiły się gigantyczne i wyglądają ohydnie.



W ogóle czuję się oburzony tym, że nie uznali OOo2GD za na tyle przydatne by stało się jednym z rozszerzeń instalowanych domyślnie ;-)
Może to, że np. nie udaje się otwierać większych plików pobranych z Google Docs ma tu jakieś znaczenie? ;-) [Co ciekawe w Star Office działa, w OO.org nie jestem w stanie sprawdzić bo genialny LibreOffice.org mi odinstalował OO.org, a w każdym bądź razie tak to wygląda].

Z plusów, nie ma znaczków Oracle, które są brzydkie, a przynajmniej brzydsze od tych Suna. Szkoda, że Oracle postanowiło wyrugować oznaczenia Suna, ładne były.

Moje statystyki zbierane w trakcie sprawdzania czy są nowe wersje OOo2GD wykrywają jak na razie udział LibreOffice mniejszy niż 1 promil.
Pierwszy "odczyt" z LibreOffice pojawił się 28 września, to tak jakby to kogoś interesowało ;-)

EPUBGenerator działa i generuje ładnie EPUBy z LibreOffice.

Ale ja zaraz chyba odinstaluje i wrócę do paskudnie obrandowanego OpenOffice.org od Oracle'a ;-)


Podobne postybeta
OpenOffice.org - ulubiony pakiet biurowy Java'owca ;p
Generowanie plików ePub z OpenOffice.org :-)
Nowy coś do pisania - constants list/reference/cokolwiek ;-) albo spis stałych
Porzucam OpenOffice.org dla LibreOffice ;-)
OOo2GD w Ubuntu 9.10 - da się.

wtorek, października 05, 2010

Płatny Android Market.... czy mi się to w ogóle przyda?

To pewnie będzie herezja dla wielu ;-)

Wydaje mi się, że dodanie płatnego Marketu w Polsce, dla mnie (ale chyba też wielu innych użytkowników Androida) niewiele zmieni.

Przyjrzałem się dziś opisom aplikacji w płatnej części Android Marketu, poczytałem i nie znalazłem wśród topowych aplikacji niczego dla siebie.

Z jednej strony - developera - to cieszy bo jest jeszcze dużo miejsca, ale jako takie smuci. No bo po co mi płatny Market jak nic w nim nie kupię?

W sekcji Social króluje aplikacja Black Facebook... po co mi ona, skoro sam coraz częściej myśli o tym by ograniczyć tam swoją obecność do minimum?
Fake call też mi nie jest potrzebny, mogę to samo osiągnąć przy pomocy GMAILa i Google Voice w nim ;-)
Lista zakupów? Też nie widzę potrzeby.

O! Za dobry, naukowy kalkulator byłbym w stanie zapłacić (za moją Algebrę 2.0 FX zapłaciłem, i tylko szkoda, że mało poręczna :-(, ale nie żałuję ani złotóweczki :-)), ale akurat czegoś takiego nie zobaczyłem.

Ale na razie jest to takie narzekanie na przyszłość ;-)
Na razie wiem, że w ciągu około 10 dni mamy mieć płatny market i tyle... no i zawsze jest nadzieja, że nawet jak nie będzie fajnych aplikacji to wkrótce pojawi się muzyka i książki :-)



Podobne postybeta
O Android Market
OOo2GD w liczbach ;-)
Connectify - zmień swoje Windows 7 w hot spota :-)
Kiedy tablet zmieni się w dobry kalkulator?
Nudno

poniedziałek, października 04, 2010

Go dla Java'owca ;-) odcinek 1 "klasy"

Od kilku dni czytam sobie o Go, głównie rekreacyjnie, ale z tyłu głowy mam to, że może kiedyś będzie trzeba przejść na Go, albo C/C++ (co chyba bardziej prawdopodobne) po tym jak Oracle zaczyna powoli rozrabiać z Java'ą ;-) [a wolałem żeby Suna kupił Oracle niż IBM... ;-)]

Pierwszym szokiem dla Java'owca będzie to, że choć Go jest językiem obiektowym [także!] to nie ma tam klas!

Ale nie ma obaw, spokojnie możemy dodawać metody do typów danych. Jedyny wymóg by typ danych był w tym samym pakiecie co metody.

Java'owy kod w stylu:
public class Point {
private int x, int y;
public Point(int x,int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public float distanceFrom00() {
return Math.sqrt(x*x+y*y);
}
}

W Go wygląda mniej więcej tak:
type Point struct {
x int;
y int;
}
func (p *Point) GetX() int {
return p.x
}
func (p *Point) GetY() int {
return p.y
}
func (p *Point) DistanceFrom00() float {
return float(math.Sqrt(float64(p.x*p.x)+float64(p.y*p.y)))
}

Czyli definiujemy nowy typ danych, a później metody dla tego typu.
Wołanie metod jest dokładnie takie samo jak w Java'ie czyli po kropce.
Ze złych wieści, tu znów są wskaźniki :-( Na szczęście język trochę pomaga, i np. w deklaracjach metod nie trzeba wcale robić (p *Point) można zrobić (p Point).
To p to receiver, który robi za odpowiednik this.
Stąd w getterach jest użyte p.x.

Dziedziczenie jest, choć ciut inaczej zorganizowane.
Jeżeli np. stworzymy nowy typ Point3, w którym dodamy jeszcze z, to mamy wtedy:
type Point3 struct {
Point
z int
}

Trzeba doimplementować jeszcze GetZ() i nadpisać DistanceFrom00(), co wygląda tak:
func (p *Point3) GetZ() int {
return p.z
}

func (p *Point3) DistanceFrom00() float {
return float(math.Sqrt(math.Pow(float64(p.Point.DistanceFrom00()),2)+float64(p.z*p.z)))
}


Gorzej jest z tworzeniem tych obiektów :-(
p:=Point{3,2} // tworzy strukturę z x=3 i y=2
p3:=Point3{Point{3,2},1} // tworzy Point3 z x=3,y=2,z=1.......
p4:=new(Point) // tworzy nowy Point, w p4 jest wskaźnik do niego z x=0, y=0

Jak widać w tym fragmencie jest to ohydne ;-) dlatego jak rozumiem zaleca się tworzenie metod fabrykujących, które będą zwracały nasze obiekty.

Teraz ważna rzecz, w Go nie ma modyfikatorów dostępu takich jak w Java'ie, nie ma tu public, private czy protected, jest jednak sposób na ograniczanie widoczności.
Jeżeli nazwa pola, typu, czy metody jest pisana dużą literą to takie coś będzie widoczne poza swoim pakietem, wszystko pisane z małej litery widoczne jest tylko w pakiecie.
To wydaje się mieć sens, w Java'ie ewidentnie programiści przynieśli zwyczaje z C++ i to co było pomyślane jako mechanizm namawiający do używania modyfikatorów dostępu tak by to pakiety były głównymi strukturami decydującymi o prywatności stało się mechanizmem do prywatyzowania na poziomie klas.

Jak było widać wyżej przez to jak się "dziedziczy", można dość łatwo wprowadzić wielodziedziczenie, z tym, że jak 2 "dziedziczone" typy mają pola czy metody o tej samej nazwie to się robią problemy i puki ich nie używamy to jest dobrze, ale jak użyjemy to jest błąd [nie przyglądałem się temu jeszcze więc wieżę na słowo temu co czytałem ;-)].

W Go jest za to coś takiego jak interfejsy :-) Ale działają one kompletnie inaczej niż w Java'ie, w każdym bądź razie w sferze deklarowania tego czy się je implementuje.....
Jeśli coś ma odpowiednie metody to implementuje dany interfejs i nie trzeba niczego deklarować!
Popatrzmy na kod:
type Printable interface {
String() string
}
type TosterInt struct { value int }
type TosterFloat struct { value float }
func (i TosterInt) String() string {
return fmt.Sprintf("%d",i.value)
}
func (f TosterFloat) String() string {
return fmt.Sprintf("%f",f.value)
}

I teraz wszędzie w kodzie możemy używać cosiów stworzonych z TosterInt i TosterFloat tak jakby były typu Printable :-) Czyli trzymać je np. w mapie gdzie wartości są Printable.
  m:=make(map[string]Printable)
m["TosterInt"]=TosterInt{3}
m["TosterFloat"]=TosterFloat{3.9}
for k,v:=range m {
fmt.Println(k," ",v)
}


Aha, tak biegiem, podstawowy program w Go wygląda tak
package main

import "fmt" // tutaj importujemy co nam potrzebne, zwykle potrzebujemy ;-)

func main() {
// nadziewka
var i = 1 // samo nam stworzy inta o wartości 1
var f float64 = 1.0 // samo nam stworzy float64 o wartości 1
i1:=1 // to samo co var i1=1
fmt.Println(i," ",f," ",i1)
}

W Go można przypisywać jednym := kilka wartości, funkcje też mogą zwracać kilka wartości np:
package main

import "fmt"

func toster() (string, int, bool) {
return "string",1,false
}


func main() {
a,b,c:=toster()
fmt.Println(a," ",b," ",c)
}

Wypisze "string 1 false".
To wieloprzypisywanie trochę na początku przeraża ;-)

Ok, to tyle, jak będę miał nastrój na dalszą naukę to napiszę więcej ;-)
Na razie zachęcam do przyjrzenia się tutorialowi [szczególnie prezentacji do której linki są na stronie tutoriala].

Nie jestem już tak obrzydzony do Go jak rok temu, ale nadal nie jest to mój ulubieniec ;-)
http://www.blogger.com/img/blank.gif
Podoba mi się to, że jak na razie wydaje się nie skupiać na "architekturze", nie muszę myśleć o hierarchii klas, nie muszę pilnować ciągle by wszystko co powinno dziedziczyło/implementowało to co powinno, to się tu samo wydaje robić. Potrzebuję metody to ją po prostu dopisuję......

Na razie jednak nie wychodzi mi komplikacja z kilku plików ;-) Używam portu dla Windows, o którym tu już kiedyś pisałem i niestety nie potrafi on chyba do końca pracować z wieloma plikami [jeżeli stworzy się swój własny pakiet], dodatkowo gdy program zrobi out of memory to pod Windows cały komputer zawisa, i po jakichś 30 sekundach program po prostu kończy swoje działanie, bez żadnej informacji........

Do prostych zabaw warto użyć umieszczonego na stronie Go placu zabaw ;-)


Podobne postybeta
Wysyłamy pliki do Google Docs przy pomocy Go :-)
Język Go dla Windows :-)
Go dla Java'owca ;-) odcinek 2 "kontenery dwa ;-)"
Go wolniejsze od C i JavaScript, i ciut szybsze niż Java ;-) [a jednak od Java'y też wolniejsze]
Wyważanie otwartych drzwi

niedziela, października 03, 2010

Tunel?

Wiecie co to jest? :-) A właściwie co to będzie? :-)

Nie wiem na 100%, ale wydaje mi się że będzie to tunel pod budowaną w Wodzisławiu drogą :-)









Ładne, nie?



Podobne postybeta
Urodzinowe Google ;-)
Drzewka, ładne drzewka - kilka zdjęć :-)
Tunel... ciąg dalszy ;-)
Quidam - Cirque du Soleil
Ucieczka z Evernote - wersja 0.0.1 ;-)

O Ruchu Poparcia Palikota, czyli RPP ;-)

Był zjazd ruchu Palikota.
Były punktu programu.
Jest moja reakcja :-) o tyle istotna, że Palikot wydaje się kierować swoją ofertę między innymi do mnie.
  • kadencyjność funkcji politycznych - nie do końca rozumiem o co w nim chodzi. Szefowie partii czy raczej premierzy mają być kadencyjni z ograniczoną ilością kadencji? Na to drugie się zgadzam, bo rzeczywiście raczej wolelibyśmy uniknąć sytuacji jak we Włoszech gdzie premierzy łącznie rządzili po kilkanaście lat w milionach koalicji. Ale ogólnie ten punkt do mnie nie przemawia ;-) (czyli 0)
  • jednomandatowe okręgi wyborcze - zdecydowanie jestem przeciw, w chwili obecnej mielibyśmy w sejmie jakieś 70% PO, 25% PIS i może z 5% SLD, przy poparciu w okolicach 45-50% dla PO, około 30% dla PiS i 10-15% dla SLD. (-1)
  • likwidacja Senatu, ograniczenie liczby posłów do 300 i zniesienie immunitetu poselskiego - tak, tak, nie. Likwidacja Senatu to dobry pomysł bo to jest izba dumania, która niczego nie robi. Ograniczenie liczby posłów też tak, bo dzięki temu powinno to wszystko sprawniej działać. Zniesienie immunitetu nie, bo on ma swoje cele. Jest wykorzystywany, ale wyborcy mają prawo rozliczyć z tego wybieranych ludzi. Jak tego nie robią to niestety oznacza, że uważają, że "im wolno". (2/3)
  • ograniczenie, albo zlikwidowania subwencjonowania partii politycznych - trudno mi powiedzieć. Nie wiem jakie to pieniądze. Na pewno nie chciałbym systemu takiego jak w USA gdzie firmy niemal legalnie korumpują polityków. (0 bo nie wiem)
  • wprowadzenie bezpłatnej antykoncepcji - może być. (0.5)
  • wycofanie religii ze szkół - tak, albo wprowadzenie jej jako zajęć dodatkowych prowadzonych przez pracowników kościoła za pieniądze kościoła. (1)
  • koniec z subwencjonowaniem Kościoła oraz zlikwidowanie kościelnego funduszu emerytalnego - tak. Fundusz kościelny powstał w latach 50 po to by zadośćuczynić kościołowi odebranie mu dóbr ziemskich. Oddano mu je, więc fundusz nie ma już racji bytu. Dodatkowo KUL i inne uczelnie katolickie powinny być finansowane z pieniędzy innych niż budżetowe. KUL też w latach 50 przeszedł na garnuszek państwa bo PRL zabrał im ziemię, która służyła do utrzymania KULu, dostali ją z powrotem [z nawiązką] to powód finansowania zniknął. (1)
  • oświadczenia zamiast zaświadczeń - tak, choć to może być trudne w Polskim prawie. Bo nie do końca jestem pewien czy można kogoś ścigać wg. polskiego prawa za to, że powiedział, że nie ma długów, a je ma. (1)
  • "zasada milczącej zgody", że jeśli w terminie 90 dni nie mam decyzji administracyjnej, to mogę działać - jak najbardziej. Państwo bierze od obywateli pieniądze za prowadzenie administracji [między innymi] więc to obywatel powinien być ważniejszy. Jak państwo nie mówi "nie" to powinno to znaczyć "tak". (1)
  • jawność wszystkich dokumentów urzędowych. "Nie ma tajnych dokumentów: przetargi, protokoły z posiedzeń z komisji, wszystko ma być jawne i ja nie muszę udowadniać swojego interesu w sprawie jak idę do urzędu, żeby poprosić o jakiś dokument, np. protokół z posiedzenia komisji przetargowej". - tak. Łącznie z tym, że duże przetargi publiczne powinny być powiązane z okresowym raportowaniem postępów prac, przewidywanej daty ukończenia, ilości środków przekazanych na realizację. (1)
  • rejestracja związków partnerskich, hetero i homoseksualnych - tak i tyle. (1)
  • powszechny darmowy dostęp do internetu - czy ja wiem? Ma to sens? Kto za ro będzie płacił? Sama idea mi się podoba, ale jakoś mnie to nie przekonuje. (-0.5)
  • jeden procenta budżetu na kulturę - hmmm... nie. Chyba, że rozumiemy jako kulturę muzea, a i tu się zastanawiam. (-1)
Czyli po zsumowaniu wychodzi mi 4 i 2/3, no powiedzmy 4.7, a nawet 5 na 13.
Czyli Ruch Poparcia Palikota mnie nie przekonuje.

Ale dobrze, że się pojawił.


Ja tam nadal będę głosował na SLD, idealnie byłoby gdyby doszło do fuzji SLD, SdPL, Partii Kobiet i Palikotów.


Podobne postybeta
Przewidujemy wyniki wyborów ;-) - wyniki
1 na 9 głosów
Złe wieści
In vitro
Dziura