poniedziałek, sierpnia 02, 2010

Z placu boju z Bloggeroidem ;-)

Dwa największe problemy jakie mam z Bloggeroidem na chwilę obecną to, po pierwsze jak zmienić HTMLa w opublikowanych już postach w mój format udający wiki ;-), po drugie serializacja.
Serializacja np. listy postów pobranej przed chwilą z bloga.
Trochę głupio ściągać tą listę za każdym razem... trzeba by było jakoś zapisać te dane. Albo zserializować do Stringa, albo trzymać w jakimś objekcie globalnym... albo oszukać :-) Zapisać listę obiektów do ObjectOutpuStream otwartego nad ByteArratOutputStream'em i zapisać tablicę bajtów do outState w onSaveInstanceState (metoda w aktywności wołana przez Androida gdy system kładzie naszą aktywność, a powinna być ona później znów dostępna).

Wydaje się, że ta ostatnia metoda to nie jest to ;-) ale ma plusa bo szybka ;-)



Podobne postybeta
Serializacja w Java'ie - revisited ;-)
Co ładniejsze?
Nexus S - wrażenia z boju ;-)
Jak pogadać z Alexą na telefonie
Extremal recruting ;-)

Plusy dodatkie i plusy ujemne, czyli co może być złego, a co dobrego w AppInventorze :-)

Nie mam jeszcze konta w Google AppInventor for Android, czekam nadal, ale mam już chyba jakieś wnioski ;-)

Pierwszy taki, że jest pewne niebezpieczeństwo w tej aplikacji. Można sobie zrobić krzywdę przez wykorzystanie płatnych usług, albo zamienić telefon w maszynę utrudniającą komuś życie.
Ktoś wkurzony na swoją ex-połówkę będzie mógł chyba dość szybko wyklikać aplikację dzwoniącą pod wybrany numer w dziwnych porach, albo non-stop... z drugiej strony wtedy zapewne druga strona będzie mogła napisać aplikację zrzucającą wszelkie połączenia od tamtej osoby ;-) Dzieciak chcący wygrać "motór" czy innego iPoda w konkursie SMSowym może wpaść na pomysł wyklikania aplikacji do wysyłania SMSów o pełnej godzinie.

To mi przypomina to, że gdy pisałem sobie wtyczki do Gadu-Gadu to napisałem też Skryptusia, w którym zablokowałem np. możliwość wysyłania przez skrypty wiadomości do osób które się do nas nie odezwały. Chodziło mi o to by uniemożliwić powstawanie botów atakujących jakieś numerki ciągłym spamowaniem. Ale przez to ograniczyłem możliwości aplikacji tylko do reagowania na to co się do niej mówiło....
Google ma ten sam dylemat tylko jakiś milion razy większy ;-)

To wyżej to jedno niebezpieczeństwo, które widzę w Google AppInventor for Android. Plusów jest więcej ;-)

To nikt inny jak użytkownicy wie najlepiej czego potrzebują. To może być laboratorium, które posłuży do przetestowania wielu głupich pomysłów, z których niektóre mogą stać się użyteczne.
Ja bym nigdy nie widział potrzeby w pisaniu aplikacji, która będzie odpowiadała na wszystkie SMSy, które otrzyma [w zamyśle autora, gdy jeździ na rowerze to chciałby żeby osoby piszące do niego SMSy były informowane, że nie może odpisać bo jest zajęty], ale przypuszczam, że wielu ludzi nie będzie mogło żyć bez takiej aplikacji.

Zalety edukacyjne są oczywiste, ale i parę nieoczywistych jest ;-) Np. teraz nic nie będzie stało na przeszkodzie napisaniu aplikacji, która co np. 10 minut albo co godzinę będzie robiła zdjęcie. Albo codziennie o tej samej porze. Wystarczy wtedy taki telefon postawić przy oknie i mamy piękny film pokazujący ruch Słońca, czy coś podobnego.

Tak w ogóle. To mnie się marzy [od dobrych 8 lat] takie coś podobne do AppInventora, ale działające na telefonie/PDA :-)
Pojawia się pomysł albo potrzeba i w 5-10 minut wyklikuje się niezbyt skomplikowaną aplikację.
Problem jest "tylko" z interfejsem ;-) Bo nie umiem wymyślić dobrego ;-)

Aha, Google, dajcie to zaproszenie ;-) miejcie litość ;-)

Podobne postybeta
Raport z emigracji ;-)
Powiadomieniami w walce z uzależnienie od WhatsApp i Telegrama ;-)
Transport publiczny - moje top i bottom 5 (na dziś :-))
Planetarium czy Plebania?
Ku dyktaturze...

niedziela, sierpnia 01, 2010

zVATowani 2

OK, wszyscy płaczą, że zły rząd chce podwyższać podatki, a oni tacy biedni. Ci sami ludzie płaczą też, że przecież oni tacy biedni i im nikt nie chce pomagać.
Emeryci za mało dostają. Szkoły są biedne. Nauczyciele mało dostają.

Weźcie się zdecydujcie, OK?

Albo mamy model państwa opiekuńczego gdzie płacimy wysokie podatki [umówmy się, że składki na ubezpieczenia w stylu NFZ czy ZUS to też podatki] i z tych pieniędzy świadczone są nam usługi w stylu szkół, emerytur, opieki medycznej. To jest model z siatką zabezpieczającą, może ona krępować tych, którzy sobie świetnie radzą, ale daje ratunek tym którym się noga powinie.
Albo mamy model darwinizmu społecznego gdzie płacimy minimalne podatki, ale o wszystko musimy martwić się sami. To jest model w którym jak ci się noga powinie to odpadasz od ściany i spadasz w dół.

Nie da się połączyć tego tak by mieć przywileje i bezpieczeństwo z modelu 1, i koszty z modelu 2.

Jeżeli uważasz, że trzeba pomagać ludziom, że szkoły powinny być powszechne i nie powinno się dostawać rachunków za posyłanie tam dzieci, jeżeli uważasz, że opieka medyczna też powinna być powszechnie dostępna i nie powinno się dostawać rachunków po wyjściu od lekarza to nie ma przebacz, skądś pieniądze na to muszą pójść. Wszyscy się muszą zrzucić. Siłą rzeczy bogatsi zrzucą się bardziej niż biedni. Ale zrzucić się musi KAŻDY.

Nie ma darmowych obiadów [to tylko po części prawda, bo np. duża część Open Source to właśnie darmowy obiad], ktoś za to musi zapłacić. Albo płaci każdy za siebie i wtedy są tacy, których stać na dużo więcej niż potrzebują i są też tacy, których nie stać nawet na podstawowe sprawy, albo wszyscy wrzucają do wielkiego wora, i część dostaje z tego wora dużo więcej niż włożyli, a część nie wyciąga niczego, ale w zamian dostaje spokój społeczny, nie musi budować zamków ani nosić ostrego miecza przy sobie by bronić swojego dobytku przed tymi, którzy nie mają nic.

Jeżeli płaczesz, że emeryci dostają za mało to pomyśl, że rok w rok na emerytów wydajemy 130-150 mld złotych! Podwyższenie nawet o złotówkę miesięcznej emerytury dla każdego emeryta to dodatkowe 90 milionów złotych. O 10 złotych to 900 milionów, trzy razy więcej niż idzie na becikowe, albo IPN.

I teraz jest tylko pytanie czy trafia do Ciebie kawałek Kazika:
"całe życie tyrał w hucie, a do huty dokładali. Cała jego ciężka praca, wszystko było ch... warte, gdyby leżał całe życie mniejszą czyniłby on stratę"
Jeżeli przemawia, to godzisz się ponosić te koszty i rozumiesz, że ktoś za te emerytury musi zapłacić.

Jeśli kiedykolwiek pomyślałeś/pomyślałaś, że komuś powinno państwo/samorząd czy ogólnie społeczeństwo pomóc to w mniejszym lub większym stopniu popierasz ideę państwa opiekuńczego. Więc zaakceptuj, że za to musisz płacić niezależnie czy z tego korzystasz czy nie.
W domu nie rozliczasz dzieci z chleba który zjadły, nie przeliczasz tego na przyszłe zyski z inwestycji. Pomagasz znajomym bezinteresownie. Ponosisz koszty, jedynie dla satysfakcji i mglistej obietnicy rewanżu.
Państwo opiekuńcze to rozwinięcie tego modelu. Ci, którym powodzi się lepiej pomagają tym którym powodzi się gorzej.

Drugi model jest taki, że każdy może liczyć tylko na siebie, może rodzinę i znajomych. Panuje tam trybalizm, w którym pomaga się tylko ziomkom, a innych postrzega się jak potencjalnych wrogów, którzy mogą zagarnąć Twoje zasoby. Ten model prowadzi zawsze do koncentracji bogactwa. Wymusza przez to by bogaci bronili się przed biedną resztą.

Nie można mieć państwa opiekuńczego bez jego kosztów. Nie da się.

Wg. mnie się opłaca.
Dlatego skoro przez parę ostatnich lat wzbogaciliśmy się dość znacznie, i wygląda na to, że żyliśmy ponad stan, to trzeba za to teraz zapłacić.
Gdyby to ode mnie zależało większość kasy poszłaby z PIT, a nie z VAT, zlikwidowałbym becikowe, ulgę na dzieci, IPN, fundusz kościelny, Ministerstwo Sportu, zlikwidował dotację dla większość uczelni "wyższych" i zostawił tylko dla tych najlepszych [pomiar przez ilość cytowań w świecie i średnią zarobków absolwentów w porównaniu do absolwentów danego kierunku na innych uczelniach z uwzględnieniem rejonu], przetrzebił wojsko, zrezygnował z powiatów lub gmin, pomyślał o podniesieniu podatku Belki, by lokaty nie były bardziej opłacalne od ryzykowania i prowadzenia firm, podniósł składkę zdrowotną i emerytalną i wprowadził zasadę, że państwo ma prawo zaciągać długi tylko w celach inwestycyjnych.

Uwagi do ewentualnej dyskusji tutaj lub na Google Buzz, Flakerze czy gdziekolwiek indziej.
Tak, wiem, że Ty chcesz "wolności", że nie chcesz płacić za innych, tak i jesteś w 10% najbogatszych ludzi więc nigdy nie wyciągnąłeś nawet złotóweczki z wora, brawo! Tak trzymać!
Ale długi mamy i tak, dlatego powiedz skąd wziąć pieniądze na ich spłatę? Komu zabrać? Ja swoje opisałem, Ty opisz swoje.
Ja wolę państwo opiekuńcze, Ty nie, ale powiedz skąd wziąć pieniądze i jak uniknąć wtedy buntu społecznego, lub jeśli wybuchnie to jak go stłumić albo jak z nim żyć?
Powiedz jak przejść od złego "socjalizmu" do wspaniałej wolności.


Podobne postybeta
Dziura
2011 zaczęty ;-)
"Ja? Niech ktoś inny płaci" ;-)
Jak się profesjonalnie kłamie
Nie ma sprawiedliwych podatków ;-) przynajmniej obiektywnie sprawiedliwych ;-)

sobota, lipca 31, 2010

A może jutro?

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

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

Tyle tytułem wstępu.

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

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

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

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

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

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

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

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



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

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

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

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

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


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

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

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

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

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

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

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

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


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

piątek, lipca 30, 2010

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

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

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

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

Piękne!


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

czwartek, lipca 29, 2010

zVATowani :-)

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

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



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

Karciane dylematy

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

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



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

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

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

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

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


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

wtorek, lipca 27, 2010

Plan lekcji - wersja hard ;-)

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

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

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

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


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

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

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

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

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

;Windows initialization. Sets up registers and stack.

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

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

;Initialize the Windows App

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

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


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

cmp [hPrev], 0
jne already_running

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

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

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

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

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


push ds
push offset wc
call REGISTERCLASS

already_running:

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

call CREATEWINDOW

mov [newhwnd], ax

push [newhwnd]
push [cmdShow]
call SHOWWINDOW

push [newhwnd]
call UPDATEWINDOW

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

cmp ax, 0
je end_loop

push ds
push offset msg
call TRANSLATEMESSAGE

push ds
push offset msg
call DISPATCHMESSAGE

jmp msg_loop

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

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

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

jmp defwndproc


wmcreate:

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

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

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

call SENDMESSAGE

mov ax, 0
jmp finish

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


jmp koncz

test107: cmp [wparam],107
jle obsluga101_107

koncz: mov ax,0
jmp finish


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

CALL SENDMESSAGE

jmp koncz


obsluga101_107:
push [hwnd]
push [wparam]

call GETDLGITEM

push ax
push ds
push offset szDzien
push 13

call GETWINDOWTEXT

push [hwnd]
push ds
push offset szTitleName

call SETWINDOWTEXT

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


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

pop es

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

CALL SETWINDOWTEXT

jmp koncz

niemalekcji:
push hwndSTATIC
push ds
push offset szBrakLekcji

CALL SETWINDOWTEXT

jmp koncz


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

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


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


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

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

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


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