第一塊鋼板的故事是運輸機飛行員講的。在飛越駝峰航線支援中國抗戰時,美軍的運輸機隊常常遭到日軍戰斗機的偷襲。C-47運輸機只有一層鋁 皮,日軍的零式戰斗機在屁股后面緊追,一通機槍掃射,飛機上就是一串透明窟窿,有時子彈甚至能穿透飛行座椅,奪去飛行員的生命。情急之下,一些美軍飛行員 在座椅背后焊上一塊鋼板。實際上,在與日本飛機激戰時,中國空軍的飛行員早就用過這個辦法。就是靠著這塊鋼板,他們從日本飛機的火舌下奪回了自己的性命。
第二塊鋼板的故事來自一位將軍??催^好萊塢大片《拯救大兵瑞恩》的觀眾也許還記得,片中出現過一個死在滑翔機里的美國將軍。這是一段真實的 故事。諾曼底登陸中,美軍第101空降師副師長唐.普拉特準將乘坐滑翔機實施空降作戰。起飛前,有些人自作聰明,在機頭位置副師長的座位下裝上厚厚的鋼 板,用來防彈。但他們沒有想到,由于滑翔機自身沒有動力,與牽引的運輸機脫鉤后,必須保持平衡滑翔降落,而沉重的鋼板讓滑翔機頭重腳輕,一頭扎向地面,普 拉特準將也摔斷了脖子,成為美軍在D日陣亡的唯一將領。
第三塊鋼板的故事來自一位數學家。二戰后期,美軍對德國和日本法西斯展開了大規模戰略轟炸,每天都有成千架轟炸機呼嘯而去,返回時往往損失 慘重。美國空軍對此十分頭疼:如果要降低損失,就要往飛機上焊防彈鋼板;但如果整個飛機都焊上鋼板,速度航程載彈量什么都要受影響。
怎么辦?空軍請來數學家亞伯拉罕.沃爾德。沃爾德的方法十分簡單。他把統計表發給地勤技師,讓他們把飛機上彈洞的位置報上來,然后自己鋪開 一張大白紙,畫出飛機的輪廓,再把那些小窟窿一個個添上去。畫完之后大家一看,飛機渾身上下都是窟窿,只有飛行員座艙和尾翼兩個地方幾乎是空白。
沃爾德告訴大家:從數學家的眼光來看,這張圖明顯不符合概率分布的規律,而明顯違反規律的地方往往就是問題的關鍵。飛行員們一看就明白了: 如果座艙中彈,飛行員就完了;尾翼中彈,飛機失去平衡就要墜落——這兩處中彈,轟炸機多半就回不來了,難怪統計數據是一片空白。因此,結論很簡單:只需要 給這兩個部位焊上鋼板就行了。
第一塊鋼板是傳奇,機智的飛行員用它挽救了自己的生命,戰場上曾有過許多這樣的傳奇故事,但這種傳奇往往像火花一閃即逝;第二塊鋼板則是教 訓,是用寶貴的生命換回來的教訓,誰都知道焊鋼板的人也是好心,但結果卻完全相反;而第三塊鋼板是升華,它用科學的方法,從實戰經驗中提煉出規律,你可能 想像不到,這塊講科學的鋼板挽救了數以萬計的飛行員的生命。
小小的鋼板背后,凝聚著多少智慧和鮮血,值得每一位軍人去用心體會。一旦戰爭和你正面相對的時候,你準備把鋼板放在哪里?
trivial- rewrite(8) |
||||||
Network | -> | smtpd(8) | |
|
||
|
\ | |||||
Network | -> | qmqpd(8) | -> | cleanup(8) | -> | incoming |
|
/ | |||||
|
pickup(8) | <- | maildrop | |||
|
^ | |
|||||
Local | -> | sendmail(1) | -> | postdrop(1) |
trivial- rewrite(8) |
|
smtp(8) | -> | Network | ||||||
/ | ||||||||||
|
|
- | lmtp(8) | -> | Network | |||||
/ | ||||||||||
incoming | -> | active | -> | qmgr(8) | --- | local(8) | -> | File, command | ||
|
|
|
\ | |||||||
- | virtual(8) | -> | File | |||||||
|
deferred | |
\ | |||||||
|
pipe(8) | -> | Command |
public class TestThreadDaemonMethod {
/**
* @param args
*/
public static void main(String[] args) {
TestThread t = new TestThread("test thread");
//如果設置為false,那么在執行完后面的start方法后,jvm不會退出
t.setDaemon(false);
//如果設置為true,則執行完后面的start方法后,jvm會退出
t.setDaemon(true);
t.start();
//在start之后設置daemon會拋出異常
//t.setDaemon(true);
if (t.isDaemon()) {
System.out.println("test thread is a daemon.");
}
}
}
class TestThread extends Thread {
private String name;
public TestThread(String name) {
this.name = name;
}
/* (non-Javadoc)
* @see java.lang.Thread#run()
*/
public void run() {
while(true) {
System.out.println("running " + name);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Jetty具備以下特點:
。Jetty是最快的Servlet服務器之一
應用廣泛
。商業項目有IBM Tivoli, Sonic MQ and Cisco SESM等
可到Jetty網站 http://jetty.mortbay.org/jetty/ 查看最新信息
Jetty按照功能可以分為四個主個主要的部分,HttpServer, HttpContext,HttpHandler,HttpListener,詳見如下類圖:
<圖 1-1>
<圖 1-7 >
上圖展示了一個request的處理過程,首先HttpListener監聽到客戶端發來的請求創建一個HttpConnection實例(封裝了連接細節,比如從Socket連接中獲取的輸入流和輸出流), HttpConnection對象構建過程中會創建Jetty內部自定義的HttpRequest和HttpResponse對象,接著 HttpListener會調用這個HttpConnection實例的handle方法, HttpConnection實例就調用HttpRequest對象的read()方法讀取信息,調用HttpServer的service方法以 HttpRequest,HttpResponse為參數傳給HttpServer,HttpServer又將HttpRequest和 HttpResponse分發給相應的HttpCotext,HttpContext最后將HttpRequest和HttpResponse交給自身的 HttpHandler 處理,在這里HttpRequest,HttpResponse被再次封裝為ServletHttpRequest和 ServletHttpResponse,其實這兩個類實現了我們所熟知的HttpServletRequest和 HttpServletResponse接口。
1.HttpHandler:
SecurityHandler:提供基本的安全驗證
ForwardHandler:轉發一個request到另一個url
HttpListener & HttpServer:
HttpListener是所有監聽器類的接口,如圖中的SocketListener (基于傳統的Socket技術)就實現了該接口,Jetty還有其它的實現該接口類,如SocketChannelListener(基于NIO技術)類等,HttpListener職責主要是在服務器啟動后監聽相應端口的來自客戶端請求并建立連接(圖 1-1 中所示用HttpConnection封裝連接細節),監聽器可在同個IP上開啟多個端口為同一個HttpServer 進行監聽,所以HttpListener和HttpServer是多對一的關系,如下圖:
<圖 1-3 >
HttpContext & HttpHandler:
HttpContext相當于對應客戶端請求的URL或某個虛擬機, 其子類中包含若干個HttpHandler, 當接受到request(請求)時,HttpContext會依次(按某個預定的次序)把request交給這些HttpHandler處理,直到這個 request被標示處理過為止, 需要注意的是這個request可能被多個HttpHandler處理,但只能有一個HttpHandler能標示這個request已被處理過.
<圖 1-5 >
另外Jetty對多網卡(多個IP地址,不同的主機名)的服務器也提供了很好的支持,每個 HttpContext都有自身的HttpServer:
<圖 1-6 >
listener1.setHost(“www.app1.com”);//orListener1.setHost(“www.app2.com”)
listener2.setPort(80);
HttpContext context1 = new HttpContext();
context1.setContextPath(“/”);
server1.addContext(context1);
本文通過圖示簡要介紹了Jetty整個體系架構和主要的組件類及服務器的啟動執行過程,其實Jetty 通常被用來做為內嵌的Web Server來使用,一些常見的服務器軟件,如Apache Cocoon、JBoss ,JOnAs等都會采用Jetty作為Web解決方案;另外由于Jetty在性能及穩定性要優于同類HTTP Server的原因,Jetty已在國外已很流行,鑒于這一點,本文作者可以預測在不久的將來Jetty同樣也會在國內流行開來。
If you have not already, please read the README.
Important links on this page:
Short version for experts: Apply our kernel patch. Enable the new match option in Netfilter.
Check our kernel compatibility list to see if the Linux version you want to use has been tested.
Use the appropriate kernel patch from the "Layer 7 patches" package to patch[1] the kernel (read the README in the package to determine which patch to use). Set up your kernel as you would otherwise. Now enable the following options (these are correct for Linux 2.6.21.1, but they tend to move around a lot, so you may have to go hunting if you have a different kernel version):
Warning: Some users have reported kernel crashes when they using SMP with l7-filter. (Some have also reported that their SMP systems run fine.) If you have a multi-CPU machine, test carefully before putting it into production with l7-filter.
Compile and install the kernel as usual. (Our code may generate warnings about "initialization from incompatible pointer type", ignore them.) Reboot.
First read the README in the package "Layer 7 patches". Depending on your version of iptables, the instructions are different.
Use the appropriate iptables patch to to patch[1] iptables. Compile iptables, pointing it at your patched kernel source:
chmod +x extensions/.layer7-test
" (information about file permissions can't be contained in the patch)
make KERNEL_DIR=/path/to/patched/kernel_source
" (you must have configured your kernel source before this step)
make install KERNEL_DIR=/path/to/patched/kernel_source
" Don't use this version. There's no reason to and it's difficult to compile.
Copy libxt_layer7.c
and libxt_layer7.man
(from the subdirectory of the "Layer 7 patches" package that the README points you to) to the extensions/
directory of your iptables source. Then:
./configure --with-ksource=/path/to/patched/kernel_source
" (use the full path)
make
"
make install
" These files tell iptables and the kernel how protocol names correspond to regular expressions, e.g. "ftp" means "^220[\x09-\x0d -~]*ftp
".
Uncompress the "Protocol Definitions" package and make the resulting directory /etc/l7-protocols
.[2]
You should now be ready to actually do stuff.
There are three things you may be interested in doing: (1) blocking certain protocols (2) controlling bandwidth use (3) accounting. We cover each of these cases below.
First, a reminder: Just because you're using l7-filter, you don't need to do all of your packet classification using it. It's likely that what you want to accomplish can be at least partially done with less demanding classifiers, such as port matching. For instance, you can probably assume that traffic on TCP port 80 that isn't matched by any P2P patterns is HTTP; you don't need to actually use the HTTP pattern.
l7-filter uses the standard iptables extension syntax. (If you are not familiar with this, it's time to read the documentation at netfilter.org or at least "man iptables".)
iptables
[specify table & chain] -m layer7 --l7proto
[protocol name] -j
[action]
(Or, if you're just interested in accounting, omit "-j
[action]".)
For a list of valid protocol names, see the protocols page. You can also add your own protocols.
The only trick is that, in order to do its classification, l7-filter must be able to see all of the relevant traffic. It only sees packets if they go through an l7-filter rule. One way of ensuring this is to use the POSTROUTING
chain of the mangle
table:
iptables -t mangle -A POSTROUTING -m layer7 --l7proto
[etc.]
See this packet flow diagram for details. In some cases, l7-filter can sucessfully match even if it can only see one side of the connection, but in general, this won't work.
If you are using a version of l7-filter earlier than 2.7, you must manually load the ip_conntrack module kernel for l7-filter to work. Newer versions do this automatically.
Don't. Here's why:
Instead of dropping packets you don't like, we recommend using Linux QoS to restrict their bandwidth usage. If you insist on using l7-filter to drop packets, make sure you have investigated other options first, such as the features of your HTTP proxy (useful for worms).
To control the bandwidth that a protocol uses, you can use Netfilter to "mark" the packets and QoS to filter on that mark. To mark:
iptables -t mangle -A POSTROUTING -m layer7 --l7proto imap -j MARK --set-mark 3
The number "3" is arbitrary. It can be any integer. Then use tc
to filter on that mark (tc
is "traffic control", the userspace tool for Linux QoS, part of the iproute2 package):
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw flowid 1:3
Did you understand that last command? You can try reading The Linux Advanced Routing and Traffic Control HOWTO for enlightenment. You should do this so that you have some idea what you're doing, but unfortunately, tc
is incredibly obtuse and you're likely to wish you just had a canned script. Well, we can help:
These may need to be modified if your setup is significantly different than mine, but it should provide a much better starting point than most other things you are likely to find.
Be prudent when choosing the amount of bandwidth you allow each protocol. Restricting a protocol to an unusably low bandwidth can have similar consequences to blocking it.
If you just want to keep track of what's in use on your network, simply use the above command without any -j
option. For example:
iptables -t mangle -A POSTROUTING -m layer7 --l7proto imap
You can then get statistics by using iptables -L
. (See "man iptables" for details.)
Some protocols open child connections to transfer data. FTP is the most familiar example. If you have loaded the ip_conntrack_ftp
or nf_conntrack_ftp
kernel module, l7-filter will classify FTP and all its child connections as FTP. The same goes for IRC/IRC-DCC, etc.
If you wish to classify the children differently, use the standard iptables "helper" match. You can use "-m --helper ftp
" to match ftp child connections. Of course, once you've done this, it's silly to involve l7-filter, at least for the children.
l7-filter marks unmatched connections that it is still trying to match as "unset". The first few packets of all TCP connections as well as those of some UDP connections will match this. Similarly, l7-filter marks connections that it has given up trying to match as "unknown". These are matched just like normal protocols:
iptables -A FORWARD -m layer7 --l7proto unset
iptables -A FORWARD -m layer7 --l7proto unknown
The "unset" match is only supported by l7-filter 2.9 and up.
The protocol definitions are simple text files with a format described in the Pattern-HOWTO. They can be updated as a package or individually.
If you update the protocol definitions, you need to clear the relevant iptables rules and re-enter them. This is because the pattern files are only read by iptables, not directly by the kernel.
/proc/net/layer7_numpackets
. (i.e. "echo 16 > /proc/net/layer7_numpackets
".)
modprobe xt_layer7 maxdatalen=N
" (ipt_layer7
in old versions), where N
is in bytes. This should be used cautiously, since performance may decrease drastically with larger data sizes. To prevent you from accidentally bringing down your network, there is an artificial limit of 65536 imposed. If you're sure you know what you're doing, you can remove this limit by editing ipt_layer7.c or xt_layer7.c in the kernel source. tc
generates. A useful command is "tail -f /var/log/messages
". Please see the FAQ for more information.
After receiving a Ph.D. in computer science from MIT in 1979, Jeff joined IBM's Thomas J. Watson Research Center. During his tenure at IBM, he held a wide variety of technical and management positions, including vice president, Systems and Software Research, corporate vice president of technology, and general manager of IBM's SecureWay business unit, where he was responsible for IBM's security, directory, and networking software business.
Jeff then served as president of Bell Labs Research and Advanced Technologies, where he established new facilities in Ireland and India, and served as chairman of the board of the New Jersey Nanotechnology Consortium.
Most recently, Jeff served as the Executive Vice President and Chief Technology Officer for Novell. He was responsible for Novell's technology direction, as well as leading Novell's product business units.
Jeff was appointed by President Bill Clinton to serve on the Advisory Committee for the Presidential Commission for Critical Infrastructure Protection. He has also chaired the Chief Technology Officer group of the Computer Systems Policy Project, and has served on the National Research Council's Computer Science and Telecommunications Board. He is a Fellow of ACM and the IEEE.
Dr. Jaffe holds a BS in Mathematics and an MS in Electrical Engineering and Computer Science in addition to his Doctorate from the Massachusetts Institute of Technology.
在HTML中,form元素用
W3C的HTML 4.01 specification說,form元素的method屬性用來指定發送form的HTTP方法。 這可以簡單地理解為,get僅僅是拼接一個URI,然后直接向服務器請求數據(需要提交給服務器的數據集包含在URI中)。比如: 這個form在提交的時候,會產生這樣能夠一個get請求:FormGet.aspx?ProductID=1。 而post會把form的數據集,即ProductID=1這個鍵值對包裝在請求的body中,發送給服務器,然后向服務器請求數據。對于: 這樣一個form在提交時,我們將看到一個干凈的URI:FormPost.aspx。因為數據不是拼接在URI中。 如果用get提交一個驗證用戶名和密碼的form,一般認為是不安全的。因為用戶名和密碼將出現在URL上,進而出現在瀏覽器的歷史記錄中。顯然,在對安全性有要求的情況下,應該使用post。 HTML 4.01 specification指出,get只能向服務器發送ASCII字符,而post則可以發送整個ISO10646中的字符(如果同時指定
注意get和post對應的enctype屬性有區別。enctype有兩個值,默認值為application/x-www-form-urlencoded,而另一個值multipart/form-data只能用于post。 HTTP specification并沒有對URL長度進行限制,但是IE將請求的URL長度限制為2083個字符,從而限制了get提交的數據長度。測試表明如果URL超出這個限制,提交form時IE不會有任何響應。其它瀏覽器則沒有URL的長度限制,因此其它瀏覽器能通過get提交的數據長度僅受限于服務器的設置。 而對于post,因為提交的數據不在url中,所以通??梢院唵蔚卣J為數據長度限制僅受限于服務器的設置。 由于一個get得到的結果直接對應到一個URI,所以get的結果頁面有可能被瀏覽器緩存。而post一般則不能,參考5。 出于和上面相同的原因,我們可以用一個URI引用一個get的結果頁面,而post的結果則不能,所以必然不能被搜索引擎搜到。 在服務端的ASP.NET程序中,對于get,我們用Request.QueryString[control-name]來取得對應的=current-value;對于post,我們用Request.Form[control-name]。 我們也可以籠統地使用Request[control-name]。但這樣做的效率不如前者。我們可以用下面的程序比較Request.QueryString和Request的效率: 同樣的辦法我們可以比較Request.Form和Request。 最后得到的結果(Request.QueryString[control-name] / Request[control-name]和Request.Form[control-name] / Request[control-name])大多數時候是小于1的。因此,我們因該盡量用Request.QueryString或Request.Form來代替Request。 W3C的官方建議是:當且僅當form是冪等(idempotent)的時候,使用get。冪等是一個數學上的術語,其定義是:對于一個函數f : D -> D,如果D中的所有x滿足f (f x) = f x,那么這個函數是冪等的。HTTP specification(比如RFC 2616)中,將冪等解釋為:多次相同請求產生的副作用,和一次請求的副作用相同。 打個比方,如果你提交一個form會從Google上查詢一個關鍵詞,那么我們可以認為這個form是冪等的,因為1次提交和10次提交的副作用是差不多的(10次查詢可能會多消耗一些電能);如果你提交一個form是訂購一個終極大黃蜂(Utimate bumblebee),那么這就不是冪等的:要是你不小心多提交了1次form的話,你可能會被老婆亂罵,你不小心又提交了10次的話,你可能就破產了——一次提交和多次提交的副作用明顯不同,所以這不是冪等的。 所以,一般來說,如果提交這個請求純粹只是從服務端獲取數據而不進行其他操作,并且多次提交不會有明顯的副作用,應該使用get。比如: 如果提交這個請求會產生其它操作和影響,就應該使用post。比如: 另一個要考慮的因素是安全性。見2.1。1. get和post的定義
<input type="text" name="ProductID" value="1" />
<input type="submit" value="Get" />
</form>
<input type="text" name="ProductID" value="1" />
<input type="submit" value="Get" />
</form>
2. get和post的區別
2.1 安全性
2.2 編碼
2.3 提交的數據的長度
2.4 緩存
2.5 引用和SEO
3. 服務端的處理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_PreInit(object sender, EventArgs e)
{
if(Request["InputString"] != null)
{
int count = 1000000;
DateTime start;
DateTime end;
string value = "";
start = DateTime.Now;
for(int i = 0;i < count;i++)
{
value = Request.QueryString["InputString"];
}
end = DateTime.Now;
double requestGet = (end - start).TotalSeconds;
start = DateTime.Now;
for(int i = 0;i < count;i++)
{
value = Request["InputString"];
}
end = DateTime.Now;
double request = (end - start).TotalSeconds;
compare.InnerHtml = requestGet.ToString() + " / " + request.ToString() + " = " + (requestGet / request).ToString();
get.InnerHtml = value;
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Request.QueryString / Request</title>
</head>
<body>
<form method="get" action="FormGet.aspx">
<div>
<input type="text" name="InputString" /><input type="submit" value="Post" /><br />
Get: <span runat="server" id="get"></span><br />
Request.QueryString / Request: <span runat="server" id="compare"></span>
</div>
</form>
</body>
</html>
4. 正確地使用get和post
5. 瀏覽器差異
并且,在后退的過程中有可能出現“Page has Expired”(通常是向自己post,然后后退時):
微軟的技術支持人員號稱“this is not a bug or problem specified to the ASP.NET but a security feature of the IE Browser”,并且說“You can also inform your users of this”,實在是荒唐。另外,IE 7:和IE 6相同;
6. 參考
但是事情如果再復雜一點,就會有新鮮的現象了。如果船上的人算計一下,在這條船沉沒前,他們有足夠的時間安全抵達港口,危險屬于下一船乘客時,有很多人就會停下來安靜地欣賞海景了。
哪怕這條船在抵達港口前的確會沉沒一部分,比如灌滿一個叫“馬爾代夫”的船艙,其他艙室的人,基本上都會無動于衷。
更復雜的是,如果這艘船超重,需要乘客們把身上的金銀細軟拋下船的話,扯蛋就來了。窮人們說,富人錢多經得起糟蹋你先扔,至少得再扔40%;富人則說窮鬼你那堆破爛兒又沉又不值錢你先扔;窮人說我扔也可以但你富人得拿出年收入的0.5%-1%,即3000塊補償給我,還得教會我發財致富的秘訣,富人說你丫做白日夢吧老子已經一年白給你100塊了,多了別想,你救的不是我是你自己。
窮人說老子才剛坐這船沒兩天,你狗日富人坐好幾年了,生生把新船坐成了破船,現在多出點血是天經地義的;富人說以前天殺的知道這船是會坐破的,再說如果不是我們富人天天搗鼓這船,你這幫農民今天還在刨地球,能懂航海術、看西洋景?今天這船要沉了也是我們發現的,要不你們這幫賤人淹死了都不知道咋回事。
蛋還沒扯完,眼見船越來越漏的厲害。于是船客們聚到“日本房間”,窮人們靠著人多強行通過了一份《京都協議書》,要求富人趕緊扔東西,窮人卻可以不扔。最富的富人米利堅說,這是明顯的仇富嘛,天下哪有這道理,俺不玩了。窮人說你B一家最重,負擔就占了全船的近1/5,你不扔誰扔?米利堅說我的東西是最重,但也最值錢。俺以全船1/4的值錢物件才占了1/5的重量,憑啥我扔?你們看看那叫拆哪的窮鬼,以不到3%的價值也占了近1/5的負擔,為啥不讓他多扔?
黑眼睛黑頭發黃皮膚的拆哪一聽急了:窮兄弟們別聽他的,俺們可都是窮苦人家出身,你們要是把我推出來,以后你們中有人小偷小摸耍流氓誰罩著???好歹這船是大家的,你米利堅就是東西最多最重,這船也屬你坐的時間最長次數最多,看我干啥?憑啥?你憑啥?這最怕船沉的不是咱窮棒子是富人,他們經不起大規模人員傷亡。
為了盡快把蛋扯完,船客們最近又在一間叫“丹麥”的房間開了一個會。據最新消息,把蛋扯完的機會已經很渺茫。最重大的成果將是形成一份《哥本哈根共識》,這份有所有船客簽名的共識說:“我們都發現并且承認,這船在漏水,而且是會沉的。”
這份共識發表后,船客們紛紛接到恭喜電話,表揚他們表現出了高超的政治智慧,并且堅定地捍衛了國家利益。
FWD:轉發: 鬧騰的哥本哈根氣候會議-娛樂版昨天QQ的馬化騰到我們這邊來聊天,談到了創始人重視產品在企業成功的重要性。即使在QQ已經這么成功,市值近百億美金的今天,他還花很多時間在產品上。聽上去很簡單也很自然,但是我看到很多創始人做不到。
創業者要管的太多了,產品,市場,銷售,財務,技術,找人,炒人,公關。不可能每件事情都事必躬親,一定有些需要交給手下領頭。哪兩件最重要?我覺得是找人和產品。別的事都可能找到好的人代勞,但產品和找人不行。
找到一個好的人太關鍵了。我從前寫了很多:海龜還是土鱉?,招不到稱心的人怎么辦?,招怎么樣的人,今天就不多說了。只加一句:找什么樣的人,決定公司的文化,所以創業者是一定要自己做的。
找到好的人,可以一手代包市場,銷售,財務,技術,公關(找到好的人,能放心的把我的一個部門讓他管,知道他會管的比我更好時,感覺太好了?。a品是一個公司的靈魂。它需要融會貫通:從市場這邊了解目標用戶是誰和他們的需求,平衡銷售那邊經常和市場部不同的意見,與技術討論什么能做,什么不能做。其中有很多取舍,很多推動,不是創始人CEO,很難做好這個工作。另外,創始人應該是最了解用戶的需求的人,因為他創業的激情就來自于為用戶解決一個問題,增添一個價值。
做易趣時我產品放權太多。雖然我們那時的產品部很不錯,但沒有創始人每天的介入,他們的任務是不可能完成的。我給我們那時候2002年的產品打75分。2003年走了后,平臺遷移到eBay后,分數就慘不忍睹了。網站改個字需要九個禮拜,改個功能需要在總部排隊九個月。(這里的故事很長了,產品只是一部分,文化的變化更致命。以后有空和易趣那些老員工們應該一起寫本書。)
放眼世界上翹楚的產品,AMAZON,APPLE,NINTENDO,他們的CEO或創始人都是注重產品,不放權的瘋子。
上一篇創業,管哪個事情最重要?引起了一些有趣的爭議,關于產品還是市場重要。我覺得這個問題對創業者很關鍵,所以再來寫一篇。ha,這個月寫了兩篇,為前幾個月補過。
首先,問題不是說企業里哪個部門重要。一個企業的成功,是很多因素的乘法。乘法和加法不同:后者如有一個因素是零,對整體不一定有大影響,但前者里如果有個因素是零,結果是零 - 產品,市場做得再好,財務出問題,公司照樣死。當企業成功是乘法時,討論哪個部門重要,沒什么意義。比較有意義的問題是:創業者哪個比較可以放權,哪個需要自己抓。(謝謝keso幫我澄清too。)這個問題太重要了,因為我堅信一個初創的企業,最重要的資源是創始人的時間和精力。我們現在談的,是這個資源的分配問題。
第二,做產品,從來不是(或不應該是)空想的。我覺得產品部是公司最難的工作。它需要綜合權衡各個部門的要求。
a)市場:我們的現有用戶是這么樣的人?他們的需求是什么?我們的潛在用戶是誰?他們的需求是什么?很多時候,人(尤其是經理人)會太注重現有顧客,忽視潛在客戶。人也會太注重用戶能表達的需求(市場調查拿得到得),忽略用戶不知道怎么表達的需求(需要靠創業的自覺來發掘的)。
b)銷售:什么樣的產品賣得掉,容易銷售?在有些公司,市場和銷售的目標用戶是一樣的。在有些公司,用戶(主要用產品的人)和顧客(付錢的人)是不一樣的。如何滿足和權衡他們不同的需求?在易趣那時,用戶是買家,顧客是賣家,他們的需求往往不同,甚至相反。
c)技術:那些產品容易做,那些難做?如何取舍時間vs功能?技術部會經常說:市場部要的功能不可能做,或需要太久。有時技術部有個好點子,能做個眩的新功能,市場部不要。相信誰的判斷?
d)客服:用戶很多的反饋和問題,需要多重視?什么是1%的不重要的用戶提出來的,什么是我們的核心用戶的要求,或是潛在的核心用戶的問題(解決了這個問題,他就成了核心用戶)?
還有很多例子可舉。我的感覺是產品最最需要一個創始者以一個公司總體和長遠的發展為目標,權衡各個部門的利益和偏見(甚至慣性或惰性),最終以創始者的直覺做決定。
我觀察人的適應能力發現,越是在意別人的觀感,越會對自己沒有信心;越在意別人怎么想,越容易使自己的缺點變成嚴重負擔。我知道,人必須了解別人會怎么想,那是人際互動,彼此同理,交流情誼的基本心理過程,缺乏它,人會變得剛愎自用,少一點知人的靈嗅。但如果你太介意別人的想法,就會失去伸展自我的機會,那么這個心結將成為壓抑創意和破壞健康的元兇。
美國已逝的科學奇才費曼曾經說過一段自己的故事。他的妻子(他昵稱她貓咪)一向很開朗,總有玩不完的花招,增添生活中不少情趣,在朋友中傳為佳話。費曼在普林斯頓時,有一天接到一盒妻子寄來的鉛筆,上面接著金色的字:“理查親親!我愛你。貓咪。”
費曼覺得這禮物是很好,但是按上一句親昵的話,如果跟教授朋友討論問題,忘在別人桌子上,別人會怎么想呢?他不好意思用這些筆。可是當時物質缺乏,舍不得浪費,所以刮掉一枝鉛筆上的字來用。
第二天上午,費曼又收到一封妻子寄來的信,一開頭就寫著:“想把鉛筆上的名字刮掉嗎?這算什么?你難道不以擁有我的愛為榮嗎?”然后是大寫字體寫著:“你管別人怎么想。”這段話大大感動了費曼,后來他寫了一本書,記述著他們的感情、生活軼事和他自己在科學上的重大突破,就用“你管別人怎么想”當書名。
作為一位咨詢工作者,我很早就注意到:在意別人的評價,往往會在別人的逢迎夸獎中作出錯誤的決定,也會在別人的口誅筆伐中潰不成軍。這樣的人無法堅持自己的卓見和判斷。不過,更嚴重的是,太在意別人怎么想的人,心理壓力總是很大。他每天面對著十目所視、十手所指的壓力,總覺得別人時時刻刻都在注意自己的缺點或疏失。這使得一個人覺得退縮,失去積極主動的活力,當然連他的創意和主動性都會喪失。
這種畏縮是學習得來的,許多師長和父母經常對孩子說:“羞羞臉!你看別人會怎么想!”次數多了,就會養成孩子畏首畏尾的習慣。尤其在日常言行上,稍不恰當,就以別人會笑話來壓抑孩子、批判孩子,部會造成嚴重的心理困擾。你只能就事實去告知孩了不當之點,要求他改進,或幫助他建立新行為,但不能拿別人來批判他,而造成屈辱。
有一位兒童,他經常張著大嘴巴。父母親覺得不好看,就常常指責他:“你這模樣,別人都會笑話你的!”這孩子來作咨詢時,不留神還是張著日,但卻因為長期被批評壓抑而造成交友困難和懼學癥來尋求協助。另外有一個孩子,因為父母親常指責他功課不好,在親戚朋友面前毫不留情地數落他,以致不敢會見親友。
有一次,一位年輕人來找我咨詢:他患有口吃,尤其在眾人面前說話,舌頭更是打結。他回憶說,“我在初中時說話稍有口吃,老師要我多練習,所以常要我上臺講話。我越是在意口吃,口吃就越嚴重?,F在我在一家公司擔任行銷工作,常常為口吃而憂惱。上個星期,我向老板作演示文稿,簡直說不出話來,羞死了。”經過仔細了解,確定他不是生理因素,于是我說:
“你這個毛病我也沒辦法,除非你各實當位口吃的推銷員。”我接著仔細為他說明:
“要接受自己口吃的現實,毫無畏懼地表現自己是一位口吃的推銷員,然后培養一些你在業務工作上的優點,例如熱忱、信用、關懷等,把它結合成你的特殊性和個體。讓許多人知道你,在商界里反而能引起別人對你的矚目,化缺點為助力”我為他仔細解釋,目的是要構建一個全新的態度:他不再介意別人對他的看法。
他開始學習接納自己;坦然表現自己是一位有價值的口吃推銷員。他不再為口吃而煩心,口吃這件事就再也不構成障礙。經過幾個月,口吃的狀況真的紓緩下來。
人有一種矛盾意向,你越怕的事它就越成為困擾。反之你處之泰然,把它表現出來給別人去看看它有多厲害,卻反而減輕對癥狀。由此可知,越怕陽痿的人,越是勃不起來;越是處之泰然的,也就越不會產生毛病。越想隱藏自己的弱點,就越會構成焦慮和緊張,而強化了癥狀和困擾。
我們要有正確的教育理念:父母和師長當然要指正孩子的過錯,但不能因錯誤而羞辱他。我們應多發現孩子的優點,從而建立他的信心,不要處處挑剔其缺點,令其懼怕畏縮,更而造成心理上的困擾。請注意!了解別人會怎么想是正確的,但如果太在意別人怎么想,就會產生麻煩。
摘自張亞勤勞的新書《變革中的思索》,P231
1)洞察力 -- 對這個產業的洞察力。
之所以放在首位,我覺得這是方向性的,它決定了生產效率。
2)簡化問題的能力 -- 把一個很難的、大家看起來很復雜的概念,用簡單的語言表達出來。
技術出身的人,其實有一定優勢,因為他們有著畫圖的豐富經歷;而那些優秀的領導者,我發現了另一個共同的優點:經常使用生活中的比喻。
我多次接觸馬云、衛哲、陳天橋等人,他們很少使用晦澀的詞語、概念、術語來闡述自己的想法,相反倒是大量使用生活中的比喻,即便在公開演講中也比比皆是。
隨便舉幾個例子
- 用撒尿到江中來比喻精力分散;
- 用流行病的輸入性、原生性來解釋新、老員工對企業文化的影響;
- 用菜市場來比喻平臺,殺雞來類比平臺上的服務,很好地解釋‘產業生態圈’的種種現象;
PS:我也常用‘將錢存入銀行’來類比‘數據集中存貯’,從而打消客戶對SaaS數據安全性的擔憂
如果說第一種能力還有些天賦的因素的話,那這第二種能力我覺得完全是可以鍛煉出來的。
3)判斷能力 -- 大家都有不同的意見,這個能力考察你到底會選擇哪個。缺的不是辦法,缺的是選哪一個人的辦法。
這個能力其實還需要2個前提能力:團隊建設能力;勇于承擔。
- 選擇的前提是有多個辦法,由團隊/下屬來提供;要讓團隊中的人勇于提好建議、出好方法,自然需要很強的團隊建設。至今為止,我依然認為ALIBABA在這方面是最強的。
- 判斷的結果并不一定是十拿九穩、一本萬利(事實上這種好運很少,大部分情況是模棱兩可、讓人糾結),這時候挑戰領導者的其實是‘責任承擔、為結果負責’的勇氣。
作為領導者,與其說需要‘判斷能力’,不如說需要‘承擔與果敢’。
暴強回復:大嬸,即使你能把男人當狗使,但你敢把狗當男人使不?
2.變態樓主:男人你要李宇春還是章子怡?
暴強回復:一個公雞,一個野雞,都不選
3.變態樓主:通過海南礦泉水喝死人事件,
暴強回復:弱弱的問一下,QS是不是去死的意思?
4.變態樓主:一學生,成績年年倒數第一,常與人打架,
暴強回復:該生成績穩定,動手能力強。
5.說說中國的30分鐘新聞聯播。
暴強回復:有什么說的:前十分鐘,領導們很忙。中十分鐘,
6.變態樓主:都40多了還有許多事不明白該問誰?
暴強回復:外事問谷歌,內事問百度,房事問天涯!
7.變態樓主:奧運口號“同一個世界,同一個夢想!”
暴強回復:乖乖,麻將國粹無處不在,倒過來看居然是“
8.天*涯樓主:從來都覺得蝎子精是整部《西游記》
刻,可惡的悟空出現了……
天*涯回復12:唉,要是換好色的八戒出現就好了!
天*涯回復13:嗯,八戒出現了,這次改蝎子精不從了……
9.天*涯樓主:懷疑老婆紅杏出墻,但苦于沒證據……
天*涯回復:如果你沒本事做陳冠希,那就做謝霆峰吧
10.天*涯樓主:我們的GJ到底是法制還是人治?
天*涯沙發:不是法治,也不是人治,而是治人,
11.論壇樓主:該死的理發店把我頭剪壞了!大家出點損招,
論壇地下室:半夜三更,月黑風高,靜靜地、輕輕地,
12.論壇樓主:為什么生下的孩子要跟父親一個姓?
論壇沙發:因為取款機里吐出的錢歸插卡人所有。
13.王小丫跟陳章良結婚,請用四個字評論。
論壇回復:丫從良了!
14.論壇樓主:聽到一特好聽的歌,歌詞只記得是“一個芝麻糕,
論壇回復:你可知Macau,不是我真姓……-_-
15.天*涯樓主:請用一句話形容中國國家地震臺。
天*涯回復:事后諸葛亮,事前豬一樣!
16.樓主:我已經一年滴食未進了,還是活的好好的!MOP的網
回復:植物都會打字.汗!!!
17.天*涯樓主:
天*涯沙發:不是請謝霆鋒來唱歌了嗎?
18.中日韓三國難道非要采取敵視行為對待彼此,
沙發:不能!因為日 本人和中國人談得投機的時候,只有當話題是關于韓國人時;日 本人和韓國人談得投機的時候,只有當話題是關于中國人時;
19..LZ:你看我的頭像牛B么?
沙發:像。
20..樓主:想問問各位姐妹,BF和前女友一起買的東西,
沙發:庸人自擾!她的前男友你不也在用嗎?
21.天*涯樓主:據我考證,
的,然后就離開了。
天*涯回復:哦,謝謝樓主的解釋,
After Gentoo and Slackware, now is the time for Ubuntu removing XMMS packages from their repo. How SAD! And for those who still want XMMS installed in their Ubuntu, here is the tip.
This this is originally written by Sartek and modified by me
Update your packages list
sudo apt-get update
Now install build-essential
sudo apt-get install build-essential
Alright, now we need to install the XMMS’s dependencies
sudo apt-get install autotools-dev automake1.9 libtool gettext libasound2-dev libaudiofile-dev libgl1-mesa-dev libglib1.2-dev libgtk1.2-dev libesd0-dev libice-dev libmikmod2-dev libogg-dev libsm-dev libvorbis-dev libxxf86vm-dev libxml-dev libssl-dev
Now create a working directory and change into that directory
mkdir ~/build
cd ~/build
Download XMMS sources:
wget http://xmms.org/files/1.2.x/xmms-1.2.11.tar.gz
Extract the file and enter the extracted directory
tar xvf xmms-1.2.11.tar.gz
cd xmms-1.2.11/
Run configure with –prefix=/usr
./configure --prefix=/usr
In my case (Intel Pentium Core Duo), I’ve enable CFLAGS options for processor optimization
CFLAGS="-march=prescott -O2 -pipe -fomit-frame-pointer" ./configure --prefix=/usr --enable-gnutls=yes
You can simply use the command without the CFLAGS above, or if you want to optimize the pidgin to suit your processor, you can refer to Safe_Cflags page (Gentoo.. uhukk..)
Now compile it and install it
make
sudo make install
Now lets create the shortcut in your Gnome Menu
Right click on your Gnome Menu, and click on Edit Menu and follow these pictures:
Finish! now just simply remove your build (working) directory
一、基于于NAT的LVS的安裝與配置。 1. 硬件需求和網絡拓撲 ________ | | | 客戶端 | (互連網) |________| | (router) 202.99.59.1(director GW) | | (202.99.59.110)Virtual IP ____|_____ | | (控制器有兩塊網卡) | director | |__________| (192.168.10.254)DIP | -----------------+---------------- | | | RIP1 RIP2 RIPx ____________ ____________ ____________ |192.168.10.1| |192.168.10.2| |192.168.10.x| |realserver1 | |realserver2 | |realserverx | |____________| |____________| |____________|
2.下載軟件:
(1)、內核源代碼:需要下載2.4.23以后版本的內核源代碼。下載地址為http://www.kerner.org。本文中下載的內核源代為:linux-2.4.30.tar.bz2。
(2)、用戶配置工具ipvsadm,下載地址:http://www.linuxvirtualserver.org/software/ipvs.html。本文下載的是:http://www.linuxvirtualserver.org/software/kernel-2.4/ipvsadm-1.21-11.tar.gz
3.安裝軟件:
在director(控制器,202.99.59.110)上安裝支持LVS的內核和配置工具ipvsadm。
(1)、在內核配置時以下選項必須選:
Networking options ---> <*> Packet socket <*> Netlink device emulation [*] TCP/IP networking [*] IP: advanced router [*] Network packet filtering (replaces ipchains) IP: Netfilter Configuration ---> <*> Connection tracking (required for masq/NAT) <*> IP tables support (required for filtering/masq/NAT) <*> Full NAT <*> MASQUERADE target support IP: Virtual Server Configuration ---> <*> virtual server support (EXPERIMENTAL) (12) IPVS connection table size (the Nth power of 2) --- IPVS scheduler <M> round-robin scheduling <M> weighted round-robin scheduling <M> least-connection scheduling <M> weighted least-connection scheduling <M> locality-based least-connection scheduling <M> locality-based least-connection with replication scheduling <M> destination hashing scheduling <M> shortest expected delay scheduling <M> never queue scheduling
(2)、編譯和安裝內核
分別執行: make bzImage;make modules;make modules_install;然后編輯啟動配置文件,重新啟動系統,在啟動時選擇新的內核。
系統啟動后要確認內核是否支持ipvs,只需要執行下面的命令即可:grep ip_vs_init /boot/System.map
(3)、編譯和安裝ipvsadm
ln -s /usr/src/linux-2.4.30 /usr/src/linux tar -zxvf ipvsadm-1.21-11.tar.gz
cd ipvsadm-1.21-11
make all
make install
然后運行:ipvsadm --version命令,應該有下面的內容輸出:
ipvsadm v1.21 2004/02/23 (compiled with popt and IPVS v1.0.12)
4. 配置LVS
(1)、在202.99.59.110上:
echo "1" >/proc/sys/net/ipv4/ip_forward
echo "0" >/proc/sys/net/ipv4/conf/all/send_redirects
echo "0" >/proc/sys/net/ipv4/conf/default/send_redirects
echo "0" >/proc/sys/net/ipv4/conf/eth0/send_redirects
echo "0" >/proc/sys/net/ipv4/conf/eth1/send_redirects
清除ipvsadm表:
/sbin/ipvsadm -C
使用ipvsadm安裝LVS服務
#add http to VIP with rr sheduling
/sbin/ipvsadm -A -t 202.99.59.110:80 -s rr
增加第一臺realserver:
#forward http to realserver 192.168.10.1 using LVS-NAT (-m), with weight=1
/sbin/ipvsadm -a -t 202.99.59.110:80 -r 192.168.10.1:80 -m -w 1
增加第二臺realserver:
#forward http to realserver 192.168.10.2 using LVS-NAT (-m), with weight=1
/sbin/ipvsadm -a -t 202.99.59.110:80 -r 192.168.10.2:80 -m -w 1
(2)、realserver配置
在192.168.10.1(realserver1)和192.168.10.2(realserver2)上分別將其網關設置為192.168.10.254,并分別啟動apache服務。
在客戶端使用瀏覽器多次訪問:http://202.99.59.110/,然后再202.99.59.110上運行ipvsadm命令,應該有類似下面的輸出:
IP Virtual Server version 1.0.12 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 202.99.59.110:http rr -> 192.168.10.1:http Masq 1 0 33 -> 192.168.10.2:http Masq 1 0 33
從上面的結果可以看出,我們的LVS服務器已經成功運行。
二、基于直接路由(DR)的LVS的配置
1.硬件需求和網絡拓撲: ________ | | | 客戶端 | (互連網) |________| | (router) 202.99.59.1(director GW) | __________ | | | | (VIP=202.99.59.110, eth0:110) | director |---| (控制器有一塊網卡,且與realserver1和realserver2在同一網段) |__________| | DIP=202.99.59.109 (eth0) | ----------------------------------- | | RIP=202.99.59.108(eth0) RIP=202.99.59.107(eth0) (VIP=202.99.59.110, lo:0) (VIP=202.99.59.110, lo:0) ____________ ____________ | | | | |realserver1 | |realserver2 | |____________| |____________|
2.安裝軟件:
在director(202.99.59.109)上安裝上面的方法安裝內核和管理軟件。
3. 配置LVS
(1)、在202.99.59.109上:
修改內核運行參數,即修改/etc/sysctl.conf文件的內容如下: net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 1 net.ipv4.conf.default.send_redirects = 1 net.ipv4.conf.eth0.send_redirects = 1 然后執行下面的命令是對內核修改的參數立即生效: sysctl -p 配置VIP地址: /sbin/ifconfig eth0:0 202.99.59.110 broadcast 202.99.59.110 netmask 255.255.255.255 up /sbin/route add -host 202.99.59.110 dev eth0:0 清除ipvsadm表: /sbin/ipvsadm -C 使用ipvsadm安裝LVS服務: /sbin/ipvsadm -A -t 192.168.1.110:http -s rr 增加realserver: #forward http to realserver using direct routing with weight 1 /sbin/ipvsadm -a -t 192.168.1.110:http -r 192.168.1.12 -g -w 1 /sbin/ipvsadm -a -t 192.168.1.110:http -r 192.168.1.12 -g -w 1
(2)在realserver1(202.99.59.108)和realserver2(202.99.59.107)上做下面的設置。
修改內核運行參數,即修改/etc/sysctl.conf文件的內容如下: net.ipv4.ip_forward = 0 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 然后執行下面的命令是對內核修改的參數立即生效: sysctl -p 配置VIP地址: /sbin/ifconfig lo:0 202.99.59.110 broadcast 202.99.59.110 netmask 255.255.255.255 up /sbin/route add -host 202.99.59.110 dev lo:0p>在客戶端使用瀏覽器多次訪問:http://202.99.59.110/,然后再202.99.59.110上運行ipvsadm命令,應該有類似下面的輸出:
IP Virtual Server version 1.0.12 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.100.254:http rr -> 192.168.100.3:http Route 1 0 28 -> 192.168.100.2:http Route 1 0 29
從上面的結果可以看出,我們的LVS服務器已經成功運行。
在面的實例中ipvsadm用到的幾個參數含義如下:
-A 增加一個虛擬服務,該服務由協議、IP地址和端口號組成,例如:
-A -t 202.99.59.110:80 (增加一格虛擬服務,其協議(-t表示tcp,-u表示udp)為TCP、IP為202.99.59.110、端口號為80。
-s 指定服務采用的算法,常用的算法參數如下:
/sbin/ipvsadm -a -t 192.168.1.110:http -r 192.168.1.12 -g -w 1
-a 表示往一個服務內增加一個real server
-r 指定real server的IP地址
-w 表示權重
-g 表示使用DR方式,-m表示NAT方式,-i表示tunneling方式。