.net framework2.0,3.0,3.5的CookieContainer的bug解决方法

用HttpWebRequest发送请求,附上了CookieContainer(CookieContainer里面确定已经包含了所有需要的Cookie),但是当发送请求后某些Cookie并没有发送出去,调试了两天,一直觉得是请求的网站设了什么古怪的限制,使请求老是发送不成功,最后用SocketSniff抓包发现少发送了几个Cookie(因为这些cookie涉及到几个子域名),检查CookieContainer,里面确实有这几个Cookie,最后只好反编译HttpWebRequest,在类CookieModule里发现方法OnSendingHeaders的如下代码,这个是把cookie设置到headers里面的关键地方:

internal static void OnSendingHeaders(HttpWebRequest httpWebRequest)
{
try
{
if (httpWebRequest.CookieContainer != null)
{
string str;
httpWebRequest.Headers.RemoveInternal("Cookie");
string cookieHeader = httpWebRequest.CookieContainer.GetCookieHeader(httpWebRequest.Address, out str);
if (cookieHeader.Length > 0)
{
httpWebRequest.Headers["Cookie"] = cookieHeader;
}
}
}
catch
{
}
}
问题出在GetCookieHeader这个方法里面,某些Cookie的domain判断错误导致没有附加上去。.Net framework4.0以下的都存在此问题。最后把程序框架调到4.0的,就没有这个问题了。当然4.0以下的框架版本可以用下面的方法处理一下CookieContainer里面domain。

  1. Don't use .Add(Cookie), Use only .Add(Uri, Cookie) method.
  2. Call BugFix_CookieDomain each time you add a cookie to the container or before you use .GetCookie or before system use the container.

    private void BugFix_CookieDomain(CookieContainer cookieContainer)
    {
        System.Type _ContainerType = typeof(CookieContainer);
        Hashtable table = (Hashtable)_ContainerType.InvokeMember("m_domainTable",
                                   System.Reflection.BindingFlags.NonPublic |
                                   System.Reflection.BindingFlags.GetField |
                                   System.Reflection.BindingFlags.Instance,
                                   null,
                                   cookieContainer,
                                   new object[] { });
        ArrayList keys = new ArrayList(table.Keys);
        foreach (string keyObj in keys)
        {
            string key = (keyObj as string);
            if (key[0] == '.')
            {
                string newKey = key.Remove(0, 1);
                table[newKey] = table[keyObj];
            }
        }
    }

笔记本空格键左边或右边失灵的问题(x61空格键)

前天晚上发现空格键下面有点东西,就把空格键掰了下来,清理完后把空格键扣上后,发现空格用起来怎么都没有以前的那种感觉了,按下去哗哗的响,而且左边和右边不起作用了,只能按中间才行,当时折腾了半天也不知道是怎么回事,以为是把空格键掰坏了,用了两天,实在受不了了,我打字什么的都喜欢用空格键的左边,现在失灵了,超级郁闷。在百度上搜,没找到结果,还是强大的51nb论坛好,搜到几个人发帖问同样的问题,原来是空格键没有装好,我一直以为空格键上面卡的那根铁丝是用来强化支撑空格键的,原来它是可以动的,安装时先要把它弄起来,两边的勾勾要卡在盘底的两个卡子上,卡好后再按下空格键让x形支架卡住,这样就好了,又恢复了以前舒服的手感,按下去也没有声音了,左边和右边都起作用了。

在美国Apple Online Store订购iPad的攻略

原创文章,转载请注明出处 http://wuhongsheng.com/

在美国Apple Online Store订购iPad的攻略

文章开篇前,我们先来算个帐:32G Wifi+3G版本的iPad,在淘宝上面销售的均价是人民币7850元。官方售价为美元729,折合人民币4980元。中间奸商赚取差价2870元。

然后我们再算算,从美国购买iPad发国际快递回国内,价格为官方价格729美元+国际快递费用27美元,折合人民币5162元。

足足比淘宝上面便宜了2688元。如果购买两台,那么省下来的钱,足够买第三台了。

相信大家都比我会算数。

当然,也有很多人想到这点了。但是他们没法买。为什么?因为在美国的Apple Online Store购买iPad,必须要有美国的地址。身在国内的人们,运气好的在美国有朋友可以帮忙代购,运气不好就只能干瞪眼。那些找美国朋友的,也会欠下一 个人情,早晚要还。而且现在美国全境大部分的线下商店的iPad都早已脱销了,就算有钱也不一定能买到。最后还是需要在Apple Online Store预定。

OK,我们来总结下在Apple Online Store订购iPad所需要具备的条件吧。

1.一个美国的地址
2.一张支持美元支付的信用卡,国内国外的无所谓,卡上的额度必须要够,为你所购买的iPad价格的2倍。比如购买32G Wifi+3G版本,价格是729美元,那么卡上就必须要够729*2=1458美元(等额10000人民币)。为什么要这么多,我会在后面说明。
3.关税问题
4.足够的耐心,把本文看完,并且可以等待10个工作日的订货周期

我们继续,先解决第一个也是最重要的一个问题,美国的地址。

中华民族的智慧是无穷的,包括身在海外的华人。在遥远的大洋彼岸,有为数众多的,华人开的快递公司,比如AAE。他们除了运营着中美之间的快递业务 外,还提供了一些增值服务,比如为你提供美国地址,然后把美国地址所收到的包裹快递回国内。

看到这里,你就知道,美国地址的问题有解了。

当然,Apple也不是吃素的。由于提供转运服务的快递公司能提供的收件点有限,一个地址被无数人使用,所以是绝对过不了苹果的审核关的。因为 iPad现在的产能严重不足,全球严重缺货,所以苹果使用了机器+人工的方式对地址进行识别。对于同一个地址,一定时间内订购超过2台以上iPad的,就 会被取消订单。

还是那句话,中华民族的智慧是无穷的。

废话说了很多,我们先开始吧。既然是攻略,总要有步骤的。

我们先去gels注册一个帐号。gels是AAE旗下一家专门提供运转服务的公司,他们为不同等级的会员提供美国各个州的收件地址。我们要知道,在 美国买东西,都是有消费税的,每个州的税率都不一样,有些州还免税,比如阿拉斯加、俄勒冈,都是免税的州。gels就提供了两个俄勒冈的收件地址,这样我 们用来购买iPad就不用交税了,可以省下至少7%的消费税。

gels的注册地址(必须要从这个地址注册,而且要在推荐注册人里面留下我的ID,没有推荐人的话你是无法注册成功的): http://url.cn/2038Ab

gels注册完后,你是看不到任何可用的收件地址的。提供运转服务毕竟不是什么光明正大的事情(从推荐注册的方式就能看出来)。你需要先充值一定的 金额,获得相应的会员级别后,才能看到对应级别会员可用的地址。等级越高,可用的地址就越多,而且会有免税州的地址,费用也能更加便宜。充值进去的金额会 被直接充当快递费。如果你不需要用他们的服务了,充值的费用可以退还,但必须要扣人民币50元的手续费。

这里我建议大家直接充值1000块钱升级为白金会员。因为只有这个等级的会员才能拥有免税州的地址,这样购买iPad才能免税。等iPad到手后, 再要求他们把剩余的钱都退回来,也就只需要再付50块钱而已。

OK,这里我假设大家都升级为白金会员了。这时可以在个人页面上看到“美国俄勒冈州GELS仓库(OR)收货地址”,我们就选这个地址吧。但这个地 址不能直接用,还需要单独处理下。

注意!!请不要使用备用地址里面的OR收货地址!!这个地址可能会导致收货失败!!血的教训,不止我一 个人因为寄送到这个地址而导致无法收货!!

然后就是激动人心的下订了。我们打开 http://store.apple.com/us/browse/home/shop_ipad/family/ipad ,选上一款自己心仪的iPad,丢进购物车,然后去结算。

结算页面,首先是填收货地址。要注意的地方来了,我们!!千万!!不能按照gels给的地址原样填上。

首先是为了确保收货人的唯一性,gels给每个会员分配了一个ID,比如ABCDE,这个ID必须要填写到名(First Name)上。如果你这个地方填错了,那么你就收不到货了。切记,这个ID不能填写到别的地方,包括填到姓(Last Name)里面。原创文章http://wuhongsheng.com/

把ID填写到first name里面后,last name就没关系了。我们可以随便乱填,不填你的名字都无所谓,这个不影响收货。比如我们可以在last name里面填上kelwen甚至ungi啥的。但如果万一订单出了问题,你要打国际长途查询,对方要求你的名字,你就要能正确说出来,避免杯具。

接着是Area Code和Primary Phone,这里填写的是电话号码。最好我们直接使用gels给的号码,或者你对自己修改后的地址很有信心,那么可以自己填一个。比如前阵很流行的 Google Voice,注册成功的朋友肯定都搞到了一个美国的电话号码。如果没有,可以把gels给的号码后面四位改改填上去。最后Area Code里面填写电话号码的前三位数字,如503,Primary Phone填写电话号码的后四位,如666-6666。反正这里自己发挥想象力,确保电话号码是一个格式上合法的假号码,或者真号码,都可以。

Email Address和Company Name都可以留空不填

最重要的地方来了,地址填写部分。地址填写一共有两栏,一栏写不下可以写另外一栏。按照gels给的地址,肯定是一栏可以写下的,但我们不能这样 干,否则Apple第一关,电脑自动检查重复地址就过不去了。Apple的程序对地址的自动识别率还是非常高的。原创文章 http://wuhongsheng.com/

我们在这里要做的,就是把地址改为程序识别不出来,但快递员人工又能正常的阅读并且投递。

聪明的小朋友一定想到了,我们加一些无关紧要的话进去不就好了吗?bingo!

比如,我们可以把地址拆成两部分,然后在第一部分的开头加上一些东西,在第二部分结尾也加上一些东西,地址里面的数字改改(当然不是单纯的把 first改为1st这么简单,这样的话程序也是可以识别出来的)。

再说明白一点。比如gels给出来的地址是1 NW 3 ST,那么拆成两部分就是1 NW和3 ST,我们把第一部分改为PLS SHIP TO #1 NW,第二部分改为#3 ST PORTLAND OR,这样就可以了。但我建议大家还是继续发挥自己的想像力,尽量区别开来。

改了地址后,请到http://maps.google.com/,输入修改后的地址,看看google搜索出来的地址是否还是原来的位置。如果 是,那么就没问题。

最难的一部分已经搞定了,后面的Zip Code输入邮编,然后把This is a business address选上,点击Continue保存并且进入到下一步的信用卡信息填写。

信用卡资料填写,大部分的地方都和收件地址一样。但是First Name和Last Name必须要填写你信用卡上面的英文名字。因为信用卡支付要匹配这部分的。所以这里必须要填写真实信息。其余部分照抄收件信息即可。

之后就是Continue,然后苹果会对你的信用卡进行两次1美元的扣款(也有一次的),以确认你的信用卡可用。然后苹果会再扣你所购买的iPad 的金额(比如729美元)。这三次对信用卡的扣款都是预授权形式的。也就是并没有实际进行消费,只对信用卡里面相应的金额做冻结。只有在苹果给你寄出 iPad以后才会正式扣款

只要扣款成功,苹果就会给你显示一个订单概况。但这个概况不代表苹果和你之间的合约已经构成。

说说文章开头提到额度的问题。不知道是因为国内信用卡在苹果上面走的通道有问题,还是其他原因。我的几张信用卡(中行和招行)在苹果寄出iPad后 正式扣款的时候,并没有对原先做的预授权进行完成预授权,而是重新扣了一次同样额度的刷卡消费。这样造成的后果是,产生了两笔同样金额的消费,但只有后面 一笔是刷卡消费,前面一笔仍然是预授权冻结的状态。所以造成了我中行的卡上没有留下足够的额度,造成苹果扣款失败。之后打了中行的电话要求临时提额,并且 打了一个国际长途用我蹩脚的英语找苹果的人给重新扣款,但最后还是因为成功扣款太晚,fedex没收到扣款后的结果,最后把我这个订单给退回了苹果的回收 站ELK GROVE, CA,导致购买失败。原创文章http://wuhongsheng.com/

所以为了保险,建议大家一定要在卡上留有足够的额度,以防出现意外的情况。

继续回到刚才的流程。支付后,在苹果销售部门正常上班的情况下,你会在一个小时内收到苹果发来的一封名为“Order Acknowledgement”的邮件。收到这封邮件表明苹果已经收到你的订单和付款,并且订单已经通过了初步的审核。同样,这封邮件也不会构成苹果和 你之间的任何合约,苹果一样能随时取消你的订单。

之后的时间就是看人品了。在订单提交成功的3个工作日内,苹果会有人工对订单进行复审。只要在3个工作日内你没收到苹果发来的,标题为 “Action Required”的邮件,那么恭喜你,你的订单基本上已经成功,并且已经提交到富士康进行生产了。之后你会有两个星期的漫长等待,中间你不会收到任何苹 果发来的邮件,就跟石沉大海一样。在后台查询订单的状态都是 Not yet shipped 原创文章http://wuhongsheng.com/

在9-10个工作日左右,登录Apple Online Store查询订单的Status,订单状态会变为 Prepared for Shipment,在这个状态下,就是iPad生产好,准备从富士康发货了。一般会在1-2天内从富士康通过fedex发到美国。

所有发出来的iPad,都是先从深圳,过关到香港,然后从香港空运到美国,之后在美国中转几次,最后送到gels的地址。

gels在签收后,会对货物统一整理,然后到他们的大仓库。这个时候在gels的网站就可以对货物进行操作了。在gels上面提交运单,等上几 天,iPad就会原包送到你手上。因为没有你的允许,gels是不会拆开包裹的。他们寄送的时候,会在原有的fedex包装上面重新打包一层寄给你。真正 做到了原包未拆封。原创文章http://wuhongsheng.com/

OK!整个购买iPad的攻略就到此为止。如果你不再需要gels的帐号,可以联系他们的客服要求退回余额。

最后说说关税,一般情况下,你需要如实申报寄送的物品,但是否需要交关税主要看海关抽查,运气不好被抽上的话,只要属于正常的自用范围,是不需要征 税的。如果超出范围,那么一台iPad需要交600-1000的关税。但就算要缴税,也比淘宝上面买的便宜1000多。

用BirdNest在Google App Engine上搭建一个twitter API

想在手机上看看twitter,下了个程序,但登录不上去,网上找来找去也找不到一个可以放心使用的api,看到一篇教程,用birdnest在google app engine上搭建一个api就好了,幸好gae还没有被封。

环境准备:Google App Engine

先要注册Google App Engine,注册地址 http://appengine.google.com/ ,然后建立一个application,目前第一次使用需要验证用户手机,输入手机号码就收验证码即可,之后,就可以用 yourid.appspot.com来访问你的app应用。

此外,还需要下载安装Google APP Engine的开发环境,注意Python的版本,需要是2.6系列的,不能使用3.1系列的,否则运行会出错。

Google App Engine SDK 下载地址 http://code.google.com/intl/zh-CN/appengine/downloads.html

Python 2.6.5 下载地址 http://www.python.org/download/releases/2.6.5/

环境准备:BirdNest

下载birdnest要注意是下载分支branches/gae,别下载主干trunk,否则更新到GAE上也不能用,会报错。可以使用一个SVN工具下载。例如TortoiseSVN等。 将其放到一个目录中,进入目录,编辑app.yaml文件,将第一行的application里的参数修改为自己的应用名。

发布应用到GAE

准备好了上面的一切后,就可以发布这个应用到自己的Appspot上了,打开Google App Engine Launcher。点击菜单创建一个新的application(这里创建的application名称要和上面修改的app.yaml应用名一样),然后把下载的birdnest文件复制到这个application的目录里面,(ps:在复制文件到这个application目录下面的之后,在我的电脑上发现Google App Engine Launcher里面的这个应用无效,最后把app.yaml用记事本打开重新保存一遍就好了,可能是文件编码的问题,如果你也出现了这个错误,可以试试把文件重新在记事本里面打开再保存一下),最好在Google App Engine Launcher里面选中这个应用后,点击Deploy按钮把代码上传到网上去,等待上传完毕后,你创建的API地址应该是:应用名.appspot.com/api/

打开api可能出现的错误提示和解决办法

出现“internal server error”错误,这个看别个说是代码里面有问题,你可以尝试删除code.py里面的下面一段代码:

import socket
import re
ua = web.ctx.environ.get("HTTP_USER_AGENT", 'None')
if ua.find('jibjib') >= 0:
socket.setdefaulttimeout(60)
elif ua.find('zh-CN') >= 0:
#raise Exception('unknown error')
socket.setdefaulttimeout(2)
else:
socket.setdefaulttimeout(2)

如果不想去下载birdnest或者运行时程序出现错误,可以试试本站提供的压缩包:birdnest.rar
注意把app.yaml文件里面的你的应用名字改成你自己的。

支付宝导入数字证书出现Microsoft Visual C++ Runtime Library

windows 7 x64操作系统,用IE8登录支付宝导入证书的时候出现Microsoft Visual C++ Runtime Library错误,貌似是因为IE8的安全选项默认设置的问题,导致了这个错误。进入internet选项,修改一下安全设置就可以了。

IE8浏览器的菜单:工具 -> Internet选项 -> 安全 -> 自定义级别 -> 将本地文件上载至服务器时包含本地目录路径,选中启用即可。

用Yahoo Pipes制作全文输出的RSS:cnbeta全文输出方法

cnbeta的rss全文输出方法。共享一个我制作的cnbeta的全文输出feed:
http://pipes.yahoo.com/pipes/pipe.run?_id=035788f8a9608efa4e74a2f0960c2cd1&_render=rss

很多网站尤其是一些新闻类的网站虽然提供RSS输出,像我天天光顾的cb就不是全文输出,如果要看全文还要点击进去,这样总感觉不是很爽……不过现在有了Yahoo Pipes就好办了!这是Yahoo提供的一款超级强大的RSS处理工具,今天俺就教你如何用它来输出网站的全文!

第一步

先在 Yahoo Pipes 里新建一个 pipe(如图)

Create a pipe

第二步

拖入一个 Fetch Feed 模块,输入你想要全文输出的RSS地址(如图我添加的是cnbeta的RSS

第三步

然后到Operators条目下拖入一个 Loop 模块,与 Fetch Feed 相连接

再到Sources条目拖一出个 Fetch Page 模块拖进入 Loop(注意是拖进Loop里面去,如图)

设置 URL 为 item.link

第四步

这是最关键的一步!!!

随便打开你要全文输出的RSS其中一篇文章,然后等网页加载完毕后,查看这篇网页的源代码

然后查找网页源代码中正文部分,把能囊括正文的开始的地方(align="right" id="sign" onload="fixPNG(this)"/></a>)和结尾的地方(<div class="digbox">)找到。

然后分别填到Cut content from和to里面,如图

第五步

把assign项选为first,然后把results to填为item.description,将 Loop 连接到 Pipe Out,保存,大功告成!!!

最后

当然到这里已经可以全文输出cb的feed了,但还有一点不完美的地方,就是那个截取的内容前面都有align="right" id="sign" onload="fixPNG(this)"/></a>,这里我们可以插入一个regex操作,把这段字符串去掉。从左边的operators里面拖一个regex到右边来。然后在in里面选择item.description.content,replace里面填写align="right" id="sign" onload="fixPNG\(this\)"/></a>,with里面不用填(就是空着)。最后我的pipe图是这样的:

最最后

你可以点击下面的按钮和链接就行调试,不做多说了!这样获取的全文RSS肯定没有直接获取的高效,本人刚刚使用还不知道会不会出现很滞后的现象。(注:文章中有几个图片用的是别个的,懒得截图了)

gmail实验室里面的实验性功能

今天进到gmail的实验室看了一下,发现又加入了几个新功能。但也让我发现了一个很无语的功能。上图:

gmail真是贴心,有些人看到logo上的beta消失了,不安心,这个功能可以让他们安心下来。

google终于被墙了

昨天google宣布转战香港,cn的域名全部跳转到google.com.hk,今天早上访问google,不能搜索了,只能打开页面,显示不了搜索结果。估计要不了几天google会被彻底的墙掉了!

代发Flasher招聘的内容

代朋友发个招聘信息,喜欢Flash开发的朋友可以看看。

Flash开发工程师(程序员)

* 性别、年龄、学历不限;
* 工作经验2年及以上者;
* 精通Action Script3语言,熟悉Socket通讯编程,熟悉OOP设计方式;
* 熟练使用Flex3\Flash CS3等编程工具,掌握SVN等团队协作工作软件;
* 具备良好的协调沟通能力和团队协作能力;
* 有网络游戏、商务应用、娱乐多媒体系统开发经验者优先;

Flash开发工程师助理(程序员助理)

* 性别男,年龄26周岁及以下,大学及以上学历;
* 工作经验1年及以上者;
* 熟悉Action Script2.0或者3.0语言,接触或曾经参与过Socket通讯编程;
* 能使用Flex3\Flash CS3等编程工具;
* 具备良好的协调沟通能力和团队协作能力;
* 有网站、多媒体、游戏开发经验者优先;

这个公司是湖北一家比较出名的游戏开发、运营企业,在全国也小有名气。有7年多的互联网业务经验和70多人的团队。企业业务管理与行政管理比较完整规范,薪资待遇和发展机会还是不错的。有兴趣的朋友可以联系我朋友的信箱:dick.yeah[at]gmail.com

完美解决笔记本Vista休眠耗电的问题

一、如果你用的是Vista,或者Vista sp1,也就是没有升级到sp2,那么如果你的笔记本休眠的情况下耗电,那你可以如下操作,51nb上面一个网友发布的方法。直接转载过来了,操作很详细了,不作多说。

无意中看到cmd下的命令行工具powercfg,仔细研究了一下所有参数后,先运行了这个
C:\>powercfg -devicequery wake_programmable
ThinkPad Modem
HID-compliant mouse (001)
Intel(R) 82566MM Gigabit Network Connection
High Definition Audio Intel(R) Wireless WiFi Link 4965AGN

上面列出的是“用户可配置的从某个睡眠状态唤醒系统的设备”。
第一行是猫,第二行是外接的鼠标,第三行是内置网卡,最后一行 “High Definition Audio Intel(R) Wireless WiFi Link 4965AGN” 引起了我的注意,在无线网卡的前面多了一个“High Definition Audio”。这里可能是个bug,两个设备写成了一行。运行下面这个
C:\>powercfg -devicequery wake_armed
High Definition Audio

这里说明还有一个设备配置成用于唤醒。
使用powercfg -devicedisablewake "ThinkPad Modem",能顺利的把Modem的唤醒开关关上
但无法用同样的方法关闭这个"High Definition Audio"。

打开设备管理器,却无法找到这个“High Definition Audio”。然后在设备管理器的菜单“查看”里面选“依连接排序设备”,下面就能找到这个“High Definition Audio 控制器”了。
在它的属性里面果然也有一个“电源管理”,把唤醒的开关去掉。

现在再运行
C:\>powercfg -devicequery wake_armed

现在没有设备配置成用于唤醒了。

到了晚上,我看了一下电量,98%。休眠。然后拔掉电源,睡觉。
上午来到办公室,打开电源,从休眠恢复(毕竟比开机快了好多),看电量 98% ,!!! 搞定了!!!

我的系统是T61,vista,我想其他机型或是用xp,应该可以用同样的方法解决。

二、如果你已经把Vista升级到sp2,或者某天你用上面那个方法设置了之后你的笔记本又开始休眠耗电的话,你可以试试下面的解决方法,反正我是解决了休眠耗电的问题了,折磨了我整整大半年(自从把vista升级到sp2后),关机都不敢休眠,要忍受缓慢的系统重启过程,休眠的那种飞速启动的感觉没了,经过不懈的查找,终于找到解决的方法。

原来这是Vista系统的一个bug,微软在7月份的时候终于推出了一个补丁,当然这个补丁没有自动推送过来更新,需要你自己去下载,这个补丁的说明页面:http://support.microsoft.com/kb/970030,耗电问题是因为音效卡引起的,从微软官方下载这个补丁有点小麻烦,还要填邮箱,然后从邮箱里面提取下载地址,所以本站就提供一个给大家下载了,vista-sp2补丁-解决休眠耗电的补丁,希望大家能解决此问题,解救你的电池!当然,有机会的话还是升级到windows7,windows7应该没有休眠耗电的问题!