<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-20766593</atom:id><lastBuildDate>Sun, 11 Dec 2011 15:30:35 +0000</lastBuildDate><category>kuxun</category><category>screen</category><category>git</category><category>shell</category><category>php</category><category>rsa</category><category>deployment</category><category>ssh-agent</category><category>windows</category><category>dsa</category><category>irc</category><category>irssi</category><category>ssh</category><category>capistrano</category><title>白莲居</title><description>pkufranky's blog</description><link>http://pkufranky.blogspot.com/</link><managingEditor>noreply@blogger.com (pkufranky)</managingEditor><generator>Blogger</generator><openSearch:totalResults>48</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/blogspot/pkufranky" /><feedburner:info uri="blogspot/pkufranky" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-5695770975383852217</guid><pubDate>Wed, 05 May 2010 13:23:00 +0000</pubDate><atom:updated>2010-05-05T21:23:33.851+08:00</atom:updated><title>atlassian系列产品最简单的破解方法</title><description>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;div class="wiki-content"&gt;&lt;h2&gt;反编译atlassian-extras-&amp;lt;version&amp;gt;.jar&lt;/h2&gt;&lt;div class="table-wrap"&gt;&lt;table class="confluenceTable"&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;th class="confluenceTh"&gt;产品 &lt;/th&gt; &lt;th class="confluenceTh"&gt;atlassian-extras-&amp;lt;version&amp;gt;.jar所在目录 &lt;/th&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td class="confluenceTd"&gt;confluence &lt;/td&gt; &lt;td class="confluenceTd"&gt;&amp;lt;INSTALL_DIR&amp;gt;/confluence/WEB-INF/lib &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td class="confluenceTd"&gt;jira &lt;/td&gt; &lt;td class="confluenceTd"&gt;&amp;lt;INSTALL_DIR&amp;gt;/atlassian-jira/WEB-INF/lib  &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td class="confluenceTd"&gt;crowd &lt;/td&gt; &lt;td class="confluenceTd"&gt;&amp;lt;INSTALL_DIR/crowd-webapp/WEB-INF/lib &lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;也可在对应产品安装目录用如下命令查找&lt;br /&gt;
&lt;div class="code panel" style="border-width: 1px;"&gt;&lt;div class="codeContent panelContent"&gt;&lt;pre class="code-java"&gt;find . -name 'atlassian-extras*'
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;下面均假设该文件version为1.15，即atlassian-extras-1.15.jar，使用&lt;span class="nobr"&gt;&lt;a class="external-link" href="http://www.kpdus.com/jad.html#download" rel="nofollow"&gt;jad&lt;sup&gt;&lt;img align="absmiddle" alt="" border="0" class="rendericon" height="7" src="http://bear:8081/images/icons/linkext7.gif" width="7" /&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt;反编译&lt;br /&gt;
&lt;div class="code panel" style="border-width: 1px;"&gt;&lt;div class="codeContent panelContent"&gt;&lt;pre class="code-java"&gt;# 解压
jar xf atlassian-extras-1.15.jar
# 反编译所有x.class为x.java
jad -o -r -sjava 'com/**/*.class'
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=20766593" name="atlassian系列产品最简单的破解方法-修改源代码"&gt;&lt;/a&gt;修改源代码&lt;/h2&gt;给出个产品的patch &lt;br /&gt;
&lt;div class="code panel" style="border-width: 1px;"&gt;&lt;div class="codeHeader panelHeader" style="border-bottom-width: 1px;"&gt;&lt;b&gt;confluence  (atlassian-extras-1.15.jar)&lt;/b&gt;&lt;/div&gt;&lt;div class="codeContent 
panelContent"&gt;&lt;pre class="code-java"&gt;--- a/com/atlassian/license/applications/confluence/ConfluenceLicenseTypeStore.java
+++ b/com/atlassian/license/applications/confluence/ConfluenceLicenseTypeStore.java
@@ -44,11 +44,11 @@ &lt;span class="code-keyword"&gt;public&lt;/span&gt; class ConfluenceLicenseTypeStore &lt;span class="code-keyword"&gt;extends&lt;/span&gt; LicenseTypeStore
     }

     &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType ACADEMIC = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(16, &lt;span class="code-quote"&gt;"Confluence: Academic"&lt;/span&gt;, &lt;span class="code-keyword"&gt;false&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
-    &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType EVALUATION = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(32, &lt;span class="code-quote"&gt;"Confluence: Evaluation"&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
+    &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType EVALUATION = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(85, &lt;span class="code-quote"&gt;"Confluence: Evaluation"&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
     &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType TESTING = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(48, &lt;span class="code-quote"&gt;"Confluence: Testing"&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
     &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType HOSTED_EVALUATION = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(64, &lt;span class="code-quote"&gt;"Confluence: Hosted Evaluation"&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
     &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType NON_PROFIT = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(78, &lt;span class="code-quote"&gt;"Confluence: Non-Profit / Open Source"&lt;/span&gt;, &lt;span class="code-keyword"&gt;false&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
-    &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType FULL_LICENSE = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(85, &lt;span class="code-quote"&gt;"Confluence: Commercial Server"&lt;/span&gt;, &lt;span class="code-keyword"&gt;false&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
+    &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType FULL_LICENSE = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(32, &lt;span class="code-quote"&gt;"Confluence: Commercial Server"&lt;/span&gt;, &lt;span class="code-keyword"&gt;false&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code panel" style="border-width: 1px;"&gt;&lt;div class="codeHeader panelHeader" style="border-bottom-width: 1px;"&gt;&lt;b&gt;jira&lt;/b&gt;&lt;/div&gt;&lt;div class="codeContent panelContent"&gt;&lt;pre class="code-java"&gt;TBD
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="code panel" style="border-width: 1px;"&gt;&lt;div class="codeHeader panelHeader" style="border-bottom-width: 1px;"&gt;&lt;b&gt;crowd  (atlassian-extras-1.10.jar)&lt;/b&gt;&lt;/div&gt;&lt;div class="codeContent 
panelContent"&gt;&lt;pre class="code-java"&gt;--- a/com/atlassian/license/applications/crowd/CrowdLicenseTypeStore.java
+++ b/com/atlassian/license/applications/crowd/CrowdLicenseTypeStore.java
@@ -39,9 +39,9 @@ &lt;span class="code-keyword"&gt;public&lt;/span&gt; class CrowdLicenseTypeStore &lt;span class="code-keyword"&gt;extends&lt;/span&gt; LicenseTypeStore
     }

     &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType CROWD_ACADEMIC = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(601, &lt;span class="code-quote"&gt;"Crowd: Academic"&lt;/span&gt;, &lt;span class="code-keyword"&gt;false&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
-    &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType CROWD_COMMERCIAL = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(609, &lt;span class="code-quote"&gt;"Crowd: Commercial"&lt;/span&gt;, &lt;span class="code-keyword"&gt;false&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
+    &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType CROWD_COMMERCIAL = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(625, &lt;span class="code-quote"&gt;"Crowd: Commercial"&lt;/span&gt;, &lt;span class="code-keyword"&gt;false&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
     &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType CROWD_COMMUNITY = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(617, &lt;span class="code-quote"&gt;"Crowd: Community"&lt;/span&gt;, &lt;span class="code-keyword"&gt;false&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
-    &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType CROWD_EVALUATION = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(625, &lt;span class="code-quote"&gt;"Crowd: Evaluation"&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
+    &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType CROWD_EVALUATION = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(609, &lt;span class="code-quote"&gt;"Crowd: Evaluation"&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
     &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType CROWD_OPEN_SOURCE = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(633, &lt;span class="code-quote"&gt;"Crowd: Open Source"&lt;/span&gt;, &lt;span class="code-keyword"&gt;false&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
     &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType CROWD_DEVELOPER = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(641, &lt;span class="code-quote"&gt;"Crowd: Developer"&lt;/span&gt;, &lt;span class="code-keyword"&gt;false&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
     &lt;span class="code-keyword"&gt;public&lt;/span&gt; &lt;span class="code-keyword"&gt;static&lt;/span&gt; LicenseType CROWD_DEMONSTRATION = &lt;span class="code-keyword"&gt;new&lt;/span&gt; DefaultLicenseType(649, &lt;span class="code-quote"&gt;"Crowd: Demonstration"&lt;/span&gt;, &lt;span class="code-keyword"&gt;false&lt;/span&gt;, &lt;span class="code-keyword"&gt;true&lt;/span&gt;);
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h2&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=20766593" name="atlassian系列产品最简单的破解方法-编译，并覆盖jar包中的原文件，拷贝回原始目录"&gt;&lt;/a&gt;编译，并覆盖 jar包中的原文件，拷贝回原始目录&lt;/h2&gt;&lt;div class="code panel" style="border-width: 1px;"&gt;&lt;div class="codeHeader panelHeader" style="border-bottom-width: 1px;"&gt;&lt;b&gt;confluence&lt;/b&gt;&lt;/div&gt;&lt;div class="codeContent panelContent"&gt;&lt;pre class="code-java"&gt;CLASSPATH=atlassian-extras-1.15.jar javac com/atlassian/license/applications/confluence/ConfluenceLicenseTypeStore.java
jar -uf atlassian-extras-1.15.jar com/atlassian/license/applications/confluence/ConfluenceLicenseTypeStore.class
cp -fv atlassian-extras-1.15.jar &amp;lt;INSTALL_DIR&amp;gt;/confluence/WEB-INF/lib/
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="code panel" style="border-width: 1px;"&gt;&lt;div class="codeHeader panelHeader" style="border-bottom-width: 1px;"&gt;&lt;b&gt;crowd&lt;/b&gt;&lt;/div&gt;&lt;div class="codeContent panelContent"&gt;&lt;pre class="code-java"&gt;CLASSPATH=atlassian-extras-1.10.jar javac com/atlassian/license/applications/crowd/CrowdLicenseTypeStore.java
jar -uf atlassian-extras-1.10.jar com/atlassian/license/applications/crowd/CrowdLicenseTypeStore.class
cp -fv atlassian-extras-1.10.jar &amp;lt;INSTALL_DIR&amp;gt;/crowd-webapp/WEB-INF/lib/
&lt;/pre&gt;&lt;pre class="code-java"&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;fieldset class="hidden parameters"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;legend&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/legend&gt;&lt;/fieldset&gt;&lt;div class="pageSection" id="labels-section"&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="page view" id="content"&gt;&lt;div class="pageSection" id="labels-section"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-5695770975383852217?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/aCBtrjDtU2U/atlassian.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2010/05/atlassian.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-3817673216167497774</guid><pubDate>Wed, 05 May 2010 11:07:00 +0000</pubDate><atom:updated>2010-05-05T20:55:45.906+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">screen</category><category domain="http://www.blogger.com/atom/ns#">kuxun</category><title>使用screen实现多任务窗口的快速切换</title><description>&lt;div class="MsoNormal" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;Screen原来的一个用处是取代nohup，当终端关闭的时候，保证程序仍然能继续运行。但如今的linux kernel已经能够支持这个功能了。所以这里谈谈screen的另外的用途。&lt;br /&gt;
&lt;br /&gt;
我们可能需要同时进行多个任务，或者一个任务涉及多个模块，导致我们不得不开很多个securecrt的tab，或者频繁的切换目录。这样的工作其实会消耗大量的时间，特别是当tab比较多的时，找到想切换的tab还得费不少时间。而且tab的状态不方便持久保存，当重启机器之后，恢复之前的工作环境也要费不少时间。&lt;br /&gt;
&lt;br /&gt;
而采用securecrt tab，结合screen可以更方便的帮我们完成任务窗口的切换。更进一步，可以把vim的分窗口功能也用上。（其实screen还支持将屏幕分成上下2部分，每个部分显示不同的shell session，不过这个就暂不介绍了）&lt;br /&gt;
&lt;br /&gt;
为了大家有直观的印象，下面是我工作的一个截图。概括来讲，就是&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;ol&gt;&lt;li&gt;每个服务器一个securecrt tab (或多个tab)&lt;/li&gt;
&lt;li&gt;每个tab下运行screen (当然，若那个tab不需要多任务，就不需要screen)&lt;/li&gt;
&lt;li&gt;每个screen下多个screen window，如图中的php, ds, ts等等&lt;/li&gt;
&lt;li&gt;在一个screen window下面，起vim，vim也可以分屏成多个vim window&lt;/li&gt;
&lt;/ol&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt; &lt;img height="469" src="https://mail.google.com/mail/?ui=2&amp;amp;ik=ad368a243c&amp;amp;view=att&amp;amp;th=11d2d957dfcd170a&amp;amp;attid=0.0.1&amp;amp;disp=emb&amp;amp;zw" width="1098" /&gt;&lt;br /&gt;
不要觉得我夸张，这就是我一天的工作情况。大部分的tab和window，我每天都会用到。&lt;br /&gt;
&lt;br /&gt;
下面就讲讲screen的使用&lt;br /&gt;
1 下载&lt;a href="http://github.com/pkufranky/shellconf/blob/master/screenrc"&gt;screenrc&lt;/a&gt;存为$HOME/.screenrc，有了该配置文件，才会列出每个screen窗口的名字&lt;br /&gt;
2. 基本命令&lt;br /&gt;
启动一个screen: screen&lt;br /&gt;
给当前screen窗口起一个名字(如上面的php, ds): ctrl-a A&lt;br /&gt;
创建一个新的screen窗口: ctrl-a c&lt;br /&gt;
在screen窗口间切换: ctrl-a 0, ctrl-a 1, …, ctrl-a 9切换到对应序号的窗口，ctrl-a a 切换到之前访问的窗口&lt;br /&gt;
可以创建超过9个窗口，不过就不能用上面的方式切换到序号大于9的窗口了，但可以用ctrl-a n和ctrl-a p切换到下一个或上一个窗口&lt;br /&gt;
将screen切换到后台: ctrl-a z (类似于将普通程序切换到后台的ctrl-z，但在使用了screen的情况下，ctrl-z只会将当前screen窗口正在运行的程序切换到后台，而不会将screen本身切换到后台)，使用fg又可重新回到screen屏幕&lt;br /&gt;
锁定screen: ctrl-a x，需要输密码才能解锁&lt;br /&gt;
&lt;br /&gt;
假设你已经启动了screen，然后你的机器关闭了或你关闭了securecrt。没有关系，你的所有工作状态都完全保存在服务器。即使是你正在修改的没有保存的内容也不会丢失！&lt;br /&gt;
当你重新登陆回服务器后，使用下面的命令能看到有几个screen正运行在服务器上&lt;br /&gt;
$ screen -ls&lt;br /&gt;
There are screens on:&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;16668.pts-2.kooxoo146 &amp;nbsp; (Detached)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;9184.pts-3.kooxoo146 &amp;nbsp; &amp;nbsp;(Detached)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;30034.pts-19.kooxoo146 &amp;nbsp;(Detached)&lt;br /&gt;
&lt;br /&gt;
如果只有一个screen运行，使用screen –r就可切换回之前的工作状态&lt;br /&gt;
如果有多个screen运行，则使用如screen –r 166就可以切换到上面列出的第一个screen 16668.pts-2.kooxoo146 &amp;nbsp;(注意我没有使用完整的名字，使用能唯一标识的前几位就可以了)&lt;br /&gt;
&lt;br /&gt;
至于vim的分屏，这里就先不介绍了。&lt;br /&gt;
&lt;br /&gt;
另外找了篇介绍screen的文章&lt;br /&gt;
http://www.cnblogs.com/ppyyr/archive/2008/05/28/1208779.html&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-3817673216167497774?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/cCujgYEjy58/screen.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2010/05/screen.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-1689009887343944498</guid><pubDate>Wed, 03 Mar 2010 04:17:00 +0000</pubDate><atom:updated>2010-03-03T12:30:40.908+08:00</atom:updated><title>mysql utf8问题</title><description>see
&lt;a href="http://www.bluetwanger.de/blog/2006/11/20/mysql-and-utf-8-no-more-question-marks/"&gt;MySQL and UTF-8 — no more question marks!&lt;/a&gt;

使用securecrt登录服务器, 其appearance &gt; character encoding的值为utf8
服务器locale为utf8
&lt;pre class="code"&gt;
$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
&lt;/pre&gt;

/etc/mysql/my.cnf中的client和mysqld的default-character-set 均未设置，使用编译默认值 latin1

&lt;pre class="code"&gt;
$ mysql -utest  -e 'show variables like "%char%"'  
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
&lt;/pre&gt;

data.sql (文件编码为utf8)创建utf8编码的数据库和表并往其中插入中文数据
&lt;pre class="code"&gt;
$ cat data.sql
DROP DATABASE IF EXISTS test;
CREATE DATABASE test  DEFAULT CHARACTER SET utf8;
CREATE TABLE test.documents
(
      id             INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT,
      title           VARCHAR(255) NOT NULL
);
REPLACE INTO test.documents ( id, title) VALUES  ( 1,  '中' );

$ cat test0.sh
mysql -utest &lt;data.sql mysql="" utest="" test="" e="" select="" from="" sh="" title="" c3a4c2b8c2ad=""&gt;&lt;/data.sql&gt;&lt;/pre&gt;

hex(title)为存在数据库中的实际值的hex编码，无论编码怎么变化，它的值始终不变

插入
由于character_set_client为latin1，在data.sql中，"中"的字节流"E4B8AD"被解释为三个latin1字符，并转化为character_set_connection的编码(latin1，所以不用转换）传到服务器端，然后被转化为utf8(表的编码)存入数据库。在最后一步latin1到utf8的转换中, 每个拉丁字符被转换为utf8编码(ascii码大于127的拉丁字符的utf8编码均为2个字节)，如 E4 =&gt; C3A4，因此，最后是hex形式为C3A4C2B8C2AD的字节流存入了数据库。

查询:
utf8数据C3A4C2B8C2AD从数据库取出后，转为latin1(character_set_results) E4B8AD,再转为latin1(character_set_connection)传回客户端,再转为latin1(character_set_client)输出到屏幕。所以最后客户端输出的字节流hex形式是E4B8AD。由于终端是utf8编码，该字节流被显示为"中"

&lt;pre class="code"&gt;
$ cat test1.sh
( echo 'set character_set_client=utf8;' &amp;amp;&amp;amp; cat data.sql ) | mysql -utest
mysql -utest test -e 'select title, hex(title) from documents'

$ sh test1.sh
+-------+------------+
| title | hex(title) |
+-------+------------+
| ?     | 3F         |
+-------+------------+
&lt;/pre&gt;

插入:
由于character_set_client为utf8，在data.sql中，"中"的字节流"E4B8AD"被解释为一个utf8字符，并转化为character_set_connection的编码(latin1,转换失败,转换结果为3F）传到服务器端。之后过程同上，最后是hex形式为3F的字节流存入了数据库。

查询
同上，只是最后一步转为utf8输出到屏幕。但3f的utf8编码仍为3F，因此最终输出的字节流为"3F"，显示为"?"

&lt;pre class="code"&gt;
$ cat test2.sh
( echo 'set names utf8;' &amp;amp;&amp;amp; cat data.sql ) | mysql -utest
mysql -utest test -e 'select title, hex(title) from documents'

$ sh test2.sh
+-------+------------+
| title | hex(title) |
+-------+------------+
| ?     | E4B8AD     |
+-------+------------+
&lt;/pre&gt;

"set names utf8"将character_set_{client,connection,results}均设为utf8
插入:
整个路径全为utf8, 因此不用转换,最后hex形式为E4B8AD的字节流存入数据库

查询:
utf8流E4B8AD从数据库数据库取出，转换为latin1(character_set_results)，但转换失败，转换为3F，之后不用转换，最后输出到屏幕的流为3F，显示为"?"

&lt;pre class="code"&gt;
$ cat test3.sh
( echo 'set names utf8;' &amp;amp;&amp;amp; cat data.sql ) | mysql -utest
mysql -utest test -e 'set names utf8;select title, hex(title) from documents'

$ sh test3.sh
+-------+------------+
| title | hex(title) |
+-------+------------+
| 中   | E4B8AD     |
+-------+------------+
&lt;/pre&gt;

插入:
同上

查询:
整个过程不用转换，最后输出到屏幕的字节流是"E4B8AD"，显示为"中"

所以最后一种方案为推荐方案

类比
$ cat test.txt
中

字节流hex形式为E4B8AD

$ iconv -f latin1 -t utf8 test.txt
??-
$ iconv -f latin1 -t utf8 test.txt | od -t x1
0000000 c3 a4 c2 b8 c2 ad 0a
字节流hex形式为C3A4C2B8C2AD

或
在vim中
:e ++enc=latin1 test.txt
:set fenc=utf8
:w

三个latin1字符分别被转换为utf8字符, 字节流hex形式变为C3A4C2B8C2AD&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-1689009887343944498?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/euuUdEPWyLg/mysql-utf8-see-mysql-and-utf-8-no-more.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2010/03/mysql-utf8-see-mysql-and-utf-8-no-more.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-2614182301952878520</guid><pubDate>Sat, 27 Jun 2009 10:25:00 +0000</pubDate><atom:updated>2009-06-27T18:28:54.864+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">php</category><title>获取file_get_contents的状态码</title><description>使用$http_response_header这个全局变量
&lt;pre class="code"&gt;
if (false === file_get_contents('http://example.com')) {
    list($version,$status_code,$msg) = explode(' ',$http_response_header[0], 3);
}
&lt;/pre&gt;

参考&lt;a href="http://robert.arlesnet.com/2008/01/20/betwittered-php-and-file_get_contents/"&gt;BeTwittered, PHP and file_get_contents&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-2614182301952878520?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/E7mqBSaJoIA/filegetcontents.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>4</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2009/06/filegetcontents.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-939704769154069810</guid><pubDate>Sat, 27 Jun 2009 05:21:00 +0000</pubDate><atom:updated>2009-06-27T13:32:04.187+08:00</atom:updated><title>命令行创建桌面快捷方式</title><description>以下shortcut.bat脚本为脚本所在目录的QQ.exe生成桌面快捷方式
&lt;pre class="code"&gt;
Sub bat
 echo off &amp; cls
 pushd "%~dp0"
 echo create_shortcut
 start wscript -e:vbs "%~f0"
 popd
 Exit Sub
End Sub

Sub shortcut(name)
 Set WshShell = WScript.CreateObject("WScript.Shell")
 strCurrDir = WshShell.currentdirectory
 strDesktop = WshShell.SpecialFolders("Desktop")
 set oShellLink = WshShell.CreateShortcut(strDesktop &amp; "\" &amp; name &amp; ".lnk")
 oShellLink.TargetPath = strCurrDir &amp; "\" &amp; name &amp; ".exe"
 oShellLink.WindowStyle = 3
 oShellLink.IconLocation = oShellLink.TargetPath &amp; ", 0"
 oShellLink.Description = "快捷方式"
 oShellLink.WorkingDirectory = strCurrDir
 oShellLink.Save 
End Sub

shortcut "QQ"
&lt;/pre&gt;

参考
&lt;a href="http://www.cnblogs.com/gszhl/archive/2009/04/23/1441753.html"&gt;vb和dos批处理创建或生成快捷方式&lt;/a&gt;
&lt;a href="http://hi.baidu.com/licaiyi28/blog/item/8a2ebe95a248fe0c7bf48006.html"&gt;通过批处理创建桌面快捷方式.bat&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-939704769154069810?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/Mg54xtSabls/blog-post.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2009/06/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-8214126026480917983</guid><pubDate>Fri, 26 Jun 2009 08:48:00 +0000</pubDate><atom:updated>2009-06-26T16:52:17.063+08:00</atom:updated><title>GET参数长度限制导致的IE下的js错误</title><description>ajax请求发送客户端选中的数据到服务器端，发现当全选所有数据时，IE下报js错误，而firefox不报。当只选中部分数据时，IE和firefox均不报错。最后定位到问题在于使用了GET请求，而GET请求对参数的长度有限制，估计IE和firefox的这个长度定义不同，导致这个问题的出现。将请求改为POST后，一切正常了&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-8214126026480917983?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/QHUYEXhM22k/iejs.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2009/06/iejs.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-4296989702217471820</guid><pubDate>Wed, 29 Apr 2009 23:25:00 +0000</pubDate><atom:updated>2009-04-30T07:31:36.236+08:00</atom:updated><title>windir vs. SystemRoot</title><description>&lt;blockquote&gt;
%WinDir% is old dated environment variable for the Windows folder.
%SystemRoot% is the newer dated environment variable for the Windows folder.
%WinDir% remains in use, to allow batch scripts to run on both NT and 9x systems. If you use an NT command script, then %SystemRoot% would be more suitable to use.
I would expect all system environment variables to be available at the same time.

Windows NT and Windows 2000 do not have a Windows directory, so %WinDir% would have been strange? They have WinNT folders instead, which may have prompted the change?
&lt;/blockquote&gt;

&lt;blockquote&gt;
SYSTEMROOT = System returns the location of the Windows root directory. 
WINDIR = System returns the location of the OS directory.
&lt;/blockquote&gt;

&lt;blockquote&gt;
if you go to: My Computer / Properties / Advanced TAB
and click on 'Environment Variables' and scroll the lower window to the bottom,
you find 'windir'.

Double clicking this results in the windir variable having a value of '%systemroot%
leading me to believe %systemroot% is the 'basis' for this variable.
&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-4296989702217471820?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/sBTyUfkw2FA/windir-vs-systemroot.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2009/04/windir-vs-systemroot.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-9004599246956064569</guid><pubDate>Sat, 11 Apr 2009 09:09:00 +0000</pubDate><atom:updated>2009-04-11T17:25:09.012+08:00</atom:updated><title>关于透明SWF在firefox中不能输入中文</title><description>网上一篇文章谈的了这个问题

问题：一个SWF文件如果设置为透明属性，在Firefox中无法输入中文
如果不设置为透明属性，则因为SWF默认是顶级z-index，会挡住其他任何层
对于做弹出效果的页面来说，就是灾难

这个问题从05年甚至更早就有了
至今Firefox已经到了3，Flash Player也已经10了
可还是没有解决

而且是官方承认的bug
对于国外公司不重视中文使用者的做法表示抗议 :)

解决办法就是用js建立iframe来做弹出效果（没有办法的办法）
现在找到一个js库，没时间研究，先mark一下
连接地址是：
http://jquery.com/demo/thickbox/

另给一片关于flash wmode的文章
&lt;a href="http://www.communitymx.com/content/article.cfm?cid=E5141"&gt;Flash, DHTML Menus and Accessibility&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-9004599246956064569?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/IgxJAGV8qms/swffirefox.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2009/04/swffirefox.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-4150198037575394327</guid><pubDate>Sat, 28 Mar 2009 06:54:00 +0000</pubDate><atom:updated>2009-03-28T15:16:04.395+08:00</atom:updated><title>js实现将元素滚动到父容器顶部</title><description>&lt;pre class="code"&gt;
&amp;lt;div class="container" style="overflow:auto"&gt;
  &amp;lt;div class="item"&gt;item1&amp;lt;/div&gt;
  &amp;lt;div class="item"&gt;item2&amp;lt;/div&gt;
  &amp;lt;div class="item"&gt;item3&amp;lt;/div&gt;
&amp;lt;/div&gt;
&lt;/pre&gt;
对上面的布局，如果想将item2滚动到container顶部，可通过下面的jquery代码实现
&lt;pre class="code"&gt;
function scrollToElement(ele) {
    var $p = $(ele).parent();
    $p.get(0).scrollTop = $(ele).offset().top - $p.offset().top;
}
var curele = $('div.container .item:eq(1)').get(0);
scrollToElement(curele);
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-4150198037575394327?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/GwhyXiKf1UA/js.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2009/03/js.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-9125655038095964984</guid><pubDate>Sat, 28 Mar 2009 03:21:00 +0000</pubDate><atom:updated>2009-03-28T14:28:05.401+08:00</atom:updated><title>回车自动提交表单或禁用回车自动提交表单</title><description>不同浏览器对在input中按回车是否自动提交表单的处理都不一样
&lt;b&gt;chrome&lt;/b&gt;: 始终自动提交
&lt;b&gt;IE7&lt;/b&gt;: 仅当form中有image/submit input时候，才自动提交表单
&lt;b&gt;E6, firefox3&lt;/b&gt;:
当form中仅有一个text/password input （select的数量不限)时，自动提交
当有超过一个text/password input，但无submit/image input时，不会自动提交

如果想要对所有浏览器一致地启用回车提交表单，但又不想页面中有image/submit元素时（比如使用css来实现提交按钮时)，有两种办法 (IE6/7, firefox3, chrome中测试通过）
1. 使用不可见的submit input
&lt;pre&gt;&amp;lt;input type='submit' style='width:0;height:0;border:none;padding:0;font-size:0' /&amp;gt;&lt;/pre&gt;
注意使用style="display:none"是不行的，而使用style="visibility:false"会在页面中占据一个button的空白位置
2. 使用js为想要实现回车自动提交的input加上onkeydown事件，使用jquery的实现如下
&lt;pre class="code"&gt;
$(function(){
    $('input').keydown(function(e){
        if (e.keyCode == 13) {
            $(this).parents('form').submit();
            return false;
        }
    });
});
&lt;/pre&gt;
注意"return false"在IE中是必要的，否则会出现beep声，提示你"不该在这里按回车"

如果想要对所有浏览器一致的禁用回车自动提交，可以 (IE6/7, firefox3, chrome中测试通过）
&lt;pre class="code"&gt;
        $(':text,:password').keypress(function(e) {
            return e.keyCode !== 13;
        });
&lt;/pre&gt;
下面的代码也可以，不过不适用于有textarea的form (在textarea中不能回车)
&lt;pre class="code"&gt;
        $('form').keypress(function(e) {
            return e.keyCode !== 13;
        });
&lt;/pre&gt;

Reference:
&lt;a href="http://manfred.dschini.org/2007/09/20/submit-form-on-enter-key/"&gt;Submit Form on Enter Key&lt;/a&gt;
&lt;a href="http://www.thefutureoftheweb.com/blog/submit-a-form-in-ie-with-enter"&gt;Submit a Form in IE with Enter&lt;/a&gt;
&lt;a href="http://stackoverflow.com/questions/585396/how-to-prevent-enter-keypress-to-submit-a-web-form"&gt;How to prevent ENTER keypress to submit a web form?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-9125655038095964984?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/nagLOyRQacE/blog-post_28.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2009/03/blog-post_28.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-6542490286766168975</guid><pubDate>Mon, 23 Mar 2009 05:04:00 +0000</pubDate><atom:updated>2009-03-23T13:48:32.570+08:00</atom:updated><title>IE中查看js错误</title><description>在IE中报js错误时，虽然也给了错误的代码行数，但并没给出具体出错的文件。通过安装Windows Script Debugger和ComanionJS，能准确定位到出错的js并查看调用栈。具体步骤如下

1. 安装Windows Script Debugger, 微软主页上下载需要正版验证，可从&lt;a href="http://download.microsoft.com/download/7/7/d/77d8df05-6fbc-4718-a319-be14317a6811/scd10en.exe"&gt;这里&lt;/a&gt;下载.
2. 将 工具 &gt; Internet选项 &gt; 高级 中的 禁用脚本调试 两个选项设置为未选中状态
3. 安装&lt;a href="http://www.debugbar.com/download.php"&gt;DebugBar&lt;/a&gt;，需要穿墙，推荐使用无界
4. 安装&lt;a href="http://www.my-debugbar.com/wiki/CompanionJS/HomePage"&gt;CompanionJS&lt;/a&gt;
5. 重启IE

如果页面有js错误，会在页面左上角显示一个alert窗口，双击就可以定位到错误代码
&lt;img src="http://www.my-debugbar.com/wiki/uploads/CompanionJS/introducing-cjs.png" /&gt;


备注，
1. 除了Windows Script Debugger外，也可以装其他调试工具如Windows Script Editor等，见&lt;a href="http://www.jonathanboutelle.com/mt/archives/2006/01/howto_debug_jav.html"&gt;Scripting Debugging in Internet Explorer&lt;/a&gt;
只有装了其中某个调试工具后，IE中的 查看 栏里才会有"脚本调试工具"这个选项. 但我自己装了frontpage后，并没有Windows Script Editor，不知道是设置问题还是我使用的office安装程序有问题，只好换成了可独立安装的Windows Script Debugger.

2. 除了DebugBar和CompanionJS外，&lt;a href="http://www.debugbar.com/?langage=en"&gt;DebugBar&lt;/a&gt;公司的另一个工具&lt;a href="IETester"&gt;IETester&lt;/a&gt;也很好用，可同时测试IE5.5/6/7/8的渲染以及javascript引擎。
&lt;img src="http://www.my-debugbar.com/wiki/uploads/IETester/ietester-0.3.png" /&gt;

3. IE中还有很多其他方便的工具，我还没有一一试用，见&lt;a href="http://blogs.msdn.com/ie/archive/2007/06/22/from-microsoft-teched-2007-web-development-tools-for-internet-explorer.aspx"&gt;Web Development Tools for Internet Explorer&lt;/a&gt;

4. IE中常见的一个js错误是定义对象时不能有最后一个逗号（firefox可以有)，如
&lt;pre&gt;
var obj = {
  name: "ping",
  gender: 'male', //这里应该去掉','，否则IE报js错
};
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-6542490286766168975?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/0C4dEsQi-OQ/iejs.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2009/03/iejs.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-7626030059154446083</guid><pubDate>Tue, 10 Mar 2009 06:34:00 +0000</pubDate><atom:updated>2009-04-01T13:54:21.673+08:00</atom:updated><title>IE的安全设置</title><description>1. 直接的ip(包括127.0.0.1）以及域名(www.puppy.com)被视为internet, 机器名(puppy, localhost)被视为intranet
2. 若当"Allow script-initiated windows without size or position constraints"被disable, 则当弹出窗口位置非0,0时，window.resizeTo的行为不正常。（窗口的大小会因resize时窗口的位置不同而有所不同)
3. IE6有选项不允许禁用状态栏，IE7有选项不允许禁用地址栏和状态栏。具体见http://blogs.msdn.com/ie/archive/2006/08/25/719355.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-7626030059154446083?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/S4x7fjql6Kw/ie.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2009/03/ie.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-3347884481088776633</guid><pubDate>Mon, 19 Jan 2009 08:47:00 +0000</pubDate><atom:updated>2009-04-01T13:54:09.176+08:00</atom:updated><title>windows中的一些命令</title><description>命令行的详细帮助见http://technet.microsoft.com/en-us/library/cc723564.aspx
下面列出一些常用命令与用法

taskkill: kill进程， 如'taskkill /F /IM notepad.exe'
tasklist: list进程，如 'tasklist /FI "IMAGENAME eq notepad.exe"'
单行执行多个命令： cmd1 &amp;amp; cmd2
当上一个命令成功时，执行下一个命令: cmd1 &amp;amp;&amp;amp; cmd2

命令行修改Windows防火墙: netsh firewall
以下引自 http://blog.46com.com/article.asp?id=143
&lt;code&gt;
1.查看当前防火墙配置
netsh firewall show allowedprogram

2.打开远程桌面端口
netsh firewall set portopening TCP 3389 Enable

3.添加后门程序并允许连接网络
假如我们将后门程序植入到了C:\Program Files\Tencent\QQ\QQ.exe
命令：netsh firewall set allowedprogram C:\Program Files\Tencent\QQ\QQ.exe QQ Enable

4.添加特定IP地址到允许范围

比如目标机器已经开放了远程桌面，但我们仍然不能连接，则一般是由于管理员在远程桌面项目中限制了可用连接的范围。通过本命令就可以很容易的突破限制了。

netsh firewall set portopenting TCP 3389 远程桌面　Enable Custom 192.168.0.1
&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-3347884481088776633?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/jq5herQrRls/windows.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2009/01/windows.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-5391319248038802242</guid><pubDate>Tue, 13 Jan 2009 06:20:00 +0000</pubDate><atom:updated>2009-01-13T14:26:14.046+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">windows</category><category domain="http://www.blogger.com/atom/ns#">shell</category><title>windows command shell的批处理参数</title><description>最近要写windows的批处理脚本，但老是对其支持的参数和变量扩展搞得不清楚，终于在xp的帮助文件里找到了详细信息。作为备忘，贴出来。

其中最常用的是
%1 - %9 命令行参数
%0 命令路径
%× 所有命令行参数
%~dp0 命令所在目录

&lt;span style="font-weight:bold;"&gt;使用批处理参数&lt;/span&gt;

可以在批处理文件内的任何地方使用批处理参数，以提取有关环境设置的信息。

Cmd.exe 提供批处理参数扩展变量（%0 到 %9）。当在批处理文件中使用批处理参数时，%0 将由批处理文件名替换，而 %1 到 %9 将由在命令行键入的相应参数替换。要访问大于 %9 的参数，必须使用 shift 命令。有关 Shift 命令的详细信息，请参阅 Shift。%* 批处理参数是所有参数（不包括 %0）可引用的通配符，这些参数传递到批处理文件中。

例如，要将 Folder1 中的内容复制到 Folder2，其中 %1 和 %2 将分别由值 Folder1 和 Folder2 替换，请在批处理文件 Mybatch.bat 中键入如下内容：

xcopy %1\*.* %2

要运行该文件，请键入：

mybatch.bat C:\folder1 D:\folder2

这与在批处理文件中键入如下内容是等效的：

xcopy C:\folder1 \*.* D:\folder2 

也可以在批处理参数中使用编辑符。编辑符使用当前的驱动器和目录信息将批处理参数扩展为部分或完整的文件或目录名。要使用编辑符，请键入百分号 (%) 字符，后面是波形符号 (~) 字符，然后键入合适的编辑符（即 %~modifier）。

下表列出了可在扩展中使用的编辑符。

编辑符 说明 
%~1 扩展 %1 并删除任何引号 ("")。 
%~f1 将 %1 扩展到完全合格的路径名。 
%~d1 将 %1 扩展到驱动器盘符。  
%~p1 将 %1 扩展到路径。 
%~n1 将 %1 扩展到文件名。  
%~x1 将 %1 扩展到文件扩展名。 
%~s1 扩展的路径仅包含短名称。 
%~a1 将 %1 扩展到文件属性。 
%~t1 将 %1 扩展到文件日期/时间。 
%~z1 将 %1 扩展到文件大小。 
%~$PATH:1 搜索 PATH 环境变量中列出的目录，并将 %1 扩展到第一个找到的目录的完全合格名称。如果没有定义环境变量名称，或没有找到文件，则此编辑符扩展成空字符串。 

下表列出了可用于获取复杂结果的编辑符和限定符的可能组合情况：

编辑符 说明 
%~dp1 将 %1 扩展到驱动器盘符和路径。 
%~nx1 将 %1 扩展到文件名和扩展名。 
%~dp$PATH:1 在 PATH 环境变量列出的目录中搜索 %1，并扩展到第一个找到的目录的驱动器盘符和路径。 
%~ftza1 将 %1 扩展到类似 dir 的输出行。 

 注意

在上面的例子中，可以使用其它批处理参数替换 %1 和 PATH。 
%* 编辑符是唯一可代表在批处理文件中传递的所有参数的编辑符。不能将该编辑符与 %~ 编辑符组合使用。%~ 语法必须通过有效的参数值来终止。

不能以与使用环境变量相同的方式使用批处理参数。不能搜索或替换值，或检查子字符串。然而，可以将参数分配给环境变量，然后使用该环境变量。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-5391319248038802242?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/-CplBkoE61w/windows-command-shell.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2009/01/windows-command-shell.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-511185218846135618</guid><pubDate>Thu, 23 Oct 2008 12:48:00 +0000</pubDate><atom:updated>2008-10-24T10:30:56.841+08:00</atom:updated><title>要离开酷讯了</title><description>三个多月前那次准备离开，是带着稍许不平；那么这次真的离开，却是带着几分愧疚。我许诺过要再工作一年的，可如今却要食言了。

其实自那以后，从没想过要离开的，也拒绝了不少的机会。而这次的机会，一开始其实也是拒绝的，不过当同学将公司的背景与招聘要求给我看得时候，还是让我心动了。于是决定谈一谈。第二天（11月8日)面谈，了解了一些情况，有了初步的意向。于是第二天中午又去了一趟，这次相当于是面试吧。整个过程还算比较愉快，双方感觉都比较match。初创公司，需要技术比较全面的人，而我自己呢，正好对各方面技术都比较感兴趣，感觉在新的环境下也更能发挥所长。唯一让我有所犹豫的是待遇问题。所以我说要考虑考虑。

不过我本就没打算离开酷讯，觉得是无甚所谓，谈不拢也就算了。所以也就没再联系那边。对方后来表示可以再谈，所以第二周周五(10月16日)调休了一天假，又去了一次。这次是三个人面试我，之前面我的老总加上先我跳槽过来的两个google的员工。从前端到后端，问了不少问题，不过基本都能回答上来。

傍晚的时候，来了电话，说一定要招我。不过待遇上呢还是稍微有一点不满意。周日，终于达到了我的要求，用部分期权换了多一点工资。这下没什么可考虑的了，机会难得，待遇也不错，对不起原公司也没办法了。

时值互联网冬天，酷讯也刚裁了不少人。Leader和我谈的时候，说对我的离开有些意外。确实，是有些突然，本就不是在计划中的事情，也感觉有些过意不去。如果我能早点提出来离职，也许裁人就会留有缓冲余地。只能说时间不凑巧了。

做好交接，尽量分享自己的经验，干好最后两周，我能做的也只有这些了。


有些感伤，祝福酷讯……&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-511185218846135618?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/NDFeNDHRo6w/blog-post.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>1</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2008/10/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-251398870392026648</guid><pubDate>Wed, 16 Jul 2008 13:23:00 +0000</pubDate><atom:updated>2008-07-22T17:09:20.435+08:00</atom:updated><title>我办户口的经历</title><description>我办户口未遂的经历，算是我目前为止遇到的最背的一件事了。写下来留个纪念，也给后来者提个醒。

我开始决定留的公司无法从正规渠道给我解决户口，所以谈的结果是公司花钱，我自己想办法解决。其实自己本来对户口不是那么看重，但既然不用自己花钱，搞一个总是好的。

开始找户口是在1月份，在career_offer版找了好几个候选，分别发email或打电话，最终在月底的时候基本确定了意向。并赶在放寒假前，把材料准备齐全交给了对方，付了定金。在这个过程中，对方是非常小心，先检查各种证件，确认你确实是即将毕业学生且有购买意向，然后才开始和你真正进行交易。

整个过程越谨慎，越能让人相信其不是骗钱的，也越能保障双方的安全。但最后，问题却出在了他们内部，据说是内部有人举报。我不仅没办成户口，还倒赔了金钱。

大概5月初吧，人事局接收函下来了，落在朝阳区。公司先答应出1万五，户口下来再出另外一半。于是自己向同学借了部分钱，全款（3万8千）交齐了。

接下来就是等待毕业之后将户口迁过去了。然而事情并没有按预想那样发展。5月底的时候，对方先是打电话让我准备人事局可能的电话抽查，接着把钱全额退给了我，并让我准备公安局可能的调查，说得难听点就是串供了，就是让我咬定是走正常的招聘途径进去的。当时还抱着一点侥幸，事情应该没那么严重，过了这一关，户口还是能办成的。

6月7日下午，我毕业答辩的日子。当时我已经答辩完了。突然收到了就业中心老师打来的电话，说我的三方有点问题，叫我过去取回来。当时的情况当然不方便离开了，由于不知道还要多久才完，所以我商量着是否能改天过去。老师告诉我她第二天就要出差了，非得要我当天过去不可。也没多想，就说等答辩完了再过去。

谁知答辩的过程持续了很长时间，等都答辩完了，老师在里面讨论答辩结果却也迟迟不见结束。中间接到几次老师的催促电话。最后我实在没办法了，找了个同学替我去取，然后打了个电话告诉就业中心老师这个情况。说完之后，电话另一头经过短暂沉寂，突然换了声音，”我们是海淀区公安局的，有个情况需要你协助调查一下。……"。

我当即就知道怎么回事了，肯定是因为户口问题。他们倒是很有耐心，等了那么久。以老师名义叫我过去，是想让我不及准备，以便比较客观地了解事实吧。知道我不过去了，他们不得不站了出来。

我只好把我的同学叫了回来，他当时已经骑车在路上了。但我还是无法立即过去，我和他们商量我答辩一结束马上过去。然后，趁着剩余时间，赶快找了台电脑，了解给我办户口公司的情况，如地点，招聘的专业情况等。当时心里还是有点紧张的。

当我赶到就业办时，公安局的同志们已经等了2个多小时。他们直接告诉我公司里面某些人办户口的事已经暴露了，问我的情况。我当时还抱着侥幸心理，告诉了他们编造出来的整个经过招聘进去的过程。他们又问我认不认识某个人，我确实不认识，也就直说了。后来才知道他们问的那个人其实就是直接和我接头的那个人，但我在之前一直不知道他的名字。整个过程我所准备的那些东西根本就没用上，他们只是问些基本的情况而已。

原以为事情也就这样结束了，我也再不对户口报什么期望，。大概2周后，公安局却又一次电话了我，这次是直接让我过去了。大概是6月21日，下午四五点的样子，我去了公安局。在那里等了好久，然后是问话，一直折腾到晚上10点多才结束。这次我没办法隐瞒了，因为和我接头的那个人，已经被带着手铐，带到了我的面前。再一次在口供上签上了自己的名字，只不过和上次不同，这次是完全真实的情况。据公安局的人说，那个公司办理户口的好几个分支，就我们这组人，全部给假口供，其他组的同学都是问到的时候就说真话了。看来就我们这组串供了，大家都没能抵制住侥幸心理。

事情却还没有结束。7月底的时候，再一次收到了公安局的电话，告诉我我那买户口的钱，可能需要上交，让我做好准备。其时我已经离开了原来那家公司，进入了一家新的公司。因为户口没办好且人家已把钱全额归还的原因，那一万五千元我也退给了前公司。如果早知道钱要上交的事，或者如果对方没有把钱退给我，这一万五千元我是可以不必退回去的。

接到那个电话后，我也就心里稍微不爽了下，没太在意，毕竟只是可能嘛。10月份的时候，再一次收到电话，这次是来自市局的，真的要叫我交钱了。

我查了不少资料，却还是始终没想明白他们以什么理由要让我交钱。等到了豆各庄看守所那边后，告诉我的理由是：行贿，要没收赃款。oh，我行贿了，我还从来没想到过这个方面。我还能怎么办呢，只好交上带去的部分现金，并签了分期付款协定。

这个事情，算是搞得比较大了，从海淀区公安局，最终到了市局。中间涉及到了好多人。一些人坐牢了，罪名是买卖国家公文；而我们这些学生呢，在格外开恩下，则只被没收了行贿的赃款。

我一直没有告诉家里这件事，他们知道了，不得心疼死啊。

如今，我的户口还挂在学校，很快就得转回老家了。真是麻烦的事情。

也就在下周，我可能就得去交齐所有余款了，不过早已过了心疼期。花钱买个教训吧，很大的一个教训。

其实是两点教训

1. 没事别买什么户口，其实户口并不是那么重要。虽然是中国特色，但这确实是犯法的事。
2. 真要买的话，别找大公司。公司越大，越受关注，越容易出内部故障，危险系数也越大。

Update: 7月22日，请了一天假，去了一趟豆各庄，终于把这件事情了解了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-251398870392026648?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/SEWfCWNznRQ/blog-post_16.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2008/07/blog-post_16.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-5738975784085440966</guid><pubDate>Mon, 14 Jul 2008 14:22:00 +0000</pubDate><atom:updated>2008-07-15T00:12:45.668+08:00</atom:updated><title>我的电视情结</title><description>家里算是我们村里最早买电视的之一，记得那时放《霍元甲》，把电视放到屋外面，几乎整个村的人都跑过来了。我从那时起，就迷上了电视。经常边做作业，边看电视。那时啥都爱看，包括广告。经典的如《封神榜》，《剑神》，《飞花逐月》，《蜀山奇侠》和《新白娘子传奇》等，可是迷死了我。那时我竟然还喜欢看意甲，看川剧，现在可是从不看这些了。

为此我很喜欢去外婆家，因为她家的电视能收到录像台，成天放好多好多的录像。我也经常想去城里的姨婆或我幺公家玩，因为他们家里的电视能收好几个台，而我家里就只能看个四川台和遂宁台。

初中住校，我站在人家屋外面透过门缝看天蚕变，高中我中午放学飞奔回家看霹雳狂刀。堂姐买了vcd机，这让我着实兴奋了好一阵子。

到了大学，后来买了电脑。我知道了有个东西叫ftp，从上面可以拖下来好多电视剧。第一部是天地男儿，这是我看过的最好看的电视剧。20G的硬盘很快捉襟见肘，后来又买了刻录机。当时可是犹豫了好久，还是舍不得，最后和同学募资才终于买了一个。

从此一发不可收，我的业余时间都花在了下载资源，整理资源，刻录资源上面。虽然我也从中看过了不少优秀的电视剧，但到后来，收藏的乐趣替代了看电视剧的乐趣。我不仅收藏电视剧，还收藏动漫，漫画等等。收藏这些东西不仅要花精力，还要花金钱，但我可没钱呢。于是我开始为别人刻盘，以刻养刻。

我当时的bbs id是tvlover，还是小有一定名气的。我自己开了一个ftp，列出了所有我拥有的资源的目录，然后被当时非常火的天网ftp搜索引擎收录。大家能通过搜索发现我的资源目录，但都是空的，不能下载。怎么办呢，找我刻盘。我当时的资源收录得非常之全了，很多资源在互联网上稍纵即失，但我抓住那一瞬间把它下载下来了。很多人要骂我光给人看不给人下了，骂就骂呗。我没办法去开放下载，我基本一直在用机器，我的硬盘数据也没有备份，坏了就要哭了。

我的这一热情持续了一年多，直到大四上吧。期间我为别人刻了无数盘，然后把赚来的钱全数换成了光盘和硬盘，可还算盈亏平衡吧。

我毕业的时候，留下来的，除了书，就是那近1万张的光盘了。

当我基本退出这一市场的时候，我的ftp空目录模式却被人沿用下来。而且这些空目录的命名，以及目录里的简介和图片，基本都是从我那爬取得。如今，ftp模式已快消亡了，取而代之的是maze, bt, emule等p2p工具。

这期间不得不说我的霹雳情结。高中时我中午飞奔回家看的霹雳狂刀，放到最后变成闽南语了，之后电视台就停播了。这虽然是木偶戏（当时不知道叫布袋戏），但是情节非常精彩，一直让我忘不了。上大学以后，通过网络，我了解到霹雳狂刀只不过是整个霹雳布袋戏系列的一部而已。而这个系列剧，已经拍了近20年，1000多集，是台湾的代表文化之一。但刚开始网络上完全没有霹雳布袋戏的视频可看，我最多是从它的官方网站上下载部分片段来过过瘾。随后我找到根据其中一部改变的小说《霹雳异数》，也是非常精彩。

我一直对霹雳狂刀中的人物念念不忘，为此，bbs/qq上我有两个常切换的昵称，非凡公子与清香白莲。下面是这两个人物的出场诗，也常作为我的签名档，我非常之喜欢。

与生俱来人中首，
唯吾与天同齐寿。
两脚踢翻尘世浪，
一肩担尽古今愁。
啊哈哈哈……

半神半圣亦半仙，
全儒全道是全贤。
脑中真书藏万卷，
掌握文武半边天。

直到有一天，当我从某个ftp下载电视剧的时，竟然发现了一部霹雳剧。当时的兴奋之情无法言表，我当即和他的上传者"不知名"联系。聊天之后，发现竟然是我的老乡，同一个市的，有和我一样的看霹雳狂刀的经历。所不同的是我已经比他落后了，当时网络上已经存在大量的霹雳剧集了(如倚云听风论坛，还有一些私人ftp)，而我竟然不知道。

在他的引荐下，我开始疯狂的收集霹雳剧集。先是从论坛和私人ftp陆续下载回不少。然后通过购买来补缺。我舍不得买剧集的vcd，因为太多了。于是我叫人家压缩成rmvb后，让我下载，我付下载费用的方式，来完成我的收集。那个进度之慢，足足持续了好几个月，并跨越了一个春节。最终，我通过仅K级的速度，完成了我的下载。不过这只不过是补全了我所收集的几部而已。前面后面都还有很多部缺失。

于是我联系上另外一个买家，以vcd的形式购买了后面的一部分。而前面的部分，我打听到只有香港才的某人才有，他是托人在台湾将录像带翻录成vcd。经过多方联系，终于从他那先试买了一部，邮费可是老贵了。慢慢地，我收集齐了整个系列。整个过程历时可能有半年。

如今，在淘宝上已经能很轻易的买到所有霹雳剧集了。但我那个时候，要收集齐全可是相当不容易。回想那时的疯狂，是多么不可思议。

但霹雳剧集我至今还没看完，也好久没看了。最终发觉和电视一样，收集过程本身的乐趣远大于观看的乐趣。

工作之后，很少看电视了，也不复当时的疯狂。我最怕的事之一，就是搬家，那1万多张光盘，让我想想都怕。而让我心疼的事之一，还是那些光盘，因为很多盘可能已经报废了，而我的那些资源，也会随之流失。一直盼望硬盘降价，如今，基本已经降到原来光盘的价位了，可我已不复当时的毅力来把光盘的数据倒腾到硬盘上了。

唉，执着也不见得总是好的。高中前我执着于学习，大学我执着于收集，毕业后我执着于工作。

执着于学习让我考上了北大；执着于收集让我浪费了大量的时间，而收集的成果，却要慢慢离我远去；执着于工作得到了公司的认可，但最终导致的是内心的不平衡。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-5738975784085440966?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/mRdDLUi3RZ0/blog-post_2438.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2008/07/blog-post_2438.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-9047992912187891878</guid><pubDate>Sun, 13 Jul 2008 19:40:00 +0000</pubDate><atom:updated>2008-07-15T00:25:24.816+08:00</atom:updated><title>我如何考上北大的（2）</title><description>从小学到高中，我被问得最多的一个问题是：”介绍点学习经验吧“。我最怕回答这样的问题了，因为我实在总结不出一套经验来。如果要我说得话，那就是将学习当作一种乐趣，但这又算什么经验呢。但这实在就是我唯一的经验，我不仅将学习当作乐趣，而且是当作最大的乐趣。没事了干点啥呀，看点书，做点题呗。这就是我生活的真实写照。

但事实上如我前所说，我周末是从不学习的，或者说我回到家以后是从不学习的。因为我还有第二乐趣，就是看看电视。我的所有学习都发生在课堂上，即使在高中最紧张的日子，我也没有熬夜学习过，当然除了熬夜看电视了。

我能说的是，当你一心一意去做一件事时，效率以及效果真的能以倍数级增加。我一再强调自己并不聪明，这并不是谦虚。事实上，在参加各种竞赛时，我并不能如有的同学那样，取得很好的成绩。但高考考的并不是你如何如何的聪明，事实上当达到一定程度的智商之后，起决定因素的就是勤奋了。而对我来说，勤奋的原因不是因为有外在压力，而是因为发自内心的兴趣与热爱，这让我的勤奋达到了最优的结果。

大学几年下来，让我对上述认识有了更深的体会。我终于也体会到为什么中学时会有那么多人学习不进去了。初始的大学生活，我还是如高中般勤奋，因为我还是当学习为最大的乐趣。但自从买了电脑，并于之后迷上网络与电视剧之后，我开始了我的网络上收集小说与电视剧之旅。我把业余时间都投入了其中，学习虽然还不至于耽误，但和高中绝对是皆然不同的境界。因为那时学习已经不是我的第一兴趣了，而是变成了一项任务。

从那时开始，我能在很大程度上理解中学时那些沉迷于游戏或网络或玩耍的同学是一个什么样的状况了。要抵制这些诱惑，真不是那么容易做到的事情。我能够不受其影响，并不是我自制力有多强，只不过是因为我对那些诱惑根本不感兴趣而已。事实上当时学习是对我的第一大诱惑。

在初中毕业上高中之前，其实还有段小插曲。我的家境不富裕，初中毕业后有两条路，一条是上职业中学，一条是继续读高中，考大学。我的一些也很优秀的同学就因为家境原因选择了第一条路。而我呢，则在这两条路间徘徊。继续读高中家里还是能支付得起的，主要是担心以后无法支付大学的费用。我的英语老师听说了这个情况，准备组织起大家为我捐款。虽然最终没有接受捐款，但庆幸还是选择了读高中这条路。

我上大学的第一年，家里基本拿出了所有积蓄。还好我之后年年能拿到奖学金或助学金，没有让家里负担太多。

我是幸运的，因为我有好父母。虽然他们都没怎么读过书，但他们甘愿默默承受压力，一直支持我完成学业。这并不仅仅因为我成绩好，事实上我的很多成绩也不错的同龄人，就因为家里的原因，读完初中后就辍学了。我的弟弟成绩也不算好，但家里也一直支持他读书。虽然最后由于他自己不愿意读书的原因，走了职业中学的道路。

回首这一路，我没有特意去追求什么，没有立一定要怎么怎么样的目标，也没有体验过这样那样的压力。我只是快快乐乐的学习，然后一路通畅地走了过来。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-9047992912187891878?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/6E_ktGFeheg/2.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>1</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2008/07/2.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-3118018531443438447</guid><pubDate>Sun, 13 Jul 2008 17:31:00 +0000</pubDate><atom:updated>2008-07-14T03:40:27.408+08:00</atom:updated><title>我如何考上北大的（1）</title><description>我出身于农村，父母都是农民。父亲在城里打工，当时叫泥瓦匠，现在也可称为建筑工人吧。因此家境虽不富裕，但支持我们兄弟俩读书还是没有问题的。

我最初是非常不喜欢上学的，爷爷逼着我去学校，但我就是赖在路上不肯走。刚上幼儿园时也非常的笨，老是不会写"a"，最后被老师罚扫教室。我也就记得最初这两个情景了。具体什么时候喜欢上学习，已经没印象了，也许是一年级吧。反正喜欢上学习后成绩就保持班上一二名了。

我所就读的小学的条件并不是很好，老师一年几换，不过这并没怎么影响我的学习。我从小性格就比较内向，不大喜欢玩，除了有时打打”豆腐干“ 或”火柴皮“ (我那会非常流行的小孩的游戏)。除此之外，学习是我唯一的爱好，后来有了电视以后，电视成为我的另一爱好。但我有一传统，就是学习总是在教室，周末在家时基本不学习的，这一传统一直持续到高中。

五年级的时候，进了乡中心小学，成绩还是保持一二名。我一直觉得，这个和是否聪明没有关系，小学嘛，努力，细心就能取得好成绩。何况对把学习当作唯一乐趣的我来说，保持一二名也是自然的事情。

但小学成绩好并不能说明什么问题，最大的分水岭是在初中。我的人生在这个路口没有选择错误，这多亏了我的姨婆一家，特别是我的姨婆。小学毕业我考了应该还算是比较高的分数，不过再高的分数也无法直接进入市里面的中学。我最自然的选择是进入乡里面的中学。这个时候我姨婆一家，给了我很大的帮助，帮助我进入了遂宁市第二中学，虽然也交了一点跨校费。

姨婆以前是一乡中学的校长，他的大儿子正好在二中当老师，我因此就进入了二中，后来证明这是个相当明智的选择。父母和兄弟还在农村，我孤身一人来到市里，住入了学校，周末呢，则住在姨婆家里。我初中的三年，几乎每个周末都是在姨婆家度过的。其实算起来，姨婆和我的亲缘关系隔得还是比较远的，但她们一家对我的关怀与帮助，让我至今都感动不已。虽然孤身一人，但我从来没有离开家的感觉，这对我的学习与成长，起到了相当大帮助。

回到学习上来。初中伊始，成绩自然是跟不上那些从市区小学上来同学。第一次数学测验，有同学数学就考了100分，而我似乎也就80来分吧。还有就是英语，很多人小学就有很好的基础了，而我之前从没接触过。但我从没有因此而气馁，我感觉自己是报着一颗平常心在学习。我当时也基本没有想着自己会有多么多么优秀，该取得一个什么样的名次。

初入城市的我只觉得一切都是那么新奇。我还记得两件事情:

”皇冠灯那个灯好大好大，我终于可以看到是什么样子了“。其实不过是一堆小灯再罩个壳而已，但当时我根本无法想象。

”不要把那个东西叫电杠，要叫日光灯，不然人家会笑你的“

新奇过后就是学习了。不管基础如何，我对学习的热情从没衰减过。一个月后的考试，我成绩平平，那个数学考100分的同学获得了第一名。我觉得这是应该的，他一直都表现得那么聪明与优秀。我没想过自己该定什么目标，也许我就该这样的成绩吧，所以也没为此去特别努力过。我只是照着我自己的节奏去完成我的学习。不过期中考试的结果，就让我大吃一惊了，那位第一名的同学变成了年级的第二名，而我呢，突然就变成了年级的第一名。具体感受已经回忆不起来了，不过倒是记得那天给我戴了大红花。

随后的情况就和小学类似了，我和那位同学一直在一二名的位置切换。期间班主任老师给我的帮助是很大的，我为什么那么幸运，就遇上了当时最好的班主任。

初中会考，我考了691分（总分700），应该是全省的第二名。 不过这都是考仔细程度了，和聪明没什么关系。当时我政治考了100分，由此可见当时的考题多么的机械。这全是背出来的。当时能达到什么程度呢：我能把整本政治书给完全背下来，这还不算，你随便给个章节题目，我能立即在脑海里反应出是哪一页。整本书像是完全印在了我脑中似的。但这又有什么用呢，现在还不是完全忘光了。

高中放弃了去当时最好中学遂中的机会，而继续留在了二中，主要因为二中给我免了跨校费，且二中也并不比遂中差多少。高中的时候，父母为了照顾我，在城里租了房子，我也没有住校了。但每周末还是会到姨婆家吃顿团圆饭。

学习仍是一如既往的快乐。我没有要刻意去保持一二名的压力，只是按照自己的节奏，快乐的学习。虽然还常获一二名，但我无法总是保持小学和初中那样的优势了，有好几位的实力都比较接近，有时也会跃居我前，特别高三最后一段时间，大家可以说不相上下了。如果仅从最后几次考试看，也许我还差一点。

报志愿的时候，在北大与清华之间，我选择了北大。当时志愿完全是我自己做主报的。我并没有北大情节，选北大的原因只是因为头年北大的录取分数比清华高，我猜测我那年会调过来。最后的情况正如我所料，报清华我就上不了计算机系了。而我报北大也没什么犹豫，不是因为我觉得自己肯定能考上，事实上我是没多少把握的。我们学校一年能有一个人考上北大或清华就很不错了，而我与其他几个相比并不占优势。我没犹豫是因为我觉得总要试一下，考不上第二志愿电子科大我认为还是不错的。

最后，我们前三名有两名报了北大，一名报了清华。但奇迹没有发生，最终，只有我考出了理想的分数。而另外两名，分别去了四川大学与电子科技大学。事实上，当我拿到666这样的分数时候，我自己都有些吃惊，自然是觉得考高了。考完之后，我自己并没认真的估过分，似乎比我预想的结果多了20多分。

我什么就我考出了好分数呢，无无法回答。但我考前的心态是非常放松的，考前的下午，我还躲在书店看了半天的小说。然后考试时每天早上起来，先去爬一下家后面的山，在上面极目远眺一刻钟。我并没有很高的心理素质，比如我无法很好应付突然而来的压力。但也许我的考试素质比较好吧，或者说我并没有将考试当个什么样大的事情，即使是高考。一切以平常心对待，也许这就是答案吧。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-3118018531443438447?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/NoL6ELetkM8/1.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2008/07/1.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-6315781439341778586</guid><pubDate>Sun, 13 Jul 2008 17:29:00 +0000</pubDate><atom:updated>2008-07-21T17:04:44.289+08:00</atom:updated><title>酷讯工作感言</title><description>我2007年7月9号正式入职。第一次来酷讯面intern时，还是在华清嘉园那栋挤得不行的小房子里，如今搬入了财智大厦，环境好多了。我也很快体会出了酷讯和我之前那个公司的区别，这边还是正规多了。

我发觉酷讯的工作正是我所期望的，我因此工作得非常愉快，比读研那会可愉快多了。读研时，在实验室，有时要写proposal之类，这个可让我有点头痛。再后来，要在公司与实验室之间两头跑，而我并不善于分心同时做两件事，因此也感觉并不轻松。而进入酷讯之后，我所需要想着的就只有一件事情了，怎样把事情做好。这里即使并发着多个任务，但因为是同类的，并不会让我有分心两顾的感觉。

所以我并没有把工作当成工作来看待，而是看成在做一件很感兴趣的事情，而且还有报酬可拿。这期间，我经常加班，有时就睡公司了，虽然没加班费，但我并没觉得有什么问题。因为我觉得是在做自己感兴趣的事情，且能学到很多的东西。我把做的每一件事情都当成是一个学习的过程，一个提高自己的机会。我喜欢追求完美，将代码写至完美的感觉真的是很好的。交给我的只写一行代码的任务，可能我也需要加班来完成，因为我可不想堆砌代码，有必要的话，我会将代码先重构，有时这可是个不小的任务。

我坚信这是我的优点，虽然我多花了精力，但我真的能学到东西，哪怕是最简单的事情。把做事情当作完成任务，或当作一种学习进步的过程，是两种真的完全不同的体验，当然有会有两种完全不同的收获。

第一季度我评上了酷讯优秀员工，当时我写的自我评价，我想是非常恰当的。

代码重写十遍而不厌
一份代码，10分收获
工具研究整天而不烦
用好工具，做经常事
宁静中致远，学习中进步
专注兴趣，追求完美

但随着接触的东西越来越多，慢慢发现很多的问题，代码质量不如想象的好，版本管理的不足，程序编译部署的过程太繁琐，等等。对于追求完美的我来说，真是如哽在喉，不吐不快。在公司发起过几次邮件论战，但马上发现没什么实际意义。论战过去就过去了，没多少实际推动作用。

但我自己实在无法对这样的情况视而不见。期间学习了分布式版本管理工具git，也恰遇公司公司代码，部署环境分离的契机，我终于能够对自己所负责栏目的代码做大的改革。

有了git这个称手的工具，我先从Makefile入手，重写各个模块的Makefile，并重整了整个目录结构。乘机也和另一位同事一起解决了Crawler与Extractor的依赖问题，这个问题之前大家讨论过多次，但总是这样那样顾虑，没法落实。有时这样的效率真让我无法容忍，其实最终我们就花了1个小时左右就完全解决问题了。

接下来是测试，部署的简化。我搭建自己栏目的标准测试环境，将各个子栏目的配置文件分离。最后实现了上线的完全自动化。

但测试，上线的流程还是让我不满意，需要email填送测单，纸质上线单，走大量的流程。时间在这些过程中被大量浪费了。还有当时公司用TestDirector来作为bug管理工具，我感觉用得不是很好。其实当时引入TestDirector的时候，我就问过有没有做过调研，为什么要选在TD。当时我就问过是否考虑下jira，但当时刚入公司，人微言轻。最终还是用了TD，估计只是因为测试经理对这个比较有经验。

TD沦为只是测试人员报告bug的工具，开发人员很少关注，这有违引入的初衷。也许可以用得更好，但我心里一直抵制，不愿去用它。我这人性格就这样，当我发现有更好的工具时，我就不愿意去用差一点的工具。做什么事之前，我都喜欢花大量精力去调研最好的工具。在这一点上，我发现有时和周围有些格格不入。

契机出现在技术总监兼职代理我们组leader的时候。他确实是个非常善于管理的人才。决定从我们组开始，试用项目管理工具了。我当然马上推荐jira了，这是我在之前的公司经过调研所选择的我认为最优秀的issue tracker的软件，当然还有与他配套的最棒的wiki软件confluence。最终如我所愿。当然最初他只是想用jira来管理项目进度，但我可不这么想，我已经在想象如何把TestDirector替换掉了。

最终, jira取代了TestDirector，不仅用来做项目管理分配Task，也用来管理bug，这两者本来也没什么明确界限。

然后，我考虑改进测试上线的流程，花了好长的时间，在jira上实现了一套测试上线的工作流，完全抛弃了纸质上线单。最后，我所喜爱的confluence，也在公司用起来了。

这下，我终于有了一点完美的感觉，我可以用自己认为完美的工具，将从产品设计开始，到开发，测试直至最终上线的整个流程串起来的。当然，这最终的功劳还是属于咱的技术总监的，我可没那么大的执行力，不过我至少还是起了不小的技术推动作用。

如今整个流程是这样的：

1. 产品人员，研发讨论，idea，MRD，记录打wiki (confluence) 上
2. 需求完全确定后，通过issule tracker (jira)分配任务给研发人员
3. 研发人员进行开发，借助git实现版本的迭代以及相互的协作，通过仅敲一次make实现最简化的编译
4. 研发通过一次简单的git push操作，将测试代码push到测试环境
5. 研发在jira上建立测试任务。测试人员认领任务，测试通过。
6. 研发在jira上建立上线任务，各相关人员在jira上进行approve (代替在上线单上签字)
7. 研发在测试环境执行上线。也只需简单的一个命令，将测试环境的代码完全同步到线上环境
8. 测试人员回归测试，测试通过

如果说这个过程还有什么不完美的地方，那就是缺少code review，可惜现在的code review软件如crucible, review board等，对git的支持都还不够。

这期间，我对git的研究，达到了狂热的地步。我几乎每天关注git的mail list,也给它贡献了部分代码。git expert的称呼绝对不过分。

这期间当然也收获良多，付出的嘛，当然是无数的加班了。

但是，回首一年的工作，我能拿得出手的也就这些，而且基本都不是本职工作，也没有完全在整个公司推广开来。我的本职工作呢，基本都是代码的小修小补，今天加个广告，明天换个链接。偶尔也做个小模块，但我觉得都不值得提及。这个不得不说是我最大的遗憾。

如果说刚开始还能从这些小修小补里面学到东西，我感觉现在只能算作机械劳作了。我的工作是完全可替代的，找个人来稍微培训下就可以了。再来薪资也谈得不如意，感觉工作的热情也受到了压抑。

自从谈了工资问题后，发觉心态变了。工作中开始计较付出与回报。虽然我相信还是不会比任何人干得差，但也不会比他们好多少了。这个是我所不能接受的，于是，有了换个环境的想法。

我没有海投简历，甚至就没主动投过简历。只是适逢一师弟介绍的soso的机会，去面试了一下。这个面试可比我想象的长多了，总共面了7个人了，4个技术，技术副总，技术总裁，HR。正常情况可是不需要这么多面试的。只不过是因为我初始去面试的是他们的产品部门，面试了才发现那个部门需要的是类似php的开发工程师，一堆php, js的题目。酷讯磨练的结果是前端，后端的技术都掌握得还不错，所以前端自然没有面倒我了。不过工资当然是谈不拢了，前端开发人员的工资是开不了那么高的。在拒绝offer的几天之后，HR又安排给补了一轮研究院技术的面试。这个也没多大问题，技术方面的问题自认都答的不错，至于其他方面的问题嘛，我不喜欢也不会拐弯抹角，想什么就说什么了。最后似乎还有轮电话面试，等消息中。

期间问得做多的非技术问题就是“为什么离开原来公司了"，最让我印象深刻的问题就是最后技术总裁的问题，这个我还是很佩服的，我感觉他不是从腾讯公司的角度，而是以我师兄的角度在问我是否真的想清楚了。

“你既然选择了创业公司，选择了和大家一起奋斗，去完成一件高风险高收益的事业，那么是否值得为这一点点的工资，这一点点心中的不平衡而选择离开?”。

“你觉得没拿到你所期望的工资是因为公司认为你并不如你自己所想那般优秀呢，还是因为公司的困难或薪资结构方面的原因？"

"你是否因为公司暂时的一点困难，而选择在这个时候离开它？“

有的问题我自己也说不准，有的问题我自己从来没这样去考虑过。即使已工作一年的我，在这些方面仍然还是有一些执拗。不管最终原因是什么，如果无法消除这种让我无法全力工作的心态，离开对我也许是最好的选择。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-6315781439341778586?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/VBn7bKWgy-0/blog-post_14.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2008/07/blog-post_14.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-884184890210122901</guid><pubDate>Sat, 12 Jul 2008 17:58:00 +0000</pubDate><atom:updated>2008-07-15T00:25:44.726+08:00</atom:updated><title>我找工作的过程</title><description>第一份实习是在IBM CRL，从05年10月持续到06年9月，期间并行的是在清华的网格项目。这让我如今都还感觉对不起清华那个项目，本来自己应该能做得更好的，但两边奔跑的结果导致我无法分心同时做好两件事情。

IBM的经历让我明白了一点，IBM不适合我。我可以在里面做个非常优秀的intern，但估计很难成为一个优秀的员工。成天想idea，成天写ppt的工作，我觉得自己无法干得很好。我还是喜欢踏踏实实coding，并且希望能看到自己coding的结果能在实际中被用上。

期间一件让我很遗憾的事情是google招intern的笔试，我不知道自己到底是因为笔试没过还是因为手机欠费了，总之是没有收到面试通知。不过现在回想起来，我笔试做得并不是很好，我应该稍微做点准备的。

由于觉得IBM不适合我，我于9月终止了在IBM的实习。在8月的时候，我本来是打算去酷讯实习的，当时酷讯已拿到了200万$的融资，才刚起步。令我羞愧至死的是，我竟然没有通过酷讯的面试。虽然有的题目我觉得很变态，如AVL树的插入，删除。一年前我做数据结构助教的时候，还特地帮张老师画了AVL的左旋转之类的ppt动画。但一年后我已经彻底将其忘记了，就是无法将如何旋转在脑中建模。只要让我瞄一眼书中AVL树的图，我想自己就能答上来。最致命的是，关于循环链表如何表示空和满的情况，我竟然都没答好。自从读研之后，没怎么用过数据结构，细节的遗忘让我到了吃惊的地步。

这就是我的第一次面试，本来认为小菜一碟的面试，结果却一塌糊涂。其实我只需要半天的时间，就足以把数据结构重新读过一遍了。之后同学推荐我重新进行面试，但给我拒绝了。我把这视为一种耻辱，而当时的酷讯还没有优秀到让我再去面试的地步。

所以我去了另外一家公司，也是刚成立的一家公司，IBM的leader介绍我过去的，当时感觉还不错。老板是从香港过来的，准备以卡通的形式，来打开大陆教育的市场。其切入点是互联网，通过类似网游的在线flash rpg游戏互动社区(社区的人物是其动画中的卡通形象）的形式开始，结合其将在央视播出的对应动画，来打响品牌。他们想通过这种集教育，娱乐于一体的卡通互动社区的形式，来打开小学至初中这块人群的市场，然后发展卡通教育相关的周边产品。老板基本算孤身前来，带着母公司的资金支持，最终却聚集了一大批各方面的人才，这点不得不令人佩服。

最终的结果却不是向期望中的方向发展，具体目标不明确，互动社区上线一拖再拖，该在央视播出的动画也一直不见播出。我快毕业那会，基本处于成天讨论的状态。

期间周围同学都在忙于找工作了，但我就没投过一份简历。仅有的一次google的校园招聘的笔试，也又一次因为我的毫无准备而失败。期间酷讯又获得了1000万$的风投，感觉到酷讯的潜力了。但我还是没选择离开。现在看来这个行为有点傻，但当时我总觉得离开了像是对不起公司似的。就算是公司内部的同事，也在问我是不是该换个更大点的公司去发展，但被我笑笑了之了。 

直到最后那一刻，当我已经在四惠东租好了房子，准备正式入职时，突然了解到公司资金出了问题。这个初听对我是个噩耗，但当最终和老板确定这个事情，准备离开时，我发觉自己终于解脱了。当时似乎是周一，我第一个想到的是酷讯，当即和酷讯里的同学联系了。酷讯很快通知我去面试，我把时间定在了周三。因为我已经有了足够的前车之鉴，我需要花周二的时间去复习一下数据结构与算法。

周三，面试很容易就过了，这是我人生中的第一个正式的面试，当时也为此改了gtalk的签名档。周五，我拿到了酷讯的offer，在此期间仍然没投过其他简历。

除了google外，我第二选择了酷讯。我发觉自己的选择范围比较有限，微软我一来感觉自己的性格可能面试不过，二来感觉可能微软也和IBM一样，不大适合我。后来一位在清华和我一起共事过的同学的离职向我证实了这一点。百度是很好的，但鉴于一些原因，我没有向百度以及很多公司投过简历。

但总的说来，我对自己最终的归属还是比较满意的。

让我再选择一次的话，我会早点从IBM离开，然后哪也不去，就在实验室好好干活，写论文，多积累点准备google的笔试与面试。在IBM的后期，以及在后来的公司，我在实验室与公司之间两头跑，很多实验室的事情都没做好，论文也没写好，真是对不起实验室与我自己了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-884184890210122901?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/RQ5kdP7te7I/blog-post_13.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2008/07/blog-post_13.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-8497917804952518829</guid><pubDate>Sat, 12 Jul 2008 15:10:00 +0000</pubDate><atom:updated>2008-07-13T01:57:26.686+08:00</atom:updated><title>决定出关了</title><description>由于各种原因，连续闭关了两个多月，期间基本断绝了所有除工作外的交流通道。

先是工作上忙于一个project，连续两周几乎天天加班。然后是发生在我的家乡5.12地震，我除了捐点钱，什么忙也帮不上。于是我决定再闭关一段时间来表达我的默哀。

之前，和多数刚从学校出来的人一样，工作，学习的热情一直不减，也确实学到了不少东西，过得也还算愉快。在工作将满一年之际，突然就起了计较付出与回报的心思，于是向公司提出了加薪的请求。最终加薪的幅度却没达到我的期望，心中有了些许的不平衡，感觉工作的热情受到了极大的压抑。

这样的心态，导致我无法全身心投入工作，感觉对我，对公司都不是个好事情。不得不考虑换工作的事情。于是，闭关继续。一来给自己点压力，不解决这件事就不出关。二来还得补补各方面知识以应对面试。之前就吃过丝毫不准备的亏。

本来想拿到新offer后再告知公司离职的事情，但昨天由于知道了我们组另一人也将离职的消息，我不得不提前表明离职的意思。之前去面试新的公司时候，在谈到离开的原因时，其技术总裁（正好也是我的师兄）的话我还记得很清楚，“你既然选择了创业公司，选择了和大家一起奋斗，去完成一件高风险高收益的事业，那么是否值得为这一点点的工资，这一点点心中的不平衡而选择离开?”。

在表明离职意思时，我还表示再考虑一下。但我想我现在已经想清楚了，如果没拿到期望的待遇，不管能否拿到这个新的offer，我想我最终还是会选择离开。虽然有些舍不得，虽然我认为公司还是有前景的，但如果无法消除心中这点不平衡，我无法说服自己再保持以前那种工作状态了。与其做什么事情之前都想想这是不是自己份内事，是不是有必要把事情做到最好，还不如选择离开。

决定作出了，终于可以出关了。闭关期间看了不少技术方面书籍，也长了不少知识，但又让我当了一回火星人。再让我选择一次的话，绝不用这么愚蠢且幼稚的方式。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-8497917804952518829?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/mv6R6dM55KI/blog-post.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2008/07/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-618645918155605251</guid><pubDate>Sun, 06 Apr 2008 11:55:00 +0000</pubDate><atom:updated>2008-04-06T20:02:39.234+08:00</atom:updated><title>花了两天，把UNPv2看完了</title><description>英文版的，看得比较快，但也不算走马观花，只是跳过了system v部分以及一些实现代码，对door和Sun RPC部分也只是大概看了下。主要是里面讲得好多东西自己零零星星都有接触，只是通过本书串联起来而已。而且由于自己平时这方面实践机会不多，感觉精读没多大必要，掌握基本概念，具体实践时再来精度吧。

以前光看书都不注意作者，这次才发现，W. Richard Stevens真是牛人啊，原来TCPv1-TCPv3，APUE都是他写的，当然还有UNPv1-UNPv2了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-618645918155605251?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/D-epSDFvqDU/unpv2.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>2</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2008/04/unpv2.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-29485412469723200</guid><pubDate>Sun, 06 Apr 2008 06:36:00 +0000</pubDate><atom:updated>2008-04-06T20:15:21.995+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">deployment</category><category domain="http://www.blogger.com/atom/ns#">git</category><category domain="http://www.blogger.com/atom/ns#">capistrano</category><title>自动部署工具Capistrano</title><description>&lt;pre&gt;之前自己写脚本通过"ssh host cmds"远程执行命令的方式进行自动部署。突然发现一个非常好的自动部署工具
&lt;a href="http://www.capify.org/"&gt;Capistrano&lt;/a&gt;，考虑以后用这个。

摘录其介绍如下

Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH. It uses a
simple DSL (borrowed in part from Rake, &lt;a href="http://rake.rubyforge.org/"&gt;http://rake.rubyforge.org/&lt;/a&gt;) that allows you to define _tasks_, which may be
applied to machines in certain roles. It also supports tunneling connections via some gateway machine to allow
operations to be performed behind VPN's and firewalls.

Capistrano was originally designed to simplify and automate deployment of web applications to distributed environments,
and originally came bundled with a set of tasks designed for deploying Rails applications. The deployment tasks are now
(as of Capistrano 2.0) opt-in and require clients to explicitly put
"load 'deploy'" in their recipes.

下面是其首页上的说明
&lt;/pre&gt;&lt;h2&gt;Capistrano is…&lt;/h2&gt;    &lt;ul&gt;&lt;li&gt;&lt;em&gt;Great for automating tasks&lt;/em&gt; via SSH on remote servers, like &lt;em&gt;software installation&lt;/em&gt;, &lt;em&gt;application deployment&lt;/em&gt;, &lt;em&gt;configuration management&lt;/em&gt;, ad hoc &lt;em&gt;server monitoring&lt;/em&gt;, and more.&lt;/li&gt;&lt;li&gt;&lt;em&gt;Ideal for system administrators&lt;/em&gt;, whether professional or incidental.&lt;/li&gt;&lt;li&gt;&lt;em&gt;Easy to customize.&lt;/em&gt; Its configuration files use the &lt;a href="http://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt; programming language syntax, but you don't need to know Ruby to do most things with &lt;span class="appname"&gt;Capistrano.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;Easy to extend.&lt;/em&gt; &lt;span class="appname"&gt;Capistrano&lt;/span&gt; is written in the &lt;a href="http://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt; programming language, and may be extended easily by writing additional Ruby modules.&lt;/li&gt;&lt;/ul&gt;    &lt;pre&gt;Capistrano也能利用各种scm进行部署，见&lt;a href="http://github.com/guides/deploying-with-capistrano"&gt;&lt;span style="font-size:100%;"&gt;Deploying with Capistrano (git)&lt;/span&gt;&lt;/a&gt;
且它是开源的，这是其&lt;a href="http://github.com/jamis/capistrano/tree/master"&gt;git repository&lt;/a&gt;
&lt;/pre&gt;&lt;h2 class="r"&gt;&lt;span class="m"&gt; &lt;/span&gt;&lt;/h2&gt;&lt;pre&gt;&lt;a href="http://www.scribd.com/doc/1618/a-great-capistrano-cheatsheet"&gt;a great capistrano cheatsheet&lt;/a&gt;给出了capistran的详细功能列表，虽然是1.x的(目前已经到本2.2.0)
&lt;/pre&gt; &lt;pre&gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-29485412469723200?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/CwtRVT8DE1E/capistrano.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2008/04/capistrano.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20766593.post-5442978619944563993</guid><pubDate>Sun, 06 Apr 2008 05:07:00 +0000</pubDate><atom:updated>2010-05-07T17:59:24.705+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ssh</category><category domain="http://www.blogger.com/atom/ns#">ssh-agent</category><title>研究了下ssh-agent</title><description>ssh-agent的manual写得倒是挺详细，可看了好几次都没怎么搞明白。这次发誓要把它搞明白，幸好在网上找到了非常好的一篇文章，将ssh的各种认证方法讲得非常之详细 &lt;a href="http://www.unixwiz.net/techtips/ssh-agent-forwarding.html"&gt;&lt;span style="font-size: 100%;"&gt;An Illustrated Guide to SSH Agent Forwarding&lt;/span&gt;&lt;/a&gt;  文章从密码认证，基于passphrase的公钥认证，使用agent以及agent forward的公钥认证几个方面，逐步的将整个过程剖析得非常全面。&amp;nbsp; &lt;br /&gt;
1. 密码认证若每台机器使用相同的密码，如果密码泄露，所有机器都被攻破。若使用不同密码，则密码太多很难记住，因此也不可能使用很强的密码。&lt;br /&gt;
2. 因此可使用公钥认证，通过 设置passphrase，即使私钥泄露，也能保证安全。每台机器使用不同的公私钥对，但可使用相同的passphrase。这样passphrase可设置得很强，不容易攻破。但每次连接远程机器都要输passphrase，也比较烦人。&lt;br /&gt;
3. ssh-agent能够解决每次连接都要输passphrase的问题。在.bash_profile中启动ssh-agent，第一次登录本地机器（如果用securecrt远程登录，这本地机器其实也是远程机器）时输一次passphrase，随后从本地机器连接其他远程机器就不用再输了。&lt;br /&gt;
4. ssh-agent更进一步简化流程，在本地机器上使用了ssh-agent，不仅链接到远程机器1不用输passphrase，当ssh到远程机器1后，从远程机器1进一步连接到远程机器2仍然不用输passphrase。也就是说ssh-agent forward能够实现整个ssh chain都不用输passphrase，所有认证最终都会沿着这个chain传到最初的本地机器来进行。&lt;br /&gt;
&lt;br /&gt;
上面这篇文章讲原理，&lt;a href="http://mah.everybody.org/docs/ssh"&gt;&lt;span style="font-size: 100%;"&gt;Using ssh-agent with ssh&lt;/span&gt;&lt;/a&gt;则是讲用法(best practice)&lt;br /&gt;
&lt;br /&gt;
以服务器bear, 用户ping为例&lt;br /&gt;
&lt;br /&gt;
1. 将下面的代码加到bear的$HOME/.bashrc中&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="code"&gt;SSH_ENV="$HOME/.ssh/environment"
function start_agent {
  echo "Initialising new SSH agent..."
  /usr/bin/ssh-agent | sed 's/^echo/#echo/' &amp;gt; "${SSH_ENV}"
  echo succeeded
  chmod 600 "${SSH_ENV}"
  . "${SSH_ENV}" &amp;gt; /dev/null
  /usr/bin/ssh-add;
}

# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
  . "${SSH_ENV}" &amp;gt; /dev/null
  #ps ${SSH_AGENT_PID} doesn’t work under cywgin
  ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ &amp;gt; /dev/null || {
  start_agent;
}
else
  start_agent;
fi&lt;/pre&gt;&lt;br /&gt;
2. 远程登录bear的时候，可能会提示输入passphrase&lt;br /&gt;
&lt;pre class="code"&gt;$ ssh ping@bear
Initialising new SSH agent...
succeeded
Enter passphrase for /home/ping/.ssh/id_rsa:
&lt;/pre&gt;&lt;br /&gt;
3. 如果想加入其他的ssh key，可 (此步一般可跳过)&lt;br /&gt;
&lt;blockquote&gt;$ ssh-add ~/.ssh/another_id_dsa&lt;br /&gt;
Need passphrase for /home/ping/.ssh/another_id_dsa (ping@bear).&lt;br /&gt;
Enter passphrase:&lt;/blockquote&gt;&lt;br /&gt;
4. 测试, 从bear登录另一服务器cat&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;$ ssh ping@cat&lt;/blockquote&gt;&lt;br /&gt;
如果已将id_rsa.pub的内容加入了cat的$HOME/.ssh/authorized_keys中，则应该不用输入密码就能进了&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20766593-5442978619944563993?l=pkufranky.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/blogspot/pkufranky/~3/WCYqxk27_50/ssh-agent.html</link><author>noreply@blogger.com (pkufranky)</author><thr:total>0</thr:total><feedburner:origLink>http://pkufranky.blogspot.com/2008/04/ssh-agent.html</feedburner:origLink></item></channel></rss>

