<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.tsul.net/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DU4MQXw9eip7ImA9WhVXEks.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132</id><updated>2012-04-13T05:59:40.262+08:00</updated><category term="virtualization" /><category term="webapi" /><category term="technology" /><category term="SQL" /><category term="moebius" /><category term="web" /><category term="leap" /><category term="locale" /><category term="critics" /><category term="proposal" /><category term="demo" /><category term="service" /><category term="snapshot" /><category term="configuration" /><category term="python" /><category term="tips" /><category term="concept" /><category term="eclipse" /><category term="programming language" /><category term="invention" /><category term="prediction" /><category term="apache" /><category term="linux" /><category term="system" /><category term="user experience" /><category term="business" /><category term="feed" /><category term="http server" /><category term="java" /><category term="translation" /><category term="security" /><category term="programming" /><category term="lunar" /><category term="migration" /><category term="cloud" /><category term="wordpress" /><category term="videocard" /><category term="greeting" /><category term="captcha" /><category term="blogger" /><category term="report" /><category term="appengine" /><category term="checkpoint" /><category term="impact" /><category term="partition" /><category term="network" /><category term="testing" /><category term="ubuntu" /><category term="mobius" /><title>TSUL Best Log</title><subtitle type="html">TSUL BLOG - the blog of TSUL.net</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.tsul.net/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.tsul.net/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>TSUL</name><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>85</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.tsul.net/TsulBestLog" /><feedburner:info uri="tsulbestlog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><meta xmlns="http://pipes.yahoo.com" name="pipes" content="noprocess" /><entry gd:etag="W/&quot;DEcDQng7eyp7ImA9WhZXEUo.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-4174261570605767015</id><published>2011-04-30T23:01:00.001+08:00</published><updated>2011-04-30T23:07:53.603+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T23:07:53.603+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>Self-defined Locations for Desktop, Music, Downloads, Pictures and Videos in Ubuntu</title><content type="html">&lt;div&gt;As Ubuntu release its 11.04 natty&amp;nbsp;narwhal, have you ever wanted to define the default locations for&amp;nbsp;Desktop, Music, Downloads, Pictures and Videos on your own?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;All you need is go to $HOME/.config/ folder and modify the user-dirs.dirs with your&amp;nbsp;favorite text editor. The default looks like this:&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# This file is written by xdg-user-dirs-update&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# If you want to change or add directories, just edit the line you're&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# interested in. All local changes will be retained on the next run&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# absolute path. No other format is supported.&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;XDG_DESKTOP_DIR="$HOME/Desktop"&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;XDG_DOWNLOAD_DIR="$HOME/Downloads"&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;XDG_TEMPLATES_DIR="$HOME/Templates"&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;XDG_PUBLICSHARE_DIR="$HOME/Public"&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;XDG_DOCUMENTS_DIR="$HOME/Documents"&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;XDG_MUSIC_DIR="$HOME/Music"&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;XDG_PICTURES_DIR="$HOME/Pictures"&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;XDG_VIDEOS_DIR="$HOME/Videos"&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;You might also want to check this configuration file if any of your special folder icon is missing.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-4174261570605767015?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=6drGu-Uc8xc:xT8DVdS1bKQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=6drGu-Uc8xc:xT8DVdS1bKQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=6drGu-Uc8xc:xT8DVdS1bKQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=6drGu-Uc8xc:xT8DVdS1bKQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/6drGu-Uc8xc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/4174261570605767015/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2011/04/self-defined-locations-for-desktop.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/4174261570605767015?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/4174261570605767015?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/6drGu-Uc8xc/self-defined-locations-for-desktop.html" title="Self-defined Locations for Desktop, Music, Downloads, Pictures and Videos in Ubuntu" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2011/04/self-defined-locations-for-desktop.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04MQXw6cSp7ImA9WxBWFEk.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-8519571978991510717</id><published>2010-02-06T15:39:00.001+08:00</published><updated>2010-02-06T15:39:40.219+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-06T15:39:40.219+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="service" /><category scheme="http://www.blogger.com/atom/ns#" term="cloud" /><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title>Sina opens App Engine (SAE) service like GAE</title><content type="html">Sina opens an App Engine service, named SAE, some while ago, and is now at alpha 2, public for registration in China.&lt;br /&gt;
&lt;br /&gt;
This SAE service is very similar to Google App Engine in that it provides a cloud environment for applications to run on. Unlike GAE, SAE supports the PHP + MySQL combination. This means, potential, more web applications could be migrated to sina app platform. Actually, the famous blogging application, Wordpress, is already migrated. Although flexible, the use of MySQL as a database storage might mean the scalability will not be so good.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://sae.sina.com.cn/"&gt;Sina App Engine&lt;/a&gt; and &lt;a href="http://nick.sinaapp.com/"&gt;My SAE App&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-8519571978991510717?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=a9RQ7Hia5bY:pLj8MfyvtCQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=a9RQ7Hia5bY:pLj8MfyvtCQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=a9RQ7Hia5bY:pLj8MfyvtCQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=a9RQ7Hia5bY:pLj8MfyvtCQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/a9RQ7Hia5bY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/8519571978991510717/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2010/02/sina-opens-app-engine-sae-service-like.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/8519571978991510717?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/8519571978991510717?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/a9RQ7Hia5bY/sina-opens-app-engine-sae-service-like.html" title="Sina opens App Engine (SAE) service like GAE" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2010/02/sina-opens-app-engine-sae-service-like.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04FRHk6eyp7ImA9WxBRFUU.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-3662194342784498300</id><published>2010-01-04T14:18:00.000+08:00</published><updated>2010-01-04T14:18:35.713+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-04T14:18:35.713+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="demo" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Trick or Treat, LayoutFocusTraversalPolicy</title><content type="html">Have you ever met such focus traversal issue in Java UI applications? By default, LayoutFocusTraversalPolicy is used to determine the sequence of focus traversal. As stated in Java documents, it sorts components based on their size, position, orientation etc.. However, when two identical components are laid at the same position, there will be a focus traversal issue.&lt;br /&gt;
&lt;br /&gt;
A demo is better than a thousand words. Copy the code to a file FocusTraversal.java and compile and run it.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;package tsul.example;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.lang.reflect.Field;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class FocusTraversal extends JPanel {

    JButton b1 = new JButton("Columns");
    JButton b2 = new JButton("Rows");
    JTextArea content = new JTextArea("Textarea");
    /**
     * This is the main pane
     */
    JScrollPane pane = new JScrollPane();

    public FocusTraversal() {
        super(new BorderLayout());

        pane.setColumnHeaderView(b1);
        // Try to add a duplicate component to pane's header. In such a case,
        // the default
        // LayoutFocusTraversalPolicy won't work properly as expected. The
        // result is we
        // cannot move focus from Columns to Rows by tabling.
        try {
            Field f = Container.class.getDeclaredField("component");
            // bypass default security check
            f.setAccessible(true);
            ArrayList comp = (ArrayList) f.get(pane.getColumnHeader());
            comp.add(b1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        pane.setRowHeaderView(b2);
        pane.setViewportView(content);
        setPreferredSize(new Dimension(600, 400));
        add(pane, BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                frame = new JFrame("Focus Traversal Example");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                FocusTraversal panel = new FocusTraversal();
                frame.getContentPane().add(panel);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    static JFrame frame;

}
&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-3662194342784498300?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=xrb205ziQCA:WJT4TGlpKYA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=xrb205ziQCA:WJT4TGlpKYA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=xrb205ziQCA:WJT4TGlpKYA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=xrb205ziQCA:WJT4TGlpKYA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/xrb205ziQCA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/3662194342784498300/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2010/01/trick-or-treat-layoutfocustraversalpoli.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/3662194342784498300?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/3662194342784498300?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/xrb205ziQCA/trick-or-treat-layoutfocustraversalpoli.html" title="Trick or Treat, LayoutFocusTraversalPolicy" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2010/01/trick-or-treat-layoutfocustraversalpoli.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UCR3Y9eCp7ImA9WxBSFk8.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-1751363235422509472</id><published>2009-12-24T10:58:00.000+08:00</published><updated>2009-12-24T11:27:46.860+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-24T11:27:46.860+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Step Back Debugging for Java in Eclipse?</title><content type="html">In debugging, there are "step into", "step over" etc., but what about a "step back" feature? There are chances that when you hit a "step over" twice by mistake, or when you find out it might be just the previous line which is causing trouble, you just want a "roll back" feature. &lt;br /&gt;
&lt;br /&gt;
Debugging is like traversal on a tree or on a graph. Every breakpoint is a state or a node. In theory, if we save these states, we can step back and forth among any of them. Snapshot, versioning or savepoint can be useful in helping save the debugging states.&lt;br /&gt;
&lt;br /&gt;
There are already such support in C/C++ debuggers like gdb. However, it seems that no Java debugger supports "step back" or "roll back". It would be even nicer if such feature could be included in Eclipse IDE.&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-1751363235422509472?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=tqFI-m2DQEg:JsWGdaJsiOQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=tqFI-m2DQEg:JsWGdaJsiOQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=tqFI-m2DQEg:JsWGdaJsiOQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=tqFI-m2DQEg:JsWGdaJsiOQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/tqFI-m2DQEg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/1751363235422509472/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2009/12/step-back-debugging-for-java-in-eclipse.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/1751363235422509472?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/1751363235422509472?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/tqFI-m2DQEg/step-back-debugging-for-java-in-eclipse.html" title="Step Back Debugging for Java in Eclipse?" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2009/12/step-back-debugging-for-java-in-eclipse.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIBQn04eSp7ImA9WxBTGU4.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-3281491231743715261</id><published>2009-12-16T11:35:00.000+08:00</published><updated>2009-12-16T11:35:53.331+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-16T11:35:53.331+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="configuration" /><category scheme="http://www.blogger.com/atom/ns#" term="http server" /><category scheme="http://www.blogger.com/atom/ns#" term="apache" /><title>Apache: Full Long File Names in Index</title><content type="html">There are cases that the default index file in Apache server trimmed your long file name. Instead you'd like to show them in full length. To do this, you can edit the configuration file of your Apache server (httpd.conf). Add "NameWidth=*" to IndexOptions, so that it looks like:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;IndexOptions FancyIndexing NameWidth=*&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Reference&lt;br /&gt;
&lt;a href="http://httpd.apache.org/docs/1.3/mod/mod_autoindex.html#indexoptions"&gt;http://httpd.apache.org/docs/1.3/mod/mod_autoindex.html#indexoptions&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-3281491231743715261?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=7IWQ94TzrEU:b4MuW4qG3oU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=7IWQ94TzrEU:b4MuW4qG3oU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=7IWQ94TzrEU:b4MuW4qG3oU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=7IWQ94TzrEU:b4MuW4qG3oU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/7IWQ94TzrEU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/3281491231743715261/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2009/12/apache-full-long-file-names-in-index.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/3281491231743715261?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/3281491231743715261?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/7IWQ94TzrEU/apache-full-long-file-names-in-index.html" title="Apache: Full Long File Names in Index" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2009/12/apache-full-long-file-names-in-index.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QDRn49eCp7ImA9WxBTFkk.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-5994719023736177502</id><published>2009-12-12T18:38:00.000+08:00</published><updated>2009-12-13T03:16:17.060+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-13T03:16:17.060+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="report" /><category scheme="http://www.blogger.com/atom/ns#" term="business" /><title>SQL: a Cross-Tabular Report with Case, Rollup and Grouping  Functions</title><content type="html">A Cross-Tabular Report is widely used in computer software. If you keep a journal of expenses, for instance, and by the end of year, you would like to review how much you have spent on each type of goods in a month-by-month view. Or a website administrator would like to know, for each page or URL of website, how many visitors visited using different browsers. These are cases when you need a cross-tabular report. (Definitions of &lt;a href="http://en.wikipedia.org/wiki/Cross_tabulation"&gt;Cross Tabulation&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Contingency_table"&gt;Contingency table&lt;/a&gt;.)&lt;br /&gt;
&lt;br /&gt;
So how to generate a cross tab report in just one line of SQL? The idea is to split columns with "CASE" and group rows with "GROUP BY ROLLUP(name)" and decorate the result with "DECODE(GROUPING(name), 1, 'Total', name)".&lt;br /&gt;
&lt;br /&gt;
Here's an Example:&lt;br /&gt;
&lt;br /&gt;
We have a log table:&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SQL&amp;gt; select page "Page", brws_type "Browser" from visit_table;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Page &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Browser&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;--------------- ----------&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;index.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; FF&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;index.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; IE&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;index.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; IE&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;page1.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; FF&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;page2.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; FF&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;page3.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; FF&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;about.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; FF&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;about.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; SF&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;index.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; SF&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;index.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; SF&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;index.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; FF&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Page &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Browser&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;--------------- ----------&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;page2.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; IE&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;page2.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; IE&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;contact.htm &amp;nbsp; &amp;nbsp; IE&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;contact.htm &amp;nbsp; &amp;nbsp; SF&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;page3.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; SF&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;And now comes the query for cross-tabular report.&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SQL&amp;gt; SELECT DECODE(GROUPING(page), 1, 'All pages', page) "Pages",&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;COUNT(CASE WHEN brws_type='FF' THEN 1 ELSE null END) "Firefox",&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;COUNT(CASE WHEN brws_type='IE' THEN 1 ELSE null END) "Internet Explorer",&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;COUNT(CASE WHEN brws_type='SF' THEN 1 ELSE null END) "Safari",&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;COUNT(*) count&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;FROM visit_table&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;WHERE 1=1&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;GROUP BY ROLLUP(page)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;ORDER BY count desc;&lt;br /&gt;
Pages &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Firefox Internet Explorer &amp;nbsp; &amp;nbsp; Safari &amp;nbsp; &amp;nbsp; &amp;nbsp;COUNT&lt;br /&gt;
--------------- ---------- ----------------- ---------- ----------&lt;br /&gt;
All pages &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;6 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 5 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 16&lt;br /&gt;
index.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;6&lt;br /&gt;
page2.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3&lt;br /&gt;
about.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2&lt;br /&gt;
contact.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2&lt;br /&gt;
page3.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2&lt;br /&gt;
page1.htm &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;SQL is a powerful language.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-5994719023736177502?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=hipQ0Duca-w:4Hkxopv9fWk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=hipQ0Duca-w:4Hkxopv9fWk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=hipQ0Duca-w:4Hkxopv9fWk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=hipQ0Duca-w:4Hkxopv9fWk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/hipQ0Duca-w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/5994719023736177502/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2009/12/sql-cross-tabular-report-with-case.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/5994719023736177502?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/5994719023736177502?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/hipQ0Duca-w/sql-cross-tabular-report-with-case.html" title="SQL: a Cross-Tabular Report with Case, Rollup and Grouping  Functions" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2009/12/sql-cross-tabular-report-with-case.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UFRXo7eCp7ImA9WxBTFkk.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-3503015898530620836</id><published>2009-11-25T13:15:00.000+08:00</published><updated>2009-12-13T03:13:34.400+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-13T03:13:34.400+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title>Recent Risks on Internet</title><content type="html">1. URL shorten service. &lt;br /&gt;
Hidden of advertisements or even worse, malicious websites.&lt;br /&gt;
Lost of service if the URL shorten service provider is down or hacked.&lt;br /&gt;
&lt;br /&gt;
2. Websites, especially SNS, request user to provide email login and password in order to add friends.&lt;br /&gt;
Do they really need your password to just get a list of your friends?&lt;br /&gt;
Even the websites requesting your credentials are trustworthy, you are still at risk. For example, some website can add your friends on MSN or Gtak by requesting your logins and passwords, but your credentials are transferred in plain HTML to them. This means sniffers can get your passwords with ease.&lt;br /&gt;
There is no reason to request your password while other methods like oauth are available.&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-3503015898530620836?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=qtijrzJrBh8:vr3AJrTvD74:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=qtijrzJrBh8:vr3AJrTvD74:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=qtijrzJrBh8:vr3AJrTvD74:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=qtijrzJrBh8:vr3AJrTvD74:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/qtijrzJrBh8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/3503015898530620836/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2009/11/recent-risks-on-internet.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/3503015898530620836?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/3503015898530620836?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/qtijrzJrBh8/recent-risks-on-internet.html" title="Recent Risks on Internet" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2009/11/recent-risks-on-internet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YNQX87eyp7ImA9WxBTFkk.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-5681839166864402162</id><published>2009-10-17T11:15:00.001+08:00</published><updated>2009-12-13T03:13:10.103+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-13T03:13:10.103+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="network" /><title>Connection Interrupted (TCP RST) has nothing to do with HTTPS aka  HTTP over TLS</title><content type="html">&lt;i style="color: #666666; font-family: inherit;"&gt;A network has layers.&lt;/i&gt; &lt;br /&gt;
&lt;br /&gt;
In the &lt;a href="http://en.wikipedia.org/wiki/TCP/IP_model" target="_blank"&gt;TCP/IP model&lt;/a&gt;, there are four layers. TCP, UDP belong to the transport layer, while HTTP, SSL/TLS belong to application layer. RST (Reset the connection) is a flag in TCP header as in RFC793. RST vulnerability as well as off-path attacks are disscussed in RFC4953. Basically, if a connection is interrupted, it simply means that there is an &lt;b&gt;accepted&lt;/b&gt; TCP package with RST flag set. It could be the server who reset the connection, or it could be an attacker. HTTP over TLS aka HTTPS, RFC 2818, is an application layer protocol. SSL/TLS protocol is used between HTTP and the transport layer. From a transport layer's view, the upper layer applications are served in the same way.&lt;br /&gt;
&lt;br /&gt;
To summarize, TCP RST vulnerability is applicable to HTTP or HTTPS or any other application protocols as long as they rely on TCP connection, but it has nothing to do with application layer protocols.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.ietf.org/rfc.html"&gt;A link to RFC.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-5681839166864402162?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=EmWCn3HOTRs:ehHtbp40_6I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=EmWCn3HOTRs:ehHtbp40_6I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=EmWCn3HOTRs:ehHtbp40_6I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=EmWCn3HOTRs:ehHtbp40_6I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/EmWCn3HOTRs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/5681839166864402162/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2009/10/connection-interrupted-tcp-rst-has.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/5681839166864402162?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/5681839166864402162?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/EmWCn3HOTRs/connection-interrupted-tcp-rst-has.html" title="Connection Interrupted (TCP RST) has nothing to do with HTTPS aka  HTTP over TLS" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2009/10/connection-interrupted-tcp-rst-has.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAAQH09fyp7ImA9WxNWFU0.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-2729716996960634782</id><published>2009-10-14T15:19:00.000+08:00</published><updated>2009-10-14T15:19:01.367+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-14T15:19:01.367+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="migration" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><title>Migrate from Goolge Pages to Appengine</title><content type="html">&lt;i style="color: #999999;"&gt;Migration without losing any data.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
When it comes to Google Pages, will you opt-out or do nothing and wait for your pages to be migrated to sites smoothly? We can wait, but at a cost. Google Sites do not provide equal or more features than Pages do. No custom Javascript; no uploaded HTML; limited layouts, themes. It dose not seem possible to migrate without losing any data. Even the appearance will change. So, where else can we migrate to?&lt;br /&gt;
&lt;br /&gt;
Our choice is Appengine.&lt;br /&gt;
&lt;br /&gt;
Pros:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Powerful. &lt;/li&gt;
&lt;li&gt;From the same vendor.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Cons:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Technical skills required&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Step by step migration:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Download your pages as a zip from Google Pages&lt;/li&gt;
&lt;li&gt;Create a new appspot handle&lt;/li&gt;
&lt;li&gt;Download appengine SDK from &lt;a href="http://code.google.com/appengine/" target="_blank"&gt;http://code.google.com/appengine/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create a new project&lt;/li&gt;
&lt;li&gt;Configure the project&lt;/li&gt;
&lt;li&gt;Unzip pages into static content directory&lt;/li&gt;
&lt;li&gt;Test on localhost&lt;/li&gt;
&lt;li&gt;Deploy to appspot&lt;/li&gt;
&lt;li&gt;Test with &lt;a href="http://%3cyour-handle%3e.appspot.com/"&gt;http://&amp;lt;your-handle&amp;gt;.appspot.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(Optional) Bind your domain&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
The long waited automatical migration from Pages to Sites is still not done! Is Google waiting for everyone to opt-out? The magic is a rumor.&lt;br /&gt;
&lt;blockquote&gt;&lt;div style="font-size: 80%; font-weight: bold;"&gt;Option 1 - Do nothing, and your pages will automatically be moved to Google Sites&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-size: 80%;"&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;We'll set up the new site and move your pages for you.&lt;/li&gt;
&lt;li&gt;Visits to your googlepages.com URL will redirect to your new site.&lt;/li&gt;
&lt;li&gt;Note that Google Sites does not support custom JavaScript or CSS in its pages.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div style="font-size: 80%; font-weight: bold;"&gt;Option 2 - Opt out of the move, and take your pages to a new location&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Download your site.&lt;/li&gt;
&lt;li&gt;Once you've moved your site to its new location, opt out of migration by setting up a redirect below.&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;Let's wait and see.&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-2729716996960634782?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=9owZABtSkoc:2osn5RlkRQw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=9owZABtSkoc:2osn5RlkRQw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=9owZABtSkoc:2osn5RlkRQw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=9owZABtSkoc:2osn5RlkRQw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/9owZABtSkoc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/2729716996960634782/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2009/10/migrate-from-goolge-pages-to-appengine.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/2729716996960634782?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/2729716996960634782?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/9owZABtSkoc/migrate-from-goolge-pages-to-appengine.html" title="Migrate from Goolge Pages to Appengine" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2009/10/migrate-from-goolge-pages-to-appengine.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ECQXw_fSp7ImA9WxNWFU0.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-7109106371259637793</id><published>2009-10-14T14:27:00.000+08:00</published><updated>2009-10-14T14:27:40.245+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-14T14:27:40.245+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="impact" /><category scheme="http://www.blogger.com/atom/ns#" term="lunar" /><title>A History of man-made Lunar Impact</title><content type="html">&lt;div style="color: #666666;"&gt;&lt;i&gt;Hit the Moon&lt;/i&gt;&lt;br /&gt;
&lt;/div&gt;&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
An incomplete list of lunar impact by human being.&lt;br /&gt;
&lt;br /&gt;
2009.10.9 7:31 EDT &lt;br /&gt;
Nasa LCROSS &lt;br /&gt;
&lt;a href="http://www.nasa.gov/"&gt;http://www.nasa.gov/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
2009.03.01 16:13 CST&lt;br /&gt;
嫦娥一号 ChangE1 &lt;br /&gt;
&lt;a href="http://baike.baidu.com/view/32160.htm"&gt;http://baike.baidu.com/view/32160.htm&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
2008.11.14 &lt;br /&gt;
The Moon Impact Probe &lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/Moon_Impact_Probe"&gt;http://en.wikipedia.org/wiki/Moon_Impact_Probe&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
2006.9.3 05:42 UT&lt;br /&gt;
SMART-1&lt;br /&gt;
&lt;a href="http://sci.esa.int/science-e/www/object/index.cfm?fobjectid=39961"&gt;http://sci.esa.int/science-e/www/object/index.cfm?fobjectid=39961&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-7109106371259637793?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=sFp1KECvp6c:6O1a_b0EwSA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=sFp1KECvp6c:6O1a_b0EwSA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=sFp1KECvp6c:6O1a_b0EwSA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=sFp1KECvp6c:6O1a_b0EwSA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/sFp1KECvp6c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/7109106371259637793/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2009/10/history-of-man-made-lunar-impact.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/7109106371259637793?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/7109106371259637793?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/sFp1KECvp6c/history-of-man-made-lunar-impact.html" title="A History of man-made Lunar Impact" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2009/10/history-of-man-made-lunar-impact.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YFQnk9eCp7ImA9WxNXEk4.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-3496517951750865666</id><published>2009-09-29T22:38:00.000+08:00</published><updated>2009-09-29T22:38:33.760+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-29T22:38:33.760+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="captcha" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><title>Distinguish the two words in reCAPTCHA</title><content type="html">reCAPTCHA is a great idea, but people can `easily` distinguish the known word from the unknown one.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014003_368x261.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014003_368x261.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014023_367x252.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014023_367x252.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014117_357x251.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014117_357x251.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014130_358x247.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014130_358x247.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014141_360x256.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014141_360x256.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014153_350x261.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014153_350x261.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014216_359x259.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014216_359x259.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014227_357x252.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://photos.tsul.net/albums/photos.tsul.net/blog/2009-09-29-014227_357x252.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-3496517951750865666?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=q9RzBVvUPyE:TDOgK_hnYSM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=q9RzBVvUPyE:TDOgK_hnYSM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=q9RzBVvUPyE:TDOgK_hnYSM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=q9RzBVvUPyE:TDOgK_hnYSM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/q9RzBVvUPyE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/3496517951750865666/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2009/09/distinguish-two-words-in-recaptcha.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/3496517951750865666?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/3496517951750865666?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/q9RzBVvUPyE/distinguish-two-words-in-recaptcha.html" title="Distinguish the two words in reCAPTCHA" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2009/09/distinguish-two-words-in-recaptcha.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EHRH87eip7ImA9WxNQGUg.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-829091585959066004</id><published>2009-09-26T16:59:00.001+08:00</published><updated>2009-09-26T17:00:35.102+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-26T17:00:35.102+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="moebius" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="mobius" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>Moebius Gears</title><content type="html">Here's a picture of Moebius Gears.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_uIJA2-bKhSs/Sr3XpV6a7sI/AAAAAAAAABs/KoC6wLXiBNo/s1600-h/moebiusgears.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_uIJA2-bKhSs/Sr3XpV6a7sI/AAAAAAAAABs/KoC6wLXiBNo/s400/moebiusgears.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Look cool? If you are on a Linux box, you might already have a lively demo installed. For Ubuntu users, it is located at /usr/lib/xscreensaver/moebiusgears.&lt;br /&gt;
&lt;br /&gt;
Press Alt+F2 and type /usr/lib/xscreensaver/moebiusgears and run!&lt;br /&gt;
&lt;br /&gt;
The xscreensaver source code could be downloaded from &lt;a href="https://launchpad.net/ubuntu/hardy/+source/xscreensaver/5.04-2ubuntu2/+files/xscreensaver_5.04.orig.tar.gz"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-829091585959066004?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=qTLfjdY-ikU:7pqCv5RxBNI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=qTLfjdY-ikU:7pqCv5RxBNI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=qTLfjdY-ikU:7pqCv5RxBNI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=qTLfjdY-ikU:7pqCv5RxBNI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/qTLfjdY-ikU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/829091585959066004/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2009/09/moebius-gears.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/829091585959066004?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/829091585959066004?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/qTLfjdY-ikU/moebius-gears.html" title="Moebius Gears" /><author><name>TSUL</name><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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_uIJA2-bKhSs/Sr3XpV6a7sI/AAAAAAAAABs/KoC6wLXiBNo/s72-c/moebiusgears.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tsul.net/2009/09/moebius-gears.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cBRng7cCp7ImA9WxNQFkQ.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-1598935542406852089</id><published>2009-09-23T15:30:00.000+08:00</published><updated>2009-09-23T15:30:57.608+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-23T15:30:57.608+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="critics" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><title>The Risk of OpenID</title><content type="html">OpenID seems a promising standard for user authentication. If service providers support OpenID, users can login without creating another pair of account and password. Ideally, a user need only remember one pair of account and password. However, such convenience comes at a cost. The only pair of account and password or the OpenID provider becomes a &lt;a href="http://en.wikipedia.org/wiki/Single_Point_of_Failure"&gt;Single Point Of Failure&lt;/a&gt;. If you ever forgot your password or the Identity Provider withdrew your account because you didn't login in the past three months, you will have no way to login to any of the services. Here, we assume that the service providers only accept authentication from OpenID providers. This also applies to other forms of third party authentications.&lt;br /&gt;
&lt;br /&gt;
For users, care should be taken on choosing OpenID providers. Users should keep their OpenID account active and secure the password. For service providers, they should allow other ways of authentication besides OpenID. Users should not lose the service if they lose their OpenID.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;OpenID is not that open, not even as open as telephone numbers which could be transfered among telephone service providers.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-1598935542406852089?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=YBaYWZdQAEc:tzZG_onsU30:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=YBaYWZdQAEc:tzZG_onsU30:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=YBaYWZdQAEc:tzZG_onsU30:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=YBaYWZdQAEc:tzZG_onsU30:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/YBaYWZdQAEc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/1598935542406852089/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2009/09/risk-of-openid.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/1598935542406852089?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/1598935542406852089?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/YBaYWZdQAEc/risk-of-openid.html" title="The Risk of OpenID" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2009/09/risk-of-openid.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMNRXwyfyp7ImA9WxVUFkQ.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-2963542035508285169</id><published>2009-03-21T23:07:00.004+08:00</published><updated>2009-03-22T11:28:14.297+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-22T11:28:14.297+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="invention" /><category scheme="http://www.blogger.com/atom/ns#" term="proposal" /><title>Inventions: Fancy Disk Copier and Fancier Copy Dragger</title><content type="html">Here are our two new inventions: the Fancy Disk Copier and the Fancier Copy Dragger.&lt;br /&gt;&lt;br /&gt;The Fancy Disk Copier is a CD/DVD copy machine. It works like a photo copier. You put in a source CD/DVD, and press "COPY"; the copy CD/DVD will come out instantly. Unlike a photo copier, the Fancy Disk Copier will copy with absolutely no loss of quality. The differences between copies and the original CD/DVD is not distinguishable by anyone except the Fancy Disk Copiers. This will, hopefully, prevent copyright abuse.&lt;br /&gt;&lt;br /&gt;Our second invention, the Fancier Copy Dragger, is a dragging controller of copy speed. The Fancier Copy Dragger not only supports dragging forward at any pace, but also enables user to drag back in case a user would enjoy the copy process again. What's more, the Fancier Copy Dragger allows users to undo all copies by dragging to the very beginning. Those undo-ed CD/DVDs can be used as if they are new ones. Unlike photo copiers, hundreds of pieces of paper got wasted once any error occurred. The Fancier Copy Dragger will help protecting our environment.&lt;br /&gt;&lt;br /&gt;Thanks for your interest in our new inventions. We will send out our "beta" products to selected users starting from next week. &lt;a href="http://spreadsheets.google.com/viewform?formkey=cDNLa0pVWHhWV1N4Y1VRdW5hdVF5VUE6MA.."&gt;Get involved&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-2963542035508285169?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=WqBmciNuJ1c:KdeYBMAyc34:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=WqBmciNuJ1c:KdeYBMAyc34:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=WqBmciNuJ1c:KdeYBMAyc34:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=WqBmciNuJ1c:KdeYBMAyc34:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/WqBmciNuJ1c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/2963542035508285169/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2009/03/inventions-fancy-disk-copier-and.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/2963542035508285169?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/2963542035508285169?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/WqBmciNuJ1c/inventions-fancy-disk-copier-and.html" title="Inventions: Fancy Disk Copier and Fancier Copy Dragger" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2009/03/inventions-fancy-disk-copier-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAERn47fCp7ImA9WxVTF0o.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-5628927365190224303</id><published>2009-01-01T10:22:00.002+08:00</published><updated>2009-01-01T10:25:07.004+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-01T10:25:07.004+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="greeting" /><category scheme="http://www.blogger.com/atom/ns#" term="leap" /><title>Happy New Year 2009</title><content type="html">Today is January 1st, 2009. The sun raises as usual, but there's a &lt;a href="http://en.wikipedia.org/wiki/Leap_second"&gt;leap second&lt;/a&gt; added after GMT 23:59:59 Dec. 31, 2008. At that time spot, you might notice something like XX:59:60. XX depends on your timezone. If you are using Beijing time, it should be 07:59:60, and if you locate in central America, it should be 17:59:60.&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-5628927365190224303?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=DqAwlgL7wMQ:-U7erDDvZ3Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=DqAwlgL7wMQ:-U7erDDvZ3Y:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=DqAwlgL7wMQ:-U7erDDvZ3Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=DqAwlgL7wMQ:-U7erDDvZ3Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/DqAwlgL7wMQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/5628927365190224303/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2009/01/happy-new-year-2009.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/5628927365190224303?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/5628927365190224303?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/DqAwlgL7wMQ/happy-new-year-2009.html" title="Happy New Year 2009" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2009/01/happy-new-year-2009.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UMRXk7fyp7ImA9WxRaGEo.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-7726808015909824980</id><published>2008-12-21T22:45:00.002+08:00</published><updated>2008-12-21T22:54:44.707+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-21T22:54:44.707+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="translation" /><category scheme="http://www.blogger.com/atom/ns#" term="proposal" /><title>Talk to foreigners (even aliens) in your language seamlessly</title><content type="html">&lt;i&gt;Proposal &lt;/i&gt;&lt;br /&gt;
&lt;div&gt;&lt;i&gt;Build an automatic translation&amp;nbsp;mechanism into instance message system (and other Internet communication system), as if a simultaneous interpreter were there.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;It would be exciting if you master three languages. However, one could not master all languages. Even if such an interpreter exists, hiring him/her would be expensive. Internet helps people communicate easily from every corner around the world, and if it were an even probability to talk to anyone on earth, the chance a talker speaks foreign language is much higher. If we have such an automatic translation system, as if a simultaneous interpreter is ready, negotiation should be much simpler.&lt;br /&gt;
&lt;br /&gt;
The problem currently is that a machine could not translate as good as an average interpreter. Languages are not one-to-one mapping, and machines are not good at analyzing and choosing which words to use and in what order. And this is why interpret is still a career.&lt;br /&gt;
&lt;br /&gt;
Whenever a computer is not good at something, we could try to train it in hope that it will eventually learns and masters it. The source of training material would be from thousands of millions of people. As in image recognition, tags from Internet users helps classify and recognize pictures a lot. If, in one day, computers could seamlessly translate one language into another, we would be happy that we no longer need to learn a second language, and we would be equally sad that we will never drive to learn other than native language.&lt;br /&gt;
&lt;br /&gt;
Currently, machine translation in instance message system should be more than experimental, but at least it could provide some information which might be helpful to international talkers. And, have fun to laugh at silly computers.&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-7726808015909824980?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=Qtk4_rnOIHc:LZEIMXtXoxY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=Qtk4_rnOIHc:LZEIMXtXoxY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=Qtk4_rnOIHc:LZEIMXtXoxY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=Qtk4_rnOIHc:LZEIMXtXoxY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/Qtk4_rnOIHc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/7726808015909824980/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2008/12/talk-to-foreigners-even-aliens-in-your.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/7726808015909824980?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/7726808015909824980?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/Qtk4_rnOIHc/talk-to-foreigners-even-aliens-in-your.html" title="Talk to foreigners (even aliens) in your language seamlessly" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2008/12/talk-to-foreigners-even-aliens-in-your.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcMRXo5cCp7ImA9WxRaFU8.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-6645021292972636188</id><published>2008-12-17T22:51:00.003+08:00</published><updated>2008-12-17T23:01:24.428+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-17T23:01:24.428+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title>File names you can NOT create on Windows</title><content type="html">&lt;i&gt;Try to create a file named NUL.txt on Windows XP, and you probably get an error message.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Many characters are not allowed for file names on Windows. This includes&lt;br /&gt;
&amp;lt; &amp;gt; : " / \ | ? *&lt;br /&gt;
&lt;br /&gt;
Besides, many reserved device names should be avoided. This includes&lt;br /&gt;
NUL, CON, PRN, AUX, COM1, COM2, ..., LPT1, LPT2, ...&lt;br /&gt;
&lt;br /&gt;
Also, using the device names unintended might raise security vulnerability.&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-6645021292972636188?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=_bWkVdVbdIA:5rnCruZzyHY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=_bWkVdVbdIA:5rnCruZzyHY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=_bWkVdVbdIA:5rnCruZzyHY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=_bWkVdVbdIA:5rnCruZzyHY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/_bWkVdVbdIA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/6645021292972636188/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2008/12/file-names-you-can-not-create-on.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/6645021292972636188?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/6645021292972636188?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/_bWkVdVbdIA/file-names-you-can-not-create-on.html" title="File names you can NOT create on Windows" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2008/12/file-names-you-can-not-create-on.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIDSXwzeCp7ImA9WxRaEU0.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-5426982133250666763</id><published>2008-12-13T00:44:00.002+08:00</published><updated>2008-12-13T00:49:38.280+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-13T00:49:38.280+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="concept" /><title>Dimensional Modeling vs Interval Tree</title><content type="html">&lt;div class="gmail_quote"&gt;The concept Dimensional Modeling is like the Interval Tree (Segment Tree). Both speed up queries by storing information at different levels. The difference is that in Dimensional Modeling, levels are defined by users, while in Interval Tree, levels are usually defined by a complete binary tree. Interval Tree usually solves problems on one dimension, but it could also be applied to 2D problems. One dimension is not a limit.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-5426982133250666763?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=F9QqwOMVKj4:OQ7taYNhlIM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=F9QqwOMVKj4:OQ7taYNhlIM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=F9QqwOMVKj4:OQ7taYNhlIM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=F9QqwOMVKj4:OQ7taYNhlIM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/F9QqwOMVKj4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/5426982133250666763/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2008/12/dimensional-modeling-vs-interval-tree.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/5426982133250666763?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/5426982133250666763?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/F9QqwOMVKj4/dimensional-modeling-vs-interval-tree.html" title="Dimensional Modeling vs Interval Tree" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2008/12/dimensional-modeling-vs-interval-tree.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAHQnY9cCp7ImA9WxRUFEg.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-6871449372269466289</id><published>2008-11-23T21:54:00.003+08:00</published><updated>2008-11-23T22:32:13.868+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-23T22:32:13.868+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Quotes</title><content type="html">&lt;div dir="ltr"&gt;&lt;blockquote&gt;Quoted &lt;/blockquote&gt;Quotes are widely used in scripting languages, including (but not limited to) Bash, SQL, Python, Tcl, Perl, PHP, JavaScript. However, there is no universal rule for quotes. Most languages support single quote (') or double quote ("), while others have their own quotes like triple quote (''' or """), or braces ({, }). When one should code in a combination of different languages, the quotes would definitely confues programmers, not mentioning variable substitution, regular expression, etc.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-6871449372269466289?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=Bon3Pn26omA:JAGD1W5BsCM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=Bon3Pn26omA:JAGD1W5BsCM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=Bon3Pn26omA:JAGD1W5BsCM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=Bon3Pn26omA:JAGD1W5BsCM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/Bon3Pn26omA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/6871449372269466289/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2008/11/quotes.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/6871449372269466289?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/6871449372269466289?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/Bon3Pn26omA/quotes.html" title="Quotes" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2008/11/quotes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MMR3czeyp7ImA9WxRUEko.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-8895260499566971015</id><published>2008-11-13T10:51:00.004+08:00</published><updated>2008-11-21T22:58:06.983+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-21T22:58:06.983+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><category scheme="http://www.blogger.com/atom/ns#" term="programming language" /><title>Different outputs in Tcl - Stdout vs Return Value</title><content type="html">&lt;i&gt;When both &lt;b&gt;set a {hi}&lt;/b&gt; and &lt;b&gt;puts "hi"&lt;/b&gt; echo a "hi" in an interactive tcl shell, what is the difference between them?&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Clarification on "output"&lt;/span&gt;&lt;br /&gt;
1. standard output&lt;br /&gt;
puts command will output to stdout by default.&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;% puts "hello"&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;hello&lt;/div&gt;2. return values&lt;br /&gt;
set hi {hello} has a return value hello and will echo back to user&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;% set hi {hello}&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;hello&lt;/div&gt;&lt;br /&gt;
To make things clear, look at this example.&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;% set ret [puts "hello"]&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;hello&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;% puts $ret&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;(blank)&lt;/div&gt;&lt;br /&gt;
So that the return value from puts is blank. &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Compound statements&lt;/span&gt;&lt;br /&gt;
Let move on to compound statements. &lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;% set a "hello"; set b "hello2"&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;hello2&lt;/div&gt;This gives a single line of output from `set b`, and a and b are both set.&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;% puts $a&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;hello&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;% puts $b&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;hello2&lt;/div&gt;&lt;br /&gt;
Here's two lines of output from stdout.&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;% puts "hello"; puts "hello2"&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;hello&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;hello2&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Importance&lt;/span&gt;&lt;br /&gt;
Why is this important? What if we would like to store a calculated value into variable a.&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;% set a [expr 3+3]&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;6&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;% puts $a&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;6&lt;/div&gt;This is what we expected. However, if we wrote another version of expr that output the result into stdout.&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;% set a [set b [expr 3+3]; puts $b]&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;6&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;% puts $a&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;(blank)&lt;/span&gt;&lt;br /&gt;
We get nothing.&lt;br /&gt;
&lt;br /&gt;
Generally speaking, it is not a good idea to print to screen from many functions. Because this would make the testing difficult, if not impossible. Usually, assert will compare the return result to expected result, while the output to standard output are ignored. Despite all that, we can still try to test function which output to stdout. The idea is to trap the stdout. This assert for stdout would look like this pseudo code:&lt;br /&gt;
&lt;blockquote&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;procedure assertStdout (expected, command) {&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; create out for this instance&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; execute command &amp;gt; out&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; flush out&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; return expected == out&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;}&lt;/div&gt;&lt;/blockquote&gt;One trick is that if multiple assertStdout procedures are running, 'out's must be distinct in order to keep thread-safe. &lt;br /&gt;
&lt;br /&gt;
The echo back of tcl might be of use, but it could confuse people with the output from within procedures. However, it is mandatory to distinguish them for a programmer. Other scripting languages like shell does not have such echo back, but that doesn't mean it is OK to output from many functions for them. Especially, for compicated software that requires a thorough test, standard out or output to file everywhere would definitely bring down the testing.&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-8895260499566971015?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=dsQ2rSl1y7g:EV_OmPFl_lM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=dsQ2rSl1y7g:EV_OmPFl_lM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=dsQ2rSl1y7g:EV_OmPFl_lM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=dsQ2rSl1y7g:EV_OmPFl_lM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/dsQ2rSl1y7g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/8895260499566971015/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2008/11/different-outputs-in-tcl-stdout-vs.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/8895260499566971015?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/8895260499566971015?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/dsQ2rSl1y7g/different-outputs-in-tcl-stdout-vs.html" title="Different outputs in Tcl - Stdout vs Return Value" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2008/11/different-outputs-in-tcl-stdout-vs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUICRn4yfSp7ImA9WxRQFUg.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-7806192978713728711</id><published>2008-09-29T18:40:00.003+08:00</published><updated>2008-10-09T21:06:07.095+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-09T21:06:07.095+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="checkpoint" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="virtualization" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><category scheme="http://www.blogger.com/atom/ns#" term="snapshot" /><title>Snapshot in UI Testing</title><content type="html">&lt;div dir="ltr"&gt;If you have experience in JUnit or other testing tools, you probably know the importance of setup and teardown methods. These two methods help build a testing environment. However, when it comes to UI testing, it is not the case. UI testing means taking a long time, boring, and random exceptions. What's more, every time an error occurs, which might be caused either by a typo or by the tested codes, the only solution is to start over again from the very beginning. This is boring!&lt;br /&gt;
&lt;br /&gt;
If we could take a snapshot at certain points (which are called save points), we could easily get started from those points. It should be time efficient. It certainly save a lot of time otherwise wasted in setting up the environment again. What's more, you can benefit from reproducing some random errors. If a snapshot were taken just before it occurs, the error would probably show up again, which also helps reduce the number of bugs. &lt;br /&gt;
&lt;br /&gt;
It is not too hard to implement such a system. There are various ways though. It can be implemented as a functionality of the testing tools, or it could be bounded with the help of underlying systems. One good candidate is the virtual machine. Most VMMs, including open source ones, have a similar function. Taking snapshot takes seconds to minutes, depending on the implementations of VMM and the size of the virtual machine. We could take multiple snapshots, and rollback to a certain one, and even make branches. Although making use of VMM might seem easier, it is harder, but necessary, to integrate the snapshot into the testing tools. Taking snapshot should be as simple as setting breakpoints in debug.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-7806192978713728711?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=er30tGBOa_8:ePv-T6Y3U6o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=er30tGBOa_8:ePv-T6Y3U6o:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=er30tGBOa_8:ePv-T6Y3U6o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=er30tGBOa_8:ePv-T6Y3U6o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/er30tGBOa_8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/7806192978713728711/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2008/09/snapshot-in-ui-testing.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/7806192978713728711?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/7806192978713728711?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/er30tGBOa_8/snapshot-in-ui-testing.html" title="Snapshot in UI Testing" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2008/09/snapshot-in-ui-testing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04CSHw_eCp7ImA9WxRTEUk.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-8180388407729130775</id><published>2008-08-31T10:26:00.002+08:00</published><updated>2008-08-31T10:32:49.240+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-31T10:32:49.240+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="proposal" /><title>Expecting analytical tools for individuals</title><content type="html">&lt;div dir="ltr"&gt;Analytical tools for websites are everywhere. However, analytical tools for individuals are rare. Google web history might be one, but has much less functions compared to its analytics.&lt;br /&gt;
&lt;br /&gt;
One may wonder why would we need an analytical tool for individuals. The reason is that tracing one's activities is interesting (as long as it's not privacy related). As it should be helpful to a website, an analytical tool for individual would benefit the user and even provide suggestions on &lt;a href="http://en.wikipedia.org/wiki/Time_management" target="_blank"&gt;time management&lt;/a&gt;. The analytical tool for individual has to be &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;automatic; users won't log each into a document manually.&lt;/li&gt;
&lt;li&gt;complete; a partial result is of mere use.&lt;/li&gt;
&lt;li&gt;precise; an imprecise log will lead to fault result.&lt;/li&gt;
&lt;/ol&gt;Of these characters, automatic is the most important. A user is usually not willing to log his/her activities manually. Users are not able to log each activity precisely. However logging is a required step in time management, without which analyzing would be impossible.&lt;br /&gt;
&lt;br /&gt;
It would be difficult to implement such an analytical tool, especially for fine-grained user activities. There are different operating systems, browsers, etc. Besides, there are hundreds of thousands of activities outside computer world. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-8180388407729130775?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=eaSkKbku408:E51n1ypMHc8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=eaSkKbku408:E51n1ypMHc8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=eaSkKbku408:E51n1ypMHc8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=eaSkKbku408:E51n1ypMHc8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/eaSkKbku408" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/8180388407729130775/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2008/08/expecting-analytical-tools-for.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/8180388407729130775?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/8180388407729130775?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/eaSkKbku408/expecting-analytical-tools-for.html" title="Expecting analytical tools for individuals" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2008/08/expecting-analytical-tools-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MDRXs7fSp7ImA9WxdUEEo.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-5985882914103709250</id><published>2008-07-26T18:46:00.004+08:00</published><updated>2008-07-26T19:24:34.505+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-26T19:24:34.505+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="user experience" /><category scheme="http://www.blogger.com/atom/ns#" term="virtualization" /><title>Seamless mode of virtual machines could be improved.</title><content type="html">&lt;div dir="ltr"&gt;&lt;i&gt;Thanks to Windows, we are so used to Ctrl+Tab. (What? You are using a device called mouse?)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Virtual machine has advantages over host machines, though it is usually because of the users rather than the OS itself. Consider the case that you are using Linux as your host OS, but you would also like the the benefits from Windows, besides you get an licensed version. You might be using VirtualBox, or VMware products. They both have a seamless mode which integrates the guest OS into your host OS. This blurs the edge between the host and the guest. You might not notice that the applications are running on different machines. I could watch from Windows Media Player and update my Ubuntu at the same time.&lt;br /&gt;&lt;br /&gt;All seems good before you come to a keyboard-only guru. The 'Ctrl+Tab' simply won't work when you want to switch between host and guest. The focus will not be released, when it is captured by the guest, unless the 'host key' is pressed. This is not an idea 'seamless' mode, where even gurus will not notice the switching from guest from host.&lt;br /&gt;&lt;br /&gt;There are two possible trends of seamless mode for virtual machines on Linux. One is to make use of workspace on Linux. A workspace is like a separate root window on windows and the number of workspace can be changed by users. A virtual machine could use one entire workspace for the guest OS. This is especially convenient if the guest OS is a single workspace operating system. Another possibility is to make guest applications more like host applications. This is similar to Wine. However, one might still want to keep the original theme from guest OS.&lt;br /&gt;&lt;br /&gt;A 'seamless mode' is a very good start point for improved user experience.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="text-align: center; clear: both;"&gt;&lt;a href="http://bp1.blogger.com/_uIJA2-bKhSs/SIsIgB8wIvI/AAAAAAAAAAM/jbfXDI3qqG4/s1600-h/seamless_vm.png" imageanchor="1" style="border: 0pt none ; background-color: transparent; margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://bp1.blogger.com/_uIJA2-bKhSs/SIsIgB8wIvI/AAAAAAAAAAM/R3Mhdr7t7Yc/s320-R/seamless_vm.png" style="border: 0pt none ;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;A screen shot of seamless mode of VirtualBox.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-5985882914103709250?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=ILj8LirMN5M:u6HHoXSsylQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=ILj8LirMN5M:u6HHoXSsylQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=ILj8LirMN5M:u6HHoXSsylQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=ILj8LirMN5M:u6HHoXSsylQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/ILj8LirMN5M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/5985882914103709250/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2008/07/seamless-mode-of-virtual-machines-could.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/5985882914103709250?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/5985882914103709250?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/ILj8LirMN5M/seamless-mode-of-virtual-machines-could.html" title="Seamless mode of virtual machines could be improved." /><author><name>TSUL</name><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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp1.blogger.com/_uIJA2-bKhSs/SIsIgB8wIvI/AAAAAAAAAAM/R3Mhdr7t7Yc/s72-Rc/seamless_vm.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.tsul.net/2008/07/seamless-mode-of-virtual-machines-could.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEBSHw8eip7ImA9WxdVGU0.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-5320606887034659097</id><published>2008-07-24T19:52:00.003+08:00</published><updated>2008-07-24T19:57:39.272+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-24T19:57:39.272+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="prediction" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>What next? Cloud computing, mashup, or app engine.</title><content type="html">&lt;div dir="ltr"&gt;&lt;div&gt;Cloud computing, Mashup, and App engine.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;It might be interesting to build a 'cloud' instead of building an OS. As time goes by, a TV set is no longer an expensive property. Although a computer ( the hardware plus many software bundled) is not as cheap as a TV set, it certainly will in the near future. Will these clouds in the future become OSes which we are now used to? It might be. It was once the era of hardware, and followed by software. It is now Internet and services.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-5320606887034659097?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=Tvg3yw4hPNQ:FFaQTDKVzTE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=Tvg3yw4hPNQ:FFaQTDKVzTE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=Tvg3yw4hPNQ:FFaQTDKVzTE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=Tvg3yw4hPNQ:FFaQTDKVzTE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/Tvg3yw4hPNQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/5320606887034659097/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2008/07/what-next-cloud-computing-mashup-or-app.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/5320606887034659097?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/5320606887034659097?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/Tvg3yw4hPNQ/what-next-cloud-computing-mashup-or-app.html" title="What next? Cloud computing, mashup, or app engine." /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2008/07/what-next-cloud-computing-mashup-or-app.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkABQ307eip7ImA9WxZbFEw.&quot;"><id>tag:blogger.com,1999:blog-2507908522914415132.post-6041303892284338654</id><published>2008-04-17T15:24:00.001+08:00</published><updated>2008-04-17T15:52:32.302+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-17T15:52:32.302+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="system" /><category scheme="http://www.blogger.com/atom/ns#" term="programming language" /><title>os.system() and its return value</title><content type="html">&lt;span style="color:#999999;"&gt;&lt;em&gt;When os.system('exit 1') returns 256, you might wonder what is going on with python? Why isn't it simply 1 (one)? Let's take a look at this command.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A system() command might be frequently used when you were interacting with the system or other scripts.&lt;br /&gt;&lt;br /&gt;Try help(os.system) will only show:&lt;br /&gt;    system(command) -&amp;gt; exit_status&lt;br /&gt;&lt;br /&gt;    Execute the command (a string) in a subshell.&lt;br /&gt;&lt;br /&gt;And it talks nothing about the exit status.&lt;br /&gt;&lt;br /&gt;This function appears in the tutorial as an example and in library reference:&lt;br /&gt;&lt;br /&gt;system(command)&lt;br /&gt;&lt;dl&gt;&lt;dd&gt;Execute the command (a string) in a subshell. This is implemented by calling the Standard C function &lt;tt class="cfunction"&gt;system()&lt;/tt&gt;, and has the same limitations. Changes to &lt;code&gt;posix.environ&lt;/code&gt;, &lt;code&gt;sys.stdin&lt;/code&gt;, etc. are not reflected in the environment of the executed command. &lt;p&gt;On &lt;span class="Unix"&gt;Unix&lt;/span&gt;, the return value is the exit status of the process encoded in the format specified for &lt;tt class="function"&gt;wait()&lt;/tt&gt;. Note that POSIX does not specify the meaning of the return value of the C &lt;tt class="cfunction"&gt;system()&lt;/tt&gt; function, so the return value of the Python function is system-dependent. &lt;/p&gt;&lt;p&gt;On Windows, the return value is that returned by the system shell after running &lt;var&gt;command&lt;/var&gt;, given by the Windows environment variable &lt;a class="envvar" id="l2h-2788"&gt;COMSPEC&lt;/a&gt;: on &lt;b class="program"&gt;command.com&lt;/b&gt; systems (Windows 95, 98 and ME) this is always &lt;code&gt;0&lt;/code&gt;; on &lt;b class="program"&gt;cmd.exe&lt;/b&gt; systems (Windows NT, 2000 and XP) this is the exit status of the command run; on systems using a non-native shell, consult your shell documentation. &lt;/p&gt;&lt;p&gt;Availability: Macintosh, &lt;span class="Unix"&gt;Unix&lt;/span&gt;, Windows. &lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;wait(command)&lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;dd&gt;Wait for completion of a child process, and return a tuple containing its pid and exit status indication: a 16-bit number, whose low byte is the signal number that killed the process, and whose high byte is the exit status (if the signal number is zero); the high bit of the low byte is set if a core file was produced. Availability: Macintosh, &lt;span class="Unix"&gt;Unix&lt;/span&gt;. &lt;/dd&gt;&lt;/dl&gt;So this explains why os.system('exit 1') returns 256 instead of 1. Actually, the signal number killed the process is zero. To get the exit status, just shift the value 8-bit to the right.&lt;br /&gt;&lt;br /&gt;Here is a link talking about the return code of os.system(). &lt;a class="moz-txt-link-freetext" href="http://mail.python.org/pipermail/python-list/2001-March/073147.html"&gt;http://mail.python.org/pipermail/python-list/2001-March/073147.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&amp;copy;2006, 2011 TSUL&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2507908522914415132-6041303892284338654?l=blog.tsul.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=xcnD_mYMk5A:26u43ZRh-vE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=xcnD_mYMk5A:26u43ZRh-vE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.tsul.net/~ff/TsulBestLog?a=xcnD_mYMk5A:26u43ZRh-vE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TsulBestLog?i=xcnD_mYMk5A:26u43ZRh-vE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TsulBestLog/~4/xcnD_mYMk5A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tsul.net/feeds/6041303892284338654/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tsul.net/2008/04/ossystem-and-its-return-value.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/6041303892284338654?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2507908522914415132/posts/default/6041303892284338654?v=2" /><link rel="alternate" type="text/html" href="http://feeds.tsul.net/~r/TsulBestLog/~3/xcnD_mYMk5A/ossystem-and-its-return-value.html" title="os.system() and its return value" /><author><name>TSUL</name><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><feedburner:origLink>http://blog.tsul.net/2008/04/ossystem-and-its-return-value.html</feedburner:origLink></entry></feed>

