<?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>Senkov kutak &#187; Uncategorized</title>
	<atom:link href="http://senko.net/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://senko.net</link>
	<description>Tech, biz, geek, misc</description>
	<lastBuildDate>Thu, 17 Nov 2011 11:42:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Python Meet #3</title>
		<link>http://senko.net/python-meet-3/</link>
		<comments>http://senko.net/python-meet-3/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 11:42:34 +0000</pubDate>
		<dc:creator>Senko</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://senko.net/?p=685</guid>
		<description><![CDATA[<a href="http://senko.net/python-meet-3/" title="Python Meet #3"></a>Evo nam još jednog okupljanja Pythonaša i onih koji bi to željeli postati. Python meet #3 će se održati u ponedjeljak, 21. 11. 2011., u KSET-u, Unska 3. Predgrupa (poznata britanska komičarska grupa) kreće s nastupom u 16 sati, dok &#8230;<p class="read-more"><a href="http://senko.net/python-meet-3/">Više &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://senko.net/python-meet-3/" title="Python Meet #3"></a><p>Evo nam još jednog okupljanja Pythonaša i onih koji bi to željeli postati. <strong>Python meet #3</strong> će se održati u ponedjeljak, 21. 11. 2011., u KSET-u, Unska 3.</p>
<p>Predgrupa (poznata britanska komičarska grupa) kreće s nastupom u 16 sati, dok će sam meet započeti u 18 sati.</p>
<p>Više informacija o meetu <a href="http://www.kset.org/dogadaj/python-meetup-3/">pročitajte na KSET-ovim stranicama</a>.</p>
<p>Vidimo se u ponjedjeljak!</p>
]]></content:encoded>
			<wfw:commentRss>http://senko.net/python-meet-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Freelancer računica</title>
		<link>http://senko.net/freelancer-racunica/</link>
		<comments>http://senko.net/freelancer-racunica/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 08:45:43 +0000</pubDate>
		<dc:creator>Senko</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://senko.net/?p=583</guid>
		<description><![CDATA[<a href="http://senko.net/freelancer-racunica/" title="Freelancer računica"></a>Nakon nedavnog prilično čitanog članka u Globusu o online/web freelancingu moglo se čuti i pročitati dosta komentara o masnim parama koje se mlate u online-biznisu, nakon kojih bi čovjek dobio dojam da je taj internet biznis jako lukrativna i tajanstvena &#8230;<p class="read-more"><a href="http://senko.net/freelancer-racunica/">Više &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://senko.net/freelancer-racunica/" title="Freelancer računica"></a><p><a href="http://www.flickr.com/photos/amagill/3366720659/"><img src="http://senko.net/wp-content/uploads/2010/11/3366720659_e93a6a29a5_o.jpg" alt="CC-BY AMagill @ Flickr" title="Money Pile (CC-BY AMagill)" width="213" height="141" class="alignright size-full wp-image-587" /></a></p>
<p>Nakon nedavnog prilično čitanog <a href="http://globus.jutarnji.hr/hrvatska/online-posao-za-placu-od-16-tisuca-kuna">članka u Globusu o online/web freelancingu</a> moglo se čuti i pročitati dosta komentara o <em>masnim parama koje se mlate u online-biznisu</em>, nakon kojih bi čovjek dobio dojam da je taj internet biznis jako lukrativna i tajanstvena prilika u koju su rijetki upućeni nekako ušli i sad se kupaju u zlatu.</p>
<p>Pritom se ponekad zaboravlja da prihodi i neto dohodak nisu ista stvar i financijsku realnost unutar koje freelanceri, kao i svi ostali poduzetnici, moraju poslovati. U nadi da će nekom biti informativna ili korisna, složio sam okvirnu računicu koju bi mogao imati neki hipotetski freelancer. Prilikom računanja zaokruživao sam i procjenivao vrijednosti na neki &#8220;prosjek&#8221; &#8211; pojedini brojevi razlikuju se prilično od slučaja do slučaja, ali recimo da su redovi veličine tu negdje.</p>
<h3>Katica za sve</h3>
<p>Recimo da se potaknuti člankom želite baciti u freelancing. Web developer ste (možda designer / front end developer, možda backend / php / sql ninja); kod (programerski ili markup) štrikate već godinama, stvarno ste dobri u onom što radite i imate već nekoliko fuševa iza sebe.</p>
<p>Naravno, osim samog &#8220;odrađivanja posla&#8221; morat ćete se baviti i sa promocijom (bilo običnim reklamiranjem, bilo pisanjem vlastitog bloga kojim dižete svoj osobni <em>brand</em>), networkingom (sakupljanjem i održavanjem kontakata, odlascima na konferencije, itd), prodajom svojih proizvoda ili usluga (tj. trebate nagovoriti nekog da upravo <em>vama</em> plati &#8211; samo zato što nešto znate ne znači automatski da će korisnik vas odabrati), te naposlijetku i pružanjem korisničke podrške.</p>
<p>A pošto sve ovo zajedno ne želite raditi u fušu nego iz toga stvoriti normalan posao, morati ćete se baviti i papirologijom vezanom uz rad tvrtke koju otvorite. Dio te papirologije možete prepustiti knjigovodstvenim i drugim servisima, ali dio će ostati vaša briga.</p>
<p>Dakle, za početak, poželjno je da imate iskustvo ne samo u Web razvoju, nego i u vođenju projekata, prodaji, oglašavanju, a hodanje po kancelarijama i kupovanje biljega vam ne bi smjelo biti previše frustrirajuće.</p>
<h3>Minus i plus</h3>
<p>Recimo da procjenjujete da će vaši mjesečni prihodi (dakle, količina novaca koji vam klijenti plate, minus PDV domaćih klijenata) biti oko 16 tisuća kuna. Uzimam ovu brojku jer je bila navedena u Globusovom članku &#8211; doduše kao &#8220;plaća&#8221;, ali dosta ljudi nije vjerovalo u taj &#8220;ogromni&#8221; iznos, pa  uzmimo je kao razumnu (uspješnu) brojku u ovoj računici.</p>
<p>Minimalni mjesečni troškovi na koje možete računati su vam mobitel (recimo 200kn), internet i druge režije vezane uz poslovanje (200kn), troškovi prijevoza (iako radite iz spavaće sobe, još uvijek morate na poneki sastanak, poslovnu kavu ili odnijeti papire u Finu &#8211; ako radite u nekoj normalnoj firmi, troškove ovoga vam pokriva poslodavac) u npr. visini mjesečne ZETove karte (~240kn), topli obrok (kojeg vam u nekoj firmi pokriva poslodavac) od recimo 500kn mjesečno, te recimo 100kn za pokrivanje netbanking i sličnih troškova.</p>
<p>Trebate imati i opremu na kojoj ćete raditi &#8211; minimalno nekakvo računalo, ali vjerojatno i nekakav backup disk, veći monitor, i slično. Recimo da ćete godišnje na računala, mobitel i raznoraznu uredsku opremu potrošiti 10 tisuća kuna (što ispada 830kn mjesečno). Osim toga morat ćete si nabaviti nekakvu stručnu literaturu, zakupiti server ili prostor na serveru, kupiti domenu ili dvije, eventualno se negdje reklamirati ili odlaziti na konferencije kako bi ostali relevantni u vašoj branši. Recimo da na godišnjoj razini još na to potrošite 6000kn, odnosno, svedeno na mjesečni iznos, 500kn mjesečno.</p>
<p>U malo preglednijem tabularnom prikazu, to izgleda ovako:</p>
<table>
<thead>
<tr>
<td><b>Opis</b></td>
<td><b>Iznos (kn/mj)</b></td>
</tr>
</thead>
<tbody>
<tr>
<td><b>Primanja (prihodi)</b></td>
<td><b>16.000</b></td>
<tr>
<td>Mobitel</td>
<td align="right">200</td>
</tr>
<tr>
<td>Internet, režije</td >
<td>200</td>
</tr>
<tr>
<td>Prijevoz</td>
<td>240</td>
</tr>
<tr>
<td>Topli obrok</td>
<td>500</td>
</tr>
<tr>
<td>Netbanking i slični troškovi</td>
<td>100</td>
</tr>
<tr>
<td>Računalo i oprema za rad</td>
<td>830</td>
</tr>
<tr>
<td>Literatura, konferencije, zakup servera, domene, itd</td>
<td>500</td>
</tr>
<tr>
<td><b>Troškovi (rashodi)</b></td>
<td><b>2.570</b></td>
</tr>
<tr>
<td><b>Ukupno dobit</b></td>
<td><b>13.430</b></td>
</tr>
</tbody>
</table>
<p>Ovdje opisani mjesečni troškovi su vrlo općenite procjene, ali malo je vjerojatno da ćete u praksi imati niže troškove. Ovi iznosi predstavljaju dobru početnu brojku za freelancera koji skromno živi, ne ide na konferencije na druge kontinente, kupuje softver sa popustom ili koristi free software, i ne luduje za najnovijim gadgetima.</p>
<p><b>Nadopuna</b>: par ljudi me pitalo o troškovima vezanima uz vođenje knjiga (koje sam namjeravao također uvrstiti ovdje, ali sam zaboravio &#8211; isprika na propustu). Mislim da se svakako isplati to outsourceati knjigovodstvu i prepustiti im brigu o tome koji je trenutno zakon i porez na snazi i u kom trenu kako treba što knjižiti. To zadovoljstvo će vas stajati 500 &#8211; 1000kn. Pretpostavimo da je 500kn + PDV mjesečno, što vam u konačnici smanji mjesečnu plaću &#8220;na ruke&#8221; za oko 200-300 kn.</p>
<h3>Bruto, Neto &amp; još jedan Bruto</h3>
<p>U daljnoj računici stvari se malo kompliciraju. Spomenuta dobit je ono što vam ostane u tvrtki nakon plaćanja troškova, ali to nije vaša plaća. Ukoliko ste obrtnik, ili ukoliko imate d.o.o. i jednostavno si želite cijeli iznos isplatiti kroz plaću, navedena dobit vam je zapravo takozvani <em>bruto2</em>. To je onaj iznos kojeg radnici nikad ne gledaju a zapravo predstavlja trošak poslodavca.</p>
<blockquote>
<p>Mala digresija: <em>neto</em> plaća je ono što dobijemo &#8220;na ruke&#8221; (ili na tekući). <em>Bruto</em> (ili <em>bruto1</em>) plaća je zapravo naša plaća koju nam isplaćuje poslodavac, a iz nje mi osobno plaćamo porez, prirez te izdvajamo za mirovinu (papirologiju poslodavac obavlja umjesto nas, ali novci kojima se plaća su još uvijek naši). Na <em>bruto1</em> poslodavac još plaća zdravstveno osiguranje za nas i još neka davanja, a taj ukupni iznos zove se <em>bruto2</em> i predstavlja ukupni trošak radnika za poslodavca. Detaljniji opis <a href="http://www.moj-posao.net/jseeker_wiki.php?wikiName=Bruto1">bruto1</a> i <a href="http://www.moj-posao.net/jseeker_wiki.php?wikiName=Bruto2">bruto2</a> sa točnim postocima možete naći na Moj Posao portalu.</p>
<p>(Ukoliko ste obrtnik stvari se malo drugačije računaju, jer su davanja fiksna za godinu dana, i nešto niža nego što bi bila davanja iz bruto1. Ali, pošto cijeli račun radimo sa otprilike procjenjenim brojevima, i ovo pojednostavljenje će poslužiti).</p>
</blockquote>
<p>Kalkulatorom za izračun plaće sa <a href="http://www.moj-posao.net/">Moj Posao</a> iz cca 13400kn bruto2 dobijamo otprilike <b>7500 kn</b> neto plaću.</p>
<p>Dakle početnih 16 tisuća srezali smo na 7500, nešto manje od 47% originalnog iznosa. Ostatak su porezi i davanja državi (nešto manje od 37%) te oko 16% za troškove poslovanja.</p>
<p>Ukoliko namjeravate osnovati d.o.o, jedna legalna opcija je isplatiti jedan dio preko normalne plaće, a drugi isplatiti kao dobit doo-a (na što se plaća porez na dobit od 20%). Naravno, problem sa ovim je da si smanjujete i davanja za mirovinsko osiguranje, što vam u dalekoj budućnosti znači manju mirovinu. Doduše, većina poduzetnika koja znam radije bira <em>cash</em> sada nego obećanje da će imati mirovinu za 40tak godina.</p>
<p>Recimo da vas nije briga za vašu mirovinu jednog dana i odlučite biti na minimalcu a ostatak dobiti preuzimati kao dobit. Neto plaća će vam biti oko 2500kn, bruto2 oko 3500kn, a preostali iznos si isplatite kao dobit, od čega oko 7500kn ide vama a oko 2500 državi. Na ovaj način ukupno mjesečno dobijete <b>10000 kn</b> (oko 62% prihoda), državi ide oko 22%, a na troškove poslovanja opet 16%.</p>
<h3>Vel&#8217;ke pare?</h3>
<p>Dakle, kao skromni, marljivi i uspješni freelancer sa oko 16 tisuća kuna prihoda mjesečno, možete očekivati između 7.5 i 10 tisuća kuna &#8220;na ruke&#8221;. Nisu mali novci, pogotovo za zemlju u kojoj velik broj ljudi radi na (skoro) minimalcu ili uopće nema posao, ali nisu ni nekakvi ogromni neobjašnjivi iznosi koje ista osoba sa istim znanjem, sposobnostima i iskustvom ne bi mogla dobiti i u dobrim domaćim tvrtkama.</p>
]]></content:encoded>
			<wfw:commentRss>http://senko.net/freelancer-racunica/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Preporuka: nekoliko filmskih mozgalica</title>
		<link>http://senko.net/mind-flicks/</link>
		<comments>http://senko.net/mind-flicks/#comments</comments>
		<pubDate>Wed, 13 Oct 2010 07:38:58 +0000</pubDate>
		<dc:creator>Senko</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://senko.net/?p=570</guid>
		<description><![CDATA[<a href="http://senko.net/mind-flicks/" title="Preporuka: nekoliko filmskih mozgalica"></a>Kao mali odmak od inače tehnoloških tema o kojima pišem, evo nekoliko filmskih preporuka od mene: filmovi koji se bave umom i zagonetkama koje on skriva. Neki od filmova su poznati blockbusteri koji su nedavno prikazivani u kinima (ili se &#8230;<p class="read-more"><a href="http://senko.net/mind-flicks/">Više &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://senko.net/mind-flicks/" title="Preporuka: nekoliko filmskih mozgalica"></a><p>Kao mali odmak od inače tehnoloških tema o kojima pišem, evo nekoliko filmskih preporuka od mene: filmovi koji se bave umom i zagonetkama koje on skriva. Neki od filmova su poznati <em>blockbusteri</em> koji su nedavno prikazivani u kinima (ili se još prikazuju), poput &#8220;Početka&#8221;, dok su mi drugi bili sasvim nepoznati i slučajno sam na njih naletio, obično u <em>see also</em> dijelu recenzije poznatijih filmova.</p>
<p>Listu sam poredao po subjektivnoj procjeni koliko mi je film &#8220;čudan&#8221;, tj. nekonvencionalnij ili traži veći angažman malih sivih stanica da bi se uživalo u njemu.</p>
<h2>Shutter Island</h2>
<p>US marshall dolazi na otok Shutter, istražiti slučaj osobe pobjegle iz bolnice/zatvora za mentalno bolesne kriminalce. (<a href="http://www.imdb.com/title/tt1130884/">IMDB</a>, <a href="http://www.youtube.com/watch?v=HYVrHkYoY80">YouTube</a>).</p>
<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/HYVrHkYoY80?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/HYVrHkYoY80?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
<h2>Memento</h2>
<p>Čovjek koji je izgubio mogućnost stvaranja novih pamćenja uz pomoć tetovaža i fotografija traga za ubojicom svoje supruge. (<a href="http://www.imdb.com/title/tt0209144/">IMDB</a>, <a href="http://www.youtube.com/watch?v=0vS0E9bBSL0">YouTube</a>).</p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/0vS0E9bBSL0?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/0vS0E9bBSL0?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<h2>The Machinist</h2>
<p>Čovjek koji već godinu dana pati od nesanice počinje gubiti razum. (<a href="http://www.imdb.com/title/tt0361862/">IMDB</a>, <a href="http://www.youtube.com/watch?v=H0fuHY4U1UA">YouTube</a>).</p>
<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/H0fuHY4U1UA?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/H0fuHY4U1UA?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
<h2>Inception</h2>
<p>High-tech kradljivac informacija koji provaljuje u tuđe snove treba odraditi svoj zadnji posao: usaditi ideju u nečiju podsvjest. (<a href="http://www.imdb.com/title/tt1375666/">IMDB</a>, <a href="http://www.youtube.com/watch?v=66TuSJo4dZM">YouTube</a>).</p>
<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/66TuSJo4dZM?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/66TuSJo4dZM?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
<h2>Mr. Nobody</h2>
<p>Tko je Nemo Nobody? (<a href="http://www.imdb.com/title/tt0485947/">IMDB</a>, <a href="http://www.youtube.com/watch?v=fg1VKrLBcr0">YouTube</a>).</p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/fg1VKrLBcr0?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/fg1VKrLBcr0?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<p>Ako znate za još koji dobar film u sličnom stilu, svakako javite u komentarima.</p>
<p>PS. Ako vam filmovi s ovog popisa nisu dovoljno <em>mind-bending</em>, preporučam pogledati <a href="http://www.imdb.com/title/tt0414993/">The Fountain</a> (<a href="http://www.youtube.com/watch?v=YM_NF8ZpqyE">YouTube</a>). Nisam ga stavio na popis jer mi nije dobar poput gorenavedenih, a i nije čisto mind-related).</p>
]]></content:encoded>
			<wfw:commentRss>http://senko.net/mind-flicks/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Razvoj za Android (većinom) iz shella</title>
		<link>http://senko.net/android-development-iz-shella/</link>
		<comments>http://senko.net/android-development-iz-shella/#comments</comments>
		<pubDate>Thu, 23 Sep 2010 13:00:10 +0000</pubDate>
		<dc:creator>Senko</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://senko.net/?p=514</guid>
		<description><![CDATA[<a href="http://senko.net/android-development-iz-shella/" title="Razvoj za Android (većinom) iz shella"></a>Dobričin zanimljiv post o komandnoj liniji na Androidu potaknuo me da opišem svoj Android dev setup. (Update: moj setup je na Linux sustavu, iako vjerujem da su koraci slični ili isti i za OS X ili Windows platforme &#8211; jedina &#8230;<p class="read-more"><a href="http://senko.net/android-development-iz-shella/">Više &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://senko.net/android-development-iz-shella/" title="Razvoj za Android (većinom) iz shella"></a><p><a href="http://senko.net/wp-content/uploads/2010/09/android-dev.jpg"><img src="http://senko.net/wp-content/uploads/2010/09/android-dev.jpg" alt="" title="" width="152" height="144" class="alignright size-full wp-image-528" /></a></p>
<p>Dobričin zanimljiv post o <a href="http://blog.rot13.org/2010/09/android_for_command-line_users.html">komandnoj liniji na Androidu</a> potaknuo me da opišem svoj Android dev setup. (<b>Update:</b> moj setup je na Linux sustavu, iako vjerujem da su koraci slični ili isti i za OS X ili Windows platforme &#8211; jedina razlika je u shellu koji koristite i načinu na koji postavljate path)</p>
<p>Vjerojatno većina programera koji razvijaju za Android (ili su bar skinuli SDK i malo gledaju o čemu se tu radi) koriste Eclipse kao razvojno okruženje. Uostalom, Eclipse je i <a href="http://developer.android.com/guide/developing/eclipse-adt.html">preporučen način razvoja za Android</a>. No kako stvarno ne volim ovaj alat, pri svom radu radije koristim (većinom) komandnolinijske alternative. Na moju sreću, Google nije zanemario i nas koji ne volimo Eclipse, nego nam je osigurao solidan <a href="http://developer.android.com/guide/developing/other-ide.html">set alata</a> s kojima možemo (gotovo) sve što je moguće i sa Eclipseom.</p>
<p>Uz pretpostavku da je Android SDK instaliran u <code>/opt/android-sdk</code>, pokušajmo kreirati, isprogramirati i deployati &#8220;Hello World&#8221; aplikaciju. Prvo ćemo podesiti path tako da možemo jednostavno pozivati SDK alate:</p>
<pre>
&gt; <b>export PATH=/opt/android-sdk</b>
</pre>
<p>Prvi alat koji nam je potreban se zove <b>android</b>, koji nam koristi za kreiranje naših projekata, konfiguriranje emulatora, nadogradnju projekatata kod nadogradnje SDK-a. Ovaj program ima i GUI i komandnolinijsku varijantu &#8211; GUI varijanta je nešto očitija (pogotovo kod kreiranja i konfiguriranja emulatora, odnosno Android Virtual Devicea), no mi ćemo se zasad zadržati na komadnoj liniji.</p>
<p>Pogledajmo prvo koje verzije Androida možemo targetirati:</p>
<pre>
&gt; <b>android list targets</b>
</pre>
<p>Ovim ćemo dobiti popis verzija za koje možemo razvijati našu aplikaciju &#8211; primjerice, Android 2.1 ovdje ima oznaku &#8220;android-7&#8243;. Sa ovom informacijom možemo kreirati naš novi projekt:</p>
<pre>
&gt; <b>android create project --target android-7 \
            --name HelloWorldProject \
            --path moji-projekti/HelloWorldProject \
            --activity Main
            --package hr.primjer.mojprojekt</b>
</pre>
<p>Alat će kreirati potrebne direktorije i popuniti ih potrebnim stvarima, tako da mi možemo odmah otvoriti novostvorenu <code>moji-projekti/HelloWorldProject/src/hr/primjer/mojprojekt/Main.java</code> i editirati activity naše aplikacije.</p>
<p>Nakon što napravimo promjene, možemo buildati cijeli projekt, za početak u debug modu, koristeći ant, vrlo popularan build tool za Java projekte općenito (svu potrebnu konfiguraciju generirao je prethodni poziv <code>android</code> alata):</p>
<pre>
&gt; <b>cd moji-projekti/HelloWorldProject</b>
&gt; <b>ant debug</b>
</pre>
<p>Ukoliko nije bilo grešaka prilikom kompajliranja, trebali bi na kraju dobiti poruku BUILD SUCCESSFUL. Yay! Sada možemo i isprobati kako naša aplikacija radi. Ali prije toga, morat ćemo kreirati i konfigurirati emulator. Naime, Android SDK omogućuje korištenje više emulatora uređaja što je korisno za isprobavanje na različitim hardverskim karakteristikama (npr veličine ekrana, memorija, različiti senzori i slično).</p>
<p>Kako bi kreirali AVD odnosno emulator, najjednostavnije je pokrenuti <code>android</code> bez ikakvih argumenata, čime će se pokrenuti GUI sučelje za konfiguraicju AVD-ova. (Stvar se može i preko komandne linije, ali tko će popamtiti sve switcheve za to).</p>
<p>Kada imamo jedan ili više AVDova kreiranih, možemo ih na brzaka izlistati sa <code>android list avd</code>, a potom i pokrenuti željeni emulator (ili više njih):</p>
<pre>
&gt; <b>emulator -avd <i>ImeAVDUređaja</i></b>
</pre>
<p>Osim samog emulatora, korisna stvar je i Dalvik Debug Monitor (<i>ddms</i>), standalone GUI alat koji omogućuje pregledavanje <i>trace</i> logova, očitanje stanja uređaja, ili emulatora, uzimanje screenshota i slično. Neke od ovih stvari dostupne su i izravno iz komandne linije (za potpun popis upišite samo <code>adb</code> što će vam prikazati pomoć):</p>
<pre>
&gt; <b>adb devices</b> # lista spojenih uređaja
&gt; <b>adb logcat</b> # ispis trace logova
&gt; <b>adb emu &lt;cmd&gt;</b> # zadavanje naredbe emulatoru
&gt; <b>adb shell</b> # remote shell na emulator ili uređaj
</pre>
<p>Nakon što smo napravili debug build naše aplikacije, i pokrenuli emulator, trebamo aplikaciju &#8220;instalirati&#8221; u emulator kako bi je mogli isprobati:</p>
<pre>
&gt; <b>adb install -r bin/HelloWorldProject-debug.apk</b>
</pre>
<p>Opcija <code>-r</code> znači &#8220;reinstall&#8221; i govori <i>adb</i>u da, ukoliko aplikacija već postoji na uređaju, makne postojeću i instalira je nanovo (korisnički podaci pritom ostaju netaknuti).</p>
<p>Ukoliko imate istovremeno pokrenut emulator i spojen uređaj, opcijama <code>-e</code> (emulator) ili <code>-d</code> (device) određujete kamo želite poslati instalaciju. U slučaju da istovremeno imate spojeno nekoliko emulatora ili uređaja, opcijom <code>-s</code> možete točno odrediti cilj naredbe (argument za <code>-s</code> je ID emulatora kojeg možete saznati sa <code>adb devices</code>).. Sve tri opcije vrijede za većinu <i>adb</i> naredbi, ne samo za install.</p>
<p>Nakon što je aplikacija dovršena i prošla je testiranje u emulatorima i na testnim uređajima, potrebno je napraviti <i>release</i> paket, koji možemo distribuirati korisnicima naše aplikacije. Prilikom izrade release paketa, potrebno ga je <i>potpisati</i> našim developerskim ključem (koji, ukoliko aplikaciju distribuirate na Market, mora biti također prijavljen na Android Marketu). Developerski ključ možete sami kreirati alatom <code>keytool</code>, a više o tome možete pročitati na <a href="http://developer.android.com/guide/publishing/app-signing.html">Android Dev Guide stranicama</a>. Procedura je zapravo ista i za Eclipse korisnike i za ostale, osim što ako ne koristite eclipse, putanju do keystorea je potrebno ručno dodati u <code>build.properties</code> datoteku unutar vašeg projekta.</p>
<p>Sam postupak buildanja u release modu i potpisivanja je jednostavan:</p>
<pre>
&gt; <b>ant release</b>
</pre>
<p>&#8230;nakon čega dobijate <code>bin/HelloWorldProject-release.apk</code> datoteku koju možete instalirati na uređaje, uploadati na Market ili distribuirati na neki drugi način.</p>
]]></content:encoded>
			<wfw:commentRss>http://senko.net/android-development-iz-shella/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Git početnica, 4. dio &#8211; rješavanje konflikata</title>
		<link>http://senko.net/git-rjesavanje-konflikta/</link>
		<comments>http://senko.net/git-rjesavanje-konflikta/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 15:07:36 +0000</pubDate>
		<dc:creator>Senko</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://senko.net/?p=437</guid>
		<description><![CDATA[<a href="http://senko.net/git-rjesavanje-konflikta/" title="Git početnica, 4. dio - rješavanje konflikata"></a>U prošlom postu u Git serijalu spomenuli smo mogućnost konflikata prilikom rebaziranja ili spajanja grana te dali par sugestija kako ih izbjeći. No kod kompliciranijih projekata i workflowova konflikti su ponekad neizbježni, stoga je korisno znati kako riješiti konflikt kad &#8230;<p class="read-more"><a href="http://senko.net/git-rjesavanje-konflikta/">Više &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://senko.net/git-rjesavanje-konflikta/" title="Git početnica, 4. dio - rješavanje konflikata"></a><p>U <a href="http://senko.net/git-rukovanje-promjenama/" title="Git početnica - rukovanje promjenama">prošlom postu u Git serijalu</a> spomenuli smo mogućnost konflikata prilikom rebaziranja ili spajanja grana te dali par sugestija kako ih izbjeći. No kod kompliciranijih projekata i <em>workflowova</em> konflikti su ponekad neizbježni, stoga je korisno znati kako riješiti konflikt kad do njega dođe.</p>
<h2>Rješavanje konflikata</h2>
<p>Ukoliko sami radite na projektu, konflikti vam se vjerojatno neće događati (osim ukoliko ne pazite). No, ukoliko radite na projektu sa više ljudi, može vam se zadesiti da se nađete u situaciji gdje ćete morati riješiti konflikt.</p>
<p>Recimo da je naš helloworld projekt dobio na važnosti i sada na njemu rade dva developera, Mirko i Slavko. Mirko i Slavko u stvarnom životu radit će na svojim granama u svojim klonovima repozitorija, ali da si ovdje pojednostavnimo priču, svaki će imati po jednu granu u našem zajedničkom repozitoriju.</p>
<p>Kreirajmo obje grane, bez prebacivanja u njih:</p>
<pre>
&gt; git checkout master
Switched to branch 'master'

&gt; git branch mirko
&gt; git branch slavko
&gt; git branch -l
  helloworld-0
* master
  mirko
  slavko
</pre>
<p>Dolazi Mirko, vidi problem u načinu kako je definirana funkcija <code>main</code> i popravlja ga u svojoj grani:</p>
<pre>
&gt; git checkout mirko
Switched to branch 'mirko'

[...promjene hello.c...]

&gt; git diff
diff --git a/hello.c b/hello.c
index 0bb4941..8b08068 100644
--- a/hello.c
+++ b/hello.c
@@ -1,6 +1,7 @@
 #include &lt;stdio.h&gt;

-int main(void)
+int
+main(int argc, char *argv[])
 {
   printf("Hello world\n");
   return 0;

&gt; git commit -a -m "popravio main prototip"
[mirko 4e5f904] popravio main prototip
 1 files changed, 2 insertions(+), 1 deletions(-)
</pre>
<p>U međuvremenu, dolazi Slavko, vidi isti problem, ne zna da je Mirko radio na istoj stvari pa ga rješava kod sebe:</p>
<pre>
&gt; git checkout slavko
Switched to branch 'slavko'

[...promjene hello.c...]

&gt; git diff
diff --git a/hello.c b/hello.c
index 0bb4941..38586b0 100644
--- a/hello.c
+++ b/hello.c
@@ -1,6 +1,6 @@
 #include &lt;stdio.h&gt;

-int main(void)
+int main(int argc, char **argv)
 {
   printf("Hello world\n");
   return 0;

&gt; git commit -a -m "prepravio definiciju funkcije main"
[slavko 4bb59be] prepravio definiciju funkcije main
 1 files changed, 1 insertions(+), 1 deletions(-)
</pre>
<p>Sve je dobro dok su promjene u zasebnim granama. No u jednom trenu ćemo željeti sve Mirkove i Slavkove promjene spojiti u master. Prva promjena će proći dobro, no na drugoj će nam se dogoditi konflikt. </p>
<pre>
&gt; git checkout master
Switched to branch 'master'

&gt; git merge mirko
git merge mirko
Updating 302ef80..4e5f904
Fast-forward
 hello.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

&gt; git merge slavko
git merge slavko
Auto-merging hello.c
CONFLICT (content): Merge conflict in hello.c
Automatic merge failed; fix conflicts and then commit the result.
</pre>
<p>Uh, huh&#8230; obojica su mijenjala isto mjesto u istoj datoteci, i git ne zna kako riješiti problem. Zbog toga je merge pauziran i dana nam je prilika da riješimo konflikt. Pogledajmo što se dogodilo:</p>
<pre>
git diff
diff --cc hello.c
index 8b08068,38586b0..0000000
--- a/hello.c
+++ b/hello.c
@@@ -1,7 -1,6 +1,11 @@@
  #include &lt;stdio.h&gt;

++&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
 +int
 +main(int argc, char *argv[])
++=======
+ int main(int argc, char **argv)
++&gt;&gt;&gt;&gt;&gt;&gt;&gt; slavko
  {
    printf("Hello world\n");
    return 0;

&gt; cat hello.c
#include &lt;stdio.h&gt;

&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
int
main(int argc, char *argv[])
=======
int main(int argc, char **argv)
&gt;&gt;&gt;&gt;&gt;&gt;&gt; slavko
{
  printf("Hello world\n");
  return 0;
}
</pre>
<p>Diff prikazuje obje nekompatibilne promjene. Prva je iz trenutne grane (odnosno to je ona Mirkova promjena koju smo uspješno preuzeli spajanjem Mirkove grane), dok je druga iz grane <em>slavko</em>. Rješimo konflikt modificiranjem tog dijela datoteke da izgleda onako kako mi želimo:</p>
<pre>
[...promjene hello.c...]
cat hello.c
#include &lt;stdio.h&gt;

int
main(int argc, char **argv)
{
  printf("Hello world\n");
  return 0;
}

&gt; git diff
diff --cc hello.c
index 8b08068,38586b0..0000000
--- a/hello.c
+++ b/hello.c
@@@ -1,7 -1,6 +1,7 @@@
  #include <&lt;tdio.h&gt;

 -int main(int argc, char **argv)
 +int
- main(int argc, char *argv[])
++main(int argc, char **argv)
  {
    printf("Hello world\n");
    return 0;

&gt; git add hello.c
&gt; git commit
[master fd96bab] Merge branch 'slavko'
</pre>
<p>Diff prikaz u slučaju konflikata je pomalo zbunjujuć, no snalaženje u samoj datoteci koju treba popraviti je relativno jednostavno - konflikt je između <code>&lt;&lt;&lt;&lt;&lt;&lt;&lt;</code> i <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt;</code>, a <code>=======</code> razdvaja konfliktne promjene.</p>
<h2>Konflikt prilikom rebaziranja</h2>
<p>Kao što smo već prije vidjeli, obično želimo grane održavati tako da u svakom trenu njihove promjene budu primjenjive na <em>master</em> (odnosno na baznu granu gdje ih na kraju želimo spojiti), a jedan od razloga je upravo izbjegavanje konflikata kod spajanja.</p>
<p>Jedan od razloga zbog kojih je konflikt kod spajanja nezgodan je i činjenica da problem praktički "prebacujemo" onom tko radi merge, a kod većih projekata to je obično osoba koja održava projekt (tj. glavni developer). Ukoliko od nje tražite da granu sa vašim promjenama spaja sa masterom, a to izaziva konflikte kod mergea, zapravo ste prilično nepristojni.</p>
<p>Zato je bolje prije nego zatražite (ili krenete raditi) spajanje rebazirati svoju granu tako da samo spajanje bude čisto. To znači da ćete eventualne konflikte morati sami rješiti prilikom rebaziranja.</p>
<p>Vratimo se malo u prošlost i zaboravimo da smo radili merge Mirkove i Slavkove grane:</p>
<pre>
&gt; git reset --hard 302ef80039bd55fbbc680d84e37e5ebcf7f63a5c
HEAD is now at 302ef80 dodan README
</pre>
<p>Mirko odluči spojiti svoju granu s masterom. Njegovu granu nije potrebno rebazirati jer se nastavlja na master (tj master nema nikakvih novih promjena):</p>
<pre>
&gt; git merge mirko
Updating 302ef80..4e5f904
Fast-forward
 hello.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)
</pre>
<p>Slavko odluči spojiti svoju granu. Njegovu granu je potrebno rebazirati jer<br />
master ima novih comittova:</p>
<pre>
&gt; git checkout slavko
Switched to branch 'slavko'

&gt; git rebase master
First, rewinding head to replay your work on top of it...
Applying: prepravio definiciju funkcije main
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging hello.c
CONFLICT (content): Merge conflict in hello.c
Failed to merge in the changes.
Patch failed at 0001 prepravio definiciju funkcije main

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".
</pre>
<p>Ovo izgleda mnogo strašnije nego poruka kod mergea! Ali problem je isti, u što se možemo uvjeriti pomoću <code>git diff</code> (s tim da će umjesto imena naše grane biti naziv commita u našoj grani s kojim ima problema). Nakon što napravimo ispravke u datoteci, trebamo nastaviti proces rebaziranja:</p>
<pre>
[...promjene hello.c...]
&gt; git add hello.c
&gt; git rebase --continue
Applying: prepravio definiciju funkcije main
</pre>
<p>Ovdje nismo ručno radili <code>git commit</code>, nego smo nakon popravka nastavili proces rebaziranja. Kako rebaziranje ide commit po commit, ukoliko ima još konflikata u narednim commitovima, rebase bi se opet zaustavio i zatražio da popravimo stvari.</p>
<p>Ukoliko zaključimo da je commit nepotreban (npr. zato što je u drugoj grani taj problem već riješen), možemo ga odbaciti. Ako se radi o ozbiljnom problemu za kojeg ne znamo kako ga riješiti, možemo prekinuti rebase, a grana će nam se vratiti u prvobitno stanje. U tom slučaju ćemo vjerojatno morati rješavati merge konflikte prilikom spajanja i napraviti merge a ne rebase.</p>
]]></content:encoded>
			<wfw:commentRss>http://senko.net/git-rjesavanje-konflikta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git početnica, 3. dio &#8211; rukovanje promjenama</title>
		<link>http://senko.net/git-rukovanje-promjenama/</link>
		<comments>http://senko.net/git-rukovanje-promjenama/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 10:37:36 +0000</pubDate>
		<dc:creator>Senko</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://senko.net/?p=420</guid>
		<description><![CDATA[<a href="http://senko.net/git-rukovanje-promjenama/" title="Git početnica, 3. dio - rukovanje promjenama"></a>Nakon što smo u prošlom postu proučili kako raditi grananje, spajanje i rebaziranje grana, git nam već može biti poprilično koristan alat. Kako projekt raste, git nam može pomoći da ne izgubimo glavu u različitim granama i verzijama koje održavamo &#8230;<p class="read-more"><a href="http://senko.net/git-rukovanje-promjenama/">Više &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://senko.net/git-rukovanje-promjenama/" title="Git početnica, 3. dio - rukovanje promjenama"></a><p>
Nakon što smo u prošlom postu proučili kako raditi <a href="http://senko.net/git-branch-merge-rebase/">grananje, spajanje i rebaziranje grana</a>, git nam već može biti poprilično koristan alat.  Kako projekt raste,  git nam može pomoći da ne izgubimo glavu u različitim granama i verzijama koje održavamo unutar jednog projekta.</p>
<h2>Interaktivno dodavanje promjena</h2>
<p>Prilikom rada na projektu, često ćemo da bi stvar uopće natjerali da radi morati napraviti nekoliko nezavisnih promjena, a tek onda biti sigurni da smo dobili dobar rezultat. Obično tek tada želimo napraviti commit, ali bismo htjeli da nezavisne promjene idu u nezavisne commitove. Ako se te promjene nalaze u istoj datoteci, običan <code>git add</code> nam ne pomaže jer bi on označio cijelu datoteku za commit.</p>
<p>U tom slučaju možemo koristiti interaktivno dodavanje. Ono nam pruža veću kontrolu nad time što dodajemo u commit, a i preglednije je (i pruža nam priliku za review napravljenoga prije commitanja), pa preporučam da ga uvijek koristite, čak i kad želite dodati sve promjene.</p>
<p><p>Recimo da smo napravili dvije nezavisne izmjene u <code>hello.c.</code> datoteci i želimo ih committati odvojeno (primjer radim u novoj test grani koju ću kasnije obrisati):</p>
<pre>
&gt; git checkout -b test
Switched to a new branch 'test'

&gt; git diff
diff --git a/hello.c b/hello.c
index 0bb4941..d560074 100644
--- a/hello.c
+++ b/hello.c
@@ -1,3 +1,4 @@
+#include &lt;stdlib.h&gt;
 #include &lt;stdio.h&gt;

 int main(void)
@@ -5,3 +6,9 @@ int main(void)
   printf("Hello world\n");
   return 0;
 }
+
+void unused(void)
+{
+  puts("I'm never used");
+}
+

&gt; git add -p
diff --git a/hello.c b/hello.c
index 0bb4941..d560074 100644
--- a/hello.c
+++ b/hello.c
@@ -1,3 +1,4 @@
+#include <stdlib.h>
 #include <stdio.h>

 int main(void)
Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]? y
@@ -5,3 +6,9 @@ int main(void)
   printf("Hello world\n");
   return 0;
 }
+
+void unused(void)
+{
+  puts("I'm never used");
+}
+
Stage this hunk [y,n,q,a,d,/,K,g,e,?]? n
</pre>
<p>Ovo će označiti (tj. spremiti u index) samo prvu promjenu u datoteci za committanje. To možemo provjeriti sa <code>git diff --cached</code>:</p>
<pre>
git diff --cached
diff --git a/hello.c b/hello.c
index 0bb4941..c6efc61 100644
--- a/hello.c
+++ b/hello.c
@@ -1,3 +1,4 @@
+#include &lt;stdlib.h&gt;
 #include &lt;stdio.h&gt;

 int main(void)
</pre>
<h2>Pregled promjena u datotekama</h2>
<p>Nakon što neko vrijeme radite na projektu, većina datoteka unutar projekta<br />
vjerojatno će biti mijenjana mnogo puta. Kako bi vidjeli koje promjene smo radili<br />
nad jednom datotekom (ili direktorijem), možemo koristiti još jedan oblik<br />
već poznate <code>git log</code> naredbe:</p>
<pre>
&gt; git log hello.c
commit 5e547517e1a29a08b3594f6b8c8c0a289070376d
Author: Senko Rasic &lt;senko@localhost&gt;
Date:   Sat Jan 23 06:31:05 2010 +0100
popravljen kod

commit 04f3667425705d29f2c3a10bb45e79f5cc6b7d7d
Author: Senko Rasic &lt;senko@localhost&gt;
Date:   Sat Jan 23 05:49:59 2010 +0100
malo uljepsano

commit 6e70237aaa84a0c8ff74bd0fad6cccb4d118b695
Author: Senko Rasic &lt;senko@localhost&gt;
Date:   Sat Jan 23 05:49:03 2010 +0100
prva verzija
</pre>
<p>Ovaj ispis dobar je ako želimo kronološki pregled promjena. No često je slučaj<br />
da nas zanima zašto je baš neki dio (trenutne) datoteke napisan tako je, tj. koji<br />
je razlog za dodavanje (ili promjenu) pojedine linije unutar koda.</p>
<p>Pregled promjena po pojedinim linijama datoteke omogućuje nam <code>git blame</code>,<br />
tako nazvan jer nam govori tko je odgovoran za pojedinu liniju datoteke i zašto:</p>
<pre>
&gt; git blame hello.c
5e547517 (Senko Rasic 2010-01-23 06:31:05 +0100 1) #include &lt;stdio.h&gt;
5e547517 (Senko Rasic 2010-01-23 06:31:05 +0100 2)
5e547517 (Senko Rasic 2010-01-23 06:31:05 +0100 3) int main(void)
04f36674 (Senko Rasic 2010-01-23 05:49:59 +0100 4) {
04f36674 (Senko Rasic 2010-01-23 05:49:59 +0100 5)   printf("Hello world\n");
5e547517 (Senko Rasic 2010-01-23 06:31:05 +0100 6)   return 0;
04f36674 (Senko Rasic 2010-01-23 05:49:59 +0100 7) }
</pre>
<p>Popis za svaku liniju sadrži skraćeni ID commita, autora te datum promjene.<br />
Nakon što identificiramo promjenu koja nas zanima, pomoću već poznate<br />
<code>git show</code> naredbe možemo vidjeti i ostale detalje te promjene.</p>
<h2>Označavanje (tagiranje) commitova</h2>
<p>Naš &#8220;Hello World&#8221; projekt već ima praktički svu funkcionalnost koju želimo,<br />
stoga je pravo vrijeme da napravimo naš prvi release. Osim što možemo napraviti<br />
arhivu izvornog koda (kao tar.gz ili u nekom drugom formatu) i poslati je korisnicima<br />
svog programa, korisno je i u samom repozitoriju označiti da smo napravili<br />
release.</p>
<p>Kako bismo &#8220;zapamtili&#8221; da smo napravili release, možemo dodati oznaku (tag) na<br />
trenutni commit. Kako svaki commit zna za sve koji su se dogodili prije njega,<br />
ta oznaka poslužit će nam da bi na jednostavan način dolazili do stanja projekta<br />
u raznim fazama razvoja, bez da pamtimo IDeve comittova.</p>
<p>Oznaka (tj. tag) je (pojednostavljeno) najobičniji &#8220;alias&#8221; na ID commita.<br />
Postavljenu oznaku možemo koristiti praktički svugdje gdje moramo navoditi ID<br />
commita. Možemo ga koristiti kako god želimo &#8211; najčešća praksa je obilježavanje<br />
kad se dogodilo nešto značajno u projektu, kao što je release.</p>
<p>Tagirajmo release 0.1 našeg projekta. Kako release radimo iz <em>master</em><br />
grane, pripazit ćemo ne tagiramo commit u krivoj grani:</p>
<pre>
&gt; git checkout master
&gt; git tag -m "postavljamo tag" "helloworld-0.1"
</pre>
<p>tagove možemo pregledavati pomoću <code>git tag -l</code>, a brisati pomoću<br />
<code>git tag -d &lt;ime_taga&gt;</code>.</p>
<p>Prilikom postavljanja oznake, možemo je i kriptografski potpisati (gpg-om,<br />
uz korištenje gpg privatnog ključa za mail adresu koju koristimo kod rada<br />
s repozitorijem), korištenjem opcije <code>-s</code>.</p>
<p>Sretni sa napravljenim releasom, krećemo dalje sa razvojem projekta. Verzija<br />
0.1 je potpun program, ali mu nedostaje build sustav, zbog čega svaki put moramo<br />
ručno pozivati kompilator. Namjera nam je to riješiti korištenjem <em>make</em><br />
alata.</p>
<p>Kreirajmo konfiguracijsku datoteku za <em>make</em> zvanu <code>Makefile</code><br />
(napomena: make je izbirljiv glede sintakse, stoga je bitno na određenim mjestima<br />
koristiti tab umjesto razmaka, što je posebno naznačeno u ovom listingu):</p>
<pre>
CC = gcc
OBJS = hello.o
CFLAGS = -Wall -Werror -O3 -g

.PHONY: all clean

all: hello

hello: $(OBJS)
&lt;tab&gt;$(CC) $(OBJS) -o $@

%.o: %.c
&lt;tab&gt;$(CC) $(CFLAGS) -c $< -o $@

clean:
&lt;tab&gt;rm -f hello $(OBJS)
</pre>
<p>Dodajmo novostvorenu datoteku u projekt, repozicionirajmo <em>doc</em> granu<br />
(pošto imamo novosti u masteru) i spojimo je natrag u <em>master</em> granu.<br />
Pošto smo završili sa <em>doc</em> granom, na kraju je možemo i obrisati.</p>
<pre>
&gt; git add Makefile
&gt; git commit -m "dodan Makefile"
master b23a04b] dodan Makefile
 1 files changed, 17 insertions(+), 0 deletions(-)
 create mode 100644 Makefile

&gt; git checkout doc
Switched to branch 'doc'

&gt; git rebase master
First, rewinding head to replay your work on top of it...
Applying: dodan README

&gt; git checkout master
Switched to branch 'master'

&gt; git merge doc
Updating b23a04b..302ef80
Fast-forward
 README.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 README.txt

&gt; git branch -d doc
Deleted branch doc (was 302ef80).
</pre>
<p>Pregršt novih promjena! Pogledajmo što smo sve izmjenili od zadnjeg releasea:</p>
<pre>
&lt; git log helloworld-0.1..HEAD
commit 302ef80039bd55fbbc680d84e37e5ebcf7f63a5c
Author: Senko Rasic &lt;senko@localhost&gt;
Date:   Sat Jan 23 06:06:26 2010 +0100
dodan README

commit b23a04b47dbc1044d44d94ee0a5df967f8f1b26d
Author: Senko Rasic &lt;senko@localhost&gt;
Date:   Fri Feb 5 16:02:54 2010 +0100
dodan Makefile
</pre>
<p>Poput grana, tagove je moguće <em>checkout</em>-ati, čime se vraćamo u prošlost,<br />
u stanje projekta kakvo je bilo u trenutku tagiranja. Vratimo se malo u prošlost<br />
do naše verzije 0.1:</p>
<pre>
&gt; git checkout helloworld-0.1
Note: moving to 'helloworld-0.1' which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at 5e54751... popravljen kod
</pre>
<p>Git nas upozorava da smo došli na commit koji nije zadnji u nekoj grani. Ukoliko<br />
želimo raditi bilo kakve modifikacije na projektu od ove točke, moramo kreirati novu<br />
granu u koju će one biti spremljene.</p>
<h2>Razvojne i stabilne grane</h2>
<p>Ovo nam daje dobru ideju - možemo kreirati novu granu s početkom u helloworld-0.1,<br />
koja služi samo za "održavanje" postojećeg koda i ispravljanje pogrešaka, dok ćemo sav<br />
novi razvoj na projektu raditi kao i do sada na <em>master</em>u. Ovime se želimo<br />
osigurati da imamo "stabilnu verziju" projekta u koju nam neće slučajno upadati i<br />
nove stvari koje razvijamo na "razvojnoj verziji" projekta na <em>master</em> grani.</p>
<pre>
&gt; git checkout -b helloworld-0 helloworld-0.1
Switched to a new branch 'helloworld-0'
</pre>
<p>Grana <code>helloworld-0</code> sadrži commit tagiran sa 'helloworld-0.1' i<br />
sve njegove prethodnike i predstavlja stanje projekta kakvo je bilo u trenutku<br />
kada smo tagirali taj commit. Granu potom možemo koristiti samo za promjene na<br />
stabilnoj/releasanoj verziji, dok nam master ostaje za novi razvoj.</p>
<h2>Cherry-picking</h2>
<p>Ponekad prilikom rada na novoj verziji uočimo i ispravimo pogrešku koja postoji<br />
i u već releasanoj verziji. Iako bismo ispravke mogli napraviti posebno na obje<br />
grane, jednostavnije je ispravak napraviti na jednoj (obično razvojnoj, tj.<br />
masteru) i nakon toga istu zakrpu primjeniti i na drugu. Ukoliko ispravku radimo<br />
na masteru, primjenjivanje zakrpe i na starije release grane se zove<br />
<em>backporting</em>.</p>
<p>Da bismo napravili backport commita koji ispravlja neku grešku, ne možemo<br />
koristiti niti merge niti rebase, jer oni preuzimaju sve commitove iz mastera.<br />
U slučaju kada želimo izabrati samo jedan commit (ili nekoliko njih, ali ne<br />
cijelu granu) iz jedne grane i primjeniti ga na drugu, možemo koristiti<br />
<code>git cherry-pick</code>.</p>
<p>Korisnici verzije 0.1 našeg softvera su ogorčeni jer ručno moraju pokretati<br />
gcc. Smatraju da je to bug, a kako mi već imamo rješenje u obliku Makefilea<br />
u master grani, rješenje je jednostavno - backportati commit koji je dodao<br />
Makefile i napraviti novi release na 0.* grani.</p>
<pre>
&gt; git cherry-pick b23a04b47dbc1044d44d94ee0a5df967f8f1b26d
Finished one cherry-pick.
[helloworld-0 f60bcbd] dodan Makefile
 1 files changed, 17 insertions(+), 0 deletions(-)
 create mode 100644 Makefile
</pre>
<p>Traženi commit je preuzet u trenutnu granu. Preciznije, promjene<br />
koje je traženi commit napravio su napravljene i spremljene i za trenutnu granu.<br />
Ovo je bitno zbog toga što se ID commita mijenja - kao i kod rebasea, originalni<br />
i cherry-pickani commitovi nisu isti. Ovisno o daljnjim promjenama koje radimo<br />
na grani, možemo se naći u situaciji da granu više nije moguće rebazirati ili<br />
spojiti sa masterom, odnosno trebali bi rješavati konflikte. Stoga bi trebalo<br />
izbjegavati cherry-picking iz grane koju u budućnosti želimo spojiti sa trenutnom<br />
granom.</p>
<p>Više o konfliktima te što napraviti kad vam se oni dogode pročitajte u slijedećem postu u ovom serijalu, za par dana...</p>
]]></content:encoded>
			<wfw:commentRss>http://senko.net/git-rukovanje-promjenama/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tjedan konferencija</title>
		<link>http://senko.net/tjedan-konferencija/</link>
		<comments>http://senko.net/tjedan-konferencija/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 19:40:09 +0000</pubDate>
		<dc:creator>Senko</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://senko.net/?p=422</guid>
		<description><![CDATA[<a href="http://senko.net/tjedan-konferencija/" title="Tjedan konferencija"></a>FOSDEM Ovaj vikend se u Bruxellesu održava tradicionalna FOSDEM konferencija. Broj zanimljivih predavanja i prezentacija je ogroman (samo popis stvari koje bih želio poslušati zahtjeva da se kloniram par puta :), a osim toga bit će velik broj zanimljivih ljudi &#8230;<p class="read-more"><a href="http://senko.net/tjedan-konferencija/">Više &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://senko.net/tjedan-konferencija/" title="Tjedan konferencija"></a><h2>FOSDEM</h2>
<p>Ovaj vikend se u Bruxellesu održava tradicionalna FOSDEM konferencija. Broj zanimljivih predavanja i prezentacija je ogroman (samo popis stvari koje bih želio poslušati zahtjeva da se kloniram par puta :), a osim toga bit će velik broj zanimljivih ljudi koji se bave različitim stvarima, štandova, &#8230; a ne smijemo zaboraviti niti belgijsku pivu :) Tako  da mi je drago da ću i ove godine prisustvovati ovoj konferenciji.</p>
<p><a href="http://www.fosdem.org"><img src="http://www.fosdem.org/promo/going-to" alt="I'm going to FOSDEM, the Free and Open Source Software Developers' European Meeting" /></a></p>
<p>Računajte na #fosdem tweetove (po uvjetom da gomile geekova ne preopterete wireless, što je obično slučaj :) te kasnije i blog post o stvarima koje su se meni osobno isticale na konfi.</p>
<h2>IT Showoff</h2>
<p>Slijedeći petak će se u prostoru FERa u Zagrebu održati prvi jubilarni <a href="http://www.itshowoff.com/" title="IT Showoff">IT Showoff</a>, na kojem ću održati prezentaciju i demo o tome kako i zašto koristiti <em>git</em>. Sa sobom ću imati i N900 i laptop sa složenom razvojnom okolinom za Maemo, pa mi se slobodno javite ukoliko želite popričati o Maemu, N900 te razvoju softvera za ovaj sustav. </p>
<p><a href="http://www.itshowoff.com/" title="IT Showoff"><img src="http://a3.twimg.com/profile_images/577375803/bik2.png" alt="IT Showoff" /></a></p>
<h2>N900 na eHrvatska TV</h2>
<p>Kad smo već kod N900, nedavno je ekipa iz <a href="http://twitter.com/e_Hrvatska">eHrvatska TV</a> napravila reportažu o ovom uređaju, Maemou i Linuxu u sklopu koje su i mene priupitali za par pitanja. Snimku reportaže možete pogledati na <a href="http://www.youtube.com/watch?v=IfMk6mnCAO0">eHrvatska kanalu na YouTube-u</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://senko.net/tjedan-konferencija/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Git početnica, 2. dio &#8211; grananje, spajanje, rebaziranje</title>
		<link>http://senko.net/git-branch-merge-rebase/</link>
		<comments>http://senko.net/git-branch-merge-rebase/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 08:17:04 +0000</pubDate>
		<dc:creator>Senko</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://senko.net/?p=405</guid>
		<description><![CDATA[<a href="http://senko.net/git-branch-merge-rebase/" title="Git početnica, 2. dio - grananje, spajanje, rebaziranje"></a>U prethodnom postu u serijalu o korištenju distrbuiranih sustava za verzioniranje projekata pokazao sam osnove korištenja git-a, ali se nisam dotaknuo zanimljivih dijelova kod kojih distribuirani sustavi pokazuju svoju pravu stranu &#8211; grananje projekata u različite verzije, spajanje verzija nazad &#8230;<p class="read-more"><a href="http://senko.net/git-branch-merge-rebase/">Više &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://senko.net/git-branch-merge-rebase/" title="Git početnica, 2. dio - grananje, spajanje, rebaziranje"></a><p>
U <a href="http://senko.net/git-pocetnica/">prethodnom postu</a> u serijalu o korištenju distrbuiranih sustava za verzioniranje projekata pokazao sam osnove korištenja git-a, ali se nisam dotaknuo zanimljivih dijelova kod kojih distribuirani sustavi pokazuju svoju pravu stranu &#8211; grananje projekata u različite verzije, spajanje verzija nazad u jednu i repozicioniranje pojedinih grana u odnosu na druge grane (<em>rebasing</em>).
</p>
<p>
Ovi pojmovi koriste se u većini (svim?) distribuiranim SCM sustavima, ali se ovdje situacija već dovoljno komplicira da različiti sustavi na ne posve identične načine pristupaju istom problemu. Zbog toga je ovaj post posve specifičan i priča o git-u. Ukoliko koristite neki drugi SCM, imajte na umu da je stvar slična, ali se pojedinosti vjerojatno podosta razlikuju.</p>
<h2>Grananje (branch)</h2>
<p>
U našem <em>hello world</em> projektu zasad imamo samo jednu granu, <em>master</em>, na kojoj smo radili sve promjene. To nam je odgovaralo jer smo točno znali što želimo napraviti slijedeće i nismo imali potrebe raditi više stvari paralelno (ili eksperimentirati u više različitih smjerova odjednom).
</p>
<p>
No, sada bismo željeli početi pisati i dokumentaciju za projekt. Kako nam se promjene vezane uz dokumentaciju ne bi mješale sa eventualnim nevezanim promjenama koda koje ćemo možda htjeti raditi, dokumentaciju ćemo dodavati u posebnoj grani projekta koju ćemo na kraju spojiti u glavnu. Kreirajmo novu granu <em>doc</em> iz postojeće <em>master</em> grane i odmah se prebacimo u nju:</p>
<pre>
&gt; git checkout -b doc master
Switched to a new branch 'doc'
</pre>
<p>Za početak ćemo samo kreirati datoteku <code>README.txt</code> i u nju staviti osnovnu informaciju o programu:</p>
<pre>
Ovo je tipični "Hello World" program pisan u C-u.
</pre>
<p>Dodajmo datoteku u repozitorij, napravimo commit, i pogledajmo što smo dobili:</p>
<pre>
&gt; git add README.txt
&gt; git commit -m "dodan README"
[doc 7bb37b0] dodan README
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 README.txt
&gt; git log
commit 7bb37b04d7eeb36dc91e60ef1d01e2648bb2e813
Author: Senko Rasic <senko@localhost>
Date:   Sat Jan 23 06:06:26 2010 +0100
dodan README

commit 459b8bd04f3667425705d29f2c3a10bb45e79f5c
Author: Senko Rasic &lt;senko@localhost&gt;
Date:   Fri Dec 11 00:53:32 2009 +0100
malo uljepsano

commit ac3a48559de3b7f225ffa96c504a8586057fb4b9
Author: Senko Rasic &lt;senko@localhost&gt;
Date:   Fri Dec 11 00:38:16 2009 +0100
prva verzija
</pre>
<p>
Kako smo granu <em>doc</em> stvorili iz grane <em>master</em>, ona je uključuje sve dosadašnje promjene. Ovaj prikaz nam nije previše koristan ukoliko želimo vidjeti samo razliku između trenutne grane i mastera. To možemo napraviti ovako:</p>
<pre>
&gt; git log master..HEAD
commit 7bb37b04d7eeb36dc91e60ef1d01e2648bb2e813
Author: Senko Rasic &lt;senko@localhost&gt;
Date:   Sat Jan 23 06:06:26 2010 +0100
dodan README
</pre>
<p>Argumentom <code>master..HEAD</code> zatražili smo log svih promjena do zadnjeg commita u trenutnoj grani (<code>HEAD</code>) koje se ne nalaze u <em>master</em> grani. Osim od-do, parametar može biti i samo jedna oznaka, čime se traži log svih promjena od početka do te oznake. Tako će <code>git log master</code> prikazati log svih promjena na grani <em>master</em> bez obzira u kojoj smo grani trenutno. Oznaka <code>HEAD</code> uvijek pokazuje na posljednji commit u trenutnoj grani, pa je <code>git log HEAD</code> isto što i samo <code>git log</code>.</p>
<p>
Dokumentiranje našeg programa dobro napreduje, ali paralelno s tim sjetili smo se da bi htjeli napraviti još neke kozmetičke promjene na programu. Na njima želimo raditi nezavisno o procesu dokumentiranja pa ćemo kreirati novu granu. Kako ne bi imali poluzavršenu dokumentaciju u novoj grani, novu granu <code>beauty</code> ćemo opet kreirati iz master grane:</p>
<pre>
&gt; git checkout -b beauty master
Switched to a new branch 'beauty'
</pre>
<p>Trenutna inačica programa nije posve legalan C program, stoga ćemo je opet malo doraditi, tj. preraditi u nešto pristojnije:</p>
<pre>
#include &lt;stdio.h&gt;

int main(void)
{
  printf("Hello world\n");
  return 0;
}
</pre>
<p>Promjene spremimo u novi commit sa opisom &#8220;popravljen kod&#8221;. (<em>Update: dodao nedostajući korak, commitanje upravo napravljenih promjena; hvala Mariju Splivalu na dojavi greške</em>).</p>
<pre>
&gt; git commit -a -m "popravljen kod"
</pre>
<p>
Sada smo već napravili nekoliko grana i u svakoj po nekoliko commitova i sve je teže pratiti gdje se nalazi što. Podsjetimo se koje grane imamo i što one sadrže:</p>
<pre>
&gt; git branch
* beauty
  doc
  master
&gt; git log master..beauty
commit 5e547517e1a29a08b3594f6b8c8c0a289070376d
Author: Senko Rasic &lt;senko@localhost&gt;
Date:   Sat Jan 23 06:31:05 2010 +0100
popravljen kod

&gt; git log master..doc
...
&gt; git log master
...
</pre>
<h2>Spajanje grana (merge)</h2>
<p>Nakon što smo napravili sve što smo htjeli i sve committali te nakon što smo zaključili da smo zadovoljni promjenama na ovoj grani, željeli bismo je spojiti nazad u <em>master</em>.</p>
<p>Napomena: radi jednostavnosti primjera, ovdje nam se grana sastoji od samo jednog commita te ćemo je odmah spojiti nazad, što izgleda kao puno kompliciranja nizašto. No u stvarnom radu promjene obično nisu ovako trivijalne i grane se sastoje od nekoliko (možda desetke) committova, kod čega branch/merge ima smisla.</p>
<pre>
&gt; git checkout master
Switched to branch 'master'
&gt; git merge beauty
Updating 459b8bd..5e54751
Fast-forward
 hello.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)
</pre>
<p>Prilikom ovog mergea, master nije imao nikakvih dodatnih commitova kojih nema u beauty grani pa se git nije morao mnogo mučiti sa spajanjem &#8211; samo je napravio <em>fast-forward</em> odnosno zalijepio sve nove commitove iz beauty grane u master granu. Pomoću <code>git log</code> možemo se uvjeriti da se uistinu radi o istim committovima (jedinstveni ID im je jednak).</p>
<p>Spajanjem grana <em>beauty</em> nije nestala. Ona još uvijek postoji, iako sad kad su svi njeni commitovi i u masteru, nema razlike između nje i mastera &#8211; jednako kao da smo je tek sad kreirali. U daljnjem radu opet možemo koristiti istu granu i dodavati nove committove koje periodički spajamo nazad u master. Stvar je izbora (i specifične organizacije projekta na kojem radite) želite li imati dugotrajnije grane koje periodički spajate s masterom ili za nove promjene radite nove grane.</p>
<p>Ukoliko odlučimo da nam grana više ne treba, možemo je obrisati:</p>
<pre>
&gt; git branch -d beauty
Deleted branch beauty (was 5e54751).
</pre>
<h2>Repozicioniranje grana (rebase)</h2>
<p>Sretni sa dosadašnjim napretkom na master grani, vraćamo se nazad na <em>doc</em>. No sada master ima neke comitove koje <em>doc</em> nema. Zasad nema problema, git bi comittove pametno spojio, no ukoliko i ubuduće mijenjamo master (tj. dodajemo nove comitove), razlika će se sve više povećavati i sve će veća biti vjerojatnost da (slučajno ili namjerno) negdje modificiramo istu stvar i uzrokujemo konflikt.</p>
<p>Kako bi to minimizirali, dugovječne grane možemo repozicionirati, tj. rebazirati (<em>rebase</em>). Rebaziranjem pomičemo točku u kojoj se grana &#8220;odvojila&#8221; od grane iz koje smo je stvorili (ovdje, mastera), tako da izgleda kao da smo je tek sada stvorili.</p>
<pre>
&gt; git checkout doc
Switched to branch 'doc'
&gt; git rebase master
First, rewinding head to replay your work on top of it...
Applying: dodan README

&gt; git log
commit 6c0516dbe782173b57997039576e3b38bc20997c
Author: Senko Rasic &lt;senko@localhost&gt;
Date:   Sat Jan 23 06:06:26 2010 +0100
dodan README

commit 5e547517e1a29a08b3594f6b8c8c0a289070376d
Author: Senko Rasic &lt;senko@localhost&gt;
Date:   Sat Jan 23 06:31:05 2010 +0100
popravljen kod
</pre>
<p>Primjetite da je nakon rebaziranja &#8220;dodan README&#8221; comit ispao zadnji, iako je zadnja promjena koju smo mi stvarno na cijelom projektu napravili bio &#8220;popravljen kod&#8221; u <em>beauty</em> grani. Također, primjetite da se ID zadnjeg comitta promjenio &#8211; to zapravo više nije isti commit. Radi se o tome da je git doslovno pospremio patcheve, obrisao comittove, a kasnije ih vraćao jedan po jedan i automatski radio nove comittove.</p>
<div id="attachment_410" class="wp-caption aligncenter" style="width: 310px"><img src="http://senko.net/wp-content/uploads/2010/01/rebase.png" alt="repozicioniranje grane" title="git rebase" width="300" height="264" class="size-full wp-image-410" /><p class="wp-caption-text">repozicioniranje grane</p></div>
<p>Kao rezultat toga, grana <em>doc</em> više uopće ne izgleda isto. Ako solo radite na projektu, to za vas ne igra nikakvu ulogu. Ali ukoliko nekoliko ljudi radi na istom projektu, potreban je oprez &#8211; ukoliko je netko kod sebe povukao vašu granu, a vi ju naknadno rebazirate, stanje comittova u toj grani u vašem repozitoriju više se neće slagati sa stanjem u njihovom repozitoriju. Kod takvih situacija osnovno pravilo je &#8211; nikad ne modificirajte povijest grane koju je netko drugi već povukao od vas.</p>
<h2>Merge ili rebase?</h2>
<p>Nije odmah očito zašto bi radili rebase ako već imamo spajanje grana, no postoji razlika. Kod spajanja promjene iz druge grane &#8220;naljepe&#8221; se <em>na</em> trenutnu granu. Ukoliko dođe do konflikta, nemamo informaciju koji od comitova iz trenutne grane je uzrokovao konflikt. Stoga ga nećemo moći niti prepraviti, nego ćemo rješenje konflikta samo zalijepiti kao još jedan novi commit.</p>
</p>
<p>Spajanje logički znači &#8220;sav dosadašnji rad na grani koja se spaja sa trenutnom granom od sada se nalazi i u ovoj grani&#8221;. Ukoliko bismo koristili <em>merge</em> za povlačenje novih promjena mastera u <em>doc</em>, efekt bi bio kao da smo rekli &#8220;ok, od sada će nam <em>doc</em> biti glavna grana u projektu&#8221;.</p>
<p>Za razliku od toga, repozicioniranje znači &#8220;promjeni trenutnu granu tako da izgleda da sam sve promjene radio nad sadašnjim sadržajem mastera (odnosno granom nad kojom radim rebase &#8211; baznu granu)&#8221;, odnosno svojevrsno &#8220;osvježavanje patcheva&#8221; koje imamo u odnosu na master. Konkretno, rebase radi slijedeće:</p>
<ol>
<li>privremeno miče sve comittove iz trenutne grane koji nisu u baznoj grani i sprema ih na sigurno</li>
<li>povlači sve nove comittove iz bazne grane koji nisu u trenutnoj (fast-forward), nakon čega bazna grana i trenutna grana imaju isti sadržaj</li>
<li>jedan po jedan vraća nazad comittove koji su spremljeni na sigurno</li>
</ol>
<p>Ukoliko u nekom trenu dođe do konflikta, rebase će se zaustaviti i imat ćemo priliku prepraviti commit koji uzrokuje konflikt. Na taj način praktički &#8220;osvježavamo&#8221; trenutnu granu, tako da promjene koja ona predstavlja budu primjenjive na trenutno stanje bazne grane. Ovo nam omogućuje da imamo dugovječne grane sa relativno velikim promjenama u odnosu na baznu granu, a da te promjene uvjek budu ažurne.</p>
<p>Kada koristiti <em>rebase</em> ili <em>merge</em> možete pročitati i u Linusovom mailu o toj temi na LKML &#8211; <a href="http://lwn.net/Articles/328436/">&#8220;Some git best practices&#8221; post na LWN</a> sadrži malo šire objašnjenje za nas koji ne pratimo LKML.</a></p>
<h2>Join us next time&#8230;</h2>
<p>Rukovanje granama je vjerojatno najbitniji i najkompliciraniji dio git-a. Nakon što smo to apsolvirali, možemo se opet baciti na laganije, a opet korisne stvari koje korisnicima gita život čine ugodnijim i lakšim. Pridružite mi se slijedeći put dok istražujem interaktivno dodavanje promjena, pretraživanje povijesti, tagiranje, <em>cherry-picking</em>, &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://senko.net/git-branch-merge-rebase/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Kako dobiti naša slova na Nokii N900</title>
		<link>http://senko.net/kako-dobiti-nasa-slova-na-nokii-n900/</link>
		<comments>http://senko.net/kako-dobiti-nasa-slova-na-nokii-n900/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 07:57:58 +0000</pubDate>
		<dc:creator>Senko</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://senko.net/?p=374</guid>
		<description><![CDATA[<a href="http://senko.net/kako-dobiti-nasa-slova-na-nokii-n900/" title="Kako dobiti naša slova na Nokii N900"></a>Ne znam koja će situacija biti jednom kad se N900 počne prodavati kod nas, ali ukoliko imate primjerak izvana, nemate hrvatsku tastaturu nego najvjerojatnije koristite englesku. Ako vam kojim slučajem zatrebaju naši dijakritici (recimo prilikom pisanja službenog maila :), dovest &#8230;<p class="read-more"><a href="http://senko.net/kako-dobiti-nasa-slova-na-nokii-n900/">Više &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://senko.net/kako-dobiti-nasa-slova-na-nokii-n900/" title="Kako dobiti naša slova na Nokii N900"></a><p>
Ne znam koja će situacija biti jednom kad se N900 počne prodavati kod nas, ali ukoliko imate primjerak izvana, nemate hrvatsku tastaturu nego najvjerojatnije koristite englesku. Ako vam kojim slučajem zatrebaju naši dijakritici (recimo prilikom pisanja službenog maila :), dovest ćete se u neprilike.
</p>
<p>
Jedno jednostavno rješenje je nadodati naše dijakritike na kombinacije Fn + kursorske tipke, na kojima po defaultu nema nikakvih drugih simbola. Kako naših dijakritika ima 5, osim kursorskih tipki možemo se poslužiti i BackSpace tipkom.
</p>
<p>
Kako bi layout bio što sličniji onom na normalnim tipkovnicama, na svojoj Nokii postavio sam ga tako da mi Fn+Up bude Š, Fn+BackSpace Đ (malo poetske pravde je u tome da je davno prije BackSlash bio Đ :), Fn+Left Č, Fn+Down Ć, Fn+Right Ž.
</p>
<p>
Kako biste to napraivli i kod sebe, morate biti u shellu i imati root privilegije, za što vam pomoći programčić zvan <em>gainroot</em>. <b>Napomena</b>: ovim lako možete dovesti svoju N900 u stanje da se ne može bootati, stoga budite pažljivi, ne radite ovo ako niste sigurni šta radite; ne odgovaram za bilo kakve nastale probleme.
</p>
<p>
Remapiranje tipkovnice radite editiranjem datoteke <code>/usr/share/X11/xkb/symbols/nokia_vndr/rx-51</code>. Prije editiranja datoteke, svakako napravite backup kopiju. <b>Napomena</b>: Backup kopiju nemojte spremati u isti direktorij, jer će vam se N900 odbiti bootati slijedeći put!
</p>
<p>
U datoteci pronađite liniju koja spominje <code>&lt;BKSP&gt;</code> (BackSpace tipka), i promijenite je u:</p>
<pre>
key &lt;BKSP&gt;   { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ BackSpace, dstroke ] };
</pre>
<p>Nakon toga na samom dnu datoteke pronađite blok <code>xkb_symbols "arrows_4btns"</code> i promijenite ga u (odlazak u novi red nakon znaka &#8220;=&#8221; je tu samo zbog čitljivosti u blog postu &#8211; u datoteci možete svaku definiciju staviti u svoj red):</p>
<pre>
xkb_symbols "arrows_4btns" {
    key &lt;UP&gt;   { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ Up, scaron ] };
    key &lt;LEFT&gt; { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ Left, ccaron ] };
    key &lt;DOWN&gt; { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ Down, cacute ] };
    key &lt;RIGHT&gt; { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] =
        [ Right, zcaron ] };
};
</pre>
<p>(<b>Update</b>: popravio nazive simbola, originalno sam krivo postavio uglate zagrade).</p>
<p>Spremite datoteku i isprobajte odmah novi layout naredbom <code>setxkbmap</code>. Ukoliko vam naredba vrati grešku, popravite datoteku ili vratite backup &#8211; nemojte niti slučajno ostaviti nepravilnu datoteku, jer će vam se kod slijedećeg boota N900 odbiti podići.</p>
<p><b>Update</b>: ispravio pogrešno napisan naziv komande, hvala <a href="http://twitter.com/arguson">Saši</a> na dojavi.</b></p>
<p>Nakon uspješnog učitavanja novog layouta, naši dijakritici odmah su vam dostupni u svim aplikacijama, koristeći kombinaciju Fn+kursorske tipke ili backspace, za mala slova, odnosno Shift+Fn+tipke za velika slova.</p>
<p>Inspiraciju i sve potrebne informacije za post našao sam na <a href="http://wiki.maemo.org/Remapping_keyboard">Maemo wikiju</a>, gdje možete pronaći još informacija o ovome i mnogim drugim hackovima za vašu N900.</p>
<p><b>Update</b>: pripremljenu datoteku možete preuzeti <a href="http://senko.net/wp-content/uploads/2010/01/rx-51">ovdje</a>. Datoteku skopirajte na gorenavedenu i svakako provjerite na goreopisan način (meni provjereno radi, ali ne garantiram da će i vama i ne snosim posljedice ako bude problema).</p>
]]></content:encoded>
			<wfw:commentRss>http://senko.net/kako-dobiti-nasa-slova-na-nokii-n900/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Free software izbori</title>
		<link>http://senko.net/free-software-izbori-2/</link>
		<comments>http://senko.net/free-software-izbori-2/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 11:04:51 +0000</pubDate>
		<dc:creator>Senko</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://senko.net/?p=369</guid>
		<description><![CDATA[<a href="http://senko.net/free-software-izbori-2/" title="Free software izbori"></a>U sezoni (političkih) izbora vrijeme je za moj tradicionalni izbor free &#038; open source softvera kojeg koristim u svakodnevnom radu i zabavi na računalu. Kako je to izgledalo pred dvije godine pogledajte u ovom postu. A ove godine, krenimo redom: &#8230;<p class="read-more"><a href="http://senko.net/free-software-izbori-2/">Više &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://senko.net/free-software-izbori-2/" title="Free software izbori"></a><p>U sezoni (političkih) izbora vrijeme je za moj tradicionalni izbor free &#038; open source softvera kojeg koristim u svakodnevnom radu i zabavi na računalu. Kako je to izgledalo pred dvije godine pogledajte u <a href="http://senko.net/free-software-izbori/">ovom postu</a>. A ove godine, krenimo redom:</p>
<h2>Editor &#8211; (G)VIM</h2>
<p>Uza sve moje pokušaje i isprobavanja drugih editora, uvijek se vraćam VIM-u (odnosno njegovom grafičkom pandanu GVIM-u). Većina piskaranja koje radim je zapravo programiranje, za što je ovaj editor upravo idealan. Još uvijek sam na <em>newb</em> razini, ali svake godine upamtim par zgodnih shortcutova .. za jedno 20tak godina ću biti guru :) Mali demo što sve VIM može (otprilike polovicu ovoga još ne koristim .. kao što rekoh, newb sam) pogledajte u izvrsnoj <a href="http://www.slideshare.net/c9s/perlhacksonvim">Perl.Hacks.On.Vim</a> prezentaciji.</p>
<h2>Web browser &#8211; Google Chrome</h2>
<p>Velika promjena u zadnje dvije godine &#8211; većina browser opcija sada je bazirana na WebKit engineu, a jedino se Firefox drži svojeg Gecka. Novi rat browsera koji se zahuktava u poslijednje vrijeme osigurao je da svi browseri budu mnogo kvalitetniji nego njihove starije inačice &#8211; Firefox više nikako nije neosporni vlasnik Linux desktop browser mindsharea.</p>
<p>Pri najavi Google Chrome browsera bio sam prilično <a href="http://senko.net/chrome-this-chrome-that/">nezadovoljan overhypeom</a> koji je dotični doživio. Nakon izlaska bete za Linux, prebacio sam se par dana na nju i mogu zadovoljno reći da Googlovci nisu podbacili &#8211; browser je stvarno kvalitetan. Nakon tjedan-dva testiranja, sve svoje browsanje prebacio sam na Chrome. Zasad mi se subjektivno čini stvarno brži od Firefoxa (3.5). Koliko je stvar u činjenici da je Firefox opterećen raznoraznim ekstenzijama i alatima (jeste li znali da <a href="http://antennasoft.net/robcee/2009/12/15/firebug-and-the-jit/">Firebug usporava JavaScript čak i na stranicama gdje nije upaljen?</a>) a koliko u stvarnoj brzini enginea i rendera, vidjet ću s vremenom kad se i na Chromeu nakupi po par ekstenzija.</p>
<p>Jedna stvar koja mi se kod Chromea sviđa za razliku od Firefoxa je jednostavnost pisanja ekstenzija &#8211; jednostavne ekstenzije se mogu napisati u par desetaka linija JS-a, za razliku od mnoštva boilerplatea kojeg treba pripremiti za Firefox.</p>
<p>Kao lagano off-topic zanimljivost, napomenuo bih da iako koristim Google Chrome kao browser, ne koristim Google kao tražilicu (niti GMail, niti Google Docs, &#8230; koristim GMaps kad mi zatreba te GTalk iz Empathya); umjesto toga, koristim <a href="http://www.duckduckgo.com/">DuckDuckGo!</a> zbog toga što mi daje preglednije, relevantne rezultate, a njihov 0-click info box je u većini slučajeva točno ono što me i zanima. U par mjeseci korištenja mislim da nisam više od 2-3 puta zatražio drugu &#8220;stranicu&#8221; rezultata. Mana DuckDuckGoa su slabiji rezultati za .hr prostor i slabiji rezultati ukoliko copy-pasteam neki dugački opis greške; za te stvari i dalje ručno odem na Google.</p>
<h2>Grafičko sučelje &#8211; XMonad</h2>
<p>Pomalo je depresivno da današnja računala subjektivno ne djeluju mnogo brža od računala koje smo koristili pred 5 ili 10 godina. Naravno da objektivno jesu mnogo brža &#8211; dovoljno je samo usporediti grafiku sadašnjih i tadašnjih igara, ili sadašnje multimedijske mogućnosti sa tadašnjim playbackom poštanskih maraka ili kockastih filmova niske rezolucije. Sama GUI sučelja su mnogo rafiniranija, sa više opcija, efekata i slično. Ali opet, pomalo je to depresivno.</p>
<p>Isprobavši par alternativa, otkrio sam da mi je od laganih rješenja najzgodniji XMonad, window manager pisan u Haskellu (isprobavanje XMonada pogodilo se vremenski sa čitanjem izvrsne <a href="http://book.realworldhaskell.org/">Real World Haskell</a> knjige o tom programskom jeziku). XMonad mi se učinio stvarno user-friendly, mnogo više od <b>awesome</b> WM-a pisanog napola u Lui, iz jednostavnog razloga što sam za awesome morao odmah editirati konfiguracijsku datoteku (i učiti Luu) dok za XMonad još uvijek nemam nikakvu konfig datoteku &#8211; stvar radi po defaultu točno ono što želim.</p>
<p>Kad sam već maknuo Metacity, rješio sam se i GNOME panela, a kako niti Nautilus ne koristim često, izbacio sam i njega. Da izbjegnem pokretanje gnome-sessions-daemona samo zbog gnome-screensavera, zamjenio sam i njega xscreensaverom, a kad već idem u tom smjeru, i gdm sam zamjenio xdm-om.</p>
<h2>Networking &#8211; male shell skripte</h2>
<p>Izbacivši GNOME Panel ostao sam i bez Network Managera (cnetworkmanager, komandolinijski alat, nije pretjerano korisna stvar). Srećom, <a href="http://twitter.com/nikolaplejic/">Nikola</a> mi je otkrio <b>wicd</b>, zamjenu za NetworkManager sa dobrim grafičkim i terminal klijentima. No zbog nekih problema drivera wireless kartice na svom laptopu, kod resumea treba reinicijalizirati driver pa sam cijelu stvar automatizirao sa par shell skripta i otkrio da mi je i sam wicd nepotreban.</p>
<h2>Terminal &#8211; GNOME Terminal</h2>
<p>Kako na kraju ispada da većinu stvari radim / pokrećem iz komadndne linije, bitno mi je da je terminal emulator lagan i brz. Kao pobjednik pokazao mi se GNOME Terminal, jer iako nije lagan po potrošnji memorije i prvom startupu, najbrži je u prikazu antialiasinih TrueType fontova (a od <a href="http://www.levien.com/type/myfonts/inconsolata.html">Inconsolate</a> se ne odvajam).</p>
<h2>E-mail &#8211; Thunderbird 3</h2>
<p>Thunderbird 3 pokazao mi se kao odličan mail klijent &#8211; osim vidljivih unapređenja u odnosu na verziju 2 (bolji i brži search, tabovi, tagiranje), pokazao mi se kao mnogo bolji u hendlanju velikih IMAP foldera s kojima svakodnevno radim.</p>
<h2>Media centar &#8211; XBMC</h2>
<p>Da sam ovaj post pisao pred 3 tjedna, pod ovu stavku stavio bih Moovidu (nee. Elisa), vrlo dobar media centar baziran na GStreamer frameworku. No Moovida mi zna imati problema sa nekim formatima (ponajviše .mkv) i updateom librarya, a pogotovo sa hendlanjem velike količine fajlova u mojoj glazbenoj kolekciji (zbog čega trenutno koristim i remote kontrolirani Music Player Daemon). XBMC ne pati od tih boljki, također ima podršku za pluginove te mi se zasad ukupno čini kao bolji sustav.</p>
<h2>Chat &#8211; Empathy</h2>
<p>Kako sam jedan od developera na Telepathy projektu (kojeg je i Empathy client jedan dio), nije nikakvo čudo da mi je Empathy najdraži IM client. No otkad imam N900, više chatam sa njega (opet pogonjeno Telepathyem) nego sa laptopa&#8230;</p>
<h2>Twitter &#8211; Chromed Bird</h2>
<p>Rudimentaran, ali ima sve što meni treba (pregled svog timelinea, reply, retweet, skraćivanje linkova putem bit.ly-a). Neko vrijeme sam koristio Thwirl i poslije Gwibber, ali prvi mora učitati popriličan AIR runtime a drugi WebKit. Za razliku od njih, Chromed Bird nema praktički nikakvi dodatni load na sustav.</p>
]]></content:encoded>
			<wfw:commentRss>http://senko.net/free-software-izbori-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

