[Tips]2011-10-30

vim的paste mode 我们会遇到这样的情况: 需要从Vim之外的其它程序里拷贝一大段文字,然后在Vim里粘贴。 一般的,启动vim之后,按i进入插入模式 (Insert Mode),然后粘贴就行了。 但是当Vim的配置越来越多,插入模式下粘贴大段文字时可能会遇到各种诡异的情况。 因为这个时候的粘贴就相当于手动输入这些内容,于是各种映射 (Mapping) 就被触发了…. :set paste 可以启动一种paste模式,这个时候各种Mapping会被无视,各种自动缩进也无效。和在记事本里粘贴效果一致。 paste命令也符合Vim的通常规范 :set nopaste 可以关掉它。

siri和语音对话系统

Siri最近是相当的火,朋友Sigma最近的一片文章也有讨论她用到的技术。 Siri本身是一个语音对话系统。从输入到输出,经过语音识别,对话系统到语音合成。 想起自己当年的毕业设计就是一个对话系统,再看看Siri,觉得自己的东西太naive了 :] 系统前后两端的技术已经比较成熟了。 嘈杂环境下的实时语音识别可能仍然是一个问题, 但是Siri的使用环境使得她不需要去考虑这两点。 第一,用户不太可能在很吵闹的地方对着手机喊叫,这看起来太傻了。 第二,用户不需要Siri随时都监听输入。 这样一来,输入方面,误识别率大大下降了。 我很好奇的是Siri怎样做到和说话人无关的识别。 一般来说,如果期望识别系统有一个比较好的识别率, 都需要事先针对说话人对系统做一些训练。 对于不同的个人得到相应的特征偏移。 小词汇量的连续语音识别和命令式的语音识别对这方面要求不高, 但是大词汇量下的连续语音识别却是比较依赖事先训练。 难道是米国人的发音都很标准? 对话系统的核心是从文本到文本的这一段。 也就是从已经识别出来的,用户说的话,到Siri给出对应的反馈,这个过程。 这方面的研究也有很长的历史了。比如,很著名的图灵测试。 图灵测试里,机器的目的就是通过对话骗过裁判来相信它们是人类。 铜奖的标准是在文本对话上完成这个任务,银奖则需要语音上的完美模拟, 金奖就得面对面的自然交谈了。 目前还没有机器能达到银奖水平。 Siri,和图灵测试里的程序的不同之处在于她需要提供有用的服务。 如果Siri只是在跟你打哈哈,即使内容有趣,也不会有多大的用处。 所以Siri需要真正得理解对话的内容。 这就把人工智能多年以来的很多工作整合起来了,比如自然语言理解、专家系统、 甚至到逻辑推理。 这些才是人工智能的核心内容。 Siri和生活服务的整合方面则是语义网成功的应用。这方面我不太了解。 只是早先听说语义网在小的、定制的范围内有很成功的应用, 因为这一块需要比较大量的工程上的工作。 其实想法很好理解,而且大家都想过。 大家都曾经希望对话系统能够自发地去网上找缺失的信息。 但是机器没有办法直接消化处理搜索引擎的输出。机器需要信息按照机器能理解的方式去组织。 所以就有了语义网这个概念。网络上所有的信息都需要它的标签,机器可以理解的标签。 对于任何一个词,机器可以方便地找到相关的知识。 所以机器能知道”当我谈跑步时,我谈些什么” :] 我们可以隐隐感觉到语言理解是各个问题的核心,也是人工智能的初衷之一。 我们期望能和机器交谈。 当她们的外表越来越接近我们,她们似乎也应该有同样丰富的内心。 当我们向机器提出一个问题的时候,我们希望她能够给出满意的回答。 无论她通过什么手段。无论她叫什么名字。

[Tips]2011-10-19

两个Vim的小技巧 :] 其实就是两个正则表达式,刚好今天用到了,就记下来。 1. 有多行文本,其中有几行是URL,要保留这几行URL,其它的行删掉。 :g!/:\/\//d g本来是用来做grep类似的事情的,:g/pattern 会显示出符合pattern的所有行 惊叹号!表示相反,就是指选中的行是不符合pattern的。后面的/d是表示删掉选中的行。 2. 有多行文本,每行都是类似这样的 keyA=valA&keyB=valB&keyC=valC 现在要交换key和val的位置,变成 valA=keyA&valB=keyB&valC=keyC :%s/\=\/\2=\1/gi %s是全局替换,这个比较常用了。\是不太常用的anchor字符(锚字符),分别表示word的开始和结束。 \(..\)也比较常用了,可以保存匹配结果。\w*表示一个或多个word字符。 word字符包括a-zA-Z _ 和 0-9 :]

NSURL

码农Coding的时候有各种不好的习惯。 比如,不喜欢好好地看框架的文档,一旦找到某一个看起来简单易懂的接口,就一直用它。 如果需要之后的处理,往往简单粗暴。 我们以前管这种情况叫做“裸”。最近又不知不觉地写了比较“裸”的代码。 说实话,这个习惯得改,“裸”写的东西往往不健壮,不可读,效率还不高。成熟框架提供的直接可用的接口必须是第一选择。 NSURL是常用的类,用来描述一段URL的。 需要取得URL中不同部分的时候,我们应该用URL提供的接口, 而不是把它当做一个普通的字符串去手工分析。 比如: http://www.testurl.com:8080/subpath/subsubpath?uid=123&gid=456 NSURL *url = [NSURL URLWithString:@”http://www.testurl.com:8080/subpath/subsubpath?uid=123&gid=456″]; 下面是常用的几个接口,和它们的输出。接口意思都符合相关RFC里的定义。 [url scheme] http [url host] www.testurl.com [url port] 8080 [url path] /subpath/subsubpath [url lastPathComponent] subsubpath [url query] uid=123&gid=456 NSURL 英文版 :] NSURL is widely used, but sometimes we are not following the idiomatic usage. When it comes to access […]

静态链接库

静态链接库 几个例子,使用和建立静态库的时候的几种常见情景。 首先建几个文件 a.h void testA(); a.c #include “a.h” void testA() { printf(“A”); } b.h void testB(); b.c #include “b.h” #include “a.h” void testB(){ testA(); printf(“B”); } 得到目标文件 $gcc -c a.c $gcc -c b.c 得到静态库文件 $ ar -r libba.a a.o b.o $ ar -r liba.a a.o $ ar -r libb.a b.o 得到了库libba.a libb.a liba.a 这是最终需要完成的程序。 […]

[Vim]vim的几种模式和按键映射

Map是Vim强大的一个重要原因,可以自定义各种快捷键,用起来自然得心应手。 vim里最基本的map用法也就是 :map c a 这里把c映射成了a,在map生效的情况下,按下c就等同于按下了a 当然,常用的Ctrl,Shift,Alt自然也是支持的。 令Ctrl+a对应到a :map a 令Alt+a对应到a :map a 令Ctrl+Alt+a对应到a :map a 到此,我们已经可以做很多事情了。 但是map命令远不只这一种,在不同的模式下,同一组按键可以被映射到不同的组合上。 Vim的模式众多,但是一般被提及的也就是这么几种: Normal Mode 也就是最一般的普通模式,默认进入vim之后,处于这种模式。 Visual Mode 一般译作可视模式,在这种模式下选定一些字符、行、多列。 在普通模式下,可以按v进入。 Insert Mode 插入模式,其实就是指处在编辑输入的状态。普通模式下,可以按i进入。 Select Mode 在gvim下常用的模式,可以叫作选择模式吧。用鼠标拖选区域的时候,就进入了选择模式。 和可视模式不同的是,在这个模式下,选择完了高亮区域后,敲任何按键就直接输入并替换选择的文本了。 和windows下的编辑器选定编辑的效果一致。普通模式下,可以按gh进入。 Command-Line/Ex Mode 就叫命令行模式和Ex模式吧。两者略有不同,普通模式下按冒号(:)进入Command-Line模式,可以输入各种命令, 使用vim的各种强大功能。普通模式下按Q进入Ex模式,其实就是多行的Command-Line模式。 对于Map,有几个基本的概念 命令的组合 同Vim下的其他命令一样,命令的名字往往由好几段组成。前缀作为命令本身的修饰符,微调命令的效果。 对于map而言,可能有这么几种前缀 nore 表示非递归,见下面的介绍 n 表示在普通模式下生效 v 表示在可视模式下生效 i 表示在插入模式下生效 c 表示在命令行模式下生效 Recursive Mapping 递归的映射。其实很好理解,也就是如果键a被映射成了b,c又被映射成了a,如果映射是递归的,那么c就被映射成了b。 […]

[iOS]关于IBOutlet

为了使用Interface Builder,我们需要在如XXViewController.h中增加IBOutlet标记。 IBOutlet对于编译器而言只是一个标记,也就是说,编译器会忽略这个关键字。 Interface Builder则是根据IBOutlet来寻找可以在Builder里操作的成员变量。 需要注意的是,任何一个被声明为IBOutlet并且在Interface Builder里被连接到一个UI组件的成员变量,会被额外retain一次。 常见的情形如 IBOutlet UILabel *label; 这个label在Interface Builder里被连接到一个UILabel。此时,这个label的retainCount为2。 所以,只要使用了IBOutlet变量,一定需要在dealloc或者viewDidUnload里release这个变量。