<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5742695</id><updated>2024-10-26T12:55:56.416+07:00</updated><category term="coding"/><category term="system"/><category term="application"/><category term="effectivity"/><category term="library"/><category term="agile"/><category term="miscellaneous"/><category term="programming"/><category term="android"/><category term="IDE"/><category term="csharp"/><category term="deployment"/><category term="dotnet"/><category term="ios"/><category term="opencl"/><category term="book"/><category term="c"/><category term="eclipse"/><category term="freeplane for wm"/><category term="server"/><category term="visual studio"/><category term="cpp"/><category term="game"/><category term="git"/><category term="hevc"/><category term="java"/><category term="meta"/><category term="mobile"/><category term="music"/><category term="uml"/><category term="videocoding"/><category term="web"/><title type='text'>Hafiz [Pariabi]</title><subtitle type='html'>Mindful Coding/Living</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>151</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5742695.post-5932457294890946083</id><published>2014-09-09T20:52:00.001+07:00</published><updated>2014-09-09T20:52:53.475+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="game"/><title type='text'>Getting Started with Game Programming Using Unity</title><content type='html'>I have been starting out with Game Deveopment recently, specifically using Unity Game Engine. It’s been an interesting experience so far but also an overwhelming one. There are a lot of aspect in game development that trying to ship something quickly requires you to have a good focus in both the learning and working process. Below is the list of starting guidelines that I find could save you a lot of time but at the same time give you most benefit : &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Use tutorials and videos as&amp;nbsp; your main learning tools&lt;/b&gt;. Unlike what I experienced with learning many development platform before, manual and documentation of Unity (version 4.5 as of this writing) does not give you much foundation to start being productive. Instead, their tutorials, videos and samples on the site are the most useful ones to get you started and learning the concept and practices. You can refer more to manual and documentation later on when you have more context and the relevance of it’s contents &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Read this two books : &quot;Game Coding Complete” and “Game Engine Architecture”&lt;/b&gt;. It will give you valuable shortcut to game programming world that could probably take you months or even years figuring it our yourself from various sources.&amp;nbsp; Surprisingly, it gives you more insights and contexts on why Unity do things the way it does compare to Unity-specific books. Also as an added bonus you get also the concepts of game development and engine in general too, not just Unity&lt;/li&gt;
&lt;/ul&gt;
There are a lot of other materials to advance further, of course, but so far I find the two above is what I wish someone had told me when I got started before wasting too much time to build something by reading the manuals or reading Unity-specific books :)</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/5932457294890946083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/5932457294890946083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/5932457294890946083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/5932457294890946083'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2014/09/getting-started-with-game-programming.html' title='Getting Started with Game Programming Using Unity'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-4283663744778304176</id><published>2014-06-06T13:33:00.000+07:00</published><updated>2014-06-06T13:33:00.075+07:00</updated><title type='text'>HEVC support on Android</title><content type='html'>HEVC is the new video coding standard which even on the Desktop it is still basically under development. So, having a support for it on mobile device at this moment is even more interesting.&lt;br /&gt;
&lt;br /&gt;
For library , it seems there is two major hevc decoding support currently, that is &lt;a href=&quot;https://github.com/OpenHEVC/openHEVC&quot;&gt;openhevc&lt;/a&gt; (part of libav library) and &lt;a href=&quot;http://www.libde265.org/&quot;&gt;libde265&lt;/a&gt;. Both seems to be usable, at least for low resolution samples. However, their use require you to integrate them to media framework or pipeline like gstreamer.&lt;br /&gt;
&lt;br /&gt;
If you want to just have quick look of hevc playing, right now you can just try Vitamio SDK. It already support hevc through its use of ffmpeg underneath it. It also mimic the API of Media part of Android SDK so it will be straightforward to use compare to using third party media pipeline like gstreamer as mentioned above. </content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/4283663744778304176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/4283663744778304176' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/4283663744778304176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/4283663744778304176'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2014/06/hevc-support-on-android.html' title='HEVC support on Android'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-2994121828630318363</id><published>2014-06-05T13:19:00.000+07:00</published><updated>2014-06-05T13:19:10.298+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="hevc"/><category scheme="http://www.blogger.com/atom/ns#" term="videocoding"/><title type='text'>Conversion and Playing of HEVC on Desktop and Web</title><content type='html'>HEVC (H.265)&amp;nbsp; is the new emerging video coding standard. It is made as a success for the widely used H.264. It&#39;s implementation and adoption progress is quite fast. It probably because the 4k display has been out for someitme and the video streaming is&amp;nbsp; currently booming, both of which are being handled nicely by HEVC.&lt;br /&gt;
&lt;br /&gt;
At the moment of this writing you can actually able to convert material to HEVC and playing it. The implementations are mostly still in beta stage and some are not avaiable through the more common publicized channel, but it&#39;s quite usable from my tests so far. The quality is quite good too in term of visual quality and compression ratio. So, you can already play around with the technology at this stage.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Conversion :&amp;nbsp; x265 and Handbrake Nightly Build &lt;/h3&gt;
&lt;br /&gt;x265 project probably is the most used HEVC converter right now. It has progressed quite far, below is the quote from the author on one of the forum : &lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
x265 development is going well.&amp;nbsp; x265 is often able to exceed the HM reference encoder in quality, with performance that is orders of magnitude faster.&amp;nbsp; The x265 HEVC encoder is easily able to encode with quality / compression efficiency that far exceeds the best H.264 encoder available, x264.&amp;nbsp; We&#39;ve just passed the 0.7 milestone.&amp;nbsp; Although we have more algorithmic improvement and performance optimization on the development roadmap ahead, x265 is quite usable today, and it includes many advanced features. &lt;/blockquote&gt;
&lt;br /&gt;
So, it is quite a safe bet to choose x265 project for HEVC encoding purpose. However, using it directly means using CLI which is cumbersome and would require manual demuxing and remuxing, so it’s better to use proper video conversion application. &lt;br /&gt;&lt;br /&gt;There is no official release version of full-featured video converter that uses x265 yet. However, Handbrake-nightly-build already integrate x265 whitin. The developer said that they won’t be&amp;nbsp; releasing it until HEVC standard more widely used which probably will still a while. So, you just have to use the nightly-build if you want to have access to HEVC conversion on Handbrake for sometime ahead. &lt;br /&gt;
&lt;br /&gt;
Unfortunately, currently it only exist on Windows version of Handbrake. So, no support for other platform for now.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;Now, about the playing.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
VLC Nightly Build and Playing on Browser&lt;/h3&gt;
&lt;br /&gt;The latest release version of VLC (2.1.4) can not play HEVC output in container (muxed) yet.&amp;nbsp; It will complain when you try to play the file you encoded with Handbrake above.&amp;nbsp; However, hevc playing support is currently progress and can be tested on VLC-nightly-build version (2.2.x). It works well playing output from Handbrake when tested. &lt;br /&gt;
&lt;br /&gt;
Also, the good thing about VLC is that it has browser plugin support for Mozilla and Activex(IE) so it can be used to play HEVC content on the browser. It currently only support Windows though but the plan is to have it on other platforms when 2.2.x finally released. This would be interesting since it means you can now start streaming HEVC stream to wide range of targets.&lt;br /&gt;
&lt;br /&gt;
Another alternative for the web/browser support for HEVC is DivX Web Player whichs seems to be free although not open source.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/2994121828630318363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/2994121828630318363' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/2994121828630318363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/2994121828630318363'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2014/06/conversion-and-playing-of-hevc-on.html' title='Conversion and Playing of HEVC on Desktop and Web'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-5769926952782545623</id><published>2014-04-14T13:59:00.002+07:00</published><updated>2014-04-14T13:59:46.596+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="csharp"/><title type='text'>Better way of combining path in C#</title><content type='html'>You could do string operation to construct path as below :&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;string path = path1 + &quot;\\&quot; + path2;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
However, more portable and cleaner way would be to use Path.Combine as below :&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Path.Combine(path1, path2);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The above avoid you to make manually ensuring the correctness of path separators.</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/5769926952782545623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/5769926952782545623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/5769926952782545623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/5769926952782545623'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2014/04/better-way-of-combining-path-in-c.html' title='Better way of combining path in C#'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-4189610949058573052</id><published>2014-03-24T11:27:00.000+07:00</published><updated>2014-03-25T09:19:04.344+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><category scheme="http://www.blogger.com/atom/ns#" term="csharp"/><category scheme="http://www.blogger.com/atom/ns#" term="dotnet"/><title type='text'>Choosing Logging Library for .Net : NLog</title><content type='html'>When it comes to logging, printing it out yourself to console or file probably the most straightforward way. However, if you want to get more structured in your log, with level and flexible on/of switching you&#39;ll need a more dedicated logging library. However, like any library, choosing the sweet spot where you get the feature you want but with the least complexity and learning curve can be challenging.&lt;br /&gt;
&lt;br /&gt;
As for logging, when I research around the two that pop up most is &lt;a href=&quot;http://logging.apache.org/log4net/&quot;&gt;log4net &lt;/a&gt;and &lt;a href=&quot;http://nlog-project.org/&quot;&gt;NLog&lt;/a&gt;. The choise is pretty simple though, log4net is good but pretty outdated now while NLog is quite active, well-supported has rich feature. So, the choice goes to NLog.&lt;br /&gt;
&lt;br /&gt;
Quick Usage :&lt;br /&gt;
&lt;br /&gt;
After you link the library (using NuGet or manually). Declare the logger in your class :&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;private static Logger logger = LogManager.GetCurrentClassLogger();&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
and call at the place that needed it :&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;logger.Debug(&quot;log message&quot;);&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
You can add a lot of additional details to your log with its predefined variables. You can consult the manual to see what is available. Also, since you declare logger on each class, it can automatically&amp;nbsp; print in which class and the point where the log is called. It is quite useful for debugging.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/4189610949058573052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/4189610949058573052' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/4189610949058573052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/4189610949058573052'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2014/03/choosing-logging-library-for-net-nlog.html' title='Choosing Logging Library for .Net : NLog'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-1858267944242647298</id><published>2014-03-10T12:03:00.000+07:00</published><updated>2014-03-10T12:03:05.576+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="opencl"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>Lesson about delegation from OpenCL</title><content type='html'>Using OpenCL and the complexities / benefits that comes with it reminds me of an issue of trade-off in delegation. You can always do things the simple straightforward, serial way but there is a limit of how much and how fast it can finish the tasks. We can scale things better by utilizing more external agents and manage it. However using additional agents means &lt;b&gt;delegating tasks to those agents and manage the overhead and unpredictability that comes with it&lt;/b&gt;. This is why the code to achieve the same thing using OpenCL can be quite complex since you need to manage the data and logic that comes to and from those computing units and get them to work together properly.&lt;br /&gt;
&lt;br /&gt;It&#39;s not just cost that is increased though, the risk is also higher. When you delegate, you add another factor with its own set of quirkiness to your system. Each agent you add, you add another risk of it fail in some way and effect the overall system. In OpenCL, certain GPU might not behave as it should, your calculation might fail in certain configuration. So, you will need to add more activities to manage the risk. How it can be anticipated, localized and how the system can cope gracefully when it happen.&lt;br /&gt;
&lt;br /&gt;
So, since delegation is not free it is important that the scale of the problem would need to justify the use of delegation.&amp;nbsp; You can add more things, method, people to your system, but when it does not fit your scale, it will become a burden since your output, what you get, is lower than what you need to expense. In term of OpenCL, the low complexity or low number of calculation probably not worth the trouble. For example, even when you ding the formula is complex and can be paralellize but if your expected data to be processd is not much, it probably better to just code it the traditional way. &lt;br /&gt;
&lt;br /&gt;
Delegation can be costly and risky, but if you need your solution to scale better, the return can be very much worth it.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/1858267944242647298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/1858267944242647298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/1858267944242647298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/1858267944242647298'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2014/03/lesson-about-delegation-from-opencl.html' title='Lesson about delegation from OpenCL'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-5863374469348474624</id><published>2014-02-28T16:44:00.001+07:00</published><updated>2014-02-28T16:44:47.870+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c"/><category scheme="http://www.blogger.com/atom/ns#" term="opencl"/><title type='text'>Translating Traditional Program Logic to OpenCL</title><content type='html'>If you just started to look at OpenCL and see the example of the code, it can be quite confusing on how it got that way from its traditional program logic counterpart. Take a look at an example of comparison below taken from PDF Overview on OpenCL site :&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAgG0Uubuf-axCdHK4gF_jeQIliGpaddQ5GKBWpk5tD4XiELjZFHBQ1zbNDdpa4VFWIumwGItcdfJRO1I-DwMNo-YByj69AoW3m8mWCqqM9NR4Xd3HvjDRV5k97NihrXh9zsns/s1600/opencl_loop.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAgG0Uubuf-axCdHK4gF_jeQIliGpaddQ5GKBWpk5tD4XiELjZFHBQ1zbNDdpa4VFWIumwGItcdfJRO1I-DwMNo-YByj69AoW3m8mWCqqM9NR4Xd3HvjDRV5k97NihrXh9zsns/s1600/opencl_loop.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
You can see that the calculation is intact but you can&#39;t seem to find where the &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;for&lt;/span&gt; loop counterpart is. &lt;br /&gt;
&lt;br /&gt;
It is because, the logic has been separated between host (your main program) and kernel (that will be sent to device). So, you need to look at both of them to get the whole picture. There is some data partitioning done that you can take a look at the code at the host. Together with the batch processing happen in kernel code you can start to see the implied loop there.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTxCpExsjKEqUBdCQRDxRhdwR_-TT9xfrYI9UjoOecO_tuID2bG4FeXG-ibEeF9HOit1FhccShUH3g92IwHBU-SKJst6nr4JXs4qom8WImlq7Me4DaUo5weTp9hDrsd_kGNgA0/s1600/opencl2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTxCpExsjKEqUBdCQRDxRhdwR_-TT9xfrYI9UjoOecO_tuID2bG4FeXG-ibEeF9HOit1FhccShUH3g92IwHBU-SKJst6nr4JXs4qom8WImlq7Me4DaUo5weTp9hDrsd_kGNgA0/s1600/opencl2.png&quot; height=&quot;216&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Due to its parallelism and batch processing nature, the logic in OpenCL can look more declarative and more separated compare to traditional one. So, the logic that you expect to find will probably be implied somewhere in host and kernel code. This could help if you try to read the existing code.</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/5863374469348474624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/5863374469348474624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/5863374469348474624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/5863374469348474624'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2014/02/translating-traditional-program-logic.html' title='Translating Traditional Program Logic to OpenCL'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAgG0Uubuf-axCdHK4gF_jeQIliGpaddQ5GKBWpk5tD4XiELjZFHBQ1zbNDdpa4VFWIumwGItcdfJRO1I-DwMNo-YByj69AoW3m8mWCqqM9NR4Xd3HvjDRV5k97NihrXh9zsns/s72-c/opencl_loop.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-657890763843353764</id><published>2014-02-27T17:24:00.001+07:00</published><updated>2014-03-06T08:00:46.599+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c"/><category scheme="http://www.blogger.com/atom/ns#" term="cpp"/><category scheme="http://www.blogger.com/atom/ns#" term="opencl"/><title type='text'>Getting Started with OpenCL</title><content type='html'>I started working with OpenCL recently on the project at work. It&#39;s quite exhausting to learn initially since OpenCL has quite steep learning curve. However, once you have started to picked up some of the core concept, it could be quite interesting. Also, you will add another valuable tool to your programming arsenal, especially in the aspect of performance and speedup. You will start to be able to exploit not just CPU but also any other computing device that exist on the system like GPU quite conveniently. &lt;br /&gt;
&lt;br /&gt;
Here&#39;s summary and pointers of how to get started with it from what I note so far.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Overview&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
You can get an initial overview from the surces below :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.khronos.org/assets/uploads/developers/library/overview/opencl_overview.pdf&quot;&gt;OpenCL Overview (PDF)&lt;/a&gt; from its official site is quite easy to skim. Just skim it and don&#39;t bother with the details like code, it will be clearer soon&lt;/li&gt;
&lt;li&gt;Also, skimming the &lt;a href=&quot;https://www.khronos.org/registry/cl/specs/opencl-1.2.pdf&quot;&gt;Official Specification&lt;/a&gt; and &lt;a href=&quot;https://www.khronos.org/files/opencl-1-2-quick-reference-card.pdf&quot;&gt;Quick Reference Card&lt;/a&gt; could help too to get an initial picture of what it is&lt;/li&gt;
&lt;/ul&gt;
&amp;nbsp;As for its Wikipedia Page, I don&#39;t find it really informative at the moment, at least if you want to get an overview of what OpenCL is and its relevance.&lt;br /&gt;
&lt;br /&gt;
As usual, google search and some blog entries would not hurt too. However, it&#39;s better not to take too much time researching things online since I think your time is better spend reading the book below.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Book : OpenCL in Action&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
There is not many technical book that you can enjoy reading cover to cover. This one is one of them. It&#39;s better you read from beginning to end serially. It build up from chapter to chapter. Also, it does not cross reference things too much between materials which could be annoying on some technical books. The materials coverage is very good, from the history, introduction to advanced topics.&lt;br /&gt;
&lt;br /&gt;
If you have some questions on your mind from reading other sources previously, there is a good chance that you will start to piece things together when reading this book. It gives a good foundation for understanding why OpenCL is the way it is. OpenCL syntax and functions will still be quite overwhelming even after you finished with the book but knowing the concept behind will make it much more manageable.&lt;br /&gt;
&lt;br /&gt;
I find the highlights of the book is its use of analogies that helps a lot in explaining the abstract concept and architecture of OpenCL.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Revisit Specification and Reference Card&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
If you have skimmed the specification and reference card above, it&#39;s time to revisit it again. You will now find it much more clearer now and they are starting to be more useful. It will also add more details from what is covered on the book. Personally, I really like the layout on reference card which help in getting a good high level picture of different parts of OpenCL with it&#39;s colorful boxes and groupings.&lt;br /&gt;
&lt;br /&gt;
At this point, you can start to work on your specific issues and continue learning from there. As usual, after the initial learning, the actual work is where we will learn most. This is especially true in complex technology like OpenCL.</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/657890763843353764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/657890763843353764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/657890763843353764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/657890763843353764'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2014/02/getting-started-with-opencl.html' title='Getting Started with OpenCL'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-6416601436682422333</id><published>2014-02-20T15:08:00.003+07:00</published><updated>2014-02-20T15:08:47.415+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="ios"/><title type='text'>Migrating to Android from iPhone</title><content type='html'>My iPhone4 got the &lt;a href=&quot;https://discussions.apple.com/thread/2498579&quot;&gt;&quot;people can&#39;t hear me&quot;&lt;/a&gt; problem. I&#39;ve exhausted all the possible trick to solve it that does not require opening up the hardware. There is little-used s3-mini laying around so I decided to try to migrate to it and see what happen.&lt;br /&gt;
&lt;br /&gt;
I expected some limitations when moving to Android from iOS since I have been accumulating many apps and it has quite integrated to my daily workflow. However, after sometime, I can say that the migration is quite seamless. Most of my usage can be transferred to Android plus some more Android-specific goodies (I think widget is cool). More about this below.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The Apps&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
At this point, almost all the well-known apps have both iOS and Android version. So, for apps like Evernote, Springpad, Pocket, Feedly etc. I don&#39;t have any problem at all. There is slight differences here and there but for my personal usage there is nothing significant that I find missing.&lt;br /&gt;
&lt;br /&gt;
For less well-known apps I usually can find the comparable counterpart. I have to say though, the apps on iOS feels more &quot;elegant&quot; somehow. However, if you care mostly for the function, it&#39;s quite negligible since Android now has large number of well-written apps.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Surprising Finding on Navigation Apps Department&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I have Garmin Indonesia on my iPhone and it is sad to see that there is none of it on Google Play Store. I have searched for the alternatives on several occasion with no luck until I stumble upon &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.polstargps.polnav.mobile&amp;amp;hl=zh-TW&quot;&gt;Polnav EasyDriving&lt;/a&gt; app. It&#39;s quite &quot;hidden&quot; from my previous search, probably because it&#39;s google playstore page uses non-latin characters mostly.&lt;br /&gt;
&lt;br /&gt;
Surprisingly, it works really well. I used Indonesian map from &lt;a href=&quot;http://navigasi.net/&quot;&gt;navigasi.net &lt;/a&gt;(which is a really great crowdsourced map, BTW) and it is loaded very nicely. The navigation screen is clear, fluidly updated and give me several notification when getting close to turn to make sure I don&#39;t get past it. Really cool!. And what is even more surprising is that is free which is quite unusual for offline gps navigation app nowadays.&lt;br /&gt;
&lt;br /&gt;
The search for address is really good but somehow there is no POI-based search that I can find. This is quite unfortunate and hopefully it will be there on future versions. Aside from that, I have no complain for it.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What is Missing&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
One thing that I miss quite a lot is a good freeplane-compatible mindmapping app. There is iThoughts in iOS but none that comparable to it on Android. Fortunately, I have been &quot;flattening&quot; my data recently and many has been migrated as Evernote or Springpad data. Some of it are still on freeplane format though and for those I still have iThougts on iPad. So it&#39;s not really a critical issue actually but it will be nice if I can still accessing my mindmaps on the smartphone too.&lt;br /&gt;
&lt;br /&gt;
My iPhone4 is not going to retire soon though, I still have it laying around and use the apps on it occasionally. It basically now function more as and iPod than an iPhone. For example, I still use Garmin on it although I already have Polnav on Android as mentioned above. It is still useful to use GPS on separate device on some circumstances. &lt;br /&gt;
&lt;br /&gt;
So far I quite enjoy the migration and I can&#39;t say it&#39;s better or worse. It just different, I guess. </content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/6416601436682422333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/6416601436682422333' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/6416601436682422333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/6416601436682422333'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2014/02/migrating-to-android-from-iphone.html' title='Migrating to Android from iPhone'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-9048874242463284297</id><published>2014-02-04T10:49:00.001+07:00</published><updated>2014-02-04T10:49:20.373+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="git"/><title type='text'>Import Existing Repository to Bitbucket using TortoiseGit</title><content type='html'>When you want to import an existing local Git repository to bitbucket you can follow&lt;a href=&quot;https://confluence.atlassian.com/display/BITBUCKET/Import+code+from+an+existing+project&quot;&gt; this official guide&lt;/a&gt;. However, one of the section involving steps with git command line as below :&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://confluence.atlassian.com/download/attachments/304578655/import_existing_code.png?version=2&amp;amp;modificationDate=1379979135049&amp;amp;api=v2&amp;amp;effects=drop-shadow&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;252&quot; src=&quot;https://confluence.atlassian.com/download/attachments/304578655/import_existing_code.png?version=2&amp;amp;modificationDate=1379979135049&amp;amp;api=v2&amp;amp;effects=drop-shadow&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
I am used to using TortoiseGit on Windows and rely on it for all my Git command needs. So, I find it unpleasant to go to the shell to just do all the above. It feels like a &lt;a href=&quot;http://www.joelonsoftware.com/articles/LeakyAbstractions.html&quot;&gt;leaky abstraction&lt;/a&gt; happening. I am sure there is more convenient way to do it using TortoiseGit instead. So, below&amp;nbsp; are the above steps done using TortoiseGit :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Right click on the folder-&amp;gt;TortoiseGit -&amp;gt; Settings&lt;/li&gt;
&lt;li&gt;Git-&amp;gt;Remote and enter remote origin value as pictured below&lt;/li&gt;
&lt;/ul&gt;
&amp;nbsp;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwv9i5EhN2v_B61Dtjo10a50DMhENcHuntaMZkondThxlbo9AmZvlU_EgIxM-_028V8waJl_hGXCzEhE8b1NNFGcEoot2DNUn6KK8jdqWP7R7Rqf8VCNj-7QIZMOmeo4FbjKKn/s1600/git-remote-origin.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwv9i5EhN2v_B61Dtjo10a50DMhENcHuntaMZkondThxlbo9AmZvlU_EgIxM-_028V8waJl_hGXCzEhE8b1NNFGcEoot2DNUn6KK8jdqWP7R7Rqf8VCNj-7QIZMOmeo4FbjKKn/s1600/git-remote-origin.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Right click on the folder-&amp;gt;TortoiseGit -&amp;gt;Push&lt;/li&gt;
&lt;/ul&gt;
It looks more wordy but it is actually more pleasant to do in GUI-based environment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/9048874242463284297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/9048874242463284297' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/9048874242463284297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/9048874242463284297'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2014/02/import-existing-repository-to-bitbucket.html' title='Import Existing Repository to Bitbucket using TortoiseGit'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwv9i5EhN2v_B61Dtjo10a50DMhENcHuntaMZkondThxlbo9AmZvlU_EgIxM-_028V8waJl_hGXCzEhE8b1NNFGcEoot2DNUn6KK8jdqWP7R7Rqf8VCNj-7QIZMOmeo4FbjKKn/s72-c/git-remote-origin.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-1128153908578411886</id><published>2013-11-25T11:01:00.002+07:00</published><updated>2013-11-25T11:12:48.828+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="application"/><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><title type='text'>Use Fiddler to help with development with Web API</title><content type='html'>Developing application that connect to Web API can be quite a pain if we are not equipped with the right tools. Network issues, response format, request parameters, could add more to an already existing complexities. On the early days, I usually use &lt;a href=&quot;https://getfirebug.com/&quot;&gt;Firebug &lt;/a&gt;for most of the task to debug Web API. Lately, however, I rely more on &lt;a href=&quot;http://fiddler2.com/&quot;&gt;Fiddler&lt;/a&gt;. It does all that Firebug do for me plus much more. Compare to Firebug, Fiddler the debugging feels much more active since we can modify and manipulate a lot of things to test different cases on Fiddler itself without having to write test code or scripts. It sits between the application and Web API so we can build scenario to test each side.&lt;br /&gt;
&lt;br /&gt;
Here are some of its use :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Tracing request and JSON respons&lt;/b&gt;e. This is probably the most important ones. Tracing response on the code or by debugging in IDE can drain a lot of development time quickly. By monitoring it outside the application in realtime help us to focus more on the next step i.e: fixing code, add feature&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Emulate scenarios&lt;/b&gt;. The request / response can be emulated in Fiddler which enable us to see how the server or client response on certain request / response format and content without having to write the code first and do expensive IDE-based debugging&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Offline response&lt;/b&gt;. There are times when we want to rapidly and quickly test client behavior on certain response. Having to actually request to server could make the work take long since each request involve the whole request / response sequence. Fiddler could tap certain request format and give cached/predefined result instead. This will speedup the work since there is no actual network request happening. It could also help when we have issues with network availability when developing&lt;/li&gt;
&lt;/ul&gt;
Those are just some my main use cases that I&#39;ve encountered mostly. It has many other tools that can be useful for various Web-API-related task. </content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/1128153908578411886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/1128153908578411886' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/1128153908578411886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/1128153908578411886'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/11/use-fiddler-to-help-with-development.html' title='Use Fiddler to help with development with Web API'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-408265315082839110</id><published>2013-10-30T16:11:00.004+07:00</published><updated>2013-10-30T16:11:41.627+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><title type='text'>XtraGrid : Use more specialized event for better code in handlers</title><content type='html'>DevExpress&#39;s XtraGrid is quite a complex beast. It&#39;s a library with tons of features and it can be overwhelming to use it optimally at first. So you might get your job done with certain way but overtime you find something new that you didn&#39;t notice at first that actually a better way than how you did previously.&lt;br /&gt;
&lt;br /&gt;
That is the case when I just notice that XtraGrid has &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;RowCellClick &lt;/span&gt;event that fires on specific cell click. I have been using &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Click &lt;/span&gt;event previously. &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Click &lt;/span&gt;event work just fine, however within it I need to have numbers of code to filter out cases that is not relevant to what I am trying to achieve. On the other hand, &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;RowCellClick &lt;/span&gt;already comes with &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;RowCellClickEventArgs &lt;/span&gt;with all the relevant info has been nicely parsed for use. The code get much cleaner when I adapt the code from handling &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Click &lt;/span&gt;event to &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;RowCellClick&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
So, the lesson is to &lt;b&gt;use the most specific event that fit your case instead of the more general one&lt;/b&gt;. It can be a good guideline for using other parts of DevExpress library too. DevExpress components do a lot of inheritance from .Net components and with it inherit lots of pre-defined functions too. So, it has to do some specialization to extend the functions. Hence, it has some functions that is quite similar but slightly specialized.</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/408265315082839110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/408265315082839110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/408265315082839110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/408265315082839110'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/10/xtragrid-use-more-specialized-event-for.html' title='XtraGrid : Use more specialized event for better code in handlers'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-6562685606797932062</id><published>2013-10-30T11:26:00.002+07:00</published><updated>2013-10-30T12:07:57.284+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="system"/><title type='text'>Springpad + Evernote, Revisited</title><content type='html'>I wrote about &lt;a href=&quot;http://www.hafizpariabi.com/2013/01/utilizing-springpad-with-little-help.html&quot;&gt;using Springpad and Evernote&lt;/a&gt; sometime ago. My use of them since has evolved following the progress of those two services/apps. For example, Springpad note support was quite basic at that time but now it has become quite consistent and enjoyable to use. So, some of my setup has follow suit.&lt;br /&gt;
&lt;br /&gt;
I now &lt;b&gt;use mainly Springpad while Evernote is more for exceptional things&lt;/b&gt; like on the cases below :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Need things offline&lt;/li&gt;
&lt;li&gt;Long writing&lt;/li&gt;
&lt;li&gt;More &quot;sticky&quot; stuff like resources for projects&lt;/li&gt;
&lt;li&gt;Scans and documents &lt;/li&gt;
&lt;/ul&gt;
Springpad has now can fulfill most of my needs. It&#39;s better not to have too much tools and have things duplicated so I cut down my Evernote uses. It still an important part of my system though within its scope. As for Springpad, here&#39;s ans example of how I use it for :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Manage and track media : movies, series, books, games, etc. It is really useful on this&lt;/li&gt;
&lt;li&gt;Checklists : Springpad checklist support is quite advanced and it&#39;s what I have been looking for sometime&lt;/li&gt;
&lt;li&gt;Project research and resource collection : Springpad has various type of content, not just notes, that makes collecting resources for projects really &lt;/li&gt;
&lt;li&gt;Random notes, items and collections : for collecting interesting item from either online or offline that has not yet fit anywhere yet. I can search or organizing it easily later on&lt;/li&gt;
&lt;/ul&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/6562685606797932062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/6562685606797932062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/6562685606797932062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/6562685606797932062'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/10/springpad-evernote-revisited.html' title='Springpad + Evernote, Revisited'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-1503308136756094504</id><published>2013-10-11T09:37:00.000+07:00</published><updated>2013-10-11T13:03:30.242+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="deployment"/><category scheme="http://www.blogger.com/atom/ns#" term="visual studio"/><title type='text'>Visual Studio Deployment Project : Make Single Executable Installer using WinRAR</title><content type='html'>I wrote a while back of &lt;a href=&quot;http://Make Single Executable Installer using IExpress&quot;&gt;making a single executable installer for Visual Deployment Project&lt;/a&gt; (which output two file : setup.exe and setup.msi).&amp;nbsp; It was done using IExpress that comes with Windows installation itself. However, it feels quite outdated now. Even the page that I refer to in that post is no longer works :). It require some scripting and the use of IExpress is not exactly intuitive nor friendly.&lt;br /&gt;
&lt;br /&gt;
So, comes more straightforward solution using WinRar. I stumbled upon &lt;a href=&quot;http://stackoverflow.com/questions/9265639/how-do-i-make-a-self-installing-executable-using-winrar&quot;&gt;this post&lt;/a&gt; on stackoverflow. It basically intend to do the same thing using self-extracthing-archive feature in WinRar. It works much better and more maintainable. It does not require external scripting and you can add logo, title, description for the bootstrapper. I find the resulting installer looks cleaner to run with helpful info/logo.&lt;br /&gt;
&lt;br /&gt;
You can checkout the post above for some description and screenshot (hopefully stackoverflow link is more long-lasting). In summary, the steps are :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;create New Archive&lt;/li&gt;
&lt;li&gt;set to SFX mode&lt;/li&gt;
&lt;li&gt;go to advanced tab&lt;/li&gt;
&lt;li&gt;click SFX options button&lt;/li&gt;
&lt;li&gt;customize things to your needs&lt;/li&gt;
&lt;/ul&gt;
The rest is about experimenting until you got the setting that suits your needs. After that,&amp;nbsp; you can save the setting (Tab General -&amp;gt; &quot;Save current settings as default&quot;) and later when you create self-extracting-archive it will be done according to your last setup.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/1503308136756094504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/1503308136756094504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/1503308136756094504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/1503308136756094504'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/10/vs-deployment-make-single-executable.html' title='Visual Studio Deployment Project : Make Single Executable Installer using WinRAR'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-2192593615773838383</id><published>2013-10-08T11:22:00.000+07:00</published><updated>2013-10-08T11:24:43.375+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="book"/><title type='text'>Note from &quot;The Lean Startup&quot;</title><content type='html'>I have recently finished reading &quot;The Lean Startup&quot; by Eric Ries. It takes an experimental (as in scientific method of testing hypothesis) approach to make the work more efficient (does not waste valuable time/cost) and efficient (working on the right thing).&amp;nbsp; It emphasize on the importance of rapid learning and adjustment based on that learning. In this aspect, it seems to use the same foundation of Agile Software Development i.e: make small iterations and adjust/improve process/prediction after each iterations.&lt;br /&gt;
&lt;br /&gt;
Below is summary of the process on Lean Startup:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Make leap of faith&lt;/b&gt;. Make your hypothesis that you think is true, just make your best guest what will be useful and interesting to user so they will use it. Assume for now that it is true.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Develop Minimum Viable Product&lt;/b&gt;. Work on smallest possible set of feature that will have significant effect first. The smallness is important for having rapid feedback for learning&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Validated Learning&lt;/b&gt;. Review the reesult of the above using actual/verifiable data&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pivots&lt;/b&gt;. Decide based on the learning above what is the best course to take next. This could be improving things, discarding things or drop it and do something else entirely&lt;/li&gt;
&lt;/ul&gt;
In essence, the process actually useful in many areas of life. Having a rapid feedback can minimize our accumulated errors.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/2192593615773838383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/2192593615773838383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/2192593615773838383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/2192593615773838383'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/10/note-from-lean-startup.html' title='Note from &quot;The Lean Startup&quot;'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-2539164351298704999</id><published>2013-10-04T14:25:00.000+07:00</published><updated>2013-10-04T14:25:48.874+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><title type='text'>Accurate and Consistent Naming, the simplest yet has the most beneficial discipline in programming</title><content type='html'>I think if you have to name one discipline that is the most simple but give the most return in term of maintainability, it&#39;s probably proper naming. You can do any fancy pattern or coding practice but if you are lazy in maintaining consistent naming of variables, functions, classes, your code will soon rot and unmaintanable. Ironically, it probably the simplest practice to do, especially with powerful capabilities in todays IDE and text editor in doing search/replace and rename-refactoring.&lt;br /&gt;
&lt;br /&gt;
When you don&#39;t consistently naming everything properly in your code, you&#39;ll obscure your code intention thus making the maintenance hard even for yourself, let alone others. I prefer to write code that I can forget, meaning the code that when I visit it again in the future, it will take the least effort for me to remember what it is that I intent to express with it. Ideally, looking at the naming, structure and perhaps some external notes and diagram should be enough for&amp;nbsp; us get an understanding into the code again.&lt;br /&gt;
&lt;br /&gt;
There is now a lot of guideline how to do consistent and proper in naming in codes. There might also some variation of guidelines between&amp;nbsp; languages, framework, platform. Whatever standard you use, any naming guideline/standard is better than none, I guess. Do yourself, and others, a favor and properly and consistently naming things on the code.</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/2539164351298704999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/2539164351298704999' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/2539164351298704999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/2539164351298704999'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/10/accurate-and-consistent-naming-simplest.html' title='Accurate and Consistent Naming, the simplest yet has the most beneficial discipline in programming'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-4270149380591814953</id><published>2013-10-03T11:00:00.004+07:00</published><updated>2013-10-03T11:04:37.302+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><category scheme="http://www.blogger.com/atom/ns#" term="library"/><title type='text'>xUnit : Low Cost/Commitment Unit Testing</title><content type='html'>I have been having love/hate relationship with Unit Testing so far. I understand the need and rationale behind it and often times I even enjoy doing it and makes programming more fun. However, when the tests has hit certain large&amp;nbsp; numbers and you accumulated significant cases where it just hard, if not impossible, to test (despite decoupling the code heavily and usage of patterns in high-dose), unit tests becomes a chore and annoying burden to maintain. You start to question yourself it&#39;s worth the trouble and should you just going forward without TDD.&lt;br /&gt;
&lt;br /&gt;
I find the test framework that I use is a significant factor whether I keep unit-test the code. Having found &lt;a href=&quot;https://xunit.codeplex.com/&quot;&gt;xUnit&lt;/a&gt; sometime ago, I can now say again unit testing is functional, useful and fun again. Unit tests is support/driving activity of the main activity (coding), so the simplest possible support code/framework is the way to go.&amp;nbsp; xUnit has minimal &quot;accessories&quot; which make writing test code quick and straightforward. So far, it fits my need of unit test framework. For example, it get rid of Setup and Teardown and use very minimal set of attributes.&lt;br /&gt;
&lt;br /&gt;
One important thing, psychologically for me, of &lt;b&gt;having simple unit test framework is it makes my attachment to my unit tests relatively low. This means I can throw away, rewrite, change my unit test anytime and anyway I want with very minimal guilt.&lt;/b&gt; I can throw away large number of any unit tests that no longer serve any purpose and start over with the tests progressively. I can do architectural level changes with more freedom without unit test maintenance becoming too much of a burden. My focus now back to the main logic of program with unit test to support it.&lt;br /&gt;
&lt;br /&gt;
Of course, at some level, unit test framework can be very personal choice like choices of your favorite text editors or OS. Personally, I like xUnit for my (.Net) testing framework. If you have been throwing unit testing from your development arsenal lately, you might want to try xUnit and see if it can interest you to get back to unit testing your code again.</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/4270149380591814953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/4270149380591814953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/4270149380591814953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/4270149380591814953'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/10/xunit-low-costcommitment-unit-testing.html' title='xUnit : Low Cost/Commitment Unit Testing'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-3501329606863760273</id><published>2013-10-02T16:17:00.001+07:00</published><updated>2013-10-02T16:17:22.468+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="application"/><title type='text'>Free solution for .Net Profiler : Slimtune </title><content type='html'>When it comes to profiling and performance tuning of application for .Net application, the proprietary solution can be quite expensive. However, I stumble upon &lt;a href=&quot;http://code.google.com/p/slimtune/&quot;&gt;SlimTune &lt;/a&gt;recently. It&#39;s a free .Net profiler and I find it quite sufficient for common profiling needs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvs_e5pDLntVtwMt_9Xm-x8nfu78EdswfEaiTJXCehRZoAFhl7sdGfYmDoft71qEkK5Vk37PQQs0RaNqejAQvhFsohIVu6Lh0QY7rSSkEW7Giosv9jgSEHWRa2r1OpmFZ3xswB/s1600/slimtune.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;280&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvs_e5pDLntVtwMt_9Xm-x8nfu78EdswfEaiTJXCehRZoAFhl7sdGfYmDoft71qEkK5Vk37PQQs0RaNqejAQvhFsohIVu6Lh0QY7rSSkEW7Giosv9jgSEHWRa2r1OpmFZ3xswB/s400/slimtune.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
If you just interested to see your application performance hotspot, it already does that quite well. It&#39;s not fancy, sure, and the GUI need getting used to initially, but it does it&#39;s job fine. I can spot and tune the performance issue quickly with it.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/3501329606863760273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/3501329606863760273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/3501329606863760273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/3501329606863760273'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/10/free-solution-for-net-profiler-slimtune.html' title='Free solution for .Net Profiler : Slimtune '/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvs_e5pDLntVtwMt_9Xm-x8nfu78EdswfEaiTJXCehRZoAFhl7sdGfYmDoft71qEkK5Vk37PQQs0RaNqejAQvhFsohIVu6Lh0QY7rSSkEW7Giosv9jgSEHWRa2r1OpmFZ3xswB/s72-c/slimtune.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-4877520698173519104</id><published>2013-09-26T16:08:00.000+07:00</published><updated>2013-09-26T16:08:15.426+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><category scheme="http://www.blogger.com/atom/ns#" term="miscellaneous"/><title type='text'>No Duplication for a Good Code and Good Life</title><content type='html'>More things in life does not always leads to a good quality life. If the things is duplicated, its function is already done by something else, it&#39;s existence is a clutter and use up unnecessary energy. The duplication is bad in code too, it is a nightmare to maintain the same logic that scattered on several places. One changes on one place need to be repeated on the other ones that use similar logic, otherwise you&#39;ll break the code.&lt;br /&gt;
&lt;br /&gt;
Having enough things is not just about living a minimalistic lifestyle, it also a way to stay sane, to not use things unnecessarily. If we can simplify things internally, we can achieve more complex meaningful things with much ease.</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/4877520698173519104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/4877520698173519104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/4877520698173519104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/4877520698173519104'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/09/no-duplication-for-good-code-and-good.html' title='No Duplication for a Good Code and Good Life'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-5508291643815311991</id><published>2013-09-25T13:37:00.000+07:00</published><updated>2013-09-25T13:37:00.404+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="library"/><category scheme="http://www.blogger.com/atom/ns#" term="mobile"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>Bootstrap : Programmer&#39;s Friendly Web Front-end Framework</title><content type='html'>I had task recently to port some web content into a mobile App. I translated some web-navigation navigation into native mobile one. For example, some section listing is translated into TableView in iOS. However, for the content pages itself I need to basically put the HTML content into an offline-bundled resources within the App.&lt;br /&gt;
&lt;br /&gt;
Below is some problem with the task :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The Desktop version link to various online Javascript and CSS resources&lt;/li&gt;
&lt;li&gt;The layout is for desktop and need to be made more mobile-friendly&lt;/li&gt;
&lt;/ul&gt;
It will be time consuming to try to proceed without some kind of reusable solution. After some research I settled with using &lt;a href=&quot;http://getbootstrap.com/2.3.2/index.html&quot;&gt;Bootstrap&lt;/a&gt; to help with the it. It&#39;s a web front-end framework that bundle some Javascript and CSS into a convenient package. My plan is to offload the script/style to it so I can focus on porting the content.&lt;br /&gt;
&lt;br /&gt;
The content of bootstrap pretty much suffice for the current typical need for multi-device HTML rendering. At least with it I can port the existing Desktop-based content pretty quickly for offline mobile consumption. The styling and layout is already fit out-of-the box to my need. I can strip the existing Javascript and CSS references and make the content use things from Bootstrap. There is still some labor work on the porting but doing on top of a good foundation makes it more manageable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/5508291643815311991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/5508291643815311991' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/5508291643815311991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/5508291643815311991'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/09/bootstrap-programmers-friendly-web.html' title='Bootstrap : Programmer&#39;s Friendly Web Front-end Framework'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-6212625344871401790</id><published>2013-09-12T21:20:00.001+07:00</published><updated>2013-09-12T21:20:24.911+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="system"/><title type='text'>JEdit : One Text Editor to Rule Them All (Functions and Platforms)</title><content type='html'>Any programmer would say his favorite text editor is the best one so I won&#39;t bother saying which one is best :). However, I do use one text editor, JEdit, for quite a long time already and find it a really useful text editor. Below is some of the reason :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;It does &quot;everything&quot; I can think of&lt;/b&gt; and more. It has a rich plugin list and so far I haven&#39;t find any of my needs that is has not met. Apart from coding which I do mainly on IDE, I use JEdit for the rest. Editing and Viewing binaries with it&#39;s Hex editing plugins, Editing XML even using it as a full-fledged IDE for some language e.g: Ruby, Python.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;It runs on all Platform&lt;/b&gt;. One of my main priorities of text editor is it needs to to be able to run on OS that I use. I did works on Windows, Mac and Linux so having text editor that can run on all of them is a big requirement for me. It saves a lot of time to be familiar with one advanced text editor and can run it on all system. The time you spend customizing the configuration, learning the shortcuts will pay off really well.&lt;/li&gt;
&lt;/ul&gt;
There is one situation that I can&#39;t use JEdit though and that is the time when I am working on command-line/shell. When that happens, VIM is my friend. So, I guess, JEdit doesn&#39;t really rule everything yet.</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/6212625344871401790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/6212625344871401790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/6212625344871401790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/6212625344871401790'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/09/jedit-one-text-editor-to-rule-them-all.html' title='JEdit : One Text Editor to Rule Them All (Functions and Platforms)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-479375474261404102</id><published>2013-09-11T11:59:00.001+07:00</published><updated>2013-09-11T11:59:07.295+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><title type='text'>Code for your future self</title><content type='html'>It&#39;s quite annoying to work on existing code that you find hard to navigate and understand. It makes you spend some significant time first to understand the existing structure before you can finally add the feature or fix bug you intend to do in the first place. It does not have to be the code written by someone else, even your own code can give you some hard time when you revisit it again at the later time.&lt;br /&gt;
&lt;br /&gt;
That is why the importance of writing good code is not just so the features runs well and the code looks good to your peer. It is also for your own benefit to have the code done in a well-designed and intuitive way at the moment you wrote it. &lt;br /&gt;
&lt;br /&gt;
There will be temptation to code something quickly when deadline is approaching or you just feel lazy to extract those abstraction that you find. For your own sake, resist them and write code properly in the most natural and the most obvious way you can think of it. Your future self with start with that kind of intuitive thinking before he jump into specialize cases, workarounds and other tricks.&lt;br /&gt;
&lt;br /&gt;
Here is an example of the things you can do to minimize the pain of your future self coding session :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Choose good naming&lt;/b&gt;. This is simple and highly essential but easy to break at the time when you feel lazy or under pressure&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Have all the dependencies locally and self-contain&lt;/b&gt; whenever possible. For all dependencies that you can not put locally, put detailed documentatio on how to get it&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Automate and simplify the build system&lt;/b&gt;. Again document unscrypted steps extensively&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Make notes and diagram on general architecture&lt;/b&gt;. Give high level diagrams and don&#39;t forget to update them when it no longer reflect the actual code. Do not go into too much detail on this. Focus on&amp;nbsp; describing the big picture of architecture on the notes and diagram and let the code speak for itself whenever it can&lt;/li&gt;
&lt;/ul&gt;
Think of yourself when coding. He will thank you greatly later when he has to work on it again in the future.You know, even your current self will appreciate it too. It&#39;s much more fun to make a good code than to make a hasty/sloppy/buggy one.</content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/479375474261404102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/479375474261404102' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/479375474261404102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/479375474261404102'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/09/code-for-your-future-self.html' title='Code for your future self'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-824521409684899535</id><published>2013-09-10T11:35:00.000+07:00</published><updated>2013-09-10T11:35:17.388+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="system"/><title type='text'>Focus on Personal Workflow and System, Not Gadget and Apps</title><content type='html'>Gadgets and Apps are abound today and the discussions that runs mostly are about what Gadgets can do this and that. I think many times the focus are misplaced. Gadgets are just tools and what is most important is the personal system workflow that a person has. Without that, gadget has no context and will just be a distraction with each additional feature. However, when you have system, each feature on the gadget can use to improve certain aspect of that system.&lt;br /&gt;
&lt;br /&gt;
When you have a workflow involving calendar and reminder, a good calendar app can make that part of your system more optimal and in turn will make the overall system runs better. However, when you don&#39;t have need for calendar in your personal workflow (which is not a sin, BTW :) ) it will be just a toy to try a little bit and never used again or worse you keep keep wasting time using it without adding any benefit to your system.&lt;br /&gt;
&lt;br /&gt;
So, I guess what matters is what system that you have and what combinations of gadgets and apps that can make it runs better. Researching new gadgets and apps can be useful if you use it to see how you can improve your existing system with it. </content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/824521409684899535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/824521409684899535' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/824521409684899535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/824521409684899535'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/09/focus-on-personal-workflow-and-system.html' title='Focus on Personal Workflow and System, Not Gadget and Apps'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-4947532992125597506</id><published>2013-09-09T13:10:00.002+07:00</published><updated>2013-09-09T13:10:33.022+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="csharp"/><category scheme="http://www.blogger.com/atom/ns#" term="dotnet"/><title type='text'>Winforms C# : Prefer initialization in constructor instead of Form_Load event handler</title><content type='html'>On Windows Forms, I have been doing initialization of values on &lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Form_Load&lt;/span&gt; event handler. I use constructor mostly for make instances of member variables and setting basic/default values. I did the rest of the settings e.g: config, last state, on Form_Load. It turns out that it&#39;s not actually a best practice to do so.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve just stumbled upon &lt;a href=&quot;http://stackoverflow.com/questions/2521322/what-setup-code-should-go-in-form-constructors-versus-form-load-event&quot;&gt;this discussion&lt;/a&gt; on Stack Overflow that explain that it is actually better to minimize the use of Load. In summary, here&#39;s the guideline on Constructor vs. Load issues :&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Initialize things on constructor&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Only use Load for code that needs valid windows handle e.g: code that requires the window size and location to be known&lt;/li&gt;
&lt;li&gt;Override&amp;nbsp; OnLoad instead of using Form_Load event handler. This ensure more deterministic order of execution in relation to parents OnLoad call &lt;/li&gt;
&lt;/ol&gt;
I guess it&#39;s time to change the habit. </content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/4947532992125597506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/4947532992125597506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/4947532992125597506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/4947532992125597506'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/09/winforms-c-prefer-initialization-in.html' title='Winforms C# : Prefer initialization in constructor instead of Form_Load event handler'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5742695.post-4498678609144801704</id><published>2013-09-06T14:05:00.001+07:00</published><updated>2013-09-11T11:38:31.094+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><title type='text'>When You Know Better, Code Better (In the meantime, code it the best you know how at the moment)</title><content type='html'>There is a good, albeit very short, &lt;a href=&quot;http://lifehacker.com/when-you-know-better-do-better-565500764&quot;&gt;article on Lifehacker&lt;/a&gt; titled &quot;When You Know Better, Do Better&quot;. The important take of the article is actuall the message &quot;Do the best you can with what you know now&quot;.&lt;br /&gt;
&lt;br /&gt;
There is always a better way to do anything. If we got preoccupied wondering if this is the best we can do right now we&#39;ll get paralyzed and nothing will get done. Even worse, when we finally decide to take action anyway, we might take less optimal approach due to self-doubts. &lt;br /&gt;
&lt;br /&gt;
I think this is even more apparent in programming world. There are literally thousands of choices available for us to solve a programming problem. From libraries, frameworks, patterns, languages, text editor, diagram tools, we will probably won&#39;t do our best work if we agonize over what is the best that is available.&lt;br /&gt;
&lt;br /&gt;
Referring to the advice above, we could focus our search for the best on what we know already at that time. We will learn new things along the way and at later moment we can do our best again with our knowledge at that time and repeat. I find this quite liberating and help a lot to minimize the noise on the head while coding. I can focus to produce the best work with what I know at the time. I&#39;ll do better when I know better. </content><link rel='replies' type='application/atom+xml' href='http://www.hafizpariabi.com/feeds/4498678609144801704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/5742695/4498678609144801704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/4498678609144801704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5742695/posts/default/4498678609144801704'/><link rel='alternate' type='text/html' href='http://www.hafizpariabi.com/2013/09/when-you-know-better-code-better-in.html' title='When You Know Better, Code Better (In the meantime, code it the best you know how at the moment)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>