2011年上半年小结

好久更新自己的博客了,主要是这半年来一直在准备找实习,但是一直被鄙视,搞得头都晕了。再后来跟胡总一起参加了下腾讯的比赛,搞到8月底才完。后面回了趟家,在家呆了十几天,心稍微静了点,回顾了下这半年。

开学没多久,阿里巴巴就来招实习生了,刚开始太大意,以为自己很牛逼,没有复习,结果笔试就挂了。后来恶补了下,开始看数据结构、面试宝典,好歹过了淘宝和腾讯的笔试,但面试的时候都被鄙视了,很郁闷。一直等到6月,就哥没offer了,那个蛋疼。幸好腾讯的比赛进复赛了,后面还进了决赛,虽然最终只拿了个三等奖,有点遗憾。不过收获还是很大。

宅的太久,整个人都没了精神,不愿与人交流,反应迟钝,这也是面试失败的原因之一吧。另外就是本科的时候没有学过算法,自己也一直没有怎么在意过这方面的东西,搞到每次面试都死在算法上面。这几个月一直在补算法,从编程之美,到算法导论,一边看一边反思。

待续……

安装win7后修复grub2

早两天重装了下win7,把grub搞没了,进不了ubuntu,于是刻了个liveCD到U盘。
按照网上的方法来修复grub,先也是挂上原来的根分区,再执行完下面一步,然后重启,
grub-install --root-directory=/mnt /dev/sda
但是,启动时直接黑屏了,根本修复不了。

后来想起自己以前安装gentoo时用过chroot,所以试了如下几步:

SHELL
1
2
3
4
5
6
sudo mount /dev/sda9 /mnt  # 我的系统的根分区是/dev/sda9
sudo mount --bind /proc /mnt/proc
sudo mount --bind /dev /mnt/dev
sudo mount --bind /sys /mnt/sys
sudo chroot /mnt
sudo apt-get install grub-pc # 安装grub2

安装完后重启,看到了熟悉的启动项选择界面。
进去Ubuntu,再 sudo update-grub2 一下,把grub指到正确的地方,大功告成。

邓亚萍代表的是哪个国家?

转自:http://www.bullogger.com/blogs/laoyao/archives/373275.aspx ,作者:赵昱鲲

据说爱斯基摩人有几十个词来描绘雪,比如“大雪”、“小雪”、“暴雪”之类,都是不同的词;而赤道附近某部落则用同一个词来指雪、霜、冰。这很好理解,因为爱斯基摩人整天生活在冰天雪地里,不同的雪对他们有不同的影响,自然需要区分,而热带的人则很少见到雪,因此也就没有必要专门发明词汇来区分它们,甚至霜、冰、雪都可以混为一谈。

有研究表明,这个说法不尽准确,但却符合我们的印象。爱斯基摩语和赤道部落语我不会说,但是只要在学过中学英语的人,大概就能体会到语言之间细微的不同。

比如,我当年学英语时,就大惑不解:为什么兄和弟都是brother,姐和妹都是sister?为什么爷爷、外公都是grandfather,奶奶、外婆都是grandmother?还有伯父、叔父、大舅、小舅、姑父、姨父,全是uncle,堂兄、堂弟、表姐、表妹,全是cousin,难怪当年教语文的孟夫子会鄙夷地说:“brother不分长幼,是无序也,cousin不辨男女,是无伦也。无序无伦,是禽兽也。”

所以,脑中有序有伦的我,在跟美国人说话时,常会不适应。有时,他们随口说一句“我的brother”,我都要条件反射地问:“你是说elder brother(兄)还是younger brother(弟)?”他们提到“我的grandfather”,我都要不由自主地问:“你是说paternal grandfather(爷爷)还是maternal grandfather(外公)?”最怕的还是别人说“cousin”,那我就忙坏了:

“你是说你爸爸的兄弟的儿子吗?”

“不是,是我妈妈的姐姐的女儿。”

“那她是比你大还是小?”

“比我小。”

“哦,”我这才心下释然,“是她的表妹。”

很快,大家就都知道了:“你知道那个中国人吗?他可是一位伦常专家哦!”

当然,古人说得好:“尺有所短,寸有所长”,中文在伦常上完胜英文,自然也就在其他方面稍微有点白璧微瑕。有一次我跟老美聊天,说起以前中国割资本主义尾巴时,不准农民养猪。我当时不假思索地说:“The country didn’t even allow peasants to keep their pigs(国家甚至不允许农民养猪)。” Continue Reading »

熊培云:问世间国为何物?

博客原文http://www.21pinglun.com/?p=2199是删减版的,在网上搜到了完整版的,暂时保存与此。

  在弗里德曼看来,从本质上说,政府仍不过是一个手段,一个工具。政府既不是一个给我们带来恩惠与礼物的人,也不是使我们盲目崇拜和为之服役的主人或神灵。所以,弗里德曼说:“除了公民们各自为之服务的意见一致的目标以外,他不承认国家的任何目标;除了公民们各自为之奋斗的意见一致的理想以外,他不承认国家的任何理想。”否则,这种个体与国家职能的本末倒置必然会腐蚀一个国家自由的根基。

  2004年底,我在巴黎的日子突然变得闲散起来,时而跑到香榭丽舍大街的影院里看电影。至今印象最深的一部是德国电影:《帝国的毁灭》。

  该片细节取材于历史学家约阿希姆·费斯特的《希特勒的末日》(2002)和希特勒最后的女秘书特劳德尔·琼格的回忆录《直到最后时刻》(2002)。令许多人不安的是,在这位女秘书的记忆里,希特勒同样是个有教养、受人尊敬的领袖。这位大独裁者有着诗人一样的多愁善感,他的办公室里不让放花,因为花会凋谢,他不喜欢看到死去的东西。或许,正是因为被希特勒的这些人性化特征的遮蔽,直到战后琼格才意识到自己一直生活在“盲点”之中。

  浪潮退尽,谁在裸泳

  这部电影给了我极大触动。一是人性化希特勒。这也是我一直在思考的问题,希特勒不是恶魔,只是普通人。他的恶是众人合力的结果。没有谁天生就是独裁者。或许,只有透过《帝国的毁灭》里由魔鬼还原为人的希特勒、《意志的胜利》里如癫如狂的人们以及《朗读者》里面对法官理直气壮的女看守,生活于今世的我们才能真正回望历史的深处,体味个体在群体迷狂、巨浪扑来之时的无力与渺小,体味什么是时势造英雄也造独裁者。正是基于这一认识,当历史翻过这血腥的一页,当活着的人们只是简单地在精神与肉体上将一个束手就擒的纳粹头子揪出来示众,从历史的废墟中引渡到现实的广场,让他为一个时代的错误负全责,在我看来,这亦不过是为这段共犯的罪恶历史找了一只“替罪狼”。 Continue Reading »

Protected: 马总统百年元旦祝词(密码是hsw)

This post is password protected. To view it please enter your password below:


hadoop自定义InputFormat

接触hadoop一年多了,但是自己一直没有用hadoop写过什么程序。最近,由于项目需要,将一些文件转换成hadoop的MapFile。网上的例子基本是直接处理文本输入,自定义输入格式的见到两个,但是都是用的旧的API,用新API写的还没有,可能高手不屑于写这些。但是处理自定义输入是每个用hadoop的人都要学会才行的,因为不是每个人的输入都是文本文件。

数据输入是hadoop的第一步,不能读自己的数据,后面的处理就无从谈起。文本格式处理起来容易些,对于二进制格式的文件,虽然hadoop有一个SequenceFileInputFormat,可以先把自己的数据转成SequenceFile,再处理,但是这样要多一倍的处理时间、存储空间。无奈之下,参考了hadoop的源代码,自己写了个ConverterInputFormat,在这里贴出来,供大家参考。

代码是基于hadoop 0.20的,其中的FetcherOutput是用Java的DataOutputStream写入到本地磁盘的,可以换成自己想要的格式。
ConvertertRecordReader好像必须有个默认的构造器。

Java
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package com.randyho.hadoop.converter;
 
import java.io.DataInputStream;
import java.io.IOException;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.JobContext;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;
 
import com.randyho.FetcherOutput;
 
public class ConverterInputFormat extends FileInputFormat<Text, FetcherOutput> {
 
  // Do not split files.
  protected boolean isSplitable(JobContext context, Path file) {
    return false;
  }
 
  public RecordReader<Text, FetcherOutput> createRecordReader(
      InputSplit split, TaskAttemptContext context) throws IOException,
      InterruptedException {
    return new ConvertertRecordReader();
  }
 
  class ConvertertRecordReader extends RecordReader<Text, FetcherOutput> {
 
    private DataInputStream dis;
    private Text key = null;
    private FetcherOutput value;
    private boolean more = true;
    private Configuration conf;
 
    public ConvertertRecordReader(){
      key = new Text();
      value = new FetcherOutput();
      more = true;
    }
 
    public void close() throws IOException {
      if (dis != null) {
        dis.close();
      }
    }
 
    public Text getCurrentKey() throws IOException, InterruptedException {
      return key;
    }
 
    public FetcherOutput getCurrentValue() throws IOException,
        InterruptedException {
      return value;
    }
 
    public float getProgress() throws IOException, InterruptedException {
      return more ? 0f : 100f;
    }
 
    public void initialize(InputSplit gensplit, TaskAttemptContext context)
        throws IOException, InterruptedException {
      FileSplit split = (FileSplit) gensplit;
      conf = context.getConfiguration();  
      Path file = split.getPath();
      FileSystem fs = file.getFileSystem(conf);
 
      System.out.println("reading: " + file);
 
      // open the file
      dis = fs.open(split.getPath());
    }
 
    public boolean nextKeyValue() throws IOException, InterruptedException {
      if (dis.available() != 0) {
        value.readFields(dis);
        key.set(value.getUrl());        
        return true;
      } else {
        more = false;
        return false;
      }
    }
  }
}

本人也是新学,对hadoop也不是很熟悉,如果有更好的方式,恳请赐教。

Protected: 公民课第二课: 公民素质(密码是hsw)

This post is password protected. To view it please enter your password below:


高级正则表达式背后的关键概念

高级正则表达式背后的关键概念

By Karthik Viswanathan 翻译:Wind

原文参考:http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/
2009-5-6

(Wind:和师兄探讨RegEx有一小段时间了,自己去翻资料看到这篇文章,觉得很好,就自己去翻译了一下,虽然自己英文水平有限,还是努力地去尝试,呵呵~有需要的可以慢慢看。^_^)

正则表达式(RegEx)是处理字符串获取信息的强大手段。它们通过一种字符串构造成一些匹配模式,然后展现它神奇的魅力。但不幸的是,简单的正则表达式并不满足于处理复杂的模式和符号。为了解决这个困境,你可以使用一些高级的正则。

接下来,我们将给您带来高级正则的简单介绍,一共有八个常用的概念和例子。每一个举例都描绘了匹配复杂字符串模式的简单方式。如果你之前没有什么使用正则表达式的经验,请查阅相关的资料^_^

1.贪婪模式/懒人模式(Greediness/Laziness)
所有的正则操作符都是贪婪的。它们尽可能多地匹配字符串。但这样你经常会得不到期望的结果。因此,我们有懒人模式操作符来解决这个问题。区分贪婪模式与懒人模式是完全理解高级正则表达式的关键。

贪婪模式操作符
*(星号)操作符匹配它之前的表达式0次或多次。这是一个贪婪模式的操作符。考虑下面的表达式:

PHP
preg_match( '/
<h1>.*&lt; \/h1&gt;/', '</h1>
<h1>这是一个标题。</h1>
<h1>这是另一个。</h1>
', $matches );

请记住那个.(点)是代表除新行外的任何符号。上面的正则表达式就是查找一个h1标签以有它的所有内容。它使用.和*运算符来匹配标签内的所有内容。这个模式将匹配到:

HTML
<h1>这是一个标题。</h1>
<h1>这是另一个。</h1>

它会返回整个字符串,*操作符会持续地匹配所有内容——即使中间有h1的关闭标签——因为它是贪婪的。它会匹配它所能匹配的。 Continue Reading »

干掉wordpress3.0正式版的自动保存

本人有点完美主义,ID虽然用不完,但希望它能连续。

此方法为本人于网上收集并整理,理论上适用所有WP版本(本人WordPress3.0亲测成功):

方法一:

1、打开 wp-config.php 文件,找到以下代码:
define('DB_COLLATE','');
我此行后面插入下面内容:

define('WP_POST_REVISIONS', false);
define('AUTOSAVE_INTERVAL', false);

2、打开 wp-settings.php 文件,找到以下代码:
$default_constants = array(‘WP_POST_REVISIONS’ => true );
将以上代码,更改为下面的代码。
$default_constants = array(‘WP_POST_REVISIONS’ => false );

3、打开 wp-includes\default-filters.php 文件,找到以下代码:
add_action(‘pre_post_update’, ‘wp_save_post_revision’);
在最前面加上两个//,效果如下:
//add_action(‘pre_post_update’, ‘wp_save_post_revision’);

4、打开 wp-admin\includes\post.php 文件,找到以下代码:
return _wp_put_post_revision( $_POST, true );
将以上代码更改为:
return edit_post();
经过以上四个步骤之后,Wrodpress的版本修订功能,也就是Revision将被彻底禁止。

5、禁止auto draft
打开 wp-admin\includes\post.php 文件,找到以下代码:
if ( $create_in_db ) {
上面添加  $create_in_db = false; 这一步很重要

6、去除日志自动保存:
打开wordpress\wp-admin\post-new.php及post.php文件,注释掉
//  wp_enqueue_script('autosave');

7、最后再进phpMyAdmin里执行以下语句:
ALTER TABLE wp_posts AUTO_INCREMENT=1;
让ID自己编号从1开始(适用于新Blog),执行前请勿必做好数据备份!

方法二:

1、直接安装super-switch插件,然后在setting里面会看到super-switch选项,可以在里面设置disable revisions和disable autosave;但是在3.0.1却不能disable auto draft,每次新写篇就会有auto draft。

2、禁用WordPress 3.0自动草稿存档:编辑wp-admin/includes/post.php文件,在if ( $create_in_db ) {语句之前加入一行$create_in_db = false; 语句,经过实际测试,增加了这一行之后,新建日志,数据库就不会出现一篇自动存档的草稿了。

第一种方法要修改多处代码,很麻烦,以后每次WordPress升级,都需要维护修改一次,工作量太大,不如用插件的方式解决。

WordPress 3.1 禁止自动草稿(auto-draft)的方法

禁止自动生成 auto-draft 的不可见草稿:
在wp-admin/includes/post.php中,搜索create_in_db,找到如下的判断语句:

PHP
1
2
3
4
5
6
7
8
if ( $create_in_db ) {
                // Cleanup old auto-drafts more than 7 days old
                $old_posts = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_status = 'auto-draft' AND DATE_SUB( NOW(), INTERVAL 7 DAY ) > post_date" );
                foreach ( (array) $old_posts as $delete )
                        wp_delete_post( $delete, true ); // Force delete
                $post_id = wp_insert_post( array( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type, 'post_status' => 'auto-draft' ) );
                $post = get_post( $post_id );
} else {

这段代码的功能是,清除七天以前的自动草稿,然后插入一条新草稿,如果你继续写文章并发布,那么这条草稿就被使用了,包括在后台首页有一个快速发布,也用到了这个。但如果你仅仅是点击了new post(添加文章),接下来没有输入任何内容就跳到别的页面去了或关闭了,此时仍然会生成一个自动草稿,而这个草稿,是后台不可见的,是垃圾数据。

所以修改了一下代码,将这个if判断中的内容替换成以下内容:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
if ( $create_in_db ) {
        // modify by akii start
        global $current_user;
        $post_auto_draft = $wpdb->get_row( "SELECT * FROM $wpdb->posts WHERE post_status = 'auto-draft' AND post_author = $current_user->ID ORDER BY ID ASC LIMIT 1" );
        if ($post_auto_draft){
            $post = $post_auto_draft;
        } else {
            $post_id = wp_insert_post( array( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type, 'post_status' => 'auto-draft' ) );
            $post = get_post( $post_id );
        }
        // modify by akii end
} else {

原理及说明:当数据库中有一条或多条状态为”auto-draft”的自动草稿时,取ID最小的,新文章即使用此条记录。如果没有此种类型的数据,才会新插入一条数据。并且查询数据时是根据当前的用户来判断,不会出现多用户时出错。这样就可以避免了自动草稿(auto-draft)的冗余垃圾数据。保证了日志ID的连续性。

张天潘:中国电影的文化想象力之死

一、进口大片“入侵”的政治学焦虑

在今年九月的中国电影市场上,又上演了一出进口大片与国产“大片”的直接过手的好戏,诺兰的《盗梦空间》(直译《奠基》)与张艺谋《山楂树之恋》的直接PK,当然结果是不出意外的,又是呈现出绝对一边倒的评价态势。于是,自然又会很多人展开了联想之旅,在感叹为什么我们中国人拍不出自己的《盗梦空间》?而这种感叹,其实已经变成了通用式了,因为这样的句式我们之前见过太多了,只要把电影换成《阿凡达》、《骇客帝国》、《指环王》等都适用。更有甚者视之为洪水猛兽,上升政治学层面,认为这是一种文化“入侵”,有时居然还发生抵制的荒唐行为(如2007年动画片《功夫熊猫》引发的抵制风波)。其实,这样的感叹与批判,其实是没有太多的作用,否则的话,就不用每年都这么像祥林嫂般地重复了。在大片所向披靡之时,如果真的要走出这种进口大片的集体焦虑症,就必须进行深刻的反思与探讨,而不要如以上那种止于肤浅的感叹与焦虑,更不能用狭隘民族主义的色彩的抵制,因为这不是“入侵”与渗透,而是文化的人心所向。所以相反,我们却需要深彻的自省与自知之明。

在这两年里,有三部电影的进口,在我国的电影市场,引发海啸般的狂潮与震撼,《2012》、《阿凡达》与《盗梦空间》。这三部电影,其实就很好地代表了国外电影的三大主流模式:《2012》背后的人类对自身未来的焦虑症,也反映出宗教色彩上的难以遏制的人类悲剧意识;3D《阿凡达》背后的科幻想象力与强大的电影技术,还有考古学与人类学上的一些成就展示(比如纳美人的语言与潘多拉星球上的物种);《盗梦空间》背后的发达文化想象力,以及在后现代语境下人类对于本我、自我、超我的迷津。而这都无一不是说明了,电影远非剧情与画面,它们背后都有深厚的文化内涵与庞大的社会文化工程,因此相比之下,透过我们的电影文本分析,我们毫无疑惑地看出我们的文化就显得十分根浅,缺乏文化与技术乃至想象力等各方面的支持了。 Continue Reading »