<?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: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-8894680</id><updated>2011-04-21T17:37:36.924-04:00</updated><title type='text'>Coffee &amp; Revolution</title><subtitle type='html'>Kwang Yul Seo's Blog. I am a computer science major student at Pohang University of Science and Technology.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8894680.post-113461234686649417</id><published>2005-12-14T21:05:00.000-05:00</published><updated>2005-12-14T21:06:25.666-05:00</updated><title type='text'>Vim + Ctags Tip!</title><content type='html'>I always wanted to locate the tag file automatically.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;   How do I configure Vim to locate a tags file in a directory tree?&lt;br /&gt;&lt;br /&gt;   Note that the following will work only in Vim 6.0 and above.  You can set the 'tags' option to make Vim search for the tags file in a directory tree.  For example, if the 'tags' option is set like this:&lt;br /&gt;&lt;br /&gt;        set tags=tags;/&lt;br /&gt;&lt;br /&gt;   Vim will search for the file named 'tags', starting with the current directory and then going to the parent directory and then recursively to the directory one level above, till it eitherlocates the 'tags' file or reaches the root '/' directory. &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113461234686649417?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113461234686649417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113461234686649417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113461234686649417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113461234686649417'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/12/vim-ctags-tip.html' title='Vim + Ctags Tip!'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113434865776404652</id><published>2005-12-11T19:50:00.000-05:00</published><updated>2005-12-11T20:03:01.403-05:00</updated><title type='text'>Quaqua look and feel</title><content type='html'>&lt;a href='http://photos1.blogger.com/hello/196/8941/640/quaqua_metalworks.jpg'&gt;&lt;img border='0' style='border:1px solid #000000; margin:2px' src='http://photos1.blogger.com/hello/196/8941/320/quaqua_metalworks.jpg'&gt;&lt;/a&gt;&lt;br /&gt;I always envied Mac OS users. Wait a sec! There is a way. We can emulate the look and feel of Mac OS with Quaqua look and feel in Java applications! Check it out. Yes, it is not intended for other platforms, but you can use it in Windows too. Not perfect though. :(  &amp;nbsp;&lt;a href='http://picasa.google.com/blogger/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' border='0' style='border:0px;padding:0px;background:transparent;' align='absmiddle'&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113434865776404652?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113434865776404652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113434865776404652' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113434865776404652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113434865776404652'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/12/quaqua-look-and-feel.html' title='Quaqua look and feel'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113434499567167401</id><published>2005-12-11T18:47:00.000-05:00</published><updated>2005-12-11T20:04:44.556-05:00</updated><title type='text'>What I lack</title><content type='html'>&lt;A HREF='http://photos1.blogger.com/blogger/5671/402/640/%3F%3F%3F%3F%3F%3F%20009.jpg'&gt;&lt;IMG SRC='http://photos1.blogger.com/blogger/5671/402/320/%3F%3F%3F%3F%3F%3F%20009.jpg' border=0 alt='' style='clear:all;float:right;margin: 0px 10px 10px 0px; cursor:hand'&gt;&lt;/A&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;A list of what I lack in computer science&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Deep understanding of algorithm complexity&lt;br /&gt;&lt;li&gt;Ability to analyze the performance&lt;br /&gt;&lt;li&gt;Inexperience in GUI programming&lt;br /&gt;&lt;li&gt;Skills in IDE tools&lt;br /&gt;&lt;li&gt;Mathematical backgrounds&lt;br /&gt;&lt;li&gt;and so forth...&lt;br /&gt;&lt;/ul&gt;&amp;nbsp;&lt;a href='http://picasa.google.com/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' style='border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;' align='middle' border='0' /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113434499567167401?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113434499567167401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113434499567167401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113434499567167401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113434499567167401'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/12/what-i-lack.html' title='What I lack'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113434438500878013</id><published>2005-12-11T18:35:00.000-05:00</published><updated>2005-12-11T18:39:45.013-05:00</updated><title type='text'>Performance Analysis</title><content type='html'>&lt;BODY&gt;&lt;A HREF='http://photos1.blogger.com/blogger/5671/402/640/screenshot.jpg'&gt;&lt;IMG SRC='http://photos1.blogger.com/blogger/5671/402/320/screenshot.0.jpg' border=0 alt='' style='clear:all;float:right;margin: 0px 10px 10px 0px; cursor:hand'&gt;&lt;/A&gt;&amp;nbsp;&lt;br /&gt;&lt;/BODY&gt; &lt;br /&gt;Recently, I am working on a toy artificial intelligence agent. The agent doesn't know anything about the environemnt and the effect of actions. However, it gets rewards and punishments for each state. This is what we call a reinforcement learning. I used some variations of Q learning agents and tried to compare the performance of agents.&lt;br /&gt;&lt;br /&gt;However, the problem was not so easy. It was hard to normalize the rewards in differnment environments. Not deterministic characteristics of environments make it worse. I've got to know that I don't know well about the performance analysis.&lt;br /&gt;&lt;br /&gt;I feel I must study. Oh God...&amp;nbsp;&lt;a href='http://picasa.google.com/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' style='border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;' align='middle' border='0' /&gt;&lt;/a&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113434438500878013?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113434438500878013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113434438500878013' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113434438500878013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113434438500878013'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/12/performance-analysis.html' title='Performance Analysis'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113432988108740154</id><published>2005-12-11T14:36:00.000-05:00</published><updated>2005-12-11T14:38:01.103-05:00</updated><title type='text'>Introduction to XPath in Java Using Jaxen</title><content type='html'>&lt;a href="http://jaxen.codehaus.org/pdf/intro-slides.pdf"&gt;Introduction to XPath in Java Using Jaxen&lt;/a&gt; seems to be a pretty good slides for Xpath and Jaxen. It explains how it evaluates the XPath query.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113432988108740154?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113432988108740154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113432988108740154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113432988108740154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113432988108740154'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/12/introduction-to-xpath-in-java-using.html' title='Introduction to XPath in Java Using Jaxen'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113432916282708316</id><published>2005-12-11T14:22:00.000-05:00</published><updated>2005-12-11T14:26:02.830-05:00</updated><title type='text'>XPath Explorer</title><content type='html'>&lt;a href="http://www.purpletech.com/xpe/"&gt;XPath Explorer&lt;/a&gt; is a good tool to visualize the XPath expression. It helps developers work interactively with XPath. &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Basically, you type in a URL (to an XML or HTML document) and an XPath expression, and it displays the elements or attributes from that document which match that expression. It also displays the value (string, number, or boolean) of the expression, and (in a stunning coup de grace) displays the entire XML tree of the original document, but with the matching nodes highlighted in bold. This makes it easy to play with and debug your XPath expresions.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;XPath query is Java String. So we can't get any help from the Java language type checker. It is really painful to guess the correct behaviour of XPath query. A tool like XPath explorer can greatly reduce the time and lower the learning curve for new technology. Try it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113432916282708316?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113432916282708316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113432916282708316' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113432916282708316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113432916282708316'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/12/xpath-explorer.html' title='XPath Explorer'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113408366325769731</id><published>2005-12-08T18:14:00.000-05:00</published><updated>2005-12-09T01:37:17.253-05:00</updated><title type='text'></title><content type='html'>&lt;a href='http://photos1.blogger.com/hello/196/8941/640/002.jpg'&gt;&lt;img border='0' style='border:1px solid #000000; margin:2px' src='http://photos1.blogger.com/hello/196/8941/320/002.jpg'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;My picture: This is a picture posted by Hello.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113408366325769731?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113408366325769731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113408366325769731' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113408366325769731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113408366325769731'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/12/my-picture-this-is-picture-posted-by.html' title=''/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113407257515582793</id><published>2005-12-08T15:02:00.000-05:00</published><updated>2005-12-08T17:58:55.890-05:00</updated><title type='text'>Do you know launch4j?</title><content type='html'>&lt;a href="http://launch4j.sourceforge.net/"&gt;launch4j&lt;/a&gt; is a cross-platform Java application wrapper for creating Windows native EXEs. &lt;br /&gt;&lt;br /&gt;One of the reasons why Java is not so popular in Windows client, especially in Korea is its lack of ability to distribute easily. Java applications need pre-installed JRE, it's not an easy task to install the application in one-step.&lt;br /&gt;&lt;br /&gt;launch4j solves this problem. It has features:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Wraps jars in Windows native executables and allows to run them like a regular Windows program&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Doesn't extract the jar from the executable&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Native pre-JRE splash screen in BMP format shown until the Java application starts&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Process name as the executable filename to easily identify your application&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Works with a bundled JRE or searches for newest JRE / SDK in given range&lt;/li&gt;&lt;br /&gt;&lt;li&gt;and so forth.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5671/402/1600/screenshot.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/5671/402/320/screenshot.jpg" border="0" alt="" /&gt;&lt;/a&gt;I think spalsh screen is a big win. Many people think that Java is slow not because it is really slow, but because it doesn't show anything until JVM warms up and actually starts executing the Java code. Splash screen is now supported in Java6 mustang, but it's not released officially yet. &lt;br /&gt;&lt;br /&gt;Bottom line: Try to use launch4j when your target platform is Windows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113407257515582793?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113407257515582793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113407257515582793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113407257515582793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113407257515582793'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/12/do-you-know-launch4j.html' title='Do you know launch4j?'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113405591112495556</id><published>2005-12-08T09:15:00.000-05:00</published><updated>2005-12-08T11:47:11.430-05:00</updated><title type='text'>Programming Language and IDE support</title><content type='html'>I read "An Interview with TestNG's Cedric Beust Dynamic Languages"[1]. I totally agree with him. Recently I'm convined that IDE supports are essential for a language to be widely adopted.&lt;br /&gt;&lt;br /&gt;I've tried various dynamic script languages including Python, Ruby and Groovy. I was fascinated by the elegance of these languages. However, I seldom use them in practice. Different syntaxes and styles are the first barrier, but it is not a major one. The more important thing is that I don't have a full-featured IDE(intergrated development environment). &lt;br /&gt;&lt;br /&gt;With Eclipse/Java, I am now test-infected and love refactoring whenever possible. But these are really painful tasks without the help of IDE. I've tried Eclipse plugin for Groovy these days, but it doesn't seem to work well. Moreover, I can't see any significant progress in plugins for dynamic languages. &lt;br /&gt;&lt;br /&gt;I hope I will get one soon or later.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;br /&gt;[1] &lt;a href="http://www.vanwardtechnologies.com/cedricb03.php"&gt;An Interview with TestNG's Cedric Beust Dynamic Languages&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113405591112495556?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113405591112495556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113405591112495556' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113405591112495556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113405591112495556'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/12/programming-language-and-ide-support.html' title='Programming Language and IDE support'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113381377956364309</id><published>2005-12-05T15:15:00.000-05:00</published><updated>2005-12-05T18:04:28.270-05:00</updated><title type='text'>URI, URL, URNs</title><content type='html'>URI, URL and URNs are most frequently used technical terms in the web world. The problem is the distinction among them are not so clear. Is URL a subclass of URI? However, in many specifications, they seem to be used interchangably. Many people as well as I also are confused. W3C has a official &lt;a href="http://www.w3.org/TR/uri-clarification/"&gt;clarification&lt;/a&gt;for this issue.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;1 URI Partitioning&lt;br /&gt;&lt;br /&gt;There is some confusion in the web community over the partitioning of URI space, specifically, the relationship among the concepts of URL, URN, and URI. The confusion owes to the incompatibility between two different views of URI partitioning, which we call the "classical" and "contemporary" views.&lt;br /&gt;1.1 Classical View&lt;br /&gt;&lt;br /&gt;During the early years of discussion of web identifiers (early to mid 90s), people assumed that an identifer type would be cast into one of two (or possibly more) classes. An identifier might specify the location of a resource (a URL) or its name (a URN) independent of location. Thus a URI was either a URL or a URN. There was discussion about generalizing this by addition of a discrete number of additional classes; for example, a URI might point to metadata rather than the resource itself, in which case the URI would be a URC (citation). URI space was thus viewed as partitioned into subspaces: URL and URN, and additional subspaces, to be defined. The only such additional space ever proposed was URC and there never was any buy-in; so without loss of generality it's reasonable to say that URI space was thought to be partitioned into two classes: URL and URN. Thus for example, "http:" was a URL scheme, and "isbn:" would (someday) be a URN scheme. Any new scheme would be cast into one or the other of these two classes.&lt;br /&gt;1.2 Contemporary View&lt;br /&gt;&lt;br /&gt;Over time, the importance of this additional level of hierarchy seemed to lessen; the view became that an individual scheme does not need to be cast into one of a discrete set of URI types such as "URL", "URN", "URC", etc. Web-identifer schemes are in general URI schemes; a given URI scheme may define subspaces. Thus "http:" is a URI scheme. "urn:" is also a URI scheme; it defines subspaces, called "namespaces". For example, the set of URNs of the form "urn:isbn:n-nn-nnnnnn-n" is a URN namespace. ("isbn" is an URN namespace identifier. It is not a "URN scheme" nor a "URI scheme").&lt;br /&gt;&lt;br /&gt;Further according to the contemporary view, the term "URL" does not refer to a formal partition of URI space; rather, URL is a useful but informal concept: a URL is a type of URI that identifies a resource via a representation of its primary access mechanism (e.g., its network "location"), rather than by some other attributes it may have. Thus as we noted, "http:" is a URI scheme. An http URI is a URL. The phrase "URL scheme" is now used infrequently, usually to refer to some subclass of URI schemes which exclude URNs.&lt;br /&gt;1.3 Confusion&lt;br /&gt;&lt;br /&gt;The body of documents (RFCs, etc) covering URI architecture, syntax, registration, etc., spans both the classical and contemporary periods. People who are well-versed in URI matters tend to use "URL" and "URI" in ways that seem to be interchangable. Among these experts, this isn't a problem. But among the Internet community at large, it is. People are not convinced that URI and URL mean the same thing, in documents where they (apparently) do. When one sees an RFC that talks about URI schemes (e.g. [RFC 2396]), another that talks about URL schemes (e.g. [RFC 2717]), and yet another that talks of URN schemes ([RFC 2276]) it is natural to wonder what's the difference, and how they relate to one another. While RFC 2396 1.2 attempts to address the distinction between URIs, URLs and URNs, it has not been successful in clearing up the confusion.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113381377956364309?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113381377956364309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113381377956364309' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113381377956364309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113381377956364309'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/12/uri-url-urns.html' title='URI, URL, URNs'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113359345216681088</id><published>2005-12-03T01:56:00.000-05:00</published><updated>2005-12-03T02:06:12.983-05:00</updated><title type='text'>Yakker: A Parser Generator for Network Protocol Messages</title><content type='html'>About three weeks ago, I attended "&lt;a href="http://www.cis.upenn.edu/~stevez/njpls/#about"&gt;NJ Programming Languages and Systems Seminar&lt;/a&gt;" held in Univ. of Maryland. The first session was particulary interesting. Trevor Jim from AT&amp;T gave a presentation about his work.&lt;br /&gt;&lt;br /&gt;His research is about "&lt;a href="http://www.cs.umd.edu/projects/PL/mapls2005.html#trevor"&gt;Yakker: A Parser Generator for Network Protocol Messages&lt;/a&gt;" The main idea is quite simple. Write a parser generator whose inputs are RFC documents. The format of RFCs are pretty standardized and it is actually possible to parse them without any intervention of people.&lt;br /&gt;&lt;br /&gt;Once a parser generator is well-written with a secure language such as Java, a automatically generated parser is much safer than hand-written parsers which cause various security problems nowdays. Moreover, we can formally proof that some protocols are ambiguous and need to be revised. &lt;br /&gt;&lt;br /&gt;Automation techniques always seem to be pretty cool wherever they are possible, don't they?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113359345216681088?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113359345216681088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113359345216681088' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113359345216681088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113359345216681088'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/12/yakker-parser-generator-for-network.html' title='Yakker: A Parser Generator for Network Protocol Messages'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113358842185642567</id><published>2005-12-03T00:29:00.000-05:00</published><updated>2005-12-03T02:51:10.023-05:00</updated><title type='text'>Memo Function</title><content type='html'>The same old ideas are repeated again and again in many fields. One of such things is the idea of caching. When something is quiet slow and you tend to request it frequently, just put them in a special area which is way fatster.  The stroage hiearchy from the fastest regiters through L1, L2 cache, and memory down to slow disks is a typical example of caching.&lt;br /&gt;&lt;br /&gt;The same principle is also applied to so called dynamic programming. Especially AI people love solving their NP-hard problems with dynamic programming. Their algorithms are likely to be exponential more than O(2^n), and they often try to solve it more efficiently storing previous computed results and reuse them. &lt;br /&gt;&lt;br /&gt;The idea behind the &lt;a href="http://foldoc.org/?memo+function"&gt;memo function &lt;/a&gt;is essentially the same. A function rememebers which arguments it has been called with and the result returned, and if called with the same arguments again, returns the result from its memory instead of recalculating it. It was first invented by Professor Donald Michie of Edinburgh University. However, the idea is quite old.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113358842185642567?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113358842185642567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113358842185642567' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113358842185642567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113358842185642567'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/12/memo-function.html' title='Memo Function'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113356500499012733</id><published>2005-12-02T17:59:00.000-05:00</published><updated>2005-12-03T04:11:12.490-05:00</updated><title type='text'>GC and VM</title><content type='html'>I've recently checked J2SE 5.0 Tiger VM garbage collectors. They are really cool. The parallel GC provides throughput, while the mostly concurrent GC gives us low latency. Ergonomics solves the hard configuration problems because the JVM itself now tries to adjust the various factors such as younggen/oldgen size, GC method, server/client VM and so forth.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5671/402/1600/eclipse_vm.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/5671/402/320/eclipse_vm.png" border="0" alt="" /&gt;&lt;/a&gt;One thing I see most of JVM don't talk much is about the interaction with the underlying virtual memory system. As I use Eclipse for my favorite IDE, when I minimize the Eclipse window and try to do some other things and get back to work, I see it scratches my hard drive a lot. I guess this is because most pages are swapped out while I don't use Eclipse, once I get back and a GC is triggered, it touches every page and the VM swaps in all the pages again.&lt;br /&gt;&lt;br /&gt;I know there is a cool Eclipse plugin called &lt;a href="http://suif.stanford.edu/pub/keepresident/"&gt;KeepResident &lt;/a&gt;from Stanford Univ. The idea is simple. It uses two functions in Windows API SetProcessWorkingSetSize() and VirtualLock() - to encourage Windows to keep more of the Eclipse Java process in physical RAM. However, it keeps other processes from getting more memory.&lt;br /&gt;&lt;br /&gt;Is there any GC algorithm available, which takes the interaction with VM into consideration?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113356500499012733?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113356500499012733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113356500499012733' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113356500499012733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113356500499012733'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/12/gc-and-vm.html' title='GC and VM'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113356382013008066</id><published>2005-12-02T17:42:00.000-05:00</published><updated>2005-12-03T04:14:04.740-05:00</updated><title type='text'>Java code coverage tools</title><content type='html'>Today I've looked up several Java code coverage tools. &lt;a href="http://emma.sourceforge.net/"&gt;Emma&lt;/a&gt; is one of Java code coverage tools freely available. &lt;br /&gt;&lt;br /&gt;Distinctive features of Emma include:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Instrument classes 1) offline, before load time 2) online, application classloading&lt;br /&gt;&lt;li&gt;Various report types: text, html, xml&lt;br /&gt;&lt;li&gt;Converage subset filtering&lt;br /&gt;&lt;li&gt;Fast: unit of work is basic blocks&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/5671/402/1600/emma.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/5671/402/320/emma.jpg" border="0" alt="" /&gt;&lt;/a&gt;I think the only thing it lacks is the integration with existing IDE tools like Eclipse. It is certainly good to get reports everyday from the build system, but developers really want to get the coverage information interactively as they write code and test cases.&lt;br /&gt;&lt;br /&gt;I found somebody posted a simple requirements for Emma eclipse plugin.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; perhaps instr filters could be intergrated with Eclipse &lt;br /&gt;filter/worksets&lt;br /&gt;&lt;li&gt; coverage markup should be done directly in the original &lt;br /&gt;source code if possible&lt;br /&gt;&lt;li&gt; (re)instrumentation could be (optionally) done in the &lt;br /&gt;background just like code compilation&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;It was posted about a year ago, but I still can't see any progress in it. So I've decided to start writing my own Emma Eclipse plugin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113356382013008066?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113356382013008066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113356382013008066' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113356382013008066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113356382013008066'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/12/java-code-coverage-tools.html' title='Java code coverage tools'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113277200514131507</id><published>2005-11-23T13:36:00.000-05:00</published><updated>2005-11-23T13:53:25.163-05:00</updated><title type='text'>A Note On Distributed Computing</title><content type='html'>Java RMI로 코딩할 일이 있어서 Java 5 RMI 관련 문서를 다시 읽어보다가 Distributed Computing에 관한 고전 논문인 &lt;a href="http://research.sun.com/techrep/1994/abstract-29.html"&gt;A Note on Distributed Computing&lt;/a&gt;을 읽어 보았습니다.&lt;br /&gt;&lt;br /&gt;이 논문의 핵심을 한 줄로 요약하면, "local computing"과 "distributed computing"은 latnecy/memory access/partial failure/concurrency 등에서 현격한 차이가 있으므로 이를 하나로 통합하려는 unifed objects는 실패할 수 밖에 없다는 것입니다.&lt;br /&gt;&lt;br /&gt;object는 아니지만, distributed computing과 local computing의 차이를 무시했을 경우 나타나는 결과를 가장 잘 보여주는 예는 NFS입니다. NFS는 기존의 파일 시스템 인터페이스(open, close, read, write...)를 그대로 사용하여 원격에 있는 파일 시스템을 로컬 파일 시스템인 것처럼 접근할 수 있게 해줍니다. 따라서 로컬의 파일을 쓰듯이 원격 파일을 접근하고 사용할 수 있는 장점이 있습니다. 그러나 문제가 있습니다. 파일 시스템 인터페이스는 같은 머신에서 disk full이나 disk crash 같은 심각한 오류에 대응하도록 만들어져 있지, 네트웍 failure나 다른 머신의 crash 같이 distributed 환경에서 빈번하게 발생할 수 있는 문제를 다루지 못하기 때문입니다.&lt;br /&gt;&lt;br /&gt;"Joel On Software"의 책을 보면 "Every abstraction is leaky"라는 챕터에서 비슷한 이야기를 하고 있습니다. 윈도우즈의 삼바 같은 경우 NFS와 마찬가지로 원격의 파일 시스템을 액세스 할 수 있게 해주는데, 인터페이스는 파일 시스템 인터페이스를 그대로 사용합니다. 따라서 네트웍이나 느려지거나 멈췄을 때 이에 대응할 수 있는 방법이 인터페이스 차원에서는 사실상 없게 됩니다. 따라서 삼바 자체의 구현과는 상관 없이 안정성을 보장할 수 있는 방법이 없는 것입니다.&lt;br /&gt;&lt;br /&gt;위 논문은 distributed object 레벨에서 이야기를 하고 있는데, local object와 distirubted object 구분 없이 프로그램을 할 수 있는 unifed object 모델이 다음 3가지 근본적인 차이 때문에 성공하기 힘들다고 말하고 있습니다.&lt;br /&gt;&lt;br /&gt;1. latency&lt;br /&gt;&lt;br /&gt;local object와 달리 distributed object의 invocation은 network communication을 동반함으로 훨씬 느린데, 이를 사용자가 알 수가 없습니다.&lt;br /&gt;&lt;br /&gt;2. memory access&lt;br /&gt;&lt;br /&gt;local object를 access하기 위해 pointer를 사용하면, 이는 unifed object 모델을 위배 되는 것이고, 그렇다고 모든 pointer access를 remote object인 것처럼 다루면 local object의 경우 필요없는 성능 저하가 생깁니다.&lt;br /&gt;&lt;br /&gt;3. partial failure/concurrency&lt;br /&gt;&lt;br /&gt;local에서는 프로그램의 수행될 때 모든 게 deterministic한 반면에, distributed object는 network이나 다른 컴퓨터가 crash 되는 partial failure를 볼 수 있습니다. 그리고 network이 끊어졌을 때 network 문제인지 다른 문제인지를 명확하게 집어낼 수 있는 방법도 없습니다. 따라서 이런 종류의 failure를 처리하기 위해서는 다른 인터페이스가 필요한데, distributed object만 다른 메커니즘을 제공하면 unifed object 모델에 위배되고, local object도 이런 메커니즘 통합해 제공하면 필요 없는 오버헤드가 생기게 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;결론을 이야기하면, reliability 문제는 interface와 별개로 implementation만 잘해서 해결할 수 있는 것이 아니라는 겁니다. interface 자체가 어떤 error를 발생할 수 있는지 명확히 표시를 해주어야만, 이를 사용하는 프로그래머가 이를 반영하며 안정적인 소프트웨어를 만들 수 있다는 것이죠.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113277200514131507?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113277200514131507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113277200514131507' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113277200514131507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113277200514131507'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/11/note-on-distributed-computing.html' title='A Note On Distributed Computing'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113192246363704720</id><published>2005-11-13T17:53:00.000-05:00</published><updated>2005-12-02T17:41:25.306-05:00</updated><title type='text'>Java theory and practice</title><content type='html'>&lt;a href="http://www-128.ibm.com/developerworks/views/java/libraryview.jsp?search_by=practice:"&gt;Java theory and practice &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a place where Brian Goetz talks about the new features and concepts in Java. He is the coauthor of the cool cocurrency book, "&lt;a href="http://www.amazon.com/gp/product/0321349601/qid=1133563155/sr=8-1/ref=pd_bbs_1/002-6511975-7776029?n=507846&amp;s=books&amp;v=glance"&gt;Java Concurrency in Practice&lt;/a&gt;"  I found myself multithreading and JVM stuffs are more interesting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113192246363704720?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113192246363704720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113192246363704720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113192246363704720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113192246363704720'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/11/java-theory-and-practice.html' title='Java theory and practice'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113192169800709058</id><published>2005-11-13T17:37:00.000-05:00</published><updated>2005-11-13T17:41:38.020-05:00</updated><title type='text'></title><content type='html'>&lt;a href="http://blogs.sun.com/roller/page/dagastine?entry=java_synchronization_optimizations_in_mustang"&gt;David Dagastine's blog: Java Synchronization Optimizations&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www-128.ibm.com/developerworks/java/library/j-jtp10185/"&gt;Java theory and practice: Synchronization optimizations in Mustang&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Compiler가 Synchroniztion과 관련해서 수행할 수 있는 최적화 방법을 설명하고 있는 글들이다. 자바 6 무스탕에 적용된다고 하는데, Escape Analysis를 통해서 Thin Lock까지 없애버리는 Lock Elison이 인상적이다. &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Lock elison&lt;br /&gt;&lt;li&gt;Adaptive locking&lt;br /&gt;&lt;li&gt;Lock coarsening&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113192169800709058?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113192169800709058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113192169800709058' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113192169800709058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113192169800709058'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/11/david-dagastines-blog-java.html' title=''/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-113071509059743654</id><published>2005-10-30T18:28:00.000-05:00</published><updated>2005-10-30T18:31:30.610-05:00</updated><title type='text'>Studying computer science</title><content type='html'>Recently I need to separate my time into "studying computer science" and programming. Once I start programming, I can't stop. I seldom read papers and textbooks while I am coding. &lt;br /&gt;&lt;br /&gt;To balanace the theoritical understanding and practical skills, I will spend Mon/Wed/Fri studying computer sciecne and programming on ther other days.&lt;br /&gt;&lt;br /&gt;:)&lt;br /&gt;&lt;br /&gt;Good luck to me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-113071509059743654?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/113071509059743654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=113071509059743654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113071509059743654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/113071509059743654'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/10/studying-computer-science.html' title='Studying computer science'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-112992788682447668</id><published>2005-10-21T16:51:00.000-04:00</published><updated>2005-10-21T16:51:26.830-04:00</updated><title type='text'>Programming Language Research Reading List</title><content type='html'># Aho, Sethi, Ullman, Compilers: Principles, Techniques, and Tools&lt;br /&gt;# Appel, Compiling with Continuations.&lt;br /&gt;# Barendregt, Lambda Calculi with Types (web download).&lt;br /&gt;# Clarke, Grumberg, and Peled, Model Checking.&lt;br /&gt;# Gries, The Science of Programming.&lt;br /&gt;# Hankin, Lambda Calculi: A Guide for Computer Scientists. (Out of print, but available at the library.)&lt;br /&gt;# Huth and Ryan, Logic in Computer Science: Modelling and Reasoning about Systems (Note: new version coming our real soon now)&lt;br /&gt;# Mitchell, Foundations for Programming Languages.&lt;br /&gt;# Muchnick, Advanced Compiler Design and Implementation.&lt;br /&gt;# Nielson and Nielson, Semantics with Applications: A Formal Introduction (web download).&lt;br /&gt;# Nielson, Nielson, and Hankin, Principles of Program Analysis.&lt;br /&gt;# Pierce, Types and Programming Languages.&lt;br /&gt;# Winskel, The Formal Semantics of Programming Languages. (Out of print, but available at the library.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-112992788682447668?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/112992788682447668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=112992788682447668' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112992788682447668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112992788682447668'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/10/programming-language-research-reading.html' title='Programming Language Research Reading List'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-112967931629709000</id><published>2005-10-18T19:46:00.000-04:00</published><updated>2005-11-13T18:05:16.570-05:00</updated><title type='text'>Null Object Pattern</title><content type='html'>From CMSC433 lecture note,&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Anytime you have an field that could be null, and you find yourself&lt;br /&gt;inserting a lot of checks to see if that field is null, consider&lt;br /&gt;whether it makes sense to have define a special singleton null object,&lt;br /&gt;and use a reference to the null object rather than a null reference.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;public class LinkedListWithNullObject&lt;E&gt; {&lt;br /&gt; interface Node&lt;E2&gt; {&lt;br /&gt;  boolean stopSearchHere(Object e);&lt;br /&gt;  Node&lt;E2&gt; tail();&lt;br /&gt;  E2 data();&lt;br /&gt; }&lt;br /&gt; static class NonEmptyNode&lt;E2&gt;  implements Node&lt;E2&gt;{&lt;br /&gt;  NonEmptyNode(E2 d, Node&lt;E2&gt; n) {&lt;br /&gt;   data = d;&lt;br /&gt;   next = n;&lt;br /&gt;  }&lt;br /&gt;  E2 data;&lt;br /&gt;  Node&lt;E2&gt; next;&lt;br /&gt;  public boolean stopSearchHere(Object e) {&lt;br /&gt;   return data.equals(e);&lt;br /&gt;  }&lt;br /&gt;  public Node&lt;E2&gt; tail() {&lt;br /&gt;   return next;&lt;br /&gt;  }&lt;br /&gt;  public E2 data() {&lt;br /&gt;   return data;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; static class EmptyNode&lt;E2&gt;  implements Node&lt;E2&gt;{&lt;br /&gt;  E2 data;&lt;br /&gt;  Node&lt;E2&gt; next;&lt;br /&gt;  public boolean stopSearchHere(Object e) {&lt;br /&gt;   return true;&lt;br /&gt;  }&lt;br /&gt;  public Node&lt;E2&gt; tail() {&lt;br /&gt;   return this;&lt;br /&gt;  }&lt;br /&gt;  public E2 data() {&lt;br /&gt;   return null;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; Node&lt;E&gt; head = new EmptyNode&lt;E&gt;();&lt;br /&gt; &lt;br /&gt; public void insert(E e) {&lt;br /&gt;  Node&lt;E&gt; n = new NonEmptyNode&lt;E&gt;(e, head);&lt;br /&gt;  head = n;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public boolean contains(Object e) {&lt;br /&gt;  Node&lt;E&gt; n = head;&lt;br /&gt;  while (!n.stopSearchHere(e)) {&lt;br /&gt;   n = n.tail();&lt;br /&gt;  }&lt;br /&gt;  return n instanceof NonEmptyNode;&lt;br /&gt; }&lt;br /&gt; public E removeHead() {&lt;br /&gt;  Node&lt;E&gt; n = head;&lt;br /&gt;  head = n.tail();&lt;br /&gt;  return n.data();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-112967931629709000?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/112967931629709000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=112967931629709000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112967931629709000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112967931629709000'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/10/null-object-pattern.html' title='Null Object Pattern'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-112967549607595681</id><published>2005-10-18T18:39:00.000-04:00</published><updated>2005-10-18T18:45:55.573-04:00</updated><title type='text'>My new project: Mono project</title><content type='html'>I'm currently taking the class, "&lt;a href="http://www.cs.umd.edu/class/fall2005/cmsc433/"&gt;Programming Language Technologies and Paradigms&lt;/a&gt;". The goal of this class is to make students get accustomed to the development of big software. It covers the followings:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Design Pattern&lt;br /&gt;&lt;li&gt;Concurrency&lt;br /&gt;&lt;li&gt;Open Source Project&lt;br /&gt;&lt;/ul&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;One of the requirements is to make a contribution to one of exisiting open source. The open source project must be large. Students can patch bugs, implement new features and add functionalities. &lt;br /&gt;&lt;br /&gt;I've finally selected a project: the &lt;strong&gt;Mono project&lt;/strong&gt;. Mono project is to develop an implementation of Microsoft .NET CLR and compilers. Because I've maintained JVM for more than two years, I guess I can contribute. Keep your fingers crossed for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-112967549607595681?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/112967549607595681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=112967549607595681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112967549607595681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112967549607595681'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/10/my-new-project-mono-project.html' title='My new project: Mono project'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-112967509314506015</id><published>2005-10-18T18:34:00.000-04:00</published><updated>2005-10-18T18:38:13.150-04:00</updated><title type='text'>Decreasing CS graduate students</title><content type='html'>A recent news, &lt;a href="http://news.com.com/Gates+goes+to+college/2008-7345_3-5167499.html?tag=nl"&gt;Gates goes to college&lt;/a&gt; talks a lot about the future of computer sciecne graduates.&lt;br /&gt;&lt;br /&gt;Gates goes to college to encourage students to major in computer sciecne. When somebody encourages to do something, it means it is not desirable and people are avoiding it. What's the problem? After the dotcom buble in 1999, is there no hope for IT industry?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-112967509314506015?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/112967509314506015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=112967509314506015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112967509314506015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112967509314506015'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/10/decreasing-cs-graduate-students.html' title='Decreasing CS graduate students'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-112966039443281088</id><published>2005-10-18T14:28:00.000-04:00</published><updated>2005-10-18T14:33:14.433-04:00</updated><title type='text'>Execution Environments for Building Dependable Systems</title><content type='html'>Sun Microsystem has made significant changes to Java, while they have tried not to touch their JVM specification. Even though the JVM is not an ideal solution for Java, they don't seem to pay much attention to the runtime. It is partly because they want old Java programs to run on new JVM. &lt;br /&gt;&lt;br /&gt;I think it's time to think about the future of the Managed Runtime Environments such as JVM and CLR of Microsoft.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Abstract:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Managed Runtime Environments (MREs) (aka virtual execution environments or simply runtime systems) have evolved in functionality and complexity for over 40 years. MREs, such as the JVM and CLI, have absorbed functionality once only available from the operating system, and at the same time MREs support diverse and highly dynamic&lt;br /&gt;application configurations. While current MREs are clearly effective for many applications, opportunities remain to improve their design and broaden their applicability. In my talk, I focus on current issues with runtime systems and consider where hardware and software trends are likely to take these systems in the future. I consider MREs from the perspectives of performance, reliability, and ease of use, drawing on published experiences from both the CLI and Java communities. These experiences suggest important design directions for future MREs, including ways to improve support for modularity, error handling, concurrency, and componentization. One of the important future challenges for MREs is to demonstrate that they are up to the task of implementing the lowest-level system software, a&lt;br /&gt;domain where they are needed. The Bartok and Singularity projects, at Microsoft Research, are investigating this challenging problem.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Speaker Bio:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Ben Zorn is a Senior Researcher leading the Software Design and Implementation Group in Microsoft Research. After receiving a PhD in Computer Science from UC Berkeley in 1989, he served eight years on the Computer Science faculty at the University of Colorado in Boulder, receiving tenure and being promoted to Associate Professor in 1996. He left the University of Colorado in 1998 to become a Senior Researcher at Microsoft Research, where he currently works. Dr. Zorn's research interests include programming language design and implementation and performance measurement and analysis. He also serves as an Associate Editor of the ACM journal Transactions on&lt;br /&gt;Programming Languages and Systems and the ACM journal Transactions on Architecture and Code Optimization.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://research.microsoft.com/~zorn/"&gt;http://research.microsoft.com/~zorn/&lt;/a&gt;&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-112966039443281088?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/112966039443281088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=112966039443281088' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112966039443281088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112966039443281088'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/10/execution-environments-for-building.html' title='Execution Environments for Building Dependable Systems'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-112965991764508221</id><published>2005-10-18T14:10:00.000-04:00</published><updated>2005-10-18T14:25:17.656-04:00</updated><title type='text'>Building an OS from scratch</title><content type='html'>After I read many articles from developers' blogs, I've got to know that many people just want to make thier own operating systems from scratch. I understand the reason pretty well because operating systems are the fundamental component of modern software. However, they are dominated by large software vendors such as Microsoft, Sun and HP. Even the open source project, Linux is too hugh for a single developer to access.&lt;br /&gt;&lt;br /&gt;Some programmers try to make a tiny operating system for themselves. This is good because they can learn a lot from making an OS by understanding the interaction between software and hardward/between the kernal and applications.&lt;br /&gt;&lt;br /&gt;What I just want is that developers who wish to make an OS should pay attention to why they want to make a brand-new OS. Do they have a new idea to incorporate into the operating system? If there's no single difference from the exisiting operating systems, though you still can learn from it much, other people can't learn anything from your project.&lt;br /&gt;&lt;br /&gt;Add some research idea in your OS project. For example, try to blur the distiction between the kernel and applications like &lt;a href="http://www.cs.washington.edu/research/projects/spin/www/"&gt;SPIN&lt;/a&gt;. Or try to make a single-address-space OS. Or you can use a high-level language such as ML to build most part of operating system. Then many people will be interested in your project and you can learn more from it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-112965991764508221?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/112965991764508221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=112965991764508221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112965991764508221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112965991764508221'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/10/building-os-from-scratch.html' title='Building an OS from scratch'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-112959292059299026</id><published>2005-10-17T19:47:00.000-04:00</published><updated>2005-10-17T19:48:40.596-04:00</updated><title type='text'>English Writing with Google</title><content type='html'>Google is one of the most interesting tool people have ever invented. People enter a search keyword and can look up a ride range of information in a second, which makes many people enthusiastic about Google. However, searching, what Google provides, is not a brand new idea. People usually have looked up a yellow page when they need a phone number. Similarly, maps have been used when people are lost in a strange place. Google just has broadened the category of what you can look up, so now you can find virtually everything you want in the Internet. One interesting extended usage of Google is using it for correct writing. In this essay, we are going to present a new method on how to utilize Google to write a correct English essay.&lt;br /&gt;&lt;br /&gt;When you go to Google site, you can see a simple Google logo and you type in a search keyword and click on “Google Search” button. Then Google shows you the search results according to their relative importance. For example, when you enter POSTECH, it displays &lt;a href="http://www.postech.ac.kr"&gt;POSTECH &lt;/a&gt; on the top and a long tail of other web sites related to POSTECH. An important point here is that you can not only find the web site you want but also know that there exists an institution named POSTECH.&lt;br /&gt;&lt;br /&gt;This simple principle also applies to English phrases and expressions. When you type in “pay attention,” Google presents you various living examples of the expression, pay attention.” It indicates that there are 6,300,000 examples which use “pay attention.” You can infer from this large number of results that it is a very common expression. On the other hand, if you enter “pay attentions” instead of “pay attention,” there are only 3,820 search results. The big difference between these two results leads us to conclude that “pay attention” is an idiomatic expression which is mostly used with a singular form. &lt;br /&gt;&lt;br /&gt;Be careful not to omit double quotation marks when you do a phrase search. Double quotation marks represent that we only want exact matches. Google usually removes articles and prepositions because they are so common that they don’t help find useful information in usual cases. In the same context, Google sometimes ignores the difference between singular and plural nouns and it groups different tenses of verbs to form actual keywords. However, what we want to search is related English grammar, so articles and prepositions are very important at this time. If we don’t want that information to be lost, we have to be sure that we use double quotation marks around our search keywords.&lt;br /&gt;&lt;br /&gt;Unfortunately, there is a problem. When your sentence is too specific, you may find your search result is too small to justify that your sentence is correct. For example, if you wonder which sentence is correct between “It sounds very nice, isn't it?" and “It sounds very nice, doesn’t it?” you may ask Google. The Google results are disappointing this time because 17 vs. 4 are dubious. You can’t conclude that the first one is correct because the ratio is not enough to be safe.&lt;br /&gt;&lt;br /&gt;You can use the asterisk sign here [1]. Try “It sounds * *, isn’t it?” and “It sounds * *, doesn’t it?” instead. The results are now 13,400 and 333. Now you can be sure that the question tag, “doesn’t it” is correct in this case. In this way, you can extend the power of Google to answer grammar questions. Try other queries like “If I am a bird” vs. “If I were a bird.” You may find that Google is even better than English grammar books because it gives you thousands of real-world examples.&lt;br /&gt;&lt;br /&gt;Asterisk sign also can be used to look up useful adjectives and adverbs. You sometimes write a boring sentence “English writing is a creative job.” After you write down this sentence, you want to add an adverb in front of “creative job.” Try “a * creative job” on Google. Then Google will bring you an adverb, “highly” in this case.&lt;br /&gt;&lt;br /&gt;In addition, when you write an essay, you often need to look up the definitions of words which you are not familiar with. For example, suppose you have heard of the term, “Green House Effect,” but you don’t know what it really is. An English dictionary gives you the definition, “The greenhouse effect is the problem caused by increased quantities of gases such as carbon dioxide in the air.” Most people would think it is not sufficient to understand the phenomenon. Use Google instead of your old dictionary. Google has a feature called “WHAT IS.” Type in “What is the green house effect” on Google. Google presents you every definition of the green house effect on the web. It also gives you a long tail of related web sites, so you can look up further information.&lt;br /&gt;&lt;br /&gt;Finally, Google provides a spell check feature [2]. Many people made mistakes when they enter their search keywords, some mistakes are just typos and others are difficult words which people often misspell. For instance, try “schoool” on Google, Google immediately recommends using the correct word, “school.” Similarly, if you type in “consciuos mind,” Google suggests you “conscious mind” in “Did you mean … section.” Google is more powerful than most word processors which provide spell check features because Google’s spell checker is based on people’s actual mistakes and learns from those ones. &lt;br /&gt;&lt;br /&gt;Until now, we have inspected various features of Google which help write a correct English essay. To summarize, we can ask grammar questions on Google and we can look up a lot of useful expressions using asterisk sign, and we can find definitions of words and check correct spells. Google is better than English dictionaries because it provides every-day examples of English. It provides you the search results with the number of matching pages. So you can safely conclude that some expressions are common because they are widely used in the Internet. Though English writing is a highly creative job, an automatic tool, Google can help improve the quality of writing. Don’t forget to visit Google when you begin to write something.&lt;br /&gt;&lt;br /&gt;References&lt;br /&gt;[1] Learn English with Google [http://www.english.hb.pl/articles/tips/google/]&lt;br /&gt;[2] Advanced Google Search Operators&lt;br /&gt;[http://www.googleguide.com/advanced_operators.html]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-112959292059299026?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/112959292059299026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=112959292059299026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112959292059299026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112959292059299026'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/10/english-writing-with-google.html' title='English Writing with Google'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-112959272184757196</id><published>2005-10-17T19:38:00.000-04:00</published><updated>2005-10-17T19:45:21.856-04:00</updated><title type='text'>Jester: A Mutation Testing Tool</title><content type='html'>&lt;em&gt;Jester finds code that is not covered by tests. Jester makes some change to your code, runs your tests, and if the tests pass Jester displays a message saying what it changed. Jester includes a script for generating web pages that show the changes made that did not cause the tests to fail. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;The mutation test is one of the test framework originated from eXtreme Programming community. Mutation testing tools mutate code and retest the test cases and check if the test cases fail in mutated code. It assumes that test cases must fail when the original code is mutated. If not, there might be problems in test cases themselves.&lt;br /&gt; &lt;br /&gt;The open source project, Jester is one of mutation testing tools. It targets the Java and JUnit testing framework. You can check the motto of Jester in its homepage: &lt;strong&gt;A tester for testers&lt;/strong&gt;. It provides a way to check if the test cases are well written. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.xpdeveloper.com/xpdwiki/Wiki.jsp?page=MutationTestingTools"&gt;Other nutation testing tools&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-112959272184757196?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/112959272184757196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=112959272184757196' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112959272184757196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112959272184757196'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/10/jester-mutation-testing-tool.html' title='Jester: A Mutation Testing Tool'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-112958743329174212</id><published>2005-10-17T18:12:00.000-04:00</published><updated>2005-10-17T18:17:13.293-04:00</updated><title type='text'>The Single Responsibility Principle</title><content type='html'>&lt;a href="http://www.objectmentor.com/resources/articles/srp"&gt;"The Single Responsibility Principle"&lt;/a&gt; is an article about OO design pricniples.&lt;br /&gt;&lt;br /&gt;In conclusion, &lt;strong&gt;one class should not have more than one reason to be modified&lt;/strong&gt;. If you have distinct reasons why you need to modify a single class, it means you have failed to cleanly separate the responsibility among classes. In other word, it is tightly coupled.&lt;br /&gt;&lt;br /&gt;Every OO design principle and design pattern emphasizes the change! How to cope with changes is the main theme of OO design principles.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-112958743329174212?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/112958743329174212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=112958743329174212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112958743329174212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112958743329174212'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/10/single-responsibility-principle.html' title='The Single Responsibility Principle'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-112958688979437421</id><published>2005-10-17T17:58:00.000-04:00</published><updated>2005-10-17T18:10:13.056-04:00</updated><title type='text'>Data races due to compiler instruction reorderings</title><content type='html'>Let's assume there exists the following code,&lt;br /&gt;&lt;table&gt;&lt;tr colspan=2&gt;&lt;td&gt;&lt;br /&gt;int x, y, r1, r2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;Thread 1&lt;br /&gt;x = 1&lt;br /&gt;r1 = y&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;br /&gt;Thread 2&lt;br /&gt;y = 1&lt;br /&gt;r2 = x&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Can you guess the results of execution without a proper synchronization? What are the possible values of r1 and r2?&lt;br /&gt;&lt;br /&gt;You may conclude that r1 and r2 can be 0 and 1, but not both are zero. However, if you compile the code with a optimizing compiler and you may be able to see the result: r1 and r2 are both 0. What happened here?&lt;br /&gt;&lt;br /&gt;In fact, optimizing compilers usually change the order of instructions when the change doesn't affect the memory consistency. When you see x = 1 and r1 = y, the variables(x, r1, y) have nothing to do with each other, so that a compiler can change the order and executes it with r1 = y and then x = 1.&lt;br /&gt;&lt;br /&gt;Consequentially, some idioms like double-check fails in instruction reordering compilers because you can't be sure which instruction is executed first. Be careful and use synchronization when the ordering must be enforced.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-112958688979437421?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/112958688979437421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=112958688979437421' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112958688979437421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112958688979437421'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/10/data-races-due-to-compiler-instruction.html' title='Data races due to compiler instruction reorderings'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-112958591239268103</id><published>2005-10-17T17:47:00.000-04:00</published><updated>2005-10-17T17:51:52.393-04:00</updated><title type='text'>Witness: A Lock Order Verifier</title><content type='html'>In BSDCon2002 conference, there is a paper, "&lt;a href="http://www.usenix.org/publications/library/proceedings/bsdcon02/full_papers/baldwin/baldwin.pdf"&gt;Locking in the Multithreaded FreeBSD Kernel&lt;/a&gt;."&lt;br /&gt;&lt;br /&gt;The most interesting tool is Witness mentioned in section 7.2. It is called a &lt;strong&gt;lock order verifier&lt;/strong&gt;. In principle, it records the order of lock acquisitions in runtime and use that records to warn programmers that it may cause deadlocks when other threads do not follow the lock order.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-112958591239268103?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/112958591239268103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=112958591239268103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112958591239268103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112958591239268103'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/10/witness-lock-order-verifier.html' title='Witness: A Lock Order Verifier'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-112958555653810023</id><published>2005-10-17T17:41:00.000-04:00</published><updated>2005-10-17T17:45:56.540-04:00</updated><title type='text'>A dynamic data race detector: checkSync</title><content type='html'>There is a software project called "&lt;strong&gt;checkSync&lt;/strong&gt;." It is based on a paper "&lt;a href="http://www.cs.ucsd.edu/~savage/papers/Sosp97.pdf"&gt;Eraser: A Dynamic Data Race Detector for Multithreaded Programs&lt;/a&gt;". To make it short, it collects lock sets of shared Java class fields in runtime and try to find data races dynamically. &lt;br /&gt;&lt;br /&gt;Because it is a dynamic analysis tool, it doesn't provide the completeness. However, it is quite useful to find data races if we take it into consideration that concurrency bugs such as deadlock and race conditions seldomy occurs and it is hard to find them with test cases.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-112958555653810023?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/112958555653810023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=112958555653810023' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112958555653810023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112958555653810023'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/10/dynamic-data-race-detector-checksync.html' title='A dynamic data race detector: checkSync'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8894680.post-112958512226352904</id><published>2005-10-17T17:32:00.000-04:00</published><updated>2005-10-17T17:40:28.806-04:00</updated><title type='text'>Synchroniation</title><content type='html'>Many developers think that synchronization is the same thing as mutual exclusion. However, syncrhonization is more than mutex. It has the following three characteristics,&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;strong&gt;&lt;li&gt;Atomicity&lt;br /&gt;&lt;br /&gt;&lt;item&gt;&lt;li&gt;Visibility&lt;br /&gt;&lt;br /&gt;&lt;item&gt;&lt;li&gt;Ordering&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Atomicity ensures only one thread can execute in its critical region, so that it prevents multiple threads from running concurrently in critical sections and may corrupt the data structures.&lt;br /&gt;&lt;br /&gt;Synchronization also provides the memory consistency. If thread A releases the lock M and thread B acquires the lock M, syncrhonization guarantees that thread B can see the memory operations done by thread A. &lt;br /&gt; &lt;br /&gt;Finally, ordering prevents compilers from reordering the instructions which leads to memory inconsistency between thread A and B. &lt;br /&gt;&lt;br /&gt;Volatile fields in Java's new memory model seem to satisfy the visibility, but it can never replace the full featured syncrhonization anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8894680-112958512226352904?l=kyseo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kyseo.blogspot.com/feeds/112958512226352904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8894680&amp;postID=112958512226352904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112958512226352904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8894680/posts/default/112958512226352904'/><link rel='alternate' type='text/html' href='http://kyseo.blogspot.com/2005/10/synchroniation.html' title='Synchroniation'/><author><name>Kwangyul Seo</name><uri>http://www.blogger.com/profile/02844377704205312429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/hello/196/8941/640/002.jpg'/></author><thr:total>0</thr:total></entry></feed>
