<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>:: if you never try you never know ::</title>
	<atom:link href="http://adisembiring.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://adisembiring.wordpress.com</link>
	<description>software development and best practice</description>
	<lastBuildDate>Mon, 30 Jan 2012 23:34:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='adisembiring.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>:: if you never try you never know ::</title>
		<link>http://adisembiring.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://adisembiring.wordpress.com/osd.xml" title=":: if you never try you never know ::" />
	<atom:link rel='hub' href='http://adisembiring.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Recomended Microsoft Platform Books by Mr. Risman Adnan</title>
		<link>http://adisembiring.wordpress.com/2012/01/30/recomended-microsoft-platform-books/</link>
		<comments>http://adisembiring.wordpress.com/2012/01/30/recomended-microsoft-platform-books/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 07:52:27 +0000</pubDate>
		<dc:creator>adisembiring</dc:creator>
				<category><![CDATA[Book]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[Biztalk]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Entity Framework]]></category>

		<guid isPermaLink="false">http://adisembiring.wordpress.com/?p=366</guid>
		<description><![CDATA[Language Knowledge:    Runtime and Debugging Knowledge:      Object Oriented Knowledge          Framework Knowledge      Sharepoint Fundamentals : For Sharepoint Developers          BizTalk Fundamentals :        &#160; &#160; &#160;<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=366&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal"><strong><span style="font-size:11pt;color:#1f497d;">Language Knowledge:</span></strong><span style="font-size:11pt;color:#1f497d;"> </span></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"><img src="http://ecx.images-amazon.com/images/I/41wWC-6cUWL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /></span><span style="font-size:11pt;color:#1f497d;"><img src="http://ecx.images-amazon.com/images/I/51NqLpoGufL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /></span></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"><img src="http://ecx.images-amazon.com/images/I/518SB%2BmkTjL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /></span></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"> </span></p>
<p class="MsoNormal"><strong><span style="font-size:11pt;color:#1f497d;">Runtime and Debugging Knowledge:</span></strong></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"> </span></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"><img src="http://ecx.images-amazon.com/images/I/412wa7iEt3L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" />  <img src="http://ecx.images-amazon.com/images/I/41x4gy%2BwnZL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /></span></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"> </span><strong><span style="font-size:11pt;color:#1f497d;">Object Oriented Knowledge </span></strong></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"><img src="http://ecx.images-amazon.com/images/I/51aTfzB-dvL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" />  <img src="http://ecx.images-amazon.com/images/I/511D6FdsbXL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" />  <img src="http://ecx.images-amazon.com/images/I/511srZ07s2L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" />  <img src="http://ecx.images-amazon.com/images/I/41vqvUQMWPL._SL500_AA300_.jpg" alt="" width="300" height="300" /></span></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"> <span id="more-366"></span></span></p>
<p class="MsoNormal"><strong><span style="font-size:11pt;color:#1f497d;">Framework Knowledge</span></strong></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"><img src="http://ecx.images-amazon.com/images/I/41hZ9CwwewL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /><img src="http://ecx.images-amazon.com/images/I/513PT5XmA7L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /> <img src="http://ecx.images-amazon.com/images/I/51OjDo5%2BfuL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /><br />
<img src="http://ecx.images-amazon.com/images/I/51VuH4nM8sL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" />  <img src="http://ecx.images-amazon.com/images/I/518DCAlNQxL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /></span></p>
<p class="MsoNormal"><strong><span style="font-size:11pt;color:#1f497d;">Sharepoint Fundamentals : For Sharepoint Developers </span></strong></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"> </span></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"><img src="http://ecx.images-amazon.com/images/I/51j5pqB8cxL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /><img src="http://ecx.images-amazon.com/images/I/410g59yBcbL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /> <img src="http://ecx.images-amazon.com/images/I/51pfJgNTadL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /> <img src="http://ecx.images-amazon.com/images/I/51ExOHP7mOL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /></span></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"> </span></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"> </span></p>
<p class="MsoNormal"><strong><span style="font-size:11pt;color:#1f497d;">BizTalk Fundamentals : </span></strong></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"> </span></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"><img src="http://ecx.images-amazon.com/images/I/51BXyiTMqeL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /><img src="http://ecx.images-amazon.com/images/I/51l4psuFQQL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /> <img src="http://ecx.images-amazon.com/images/I/41L787SmKEL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /> <img src="http://ecx.images-amazon.com/images/I/51hJkZbkBGL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="" width="300" height="300" /></span></p>
<p class="MsoNormal"><span style="font-size:11pt;color:#1f497d;"> </span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/adisembiring.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/adisembiring.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/adisembiring.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/adisembiring.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/adisembiring.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/adisembiring.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/adisembiring.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/adisembiring.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/adisembiring.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/adisembiring.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/adisembiring.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/adisembiring.wordpress.com/366/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/adisembiring.wordpress.com/366/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/adisembiring.wordpress.com/366/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=366&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://adisembiring.wordpress.com/2012/01/30/recomended-microsoft-platform-books/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e62c8b206c9f6aa3aa5f97230686d203?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">adisembiring</media:title>
		</media:content>

		<media:content url="http://ecx.images-amazon.com/images/I/41wWC-6cUWL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/51NqLpoGufL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/518SB%2BmkTjL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/412wa7iEt3L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/41x4gy%2BwnZL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/51aTfzB-dvL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/511D6FdsbXL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/511srZ07s2L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/41vqvUQMWPL._SL500_AA300_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/41hZ9CwwewL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/513PT5XmA7L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/51OjDo5%2BfuL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/51VuH4nM8sL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/518DCAlNQxL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/51j5pqB8cxL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/410g59yBcbL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/51pfJgNTadL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/51ExOHP7mOL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/51BXyiTMqeL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/51l4psuFQQL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/41L787SmKEL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />

		<media:content url="http://ecx.images-amazon.com/images/I/51hJkZbkBGL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" medium="image" />
	</item>
		<item>
		<title>Searching pattern for user interface</title>
		<link>http://adisembiring.wordpress.com/2011/09/25/searching-pattern-for-user-interface/</link>
		<comments>http://adisembiring.wordpress.com/2011/09/25/searching-pattern-for-user-interface/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 17:31:30 +0000</pubDate>
		<dc:creator>adisembiring</dc:creator>
				<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software Development Concept]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[Query Object]]></category>
		<category><![CDATA[Query Pattern]]></category>
		<category><![CDATA[Repository]]></category>
		<category><![CDATA[Searching Pattern]]></category>

		<guid isPermaLink="false">http://adisembiring.wordpress.com/?p=356</guid>
		<description><![CDATA[Mengimplementasikan searching method untuk melakukan pencarian data bukanlah hal yang mudah. Bayangkan kita di assign task untuk mengimplementasikan searching departement dengan screen seperti dibawah ini: Search Department Name: [_______] Age: from [__] to [__] year old Budget: [ ] {Search} Data akses yang spesifik berhubungan dengan domain model di implementasikan dengan Repository pattern.  Cara umum [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=356&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Mengimplementasikan searching method untuk melakukan pencarian data bukanlah hal yang mudah. Bayangkan kita di assign task untuk mengimplementasikan searching departement dengan screen seperti dibawah ini:</p>
<p><span style="text-decoration:underline;">Search Department</span><br />
Name: [_______]<br />
Age: from [__] to [__] year old<br />
Budget: [ ]<br />
{Search}</p>
<p>Data akses yang spesifik berhubungan dengan domain model di implementasikan dengan Repository pattern.  Cara umum yang biasa dilakukan orang adalah:</p>
<h2>Lambda-Expression Repository</h2>
<p><pre class="brush: csharp;">
var result = departmentRepository.FindAll&lt;Department&gt;(
		x =&gt; x.Name.Contains(emailAddress) &amp;&amp; x.StartDate &gt; ageFrom
		&amp;&amp; x.StartDate &gt; ageFrom &amp;&amp; x.StartDate &lt; ageTo || x.Budget &lt; budget
	);
</pre></p>
<p>Aku suka dengan fitur Fluent diatas. Client API bisa dengan leluasa meng passing searching criteria ke parameter method tersebut. Tapi aku kurang nyaman dengan cara diatas, aku ga suka membiarkan searching criteria telanjang. Ketika aku hendak me-reuse criteria tersebut di screen lain tidak akan bisa. karena criteria di specify oleh client saat invoke method FindAll.</p>
<p><span id="more-356"></span></p>
<h2>Repository Finder Methods</h2>
<p><pre class="brush: csharp;">
var result = departmentRepository.SearchByBlaBlaBloodyBla(name, ageFrom, ageTo, budget);
</pre></p>
<p>Oke, aku lebih suka cara ini. Implementasi searching terencapsulate pada method SearchByBlaBlaBloodyBla. Diimplementasinya bisa di lakukan pengecekan, saat namanya tidak null, nama dijadikan sebagai searching criteria dan selanjutnya. Lagi lagi aku kurang suka dengan cara ini, terkadang ada searching parameter/criteria banyak. Saat parameter searching banyak, pengecekan parameter di method itu juga banyak dan implementasi Repository pattern jadi terlalu gemuk.</p>
<h2>Specification Pattern</h2>
<p><pre class="brush: csharp;">
...
public IEnumerable&lt;Department&gt; FindBySpec(ISpecification&lt;Department&gt; specs)
{
	return GetQuery&lt;Department&gt;().Where(criteria.IsSatisfiedBy).AsEnumerable();
}

...
var result = departmentRepository.Find&lt;Department&gt;(
	new IntenationalDepartmentSpec(),
	new DepartmentByNameSpecification(&quot;ce&quot;))
);
</pre></p>
<p>Ow .. Specification pattern, sounds cool bro. Sesuai dengan kegunaan Repository yang di jelaskan oleh Martin Fowler di buku PoEAA</p>
<blockquote><p>A Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection. Client objects construct query specifications declaratively and submit them to Repository for satisfaction.</p></blockquote>
<p>Tapi coba perhatikan code ini: GetQuery().Where(criteria.IsSatisfiedBy).AsEnumerable(); specification pattern itu bukan dibaca sebagai Expression Trees tapi di baca sebagai anonymous method / delegate yang return boolean. Code tersebut sama aja dengan code dibawah ini</p>
<p><pre class="brush: csharp;">
foreach (var department in FindAll())
{
	if (specs.IsSatisfiedBy(department))
		yield return department;
}
</pre></p>
<p>Bayangkan ketika kamu memiliki record yang ribuan, record tersebut harus di load dari database / FindAll(), di simpan dalam memory lalu di search berdasarkan spesifikasi, yield return. Specification memang kelihatan keren tapi kurang efisien <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</p>
<h2>Solution</h2>
<p>Aku biasanya membuat object Query untuk melakukan searching dengan criteria yang banyak/rumit. Dengan membuat query object kita mengikuti Object Oriented Principe yaitu:<br />
<strong>Single Responsibility</strong>: Object ini kerjaanya cuma melakukan query berdasarkan criteria query yang terdapat pada property object itu<br />
<strong> Command and Query</strong>: Repository Pattern biasanya aku gunakan untuk operasi write. Untuk operasi reaad/query/reporting dimana tidak merubah state domain model aku implementasikan dengan Query Pattern.</p>
<p><pre class="brush: csharp;">
public class DepartmentQuery
{
	private readonly ObjectContext _context;
	private readonly IObjectSet&lt;Department&gt; _objectSet;

	public DepartmentQuery(ObjectContext context)
	{
		_context = context;
		_objectSet = _context.CreateObjectSet&lt;Department&gt;();
	}

	public string Name { set; get; }
	public decimal? Budget { set; get; }
	public DateTime? StartDate { set; get; }

	public IQueryable&lt;Department&gt; GetQuery()
	{
		var departments = _objectSet.AsQueryable() ;

		if (Name != null)
			departments = departments.Where(d =&gt; d.Name.Contains(Name));

		if (Budget != null)
			departments = departments.Where(d =&gt; d.Budget &lt;= Budget);

		if (StartDate != null)
			departments = departments.Where(d =&gt; d.StartDate &lt;= StartDate);

		return departments;
	}
}
</pre></p>
<p>Cukup sederhana, jika kamu ingin menambahkan parameter (orderBy, paging, parameter baru) tinggal tambahkan di Query Object tersebut.</p>
<p>NOTE: Tidak semua query cocok di implementasikan dengan ORM. Untuk query yang complex seperti join ke beberapa table, membutuhkan agreagate query, native query merupakan solusi yang sederhana,cepat dan tepat.</p>
<h2>Reference</h2>
<ol>
<li><a href="http://bit.ly/nM6KZ" target="_blank">Extensible Query with Specification</a></li>
<li><a href="http://bit.ly/pK27ea" target="_blank">The DAL should go all the way to the UI</a></li>
<li><a href="http://bit.ly/pKAUL6" target="_blank">Repository Pattern</a></li>
</ol>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/adisembiring.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/adisembiring.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/adisembiring.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/adisembiring.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/adisembiring.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/adisembiring.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/adisembiring.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/adisembiring.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/adisembiring.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/adisembiring.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/adisembiring.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/adisembiring.wordpress.com/356/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/adisembiring.wordpress.com/356/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/adisembiring.wordpress.com/356/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=356&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://adisembiring.wordpress.com/2011/09/25/searching-pattern-for-user-interface/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e62c8b206c9f6aa3aa5f97230686d203?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">adisembiring</media:title>
		</media:content>
	</item>
		<item>
		<title>Del Learning Milis Archive</title>
		<link>http://adisembiring.wordpress.com/2011/06/24/del-learning-milis-archive/</link>
		<comments>http://adisembiring.wordpress.com/2011/06/24/del-learning-milis-archive/#comments</comments>
		<pubDate>Fri, 24 Jun 2011 17:08:55 +0000</pubDate>
		<dc:creator>adisembiring</dc:creator>
				<category><![CDATA[PI Del]]></category>
		<category><![CDATA[Del Learning Milis]]></category>
		<category><![CDATA[IA DEL]]></category>
		<category><![CDATA[Milis IT]]></category>
		<category><![CDATA[Politeknik Informatika Del]]></category>

		<guid isPermaLink="false">http://adisembiring.wordpress.com/?p=346</guid>
		<description><![CDATA[Learning milis Politeknikk Informatika Del sekarang sudah di-archive dan di publikasikan. Del learning milis ini merupkan sarana diskusi mengenai Computer Science dan Information Technology untuk mahasiswa dan alumni PI Del. Saya rasa banyak topik-topik IT yang bagus untuk di konsumsi oleh publik kususnya kalangan mahasiswa. Biasanya topik-topiknya mengenai trouble shooting seputar programming (Java, .NET, PHP [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=346&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://pidel.org"><img class="alignleft" style="margin-left:0;margin-right:5px;" title="Politeknik Informatika Del" src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/27519_130986753600596_9025_n.jpg" alt="" width="96" height="96" /></a>Learning milis <a href="http://www.pidel.org/" target="_blank">Politeknikk Informatika Del</a> sekarang sudah di-archive dan di publikasikan. <a href="http://del-learning-milis.2293873.n4.nabble.com/" target="_blank">Del learning milis</a> ini merupkan sarana diskusi mengenai Computer Science dan Information Technology untuk mahasiswa dan alumni <a href="http://www.facebook.com/pages/Politeknik-Informatika-del/130986753600596" target="_blank">PI Del</a>. Saya rasa banyak topik-topik IT yang bagus untuk di konsumsi oleh publik kususnya kalangan mahasiswa. Biasanya topik-topiknya mengenai trouble shooting seputar programming (Java, .NET, PHP dan Mobile Computing ) dan juga mengenai networking.</p>
<p>Saya harap dengan dipublishnya archive milis akan bermanfaat bagi mahasiswa-mahasiswa IT kampus lain dan juga IT industry.</p>
<p><a href="http://del-learning-milis.2293873.n4.nabble.com/" target="_blank">Check it out</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/adisembiring.wordpress.com/346/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/adisembiring.wordpress.com/346/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/adisembiring.wordpress.com/346/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/adisembiring.wordpress.com/346/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/adisembiring.wordpress.com/346/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/adisembiring.wordpress.com/346/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/adisembiring.wordpress.com/346/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/adisembiring.wordpress.com/346/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/adisembiring.wordpress.com/346/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/adisembiring.wordpress.com/346/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/adisembiring.wordpress.com/346/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/adisembiring.wordpress.com/346/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/adisembiring.wordpress.com/346/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/adisembiring.wordpress.com/346/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=346&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://adisembiring.wordpress.com/2011/06/24/del-learning-milis-archive/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e62c8b206c9f6aa3aa5f97230686d203?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">adisembiring</media:title>
		</media:content>

		<media:content url="http://profile.ak.fbcdn.net/hprofile-ak-snc4/27519_130986753600596_9025_n.jpg" medium="image">
			<media:title type="html">Politeknik Informatika Del</media:title>
		</media:content>
	</item>
		<item>
		<title>Java EE Learning Path</title>
		<link>http://adisembiring.wordpress.com/2011/06/23/java-ee-learning-path/</link>
		<comments>http://adisembiring.wordpress.com/2011/06/23/java-ee-learning-path/#comments</comments>
		<pubDate>Thu, 23 Jun 2011 03:08:39 +0000</pubDate>
		<dc:creator>adisembiring</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[donwload]]></category>
		<category><![CDATA[ebook]]></category>
		<category><![CDATA[javaee]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[jstl]]></category>
		<category><![CDATA[learning path]]></category>
		<category><![CDATA[servlet]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[struts]]></category>

		<guid isPermaLink="false">http://adisembiring.wordpress.com/?p=341</guid>
		<description><![CDATA[Dimilis sering bertanya: Gan .., kalo mau belajar Java EE mulai dari mana yah ? ada ebook bahasa indonesia tidak ? Ini summary saya dan saya gabung dengan beberapa pendapat member milis lainnya. Sebelum masuk ke Java EE sebaiknya harus menguasai Java Language dulu. Setelah itu masuk ke Java EE fundamental. Fundamental Servlet fundamental (Servlet, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=341&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Dimilis sering bertanya:</p>
<blockquote><p>Gan .., kalo mau belajar Java EE mulai dari mana yah ? ada ebook bahasa indonesia tidak ?</p></blockquote>
<p>Ini summary saya dan saya gabung dengan beberapa pendapat member milis lainnya. Sebelum masuk ke Java EE sebaiknya harus menguasai <a href="http://download.oracle.com/javase/tutorial/" target="_blank">Java Language</a> dulu. Setelah itu masuk ke Java EE fundamental.</p>
<h2>Fundamental</h2>
<ol>
<li>Servlet fundamental (Servlet, Filter, Listener)</li>
<li>JSP dan JSTL</li>
<li>Struktur web.xml</li>
<li>Session dan Cookie</li>
</ol>
<p>Setelah fundamental selesai, next step adalah:</p>
<ol>
<li>JDBC API (CRUD, Transaction)</li>
<li>MVC pattern</li>
<li>Layered Architecture (Presentation Layer,  Service Layer, Repository, Domain)</li>
</ol>
<h2>Advance</h2>
<p>Di advance mempelajari teknologi dan framework yang common digunakan pada Java EE Development di dunia kerja.</p>
<ol>
<li>ORM (Hibernate, JPA) boleh pilih salah satu *Hibernate recommended</li>
<li>Spring Framework (IoC, Data Access Support)</li>
<li>MVC Framework (Spring MVC atau Struts MVC) boleh pilih salah satu *Spring MVC recommended</li>
<li>Remoting (REST, WebService)</li>
<li>Messaging (JMS)</li>
</ol>
<p><a href="http://stickycode.wordpress.com/2011/03/15/java-books/" target="_blank">Ebook</a> Fundamental bisa dari <a href="http://pdf.coreservlets.com/" target="_blank">coreservlets </a>dan <a href="http://pdf.moreservlets.com/" target="_blank">moreservlets</a> ada juga <a href="http://courses.coreservlets.com/Course-Materials/csajsp2.html" target="_blank">hands on lab</a> nya.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/adisembiring.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/adisembiring.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/adisembiring.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/adisembiring.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/adisembiring.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/adisembiring.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/adisembiring.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/adisembiring.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/adisembiring.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/adisembiring.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/adisembiring.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/adisembiring.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/adisembiring.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/adisembiring.wordpress.com/341/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=341&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://adisembiring.wordpress.com/2011/06/23/java-ee-learning-path/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e62c8b206c9f6aa3aa5f97230686d203?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">adisembiring</media:title>
		</media:content>
	</item>
		<item>
		<title>Messaging and Event Driven Architecture Example</title>
		<link>http://adisembiring.wordpress.com/2011/05/06/messaging-and-event-driven-architecture-example/</link>
		<comments>http://adisembiring.wordpress.com/2011/05/06/messaging-and-event-driven-architecture-example/#comments</comments>
		<pubDate>Fri, 06 May 2011 09:30:18 +0000</pubDate>
		<dc:creator>adisembiring</dc:creator>
				<category><![CDATA[Messaging]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Software Development Concept]]></category>
		<category><![CDATA[ChatDownloader]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Event Driven Architecture]]></category>
		<category><![CDATA[pub/subs]]></category>
		<category><![CDATA[Service Oriented Architecture]]></category>

		<guid isPermaLink="false">http://adisembiring.wordpress.com/?p=312</guid>
		<description><![CDATA[Berdasarkan postingan sebelumnya mengenai Messaging and Event Driven Architecture. Sekarang saat nya aku membahas bagaimana cara mengimplementasikanya. Contoh aplikasi kali ini aku ambil dari ChatDownloader Aplication yang aku post sebelum nya. Namun sebelum masuk membendah contoh aplikasi tersebut ada hal-hal yang perlu aku jelaskan. Service Oriented Architecture Kebanyakan orang mengalihkan bahwa SOA itu berhubungan dengan [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=312&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://fusesource.com/docs/broker/5.4/getting_started/images/topic.png" alt="" width="347" height="180" /></p>
<p>Berdasarkan postingan sebelumnya mengenai <a href="http://adisembiring.wordpress.com/2011/03/05/messaging-and-event-driven-architecture/" target="_blank">Messaging and Event Driven Architecture</a>. Sekarang saat nya aku membahas bagaimana cara mengimplementasikanya. Contoh aplikasi kali ini aku ambil dari <a href="http://adisembiring.wordpress.com/2011/05/04/chat-downloader-application/" target="_blank">ChatDownloader Aplication</a> yang aku post sebelum nya. Namun sebelum masuk membendah contoh aplikasi tersebut ada hal-hal yang perlu aku jelaskan.</p>
<h2>Service Oriented Architecture</h2>
<p>Kebanyakan orang mengalihkan bahwa SOA itu berhubungan dengan Application Integration, Platform Independent, ada component software yang bisa diakses ecara remote either itu Webservice, REST, atau dalam Bentuk BPEL. Namun fokus SOA sebenarnya bukan di sisi itu.</p>
<blockquote><p>SOA itu merupakan architectural concept dalam software development dimana software tersebut di bangun berdasarkan service service yang saling berkolaborasi untuk melakukan specific business capability.</p></blockquote>
<p>Layaknya <strong>Object Oriented Programming</strong> yang merupkakan konsep pengembangan software dimana software tersebut dibangun berdasarkan object object yang saling berkolaborasi.</p>
<p>Apakah service itu ? Berdasarkan tulisan <a href="http://www.udidahan.com/2010/11/15/the-known-unknowns-of-soa/" target="_blank">Udidahan</a>:</p>
<blockquote><p>A <strong>service</strong> is the technical authority for a specific business capability.</p>
<p>Any piece of data or rule must be owned by only one service.</p></blockquote>
<p><span id="more-312"></span><br />
<strong> Karekteristik service</strong> itu adalah</p>
<ol>
<li>sesuatu yang memiliki technical authority untuk melakukan specific business capability berdasarkan context nya masing2, contohnya: Purchase Order Service, Shopping Service, Chat Service, Download Service, dll</li>
<li>Service harus memiliki data dan rule sendiri.</li>
<li>Service saling berkomunikasi via message (command dan event)</li>
</ol>
<h2>Application Breaking Down</h2>
<p>Aplikasi ChatDwonloader dibagi menjadi dua service, yaitu<strong> Chat Service</strong> dan <strong>Downloader Service</strong>. Tiap service bekerja sesuai dengan context kerjaan masing masing. Fitur aplikasi <strong>ChatDownloader</strong> hanya ada dua, Download File dan Remove Downloaded File.</p>
<ol>
<li><strong>Chat Service</strong>: Listen incoming chat message melalui GTalk. Filtering message apakah incoming message sesuai dengan download ataupun remove specification. Sending DownloadFile command message ke queue, dan RemoveFile command message ke queue. Chat service juga menghandle Event FileDownloaded event message dan FileRemoved event message dari Queue. Dan mengirimkan chat notifikasi ke account requester.</li>
<li><strong>Downloader Service</strong>: Menghandle DownloadFIle command, dan dan mendownload file berdasarkan URL Dan mempublish FileDownloaded Event ke queue. Downloader Service juga menghandel RemoveFile command message, meremove file dan mempublish FileRemoved Event message ke queue.</li>
</ol>
<p><a href="http://adisembiring.files.wordpress.com/2011/05/chatdownloaderarchitecture.png"><img class="aligncenter size-full wp-image-316" title="ChatDownloaderArchitecture" src="http://adisembiring.files.wordpress.com/2011/05/chatdownloaderarchitecture.png?w=630" alt=""   /></a></p>
<h2>Chat Listener Flow</h2>
<p>Google Talk menggunakan protokol XMPP, salah satu API XMPP di Java adalah <strong>Smack</strong>. Pertama yang harus dilakukan adalah membuat chat manager untuk melisten incoming message, dan mempublish message ke Message filter, apakah message tersebut message download atau message remove.</p>
<p><pre class="brush: java;">
public class ChatManager {
	//ChatManager attribute
	...

	@PostConstruct
	public void startUp() throws XMPPException {
		Thread chatManagerThread = new Thread() {
			@Override
			public void run() {
				try {
					//connect and login to chat server ...

					PacketFilter filter = new AndFilter(new PacketTypeFilter(Message.class));
					connection.addPacketListener(downloadChatListener, filter);
					connection.addPacketListener(removeChatListener, filter);
					log.info(&quot;listening message ...&quot;);

					System.in.read();

					// set presence status to unavailable when thrad end
					....
				} catch (Exception e) {
					log.error(e.getMessage(), e);
				}
			}
		};

		//start chatManagerThread daemon thread ...
	}
}
</pre></p>
<p>Message Filter : <strong>DownloadChatListener</strong> dan <strong>RemoveChatListener</strong> akan memfilter message tersebut dan memproses message apakah sesuai dengan spesifikasi message download atau message remove.</p>
<h3>Download Flow</h3>
<p><strong>DownloadChatListener</strong> memfilter incoming chat message, jika sesuai dengan spesifikasi download message maka dicreate <strong>FileDownload</strong> Command Message dan di kirim ke queue melalui JMS.</p>
<p><pre class="brush: java;">
public class DownloadChatListener implements PacketListener {
	//attribute ...

	private JmsTemplate simpleDownloadTemplate;
	private DownloadRequestSpecification spec;

	public DownloadChatListener() {
		spec = new DownloadRequestSpecification();
	}

	public void processPacket(Packet p) {
		Message msg = (Message) p;
		if (spec.isSatisfiedBy(msg.getBody())) {
			DownloadFile downloadRequest = new DownloadFile(getFrom(msg.getFrom()), getUrl(msg.getBody()));
			simpleDownloadTemplate.convertAndSend(downloadRequest);
		}
	}
}
</pre></p>
<p>Selanjutnya <strong>FileDownload</strong> Command Message di consume oleh <strong>DownloadFileHandler</strong> pada downloader service untuk mendownload file</p>
<p><pre class="brush: java;">
public class DownloadFileHandler implements MessageListener {
	//attribute ..
	IDownloadManager downloadManager;

	public void onMessage(Message message) {
		ObjectMessage mapMessage = (ObjectMessage) message;
		try {
			DownloadFile downloadRequest = (DownloadFile) mapMessage.getObject();
			downloadManager.queueDownloadRequest(downloadRequest);
		} catch (JMSException e) {
			throw JmsUtils.convertJmsAccessException(e);
		}
	}
}
</pre></p>
<p><strong>DownloadManager</strong> mendelegate <strong>SimpleDownloadTask</strong> untuk mendownload file, Kemudian SimpleDownloadTask mempublish <strong>FileDownloaded</strong> event message.</p>
<p><pre class="brush: java;">
public class SimpleDownloadTask implements Runnable {
	private IFileDownloader _simpleFileDownloader;
	private DownloadFile _downloadFile;
	private JmsTemplate _downloadCompledTemplate;
	private JmsTemplate _errorOccurredTemplate;

	public void run() {
		try {
			_simpleFileDownloader.download(_downloadFile);
			String  downloadUrl =  _downloadUrl + _downloadFile.getFileName();
			FileDownloaded downloadCompleted = new FileDownloaded(_downloadFile.getFrom(), _downloadFile.getUrl(), downloadUrl);
			_downloadCompledTemplate.convertAndSend(downloadCompleted);
		} catch (Exception e) {
			ErrorOccurred downloadError = new ErrorOccurred(_downloadFile.getFrom(), _downloadFile.getUrl(), e.getMessage());
			_errorOccurredTemplate.convertAndSend(downloadError);
		}
	}
}
</pre></p>
<p><strong>FileDownloaded</strong> event message di Handle oleh <strong>FileDownloadedHandler</strong>, lalu FileDownloaded mengconstruct FileDownloaded message dan mengirimkan message ke <strong>ChatManager</strong> untuk mengirimkan notifikasi ke requester.</p>
<p><pre class="brush: java;">
public class FileDownloadedHandler implements MessageListener {
	//attribute ...
	private ChatManager chatManager;

	@Override
	public void onMessage(Message message) {
		ObjectMessage mapMessage = (ObjectMessage) message;

		try {
			FileDownloaded downloadCompleted = (FileDownloaded) mapMessage.getObject();
			String msg = String.format(&quot;[%s] Completed %s \n download url: %s&quot;, downloadCompleted.getTime().toString(), downloadCompleted.getUrl(), downloadCompleted.getDownloadUrl());
			chatManager.sendMessage(downloadCompleted.getFrom(), msg);
		} catch (JMSException e) {
			throw JmsUtils.convertJmsAccessException(e);
		}
	}
}
</pre></p>
<h2>Struktur project</h2>
<p><img class="alignleft size-full wp-image-314" title="ChatDownloaderProjectStructure" src="http://adisembiring.files.wordpress.com/2011/05/chatdownloaderprojectstructure.png?w=630" alt=""   />Untuk mengerti code <strong>ChatDownloader</strong> ini harus memiliki basic <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/spring-core.html" target="_blank">Spring</a>, <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jms.html" target="_blank">JMS</a>, <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html" target="_blank">Thread Pool</a>, <a href="http://www.igniterealtime.org/projects/smack/index.jsp" target="_blank">Smack API</a>.</p>
<p>Source code dapat <a href="https://gitorious.org/chatdownloader/chatdownloader/archive-tarball/master" target="_blank">download</a> atau di <a href="https://gitorious.org/chatdownloader/chatdownloader" target="_blank">clone </a><a href="https://gitorious.org/chatdownloader/chatdownloader" target="_blank">Gitorious Repository</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/adisembiring.wordpress.com/312/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/adisembiring.wordpress.com/312/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/adisembiring.wordpress.com/312/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/adisembiring.wordpress.com/312/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/adisembiring.wordpress.com/312/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/adisembiring.wordpress.com/312/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/adisembiring.wordpress.com/312/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/adisembiring.wordpress.com/312/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/adisembiring.wordpress.com/312/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/adisembiring.wordpress.com/312/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/adisembiring.wordpress.com/312/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/adisembiring.wordpress.com/312/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/adisembiring.wordpress.com/312/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/adisembiring.wordpress.com/312/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=312&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://adisembiring.wordpress.com/2011/05/06/messaging-and-event-driven-architecture-example/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e62c8b206c9f6aa3aa5f97230686d203?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">adisembiring</media:title>
		</media:content>

		<media:content url="http://fusesource.com/docs/broker/5.4/getting_started/images/topic.png" medium="image" />

		<media:content url="http://adisembiring.files.wordpress.com/2011/05/chatdownloaderarchitecture.png" medium="image">
			<media:title type="html">ChatDownloaderArchitecture</media:title>
		</media:content>

		<media:content url="http://adisembiring.files.wordpress.com/2011/05/chatdownloaderprojectstructure.png" medium="image">
			<media:title type="html">ChatDownloaderProjectStructure</media:title>
		</media:content>
	</item>
		<item>
		<title>Chat Downloader Application</title>
		<link>http://adisembiring.wordpress.com/2011/05/04/chat-downloader-application/</link>
		<comments>http://adisembiring.wordpress.com/2011/05/04/chat-downloader-application/#comments</comments>
		<pubDate>Wed, 04 May 2011 18:24:13 +0000</pubDate>
		<dc:creator>adisembiring</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software Development Concept]]></category>
		<category><![CDATA[Chat]]></category>
		<category><![CDATA[ChatDownloader]]></category>
		<category><![CDATA[Download]]></category>
		<category><![CDATA[Java Application]]></category>
		<category><![CDATA[Java Download]]></category>
		<category><![CDATA[OpenSource]]></category>

		<guid isPermaLink="false">http://adisembiring.wordpress.com/?p=302</guid>
		<description><![CDATA[ChatDwonloader merupakan OpenSource Java Application yang memungkinkan download file melalui chatting Google Talk. Ide awalnya adalah aku sebagai Software Developer yang hampir setiap hari menghabiskan waktu untuk bekerja di client. Namun kadang kala aku membutuhkan software mislakan update atau patch Websphere Application Server yang ukuranya hampir 1GB. Kalau di download dari internet client satu hari [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=302&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://adisembiring.files.wordpress.com/2011/05/chatdownloader.jpg"><img class="aligncenter size-full wp-image-304" title="ChatDownloader" src="http://adisembiring.files.wordpress.com/2011/05/chatdownloader.jpg?w=630" alt=""   /></a></p>
<p><strong><strong>ChatDwonloader</strong></strong> merupakan OpenSource Java Application yang memungkinkan download file melalui chatting <strong>Google Talk</strong>. Ide awalnya adalah aku sebagai Software Developer yang hampir setiap hari menghabiskan waktu untuk bekerja di client. Namun kadang kala aku membutuhkan software mislakan update atau patch Websphere Application Server yang ukuranya hampir 1GB. Kalau di download dari internet client satu hari juga ga bakal kelar. Tapi kalo di download dari kantor kencang. Akhirnya dengan cara manual aku search software yang perlu di download saat jam kerja di client. Besok paginya aku datang ke kantor untuk mendownload file yang sudah aku persiapkan satu hari sebelumnya.</p>
<p class="MsoNormal">Terus terang cara manual diatas sangat tidak efektif, aku harus cari file nya, besoknya aku download dari kantor, besoknya aku datang lagi ke kantor untuk ambil file tersebut. Gimana jika disaat aku dapatkan url file download filenya, aku kirim sesuatu ke kantor lalu file tersebut di download automatis. Besoknya dengan santai aku datang ke kantor untuk ambil file hasil downloadtan.</p>
<p class="MsoNormal">Akhirnya setelah bertapa selama satu hari dan diberi wangsit oleh Ki Joko Bodo dan Hokage IV aku mendapat ide untuk download file melalui chat. Aku buatin program yang jalan di background, kerjaanya dengarin chat message download dari GTalk, ketika ada chat message download yang masuk program tersebut akan download-tin filenya, notify pengirim ketika file tersebut sudah selesai di download dari chat message juga.</p>
<p class="MsoNormal"><span id="more-302"></span></p>
<h2 class="MsoNormal">Download</h2>
<p class="MsoNormal"><strong>Download source</strong> filenya di <a href="https://gitorious.org/chatdownloader/chatdownloader/archive-tarball/master">https://gitorious.org/chatdownloader/chatdownloader/archive-tarball/master</a></p>
<h2 class="MsoNormal">Prerequisite</h2>
<p class="MsoNormal">file yang dibutuhakan sebelum menjalankan program ini adalah <a href="http://activemq.apache.org/download.html" target="_blank">ActiveMQ</a>, download lalu start program dengan command:</p>
<p class="MsoListParagraphCxSpFirst" style="text-indent:-.25in;">1.<span style="font:7pt 'Times New Roman';">       </span>Windows: activemq/bin/activemq.bat start</p>
<p class="MsoListParagraphCxSpLast" style="text-indent:-.25in;">2.<span style="font:7pt 'Times New Roman';">       </span>Linux: sh activemq/bin/activemq start</p>
<h2 class="MsoNormal">Konfigurasi</h2>
<p class="MsoNormal">Pada directory src terdapat dua service project, masing-masing project memiliki konfigurasi sendiri sendiri</p>
<p class="MsoNormal">`<strong>com.cd.chat/src/application.properties</strong>`, yang perlu di perhatikan adalah:</p>
<p class="MsoNormal">                xmpp.user=gtalkuser</p>
<p class="MsoNormal">                xmpp.password=gtalkpassword</p>
<p class="MsoNormal">`<strong>com.cd.downloader/src/application.properties</strong>`, yang perlu di perhatikan adalah:</p>
<p class="MsoNormal">                downloaded.dir = D:/Downloads/cd &#8212; dimana hasil download di simpan</p>
<p class="MsoNormal">                download.url = http://10.10.10.10/downloaded/ &#8212; dimana hasil download dapat di download</p>
<h2 class="MsoListParagraphCxSpFirst" style="margin-left:0;">Generate Installer</h2>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;">Masuk ke directory <strong>src</strong></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;">                ant installer</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;">ant akan menggenerate installer ke folder `chatdownloader/installer`. terdapat 3 jenis binary:</p>
<ol>
<li>bin-linux-x86-32</li>
<li>bin-linux-x86-64</li>
<li>bin-win-x86-32</li>
</ol>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;">Pilih binary yang sesuai dengan platform, lalu rename menjadi bin. mislanya `bin-win-x86-32` =&gt;<strong> `bin`</strong></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;"><strong><br />
</strong></p>
<h2 class="MsoListParagraphCxSpMiddle" style="margin-left:0;">Install di Windows</h2>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;">Masuk ke directory installer -&gt; `<strong>chatdownloader/installer</strong>`</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;">Program ini akan di install di windows sebagai<strong> windows service</strong>.</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;">Install windows service dengan menjalankan:</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;">                $Install.bat</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;">Jalankan service dengan menjalankan:</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;">                $Startup.bat</p>
<h2 class="MsoListParagraphCxSpMiddle" style="margin-left:0;">Install di Unix</h2>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;">Masuk ke directory installer -&gt; `<strong>chatdownloader/installer</strong>`</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;">Jalankan command</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;">                $sh startup.sh</p>
<h2 class="MsoListParagraphCxSpMiddle" style="margin-left:0;">Usage</h2>
<p>Pertama user yang digunakan untuk mengirimkan chat message download harus menjadi friend Gtalk user yang digunakan oleh aplikasi <strong>ChatDwonloader</strong>. Jika sudah friend, tinggal kirim message dengan format seperti dibawah ke GTalk user yang ada pada <strong>ChatDownloader</strong></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left:0;"><strong>download file</strong>: [d url], ex. d http://d3nwyuy0nl342s.cloudfront.net/images/modules/header/logov3-hover.png</p>
<p class="MsoListParagraphCxSpLast" style="margin-left:0;"><strong>remove file</strong> : [r url], ex. r logov3-hover.png</p>
<p class="MsoListParagraphCxSpLast" style="margin-left:0;"><a href="http://adisembiring.files.wordpress.com/2011/05/5-5-2011-1-02-38-am1.png"><img class="aligncenter size-full wp-image-309" title="5-5-2011 1-02-38 AM" src="http://adisembiring.files.wordpress.com/2011/05/5-5-2011-1-02-38-am1.png?w=630" alt=""   /></a><a href="http://adisembiring.files.wordpress.com/2011/05/5-5-2011-1-02-38-am.png"><br />
</a></p>
<p class="MsoListParagraphCxSpLast" style="margin-left:0;">Have Fun Folks</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/adisembiring.wordpress.com/302/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/adisembiring.wordpress.com/302/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/adisembiring.wordpress.com/302/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/adisembiring.wordpress.com/302/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/adisembiring.wordpress.com/302/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/adisembiring.wordpress.com/302/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/adisembiring.wordpress.com/302/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/adisembiring.wordpress.com/302/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/adisembiring.wordpress.com/302/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/adisembiring.wordpress.com/302/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/adisembiring.wordpress.com/302/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/adisembiring.wordpress.com/302/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/adisembiring.wordpress.com/302/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/adisembiring.wordpress.com/302/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=302&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://adisembiring.wordpress.com/2011/05/04/chat-downloader-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e62c8b206c9f6aa3aa5f97230686d203?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">adisembiring</media:title>
		</media:content>

		<media:content url="http://adisembiring.files.wordpress.com/2011/05/chatdownloader.jpg" medium="image">
			<media:title type="html">ChatDownloader</media:title>
		</media:content>

		<media:content url="http://adisembiring.files.wordpress.com/2011/05/5-5-2011-1-02-38-am1.png" medium="image">
			<media:title type="html">5-5-2011 1-02-38 AM</media:title>
		</media:content>
	</item>
		<item>
		<title>Running Java Applications as a Linux Service</title>
		<link>http://adisembiring.wordpress.com/2011/04/04/running-java-applications-as-a-linux-service/</link>
		<comments>http://adisembiring.wordpress.com/2011/04/04/running-java-applications-as-a-linux-service/#comments</comments>
		<pubDate>Mon, 04 Apr 2011 16:01:24 +0000</pubDate>
		<dc:creator>adisembiring</dc:creator>
				<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[java service wrapper]]></category>
		<category><![CDATA[java wrapper]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[linux service]]></category>
		<category><![CDATA[linux service wrapper]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[windows service]]></category>
		<category><![CDATA[windows service wrapper]]></category>

		<guid isPermaLink="false">http://adisembiring.wordpress.com/?p=280</guid>
		<description><![CDATA[Overview Sometimes application have the need to run java application as Linux Service. Aplicatioin needs to start, stop, restart easily. In traditional method, I usually run java application using command line java -jar applicationame when I need to restart the application, I will do: - Find process ID of the application started before - Kill [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=280&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h1><img class="aligncenter" src="http://inixes.com/images/managed-services-puzzle-pieces.jpg" alt="" height="215" /></h1>
<h1>Overview</h1>
<p>Sometimes application have the need to run java application as Linux Service. Aplicatioin needs to start, stop, restart easily. In traditional method, I usually run java application using command line<br />
java -jar applicationame<br />
when I need to restart the application, I will do:<br />
- Find process ID of the application started before<br />
- Kill process kill -9 PID<br />
- start java apps, java -jar applicationname</p>
<p>Besides complicated, this method also has disadvantages such as the when start service for two times there is no prevention if the service running.</p>
<h1>Java Service Wrapper</h1>
<p><a href="http://wrapper.tanukisoftware.com/doc/english/download.jsp" target="_blank"> Using Java Service Wrapper</a>, the complected steps above can be simplified.It also support Linux and Windows Platform.</p>
<p><a href="http://code.google.com/p/adisembiring/downloads/detail?name=jsw.rar&amp;can=2&amp;q=" target="_blank">The case study</a> is scheduler will print log every one second. To know about quartz using spring support please check <a href="http://www.mkyong.com/spring/spring-quartz-scheduler-example/" target="_blank">this article</a></p>
<p>First thing first is download <a href="http://wrapper.tanukisoftware.com/doc/english/download.jsp#stable" target="_blank">java service wrapper library</a> , I use 3.5.7 version for linux 64 bit. Unzip the file. If you want to use the java service wrapper to production you can remove docs, jdoc, src directory and readme files.<br />
export the application to jar file, you can use you IDE to make it simple.<span id="more-280"></span></p>
<h2>Manage Artifact</h2>
<p>Go to <strong>wrapper_home</strong>,<br />
copy application jar to wrapper_home/jsw.jar<br />
copy application configuration file such: application.properties, application-context.xml to wrapper_home/<br />
copy application library  to wrapper_home/lib</p>
<h2>Configuration</h2>
<p>open wrapper configuration file wrapper_home/conf/wrapper.conf and change some configuration file:</p>
<h3>Wrapper Class</h3>
<p>wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp</p>
<h3>Configure application jar file</h3>
<p>wrapper.java.classpath.3=../jsw.jar</p>
<h3>Configure application lib dependency</h3>
<p>wrapper.java.classpath.5=../lib/commons-logging.jar<br />
wrapper.java.classpath.6=../lib/org.springframework.asm.jar<br />
wrapper.java.classpath.7=../lib/org.springframework.beans.jar<br />
wrapper.java.classpath.8=../lib/org.springframework.context.jar<br />
wrapper.java.classpath.9=../lib/org.springframework.context.support.jar<br />
wrapper.java.classpath.10=../lib/org.springframework.core.jar<br />
wrapper.java.classpath.11=../lib/org.springframework.expression.jar<br />
wrapper.java.classpath.12=../lib/org.springframework.transaction.jar<br />
wrapper.java.classpath.13=../lib/log4j-1.2.15.jar<br />
wrapper.java.classpath.14=../lib/quartz-1.8.3.jar<br />
wrapper.java.classpath.15=../lib/slf4j-api-1.5.10.jar<br />
wrapper.java.classpath.16=../lib/slf4j-log4j12-1.5.10.jar</p>
<h3>Configure application main class</h3>
<p>wrapper.app.parameter.1=jsw.main.Main</p>
<h3>Configure Service Description</h3>
<p># Name of the service<br />
wrapper.name=jsw<br />
# Display name of the service<br />
wrapper.displayname=Java Service Wrapper Example<br />
# Description of the service<br />
wrapper.description=Java Service Wrapper Example Description</p>
<p>Go to wrapper_home/bin change testwrapper file name to jws to make it more explicit to service name.</p>
<h2>Test Application</h2>
<p>Go to wrapper_home/bin<br />
install service: sh jws install<br />
start service: sh jws start</p>
<p><strong>To check the start service successfully executed, check log the log file</strong> wrapper_home/logs/wrapper.log</p>
<p>restart service: sh jws restart<br />
stop service: sh jws stop</p>
<h2>Download</h2>
<p><a href="http://code.google.com/p/adisembiring/downloads/detail?name=jsw.rar&amp;can=2&amp;q=" target="_blank">download</a> spring quartz scheduler source code.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/adisembiring.wordpress.com/280/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/adisembiring.wordpress.com/280/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/adisembiring.wordpress.com/280/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/adisembiring.wordpress.com/280/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/adisembiring.wordpress.com/280/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/adisembiring.wordpress.com/280/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/adisembiring.wordpress.com/280/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/adisembiring.wordpress.com/280/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/adisembiring.wordpress.com/280/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/adisembiring.wordpress.com/280/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/adisembiring.wordpress.com/280/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/adisembiring.wordpress.com/280/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/adisembiring.wordpress.com/280/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/adisembiring.wordpress.com/280/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=280&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://adisembiring.wordpress.com/2011/04/04/running-java-applications-as-a-linux-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e62c8b206c9f6aa3aa5f97230686d203?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">adisembiring</media:title>
		</media:content>

		<media:content url="http://inixes.com/images/managed-services-puzzle-pieces.jpg" medium="image" />
	</item>
		<item>
		<title>Messaging and Event Driven Architecture</title>
		<link>http://adisembiring.wordpress.com/2011/03/05/messaging-and-event-driven-architecture/</link>
		<comments>http://adisembiring.wordpress.com/2011/03/05/messaging-and-event-driven-architecture/#comments</comments>
		<pubDate>Sat, 05 Mar 2011 06:59:03 +0000</pubDate>
		<dc:creator>adisembiring</dc:creator>
				<category><![CDATA[Messaging]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[pub/subs]]></category>

		<guid isPermaLink="false">http://adisembiring.wordpress.com/?p=266</guid>
		<description><![CDATA[Overview Messaging adalah salah satu metode komunikasi antara software komponen atau aplikasi. Messaging client dapat mengirimkan dan menerima pesan dari messaging client yang lain. Dengan messaging komunikasi terdistribusi dapat di lakukan. Message receiver tidak harus available saat message sender mengirimkan pesan. Message Sender mengirimkan pesan ke destination (lokasi dimana message tersebut dikirimkan) yang terdapat di [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=266&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h1>Overview</h1>
<p><img class="aligncenter" src="http://fusesource.com/docs/broker/5.4/getting_started/images/topic.png" alt="" width="414" height="215" /></p>
<p>Messaging adalah salah satu metode komunikasi antara software komponen atau aplikasi. Messaging client dapat mengirimkan dan menerima pesan dari messaging client yang lain. Dengan messaging komunikasi terdistribusi dapat di lakukan. Message receiver  tidak harus available saat message sender mengirimkan pesan. Message Sender mengirimkan pesan ke destination (lokasi dimana message tersebut dikirimkan) yang terdapat di messaging agent, saat receiver available messaging agent mengirimkan pesan tersebut ke receiver.</p>
<p>Messaging ini benar benar loosely coupled, sender tidak berinteraksi langsung dengan receiver, sender tidak perlu tahu menahu tentang receiver ataupun sebaliknya. Yang menjadi kontrak/yang harus diketahui oleh sender dan receiver adalah message format dan destination.</p>
<p>messaging itu asynchronous (fire and forget) , sender hanya mengirimkan message ke destination. sender tidak harus harus menunggu message tersebut selesai proses oleh receiver, dan receiver tidak harus available saat pesan tersebut di kirim. Misalkan aplikasi receiver down, receiver akan tetap mendapat message setelah aplikasi receiver available.</p>
<p>Terdapat dua<strong> messaging pattern</strong>:</p>
<ol>
<li><strong>Point to Point</strong>: <em>Sender </em>hanya mengirimkan message ke satu receiver</li>
<li><strong>Publish and Subscribe</strong>: <em>publisher/sender</em> mempublish message ke banyak <em>subscriber/receiver</em>. Jika ada <em>subscriber </em>yang baru masuk, <em>subscriber </em>cukup mensubscribe <em>destination</em>, tidak ada perubahan terhadap <em>publisher</em>. Saat <em>publisher</em> mengirimkan  message lagi maka <em>subscriber </em>yang baru secara automatis akan mendapatkan message tersebut.<span id="more-266"></span></li>
</ol>
<h1>Real World Implementation</h1>
<p>Kebanyakan eksekusi proses dalam software dilakukan secara sequential dan juga synchronous. <strong>Misalkan proses create Purchase Order, input proses nya adalah POCommand</strong>.</p>
<ol>
<li>Eksekusi <strong>POService </strong>men transform POCommand menjadi Domain model PO, rubah status PO menjadi created</li>
<li>Eksekusi <strong>EmailService </strong>untuk mengirimimkan email notification ke manager</li>
<li>Eksekusi <strong>ServiceNotifikasi </strong>untuk mempublish notifikasi ke webiste, jadi setiap kali user membuka aplikasi akan muncul notifikasi approval terhadap notifikasi yang baru di create.</li>
</ol>
<p>Bayangkan apa yang terjadi bila tiga proses di atas di eksekusi secara synchronous. Ketika user submit POCommand, aplikasi harus menunggu POService menyimpan data PO ke storage, memanggil service email untuk mengirimkan email notifikasi. Saat email service di eksekusi email melakukan open koneksi, otentikasi ke email server, lalu mengirimkan email ke mail server. Setelah itu lanjut dengan memanggil service NotificationSrevice untuk menghandle open database connection, insert data ke tabel notifikasi. Long chain proses execution right ? ditiap proses harus menunggu proses selesai, lalu melanjutkan eksekusi proses lain. <em>Waktu yang dibutuhkan untuk eksekusi proses lama, terdapat locking proses, out memory exception karena banyak proses yang di hold datanya juga ikut di hold di memory</em>. Hal ini adalah mimpi buruk, user bakal sering complain dan bilang `koq aplikasinya lambat ya ?, koq aplikasinya sering out memory exception ya `.</p>
<p><a href="http://adisembiring.files.wordpress.com/2011/03/pomessaging.png"><img class="aligncenter size-full wp-image-267" title="POMessaging" src="http://adisembiring.files.wordpress.com/2011/03/pomessaging.png?w=630&#038;h=225" alt="" width="630" height="225" /></a></p>
<p>Secara bisnis dan arsitektur proses sending email dan notifikasi sebenarnya tidak harus satu sequence. Asynchronous adalah solusi terbaik untuk memecahkan masalah diatas. Solusi asynchronous benar-benar loosely couple, <em>setiap service meproses sesuai dengan context nya masing-masing</em>. Context kerjaan POService itu memproses Create PO, memproses Update PO, memproses Cancel PO. Untuk mentriger email notification sebenarnya bukan tugas POService, apa lagi menginvoke NotificationService untuk menyimpan notifikasi ke tabel notification. Kerjaan POService memproses PO dan , mempublish event terhadap PO yang di proses tersebut. Misalnya memproses POCreateCommand setelah itu mempublish event POCreated, meproses POCancelCommand setelah itu mempublish event POCanceled. Event-event itu adalah message yang di publish oleh service, dan di consume oleh service yang interest terhadap event itu. Mislakan  EmailService, ketikan service tersebut menerima event POCreated, service tersebut akan mengirimkan email notification. Saat NotificationService mendapat event POCreated akan meninsert tabel notification, agar saat manager membuka aplikasi akan langsung mendapat notifikasi ada PO yang harus di approve oleh manager tersebut. Dengan messaging tidak akan terjadi locking proses yang terlalu lama, memory yang digunakan juga lebih efisien karena di proses oleh masing-masing proses. Jika Email Service mati, atau Notification Service mati, tidak akan menggangu proses CreatePO.</p>
<p>Suatu saat ada permintaan untuk order statistik untuk mengidentifikasi product yang sering di order oleh customer. Jika menggunakan messaging, <em>tinggal develop service order statstic yang interest terhadap event</em> POCreate, setelah itu deploy service OrderStatistic. Jadi tidak akan menggangu bisnis yang sedang berjalan, tidak ada down aplikasi dan deploy ulang. Bayangan jika menggunakan sequential process execution, setelah develop <strong>OrderStatisticService</strong>,  <strong>OrderService </strong>harus di rubah karena di order service harus meng invoke  <strong>OrderStatisticService</strong>. <strong>OrderService </strong>harus di down, lalu di deploy <strong>OrderService </strong>yang terbaru. Jadi complecated, belum lagi alau ada keputusan kalau aplikasi ga boleh down, karena terlalu banyak transaksi didalamnya, kalau aplikasi down warung bisa-bisa jadi tutup, hahaha.</p>
<p>Banyak contoh penggunaan asynchronous messaging ini. Mislakan ada aplikasi <strong>penerimaan mahasiswa baru</strong>, ketika calon mahasiswa di approve menjadi mahasiswa di universitas tersebut, aplikasi penerimaan mahasiswa baru mempublish event <strong>StudentApproved</strong>. Setelah itu terdapat service <strong>RegistrationAcademicInformationSystem </strong>yang automatis meregistrasi mahasiswa baru ke sistem informasi akadmik, <strong>RegistrationOnlineLibrary </strong>meregistrasi mahasiswa baru ke online library, <strong>EmailService </strong>mengirimkan email notifikasi yang berisi approval, dan default username dan password untuk mengakses sistem informasi akademik.</p>
<h1>Kesimpulan</h1>
<p>Banyak bisnis proses yang tidak harus di proses secara sequential</p>
<p>Gunakan messaging untuk scalabilitas sistem, miningkatkan performansi sistem, dan service loosely coupled</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/adisembiring.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/adisembiring.wordpress.com/266/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/adisembiring.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/adisembiring.wordpress.com/266/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/adisembiring.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/adisembiring.wordpress.com/266/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/adisembiring.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/adisembiring.wordpress.com/266/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/adisembiring.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/adisembiring.wordpress.com/266/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/adisembiring.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/adisembiring.wordpress.com/266/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/adisembiring.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/adisembiring.wordpress.com/266/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=266&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://adisembiring.wordpress.com/2011/03/05/messaging-and-event-driven-architecture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e62c8b206c9f6aa3aa5f97230686d203?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">adisembiring</media:title>
		</media:content>

		<media:content url="http://fusesource.com/docs/broker/5.4/getting_started/images/topic.png" medium="image" />

		<media:content url="http://adisembiring.files.wordpress.com/2011/03/pomessaging.png" medium="image">
			<media:title type="html">POMessaging</media:title>
		</media:content>
	</item>
		<item>
		<title>Unit Testing</title>
		<link>http://adisembiring.wordpress.com/2011/01/08/unit-testing/</link>
		<comments>http://adisembiring.wordpress.com/2011/01/08/unit-testing/#comments</comments>
		<pubDate>Sat, 08 Jan 2011 11:16:07 +0000</pubDate>
		<dc:creator>adisembiring</dc:creator>
				<category><![CDATA[Software Development Concept]]></category>
		<category><![CDATA[Unit Test]]></category>
		<category><![CDATA[acceptance test]]></category>
		<category><![CDATA[EasyMock]]></category>
		<category><![CDATA[unit test]]></category>

		<guid isPermaLink="false">http://adisembiring.wordpress.com/?p=255</guid>
		<description><![CDATA[Pertama-tama mendengar unit testing, langsung kepikiran kenapa capek2 buat code program untuk ngetest aplikasi yang di develop. Buang2 waktu sebab aplikasi bisa di test manual melalui user interface aplikasi. Isi data2 yang di form aplikasi, klik tombol submit, cek apakah ada error, atau data masuk ke database. Lama kelamaan sejalan dengan waktu aku baru sadar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=255&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="TDD" src="http://www.anug.dk/image.axd?picture=TDD_thumb.png" alt="" width="177" height="150" />Pertama-tama mendengar <a href="http://en.wikipedia.org/wiki/Unit_testing" target="_blank">unit testing,</a> langsung kepikiran kenapa capek2 buat code program untuk ngetest aplikasi yang di develop. Buang2 waktu sebab aplikasi bisa di test manual melalui user interface aplikasi. Isi data2 yang di form aplikasi, klik tombol submit, cek apakah ada error, atau data masuk ke database.</p>
<p>Lama kelamaan sejalan dengan waktu aku baru sadar kalau cara itu kurang efektif. Basically developer harus mengetest code yang di develop setiap kali ada perubahaan. Untuk menjamin code yang di tulisnya berjalan dengan benar.  Akan membuang banyak waktu jika tiap kali ada perubahan harus melakukan berulang2  isi data2 yang di perlukan user interface aplikasi, submit, cek apakah ada error atau mengecek apakah data sudah masuk di database.  <em>Seratus kali perubahaan setarus kali test manual (input data) di lakukan</em>. Programmer membangun aplikasi untuk membantu manusia mengautomatisasi pekerjaan mereka. Jadi kenapa kita tidak membantu diri kita sendiri mengautomatisasi pekerjaan dalam hal testing aplikasi ?<span id="more-255"></span></p>
<p>Sebelum membuat Unit Test developer terlebih dahulu membuat <em><strong>acceptance test</strong> yang merupakan spesifikasi test untuk tiap unit</em>. Misalkan unit RegistrationService, pekerjaan unit ini memproses data registrasi user, dan menyimpan data registrasi ke database. Namun ada constraint, nama tidak boleh sama dengan existing data begitu juga dengan email. Jadi sepsifikasi test untuk unit RegistrationService kira2 seperti ini:</p>
<p><pre class="brush: java;">
1. should_save_registration_data_when_valid_data_submited()
2. should_throw_UserNameExistsException_when_existing_user_name_submited()
3. should_throw_EmailExistsExeception_when_existing_email_submited()
</pre></p>
<p><em>Aceptance test diimplementasikan sesuai dengan ekspektasi yang diharapkan</em>. Untuk acceptance test pertama ekspektasinya data user masuk ke database, acceptance test kedua mendapatkan throw UserNameExistsException, dan yang terakhir medaapatkan EmailExistsExpcation. Ekspektasi dalam unit test biasanya menggunakan <strong>assert </strong>atau <strong>expect</strong>.  Ekspektasi di tiap implementasi acceptance test menyatakan berhasil atau tidak nya hasil eksekusi unit test.</p>
<p>Contohnya kira2 seperti ini:</p>
<p><pre class="brush: java;">
public class RegistrationServiceTest {
	IRegistrationService registrationService;
	IUserService userService;
	RegistrationCommand validCommand;
	RegistrationCommand invalidUserCommand;
	RegistrationCommand invalidEmailcommand;

	@Before
	setup() {
		registrationService = new RegistratioService();
		IEmailService emailService = EasyMock.CreateMock(IEmailService.class);
                //create mock object using EasyMock
		registrationService.setEmailService(emailService);

		validCommand = RegistrationCommand();
		validCommand.setUserName(&quot;my_name&quot;);
		validCommand.setPassword(&quot;my_password&quot;);
		validCommand.setEmail(&quot;my_email@host.com&quot;);

		invalidUserCommand = RegistrationCommand();
		invalidUserCommand.setUserName(&quot;exists&quot;);
		invalidUserCommand.setPassword(&quot;my_password&quot;);
		invalidUserCommand.setEmail(&quot;my_email@host.com&quot;);

		invalidEmailcommand = RegistrationCommand();
		invalidEmailcommand.setUserName(&quot;my_name&quot;);
		invalidEmailcommand.setPassword(&quot;my_password&quot;);
		invalidEmailcommand.setEmail(&quot;exists@host.com&quot;);
	}

	should_save_registration_data_when_valid_data_submited() {
		registrationService.register(validCommand);
		User user = userService.findByUserName(validCommand.getUserName);
		assertNotNull(user) //user masuk ke database
	}

	@expect(UserNameExistsException.class)
	should_throw_UserNameExistsException_when_existing_user_name_submited() {
		registrationService.register(invalidUserCommand);
	}

	@expect(EmailExistsExeception.class);
	should_throw_EmailExistsExeception_when_existing_email_submited() {
		registrationService.register(command);
	}

	@after
	tearDown() {
		userService.removeUser(validCommand.getUserName);
	}

}
</pre></p>
<p>Menggunakan unit test developer di automasi untuk mengetest aplikasi setiap kali perubahaan. Tanpa harus mengisi input data berulang-ulang.</p>
<p>Unit test yang benar itu tidak boleh terlalu banyak berhubungan dengan unit lain. Contohnya saat registrasi berhasil, email notifikasi dikirimkan ke user.  Jika unit test melibatkat eksekusi send email akan membuat eksekusi unit test semakin lama  Karena saat mengirimkan email butuh koneksi ke email server,authentikasi, dan send email. Oleh karena itu send email sebaiknya tidak di ikutkan.</p>
<p>Contoh code Registration service</p>
<p><pre class="brush: java;">
RegistrationService implements IRegistrationService {
	IEmailService emailService;
	IUserDao userDao;

	public void setEmailService(IEmailService emailService) {
		this.emailService = emailService;
	}

	public void IUserDao(IUserDao userDao) {
		this.userDao = userDao;
	}

	public void register(RegistrationCommand command) {
		//logic registrasi

		//send email after registration succesfully executed
		emailService.send(command.getEmail(), &quot;user registered successfully&quot;);
	}
}
</pre></p>
<p>Tapi Email service harus tetap di set di registration service. Kalau tidak akan menyebabkan NullPointerException saat eksekusi emailService.send(). Caranya membuat <a href="http://en.wikipedia.org/wiki/Mock_object" target="_blank">Mock Object</a>/objek jadi-jadian lalu di set ke registrationService.</p>
<p><pre class="brush: java;">
       @Before
	setup() {
		registrationService = new RegistratioService();
		IEmailService emailService = EasyMock.CreateMock(IEmailService.class);
		registrationService.setEmailService(emailService);
	}
</pre></p>
<p>Disini <strong>pattern </strong><a href="http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface" target="_blank">Programing To Interface</a> itu digunakan, selain mengurangi dependency antar class juga mempermudah developer untuk tidak mengikut sertakan unit infrastruktur ke unit test dengan membuat mock object terhadap unti infrastruktur itu.</p>
<p><strong>Kesimpulan</strong>:<br />
Unit test <em>mengutomatisasi</em> pekerjaan developer untuk mengetest setiap kali ada perubahan code yang dia tulis.<br />
<em> Acceptance test merupakan spesifikasi testing</em> untuk tiap unit, di sini di sepsifikasikan kemungkinan2 yang terjadi di unit itu dan di test.<br />
<em> Tiap implementasi acceptance test harus memiliki ekspektasi</em> untuk menyatakan bahwa eksekusi unit test berhasil atau tidak.<br />
Jika ada beberapa unit infrastruktur yang dependent ke unit yang akan di test,sebaiknya unit tersebut di mock saja agar waktu eksekusi unit test lebih cepat.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/adisembiring.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/adisembiring.wordpress.com/255/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/adisembiring.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/adisembiring.wordpress.com/255/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/adisembiring.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/adisembiring.wordpress.com/255/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/adisembiring.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/adisembiring.wordpress.com/255/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/adisembiring.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/adisembiring.wordpress.com/255/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/adisembiring.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/adisembiring.wordpress.com/255/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/adisembiring.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/adisembiring.wordpress.com/255/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=255&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://adisembiring.wordpress.com/2011/01/08/unit-testing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e62c8b206c9f6aa3aa5f97230686d203?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">adisembiring</media:title>
		</media:content>

		<media:content url="http://www.anug.dk/image.axd?picture=TDD_thumb.png" medium="image">
			<media:title type="html">TDD</media:title>
		</media:content>
	</item>
		<item>
		<title>To Do List</title>
		<link>http://adisembiring.wordpress.com/2010/03/07/to-do-list/</link>
		<comments>http://adisembiring.wordpress.com/2010/03/07/to-do-list/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 05:57:02 +0000</pubDate>
		<dc:creator>adisembiring</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[code igniter]]></category>
		<category><![CDATA[Design Pattern]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[todo list]]></category>

		<guid isPermaLink="false">http://adisembiring.wordpress.com/?p=215</guid>
		<description><![CDATA[Sebentar lagi waktu ku bakal banyak yang kosong nih. Bakal bosan dan hambar kalo setiap pulang kerja atau hari sabtu minggu kerjaan nonton, tidur, browsing2 mulu. Karena itu, aku telah mepersiapakan to do list, mengenai hal2 apa saja yang harus dikerjakan. CI system design, sapa tau ada side project. bakal lebih enak ngerjainya. ngga capek2 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=215&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://adisembiring.files.wordpress.com/2010/03/3198229212_3625276d08.jpg"><img class="alignleft size-full wp-image-216" style="margin-left:0;margin-right:25px;" title="3198229212_3625276d08" src="http://adisembiring.files.wordpress.com/2010/03/3198229212_3625276d08.jpg?w=630" alt=""   /></a>Sebentar lagi waktu ku bakal banyak yang kosong nih. Bakal bosan dan hambar kalo setiap pulang kerja atau hari sabtu minggu kerjaan nonton, tidur, browsing2 mulu. Karena itu, aku telah mepersiapakan to do list, mengenai hal2 apa saja yang harus dikerjakan.</p>
<ol>
<li><strong>CI system design</strong>, sapa tau ada side project. bakal lebih enak ngerjainya. ngga capek2 mikiri design system dari awal</li>
<li><strong>Spring Framework</strong>, framework yang paling sering dipake oleh perusahaan yang bergerak di bidang software house akhir2 ini. Denger2 framework ini sangat sangat mempermudah pembangunan aplikasi web, membedakan Model, View, Controller,  service layer, terdapat juga dependency injection. Dan denger2 juga framework ini dapat digunakan untuk desktop aplication. <span id="more-215"></span></li>
<li><strong>Design Pattern</strong>, Selama ini sih ngecoding buat hanya buat satu class yang implementasikan bisnis logic, kalo ngga buat class helper. Tapi jadi banyak kendala, tiap kali ada perubahaan harus merubah banyak code. Kalo dah gini udah suntuk lah otaku mikirinya. Tapi kalo design classnya bagus, suat perubahaan akan mudah ditangani dan lebih flexible.</li>
<li><strong>Software Testing</strong>. Bosan dengan manual testing, setiap kali selesai buat potongan2 code, harus test manual, isi input2 yang diperlukan, tekan submit, dan lain2. Kalo gini caranya jadi ngga efektif, test dilakukan berulang2 dan manual, habis waktu untuk isi input text <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  .  Bnyak tools yang digunakan untuk testing, setahu ku sih JUnit, JMatter, DBUnit. ada beberapa tipe testing yang harus di pelajari, Unit testing, Integration testing,  Coverage testing, Code compliance testing, User/functional testing, Performance testing</li>
<li><strong>Build Automation</strong>, belajar Ant, dan Mavent. Setauku, ini dipake untuk mempermudah developer nge-build program. Kita ngga perlu ngatu class path, dan saat kita lakukan build kita bisa define action2 yang harus di lakukan Buildin Tools , seperti clean, complie, copy jar ke folder lib dan lain.</li>
</ol>
<p>- Thats All -</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/adisembiring.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/adisembiring.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/adisembiring.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/adisembiring.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/adisembiring.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/adisembiring.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/adisembiring.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/adisembiring.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/adisembiring.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/adisembiring.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/adisembiring.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/adisembiring.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/adisembiring.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/adisembiring.wordpress.com/215/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=adisembiring.wordpress.com&amp;blog=10148441&amp;post=215&amp;subd=adisembiring&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://adisembiring.wordpress.com/2010/03/07/to-do-list/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e62c8b206c9f6aa3aa5f97230686d203?s=96&#38;d=&#38;r=G" medium="image">
			<media:title type="html">adisembiring</media:title>
		</media:content>

		<media:content url="http://adisembiring.files.wordpress.com/2010/03/3198229212_3625276d08.jpg" medium="image">
			<media:title type="html">3198229212_3625276d08</media:title>
		</media:content>
	</item>
	</channel>
</rss>
