12/07/2009

Privoxy is out! Now, Tor+Polipo

目前最新的Windows版Vidalia-Bundle中已将Privoxy砍掉了,取而代之的是Polipo,一个主要为个人和小用户群设计的轻量,具有缓存机制的Web代理。加上近期,Shinjiru TechnologyTor赞助了的一台高带宽主机(详情请见这里),配合轻量的Polipo,翻墙的时候基本不卡小JJ,有兴趣并且有小JJ的同学可以自己试试。


下面,将分别介绍在Windows和Ubuntu下如何安装配置Tor+Polipo:

1) Windows
Step-1. 下载最新的Windows版Vidalia-Bundle
Step-2. 卸载已安装的老版本Vidalia-Bundle;
Step-3. 安装已下载的新版本Vidalia-Bundle;
由于新版的Vidalia-Bundle安装程序保留了原Privoxy使用的Web代理端口:8118,因此所有使用Tor+Privoxy的程序不需要作任何端口配置的调整。

2) Ubuntu
较Windows下,稍微繁琐些;另外,需要注意的是Polipo的默认侦听端口是:8123。

Step-1. 安装Polipo:
sudo apt-get install polipo

Step-2. 配置Polipo:
首先,备份polipo的配置文件
sudo cp -p /etc/polipo/config your-backup-dir/polipo-config.backup
其次,用你常用的编辑器打开/etc/polipo/config文件,找到如下2行:
# socksParentProxy = "localhost:9050"
# socksProxyType = socks5
将polipo配置文件中的位于上述2行代码行首的注释符号(#)删除掉(uncomment)
由于polipo的默认侦听端口是:8123,如果这对于你来说不方便,你可以通过在polipo配置文件的末尾添加如下配置项来调整:
proxyPort=your-favor-port

Step-3. 重启Polipo:
sudo invoke-rc.d polipo restart

Step-4. 卸载Privoxy(可选)
sudo apt-get --purge remove privoxy

11/24/2009

如何在Ubuntu9.10下安装原装Tor

上篇文章里已介绍了如何安装SevenMachines为Karmic编译的Tor,为什么还需要安装原装Tor呢?理由有二: 1) 由于SevenMachines为Karmic生成的Tor是Alpha版,也就是不稳定版本,并且Alpha版的Tor在机器重启后需要手动重启;2) 我们之所以选择Tor的根本原因就在于我们需要的是安全和可信赖的工具,而对于SevenMachines,我们却一无所知。不过在这里,还是要首先感谢SevenMachines。

在Karmic下安装原装Tor有2种方式: 1) 通过apt-get直接安装,前提是你有除二手Tor之外的后备翻墙代理(Proxy),该种方式需要执行: Step1>Step3>Step7>Step8;2) 下载本机源代码,生成,然后安装之,需要执行: Step1Step8所有步骤。

Step1. 添加原装Tor软件源(Software Sources)
在/etc/apt/sources.list文件中或者通过System>Administration>Software Sources>Other Software来填加如下原装Tor软件源:
deb http://deb.torproject.org/torproject.org karmic main
deb-src http://deb.torproject.org/torproject.org karmic main

导入原装Tor的签名键:
sudo gpg --keyserver keys.gnupg.net --recv 886DDD89 
sudo gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add -

在完成以上命令后,更新软件源:
sudo apt-get update

Step2. 下载deb的生成工具,库,及脚本
本步骤只为了用原装Tor的源代码作本机生成而准备,因此,如果你有除二手Tor之外的后备翻墙代理,可以安全地跳过Step2
sudo apt-get install build-essential fakeroot devscripts

Step3. 设置系统级代理
该步骤的目的也就是为了能通过Terminal来下载和安装原装Tor。之所以要在Step1更新软件源时是为减少要通过代理下载软件源的数据量,由于原装Tor的软件源被GFWed(Greate be Fucked Wall)的,并且使用翻墙代理的速度相对于直连(Direct Internet Connection)较慢,因此尽可能只用翻墙代理下载必要的数据

请在Terminal中输入:
export http_proxy=http://127.0.0.1:8118

上述的127.0.0.1:8118为本机的Privoxy的侦听地址和端口,如果你有其它能翻墙的后备代理,请按如下格式输入:
export http_proxy=http://host:port,其中,host为代理所在的主机IP地址,port为代理的侦听端口。

如果你所用的其它翻墙后备代理需要登录信息的,请按如下格式输入: 
export http_proxy=http://username:password@host:port,其中username和password为你所用的翻墙代理的登录用户名和密码。

在完成以上命令后,请更新软件源:
sudo apt-get update
如果你的翻墙代理工作正常的话,这次应该能够成功更新原装Tor软件源了。

Step4. 下载原装Tor和相关的库及工具
在本步骤开始之前,请在/etc/apt/sources.list文件中或System>Administration>Software Sources>Other Software移除二手Tor的软件源。

在输入以下命令并按下回车或ctrl+m后,请不要急于输入确认键: y,切记!
sudo apt-get build-dep tor
在看到以上命令执行时的提示信息后,注意执行该命令所需要下载的数据量,如果数据量过大请选择: n。在本人的机器上,看到的是:
...
Need to get 81.8MB of archives.
After this operation, 187MB of additional disk space will be used.
Do you want to continue [Y/n]? n
需要下载81.8MB,这样的数据量对于我的翻墙代理来说简直就是天文数字,因此,毫不犹豫地选择: n。

然后将'The following NEW packages will be installed:'和'0 upgraded, 28 newly installed, 0 to remove and 1 not upgraded.'之间的软件包的名称拷贝至剪贴板或者一个文本文件(Plain Text),当然在这其中需要下载的软件包或者说依赖项(Dependencies)的数量依具体的机器环境的不同而不同。

执行Step8,目的是利用较快速的直连方式下载和安装上述所拷贝的依赖项;然后在Terminal中执行: sudo apt-get install * 这里的*号就是你需要粘帖(Paste)过来的依赖项;完成后,执行Step3,重新切换到使用系统级翻墙代理。

运行: sudo apt-get build-dep tor,然后输入确认键: y

Step5. 下载原装Tor源代码
假定当前工作目录为~,然后先创建一个目录来保存下载的Tor源代码,假定目录名为: deb
mkdir deb
cd deb
sudo apt-get source tor

Step6. 生成原装Tor的deb安装包
cd tor-* ,这里的*号代表是下载的Tor的版本,当前的版本是: 0.2.1.20
sudo debuild -rfakeroot -uc -us
cd ..

Step7. 安装原装Tor
如果你是下载Tor源代码,即:从Step6过来的,请执行如下安装命令:
sudo dpkg -i tor_*.deb

如果你有除二手Tor之外的后备翻墙代理,可以使用apt-get直接安装:
sudo apt-get install tor tor-geoipdb

Step8. 移除在Step3中所做的系统级代理设置
export -n http_proxy

11/23/2009

Ubuntu 9.10 觉后禅

第二回 闭户说欢娱隔墙有耳 禁人观沐浴此处无银
在Karmic下带Tor还需要费点小周折,一方面由于Tor的主站是早被GFWed的;另一方面,目前Tor并不在Karmic的软件源(Software Sources)中,即使试图添加Jaunty源("http://mirror.noreply.org/pub/tor jaunty main")来安装Tor,也会得到无法安装的错误提示: 
The following packages packages have unmet dependencies:
 tor: Depends: Libevent1 (>= 1.3e) but it is not installable
这似乎是Karmic砍掉了libevent1导致的。

这里先介绍一个权宜之计,安装SevenMachines为Karmic编译的Tor: 

Step1. 添加Tor软件源
deb http://ppa.launchpad.net/sevenmachines/tor/ubuntu karmic main 
deb-src http://ppa.launchpad.net/sevenmachines/tor/ubuntu karmic main 

Step2. 导入PPA签名键(Signing Key)
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 61E46227

Step3. 安装Tor和Privoxy
sudo apt-get install tor privoxy

另外,
1. 目前Tor和Privoxy在Karmic下存在系统重启后不能正常工作的状况,需要手动重启Tor和Privoxy:
sudo /etc/init.d/tor restart
sudo /etc/init.d/privoxy restart
2. 如何配置Tor网桥请见这里

10/27/2009

Google Chrome 代理服务器(Proxy)的设置

Google Chrome的代理服务器的默认配置: 在Windows下使用IE的代理服务器配置,在Ubuntu下使用Network Proxy的配置,也就是说Google Chrome倾向于使用系统级的代理服务器配置。这样做的好处是产品的初期开发工作相对简单些,也可以方便一般用户的使用,但是就这点对于天朝的骑墙子民却是个麻烦的鸟事。比如你在墙内呆着忽然想去墙外了,特别是Google在墙外的几亩地上转转,怎么办? 要改系统级的代理服务器配置了不是;如果你更贱点,比如还想同时用较快的直连方式上墙内的站点怎么办? 麻烦了不是?! 可能你会说我可以用Firefox么,OK,用Firefox的请滚那边;当然你还可能会说我又不是Google Fans凭什么一定要用Chrome,这个问题问得好,理由就是: 如果你想在墙外Google的几亩地上转悠,你就得用Chrome,MD谁用谁知道!这个道理再简单不过,比如你来大姨妈了,我弄个环保袋给您垫着,你觉得合适吗?


Google Chrome据说有上百个未文档化的命令行参数(Command-line flags),这主要是由于Google Chrome的开发人员为方便在稳定版本(Stable Version)未推出前验证和测试Chrome的一些特性,但是如下用于代理服务器设置的几个参数相对稳定: 

1. --no-proxy-server
禁用代理服务器配置,这是默认选项。

2. --proxy-auto-detect
自动检测代理服务器配置。

3. --proxy-server=host:port
手动指定代理服务器地址,但是该选项只限于http/https。 例如: "chrome --proxy-server=127.0.0.1:8118",其中127.0.0.1是本机地址(loopback address),8118是Privoxy的默认端口;当然你也可以用host:port指定为远程代理服务器的地址和端口(如果你需要架设Tor+Privoxy代理服务器请参见: 如何架设Tor+Privoxy服务器)。

以上这些命令行参数同时适用于Windows和Ubuntu,额外需要提醒注意的是: 在Windows下Google Chrome的可执行程序名称是chrome,而在Ubuntu下为chromium-browser。OK,现在你可以用Google Chrome在墙两侧轻松切换了。


9/27/2009

在Ubuntu下如何配置Tor网桥

Step1: 获取网桥地址

用你的gmail帐号发送主题和内容为"get bridges"的邮件至bridges@torproject.org

 

Step2: 配置Tor网桥

首先,备份原Tor配置文件torrc至备份目录:

sudo cp -p /etc/tor/torrc your-backup-directory

 

然后在torrc配置文件末尾添加"UserBridges 1"开关选项(默认是0, 即关闭状态),

 

最后,将bridges@torproject.org回复邮件中的bridge列表附加至torrc配置文件末尾,请按回复邮件中的bridge的原有格式添加,即:

bridge ip:port fingerprint

 

Step3: 重启Tor和Privoxy

sudo /etc/init.d/tor restart

sudo /etc/init.d/privoxy restart

7/25/2009

交通银行 != 垃圾银行

Connection timed out:could be due to invalid address 
错误堆栈 java.net.SocketException: Connection timed out:could be due to invalid address at java.net.PlainSocketImpl.socketConnect(Native Method) 
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:389) 
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:250) 
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:237) 
at java.net.Socket.connect(Socket.java:540) 
at java.net.Socket.connect(Socket.java:490) 
at sun.net.NetworkClient.doConnect(NetworkClient.java:180) 
at sun.net.www.http.HttpClient.openServer(HttpClient.java:403) 
at sun.net.www.http.HttpClient.openServer(HttpClient.java:521) 
at sun.net.www.http.HttpClient.(HttpClient.java:246) 
at sun.net.www.http.HttpClient.New(HttpClient.java:320) 
at sun.net.www.http.HttpClient.New(HttpClient.java:337) 
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:822) 
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:774) 
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:699) 
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:866) 
at com.ecc.liana.personbank.servlet.HttpProxyServlet.performTask(HttpProxyServlet.java:325) 
at com.ecc.liana.personbank.servlet.HttpProxyServlet.doPost(HttpProxyServlet.java:95)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:763) 
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:856) 
 at com.ibm.ws.cache.servlet.ServletWrapper.serviceProxied(ServletWrapper.java:282) 
 at com.ibm.ws.cache.servlet.CacheHook.handleFragment(CacheHook.java:459) 
 at com.ibm.ws.cache.servlet.CacheHook.handleServlet(CacheHook.java:265) 
 at com.ibm.ws.cache.servlet.ServletWrapper.service(ServletWrapper.java:262) 
 at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1075) 
 at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1016) 
 at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:145) 
 at filters.http.RequestEncodingFilter.doFilter(RequestEncodingFilter.java:89) 
 at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190) 
 at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130) 
 at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:87) 
 at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:771) 
 at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:679) 
 at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:546) 
 at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478) 
 at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:90) 
 at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:744) 
 at com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1455) 
 at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:115) 
 at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:458) 
 at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:387) 
 at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:102) 
 at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165) 
 at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) 
 at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) 
 at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:136) 
 at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:195) 
 at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:743) 
 at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:873) 
 at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1473)  

以上是交通银行(Bank of Communication)网银'代理缴费'功能出错后的堆栈信息,是不是很酷?!难道你就不能从里面有所发现吗?!

6/30/2009

如何架设Tor+Privoxy服务器

GFW渐趋肆虐的和谐大环境下,在没有更加主动的应对策略前,每日被动使用Tor+Privoxy 的频率自然也越来越频繁了。但是我们通常都是在自家的自留地上种上Tor和Privoxy,这是典型的互联网小农意识,我们需要更方便、更有效率和能同时为更多的网络羔羊提供Tor+Privoxy 服务。因此本文将介绍如何在服务器上架设Tor+Privoxy,虽然本文以Ubuntu 8.04 LTS 服务器为例,但是类似的配置在Windows Server平台上也是同样适用的。

Step-1. 安装Tor+Privoxy
请先确保具有Ubuntu 8.04 LTS 服务器的root权限,在Terminal中输入如下命令安装Tor和Privoxy:
sudo apt-get update
sudo apt-get install tor privoxy

Step-2. 配置Privoxy
由于Tor不能作为Web代理服务器(Web Proxy),因此只需要将Privoxy的TCP通讯(TCP Traffics)转到Tor的本机TCP侦听端口(127.0.0.1:9050),然后将防火墙开放Privoxy的默认TCP端口8118,重启Privoxy服务即可。


1) 将Privoxy的TCP通讯前导到Tor
编辑Privoxy的配置文件: 用你熟悉的编辑器打开/etc/privoxy/config, 找到# forward-socks4a / 127.0.0.1:9050 .配置行,然后将单行注释符#删除掉,然后保存该配置文件。

2) 重启Privoxy服务
sudo /etc/init.d/privoxy restart

3) 配置防火墙开放Privoxy的默认端口
在Ubuntu下,防火墙默认是全开放的,因此默认情况下是不需要为Privoxy配置防火墙的。由于大多数Linux防火墙都是基于Linux内核级防火墙Netfilter(IPTables),所以在此只介绍如何利用iptables开放Privoxy的TCP端口,可以用iptables的Append或Insert输入链(Input Chain),如下:
sudo iptables -I INPUT 5 -m state --state NEW -p tcp --dport 8118 -j ACCEPT
上述命令是在输入链中第5条的位置插入开放TCP 8118端口的输入链,该项操作会因你的服务器防火墙的具体环境而异,因此如果碰到问题请参见Ubuntu IPTables How To

4) 保存IPTables的配置
在Terminal中输入如下命令:
sudo sh -c "iptables-save > /etc/iptables.rules"
为确保在服务器重启后能自动应用之前的防火墙配置,请在/etc/network/interfaces网络接口配置文件尾部添加如下配置语句:
# The iptables rules
pre-up iptables-restore < /etc/iptables.rules
post-down iptables-save > /etc/iptables.rules

Step-3. 客户端配置
在Firefox和IE下配置网络代理的过程基本类似,在Firefox>(Edit>Preferences|Tools>Options)>Advanced>Network>Settings进行相应设置即可。在Firefox中可以使用FoxProxy插件配合Tor,不过个人觉得FoxProxy虽然强大,但是太慢了,另外你还得不断地手动添加基于URL的模式(Patterns),显得有些过于繁琐。因此我将会以Firefox为例介绍一种在Tor+Privoxy 与正常模式之间的自动切换的方法:

1) 创建Firefox Profile
首先需要终止所有Firefox进程,在Linux Terminal或Windows Command-line中输入:
firefox -ProfileManager
然后依据Create Profile向导完成你需要为Tor+Privoxy 配置Firefox的相应环境,设置Firefox网络代理,将该新创建的Profile命名为tor。
f-3-1:

2) 启动Firefox
在Linux Terminal或Windows Command-line中输入:
firefox -P <profile-name>
这里的<profile-name>即为Firefox创建的Profile名称,例如:firefox -P tor 将以使用Privoxy的Profile启动Firefox。
f-3-2:

最后可以通过访问Are you using Tor?测试是否已正确连接上Tor网络。


后记:
前段时间宫刑部用俺们的肆仟柒佰萬的超高价买了一坨叫什么"绿坝-花季护航"的屎疙瘩,然后异常慷慨的强置在每一台新出货的计算机中,并且保证这陀屎对俺们的身心健康是多么的有益,尤其是祖国的花朵;与其说GFW干的是偷偷摸摸的见不得人的男盗女娼,而"绿坝-花季护航"却是对私权的公然入侵,在性质上是不可同日而语的。无论如何,被动的应对总是效率太低,并且显得过于无奈了,随着GFW的进化,我们也迫切地需要由被动应对转为更有效率的主动应对。





6/21/2009

Vista 安全瘦身10条

Vista比XP便捷高效的多,前提是如果你真的会搞XP。目前XP已过了主流支持期,To Vista or to Windows 7 that is the question,XP的拥趸已被M$无情地抛弃了,Oops, that's good! 在此我不想讨论同样都为愚蠢的Windows的XP和Vista孰优孰劣的问题,显然这样做是毫无意义的,我只想:在你有幸了解Windows的行为方式之后,对愚蠢的Windows喋喋不休地打扰你的生活,能发出纯爷们的呐喊:停下,DB!。本文将对Vista如何安全瘦身的问题进行讨论并提供一些建议,通常Vista会耗尽你的硬盘可用空间,因此你不需要怀疑问题的提出,这是由M$商业模式决定的,即由不得你也由不得我。另外非常重要的一点是我是教你安全瘦身,因此你不要过分的担心你的Vista会出现上吐下泻的症状。


既然是要瘦身,总得知道需要瘦哪,哪些地方能瘦,哪些地方不能瘦,怎么个瘦法。首先,可以通过WinDirStat等磁盘使用情况分析工具找到瓶颈,明确问题所在,然后进行相应调整。其次,严格依据3个指导性策略进行瘦身:1) 尽量减少Vista对整体磁盘空间的占用率;2) 如果不能有效做到1),那么就尽可能减少对Vista所在的系统分区的磁盘空间的占用率;3) 尽可能避免采用瘦身后对Vista造成负面影响的瘦身方法,即我们需要的是安全瘦身。

为了便于讨论,对于一个系统特性如果同时适用于XP和Vista的情况,文中会以Windows作为限定。在以下是各项是根据硬盘空间所占比重和能对其的控制程度作为排序条件,列举的在Vista下影响磁盘空间的主要因素;另外,在本文中除非必要将不会显式的说明具体应用了上述策略。

1. 硬盘容量的标准误差
当发现你的硬盘的实际容量比硬盘标称容量要少时,请不要诧异。这是因为硬盘生产商和操作系统采用了不同的计量标准而已,硬盘生产商为了方便采用K=1000字节(Kilobytes),M=1000K(Megabytes),G=(Gigabytes)作为计量单位,而操作系统则是采用K=1024字节(Kibibytes),M=1024K(Mebibytes),G=1024M(Gibibytes)为单位的,因此标称160GB的硬盘实际上只有160*1000^3/1024^3=149GiB(注意中间的字母i)。目前正式发行的Windows操作系统并不区分这种计量标准上的差异,也是造成混淆的一个因素,而IEC提议采用GiB来避免这种混淆,这个提议被包括IEEE在内的多家标准组织所接受,毫无疑义的是Linux的也是该提议的支持者之一。

2. 系统恢复分区
目前新出货的品牌机通常都会带有一个系统恢复分区(Recovery Partition),在这个分区上存有可以将系统恢复至出厂状态的所有软件和数据。系统恢复分区通常为5~10GiB大小,这取决于机器的不同的品牌以及不同的型号。在你决定干掉这个硕大的分区之前,请先确保已根据用户手册正确地将系统恢复分区上的内容刻录到DVDs(有的机器生产厂家会免费提供系统恢复光盘,但是需要另行申请)。

3. VSS占用的硬盘空间
VSS(卷影拷贝,Volume Shadow Copy),默认会将硬盘空间的15%或硬盘剩余空间的30%分配给系统还原点(System Restore Points)和Vista备份工具使用。到底是15%还是30%取决于2种情况:首先在你从未更改过VSS设置的前提下默认为15%;其次,当你重新开启VSS后,系统将会根据这两个比值计算而来的值孰小的原则来决定最终需要分配的硬盘空间。然而无论是15%还是30%都将会占用非常大块的硬盘空间,虽然在Vista下VSS服务相对于在XP/Server 2003没有直接的调整占用硬盘空间的操作,但是Vista的VSS比XP/Server 2003的VSS服务进化了很多,所以除非你很清楚系统崩溃带来的成本和完全恢复系统的成本,否则的话请不要作出关闭VSS服务的疯狂并且危险的决定。

下面介绍一个既能利用VSS给系统上TT又能安全减少VSS占用硬盘空间的方法,步骤如下:
a) 使用vssadmin list shadowstorage查看影子拷贝存储空间(Shadow Copy Storage,以下简称:SCS)的使用情况。
f-3-a:
b) 设定的SCS的上限
通过计算Vista系统分区的15%来确定SCS的上限的基值,再根据此基值与2~4GiB作比较,如果基值大于4GiB,你可以选取2~4GiB来作为你的SCS的上限;如果基值位于2~4GiB之间,请选择此基值作为SCS的上限。例如,Vista系统分区为40GiB,基值=40GiB*15%=6GiB,因6GiB>4GiB,故选择4GiB作为SCS的上限。
使用vssadmin resize shadowstorage设定SCS的上限。假定Vista系统分区的盘符为C,预设定的SCS上限为4GB:vssadmin resize shadowstorage -for=c: -on=c: -maxsize=4GB2
f-3-b:

4. 光盘刻录的临时镜像
Windows从XP开始就支持光盘刻录功能,Vista内置支持DVD刻录。如果你的机器支持DVD刻录(DVD RW),要注意的就是Vista会在刻录的过程中创建一份比刻录内容稍大的临时镜像文件,比如你的刻录内容是4.7GiB那么额外还需要约5GiB的硬盘空间来存储这个临时镜像文件。因此为避免占用Vita所在的系统分区的磁盘空间请选择其它分区来存储刻录时产生的临时镜像文件,具体操作如下图: 
f-4:

5. 虚拟内存页面交换文件
虚拟内存页面交换文件(pagefile.sys),由Windows在系统分区根目录下创建,主要由Windows的虚拟内存(Virtual Memory)所使用。在初始安装Windows后通常为物理内存空间(Physical Memory Size)的1.5倍左右,可以通过系统设置来调整pagefile.sys的大小,这取决于机器的配置和个人偏好,有3个选项: a) 手动配置(Custom size) b) 由系统管理(System managed size) c) 不产生页面交换文件(No paging file)。如果机器的物理内存足够大,可以尝试选择选项c;就我个人而言我选择b,理由是:就让愚蠢的Windows自己摆弄她那套愚蠢的规则也许是个不得已的好主意。
f-5:

6. 系统休眠镜像文件
系统休眠镜像文件(hiberfil.sys),由Windows在系统分区根目录下创建,用于镜像Windows进入休眠模式(Hibernated mode)时RAM的内容,因此hiberfil.sys文件的大小和物理内存空间相等。正由于hiberfil.sys是Windows系统当前RAM的完全镜像,因此重新开机后Windows能恢复至进入休眠模式前的状态,这对于有足够磁盘空间同时又讨厌Windows漫长前戏的朋友非常实用。当然也可以通过Start>Control Panel>Power Options来关闭休眠模式,然后就可以安全地删除该文件了。

7. Users目录
干掉XP下的Documents and Settings目录而在Vista中采用类似于Unix-like系统的/home目录,即Users目录,无疑M$是在未付出任何版权和许可协议费用的情况下取得的又一伟大创新。/home目录的存在是Unix-like多用户操作系统(Multi-user Operating Systems)的需要,其存在的根本理由是分离系统数据和用户数据,这样能更有效得利用磁盘空间也使得备份工作更加简单,同时有效避免病毒对系统造成的伤害。然而在Vista中的Users目录可没那么幸运,由于M$一贯的妄自尊大、缺乏弹性及严重依赖注册表(Registry)的系统设计,使得Users目录并没有进化到能与/home目录相提并论的地步。但是可以肯定的是: 至少在Vista下用命令行(Command line)访问用户目录时会令你的手指倍感轻松。
a) 对于特殊目录(Special Folders)依据策略2可以使用Location进行实际文件存储的重定向(以Symbol Link实现),以减少占用Vista系统所在分区的磁盘空间。
f-7-a:
b) 在Users目录的当前用户目录下包含一个AppData的目录,主要用于存储Windows的本地化设置和应用程序数据。因此在理论上是可以安全地移除该目录的,但是建议采用以下步骤进行安全清理:首先必须保持AppData的目录结构,即不能删除或重命名AppData的3个子目录: Local, LocalLow, Roaming;其次,在你不清楚错误清理的后果时请先对要操作的目录和文件做好必要的备份;再次,对于Local子目录应尽可能的使用相应的应用程序来完成清理,比如我的Google Chrome在Local目录中占用了近1GiB的磁盘空间,我首先会通过Customize and control Google Chrome>Clear browsing data来清理;最后,在清理Local, LocalLow, Roaming的子目录时如果Vista弹出File In Use对话框,请务必选择Skip。
f-7-b:


8. Program Files目录
对待这个目录你可以安全的使用Program and Features(在XP下称为:添加或删除程序)卸载不再需要的程序。就我个人的卸载原则是:不使用即浪费,对于2个月碰都不碰的程序如果其的安装成本低廉就可以毫不犹豫的对其进行卸载;为不使用并且又唾手可得的东西付款这是可笑的松鼠哲学。有些程序活着的时候是坨屎,卸载后到处都是屎,碰上这种情况你可要劳神了,当然踩上屎的几率和个人的价值观及审美情趣毫无疑议的具有负相关性。如果在卸载过程中出现问题不能正常卸载而该程序又是以Windows Installer安装的,可以考虑使用Windows Installer Cleanup Utility工具,它可以帮助你清理该程序在注册表(Registry)留下的屎点,尽管注册表本身就是个了不起的公厕,最后需要手动清理该程序的安装文件;如果你在卸载过程中碰上了其它问题,那么我要恭喜你,你的Windows很可能因此获得重生。

9. 索引选项
Index Options在Vista下有了很大提高,但是你需要精心地配置索引选项,尽可能在索引占用的磁盘空间,Vista系统性能,搜索文件的性能3者之间取得合适的平衡,然而这需要额外的大量工作。在不触碰Vista默认的索引设置的前提下,依据策略2改变索引数据的存储,通过Index Options>Advanced Options。
f-9:

10. Disk Cleanup工具
Windows磁盘清理工具(Disk Cleanup Tool)是个垂垂老矣的Windows檫屁股程序,Windows补丁导向(Service Packages Oriented)的设计和实现必然导致一大坨檫屁股的程序的存在,这种存在将会伴随Windows愚蠢和羞耻的一生。但是在你决定清理Windows时请优先考虑使用Windows磁盘清理工具,理由就是5. 虚拟内存页面交换文件提到的:就让愚蠢的Windows自己摆弄她那套愚蠢的规则也许是个不得已的好主意。

后记:
本文是3个月前就开始准备,由于这段时间琐事繁多,再加上又不是个勤快的爷们,所以就拖拉到了今天。目前Vista SP2也已发布,昨天我已安装了SP2,但是至今并没有看过任何SP2的文档,也没有研究和体验SP2在SP1的基础上有哪些改进和提高,所以如果SP2对本文的内容涉及到有较大的技术变动时,我只能说非常抱歉。

1. WinDirStat ,有关Windows下磁盘使用情况的分析工具的介绍可以参考Geek to Live: Visualize your hard drive usage
2. 在Vista下-on选项的参数必须和-for选项的参数一致,即同为Vista所在系统分区盘符,在例中为c:,在Windows Server 2008可将SCS存储于由-for选项指定的监视分区不同的-on选项指定的分区上。
3. Symbol/Soft Link(软链接),在Vista中引入的又一Unix-like技术,相当于文件指针。
4. Windows Installer Cleanup Utility,点击下载


6/03/2009

How to re-add database objects into EDMX

When you working on ADO.NET Entity Framework in VS2008, may be there are some things wrong or other else you'll need to re-add database objects into your EDMX. 

You can try the following steps:
1. Delete the Entity from the EDMX Designer's Diagram. Because that is the only way to delete an Entity from EDMX, I don't know why not MS add this function into Model Browser in VS2008.
2. Now, you can see the Entity that had been deleted exists in Model.Store yet. So, you cannot re-add it via 'Update from Database...' .
3. Open EDMX through XML Editor (Right-Click EDMX item in Solution Explorer>Open With...>XML Editor), find the Entity in <edmx:StorageModels> sections, then delete it.

Now, you can re-add database objects into your EDMX.

2/19/2009

Evernote的幸福时光

Google Notebook 产品组官方博客于2009-1-14 发布将停止Notebook及其Extension的开发,但是仍然会对其进行维护的通告。Evernote 对此立即响应,于2009-1-22 在其官方博客中申明支持Notebook的导入功能,且对Notebook恭维有加。Evernote的出手可谓其疾如风,而且姿态也摆的很正,丝毫没有予人以巧取豪夺之意。

我是在2008-9-9注册的Evernote,但是较少使用,曾经在Evernote和Notebook之间如何取舍确也犹豫过一番,最终留下了 Notebook。目前又面临着再次选择,此文将就为什么要使用Notebook和Evernote等诸如此类产品的基本的需求,然后探讨如何选择的问 题。经常会在工作和生活中碰到需要及时地捕捉一些想法、收集和记录一些素材、记下一个电话号码... 这些就形成了最基本的需求。此外,这些想法、素材、号码需要进一步的整理,比如被捕捉的一些想法可能会转变成行动,或者被无情的删除掉,这也是大部分想法 的最终命运;一些被收集和记录的素材,其中有些由于本身具有一定的时效性,用完了就没有存在的价值了,最终也是难逃被删除的命运,而另外一些素材可能会转 变成Google Docs或者诸如MS Office Word等形式;临时记下的电话号码最后可能会被转存到通讯录中。也就是说在最基本的需求之上还需要Evernote和Notebook之类的产品具有便 于后期的筛选,整理,转换等工作所需要的功能。

如何选择?
1. Evernote和Notebook二者都能够满足捕捉想法、搜集和记录素材等,而且更加丰富,比如剪辑网页片段等。它们也都是Server-based,因此只要能上Internet就可以随时随地的存取这些想法和素材。
2. 在网页剪辑功能方面,Evernote对剪辑的网页片段会做一定的裁减,相反Notebook对此却是原汁原味的剪辑。虽然Notebook对剪辑的网页 片段的大小有64K的硬性限制,但是这64K的限制,会令你更加有意识的去剪辑相对重要的网页内容,而不是将整个Internet搬家。
3. 在移动终端的支持方面,Evernote有很好的Native手机版支持,除了基本的功能之外,还可以通过Evernote上传用手机拍摄的照片。在这点 上Notebook是个穷光蛋,一无所有。但是在国内,当3G应用还没有普及的情况下,唯一可以上Internet的途径就只有GPRS了,然而 Evernote却不支持GPRS连接;此外就WiFi的覆盖还没有形成面布局的现状下,能通过手机WiFi上Internet的地方,通常使用笔记本电 脑会更方便,能开拖拉机的时候,为什么要抡锄头?!
4. 在安全性方面,Evernote至少不支持HTTPS ,而在支持HTTPS这点上对于在国内渴望自由冒泡的家伙却是至关重要的;Notebook如同Google其它的重要服务一样是具备HTTPS支持的,但是要注意的是通过Notebook Extension访问Notebook时是不具备HTTPS支持的,切记。
5. Notebook的产品定位不甚明晰,与Bookmarks有重叠的部分,因此只能提供极其有限的书签功能,而这很容易造成用户的迷惑。这也或许是Google继续保留Bookmarks 而砍掉Notebook的一个原因吧。
6. 在Extension的支持上,Evernote和Notebook都提供主流浏览器的Extension支持,但是Evernote的 Extension相对较慢,而且不具备类似Notebook Extension迷你窗口可以直接存取的便捷功能,此其一短也。另外,Notebook及其Extension的停止开发意味着未来的主流浏览器升级后 将不能通过Extension便捷得使用Notebook,虽然它还是在Google Notebook产品组的维护期内。
7. 其实最原始的满足捕捉想法、搜集和记录素材等基本需求的方式就是用一个顺手的文本编辑器搞定,虽然这种方式最大的2个弱点就是不能随时随地的存取同时也不便于管理。

选择:
1. 在Notebook Extension还可以使用的情况下继续使用Notebook,这纯粹是个人选择,同时也是个人的使用惯性问题,如果从未用过Notebook就请直接使用Evernote吧;另外Evernote也提供了便捷导入Notebook的功能,因此也不用担心后期从Notebook迁移的问题。
2. 在使用Evernote或Notebook的同时,我也会使用改进型的基于文本编辑器的方法,以方便在不需要剪辑网页内容或者没有可用Internet时使用。

当初还是经Venjet 介绍才开始使用Notebook的,在这之前我一直使用改进型的基于文本编辑器的方法,在此会作一个分享,希望能有更进一步的完善。原始的基于文本编辑器 的方法就是在桌面上直接创建一个纯文本文档,但是该种方式很容易造成文档丢失或与其它文档混淆。怎么解决呢?有2种基本方法和在基本方法的基础上的2种改 进方法:)

2种基本方法:
M1. 在实际需要存储文档的地方创建文档(.txt或.doc等)而不在是桌面上,创建一个指向该文档的快捷方式,然后将该快捷方式置于桌面。由于 Windows会根据文件的扩展名选择相应的默认应用程序来打开该文档,因此只要打开该快捷方式就能以相应的默认文本编辑器打开该文档。比如,对 于.txt文档通常会以记事本(Notepad)打开。该方法的优点是能有效减少文档丢失,混淆,或找不到的问题。
M2. 但是使用M1的缺陷是不能任意指定开启文档的文本编辑器。这时可以通过在桌面上创建你所喜欢使用的文本编辑器的快捷方式,然后在快捷方式的目标 (Target)栏中,文本编辑器的执行程序路径后添加该文档的全路径(Full Qualified Path),如果路径中包含空格(space)请用双引号括起整个路径字符串。例如,在Windows下我会用Notepad++ ,然后将Notepad++的快捷方式的目标设置为: "C:\Program Files\Notepad++\notepad++.exe" "d:\note.txt";在Ubuntu 下会用gedit ,将gedit桌面快捷方式的命令栏(Command)设置为: gedit %U "media/sda5/note.txt"

2种改进方法:
M2+. 但是如果你使用的是多重引导操作系统(Multiple Boot),M2就存在一个问题: 如何在不同的操作系统中保持同步,比如我在Vista下作了一些临时记录,现在切换到Ubuntu下了,我怎么存取在Vista下做的记录呢。答案很简 单,将该文档置于Vista和Ubuntu都能存取的磁盘分区上,然后将文本编辑器的桌面快捷方式指向同一文件即可。其实在M2的例子中就已提到,media/sda5/note.txt就是d:\note.txt,这是在同一磁盘分区上的同一文件。如果需要剪辑网页或图片,则可以使用重量级的文本编辑器,例如:Sun OpenOffice Word Processor 或者MS Office Word,就个人而言我喜欢轻量但不是简单的文本编辑器,Windows下的记事本(Notepad)是不值一晒的。
M1+. 利用Vista和Linux下的软链接(Symbolic Link)功能,采用M1,在桌面上创建一个指向该文档的软链接即可,同时参考M2+也同样可以解决M2在的同步问题。由于Windows只在 Vista版本才开始支持软链接,故此处只提Vista。

2/06/2009

重复, 重复, 再重复: 技术就是最好的服务 - 淘宝, 客服在线, 技术逃跑

由于原来的Password-Pattern设计的不够合 理,因此从2008年11月9日开始重构。发现淘宝帐户的登录密码too strong了:) 按照原Password-Pattern的设计,登录密码居然变态得达到了17个字符长。于是按照重新设计后的Password-Pattern准备调整 淘宝的登录密码,结果淘宝爆了个"出错啦:密码不匹配"的一个傻BB的娘娘腔提示,在确信自己没有输错密码的情况下给淘宝客服发了一封求助信,并告知淘宝 客服可能在注册、登录的密码字符长度限制与更改密码功能中的密码字符长度限制存在不一致的猜测。按照淘宝客服的48小时内保证答复的承诺,在11月10号 我收到了淘宝客服的答复邮件,答复内容却令人有一种被揶揄了的感觉,其中关键的一段话是"关于您反映的问题,请您首先刷新页面,多次尝试;或者请将您的IE浏览器升级到6.0以上版本;点击浏览器-工具-Internet选项,在常规中选项中点击'删除cookies'和'删除文件',然后关闭所有打开的网页,重新打开再做尝试。建议您再重新尝 试输入您的密码。" 。类似这样的句式我记得只在星爷的<大内密探008>里听过,"我们会一连3天,重复,重复,再重复的解剖...",作为回应,我又给淘宝客 服去了一封站内信。当然,"FUCK"一词在信中是一定要有的,不论淘宝客服的邮件答复系统是否是纯Machine的。

11月16日接到 了淘宝客服的电话,电话中这位客服先生仔细询问了我的相关帐户信息,我也和其确认了淘宝在密码字符长度限制上的不一致的问题。可能当时的通话语音质量不太 好,11月17日我才收到了淘宝客服的回复"小二已经核实清空了您的密码保护问题,请您核实,感谢您对淘宝的支持!"。于是我重新登录并试图再次更改核武 级的密码,A good job! 的确密码保护问题被置空了,能重设密码了吗?才怪!注册、登录时都用的是长度为17位的密码,重设密码时"现在密码"输入框至多允许输入16位字符,也就 是说无论如何我都不可能输入正确的老密码,又怎么能更改密码呢!另外顺带提一下,淘宝的"现在密码"这个新术语和之前提到的"出错啦:密码不匹配"都是一 副大姨妈来了的德性。在此,我被该死的"现在密码"误导了,在置空了密码保护问题后更改密码时是不需要输入"现在密码"的,SHIT! 


如此这般折腾,期间又和淘宝客服电话沟通过数次,最终在2008-12-01完成了更改密码的天大的工程,不得不对淘宝所作的伟大工作做一个总结:
1. 原来的密码长度是超过16个字符长,也就是说这种情况在写本文之前是被淘宝所允许的,现在淘宝已将注册时的密码长度限制为6~16个字符长。如果淘宝需要 兼容原拥有密码超过16个字符长的用户可以照常登录,这种考虑也是正确的,但是即便如此,"现在密码"的输入也必须允许超过16个字符长的密码的输入,而 在"新密码"输入时予用户以明确告知:密码只接受6~16个字符长,原超过16个字符长的密码不再支持;相反,淘宝没有这样做,这是一个不合逻辑的事情。 我不知道淘宝为何将原本允许超过16个字符长的密码调整为密码只允许6~16个字符长的理由,淘宝是在使用统一的用户私密信息存储机制吗?淘宝是在使用统 一的用户身份的认证和授权机制吗?这是我下意识的2个疑问。对于安全问题,系统的安全强度往往是由最短板决定的,而这块最短板往往又是系统缺乏一致性所造 成的。对于淘宝的之所以要这样做的原因我更懒得去深究,我只知道这是符合Nothing is Impossible Pattern的,我曾经看过很多小菜鸟和老菜鸟做的系统,当然现在也还在看:( 这些系统存在一个共有特征,就是"弱技"。什么叫弱技?,简单的说就是对系统要解决的关键性问题缺乏理解和把握,再加上相应偏弱的实现技术,最终导致系统 有着令人哭笑不得的诸多限制。并且具备"弱技"特征的系统至少存在一条你只需要动动手指就能令其崩溃的途径,再次,具备"弱技"特征的系统是严格遵循 Nothing is Impossible Pattern"的系统。
2. 在技术上不能保证系统的正常和有效运转时,必然要过度地仰赖于客服系统。幸运的是淘宝的客服系统还是有效的,至少目前如此,因为我的问题虽然历经3周最终 还是得到了解决。然而客服系统的有效性是有条件的,并且在服务的规模上是有上界的,这也是由客服系统的固有特性决定的,首先,如何保障客服质量的一贯性和 一致性,这是所有客服系统都需要面对的问题;其次,客服系统的规模和其服务的用户数量至少存在线性相关性,也就是说随着服务的用户数量增加的同时,其客服 系统所需的成本也至少是呈线性上升的;最后,当客服系统所需服务的用户数量增加到一定规模时,如果不对其现存的基础设施进行改造升级,这样的客服系统是处 在崩溃的边缘的,是毫无意义的客服系统。


此文本是2008年动笔 的,结果由于那段时间懒筋骚动,所以迟迟未能完成,目前也只是写了2/3,此时再想提笔却又没有了那份冲动,写完又有何益。倒是Google Blogger目前支持Google Docs -> Blogger的特性值得一赞,原来都是在Google Docs里写完,然后贴至Gmail,再email至Google Blogger。此举颇费周折。现在一步到位,小小的技术改进,带来的仅仅是便捷么?!