MiniProgram powraca, czyli SudokuSolver

Dzisiaj i wczoraj siedziałem nad małym programem o nazwie SudokuSolver. Mam zrobiony model bazujący na liczeniu dostępnych możliwości. Każda komórka ma tablicę dostępnych pól, na zmianę tej tablicy informuje słuchaczy o tym fakcie. Dodatkowo informuje o tym, że pozostała już tylko jedna możliwość, jak również o tym, że nie ma już żadnych prawidłowych możliwości dla danej komórki (będzie przydatne przy określaniu błędnie wypełnionego diagramu). Diagram z kolei przechwytuje zdarzenia ze wszystkich komórek, z których się składa i przekazuje w zmienionej formie (DiagramChangeEvent) wyżej.
W modelu obecnie stosowana jest prosta reguła eliminacji z dostępnych możliwości tych, które są już niedostępne ze względu na wykorzystanie już w kolidujących komórkach. Model wspiera sudoku o dowolnej podstawie kwadratowej (1,4,9,…), natomiast szybko pisane GUI nie ma żadnego wsparcia obsługi błędów, ani możliwości wyboru wielkości diagramu. Nie mniej możecie wprowadzać diagramy i przeliczać pola, które da się obliczyć.
W planach mam rozwinięcie solvera o dwa algorytmy:

  • dedukowanie wartości na podstawie dostępności w innych komórkach kolidujących (przykładowo jeśli komórki w danym wierszu mają możliwości [1 3] [1 3] [1 5] algorytm powinien ustawić trzeciej z nich wartość na 5)
  • liczenie drzewa kombinacji. W pierwszej komórce, która ma co najmniej dwie możliwości wybieramy jedną z nich i próbujemy rozwiązać za pomocą dwóch pierwszych algorytmów. Jeśli nadal pozostaną pola nierozwiązane powtarzamy podstawianie jednej wartości. Jeśli natrafimy na konflikt (zero możliwości w którymkolwiek polu) pobieramy ze stosu diagram sprzed ostatniego podstawienia i podstawiamy kolejną wartość, której nie przetestowaliśmy.
Sam model robiłem w czystym podejściu TDD. Zanim zaimplementowałem jakąkolwiek funkcjonalność, pisałem jej testy i dopiero później implementowałem rozwiązanie, które przechodzi te testy pomyślnie. Kilka razy zdarzyło się, że implementując jakąś funkcję popsułem już istniejącą, co od razu wykazały testy, więc nie byłem zaskoczony, że nagle coś nie działa:] Nieocenioną pomocą przy testowaniu systemu słuchaczy okazała się biblioteka Mockito, dzięki której mogłem mock’ować obiekty i sprawdzać, ile razy dane metody były na nich wykorzystane bez ich faktycznej implementacji. Przy okazji po latach programowania zorientowałem się, że w Javie nie ma operatora potęgowania. Aby zrobić tak prostą rzecz trzeba skorzystać z metody dostępnej w klasie java.lang.Math.

Posted on 18 December 2011
Under: Programming | 1 Comment »

automatyczny numer wersji

Od dłuższego czasu zastanawiałem się nad sensownym systemem automatycznego tworzenia numeru wersji aplikacji. Wiadomo, że to my decydujemy, kiedy nadać np. numer 1.1, ale warto by było nie pogubić się w tym wszystkim i choćby móc na oko stwierdzić, z którą wersją kodu mamy do czynienia. Więc zająłem się rozwijaniem narzędzia, które bez mojego udziału będzie numerować wersje. Ze względu na dość dużo kodu, więcej po kliknięciu poniżej;)
Read the rest of this entry »

Posted on 30 October 2011
Under: Programming | No Comments »

qbixlib i ListResultSet

Teraz trochę o mojej bibliotece. Poprzednia wersja została uśmiercona i zastąpiona całkowicie nową. Żadnych obiektów z poprzedniej wersji nie ma w obecnej, a sama obecna nie jest póki co zbyt duża, mówiąc delikatnie. Nie mniej z biegiem czasu na pewno się rozrośnie, a część ciekawych rzeczy z poprzedniej biblioteki wróci na pewno do obecnej, jak choćby JFileTree, które jakiś czas temu opisywałem w tym miejscu.

Na chwilę obecną najszybciej jednak będę starał się pracować nad klasą ListResultSet, która w zasadzie została do obecnej biblioteki dodana w bardzo okrojonej postaci. Większość metod będzie zwracała UnsupportedOperationException, póki ich nie zaimplementuję. Potrzeba stworzenia takiej klasy pojawiła się już jakiś czas temu, ale ostatnio miałem bodziec, aby jednak w końcu ją stworzyć. Zastosowanie dla niej mam zbliżone do mockowania z poprzedniego postu. Potrzebowałem obiektu, który będzie oparty o interfejs ResultSet, ale nie chciałem, żeby łączył się z bazą danych, gdyż miałem na celu przetestować tylko fragment kodu znajomego i nie dysponowałem potrzebną do tego bazą. Stworzyłem więc klasę, która opakowuje listę rekordów (które są oddzielnymi listami obiektów) w interfejs ResultSet. Póki co można korzystać jedynie z metody next, oraz getterów dla klasy String, a także dwóch konstruktorów stworzonych na potrzeby tej klasy. Więcej w dokumentacji na moim javadoc’u.

Kolejne dwie funkcjonalności w tej bibliotece, to po krótce zamiana tablicy bajtów w zapis heksadecymalny zawarty w stringu i w drugą stronę, oraz klasa stworzona na potrzeby łatwego generowania haseł pod kątem ich bezpiecznego przechowywania w bazie danych. Szczegóły pod powyższym linkiem.

Posted on 25 October 2011
Under: Programming | No Comments »

Mockito i JUnit w TDD

Na pierwszy rzut trochę o testowaniu. Słyszałem już dawno temu, że coś takiego, jak JUnit istnieje, że służy do automatyzacji testów jednostkowych i generalnie jest bardzo fajne. Mówili, mówili, a ostatecznie do pochylenia się nad tą biblioteką skłonił mnie artykuł w jednym z ostatnich numerów Software Developer’s Journal traktujący o Test Driven Developement. Nie będę się rozpisywał, o co w tym wszystkim chodzi, bo sieć jest pełna wszelkiego rodzaju tutoriali zarówno do wspomnianego TDD, jak również do samych bibliotek JUnit i Mockito. Ograniczę się więc do krótkiego obrazu TDD i powiem, co nam daje JUnit z mojego krótkiego użytkowania wnosząc.

Otóż TDD sprowadza się do tego, że nie piszemy ani linijki kodu właściwego przed napisaniem stosownego kodu testującego daną funkcjonalność. To zapotrzebowanie na funkcjonalność powoduje stworzenie kodu. Dzięki temu mamy krótki cykl tworzenia malutkich modułów, które od razu można przetestować. Wymusza to na nas poniekąd podejście będące jedną z podstaw programowania obiektowego – małe metody o pojedynczej odpowiedzialności.

Samo korzystanie z testów jednostkowych natomiast pozwala nam stwierdzić z dużym prawdopodobieństwem, że nie popsuliśmy czegoś, co działało już wcześniej. Dobrze napisane testy jednostkowe testują właśnie pojedyncze fragmenty kodu na okoliczność występowania poszczególnych zdarzeń. Dzięki temu gdy robimy mały refactoring od razu wiemy, czy kod zachowuje się tak, jak tego oczekiwaliśmy wcześniej. Dzięki temu mechanizmowi już udało mi się poprawić proste błędy w swojej bibliotece, z której już korzystałem, nie wiedząc nawet, że zawiera błędy, bo wszystko wyglądało sensownie.

O Mockito na razie dużo powiedzieć nie mogę, bo nie miałem jeszcze okazji używać testów w bardziej złożonych miejscach i nie wykraczałem ponad testowanie jednej klasy, która nie zależy od innych. Nie mniej ma zastosowanie, gdy chcemy, aby z jakichś powodów metody do testów zwracały nam określoną wartość bez wykonywania ich samych dla danego obiektu. Możemy również weryfikować, czy dana metoda została w ogóle wywołana i dokładnie ile razy.

Po więcej zapraszam do linków poniżej. Zachęcam do zainteresowania się tematem, bo technicznie jest więcej, niż prosty.


JUnit – tutaj pobierzesz i zaznajomisz się z JUnit
JUnit tutorial – dobry i króciutki tutorial do JUnit
Mockito – strona projektu wraz z dobrą dokumentacją

Posted on 25 October 2011
Under: Programming | No Comments »

Kilka updateów

Na początek kilka update’ów, ze względu na to, że dawno mnie tu niestety nie było:

  • Nadal nie mam jeszcze tytułu inżyniera (były ciekawsze rzeczy do roboty:) )
  • Ponieważ miałem masę ciekawych rzeczy do roboty nie miałem czasu na własne przemyślenia i opiekowanie się blogiem
  • Brakło również czasu na zajmowanie się wspomnianymi w ostatnich postach projektami, więc serwer mi wygasł i linki nie działają.
    Serwer powróci, a mam źródła, więc wszystko będzie w porządku, jak się ogarnę z kilkoma rzeczami
  • Po wygaśnięciu domeny qbixdev.net posprzątałem większość linków, ale nadal jeśli się jakieś znajdą niedziałające, to proszę o kontakt
  • Mój wordpress jest stary jak świat, więc będę próbował w najbliższym czasie dokonać jakiegoś update’u do wersji bieżącej. Panel podpowiada, że obecnie jest to już 3.2.1:)
  • Mam kilka drobnych pomysłów na miniaplikacje
  • Napisałem helloworld na Androida
  • Uśmierciłem stare qbixlib i zastąpiłem nowym
  • Pobawiłem się trochę JUnitem i Mockito

Część z tematów powyższych doczeka się własnego posta, aby dać trochę szerszy obraz sytuacji

Posted on 25 October 2011
Under: Uncategorized, Ogólne, Strona | No Comments »

Rejestracja

Klika słów na temat dzisiejszego update-u. Pierwsza sprawa – zmieniłem jakiś czas temu styl z domyślnego GWT Standard na własny plik CSS. Wygląd pozostawia wiele do życzenia, ale z doświadczenia wiem, że jeśli użyjesz standardowego stylu i chcesz dodać coś własnego, to dużo pieprzenia się jest z priorytetami. Dlatego stwierdziłem, że styl będzie zrobiony od początku do końca bez szablonów GWT, chociaż korzystam z jego klas css-owych.

Druga kwestia. W module DnD dostępny jest moduł rejestracyjny. Póki co nie ma tam praktycznie żadnej walidacji, ani możliwości logowania, ale można już rejestrować użytkowników. Przy okazji poczytałem trochę o przechowywaniu haseł w bazie, bo zawsze mnie to zastanawiało, co dodawać do hasła jako salt przy tworzeniu hasha. Okazuje się, że zamiast robić jeden uniwersalny salt trzymany poza bazą lepiej stworzyć salt dla każdego hasła oddzielnie i przechowywać go w oddzielnej kolumnie w bazie zaraz obok hasła w postaci hashowanej. Stąd hasło u mnie w bazie jest przechowywane jako zakodowany algorytmem SHA-256 ciąg znaków powstały po dodaniu do hasła użytkownika ciągu losowych 32 bajtów, które są przechowywane w kolumnie salt.

W ten sposób używam silniejszego algorytmu, niż klasyczny MD5, oraz zabezpieczam się przed użyciem tęczowych tablic dla haseł przechowywanych w mojej bazie, bo dla każdego użytkownika takie tablice trzeba by było tworzyć od nowa. Łatwiejsze wtedy jest po prostu łamanie hasła metodą bruteForce, co przy wspomnianym algorytmie też jest dużo cięższym zadaniem od standardowego.

Do generacji haseł stworzyłem sobie klaskę, którą prezentuję poniżej. Miała za zadanie łatwe tworzenie hashcode’ów dla podanych ciągów bajtów przy użyciu dowolnego standardowego algorytmu szyfrowania dostępnego dla klasy MessageDigest. Aby wygodniej przechodzić z ciągów znaków do tablic bajtów stworzyłem również klasę odpowiedzialną za tworzenie ciągów heksadecymalnych dla tablic bajtowych i odwrotnie. Standardowe ciągi można przekonwertować na tablicę znaków za pomocą standardowej metody String.getBytes()
Read the rest of this entry »

Posted on 19 February 2011
Under: Uncategorized | No Comments »

DnD Project

Ostatnio dysponuję trochę większą ilością czasu, co pozwoliło mi zająć się dalszą konfiguracją mojego serwera. Tymczasem umieściłem już pierwszy projekt na liście projektów pod adresem tomcat.qbix.pl. Znajdziecie tam póki co tylko generator rzutów kostkami o różnej liczbie ścian.

Teraz trochę o zastosowanym rozwiązaniu:

Interfejs stworzony jest w GWT na dostępnych w nim panelach i nie ma co się na ten temat rozpisywać. Ważne, że mogę pisać to w Javie, a kompilator automatycznie tworzy skrypty JavaScript funkcjonujące po stronie klienta.

Mechanika rzutu kostką natomiast jest wykonywana poprzez RemoteService funkcjonujący jako servlet Java. Serwis realizuje dwie metody – rzut jedną kostką i rzut setem kostek. Pierwszy przypadek to po prostu podanie liczby ścian będącej dowolną liczbą całkowitą, oraz liczby żądanych rzutów. W drugiej wersji przekazujemy mapę kostek w postaci par <liczba ścian, liczba kostek> składających się na jeden rzut.  Tak, jak w pierwszym przypadku, definiujemy również liczbę rzutów realizowanych za pomocą podanych danych. W rezultacie otrzymujemy tablicę liczb całkowitych odpowiadającą zadanej liczbie rzutów.

W głębi postu kod klasy Die.

Read the rest of this entry »

Posted on 6 February 2011
Under: Programming | No Comments »

Projekt “serwer” i domena qbixdev.net

Dwa newsy na dziś. Zacznę od krótszego -temat domeny. Wkrótce wygasa mi ważność domeny qbixdev.net. Nie planuję przedłużać jej, więc wkrótce adres ten przestanie działać. Przypominam wiec, iż obecnie blog działa pod adresem qbix.pl.

Drugi temat dotyczy moich projektów. Jak pisałem, planuję postawić własny serwer aplikacji. Udało mi się znaleźć usługę wirtualnego serwera z dostępem przez shell. Dzięki temu na takim serwerze mogę instalować, co mi się żywnie podoba, w dość skromnych granicach dostępnej pamięci operacyjnej.

Obecnie zainstalowany jest tylko tomcat i postgresql. Na tomcacie można zaś znaleźć główny ekran dla moich projektów, póki co pusty. Nie mniej jednak tutaj podaję link. Wszelkie wieści o projektach będzie można znaleźć tutaj, zaś same projekty pod wspomnianym linkiem.

Posted on 4 February 2011
Under: Uncategorized | No Comments »

Long time no see

Kurcze, bardzo dawno nic tutaj nie napisałem, co jest dla mnie mocno przerażające. Teraz też piszę w zasadzie w przerwie między kodowaniem, a kodowaniem. Na przestrzeni minionego czasu sporo zmieniło się w moim życiu tak prywatnym, jak i zawodowym. Nad prywatnymi rzeczami nie będę się rozwodził, bo nie do tego ten blog służy. Jeśli chodzi o zawodowe zaś wspomnieć muszę o kilku rzeczach, którymi ostatnio się zająłem. Chwilowo będzie to tylko wymienienie tematów. Od przyszłego roku powinienem mieć więcej czasu na bloga, więc pojawią się również różnego rodzaju eksperymenty. Powstanie z pewnością własna biblioteka rozszerzająca możliwości GWT, który pod pewnymi względami jest mocno ograniczony.

A więc lista tematów na ten rok:
- własny serwer aplikacji oparty na Tomcat, lub Glassfish, na którym będę prowadził swoje projekty (o nich też więcej po nowym roku)
- GWT (Google Web Toolkit), framework w znacznym stopniu pomagający stworzyć bogaty interfejs użytkownika w przeglądarce internetowej. Cały kod javowy kompilowany jest do JavaScriptu wykonywanego po stronie użytkownika.
- Pentaho Bussiness Intelligence – świetny, bezpłatny i opensource’owy pakiet narzędźowy dla biznesu. Począwszy od narzędzi ETL do łączenia danych z wielu różnych źródeł, przez system raportów, aż po biblioteki do osadzenia całego raportowania w aplikacji javowej, np. po stronie tomcata.
- Android – co to jest, nikomu tłumaczyć nie muszę. Postanowiłem dokonać portów kilku swoich projektów na to urządzenie. Jak to wyjdzie, czas pokaże.
- Chrome OS – to kwestia najbliższych dni, jak tylko uda mi się odpalić system na VMware. Poświęcę trochę uwagi temu systemowi, bo ciekaw jestem, jak będzie wyglądał developing na system oparty na przeglądarce:]

W kwestii mini programów… nie miałem ostatnimi czasy sposobności do napisania takowych, nie mniej jednak nadal otwarty jestem na propozycje.


Linki:
GWT
Pentaho BI

Posted on 27 December 2010
Under: Programming, Ogólne | No Comments »

Wolność słowa w internecie

Wzięło mnie na przemyślenia odnośnie do tego “zamachu” na wolność słowa w internecie. Wydaje mi się, że trzeba rozgraniczyć dwie sprawy. Jedna to rzeczywiście wolność słowa i swoboda wypowiedzi. Druga natomiast to przyjmowanie odpowiedzialności za swoje wypowiedzi.

Jakiś czas temu dość mocno wzrosły emocje, gdy były plany wprowadzenia obowiązku podpisania się swoim imieniem i nazwiskiem pod głoszonymi przez siebie treściami w internecie. Oczywiście uważam za głupotę projekt, w którym autorzy np. blogów podchodzą pod prawo prasowe, a zatem muszą mieć swojego redaktora naczelnego itd., jednak identyfikacja moim zdaniem jest konieczna.

Jest takie stare powiedzenie “Wolność jednego człowieka kończy się tam, gdzie zaczyna się wolność innego”, więc nie możemy bezkarnie wypisywać bredni pod czyimś adresem. To nie jest wolność słowa, tylko oszczerstwo. Dalej – istotą swobody wypowiedzi jest to, że możemy krytykować np. rząd, czy ogólne zjawiska polityczno-społeczne bez obawy jakichkolwiek konsekwencji. Nikt natomiast nie wspominał o tym, że autor nie powinien brać odpowiedzialności choćby moralnej za to, co wygłasza.

Jaka jest wartość Twojego słowa, jeśli boisz się przyznać, że masz takie zdanie… W czasach represji taką wolność słowa też mieliśmy – póki nie wiedzą, że to Ty wydrukowałeś, możesz napisać taką ulotkę, jaką sobie wymyślisz. Papier wszystko przyjmie. Ileż mniej byłoby tzw. trolli, gdyby każdy Twój post był opatrzony imieniem i nazwiskiem. Ileż ludzi by się zastanowiło przed wysłaniem swoich rewelacji, gdyby wiedziało że na znanym portalu zaraz pojawi się bzdura opatrzona podpisem.

Pozostaje zanucić
- First post
- Fuckin’ gay
- Second post
- go away…

Posted on 19 January 2010
Under: Uncategorized | No Comments »