<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Zeyomir&#039;s Blog</title>
	<atom:link href="http://mzawisza.pl/feed/" rel="self" type="application/rss+xml" />
	<link>http://mzawisza.pl</link>
	<description>Bo piękniej jest wiedzieć coś o wszystkim...</description>
	<lastBuildDate>Tue, 27 Jan 2015 01:22:24 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.4.10</generator>
	<item>
		<title>JuiceSSH rozdaje licencje Pro za darmo</title>
		<link>http://mzawisza.pl/inne/juicessh-rozdaje-licencje-pro-za-darmo/</link>
		<pubDate>Mon, 17 Mar 2014 07:56:09 +0000</pubDate>
		<dc:creator><![CDATA[zeyomir]]></dc:creator>
				<category><![CDATA[Inne]]></category>

		<guid isPermaLink="false">http://mzawisza.pl/?p=721</guid>
		<description><![CDATA[Z okazji 500.000 użytkowników, JuiceSSH (świetny klient ssh na androida) rozdaje licencje PRO za darmo. Promocja trwa tylko do wtorku (18 marca 2014), do południa naszego czasu. Wystarczy wejść na stronę promocji  i podać maila którego mamy skonfigurowanego na naszym urządzeniu (ten sam mail z którego korzystamy w Google Play). Licencja jest dożywotnia, na wszystkie urządzenia powiązane z [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">Z okazji 500.000 użytkowników, <a href="https://play.google.com/store/apps/details?id=com.sonelli.juicessh">JuiceSSH </a>(świetny klient ssh na androida) rozdaje licencje PRO za darmo. Promocja trwa tylko do wtorku (18 marca 2014), do południa naszego czasu.</p>
<p style="text-align: justify;">Wystarczy wejść na stronę <a href="https://sonelli.com/500k">promocji</a>  i podać maila którego mamy skonfigurowanego na naszym urządzeniu (ten sam mail z którego korzystamy w Google Play). Licencja jest dożywotnia, na wszystkie urządzenia powiązane z naszym kontem.</p>
<p style="text-align: justify;">Ja już skorzystałem :).</p>
]]></content:encoded>
			</item>
		<item>
		<title>OpenCachingFun ma już &gt;500 pobrań!</title>
		<link>http://mzawisza.pl/java/opencachingfun-ma-juz-500-pobran/</link>
		<pubDate>Sat, 08 Mar 2014 14:22:21 +0000</pubDate>
		<dc:creator><![CDATA[zeyomir]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[opencachingfun]]></category>

		<guid isPermaLink="false">http://mzawisza.pl/?p=718</guid>
		<description><![CDATA[Właśnie dziś, OCFun przekroczyło magiczną (przynajmniej dla mnie) barierę 500 pobrań w sklepie Google Play. Z tych 500, 230 to aktywne instalacje. Biorąc pod uwagę dość wąskie grono odbiorców (ludzie bawiący się w geocaching, korzystający z serwisu opencaching.pl, posiadający smartfona z androidem i nieposiadający dedykowanego urządzenia do nawigacji turystycznej) oraz istnienie "znanej, lubianej i wszystkomającej" [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Właśnie dziś, OCFun przekroczyło magiczną (przynajmniej dla mnie) barierę <strong>500</strong> pobrań w sklepie Google Play. Z tych 500, <strong>230</strong> to aktywne instalacje. <span id="more-718"></span>Biorąc pod uwagę dość wąskie grono odbiorców (ludzie bawiący się w geocaching, korzystający z serwisu opencaching.pl, posiadający smartfona z androidem i nieposiadający dedykowanego urządzenia do nawigacji turystycznej) oraz istnienie "znanej, lubianej i wszystkomającej" konkurencji- jest to dla mnie spory sukces.</p>
<p>W sumie to dopiero po publikacji ostatniej wersji, liczba pobrań zaczęła zauważalnie i regularnie rosnąć. Jakie zmiany przyniosła? Przede wszystkim doszła pełna obsługa logbooków (dodawanie logów i wysyłanie ich po połączeniu z internetem, ocenianie skrzynek, dodawanie własnych notatek etc).</p>
<p>Szczerze mówiąc, pisząc pierwsze linijki tej aplikacji, nie spodziewałem się, że kiedykolwiek ktokolwiek poza mną będzie z niej korzystał :). Muszę przyznać, że miło jest zobaczyć, jak bardzo się myliłem ;). Takie "wyniki" motywują do dalszej pracy nad projektem (a jeszcze bardziej motywują pozytywne komentarze i oceny w Google Play, więc jeżeli używasz OCFun to <a href="https://play.google.com/store/apps/details?id=com.zeyomir.ocfun">wiesz co masz zrobić</a> <img src="https://s.w.org/images/core/emoji/72x72/1f609.png" alt="&#x1f609;" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ).</p>
]]></content:encoded>
			</item>
		<item>
		<title>Android i maven w jednym stali domu- część 2</title>
		<link>http://mzawisza.pl/java/android-i-maven-w-jednym-stali-domu-czesc-2/</link>
		<pubDate>Fri, 20 Dec 2013 12:54:28 +0000</pubDate>
		<dc:creator><![CDATA[zeyomir]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://mzawisza.pl/?p=684</guid>
		<description><![CDATA[Ok, w poprzedniej części powiedzieliśmy sobie jak zainstalować i skonfigurować mavena, wgraliśmy wszystkie wersje androida do lokalnego repo oraz dodaliśmy mavena do naszego androidowego projektu. W tym wpisie postaram się pokazać "po co nam to wszystko było".  Dodawanie zależności Po pierwsze- dodawanie nowych bibliotek jest teraz bajecznie proste. Szukamy interesującej nas biblioteki w interesującej nas [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">Ok, w poprzedniej części powiedzieliśmy sobie jak zainstalować i skonfigurować mavena, wgraliśmy wszystkie wersje androida do lokalnego repo oraz dodaliśmy mavena do naszego androidowego projektu. W tym wpisie postaram się pokazać "po co nam to wszystko było". <span id="more-684"></span></p>
<h5 style="text-align: justify;">Dodawanie zależności</h5>
<p style="text-align: justify;">Po pierwsze- dodawanie nowych bibliotek jest teraz bajecznie proste. Szukamy interesującej nas biblioteki w interesującej nas wersji na <a href="http://mvnrepository.com/">mvnrepository.com</a> i po prostu dodajemy znaleziony tam odpowiedni wpis w dependencies w naszym pliku <code class="codecolorer text default"><span class="text">pom.xml</span></code>.</p>
<p style="text-align: justify;">Biblioteka zostanie automatycznie pobrana i dołączona do projektu przy następnym wywołaniu <code class="codecolorer text default"><span class="text">mvn clean install</span></code>. Co więcej, zostanie ona skopiowana do naszego lokalnego repo, dzięki czemu przy kolejnych buildach, albo gdy będziemy ją chcieli dołączyć do następnego projektu, nie będziemy jej już pobierać z internetu.</p>
<p style="text-align: justify;">Na przykład aby dodać do naszego projektu genialną bibliotekę joda-time w najnowszej wersji, doklikamy się w końcu na stronę <a href="http://mvnrepository.com/artifact/joda-time/joda-time/2.3">mvnrepository.com/artifact/joda-time/joda-time/2.3</a>, a tam znajdziemy:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;dependency&gt;
	&lt;groupId&gt;joda-time&lt;/groupId&gt;
	&lt;artifactId&gt;joda-time&lt;/artifactId&gt;
	&lt;version&gt;2.3&lt;/version&gt;
&lt;/dependency&gt;
</pre>
<p style="text-align: justify;">
Wklejamy to do naszego <code class="codecolorer text default"><span class="text">pom.xml</span></code> pomiędzy tagi dependencies i gotowe- w IDE wystarczy dać 'reimport maven project' a biblioteka zostanie dołączona i będziemy mogli z niej korzytać.</p>
<p style="text-align: justify;">I wszystko byłoby pięknie, ale... co zrobić, jeśli nie możemy znaleźć biblioteki której potrzebujemy w oficjalnym repo mavena?</p>
<h6 style="text-align: justify;">Ręczne dodawanie bibliotek do lokalnego repozytorium mavena</h6>
<p style="text-align: justify;">Musimy sami dodać taką bibliotekę do lokalnego repozytorium. Są na to 3 sposoby:</p>
<ul style="text-align: justify;">
<li>jeśli biblioteka jest projektem mavenowym i rozpowszechniana jest wraz ze źródłami- wystarczy wejść do katalogu z biblioteką, wydać z konsoli <code class="codecolorer text default"><span class="text">mvn clean install</span></code> i już mamy ją w naszym lokalnym repo. Możemy ją "zlokalizować" używając groupId, artifactId i version z pliku <code class="codecolorer text default"><span class="text">pom.xml</span></code> biblioteki.</li>
<li>jeśli biblioteka jest rozpowszechniana ze źródłami, ale nie jest projektem mavenowym- tutaj sprawa jest cięższa, możemy spróbować zmienić ją w projekt mavenowy i postąpić tak jak w przypadku 1), ale wymaga to jako-takiej znajomości mavena, szczególnie jeśli biblioteka sama posiada jakieś zależności. Łatwiej potraktować ją tak jak w pkt 3).</li>
<li>jeśli biblioteka rozpowszechniana jest jako binarka (jar, apk, cokolwiek)- tu nie mamy dużego wyboru, pozostaje nam "ręcznie" zainstalować daną binarkę w naszym repo. Służy do tego polecenie
<pre class="brush: bash; title: ; notranslate">mvn install:install-file 
    -Dfile=sciezka\do\pliku.jar 
    -DgroupId=com.glowny.pakiet
    -DartifactId=nazwa 
    -Dversion=wersja 
    -Dpackaging=jar
</pre>
<p>Oczywiście "namierzamy ją" w swoim <code class="codecolorer text default"><span class="text">pom.xml</span></code> używając podanego tu pakietu, nazwy i wersji.</li>
</ul>
<h5 style="text-align: justify;"><span style="line-height: 1.5em;">Automatyczna zmiana ustawień/konfiguracji</span></h5>
<p style="text-align: justify;">Jeżeli trzymamy konfiguracje naszej aplikacji w plikach <code class="codecolorer text default"><span class="text">.properties</span></code> (a jeśli nie- to powinniśmy), to możemy zautomatyzować zmianę tej konfiguracji w zależności od profilu w jakim budujemy aplikację. Przydatne, jeśli w aplikacji korzystamy z jakiegoś serwera/konta/kluczy api, które mają wersję testową i produkcyjną.</p>
<p style="text-align: justify;">Wystarczy, że w pliku <code class="codecolorer text default"><span class="text">.properties</span></code> zamiast standardowego</p>
<pre class="brush: plain; title: ; notranslate">wlasciwosc=wartosc</pre>
<p style="text-align: justify;">wpiszemy takiego potworka:</p>
<pre class="brush: plain; title: ; notranslate">wlasciwosc=${klucz}</pre>
<p style="text-align: justify;">a w naszym <code class="codecolorer text default"><span class="text">pom.xml</span></code> dodamy do tagu project tag properties a w nim</p>
<pre class="brush: xml; title: ; notranslate">&lt;klucz&gt;wartosc&lt;/klucz&gt;</pre>
<p style="text-align: justify;">a w tagu build dodamy tag resources a w nim</p>
<pre class="brush: xml; title: ; notranslate">
&lt;resource&gt;
	&lt;directory&gt;src/main/resources&lt;/directory&gt;
	&lt;filtering&gt;true&lt;/filtering&gt;
&lt;/resource&gt;
</pre>
<p style="text-align: justify;">to przy budowaniu, klucz zostanie automatycznie zamieniony na wartość. Droga na około? Skądże! Przydatność tego rozwiązania widać dopiero gdy dodamy do niego profile. Do tagu project należy dodać</p>
<pre class="brush: xml; title: ; notranslate">
&lt;profiles&gt;
        &lt;profile&gt;
            &lt;id&gt;development&lt;/id&gt;
            &lt;activation&gt;
                &lt;activeByDefault&gt;true&lt;/activeByDefault&gt;
            &lt;/activation&gt;
            &lt;properties&gt;
                &lt;klucz1&gt;wartosc dla dev 1&lt;/klucz1&gt;
                &lt;klucz2&gt;wartosc dla dev 2&lt;/klucz2&gt;
            &lt;/properties&gt;
        &lt;/profile&gt;

        &lt;profile&gt;
            &lt;id&gt;release&lt;/id&gt;
            &lt;properties&gt;
                &lt;klucz1&gt;wartosc dla releasu 1&lt;/klucz1&gt;
                &lt;klucz2&gt;wartosc dla releasu 2&lt;/klucz2&gt;
            &lt;/properties&gt;
        &lt;/profile&gt;
&lt;/profiles&gt;
</pre>
<p style="text-align: justify;">
Teraz domyślnie przy <code class="codecolorer text default"><span class="text">mvn clean install</span></code> używane będą wartości z profilu development (oraz te które zadeklarowaliśmy wcześniej, a nie zostały nadpisane w tym profilu). Aby użyć wartości z profilu release wystarczy wykonać <code class="codecolorer text default"><span class="text">mvn clean install -Prelease</span></code>.</p>
<h5 style="text-align: justify;"><span style="line-height: 1.5em;">Maven android plugin</span></h5>
<p style="text-align: justify;"><span style="line-height: 1.5em;">Wszystko co pokazałem do tej pory to tak naprawdę podstawowe użycie mavena. Używając androidowego pluginu do mavena, możemy osiągnąć znacznie więcej.</span></p>
<h6 style="text-align: justify;">Deployowanie</h6>
<p style="text-align: justify;">Wydając komendę <code class="codecolorer text default"><span class="text">mvn android:deploy</span></code> zainstalujemy naszą aplikację na wszystkich dostępnych urządzeniach i emulatorach. Możemy oczywiście zbudować i zdeployować aplikację za jednym zamachem: <code class="codecolorer text default"><span class="text">mvn clean install android:deploy</span></code>.</p>
<h6 style="text-align: justify;">Podpisywanie</h6>
<p style="text-align: justify;">Możemy podpisać naszą aplikację naszym kluczem, tak żeby była gotowa do publikacji w google play. Należy w tym celu dodać konfigurację pluginu jar-signer:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
    &lt;artifactId&gt;maven-jarsigner-plugin&lt;/artifactId&gt;
    &lt;version&gt;1.2&lt;/version&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt;id&gt;signing&lt;/id&gt;
            &lt;goals&gt;
                &lt;goal&gt;sign&lt;/goal&gt;
            &lt;/goals&gt;
            &lt;phase&gt;package&lt;/phase&gt;
            &lt;inherited&gt;true&lt;/inherited&gt;
            &lt;configuration&gt;
                &lt;archiveDirectory&gt;&lt;/archiveDirectory&gt;
                &lt;includes&gt;
                    &lt;include&gt;target/*.apk&lt;/include&gt;
                &lt;/includes&gt;
                &lt;keystore&gt;sciezka/do/pliku/keystore&lt;/keystore&gt;
                &lt;storepass&gt;haslo do keystora&lt;/storepass&gt;
                &lt;keypass&gt;haslo klucza&lt;/keypass&gt;
                &lt;alias&gt;nazwa klucza&lt;/alias&gt;
                &lt;arguments&gt;
                    &lt;argument&gt;-sigalg&lt;/argument&gt;
                    &lt;argument&gt;MD5withRSA&lt;/argument&gt;
                    &lt;argument&gt;-digestalg&lt;/argument&gt;
                    &lt;argument&gt;SHA1&lt;/argument&gt;
                &lt;/arguments&gt;
            &lt;/configuration&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
&lt;/plugin&gt;
</pre>
<p style="text-align: justify;">Oczywiście możemy całość skonfigurować tak, żeby podpisywanie odbywało się tylko kiedy budujemy aplikację w profilu release. Mamy również możliwość automatycznej aktualizacji <code class="codecolorer text default"><span class="text">AndroidManifest.xml</span></code> na podstawie ustawień z <code class="codecolorer text default"><span class="text">pom.xml</span></code> (w tym automatyczne podbijanie wersji co build). Nie będę już tego opisywać, wszystko to można łatwo znaleźć w dokumentacji, zamieszczę jeszcze tylko "żywy przykład" wykorzystania tych dobroci w moim projekcie <a href="http://mzawisza.pl/opencachingfun">OCFun</a>.</p>
<h5>Przykład</h5>
<pre class="brush: xml; title: pom.xml; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;&gt;
    &lt;properties&gt;
        &lt;version&gt;0.7.0.0&lt;/version&gt;

        &lt;okapiOauthSecret&gt;oauth secret&lt;/okapiOauthSecret&gt;
        &lt;okapiOauthKey&gt;oauth key&lt;/okapiOauthKey&gt;
        &lt;debugMapsApiKey&gt;debug maps api key&lt;/debugMapsApiKey&gt;
        &lt;!-- You won't need these if you are just running the app in emulator or on your own device --&gt;
        &lt;releaseMapsApiKey&gt;release maps api key&lt;/releaseMapsApiKey&gt;
        &lt;keystorePath&gt;path/to/keystore&lt;/keystorePath&gt;
        &lt;keystorePassword&gt;keystore pass&lt;/keystorePassword&gt;
        &lt;keyAlias&gt;alias&lt;/keyAlias&gt;
        &lt;keyPassword&gt;key pass&lt;/keyPassword&gt;
        &lt;!-- You probably don't want to change these --&gt;
        &lt;sdk&gt;19&lt;/sdk&gt;
        &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
    &lt;/properties&gt;

    &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
    &lt;groupId&gt;com.zeyomir.ocfun&lt;/groupId&gt;
    &lt;artifactId&gt;ocFun&lt;/artifactId&gt;
    &lt;version&gt;${versionName}&lt;/version&gt;
    &lt;packaging&gt;apk&lt;/packaging&gt;
    &lt;name&gt;OpenCachingFun&lt;/name&gt;

    &lt;dependencies&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;android&lt;/groupId&gt;
            &lt;artifactId&gt;android&lt;/artifactId&gt;
            &lt;version&gt;4.4_r1&lt;/version&gt;
            &lt;scope&gt;provided&lt;/scope&gt;
        &lt;/dependency&gt;

        &lt;!-- Make sure this is below the android dependencies --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.google.android.maps&lt;/groupId&gt;
            &lt;artifactId&gt;maps&lt;/artifactId&gt;
            &lt;version&gt;19_r1&lt;/version&gt;
            &lt;scope&gt;provided&lt;/scope&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;org.holoeverywhere&lt;/groupId&gt;
            &lt;artifactId&gt;library&lt;/artifactId&gt;
            &lt;version&gt;1.4.2&lt;/version&gt;
            &lt;type&gt;apklib&lt;/type&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupId&gt;oauth.signpost&lt;/groupId&gt;
            &lt;artifactId&gt;signpost-core&lt;/artifactId&gt;
            &lt;version&gt;1.2.1.2&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;oauth.signpost&lt;/groupId&gt;
            &lt;artifactId&gt;signpost-commonshttp4&lt;/artifactId&gt;
            &lt;version&gt;1.2.1.2&lt;/version&gt;
        &lt;/dependency&gt;
    &lt;/dependencies&gt;

    &lt;profiles&gt;
        &lt;profile&gt;
            &lt;id&gt;development&lt;/id&gt;
            &lt;activation&gt;
                &lt;activeByDefault&gt;true&lt;/activeByDefault&gt;
            &lt;/activation&gt;
            &lt;properties&gt;
                &lt;versionName&gt;${version}-SNAPSHOT&lt;/versionName&gt;
                &lt;incrementVersion&gt;false&lt;/incrementVersion&gt;
                &lt;debuggable&gt;true&lt;/debuggable&gt;
                &lt;mapsApiKey&gt;${debugMapsApiKey}&lt;/mapsApiKey&gt;
            &lt;/properties&gt;
        &lt;/profile&gt;

        &lt;profile&gt;
            &lt;id&gt;release&lt;/id&gt;
            &lt;properties&gt;
                &lt;versionName&gt;${version}&lt;/versionName&gt;
                &lt;incrementVersion&gt;true&lt;/incrementVersion&gt;
                &lt;debuggable&gt;false&lt;/debuggable&gt;
                &lt;mapsApiKey&gt;${releaseMapsApiKey}&lt;/mapsApiKey&gt;
            &lt;/properties&gt;
            &lt;build&gt;
                &lt;plugins&gt;
                    &lt;plugin&gt;
                        &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
                        &lt;artifactId&gt;maven-jarsigner-plugin&lt;/artifactId&gt;
                        &lt;version&gt;1.2&lt;/version&gt;
                        &lt;executions&gt;
                            &lt;execution&gt;
                                &lt;id&gt;signing&lt;/id&gt;
                                &lt;goals&gt;
                                    &lt;goal&gt;sign&lt;/goal&gt;
                                &lt;/goals&gt;
                                &lt;phase&gt;package&lt;/phase&gt;
                                &lt;inherited&gt;true&lt;/inherited&gt;
                                &lt;configuration&gt;
                                    &lt;archiveDirectory&gt;&lt;/archiveDirectory&gt;
                                    &lt;includes&gt;
                                        &lt;include&gt;target/*.apk&lt;/include&gt;
                                    &lt;/includes&gt;
                                    &lt;keystore&gt;${keystorePath}&lt;/keystore&gt;
                                    &lt;storepass&gt;${keystorePassword}&lt;/storepass&gt;
                                    &lt;keypass&gt;${keyPassword}&lt;/keypass&gt;
                                    &lt;alias&gt;${keyAlias}&lt;/alias&gt;
                                    &lt;arguments&gt;
                                        &lt;argument&gt;-sigalg&lt;/argument&gt;
                                        &lt;argument&gt;MD5withRSA&lt;/argument&gt;
                                        &lt;argument&gt;-digestalg&lt;/argument&gt;
                                        &lt;argument&gt;SHA1&lt;/argument&gt;
                                    &lt;/arguments&gt;
                                &lt;/configuration&gt;
                            &lt;/execution&gt;
                        &lt;/executions&gt;
                    &lt;/plugin&gt;

                    &lt;plugin&gt;
                        &lt;groupId&gt;com.jayway.maven.plugins.android.generation2&lt;/groupId&gt;
                        &lt;artifactId&gt;android-maven-plugin&lt;/artifactId&gt;
                        &lt;inherited&gt;true&lt;/inherited&gt;
                        &lt;executions&gt;
                            &lt;execution&gt;
                                &lt;id&gt;alignApk&lt;/id&gt;
                                &lt;phase&gt;install&lt;/phase&gt;
                                &lt;goals&gt;
                                    &lt;goal&gt;zipalign&lt;/goal&gt;
                                &lt;/goals&gt;
                            &lt;/execution&gt;
                        &lt;/executions&gt;
                        &lt;configuration&gt;
                            &lt;sign&gt;
                                &lt;debug&gt;false&lt;/debug&gt;
                            &lt;/sign&gt;
                            &lt;zipalign&gt;
                                &lt;verbose&gt;true&lt;/verbose&gt;
                                &lt;skip&gt;false&lt;/skip&gt;
                                &lt;inputApk&gt;${project.build.directory}/${project.artifactId}.apk&lt;/inputApk&gt;
                                &lt;outputApk&gt;${project.artifactId}-aligned.apk&lt;/outputApk&gt;
                            &lt;/zipalign&gt;
                        &lt;/configuration&gt;
                    &lt;/plugin&gt;
                &lt;/plugins&gt;
            &lt;/build&gt;
        &lt;/profile&gt;
    &lt;/profiles&gt;

    &lt;build&gt;
        &lt;finalName&gt;${project.artifactId}&lt;/finalName&gt;
        &lt;sourceDirectory&gt;src/main/java&lt;/sourceDirectory&gt;
        &lt;plugins&gt;
            &lt;plugin&gt;
                &lt;groupId&gt;com.jayway.maven.plugins.android.generation2&lt;/groupId&gt;
                &lt;artifactId&gt;android-maven-plugin&lt;/artifactId&gt;
                &lt;version&gt;3.6.0&lt;/version&gt;
                &lt;configuration&gt;
                    &lt;sdk&gt;
                        &lt;platform&gt;${sdk}&lt;/platform&gt;
                    &lt;/sdk&gt;
                    &lt;undeployBeforeDeploy&gt;true&lt;/undeployBeforeDeploy&gt;
                    &lt;manifest&gt;
                        &lt;versionName&gt;${versionName}&lt;/versionName&gt;
                        &lt;versionCodeAutoIncrement&gt;${incrementVersion}&lt;/versionCodeAutoIncrement&gt;
                        &lt;versionCodeUpdateFromVersion&gt;false&lt;/versionCodeUpdateFromVersion&gt;
                        &lt;debuggable&gt;${debuggable}&lt;/debuggable&gt;
                    &lt;/manifest&gt;
                &lt;/configuration&gt;
                &lt;extensions&gt;true&lt;/extensions&gt;
                &lt;executions&gt;
                    &lt;execution&gt;
                        &lt;goals&gt;
                            &lt;goal&gt;manifest-update&lt;/goal&gt;
                        &lt;/goals&gt;
                    &lt;/execution&gt;
                &lt;/executions&gt;
            &lt;/plugin&gt;
        &lt;/plugins&gt;

        &lt;resources&gt;
            &lt;resource&gt;
                &lt;directory&gt;src/main/resources&lt;/directory&gt;
                &lt;filtering&gt;true&lt;/filtering&gt;
            &lt;/resource&gt;
        &lt;/resources&gt;
    &lt;/build&gt;
&lt;/project&gt;
</pre>
<pre class="brush: plain; title: application.properties; notranslate">
app.versionName=${versionName}
okapi.oauthKey=${okapiOauthKey}
okapi.oauthSecret=${okapiOauthSecret}
googleMaps.apiKey=${mapsApiKey}
</pre>
<h5 style="text-align: justify;">Bonus: debugowanie</h5>
<p style="text-align: justify;">Żeby podpiąć debugger do aplikacji uruchomionej przez mavena możemy zrobić tak jak opisano <a href="https://code.google.com/p/maven-android-plugin/wiki/Debug">na wiki android-maven-plugin</a>, albo (prościej) użyć przycisku 'attach debugger to android process' (przynajmniej w IntelliJ IDEA, jest w okolicach przycisku 'debug'). Jeśli potrzebujemy debugować proces uruchamiania aplikacji, należy aplikację uruchomić z <code class="codecolorer text default"><span class="text">adb shell</span></code>. Wykonujemy w terminalu:</p>
<pre class="brush: bash; title: ; notranslate">
adb shell
am start -n com.yourapp/com.yourapp.YourActivity -D
</pre>
<p style="text-align: justify;">
W ten sposób aplikacja uruchomi się dopiero kiedy podłączymy się do niej z debuggerem.</p>
]]></content:encoded>
			</item>
		<item>
		<title>Android i maven w jednym stali domu- podstawy</title>
		<link>http://mzawisza.pl/java/android-i-maven-w-jednym-stali-domu-podstawy/</link>
		<comments>http://mzawisza.pl/java/android-i-maven-w-jednym-stali-domu-podstawy/#comments</comments>
		<pubDate>Tue, 03 Dec 2013 16:54:18 +0000</pubDate>
		<dc:creator><![CDATA[zeyomir]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://mzawisza.pl/?p=680</guid>
		<description><![CDATA[Pisanie aplikacji na androida jest dość łatwe i przyjemne. Przynajmniej do czasu kiedy trzeba dołączyć zewnętrzną bibliotekę... a potem kolejną... i kolejną... a potem jeszcze przekazać taki projekt innym programistom. W świecie Javy "serwerowej" problem zarządzania zależnościami i ogólnie pojętej konfiguracji projektu i procesu budowania został rozwiązany już dawno. Aż dziwne, że w świecie Androida [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">Pisanie aplikacji na androida jest dość łatwe i przyjemne. Przynajmniej do czasu kiedy trzeba dołączyć zewnętrzną bibliotekę... a potem kolejną... i kolejną... a potem jeszcze przekazać taki projekt innym programistom.<span id="more-680"></span></p>
<p style="text-align: justify;">W świecie Javy "serwerowej" problem zarządzania zależnościami i ogólnie pojętej konfiguracji projektu i procesu budowania został rozwiązany już dawno. Aż dziwne, że w świecie Androida rozwiązanie to jest wciąż tak słabo znane. Mowa oczywiście o mavenie (oczywiście jest tego więcej, ale maven jest chyba najbardziej znany i nim właśnie się zajmiemy).</p>
<p style="text-align: justify;">Maven pozwala opisać w formie xmla wszystkie zależności (biblioteki) projektu, oraz daje możliwość automatycznego ich pobrania. Oprócz tego możemy w tym samym xmlu opisać w jaki sposób projekt powinien wyglądać (jakie mamy foldery i który co zawiera) i jak ma być budowany (to tak w skrócie- oczywiście możliwości ma dużo więcej, a dodając pluginy to możliwości są wręcz nieograniczone). Nie przedłużając- podam krótki przepis jak używać mavena w projektach androidowych.</p>
<h5 style="text-align: justify;">Krok 1. Instalacja mavena <img src="http://mzawisza.pl/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" /></h5>
<p style="text-align: justify;">Żeby czegoś używać, trzeba to najpierw mieć ;). Pobieramy sobie mavena <a href="http://maven.apache.org/download.cgi">ze strony projektu</a>. Proponuję zaciągnąć od razu 2 wersje: 3.1.1 i 3.0.5. Jest to spowodowane tym, że niestety nie wszystko jest jeszcze kompatybilne z nowszymi wersjami, a z kolei część rzeczy będzie wymagać wersji najnowszej dostępnej. Przynajmniej na początku czeka nas więc odrobina żonglowania wersjami.</p>
<p style="text-align: justify;">Ściągnięte archiwa rozpakowujemy gdzieś na dysku. Proponuję rozpakować obok siebie w katalogach odpowiednio maven3 i maven31. Teraz musimy dodać odpowiednie zmienne środowiskowe- u mnie wygląda to tak (ja mam mavena 3.0.5, Ty na razie wskaż ścieżkę do mavena 3.1.1):</p>
<pre class="brush: plain; title: ; notranslate">JAVA_HOME = C:\Program Files\Java\jdk1.7.0_45
M2_HOME = D:\Dev\maven
PATH += ;D:\Dev\maven\bin</pre>
<p style="text-align: justify;">Teraz otwórzmy konsolę (cmd.exe). Sprawdzamy czy możemy wywołać mavena:</p>
<pre class="brush: plain; title: ; notranslate">C:\&gt;mvn --version
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 14:51:28+0100)
Maven home: D:\Dev\maven
Java version: 1.7.0_45, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.7.0_45\jre
Default locale: pl_PL, platform encoding: Cp1250
OS name: &quot;windows 8&quot;, version: &quot;6.2&quot;, arch: &quot;amd64&quot;, family: &quot;windows&quot;</pre>
<h5 style="text-align: justify;">Krok 2. Konfigurujemy repozytorium (nieobowiązkowe)</h5>
<p style="text-align: justify;">Domyślnie maven będzie ściągał wszystkie biblioteki do katalogu <code class="codecolorer text default"><span class="text">.m2/repository</span></code> w katalogu głównym użytkownika. Nie ma w tym nic złego, ja jednak wolę mieć je na osobnym dysku dzięki czemu nie muszę ściągać bibliotek od nowa po formacie ;). Możemy wymusić zmianę miejsca trzymania tego repozytorium bibliotek dodając w pliku <code class="codecolorer text default"><span class="text">.m2/settings.xml</span></code> (tworząc go jeśli jeszcze nie istnieje) następujący snippet:</p>
<pre class="brush: xml; title: ; notranslate">&lt;settings&gt;
&lt;localRepository&gt;D:\Dev\maven_repo&lt;/localRepository&gt;
&lt;/settings&gt;</pre>
<h5 style="text-align: justify;">Krok 3. Dodajemy biblioteki androida do naszego repo</h5>
<p style="text-align: justify;">Gdyby świat był piękny, nie potrzebowalibyśmy tego kroku. Niestety w momencie pisania tego wpisu najnowsza dostępna wersja androida to 4.4 (KitKat), a w oficjalnym repozytorium mavena nadal wisi wersja 4.1. Czy to się zmieni? Ciężko powiedzieć... na szczęście możemy sami "włożyć"  potrzebne biblioteki do naszego lokalnego repozytorium. Spokojnie, nie będziemy tego robić ręcznie :). Zrobi to za nas <a href="https://github.com/mosabua/maven-android-sdk-deployer">ten projekt</a>. Zasadniczo wszystko jest ładnie opisane w readme, ale dla wygody opiszę proces tutaj:</p>
<ol style="text-align: justify;">
<li>uzupełniamy zmienne środowiskowe:
<pre class="brush: plain; title: ; notranslate">ANDROID_HOME = D:\Dev\Android\android-sdk\sdk
PATH += ;%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools</pre>
</li>
<li>upewniamy się, że w <code class="codecolorer text default"><span class="text">android-sdk\sdk\platforms</span></code> mamy foldery z nazwami w stylu android-api_level, np <code class="codecolorer text default"><span class="text">android-19</span></code> (jeśli nie, to znaczy, że mamy starego sdk-managera, wywalamy cały folder android-sdk i ściągamy najnowszą wersję)</li>
<li>ściągamy WSZYSTKIE pakiety z androidowego sdk-managera</li>
<li>ściągamy powyższy projekt (po prawej mamy 'download zip'), rozpakowujemy, wchodzimy do tego katalogu z konsoli</li>
<li>wydajemy komendę <code class="codecolorer text default"><span class="text">mvn install</span></code></li>
</ol>
<p>W tym miejscu powinniśmy zmienić zmienne systemowe tak, żeby wskazywały na mavena 3.0.5.</p>
<h5 style="text-align: justify;">Krok 4A. Wygenerowanie projektu mavenowo-androidowego</h5>
<p style="text-align: justify;">Istnieje możliwość wygenerowania gotowego projektu androidowo-mavenowego. Wystarczy w konsoli wklepać to (zamieniając your.company na nazwę głównego pakietu jakiego chcemy używać oraz my-android-application na nazwę naszej aplikacji):</p>
<pre class="brush: plain; title: ; notranslate">mvn archetype:generate
-DarchetypeArtifactId=android-quickstart
-DarchetypeGroupId=de.akquinet.android.archetypes
-DarchetypeVersion=1.0.11
-DgroupId=your.company
-DartifactId=my-android-application</pre>
<p style="text-align: justify;">więcej w tym temacie w <a href="http://stand.spree.de/wiki_details_maven_archetypes">dokumentacji</a>.</p>
<p style="text-align: justify;">Jest to niezły sposób, żeby szybko zobaczyć 'o co w tym wszystkim chodzi', nie jest jednak doskonały. Używa bibliotek androida z głównego repo mavena, przez co nie mamy dostępu do najnowszych wersji. Możemy to oczywiście w prosty sposób naprawić, ustawiając zależności w taki sposób jak przy zmienianiu projektu androidowego w mavenowy (krok 4B).</p>
<h5 style="text-align: justify;">Krok 4B. Zmienienie zwykłego projektu androidowego w projekt mavenowy</h5>
<p style="text-align: justify;">Można by oczywiście stworzyć nowy projekt mavenowy i przekopiować do niego źródła ręcznie, ale jest to droga na około. Zmienienie naszego projektu w projekt mavenowy jest całkiem proste. Wystarczy dodać w głównym katalogu projektu plik <code class="codecolorer text default"><span class="text">pom.xml</span></code> z poniższą zawartością:</p>
<pre class="brush: xml; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;&gt;
  &lt;properties&gt;
    &lt;version&gt;0.6.4.1&lt;/version&gt;
    &lt;sdk&gt;19&lt;/sdk&gt;
    &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
  &lt;/properties&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;com.zeyomir.ocfun&lt;/groupId&gt;
  &lt;artifactId&gt;ocFun&lt;/artifactId&gt;
  &lt;version&gt;${versionName}&lt;/version&gt;
  &lt;packaging&gt;apk&lt;/packaging&gt;
  &lt;name&gt;OpenCachingFun&lt;/name&gt;
  &lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;android&lt;/groupId&gt;
      &lt;artifactId&gt;android&lt;/artifactId&gt;
      &lt;version&gt;4.4_r1&lt;/version&gt;
      &lt;scope&gt;provided&lt;/scope&gt;
    &lt;/dependency&gt;
  &lt;/dependencies&gt;
  &lt;build&gt;
    &lt;finalName&gt;${project.artifactId}&lt;/finalName&gt;
    &lt;sourceDirectory&gt;src/main/java&lt;/sourceDirectory&gt;
    &lt;plugins&gt;
      &lt;plugin&gt;
        &lt;groupId&gt;com.jayway.maven.plugins.android.generation2&lt;/groupId&gt;
        &lt;artifactId&gt;android-maven-plugin&lt;/artifactId&gt;
        &lt;version&gt;3.6.0&lt;/version&gt;
        &lt;configuration&gt;
          &lt;sdk&gt;
            &lt;platform&gt;${sdk}&lt;/platform&gt;
          &lt;/sdk&gt;
        &lt;/configuration&gt;
      &lt;/plugin&gt;
    &lt;/plugins&gt;
  &lt;/build&gt;
&lt;/project&gt;</pre>
<p style="text-align: justify;">A następnie usunąć niepotrzebne już pliki i foldery: <code class="codecolorer text default"><span class="text">libs</span></code>, <code class="codecolorer text default"><span class="text">bin</span></code>, <code class="codecolorer text default"><span class="text">build.xml</span></code>, <code class="codecolorer text default"><span class="text">build.properties</span></code>. Oczywiście w <code class="codecolorer text default"><span class="text">version</span></code>, <code class="codecolorer text default"><span class="text">name</span></code>, <code class="codecolorer text default"><span class="text">artifactId</span></code> i <code class="codecolorer text default"><span class="text">groupId</span></code> wstaw wartości odpowiednie dla Twojego projektu. W powyższym przykładzie wykorzystywany jest android 4.4 (api v.19)- najnowszy dostępny na dzień pisania wpisu. Powinieneś ustawić takie samo jakie masz w target sdk w swoim <code class="codecolorer text default"><span class="text">AndroidManifest.xml</span></code>.</p>
<h5 style="text-align: justify;">Co dalej?</h5>
<p style="text-align: justify;">I to tyle jeśli chodzi o podstawy- masz już wstępnie skonfigurowany projekt mavenowy. W <a href="http://mzawisza.pl/java/android-i-maven-w-jednym-stali-domu-czesc-2/">drugiej części</a> pokażę jak do projektu dodawać biblioteki i skąd je brać, a także bardziej zaawansowane wykorzystanie mavena i maven-android-plugin (w tym deployowanie i debugowanie na emulatorze/urządzeniu usb i generowanie podpisanych plików apk gotowych do publikowania w sklepie Google Play).</p>
]]></content:encoded>
			<wfw:commentRss>http://mzawisza.pl/java/android-i-maven-w-jednym-stali-domu-podstawy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Egzamin na OCAJP7</title>
		<link>http://mzawisza.pl/java/egzamin-na-ocajp7/</link>
		<comments>http://mzawisza.pl/java/egzamin-na-ocajp7/#comments</comments>
		<pubDate>Thu, 10 Oct 2013 17:44:37 +0000</pubDate>
		<dc:creator><![CDATA[zeyomir]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[certyfikat]]></category>
		<category><![CDATA[ocajp7]]></category>

		<guid isPermaLink="false">http://mzawisza.pl/?p=710</guid>
		<description><![CDATA[W dniu dzisiejszym przystąpiłem do egzaminu 1Z0-803 (Java SE 7 Programmer I), który pozwala na uzyskanie certyfikatu OCAJP7 (Oracle Certified Associate, Java SE 7 Programer). Egzamin zdałem z wynikiem 95% . Poniżej parę refleksji. Trochę historii Jest to pierwszy na liście certyfikatów znajomości Javy. Za czasów Sun i Java6 nazywał się SCJA6 i nie był [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">W dniu dzisiejszym przystąpiłem do egzaminu 1Z0-803 (Java SE 7 Programmer I), który pozwala na uzyskanie certyfikatu OCAJP7 (Oracle Certified Associate, Java SE 7 Programer). Egzamin zdałem z wynikiem 95% <img src="http://mzawisza.pl/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" /> . Poniżej parę refleksji.<span id="more-710"></span></p>
<h5 style="text-align: justify;">Trochę historii</h5>
<p style="text-align: justify;">Jest to pierwszy na liście certyfikatów znajomości Javy. Za czasów Sun i Java6 nazywał się SCJA6 i nie był nawet wymagany (można było podejść od razu do dużo ciekawszego i bardziej rozpoznawanego SCJP6). W moim odczuciu był kierowany raczej do studentów, którzy dzięki niemu chcieli sobie pomóc w znalezieniu pierwszej pracy.</p>
<p style="text-align: justify;">Czasy się jednak zmieniły i wraz z przejęciem Suna przez Oracle egzamin ten stał się obowiązkowy (mam wrażenie, że przy okazji cena również poszła w górę). Niektórzy twierdzą, że lepiej zdać stare SCJP6 (bo wciąż się da), a potem podejść od razu do egzaminu na OCPJP7 jako 'uaktualnienie'- podobno wychodzi taniej. Za mój egzamin płaciła jednak firma więc nie zgłębiałem tematu.</p>
<h5 style="text-align: justify;">O samym egzaminie</h5>
<p style="text-align: justify;">Na egzamin umawiamy się przez stronę <a href="http://pearsonvue.com/oracle/">pearsonvue.com</a>. Koszt to około <strong>800 zł</strong> ($245). Do wyboru mamy kilka centrów egzaminacyjnych w okolicy, z terminami bywa mocno różnie (raz najbliższy termin jest za pół roku, raz za tydzień). Po ustaleniu terminu, możemy go do woli przekładać (bez ograniczeń ilościowych, bez konsekwencji finansowych), byle tylko zrobić to minimum 24h przed zaplanowanym egzaminem- w przeciwnym wypadku zostanie naliczona dodatkowa opłata. Przed przystąpieniem do egzaminu należy jeszcze założyć Oracle Web Account (wszystko będzie w mailu <img src="http://mzawisza.pl/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ).</p>
<p style="text-align: justify;">Egzamin nie ma żadnych wymagań które trzeba spełnić przed przystąpieniem do niego. Jak już pisałem- jest to pierwszy certyfikat ze ścieżki certyfikacyjnej Javy, więc nie ma żadnych egzaminów które trzeba zdać wcześniej. Nie ma też żadnego obowiązkowego szkolenia/kursu. Można przystąpić do niego 'z marszu'. Ja jednak odradzam takie rozwiązanie.</p>
<p style="text-align: justify;">Co prawda egzamin nie jest trudny (obejmuje podstawowe części języka, podstawy dziedziczenia etc, spory nacisk kładziony jest na to co się w języku zmieniło w porównaniu do wersji 6), ale mimo wszystko szanse na zdanie go bez przygotowania oceniałbym raczej na marne. Jak zatem się przygotować? O tym za chwilę.</p>
<p style="text-align: justify;">Do rozwiązania jest <strong>90 pytań</strong>, w dużej części są to pytania wielokrotnego wyboru, często podchwytliwe. Jedno które utkwiło mi w pamięci (nie z egzaminu, z przygotowań) brzmiało mniej-więcej tak:</p>
<blockquote><p>Mamy plik Main.java o podanej zawartości:</p>
<pre class="brush: java; title: ; notranslate">public class Main{
  public int main(String[] args){
    System.out.println(&quot;main&quot;);
  }
}</pre>
<p>Co się stanie jeśli wydamy z konsoli polecenie</p>
<pre class="brush: bash; title: ; notranslate">javac Main.java
java Main</pre>
<p>a) wypisane zostanie "main"<br />
b) nic nie zostanie wypisane<br />
c) rzucony zostanie wyjątek (Exception)<br />
d) żadne z powyższych.</p></blockquote>
<p style="text-align: justify;">Oczywiście metoda main jest źle zadeklarowana (powinna być statyczna i zwracać void, to nie C++), więc nie ma prawa się uruchomić. Powiecie, że w takim razie poleci wyjątek? A figa z makiem. Poleci <em>Error </em>;).</p>
<p style="text-align: justify;">Na rozwiązanie wszystkich pytań mamy <strong>140 minut</strong>. Czasu jest akurat tyle ile potrzeba jeśli jest się przygotowanym- dłuższe zastanawianie nad kilkoma pytaniami skutkować będzie tym, że czasu nam zabraknie. Żeby zdać, należy uzyskać wynik minimum <strong>77%</strong>.</p>
<p style="text-align: justify;">Do dyspozycji mamy kartkę papieru i długopis, zapewnione przez centrum egzaminacyjne. Poza tym nie wolno nam mieć przy sobie niczego więcej (no, poza dowodem osobistym, który musimy okazać przed przystąpieniem do egzaminu).</p>
<p style="text-align: justify;">Wynik możemy sprawdzić na swoim koncie Oracle po kilku godzinach. Wersję elektroniczną możemy pobrać po około 48h z portalu <a href="http://certview.oracle.com">certview.oracle.com</a>. Drukowaną kopię certyfikatu powinniśmy otrzymać w ciągu kilku tygodni pocztą.</p>
<h5 style="text-align: justify;">Przygotowania</h5>
<p style="text-align: justify;">Opcji przygotowania się do egzaminu jest kilka. Możemy wybrać jeden z oferowanych przez Oracle typów treningu (self-study, live virtual class, training on demand, classroom training). Nie jestem w stanie nic o nich powiedzieć, oprócz tego, że wszystkie są diabelnie drogie.</p>
<p style="text-align: justify;">Mamy też dość spory wybór książek. Ja dostałem do ręki OCA Java Programmer 7 Study Guide wydawnictwa Oracle Press i... szczerze mówiąc- zawiodłem się bardzo. W moim odczuciu książka może i pozwalała poznać wymagane zagadnienia, ale na pewno nie na poziomie pozwalającym zdać egzamin.</p>
<p style="text-align: justify;">Sytuację ratują egzaminy próbne. Ja miałem dostęp do <a href="http://www.whizlabs.com/">whizlabs.com</a> (pewnie są też inne) i bez tego chyba bym nie zdał (a na pewno nie tak wysoko). Za przystępną cenę (jeśli dobrze pamiętam to $40) otrzymujemy zestaw testów przygotowawczych (po jednym do każdego z wymaganych zagadnień), kilka zestawów "przekrojowych" ("próbnych"), oraz materiały w formie pdfów do każdego z zagadnień. Po rozwiązaniu testu otrzymujemy dość szczegółowy opis dlaczego dana odpowiedź jest poprawna a reszta błędna, co dla mnie było właściwie najcenniejszym źródłem informacji. Podobno testy te (z whizlabs) są przygotowywane przez te same osoby co testy egzaminacyjne- i ciężko mieć co do tego wątpliwości, bo sporo pytań z tych testów powtórzyło mi się w prawie niezmienionej formie na egzaminie (<strong>!</strong>). To chyba powinno ostatecznie wszystkich przekonać ;).</p>
<p style="text-align: justify;">Niestety nie może być zbyt różowo- trafiają się źle sformułowane pytania, zdarza się, że poprawna odpowiedź oznaczona jest jako błędna, zdarza się w końcu, że wyjaśnienia do odpowiedzi nie mają sensu. Nie zdarza się to często, ale się zdarza. I wprowadza pewien niepokój. No bo skoro był błąd w jednym miejscu to może jest ich więcej? W szczególności: może niektóre pytania za które dostałem full punktów zawierają takie błędy i tak naprawdę to nie zaznaczyłem w nich poprawnej odpowiedzi? Zmusza to do sprawdzania wszystkiego w IDE i dokumentacji... co w sumie wychodzi ostatecznie na plus ;). Warto przy okazji posprawdzać różne warianty itd, żeby w pełni zrozumieć czemu coś działa tak a nie inaczej i jak zachowa się w innych warunkach.</p>
<p style="text-align: justify;">Ile czasu należy zabezpieczyć na przygotowanie do egzaminu? Myślę, że mając dostęp do whizlabs, wolne popołudnia i determinację, by codziennie poświęcić 1-2h czasu można się spokojnie przygotować w ciągu miesiąca. Ja robiłem testy w kółko, czytając za każdym razem wyjaśnienia (nawet do tych pytań w których podałem prawidłową odpowiedź) tak długo aż miałem 100% poprawnych odpowiedzi- wtedy dopiero brałem się za następny. Około tygodnia przed egzaminem zrobiłem powtórkę ze wszystkich testów przygotowawczych (znowu czytając wyjaśnienia i powtarzając do uzyskania 100%), po jednym dziennie, czytając również odpowiedni kawałek materiału z pdfów. Na ostatnie kilka dni zostawiłem sobie testy przekrojowe (po jednym dziennie), które znowu powtarzałem do uzyskania 100%, wczytując się w wyjaśnienia i sprawdzając każdą wątpliwość w kodzie i dokumentacji.</p>
<h5 style="text-align: justify;">Co dalej?</h5>
<p style="text-align: justify;">Egzamin zdany, tym samym ścieżka certyfikacyjna otwarta. Czy będę podchodził w przyszłości do (następnego w kolejności) OCPJP7? Czas pokaże, ale myślę, że tak. Nie uważam, żeby przygotowania do egzaminu nauczyły mnie czegoś nowego w sensie przydatnego. Nie sądzę też, żeby certyfikat sprawiał, że pracodawcy będą się o mnie bić (w przeciwieństwie do certyfikatów MS, tu nie występuje efekt zbierania pokemonów ;)). Ale i tak uważam, że warto- na pewno przygotowanie się do egzaminu wymusza uporządkowanie swojej wiedzy, a posiadanie certyfikatu jest zawsze plusem- pomimo tego, że zaświadcza on jedynie, że kiedyś zakuło się sporo materiału (z którego pewnie większość już się zapomniało), a nie mówi nic o faktycznych umiejętnościach.</p>
]]></content:encoded>
			<wfw:commentRss>http://mzawisza.pl/java/egzamin-na-ocajp7/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>OpenCachingFun- teraz z kompasem ;)</title>
		<link>http://mzawisza.pl/java/opencachingfun-teraz-z-kompasem/</link>
		<comments>http://mzawisza.pl/java/opencachingfun-teraz-z-kompasem/#comments</comments>
		<pubDate>Thu, 27 Jun 2013 20:00:28 +0000</pubDate>
		<dc:creator><![CDATA[zeyomir]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[opencaching]]></category>
		<category><![CDATA[opencachingfun]]></category>

		<guid isPermaLink="false">http://mzawisza.pl/?p=669</guid>
		<description><![CDATA[Dziś została wydana nowa wersja OCFun (0.6.1.0). Nowości: - zgodnie z zapowiedziami, od początku czerwca aplikacja jest dostępna w Google Play  - dodany został "kompas" wskazujący drogę do skrzynki- wiem, że tego chyba najbardziej brakowało 😀 Jeżeli ktoś jeszcze nigdy się w geocaching nie bawił to polecam pobrać apkę i zobaczyć czy są w pobliżu nas [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">Dziś została wydana nowa wersja <a href="http://mzawisza.pl/opencachingfun/">OCFun</a> (<strong>0.6.1.0</strong>).</p>
<p style="text-align: justify;"><span id="more-669"></span>Nowości:<br />
- zgodnie z zapowiedziami, od początku czerwca aplikacja jest dostępna w <a href="https://play.google.com/store/apps/details?id=com.zeyomir.ocfun">Google Play</a> <img src="http://mzawisza.pl/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br />
- dodany został "kompas" wskazujący drogę do skrzynki- wiem, że tego chyba najbardziej brakowało <img src="https://s.w.org/images/core/emoji/72x72/1f600.png" alt="&#x1f600;" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p style="text-align: justify;">Jeżeli ktoś jeszcze nigdy się w geocaching nie bawił to polecam pobrać apkę i zobaczyć czy są w pobliżu nas jakieś skrzynki, a potem... spróbować ich poszukać! <img src="http://mzawisza.pl/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Do takiego "próbnego" szukania nie potrzebujemy żadnego konta i jeżeli nam się nie spodoba to nie musimy się nigdzie rejestrować. A spróbować warto, bo to przednia zabawa :).</p>
]]></content:encoded>
			<wfw:commentRss>http://mzawisza.pl/java/opencachingfun-teraz-z-kompasem/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Confitura 2013</title>
		<link>http://mzawisza.pl/java/confitura-2013/</link>
		<pubDate>Fri, 14 Jun 2013 10:00:39 +0000</pubDate>
		<dc:creator><![CDATA[zeyomir]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[confitura]]></category>
		<category><![CDATA[konferencja]]></category>

		<guid isPermaLink="false">http://mzawisza.pl/?p=665</guid>
		<description><![CDATA[Ktoś się wybiera :)? Ja w tym roku będę na pewno ;)!  Garść informacji: kiedy: 6 lipca 2013 gdzie: Warszawa (kampus główny UW) cena: 0 zł Jakby co to rejestracja jest dostępna tutaj http://2013.confitura.pl/registration. PS: Jeśli ktoś nie da rady, to zapewne nagrania z prezentacji zostaną udostępnione na youtube- tutaj paczka nagrań z zeszłego roku.]]></description>
				<content:encoded><![CDATA[<p>Ktoś się wybiera :)? Ja w tym roku będę na pewno ;)!  Garść informacji:</p>
<p>kiedy:<strong> 6 lipca</strong> 2013<br />
gdzie: <strong>Warszawa</strong> (kampus główny UW)<br />
cena: <strong>0 zł</strong></p>
<p>Jakby co to rejestracja jest dostępna tutaj <a href="http://2013.confitura.pl/registration">http://2013.confitura.pl/registration</a>.</p>
<p>PS: Jeśli ktoś nie da rady, to zapewne nagrania z prezentacji zostaną udostępnione na youtube- <a href="http://2012.confitura.pl/news/68/wigilijna_paczka_pod_choinke">tutaj</a> paczka nagrań z zeszłego roku.</p>
]]></content:encoded>
			</item>
		<item>
		<title>Obniżka cen produktów JetBrains!</title>
		<link>http://mzawisza.pl/ogolne/obnizka-cen-produktow-jetbrains/</link>
		<pubDate>Mon, 15 Apr 2013 09:31:03 +0000</pubDate>
		<dc:creator><![CDATA[zeyomir]]></dc:creator>
				<category><![CDATA[Ogólne]]></category>
		<category><![CDATA[JetBrains]]></category>

		<guid isPermaLink="false">http://mzawisza.pl/?p=660</guid>
		<description><![CDATA[Przez tydzień (od dziś do 22 kwietnia) produkty JetBrains będą dostępne po niższych cenach- część nawet 50% taniej. Jeśli czekaliście z zakupem licencji na IntelliJ IDEA, ReSharpera albo inne narzędzia- teraz jest okazja ;). Więcej info tu.]]></description>
				<content:encoded><![CDATA[<p>Przez tydzień (od dziś do 22 kwietnia) produkty JetBrains będą dostępne po niższych cenach- część nawet 50% taniej. Jeśli czekaliście z zakupem licencji na IntelliJ IDEA, ReSharpera albo inne narzędzia- teraz jest okazja ;). Więcej info <a href="http://blog.jetbrains.com/blog/2013/04/15/50-off-jetbrains-tools-and-help-to-plant-a-billion-trees/">tu</a>.</p>
]]></content:encoded>
			</item>
		<item>
		<title>OpenCachingFun teraz naprawdę &#8222;open&#8221;</title>
		<link>http://mzawisza.pl/java/opencachingfun-teraz-naprawde-open/</link>
		<comments>http://mzawisza.pl/java/opencachingfun-teraz-naprawde-open/#comments</comments>
		<pubDate>Thu, 11 Apr 2013 09:16:26 +0000</pubDate>
		<dc:creator><![CDATA[zeyomir]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[opencaching]]></category>
		<category><![CDATA[opencachingfun]]></category>

		<guid isPermaLink="false">http://mzawisza.pl/?p=656</guid>
		<description><![CDATA[Miło mi ogłosić, że od kilku dni kod OpenCachingFun można znaleźć na GitHubie pod adresem https://github.com/zeyomir/OpenCachingFun :). Długo zwlekałem z tą decyzją, no ale w końcu jest :). Kod dostępny jest na licencji GPLv3. Mam nadzieję, że znajdzie się parę osób chętnych do pomocy i prace nad kolejnymi ficzerami nie będą trwały już tak długo, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Miło mi ogłosić, że od kilku dni kod OpenCachingFun można znaleźć na GitHubie pod adresem <a href="https://github.com/zeyomir/OpenCachingFun">https://github.com/zeyomir/OpenCachingFun</a> :). Długo zwlekałem z tą decyzją, no ale w końcu jest :). Kod dostępny jest na licencji GPLv3. Mam nadzieję, że znajdzie się parę osób chętnych do pomocy i prace nad kolejnymi ficzerami nie będą trwały już tak długo, sama aplikacja zyska na jakości, a my wszyscy się czegoś nowego przy okazji nauczymy :).</p>
<p>Z innych ogłoszeń: "gdzieś" w maju można się spodziewać OCFun na google play :).</p>
]]></content:encoded>
			<wfw:commentRss>http://mzawisza.pl/java/opencachingfun-teraz-naprawde-open/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Denerwujący zoom na formy w iPhonach</title>
		<link>http://mzawisza.pl/webdev/denerwujacy-zoom-na-formy-w-iphonach/</link>
		<pubDate>Thu, 14 Mar 2013 09:00:41 +0000</pubDate>
		<dc:creator><![CDATA[zeyomir]]></dc:creator>
				<category><![CDATA[Webdev]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://mzawisza.pl/?p=602</guid>
		<description><![CDATA[Kiedy otworzymy jakąś stronę w iPhonie i klikniemy na jakieś pole tekstowe czy innego comboboxa, zostanie on ładne powiększony. Niby fajnie, jak mamy otwartą stronę w wersji desktopowej. Jednak jeżeli mamy otwartą stronę w wersji zoptymalizowanej dla urządzeń z małym ekranem... to jest to trochę denerwujące, ponieważ strona ma odpowiedni rozmiar i nie potrzebuje takiego [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Kiedy otworzymy jakąś stronę w iPhonie i klikniemy na jakieś pole tekstowe czy innego comboboxa, zostanie on ładne powiększony. Niby fajnie, jak mamy otwartą stronę w wersji desktopowej. Jednak jeżeli mamy otwartą stronę w wersji zoptymalizowanej dla urządzeń z małym ekranem... to jest to trochę denerwujące, ponieważ strona ma odpowiedni rozmiar i nie potrzebuje takiego powiększania. Jednak naprawdę denerwujący jest fakt, że po zakończeniu wpisywania/wybraniu jakiejś opcji z selecta... nie następuje automatyczne pomniejszenie/oddalenie do poprzedniego poziomu.<br />
<span id="more-602"></span></p>
<p>Ok, jak to dziadostwo wyłączyć? Grzebiąc trochę w sieci dowiadujemy się, że zoom na stronie można zablokować (yay!). Używa się do tego następującego meta-tagu:</p>
<pre class="brush: xml; title: ; notranslate">&lt;meta name=&quot;viewport&quot; content=
&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0&quot; /&gt;</pre>
<p>Jednak euforia nie trwa długo- ten tag służy do zablokowania możliwości zoomowania dla użytkownika, to domyślne zachowanie przeglądarki nadal działa. A nawet jest gorzej, bo teraz użytkownik nie ma możliwości powrotu do normalnego poziomu powiększenia.</p>
<p>No to może da się to wyłączyć po stronie użytkownika? Musi być przecież jakaś konfiguracja, prawda? Niestety, przecież mamy do czynienia z produktem nadgryzionego jabłka ;). A nadgryzione jabłko nie przywykło do pytania swoich użytkowników o zdanie.</p>
<p>W każdym razie, po dłuższej chwili przekopywania się przez zakamarki sieci znajdujemy pewien hack. Hack ten polega na ustawieniu w css:</p>
<pre class="brush: css; title: ; notranslate">input, select {font-size: 16px;}</pre>
<p>I już, wszystkie kłopoty znikają. Wygląda dziwnie (w kodzie, bo wygląd w przeglądarce się nie zmienia), ale działa.</p>
<p>I pamiętaj- Apple zawsze wie lepiej ;).</p>
]]></content:encoded>
			</item>
	</channel>
</rss>
