<?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-18020755</id><updated>2011-04-21T14:00:56.216-07:00</updated><title type='text'>Ralph</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ralfwin.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18020755/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ralfwin.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ralph.Jin</name><uri>http://www.blogger.com/profile/02138527290932751502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18020755.post-113159237947003268</id><published>2005-11-09T18:56:00.000-08:00</published><updated>2005-11-09T19:12:59.490-08:00</updated><title type='text'></title><content type='html'>MySql有一个dump数据库的功能，它能够把数据库中的内容dump成sql语句，用于重新生成数据库。在新的产品中，需要为客户安装一个有demo数据的数据库。所以就需要读取这个mysql生成的文件。&lt;br /&gt;如果真的一句一句的运行的话，一个文件有10000多行。运行一次connect一次，绝对会死人的。。。。所以有些可以batch的sql就要一起运行。因此我就写了一个parse mysql生成的文件的小程序。&lt;br /&gt;    public static void insertDataFromFile(Connection conn, BufferedReader reader) throws Exception {&lt;br /&gt;    String line = null;&lt;br /&gt;    int count = 0;&lt;br /&gt;    int max = 1000;&lt;br /&gt;    Statement st = conn.createStatement();&lt;br /&gt;    String tmp = "";&lt;br /&gt;    while((line = readLine(reader))!= null) {&lt;br /&gt;        if(line != null &amp;&amp;amp; !line.startsWith("#") &amp;&amp;amp; !"".equals(line)) {&lt;br /&gt;        if(line.startsWith("/*")) {&lt;br /&gt;            // skip comment&lt;br /&gt;            System.out.println("skip comment");&lt;br /&gt;            if(line.endsWith("*/;")) {&lt;br /&gt;            continue;&lt;br /&gt;            } else {&lt;br /&gt;            while(true) {&lt;br /&gt;                line = readLine(reader);&lt;br /&gt;                if(line == null) {&lt;br /&gt;                break;&lt;br /&gt;                } else if(line.endsWith("*/;")) {&lt;br /&gt;                break;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            if(line != null) {&lt;br /&gt;                continue;&lt;br /&gt;            } else {&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;            }&lt;br /&gt;        } else if(line.startsWith("USE")) {&lt;br /&gt;            // skip use&lt;br /&gt;            System.out.println("skip USE" + line);&lt;br /&gt;            if( count &gt;= 1) {&lt;br /&gt;            // flush batch immediatily&lt;br /&gt;            if(DEBUG) {&lt;br /&gt;                System.out.println("execute batch    ");&lt;br /&gt;            }&lt;br /&gt;            st.executeBatch();&lt;br /&gt;            st.clearBatch();&lt;br /&gt;            count = 0;&lt;br /&gt;            }&lt;br /&gt;            continue;&lt;br /&gt;        } else if(line.startsWith("DROP")) {&lt;br /&gt;            // do drop table immediatily&lt;br /&gt;            if( count &gt;= 1) {&lt;br /&gt;            // flush batch immediatily&lt;br /&gt;            if(DEBUG) {&lt;br /&gt;                System.out.println("execute batch    ");&lt;br /&gt;            }&lt;br /&gt;            st.executeBatch();&lt;br /&gt;            st.clearBatch();&lt;br /&gt;            count = 0;&lt;br /&gt;            }&lt;br /&gt;            // drop&lt;br /&gt;            System.out.println("execute drop: " + line );&lt;br /&gt;            st.execute(line);&lt;br /&gt;        } else if(line.startsWith("INSERT ")) {&lt;br /&gt;            // batch insert&lt;br /&gt;            if(DEBUG) {&lt;br /&gt;            System.out.println("append batch:" + line);&lt;br /&gt;            }&lt;br /&gt;            st.addBatch(line);&lt;br /&gt;            count++;&lt;br /&gt;            if( count &gt;= max) {&lt;br /&gt;            if(DEBUG) {&lt;br /&gt;                System.out.println("execute batch");&lt;br /&gt;            }&lt;br /&gt;            st.executeBatch();&lt;br /&gt;            st.clearBatch();&lt;br /&gt;            count = 0;&lt;br /&gt;            }&lt;br /&gt;        } else if(line.endsWith(";") &amp;&amp;amp; !"".equals(tmp)) {&lt;br /&gt;            // end of create&lt;br /&gt;            tmp += line + " ";&lt;br /&gt;            if(DEBUG) {&lt;br /&gt;            System.out.println("append create:" + line);&lt;br /&gt;            System.out.println(" execute    \'" + tmp + "\' ");&lt;br /&gt;            }&lt;br /&gt;            st.execute(tmp);&lt;br /&gt;            tmp = "";&lt;br /&gt;        } else {&lt;br /&gt;            // append create&lt;br /&gt;            if( count &gt;= 1) {&lt;br /&gt;            // flush batch immediatily&lt;br /&gt;            if(DEBUG) {&lt;br /&gt;                System.out.println("execute batch    ");&lt;br /&gt;            }&lt;br /&gt;            st.executeBatch();&lt;br /&gt;            st.clearBatch();&lt;br /&gt;            count = 0;&lt;br /&gt;            }&lt;br /&gt;            if(DEBUG) {&lt;br /&gt;            System.out.println("append create:" + line);&lt;br /&gt;            }&lt;br /&gt;            tmp += line + " ";&lt;br /&gt;        }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    // clear batch;&lt;br /&gt;    if(count &gt; 0) {&lt;br /&gt;        if(DEBUG) {&lt;br /&gt;        System.out.println("\nexecute batch    ");&lt;br /&gt;        }&lt;br /&gt;        st.executeBatch();&lt;br /&gt;    }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static String readLine(BufferedReader reader) throws IOException {&lt;br /&gt;    String line = reader.readLine();&lt;br /&gt;    if(line == null) {&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;    if(line.startsWith("INSERT")) {&lt;br /&gt;        if(line.endsWith(";")) {&lt;br /&gt;        // a INSERT line&lt;br /&gt;        return line;&lt;br /&gt;        } else {&lt;br /&gt;        String tmp = null;&lt;br /&gt;        while((tmp = reader.readLine()) != null) {&lt;br /&gt;            line += tmp + " ";&lt;br /&gt;            if(tmp.endsWith(";")) {&lt;br /&gt;            break;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        return line;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return line;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;也许 JDBC有一直真正保持connect的方法，但我觉得速度也会比我这个慢很多。毕竟我最多一次运行1000行insert。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18020755-113159237947003268?l=ralfwin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ralfwin.blogspot.com/feeds/113159237947003268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18020755&amp;postID=113159237947003268&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18020755/posts/default/113159237947003268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18020755/posts/default/113159237947003268'/><link rel='alternate' type='text/html' href='http://ralfwin.blogspot.com/2005/11/mysqldumpdumpsqldemomysql.html' title=''/><author><name>Ralph.Jin</name><uri>http://www.blogger.com/profile/02138527290932751502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18020755.post-113091784899571691</id><published>2005-11-01T18:46:00.000-08:00</published><updated>2005-11-01T23:50:49.053-08:00</updated><title type='text'></title><content type='html'>java script and web app&lt;br /&gt;web app一直是我的软肋。也曾经下过很多次决心一定要好好学学。&lt;br /&gt;不过.....客观原因是一直没有这方面的任务。主观原因么~~~~太懒了。&lt;br /&gt;这不，我又开始下决心学习一下了。&lt;br /&gt;曾经从servlet, app engine, html, DHTML的角度入手。效果么也就是对这些有所了解。如果真的要用起来，还需要锻炼。&lt;br /&gt;这次从一个新的角度出发："java script"。&lt;br /&gt;先从一个简单的java script OO control开始，"Table"。&lt;br /&gt;同事做过一个TreeTable，相比之下Table要简单的多了。&lt;br /&gt;不过主要目的还是锻炼java script。&lt;br /&gt;整个Table的结构跟那个同事一样，模仿Swing的JTable。不同得只是用java script实现。&lt;br /&gt;呵呵，目标又有了~~~不知道这次能不能完成。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18020755-113091784899571691?l=ralfwin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ralfwin.blogspot.com/feeds/113091784899571691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18020755&amp;postID=113091784899571691&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18020755/posts/default/113091784899571691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18020755/posts/default/113091784899571691'/><link rel='alternate' type='text/html' href='http://ralfwin.blogspot.com/2005/11/java-script-and-web-app-web-app.html' title=''/><author><name>Ralph.Jin</name><uri>http://www.blogger.com/profile/02138527290932751502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18020755.post-113038198964296438</id><published>2005-10-26T19:07:00.000-07:00</published><updated>2005-10-27T01:48:08.460-07:00</updated><title type='text'></title><content type='html'>搭积木~~~&lt;br /&gt;用户将一系列的分配记录存储在数据库中，现在需要将这些分配记录用图表的形式展现出来。&lt;br /&gt;我没有使用现有的chart工具。在我设计的chart中，横坐标代表了时间。纵坐标没有特别的含义，但总坐标上的跨度代表分配的数量。这样一个矩形的面积代表了类似“人月”的概念。&lt;br /&gt;在具体的展示上，如果只是每一个分配记录占一行，那么将很难看。就像玩"俄罗斯"方块一样会落得很高。也许真地会有一种最优的算法，将这些方块排列到占用行数最小的状态。但是，这样的算法也许很复杂，我太笨，估计想不出来。;-)&lt;br /&gt;所以我就想了一个最见的所谓“次优”的算法。算法很简单：&lt;br /&gt;1 对于一块积木在现有的被占用的行中按行号寻找宽度合适的，该行为j。&lt;br /&gt;2 如果该level有宽度合适的，那么向上继续查找n - 1 个level(n 为分配记录的count)&lt;br /&gt;3 如果n-1行均有宽度合适的地方，那么在这 j到j + n -1这些行中插入该分配记录的占用信息。&lt;br /&gt;4 如果向上找了第m次没有，那么从j + m - 1行从新开始。&lt;br /&gt;5 如果达到了目前的最高的level,从新分配一个level。将该记录插入。&lt;br /&gt;&lt;br /&gt;代码还有经过详细的测试，如果有问题，在日后更新。&lt;br /&gt;public List buildAFCUsageChart(List all, long begin) {&lt;br /&gt; int size = all.size();&lt;br /&gt; ArrayList  result = new ArrayList(size);&lt;br /&gt; // build rectangle and set lx, rx&lt;br /&gt; int level = 1;&lt;br /&gt; Hashtable allLevel = new Hashtable();&lt;br /&gt;for(int i = 0; i &lt; config =" (AssignedFeatureConfig)all.get(i);" rect =" new" distance =" rect.getStartDate()" x =" (int)(distance"&gt; 0? x: 0);&lt;br /&gt;     //REMIND: Tao Jin --- add 1 ms to expired time&lt;br /&gt;     distance = rect.getExpiredDate() + 1 - begin;&lt;br /&gt;     rect.setRX((int)(distance / ONE_DAY));&lt;br /&gt;     result.add(rect);&lt;br /&gt; &lt;br /&gt;// set layout (set ly, ry)&lt;br /&gt;for(int j = 0; j &lt; nlevel =" (Hashtable)allLevel.get(new" nlevel ="="" nlevel =" new" found =" true;" e =" nlevel.keys();" another =" (AFCRectangle)" j ="="" found =" false;" m =" 1;" mlevel =" (Hashtable)allLevel.get(new" mlevel ="="" em =" mlevel.keys();" manother =" (AFCRectangle)" j ="="" j =" j" found =" false;" n =" rect.getCount()"&gt;= j; n--) {&lt;br /&gt;           Hashtable tmp = (Hashtable) allLevel.get(new Integer(n));&lt;br /&gt;           if(tmp == null) {&lt;br /&gt;               tmp = new Hashtable();&lt;br /&gt;               allLevel.put(new Integer(n), tmp);&lt;br /&gt;           }&lt;br /&gt;           tmp.put(rect, rect);&lt;br /&gt;           }&lt;br /&gt;           // set ly, ry&lt;br /&gt;           rect.setRY(j);&lt;br /&gt;           rect.setLY(rect.getCount() + j);&lt;br /&gt;  break;&lt;br /&gt;       }&lt;br /&gt;       if(DEBUG) {&lt;br /&gt;           System.out.println("(" + rect.getLX() + "," + rect.getLY()+ "), (" + rect.getRX() + "," + rect.getRY() + ")");&lt;br /&gt;       }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;   if(DEBUG) {&lt;br /&gt;       System.out.println("minWidth = " + minWidth + " maxX = " + maxX + " height = " + maxY);&lt;br /&gt;   }&lt;br /&gt; return result;&lt;br /&gt; }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18020755-113038198964296438?l=ralfwin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ralfwin.blogspot.com/feeds/113038198964296438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18020755&amp;postID=113038198964296438&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18020755/posts/default/113038198964296438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18020755/posts/default/113038198964296438'/><link rel='alternate' type='text/html' href='http://ralfwin.blogspot.com/2005/10/chartchart-1-j-2-leveln-1-leveln-count.html' title=''/><author><name>Ralph.Jin</name><uri>http://www.blogger.com/profile/02138527290932751502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18020755.post-113037885351290835</id><published>2005-10-26T18:45:00.000-07:00</published><updated>2005-10-26T19:07:33.526-07:00</updated><title type='text'></title><content type='html'>在最近的程序中，终于范了一个恶心的由于没有使用Const而带来的恶心问题。&lt;br /&gt;是这样的，对于一条分配记录来说，该记录有其起始时间"startDate"还有其终止时间"expiredDate"。为了允许分配"立即生效"与"永 不过期的"分配记录。在最开始的时候，我草率的使用了"-1"这个值。"如果一条记录的起始时间是-1,那么它立即生效。如果一条记录的终止时间是-1那 么它永不过期"。而且-1这个值是直接写在逻辑里面的，而不是用一个（或者两个）const。&lt;br /&gt;而梦就这样开始了。我需要判断一条分配记录是否处在某个时间范围之内。而这个时间范围也许是立即生效，永不过期。在记录中时间是用long只来代表的，所 以我在比较值得时候无时无刻都要想着该死的-1。其实是件还好说，-1自然小于任何一个实际的时间。终止时间就麻烦大了，需要特别判断-1，应为实践永远 都是正书。总之，类似的判断十分恶心人。&lt;br /&gt;解决这个问题有两件事情可以做。&lt;br /&gt;第一，利用const，写一个RIGHT_NOW_START还有一个NEVER_EXPIRED。他们的值可以是那个恶心的-1。&lt;br /&gt;第二，关于这两个const的值得选择。因为java用long来代表时间，其实我可以选择两个更好的值。"0", Long.MAX_VALUE。这样在判断一条分配记录是否属于一个时间段时，就不需要对特殊值进行特殊的判断了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18020755-113037885351290835?l=ralfwin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ralfwin.blogspot.com/feeds/113037885351290835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18020755&amp;postID=113037885351290835&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18020755/posts/default/113037885351290835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18020755/posts/default/113037885351290835'/><link rel='alternate' type='text/html' href='http://ralfwin.blogspot.com/2005/10/const-startdateexpireddate-1-1-1.html' title=''/><author><name>Ralph.Jin</name><uri>http://www.blogger.com/profile/02138527290932751502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18020755.post-112988530423315031</id><published>2005-10-21T01:43:00.000-07:00</published><updated>2005-10-21T02:01:44.236-07:00</updated><title type='text'></title><content type='html'>about dot Net MD5.&lt;br /&gt;&lt;br /&gt;I create a web service for our java Products.In this product, we store the md5 password String in datebase (use our Base64Codec to encoding a Hex String.).&lt;br /&gt;But, the web service client is microsoft dot Net and the user wanne use microsoft md5 to encode the password.The ms md5 provider only can return a bytes array which length is 16.&lt;br /&gt;So, I have to change 16 bytes into 4 ints. and change this 4 ints into our Base64 String.&lt;br /&gt;In the beginging, I wirte a method getIntArray(byte[]) to get 4 int from 16 bytes, the method is as follow in csharp:&lt;br /&gt;public int[] getIntArray(byte[] bytes) {&lt;br /&gt;  int i = 15;&lt;br /&gt;  int[] ints = new int[4];&lt;br /&gt;  ints[3] = ((bytes[i--] &lt;&lt; 24) +  (bytes[i--] &lt;&lt; 16) +  (bytes[i--] &lt;&lt; 8) +  (bytes[i--] )      );&lt;br /&gt;  ints[2] = ((bytes[i--] &lt;&lt; 24) +  (bytes[i--] &lt;&lt; 16) +  (bytes[i--] &lt;&lt; 8) +  (bytes[i--])      );&lt;br /&gt;  ints[1] = ((bytes[i--] &lt;&lt; 24) +  (bytes[i--] &lt;&lt; 16) +  (bytes[i--] &lt;&lt; 8) +  (bytes[i--] )      );&lt;br /&gt;  ints[0] = ((bytes[i--] &lt;&lt; 24) +  (bytes[i--] &lt;&lt; 16) +  (bytes[i--] &lt;&lt; 8) +  (bytes[i--] )      );&lt;br /&gt;  return ints;&lt;br /&gt;}&lt;br /&gt;I generate this 4 int in csharp, and send this int array to java server. change this int array into MD5 string.It is work very well.&lt;br /&gt;Secondlly, I wanne use this code in java server, and client just provide 16 bytes. after I copy this code in java and compled. It cannot work as I expected.&lt;br /&gt;I check the bytes array which is transfered from scharp client to java server. I found that, in scharp a bite is a uint, but in java world, therer is no uint. so.....in &lt;&lt; operation, the bytes maybe a negative number.&lt;br /&gt;At the last, I check every byte, If the byte is negative, I add 255 to it.After this convert, It is worked very well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18020755-112988530423315031?l=ralfwin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ralfwin.blogspot.com/feeds/112988530423315031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18020755&amp;postID=112988530423315031&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18020755/posts/default/112988530423315031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18020755/posts/default/112988530423315031'/><link rel='alternate' type='text/html' href='http://ralfwin.blogspot.com/2005/10/about-dot-net-md5.html' title=''/><author><name>Ralph.Jin</name><uri>http://www.blogger.com/profile/02138527290932751502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
