wtorek, 27 września 2016

GameBook Creator 2016-09-27

Przysiadłem znowu nad GameBook Cratorem. Tym razem dodałem obsługę nowych rozdziałów z poziomu tekstu konkretnego paragrafu. Dodatkowo wprowadziłem kilka innych drobnych zmian.


Ta miłość jest patologiczna jakaś...

...do programowania.

Chodzę, siadam, wstaję, klnę, wracam, myślę, nie mogę przestać, znowu wstaję, łażę, kombinuję, znajduję chwilowe ukojenie w odkrytym algorytmie wyszukiwania brakującej liczby i znów trafiam na chłód, ścianę, barierę, niechęć programu do odwzajemnienia mojej miłości, więc znów...

...chodzę, siadam, wstaję, klnę, wracam, myślę, nie mogę przestać, znowu wstaję, łażę, kombinuję....

To jakieś chore jest. Dysfunkcja emocjonalna. Choroba psychiczna. Czy coś...

wtorek, 20 września 2016

ETeacher czyli English Teacher

Córa zaczęła naukę w szkole podstawowej, w klasie dwujęzycznej. No to tatko zabrał się do tworzenia oprogramowania celem powtarzania i utrwalania słówek z książki... Efekt, jaki jest, każdy widzi...


niedziela, 11 września 2016

GameBook Creator - turlanie kością po paragrafach...

Aplikacja nabiera rumieńców. Na tym etapie dodałem (z pewnym trudem) ładowanie zawartości Dialogu z pliku fxml. Ponad to jest też mieszanie niezafixowanych paragrafów.




A tak wygląda to w praktyce:





G



czwartek, 25 sierpnia 2016

GameBook Creator - nowe otwarcie

W ramach odpoczynku od HCRegFX zacząłem robić GBC, czyli gamebook creatora. Wzoruję się na gui dwóch projektów tego typu, czyli na

LibroGameCreator oraz GameBook Authoring Tool.

Oczywiście każdy ma swoje plusy i minusy. Część funkcjonalności jest dla mnie jeszcze nieosiągalna, ale raduje mnie fakt, że mogę sobie sam zakodować narzędzie, którego będę używał. Innymi słowy - robię program pod siebie (bez skojarzeń).




środa, 17 sierpnia 2016

HCRegistration - system rejestracji pacjentów

Trwają prace nad projektem pokazowym w JavaFX + Hibernate (docelowo także wersja web - JSP).
Na razie niemal działający system logowania z prostą (póki co) walidacją usera.



G

czwartek, 21 lipca 2016

Enigmator w wersji dla JavaFX



Trwają prace nad wersją Enigmatora, wykorzystującą JavaFX. W dużym skrócie - FX (poza brakiem sensownej dokumentacji dla początkujących) wymiata. Kierunek rozwoju przypomina rozwiązania z Android Studio (wypchnięcie struktury do pliku xml).
Co prawda FX korzysta z CSS, co też jest dobrym rozwiązaniem, a AS trzyma się xml, ale jest dobrze.
Ten sam program znacząco ograniczył mi ilość klas w projekcie przy wykorzystaniu FX...
Jest dobrze. (tylko dokumentacji porządnej brak...)...
G

poniedziałek, 11 lipca 2016

mysql-connector - error TimeZone

W repo mavena czy szerzej, w bibliotece mysql-connector jest zdaje się bug jakiś..
Tak czy inaczej, wyskakuje problem Time Zone...


Rozwiazaniem jest dodanie sporego kawałka kodu...
jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

W przypadku plików xml należy podmienic & na &

Wygląda dziwnie. Ciekawe, kiedy ograną ten temat...
G

czwartek, 7 lipca 2016

Enigmator - wersja rozwojowa

W ramach ogarniania Swing'a w tym tygodniu postanowiłem zrobić prostą aplikację, o której myślałem przez ostanie kilka lat (że warto byłoby mieć własną taką).


Prosta zasada działania oraz niewielka ilość kodu sugerują, że będzie z tego jakiś tutorial na YT.
Może wkrótce..., jak program osiągnie poziom RC lub RTM.

G.


środa, 29 czerwca 2016

#20 Java - wstęp do Springa




Zagajenie springa.

W ramach ćwiczeń i rozwoju osobistego zacząłem zgłębiać Spring'a. Na początek proste odczytywanie danych z plików konfiguracyjnych.

OrcUnit.java
package com.grze.orcs;

piątek, 3 czerwca 2016

Android Developer - początki


Mówią, że nawet najdłuższa droga zaczyna się od pierwszego kroku. Najważniejsze, by krok ten był we właściwą stronę.

Jedną z ważnych cech urządzeń mobilnych jest ich... obrotowość. Problem polega więc na tym, by aplikacja reagowała w jakiś sensowny sposób na zmiany położenia urządzenia. Najprostrzy przykład to zamiana tekstu, zależnie od położenia.

MainActiviti.java

public class MainActivity extends AppCompatActivity {

piątek, 18 marca 2016

Arkanoids - left or right

Dzisiaj mała ciekawostka algorytmiczna, którą gdzieś, kiedyś znalazłem. Mianowicie - w przypadku takich gier, jak Arkanoid czy jakiś Allien Invasion, czy inne, w której nasz statek porusza się na boki po ograniczonej polem gry przestrzeni, użycie prostego if-a, sprawdzającego położenie względem boków jest nieefektywne.

Trafiło mi się to w trakcie ćwiczeń nad podobną gierką. Miałem m.in. takie zmienne, jak:
- położenie obiektu
- granice canvasa
- speed.

Kiedy obiekt jest na pozycji np. 1, i ma prędkość -7, to w następnej iteracji powinien znaleźć sie na -6. If teoretycznie zablokuje taką sytuację, ale niestety, bedzie to widać w postaci efektu "tłuczenia" się o barierkę (jak to inaczej sensownie napisać :-) ). Oczywiście będzie to też uzależnione od prędkości odświeżania itp.

Zdecydowanie lepszym rozwiązaniem jest uzależnienie położenia obiektu (obliczonego z wyprzedzeniem), od zwracanej wartości. Jak wygląda taki myk i kod doniego w przypadku JS?

paddleX = Math.max(0, Math.min(paddleX+paddleSpeed, 
      canvas.width-paddleWidth));


Ta linijka akurat definiuje położenie paletki Arkanoida, gdzie paddleX to współrzędne poziome, paddleSpeed to prędkość, a paddleWith to oczywiście szerokość.

W tym konkretnym wypadku nie zaimplementowałem badania kierunku ruchu, co wymusza zastosowanie drugiej linii z ujemnym paddleSpeed. Niemniej idea jest ta sama.


paddleX = Math.max(0, Math.min(paddleX-paddleSpeed,
      canvas.width-paddleWidth));

Zależnie od położenia obiektu zwracamy odpowiednią wartość, która staje się jego współrzędną.

czwartek, 3 marca 2016

Fizz Buzz - test



Przeglądając sobie filmik #DamianWielgosik na temat wejścia we frontend na YT dowiedziałem się o zadaniu programistycznym, w zasadzie algorytmie "testowym", którego podobno wiele osób aspirujących nie jest w stanie zakodować.

Chodzi o Fizz Buzz. Na blogu Codding Horror czytam, że

An example of a Fizz-Buzz question is the following:
Write a program that prints the numbers from 1 to 100. But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz". For numbers which are multiples of both three and five print "FizzBuzz".
Most good programmers should be able to write out on paper a program which does this in a under a couple of minutes. Want to know something scary? The majority of comp sci graduates can't. I've also seen self-proclaimed senior programmers take more than 10-15 minutes to write a solution.

Postanowiłem natychmiast zmierzyć się z tym problemem. Zajął mi całe... 3-5 minut, chociaż naturalnie miałem ten komfort, że mogłem skompilować raz czy dwa, by sprawdzić działanie kodu, który u mnie wygląda tak:



Lub, jak kto woli, tekstem:

public class FizzBuzz {

 public FizzBuzz() {
  
  for (int i=1; i<101; i++) {
   
   if ((i%3)==0 && (i%5)==0) {
    System.out.println(i + " Fizz Buzz");
   } else if ((i%3)==0) {
    System.out.println(i + " Fizz");
   } else if ((i%5)==0) {
    System.out.println(i + " Buzz");
   } else System.out.println(i);   
  }  
 }
 
}

Wynik działania:

1
2
3 Fizz
4
5 Buzz
6 Fizz
7
8
9 Fizz
10 Buzz
11
12 Fizz
13

wtorek, 23 lutego 2016

Zadania testowe dla hardkoderów - praca

Dostałem ostatnio zadania testowe z jednej z firm na stanowisko praktykanckie. Z przykrością stwierdzam, że poziom był relatywnie wysoki, jak dla początkującego. Nie ujawniam szczegółów zadań, ani firmy, bo zaznaczyłem fistaszek pod obietnicą zachowania tajemnicy.

Niemniej zadania z grubsza dotyczyły operacji na tablicach jednowymiarowych. W skrócie obliczenia dotyczące danych w tablicach. Ot, algorytmika.
Na 5 zadań było raptem 150 minut. Smutne, ale nie dałem rady. Na razie... Przyjdzie czas - dam radę. W mojej ocenie, byłbym w stanie zrobić co najmniej 3 z nich. Ale nie w 2 godziny, a w dwa tygodnie. Może nie codziennie, ale po godzinie, dwie dziennie. I wreszcie dałbym radę. Niestety, test miał ograniczenie czasowe... Szkoda.

Post piszę jednak w innym celu. Mianowicie moje przemyślenia młodego programisty są takie, że dość abstrakcyjne testy służą chyba tylko wykazaniu się w logicznym myśleniu. Podejrzewam, że w codziennej pracy programisty raczej takie problemy nie występują zbyt często.

Niemniej postanowiłem dołączyć (powrócić) do mojego zestawu rzeczy do nauczenia - zestaw problemów algorytmicznych. Uznałem bowiem, że biegłość w operowaniu na tablicach, czy w ogóle algorytmach różnych, uzyskać można wyłącznie poprzez nieustanne ćwiczenia.

Mam pewne tajemne źródło kilkudziesięciu problemów algorytmicznych - czas do niego wrócić...

Pierwszym przykładem jest tzw. problem 100 drzwi. Polega on na tym, iż:
"mamy 100 zamkniętych drzwi. W każym przebiegu zmieniamy ich stan otwarte/zamknięte. W każdym przebiegu zwiększamy skok o 1. Czyli w drugim przebiegu zaczynamy od 1., ale następne to co drugie, potem co trzecie itp... Jaki stan drzwi będzie po 100 przebiegach.

Moja propozycja - najprostsza, czyli nie optymalizowana wygląda tak:

package pakiet;

public class Doors100 {

 private boolean[] doors = new boolean[101];
 private int[] visits = new int[101];
 public void countDoors () {
  
  for (boolean door : doors) {
   door = false;   
  }
  
  for (int visit : visits) {
   visit = 0;
  }
  
  for (int i=1; i<101; i++) {  
   for (int j=1; j<101; j+=i) {
    
    doors[j] = (doors[j]) ? false : true;
    visits[j]++;
    
   }
  } 
  
  for (int i=1; i<101; i++) {
   System.out.println(i + " " + doors[i] + " " + visits[i]);
  }

 }
 
}



Wynikiem jest listing (lp., stan, ilość zmian):

1 false 100
2 true 1
3 false 2
4 false 2
5 true 3
6 false 2
7 false 4
8 false 2
9 false 4
10 true 3
11 false 4
12 false 2
13 false 6
14 false 2
15 false 4
16 false 4
17 true 5
18 false 2
19 false 6
20 false 2
21 false 6
22 false 4
23 false 4
24 false 2
25 false 8
26 true 3
27 false 4
28 false 4
29 false 6
30 false 2
31 false 8
32 false 2
33 false 6
34 false 4
35 false 4
36 false 4
37 true 9
38 false 2
39 false 4
40 false 4
41 false 8
42 false 2
43 false 8
44 false 2
45 false 6
46 false 6
47 false 4
48 false 2
49 false 10
50 true 3
51 false 6
52 false 4
53 false 6
54 false 2
55 false 8
56 false 4
57 false 8
58 false 4
59 false 4
60 false 2
61 false 12
62 false 2
63 false 4
64 false 6
65 true 7
66 false 4
67 false 8
68 false 2
69 false 6
70 false 4
71 false 8
72 false 2
73 false 12
74 false 2
75 false 4
76 false 6
77 false 6
78 false 4
79 false 8
80 false 2
81 false 10
82 true 5
83 false 4
84 false 2
85 false 12
86 false 4
87 false 4
88 false 4
89 false 8
90 false 2
91 false 12
92 false 4
93 false 6
94 false 4
95 false 4
96 false 4
97 false 12
98 false 2
99 false 6
100 false 6


False to zamknięte, true - otwarte. Naturalnie widać jakiś pattern w tym wyniku. Generalnie ostatecznie co nieparzyste drzwi są otwarte. Czyli 1, 3, 5, 7... itd. Odległości między drzwiami otwartymi wzrastają natomiast parzyście, czyli 2, 4, 6, 8... itd.
Pozostaje opracować wzór na taki ciąg i, znając wynik, podstawić go do zoptymalizowanego kodu.




wtorek, 16 lutego 2016

#1 - OCA 1Z0-808 Java Basics

Przygotowując się do potencjalnych rozmów wstępnych o jakąś pracę z zakresu Javy, postanowiłem posegregować swoją wiedzę na temat J., przerabiając źródło. Czyli tematykę egzaminów Oracl'a z zakresu Javy. Konkretnie 1Z0-808, a potem i 809.

Co prawda na razie nie inwestuję w kwity, ale wiedzę można sprawdzić oraz nabyć drogą kucia i testowania. Z góry zaznaczam, że wszelkie dane to moje aktualne widzimisię na temat Javy, i nie może być traktowane, jako źródło informacji.

Pierwszy zestaw topiców to tzw. Java Basic, a więc

Java Basics 
  • Define the scope of variables 
  • Define the structure of a Java class
  • Create executable Java applications with a main method; run a Java program from the command line; including console output.
  • Import other Java packages to make them accessible in your code
  • Compare and contrast the features and components of Java such as: platform independence, object orientation, encapsulation, etc.


Zaczynamy...