Browsing all articles in 善其事
May
26

[Android]用shell卸载安装在模拟器上的应用

Author laihj    Category 善其事     Tags , ,

在使用android模拟器的时候,将编好的apk安装到模拟器上使用的是如下的命令:

  adb install path/to/fuckGFW-debug.apk

那么很自然的,我们觉得,卸掉一个已安装的程序应该用的是

  adb uninstall path/to/fuckGFW-debug.apk

然而到现在为止,这行命令在我的机器上还没有成功地达到它的目的过,于是当我需要重新安装一个应用时,使用的是傻不拉叽的方法——在模拟器中使用setting-application来卸载,必须承认,这实在是太傻了,卸载的次数越多,就觉得越傻。

所幸Android除了uninstall之后,还提供一种方法来卸载应用,那就是在模拟器中直接删除应用对应的apk,你需要做的是找出应用apk在模拟器中的位置,一般是data/app/yourapp.apk。然后直接使用shell来删除它。命令如下:

  adb shell rm data/app/net.laihj.fuckGFW.apk

这样会比手工操作快42倍以上,手工麻烦不说,android的模拟器远不是勤勉的典范,至少在我的机器上它慢得可以。然而这不是最美妙的,最美妙的是你可以把三个工作合成一行命令。它们是:卸载,编译,安装。只需要在bash中用分号将三个命令分开即可。代码如下:

  adb shell rm data/app/net.laihj.fuckGFW.apk;ant debug;adb install path/to/fuckGFW-debug.apk

当你修改过代码之后,别再到模拟器中手工卸载应用了,直接运行这一行,然后看修改有否生效吧。

当然,高智商的程序员认为这三部都可以写到build.xml中,然后用ant来控制。没错,可是直接用bash来处理,学习成本更低不是?

Feb
12

[elisp]用elisp编译解释当前的buffer

Author laihj    Category 善其事     Tags ,

运行当前的buffer,就是说编译或解释当前的buferr。比如在编辑的是python文件”hello.py”,那么运行它的命令就是”python hello.py”,一般的python-mode用”C-c C-c”来处理这个问题,在编辑过程中可以调用这个快捷键来运行。当然你也可以使用”M-!”来打开shell command的mini buffer来输入命令。

诚然,很多语言的mode里面实际上都内置了这一功能,但我觉得,一方面不同的mode可能定义不同快捷键,造成了额外的记忆负担,另一方面并不能要求所有的mode都提供这一功能,在mode不完整的情况下你大概也需要自己定义的能力。

要做这事儿,当然是自定义一个函数。那么最直观的想法,就是在elisp里面写一行调用shell来执行命令的代码。是的,有这种东西,示例如下:

  (shell-command "python hello.py")

这一行代码的相当于在终端中执行”python hello.py”。

我们的目的是执行当前buffer,所以下一步要做的是得到当前buffer所对应的文件名。在上一篇blog中介绍过相关方法,就是”buffer-file-name”。

于是代码就变成了这样。

  (shell-command (concat "python " (buffer-file-name)))

用concat把”python “和当前buffer的文件名连起来作为要执行的命令。

至此,就完成了.py文件的执行函数,那推广之,需要对不同的文件进行编译/解释时,就需要扩展这个命令。

我们知道对.sh文件要用bash命令执行,对.py要用python,对.htm要调用firefox。现在要做的就是让机器知道这件事。很明显的,我们需要一个map,把它们对应地存下来。

完整的代码和注释如下:

(defun run-current-file ()
(interactive)
(let (ext-map file-name file-ext prog-name cmd-str
(setq ext-map
         '(
            ("py" . "python")
            ("sh" . "bash")
            ("htm" . "firefox")
            )
          );定义命令-文件类型映身表.
    (setq file-name (buffer-file-name));得到当前的buffer名
    (setq file-ext (file-name-extension file-name));得到后缀
    (setq prog-name (cdr (assoc file-ext ext-map)));根据后缀得到执行的命令,通过对ext-map的查找
    (setq cmd-str (concat prog-name " " file-name));拼出一个命令
    (shell-command cmd-str)));执行
  

完毕,为这个函数绑定一个键,在编辑相应文件的时候调用,就可以对其进行需要的操作了,不仅限于编译和解释,实际上很容易看出来,只要shell能支持的,你可以玩。当然,要有权限。

Have Fun!

Jan
31

[elisp]EmacsLisp 基础

Author laihj    Category 善其事     Tags ,

来源:李杀网

李杀网有一枚elisp教程我很喜欢,原因是它不解释太多的名词,而从实际动作方面入手,对我的胃口。

以下是相关的笔记。

运行方式:

作为一个实践的手册,第一件事当然是告诉如果运行一行代码,让你在看指南的过程中可以方便地动手尝试。

  • eval-last-sexp
  • 输入后把光标移到表达式后面,如“(+ 3 4)”后面,然后输入”Alt+x eval-last-sexp”或者使用快捷键”C-x C-e”,就可以在mini buffer看到这一句的运行结果”7″。

  • eval-region
  • 解释选中的区域。

  • ielm
  • 打开一个交互式的elips命令行解释器。

寻找帮助:

可以使用”Alt + x describe-function”(快捷键”C-h f”)来查找一个函数的用法。也可以使用”Alt+x elisp-index-search”在手参考手册中查询。

常用函数

打印

  (message "hi")
  (message "her age is:%d" 16) ;%d 数字
  (message "her name is: %s" "Vicky") ;%s 字符串
  (message "her min init is: %c" 86) ;%c 字符

注意:你可以在*message* buffer中看到打印出来的结果。

运算函数

(+ 4 5 1 )  ;=10
(- 9 2)     ;=7
(* 2 3)     ;=6
(* 2 3 4)   ;=24
(/ 7 2)     ;=3  结果的整数部分
(/ 7 2.0)   ;=3.5
(% 7 4)     ;=3 余数

注意,如果你的操作数是小数,必须把后面的0带上。就是说你应该写2.0,而不是2.。

  (integerp 3.)  ;T
  (floatp 3.)    ;nil
  (floatp 3.0)   ;T

以字符p结尾的函数通常意味着它的返回值是True或者False。p意味着”predicate”(判定)。

True和False

在elisp中,标识”nil”代表false,其它的一切都是true,包括0。”nil”是空链表”()”的同义词。所以”()”也是false。

按惯例,标识”t”用来表示true。

  (and t nil) ; nil
  (or t nil)  ; t

在elisp中没有布尔型,只需记住”nil”和”()”是false,其它一切都是true。

比较函数

比较数字

  (< 3 4) ;小于
  (<= 3 4)  ;小于等于
  (> 3 4)  ;大于
  (>= 3 4) ;大于等于
  (= 3 3)  ;等于

比较字符串

  (string= "this" "thiS")
  (string< "a" "b")
  (string< "B" "b")

在字符串比较中大小写是敏感的。比较依据是字典顺序。

要比较两个sysbols是否有相同的数据类型和值,使用"equal"。

(equal "abc" "abc") ;t
(equal 3 3)         ;t
(equal 3 3.0)       ;nil.类型不同
(equal '(3 4 5) '(3 4 5))  ; t
(equal '(3 4 5) '(3 4 "5"))  ;nil

在Elisp中并没有"!="或者“not-equal”。判断不等,可以在对整个等式取非。

  (not (= 3 4))  ;t

全局和局部变量

"setq"用于给变量赋值。格式一般为"setq 变量1 值1 变量2 值2..."

在lisp中,变量不需要声时,并且是全局的。

  (setq a 3 b 2 c 7)  ;三个变是,a=3 b=2 c=7

定义局部变量,使用let。格式为"(let (变量1 变量2) body)"。"body"代表其它的表达式。其中最后一个表达式的取值是整个语句块的返回值。

  (let (a b)
  (setq a 3)
  (setq b 4)
  (+ a b)
  )

a和b都是这个语句块的局部变量,返值是最后一个表达式"(+ a b)"的取值。

另一种格式是"(let ((变量1 值1)(变量2 值2)) body )"。例如:

  (let ((a 3) (b 4))
  (+ a b)
  )

如果你的变量很少,并且值都是已经确定的,可以用这种方法。

表达式块

有时需要把一些表达式括起来。这时可以使用"progn"。

  (progn (message "hi"))

它相当于

  (message "hi")

"progn"类似于C语言中的"{...}"。它使用于某些需要把语句合并起来的场合,其实这跟C语言中也是一样的。比如:"(if something (progn this that))"。这里,如果把progn去掉,变成"(if somethong this that",在lisp中表示如果something,那么this,否则that。在有progn把this和that括真情 为情况下,表示的是如果something,那么执行this和that。

If then else

格式为"(if test then )"。"else"是可选的。例:

  (if (< 3 2) (message "yes")))
  (if (< 3 2) (message "yes") (message "no")))

迭代循环

使用while。

  (setq x 0)
  (while (< x 4)
     (princ (format "yay %d." x))
     (setq x (+ 1 x)))

在elisp中,并没有for语句。

Lists

在lisp中的List是这样的:“'(x y z)”。括号前面那个单引号是很重要的。不需要太在意它的含义,把它当成句法的一部份即可。

  (message "%S" '(a b c))
  (setq mylist '(a b c))  ;定义
  (let ((x 3) (y 4) (z 5))
      (message "%S" (list x y z))
  )

以下是List的一些函数:

Function 目的
(car mylist) 取第一个元素
(nth n mylist) 最第n个元素
(car (last mylist)) 取最后一个元素
(cdr mylist) 从第二个到最后一个
(nthcdr n mylist) 从第n个到最后一个元素
(butlast mylist n) 不包含n到最后一个元素

这里所说的n,都是从0开始的。

下列是一些例子。

  (car (list "a" "b" "c"))
  (nth 2 (list "a" "b" "c"))
  (last (list "a" "b" "c"))
Basic List Functions
Function 目的
(length mylist) List长度
(cons x mylist) 把x加到list前面
(append mylist1 mylist2) 连接两个List

例如:

  (length (list "a" "b" "c"))
Function Purpose
(pop mylist) 删除第一个元素并返回
(nbutlast mylist n) 删除第n个元素,返回删除后的list.
(setcar mylist x) 替换第一个元素,并返回
(setcdr mylist x) 替换除第一个之外的所有元素

遍历运算数组

  (mapcar '1+ '(1 2 3 4))

上例的做所是遍历list中的每一个元素,并对它进行"1+"的操作。

当然,也可以用while循环来完成这件事。

定义函数

基本的函数定义方式是"defun (param) "doc" "。

  (defun myFunction () "testing" (message "Yay!"))

myFunction是函数名,这个函数无参,函数注释"testing",后面是函数体。

可以在doctsing后面加一个"interactive"来使得函数能跟环境进行交互(在emacs中,就呆以可用"Alt + x"来调用)

interactive的一些常用语法:

  • (interactive) 无参
  • (interactive "n") 一个数字参数
  • (interactive "s") 一个字符串参数
Jan
27

新人在团队中应该问什么样的问题

Author laihj    Category 善其事     Tags

最近团队中来一个外包,一起搞一个要得很急的项目,大概是年底发。

新人最近提的问题,让我总是忍不住想扔给他一篇《提问的智慧》,砸砸他的脑袋。

此君动不动就咬死了原来的代码行不通,这倒没什么,问题是在此基础上,他并不会提出自己的办法,而是拼命地问你怎么办怎么办怎么办,要求你给出一个方案来实行。

我觉得这样的问题不如不问,对谁都没有好处。

那么刚到团队的新人应该怎么问问题呢?

我个人觉得,如果团队有文档,那当然最重要的是先RTFM,没文档的团队免不了要问问题,其实我们喜欢新人问问题多过新人把代码弄得一团糟。但要注意的是,新人应该问的是老人能够几十秒之内回答的问题。

比如说,作为新人,不应该直接问为什么调用这个功能是为什么弹出提示说“没有权限”,而应该跟代码跟到相关的数据表,然后问在这种情况下为什么这个数据库表的值不对。

因为,一个团队,加进一个程序员,本质上来说目的只有一个:加快团队开发的效率,而前少项目交付的时间。

新人来问我问题,如果这个问题我知道,很好,我乐意告诉你。这样节省了走弯路的时间,有利于整个团队的效率。如果我不知道,那么这个问题应该打住,请君自己去看代码,而不是要求我帮忙看代码,或者要求我去思考出一个方案由你来执行。

因为不管是让我去帮忙读代码或让我出方案,都是一个时间浪费的问题。一方面,我得停下手头的工作,另一方面,在我帮忙的这段时间,新人实际上是闲着的。

并且,团队招一个新人,并不是为了写代码,而是为了解决问题。我们招一个人来,应该是看中其独立思考解决问题的能力,而不是为了得到一个编写代码的工具。如果只是一个按给定方案来写代码的工具的话,相比于人类,某些二进制代码组成的工具说不定是更好的选择。

而且,这样的问题并不能培养一个人的编码能力,天天从天上掉下来大鱼的话,人是会懒地,他必然学不会渔的能力。

Jan
20

Emacs的orgmode [remember]

Author laihj    Category 善其事     Tags , ,

remember1

Inbox,在GTD的定义里面是收集材料的工具。最好的Inbox工具是纸和笔。而Remember在Orgmode里面算是较好的Inbox工具。它比每次打开org文件来写好非常非常多。它提供的是在emacs启动的情况下,快速的录入工具。如果你的emacs没启动,那用便箋或纸笔会好得多。原因很简单,emacs什么都好,就是启动太龟了。

配置和基本使用

remember.el在emacs23以上版本是自带的,emacs22及以下版本如果发现没有自带,请自行放狗搜。

    (setq org-default-notes-file "~/.notes")
  

在.emacs中作如上设置,表示你希望将remember产生的note存放在~/.notes中,要我说这可一点也不重要,重要的是下面这一行:

  (define-key global-map [f12] 'org-remember)

快键键。当然,快捷键从来很重要。不过在remember模式中,它显得尤其重要。因为本身remember是随时需要的东西,用完后又应该随时忘掉。所以调用remember应该越不影响当前的思路又好。一个要键入”M-x org-remember”这么多字符才能调出来的remember又有什么用?

我觉得remeber的用法应该是这样的:

现在我想起来晚上海贼王的汉化应该出新的了,接F12调出remember,输入OP,然后“C-c C-c”保存(C-c C-k是取消),remember buffer自动消失,整个emacs又恢复成写这篇blog的界面。

现在的问题是,我一天可能乱七八糟的出现不少想法,每次都按F12来记录是好的,晚上回家一看,~/.noet里面充满了记录,一条一条分门另类地复制了不同的org文件中。我承认这是重要的工作,无可避免。可是有些想法我在记录的时候就知道它应该是todo还是普通的笔记,能不能让它们自动归位呢?

于是我们应该开始介绍:

模版

模版的配置文件如下:

  (setq org-remember-templates
      '(("TODO" ?t "* TODO %?\n %x\n %a" "~/doc/org/home.org" "Tasks")
	("IDEA" ?i "* IDEA %?\n %i\n %a" "~/doc/org/home.org" "Idea")
	))

它的参数是这样的,”TODO”是这个模版的名,”?t”是快捷键,”* TODO %?\n %x\n %a”是整个模版体,然后是该模版要保存的文件,保存后的项目在文件中处于哪个父节点下面(如果没有会自动新建)。

我们以第一个模版为例说一下使用中会发生什么?

当你按下F12(这是我的快捷键)时,会看到buffer被切分成两块,下面出现一个rememeber fuffer。以及一个输入提示,按我们之前的设定,出现两个快捷提示。

remembertemp

这时按下“t”,在remember buffer中,会自动接模版体的格式显示出补好的TODO,第一行是“* TODO”,第二行是%x,%x是你触发remember时kill ring(类似于剪贴板)中的内容。最后一行是%a,一个指向你触发remember的地方的link。

这时如果你按下”C-c C-c”保存,这一条TODO项目将会被送到”~/doc/org/home.org”文件中的”Tasks”条目下面。

模版还有一些好玩的用法,比如说写日记

关于模版参数的更详细说明,可以在这里找到

参考资料

org手册remember

Remembering to Org and Planner

Dec
4

修复ubuntu系统grub错误的非正常方式

Author laihj    Category 善其事     Tags , ,

昨日手贱,乱改分区表,结果ubuntu9.10进不去了。

开机黑屏,显示grub rescure: error unknown filesystem.试过google来的方法,无用。

用9.04的安装盘启动live CD(当时手上没有9.10的盘),准备把9.10 /home和其它目录的配置文件拷出一份再重做系统。

结果在安装时发现9.04安装程序提示系统中装有9.10,忽然想起在linux安装时都会重做grub,于是一个2.5G的小分区装了9.04,重启,果然看到开机系统选择中出现了9.10.

选择进入,一切正常。

Nov
25

用Dropbox搭配MoinMoin建立个人的Wiki

Author laihj    Category 善其事     Tags , ,

什么是MoinMoin

MoinMoin是一个基于python的wiki程序,有一个可利用的特点是不用数据库,所有数据都是文本。
它的desktop版本安装和介绍如下:
http://moinmo.in/DesktopEdition

什么是Dropbox

Dropbox是一个好用的文件备份和共享工具,现在有for win,mac和linux版本。它的用法是在系统中建立一个共享文件夹。你对这个文件夹的所有修改都会被同步到Dropbox提供的网络空间上,这个同 步的过程是自动的,不需要用户插手。现在Dropbox给初级用户的空间是2G。
https://www.dropbox.com/

怎么用?

简单的说,就是利用Dropbox的文件同步功能,将moinmoin的数据文件放到Dropbox共享文件夹中,以实现多台机器上的moinmoin DeskTop共享同一个数据源的目的。

实现起来也很简单,moinmoin的配置文件wikiconfig.py中,直接将data_dir,data_underlay_dir两个参数修改为Dropbox的共享文件夹即可。

2009-11-25-183736_828x284_scrot

这样,当你在一台机器上修改了你的wiki之后,本机的Dropbox共享文件夹先被修改,然后这个修改会被即时同步到Dropbox上,之后其它所有共享了这个文件夹的机器上的相应文件就会同时修改。于是在那台机器上打开wiki,就可以看到最新的修改了。

Dropbox 本身是一个非常好的同步工具。所有跟文件相关的东西都可以同步,比如firefox的profile文件夹,使用这样方法,同样可以实现不同机器上的 firefox配置同步的问题。比如同步书签,当然,firefox有delicious.com和Xmarks可用,但是由于众所周知的原因,它们并不 是什么时候都可以访问的。

Nov
13

[Founders At Work] Yahoo -5

Author laihj    Category 善其事     Tags ,

Livingston: 记得你参与过的最大的一场讨论吗?
 

Brady: 相对于look-and-feel总是有很多讨论。试图建立一个品牌,有很多事需要讨论,同样也需要实做,所以这通常是一种平衡动作。跟Filo争论图形的必要要性总是一个很大的争论,我永远不会忘记我们长达八年的辩论。
 

怎么处理成人问题是另一个讨论。非常多的讨论,没有人站出来说他肯定地抱持某一观点。在最初的几年,有很多互联网相关的法律,在我看来,国会对发生的事并没有一个清晰的概念。传统媒介的陈情者影响非常明显,他们有一个特别的议程:保护互联网开发者的最大利益不是必须的.“我们应该说什么?我们应该作何反应?”当然有这些想法。有段时间,我们把我们的网站整个转黑了——黑色的背景,白色的文字——来抗议,我不记得我们抗议的法令是什么了。
 

Livingston:新法律引起了很大的焦虑?
 

Brady: 绝对的。只要这里或哪里的一点点东西——版权,数字版权有一点点轻微改变——我们就会拥有一个完全不同的互联网。
Livingston: 记得其他一些有意思的新转折吗?
Brady: 我记得有那么一年,以色列的首相Rabin被枪击了。在第一时间我们将新闻做在首页上。因为我们觉得让我们的站点变成公共服务——在网上找到事件,传播新闻——在某种程度上是一个大事情。“Rabin被刺”是我们第一次侵入新闻领域,而我们从每个人那里收到的有关使用Yahoo来看新闻的反应都是压倒性的好。
Livingston: 荣耀时刻?
Brady: 盖茨的备忘录是一个很酷的时候——害怕和骄傲并存。上市是一个骄傲的时刻。被加入到NASDAQ 100是一个更骄傲的时刻。

Livingston: 对早期的Yahoo来说,拒绝投资要求是不是一件很难的事?
Brady: 很明显我并没有足够的权利参与这些决定。那始终是Jerry和Dave决定的,我也不知道所有有意投资者的列表。我知道AOL是,LA Tiems也是,我也知道他们得到过微软的非正式意向,没什么具体的。大部份都是在很早期的时候,在他们拿过风投之前。对Jerry和Dave(他们并不在宽裕的环境里长大)来说,去拒绝一大笔不需要公司对此后的发展做出任何承诺的钱是一件大事。他们对自己所做的有很大信心。
Livingston: 早期最有趣的事情是什么?
Brady: 我记得的最有意思的事情是在95年5月有一场巨大的风暴,停了几天电。我们必然去租一个发电机,为它注满柴油以工作4天。7天24小时地全程工作。我们笑道:“今天有多少页面要耗油?”那是一场疯狂的风暴,它开始撕裂我们的房子了。我们有很多会要开,无法停止。我们跟很多先进的合作者一起就着烛光开会。他们走进来,没有光,电线到处都是,指向后面的发电机,雨水从天花板上滴下来。我们试着安慰他们:“噢耶,我们是真正的生意人。” 然后你说:“等等,我去把油箱加满。”所以我总是对那些天保有生动的记忆。
Livingston: 你们有没有耍一些小计谋让你们看起来比实际上更大?
Brady: 对此我没有什么太好的故事要讲,不过我沮楚地记得Jeff Mallett刚来的那一刻。当时我累得像狗一年而他只是刚刚到来。除了其它事情之后,我也试着承包所有的公关事务。尽管我拥有我们专业的公关工具,它们是一个创业公司的公关工具。他刚从Novell来,看了看我,脸上看起来像是:“这活儿只能打C+。”我已经很多天没睡了,看着他都有点摇晃。可是他绝对是对的。“如果我们要变大,我们最好做一些大公司的动作。这些就是我们要给出的?你不能就把这个送出去。”我很清楚得记得这些,这对我来说真是很好的一课 ——“我知道你累,我知道你做得很辛苦,但那不是把这些看起来就像小公司做的东西送出去的借口。”
Jeff来的时候,我已经努力工和8个月了,我真的有一点累,我想他也不能持续。那时候我还不了解他,可他有两倍于常人的精力。我们在纽约的工作每周有两个夜班。 “OK,我们明天要去见MTV。通宵。开会。几天后回来。”我们这样工作了三四个月,我只记得他进门的时候,我想我没有办法工作得更卖力了。但最终我们工作得更卖力,更快速,更聪明。在努力程度和专业程度上都有一个提升。
每时每刻都使我们看起来比实际的更大。“噢耶,我们会在纽约,我们会去哪儿。”我说:“Jeff,所有这些都在我的图板里。”然后他总是回应说:“不,我们会去。”这是一个来自大公司的人,他知道大公司会怎么做,即使身后的公司只是一个创业公司。
Livingston: 有没有想退出的时候?
Brady: 不。有那么几天我很不高兴,但从来没有接近过我想辞职的点。那儿太有意思了。最实的4到5个月之后,你要以看出到来的是什么,你知道你在浪潮的哪一部分;事情只是不断增长。
在最初的几个月有那么几天我觉得:“我离开学校就是为了这个”因为当时我离开学校的时候并不确定我可以毕业——我只是离开了。我有70%的肯定我将会获得学位,可是另外30%都还在风里。我父亲为些付了账,所以要告诉他我没有获得学位,去的公司又倒闭了是一种“很烂的剧本。”
Livingston: 你父亲支持吗?
Brady:非常支持。在大学时他就知道Jerry 了。
Livingston: 你对将要开始创业的人有什么建议?
Brady:其中一部分是“了解你自己”。首先要尽可以地思考你的突破点是什么。我觉得我得的很不错的事情之一是我从来没有花时间去思考退出或者编写失败的成果本,“上帝啊,如果它没有成功会怎么样。”
 
在我加入之前,就知道底线在哪里,如果我要退出,在哪个点退出。所以当然还在里面的时候,它从来没有经过我的脑海。我也知道为什么我会被选中,我的动机是什么,我从来没有花很多时间来思考这些。在最后,它并不会给你任何好处。它是一种原因,不过想比于一天一天地完成工作,是在很抽像的层面上。把这些东西都提前想清楚:我为什么加入,什么时候离开,如果我要离开是为了什么,在早晨是什么促使我起床?我见过很多人因为一时兴起开始某个事业,后来就很苦恼。他们总在做业务时再去想这些事,然后,当然事情进展得不好,你无法理性地对待。这样的事情很多,因为你会变累,工作一堆一堆,而你又投资了,它们真的会使你变得情绪化。所有这些个人动机问题——在开始之前就弄清楚它们。
在我们开始这个公司之前Jerry是我最好的朋友之一,那是他的公司,所以跟朋友做生意……你总是听说:“不要跟朋友做生意,这是坏主意。”所以,有一件真正帮助我的事情是在我加入之前我们有一个交流:“OKlahoma,这里是规则。”这真的让我想道:“OK,如果这个发生了,我就离开。”我们用那个交流来保护我们的友情,虽然当时不知道会发生些什么,可是那个交流令我开始考虑,还知道我为什么被选中。
Livingston: 还有什么是人们应该知道的Yahoo早期故事吗?
Brady: 我知道这有点老套,但是开始综的人是很棒的。在这个词的每一个方面,不仅仅是努力,处理他们被赋于的责任,也是一些很好的人,为正确的理由从事它。你可以从产品和我们开发的形为中看到它。

yahoo

Nov
12

[Founders At Work] Yahoo -4

Author laihj    Category 善其事     Tags ,

Livingston: 那就是你们对待Goggle的办法?

Brady: 对的。策略上来说,在Google出现之前是完全正确的。因为我们始终认为那是一个跳跃游戏。没有人曾经可以在全文搜索引擎上领先那么多,让我们处于战略上的危机,因为那就是没办法做到这一点。最终Google完全做到了。那时候,2000到2001年之前,我们最终使用Open Text,然后是AltaVista,Inktomi。我们只是不断地换到已出现的最好的技术。我们只是用新的,有更好的搜索技术的合作者来替换旧的那个。

Livingston: 这些对用户都是不可见的?

Brady: 是的,那对我们的用户几乎是不可见的。即使他们的牌子在那儿,你来到Yahoo的首面,搜索,搜索结果的左上方是一个Yahoor的牌子和技术提供商的一个小牌子。我们总是把它做得尽可能小。

Livingston: 当你写最初的商业计划书时,有没有想到在得到投资的一年后就上市?

Brady: 没有。Jerry和Dave也没有。他们也许有所期望,但我不知道他们的希望是什么。那个时候你并不知道互联网会变得多大。那多数取决于互联网成长得多快和互联网成长的时候我们服务到什么程度的事实,而少数取决于我们做了些什么。

Livingston: 你记不记得上市背后的基本原则,还是你们的风投要你们上市的?

Brady: 不,它真的不是风投驱动的。有很多不同的理由——而我并不对所有的这些会议都知情。但是,是有很多考虑的。第一,IPO的窗口并不会永远开着。市场冷热交替。如果你要上市,你只能在市场火热的时候去IPO。Netscape为我们点燃了市场。另一个考虑是我们看出让我们变得更有竞争力的方法之一是获得合作者。而做到这一点的最好方法拥有一种除银行里的现金之后的通货——为他们的合作支付股票。所以,为了我们觉得需要的快速成长,我们必须发行股票。那可能是最大的理由。然后,筹钱很明显是我们要做的第三重要的事。

Livingston:斯坦福声称拥有Yahoo是否让你们紧张?它是否运行在他们的服务器上?

Brady: 是的。我从没参与这些讨论。我当然紧张,我还问过这事,Jerry 和 Dave,“没事,它被应付过去了。别担心。”它确实被应付过去了。

斯坦福在这方面非常先进。Yahoo远不是发源在那里的第一个创业公司,也将不是最后一个。它很新,并不是特殊技术;它是一个品牌,而不是真正的发明;它并不是技术的一部分。他们很聪明,知道任何一个抑止它的举动都会扼杀它,所以他们最好的指望就是随它去,希望Jerry和Dave之后取赚到钱回来。他们对结果很乐观,相信我。

Livingston: 斯坦福是不是关心Yahoo会毁掉他们的服务器。

Brady: 是的,那是他们告诉我们要离开的原因。那是强制的。Yahoo变得很大,它开始堵塞斯坦福的网络管道了,所以他们说:“你们这些家伙该离开了。”

Livingston: 我听说你们当时用了Netscape的办公室。

Brady: 是的。Mark Andreessen喜欢Jerry和Dave的作品,他听说斯坦福将我们踢出来了,就为Yahoo提供了30-60天的主机。

Livingston: 商业和工程的混合背景是否对你有帮助?

Brady: 很难讲,因为你不知道另一面是什么样。也许相对于其它事来说,商业教育给了我了解我所知和所不知的信心。我了解我的工作领域,我知道我擅长的事,当我不了解我所做的事的时候,我知道我应该去提问。

Livingston: 有没有什么事你做的比你想象中好?

Brady: 我知道我喜欢做某种类型的事情。跟多数人一样,你喜欢的事情你总会千方百计地做好。我擅长于给事物建模,特别是产品。创新营销,产品营销都是我最终从事的工作,这些我在东西的第一份工作中就完成的很好。

Livingston: 回想一下第一年,在一个创业公司中生活,你是否记得有哪些惊喜?

Brady: 很少有时间去回想。它改变得非常快,所以我从还没有时间停下来思考,“它跟我想象中的它不一样。” 它当然是一个惊奇,因为没有人对互联网的未来有任何想法。

回首过去,我想我还是不能完全理解在时间和情感上对它的付出有哪些使事情顺利开始了。不管事情如何进展,它只是一个要在互联网的大潮中保留位置的任务。非常,非常长的时间。我们组织起来的人非常好,所以工作时间从来不难捱。你会享受工作,即使有时那会花去一天出的16,18小时。那是我回想的时候唯一觉得特别的事。

Livingston: 我想知道是否那是因为它处于泡沫的早期,并不是所有人都捱过了那个时期?

Brady: 真正的原因是它是令人兴奋的。随着互联网越来越大,我们对自己说:“我们处于风暴的中心。”当大事件发生时,大部分人并没有知道他们处于中心的特权。我们处于一切的中心,但是我们知道当它发生的时候,我们将会度过它,带着加在其它的乐趣,和责任。

Livingston: 你记得你们第一年犯了的错误吗?

Brady:没什么大错误。因为任何我们发现自己搞砸的事都被纠正到它能纠正到的程度。这里没有太多的自负,所以大家都会为仅因为一个烂主意是他们的就一力维护。但是有一个当然的合作者我们错过了,我们错过了Hotmail。

我和Jerry与Sabeer Bhatia和Jack Smith一起吃了个晚饭,他们向我们介绍它,而我们——我讨厌承认这一点——说:“我看到了,可我不觉得它有什么前途。”我们在那艘火箭上,他们在谈论的是还没有流行起来的东西。

我们所知的一切就是你在工作中收到email。它们有点像这样的:“不,所有人都不喜欢他们的工作邮件,因为它满屏都是。”普遍的想法是,“在家拨号,任何地方接入”依然是一件相当遥远的事情,我们认为它并不会像它后来显现的那样很快流行起来。明显的,我们并没有付出我们应该付出的努力来追逐它。

我们搞砸了。但是,我们找到了第二号,Rocketmail,让它运营起来,现在Yahoo比Hotmail大。是我们的错,但我们弥补了。

Livingston:你是否记得Yahoo有没有什么大创意是主流公众没有理解的?

Brady: 我们对互联网的核心理解是:它是一个开放的系统,你不能在这里筑一堵墙。我觉得Filo所做的最伟大的工作之一就是使以下的事实发生:当一个人作搜索的时候,他没有在Yahoo找到他正在找的东西,相对于只是说说“它不在这儿”或是“再看看这里的其它东西。”,他放了一个指向我们竞争对手的链接,然后填入查询物权法件,所以你需点击 Excite,就可以在Excite搜索同样的东西。

当然,在商学院他们不会教你去放一个指向竞争对手的链接,但是它向我们的用户传递了正确的信息,那就是:“这全是为了你。我们将给你你想要的数据。如果它存在于互联网,我们将会为你找出来,即使我们无法直接靠它赚钱。” 但是它使得人们总是回到Yahoo,因为他们知道,我们这里有他们脑中最好的互联网。

我想这是一个大创意。它承认了你自己,作为单个公司,无法给每个人所有的东西。我们不是一个像AOL那样的筑墙小花园。我们是连接点,带你到任何你想去的地方是我们的工作。

Livingston: 早期最流行的链接目录是什么?

Brady: “性”可是拥有当时网络上四分之一的内容。不仅是Yahoo,而是整个网络。就像家用录像刚开始的时候一样,互联网在这方面并没有什么不同。

同样也有很多产品信息。人们在开始大宗购买之前先搜集信息——汽车或类似的东西。在头六个月之中的我们做的大事件之一是使路透社上线了。我想CNN也是在那个时候上线的,但成品很糟糕——很慢,充满图片,它们不理解互联网。路透社当时拥有很丰富的新闻,他们没有地方展示,只是卖给人们一些零碎的东西去读,没有人曾完整的看到它们。这在后来被证明是巨大的。

Livingston: 你们怎么处理成人内容?

Brady: 这是一个很难回答的主题,它总是被提起,从未被解决。但我们支持言论自由。这是我们始终在考虑的事:“这是谁的责任?” 人们来我们这儿查找信息,本质上我们并不显示图片。在我们将信息显示出来之前,查出用户的年龄是不是我们的责任?那些内容是否应该在网站上?等等等等。

最终我们移除了所有指向那一类站点的链接,在那之前有大约一年半的时候我们一直努力寻找一种适当和负责的方法来处理这个问题。在那个时候儿童保护法刚好出来,但是我相信在那之前我们就把那些东西拿下来了。

Nov
10

[Founders At Work] Yahoo -3

Author laihj    Category 善其事     Tags ,

Livingston: 在那六个月之间发生了什么转折点?

Brady:那个时候Netscape是 IE之前唯一的浏览器。在浏览器的一部份他们放了一个文件夹按钮,通过这个按钮他们免费地让人们链接到我们。Netscape最终发展了互联网——他们赚钱的方式是让每一个人都上网,然后再卖给他们服务。所以任何以吸引人们上网为目的的事情都会帮到他们。他们觉得Yahoo是那里最好的东西,所以给了我们一个链接。这在当时对他们是有意义的,大意义。它将我们的流量带到顶峰。

我们雇用了一个外部的销售公司来帮我们开始做广告。我们将五个包卖给五个大公司,MasterCard 是其中之一。在Koogle到来之前我们就得到了我们最早的广告。

我们贴上了图片,那是一个大事件。也许现在听起来很荒谬,但是那个时候Yahoo完全是文字的。当时连接速度慢到任何站点只要使用了大量图片就会瘫痪的程度。大部分的传统媒体无法理解这些,因为它们看不到人们是通过一个多么慢的猫来拨号。不过我们知道,如果我们想要打出一点品牌,那就必须使用图形。所以我们在放广告的时候,就打开了图片开关。

我们在没有CEO的情况下就雇人并建立了组织。我们有一个Sequoia帮我们找到到的临时管理者——一个CEO和一个CFO。因为我们还没有成功地找到一个CEO,Sequoia坚持让我们雇用那些经理人。这并不是太好,他们并不像我们一样长期为Yahoo工作。在那些临时工作的人和另一些(比如我自己)完全投入的人之间有明显的分别。我为它将我的整个生活从西海岸搬过来,我的未来跟这个联系在一起,然而他们则无此必要。

在我看来,他们即没有帮到我们也没有伤到我们。他们只是帮我们将这船稳定了6月月,直到我们请来了Tim Koogle。

Livingston: 因为它是新行业,说服人们加入Yahoo是不是很难?

Brady: 是的,很难。我们雇用了很多朋友,和朋友的朋友。你总是听人们说“永远不要跟朋友做生意”。但是最初的20个雇员,他们都彼此认识。所以有高层次的信任,每个人都是年轻的。它是很多人的第一份工作,除了临时的经理人之外。所以人们并不担必互联网将走向中何方,他们只是找一些有意思的事情来做,并有资格加入Yahoo。

互联网真正的起步是在95年七月。Netscap流行起来,还催生了一系列的公关反应。互联网不仅仅是酷,而且能令人赚钱。媒体总是围着Jerry和 Dave,于是我们得花很多时间来搞定他们。我们雇了一个临时的公关公司,但他们干得并不太好。我们甚至不需要它,因为媒体总是直接打电话来,Jerry 在应付媒体方面简直是个天生好手,所以事情就很平常地进展着。

然后Tim来了,他一个月之间就雇了Jeff Mallett,而Jeff Mallett的两三个月的时间就建立了他的班子。

Livingston: 你个人的关注点是哪?

Brady: 产品。我为Jeff Mallett工作,他是TimKoogle下来实质的COO。我是Jeff团队的一员,运行产品。在Jeff下面还有业务开发,销售和市场。

Livingston: 你们是否担心过竞争对手的事?

Brady: 有一些事件让我们想到我们将会受到竞争对手的冲击。第一件就是Netscape把浏览器上的文件夹按钮变成搜索按钮,并开始卖那个按钮链接的权利。 Kleiner Perkins投资的的Architext(后来改变叫Excite)有很多斯坦福大学生。他们用风投资金购买了Netscape的搜索按钮。 Netscape同样是Kleiner Perkins投资的。

Livingston: 你们为那个按钮出过价吗?

Brady: 我们在某个价格上出过价,那个价格是我们觉得可以赚回来的。在那个价格点之后,我们知道它已经是“品牌投资了。”我认为我们当时并不觉得那是投资器牌的合适时间。因为那时我们还不知道互联网将会变得多大。虽然媒体已经疯狂了,但相对了其它媒介来说,数理还是很少的。我想Excite为那个按钮付出了5百万。

我们确实对Excite感到焦虑,我们也担心微软。在95年夏天,Bill Gates发出了他关于互联网的著名备忘录。我想那是最初一些中的一个。它说微软要介入这个游戏,他是这样结束那个备忘录的:“我最喜欢的站点:Yahoo。酷,酷,酷。”

我们的第一反应是:”耶,酷,酷,酷。”,然后接下去的想法就是 “噢不。这是否意味着我们在Bill的准星之内,是否意味的我们仅仅是酷?” 任何时候你说起微软,就是他们做生意的方式,他们拥有在任何他们想要的领域搞事的潜力。所以一旦接近他们,他们的心态经常是这样的:“我们可以跟你合作,否则我们自己做。”

我们对他们做的任何动作都很担心。那个时候,我想IE快出来了,它是一个糟糕的努力,他们在浏览器上的努力,但持续了下来,你知道他们会继续发展,他们始终在后面威胁着我们。

还有一堆其它的竞争者:Lycos, WebCrawler。同样,AOL有段时间取得了比互联网更快的增长。每一个人都听说过“互联网”,可是当他们想上网的时候都会注岫AOL,因为它是上网最容易的方式。尽管我们觉得那很疯狂,有那么几个月,AOL的小花园比整个互联网都大,那使我们无计可施。确实是一个大威胁。

Livingston: 你有没有在竞争者的网站上看到这样的地方,让你说:“他们运行了这个功能,我们必须现在就实现它!”

Brady:在最初的时间,并不多。Jerry和Dave在潮流前头。他们早期的那些想法在战略性和创造性方面都是极好的。所以在97年中期,我们所做的每一件事情,都一定是首创并且做得很好。

有一件我们所有的竞争对手都花了大量时间去做而我们不做的事就是搜索。他们爬遍了整个网络来做全文搜索,而我们的策略则是:“看啊,那是一个技术游戏。而我们不是技术公司,我们是媒体公司。因为那有这么多公司,所以当我们需要的时候总是可以租用它。”那就是当时的想法,而在Google出现之前这一策略一直是完美的。 Because, as things playedout, that’s exactly what happened.

我们有一个可搜索的目录。它很大,它拥有所有流行的站点,所以你可以在上面搜任何东西。但是并没有所有东西。如果你真的需要在一个干草跺里寻找一根针,那我们满足不了。但是我们拥有很多这样的人,他们想读一篇文章,然后连上网络想道:“我可以在Yahoo找到任何东西。” 他们来到Yahoo时的期望是他们可以找到任何东西,但是我们并不需要实现草里寻针的需求。

所以我们所做的是,我们先在自己的目录里搜索,然后给你那些结果,然后,如果我们什么也不找到,就将你踢向一个全文搜索。所以,当我说我们“租用”那些技术,我们与全文搜索公司真正的合作是为了减少我们的搜索。