Kontrola biletów Wrocław

Mieszkańcy Wrocławia! Tak właściwie, to dla Was jest skierowany ten wpis. Chciałbym mianowicie podzielić się swoim ostatnim dziełem jakim jest aplikacja „Kontrola biletów Wrocław”. Aplikacja nie jest szczególnie rozbudowana, ale wydaje mi się, że przydatna. Pobiera ze strony wroclaw.pl dane o aktualnych kontrolach MPK i prezentuje je w ładnej formie. Myślę, że każdemu taka informacja może się przydać 😉 Oto jak działa:
A tutaj link skąd można ją pobrać
Mam nadzieję, że się przyda, ja na pewno będę z niej korzystał 😉
Pozdrawiam!

Zrobię to, czyli motywacja programisty

Słyszeliście kiedyś, że nie mówi się: „postaram się”, tylko „zrobię to!”. Pierwsze stwierdzenie zawiera taki mały sabotaż, że jeśli coś pójdzie nie tak, to trudno, mogę powiedzieć, że się starałem. Drugie nie pozostawia miejsca na interpretację, po prostu wykonam to zadanie, choćby nie wiem jak było trudne. Jak mówi Will Smith: „Jedyna różnica między nami jest taka, że jeżeli wejdziemy na bieżnie, to albo Ty zejdziesz z niej pierwszy, albo ja na niej umrę”.

Napiszę dzisiaj co nie co o swoim podejściu do zagadnienia motywacji, planowania, ponieważ są one tak naprawdę przynajmniej w moim przypadku: połączone. Co tzn? Że najbardziej zmotywowany jestem, kiedy coś wykonuję według planu. Najlepiej, żebym miał zadanie nie dłuższe niż pół godziny, dzięki temu, mogę je sobie odznaczyć na liście i przejść do następnego, widzę, że ich ubywa, że coś się zmienia. Ważne jest, aby lista zadań na każdy dzień była wykonywalna. Kiedy pracowaliśmy, ale zostało nam jeszcze mnóstwo zadań, na które brakło czasu, wtedy poziom motywacji się obniża. Kiedy o ustalonej godzinie skończymy wszystko i możemy zasiąść i poczytaj kawałek dobrej książki, o tak, to są dobre dni.
Jednak nawet przy takim planowaniu i trzymaniu się zadań, zdarza się, że mamy obsuwę, bo coś wypadnie, albo po prostu nam się nie chce.. Co wtedy? Na to również znalazł się cytat: „kiedy nie masz czasu, znajdź sobie dodatkowe zajęcie”. Dla mnie takim dniem, w którym spadała motywacja był czwartek, zauważyłem to po sobie, taki już jestem. Czwartki są straszne. Co pomogło? Dołączenie do grupy developerów i zobowiązanie się do dostarczenia kawałka kodu co czwartek. Teraz nie ma bólu, obiecałem, jestem im to winny. No dobra, ale co, jeśli motywacja spada w ciągu tygodnia? Ano tak, po pierwsze, ZAWSZE po pracy mam pół godziny przerwy, kiedy leżę i czytam, to jest moje pół godziny, moja regeneracja, nie odbiorę wtedy telefonu, nie sprawdzę maila, nie ma mnie. A potem biorę się za swoje projekty, które realizuję po za pracą. W gorszych momentach pomagają motywacyjne wykłady, bądź cytaty, w sieci trochę tego jest. Mam też ulubionych autorów, z polaków to np. Mateusz Grzesiak, Nikodem Marszałek. Do tego kanały na yt:
People are awesome
Architekci umysłu
Jest tego oczywiście więcej, ale te są chyba najczęściej używane. Ale żeby nie było, rozrywki najczęściej nie planuję. Jeśli zdecyduję, że gdzieś wychodzę, to najczęściej bawimy się spontanicznie. Warto jeszcze chyba wspomnieć, czego używam do planowania, mianowicie jest to narzędzie:
ToDoIst
Miałem kilka przygód z różnym narzędziami, to zostało jak najlepsze.

Na koniec najważniejsza rzecz. Trzeba naprawdę kochać to co się robi, a także mieć konkretny cel. Wtedy jest zdecydowanie łatwiej, chce się tego, ponieważ wiadomo gdzie człowiek dojdzie. Mam głęboko na komputerze zapisanego siebie, jaki będę za 5 lat. I zrobię to, będę właśnie taki.

Pozdrawiam!

Kurs programowania java na Kenis.pl

PSsssst – poniższe informacje są już dość mocno nieaktualne, po najświeższe kursy i wszystkie poprzednie, (płatne i darmowe) zapraszam tutaj: https://kursyandroid.pl/


Każdy kiedyś zaczynał. Dlatego chciałbym podzielić się przygotowanym przeze mnie we współpracy z kenis.pl kursem programowania. Kurs jest o javie, od instalacji środowiska, przez obiektowość, kończąc na nowościach w javie 8. Kurs jest dostępny za darmo, całkowicie i absolutnie, co zresztą jest ideą Kenis, żeby wiedza była była dostępna dla każdego. Nie przedłużam i podaję link do kursu:
Kurs programowania java na Kenis.pl

Podaję jeszcze link do githuba z zadaniami:
github KenisKursJava

Zapraszam serdecznie!

Pozdrawiam!

Animacja zmiany activity

Zauważyliście, że różni producenci stosują czasem różne animacje nowego activity w aplikacjach? Dzisiaj pokażę, jak ujednolicić animację, zwłaszcza wtedy kiedy tworzymy jakiś kreator, jest ona całkiem intuicyjna, zresztą, sami zobaczcie:

Dzisiejszy wpis będzie opowiadał o utworzeniu tej animacji od zera w nowym projekcie, tak aby początkujący poradzili sobie bez problemu, z kolei pro users, znajdą to, czego potrzebują.
Zaczynamy od utworzenia nowego projektu w AndroidStudio, ja pierwszą aktywność nazwałem FirstActivity.

public class FirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
    }

}

Po utworzeniu projektu, tworzymy następne Activity klikając File/New/Activity/Blank Activity. Nazwałem je SecondActivity. Kod jest analogiczny jak powyżej, oczywiście inna nazwa klasy i inny parametr metody setContentView. 

Teraz przechodzimy do layoutu i dodajemy, można przez przeciąganie, button. Layout dla pierwszego Activity wygląda tak:

<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
    xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent”
    android:layout_height=”match_parent” android:paddingLeft=”@dimen/activity_horizontal_margin”
    android:paddingRight=”@dimen/activity_horizontal_margin”
    android:paddingTop=”@dimen/activity_vertical_margin”
    android:paddingBottom=”@dimen/activity_vertical_margin” tools:context=”.FirstActivity”>

    <TextView android:text=”@string/hello_world” android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:id=”@+id/textView2″ />

    <Button
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:text=”@string/next”
        android:id=”@+id/nextBtn”
        android:onClick=”nextClick”
        android:layout_below=”@+id/textView2″
        android:layout_alignParentLeft=”true”
        android:layout_alignParentStart=”true” />

</RelativeLayout>

Layout dla drugiego Activity, jest oczywiście analogiczny, tylko tutaj zamiast next, mamy prev. Czyli pod wywołaniami onClick znajdują się metody nextClick i prevClick. Oto jak je zaimplementować:

public void nextClick(View view) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivity(intent);
        overridePendingTransition(0, 0);
    }

Metoda overridePendingTransition, to właśnie ta metoda, która odpowiada za animacje pomiędzy Activity. Dokumentacja znajduje się tutaj:
overridePendingTransition doc
Jak widzimy, pod parametrami enter anim oraz exit anim mamy w tym momencie zero i zero. Oznacza to tyle, że nie będzie żadnej animacji przejścia, czyli taki oto efekt:

Ok, a teraz dodamy animacje przejścia ekranu.
Klikamy na folder res, wybieramy new i android resource directory. Nazwiemy sobie nasz katalog anim. Następnie, tworzymy w tym katalogu 4 pliki:

left_in.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<set xmlns:android=”http://schemas.android.com/apk/res/android”
     android:interpolator=”@android:anim/linear_interpolator”>
    <translate
        android:fromXDelta=”0″
        android:toXDelta=”100%p”
        android:duration=”300″/>
</set>  

left_out.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<set xmlns:android=”http://schemas.android.com/apk/res/android”
     android:interpolator=”@android:anim/linear_interpolator”>
    <translate
        android:fromXDelta=”0″
        android:toXDelta=”-100%p”
        android:duration=”300″/>
</set> 

right_in.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<set xmlns:android=”http://schemas.android.com/apk/res/android”
     android:interpolator=”@android:anim/linear_interpolator”>
    <translate
        android:fromXDelta=”100%p”
        android:toXDelta=”0″
        android:duration=”300″/>
</set>  

right_out.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<set xmlns:android=”http://schemas.android.com/apk/res/android”
     android:interpolator=”@android:anim/linear_interpolator”>
    <translate
        android:fromXDelta=”-100%p”
        android:toXDelta=”0″
        android:duration=”300″/>
</set> 

Teraz tak, w metodzie nextClick zamieniamy parametry na:
overridePendingTransition(R.anim.right_in, R.anim.left_out);
Z kolei w metodzie prevClick:
overridePendingTransition(R.anim.right_out, R.anim.left_in);

I już, gotowe 😉 Animacja działa, możemy ją zwolnić lub przyspieszyć parametrem duration, u mnie trwa 300ms. Albo zmienić sposób rozchodzenia się obrazów metodami fromX oraz toX.
Podaję jeszcze link na githuba z tą właśnie animacją:
github migellal

Pozdrawiam!

Notepad++ czyli narzędzie oszczędzające cenny czas

Dostałem nie tak dawno w pracy zadanie, polegające na wyciągnięciu kilkunastu, kilkudziesięciu zdań z pliku xml. Plik miał jakieś wartości przed zdaniem, miał jakieś wartości po zdaniu, miałem wyciągać tylko te zdania, w których linii występowało <UserTask>. Mogłem oczywiście napisać odpowiedni parser, co zajęło by nie wiem, jakąś pewnie godzinę. Tylko tak naprawdę po co, skoro mamy idealne narzędzie do tego typu przekształceń tekstowych. Oto opis jak wykonywać tego typu zadania:

Skrótem klawiszowym ctrl+h otwieramy zaawansowane narzędzie zamieniania, w którym zaznaczamy wyrażenia regularne.
Dokumentacja wyrażeń regularnych znajduje się tutaj:
Notepad++ regular expressions
A tak wygląda polecenie zamiany wszystkich linii nie zawierających danego tekstu
(?!^.*usertask.*$)^.+
Zamieniamy oczywiście na pusty tekst. W miejsce usertask wpisujemy tekst, który jest kluczem do linii, które mają zostać nieruszone.
Polecenie zamiany wszystkiego przed danym tekstem, w każdej linii:
.*text
Zamieniamy również na pusty tekst.
Polecenie zamiany wszystkiego za danym tekstem, w każdej linii:
[text].*
Tutaj również na pusty tekst. Text to słowo klucz.

Okej mamy już wszystkie zdania, ale każde w nowej linii, niejednokrotnie z kilkoma liniami przerwy, a chcielibyśmy je po przecinku. Oto, jak to się robi:
Edycja/Operacje na liniach/Usuwanie pustych linii.
Teraz wystarczy zamienić znak nowej linii na przecinek. W tym celu zaznaczamy rozszerzony, zamiast wyrażenia regularne i wykonujemy taką operację:
rn
Zamieniamy na przecinek, albo to, czego potrzebujemy. I już, zadanie rozwiązane.
Teraz, do każdego pliku xml mamy takie 5 operacji.

Można szybciej 😉
Przed rozpoczęciem tych wszystkich operacji klikamy: Makra/Rozpocznij nagrywanie.
Wykonujemy wszystkie kroki.
Po zakończeniu klikamy: Makra/Zakończ nagrywanie.
Dla następnego pliku wystarczy już tylko Makra/Odtwórz
Zadanie rozwiązane.

Opowiem teraz dwa słowa o wyrażeniu rn. Tak naprawdę oznacza ono przejście do nowej linii, najprościej mówiąc enter. Symbol r to z angielskiego carriage return, i pochodzi jeszcze z czasów, kiedy zamiast ekranów były drukarki. Symbol ten oznaczał przejście na wysokość pierwszego znaku od lewej strony w drukarce, czyli do początku linii. Z kolei symbol n, czyli new line, to po prostu zejście poziom niżej. Jeżeli spotkalibyście się z określeniem CRLF to oznacza ono to samo. Nie wszystkie systemy jednak używają tego standardu, czasem wystarcza sam CR, czasem sam LF.

To tyle ciekawostek na dziś, mam nadzieję, że przydatny lifehack o notepadzie++! 😉

Pozdrawiam!

TextInputLayout, czyli animowany EditText

To już kolejny wpis o bibliotece:
Android Design Support Library
Dzisiaj chciałem skupić się na bardzo ładnie animowanym polu typu EditText, a mianowicie:

Prawda, że ładne? Zwłaszcza, że możemy dowolnie dobrać sobie te kolory. Ale do kodu. Aby uzyskać taki efekt potrzebujemy obudować nasze pole EditText czymś takim:

<android.support.design.widget.TextInputLayout
        android:layout_width=”match_parent”
        android:layout_height=”wrap_content”
        android:theme=”@style/TextInputTheme”
        android:id=”@+id/usernameTIL” >

<EditText
            android:id=”@+id/usernameET”
            android:layout_width=”match_parent”
            android:layout_height=”wrap_content”
            android:textSize=”23sp”
            android:hint=”@string/username” />

</android.support.design.widget.TextInputLayout>

Oczywiście, o czym wspominałem w poprzednim wpisie, musimy dodać bibliotekę do gradle:

compile 'com.android.support:design:22.2.0′

Kod który wkleiłem wygląda jakby opisywał się sam, więc nie będę się nad nim rozwodził, ale pokażę w jaki sposób ustawić sobie kolory na takie, które nas interesują i pasują do projektu. Wszystko kryje w pliku styles.xml, dodajemy tam:

<style name=”TextInputTheme” parent=”TextAppearance.AppCompat”>
        <item name=”android:textColorHint”>@color/primary</item>
        <item name=”colorAccent”>@color/accent</item>
        <item name=”colorControlNormal”>@color/controlNormal</item>
        <item name=”colorControlActivated”>@color/controlActivated</item>
    </style>

Tutaj również wszystko jest samo-opisowe, a jeśli nie jest, to zapraszam do dokumentacji, bądź samodzielnych prób. Te mają to do siebie, że czasem możemy zmienić inny element niż chcieliśmy, ale w efekcie osiągnąć coś innego, ciekawszego niż planowaliśmy. Przynajmniej mi, czasem się tak zdarza.

Ostatnią rzeczą o której chciałem powiedzieć jest efekt uzyskany po wykonaniu po stronie javy tego kodu:

setErrorEnabled(true);
setError(getString(R.string.error_message));

Dzięki temu, możemy ustalić, aby wymagane było uzupełnienie naszego pola. W przypadku jeśli ktoś przejdzie do następnego elementu, zostanie w polu EditText wyświetlona informacja zawarta w stringu error_message. Tutaj również pojawia się ładna animacja, zresztą, sprawdźcie sami.

Pozdrawiam!

Floating Action Button dzięki Android Design Support Library

Będzie dzisiaj o wyglądzie aplikacji na Android, a konkretnie bibliotece:
Android Design Support Library
Chciało by się powiedzieć: wreszcie. Google chciało promować Material Design, a na urządzeniach starszych niż Lollipop nie dało się go tak łatwo zaimplementować. Z sytuacją walczyli niezależni developerzy, tworząc biblioteki pozwalające na prostszą implementację niektórych elementów, ale co biblioteka od Google, to jednak od Google. Dzisiaj właśnie korzystałem z niej pierwszy raz do utworzenia czegoś, na co w skrócie mówi się FAB, czyli Floating Action Button. Chodzi konkretnie o ten button:

Mała przydatna rzecz, najczęściej po prawej stronie na dole. Rzuca ładny cień, jak widać. Animuje się zapełniając, nazywa się to ripple effect. Ale do kodu, aby zacząć korzystać z biblioteki musimy dodać ją do pliku build.gradle
compile 'com.android.support:design:22.2.0′

Mamy pierwszą niezaprzeczalną zaletę, nie wszystkie niezależne biblioteki dały się dodać do projektu w ten sposób, czasem trzeba było się nakombinować…..
Pokazuję teraz w jaki sposób utworzyć ten przycisk:

<android.support.design.widget.FloatingActionButton
        android:id=”@+id/fab”
        android:layout_width=”56dp”
        android:layout_height=”56dp”
        android:layout_gravity=”bottom|end”
        android:layout_margin=”32dp”
        android:src=”@drawable/ic_add”
        android:onClick=”plusClick”
        app:elevation=”10dp”
        app:borderWidth=”0dp” />

A do nagłówka z plikiem zawierającym wygląd naszego ekranu, który zawiera nasz przycisk, dodajemy:

xmlns:app=”http://schemas.android.com/apk/res-auto”

I już, gotowe, nasz przycisk wygląda jak by pięknie unosił się nad powierzchnią. Prawda, że proste i przyjemne? Myślę, że elementy w designie opisują same siebie swoimi nazwami, jeśli coś jest nie jasne, to zachęcam do zabawy, czyli zmieniania wartości i patrzenia na wyniki, chyba w ten sposób tworzy się najdoskonalszy design. A kto nie lubi, zapraszam do zapoznania się z dokumentacją. Mogę jeszcze pokazać dwa ciekawe parametry:

app:fabSize=”normal”
app:rippleColor=””

FabSize może przyjąć jeszcze parametr mini, z kolei rippleColor to kolor efektu zapełniania przycisku. Aby najlepiej go dojrzeć można przytrzymać placem przycisk, wtedy ten powoli się zapełni. Jeśli skopiowaliście kod, zaczniecie się zastanawiać skąd wziąć ten parametr src, czyli element znajdujący się w środku (na rysunku jest to gwiazdka), najczęściej jednak potrzebujemy +. Już podaję link:
Znajdujemy tam to co nam aktualnie potrzebne i pobieramy. Teraz mamy już wszystko, aby tworzyć zgodne z wytycznymi Google przyciski typu fab w naszej aplikacji.
Pozdrawiam!

Cześć!

Mam na imię Michał i jestem początkującym programistą. W styczniu obroniłem tytuł inżyniera, od jakichś dwóch miesięcy pracuje, jeszcze krócej mieszkam we Wrocławiu. Swoją przygodę z programowaniem zacząłem na studiach, wcześniej nie do końca wiedziałem co chcę robić. Uczyłem się trochę C++, potem przesiadłem się na Javę, aby w końcu najbardziej jarać się Androidem. Nie pracuję w Androidzie, aktualnie pracuję w technologii GWT. To by było na tyle z mojej krótkiej historii.

Skąd pomysł, żeby zacząć pisać bloga? Ano z przedwczorajszej prezentacji, tak konkretnie to byłem na spotkaniu Software Talks: Java na ławę.
http://softwaretalks.pl/events/event/software-talks-java-na-lawe-wroclaw/
Wykłady były ciekawe, poznałem Tomasza Zielińskiego, twórcę Transportoida. Ale to Michał Bartyzel podczas swojej prezentacji zwrócił na coś moją uwagę. A mianowicie, myślałem już o tym wcześniej. Po przeczytaniu jakiejś książki, poznaniu nowej technologii, napisaniu kawałka kodu, jak dużo zostaje w głowie, a ile się ulatnia? I jak można temu zapobiec? Najlepiej poprzez syntezę wiedzy, czyli przemyślenie i ponowne wytłumaczenie, po swojemu, tego, czego się nauczyło. Żona przede mną ucieka, kiedy chcę jej tłumaczyć aspekty programistyczne 😉 Stąd właśnie pomysł, aby tym co sobie zsyntetyzuję, podzielić się ze społecznością. Myślę, że będzie to z obopólną korzyścią.

Jakich treści można się tutaj spodziewać? Myślę, że na każdy temat. Oczywiście będę starał się krążyć wokół tematów programistycznych. Ale nie tylko, mogą pojawić się lifechacki, które po prostu uwielbiam, a także jakieś opinie na temat książek. Może trochę nowości, ze świata programistów. Będę starał się to wszystko uporządkować jakimiś tagami, zobaczymy na ile mi się to uda. Mam nadzieję, że będzie ciekawie i pouczającą. W tym miejscu zapraszam również do aktywności i komentowania, będzie to dla mnie dodatkowy impuls, aby wrzucać tutaj jeszcze więcej treści.

Tyle tytułem wstępu, pozdrawiam i czekajcie na wpisy!