<?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>CodePlay</title>
	<atom:link href="http://codeplay.hu/feed/" rel="self" type="application/rss+xml" />
	<link>http://codeplay.hu</link>
	<description>Kitaláljuk, lefejlesztjük, telepítjük</description>
	<lastBuildDate>Tue, 03 Aug 2010 09:13:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>hu</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Android onItemClick probléma ListView és Button használatakor</title>
		<link>http://codeplay.hu/developer/2010/07/android-onitemclick-problema-listview-es-button-hasznalatakor/</link>
		<comments>http://codeplay.hu/developer/2010/07/android-onitemclick-problema-listview-es-button-hasznalatakor/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 23:16:26 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Szoftverfejlesztés]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[fejlesztés]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Mobil]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=40</guid>
		<description><![CDATA[Népszerű és mindenképp használatra javasolt komponens Androidon a ListView. Gyakorlatilag a legtöbbet használt UI elem, bárhmely programot használunk, rendszeresen feltűnik különböző formákban. Lényege, hogy a képernyőn megjelenő elemeket egy listába rendezzük, és ezt a listát görgethetjük le-fel ha nem fér ki minden elem a képernyőre. Használata relative egyszerű, amíg nem akarunk egyedi megjelenést, például Button vagyCheckbox komponenseket [...]]]></description>
			<content:encoded><![CDATA[<p>Népszerű és mindenképp használatra javasolt komponens Androidon a <code>ListView</code>. Gyakorlatilag a legtöbbet használt UI elem, bárhmely programot használunk, rendszeresen feltűnik különböző formákban. Lényege, hogy a képernyőn megjelenő elemeket egy listába rendezzük, és ezt a listát görgethetjük le-fel ha nem fér ki minden elem a képernyőre. Használata relative egyszerű, amíg nem akarunk egyedi megjelenést, például <code>Button</code> vagy<code>Checkbox</code> komponenseket belerakni, mert ekkor azonnal beleütközünk a problémába, a <code>ListView onItemClick</code>event handler nem hívódik meg kattintáskor.</p>
<p><span id="more-40"></span>Az Internet tele van a problémával, de teljes egészében leírt megoldást ritkán találni. Általában utalások vannak rá, hogy tároljunk ID-t a Tag mezőben, vagy írjuk át az <code>Adapter</code>-t, de mik is ezek az utalások tulajdonképpen?</p>
<p>A feladat amit kitaláltam egy olyan <code>ListView</code> megjelenítés, ami a <code>SimpleAdaptert</code>-t használja adatforrásnak, így a layout betölthető XML-ből egyszrűen. A layout tartalmaz egy gombot, amit megnyomva az Activity onClick metódusa hívódik meg. A probléma itt következik: az <code>onClick</code> az <code>onItemClick</code>-el ellentétben nem kapja meg melyik soron kattintottunk. Valahonnan pedig illene tudni, hiszen nem minden soron ugyanazt szeretnénk végrehajtani.</p>
<p>Az ötelt a fent amlített netes leírások alapján adja magát, tároljuk le az onClick-et meghívó View Tag-jében (<code>View.setTag(Object o)</code>) a szükséges azonosítót, így az onClick-ben a paraméterként megkapott View-tól le tudjuk kérdezni.</p>
<p>Minden ListView a lista elemeit egy Adapter osztálytól kapja (<code>ListView.setAdapter()</code>) a <code>getView()</code> metóduson keresztül. Az adapter kis átírásával megoldható, hogy a lista elemeibe bekerüljön a az Id a megfelelő Tag property-be, amikor a ListView meghívja a <code>getView()</code>-t. Leszármaztattam hát a <code>SimpleAdaptert</code>-t:</p>
<pre class="brush: java">public class ClickableButtonListAdapter extends SimpleAdapter {	

	private static final String HASHMAP_ID = "_id";

	public ClickableButtonListAdapter(Context context,
			List&lt;? extends Map&lt;String, ?&gt;&gt; data, int resource, String[] from,
			int[] to) {
		super(context, data, resource, from, to);

	}

	@SuppressWarnings("unchecked")
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		View view = super.getView(position, convertView, parent);
		setViewTag(view, ((HashMap&lt;String,String&gt;) getItem(position)).get(HASHMAP_ID) );
		return view;
	}

	private void setViewTag(View view, Object tag) {
		view.setTag(tag);
		if (view instanceof ViewGroup) {
			for (int i=0; i &lt; ((ViewGroup) view).getChildCount(); i++) {
				setViewTag(((ViewGroup) view).getChildAt(i), tag);
			}
		}
	}
}
</pre>
<p>A példában a lista elemei HashMap-ek, így ebből szedem ki az Id-t. A <code>HahMap</code>-ben az Id mező az &#8220;_id&#8221; elemben van, így ezt keresem ki, és rakom a Tag-be. A <code>setViewTag()</code> rekurzív metódus végigmegy az összes megjelenítendő View elemen és beállítja a Tag-et, így bármelyikre definiálhatjuk majd az onClick-et, mindig megkapjuk a Tag-ben a kiválasztott sor Id-ját.</p>
<p>Az <code>Activity</code>-ben az <code>onClick()</code> igen egyszerű:</p>
<pre class="brush: java">public void onClick(View v) {
         Toast.makeText(this, "onClick id: " + v.getTag(), Toast.LENGTH_SHORT).show();
}</pre>
<p>Nem mondom, hogy szép megoldás, de használható. Jobban tetszene, ha az Android megfelelően támogatná az egyedi ListView létrehozását esetleg azzal, hogy az onItemClick meghívódna, és eldönthetném, hogy mit akarok kezdeni az eseménnyel.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/developer/2010/07/android-onitemclick-problema-listview-es-button-hasznalatakor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Displaytag detail megjelenítés jQuery-vel</title>
		<link>http://codeplay.hu/developer/2010/07/displaytag-detail-megjelenites-jquery-vel/</link>
		<comments>http://codeplay.hu/developer/2010/07/displaytag-detail-megjelenites-jquery-vel/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 23:01:00 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Szoftverfejlesztés]]></category>
		<category><![CDATA[fejlesztés]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=33</guid>
		<description><![CDATA[Projektjeinkben táblázatos megjelenítéshez általában a DisplayTag nevezetű tag könyvtárat használjuk, mert jól összefér a használt Struts2 és Spring keretrendszerekkel, és egyszerűen formázható, programozható. Szerettem volna azonban kicsit többet, mint amit tud, mégpedig ha részletes adatokat tudna megjeleníteni egy legördülő sorban jQuery segítségével. Ez arra jó, ha egy sorban nem szeretnénk minden adatot bezsúfolni, mert nem [...]]]></description>
			<content:encoded><![CDATA[<p>Projektjeinkben táblázatos megjelenítéshez általában a <a href="http://displaytag.sourceforge.net">DisplayTag</a> nevezetű tag könyvtárat használjuk, mert jól összefér a használt <a href="http://struts.apache.org/2.x/index.html">Struts2</a> és <a href="http://www.springsource.org">Spring</a> keretrendszerekkel, és egyszerűen formázható, programozható. Szerettem volna azonban kicsit többet, mint amit tud, mégpedig ha részletes adatokat tudna megjeleníteni egy legördülő sorban <a href="http://jquery.com">jQuery</a> segítségével. Ez arra jó, ha egy sorban nem szeretnénk minden adatot bezsúfolni, mert nem mindig érdekli a felhasználót, de azért néha szeretné megtekinteni a részletes adatokat.</p>
<p><span id="more-33"></span></p>
<p>Tegnap megvalósítottam az ötletet. A feladat egy olyan jQuery plugin létrehozása volt, amely úgy tudja a detail megjelenítést megoldani, hogy ne kelljen a displaytag forrásába belepiszkálni. Ez elsőre azért tűnt bonyolultnak, mert általában az ilyen megjelenítők úgy oldják meg a feladatot, hogy már eleve legenerálnak egy plusz, nem látható sort a táblázatba, ami akkor válik láthatóvá, ha megnyomjuk a részletek megjelenítésére szolgáló ikont. Végül sikerült egy olyan plugint létrehozni, ami nem csak a displaytag könyvtárral működik együtt, hanem egy tetszőleges táblázattal, így bármely olyan kész komponenssel használható, amibe nem tudunk vagy nem szeretnénk belehekkelni egy plusz TR-t.</p>
<p>Ha nem érdekel a leírás, innen letöltheted a plugint: <a href="http://codeplay.hu/wp-content/uploads/2010/07/jquery.displaytagdetail.zip">jquery.<strong>displaytagdetail</strong>.zip</a></p>
<h3>Displaytag felhasználásával</h3>
<p>Az alapot egy displaytag definíció szolgálja a JSP fájlban. Így néz ki általában:</p>
<pre>&lt;display:table name="paginatedList" id="auditlogList" sort="external" requesturi="auditlogList.action"&gt;
		&lt;display:setproperty name="pagination.sort.param" value="paginatedList.sortCriterion"&gt;
        &lt;display:setproperty name="pagination.sortdirection.param" value="paginatedList.sortDirectionName"&gt;
        &lt;display:setproperty name="pagination.pagenumber.param" value="paginatedList.pageNumber"&gt; 

        &lt;display:column property="idAuditlog" title="id"&gt;
        &lt;display:column property="creationTime" title="Time"&gt;
	  	&lt;display:column property="priority" title="Priority"&gt;
	  	&lt;display:column property="username" title="User"&gt;
	  	&lt;display:column title="Description"&gt;
	  		${auditlogList.description}
	  	&lt;/display:column&gt;
	&lt;/display:column&gt;&lt;/display:column&gt;&lt;/display:column&gt;&lt;/display:column&gt;&lt;/display:setproperty&gt;&lt;/display:setproperty&gt;&lt;/display:setproperty&gt;&lt;/display:table&gt;</pre>
<h3>HTML táblázat</h3>
<p>A fentebbi tag a következő HTML kódot generálja le, de ez előállítható akár PHP-ból is</p>
<pre class="brush: xml">
<pre>&lt;table id="auditlogList"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;User&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2010-07-02 13:27:07.0&lt;/td&gt;
&lt;td&gt;NORMAL&lt;/td&gt;
&lt;td&gt;root@anura.hu&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2010-07-02 14:04:28.0&lt;/td&gt;
&lt;td&gt;NORMAL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</pre>
</pre>
<h3>jQuery plugin</h3>
<p>Létrehoztam a <strong>displaytagdetail</strong> plugin forrását, amit aztán Javascript-ként beillesztettem az oldal forrásába.</p>
<pre>jQuery.fn.&lt;b style="color:black;background-color:#ffff66"&gt;displaytagdetail&lt;/b&gt; = function(button, detailClass, imgUp, imgDown, speed) {
		$(this).find(button).click( function() {
			tr = $(this).parents("tr");
			if (tr.next().hasClass(detailClass)) {
				tr.next().find("div").slideUp(function() {
					tr.next().remove();
				  });
				$(this).find("img:first").attr("src",imgDown);
			} else {
				tr.after("

&lt;div style="display:none"&gt;" +
						$(this).next("div").html() +
						"&lt;/div&gt;

");
				tr.next().addClass(tr.attr("class"));
				$(this).find("img:first").attr("src",imgUp);
				tr.next().find("div").slideDown(speed);
			}
		});
	};</pre>
<pre class="brush: xml"><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;">Paraméterként a következőket kell megadni:</span></pre>
<ul>
<li>A detail gomb class neve (‘.’-el kezdőtik)</li>
<li>A detail div osztálya</li>
<li>Záró ikon</li>
<li>Nyitó ikon</li>
<li>Animáció sebessége</li>
</ul>
<p>Példa jQuery hívás:</p>
<pre>&lt;script type="text/javascript" src="&lt;s:url value='/js/jquery.displaytagdetail.js'/&gt;"&gt;&lt;/script&gt;

	&lt;script type="text/javascript"&gt;
		$(function() {
			$("#auditlogList").displaytagdetail(".detail_button","detail","images/arrow_up.png","images/arrow_down.png","slow");
		});
&lt;/script&gt;</pre>
<h3>Módosított displaytag a JSP-ben</h3>
<p>A tag-ben létrehoztam egy plusz oszlopot, ami tartalmazza a részleteket tartalmazó div-et és a lenyitó gombot</p>
<pre class="brush: xml">
<pre>&lt;display:table name="paginatedList" id="auditlogList" sort="external" requesturi="auditlogList.action"&gt;
		&lt;display:setproperty name="pagination.sort.param" value="paginatedList.sortCriterion"&gt;
        &lt;display:setproperty name="pagination.sortdirection.param" value="paginatedList.sortDirectionName"&gt;
        &lt;display:setproperty name="pagination.pagenumber.param" value="paginatedList.pageNumber"&gt;
        &lt;display:column&gt;
        	&lt;a&gt;&lt;img src="images/arrow_down.png"&gt;&lt;/a&gt;
&lt;div style="display:none"&gt;
        		&lt;strong&gt;Komponens:&lt;/strong&gt;&lt;br&gt;
        		${auditlogList.component}&lt;br&gt;&lt;br&gt;
	        	&lt;strong&gt;Log:&lt;/strong&gt;&lt;br&gt;
	        	${auditlogList.log}
        	&lt;/div&gt;

        &lt;/display:column&gt;
        &lt;display:column property="idAuditlog" title="id"&gt;
        &lt;display:column property="creationTime" title="Time"&gt;
	  	&lt;display:column property="priority" title="Priority"&gt;
	  	&lt;display:column property="username" title="User"&gt;
	  	&lt;display:column title="Description"&gt;
	  		${auditlogList.description}
	  	&lt;/display:column&gt;
	&lt;/display:column&gt;&lt;/display:column&gt;&lt;/display:column&gt;&lt;/display:column&gt;&lt;/display:setproperty&gt;&lt;/display:setproperty&gt;&lt;/display:setproperty&gt;&lt;/display:table&gt;</pre>
</pre>
<h3>Módosított HTML táblázat</h3>
<p>A részleteket tartalmazó generált táblázat így néz ki.</p>
<pre>&lt;table id="auditlogList"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;User&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
        	&lt;a&gt;&lt;img src="images/arrow_down.png"&gt;&lt;/a&gt;
&lt;div style="display:none"&gt;

        		&lt;strong&gt;Komponens:&lt;/strong&gt;&lt;br&gt;
        		admin.UserBo.getUserByEmailForLogin&lt;br&gt;&lt;br&gt;
	        	&lt;strong&gt;Log:&lt;/strong&gt;&lt;br&gt;
	        	java.lang.String=root
        	&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2010-07-02 13:27:07.0&lt;/td&gt;
&lt;td&gt;NORMAL&lt;/td&gt;
&lt;td&gt;root&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
        	&lt;a&gt;&lt;img src="images/arrow_down.png"&gt;&lt;/a&gt;
&lt;div style="display:none"&gt;
        		&lt;strong&gt;Komponens:&lt;/strong&gt;&lt;br&gt;
        		admin.UserRequestBo.saveUserRequest&lt;br&gt;&lt;br&gt;

	        	&lt;strong&gt;Log:&lt;/strong&gt;&lt;br&gt;
	        	Log entry
        	&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2010-07-02 14:04:28.0&lt;/td&gt;
&lt;td&gt;NORMAL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</pre>
<h3>Végül</h3>
<p>Ha mindent jól csináltunk, akkor a táblázatunkban lenyitható és bezárható egy sor a kis ikonnal.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/developer/2010/07/displaytag-detail-megjelenites-jquery-vel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android és adatbázis</title>
		<link>http://codeplay.hu/developer/2010/05/android-es-adatbazis/</link>
		<comments>http://codeplay.hu/developer/2010/05/android-es-adatbazis/#comments</comments>
		<pubDate>Sat, 22 May 2010 22:55:14 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Szoftverfejlesztés]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[fejlesztés]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Mobil]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=31</guid>
		<description><![CDATA[Előző bejegyzésekben már írtam a HTC Desire felhasználhatóságáról, tapasztalataimról, mint end-user. Mivel szoftverfejlesztőként is érdekelt a telefon és az Android, ezért amint megvolt a készülék, azonnal elkezdtem nézni az Android SDK-t. Elsőként szerettem volna egy egyszerű kis alkalmazást összerakni, amely tartalmaz beviteli mezőket, és egy listát, ahol a már felvitt elemek módosíthatók.
A lista természetesen legyen [...]]]></description>
			<content:encoded><![CDATA[<p>Előző bejegyzésekben már írtam a HTC Desire felhasználhatóságáról, tapasztalataimról, mint end-user. Mivel szoftverfejlesztőként is érdekelt a telefon és az Android, ezért amint megvolt a készülék, azonnal elkezdtem nézni az <a href="http://developer.android.com">Android SDK</a>-t. Elsőként szerettem volna egy egyszerű kis alkalmazást összerakni, amely tartalmaz beviteli mezőket, és egy listát, ahol a már felvitt elemek módosíthatók.<span id="more-31"></span></p>
<p>A lista természetesen legyen a tapifonokon már megszokott szépen gördíthető lista, a beviteli képernyő standard beviteli mezőkből álljon össze. Egy ilyen alkalmazás leírását a <a href="http://developer.android.com">Developer portál </a>elég jól leírja a <a href="http://developer.android.com/guide/index.html">Guideokban </a>erre nem térek most ki. Ami szerintem egy kicsit elbonyolított, és nem épp lényegre törő rész ebben az útmutatóban az az <a href="http://developer.android.com/guide/topics/data/data-storage.html">adatok tárolása</a>, ezen belül is az Androidba beépített <a href="http://www.sqlite.org">SQLite</a> adatbázis kezelő <a href="http://developer.android.com/guide/topics/data/data-storage.html#db">leírása</a>. Ezt egy külön részben tovább boncolgatja a <a href="http://developer.android.com/resources/tutorials/notepad/index.html">Notepad tutorial</a>, de itt sajnos már belekeverik a <a href="http://developer.android.com/guide/topics/providers/content-providers.html">Content Provider</a>-eket is, így nem kapunk kellő instrukciót, hogyan is kellene használni az adatbázist.</p>
<p>A neten található leírások általában azt a módszert erőltetik, hogy a <a href="http://developer.android.com/reference/android/database/Cursor.html">Cursor</a> objektumon végig iterálva, vagy azt felhasználva a <a href="http://developer.android.com/reference/android/widget/ListView.html">ListView </a>objektumhoz a <a href="http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html">SimpleCursorAdatpter</a> segítségével kezeljük mi az adatbázis kapcsolatot, a kurzort és az ezzel járó minden nyűgös dolgot. Ez nekem nem igazán tetszett, hiszen a Java világában már jópár éve létezik az <a href="http://en.wikipedia.org/wiki/Object-relational_mapping">ORM</a> technika, amit általában egy J2EE alkalmazásban a <a href="http://www.hibernate.org/">Hibernate</a>-el szoktunk használni (vagy <a href="http://java.sun.com/developer/technicalArticles/J2EE/jpa/">JPA</a> kinek mi tetszik). Így nincs szükség az adatbázis kapcsolat közvetlen kezelésér, kurzorok bezárogatására, adatbázis kivételek kezelésére. Bánatomra a Hibernate és a JPA nem tűnik jó megoldásnak Android alatt, mert a Hibernate nem kezeli megfelelően az SQLite-ot, és különben is miért lövünk ágyúval verébre?</p>
<p>Így arra gondoltam, ORM technikát nem felejtem el, de az itt felmerülő igényeknek megfelelően alakítom ki. Amit meghatároztam igényként:</p>
<ul>
<li>Lightweight megoldás, lehetőleg J2EE technológiák nélkül</li>
<li>Az alkalmazás felületének és üzelti logikájának elkülönítése az adatbázistól</li>
<li>Az adatbázis POJO objektumokon keresztül reprezentált</li>
</ul>
<p>Nem tűnik nagy feladatnak, mégis sokat segít majd később. Elsőként kitaláltam egy alkalmazást. Mindig is szerettem a helyzetmeghatározással foglalkozni, tároljunk hát térkép pontokat adatbázisban.</p>
<p>A tábla szerkezete:</p>
<ul>
<li>id</li>
<li>név</li>
<li>szélesség</li>
<li>hosszúság</li>
<li>magasság</li>
</ul>
<p>Az adatbázis műveletekhez létrehoztam egy <a href="http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html">SQLiteOpenHelper </a>osztályt a <a href="http://developer.android.com/guide/topics/data/data-storage.html#db">developer portálon megfogalmazottak</a> szerint:</p>
<pre class="brush: java">public class DatabaseHelper extends SQLiteOpenHelper {

private static final String TAG = "DatabaseHelper";
private static final String DATABASE_NAME = "mydatabase.db";
private static final int DATABASE_VERSION = 1;

public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + MapPoint.TABLE_NAME + " (" +
MapPoint._ID + " integer primary key," +
MapPoint.NAME + " text," +
MapPoint.LATITUDE + " real," +
MapPoint.LONGTITUDE + " real," +
MapPoint.ALTITUDE + " integer);");
}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

Log.w(TAG, "Upgrading database from version " + oldVersion + " to "

+ newVersion + ", which will destroy all old data");

db.execSQL("DROP TABLE IF EXISTS mappoint");

onCreate(db);

}

}
</pre>
<p>Az osztályból látszik, hogy szükséges egy MapPoint nevű osztály. Az ORM-ben ez az osztály lesz a Model osztályom. Így néz ki:</p>
<pre class="brush: java">public class MapPoint implements BaseColumns {

 public static String NAME = "name";
 public static String LATITUDE = "latitude";
 public static String LONGTITUDE = "longtitude";
 public static String ALTITUDE = "altitude";

 public static String TABLE_NAME = "mappoint";

 public static final String DEFAULT_SORT_ORDER = "name";

 private Long _id;
 private String name;
 private Double latitude;
 private Double longtitude;
 private Integer altitude;

 public Long get_id() {
 return _id;
 }
 public void set_id(Long _id) {
 this._id = _id;
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public Double getLatitude() {
 return latitude;
 }
 public void setLatitude(Double latitude) {
 this.latitude = latitude;
 }
 public Double getLongtitude() {
 return longtitude;
 }
 public void setLongtitude(Double longtitude) {
 this.longtitude = longtitude;
 }
 public Integer getAltitude() {
 return altitude;
 }
 public void setAltitude(Integer altitude) {
 this.altitude = altitude;
 }
}
</pre>
<p>A Model osztály az Adroidos <a href="http://developer.android.com/reference/android/provider/BaseColumns.html">BaseColumn</a>-ból származik, ami miatt egy _ID nevű mező van definiálva benne. Ez azért jó, mert ilyen mezője minden SQLite adatbázs táblának kell legyen, és így nem kell külön foglalkozni vele.<br />
 A Model osztályban nem biztos, hogy jó helyen vannak a statikus tulajdonságok, de egyelőre itt hagyom őket. Ezeket a Notepad tutorial a ContentProvider-be rakja, de nekünk ilyenünk nem lesz.</p>
<p>Végül a legfontosabb elem, a DAO osztály következik. Ez az osztály intézi el végül is az ORM-et, lekéri az adatbázisból a rekordokat, map-eli őket a Model osztályba, jelen esetben a MapPoint-be.</p>
<pre class="brush: java">public class MapPointDao {

 private DatabaseHelper databaseHelper;

 public MapPointDao(Context context) {
 this.databaseHelper = new DatabaseHelper(context);
 }

 public int deleteById(long id) {
 return -1;
 }

 public long insert(MapPoint mapPoint) {
 ContentValues values = new ContentValues();
 values.put(MapPoint.NAME, mapPoint.getName());
 values.put(MapPoint.LATITUDE, mapPoint.getLatitude());
 values.put(MapPoint.LONGTITUDE, mapPoint.getLongtitude());
 values.put(MapPoint.ALTITUDE, mapPoint.getAltitude());

 SQLiteDatabase db = databaseHelper.getWritableDatabase();        

 long rowId = db.insertOrThrow(MapPoint.TABLE_NAME, MapPoint.NAME, values);
 db.close();

 if (rowId &gt; 0) {
 return rowId;
 }

 throw new SQLException("Failed to insert row into ");
 }

 public List find(boolean distinct, String[]  columns,
 String  selection, String[]  selectionArgs, String  groupBy, String  having,
 String  orderBy, String  limit) {

 MapPoint mapP = new MapPoint();
 mapP.set_id(new Long(1));
 mapP.setAltitude(new Integer(2));
 mapP.setLongtitude(new Double(200));

 findByExample(mapP);

 if (TextUtils.isEmpty(orderBy)) {
 orderBy = MapPoint.DEFAULT_SORT_ORDER;
 }

 SQLiteDatabase db = databaseHelper.getReadableDatabase();
 Cursor c = db.query(distinct, MapPoint.TABLE_NAME, columns, selection, selectionArgs, groupBy, having,
 orderBy, limit);

 List list = new ArrayList();

 while (c.moveToNext()) {
 MapPoint mapPoint = new MapPoint();

 mapPoint.set_id(c.getLong(c.getColumnIndex(MapPoint._ID)));
 mapPoint.setName(c.getString(c.getColumnIndex(MapPoint.NAME)));
 mapPoint.setAltitude(c.getInt(c.getColumnIndex(MapPoint.ALTITUDE)));
 mapPoint.setLatitude(c.getDouble(c.getColumnIndex(MapPoint.LATITUDE)));
 mapPoint.setLongtitude(c.getDouble(c.getColumnIndex(MapPoint.LONGTITUDE)));

 list.add(mapPoint);
 }
 c.close();
 db.close(); 

 return list;
 }

 public List find(String  selection, String[]  selectionArgs) {
 return find(false,null,selection, selectionArgs, null, null, null, null);
 }

 public List findAll() {
 return find(null,null);
 }

 public int update(MapPoint mapPoint) {
 return -1;
 }

 public List&lt;Map&lt;String, String&gt;&gt; convertForAdapter(List&lt;MapPoint&gt; mapPointList) {
 List&lt;Map&lt;String, String&gt;&gt; list = new ArrayList&lt;Map&lt;String, String&gt;&gt;();
 for (int i=0; i&lt;mapPointList.size(); i++) {
 Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();

 map.put(MapPoint._ID, String.valueOf(mapPointList.get(i).get_id()));
 map.put(MapPoint.NAME, mapPointList.get(i).getName());
 map.put(MapPoint.LATITUDE, String.valueOf(mapPointList.get(i).getLatitude()));
 map.put(MapPoint.LONGTITUDE, String.valueOf(mapPointList.get(i).getLongtitude()));
 map.put(MapPoint.ALTITUDE, String.valueOf(mapPointList.get(i).getAltitude()));
  list.add(map);
 }
 return list;
 }
}
</pre>
<p>A DAO osztály-t nem fejeztem be, csak a find() és insert() metódusokat programoztam le, a delete() és update() mindeninek házi feladat <img class="wp-smiley" src="http://codeplay.hu/wp-includes/images/smilies/icon_smile.gif" alt=":)" /> . Az igazság az, hogy már most rájöttem ez nem egészen lesz így jó, mert a DAO osztályt így minden adatbázis táblára létre kell hoznom, minden mezőt egyesével map-elni kell. Nem szeretem az ilyet.</p>
<p>A DAO minden lekérdező metódusa a Model osztályt, vagy az ebből generált lista objektumot adja vissza lekérdezésnél. A módosító metódusok általában azt adják vissza, mennyi rekord módosult, az insert() pedig az új rekord id-t.</p>
<p>Lényeges kiemelni a DAO osztály convertForAdapter() metódusát, ami a <a href="http://developer.android.com/reference/android/widget/SimpleAdapter.html">SimpleAdatpter </a>számára fog használható objektumstruktúrát előállítani. A find() által visszaadott List objektumból egy más struktúrájú listát állít elő, aminek az elemei már nem Model osztályok.</p>
<p>Végül lássuk, hogyan jelenik meg az Activity-ben a ListView. Az egész Activity-t nem másolom ide be, csak egyes részeit.</p>
<pre class="brush: java"> private ListView listMapPoints;

 private List mapPointList;
 private MapPointDao mapPointDao;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

 this.listMapPoints = (ListView) findViewById(R.id.listMapPoints);

 mapPointDao = new MapPointDao(this);                

 refreshList();
 }

 private void refreshList() {
 mapPointList = mapPointDao.findAll();

 int[] i = { R.id.textName, R.id.textDesc };
 String[] s = { "name", "_id" };

 this.listMapPoints.setAdapter(
 new SimpleAdapter(this, mapPointDao.convertForAdapter(mapPointList),
 R.layout.pointlistitem,s,i));
 }
</pre>
<p>Először az onCreate()-ben kikeressük a ListView objektumot a layout fájlból, majd létrehozzuk a DAO-t. A refreshList() metódusban programoztam le az lista elemek lekérdezését, mert így a refresh esetleg máshonnan is meghívható. Például egy dialógus ablakot definiálhatunk, ami törölni tud lista elemeket, és a törlés után jó ha a lista frissül.</p>
<h3>Miért jó?</h3>
<ul>
<li>Szerintem elég lightweight lett, nem igényel külső lib-et</li>
<li>Az adatbázis kezelés a program egyetlen pontján van, nem kell az Activity-ben foglalkozni a kurzorral</li>
<li>POJO osztályok</li>
<li>Elkülönül az üzleti logika, a megjelenítés és a perzisztencia réteg (MVC)</li>
</ul>
<h3>Problémák</h3>
<p>Természetesen ezzel nem állítottam elő egy Hibernate funkcionalitású ORM-et. A fentebbi programban elférnének a következő kiegészítések:</p>
<ul>
<li>A DAO egyes metódusainak paraméterezése történhetne Model osztállyal, így szűrőket lehetne megadni. Például findByExample(Model model) vagy deleteByExample(Model model)</li>
<li>Jó lenne a DAO-t generikusra megírni, hogy ne kelljen mindig a mapeléseket megírni</li>
<li>A DatabaseHelper az adatbázis szkriptet betölthetné külső fájlból vagy resource-ból</li>
<li>A DAO-ban az adatbázis kapcsolatokat nem kellene mindig bezárni, egyszer kéne a konstruktorban létrehozni, és a nyitottat használni</li>
<li>Jó lenne megoldani a foreign key-ek kezelését a Model-ben és a DAO-ban, hogy ne kelljen többször bekérdezni, ha például egy lista több táblából épül fel.</li>
<li>Hibakezelés és logolás</li>
</ul>
<p>Tovább fogom fejleszteni kis alkalmazásomat, így a fentebbi problémákra megoldást fogok kidolgozni, amit hasonló módon publikálni fogok.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/developer/2010/05/android-es-adatbazis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Népszerű az eIsin a KELER-ben</title>
		<link>http://codeplay.hu/news/2010/05/nepszeru-az-eisin-a-keler-ben/</link>
		<comments>http://codeplay.hu/news/2010/05/nepszeru-az-eisin-a-keler-ben/#comments</comments>
		<pubDate>Thu, 20 May 2010 22:53:44 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Hírek]]></category>
		<category><![CDATA[keler]]></category>
		<category><![CDATA[partner]]></category>
		<category><![CDATA[projekt]]></category>

		<guid isPermaLink="false">http://codeplay.hu/news/2010/05/nepszeru-az-eisin-a-keler-ben/</guid>
		<description><![CDATA[Ma volt projektzáró megbeszélésünk a KELER Zrt-ben, ahol lezártuk az eIsin projektet. Levontuk, a több mint másfél éve indult rendszerfejlesztés tanulságait , anekdotáztunk, és örültünk, hogy a sok feladat ellenére a végén egy jól használható rendszer készült. Számomra külön öröm, hogy úgy tűnt, a nehézségek ellenére a Megrendelő is igen pozitívan értékeli a projektet, valamint a [...]]]></description>
			<content:encoded><![CDATA[<p>Ma volt projektzáró megbeszélésünk a KELER Zrt-ben, ahol lezártuk az <a href="https://isin.keler.hu/">eIsin projektet</a>. Levontuk, a több mint másfél éve indult rendszerfejlesztés tanulságait , anekdotáztunk, és örültünk, hogy a sok feladat ellenére a végén egy jól használható rendszer készült. Számomra külön öröm, hogy úgy tűnt, a nehézségek ellenére a Megrendelő is igen pozitívan értékeli a projektet, valamint a KELER ügyfeleinek is tetszik a rendszer.</p>
<p>Jelenleg az ügyfelek 20%-a állt át az Internetes ISIN igénylés folyamatra, ami meglehetősen nagy számnak mondható ebben a szektorban. A projektzárón külön kiemelésre került, hogy Magyarország az elsők között van a világon, aki egy ilyen jellegű folyamatot a megrendeléstől egészen a folyamat pénzügyi teljesítéséig Internetre publikált.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/news/2010/05/nepszeru-az-eisin-a-keler-ben/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Digital Reality szerződés</title>
		<link>http://codeplay.hu/news/2010/05/digital-reality-szerzodes/</link>
		<comments>http://codeplay.hu/news/2010/05/digital-reality-szerzodes/#comments</comments>
		<pubDate>Mon, 17 May 2010 22:51:38 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Hírek]]></category>
		<category><![CDATA[digital reality]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[partner]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=27</guid>
		<description><![CDATA[
Ma aláírtuk keretszerződésünket az ország legnagyobb, nemzetközi hírnevű  játékszoftver fejlesztő cégével, a Digital Reality-vel. A CodePlay java-s tudását szeretnék kihasználni projektjeikben, amikről egyelőre többet nem mondhatunk. Szigorúan titkos! Írok azonban néhány gondolatot az irodáról, ami azt hiszem elég mély benyomást tett ránk, talán összevethető a hírhedt Google irodákkal.A DR neve valószínűleg mindenki számára ismerősen cseng, aki [...]]]></description>
			<content:encoded><![CDATA[<p><br class="spacer_" /></p>
<p>Ma aláírtuk keretszerződésünket az ország legnagyobb, nemzetközi hírnevű  játékszoftver fejlesztő cégével, a <a href="http://www.digitalreality.hu/">Digital Reality-vel</a>. A CodePlay java-s tudását szeretnék kihasználni projektjeikben, amikről egyelőre többet nem mondhatunk. Szigorúan titkos! Írok azonban néhány gondolatot az irodáról, ami azt hiszem elég mély benyomást tett ránk, talán összevethető a hírhedt Google irodákkal.<span id="more-27"></span>A DR neve valószínűleg mindenki számára ismerősen cseng, aki játszott PC-vel. Azoknak talán még inkább, akik ezt a 90-es években űzték, mint én. Mindig is szívesen emlékszem vissza a PC-s játékok hőskorára, amikor barátaimmal még talán a 386SX előtt ülve játszottuk végig az első magyar fejlesztésű játékokat, a <a href="http://en.wikipedia.org/wiki/Digital_Reality">Reuniont és az Imperium Galactica</a>-t. Ma meglepődve tapasztaltam, hogy a cég szépen kinőtte magát, nem egy kis hazai cégről beszélünk.</p>
<p>Ezt tükrözi a Kerepesi út szomszédságában levő iroda is, ahova belépve azonnal észrevehető volt egy olyan “feeling” amit eddig nem tapasztaltunk, csak a neten olvashattunk róla esetleg a Google irodáival kapcsolatban. Megérne egy külön képriportot az rengeteg dolog, amivel az itt dolgozók életét próbálják jobbá tenni. Az első szembeötlő a darts gép volt, ami még nem olyan egetverő újítás, más irodában is láttunk már (nálunk is van a falon, bár nem gép <img src="http://codeplay.hu/wp-includes/images/smilies/icon_smile.gif" alt=":)" /> ), de a ping-pong asztal és a meglehetősen nagy, mint később kiderült 120 fős előadó és vetítő terem mellett már nem lehet elmenni. Itt valamit másképp gondolnak, az biztos. Az iroda kinézete meglehetősen modern, hatalmas üveg falak választják el az irodát a folyosótól, amikre még írni is lehet tábla helyett. Vicces volt látni a felrajzolt kockákat és nyilakat az üveg felületekre, látszik, programozók ülnek az asztaloknál.<br />
 A tárgyalóban, ahol a megbeszélés zajlott, hatalmas plazmatévé, 5.1 hangrendszer és legalább három játékgép volt. Ez gondolom természetes lehet egy játékszoftver fejlesztő cégnél, de azért nekünk megakadt a szemünk rajta. Egy xbox még csak-csak elmegy, de ez már sok egy picit. Azt hiszem az i-re a pontot a megbeszélés közben tartott szünet tette fel, amikor is gyanútlanul kinéztünk az ablakon, és előbukkant a műfüves focipálya és kosárpálya, amihez még talán egy kisebb lelátó is volt. Azt hiszem kénytelen leszek a Rákóczi úton az udvart műfűvel borítani, hogy lépést tudjunk tartani.</p>
<p>Szeretem azt hinni, hogy a szoftverfejlesztés egy kicsit “más” munka. Talán a művészethez hasonló, kreatív tevékenység, amihez a szokványos értelemben vett “munkakörülmények” nem megfelelőek. Öröm volt látni, hogy mások is így gondolják. Ha nem is mindenki játszik mindennap az xbox-al, vagy van minden nap focimeccs, de a lehetőség adott, hogy kikapcsoljon az ember, és ezzel növelje teljesítményét és kreativitását a munkában.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/news/2010/05/digital-reality-szerzodes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desire tapasztalatok</title>
		<link>http://codeplay.hu/mobil/2010/05/desire-tapasztalatok/</link>
		<comments>http://codeplay.hu/mobil/2010/05/desire-tapasztalatok/#comments</comments>
		<pubDate>Thu, 13 May 2010 22:50:00 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Mobil]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[htc]]></category>

		<guid isPermaLink="false">http://codeplay.hu/mobil/2010/05/desire-tapasztalatok/</guid>
		<description><![CDATA[
Körülbelül egy hónapja pötyögök a tapifon-on, és úgy tűnik beigazolódnak első benyomásaim, egy igen jól használható készülékről van szó. Az elmúlt hónapban megváltoztak számítógép használati szokásaim, gyakorlatilag nem olvasok notebook-on híreket, és leveleimet is általában a telefonon nézem át. Az twitter-ről és facebbok-ról nem is beszélek, mert Deziré előtt nem nagyon használtam őket.Elsőként az Android [...]]]></description>
			<content:encoded><![CDATA[<p><br class="spacer_" /></p>
<p>Körülbelül egy hónapja pötyögök a tapifon-on, és úgy tűnik beigazolódnak első benyomásaim, egy igen jól használható készülékről van szó. Az elmúlt hónapban megváltoztak számítógép használati szokásaim, gyakorlatilag nem olvasok notebook-on híreket, és leveleimet is általában a telefonon nézem át. Az twitter-ről és facebbok-ról nem is beszélek, mert Deziré előtt nem nagyon használtam őket.<span id="more-25"></span>Elsőként az Android sokoldalúságát kell kiemelnem. Gyakorlatilag nem telefonról, hanem egy komplett Linux operációs rendszerrel ellátott számítógépről beszélünk. Már régebben is szimpatizáltam a Linux-al, nekem meglehetősen kézre álló oprendszer, és csodák csodája itt is megállja a helyét. (Bár az Android oldalon kiemelik, ez nem egy normál linux). Egyszerűen telepíthetek rá alkalmazásokat, akár párhuzamosan futtathatom őket, vagy ha éppen előtör a szunnyadó kockafej, kernelt is fordíthatok. Mindebből persze a tetszőlegesen telepíthető alkalmazások adják a dolog lényegét, amiből minden témakörben számtalan található a Market-ben. Két pöccintés, és fent is van bármi.</p>
<p><img class="alignright" src="http://www.htc.com/uploadedImages/WWW/Press_Room/Product_Photo_Gallery/HTC_Desire/Button_03.jpg" alt="HTC Desire" width="210" height="155" /></p>
<p>Alapvetően jók a hozzáadott HTC Sense szoftverek. A Friend Stream alkalmazás egy helyre gyűjti a social network alkalmazásokból az eseményeket, ami jó, mert egy helyen van minden, nem kell külön oldalon vagy appban keresni a twitteket és fácse bejegyzéseket. Egyedül a Newsreader-el gyűlt meg a bajom, ami elég sokáig frissít és ezzel foglalja a CPU-t, mert túl sok hírfolyamot követek. Ez a frissítési probléma néha előjön a Favorites ablakban is, ahonnan egy tapival hívhatók a telefonszámok, és a facebook-ról letöltött képek mellett az app megjeleníti a “kedvenceim” friss leveleinek és hozzászólásainak számát is.</p>
<p>Álljon itt most néhány általam jól használhatónak gondolt alkalmazás.</p>
<ul>
<li>Nem részletezem a twitter alkalmazások között dúló háborút, nálam a Twitdroid nyert, mert képes egy oldalon hozni az összes accountom twittjeit (4$- ért). A többi hasonló tudású, a hivatalos twitter app is jó.</li>
<li>Nálam nyerő szoftver az Easy Money, ahol nyomon követhetem pénztárcám alakulását. Mindig is szerettem volna tudni, hova költöm el a pénzem. Valóra vált az álmom, bár nem örülök az eredménynek <img src="http://codeplay.hu/wp-includes/images/smilies/icon_smile.gif" alt=":)" /></li>
<li>Skype az alap, hogy legyen kéznél. Mivel hivatalos skype app még nem fut a dezirén, a fring kézenfekvő megoldásnak bizonyult. Kezeli a skype accountomat, beolvassa ismerőseimet, gyekorlatilag mindent tud amit a skype. A hangminősége kicsit rosszabb mint az eredeti skype-nak, de ez betudható annak, hogy nem egy hivatalos fejlesztés.</li>
<li>A last.fm-re múlt évben kattantam rá, természetesen kijött az androidos verzió is. Semmi csicsa, jól használható zenelejátszó. Kicsit zavar, hogy a scrobler funkció nincs rajta, de szerintem idővel megoldódik a dolog.</li>
<li>Számos google alkalmazás tölthető le természetesen, így nem hiányozhat a telefonomról a maps.</li>
<li>Mivel a 3g szolgáltatás nem korlátlan, érdemes figyelni hol járunk a letöltött adatmennyiségben. A nettrafic statisztikát készít, és figyelmeztet ha közel a vég.</li>
<li>Számomra új szolgáltatás a magyar érdekeltségű ustream. Az androidos app szuperül működik, még 3g-n keresztül is elfogadható live stream-et képes küldeni a webre.</li>
<li>Néha az uninstall funkció nem működik, mindenféle hibát dobál. Szerencsére létezik a quickuninstaller nevű app, ami felolja a problémát.</li>
</ul>
<p>A telefon nagy erőssége, hogy az alkalmazások nagyon szépen, simán futnak rajta. Nem vehető észre semmilyen akadás a futás közben, a képernyő átmenetek szépen “úsznak”. Tetszőleges mértű, akár HD videó is lejátszható rajta. Ami külön szépség, hogy a kijelző tökéletes képminőséget produkál mindehhez. Egyáltalán nem látszanak a pixelek.</p>
<h3>Negatívumok</h3>
<p>Mint mindennek, a Desire-nek is megvannak a maga negatívumai, gyerekbetegségei. Ezek nyilván az idővel javítva lesznek, de jelenleg a sok újítás és úttörő megoldás miatt számos funkción van még mit finomítani.</p>
<p>Legbosszantóbb talán a  már sok más fórumon említett akkumulátor para. Mivel a telefon egy erős processzort tartalmaz, egy hatalmas kijelzővel, előfordul, hogy naponta egy töltés nem elég szegénynek. Főleg, ha elmegyek kirándulni valamerre, közben nézem a térképet, fotózgatok, és olvasom a wikipédián a helyi nevezetességeket. Nem értem, hogy manapság, amikor a tölthető elemek már 2800 mAh kapacitásúak, egy ilyen felső kategóriás termékbe miért egy 1400mAh-s aksi figyel. Természetesen nem értek az akkumulátorokhoz, és gondolom valami olyasmiről lehet szó, hogy a lítiumos aksikban ez nem annyira egyszerű, de az is lehet, hogy valamiféle spórolásról van szó. A telefont szétkapva, szerintem elfért volna egy 50%-al hosszabb aksi.</p>
<p>Szerencsére a Market-ben vannak alkalmazások, amik a töltések közti idő meghosszabbítására alkalmasak. Mindegyik hasonló elven működik, megpróbálják észrevehetetlenül kikapcsolni a telefon egyes funkcióit, wi-fit, gps-t, vagy állítani a kijelző fényerejét. A legjobb ötlet, a lokalizált beállításokra alapuló energiagazdálkodás. Például beállíthatóm, hogy a GPS-re nincs szükségem Budapesten belül, vagy a lakhelyemet elhagyva a wi-fi legyen kikapcsolva. Ezeket a funkciókat a Locale nevű alkalmazással próbáltam először, ami fizetős lett, másrészt belerondított a telefon egyes funkcióiba. És itt jön a következő gond:</p>
<p>Egyes alkalmazások képesek a telefon alap funkcióit tönkrevágni. A Locale például elérte, hogy a telefont nem lehetett kikapcsolni, valamint az alapértelmezett uninstall program sem indult el. Ez kicsit bosszantott. Uninstall programból persze van a Marketben bőven, de ne má’, hogy telepítenem kell egy pogit, mert egy másik az eredetit összekavarta.</p>
<p>Bosszantó még, hogy egyes HTC Sense alkalmazások túlterhelik a procit, és így a Desire mintha lefagyna egy pár másodpercre. Ilyen a HTC Sense-es hírolvasó, amíg frissít, valamint a Friend Stream szintén frissítés közben. Nem gondolom, hogy ennek így kell lennie, ez programozói hiba, javítani kell. Mi lehet egy gyengébb készülék esetében? Remélem az Android 2.2 sebességnövelésével ezek a problémák megoldódnak.</p>
<p>A Marketen is lehetne mit finomítani. Az Android egyik lényeges elemét adó felületet nem sikerült valami jól összerakni. A több ezer alkalmazás között igen nehéz keresni, hacsak nem ismerjük annak nevét. Tematizálva vagy tag-elve nemigen van a Market tartalma. Annyit sikerült kihozniuk magukból a Market applikáció fejlesztőinek, hogy a keresési lehetőség mellett van két fő kategória, Games valamint Apps, az Apps alatt 18,a games alatt 4 alkategória. Aztán ha ebbe belelép az ember akkor megkapja ömlesztve a négyezer kártyajátékot, vagy a háromezer multimédia alkalmazást. Ja, lehet rendezni még “Top Free” és “Just in”-el. Köszi!</p>
<p>Nagy szívfájdalmam, hogy nem találtam még megfelelő tokot hozzá, ami megvédené, ha leejtem, vagy ráteszek valamit. Ezt outdoor sportolás közben szívesen használnám, most meg csak vigyázok rá, mint egy hímes tojásra.</p>
<h3>Végül</h3>
<p>A pár negatívum ellenére az első hónap után nyugodt szívvel ajánlom nem csak geekeknek, hanem bárkinek aki el tudja képzelni magáról, hogy megváltoznak eddigi netezési szokásai egy új, telefonnak nem épp nevezhető készüléktől. Nyilvánvaló, hogy az elkövetkezendő hónapokban a konkurens gyártók hasonló termékekkel fognak elkápráztatni minket, vagy akár a HTC is, hogy a Google IO-n szétosztott<a href="http://now.sprint.com/evo/"> EVO-ról </a>ne is beszéljünk, én mégis úgy gondolom, nem fogom megbánni a Dezirét.</p>
<h3>Update</h3>
<p>Mindenképp javaslom az izgő-mozgó háttér animáció kikapcsolását. Csodákat művel az aksival!</p>
<h3>Update2</h3>
<p>A JuiceDefender rettentő sokat segít, valószínűleg a WiFi és 3G ki-be kapcsolgatásával. Tegnap több mint 28 órát használtam Dezirét normál üzemben (net, levelek, twitter, fácse és telefon)</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/mobil/2010/05/desire-tapasztalatok/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KELER Zrt. eIsin igénylő rendszer bevezetés</title>
		<link>http://codeplay.hu/news/2010/05/keler-zrt-eisin-igenylo-rendszer-bevezetes/</link>
		<comments>http://codeplay.hu/news/2010/05/keler-zrt-eisin-igenylo-rendszer-bevezetes/#comments</comments>
		<pubDate>Sat, 01 May 2010 22:47:45 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Hírek]]></category>
		<category><![CDATA[alkalmazás]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[keler]]></category>
		<category><![CDATA[partner]]></category>
		<category><![CDATA[projekt]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=23</guid>
		<description><![CDATA[Április folyamán bevezetésre került a KELER Zrt-nél a CodePlay által fejlesztett Internetes keretrendszer, valamint az eIsin Internetes ISIN azonosító igénylő rendszer, amely elérhető a https://isin.keler.hu címen. A megrendelő visszajelzései alapján az eIsin-t számos ügyfelük kezdte el használni, így nagyban leegyszerűsítve az ISIN igénylési folyamatot, valamint a hozzá kapcsolódó fizetési procedúrát.
Az eIsin rendszer alkalmas az országban forgalomban [...]]]></description>
			<content:encoded><![CDATA[<p>Április folyamán bevezetésre került a KELER Zrt-nél a CodePlay által fejlesztett Internetes keretrendszer, valamint az eIsin Internetes ISIN azonosító igénylő rendszer, amely elérhető a <a href="https://isin.keler.hu/">https://isin.keler.hu</a> címen. A megrendelő visszajelzései alapján az eIsin-t számos ügyfelük kezdte el használni, így nagyban leegyszerűsítve az ISIN igénylési folyamatot, valamint a hozzá kapcsolódó fizetési procedúrát.</p>
<p>Az eIsin rendszer alkalmas az országban forgalomban levő részvények, kötvények, és értékpapírok kibocsátásához szükséges Isin azonosító igénylésére. A rendszerbe bejelentkezett felhasználó az értékpapír adatok valamint a kibocsátó megadásával indíthatja el az igénylési folyamatot, melynek során on-line bankkártyás fizetéssel egyenlítheti ki számláját, majd a folyamat végén azonnal hozzáfér új Isin kódjához. A rendszerhez kapcsolatban van a KELER Zrt. hátér rendszereivel, valamint mindenre kiterjedő naplózó és monitorozó rendszert tartalmaz. A szoftver alapjául szolgáló Internetes keretrendszer képes további KELER-es szolgáltatások egyszerű, gyors Internetes publikálására.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/news/2010/05/keler-zrt-eisin-igenylo-rendszer-bevezetes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Az első okos három nap után</title>
		<link>http://codeplay.hu/mobil/2010/04/az-elso-okos-harom-nap-utan/</link>
		<comments>http://codeplay.hu/mobil/2010/04/az-elso-okos-harom-nap-utan/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 22:44:42 +0000</pubDate>
		<dc:creator>kepes</dc:creator>
				<category><![CDATA[Mobil]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[htc]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=19</guid>
		<description><![CDATA[
Három napja használom új és egyben első tapi telefonomat a HTC Desire-t. Az ilyen jellegű készülékek piacán jelenleg ez a legújabb, nem feltétlenül a legjobb készülék, bár egyelőre úgy tűnik sokmindenben legalább annyira jó ha nem jobb mint a konkurens iPhone. A megvásárlás eredeti indoka az Androidos fejlesztés volt, és elég keményen kellett magamnak magyarázni, hogy [...]]]></description>
			<content:encoded><![CDATA[<p><br class="spacer_" /></p>
<p>Három napja használom új és egyben első tapi telefonomat a<a href="http://www.htc.com/www/product/desire/overview.html"> HTC Desire</a>-t. Az ilyen jellegű készülékek piacán jelenleg ez a legújabb, nem feltétlenül a legjobb készülék, bár egyelőre úgy tűnik sokmindenben legalább annyira jó ha nem jobb mint a konkurens <a href="http://www.apple.com/hu/iphone/">iPhone</a>. A megvásárlás eredeti indoka az Androidos fejlesztés volt, és elég keményen kellett magamnak magyarázni, hogy miért is vásárolok meg egy ilyen top kategóriás készüléket. Még a bolt előtt is át kellett gondolnom a dolgot, de aztán pénz ment, készülék jött.</p>
<p><span id="more-19"></span></p>
<p><img class="alignleft" src="http://www.htc.com/uploadedImages/Common/Shared_Image/Icons/HTC_Desire_Make_It_Mine.jpg" alt="HTC Desire" width="219" height="205" />Első benyomásom, hogy annak ellenére mennyire csilli-villi a felület, igen gyors. Eddigi tapasztalataim szerint (az iPhone-t leszámítva) a tapi telefonok felülete lassúcska, helyenként használhatatlan volt. A Desire teljesen megfelelően reagál, a képernyők folyamatosan, pillanatok alatt úsznak át egymásba. Az igen egyszerű setup után rögtön kipróbáltam az összes social alkalmazást, így teljesen online lettem. A fácse és a csipogó a felhasználó megadása után azonnal indult. A telefon HTC Sense felületéhez kapott alkalmazások gond nélkül működnek, és szépek. A telefonszámokhoz és nevekhez a HTC Sense automatikusan hozzárendeli a facebook profilt, tehát ha név vagy telefonszám azonosságot talál contact list-ben és ismerőseim facebook profiljában, letölti a contact list-be ismerősöm képét, és minden olyan adatát amit megadott magáról a közösségi portálon. A telefonon van még Flickr és Picasa kapcsolódási lehetőség is, valamint google account-al azonnal elérhető az Android  Market.</p>
<p>A telefonról már sokan írták mennyire jó a fogása, jó képeket és videókat rögzít, és elég jól megvalósított a billentyűzet alkalmazása is, így ezt most kihagyom. Ami engem igazán érdekelt az az <a href="http://www.android.com/">Android </a>operációs rendszer, a Java alapú fejlesztés, valamint a Market. A fejlesztésről később írok, a Market-et kipróbálva elsőre lenyűgöző választék volt. Látszik, hogy nehéz lesz újat kitalálni. Minden feladatra alkalmazások sokaságát hozza a kereső, pillanatok alatt települ az alkalmazás, és a széles körben használtak hiba nélkül indulnak is. Rossz tapasztalatom csak egy-két kis letöltésszámú béta, vagy nullás verziószámú appal volt, így ezt nem is sorolom a negatívumok közé. Találtam 3d-s szimulátort, twitter kliens, googles alkalmazást ami kép alapján keres, és financiális ügyeimet nyomon követő programot.</p>
<p>Első igazi negatív élményem a fizetős alkalmazásoknál jelentkezett, amikor a <a href="http://twidroid.com/">Twidroid</a>-ot szerettem volna megvásárolni kemény 4$-os áron, mert az kezeli, ha több twitter accountom van. A Market keresője nem hozta fel a fizetős appokat. Kis keresgélés után rájöttem, országunkban nem lehetséges a vásárlás, ami felettébb bosszantó, hiszen pár dollárért olyan kész alkalmazásokat kaphatunk, amik jóval többet szolgáltatnak ingyenes társaiknál. A Twidroid szerencsére megoldja máshogy a dolgot, és ha jól tudom elvileg nem csak a Marketből letölthető szoftverek telepíthetők az Androidra.</p>
<p>Három nap után nem bántam meg a dolgot, szuper online lettem, híreket olvasok rajta, netezek. Ja, és telefonálni is lehet vele.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/mobil/2010/04/az-elso-okos-harom-nap-utan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Helló Világ!</title>
		<link>http://codeplay.hu/news/2010/03/hello-vilag/</link>
		<comments>http://codeplay.hu/news/2010/03/hello-vilag/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 22:04:59 +0000</pubDate>
		<dc:creator>codeplay</dc:creator>
				<category><![CDATA[Hírek]]></category>

		<guid isPermaLink="false">http://codeplay.hu/?p=1</guid>
		<description><![CDATA[
Elindult céges weboldalunk. Munkáinkkal, partnereinkkel kapcsolatos információkat szeretnénk megjeleníteni rajta, valamint munkatársaink blog bejegyzései is itt lesznek elérhetőek fejlesztés és üzemeltetés témakörben. Bejegyzéseinket minden érdeklődő nyomon követheti facebook és twitter oldalunkon.
]]></description>
			<content:encoded><![CDATA[<p><br class="spacer_" /></p>
<p>Elindult céges weboldalunk. Munkáinkkal, partnereinkkel kapcsolatos információkat szeretnénk megjeleníteni rajta, valamint munkatársaink blog bejegyzései is itt lesznek elérhetőek fejlesztés és üzemeltetés témakörben. Bejegyzéseinket minden érdeklődő nyomon követheti <a href="http://www.facebook.com/pages/CodePlay/375919541287">facebook</a> és <a href="http://twitter.com/codeplayhu">twitter</a> oldalunkon.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeplay.hu/news/2010/03/hello-vilag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
