Liuw's Thinkpad

想要赢就先学会输,想要成功就先学会失败

配置mutt作为邮件客户端

without comments

我一直是使用Gmail的Web GUI来发邮件的,用起来倒也方便。但是现在要提交patch了,还是换一个常见点的客户端吧。在内核的Documentation/email-clients.txt里面列了一些常见的客户端,由于Gmail会自动把tab换成空格、默认format=flowed的设定以及based64编码的问题,它并不合适作为客户端使用。

上午折腾了一下Alpine和Mutt,最后还是选用Mutt了,觉得用起来还不错。把配置文件记一下。

set from = "YOUREMAIL"
set realname = "YOURNAME"

set imap_user = "YOUREMAIL"
set imap_pass = ""
set imap_keepalive = 900

set smtp_url = "smtp://YOUREMAIL@smtp.gmail.com:587/"
set smtp_pass = ""

set folder = "imaps://imap.gmail.com:993"
set spoolfile = "+INBOX"
set postponed = "+[Gmail]/Drafts"
set trash = "imaps://imap.gmail.com/[Gmail]/Trash"

set header_cache = ~/.mutt/cache/headers
set message_cachedir = ~/.mutt/cache/bodies
set certificate_file = ~/.mutt/certificates

set move = no
#set editor='vim + -c "set textwidth=80" -c "set wrap" -c "set nocp" -c "?^$"'
set editor='emacs -nw -q'

my_hdr Cc: YOUREMAIL

set query_command = "goobook query '%s'"
bind editor <Tab> complete-query

光有Mutt还不够,由于我的联系人都在Gmail上面,写邮件的没有没有address book也是很烦人的。我用的是goobook来同步Gmail联系人,在Mutt里面也能调用。配置文件的最后两行就是goobook在Mutt中的配置。

goobook的缺点就是在Mutt中password的提示不大好使,所以要在goobook配置文件中写入password。这不够安全。折中的办法就是,先同步一次,goobook会做好cache,然后再把配置文件中的password去掉。

Written by liuw

June 3rd, 2011 at 2:32 pm

Posted in UNIX-like

Tagged with , ,

实习啊实习

with 2 comments

刚才接到TX工程师的电话,问起实习的事情,确实是对不起了。

原来863未验收的时候,老板是肯定不会放人的,所以就申请个GSoC玩玩。

后来863有确定的结果了,才考虑是不是去找个实习什么的。因为我知道TX有8月的实习时间,所以打算是先把GSoC做完,然后再去TX。

但是老板突然又说某个项目又来了,又要我带新人,下半年放人的可能性也很小了。

我觉得实习对于一个学习计算机的学生来说实在是太重要了。国内的研究生都是给导师打苦工,还是得毕业的。老板说一个“不”,谁又敢违逆呢。

发完牢骚,继续抠腚去……

Written by liuw

June 2nd, 2011 at 9:43 am

Posted in 生活

Tagged with

开始VirtIO for pure PV

without comments

上周给Xen写了几个Patch。

1. 简单的typo fix,没什么好说的。
2. 为模拟设备注入MSIX而写的HVMOP,进入staging。QEMU部分也发到qemu-devel了,但是QEMU开发者说模拟MSIX的注入还要再讨论一下,那我就等等吧。
3. 给libxl加上VirtIO Disk的支持,这个还要再完善。

现在其实VirtIO for HVM已经差不多了。下面要开始最难的VirtIO for pure PV的工作了。

Stefano说we don’t exactly know how long it is going to take,要考虑的东西还是挺多的:

1. Xenstore里面要写什么东西。
2. VirtIO要怎么初始化。
3. 底层相关实现的替换(evtchn等)。

而这些工作,又要和现有的功能和平相处。所以还要再了解现有的设计,才能提出合理的设计。

这两天就先看看现有代码。一是Linux kernel里面VirtIO的代码,二是Xen PV初始化的代码,三是参考PV net等等的Xenstore参数形式。再和Stefano及Konrad再深入讨论一下。

Written by liuw

May 30th, 2011 at 8:32 am

Posted in Programming

Tagged with , ,

VirtIO for HVM进展

with 4 comments

虽然我说要尽快尽快开始,但是实际上进展不快。因为很多时候都是在调其他的bug。Xen unstable和SeaBIOS配合的时候,对IRQ配置有分歧,所以最后IRQ的注入有问题。

由于对IO-APIC和LAPIC不熟悉,在这里卡了很久。最后还是Stefano把这个bug解决了。惭愧。

这个bug解决之后,反而VirtIO for HVM的主要问题已经解决了。只要在guest command line加上”pci=nomsi”,其实VirtIO网卡已经可以使用了。

Stefano告诉我,下一步是把VirtIO disk for HVM搞好——这得等到Ian Jackson把libxenlight重构之后才可以进行,主要是一些配置的parse和driver的问题。

再下一步,就是把MSI for emulated devices做好。现在Xen只支持向passthrough的设备注入MSI,但对模拟设备没有接口——这也是为什么前面说要加nomsi的原因。

其实debug好像也没有什么好办法,都是加printk之类的。但是别人为什么debug这么快,我为什么这么慢,这真是个问题——我对底层还不是特别了解。以后还要再加油。

Written by liuw

May 19th, 2011 at 8:14 pm

Posted in Programming

Tagged with , , , ,

如何移植VirtIO到Xen的HVM上

with 4 comments

这只是一篇分析文章,没有具体代码。分析也不全面,可能会有错。权当自己的笔记。

把Anthony的QEMU-dm看了一下。以前写proposal的时候,主要看的是KVM的处理代码(kvm-all.c),马上开始干了,要先了解一下Xen的处理代码(xen-all.c)。两者的基本原理是一样的,只是一些命名和代码逻辑上有所区别。初步看来,这个阶段的工作难度相对来说不大,目前已经有比较清晰的思路了。

我在Porting VirtIO to Xen里面提到过,KVM的dispatch函数是kvm_cpu_exec(),它按照VMEXIT的原因去dispatch这些请求。Xen也必然会有自己的dispatcher。在xen_init()的最后,xen_vm_change_state_handler()被注册为QEMU的change state handler。顺着xen_vm_change_state_handler()又会注册cpu_handle_ioreq()作为event channel的handler。

cpu_handle_ioreq()会调用handle_buffered_iopage()和handle_ioreq()两个函数来处理IO请求。在handle_ioreq()中,又分为了几个IO类型。Xen的对它们的命名和KVM有所区别。但是简单对比一下就知道对应关系了。

1. KVM_EXIT_IO对应IOREQ_TYPE_PIO
2. KVM_EXIT_MMIO对应IOREQ_TYPE_COPY

VirtIO在向KVM注册设备的时候,用的就是直接写Virtual PCI的方法,也就是说会引发KVM_EXIT_MMIO。然后cpu_physical_memory_rw()会被调用,在这个函数里面,对IO mem的处理是由一些由用户自己注册的函数来完成的。

VirtIO的handler注册到IO mem区域是一个比较复杂的过程。主要涉及的文件有pci.c和exec.c。在pci.c中,有一个pci_update_mappings(),它会调用cpu_register_physical_memory();cpu_register_physical_memory()又调用cpu_register_physical_memory_offset()来更新IO mem的映射。这些handler在初始化的时候通过cpu_register_io_memory都注册到到对应的函数数组中,io_mem_write[]和io_mem_read[]。其他有关的数组还有io_mem_opaque[]。

io_mem_write[]的类型是CPUWriteMemoryFunc,io_mem_read[]的类型是CPUReadMemoryFunc,这两个类型和virtio_ioport_write()及virtio_ioport_read()的类型吻合。(有相应的typedef可查)

虽然我没有完全很详细了了解QEMU的设备注册机理,但是我初步猜测最后这些处理一定是会进入到virtio_ioport_wirte(),到实际写代码的时候会进行验证。

于是可以得出结论,注册到Xen的时候,控制逻辑应该会进入到IOREQ_TYPE_COPY中。同理,VirtIO在KVM中要触发事件(kick),也是直接写Virtual PCI的。最后的逻辑还是会进入同样的地方。现在如何注册、如何触发事件已经有思路了。实际上,这些控制逻辑要改动的地方不会太多。因为最后它们都会被dispatch到VirtIO的handler去处理。我们最切实的关注点应该是VirtIO底层的实现函数(比如说vp_notify())。目前的情况是,这些handler直接使用了KVM的的功能。据Stefano的说法,最好把这些函数换成QEMU-generic的函数,相当于再加一层glue,然后再分别为KVM和Xen实现底层的处理逻辑。

Virtual PCI要改吗?不用。就算分析到这里,我也没有对QEMU到底是怎么注册设备完全了解。但是按照目前的情况来看,了解到这里也基本够用了。我要关注的,还是VirtIO用到了哪些KVM的接口,这些是要真正着手修改的地方。Xen tools改动的地方不大。

我的打算是尽快开始写代码,没想到开发环境却怎么也没有完全搞好。先是VGA console不工作,搞了几天。Upstream QEMU和Xen QEMU不完全相同,也调了两天,现在是可以用了,但是也还是有问题。这些天解决了不少问题,但都不是核心问题,所以多少有点烦燥。对于时间的估计,我不会太乐观。貌似搞底层开发的不可预料的情况比较多,很令人烦燥。只能说尽快开始搞,多争取点时间了。

Written by liuw

May 6th, 2011 at 4:26 pm

Posted in Tech

Tagged with , , ,

Porting VirtIO to Xen

without comments

by Wei Liu <liuw #SPAMFREE# liuw #DOT# name>

1 Overview

VirtIO is a unified paravirtualized IO framework created by Rusty Russell. It’s not hypervisor-specified, but mainly used in KVM. It is possible to port VirtIO to Xen without much effort.

This article is organized as serveral sections. Section 1 discovers how VirtIO is used in KVM. I will pay much attention to code analysis. Section 2 discusses how we can port VirtIO to Xen, both for normal PV and PV-on-HVM. Section 3 illustrates what performance tests will be done. Section 4 introduces porting plan for Spice (spice-space.org).

2 How VirtIO is used in KVM

This topic can be divided into three subtopics.

2.1 The role of KVM

KVM acts as hypervisor. It is responsible for capturing events then passing events to QEMU. I’m not going to illustrate how it works because this is out of our scope.

2.2 How VirtIO is used in Linux kernel

There are two key perspectives in creating a cross-domain communication channel:

  1. how to deliver events, e.g. Xen’s event channel, KVM’s handler to trap VM_EXIT and event dispatcher.
  2. how to share data, e.g. Xen’s ring buffer, VirtIO’s virtqueue.

It is obvious that Xen provide these two perspectives out of the box. However, VirtIO only provides mechanism to data-sharing, and notification is left for the user. VirtIO also registers as a bus inside kernel, which resembles XenBus.

The core structure in VirtIO is virtqueue. It contains a vring (just like ring buffer) and some other information. One thing worth mentioning is that virtqueue alse wraps up two important function pointers, one for notification, which is exactly what we need to replace, the other is for callback, which is somewhat irrelevant to porting.

Let’s take virtio network device as an example.

First thing first, virtio network in Linux kernel is implemented as a PCI device, so it is necessary to implement a virtio pci bus. See drivers/virtio/virtio_pci.c for details. When porting to Xen, it might be necessary to replace this PCI bus with XenBus. (However, it might be left unchanged in PV-on-HVM, we need to do a VM_EXIT and trap into hypervisor anyway.)

Source of virtio network lies in drivers/virtio_net.c . virtnet_probe() is responsible for probing. In this function, virtnet is setup with at least two vrings “input” and “output” and an optional vring for “control”. Callback for “input” is skb_recv_done() and callback for “output” is skb_xmit_done() .

After calling vdev->config->find_vqs(), these 2 or 3 vrings are setup. If we trace down this function – it lies in virtio_pci.c as vp_find_vqs() – we can find that it consequently calls vp_try_to_find_vqs(), setup_vq() and request_irq() .

In setup_vq(), the framework actually allocates the vring for data sharing. It is worth noting that the notify function is vp_notify(), which directly writes queue_index to (vp_dev->ioaddr+VIRTIO_PCI_QUEUE_NOTIFY) to generate a VM_EXIT. So that hypervisor can catch the event and dispatch it.

And the requested irqs are used to invoke the callback functions, i.e. skb_xmit_done() and skb_recv_done() .

2.3 How VirtIO is used in QEMU

QEMU runs on top of KVM and it interacts with KVM via /dev/kvm . KVM has to cooperate with QEMU. Actually, a virtual machine in KVM is merely a process.

VM instructions execute natively on CPU. However, when a VM executes some sensitive instruction, it will be trapped by KVM. Then KVM passes this instruction to QEMU to emulate / handle it.

KVM hands over the instruction to QEMU in kvm_cpu_exec(), which is in kvm-all.c . There is a `switch` on the exit_reason. Exit reasons include (port) IO, interrupt and MMIO, etc.

QEMU has full access of guest’s memory. But it has to grab the virtqueue inside VM first to communicate with vritio_net. When VM calls setup_vq(), it voluntarily writes virtqueue’s address to (vp_dev->ioaddr+VIRTIO_PCI_QUEUE_PFN), which will be trapped by KVM. KVM passes it to QEMU. QEMU then calls virtio_ioport_write() -> virtio_queue_set_addr() to set VRing, which is the control structure used in VirtIO in QEMU. This is how QEMU and VM create their data-sharing channel.

As for notification channel, it seems much easier. As mentioned above, VM writes index to VIRTIO_PCI_QUEUE_NOTIFY. It is trapped by virtio_ioport_write(), then passed to virtio_queue_notify(). In virtio net’s case, this request is finally handled by virtio_net_handle_rx() or virtio_net_handle_tx_{timer,bh}() .

There are many VirtIO-related files reside in the hw/ subdirectory. And also many other files in Linux kernel’s directory.

3 How to port VirtIO to Xen

Now that we’ve got our first impression on VirtIO. It time to discuss how we can port it to Xen.

3.1 PV-on-HVM

It is obvious that in the PV-on-HVM case, things are more or less the same as they are in KVM. Xen traps VM_EXIT and passes exception to QEMU. QEMU emulates. Then Xen sends result, VM resumes running.

3.1.1 How to grab virtqueue address

Xen utilizes QEMU as KVM does. So Linux kernel can stay untouched. Xen captures guest’s write to PCI configuration space, then QEMU will handle changes in VirtIO configuration.

3.1.2 How to deliver event

In VirtIO’s current virtual PCI implementation ($QEMU/hw/virtio-pic.c), it uses KVM’s event notification functions like kvm_set_ioeventfd_pio_word() and kvm_has_many_ioeventfds(). It is necessary to replace them with corresponding implementation in Xen. Anthony’s QEMU-dm ships with xen-all.c , it might give me some hints on implementation.

3.2 Normal PV

When it comes to normal PV case, we will have to do things in different way. I will try my best to detail what should be done and how it is done. However, this is just a rough design, things may change when implementing.

3.2.1 How to grab virtqueue address

In Xen’s covention, it is common for Dom0 / DomU to use Xenstore to expose their public information like netfront/netback, blkfront/blkback, etc. So it is a good idea to use Xenstore to expose VirtIO information. Xenstore’s well-defined API will greatly reduce work needed.

Down to implementation level, it is necessary to replace virtual PCI bus with XenBus. VirtIO utilizes virtual PCI to configure network device. However, in normal PV case, it is not necessary to expose a virtual PCI device to VM. We can follow the pattern how netfront and netback establish their channel.

QEMU-dm from Anthony has functions to manipulate Xenstore, that should help a lot. It also has xen_nic.c, which can greatly inspire how I can implement a VirtIO network for Xen.

3.2.2 How to deliver event

No doubt that event channel is the best choice. Anthony’s QEMU-dm contains a file named xen_backend.c, which is used for event handling. Linux kernel has event channel handling functions, too. (drivers/xen/{events,evtchn}.c)

So, just replace any notification-related function with Xen’s implementation. That’s the plan.

3.3 Other stuff

In PV-on-HVM case, QEMU needs to emulate. In normal PV case, no emulation is needed. Either case, QEMU works as backend dispatcher for VirtIO. Once the channel between two VMs are established, QEMU is supposed to work out of the box. However, I can’t be too optimistic here, it might require some work, such as rewriting and debugging some functions.

3.4 Knowledge required

To be honest, QEMU’s concept (like proxy / virtual device management) is somewhat strange to me. There are some high level design document, but they are just too high-level. A thorough understanding of QEMU’s internal is required.

Knowledge of hareware virtualization is also required. I need to understand how Xen implements HVM interface and choose the right function for certain functionality.

Knowledge of XenBus configuration is a must in normal PV porting. I’ve read about it before, so this is the easier part.

4 Performance tests

Performance tests will be run with industrial standard software like kernbench, ioperf and netperf. Testsuits will be run on several different configurations:

  • Native Linux, CPU, disk and network.
  • Xen with normal PV VirtIO support, CPU, disk and network.
  • Xen with PV-on-HVM VirtIO support, CPU, disk and network.
  • Xen with original PV support, CPU, disk and network.
  • KVM with VirtIO support, CPU, disk and network.

And a short report will be written based on the result, which compares between outcoming data and analyzes advantages / disadvantages between configurations.

5 Porting of Spice

Spice will be ported to Xen’s HVM environment as a real-world testsuit. According to its design, Spice communicates with QEMU via Virtual Device Interface (VDI). Spice client and server run entirely in userland (correct me if I’m wrong, I’m not Spice expert). If we are able to run QEMU with QXL or any other VirtIO devices on Xen, it would not be so hard to get Spice running on Xen.

AFAIK, QXL in QEMU (hw/qxl.c) uses its own paravirtualized ring implementation. It also use qemu_set_irq() to deliver event. So the main idea is to replace this implementation with Xen’s ones, which is already done in porting VirtIO.

The plan is to run Spice with our modified QEMU and eliminate any bugs encountered.

6 Reference

  • Linux kernel 2.6.38.2
  • QEMU-dm, git://xenbits.xen.org/people/aperard/qemu-dm.git
  • Xen-unstable, git://xenbits.xen.org/xen-unstable.git
  • Spice project, spice-space.org

HTML generated by org-mode 6.21b in emacs 23


Written by liuw

April 26th, 2011 at 10:38 pm

Posted in Programming

Tagged with , ,

GSoC申请记录

with 2 comments

其实这篇文章早就应该写了,现在距申请的deadline已经过了半个多月了。但是我毕竟还是没有早写,要是我没有中的话,写出来又有什么意义呢,还不是误导别人吗。我申请之前查了一下,记录这方面的文章不多,现在结果出来了,有幸中标,故写一文希望对各位同学以后的申请有所帮助。

其实事情也并不复杂。我在3月28日的时候在网上乱逛,恰好看到某个项目的网站说GSoC今年的申请已经开始了。本着“看看又不费钱”的心理,翻墙到google-melange.com上了解一下情况。没想到28日恰好是opening day,没想到自己一直感兴趣的Xen也是accepted organization之一,更没想到把VirtIO移植到Xen是其中一个project。种种巧合促成了我的GSoC之旅。

决定参加之后,第一件事就是先把google-melange.com翻了个遍。这个过程主要是了解一下GSoC的各个方面的信息。网站上有很多的资料,FAQ、Application Guide和Mentor Guide一应俱全,很值得一读。也许很多人会忽略Mentor Guide,我还是老老实实读了一遍,不一定很细,但是把我关心的问题读了——mentor如何给application评分——这对自己写好application也是有帮助的。把这些东西都读完我花了一个下午的时间,但是我觉得值得,因为我得到了对GSoC的总体印象。

除了google-melange.com之外,每个organization的idea page也是必看的。这个idea page除了有organization列出的项目之外,还有一些他们的要求。不按要求做的话,十有八九得到一个ignored的结果(application的状态之一,意思是他们根本就不考虑这一份东西)。

一般organization都会要求student先和mentor联系。收集到必要的信息之后,我就开始和mentor写email来传情交流。主要是相关经验的介绍,对项目的理解(重要),技术实现的一些讨论,以及其他一些所有可能的问题。这个过程比较漫长,但是很重要。我原来就对项目的理解出现了点偏差,和mentor讨论之后理解他的意思,才写出正确的proposal。

最后一步就是proposal的写作。一般organization都会有相应的模板,往里面填东西就是了。为了增强自己的竞争力,student应该尽可能详细地描述自己的想法。我就是除了写application之外,还另外花一天时间写了一份文档,作为additional information加在application里面。

基本能做的都做完了。把proposal提交之后,在deadline之前都可以改。我时不时上去看看有没有comment,可是没有(但是我听说有的人会有)。过了deadline,那就是漫长的等待。期间我还不时上IRC泡一下,抽空写了一份备胎性质的proposal。

在流水账式的记录之后,总结一下申请中我认为比较关键的地方:

1. 仔细阅读相关文档;
2. 和mentor进行深入的交流;
3. 写出尽量详细proposal。

总的来说,这次的申请费的时间不是很多,效果还好。今年GSoC的情况是,3731个学生写了5474份proposal,最后accept了1116人。而中国学生在里面也不少。

我的proposal在:http://www.google-melange.com/gsoc/proposal/review/google/gsoc2011/liuw/1

Written by liuw

April 26th, 2011 at 9:22 pm

Posted in 生活

Tagged with ,

GSoC中标,这个夏天不再寂寞

with one comment

由于我们老板不让出去实习,所以就没有投什么实习的单位。

不过在学校还是可以做点事情的嘛。Google Summer of Code是个不错的选择。

今天早上起来收到邮件,发现自己写的一个VirtIO on Xen的proposal中了,这个夏天有事可做了。

把accept letter贴上来纪念一下,详细的申请过程再写一篇文章介绍。

Hi everybody,

if you have not seen the news yet, you got accepted for GSoC. Congratulations!

I just shared a google document check-list for you to help you get started. It would be good, if you could provide contact information, etc. in the second tab of the document and tick off the stuff you have done. I will be doing the GSoC admin this year. So if you have any admin related troubles, get in touch.

Drop a line to your mentors too, but note that many will be on holidays due to Easter, the Royal Wedding and May Bank holiday. You may not hear from them until May 3.

Happy Easter!

Lars

Written by liuw

April 26th, 2011 at 9:07 am

Posted in 生活

Tagged with ,

Git让我不爽的一个地方

with 2 comments

这一篇是凑数的,纯属吐槽。

我在看某个项目的代码,想了解一下这个项目是怎么一步一步发展起来的,所以希望从最高的一个commit开始看起,一直看到最新的commit。

可是Git不能很随意在历史里面切换,很怨念啊。Git一旦checkout一个commit之后,它的HEAD就指向这个commit,然后后面的log都没有了。想了再checkout下一个commit,还必须先checkout到master,然后再checkout想要的commit,太繁琐。现在想起SVN的好了。

UPDATE:

其实只要知道SHA值就可以直接checkout了,不一定需要切换到master的。我前面那样写是因为我不知道后面commit的SHA是什么。

可以用git log master查看master的log,这样就没必要再切来切去了。

谢谢iveney同学的帮助。

Written by liuw

April 24th, 2011 at 9:38 pm

Posted in UNIX-like

Tagged with

想法与执行力

without comments

今天翻了一下邮件的草稿箱,发现一封很久之前没有发送出去的邮件。

手持终端越来越强大,人们对资讯有着更高的要求,LBS服务我觉得以后会热。

现在的LBS服务(比如街旁)对于使用者是有一定的实惠(如拿折扣),但是实时性不够好。也许街旁这样的服务,完全可以成为一个广告平台,比如说商家在上面发布*当天的*优惠信息。

假如做这样的平台的话,我觉得对各个方面都是有好处的:
1. 服务提供商,信息处理成本不高,可以成为盈利途径;
2. 商家,以低廉的广告费用命中最有可能的客户;
3. 消费者,快速获取最有用的消费信息。

不知道街旁为什么没有这样做,也许他们是有想法,但是觉得用户群体还不够大,不急着收网;还有可能就是他们的销售推广实力有限(技术人员为主的创业型公司)。

当然在国内做这样的产品,风险其实也是很大的。一旦提升到“平台”二字,很难不被各位大佬盯上。

这邮件原来是准备发送到WIYA(全称就不写了)列表的,但是当时觉得自己调研得还不是特别的充分,所以最后没有发出去,后来就不了了之了。而我邮件里面提到的想法,现在已经是普遍实现了。

又想起了朋友之间想做的一个小项目,想法很多很不错。刚开始大家时间投入比较多,讨论也活跃,但是最终由于大家时间精力上的种种原因,没有能继续下去。

没有执行力,一切都是扯淡罢了!

只想不做,那只是在意淫罢了。大家都不是笨蛋,想法一定很多;世界上这么多人,好的想法也一定不少。但是为什么能把东西做好、把产品做成功、让人眼前一亮的公司不算很多呢?排除各种外部因素之外,团队执行力是很大的一个因素。有太多的好想法、好创意停留在纸上,最终要不就是不了了之,要不就是被人抢先一步。

我认为,纯粹的没有外界压力的技术创业,除非团队对于整个项目抱有近乎狂热的态度,否则是不会成功的。这样说来,要创业要不就是做一个自己很喜欢的东西,要不就是破釜沉舟净身出家不成功便成仁,这样执行力上才有相应的保证。

Written by liuw

April 2nd, 2011 at 10:34 am

Posted in 戏言