自我介绍

一个互联网工作者,顺便聊聊其他的一些有趣的事情

日历

September 2010
M T W T F S S
« Aug    
 12345
6789101112
13141516171819
20212223242526
27282930  

Google 广告

I Hate this!

我现在越来越讨厌Google Reader里的一个功能了。这个功能的名字叫做“Like”。在每篇新闻下面,你点一下,然后就把你的名字加入到喜欢这篇文章的人之中。说:You and XXXX people like this。换成中文的意思就是,你喜欢这个。

可问题是不是每次我都想喜欢的,我点”Like“,就把自己搞糊涂了。其实我一点都不喜欢这篇文章,甚至很厌恶,厌恶里面报道的内容,但是这个事情又很重要,我想表达一下我的情绪。只是这个情绪,显然不是”Like”。大量在Solidot上的文章,我就特别有强烈的点一下的冲动,但是这个冲动绝对不是喜欢。我不喜欢,我甚至很厌恶,厌恶到了要拆庙的地步。

所以结果就是,我点了喜欢,然后又把喜欢给点掉了。

也有人说,不是还有一个分享的按钮么……但是,点分享是有风险的,这个事情会给Google带来更多的麻烦,尤其是我钟爱的GR。强大的GFW会侦测到一些RSS来源中出现敏感词汇,把GR的某项指数提到很高。终有一天,会因为分享这个事情,把GR拦在巨大的局域网之外。所以,为了GR的安全,还是让我们忍受,Like这个功能的纠结吧。

不要问我具体是啥内容。

No Chinese pay for Popcap games?

There are too many illegal software users in China, so you can deduce that there no Chinese pay for it.

But in my experience, it is the truth that there is seldom Chinese buy Popcap game.

Today, I tried to buy a mac version popcap game named “Mummy Maze”.
I wrote my first name and last name in [...]

有国人购买POPCAP的游戏么?

我想,一定很少。因为今天我购买了,然后发现了一个巨大无比的BUG。

具体的流程是这样的:

在支付的时候,有一个必填项目是Billing Address,其中需要填写Last Name和First Name。然后我想,既然填写的是Billing Address的话,为了确保能够给我发到账单,我就留一个中文的姓名和地址吧。

填完表单,得到了回执,几乎同一时间,邮箱也收到了完全相同的一封信。
但是——老大,为什么我的Register Name 是 ?? ?。

作为一个长时间使用电脑的用户来说,我采用了两种尝试方式,一种是不太有希望的,直接老老实实地在Register Name里面输入?? ?。显然没有通过。然后呢,我打算用copy + paste大法来搞定,结果出现c,结果也没有通过。

所以最后,我只能向popcap投诉。

我觉得问题出在两个地方:
1. 没有人说,billing address必须是英语。
2. 也没有告诉我,billing address里面地first/last name是用作register name的。
如果两个提示中有一个,我都不会输入中文啦。

这么大的一个BUG,大家都没有发现,难道只是欺负MAC用户么?
还是说几乎没有中国人买popcap的游戏?

走读Kestrel,了解Scala(5)

继续走读QueueCollection.scala的代码,因为后面封装的大量方法,都是对queues和fanout_queues的操作,根据定义,这两个变量都是mutable.HashMap[String, XXXX]类型的,所以我们先介绍一下mutable.HashMap的几个在Java中陌生的方法:( scala 的 apidoc 在 http://www.scala-lang.org/docu/files/api/index.html 可以查到)

apply (key : A) : B
Retrieve the value which is associated with the given key. This method throws an exception if there is no mapping from the given key to a value.
get (key : A) : Option[B]
Check if this map maps key to a [...]

走读Kestrel,了解Scala(3)

读完ManyClients.scala之后,基本上对Scala有一个大致的印象了,接着我们就开始读核心的程序模块,从src/main/scala/net/ketrel开始。

需要介绍一些scala的package:

……
import java.util.concurrent._
import scala.actors.{Actor, Scheduler}
import scala.actors.Actor._
import scala.collection.mutable
import org.apache.mina.core.session.IoSession
……

在Scala里面主要用到了几个开发包,java.util.concurrent是Java 5.0平台上的多线程框架。org.apache.mina是Apache Mina提供的NIO开发包,因为走读主要是为了了解Scala,所以就不多说这两个包了,让我们着重说一下scala的一个非常有用的多线程核心包actor。

actor,在Scala中几乎占到了非常核心的地位。有很多人几乎是同时听到actor和scala的。或者是因为scala有了actor,才决定用scala的。当然,scala不仅仅有actor,在后面的代码中,你可以看到许多语言的设计,都使得actor的设计近乎完美,简洁的,可读性很高的代码,可以完成非常多的工作。

不过还是让我们从简单的actor开始吧,一个完整的actor写法如下:

import scala.actors.Actor
class Redford extends Actor {
def act() {
println(”A lot of what acting is, is paying attention.”)
}
}
val robert = new Redford
robert.start

Redford继承一个Actor的类(关于class和object在Scala的区别,我们稍后再说),它有一个函数,也就是线程运行的内容叫做act(),当线程启动之后,就会执行这个act()函数。需要调用这个线程的时候,创建这个对象,然后调用robert.start线程就启动了。

这个写法其实没有太多的精细,只是比Java的写法少敲了一些键盘而已。这倒是没有什么错,但是往下看,我们多import进来一个package,就可以这样写了:

import scala.actors.Actor
import scala.actors.Actor._
val paulNewman = actor {
println(”To be an actor, you have to be a child.”)
}

直接启动一个线程,处理一个分支的业务。大括号里面的就是act()的函数体。再回过来看Kestrel的代码:

private val deathSwitch [...]

绿坝 vs 卡巴斯基

不晓得卡巴斯基是不是受到了绿坝的启发,增加了一个虚拟键盘的功能,在开启虚拟键盘输入密码的时候,任何试图通过截屏来分析用户鼠标的软件都会失效(来源)。这不难让人想到了绿坝的基本原理,就是在用户输入的时候,通过截屏来分析用户正在输入什么。

卡巴斯基这次更新,告诉大家原来有这么一个技术,在“必要”的时候,可以禁止任何软件截屏的功能。

虽然还不知道到底卡巴斯基是怎么实现的,但是只要把这项功能延伸一下,打一个补丁,就可以制作出防截屏的notepad,防止截屏的word,防止截屏的IE, FireFox, Chrome。从此热烈庆祝,魔高一尺道高一丈的桌面战争,全面升级了。

调式iPhone/iPod应用程序,无需成为ADC付费会员

昨天晚上捉摸了一下,怎么在不成为Apple的ADC付费会员的情况下,让iPod和XCode联调。

本来也没有觉得这个问题会很重要。但是当我开始编写关于存取文件系统的时候,发现通过XCode的标准函数NSSearchPathForDirectoriesInDomains获取Applicaiton可以存储的目录时,获得的路径都是 /User/Application/3EB85CE1-79F8-4A91-BBBB-B00C888F02DE/Document…. 一样的目录,而每次 “3EB85CE1-79F8-4A91-BBBB-B00C888F02DE” 都在更新。

所以当我把代码用scp复制到iPod上面的时候,在没有报任何错误的情况下,就存储失败了。鉴于自己写一个可以输出日志的模块太麻烦(其实也不麻烦,就是觉得会和操作之间互相干扰),所以决定搞一搞iPod App的数字签名问题。

于是就搜索到了一篇英文文章:Developing for a jailbroken iPhone, A to Z (iPhone 2.2)

iPhone使用证书签名,限制可以在iPod/iPhone设备上使用的软件。在一般情况下,开发工程师成为一个ADC(Apple Developer Connection) 付费会员,从ADC获得一些认证,包括数字证书。他下载证书,把证书的相关信息导入XCode。当他编译程序的Debug或者Release版本的时候,都用这个数字证书签名。他也把签名后的程序传输到iPhone,或者提交给Apple的App Store,数字签名保证了程序是来自于一个注册的,值得信赖的ADC会员手中。

对于开发工程师来说,这篇博客的重点是,怎么在一个jailbreak后的iPhone/iPod上面,绕过Apple的ADC付费会员认证,就可以让XCode和iPhone/iPod做联调,不过仅仅限于被jailbreak的iPhone/iPod。

具体的过程是这样的:

需要一个被破解后的iPhone/iPod,注意,里面需要有Cydia,保证后面的步骤正常进行。
创建一个自签名证书:参考Code Signing Guide – Procedure

在”应用程序”之”实用工具”的目录中,找到应用程序”钥匙串访问”,并打开它。
在目录“钥匙串访问”的“证书助理”中选择,“创建证书”,弹出对话框。
填写名称为“iPhone Developer”,类型是”自签名根证书”,选择“让我覆盖此要求的默认”,点击“继续”。
设置序列号,有效天数,选择证书类型:“代码签名”, 点击“继续”。
填写完基本资料之后(其实可以都不填写,反正是自己用),然后一路点击“继续”到最后。

中断iPod/iPhone对数字签名的认证。有两种方法:

在Cydia里面,选择Manage,选择Sources,选择Edit,选择Add,添加应用程序源,然后添加 http://iphone.org.hk/apt 。自动更新之后,找到MobileInstallation Patch这个应用程序,然后下载。执行完毕之后重启。(我使用的是这个办法)
另外一个办法,就是添加源:http://cydia.hackulo.us ,相同的步骤,最后找到MiPatch,安装重启。

(注意备份)修改在Mac上的 /Developer/Platforms/iPhoneOS.platform/Info.plist 配置文件:

<key>NATIVE_ARCH</key>

<value>armv6</value>

<key>PROVISIONING_PROFILE_ALLOWED</key>

<value>NO</value>

<key>PROVISIONING_PROFILE_REQUIRED</key>

<value>NO</value>

修改开发项目中的配置(每个需要调试的项目都要这样设置一次,不过也就设置一次):

用XCode打开你的项目,在Project菜单中,选择Edit Project Setting。
在弹出窗口中,选择Build分栏,然后Configuration选择All Configurations,Shows选择All Settings。找到Code Signing Identity,Setting列选择Any iPhone OS Device,右侧输入iPhone Developer(就是在第二步c中填写的名称)。
在项目的Info.plist中添加一段xml:

<key>SignerIdentity</key>

<value>Apple iPhone OS Application Signing</value>

好了,现在在编译的时候选择Device + Debug/Release,就能看到插上数据线的iPhone/iPod能够弹出需要调试的应用程序了。