作者存档: jot - 第2页

GoDaddy自动扣费召回记

今天看了下邮箱,发现被GoDaddy偷偷扣掉 $4.99,仔细一看,原来是帮曾哥买域名时的一个赠送服务WebSite Tonight Economy – 5 Page Web Site – Monthly (recurring)。当初没仔细看后面的括号,现在到期自动续费了。

杯具嘛。。。赶紧把产品干掉、所有autorenew关掉、信用卡关联信息去掉。
老外的东西,果然还真不能省心。不过还好,这个是能退的。

参考了老汉的两篇博文,提交了退款申请,正在等退款处理结果:
杯具!被GoDaddy扣去4.99美元
GoDaddy申请退款信示例

Update @ Wednesday, March 02, 2011 1:55:42 PM
GoDaddy.com has received a refund request for the following items:

QTY ITEM PRICE
-1 WebSite Tonight Economy – 5 Page Web Site – Renewal – Monthly (recurring) Length: 1.000 Month(s) ($4.99)
Subtotal: ($4.99) Shipping & Handling: $0.00 Tax: $0.00 Total: ($4.99)

退款成功,貌似钱已经退给我了。晚上查查证实已退

java中的synchronized实践

第一种写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class SyncTest {
    public synchronized void synMethod1(String key) {  //  (*)
        System.out.println(key + " ==> " + Thread.currentThread().toString());
        try {
            Thread.sleep(Long.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        final SyncTest st1 = new SyncTest();
        Thread a1 = new Thread(new Runnable() {
            @Override
            public void run() {
                st1.synMethod1("No.1");
            }
        });
        a1.start();
        Thread a2 = new Thread(new Runnable() {
            @Override
            public void run() {
                st1.synMethod1("No.2");
            }
        });
        a2.start();
    }
}

输出为:

No.1 ==> Thread[Thread-0,5,main]

去除synchronized关键字,输出变为:

No.1 ==> Thread[Thread-0,5,main]
No.2 ==> Thread[Thread-1,5,main]

说明:标为synchronized的方法,进入后会把本对象锁住,其他线程无法进入任何非静态synchronized区域。

第二种写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class SyncTest {
    public void synMethod2(String key, Object lock) {
        System.out.println(key + " ==> I'm In. ");
        synchronized (lock) {  // (*)
            try {
                System.out.println(key + " ==> " + Thread.currentThread().toString());
                Thread.sleep(Long.MAX_VALUE);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        final SyncTest st1 = new SyncTest();
        final Object lock = new Object();   // (*)
        Thread a1 = new Thread(new Runnable() {
            @Override
            public void run() {
                st1.synMethod2("No.1", lock);
            }
        });
        a1.start();
        Thread a2 = new Thread(new Runnable() {
            @Override
            public void run() {
                st1.synMethod2("No.2", lock);
            }
        });
        a2.start();
    }
}

输出为:

No.1 ==> I'm In.
No.1 ==> Thread[Thread-0,5,main]
No.2 ==> I'm In.

修改synchronized(lock)为synchronized(key),输出变为:

No.1 ==> I'm In.
No.1 ==> Thread[Thread-0,5,main]
No.2 ==> I'm In.
No.2 ==> Thread[Thread-1,5,main]

说明:标为synchronized(object)的块,当object一样时,只有一个线程能够进入。

第三种写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class SyncTest {
    public void synMethod3(String key) {
        System.out.println(key + " ==> I'm In. ");
        synchronized (this) {  // (*)
            try {
                System.out.println(key + " ==> " + Thread.currentThread().toString());
                Thread.sleep(Long.MAX_VALUE);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        final SyncTest st1 = new SyncTest();
        Thread a1 = new Thread(new Runnable() {
            @Override
            public void run() {
                st1.synMethod3("No.1");
            }
        });
        final SyncTest st2 = new SyncTest();
        a1.start();
        Thread a2 = new Thread(new Runnable() {
            @Override
            public void run() {
                st1.synMethod3("No.2");   // (*)
            }
        });
        a2.start();
    }
}

输出为:

No.1 ==> I'm In.
No.1 ==> Thread[Thread-0,5,main]
No.2 ==> I'm In.

修改第26行的st1为st2,输出变为:

No.1 ==> I'm In.
No.1 ==> Thread[Thread-0,5,main]
No.2 ==> I'm In.
No.2 ==> Thread[Thread-1,5,main]

说明:
1、synchronized(this)其实就是synchronized(Object),只不过object传入了自己。
2、第一种写法中,对方法的synchronized声明,实际上等于对方法中所有代码的synchronized(this){}包裹。

第四种写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class SyncTest {
    public static String SSS = "static access";  // (*)
    public static void synMethod4(String key) {
        System.out.println(key + " ==> I'm In. ");
        synchronized (SyncTest.class) {  // (*)
            try {
                System.out.println(key + " ==> " + Thread.currentThread().toString());
                Thread.sleep(Long.MAX_VALUE);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public synchronized static void synMethod5(String key) {    // (*)
        System.out.println(key + " ==> I'm In synMethod5. ");
        try {
            Thread.sleep(Long.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws Exception {
        Thread a1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("No.1 ==> " + SyncTest.SSS);
                SyncTest.synMethod4("No.1");    // (*)
            }
        });
        a1.start();
        Thread a2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("No.2 ==> " + SyncTest.SSS);
                SyncTest.synMethod5("No.2");    // (*)
            }
        });
        Thread.sleep(1000);
        a2.start();
    }
}
 
<strong>输出为:</strong>
No.1 ==> static access
No.1 ==> I'm In.
No.1 ==> Thread[Thread-0,5,main]
No.2 ==> static access

将22行和30行的4和5对换,输出变为:

No.1 ==> static access
No.1 ==> I'm In synMethod5.
No.2 ==> static access
No.2 ==> I'm In.

说明:
1、类中synchronized(clasz)块的锁,可以阻止static方法的访问,但不影响static feild变量的访问。
2、类中static synchronized方法的锁,也会影响synchronized(clasz)块

纯属实验,若有错误,欢迎指正。

比较总结escape/encodeURI/encodeURIComponent

escape(), encodeURI(), and encodeURIComponent()
首先都是JS里才有的encode函数,对应的decode函数是:
unescape(), decodeURI(), and decodeURIComponent()

我简单总结下区别:

  1. 可编码字符集不一样[参见]。decodeURI和decodeURIComponent就这点区别,导致使用场景不一样,一般直接用后者。
  2. 编码方式不一样。escape是按ISO Latin字符集编码;decodeURI/decodeURIComponent是采用UTF-8编码。
  3. 引入版本不一样。encodeURI/decodeURIComponent是在javascript1.5之后引进的,escape则在javascript1.0版本就有。

另外,三者不能解码时都会抛异常,注意try/catch。

参考(第一篇英文,非常推荐):

  • http://xkr.us/articles/javascript/encode-compare/
  • http://www.cnblogs.com/lovablebox/archive/2007/12/03/981307.html
  • http://www.javascripter.net/faq/escape.htm

Lubuntu下gedit自动编码识别的设置(不用gconf-editor)

Lubuntu下自带的leafpad不够用了,想用ubuntu下的gedit,就必须先解决识别gbk的问题。

网上通用的方法是:

Ubuntu下用gedit打开gbk这样的中文编码总是乱码,现在找到一个解决方法可以让Gedit自动识别编码:
运行gconf-editor,在弹出的对话框中选择:/apps/gedit-2/preferences/encodings/auto_detected ,双击auto_detected后添加一个编码:GB18030,保存即可。

但是,gconf-editor是gnome系的,Lubuntu用的是openbox,不想装gconf-editor怎么办?

“linux下,一切都是文件”,gconf肯定也是,直接改文件吧,终于被我找到了!

系统级的在 /usr/share/gconf/schemas/ 目录下,用户级的在 ~/.gconf/apps/ 下,
用户目录下有了,就会用用户级的,覆盖全局的设置。

用户级的:

1
vi .gconf/apps/gedit-2/preferences/encodings/%gconf.xml

修改方法:

1
2
3
4
5
6
7
8
<!-- 添加或修改,记得包含GBK -->
 <entry name="auto_detected" mtime="1297330539" type="list" ltype="string">
     <li type="string"><stringvalue>UTF-8</stringvalue></li>
     <li type="string"><stringvalue>GBK</stringvalue></li>
     <li type="string"><stringvalue>CURRENT</stringvalue></li>
     <li type="string"><stringvalue>ISO-8859-15</stringvalue></li>
     <li type="string"><stringvalue>UTF-16</stringvalue></li>
 </entry>

# 改全局的:

1
 sudo vi /usr/share/gconf/schemas/gedit.schemas

修改方法:

1
2
3
4
5
<!-- 找到 /schemas/apps/gedit-2/preferences/encodings/auto_detected
 修改下面的 locale en_US,加上GBK  -->
<locale name="en_GB">
    <default>[UTF-8,GBK,CURRENT,ISO-8859-15,UTF-16]</default>
</locale>

因为我的用户已经存在,用户级配置已经生成,所以需要改用户级的,(若未生成,那就改全局的吧)

所有支持的编码:http://svn.gnome.org/viewvc/gedit/trunk/gedit/gedit-encodings.c?view=markup

WP高亮插件选择:Syntax Highlighter还是WP-Syntax

程序猿要经常贴代码,所以语法高亮插件是不可缺少的。
目前入选的插件有2个,Syntax Highlighter for WordPress 和 WP-Syntax。

WP-Syntax,使用<pre>标签,高亮处理是在后台作的,前端只有一个js,简单;
Syntax Highlighter,使用[lang-name]标签却把高亮处理放在了前端。

因为我用的主题css中设定了<pre>标签,用WP-Syntax会非常丑陋了,
并且Syntax Highlighter相当的强大,于是,我果断选用Syntax Highlighter

Update@2011-08-20: 目前选用WP-Syntax了,因为Syntax Highlighter处理源码模式可以,富文本模式会丢失缩进。且WP-Syntax能和WP-Syntax Editor Integration Plugin结合,在原始编辑器增加按钮。主题css的冲突可以和谐嘛!目前已经解决目前唯一的缺点WP-Syntax的功能上还不支持 某行高亮highlight_lines,当然,php源码里可以简单加下嘛~ 后续再折腾。插件主页

Syntax Highlighter的官方主页:http://alexgorbatchev.com/SyntaxHighlighter/
wp插件的主页:http://wordpress.org/extend/plugins/syntax-highlighter/
wp插件的使用说明:http://wppluginsj.sourceforge.jp/syntax-highlighter/

这个使用说明是日语的,为了以后用的方便,我稍稍总结个使用说明。

  • num:指定开始行号
    例:[php num=10]~[/php]
  • highlight_lines:指定高亮行号
    例:[php highlight_lines="1,2,3"]~[/php]
  • gutter:false时不显示行号,默认true
    例:[php gutter="false"]~[/php]
  • ruler:true启用标尺(暂时没测试出区别)
    例:[php ruler="true"]~[/php]
  • toolbar:false不显示工具栏,默认是true
    例:[php toolbar="false"]~[/php]
  • light:true则简单的显示,貌似等于toolbar=false & gutter=false,默认false
    例:[php light="true"]~[/php]
  • font_size:字体大小,貌似没效果
    例:[php font_size="90%"]~[/php]
  • lang_name:true显示语言明显,默认false
    例:[php lang_name="true"]~[/php]

可支持语言:
as3,bash,c,cpp,csharp,coldfusion,diff,erlang,groovy,java,javafx,javascript,delphi,pascal,perl,
php,powershell,python,ruby,shell,text,vb,vbnet,scala,sql,css,xml,html,xhtml,xslt

无觅相关文章插件,快速提升流量