<?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-2012795753603994003</id><updated>2012-02-17T14:23:06.104+08:00</updated><category term='data type'/><category term='graphic'/><category term='datasource'/><category term='tools'/><category term='jdbc'/><category term='file operation'/><category term='c/c++'/><category term='javascript'/><category term='inline'/><category term='web'/><category term='3d'/><category term='bug'/><category term='groovyws'/><category term='development'/><category term='status'/><category term='tomcat'/><category term='gorm'/><category term='command'/><category term='http'/><category term='osx'/><category term='odbc'/><category term='act'/><category term='troubleshooting'/><category term='grails'/><category term='mac osx'/><category term='pthread'/><category term='iphone'/><category term='howtos'/><category term='python'/><category term='plugin'/><category term='wchar_t'/><category term='tips'/><category term='spring'/><category term='concept'/><category term='windows'/><category term='macro'/><category term='unicode'/><category term='thought'/><category term='endianess'/><category term='database'/><category term='prototype.js'/><category term='computer science'/><category term='hibernate'/><category term='scala'/><category term='transaction'/><category term='mysql'/><category term='java'/><category term='workaround'/><category term='english'/><category term='ajax'/><category term='programming'/><category term='multithreading'/><category term='aix'/><category term='metro'/><category term='language'/><category term='memory'/><category term='issue'/><category term='ie'/><category term='oracle'/><category term='tip'/><category term='life'/><category term='webservice'/><category term='jquery'/><category term='ui'/><category term='socket'/><category term='android'/><category term='integration'/><category term='tns'/><category term='terminal'/><category term='sql'/><category term='groovy'/><category term='trick'/><category term='ie6'/><category term='task'/><category term='administration'/><category term='project euler'/><category term='open gl'/><category term='network'/><category term='fix'/><category term='collections'/><category term='framework'/><category term='sas'/><category term='metadata'/><category term='password'/><category term='ftp'/><category term='json'/><category term='ide'/><category term='compiler'/><category term='porting'/><title type='text'>learning notes</title><subtitle type='html'>~ ccw's learning and thinking ~</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>76</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-3236883488808006505</id><published>2011-04-22T16:59:00.001+08:00</published><updated>2011-04-22T17:00:51.251+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='odbc'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='sas'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>SAS - Tip of Using SAS/Access to ODBC</title><content type='html'>Usually we will use below syntax to connect a ODBC data source as SAS library.&lt;br /&gt;&lt;pre class="brush:shell"&gt;LIBNAME sql_server ODBC DSN=TheSQLServer USER=sas PASSWORD=S@s123  SCHEMA=dbo;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But sometimes, especially while we are using SAS Enterprise Guide, it will not work and the system will report a ODBC driver not found error. To prevent this error from happening, we have to use the &lt;strong&gt;NOPROMPT&lt;/strong&gt; option to declare the connection string manually.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:shell"&gt;LIBNAME sql_server ODBC NOPROMPT="DRIVER=SQL SERVER NATIVE CLIENT 10.0;SERVER=theSQLServerHost;DATABASE=databaseName;uid=sas;pwd=S@s123;" SCHEMA=dbo;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-3236883488808006505?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/3236883488808006505/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=3236883488808006505' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3236883488808006505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3236883488808006505'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2011/04/sas-tip-of-using-sasaccess-to-odbc.html' title='SAS - Tip of Using SAS/Access to ODBC'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-7659789390438869580</id><published>2011-02-11T13:35:00.001+08:00</published><updated>2011-04-11T13:39:05.888+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metadata'/><category scheme='http://www.blogger.com/atom/ns#' term='act'/><category scheme='http://www.blogger.com/atom/ns#' term='sas'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='macro'/><title type='text'>SAS - Applying ACT to Objects</title><content type='html'>An example code for applying ACT to certain objects such like dataset and/or library.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:shell"&gt;%macro applyACT(objName, objType, actName, metaUser, metaPass, metaServer=localhost, metaPort=8561);&lt;br /&gt;&lt;br /&gt;options metauser="&amp;metaUser"&lt;br /&gt;              metapass="&amp;metaPass"&lt;br /&gt;              metaserver="&amp;metaServer"&lt;br /&gt;              metaport=&amp;metaPort&lt;br /&gt;              metarepository=Foundation;&lt;br /&gt;&lt;br /&gt;filename request temp ;&lt;br /&gt;filename response temp ;&lt;br /&gt;&lt;br /&gt;data _null_ ;&lt;br /&gt;   length type $32 t_uri act_uri ace_uri $ 17 line $ 100 ;&lt;br /&gt;   file request ;&lt;br /&gt;&lt;br /&gt;   line="omsobj:&amp;objType?@Name='&amp;objName'";&lt;br /&gt;   rc=metadata_resolve(line,type,t_uri) ;&lt;br /&gt;   &lt;br /&gt;   line="omsobj:AccessControlTemplate?@Name='&amp;actName'";&lt;br /&gt;   rc=metadata_resolve(line,type,act_uri) ;&lt;br /&gt;       &lt;br /&gt;    line="omsobj:AccessControlEntry?AccessControlEntry[/Objects/&amp;objType[@Name='&amp;objName']]";&lt;br /&gt;    rc=metadata_resolve(line,type,ace_uri) ;&lt;br /&gt;      &lt;br /&gt;    put "&lt;UpdateMetadata&gt;" ;&lt;br /&gt;    put "&lt;Metadata&gt;" ;&lt;br /&gt;&lt;br /&gt;    line="&lt;&amp;objType Id='"|| strip(t_uri)|| "' &gt;";&lt;br /&gt;    put line ;&lt;br /&gt;    put "&lt;AccessControls Function='Replace'&gt;" ;&lt;br /&gt;    line=cats("&lt;AccessControlTemplate ObjRef='"|| strip(act_uri)|| "' /&gt;") ;&lt;br /&gt;    put line ;&lt;br /&gt;    if strip(ace_uri) &lt;&gt; '' then&lt;br /&gt;        do;&lt;br /&gt;            line=cats("&lt;AccessControlEntry ObjRef='"|| strip(ace_uri)|| "' /&gt;") ;&lt;br /&gt;           put line ;&lt;br /&gt;        end;&lt;br /&gt;    put "&lt;/AccessControls&gt;";&lt;br /&gt;    put "&lt;/&amp;objType&gt;" ;&lt;br /&gt;&lt;br /&gt;    if strip(ace_uri) &lt;&gt; '' then&lt;br /&gt;        do; &lt;br /&gt;            line=cats("&lt;AccessControlEntry Id='"|| strip(ace_uri)|| "'&gt;") ;&lt;br /&gt;            put line ;&lt;br /&gt;            line=cats("&lt;Permissions Function='Replace'/&gt;") ;&lt;br /&gt;            put line ;&lt;br /&gt;            line=cats("&lt;Identities Function='Replace'/&gt;") ;&lt;br /&gt;            put line ;&lt;br /&gt;            line=cats("&lt;/AccessControlEntry&gt;") ;&lt;br /&gt;            put line ;&lt;br /&gt; end;&lt;br /&gt;         &lt;br /&gt;    /* uncomment below for SAS 9.1.3 */&lt;br /&gt;    * put "&lt;DeletedObjects/&gt;" ;&lt;br /&gt;    put "&lt;/Metadata&gt;" ;&lt;br /&gt; &lt;br /&gt;    /* uncomment below for SAS 9.1.3 */&lt;br /&gt;    * put "&lt;ReposId&gt;$METAREPOSITORY&lt;/ReposId&gt;" ;&lt;br /&gt;    put "&lt;NS&gt;SAS&lt;/NS&gt;" ;&lt;br /&gt;    put "&lt;Flags&gt;402654208&lt;/Flags&gt;" ;&lt;br /&gt;    put "&lt;Options/&gt;" ;&lt;br /&gt;    put "&lt;/UpdateMetadata&gt;" ;&lt;br /&gt;run ;&lt;br /&gt;&lt;br /&gt;proc metadata verbose header=full&lt;br /&gt;    in=request&lt;br /&gt;    out=response ;&lt;br /&gt;run ;&lt;br /&gt;&lt;br /&gt;%mend;&lt;br /&gt;&lt;br /&gt;/* to apply ACT [TestACT] to Lib [TestLib] */&lt;br /&gt;%applyACT(TestLib, SASLibrary, Test_ACT, sasadm, sasadm);&lt;br /&gt;&lt;br /&gt;/* to apply ACT [TestACT] to Dataset [TestTable] */&lt;br /&gt;%applyACT(TestTable, PhysicalTable, Test_ACT, sasadm, sasadm);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-7659789390438869580?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/7659789390438869580/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=7659789390438869580' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7659789390438869580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7659789390438869580'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2011/02/sas-applying-act-to-objects.html' title='SAS - Applying ACT to Objects'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-2369030310632906275</id><published>2010-12-30T16:59:00.000+08:00</published><updated>2010-12-30T16:59:31.836+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='sas'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy - Sample Code of Modifying SAS SPK package</title><content type='html'>&lt;pre class="brush:groovy" title="Extract, Modify and Archive"&gt;def ant = new AntBuilder(); &lt;br /&gt;&lt;br /&gt;def path = 'C:\\Temp\\Test'&lt;br /&gt;def orig = "${path}\\Orig"&lt;br /&gt;def chng = "${path}\\Chng"&lt;br /&gt;def tmpf = "${path}\\Temp"&lt;br /&gt;def datf = "${path}\\Data"&lt;br /&gt;&lt;br /&gt;def mappings = [:]&lt;br /&gt;new File("${datf}\\table.csv").withReader { r -&gt;&lt;br /&gt;    def data = r.readLine()&lt;br /&gt;    while (data != null) {&lt;br /&gt;        def tdata = data.split(',')&lt;br /&gt;        mappings[tdata[1]] = tdata[2]&lt;br /&gt;        data = r.readLine()&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ant.delete(file: chng)&lt;br /&gt;ant.mkdir(dir: chng)&lt;br /&gt;&lt;br /&gt;ant.delete(file: tmpf)&lt;br /&gt;ant.mkdir(dir: tmpf)&lt;br /&gt;&lt;br /&gt;def pfolder = new File(orig)&lt;br /&gt;pfolder.eachFile { theFile -&gt;&lt;br /&gt;  &lt;br /&gt;  def tempFolder = "${tmpf}\\${theFile.name}"&lt;br /&gt;  &lt;br /&gt;  ant.mkdir(dir: tempFolder)&lt;br /&gt;  ant.unzip(src: theFile.path, dest: tempFolder,  overwrite:"true")&lt;br /&gt;&lt;br /&gt;  ant.move(file: "${tempFolder}\\MetadataExport.xml", tofile: "${tempFolder}\\MetadataExport_old.xml")&lt;br /&gt;&lt;br /&gt;  def mf = new File("${tempFolder}\\MetadataExport_old.xml")&lt;br /&gt;  def mfn = new File("${tempFolder}\\MetadataExport.xml")&lt;br /&gt;&lt;br /&gt;  mfn.withWriter('UTF-8') { o -&gt;&lt;br /&gt;    mf.withReader('UTF-8') { r -&gt;&lt;br /&gt;      def temp = r.readLine()&lt;br /&gt;      while (temp != null) {&lt;br /&gt;        temp = temp.replaceAll(/PhysicalTable[ ]Id=\"[0-9A-Z]{8}\.[0-9A-Z]{8}\"/, { &lt;br /&gt;            def tt = it.substring(18, 35)            &lt;br /&gt;            println tt&lt;br /&gt;            return "PhysicalTable Id=\"${mappings[tt]}"&lt;br /&gt;        })&lt;br /&gt;        temp = temp.replaceAll(/\!SAS[A-Z]{3}+/, { return it + '2'})&lt;br /&gt;        temp = temp.replaceAll(/[A-Za-z]+[ ]Lib/, { return it + ' CI'})&lt;br /&gt;        temp = temp.replaceAll(/SASMain/, { return it + ' CI'})&lt;br /&gt;        temp = temp.replaceAll(/SAS Data Integration Studio Custom Tree/, { return 'CI Project'})&lt;br /&gt;        o.write(temp + '\n')&lt;br /&gt;        temp = r.readLine()&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  ant.delete(file: "${tempFolder}\\MetadataExport_old.xml")&lt;br /&gt;  ant.zip(destfile: "${chng}\\${theFile.name}", basedir: "${tempFolder}")&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-2369030310632906275?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/2369030310632906275/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=2369030310632906275' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2369030310632906275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2369030310632906275'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/12/groovy-sample-code-of-modifying-sas-spk.html' title='Groovy - Sample Code of Modifying SAS SPK package'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-3846610051885333576</id><published>2010-10-27T17:23:00.001+08:00</published><updated>2010-11-02T12:38:41.917+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thought'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='computer science'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Thought - My Next Major Programming Language</title><content type='html'>I have been using Java as my major programming language for a decade (partially for work, partially for personal interest.) And now, I think it should be the time to pick up an alternative to "repowering" my passion as well as to extend my career if any.&lt;br /&gt;&lt;br /&gt;The criteria to choose the language are only a few; mainly it must be interesting to learn and the underlying design principles have to fit my personal taste. Second, it should be good at solving at least one kind of domain problems. And finally, it will be nice if it is a platform independent language or a platform-crossing language. JVM only languages are not considered so far (though I really like the syntax design of Groovy), because it is more like to use another kind of Java in a degree.&lt;br /&gt;&lt;br /&gt;Here comes some candidates:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;JavaScript/HTML5&lt;/b&gt; - the keys of Web.&lt;br /&gt;&lt;b&gt;Objective-C&lt;/b&gt; - quite attracting because it is the native language of iOS platform.&lt;br /&gt;&lt;b&gt;Ruby&lt;/b&gt; - the fundamental of the Web development rock star framework.  &lt;br /&gt;&lt;b&gt;Smalltalk&lt;/b&gt; - seems fun to learn.&lt;br /&gt;&lt;b&gt;Perl&lt;/b&gt; - useful and powerful.&lt;br /&gt;&lt;b&gt;Python&lt;/b&gt; - seems an elegant language.&lt;br /&gt;&lt;b&gt;C&lt;/b&gt; - persistence and everywhere.&lt;br /&gt;&lt;b&gt;Clojure&lt;/b&gt; - kinda curious.&lt;br /&gt;&lt;b&gt;Go&lt;/b&gt; - does it really the real "next C"?&lt;br /&gt;&lt;b&gt;ActionScript&lt;/b&gt; - just in case...&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/2012795753603994003-3846610051885333576?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/3846610051885333576/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=3846610051885333576' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3846610051885333576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3846610051885333576'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/10/thought-my-next-major-programming.html' title='Thought - My Next Major Programming Language'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-1535847159843273600</id><published>2010-09-07T23:40:00.004+08:00</published><updated>2010-09-08T12:28:54.214+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='integration'/><category scheme='http://www.blogger.com/atom/ns#' term='sas'/><category scheme='http://www.blogger.com/atom/ns#' term='jdbc'/><title type='text'>SAS - IOM JDBC Driver Data Type Mapping</title><content type='html'>Seems like that there are only a few SQL data types supported in SAS 9.2 IOM JDBC driver. &lt;br /&gt;For example, only &lt;b&gt;CHAR&lt;/b&gt;, &lt;b&gt;CHARACTER&lt;/b&gt;, &lt;b&gt;VARCHAR&lt;/b&gt;, &lt;b&gt;INT&lt;/b&gt;, &lt;b&gt;INTEGER&lt;/b&gt;, &lt;b&gt;SMALLINT&lt;/b&gt;, &lt;b&gt;FLOAT&lt;/b&gt;, &lt;b&gt;DOUBLE&lt;/b&gt; and &lt;b&gt;DATETIME&lt;/b&gt; can be used in a table creation statement; therefore, the corresponding Java data types (mapped from previous SQL data types) are as well kinda lacking.  &lt;br /&gt;&lt;br /&gt;Following is the SQL/Java data type mapping table which is according to my recent test result:&lt;br /&gt;&lt;table&gt;&lt;thead&gt;&lt;tr style="background:gray;color:white;text-align:center; height: 30px;"&gt;&lt;td style="width:300px;"&gt;SQL Data Type&lt;/td&gt;&lt;td style="width:300px;"&gt;Java Data Type&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;  &lt;tbody&gt;&lt;tr style="background: #FFFFFF; text-align: center; height: 50px;"&gt;  &lt;td&gt;DATETIME&lt;/td&gt;&lt;td&gt;java.sql.Timestamp&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="background: #CFECEC; text-align: center; height: 50px;"&gt;  &lt;td&gt;INTEGER&lt;/td&gt;&lt;td&gt;java.lang.Integer&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="background: #FFFFFF; text-align: center; height: 50px;"&gt;  &lt;td&gt;CHAR, CHARACTER, VARCHAR&lt;/td&gt;&lt;td&gt;java.lang.String&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="background: #CFECEC; text-align: center; height: 50px;"&gt;  &lt;td&gt;INT, SMALLINT, FLOAT, DOUBLE&lt;/td&gt;&lt;td&gt;java.lang.Double&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;* I really don't know why &lt;b&gt;INT&lt;/b&gt; and &lt;b&gt;SMALLINT&lt;/b&gt; are mapped to Java Double, but they are!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-1535847159843273600?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/1535847159843273600/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=1535847159843273600' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/1535847159843273600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/1535847159843273600'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/09/sas-iom-jdbc-driver-data-type-mapping.html' title='SAS - IOM JDBC Driver Data Type Mapping'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-913759485373256237</id><published>2010-08-31T15:20:00.000+08:00</published><updated>2010-08-31T15:20:58.742+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webservice'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovyws'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy - Using GroovyWS as Web Service Client</title><content type='html'>It looks very simple to use &lt;a href="http://groovy.codehaus.org/GroovyWS"&gt;GroovyWS&lt;/a&gt;, but actually, in my case, it's somehow a little tricky to successfully use it.&lt;br /&gt;&lt;br /&gt;In the beginning, I always get a &lt;blockquote&gt;ClassCastException: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl cannot be cast to javax.xml.parsers.DocumentBuilderFactory&lt;/blockquote&gt;if I just simply declare groovyws module in my maven project dependencies. &lt;br /&gt;&lt;br /&gt;After googling awhile, I finally found &lt;a href="http://groovy.codehaus.org/Using+WSClient+in+Grails"&gt;this article&lt;/a&gt; and understood what's the cause of ClassCastException, and resulting to manually adjust the project dependencies to solve this problem.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml" title="Sample pom.xml"&gt;&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&gt;&lt;br /&gt;    &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;&lt;br /&gt;&lt;br /&gt;    &lt;groupId&gt;cc.ceks&lt;/groupId&gt;&lt;br /&gt;    &lt;artifactId&gt;autojmp&lt;/artifactId&gt;&lt;br /&gt;    &lt;version&gt;1.0&lt;/version&gt;&lt;br /&gt;    &lt;packaging&gt;jar&lt;/packaging&gt;&lt;br /&gt;&lt;br /&gt;    &lt;name&gt;autojmp&lt;/name&gt;&lt;br /&gt;    &lt;url&gt;http://ceks.cc&lt;/url&gt;&lt;br /&gt;&lt;br /&gt;    &lt;properties&gt;&lt;br /&gt;        &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;&lt;br /&gt;    &lt;/properties&gt;&lt;br /&gt;&lt;br /&gt;    &lt;dependencies&gt;&lt;br /&gt;        &lt;dependency&gt;&lt;br /&gt;            &lt;groupId&gt;junit&lt;/groupId&gt;&lt;br /&gt;            &lt;artifactId&gt;junit&lt;/artifactId&gt;&lt;br /&gt;            &lt;version&gt;3.8.1&lt;/version&gt;&lt;br /&gt;            &lt;scope&gt;test&lt;/scope&gt;&lt;br /&gt;        &lt;/dependency&gt;&lt;br /&gt;        &lt;dependency&gt;&lt;br /&gt;            &lt;groupId&gt;org.codehaus.groovy&lt;/groupId&gt;&lt;br /&gt;            &lt;artifactId&gt;groovy&lt;/artifactId&gt;&lt;br /&gt;            &lt;version&gt;1.8.0-beta-1&lt;/version&gt;&lt;br /&gt;        &lt;/dependency&gt;&lt;br /&gt;        &lt;dependency&gt;&lt;br /&gt;            &lt;groupId&gt;org.codehaus.groovy.modules&lt;/groupId&gt;&lt;br /&gt;            &lt;artifactId&gt;groovyws&lt;/artifactId&gt;&lt;br /&gt;            &lt;version&gt;0.5.2&lt;/version&gt;&lt;br /&gt;            &lt;exclusions&gt;&lt;br /&gt;                &lt;exclusion&gt;&lt;br /&gt;                    &lt;groupId&gt;xerces&lt;/groupId&gt;&lt;br /&gt;                    &lt;artifactId&gt;xercesImpl&lt;/artifactId&gt;&lt;br /&gt;                &lt;/exclusion&gt;&lt;br /&gt;                &lt;exclusion&gt;&lt;br /&gt;                    &lt;groupId&gt;xerces&lt;/groupId&gt;&lt;br /&gt;                    &lt;artifactId&gt;xmlParserAPIs&lt;/artifactId&gt;&lt;br /&gt;                &lt;/exclusion&gt;&lt;br /&gt;                &lt;exclusion&gt;&lt;br /&gt;                    &lt;groupId&gt;xml-apis&lt;/groupId&gt;&lt;br /&gt;                    &lt;artifactId&gt;xml-apis&lt;/artifactId&gt;&lt;br /&gt;                &lt;/exclusion&gt;&lt;br /&gt;                &lt;exclusion&gt;&lt;br /&gt;                    &lt;groupId&gt;xalan&lt;/groupId&gt;&lt;br /&gt;                    &lt;artifactId&gt;xalan&lt;/artifactId&gt;&lt;br /&gt;                &lt;/exclusion&gt;&lt;br /&gt;                &lt;exclusion&gt;&lt;br /&gt;                    &lt;groupId&gt;xalan&lt;/groupId&gt;&lt;br /&gt;                    &lt;artifactId&gt;serializer&lt;/artifactId&gt;&lt;br /&gt;                &lt;/exclusion&gt;&lt;br /&gt;                &lt;exclusion&gt;&lt;br /&gt;                    &lt;groupId&gt;org.apache.ws.commons.axiom&lt;/groupId&gt;&lt;br /&gt;                    &lt;artifactId&gt;axiom-impl&lt;/artifactId&gt;&lt;br /&gt;                &lt;/exclusion&gt;&lt;br /&gt;                &lt;exclusion&gt;&lt;br /&gt;                    &lt;groupId&gt;org.apache.ws.commons.axiom&lt;/groupId&gt;&lt;br /&gt;                    &lt;artifactId&gt;axiom-api&lt;/artifactId&gt;&lt;br /&gt;                &lt;/exclusion&gt;&lt;br /&gt;                &lt;exclusion&gt;&lt;br /&gt;                    &lt;groupId&gt;xom&lt;/groupId&gt;&lt;br /&gt;                    &lt;artifactId&gt;xom&lt;/artifactId&gt;&lt;br /&gt;                &lt;/exclusion&gt;&lt;br /&gt;            &lt;/exclusions&gt;&lt;br /&gt;        &lt;/dependency&gt;&lt;br /&gt;        &lt;dependency&gt;&lt;br /&gt;            &lt;groupId&gt;org.bouncycastle&lt;/groupId&gt;&lt;br /&gt;            &lt;artifactId&gt;bcprov-ext-jdk16&lt;/artifactId&gt;&lt;br /&gt;            &lt;version&gt;1.45&lt;/version&gt;&lt;br /&gt;        &lt;/dependency&gt;&lt;br /&gt;        &lt;dependency&gt;&lt;br /&gt;            &lt;groupId&gt;javax.xml.soap&lt;/groupId&gt;&lt;br /&gt;            &lt;artifactId&gt;saaj-impl&lt;/artifactId&gt;&lt;br /&gt;            &lt;version&gt;1.3&lt;/version&gt;&lt;br /&gt;        &lt;/dependency&gt;&lt;br /&gt;        &lt;dependency&gt;&lt;br /&gt;            &lt;groupId&gt;org.codehaus.woodstox&lt;/groupId&gt;&lt;br /&gt;            &lt;artifactId&gt;wstx-asl&lt;/artifactId&gt;&lt;br /&gt;            &lt;version&gt;3.2.9&lt;/version&gt;&lt;br /&gt;            &lt;exclusions&gt;&lt;br /&gt;                &lt;exclusion&gt;&lt;br /&gt;                    &lt;groupId&gt;stax&lt;/groupId&gt;&lt;br /&gt;                    &lt;artifactId&gt;stax-api&lt;/artifactId&gt;&lt;br /&gt;                &lt;/exclusion&gt;&lt;br /&gt;            &lt;/exclusions&gt;&lt;br /&gt;        &lt;/dependency&gt;&lt;br /&gt;        &lt;dependency&gt;&lt;br /&gt;            &lt;groupId&gt;commons-cli&lt;/groupId&gt;&lt;br /&gt;            &lt;artifactId&gt;commons-cli&lt;/artifactId&gt;&lt;br /&gt;            &lt;version&gt;1.2&lt;/version&gt;&lt;br /&gt;        &lt;/dependency&gt;&lt;br /&gt;        &lt;dependency&gt;&lt;br /&gt;            &lt;groupId&gt;org.codehaus.groovy.modules.scriptom&lt;/groupId&gt;&lt;br /&gt;            &lt;artifactId&gt;scriptom&lt;/artifactId&gt;&lt;br /&gt;            &lt;version&gt;1.6.0&lt;/version&gt;&lt;br /&gt;        &lt;/dependency&gt;&lt;br /&gt;        &lt;dependency&gt;&lt;br /&gt;            &lt;groupId&gt;net.sf.jacob-project&lt;/groupId&gt;&lt;br /&gt;            &lt;artifactId&gt;jacob&lt;/artifactId&gt;&lt;br /&gt;            &lt;version&gt;1.14.3&lt;/version&gt;&lt;br /&gt;            &lt;type&gt;jar&lt;/type&gt;&lt;br /&gt;        &lt;/dependency&gt;&lt;br /&gt;    &lt;/dependencies&gt;&lt;br /&gt;&lt;/project&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-913759485373256237?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/913759485373256237/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=913759485373256237' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/913759485373256237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/913759485373256237'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/08/groovy-using-groovyws-as-web-service.html' title='Groovy - Using GroovyWS as Web Service Client'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-8303042672879808764</id><published>2010-08-13T18:05:00.002+08:00</published><updated>2010-08-13T18:15:20.900+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='sas'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>SAS - Output DataSet as JSON</title><content type='html'>This example converts a SAS dataset to JSON notation strings and output to STDOUT; change the line 8 to any specific file names to write the result to the file instantly.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:shell"&gt;LIBNAME EDA ORACLE  PATH=XE  SCHEMA=EDA  USER=eda  PASSWORD=eda;&lt;br /&gt;DATA WAT;&lt;br /&gt;    SET EDA.WAT;&lt;br /&gt; KEEP PRODUCT_NAME SPEC_FILE LOT_ID WAFER_ID SITE_ID ATT1 ATT2 ATT3;&lt;br /&gt; WHERE LOT_ID like 'P0M78.1';&lt;br /&gt;RUN;&lt;br /&gt;DATA _NULL_;&lt;br /&gt;    file print PS=32767;&lt;br /&gt;    set WAT end=lastrec;&lt;br /&gt;    if _N_ eq 1 then do;&lt;br /&gt;        put '[';&lt;br /&gt;    end;&lt;br /&gt;    put '{"productName":"' PRODUCT_NAME '",';&lt;br /&gt;    put '"lotId":"' LOT_ID '",';&lt;br /&gt;    put '"waferId":' WAFER_ID ',';&lt;br /&gt;    put '"siteId":"' SITE_ID '",';&lt;br /&gt;    put '"specFile":"' SPEC_FILE '",';&lt;br /&gt;    put '"attrs": [';&lt;br /&gt;    put '{"attr1":' ATT1 '},';&lt;br /&gt;    put '{"attr2":' ATT2 '},';&lt;br /&gt;    put '{"attr3":' ATT3 '}]}';&lt;br /&gt;&lt;br /&gt;    if lastrec eq 1 then do;&lt;br /&gt;        put ']';&lt;br /&gt;    end;&lt;br /&gt;    else do;&lt;br /&gt;        put ',';&lt;br /&gt;    end;&lt;br /&gt;RUN;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Another example from &lt;a href="http://www.recfin.org/~wade/JSON.html"&gt;Wade H. Van Buskirk&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-8303042672879808764?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/8303042672879808764/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=8303042672879808764' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8303042672879808764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8303042672879808764'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/08/sas-output-dataset-as-json.html' title='SAS - Output DataSet as JSON'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-5275281682542604900</id><published>2010-08-11T11:04:00.001+08:00</published><updated>2010-08-11T11:05:16.077+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http'/><category scheme='http://www.blogger.com/atom/ns#' term='porting'/><category scheme='http://www.blogger.com/atom/ns#' term='ftp'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='tns'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Oracle - Change the Service Listening Ports of TNS Listener</title><content type='html'>Since version 9, Oracle database pre-bundled a XML DB serves both on port 8080 (HTTP) and 2020 (FTP). To change the default ports, we could use follow command in SQLPlus:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:shell" title="Change TNS Listener HTTP Port"&gt;call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(), '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()', 9090));&lt;br /&gt;commit;&lt;br /&gt;exec dbms_xdb.cfg_refresh;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="brush:shell" title="Change TNS Listener FTP Port"&gt;call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(), '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()', 9091));&lt;br /&gt;commit;&lt;br /&gt;exec dbms_xdb.cfg_refresh;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-5275281682542604900?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/5275281682542604900/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=5275281682542604900' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5275281682542604900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5275281682542604900'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/08/oracle-change-service-listening-ports.html' title='Oracle - Change the Service Listening Ports of TNS Listener'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-7734388556999010625</id><published>2010-08-09T18:52:00.004+08:00</published><updated>2010-08-09T18:55:04.700+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='integration'/><category scheme='http://www.blogger.com/atom/ns#' term='sas'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>SAS - Connect to SAS Shared Service with SAS JDBC Driver</title><content type='html'>Code snippet relative to connect to SAS Shared Service with SAS JDBC driver&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java" title="SAS Shared Service JDBC Connection"&gt;Connection conn = null;&lt;br /&gt;try {&lt;br /&gt;    Class.forName("com.sas.net.sharenet.ShareNetDriver");&lt;br /&gt;    conn = DriverManager.getConnection("jdbc:sharenet://localhost:8551",&lt;br /&gt;                                       "USER_NAME", "PASSWORD");&lt;br /&gt;    DatabaseMetaData dma = conn.getMetaData();&lt;br /&gt;    System.out.println("Connected to " + dma.getURL());&lt;br /&gt;    System.out.println("Driver " + dma.getDriverName());&lt;br /&gt;    System.out.println("Version " + dma.getDriverVersion());&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;    e.printStackTrace();&lt;br /&gt;} finally {&lt;br /&gt;    try {&lt;br /&gt;        if (null != conn) conn.close();&lt;br /&gt;    } catch (SQLException e) {}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-7734388556999010625?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/7734388556999010625/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=7734388556999010625' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7734388556999010625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7734388556999010625'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/08/sas-connect-to-sas-shared-service-with.html' title='SAS - Connect to SAS Shared Service with SAS JDBC Driver'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-8005028385525434551</id><published>2010-07-29T14:16:00.002+08:00</published><updated>2010-07-29T14:22:58.349+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metro'/><category scheme='http://www.blogger.com/atom/ns#' term='webservice'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Grails - Tips of Using Metro Plugin</title><content type='html'>&lt;b&gt;Metro Integration&lt;/b&gt;&lt;br /&gt;Two ways to integrate web services into your grails application with Metro plugin:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Do nothing, then Metro plugin will register jax-ws spring configuration (&lt;i&gt;com.sun.xml.ws.transport.http.servlet.GrailsWsServlet&lt;/i&gt;) to web.xml.&lt;/li&gt;&lt;li&gt;Place self-defined sun.jaxws.xml in &lt;i&gt;web-app/WEB-INF&lt;/i&gt; folder, and copy generated Java source files to &lt;i&gt;src/java&lt;/i&gt;. Then Metro plugin will register &lt;i&gt;com.sun.xml.ws.transport.http.servlet.WSServletContextListener&lt;/i&gt; to web.xml.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;Enabling MTOM Support&lt;/b&gt;&lt;br /&gt;To enable MTOM support is basically simple, what we have to do is to declare a &lt;i&gt;@MTOM&lt;/i&gt; annotation in your service classes, and use relative &lt;i&gt;@XmlMimeType&lt;/i&gt;s to annotate the MIME types we need to each web method's parameters if any. &lt;br /&gt;But here is one thing needs to be additionally took care of. It is, if the grails application not only serves as a Web Service server, but also a web application as well. In order to prevent the upload multi-part attachment from mixing up by grails, we need to exclude the url-pattern we used for all web services from grails' UrlMappingsFilter (it means to add the url pattern to the excludes list in &lt;i&gt;UrlMapping.groovy&lt;/i&gt; file.) &lt;br /&gt;&lt;pre class="brush: groovy" title="UrlMappings.groovy"&gt;class UrlMappings {&lt;br /&gt;&lt;br /&gt; static excludes = ["/services/*"]&lt;br /&gt;    &lt;br /&gt; static mappings = {&lt;br /&gt;  "/$controller/$action?/$id?"{&lt;br /&gt;   constraints {&lt;br /&gt;    // apply constraints here&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  "/" (view: '/')&lt;br /&gt;  "500"(view:'/error')&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-8005028385525434551?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/8005028385525434551/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=8005028385525434551' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8005028385525434551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8005028385525434551'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/07/grails-tips-of-using-metro-plugin.html' title='Grails - Tips of Using Metro Plugin'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-2241367091819407780</id><published>2010-07-27T09:08:00.002+08:00</published><updated>2010-07-29T17:37:04.169+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metro'/><category scheme='http://www.blogger.com/atom/ns#' term='webservice'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='fix'/><title type='text'>Grails - Metro Plugin Modification for Grails 1.3.3</title><content type='html'>Though it isn't listed in official Grails plugin list and kinda out dated, there is indeed a Metro plugin available on dev.java.net.  &lt;blockquote&gt;&lt;a href="https://jax-ws-commons.dev.java.net/grails/"&gt;Metro Plugin for Grails Framework&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;To adopt the plugin to Grails 1.3.3 applications, I tweaked the plugin source a little bit to make it work again. Following is the change:&lt;br /&gt;&lt;pre class="brush:groovy" title="MetroGrailsPlugin.groovy"&gt;import org.codehaus.groovy.grails.compiler.support.*&lt;br /&gt;import groovy.xml.DOMBuilder&lt;br /&gt;import groovy.xml.dom.DOMCategory&lt;br /&gt;import groovy.xml.StreamingMarkupBuilder&lt;br /&gt;&lt;br /&gt;class MetroGrailsPlugin {&lt;br /&gt;//    def dependsOn = []&lt;br /&gt;&lt;br /&gt;    def author = "Martin Grebac"&lt;br /&gt;    def authorEmail = "martin.grebac@sun.com"&lt;br /&gt;    def title = "Add METRO Web Service support to services built with Grails framework."&lt;br /&gt;    def description = '''\&lt;br /&gt;METRO plugin allows applications developed with Grails framework to expose service &lt;br /&gt;classes as SOAP Web Services. It uses the SOAP implementation from METRO (includes JAX-WS).&lt;br /&gt;'''&lt;br /&gt;    def documentation = "http://jax-ws-commons.dev.java.net/grails/"&lt;br /&gt;    def version = '1.0.2'&lt;br /&gt;    def loadAfter = ['services']&lt;br /&gt;    def watchedResources = ["file:./grails-app/services/**/*Service.groovy",&lt;br /&gt;                            "file:./plugins/*/grails-app/services/**/*Service.groovy",&lt;br /&gt;                            "file:./src/java/**/*.java",&lt;br /&gt;                            "file:./src/groovy/**/*.groovy"]&lt;br /&gt;&lt;br /&gt;    def doWithSpring = {&lt;br /&gt;        File f = new File("grails-app/conf/spring/resources.xml")&lt;br /&gt;        println "Generating " + f&lt;br /&gt;&lt;br /&gt;        def output = new FileOutputStream(f)&lt;br /&gt;&lt;br /&gt;        def xml = new StreamingMarkupBuilder().bind {&lt;br /&gt;            mkp.xmlDeclaration()&lt;br /&gt;            mkp.declareNamespace(wss: "http://jax-ws.dev.java.net/spring/servlet")&lt;br /&gt;            mkp.declareNamespace(ws: "http://jax-ws.dev.java.net/spring/core")&lt;br /&gt;            mkp.declareNamespace(sp: "http://www.springframework.org/schema/beans")&lt;br /&gt;            mkp.declareNamespace(xsi: "http://www.w3.org/2001/XMLSchema-instance")&lt;br /&gt;&lt;br /&gt;            String classDir = "target/classes" //"${userHome}/.grails/${grailsVersion}/projects/${appName}/classes"&lt;br /&gt;            new File(classDir).mkdir()&lt;br /&gt;            String sourceDir = "target/generated-java-source"&lt;br /&gt;            new File(sourceDir).mkdir()&lt;br /&gt;            String wsdlDir = "web-app/WEB-INF/wsdl"&lt;br /&gt;            new File(wsdlDir).mkdir()&lt;br /&gt;&lt;br /&gt;            //def pName&lt;br /&gt;            sp.beans('xsi:schemaLocation': "http://jax-ws.dev.java.net/spring/core http://jax-ws.dev.java.net/spring/core.xsd http://jax-ws.dev.java.net/spring/servlet http://jax-ws.dev.java.net/spring/servlet.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd") {&lt;br /&gt;                def clazz = application?.allClasses as List&lt;br /&gt;                clazz.unique().each { cl -&gt;&lt;br /&gt;                    java.lang.annotation.Annotation a = cl?.getAnnotation(javax.jws.WebService.class)&lt;br /&gt;                    if (a) {&lt;br /&gt;                        def String shortName = cl.name&lt;br /&gt;                        println "Generating spring configuration for: ${shortName}"&lt;br /&gt;&lt;br /&gt;                        if (shortName?.contains('.')) {&lt;br /&gt;                            shortName = shortName.substring(shortName.lastIndexOf('.') + 1, shortName.size())&lt;br /&gt;                        }&lt;br /&gt;                        //pName = shortName&lt;br /&gt;&lt;br /&gt;                        wss.binding(url: "/services/${shortName}") {&lt;br /&gt;                            wss.service {&lt;br /&gt;                                ws.service(bean: "#${shortName}")&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                        sp.bean(id: "${shortName}", 'class': "${cl.name}")&lt;br /&gt;&lt;br /&gt;                        String[] attrs = ["-classpath",&lt;br /&gt;                                classDir,&lt;br /&gt;                                "-d",&lt;br /&gt;                                classDir,&lt;br /&gt;                                "-keep",&lt;br /&gt;                                "-wsdl",&lt;br /&gt;                                "-r",&lt;br /&gt;                                wsdlDir,&lt;br /&gt;                                "-s",&lt;br /&gt;                                sourceDir,&lt;br /&gt;                                "${cl.name}"&lt;br /&gt;                        ]&lt;br /&gt;                        com.sun.tools.ws.WsGen.doMain(attrs);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        output &lt;&lt; xml.toString()&lt;br /&gt;        output.close()&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    def doWithApplicationContext = { ctx -&gt;&lt;br /&gt;&lt;br /&gt;//        /*&lt;br /&gt;//        &lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;//          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;//          xmlns:ws="http://jax-ws.dev.java.net/spring/core"&lt;br /&gt;//          xmlns:wss="http://jax-ws.dev.java.net/spring/servlet"&gt;&lt;br /&gt;//&lt;br /&gt;//            &lt;wss:binding url="/testurl"&gt;&lt;br /&gt;//              &lt;wss:service&gt;&lt;br /&gt;//                  &lt;ws:service bean="#testService"/&gt;&lt;br /&gt;//              &lt;/wss:service&gt;&lt;br /&gt;//            &lt;/wss:binding&gt; &lt;br /&gt;//            &lt;bean id="testService" class="foo.TestJavaService" /&gt;&lt;br /&gt;//            &lt;br /&gt;//        &lt;/beans&gt;&lt;br /&gt;//        */&lt;br /&gt;//        &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    def doWithWebDescriptor = { xml -&gt;&lt;br /&gt;&lt;br /&gt;        def jaxwsdesc = new File("web-app/WEB-INF/sun-jaxws.xml")&lt;br /&gt;&lt;br /&gt;        def servlets = xml.servlet[0]&lt;br /&gt;        def servletMappings = xml.'servlet-mapping'[0]&lt;br /&gt;        def listeners = xml.listener[0]&lt;br /&gt;&lt;br /&gt;        if (jaxwsdesc.exists()) {&lt;br /&gt;&lt;br /&gt;            //plain jax-ws way&lt;br /&gt;            def reader = new FileReader(jaxwsdesc)&lt;br /&gt;&lt;br /&gt;            def doc = DOMBuilder.parse(reader)&lt;br /&gt;            def endpoints = doc.documentElement&lt;br /&gt;&lt;br /&gt;            listeners + {&lt;br /&gt;                listener {&lt;br /&gt;                    'listener-class'('com.sun.xml.ws.transport.http.servlet.WSServletContextListener')&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            use(DOMCategory) {&lt;br /&gt;                def endpointset = endpoints.'endpoint'&lt;br /&gt;                endpointset.each { endpoint -&gt; processEndpoint(endpoint, servlets, servletMappings) }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        } else {&lt;br /&gt;&lt;br /&gt;            // spring-way&lt;br /&gt;            println "Creating jax-ws spring configuration in web.xml."&lt;br /&gt;&lt;br /&gt;            servlets + {&lt;br /&gt;                servlet {&lt;br /&gt;                    'servlet-name'('jaxws-servlet')&lt;br /&gt;                    'servlet-class'("com.sun.xml.ws.transport.http.servlet.GrailsWsServlet") //WSSpringServlet&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            servletMappings + {&lt;br /&gt;                'servlet-mapping' {&lt;br /&gt;                    'servlet-name'('jaxws-servlet')&lt;br /&gt;                    'url-pattern'('/services/*')&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    def processEndpoint(endpoint, servlets, servletMappings) {&lt;br /&gt;        def name = endpoint.'@name'&lt;br /&gt;        def impl = endpoint.'@implementation'&lt;br /&gt;        def url = endpoint.'@url-pattern'&lt;br /&gt;&lt;br /&gt;        println "Processing web.xml for endpoint: " + name + " | " + impl + " | " + url&lt;br /&gt;&lt;br /&gt;        // Pure jax-ws way&lt;br /&gt;        servlets + {&lt;br /&gt;            servlet {&lt;br /&gt;                'servlet-name'(name)&lt;br /&gt;                'servlet-class'("com.sun.xml.ws.transport.http.servlet.WSServlet")&lt;br /&gt;                'load-on-startup'(1)&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        servletMappings + {&lt;br /&gt;            'servlet-mapping' {&lt;br /&gt;                'servlet-name'(name)&lt;br /&gt;                'url-pattern'(url)&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    def doWithDynamicMethods = { ctx -&gt;&lt;br /&gt;//        println "DOWITHDYNMETHODS" + ctx&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    def onChange = { event -&gt;&lt;br /&gt;//        println "ONCHANGE" + event&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    def onApplicationChange = { event -&gt;&lt;br /&gt;//        println "ONAPPCHANGE" + event        &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-2241367091819407780?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/2241367091819407780/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=2241367091819407780' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2241367091819407780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2241367091819407780'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/07/grails-metro-plugin-modification-for.html' title='Grails - Metro Plugin Modification for Grails 1.3.3'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-9114056272676086036</id><published>2010-07-26T12:16:00.000+08:00</published><updated>2010-07-26T12:16:03.131+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac osx'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='command'/><category scheme='http://www.blogger.com/atom/ns#' term='terminal'/><title type='text'>Mac OS X - Useful Tips</title><content type='html'>Absolutely useful:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://superuser.com/questions/52483/terminal-tips-and-tricks-for-mac-os-x"&gt;Terminal Tips and Tricks For Mac OS X&lt;/a&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-9114056272676086036?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/9114056272676086036/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=9114056272676086036' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/9114056272676086036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/9114056272676086036'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/07/mac-os-x-useful-tips.html' title='Mac OS X - Useful Tips'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-970267887048248326</id><published>2010-07-09T16:18:00.005+08:00</published><updated>2010-07-09T16:42:26.051+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Grails - Using Liquibase for Database Migration</title><content type='html'>Here are the discussions about the usage of Liquibase as database migration tool for Grails applications, quite useful:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://grails.1312388.n4.nabble.com/Liquibase-usage-and-alternatives-td1379380.html#a1379391"&gt;Liquibase usage and alternatives&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;In my case, I just change a little bit of the code example to suit both of development mode and production mode.&lt;br /&gt;&lt;pre class="brush:groovy" title="Code fragment of BootStrap.groovy"&gt;Liquibase liquibase = null&lt;br /&gt;try {&lt;br /&gt;    def c = dataSource.getConnection()&lt;br /&gt;    if (c == null) {&lt;br /&gt;        throw new RuntimeException("No database connection available!")&lt;br /&gt;    }&lt;br /&gt;    def database = DatabaseFactory&lt;br /&gt;                     .getInstance()&lt;br /&gt;                     .findCorrectDatabaseImplementation(c)&lt;br /&gt;    def fileOpener = null&lt;br /&gt;    environments {&lt;br /&gt;        production {&lt;br /&gt;            fileOpener = new ClassLoaderFileOpener()&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    if (!fileOpener) fileOpener = new GrailsFileOpener()&lt;br /&gt;    liquibase = new Liquibase("changelog.xml", fileOpener, database)&lt;br /&gt;    liquibase.update(null)&lt;br /&gt;} finally {&lt;br /&gt;    if (liquibase &amp;&amp; liquibase.database) {&lt;br /&gt;        liquibase.database.close()&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And, of course, the event hook to copy relative files before creating war is also required:&lt;br /&gt;&lt;pre class="brush:groovy"  title="Code fragment of Events.groovy"&gt;eventCreateWarStart = { warName, stagingDir -&gt;&lt;br /&gt;    ant.copy(todir:"${stagingDir}/WEB-INF/classes", overwrite: true) {&lt;br /&gt;        fileset(dir:"grails-app/migrations", includes:"**")&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-970267887048248326?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/970267887048248326/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=970267887048248326' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/970267887048248326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/970267887048248326'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/07/grails-using-liquibase-for-database.html' title='Grails - Using Liquibase for Database Migration'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-8552855743669796658</id><published>2010-07-09T16:14:00.003+08:00</published><updated>2010-07-09T16:15:58.471+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Grails - Taglib in Services</title><content type='html'>&lt;blockquote&gt;&lt;a href="http://grails.1312388.n4.nabble.com/Using-taglib-functions-in-services-td1378961.html#a1378961"&gt;Using taglib functions in services&lt;/a&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/2012795753603994003-8552855743669796658?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/8552855743669796658/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=8552855743669796658' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8552855743669796658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8552855743669796658'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/07/grails-taglib-in-services.html' title='Grails - Taglib in Services'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-1257709654726417730</id><published>2010-06-22T12:58:00.001+08:00</published><updated>2010-07-09T16:15:13.810+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac osx'/><category scheme='http://www.blogger.com/atom/ns#' term='password'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><title type='text'>Mac OS X - Changing Windows Domain Password from Mac OS X</title><content type='html'>&lt;blockquote&gt;&lt;a href="http://superuser.com/questions/20670/how-do-i-change-my-windows-domain-password-from-mac-os-x"&gt;How do I change my windows domain password from Mac OS X?&lt;/a&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/2012795753603994003-1257709654726417730?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/1257709654726417730/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=1257709654726417730' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/1257709654726417730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/1257709654726417730'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/06/changing-windows-domain-password-from.html' title='Mac OS X - Changing Windows Domain Password from Mac OS X'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-3539040455170868174</id><published>2010-04-08T23:18:00.002+08:00</published><updated>2010-04-08T23:35:34.296+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gorm'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Grails - Some Findings of Table-Per-Hierarchy in GORM</title><content type='html'>&lt;b&gt;Finding 1: &lt;/b&gt;&lt;br /&gt;Seems like there is a bug in both Grails 1.2.* and 1.3.0 RC1, which causes that customized discriminator column name doesn't work well. Grails will always try to create the customized column with varchar(-1).&lt;br /&gt;&lt;br /&gt;After fighting with this problem for several hours, I finally found a work-around:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;class Parent {&lt;br /&gt;&lt;br /&gt;    String name&lt;br /&gt;    String gender&lt;br /&gt;    int age&lt;br /&gt;&lt;br /&gt;    static mapping = {&lt;br /&gt;        discriminator column: [name:'level', length:50]&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    static constraints = {&lt;br /&gt;  &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Child extends Parent {&lt;br /&gt;&lt;br /&gt;    static mapping = {&lt;br /&gt;        discriminator 'child'&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    static constraints = {&lt;br /&gt;     &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Grandchild extends Parent {&lt;br /&gt;&lt;br /&gt;    static mapping = {&lt;br /&gt;        discriminator 'grandchild'&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    static constraints = {&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But, there is another problem: that discriminator value won't affect in the Parent class.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Finding 2:&lt;/b&gt;&lt;br /&gt;Abstract classes will fail table-per-hierarchy declaration; therefore, just declare it as a class to ensure it will work as your wish.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-3539040455170868174?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/3539040455170868174/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=3539040455170868174' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3539040455170868174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3539040455170868174'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/04/grails-workaround-for-customized.html' title='Grails - Some Findings of Table-Per-Hierarchy in GORM'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-383051125455614192</id><published>2010-02-09T18:01:00.000+08:00</published><updated>2010-02-09T18:01:25.102+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P22</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=22"&gt;Problem 22&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Groovy Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;final int BASE = 64 // the ASCII code of the character previous to 'A'&lt;br /&gt;def total = 0, subtotal = 0&lt;br /&gt;def names = []&lt;br /&gt;&lt;br /&gt;def file = new File("names.txt")&lt;br /&gt;file.withReader { r -&gt;&lt;br /&gt;  r.readLine().split(",").each {&lt;br /&gt;    names &lt;&lt; it.replace("\"", "")&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;names.sort().eachWithIndex { name, index -&gt;&lt;br /&gt;  subtotal = 0&lt;br /&gt;  name.toCharArray().each { c -&gt;&lt;br /&gt;    subtotal += (c - BASE)&lt;br /&gt;  }&lt;br /&gt;  total += (subtotal * (index + 1))&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println "Total -&gt; ${total}"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-383051125455614192?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/383051125455614192/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=383051125455614192' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/383051125455614192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/383051125455614192'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/02/project-euler-p22.html' title='Project Euler - P22'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-2384989465877148031</id><published>2010-02-09T17:41:00.000+08:00</published><updated>2010-02-09T17:41:41.718+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P21</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=21"&gt;Problem 21&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Groovy Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;static final def PRIMES = [1, 2, 3, 5, 7, 9, ...] // prime list&lt;br /&gt;&lt;br /&gt;static final int MAX = 10000&lt;br /&gt;&lt;br /&gt;def amicables = []&lt;br /&gt;int a1 = 1, a2, temp, sum1, sum2&lt;br /&gt;&lt;br /&gt;MAX.times {&lt;br /&gt;  if (!(a1 in PRIMES || a1 in amicables)) {&lt;br /&gt;    sum1 = 1&lt;br /&gt;    temp = 1&lt;br /&gt;    (a1/2).times {&lt;br /&gt;      temp++&lt;br /&gt;      if (a1 % temp == 0) sum1 += temp&lt;br /&gt;    }&lt;br /&gt;    if (sum1 &gt; a1) {&lt;br /&gt;      a2 = sum1&lt;br /&gt;      sum2 = 1&lt;br /&gt;      temp = 1&lt;br /&gt;      (a2/2).times {&lt;br /&gt;        temp++&lt;br /&gt;        if (a2 % temp == 0) sum2 += temp&lt;br /&gt;      }&lt;br /&gt;      if (sum2 == a1) {&lt;br /&gt;        println ("found $a1, $a2")&lt;br /&gt;        amicables &lt;&lt; a1&lt;br /&gt;        amicables &lt;&lt; a2&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  a1++&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println ("sum of all amicables under $MAX = ${amicables.sum()}")&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-2384989465877148031?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/2384989465877148031/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=2384989465877148031' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2384989465877148031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2384989465877148031'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/02/project-euler-p21.html' title='Project Euler - P21'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-7903493208348772523</id><published>2010-02-09T17:11:00.000+08:00</published><updated>2010-02-09T17:11:03.028+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P20</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=20"&gt;Problem 20&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Groovy Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;static final int TIME = 100&lt;br /&gt;&lt;br /&gt;def multiple(s, n, i) {&lt;br /&gt;  s[i] = Character.forDigit(n % 10, 10)&lt;br /&gt;  return (int) (n / 10)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;def strPowerR = '1'&lt;br /&gt;def strTemp = new char[2048]&lt;br /&gt;int level = 2&lt;br /&gt;int intTemp = 0&lt;br /&gt;int intOverflow = 0&lt;br /&gt;&lt;br /&gt;Arrays.fill strTemp, Character.forDigit(0, 10)&lt;br /&gt;strTemp[0] = Character.forDigit(1, 10)&lt;br /&gt;(TIME - 1).times {&lt;br /&gt;  strPowerR.toCharArray().eachWithIndex { item, index -&gt;&lt;br /&gt;    intTemp = Character.digit(item, 10)&lt;br /&gt;    intTemp = (intTemp * level) + (intOverflow % 10)&lt;br /&gt;    intOverflow = ((int)intOverflow/10) + multiple(strTemp, intTemp, index)&lt;br /&gt;  }&lt;br /&gt;  if (intOverflow &gt; 0) {&lt;br /&gt;    String strTemp2 = String.valueOf(intOverflow)&lt;br /&gt;    strTemp2.toCharArray().eachWithIndex { item, index -&gt;&lt;br /&gt;      strTemp[strPowerR.length() + strTemp2.length() - index - 1] = item&lt;br /&gt;    }&lt;br /&gt;    intOverflow = 0&lt;br /&gt;  }&lt;br /&gt;  strPowerR = String.valueOf('a' + strTemp).replace('0', ' ').trim().replace(' ', '0').substring(1) // trim right&lt;br /&gt;  level++&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println ("${TIME}! = ${strPowerR.reverse()}")&lt;br /&gt;&lt;br /&gt;intTemp = 0&lt;br /&gt;strPowerR.toCharArray().each {&lt;br /&gt;  intTemp += Character.digit(it, 10)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println ("Sum of all digit character of ${TIME}! = ${intTemp}")&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-7903493208348772523?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/7903493208348772523/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=7903493208348772523' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7903493208348772523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7903493208348772523'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/02/project-euler-p20.html' title='Project Euler - P20'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-2523778254894868866</id><published>2010-02-05T16:45:00.000+08:00</published><updated>2010-02-05T16:45:55.075+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P19</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=19"&gt;Problem 19&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Groovy Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;class D {&lt;br /&gt;  int year&lt;br /&gt;  int month&lt;br /&gt;  int day&lt;br /&gt;  public int getV() {&lt;br /&gt;    return year * 10000 + month * 100 + day&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;def count = 0&lt;br /&gt;def d = new D(year:1900, month:1, day:7) // the first Sunday in 20th century&lt;br /&gt;while (d.v &lt; 20001231) {&lt;br /&gt;  d.day += 7&lt;br /&gt;  if (d.day &gt; 28) {&lt;br /&gt;    // need to roll&lt;br /&gt;    switch (d.month) {&lt;br /&gt;      case 1:&lt;br /&gt;      case 3:&lt;br /&gt;      case 5:&lt;br /&gt;      case 7:&lt;br /&gt;      case 8:&lt;br /&gt;      case 10:&lt;br /&gt;      case 12:&lt;br /&gt;        if (d.day &gt; 31) {&lt;br /&gt;          d.day -= 31&lt;br /&gt;          d.month += 1&lt;br /&gt;        }&lt;br /&gt;        break&lt;br /&gt;      case 4:&lt;br /&gt;      case 6:&lt;br /&gt;      case 9:&lt;br /&gt;      case 11:&lt;br /&gt;        if (d.day &gt; 30) {&lt;br /&gt;          d.day -= 30&lt;br /&gt;          d.month += 1&lt;br /&gt;        }&lt;br /&gt;        break&lt;br /&gt;      case 2:&lt;br /&gt;        if ((d.year % 4 == 0) &amp;&amp; (d.year % 400 == 0 || !(d.year % 100 == 0))) {&lt;br /&gt;          // leap year&lt;br /&gt;          if (d.day &gt; 29) {&lt;br /&gt;            d.day -= 29&lt;br /&gt;            d.month += 1&lt;br /&gt;          }&lt;br /&gt;        } else {&lt;br /&gt;          d.day -= 28&lt;br /&gt;          d.month += 1&lt;br /&gt;        }&lt;br /&gt;        break&lt;br /&gt;    }&lt;br /&gt;    if (d.month &gt; 12) {&lt;br /&gt;      d.month = 1&lt;br /&gt;      d.year++&lt;br /&gt;    }&lt;br /&gt;    if (d.year &gt; 1900 &amp;&amp; d.day == 1) {&lt;br /&gt;      println(d.v)&lt;br /&gt;      count++&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;println ("Found ${count} Sundays!")&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-2523778254894868866?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/2523778254894868866/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=2523778254894868866' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2523778254894868866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2523778254894868866'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/02/project-euler-p19.html' title='Project Euler - P19'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-7913509993704122138</id><published>2010-02-05T16:11:00.000+08:00</published><updated>2010-02-05T16:11:51.024+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P18</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=18"&gt;Problem 18&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Groovy Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;class Spot {&lt;br /&gt;  int value&lt;br /&gt;  Spot left, right&lt;br /&gt;&lt;br /&gt;  public String toString() { value }&lt;br /&gt;&lt;br /&gt;  public static int calPath(s) {&lt;br /&gt;    int ls = s.value&lt;br /&gt;    int rs = s.value&lt;br /&gt;    ls = ls + (s.left ? calPath(s.left) : 0)&lt;br /&gt;    rs = rs + (s.right ? calPath(s.right) : 0)&lt;br /&gt;    return Math.max(ls, rs)&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;def TRI = [[75],&lt;br /&gt;           [95,64],&lt;br /&gt;           [17,47,82],&lt;br /&gt;           [18,35,87,10],&lt;br /&gt;           [20, 4,82,47,65],&lt;br /&gt;           [19, 1,23,75, 3,34],&lt;br /&gt;           [88, 2,77,73, 7,63,67],&lt;br /&gt;           [99,65,04,28,06,16,70,92],&lt;br /&gt;           [41,41,26,56,83,40,80,70,33],&lt;br /&gt;           [41,48,72,33,47,32,37,16,94,29],&lt;br /&gt;           [53,71,44,65,25,43,91,52,97,51,14],&lt;br /&gt;           [70,11,33,28,77,73,17,78,39,68,17,57],&lt;br /&gt;           [91,71,52,38,17,14,91,43,58,50,27,29,48],&lt;br /&gt;           [63,66,04,68,89,53,67,30,73,16,69,87,40,31],&lt;br /&gt;           [ 4,62,98,27,23, 9,70,98,73,93,38,53,60, 4,23]]&lt;br /&gt;&lt;br /&gt;def root  = null&lt;br /&gt;def spots = []&lt;br /&gt;def cRow, pRow = null&lt;br /&gt;def a, b, c, d&lt;br /&gt;&lt;br /&gt;TRI.each { tRow -&gt;&lt;br /&gt;  cRow = []&lt;br /&gt;  spots &lt;&lt; cRow&lt;br /&gt;  tRow.eachWithIndex { v, i -&gt;&lt;br /&gt;    a = new Spot(value:v)&lt;br /&gt;    cRow &lt;&lt; a&lt;br /&gt;    if (pRow) {&lt;br /&gt;      if (i &lt; pRow.size()) {&lt;br /&gt;        pRow[i].left = a&lt;br /&gt;      }&lt;br /&gt;      if (i &gt; 0) {&lt;br /&gt;        pRow[i - 1].right = a&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  if (tRow.size() == 1) root = a&lt;br /&gt;  pRow = cRow&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println ("Max -&gt; ${Spot.calPath(root)}")&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-7913509993704122138?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/7913509993704122138/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=7913509993704122138' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7913509993704122138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7913509993704122138'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/02/project-euler-p18.html' title='Project Euler - P18'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-7276911759115169386</id><published>2010-02-05T13:42:00.000+08:00</published><updated>2010-02-05T13:42:21.328+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P17</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=17"&gt;Problem 17&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Groovy Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;def N = [0:'', 1:'one', 2:'two', 3:'three', 4:'four', 5:'five', 6:'six', 7:'seven', 8:'eight', 9:'nine', 10:'ten',&lt;br /&gt;         11:'eleven', 12:'twelve', 13:'thirteen', 14:'fourteen', 15:'fifteen', 16:'sixteen', 17:'seventeen', 18:'eighteen', 19:'nineteen', 20:'twenty',&lt;br /&gt;         30:'thirty', 40:'forty', 50:'fifty', 60:'sixty', 70:'seventy', 80:'eighty', 90:'ninety', 100:'hundred', 1000:'thousand']&lt;br /&gt;&lt;br /&gt;int count = 0&lt;br /&gt;int c&lt;br /&gt;int x, y, z, w&lt;br /&gt;&lt;br /&gt;def s = new StringBuilder()&lt;br /&gt;&lt;br /&gt;1000.times {&lt;br /&gt;  c = it + 1&lt;br /&gt;  if (N.containsKey(c)) {&lt;br /&gt;    if (c &gt;= 100)&lt;br /&gt;        s.append(N[1])&lt;br /&gt;    s.append(N[c])&lt;br /&gt;  } else {&lt;br /&gt;    x = (int) c / 100&lt;br /&gt;    w = (int) c % 100&lt;br /&gt;    y = (int) w / 10&lt;br /&gt;    z = (int) w % 10&lt;br /&gt;    if (x &gt; 0) {&lt;br /&gt;      s.append(N[x])&lt;br /&gt;      s.append(N[100])&lt;br /&gt;      if (y &gt; 0 || z &gt; 0 || w &gt; 0) {&lt;br /&gt;        s.append('and')     // and&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    if (N.containsKey(w)) {&lt;br /&gt;      s.append(N[w])&lt;br /&gt;    } else {&lt;br /&gt;      if (y &gt; 0) s.append(N[y * 10])&lt;br /&gt;      if (z &gt; 0) s.append(N[z])&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  println(s)&lt;br /&gt;  count += s.length()&lt;br /&gt;  s.delete(0, s.length())&lt;br /&gt;}&lt;br /&gt;println("Total characters: ${count}")&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-7276911759115169386?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/7276911759115169386/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=7276911759115169386' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7276911759115169386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7276911759115169386'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/02/project-euler-p17.html' title='Project Euler - P17'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-4204244387051588983</id><published>2010-02-05T11:48:00.001+08:00</published><updated>2010-02-09T17:10:10.387+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P16</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=16"&gt;Problem 16&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Groovy Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;static final int TIME = 1000&lt;br /&gt;static final int BASE = 2&lt;br /&gt;&lt;br /&gt;def add(s, n, i) {&lt;br /&gt;  s[i] = Character.forDigit(n % 10, 10)&lt;br /&gt;  return (int) (n / 10)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;def strPowerR = '1'&lt;br /&gt;def strTemp = new char[1024]&lt;br /&gt;int intTemp = 0&lt;br /&gt;int intOverflow = 0&lt;br /&gt;&lt;br /&gt;Arrays.fill strTemp, Character.forDigit(0, 10)&lt;br /&gt;strTemp[0] = Character.forDigit(1, 10)&lt;br /&gt;TIME.times {&lt;br /&gt;  strPowerR.toCharArray().eachWithIndex { item, index -&gt;&lt;br /&gt;    intTemp = Character.digit(item, 10)&lt;br /&gt;    intTemp = (intTemp * BASE) + (intOverflow % 10)&lt;br /&gt;    intOverflow = ((int)intOverflow/10) + add(strTemp, intTemp, index)&lt;br /&gt;  }&lt;br /&gt;  if (intOverflow &gt; 0) {&lt;br /&gt;    String strTemp2 = String.valueOf(intOverflow)&lt;br /&gt;    strTemp2.toCharArray().eachWithIndex { item, index -&gt;&lt;br /&gt;      strTemp[strPowerR.length() + strTemp2.length() - index - 1] = item&lt;br /&gt;    }&lt;br /&gt;    intOverflow = 0&lt;br /&gt;  }&lt;br /&gt;  strPowerR = String.valueOf('a' + strTemp).replace('0', ' ').trim().replace(' ', '0').substring(1) // trim right&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println ("Power(${BASE}, ${TIME}) = ${strPowerR.reverse()}")&lt;br /&gt;&lt;br /&gt;intTemp = 0&lt;br /&gt;strPowerR.toCharArray().each {&lt;br /&gt;  intTemp += Character.digit(it, 10)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println ("Sum of all digit character of Power(${BASE}, ${TIME}) = ${intTemp}")&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-4204244387051588983?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/4204244387051588983/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=4204244387051588983' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/4204244387051588983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/4204244387051588983'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/02/project-euler-p16.html' title='Project Euler - P16'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-8818047911350360325</id><published>2010-02-05T07:45:00.000+08:00</published><updated>2010-02-05T07:45:20.819+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P15</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=15"&gt;Problem 15&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;C Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;#define MAX (20)&lt;br /&gt;&lt;br /&gt;typedef struct _node {&lt;br /&gt;    int v;&lt;br /&gt;    struct _node *a;&lt;br /&gt;    struct _node *b; &lt;br /&gt;} node;&lt;br /&gt;&lt;br /&gt;static long long unsigned int count = 0;&lt;br /&gt;&lt;br /&gt;void new_node(node* n, int i, int j) {&lt;br /&gt;    n-&gt;v = i * 100 + j + 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void find_path(node* n) {&lt;br /&gt;    if (!n-&gt;a &amp;&amp; !n-&gt;b) {&lt;br /&gt;        count++;&lt;br /&gt;        return;&lt;br /&gt;    }&lt;br /&gt;    if (n-&gt;a) {&lt;br /&gt;        if (n-&gt;b) {&lt;br /&gt;            find_path(n-&gt;b);&lt;br /&gt;        }&lt;br /&gt;        find_path(n-&gt;a);&lt;br /&gt;    } else {&lt;br /&gt;        if(n-&gt;b) find_path(n-&gt;b);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(void) {&lt;br /&gt;    const int BOUNDARY = MAX + 1;&lt;br /&gt;    node  m[BOUNDARY * BOUNDARY] = {0};&lt;br /&gt;    node* pn = NULL;&lt;br /&gt;    int i = 0, j = 0;&lt;br /&gt;&lt;br /&gt;    printf("given %d X %d matrix\n", MAX, MAX);&lt;br /&gt;&lt;br /&gt;    for (i = 0; i &lt; BOUNDARY; i++) {&lt;br /&gt;        for (j = 0; j &lt; BOUNDARY; j++) {&lt;br /&gt;            pn = m + i * BOUNDARY + j;&lt;br /&gt;            if (0 == pn-&gt;v) &lt;br /&gt;                new_node(pn, i, j);&lt;br /&gt;            if (j &lt; MAX) {&lt;br /&gt;                pn-&gt;b = m + i * BOUNDARY + j + 1;&lt;br /&gt;                if (0 == pn-&gt;b-&gt;v) new_node(pn-&gt;b, i, j + 1);&lt;br /&gt;            }&lt;br /&gt;            if (i &lt; MAX - 1) {&lt;br /&gt;                pn-&gt;a = m + (i + 1) * BOUNDARY + j;&lt;br /&gt;                if (0 == pn-&gt;a-&gt;v) new_node(pn-&gt;a, i + 1, j);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    printf("start...\n", count);&lt;br /&gt;&lt;br /&gt;    pn = m;&lt;br /&gt;    find_path(pn);&lt;br /&gt;&lt;br /&gt;    printf("result-&gt; %llu\n", count);&lt;br /&gt;&lt;br /&gt;    return EXIT_SUCCESS;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Groovy Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;class Node {&lt;br /&gt;&lt;br /&gt;  static pathCount = 0&lt;br /&gt;&lt;br /&gt;  String name&lt;br /&gt;  int    weight = 0&lt;br /&gt;  Node   downward, rightward&lt;br /&gt;&lt;br /&gt;  public String toString() { name }&lt;br /&gt;&lt;br /&gt;  static def newInstance(i, j) {&lt;br /&gt;    def n = new Node()&lt;br /&gt;    n.name = "Node ${i}:${j}"&lt;br /&gt;    n.weight = i * 100 + j&lt;br /&gt;    n&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  static def calPathAll(n) {&lt;br /&gt;    if (n.downward) {&lt;br /&gt;      if (n.rightward) {&lt;br /&gt;        calPathAll(n.rightward)&lt;br /&gt;      }&lt;br /&gt;      calPathAll(n.downward)&lt;br /&gt;    } else {&lt;br /&gt;      if (n.rightward) calPathAll(n.rightward)&lt;br /&gt;    }&lt;br /&gt;    if (!n.downward &amp;&amp; !n.rightward) pathCount++&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def MAX = 2 + 1&lt;br /&gt;def nodes = new Node[MAX][MAX]&lt;br /&gt;def i = 0, j = 0&lt;br /&gt;&lt;br /&gt;//initiate node matrix&lt;br /&gt;(MAX).times {&lt;br /&gt;  j = 0&lt;br /&gt;  (MAX).times {&lt;br /&gt;    if (!nodes[i][j]) {&lt;br /&gt;      nodes[i][j] = Node.newInstance(i, j)&lt;br /&gt;    }&lt;br /&gt;    def c = nodes[i][j]&lt;br /&gt;    nodes[i][j] = c&lt;br /&gt;    if (i != MAX - 1) {&lt;br /&gt;      if (!nodes[i + 1][j]) {&lt;br /&gt;        nodes[i + 1][j] = Node.newInstance(i + 1, j)&lt;br /&gt;      }&lt;br /&gt;      def a = nodes[i + 1][j]&lt;br /&gt;      if (c.weight &lt; a.weight) c.downward = a&lt;br /&gt;    } else {&lt;br /&gt;      c.downward = null&lt;br /&gt;    }&lt;br /&gt;    if (j != MAX - 1) {&lt;br /&gt;      if (!nodes[i][j + 1]) {&lt;br /&gt;        nodes[i][j + 1] = Node.newInstance(i, j + 1)&lt;br /&gt;      }&lt;br /&gt;      def b = nodes[i][j + 1]&lt;br /&gt;      if (c.weight &lt; b.weight) c.rightward = b&lt;br /&gt;    } else {&lt;br /&gt;      c.rightward = null&lt;br /&gt;    }&lt;br /&gt;    j++&lt;br /&gt;  }&lt;br /&gt;  i++&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Node.calPathAll(nodes[0][0]) // calculate from node 0:0&lt;br /&gt;println("Found ${nodes[0][0].pathCount} possible paths.")&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-8818047911350360325?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/8818047911350360325/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=8818047911350360325' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8818047911350360325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8818047911350360325'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2010/02/project-euler-p15.html' title='Project Euler - P15'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-2841183454049682883</id><published>2009-12-31T11:30:00.000+08:00</published><updated>2009-12-31T11:30:38.378+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>English - Class Notes 05</title><content type='html'>&lt;b&gt;Vocabulary&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;rural&lt;/b&gt;: not in a city; in the countryside.&lt;/li&gt;&lt;li&gt;&lt;b&gt;amateur&lt;/b&gt;: not professional.&lt;/li&gt;&lt;li&gt;&lt;b&gt;elaborate&lt;/b&gt;: complex or fancy.&lt;/li&gt;&lt;li&gt;&lt;b&gt;barter&lt;/b&gt;: to exchange.&lt;/li&gt;&lt;li&gt;&lt;b&gt;embezzle&lt;/b&gt;: to steal money that you are responsible for or that belongs to your employer.&lt;/li&gt;&lt;li&gt;&lt;b&gt;bounce&lt;/b&gt;: if a cheque bounces, or a bank bounces it, the bank refuses to accept it because there is not enough money in the account.&lt;/li&gt;&lt;li&gt;&lt;b&gt;endorse&lt;/b&gt;: to write your name on the back of a cheque so that it can be paid into a bank account.&lt;/li&gt;&lt;li&gt;&lt;b&gt;loan shark&lt;/b&gt;: a person who lends money at very high rates of interest.&lt;/li&gt;&lt;li&gt;&lt;b&gt;frugal, stingy, pennysaver&lt;/b&gt;: using only as much money or food as is necessary.&lt;/li&gt;&lt;li&gt;&lt;b&gt;solvent&lt;/b&gt;: having enough money to pay your debts; not in debt.&lt;/li&gt;&lt;li&gt;&lt;b&gt;insolvent&lt;/b&gt;: not having enough money to pay your debts; not in debt.&lt;/li&gt;&lt;li&gt;&lt;b&gt;overdrawn&lt;/b&gt;: of a person 人 having taken more money out of your bank account than you have in it.&lt;/li&gt;&lt;li&gt;&lt;b&gt;postdated&lt;/b&gt;: in banking, postdated refers to checks which have been written by the maker for a date in the future.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-2841183454049682883?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/2841183454049682883/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=2841183454049682883' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2841183454049682883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2841183454049682883'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/12/english-class-notes-05.html' title='English - Class Notes 05'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-3688887874410703983</id><published>2009-12-16T08:51:00.000+08:00</published><updated>2009-12-16T08:51:47.146+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>English - Class Notes 04</title><content type='html'>&lt;b&gt;Numbers&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Temperature&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;1 &amp;#176;C&lt;/b&gt;: one degree Celsius&lt;/li&gt;&lt;li&gt;&lt;b&gt;1 &amp;#176;F&lt;/b&gt;: one degree Fahrenheit&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Time, for example 08:00&lt;br /&gt;&lt;ul&gt;&lt;li&gt;8 o'clock on the dot&lt;/li&gt;&lt;li&gt;8 o'clock sharp&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Fraction/Ratio&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;1/4&lt;/b&gt;: one over four&lt;/li&gt;&lt;li&gt;&lt;b&gt;1/3&lt;/b&gt;: one third&lt;/li&gt;&lt;li&gt;&lt;b&gt;2/3&lt;/b&gt;: two thirds&lt;/li&gt;&lt;li&gt;&lt;b&gt;4:1&lt;/b&gt;: four to one&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Currency&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;123,456&lt;/b&gt;: one hundred twenty-three thousand four hundred and fifty-six&lt;/li&gt;&lt;li&gt;&lt;b&gt;1,234.56&lt;/b&gt;: one thousand and two hundred thirty-four point five six &lt;/li&gt;&lt;li&gt;&lt;b&gt;1,000&lt;/b&gt;: one grand&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Space&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;1 m&lt;sup&gt;2&lt;/sup&gt;&lt;/b&gt;: one square metre&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-3688887874410703983?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/3688887874410703983/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=3688887874410703983' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3688887874410703983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3688887874410703983'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/12/english-class-notes-04.html' title='English - Class Notes 04'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-391066626637661868</id><published>2009-12-04T10:03:00.003+08:00</published><updated>2009-12-04T19:09:20.790+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='concept'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Java - Some Fundamental Concepts</title><content type='html'>&lt;b&gt;Method declaration in an interface&lt;/b&gt;, &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Correct&lt;/b&gt;:&lt;br /&gt;&lt;pre class="brush:java"&gt;abstract void doStuff();&lt;br /&gt;protected abstract void doStuff();&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Incorrect&lt;/b&gt;:&lt;br /&gt;&lt;pre class="brush:java"&gt;public abstract static void doStuff();&lt;br /&gt;private abstract void doStuff();&lt;br /&gt;final abstract void doStuff();&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Overloading &amp; Overriding&lt;/b&gt;, &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Cans&lt;/b&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Instance method can be overloaded.&lt;/li&gt;&lt;li&gt;Instance method can be overriden.&lt;/li&gt;&lt;li&gt;Static method can be overloaded.&lt;/li&gt;&lt;li&gt;Constructor can be overloaded.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Cants&lt;/b&gt;: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Static method can't be overriden.&lt;/li&gt;&lt;li&gt;Constructor can't be overriden.&lt;/li&gt;&lt;li&gt;Instance field can't be overloaded.&lt;/li&gt;&lt;li&gt;Instance field can't be overriden.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;A constructor may only access &lt;b&gt;final&lt;/b&gt; or &lt;b&gt;static&lt;/b&gt; attributes, therefore following is incorrect. &lt;br /&gt;&lt;pre class="brush:java"&gt;class Base { &lt;br /&gt;     private int value; &lt;br /&gt;      &lt;br /&gt;     Base (int v) { &lt;br /&gt;         value = v; &lt;br /&gt;     } &lt;br /&gt;  &lt;br /&gt;     public int getValue() { &lt;br /&gt;         return value; &lt;br /&gt;     } &lt;br /&gt; } &lt;br /&gt;  &lt;br /&gt; public class Derived extends Base { &lt;br /&gt;     int currentValue = 1; &lt;br /&gt;  &lt;br /&gt;     public Derived() { &lt;br /&gt;         super(currentValue); &lt;br /&gt;         currentValue++; &lt;br /&gt;     } &lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;An &lt;b&gt;assert&lt;/b&gt; statement can take any one of following two forms, method call isn't allowed:&lt;br /&gt;&lt;pre class="brush:java"&gt;assert Expression1; &lt;br /&gt;assert Expression1 : Expression2; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Inheritance and &lt;b&gt;abstract&lt;/b&gt; modifier, following are correct&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Method could be declared as abstract in a child.&lt;/li&gt;&lt;li&gt;Class could be declared as abstract even if it doesn't have any abstract method.&lt;/li&gt;&lt;li&gt;Static method can be overloaded.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Implementation of an interface&lt;/b&gt;, following code snippet isn't correct because all interface methods are default public methods.&lt;br /&gt;&lt;pre class="brush:java"&gt;interface Useable { &lt;br /&gt;   void doIt(); &lt;br /&gt;} &lt;br /&gt;  &lt;br /&gt;public class Test implements Useable {    &lt;br /&gt;   public Test(){} &lt;br /&gt;   void doIt() {} &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Notification in threads&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If a thread issues a notifyAll on an object without having acquired the lock for the object Java throws an IllegalMonitorStateException.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Appropriate uses for Assertion statements&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Should be used to validate private method parameters.&lt;/li&gt;&lt;li&gt;Should be used to check for cases that should never occur.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Interface and abstract constructors&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Abstract classes have constructors, and those constructors are always called when a concrete subclass is instantiated using the new operator.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-391066626637661868?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/391066626637661868/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=391066626637661868' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/391066626637661868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/391066626637661868'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/12/java-fundamental-concept.html' title='Java - Some Fundamental Concepts'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-1770735405059410318</id><published>2009-12-04T01:08:00.001+08:00</published><updated>2009-12-04T01:09:09.129+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='collections'/><category scheme='http://www.blogger.com/atom/ns#' term='concept'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Java - Classes Comparison</title><content type='html'>&lt;b&gt;Hashtable&lt;/b&gt; v.s. &lt;b&gt;HashMap&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Hashtable&lt;/b&gt;: Synchronized&lt;/li&gt;&lt;li&gt;&lt;b&gt;HashMap&lt;/b&gt;: Non synchronized&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;StringBuffer&lt;/b&gt; v.s. &lt;b&gt;StringBuilder&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;StringBuffer&lt;/b&gt;: Synchronized&lt;/li&gt;&lt;li&gt;&lt;b&gt;StringBuilder&lt;/b&gt;: Non synchronized&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;List&lt;/b&gt; v.s. &lt;b&gt;Set&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;List&lt;/b&gt;: Allow duplicate elements&lt;/li&gt;&lt;li&gt;&lt;b&gt;Set&lt;/b&gt;: Not allow duplicate elements&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-1770735405059410318?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/1770735405059410318/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=1770735405059410318' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/1770735405059410318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/1770735405059410318'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/12/java-classes-comparison.html' title='Java - Classes Comparison'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-5824184050738473561</id><published>2009-11-16T18:35:00.001+08:00</published><updated>2009-11-16T18:40:27.600+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pthread'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><title type='text'>C - pthread_cond_timedwait_relative_np example</title><content type='html'>Follow up of &lt;a href="http://kenwei.blogspot.com/2009/11/c-pthreadcondtimedwait-example.html"&gt;previous post&lt;/a&gt;, try to simulate the &lt;b&gt;sigtimedwait&lt;/b&gt; method due to the fact that the method is lacked in OS X.&lt;br /&gt;&lt;br /&gt;BTW, &lt;b&gt;ldd&lt;/b&gt; is also not found, just use &lt;b&gt;otool -L&lt;/b&gt; for an alternative.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;pthread.h&amp;gt;&lt;br /&gt;#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;#include &amp;lt;time.h&amp;gt;&lt;br /&gt;#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define SIG_A          (SIGUSR2 - 0)&lt;br /&gt;#define SIG_B          (SIGUSR2 - 1)&lt;br /&gt;#define SIG_C          (SIGQUIT)&lt;br /&gt;&lt;br /&gt;#define S  1&lt;br /&gt;#define F  0&lt;br /&gt;&lt;br /&gt;#define TIMES 10&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * data structure&lt;br /&gt; */&lt;br /&gt;typedef struct _proc {&lt;br /&gt;    char            name[2];&lt;br /&gt;    int             data;&lt;br /&gt;    pthread_t       thread;&lt;br /&gt;    pthread_mutex_t lock;&lt;br /&gt;    pthread_cond_t  cond;&lt;br /&gt;    long int        waits;&lt;br /&gt;    sigset_t        sigset;&lt;br /&gt;} PROC;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * variables&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;static PROC *listener;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * methods&lt;br /&gt; */&lt;br /&gt;void _exec_and_wait(void* args) {&lt;br /&gt;    PROC *proc = (PROC*) args;&lt;br /&gt;    static struct timespec time_to_wait = {0, 0};&lt;br /&gt;    // signal version&lt;br /&gt;    int recSignal;&lt;br /&gt;    while(proc-&gt;data &lt; 999) {&lt;br /&gt;        if (0 == sigwait(&amp;proc-&gt;sigset, &amp;recSignal)) {&lt;br /&gt;            pthread_mutex_lock(&amp;proc-&gt;lock);&lt;br /&gt;            switch (recSignal) {&lt;br /&gt;                case SIG_A:&lt;br /&gt;                    printf("proc[%s] receive SIG_A\n", proc-&gt;name);&lt;br /&gt;                    proc-&gt;data++;&lt;br /&gt;                break;&lt;br /&gt;                case SIG_B:&lt;br /&gt;                    printf("proc[%s] receive SIG_B\n", proc-&gt;name);&lt;br /&gt;                    proc-&gt;data += 5;&lt;br /&gt;                break;&lt;br /&gt;                case SIG_C:&lt;br /&gt;                    printf("proc[%s] receive SIG_C\n", proc-&gt;name);&lt;br /&gt;                    proc-&gt;data += 999;&lt;br /&gt;                break;&lt;br /&gt;                default:&lt;br /&gt;                    printf("proc[%s] receive unknow signal [%d]\n", proc-&gt;name, recSignal);&lt;br /&gt;            }&lt;br /&gt;            pthread_mutex_unlock(&amp;proc-&gt;lock);&lt;br /&gt;        } else {&lt;br /&gt;            printf("proc[%s] fail to receive signal [%d]\n", proc-&gt;name);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    printf("proc[%s] finished\n", proc-&gt;name);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void _exec_to_signal(void* args) {&lt;br /&gt;    PROC *proc = (PROC*) args;&lt;br /&gt;    static struct timespec time_to_wait = {0, 0};&lt;br /&gt;    int sig_sending;&lt;br /&gt; &lt;br /&gt;    if (listener != NULL) {&lt;br /&gt;        srand(time(NULL));&lt;br /&gt;        time_to_wait.tv_sec = proc-&gt;waits;&lt;br /&gt;        while(proc-&gt;data &lt; TIMES) {&lt;br /&gt;            pthread_mutex_lock(&amp;proc-&gt;lock);&lt;br /&gt;            pthread_cond_timedwait_relative_np(&amp;proc-&gt;cond, &amp;proc-&gt;lock, &amp;time_to_wait);&lt;br /&gt;            sig_sending = (rand() % 2 &gt; 0) ? SIG_A : SIG_B;&lt;br /&gt;            printf("proc[%s] is sending signal[%d]\n", proc-&gt;name, sig_sending);&lt;br /&gt;            pthread_kill(listener-&gt;thread, sig_sending);&lt;br /&gt;            proc-&gt;data++;&lt;br /&gt;            pthread_mutex_unlock(&amp;proc-&gt;lock);&lt;br /&gt;        }&lt;br /&gt;        printf("proc[%s] is sending signal[%d]\n", proc-&gt;name, SIG_C);&lt;br /&gt;        pthread_kill(listener-&gt;thread, SIG_C); // to terminate listener&lt;br /&gt;    } else {&lt;br /&gt;        printf("proc[%s] is aborting signal[%d], due to no listener registered\n", proc-&gt;name, SIG_A);&lt;br /&gt; }&lt;br /&gt; printf("proc[%s] finished\n", proc-&gt;name);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int _init_proc(PROC *proc, void *(*routine) (void *)) {&lt;br /&gt;    pthread_attr_t attr;&lt;br /&gt;    //&lt;br /&gt;    printf("try to init proc [%s]\n", proc-&gt;name);&lt;br /&gt;    pthread_attr_init(&amp;attr);&lt;br /&gt;    pthread_attr_setdetachstate(&amp;attr, PTHREAD_CREATE_JOINABLE);&lt;br /&gt;    //&lt;br /&gt;    pthread_mutex_init(&amp;proc-&gt;lock, NULL);&lt;br /&gt;    pthread_cond_init(&amp;proc-&gt;cond, NULL);&lt;br /&gt;    //&lt;br /&gt;    pthread_create(&amp;proc-&gt;thread, &amp;attr, routine, (void*) proc);&lt;br /&gt;    pthread_attr_destroy(&amp;attr);&lt;br /&gt;    //&lt;br /&gt;    return S;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int _init_signal_proc(PROC *proc, void *(*routine) (void *)) {&lt;br /&gt;    pthread_attr_t attr;&lt;br /&gt;    //&lt;br /&gt;    printf("try to init proc [%s]\n", proc-&gt;name);&lt;br /&gt;    //&lt;br /&gt;    sigemptyset(&amp;proc-&gt;sigset);&lt;br /&gt;    sigaddset(&amp;proc-&gt;sigset, SIG_A);&lt;br /&gt;    sigaddset(&amp;proc-&gt;sigset, SIG_B);&lt;br /&gt;    sigaddset(&amp;proc-&gt;sigset, SIG_C);&lt;br /&gt;    pthread_sigmask(SIG_BLOCK, &amp;(proc-&gt;sigset), NULL);&lt;br /&gt;    //&lt;br /&gt;    pthread_attr_init(&amp;attr);&lt;br /&gt;    pthread_attr_setdetachstate(&amp;attr, PTHREAD_CREATE_JOINABLE);&lt;br /&gt;    //&lt;br /&gt;    pthread_mutex_init(&amp;proc-&gt;lock, NULL);&lt;br /&gt;    //&lt;br /&gt;    pthread_create(&amp;proc-&gt;thread, &amp;attr, routine, (void*) proc);&lt;br /&gt;    pthread_attr_destroy(&amp;attr);&lt;br /&gt;    //&lt;br /&gt;    return S;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; *  main&lt;br /&gt; */&lt;br /&gt;int main(int argc, char** argv)&lt;br /&gt;{&lt;br /&gt;    int  result_a = 0, result_b = 0;&lt;br /&gt;    PROC proc_a, proc_b;&lt;br /&gt;&lt;br /&gt;    strcpy(proc_a.name, "A\0");&lt;br /&gt;    proc_a.data = 0;&lt;br /&gt;    proc_a.waits = 1L;&lt;br /&gt;&lt;br /&gt;    strcpy(proc_b.name, "B\0");&lt;br /&gt;    proc_b.data = 0;&lt;br /&gt;    proc_b.waits = 800L;&lt;br /&gt;&lt;br /&gt;    listener = &amp;proc_b;&lt;br /&gt;&lt;br /&gt;    if (!_init_proc(&amp;proc_a, _exec_to_signal))&lt;br /&gt;        printf("Fail to init proc [%s]\n", proc_a.name);&lt;br /&gt;    /* */&lt;br /&gt;    if (!_init_signal_proc(&amp;proc_b, _exec_and_wait))&lt;br /&gt;        printf("Fail to init proc [%s]\n", proc_b.name);&lt;br /&gt; &lt;br /&gt;    /* */&lt;br /&gt;    pthread_join(proc_a.thread, (void*) &amp;result_a);&lt;br /&gt;    pthread_join(proc_b.thread, (void*) &amp;result_b);&lt;br /&gt;&lt;br /&gt;    return (EXIT_SUCCESS);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-5824184050738473561?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/5824184050738473561/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=5824184050738473561' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5824184050738473561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5824184050738473561'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/11/c-pthreadcondtimedwaitrelativenp.html' title='C - pthread_cond_timedwait_relative_np example'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-6404722489514697467</id><published>2009-11-13T11:22:00.003+08:00</published><updated>2009-11-13T12:03:55.502+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pthread'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>C - pthread_cond_timedwait example</title><content type='html'>Follow up: try to use &lt;b&gt;pthread_cond_timedwait_relative_np&lt;/b&gt; on OS X.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;pthread.h&amp;gt;&lt;br /&gt;#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;#include &amp;lt;time.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define S  1&lt;br /&gt;#define F  0&lt;br /&gt;&lt;br /&gt;#define TIMES 10&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * data structure&lt;br /&gt; */&lt;br /&gt;typedef struct _proc {&lt;br /&gt;    char            name[2];&lt;br /&gt;    int             data;&lt;br /&gt;    pthread_t       thread;&lt;br /&gt;    pthread_mutex_t lock;&lt;br /&gt;    pthread_cond_t  cond;&lt;br /&gt;    long int        waits;&lt;br /&gt;} PROC;&lt;br /&gt;&lt;br /&gt;void _exec_and_wait(void* args) {&lt;br /&gt;    static struct timespec time_to_wait = {0, 0};&lt;br /&gt;    PROC *proc = (PROC*) args;&lt;br /&gt;&lt;br /&gt;    while(proc-&gt;data &lt; TIMES) {&lt;br /&gt;        time_to_wait.tv_sec = time(NULL) + proc-&gt;waits;&lt;br /&gt;        pthread_mutex_lock(&amp;proc-&gt;lock);&lt;br /&gt;        pthread_cond_timedwait(&amp;proc-&gt;cond, &amp;proc-&gt;lock, &amp;time_to_wait);&lt;br /&gt;        proc-&gt;data++;&lt;br /&gt;        printf("increase proc[%s] data to [%d]\n", proc-&gt;name, proc-&gt;data);&lt;br /&gt;        pthread_mutex_unlock(&amp;proc-&gt;lock);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int _init_proc(PROC *proc, void *(*routine) (void *)) {&lt;br /&gt;    pthread_attr_t attr;&lt;br /&gt;    //&lt;br /&gt;    printf("try to init proc [%s]\n", proc-&gt;name);&lt;br /&gt;    pthread_attr_init(&amp;attr);&lt;br /&gt;    pthread_attr_setdetachstate(&amp;attr, PTHREAD_CREATE_JOINABLE);&lt;br /&gt;    //&lt;br /&gt;    pthread_mutex_init(&amp;proc-&gt;lock, NULL);&lt;br /&gt;    pthread_cond_init(&amp;proc-&gt;cond, NULL);&lt;br /&gt;    //&lt;br /&gt;    pthread_create(&amp;proc-&gt;thread, &amp;attr, routine, (void*) proc);&lt;br /&gt;    pthread_attr_destroy(&amp;attr);&lt;br /&gt;    //&lt;br /&gt;    return S;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; *  main&lt;br /&gt; */&lt;br /&gt;int main(int argc, char** argv)&lt;br /&gt;{&lt;br /&gt;    int  result_a = 0, result_b = 0;&lt;br /&gt;    PROC proc_a, proc_b;&lt;br /&gt;&lt;br /&gt;    strcpy(proc_a.name, "A\0");&lt;br /&gt;    proc_a.data = 0;&lt;br /&gt;    proc_a.waits = 2L;&lt;br /&gt;&lt;br /&gt;    strcpy(proc_b.name, "B\0");&lt;br /&gt;    proc_b.data = 0;&lt;br /&gt;    proc_b.waits = 1L;&lt;br /&gt;&lt;br /&gt;    if (!_init_proc(&amp;proc_a, _exec_and_wait))&lt;br /&gt;        printf("Fail to init proc [%s]\n", proc_a.name);&lt;br /&gt;    /* */&lt;br /&gt;    if (!_init_proc(&amp;proc_b, _exec_and_wait))&lt;br /&gt;        printf("Fail to init proc [%s]\n", proc_b.name);&lt;br /&gt;    /* */&lt;br /&gt;    pthread_join(proc_a.thread, (void*) &amp;result_a);&lt;br /&gt;    pthread_join(proc_b.thread, (void*) &amp;result_b);&lt;br /&gt;&lt;br /&gt;    return (EXIT_SUCCESS);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-6404722489514697467?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/6404722489514697467/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=6404722489514697467' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/6404722489514697467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/6404722489514697467'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/11/c-pthreadcondtimedwait-example.html' title='C - pthread_cond_timedwait example'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-4946023952315928034</id><published>2009-11-10T10:22:00.000+08:00</published><updated>2009-11-10T10:22:25.077+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='porting'/><category scheme='http://www.blogger.com/atom/ns#' term='issue'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='memory'/><category scheme='http://www.blogger.com/atom/ns#' term='aix'/><title type='text'>AIX - Memory Allocation Segmentation Fault</title><content type='html'>Once again, there were segmentation faults occurred during the execution of my AIX porting application. After digging into the call stacks of the application, I found that it crashed frequently while allocating or dellocating small size of memories. No matter what the stack size I assigned to the system, it kept crashed.&lt;br /&gt;&lt;br /&gt;Then I spent few hours refering to the official AIX porting guidelines and finally got some hints on section 4.2 page 169. On AIX, there are many different memory allocation policies implemented as different allocators. Depends on the design of your applications, it is adjustable to change to any suitable allocator simply by declaring a environment variable, &lt;b&gt;MALLOCTYPE&lt;/b&gt;. Therefore I had a try to test different allocators, and the result was quite positive.&lt;br /&gt;&lt;br /&gt;P.S. the allocator I chose was &lt;b&gt;MALLOCTYPE=buckets&lt;/b&gt;, which was optimized for applications that require large numbers of small allocation requests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-4946023952315928034?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/4946023952315928034/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=4946023952315928034' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/4946023952315928034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/4946023952315928034'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/11/aix-memory-allocation-segmentation.html' title='AIX - Memory Allocation Segmentation Fault'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-3670006389451637412</id><published>2009-11-10T09:54:00.000+08:00</published><updated>2009-11-10T09:54:25.747+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>English - Class Notes 03</title><content type='html'>Some conjuctions&lt;br /&gt;&lt;ul&gt; &lt;li&gt;&lt;b&gt;because&lt;/b&gt; + n.c.&lt;/li&gt; &lt;li&gt;&lt;b&gt;since&lt;/b&gt; + n.c.&lt;/li&gt; &lt;li&gt;&lt;b&gt;so&lt;/b&gt; + n.c.&lt;/li&gt; &lt;li&gt;&lt;b&gt;due to the fact that&lt;/b&gt; + n.c.&lt;/li&gt; &lt;li&gt;&lt;b&gt;due to&lt;/b&gt; + n.p.&lt;/li&gt; &lt;li&gt;&lt;b&gt;because of&lt;/b&gt; + n.p.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Some phrases&lt;br /&gt;&lt;ul&gt; &lt;li&gt;&lt;b&gt;have to&lt;/b&gt; vs &lt;b&gt;must&lt;/b&gt;&lt;br /&gt;    &lt;ul&gt;        &lt;li&gt;&lt;b&gt;have to&lt;/b&gt;: outside authority.&lt;/li&gt;        &lt;li&gt;&lt;b&gt;must&lt;/b&gt;: self motivated.&lt;/li&gt;    &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;&lt;b&gt;humble&lt;/b&gt; vs &lt;b&gt;modest&lt;/b&gt;&lt;br /&gt;    &lt;ul&gt;        &lt;li&gt;&lt;b&gt;humble&lt;/b&gt;: soft of negative.&lt;/li&gt;        &lt;li&gt;&lt;b&gt;modest&lt;/b&gt;: kinda positive.&lt;/li&gt;    &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;&lt;b&gt;dynamic&lt;/b&gt; similar to &lt;b&gt;lively&lt;/b&gt;&lt;/li&gt; &lt;li&gt;&lt;b&gt;had better&lt;/b&gt; similar to &lt;b&gt;shall&lt;/b&gt; similar to &lt;b&gt;should&lt;/b&gt; similar to &lt;b&gt;could&lt;/b&gt;&lt;/li&gt; &lt;li&gt;&lt;b&gt;luggage&lt;/b&gt; equals to &lt;b&gt;baggage&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Some vocabularies&lt;br /&gt;&lt;ul&gt; &lt;li&gt;&lt;b&gt;filial&lt;/b&gt;: connected with the way children behave towards their parents.&lt;/li&gt; &lt;li&gt;&lt;b&gt;Filippino&lt;/b&gt;: means belonging or relating to the Philippines, or to its people or culture.&lt;/li&gt; &lt;li&gt;&lt;b&gt;wind chill factor&lt;/b&gt;: a phenomenon called the Wind Chill factor makes us feel colder in winter than the air temperature really is.&lt;/li&gt; &lt;li&gt;&lt;b&gt;punctually&lt;/b&gt;: if you are punctual, you do something or arrive somewhere at the right time and are not late.&lt;/li&gt; &lt;li&gt;&lt;b&gt;etiquette&lt;/b&gt;: is a set of customs and rules for polite behaviour, especially among a particular class of people or in a particular profession.&lt;/li&gt; &lt;li&gt;&lt;b&gt;netiquette&lt;/b&gt;: is the set of rules and customs that it is considered polite to follow when you are communicating by means of e-mail or the Internet.&lt;/li&gt; &lt;li&gt;&lt;b&gt;manner&lt;/b&gt;: the way that sth is done or happens.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-3670006389451637412?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/3670006389451637412/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=3670006389451637412' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3670006389451637412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3670006389451637412'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/11/english-class-notes-03.html' title='English - Class Notes 03'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-5425364230259380651</id><published>2009-11-06T18:14:00.001+08:00</published><updated>2009-11-06T18:18:32.685+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='pthread'/><category scheme='http://www.blogger.com/atom/ns#' term='porting'/><category scheme='http://www.blogger.com/atom/ns#' term='multithreading'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='aix'/><title type='text'>AIX - Multithread Program Segmentation Fault</title><content type='html'>Recently I encountered some difficulties to porting pthread base multithreading program to AIX platform. The problem was, one of my multithreaded programs always crashed due to unknown segmentation faults. Spent few days on testing and debugging, finally I found below useful information by google's help:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://unix.derkeiler.com/Newsgroups/comp.unix.aix/2004-07/0157.html"&gt;Reference&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This says, to prevent our multithreaded program from crashing by segmentation faults, we need to set an environment variable, &lt;b&gt;AIXTHREAD_STK&lt;/b&gt;, to change default thread stack size. Or, we could use the &lt;b&gt;pthread_attr_setstacksize()&lt;/b&gt; sub-routine alternatively.&lt;br /&gt;&lt;br /&gt;Then I changed the environment variable &lt;b&gt;AIXTHREAD_STK&lt;/b&gt; to a larger number, and thankfully it did worked.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-5425364230259380651?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/5425364230259380651/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=5425364230259380651' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5425364230259380651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5425364230259380651'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/11/aix-multithread-program-segmentation.html' title='AIX - Multithread Program Segmentation Fault'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-6060398163391980662</id><published>2009-10-22T14:13:00.002+08:00</published><updated>2009-10-26T09:19:59.432+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>English - Class Note 02</title><content type='html'>&lt;b&gt;Was Ving &amp; Ved&lt;/b&gt;&lt;br /&gt;Saying &lt;b&gt;was ving&lt;/b&gt; to emphasize what was doing during previous period, and saying &lt;b&gt;ved&lt;/b&gt; to emphasize the presented result.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;was Ving - &lt;br/&gt;I was working on the software development project at that time.&lt;/li&gt;&lt;li&gt;Ved      - &lt;br/&gt;I worked for the company few years ago.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;V = Ving&lt;/b&gt;&lt;br /&gt;Sometimes using &lt;b&gt;v&lt;/b&gt; is the same as &lt;b&gt;ving&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I work on the project = I am working on the project&lt;/li&gt;&lt;li&gt;I live in Taipei = I am living in Taipei&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;hope &amp; wish&lt;/b&gt;&lt;br /&gt;Using &lt;b&gt;hope ... can&lt;/b&gt; for something which is possible. On the other hand, using &lt;b&gt;wish ... could&lt;/b&gt; for which impossible.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I hope I can and maybe be I will.&lt;/li&gt;&lt;li&gt;I wish I could but I can't.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Verb choosing&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;mail letters&lt;/li&gt;&lt;li&gt;deliver good&lt;/li&gt;&lt;li&gt;courier package&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Punctuations&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;.&lt;/b&gt; - full stop, add two spaces&lt;/li&gt;&lt;li&gt;&lt;b&gt;,&lt;/b&gt; - pause, add one space&lt;/li&gt;&lt;li&gt;&lt;b&gt;;&lt;/b&gt; - between full stop and pause, add one space&lt;/li&gt;&lt;li&gt;&lt;b&gt;-&lt;/b&gt; - minor additional information, add one space&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Additional&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Golden Gate Bridge is a suspension bridge&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-6060398163391980662?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/6060398163391980662/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=6060398163391980662' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/6060398163391980662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/6060398163391980662'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/10/english-class-note-02.html' title='English - Class Note 02'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-6510754283425038728</id><published>2009-10-15T10:46:00.001+08:00</published><updated>2009-10-15T10:51:26.178+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='macro'/><title type='text'>C - Macro</title><content type='html'>Some example of C macro usages:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Literal/Number declaration&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;&lt;br /&gt;#define PI 3.14159&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Code Fragment I : Code Fragment Delcaration&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;&lt;br /&gt;#define pf(str)     printf(str)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Code Fragment II : Variable Parameters&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;&lt;br /&gt;#define pf(str, ...)  printf(str, __VA_ARGS__)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Code Fragment III : Parameter as String&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;&lt;br /&gt;#define run(method)  printf("Runing %s\n", #method); \ &lt;br /&gt;                     method();&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Code Fragment IV : Parameter Variation&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;&lt;br /&gt;#define pf(method)  method##_debug("debug was called"); \ &lt;br /&gt;                    method##_info("info was called");&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-6510754283425038728?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/6510754283425038728/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=6510754283425038728' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/6510754283425038728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/6510754283425038728'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/10/c-macro.html' title='C - Macro'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-5523264004410177967</id><published>2009-10-13T15:46:00.001+08:00</published><updated>2009-10-13T15:47:23.580+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>English - Class Notes 01</title><content type='html'>&lt;b&gt;habit &amp; hobby&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;habit&lt;/b&gt; stands for what you used to do.&lt;/li&gt;&lt;li&gt;&lt;b&gt;hobby&lt;/b&gt; stands for what you are interesting in.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;nice to meet you&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In response, says &lt;b&gt;you too&lt;/b&gt;, &lt;b&gt;same here&lt;/b&gt;, &lt;b&gt;likewise&lt;/b&gt; or &lt;b&gt;for me too&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;The difference between &lt;b&gt;nice to meet you&lt;/b&gt; and &lt;b&gt;nice meeting you&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Nice to meet you&lt;/b&gt; usually be used at the beginning of an encounter.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Nice meeting you&lt;/b&gt; commonly be used as farewell.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-5523264004410177967?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/5523264004410177967/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=5523264004410177967' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5523264004410177967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5523264004410177967'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/10/english-class-notes-01.html' title='English - Class Notes 01'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-2037957569524261594</id><published>2009-10-08T18:15:00.003+08:00</published><updated>2009-10-09T09:18:38.115+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data type'/><category scheme='http://www.blogger.com/atom/ns#' term='wchar_t'/><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>C - Using wchar_t on Windows platform</title><content type='html'>&lt;b&gt;The wchar_t Data Type&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;wchar_t&lt;/b&gt; represents the "wide char" data type in Windows platform, which aims to be capable of storing 2-byte format Unicode characters. To declare constant literals to &lt;b&gt;wchar_t&lt;/b&gt; datatype, just put an &lt;b&gt;L&lt;/b&gt; before it:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;const wchar_t *pGreeting = L"Hello World";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Reference:&lt;br /&gt;&lt;a href="http://www.joelonsoftware.com/articles/Unicode.html"&gt;The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://74.125.153.132/search?q=cache:OAKqnBPpmGQJ:bytes.com/topic/c/answers/438552-c-wchar_t-unicode-all-stuff+wchar_t+using&amp;cd=1&amp;hl=zh-TW&amp;ct=clnk&amp;gl=tw"&gt;C++, wchar_t, Unicode and all that stuff&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-2037957569524261594?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/2037957569524261594/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=2037957569524261594' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2037957569524261594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2037957569524261594'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/10/c-using-wchart-in-windows-platform.html' title='C - Using wchar_t on Windows platform'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-3034796825950586295</id><published>2009-10-02T14:20:00.001+08:00</published><updated>2009-10-02T14:21:21.800+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='porting'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='compiler'/><category scheme='http://www.blogger.com/atom/ns#' term='aix'/><title type='text'>AIX - XL C/C++ compiler options for share objects</title><content type='html'>To generate shared libraries for runtime dynamic linking on AIX with XL C/C++ compiler, must use -G &amp; -qmkshrobj options.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:shell"&gt;xlc -G -qmkshrobj shrobj.c -o libshrobj.so&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And, for runtime linking to the generated shared library, must use -brtl option.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:shell"&gt;xlc main.c -brtl -lshrobj&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-3034796825950586295?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/3034796825950586295/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=3034796825950586295' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3034796825950586295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3034796825950586295'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/10/aix-xl-cc-compiler-options-for-share.html' title='AIX - XL C/C++ compiler options for share objects'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-8756338914870386478</id><published>2009-10-01T09:23:00.002+08:00</published><updated>2009-10-01T09:28:58.467+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='endianess'/><category scheme='http://www.blogger.com/atom/ns#' term='memory'/><category scheme='http://www.blogger.com/atom/ns#' term='computer science'/><title type='text'>Knowledge - Big Endian &amp; Little Endian</title><content type='html'>There are two kinds of design architecture for memory storage: Big Endian &amp; Little Endian. Some references are listed as blew:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/102025/en-us/"&gt;Microsoft Knowledge Database&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cywu.blogspot.com/2006/08/endianness-endiannessendiannessbig.html"&gt;Discussion A&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.vckbase.com/smileonce/archive/2005/02/22/3202.aspx"&gt;Discussion B&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-8756338914870386478?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/8756338914870386478/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=8756338914870386478' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8756338914870386478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8756338914870386478'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/10/cs-big-endian-little-endian.html' title='Knowledge - Big Endian &amp; Little Endian'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-8609645174006916496</id><published>2009-09-29T11:39:00.003+08:00</published><updated>2009-10-01T09:28:27.082+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='porting'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='compiler'/><category scheme='http://www.blogger.com/atom/ns#' term='aix'/><title type='text'>AIX - Compiling GCC programming with XLC</title><content type='html'>Some reference here:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp"&gt;XLC Information Center&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www-01.ibm.com/support/docview.wss?rs=2030&amp;context=SSJT9L&amp;q1=gxlcppoptionmaptabl&amp;uid=swg27006740&amp;loc=zh_TW&amp;cs=utf-8&amp;lang=en+zh"&gt;XLC &amp; GCC Option Mappings&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/compiler/ref/rmapgxlc.htm"&gt;Reusing GCC options with XLC&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-8609645174006916496?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/8609645174006916496/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=8609645174006916496' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8609645174006916496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8609645174006916496'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/09/aix-compiling-gcc-programming-with-xlc.html' title='AIX - Compiling GCC programming with XLC'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-1653817888691373040</id><published>2009-09-15T17:49:00.007+08:00</published><updated>2009-12-23T12:25:50.337+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='file operation'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>C - Get File Length</title><content type='html'>&lt;b&gt;Code Snippet to Know File Length&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;fseek (fileName, 0L, SEEK_END);  &lt;br /&gt;len = ftell (fileName);  &lt;br /&gt;fseek (fileName, len, SEEK_SET);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-1653817888691373040?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/1653817888691373040/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=1653817888691373040' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/1653817888691373040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/1653817888691373040'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/09/c-learning-note-part-size-get-file.html' title='C - Get File Length'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-5868850914761742334</id><published>2009-09-14T19:46:00.003+08:00</published><updated>2009-09-15T09:35:27.300+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Project Euler - P14</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=14"&gt;Problem 14&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;C Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;#define MAX 1000000&lt;br /&gt;int main(void) {&lt;br /&gt; unsigned int n = 2, current = n, solution = 0;&lt;br /&gt; int max_count = 1, count;&lt;br /&gt;&lt;br /&gt; for (; n &lt;= MAX; n++) {&lt;br /&gt;  count = 1;&lt;br /&gt;  current = n;&lt;br /&gt;  while (current != 1) {&lt;br /&gt;   if (current % 2 == 1) {&lt;br /&gt;    current = 3 * current + 1;&lt;br /&gt;   } else {&lt;br /&gt;    current /= 2;&lt;br /&gt;   }&lt;br /&gt;   count++;&lt;br /&gt;  }&lt;br /&gt;  if (max_count &lt; count) {&lt;br /&gt;   max_count = count;&lt;br /&gt;   solution = n;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; printf("The max chain (%d) found in %u is started by %u", max_count, MAX, solution);&lt;br /&gt;&lt;br /&gt; return EXIT_SUCCESS;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-5868850914761742334?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/5868850914761742334/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=5868850914761742334' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5868850914761742334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5868850914761742334'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/09/project-euler-problem-14.html' title='Project Euler - P14'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-395576427020419787</id><published>2009-09-14T18:11:00.002+08:00</published><updated>2009-10-09T09:19:00.688+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='inline'/><category scheme='http://www.blogger.com/atom/ns#' term='trick'/><title type='text'>C - Inline Functions</title><content type='html'>&lt;b&gt;Inline in C&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;inline&lt;/b&gt; keyword would suggest compiler to translate the declared function as inlined program in order to reduce corresponding efforts of the method call executions.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://74.125.153.132/search?q=cache:http://www.greenend.org.uk/rjk/2003/03/inline.html"&gt;Inline Functions in C&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-395576427020419787?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/395576427020419787/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=395576427020419787' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/395576427020419787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/395576427020419787'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/09/life-at-trend-life-of-learning-new_14.html' title='C - Inline Functions'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-7986672940216738571</id><published>2009-09-08T15:07:00.003+08:00</published><updated>2009-10-09T09:19:11.928+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='issue'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>C - Variable Declarations</title><content type='html'>&lt;b&gt;Quick Note : The First Rule of C Variable Declaration&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Variable definitions must be at top of blocks for ANSI C. @_@&lt;br /&gt;&lt;br /&gt;Reference:&lt;br /&gt;&lt;a href="http://bbs.wefong.com/archiver/?tid-1389736.html"&gt;typedef 跟採用全域變數的問題&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-7986672940216738571?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/7986672940216738571/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=7986672940216738571' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7986672940216738571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7986672940216738571'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/09/life-at-trend-life-of-learning-new_08.html' title='C - Variable Declarations'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-5614953304766434408</id><published>2009-09-08T13:58:00.002+08:00</published><updated>2009-10-09T09:19:24.596+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='memory'/><category scheme='http://www.blogger.com/atom/ns#' term='computer science'/><title type='text'>C - Memory</title><content type='html'>&lt;b&gt;Memory Manipulation&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To master C/C++ programming language, a well understanding of memory manipulation is the fundamental prerequisite. Till now, I finally understand why most C/C++ books always use chapters to explain relative topics. It does matters!&lt;br /&gt;&lt;br /&gt;Some reference as blow:&lt;br /&gt;&lt;a href="http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/topic/com.ibm.vacpp7a.doc/compiler/ref/rnpgpack.htm"&gt;#pragma pack directive&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Data_structure_alignment"&gt;Data Structure Alignment&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-5614953304766434408?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/5614953304766434408/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=5614953304766434408' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5614953304766434408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5614953304766434408'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/09/life-at-trend-life-of-learning-new.html' title='C - Memory'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-8083367371290954670</id><published>2009-09-01T19:31:00.006+08:00</published><updated>2009-10-09T09:19:36.810+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='issue'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>C - Win32 Header File Issue</title><content type='html'>&lt;b&gt;Quick Note: Solving Header File Conflict in Win32 Platform&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If encountering a &lt;b&gt;'fd_set' : 'struct' type redefinition&lt;/b&gt; issue during the compile of socket related programs on win32 platform. Remember to use following macro to solve the header file conflict.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:shell"&gt;WIN32_LEAN_AND_MEAN&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Reference: &lt;a href="http://74.125.153.132/search?q=cache:kawSGefc4OQJ:www.cppblog.com/ngaut/archive/2007/04/23/22658.aspx+winsock2.h+fd_set+type+redefinition&amp;cd=2&amp;hl=zh-TW&amp;ct=clnk&amp;gl=tw"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-8083367371290954670?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/8083367371290954670/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=8083367371290954670' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8083367371290954670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8083367371290954670'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/09/life-at-trend-life-of-learning-c-note.html' title='C - Win32 Header File Issue'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-7143262576743215274</id><published>2009-09-01T14:02:00.009+08:00</published><updated>2009-10-09T09:19:47.431+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>C - IDE</title><content type='html'>&lt;b&gt;C/C++ IDE&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I had spent some times trying to find an C/C++ IDE for multi-platform programming (both on Linux and Windows), unfortunately no suitable solution was found.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codeblocks.org/"&gt;Code::Blocks&lt;/a&gt; is currently the best to me, but still not that well as I expected. &lt;br /&gt;&lt;br /&gt;Hoping &lt;a href="http://plugins.intellij.net/plugin/?id=1373"&gt;IntelliJ's C/C++ plugin&lt;/a&gt; could keep development and improving, it is really the best IDE I have ever used. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-7143262576743215274?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/7143262576743215274/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=7143262576743215274' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7143262576743215274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7143262576743215274'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/09/life-at-trend-life-of-learning-c-ide-01.html' title='C - IDE'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-3193241803705770738</id><published>2009-08-07T08:15:00.001+08:00</published><updated>2009-10-07T08:16:46.068+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P13</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=13"&gt;Problem 13&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Groovy Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;def matrix = [[37,107,287,533,902,102,798,797,998,220,837,590,246,510,135,740,250],&lt;br /&gt;              [46,376,937,677,490,  9,712,648,124,896,970, 78, 50,417, 18,260,538],&lt;br /&gt;              [74,324,986,199,524,741, 59,474,233,309,513, 58,123,726,617,309,629],&lt;br /&gt;              [91,942,213,363,574,161,572,522,430,563,301,811, 72,406,154,908,250],&lt;br /&gt;              [23, 67,588,207,539,346,171,171,980,310,421, 47,513,778, 63,246,676],&lt;br /&gt;              [89,261,670,696,623,633,820,136,378,418,383,684,178,734,361,726,757],&lt;br /&gt;              [28,112,879,812,849,979,408, 65,481,931,592,621,691,275,889,832,738],&lt;br /&gt;              [44,274,228,917,432,520,321,923,589,422,876,796,487,670,272,189,318],&lt;br /&gt;              [47,451,445,736,  1,306,439, 91,167,216,856,844,588,711,603,153,276],&lt;br /&gt;              [70,386,486,105,843, 25,439,939,619,828,917,593,665,686,757,934,951],&lt;br /&gt;              [62,176,457,141,856,560,629,502,157,223,196,586,755, 79,324,193,331],&lt;br /&gt;              [64,906,352,462,741,904,929,101,432,445,813,822,663,347,944,758,178],&lt;br /&gt;              [92,575,867,718,337,217,661,963,751,590,579,239,728,245,598,838,407],&lt;br /&gt;              [58,203,565,325,359,399,  8,402,633,568,948,830,189,458,628,227,828],&lt;br /&gt;              [80,181,199,384,826,282, 14,278,194,139,940,567,587,151,170, 94,390],&lt;br /&gt;              [35,398,664,372,827,112,653,829,987,240,784,473, 53,190,104,293,586],&lt;br /&gt;              [86,515,506,  6,295,864,861,532, 75,273,371,959,191,420,517,255,829],&lt;br /&gt;              [71,693,888,707,715,466,499,115,593,487,603,532,921,714,970, 56,938],&lt;br /&gt;              [54,370, 70,576,826,684,624,621,495,650, 76,471,787,294,438,377,604],&lt;br /&gt;              [53,282,654,108,756,828,443,191,190,634,694, 37,855,217,779,295,145],&lt;br /&gt;              [36,123,272,525,  0,296, 71, 75, 82,563,815,656,710,885,258,350,721],&lt;br /&gt;              [45,876,576,172,410,976,447,339,110,607,218,265,236,877,223,636, 45],&lt;br /&gt;              [17,423,706,905,851,860,660,448,207,621,209,813,287,860,733,969,412],&lt;br /&gt;              [81,142,660,418, 86,830,619,328,460,811,191, 61,556,940,512,689,692],&lt;br /&gt;              [51,934,325,451,728,388,641,918, 47, 49,293,215, 58,642,563, 49,483],&lt;br /&gt;              [62,467,221,648,435, 76,201,727,918, 39,944,693,  4,732,956,340,691],&lt;br /&gt;              [15,732,444,386,908,125,794,514, 89, 57,706,229,429,197,107,928,209],&lt;br /&gt;              [55, 37,687,525,678,773, 91,862,540,744,969,844,508,330,393,682,126],&lt;br /&gt;              [18,336,384,825,330,154,686,196,124,348,767,681,297,534,375,946,515],&lt;br /&gt;              [80,386,287,592,878,490,201,521,685,554,828,717,201,219,257,766,954],&lt;br /&gt;              [78,182,833,757,993,103,614,740,356,856,449, 95,527, 97,864,797,581],&lt;br /&gt;              [16,726,320,100,436,897,842,553,539,920,931,837,441,497,806,860,984],&lt;br /&gt;              [48,403, 98,129, 77,791,799, 88,218,795,327,364,475,675,590,848, 30],&lt;br /&gt;              [87, 86,987,551,392,711,854,517, 78,544,161,852,424,320,693,150,332],&lt;br /&gt;              [59,959,406,895,756,536,782,107, 74,926,966,537,676,326,235,447,210],&lt;br /&gt;              [69,793,950,679,652,694,742,597,709,739,166,693,763, 42,633,987, 85],&lt;br /&gt;              [41, 52,684,708,299, 85,211,399,427,365,734,116,182,760,315,  1,271],&lt;br /&gt;              [65,378,607,361,501, 80,857,  9,149,939,512,557, 28,198,746,  4,375],&lt;br /&gt;              [35,829, 35,317,434,717,326,932,123,578,154,982,629,742,552,737,307],&lt;br /&gt;              [94,953,759,765,105,305,946,966, 67,683,156,574,377,167,401,875,275],&lt;br /&gt;              [88,902,802,571,733,229,619,176,668,713,819,931,811, 48,770,190,271],&lt;br /&gt;              [25,267,680,276, 78,  3, 13,678,680,992,525,463,401, 61,632,866,526],&lt;br /&gt;              [36,270,218,540,497,705,585,629,946,580,636,237,993,140,746,255,962],&lt;br /&gt;              [24, 74,486,908,231,174,977,792,365,466,257,246,923,322,810,917,141],&lt;br /&gt;              [91,430,288,197,103,288,597,806,669,760,892,938,638,285, 25,333,403],&lt;br /&gt;              [34,413, 65,578, 16,127,815,921,815,  5,561,868,836,468,420, 90,470],&lt;br /&gt;              [23, 53, 81,172,816,430,487,623,791,969,842,487,255, 36,638,784,583],&lt;br /&gt;              [11,487,696,932,154,902,810,424, 20,138,335,124,462,181,441,773,470],&lt;br /&gt;              [63,783,299,490,636,259,666,498,587,618,221,225,225,512,486,764,533],&lt;br /&gt;              [67,720,186,971,698,544,312,419,572,409,913,959,  8,952,310, 58,822],&lt;br /&gt;              [95,548,255,300,263,520,781,532,296,796,249,481,641,953,868,218,774],&lt;br /&gt;              [76, 85,327,132,285,723,110,424,803,456,124,867,697, 64,507,995,236],&lt;br /&gt;              [37,774,242,535,411,291,684,276,865,538,926,205, 24,910,326,572,967],&lt;br /&gt;              [23,701,913,275,725,675,285,653,248,258,265,463, 92,207, 58,596,522],&lt;br /&gt;              [29,798,860,272,258,331,913,126,375,147,341,994,889,534,765,745,501],&lt;br /&gt;              [18,495,701,454,879,288,984,856,827,726, 77,713,721,403,798,879,715],&lt;br /&gt;              [38,298,203,783, 31,473,527,721,580,348,144,513,491,373,226,651,381],&lt;br /&gt;              [34,829,543,829,199,918,180,278,916,522,431, 27,392,251,122,869,539],&lt;br /&gt;              [40,957,953, 66,405,232,632,538, 44,100, 59,654,939,159,879,593,635],&lt;br /&gt;              [29,746,152,185,502,371,307,642,255,121,183,693,803,580,388,584,903],&lt;br /&gt;              [41,698,116,222, 72,977,186,158,236,678,424,689,157,993,532,961,922],&lt;br /&gt;              [62,467,957,194,401,269, 43,877,107,275, 48,102,390,895,523,597,457],&lt;br /&gt;              [23,189,706,772,547,915, 61,505,504,953,922,979,530,901,129,967,519],&lt;br /&gt;              [86,188, 88,225,875,314,529,584, 99,251,203,829,  9,407,770,775,672],&lt;br /&gt;              [11,306,739,708,304,724,483,816,533,873,502,340,845,647, 58, 77,308],&lt;br /&gt;              [82,959,174,767,140,363,198,  8,187,129, 11,875,491,310,547,126,581],&lt;br /&gt;              [97,623,331, 44,818,386,269,515,456,334,926,366,572,897,563,400,500],&lt;br /&gt;              [42,846,280,183,517, 70,527,831,839,425,882,145,521,227,251,250,327],&lt;br /&gt;              [55,121,603,546,981,200,581,762,165,212,827,652,751,691,296,897,789],&lt;br /&gt;              [32,238,195,734,329,339,946,437,501,907,836,945,765,883,352,399,886],&lt;br /&gt;              [75,506,164,965,184,775,180,738,168,837,861, 91,527,357,929,701,337],&lt;br /&gt;              [62,177,842,752,192,623,401,942,399,639,168, 44,983,993,173,312,731],&lt;br /&gt;              [32,924,185,707,147,349,566,916,674,687,634,660,915, 35,914,677,504],&lt;br /&gt;              [99,518,671,430,235,219,628,894,890,102,423,325,116,913,619,626,622],&lt;br /&gt;              [73,267,460,800,591,547,471,830,798,392,868,535,206,946,944,540,724],&lt;br /&gt;              [76,841,822,524,674,417,161,514, 36,427,982,273,348, 55,556,214,818],&lt;br /&gt;              [97,142,617,910,342,598,647,204,516,893,989,422,179,826, 88, 76,852],&lt;br /&gt;              [87,783,646,182,799,346,313,767,754,307,809,363,333, 18,982,642, 90],&lt;br /&gt;              [10,848,802,521,674,670,883,215,120,185,883,543,223,812,876,952,786],&lt;br /&gt;              [71,329,612,474,782,464,538,636,993,  9, 49,310,363,619,763,878, 39],&lt;br /&gt;              [62,184, 73,572,399,794,223,406,235,393,808,339,651,327,408, 11,116],&lt;br /&gt;              [66,627,891,981,488, 87,797,941,876,876,144,230, 30,984,490,851,411],&lt;br /&gt;              [60,661,826,293,682,836,764,744,779,239,180,335,110,989, 69,790,714],&lt;br /&gt;              [85,786,944, 89,552,990,653,640,447,425,576, 83,659,976,645,795, 96],&lt;br /&gt;              [66, 24,396,409,905,389,607,120,198,219,976, 47,599,490,197,230,297],&lt;br /&gt;              [64,913,982,680, 32,973,156, 37,120, 41,377,903,785,566, 85, 89,252],&lt;br /&gt;              [16,730,939,319,872,750,275,468,906,903,707,539,413, 42,652,315, 11],&lt;br /&gt;              [94,809,377,245, 48,795,150,954,100,921,645,863,754,710,598,436,791],&lt;br /&gt;              [78,639,167, 21,187,492,431,995,700,641,917,969,777,599, 28,300,699],&lt;br /&gt;              [15,368,713,711,936,614,952,811,305,876,380,278,410,754,449,733, 78],&lt;br /&gt;              [40,789,923,115,535,562,561,142,322,423,255, 33,685,442,488,917,353],&lt;br /&gt;              [44,889,911,501,440,648, 20,369, 68, 63,960,672,322,193,204,149,535],&lt;br /&gt;              [41,503,128,880,339,536, 53,299,340,368,  6,977,710,650,566,631,954],&lt;br /&gt;              [81,234,880,673,210,146,739, 58,568,557,934,581,403,627,822,703,280],&lt;br /&gt;              [82,616,570,773,948,327,592,232,845,941,706,525, 94,512,325,230,608],&lt;br /&gt;              [22,918,802, 58,777,319,719,839,450,180,888, 72,429,661,980,811,197],&lt;br /&gt;              [77,158,542,502, 16,545, 90,413,245,809,786,882,778,948,721,859,617],&lt;br /&gt;              [72,107,838,435, 69,186,155,435,662,884, 62,257,473,692,284,509,516],&lt;br /&gt;              [20,849,603,980,134,  1,723,930,671,666,823,555,245,252,804,609,722],&lt;br /&gt;              [53,503,534,226,472,524,250,874, 54, 75,591,789,781,264,330,331,690]]&lt;br /&gt;&lt;br /&gt;def p_sum = 0&lt;br /&gt;def sum = []&lt;br /&gt;&lt;br /&gt;for (int i = 16; i &gt;= 0; i--) {&lt;br /&gt;    def ts = (int) (p_sum + matrix.collect { it[i] }.sum())&lt;br /&gt;    sum.add(0, ts % 1000)&lt;br /&gt;    p_sum = (int) (ts / 1000)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (p_sum &gt; 0) {&lt;br /&gt;    sum.add(0, p_sum)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;print "sum -&gt; "&lt;br /&gt;sum.each {&lt;br /&gt;    print it&lt;br /&gt;}&lt;br /&gt;println ""&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-3193241803705770738?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/3193241803705770738/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=3193241803705770738' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3193241803705770738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3193241803705770738'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/08/project-euler-p13.html' title='Project Euler - P13'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-6560854281305300477</id><published>2009-08-07T08:14:00.000+08:00</published><updated>2009-10-07T08:15:50.687+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P12</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=12"&gt;Problem 12&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Groovy Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;def tn = 1, n = 100&lt;br /&gt;def r, max, c&lt;br /&gt;def f = 0&lt;br /&gt;&lt;br /&gt;while (f &lt;= 500) {&lt;br /&gt;    f = 0&lt;br /&gt;    n++&lt;br /&gt;    r = 1..n&lt;br /&gt;    tn = r.sum()&lt;br /&gt;    //r = 1..tn&lt;br /&gt;    //r.each { f+= (tn % it == 0 ? 1 : 0) }&lt;br /&gt;    c = 1&lt;br /&gt;    max = tn&lt;br /&gt;    def fn = "${n}th ${tn} : "&lt;br /&gt;    while (c &lt; max) {&lt;br /&gt;        if (tn % c == 0) {&lt;br /&gt;            max = (int)(tn / c)&lt;br /&gt;            f += (max == c ? 1 : 2)&lt;br /&gt;            //fn += "$c $max "&lt;br /&gt;        }&lt;br /&gt;        c++&lt;br /&gt;    }&lt;br /&gt;    fn += " --&gt; $f"&lt;br /&gt;    if (f &gt; 100) {&lt;br /&gt;       println fn&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println "${n}th triangle -&gt; $tn"&lt;br /&gt;println "factor size -&gt; $f"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-6560854281305300477?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/6560854281305300477/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=6560854281305300477' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/6560854281305300477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/6560854281305300477'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/08/project-euler-p12.html' title='Project Euler - P12'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-6833446288509600925</id><published>2009-08-07T08:12:00.001+08:00</published><updated>2009-10-07T08:14:03.737+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P11</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=11"&gt;Problem 11&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Groovy Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;def matrix = [[ 8,  2, 22, 97, 38, 15,  0, 40,  0, 75,  4,  5,  7, 78, 52, 12, 50, 77, 91,  8],&lt;br /&gt;              [49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48,  9, 56, 62,  0],&lt;br /&gt;              [81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30,  3, 49, 13, 36, 65],&lt;br /&gt;              [52, 70, 95, 23,  4, 60, 11, 42, 69, 24, 68, 56,  1, 32, 56, 71, 37,  2, 36, 91],&lt;br /&gt;              [22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80],&lt;br /&gt;              [24, 47, 32, 60, 99,  3, 45,  2, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50],&lt;br /&gt;              [32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70],&lt;br /&gt;              [67, 26, 20, 68,  2, 62, 12, 20, 95, 63, 94, 39, 63,  8, 40, 91, 66, 49, 94, 21],&lt;br /&gt;              [24, 55, 58,  5, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72],&lt;br /&gt;              [21, 36, 23,  9, 75,  0, 76, 44, 20, 45, 35, 14,  0, 61, 33, 97, 34, 31, 33, 95],&lt;br /&gt;              [78, 17, 53, 28, 22, 75, 31, 67, 15, 94,  3, 80,  4, 62, 16, 14,  9, 53, 56, 92],&lt;br /&gt;              [16, 39,  5, 42, 96, 35, 31, 47, 55, 58, 88, 24,  0, 17, 54, 24, 36, 29, 85, 57],&lt;br /&gt;              [86, 56,  0, 48, 35, 71, 89,  7,  5, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58],&lt;br /&gt;              [19, 80, 81, 68,  5, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77,  4, 89, 55, 40],&lt;br /&gt;              [ 4, 52,  8, 83, 97, 35, 99, 16,  7, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66],&lt;br /&gt;              [88, 36, 68, 87, 57, 62, 20, 72,  3, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69],&lt;br /&gt;              [ 4, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18,  8, 46, 29, 32, 40, 62, 76, 36],&lt;br /&gt;              [20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74,  4, 36, 16],&lt;br /&gt;              [20, 73, 35, 29, 78, 31, 90,  1, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57,  5, 54],&lt;br /&gt;              [ 1, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52,  1, 89, 19, 67, 48]]&lt;br /&gt;&lt;br /&gt;def max = 0, sum = 1&lt;br /&gt;for (int i = 0; i &lt; matrix.size(); i++) {&lt;br /&gt;    for (int j = 0; j &lt; matrix[i].size(); j++) {&lt;br /&gt;            if (matrix[i][j] == 0) continue&lt;br /&gt;                for (int k = 0; k &lt; 4; k++) {&lt;br /&gt;                    sum = 0&lt;br /&gt;                    switch (k) {&lt;br /&gt;                            case 0:&lt;br /&gt;                                    if (j &gt; matrix.size() - 4) continue&lt;br /&gt;                                        sum = matrix[i][j] * matrix[i][j + 1] * matrix[i][j + 2] * matrix[i][j + 3]&lt;br /&gt;                                        break&lt;br /&gt;                                case 1:&lt;br /&gt;                                    if (i &gt; matrix.size() - 4) continue&lt;br /&gt;                                        sum = matrix[i][j] * matrix[i + 1][j] * matrix[i + 2][j] * matrix[i + 3][j]&lt;br /&gt;                                        break&lt;br /&gt;                                case 2:&lt;br /&gt;                                    if (j &gt; matrix.size() - 4 || i &gt; matrix.size() - 4) continue&lt;br /&gt;                                        sum = matrix[i][j] * matrix[i + 1][j + 1] * matrix[i + 2][j + 2] * matrix[i +&lt;br /&gt; 3][j + 3]&lt;br /&gt;                                        break&lt;br /&gt;                                case 3:&lt;br /&gt;                                    if (j &lt; 3 || i &gt;= matrix.size() - 4) continue&lt;br /&gt;                                        sum = matrix[i][j] * matrix[i + 1][j - 1] * matrix[i + 2][j - 2] * matrix[i +&lt;br /&gt; 3][j - 3]&lt;br /&gt;                                        break&lt;br /&gt;                        }&lt;br /&gt;                        if (max &lt; sum) {&lt;br /&gt;                            max = sum&lt;br /&gt;                                println "start from [$j, $i] direction [$k] current max -&gt; $max"&lt;br /&gt;                        }&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-6833446288509600925?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/6833446288509600925/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=6833446288509600925' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/6833446288509600925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/6833446288509600925'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/08/project-euler-p11.html' title='Project Euler - P11'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-782977466641493252</id><published>2009-08-07T08:09:00.003+08:00</published><updated>2009-10-07T08:18:07.867+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P10</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=10"&gt;Problem 10&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Groovy Code&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;def primes = [2, 3, 5, 7, 11, 13, 17, 19]&lt;br /&gt;def MAX = 2000000&lt;br /&gt;double sum = primes.sum()&lt;br /&gt;def i = primes.get(primes.size() - 1) + 2&lt;br /&gt;while (MAX &gt; i) {&lt;br /&gt; def found = true&lt;br /&gt; //def q = Math.sqrt(i)&lt;br /&gt; for (int x = 0; x &lt; primes.size() &amp;&amp; primes.get(x)*primes.get(x) &lt;= i; x++) {&lt;br /&gt;   if( i % primes.get(x) == 0) {&lt;br /&gt;     found = false&lt;br /&gt;     break&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt; if(found) {&lt;br /&gt;    primes &lt;&lt; i&lt;br /&gt;    //println "last prime -&gt; $i"&lt;br /&gt;    sum += i&lt;br /&gt; }&lt;br /&gt; i+=2&lt;br /&gt;&lt;br /&gt; while(i % (Math.sqrt(i)) == 0) {&lt;br /&gt;  println "skip $i"&lt;br /&gt;  i+=2&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;println "sum -&gt; ${new java.text.DecimalFormat('###########0').format(sum)}"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-782977466641493252?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/782977466641493252/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=782977466641493252' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/782977466641493252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/782977466641493252'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/08/project-eular-p-10.html' title='Project Euler - P10'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-8713741547807878961</id><published>2009-08-01T09:55:00.001+08:00</published><updated>2009-09-15T09:56:22.962+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P9</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=9"&gt;Problem 9&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Groovy Code&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;def t = 1000&lt;br /&gt;def max_a = 332&lt;br /&gt;def s = []&lt;br /&gt;&lt;br /&gt;def max_b, min_c&lt;br /&gt;&lt;br /&gt;for (int a = max_a; a &gt; 0; a--) {&lt;br /&gt;    int c = min_c = (int)((t - a) / 2 + 1)&lt;br /&gt;        int b = max_b = t - a - min_c&lt;br /&gt;        while (c &gt; b &amp;&amp; b &gt; a) {&lt;br /&gt;            def a2 = Math.pow(a, 2)&lt;br /&gt;            def b2 = Math.pow(b, 2)&lt;br /&gt;            def c2 = Math.pow(c, 2)&lt;br /&gt;            if(a2 + b2 == c2) {&lt;br /&gt;              println "$a &lt; $b &lt; $c, and $a + $b + $c = ${a+b+c}, and $a2 + $b2 = $c2"&lt;br /&gt;              s &lt;&lt; (a * b * c)&lt;br /&gt;              break&lt;br /&gt;           }&lt;br /&gt;           c++&lt;br /&gt;           b--&lt;br /&gt;        }&lt;br /&gt;    if (s.size() &gt; 0) break&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println s&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-8713741547807878961?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/8713741547807878961/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=8713741547807878961' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8713741547807878961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/8713741547807878961'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/08/project-euler-p9.html' title='Project Euler - P9'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-6213087370777115876</id><published>2009-07-25T09:53:00.000+08:00</published><updated>2009-09-15T09:54:07.071+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P7</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=7"&gt;Problem 7&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Groovy Code&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;def primes = [2, 3, 5, 7, 11, 13, 17]&lt;br /&gt;def MAX = 10001&lt;br /&gt;def i = primes.get(primes.size() - 1) + 1&lt;br /&gt;while (primes.size() &lt; MAX) {&lt;br /&gt; if(!primes.any { i % it == 0 }) {&lt;br /&gt;    primes &lt;&lt; i&lt;br /&gt; }&lt;br /&gt; i++&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println "found primes size =&gt; ${primes.size()}"&lt;br /&gt;println "the prime =&gt; ${primes.get(MAX &gt; primes.size() ? primes.size() - 1 : MAX - 1)}"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-6213087370777115876?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/6213087370777115876/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=6213087370777115876' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/6213087370777115876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/6213087370777115876'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/07/project-euler-p7.html' title='Project Euler - P7'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-2445540445587296842</id><published>2009-07-25T09:51:00.004+08:00</published><updated>2009-09-15T09:54:18.351+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P6</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=6"&gt;Problem 6&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Groovy Code&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;def s1 = 0l, s2 = 0l&lt;br /&gt;for (int i = 1; i &lt;= 100; i++) {&lt;br /&gt;  s1 += (long)Math.pow(i, 2)&lt;br /&gt;  s2 += i&lt;br /&gt;}&lt;br /&gt;println "s1 -&gt; $s1, s2 -&gt; $s2"&lt;br /&gt;def x =  (long)(Math.pow(s2, 2) - s1)&lt;br /&gt;println x&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-2445540445587296842?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/2445540445587296842/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=2445540445587296842' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2445540445587296842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2445540445587296842'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/07/project-euler-p6.html' title='Project Euler - P6'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-687130534616380160</id><published>2009-07-25T09:49:00.002+08:00</published><updated>2009-09-15T09:53:11.177+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P5</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=5"&gt;Problem 5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Groovy Code&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;def MIN = 2, MAX = 20&lt;br /&gt;def primes = [2, 3, 5, 7, 11, 13, 17, 19]&lt;br /&gt;def factors = []&lt;br /&gt;while (MIN &lt;= MAX) {&lt;br /&gt;    println "checking $MIN"&lt;br /&gt;    if (MIN in primes) {&lt;br /&gt;            factors &lt;&lt; MIN&lt;br /&gt;       println "factors changed =&gt; $factors"&lt;br /&gt;    } else {&lt;br /&gt;            // find MIN factors&lt;br /&gt;            def fn = []&lt;br /&gt;            def x = MIN&lt;br /&gt;            while(!(x in primes)) {&lt;br /&gt;                def f = primes.find { x % it == 0 }&lt;br /&gt;                    fn &lt;&lt; f&lt;br /&gt;                    x = (int) (x / f)&lt;br /&gt;            }&lt;br /&gt;            fn &lt;&lt; x&lt;br /&gt;            println "factors of $MIN =&gt; $fn"&lt;br /&gt;            // add factors&lt;br /&gt;            def i = 0&lt;br /&gt;            fn.each {&lt;br /&gt;                def found = false&lt;br /&gt;                for (int j = i; j &lt; factors.size(); j++) {&lt;br /&gt;                        if (it == factors.get(j)) {&lt;br /&gt;                                i = j + 1&lt;br /&gt;                                    found = true&lt;br /&gt;                                    break&lt;br /&gt;                            }&lt;br /&gt;                    }&lt;br /&gt;                    if (!found) {&lt;br /&gt;                        factors &lt;&lt; it&lt;br /&gt;                        factors.sort()&lt;br /&gt;                        println "factors changed =&gt; $factors"&lt;br /&gt;                    }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    MIN++&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println "factors =&gt; ${factors}"&lt;br /&gt;def sum = 1&lt;br /&gt;factors.each { sum *= it }&lt;br /&gt;println "result =&gt; ${sum}"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-687130534616380160?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/687130534616380160/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=687130534616380160' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/687130534616380160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/687130534616380160'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/07/project-euler-p5.html' title='Project Euler - P5'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-6163905796801359659</id><published>2009-07-25T09:47:00.001+08:00</published><updated>2009-09-15T09:53:00.491+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P4</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=4"&gt;Problem 4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Groovy Code&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;def x = 999&lt;br /&gt;def y = 999&lt;br /&gt;&lt;br /&gt;def found = false&lt;br /&gt;def p&lt;br /&gt;while (!found) {&lt;br /&gt;   p = String.valueOf(x * y)&lt;br /&gt;       println "checking $x x $y = $p"&lt;br /&gt;       def same = true&lt;br /&gt;       for (int i = 0; i &lt; p.length() / 2; i++) {&lt;br /&gt;           if (p.charAt(i) != p.charAt(p.length() - i - 1)) {&lt;br /&gt;                   same = false&lt;br /&gt;                       break&lt;br /&gt;               }&lt;br /&gt;       }&lt;br /&gt;       found = same&lt;br /&gt;       if (!found) {&lt;br /&gt;           if (y == 836) {&lt;br /&gt;                   y = 999&lt;br /&gt;                   x--&lt;br /&gt;               } else {&lt;br /&gt;                   y--&lt;br /&gt;               }&lt;br /&gt;       }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println "$x x $y = $p"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-6163905796801359659?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/6163905796801359659/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=6163905796801359659' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/6163905796801359659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/6163905796801359659'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/07/project-euler-p4.html' title='Project Euler - P4'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-2164102051469157663</id><published>2009-07-24T10:44:00.003+08:00</published><updated>2009-09-15T09:34:46.003+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P3</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=3"&gt;Problem 3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Groovy Code&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;def primes = [2, 3, 5, 7, 11, 13, 17]&lt;br /&gt;def MAX = 600851475143&lt;br /&gt;def factor = 0&lt;br /&gt;def i = primes.get(primes.size() - 1) + 1&lt;br /&gt;while (MAX &gt; 1) {&lt;br /&gt;    if(!primes.any { i % it == 0 }) {&lt;br /&gt;        primes &lt;&lt; i&lt;br /&gt;        if (MAX % i == 0) {&lt;br /&gt;            factor = i&lt;br /&gt;            MAX = (long)(MAX/i)&lt;br /&gt;            println "current factor =&gt; $factor"&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    i++&lt;br /&gt;}&lt;br /&gt;println factor&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-2164102051469157663?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/2164102051469157663/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=2164102051469157663' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2164102051469157663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2164102051469157663'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/07/project-euler-problem-3.html' title='Project Euler - P3'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-518396909997523659</id><published>2009-07-24T10:24:00.004+08:00</published><updated>2009-09-15T09:35:04.982+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P2</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=2"&gt;Problem 2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Groovy Code&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;def MAX = 4000000&lt;br /&gt;def fibonacci = [1,2]&lt;br /&gt;&lt;br /&gt;def num = 3&lt;br /&gt;while(num &lt; MAX) {&lt;br /&gt;    fibonacci &lt;&lt; num&lt;br /&gt;    num = fibonacci.get(fibonacci.size() - 2) + fibonacci.get(fibonacci.size() - 1)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;def evens = fibonacci.grep { it % 2 == 0 }&lt;br /&gt;&lt;br /&gt;println "sum of evens =&gt; ${evens.sum()}"&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-518396909997523659?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/518396909997523659/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=518396909997523659' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/518396909997523659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/518396909997523659'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/07/project-euler-problem-2.html' title='Project Euler - P2'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-7182602439392400260</id><published>2009-07-24T10:16:00.006+08:00</published><updated>2009-09-15T09:35:14.796+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Project Euler - P1</title><content type='html'>&lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=1"&gt;Problem 1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Groovy Code:&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: groovy"&gt;final def MAX = 1000&lt;br /&gt;def sum = 0&lt;br /&gt;(3..MAX-1).each {&lt;br /&gt;    if (it % 3 == 0 || it % 5 == 0) {&lt;br /&gt;        //println it&lt;br /&gt;        sum += it&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;println "sum =&gt; $sum"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-7182602439392400260?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/7182602439392400260/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=7182602439392400260' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7182602439392400260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7182602439392400260'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/07/project-euler-problem-1.html' title='Project Euler - P1'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-9198199607913480563</id><published>2009-07-06T22:06:00.002+08:00</published><updated>2009-09-15T09:36:37.437+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3d'/><category scheme='http://www.blogger.com/atom/ns#' term='graphic'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='open gl'/><title type='text'>OpenGL ES - Some References</title><content type='html'>Just see &lt;a href="http://maniacdev.com/2009/07/16-killer-opengl-es-resources/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-9198199607913480563?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/9198199607913480563/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=9198199607913480563' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/9198199607913480563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/9198199607913480563'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/07/opengl-es-resources.html' title='OpenGL ES - Some References'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-3841229948952136457</id><published>2009-07-06T10:28:00.003+08:00</published><updated>2009-09-15T09:44:48.970+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Python - Spring in Python</title><content type='html'>Interesting, &lt;a href="http://springpython.webfactional.com/reference/html/index.html"&gt;Spring in Python&lt;/a&gt; now...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-3841229948952136457?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/3841229948952136457/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=3841229948952136457' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3841229948952136457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3841229948952136457'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/07/spring-in-python.html' title='Python - Spring in Python'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-2687702894091155459</id><published>2009-07-01T08:34:00.006+08:00</published><updated>2009-09-15T09:36:09.463+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='multithreading'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='task'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android - Activity &amp; Task</title><content type='html'>Here are something relative to Android Activity &amp; Task:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://android-developers.blogspot.com/2009/05/painless-threading.html"&gt;Introduction AsyncTask&lt;/a&gt;&lt;br /&gt;&lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html"&gt;Reference doc of AsyncTask&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/shelves/"&gt;Shelves Sample&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.android.com/guide/practices/ui_guidelines/activity_task_design.html"&gt;Activity and Task Guidelines&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-2687702894091155459?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/2687702894091155459/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=2687702894091155459' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2687702894091155459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/2687702894091155459'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/07/android-asynctask.html' title='Android - Activity &amp; Task'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-3763105775387722800</id><published>2009-05-12T09:48:00.006+08:00</published><updated>2009-09-15T09:44:17.596+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Grails - Upgrading to Version 1.1</title><content type='html'>Seems like that it would be better to wait for 1.1.1 release. :P &lt;a href="http://adhockery.blogspot.com/2009/04/grails-upgrade.html"&gt;See Robert Fletcher's notes&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-3763105775387722800?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/3763105775387722800/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=3763105775387722800' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3763105775387722800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3763105775387722800'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/05/reference-of-upgrading-grails-104-to-11.html' title='Grails - Upgrading to Version 1.1'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-5580678999566171353</id><published>2009-02-16T13:03:00.004+08:00</published><updated>2009-09-15T09:43:46.384+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><title type='text'>Grails - The Bug of Version 1.0.4 File Uploading</title><content type='html'>While using Grails 1.0.4 and deploy to Tomcat, there might be a strange NPE thrown out. Please check out &lt;a href="http://www.nabble.com/problem-with-file-upload-td22005032.html"&gt;these discussions&lt;/a&gt; for more details:&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-5580678999566171353?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/5580678999566171353/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=5580678999566171353' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5580678999566171353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5580678999566171353'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2009/02/bugs-of-grails-104-file-upload.html' title='Grails - The Bug of Version 1.0.4 File Uploading'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-162416231485846413</id><published>2008-12-29T09:47:00.004+08:00</published><updated>2009-09-15T09:42:54.143+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Grails - Changes in Version 1.1 Part One : Plugins</title><content type='html'>In the release of Grails 1.1, all plugins would no longer be installed in project folder. Instantly, plugins would be installed in plugins repository (default location: &lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;USER_HOME&lt;/span&gt;\.grails\&lt;span style="font-style:italic;"&gt;GRAILS_VERSION&lt;/span&gt;\projects\&lt;span style="font-style:italic;"&gt;APP_NAME&lt;/span&gt;\plugins&lt;/span&gt;, or could be specified in &lt;span style="font-weight:bold;"&gt;grails-app\conf\BuildConfig.groovy&lt;/span&gt;). On the other hand, installed plugins would also be registered in application's meta data (&lt;span style="font-weight:bold;"&gt;application.properties&lt;/span&gt;), Grails would check plugins registration before compiling project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-162416231485846413?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/162416231485846413/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=162416231485846413' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/162416231485846413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/162416231485846413'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2008/12/changes-in-grails-11-part-i-plugins.html' title='Grails - Changes in Version 1.1 Part One : Plugins'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-344115742088788141</id><published>2008-11-14T15:19:00.004+08:00</published><updated>2009-09-15T09:42:21.862+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='command'/><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>MySQL - Restore Database Dump File</title><content type='html'>Following is the example: &lt;br /&gt;&lt;pre class="brush:bash"&gt;mysql - u user_name -p your_password database_name &amp;lt; file_name.sql&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-344115742088788141?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/344115742088788141/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=344115742088788141' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/344115742088788141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/344115742088788141'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2008/11/restore-mysql-database.html' title='MySQL - Restore Database Dump File'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-3673626195053139417</id><published>2008-11-13T14:56:00.007+08:00</published><updated>2009-09-15T09:41:59.497+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='socket'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy - Socket Programming Example</title><content type='html'>Following is the example:&lt;br /&gt;&lt;pre class="brush:groovy"&gt;def remote = new Socket('HOST', PORT, true)&lt;br /&gt;remote.withStreams { i, o -&gt;&lt;br /&gt;    def w = new PrintWriter(o, true)&lt;br /&gt;    w.println 'QUERY_STRING'&lt;br /&gt;    def r = new BufferedReader(new InputStreamReader(i))&lt;br /&gt;    result = r.readLine().trim()&lt;br /&gt;    r.close()&lt;br /&gt;    w.close()&lt;br /&gt;}                &lt;br /&gt;remote.close()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;a href="http://pleac.sourceforge.net/pleac_groovy/sockets.html"&gt;here&lt;/a&gt; &amp; &lt;a href="http://blog.secosoft.net/2007/03/27/using-groovy-to-monitor-cruisecontrol-builds/"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-3673626195053139417?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/3673626195053139417/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=3673626195053139417' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3673626195053139417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3673626195053139417'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2008/11/groovy-socket-programming.html' title='Groovy - Socket Programming Example'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-669173402389451297</id><published>2008-11-10T15:08:00.007+08:00</published><updated>2009-09-15T09:41:38.341+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='issue'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='ie6'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><title type='text'>jQuery.js - Adding Class to SELECT Objects Problem in IE6</title><content type='html'>Occurred while adding css class to select objects, the drop-down layer wouldn't be displayed properly. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:js"&gt;$("select[name='componentName']").addClass('someClass');&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-669173402389451297?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/669173402389451297/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=669173402389451297' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/669173402389451297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/669173402389451297'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2008/11/jquery-add-class-to-select-objects-has.html' title='jQuery.js - Adding Class to SELECT Objects Problem in IE6'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-883070206663322981</id><published>2008-11-07T11:04:00.005+08:00</published><updated>2009-09-15T09:40:42.554+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='datasource'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Grails - Multiple Datasource Plugin</title><content type='html'>&lt;a href="http://burtbeckwith.com/blog/?p=70"&gt;Here&lt;/a&gt; is the unofficial plugin which enables Grails to support multiple datasources.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-883070206663322981?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/883070206663322981/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=883070206663322981' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/883070206663322981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/883070206663322981'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2008/11/grails-multiple-datasource-plugin.html' title='Grails - Multiple Datasource Plugin'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-3646161133447936372</id><published>2008-11-04T13:44:00.014+08:00</published><updated>2009-09-15T09:40:29.291+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='workaround'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>Grails - HTTP Status Page &amp; URL Rewriting for Tomcat</title><content type='html'>To use Tomcat as the servlet container of Grails applications, the default URL mapping of http status codes would not work well. Instead of that, error page declarations in the web.xml is a workarounds, such like:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;error-page&amp;gt;&lt;br /&gt;&amp;lt;error-code&amp;gt;403&amp;lt;/error-code&amp;gt;&lt;br /&gt;&amp;lt;location&amp;gt;/403.jsp&amp;lt;/location&amp;gt;&lt;br /&gt;&amp;lt;/error-page&amp;gt;&lt;br /&gt;&amp;lt;error-page&amp;gt;&lt;br /&gt;&amp;lt;error-code&amp;gt;404&amp;lt;/error-code&amp;gt;&lt;br /&gt;&amp;lt;location&amp;gt;/404.jsp&amp;lt;/location&amp;gt;&lt;br /&gt;&amp;lt;/error-page&amp;gt;&lt;br /&gt;&amp;lt;error-page&amp;gt;&lt;br /&gt;&amp;lt;error-code&amp;gt;500&amp;lt;/error-code&amp;gt;&lt;br /&gt;&amp;lt;location&amp;gt;/500.jsp&amp;lt;/location&amp;gt;&lt;br /&gt;&amp;lt;/error-page&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And, if there are already relative Grails controllers or GSPs handling HTTP status codes, we could just simply use the JSPs for redirect:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:groovy"&gt;&amp;lt;%response.sendRedirect(request.getContextPath() + &amp;quot;/errors/notFound&amp;quot;);%&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;UPDATE: &lt;br /&gt;1. &lt;a href="http://jira.codehaus.org/browse/GRAILS-3219"&gt;Here&lt;/a&gt; is the issue ticket and also a better workaround.&lt;br /&gt;2. And here is another &lt;a href="http://amorproximi.blogspot.com/2008/07/more-on-grails-declarative-error.html"&gt;blog reference&lt;/a&gt; posted by the issue reporter.&lt;br /&gt;3. Another relative &lt;a href="http://jira.codehaus.org/browse/GRAILS-3257"&gt;issue&lt;/a&gt; which is worth keeping trace.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-3646161133447936372?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/3646161133447936372/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=3646161133447936372' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3646161133447936372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3646161133447936372'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2008/11/grails-http-status-url-rewrite-in.html' title='Grails - HTTP Status Page &amp; URL Rewriting for Tomcat'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-5326008093891271039</id><published>2008-02-18T09:45:00.003+08:00</published><updated>2009-09-15T09:39:31.447+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Scala - Learning Note Part One</title><content type='html'>Reference:&lt;br /&gt;&lt;a href="http://www.codecommit.com/blog/scala/roundup-scala-for-java-refugees"&gt;Code Commit's Articles&lt;/a&gt;&lt;br /&gt;&lt;a href="http://alblue.blogspot.com/search/label/scala"&gt;AlBlue's Articles&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Scala has a type inference mechanism to determine object types in runtime&lt;/li&gt;&lt;li&gt;No semicolon only if multi statements in a single line&lt;/li&gt;&lt;li&gt;The file extension is : &lt;span style="font-weight: bold;"&gt;.scala&lt;/span&gt;, and it is not a necessary to keep the saving file name to be the same as class name.&lt;/li&gt;&lt;li&gt;Compiler: &lt;span style="font-weight: bold;"&gt;scalac&lt;/span&gt;; Executor: &lt;span style="font-weight: bold;"&gt;scala &lt;/span&gt;or using java but have to indicate the classpath to properly place&lt;/li&gt;&lt;li&gt;All methods are implicitly public&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Unit &lt;/span&gt;is the type which is similar to void&lt;/li&gt;&lt;li&gt; Keyword: &lt;span style="font-weight: bold;"&gt;val &lt;/span&gt;to declare a constant, similar to Java's final&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;_ &lt;/span&gt;character is a wildcard&lt;/li&gt;&lt;li&gt;Class constructor is the statements of the class body. To overloading a constructor just simply declare &lt;span style="font-weight: bold;"&gt;this(args)&lt;/span&gt; methods &lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-5326008093891271039?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/5326008093891271039/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=5326008093891271039' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5326008093891271039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/5326008093891271039'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2008/02/learning-scala.html' title='Scala - Learning Note Part One'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-7979331939408834946</id><published>2008-01-23T10:52:00.001+08:00</published><updated>2009-09-15T09:38:50.908+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='transaction'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails - Fine Gained Transaction Configuration Idea</title><content type='html'>Here is an &lt;a href="http://www.nabble.com/Re%3A-Fine-grained-transaction-configuration-p14960695.html"&gt;article&lt;/a&gt; talking about how to manually configuration transaction behaviors in Grails. Furthermore, there might be a more groovy-style approach after 1.0 release.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-7979331939408834946?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/7979331939408834946/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=7979331939408834946' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7979331939408834946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7979331939408834946'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2008/01/fine-gained-transaction-configuration.html' title='Grails - Fine Gained Transaction Configuration Idea'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-7712212621752394020</id><published>2007-12-08T10:59:00.001+08:00</published><updated>2009-09-15T09:38:31.402+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='transaction'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Grails - Transaction in Version 0.6</title><content type='html'>There are two kinds of transaction control in Grails 0.6. One is domain class dynamic method: &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;withTransaction&lt;/span&gt;, the other is auto injected by SpringFramework to all service classes.&lt;br /&gt;The transaction control within the closure of &lt;span style="font-weight: bold;"&gt;withTransaction&lt;/span&gt; is handled manually by programmers, that means that programmers have to commit or rollback the transaction by certain logic. On the other hand, the auto injected transaction control is handled by the SpringFramework's Transaction Manager which would commit the transaction automatically if there is no any RuntimeException occurred.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-7712212621752394020?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/7712212621752394020/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=7712212621752394020' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7712212621752394020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7712212621752394020'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2007/12/transaction-in-grails-06.html' title='Grails - Transaction in Version 0.6'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-7658823011348650250</id><published>2007-11-14T07:36:00.002+08:00</published><updated>2009-09-15T09:37:55.071+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='prototype.js'/><category scheme='http://www.blogger.com/atom/ns#' term='ie'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>prototype.js - The Problem of Element.update in IE 6</title><content type='html'>The implementation of &lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;Element.update&lt;/span&gt; is to update the &lt;span style="color: rgb(0, 0, 0);"&gt;innerHTML&lt;/span&gt; of the element. But it just doesn't work well if you want to update a Select object in IE 6 due to the famous bug &lt;span style="color: rgb(102, 102, 102);font-size:85%;" &gt;(please refer to &lt;a href="http://www.throbs.net/web/articles/IE-SELECT-bugs/#ieInnerHTMLproperty"&gt;here&lt;/a&gt; and &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;276228"&gt;here&lt;/a&gt;)&lt;/span&gt;.&lt;br /&gt;A workaround of this problem is to replace the whole Select element instead of to assign the innerHTML property.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Before :&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:js"&gt;element.innerHTML = html.stripScripts();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;After:&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:js"&gt;element.replace('&amp;lt;select id=\'' + element.id + '\' name=\'' + element.name + '\'&amp;gt;' + html.scripScripts() + '&amp;lt;/select&amp;gt;');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And don't forget to set CSS styles and listening javascript events back!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Such like:&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush:js"&gt;var className = element.className;&lt;br /&gt;element.replace('...');&lt;br /&gt;$(element.id).className = className;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-7658823011348650250?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/7658823011348650250/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=7658823011348650250' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7658823011348650250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/7658823011348650250'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2007/11/prototypejs-elementupdate-doesnt-work.html' title='prototype.js - The Problem of Element.update in IE 6'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-223754833347841050</id><published>2007-11-12T17:51:00.001+08:00</published><updated>2009-09-15T09:37:31.181+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='howtos'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails - Multi-DataSource Plugin</title><content type='html'>General idea is using Spring, just set up additional datasources, Hibernate SessionFactory and mapping classes in &lt;span style="font-style: italic; color: rgb(153, 153, 153);"&gt;grails/conf/spring/resource.xml&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 1.&lt;/span&gt;&lt;br /&gt;Create POJOs in &lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;src/&lt;/span&gt; folder&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 2.&lt;/span&gt;&lt;br /&gt;Set up target datasource in &lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;grails/conf/spring/resouce.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 3.&lt;/span&gt;&lt;br /&gt;Set up relative Hibernate SessionFactory in grails/conf/spring/resouce.xml with the datasource bean and POJO classes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 4.&lt;/span&gt;&lt;br /&gt;Create DAO classes extend from Spring HibernateDaoSupport class and declare those DAO classes in &lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;grails/conf/spring/resouce.xml&lt;/span&gt; and inject the SessionFactory defined at &lt;span style="font-weight: bold;"&gt;Step 3&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 5.&lt;/span&gt;&lt;br /&gt;Now the DAO classes are ready to inject to grails services and controllers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Future study :&lt;/span&gt; Multi-Phase Transaction&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-223754833347841050?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/223754833347841050/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=223754833347841050' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/223754833347841050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/223754833347841050'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2007/11/multi-datasource-in-grails-06.html' title='Grails - Multi-DataSource Plugin'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2012795753603994003.post-3854124554954156610</id><published>2007-10-16T13:29:00.001+08:00</published><updated>2009-09-15T09:37:01.684+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Grails - LiquiBase Plugin</title><content type='html'>&lt;a href="http://www.liquibase.org/"&gt;LiguiBase&lt;/a&gt; is a database refactorying tool and also a plugin for &lt;a href="http://grails.codehaus.org/"&gt;Grails&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;General commands :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;diff&lt;/span&gt; - &lt;span style="font-style: italic;"&gt;only available in command line mode&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Display the schema differentiations between the two databases.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 153);"&gt;Usage Example :&lt;/span&gt;&lt;br /&gt;java -jar liquibase.jar&lt;br /&gt;--classpath=&lt;span style="color: rgb(102, 102, 102);"&gt;DRIVER_JAR &lt;/span&gt;&lt;br /&gt;--changeLogFile=&lt;span style="color: rgb(102, 102, 102);"&gt;CHANGELOG.XML &lt;/span&gt;&lt;br /&gt;--driver=&lt;span style="color: rgb(102, 102, 102);"&gt;DRIVER_CLASS&lt;/span&gt;&lt;br /&gt;--url=&lt;span style="color: rgb(102, 102, 102);"&gt;DB_CONNECTION_URL&lt;/span&gt;&lt;br /&gt;--username=&lt;span style="color: rgb(102, 102, 102);"&gt;USER_NAME &lt;/span&gt;&lt;br /&gt;--password=&lt;span style="color: rgb(102, 102, 102);"&gt;PASSWORD&lt;/span&gt;&lt;br /&gt;diffChangeLog &lt;span style="font-style: italic;"&gt;or diff&lt;/span&gt;&lt;br /&gt;--baseUrl=&lt;span style="color: rgb(102, 102, 102);"&gt;TARGET_DB_CONNECTION_URL&lt;/span&gt;&lt;br /&gt;--baseUsername=&lt;span style="color: rgb(102, 102, 102);"&gt;TARGET_DB_USER_NAME&lt;/span&gt;&lt;br /&gt;--basePassword=&lt;span style="color: rgb(102, 102, 102);"&gt;TARGET_DB_PASSWORD&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;generate-changelong&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Display schema changes between actual database and domain classes.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;migrate&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Apply the changes of domain classes to actual database schema.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;tag&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Tag presenting database schema.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;rollback &lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;&lt;tag&gt;&lt;/tag&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Roll back to specific time or tagged database schema.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;db-doc&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Generate database schema doc files which are similar to JavaDoc.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;drop-all&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Drop the schema of target database.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2012795753603994003-3854124554954156610?l=kenwei.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenwei.blogspot.com/feeds/3854124554954156610/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2012795753603994003&amp;postID=3854124554954156610' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3854124554954156610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2012795753603994003/posts/default/3854124554954156610'/><link rel='alternate' type='text/html' href='http://kenwei.blogspot.com/2007/10/liquibase.html' title='Grails - LiquiBase Plugin'/><author><name>ccw</name><uri>http://www.blogger.com/profile/07574889216354373348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://static.flickr.com/8/10839689_e4ba3e8903_o.gif'/></author><thr:total>0</thr:total></entry></feed>
