October 2, 2010

苏州旅游

基本上只在老城区逛了逛…还是吃的比较赞. 奥灶面,小笼,生煎,虾仁都挺不俗的,苏州菜似乎都略甜,别有一番风味. 还在新城区吃了人均仅138的自助日本料理,还是每桌一个包厢…

杂记

  • 城际列车过去只要半小时…不过苏州地铁还是没有造好
  • 公交居然可以用上海的交通卡,还可以打九折…
  • 出门在外,Google Map还是不可少…用iPhone的同学记得加这个源: http://apt.mirrordev.com/ 以解偏移之苦
  • 国庆前貌似游客都到上海去了…下雨天的平江路几乎没有人…还是挺有滋味的…
  • 再次推荐使用Google Map的My Map功能规划行程, 随后可以用 https://mymapsmobile.com/ 来在iPhone上访问,几乎完美

July 9, 2010

ContainerView的HitTest

有时候想把Flash里的常用的用空Sprite来管理内容层级的方法用在iOS里,用一个空的UIView来管理UIView Hierarchy, 但是不希望这个空白的UIView吃掉下层的Touch Event, 这时候可以Override UIView的hitTest:withEvent:来解决.


(Link)

但是iOS毕竟不比Flash,大多数的View还是Opaque的为妙,基本上不鼓励透明的Subview Overlap,而且也没有自动的Per-pixel检测的HitTest(也没必要),估计这个方法也只能用在Subview数量很少的Case里。

June 21, 2010

Xcode 4

Down了几个WWDC10的iTunes U Session下来看…果然Xcode4改动巨大…弄得Xcode3都懒得打开了…

主要内容在Session 300 - Developer Tools State of the Union里有很详细的介绍,可以在这里down到,不过需要一个Apple ID.

新的All-in-One interface

原来Xcode很不爽的一点就是无数的Floating Panel,3.2里把Search&Replace和Compile Error放到Edit Panel的上面,遮盖的问题有所改善,但是编辑空间就少了很多…这次的UI就彻底解决了这个问题,左边的Tree View加上了小Tab,Search&Replace,Navigation,Compile Issues都放在这里,可以很方便地导航。右边则是Dynamic Help(没啥用),IB里的Properties和Object Library,还有Snippets.上面的BreadCrumb也在所有的编辑窗口里都功能一致.

Git/SVN支持以及历史版本Diff功能

历史文件的Diff功能非常贴心的做成了一个Time Machine一样的界面,可以在中间的时间条上拖动来对比。右边可以显示每行代码的Sumbit Log…左边导航条的Filter功能可以方便的一键Filter出所有没有Submit的文件.

LLVM带来的Code Completion和Fix it

Fix it其实类似代码的Spell Check,会提示你是不是用错了“=”号,是不是变量名拼错,是不是漏了分号等等…和Compile Error不一样,它是你边打代码边分析的,而且还有快捷键来自动改掉上一个发现的错误…号称和Static Analysis一样Powered by LLVM,所以非常智能

其他的改进还有:

  • Interface Builder被整合到Xcode当中…而且整合Class代码和IBOutlet变得简单很多,选择IB里的控件会自动在右边窗口显示相关的代码
  • 左右窗口同时显示.h和.m,或者.m和super class
  • LLDB和新的Debug UI
  • 某几只新的Instrument以及某些Instrument可以在iPhone上跑了,更方便的Profile

其他很多细节都很棒,例如Search&Replace里的小Slider,还有Debug的时候让Simulator显示在Xcode前面等等,接下来就是等啥时候放出了…

April 7, 2010

杭州旅游

最赞的还是遍布各处的公共自行车服务了。几乎不要钱,网点非常多,只需在Google Map上查找“公共自行车”即可获悉网点。(下图)


查看大图

刚到时候要到龙翔桥办Z卡,然后就可以在任意网点租借了,押金200,还有100块存在IC卡里。到快走的时候退卡也在龙翔桥。(下图,然而完全不知道桥在什么地方)


查看大图

之后的当务之急是找到离酒店最近的租车点,然后来回景区就无忧了,恩恩。

杭州印象比较好的还有

  • 十字路口都写着车等人的标志…有时候车真的会等你过马路哦
  • 生活节奏感觉舒缓很多,路上人的压力感觉没这么大,不象上海人人都有仇似的

之前都是用Google Map的我的地图在做旅游的计划,用iPhone的同学可以通过这个网址来访问,可以把Google Map同步到iPhone上去,异常Handy,只可惜中国移动的线路上50%的时候Google Map是被GFW的...

February 28, 2010

事实证明Profiling总是必要的...

之前就隐隐约约怀疑自己Server端Resize图片的function可能会有Performance Hit…昨天用Firebug看了一下居然在没有Cache的情况下每次Reload要7秒钟Page才开始Render, 之前都一直在等待Server的Response…被惊到了…原来用的getimagesize();的php function要把图片先下载到server然后才能判断大小, 期间会Block所有Render…所以就在那里活活的wait了7秒钟了…

开始想用JS来做客户端的Resize, 看了一会会jQuery, 决定第二天再写…后来突然想到其实可以直接把图片的大小存在Server端的post-meta…反正要Resize的只有post-image这一张图片…这样每个帖子第一次访问的时候server会访问一下图片, 把大小存下来, 之后其他人的访问就可以直接从数据库读大小, 就是秒间的事了…

改了两分钟搞定, 等待Server response的时间从7秒降到了0.7秒…

改完的代码如下:

(link)

92季奥斯卡

今年比较有空, 大多数的提名片都看了…而且今年提名扩招, 感觉上似乎比前两年看得更多了一点…照例短评

Avatar
★★★★

人人都看过若干遍了…制作上自然是无与伦比…之后的大制作如果出不了这样的效果可能群众就不会买账了…不过很有可能的结果是我们要等到Avatar 2才能重温到这个档次的制作了…在此之前的副作用是我们会看到每年有一半的片子是3D的…至于故事么…真得没什么感觉…

The Blind Side
★★★★★

技术上来讲同属于今年死灰复燃的温情片系列…沉默寡言的黑人小孩进入了富裕的领养家庭, 一切都是顺顺利利, 平平安安…剧情有点像当年看过的青春片美剧O.C. 不过一切都胜在细节, 让你眼角湿润的就是那些尽在不言处的时刻. 不过就如其他的温情片一样, 如果你没有被说服, 那整部片子本身就是虚假的谎言, 自然也没什么谈得上印象深刻的了…

District 9
★★★★

这片子让我知道了什么叫做南非口音…同时也告诉我们没有2亿的投资也能做出让人印象深刻的科幻片. 某种程度上它非常写实, 刨去外星人的成分, 片子里的事情其实每时每刻都在地球上发生着… 荒诞和可笑

An Education
★★★

博识早熟的高中女生遇上了风流潇洒善解人意的艺术品富商…类似的故事地摊小说上已经写烂了…唯一的可取之处可能是片中的所有人对生活的意义都有非常不同的理解, 直到生活把女主角拖回现实.

The Hurt Locker
★★★★

大概有20%的时间我们听到的是男主角沉重的呼吸声…正常人自然没法理解他的生活, 不过那种肾上腺素分泌的感觉可能和嗑药差不多…

Inglourious Basterds
★★★★

Bang, Bang, Bang… 所谓的好看的电影应该说的就是这个样子的吧…不缺情节也不缺笑料…说不定昆汀真能拿个奥斯卡呢…

Precious
★★★★

仍然是温情系列, 不过这片子写实得有点让人难以下咽了…

A Serious Man
★★★★

典型犹太人的悲惨生活…某种程度上似乎我非常能够理解片中主角的遭遇, 不停的妥协, 带来的结果就是完全失去对生活的控制…而偶尔放弃原则, 又不知结果是喜是忧…

Up
★★★★

今年最佳的开场五分钟…不过之后还是回归了Pixar的老路线, 老少皆宜

Up in the Air
★★★

乍看来克鲁尼的角色应该是很多人的生活目标吧…开始大半截片子还伪装成一部黑色冷幽默片, 尤其因为男主人公的职业和公司业务内容. 后半段继续转型温情片…好吧, 我就是没有被男主角的高管白领小资生活打动啦…


个人比较喜欢的是The Blind Side, District 9A Serious Man, 不过看现状貌似AvatarThe Hurt Locker貌似逃不了得奖…

男女主角的片子也基本都看了…没啥特别的感觉也就不说了…

February 23, 2010

launchd自动备份FTP数据

昨天心血来潮搞的…

launchd是从Tiger开始加的系统服务加载系统, 大意就是可以让你按照某个特定的条件来触发某个程序的执行. 具体介绍可以看这里.

然后要做的就是

  • 写个python脚本从FTP把整个网站拖下来
  • launchd每星期自动执行一次这个脚本

FTP下载的脚本

就着ftplib的Sample写的, 可能会有Bug...

(Link)

launchd的配置文件

(Link)

每个launchd项目都要写个plist作为配置文件, 然后按其中的label命名放在~/Library/LaunchAgents里. 详细语法可以看这里.

搞定以后把它手动加到launchctl里, 不过每次开机也会自动scan上面的LaunchAgent目录
launchctl load ~/Library/LaunchAgents
launchctl list

list以后就可以看到服务在list里面了, 到时间就会在后台偷偷运行… 如果时间错过了会等到下次开机, 很智能的哦.

February 22, 2010

Wordpress模板修改笔记

这几个星期帮老婆弄了一个独立域名的Blog, 要求有以下几点:

  • Blog要分两大块, 一块写琐事杂记, 另一块写商品更新
  • 琐事杂记要有内文引用图片的Gallery
  • 商品更新要求比较复杂
    • 要有橱窗感
    • 要有会员制度, 登录会员可以看到折扣价
    • 会员帐号和琐事杂记帐号共享

下面把过程大概记录一下…

工具篇

尝试了Mac下面的几个All-in-one网页开发工具, 主要是CodaEspresso. 大概都有15天左右的Trial时间…刚好做完整个网站. :)

Coda ($99)

  • FTP功能很棒. 推荐在Remote栏里直接编辑, 然后打开Preference里的Keep idle connection active. 每次Save以后就会自动上传.
  • Site管理简单清晰, 尤其是后来同时更新两个模板的时候. 切换Site会记住所有打开过的文件.
  • 界面比较友善, 上面的6个Tab功能区分清楚, 很快就能上手.
  • 全局搜索功能非常顺手, 可以Cmd-G直接跳到下一个文件
  • php和HTML混排的时候的语法高亮不是很清楚
  • 选择多行Tab不是indent, 会删掉所有内容…
  • 没有XCode里那样的代码折叠功能
  • 没有自动代码整理

Espresso ($79.99)

  • 语法高亮很棒
  • 有代码折叠, 而且Tab/Shift+Tab是indent
  • 没有CSS编辑器…(好吧…其实问题也不是很大)
  • 没有自动代码整理
  • 文件是以Tree的形式来显示的, 不如Coda那样每次可以更改当前文件夹方便
  • 界面好简单…基本还是一只文本编辑器

最后用得比较多的还是Coda, 可能有点先入为主的缘故… 基本上第一次Remote Commit完所有的修改都通过Coda来操作, 不过碰到的一个很痛心棘手的问题就是点到Local栏修改本地文件不会自动从Server上Get最新版…因为不知道这点, 所以很多bug都改了好多遍, 还以为自己déjà vu了呢…后来记得都改Server上Remote的文件就好.

然后经过若干次失败的尝试, 发现Mac下果然没有好用的FTP客户端. 平时用的最多的Cyberduck在传大量小文件的时候还是会莫名其妙断流…不过最后零星的配置文件修改还是用Cyberduck + Smultron搞定

本地测试用的是MAMP, 唯一碰到的一次问题是本地装完WPMU, 结果.htaccess出了问题, 无法登录phpMyAdmin, 后来改了个Apache的参数解决了问题

版本控制开始在本地做了个git depo…后来觉得Checkin麻烦直接用
Dropbox + ln -s…也recover会了次数据

debug CSS主要用的还是Webkit自带的Web Inspector…在Coda里可以直接试用, 后来debug IE的时候也用了下IE8自带的那个…Firebug也用了一点点, 不过通常懒得再开一个Firefox

系统篇

Blog系统开始就觉得Wordpress用的人最多, 应该相对碰到的问题要好解决一些. 后来事实证明的确如此. 主要的一个选择条件是要有两个共享用户数据的Blog, 做了下初期调查有以下几个解决方案:

  • WordpressMU. WordpressMU是Wordpress的多用户多Blog版, 无需额外的Hack就可以支持多个Blog共享用户数据. 不过在万网的空间上安装了很多遍都是装完进欢迎页就直接页面无响应… 怀疑是空间商动了手脚…
  • Wordpress+Catalog Template. 把两种类型的Blog文根据Catalog来分类, 选择不同的Template页面来显示, 同时也可以自定义Catalog主页来解决不同的首页需求. 好处是只需要维护一套后台, 但是坏处是对Blog模板的修改会非常大…
  • Wordpress+共享用户数据库Hack, 这也是最后我选择的方案. 优点的逻辑简单, 修改完以后当两个Blog用就是了, 所有的Blog模板也可以直接拿来用. 缺点就是每次升级Wordpress版本都要重新Hack一次(上个礼拜正好升级了一次…)

最后看到新闻里说Wordpress从3.0开始就要和WordpressMU合并了, 到时候就不用做这么复杂的选择题了.

共享用户数据库Hack

大致上还是按照这个网页的做法, 不过需要根据最后评论更新, 否则会没有权限登录后台.

大致如下(WP2.9.2有效):

把BlogA和BlogB装在不同的目录里, 例如BlogA装在\, BlogB装在\blog\, 两者用同一个数据库, 但是不同的前缀

假设BlogA的数据库前缀是wp_, BlogB前缀是wp2_, 手动修改BlogB的wp-config.php, 在下面加两句:

define('CUSTOM_USER_TABLE', 'wp_users');
define('CUSTOM_USER_META_TABLE', 'wp_usermeta');
//Permission Fix
define('CUSTOM_CAPABILITIES_PREFIX', 'wp_');

然后修改BlogB的wp-includes/capabilities.php, 查找:

$this->cap_key = $wpdb->prefix . 'capabilities';

替换为

if (defined ('CUSTOM_CAPABILITIES_PREFIX')) {
 $this->cap_key = CUSTOM_CAPABILITIES_PREFIX . 'capabilities';
}else{ 
 $this->cap_key = $wpdb->prefix . 'capabilities';
}

查找替换这步每次升级WP版本都要做一次…

最后用下来基本没碰到什么大问题…不过如果要完美的解决方案可能要修改更多的文件, 后来就懒得弄了.


Theme/插件修改

主Blog后来选择的Theme是simpleX 1.3.2, 基本上改动不大, 只是修改了些中文字体的小Bug.

缩略图的部分用了一个国产插件, Thumbnails Anywhere, 这个插件可以帮你把日志中的图片Fetch到本地生成缩略图引用, 如果是Picasa/Yupoo/Flickr的图片还可以直接引用缩略图, 非常赞. 不过原本的首页缩略图只能显示一张, 修改了一下Plugin里的function, 加了多个图片的显示选项, 然后还加了Lightbox的逻辑. 期间还发现Yupoo修改了外链的url, debug了半天.

最终效果(Link):

商品更新的Blog动的手脚比较大, 主要修改如下:

  • 把3栏改成2栏
  • 修改Header/Footer, 增加搜索栏, Tag/Catagory Bar, 公告栏
  • 增加自定义字段的显示: 价格, 购买链接等
  • 所有图片Auto-Scale
  • 根据登录人权限的不同, 设定优惠价

用的theme是ThemeMeme Aperio Prototype, 本身自带caption_image自定义字段的显示, 所以每个帖子都有张大图片. 不过我不得不说这个Theme又老又是Prototype, css的bug真的是很多…

最终效果(link):

自定义字段

自定义字段有个很棒的插件叫Custom Field Template, 做好Template帖子里就可以很容易的添加了…Theme里面的引用大致就是下面这句话:

 $key="custom_key";
 $custom_key = get_post_meta($post->ID, $key, true);

权限判断

权限判断也搞了很久. 首先WP内置的权限设置功能不够, 装了个Capability Manager插件来增加自定义Role和权限.

然后抄到一个function, 来直接判断权限…(自带的那个弄了很久没搞定…)

其中还有一个非常Tricky的地方让我Debug了半天, 里面的get_option('wp2_user_roles');居然直接用的是表名来生成的属性, 而不是某个constant字段, 我用的是wp2_这个前缀, 所以要换成前面贴的那样.

其他插件

其他还有很多挺棒的插件

其他

最痛苦的恐怕就是在Debug IE CSS的时候了…尽管我已经无视了IE6(家里没找到电脑有IE6)

基本上…作为没有任何CSS基础的群众, 心得如下:

  • 用CSS来控制图片自动缩放基本没戏, 没找到任何一种方案在所有浏览器里都能用的. (我后来自己写了个php function来scale, 感觉很影响loading时间, 是不是这个在client端用jQuery之类的会好点?在没有thumbnail的情况下)
  • 碰到IE特有的浮动bug, 先尝试在前面/后面加空div, 再尝试简化css结构
  • IE的filter:dropshadow等超级烂, 不过filter:alpha还行
  • 默认的XP下没有任何一个可以看的黑体, 所有的字大字号都很难看

然后弄了半天, 发现网页在Mac上的渲染效果和PC上特别是IE上还是一个天一个地啊…泪奔…

January 16, 2010

绕过iPhone SDK的Code Signing实机测试

是给Jailbreak众用的, 在花99刀之前可以在自己的机器上跑跑看写好的程序.

步骤其实很简单:

  1. 在Terminal里打开SDK的目录

    open /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/
    
    然后可以看到下列的SDK

  2. 打开其中你所需要的一个, 修改里面的SDKSettings.plist

    <key>DefaultProperties</key>
     <dict>
      <key>AD_HOC_CODE_SIGNING_ALLOWED</key>
      <string>NO</string>
      <key>CODE_SIGNING_REQUIRED</key>
      <string>NO</string>
      <key>CODE_SIGN_ENTITLEMENTS</key>
      <string></string>
      <key>DEAD_CODE_STRIPPING</key>
      <string>YES</string>
      <key>ENTITLEMENTS_REQUIRED</key>
      <string>NO</string>
    </dict>
    ...

    注意修改操作需要root权限,建议试用Smultron之类的文本编辑软件

  3. 最后在Project->Edit Project Settings里把Code Signing关掉
然后便可以Command + R直接跑了

January 10, 2010

Bye Bye, GFW

不知为何最近媒体里关于防火墙的报道突然多了起来. "我们的防火墙"试图用一种貌似客观的语气来分析防火墙的成因和效果,可能也兼有Justify政府做法和期待政府正视的心理在里面. 这一期的凤凰周刊也是封面大字写着: "海外反动网站名单调查/中国拟构建超级网络管理制度". 虽说内文完全没有封面Matrix Style的设计那样抓人眼球, 不过平时老是遮遮掩掩的防火墙突然变成街头书报摊挂在最醒目位置的杂志的主题还是让人觉得有点怪异的感觉, 甚至让人误以为我们快要到防火墙全民大讨论的时候了.

打开浏览器, 一盆冷水还是浇了下来, 报道毕竟还是个例, 大多数时候我们看到的还是主流媒体指鹿为马的统计数据和偏见报道, 而去年下半年以来墙越收越紧也是人人都能感觉得到的. 年初的时候我们还有无数的翻墙方式, 到年底的时候就算知道墙存在的少数人也很难爬过去了. 而内容方面国内可能被整的网站都被整到半身不遂, 国外网站的白名单制度也指日可待. 其实不需要有人来为防火墙著书立传, 大多数国内的互联网用户都对墙的所作所为记得一清二楚.

今天终于搞定了VPN, 打开Youtube, 居然觉得非常奇妙. 发现Google Reader里大多数的Link居然都可以打开了. Twitter上群众转贴的无聊照片居然也都能看见. 看来我已经被墙太久, 都差不多忘记墙外是什么样的了.

当然明天一切可能会更糟, 不过今天
Bye Bye, GFW

P.S. 凤凰周刊不好看, 充满了被审查下仍然努力表现"良知"的无力感.