Linux 版有道词典

OS: ubuntu 12.04

Linux版的StarDic真是越来越难用了。试了下Linux版的有道词典,很不错哦!

deb http://ppa.launchpad.net/justzx2011/openyoudao-v0.4/ubuntu trusty main 
deb-src http://ppa.launchpad.net/justzx2011/openyoudao-v0.4/ubuntu trusty main

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys  14C9B91C3F9493B9
sudo apt-get update 
sudo apt-get install openyoudao

ref: http://openyoudao.org/

Java 线程安全的单例

public class Singleton {

    private static class SingletonHolder {
        private static Singleton sSingleton = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.sSingleton;
    }

    private Singleton() {

    }
}

基于以下事实:

  • JVM加载class是线程安全的。
  • class的static成员在类首次加载时初始化。

Java DOM 设置 XML 缩进

            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer();
            DOMSource source = new DOMSource(mDocument);

            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");//缩进宽度
            transformer.setOutputProperty(OutputKeys.METHOD, "xml");
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");

Java Enum

Java的Enum搞的越来越强大,用着也越来越别扭。看看下面的代码:

public class TestJavaEnum {

    static enum WorkDay {
        Mon("Monday"),
        Tue("Tuesday"),
        Wed("Wednesday"),
        Thu("Thursday"),
        Fri("Friday");

        private String mDay;

        private WorkDay(String day) {
            mDay = day;
        }

        @Override
        public String toString() {
            return mDay;
        }
    }

    public static void main(String[] args) {
        WorkDay[] workDays = WorkDay.values();

        System.out.println("------WorkDay------");
        for (int i = 0; i < workDays.length; i++) {
            WorkDay workDay = workDays[i];
            System.out.println(workDay.toString());
        }

        System.out.println("------Ordinal------");

        for (int i = 0; i < workDays.length; i++) {
            WorkDay workDay = workDays[i];
            System.out.println(workDay.toString() + "'s ordinal is "
                    + workDay.ordinal());
        }

        System.out.println("------ValueOf------");

        System.out.println(WorkDay.valueOf("Mon"));

    }
}

Output:

------WorkDay------
Monday
Tuesday
Wednesday
Thursday
Friday
------Ordinal------
Monday's ordinal is 0
Tuesday's ordinal is 1
Wednesday's ordinal is 2
Thursday's ordinal is 3
Friday's ordinal is 4
------ValueOf------
Monday

下面我们反编译看一下,Java究竟对Enum做了啥?

javap -c TestJavaEnum\$WorkDay

从反编译的结果中我们发现了下面的代码:

final class net.lnmcc.TestJavaEnum$WorkDay extends java.lang.Enum{

这说明Java中的Enum实际上是继承了java.lang.Enum的类。 继续往下看反编译的结果有:

public static final net.lnmcc.TestJavaEnum$WorkDay Mon;
public static final net.lnmcc.TestJavaEnum$WorkDay Tue;
public static final net.lnmcc.TestJavaEnum$WorkDay Wed;
public static final net.lnmcc.TestJavaEnum$WorkDay Thu;
public static final net.lnmcc.TestJavaEnum$WorkDay Fri;

我们定义的的每一个Enum值都成了一个WorkDay Class的静态对象。 继续往下看:

   0:	new	#1; //class net/lnmcc/TestJavaEnum$WorkDay
   3:	dup
   4:	ldc	#18; //String Mon
   6:	iconst_0
   7:	ldc	#19; //String Monday
   9:	invokespecial	#21; //Method "<init>":(Ljava/lang/String;ILjava/lang/String;)V
   12:	putstatic	#25; //Field Mon:Lnet/lnmcc/TestJavaEnum$WorkDay;
   15:	new	#1; //class net/lnmcc/TestJavaEnum$WorkDay
   18:	dup

原来Java会调用构造方法来构造我们的Enum对象,参数即为定义Enum时我们在括号中给出的值。 到这里对Java Enum的实现算是清楚了,但是呢,用起来还是别扭,哈哈。

Git 修改历史提交

修改最后一次提交

git commit --amend	

修改非最后一次提交

git rebase -i HEAD~3

-i参数的含义: --interactive  let the user edit the list of commits to rebase
HEAD~3: 需要修改倒数第三个提交

之后出现如下界面:

Alt none

把你想要修改的提交记录前的pick改成edit

下图说明我想修改7013c8c这个提交(PS:可以同时修改多个):

Alt none

保存后,git会出现提示:

Alt none

输入

git commit --amend

Alt none

弹出的界面跟第一种情况一样,你可以开始修改你的提交说明了。

最后保存你的修改。

最后执行

git rebase --continue

完成操作。如果一次选择了多个提交需要修改,只需要多次执行git commit –amendgit rebase –continue即可。