2015年5月17日 星期日

Python list tail friendly

用python整理演算法資料結構的時候順便簡單驗證了一下cpython對list splice的實作,
以下兩段code從執行效率上可以看出list對尾巴方向的操作的確會比較快

# slow.py
import cProfile

def xf(num):
    x = range(num)
    while x:
        x[:10] = [] # main test snippet

cProfile.runctx("xf(100000)", globals(), locals())


# fast.py
import cProfile

def xf(num):
    x = range(num)
    while x:
        x[-10:] = [] # main test snippet

cProfile.runctx("xf(100000)", globals(), locals())

2015年3月7日 星期六

追求UX良好的VIM編輯器之道(II)

Paste to command mode
實用技巧, UX待改良(?)
http://stackoverflow.com/questions/3997078/how-to-paste-text-into-vim-command-line

2015年3月6日 星期五

Why people are selfish?

小時候成績單評語被老師打了"熱心助人" 在長大之後這樣的評語還是有辦法在周遭的人間保持?

Possibly it's just the fxcking nature of humankind.

2015年2月25日 星期三

追求UX良好的VIM編輯器之道

用了幾個月VsVim之邪門歪道後突然頓悟的實用技巧

背景介紹
====

Vim使用者可能常常會有一個很大的困擾,
對一般的editor來說刪除跟剪下(Cut)是兩個不同的概念,
但在Vim裡所有的刪除(dd, df, x系列) default都會被視為剪下,
也就是你只要想刪掉的東西都會被存到Vim default的剪貼簿(clipboard)裡。

Vim的剪貼簿又叫作register (see :help registers<CR>)
但實際上Vim有不只一個剪貼簿(register),
每個剪貼簿用一個a-z, 1-9還有一堆特殊符號的字母表示,
如果想要存取這些剪貼簿就可以用"符號加上剪貼簿名稱去存取。
e.g.
   複製一行到a剪貼簿:            "ayy
   讀取a剪貼簿並貼上:            "ap

如果不指定剪貼簿名稱,那就是使用某個特殊字元為名的default剪貼簿。


技巧篇
=====
所以刪除跟貼上撞在一起的解法很簡單:
就是當你要刪除東西就讓東西被送到defualt register裡。
如果你要剪下東西,那就使用windows中<C-x>的快捷鍵。
讓<C-x> map到刪除東西到除了default register以外的register (a-z 1-9任君挑選)
然後在用y貼上的時候也map掉原本的貼上,
而改指定從<C-x>時用的register貼上。


詳細腳本
====
待補....







2015年2月20日 星期五

Lock v.s. Singleton & lazy initialization(evaluation)

雖然在看到MSDN的reference前有想過可能要這樣寫,但我一度以為編譯器最佳化會幫你作掉......
錯誤寫法:
public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         lock (syncRoot) 
         {
            if (instance == null) 
               instance = new Singleton();
         }

         return instance;
      }
   }
}
正確寫法:
public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }

         return instance;
      }
   }
}
Comment:
其實兩個寫法應該都是正確的,只是會有速度上的差別。
Reference:
https://msdn.microsoft.com/en-us/library/ff650316.aspx