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网页开发工具, 主要是Coda和Espresso. 大概都有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. 凤凰周刊不好看, 充满了被审查下仍然努力表现"良知"的无力感.

November 30, 2009

难得夸奖下ubi的游戏

当然说的是Assassin's Creed 2

首先宣传下行业形势. 这两年Console业的趋势貌似就是大作越做越大, 连Marketing+Production, 例如CoD, GTA这种投入上亿, 销售额几亿的. 然而群众的消费能力却没有水涨船高, 于是第二集团就活的很苦. 通常年景再差, 一般Average Rating 8+的主流游戏卖个一两百万还是没有问题的, 但是到了这两年能蹭到100w就算万事大吉了, 估计要到第二年才能Break Even, 和能卖5m-10m的一线大作相比真是一个天上一个地下. 于是今年的游戏就一个赛一个的往大作方向膨胀, 或者就干脆延期避风头, 看是不是在来年多蹭点分... (当然与此相对的就是indie游戏的一只又一只小强了, 不过这是后话...)

ubi今年的赌注就押在Assassin's Creed 2上了. 不过说来Assassin 1真的是有史以来根基最好, 然而Content最拖后腿的游戏了...主角动画的无数Seamless transition + 不错的密集Crowd实现 + 还行的Sandbox + 帅气的背景设定, 硬是被无数一模一样的set piece任务给毁了. 当年赶工出货恐怕是这项目4年的周期已经快要突破总部老大的底限, 没想到居然一炮走红, 就算是个完成度80%的类Tech Demo也卖了6m套, 这次AC2终于可以把所有精力都放在Content上了

改进的第一点很简单, 看过了GTA的同学都明白, 这年头的游戏一半靠Gameplay Variety, 另一半靠Story Telling. Gameplay是那玄之又玄, 有的没的东西, 但是Story Telling做起来就简单多了, 堆人力嘛. 于是就硬是帮主线剧情每个任务配上了Intro/Outro, 总计大概四五个小时的RTC时间, 说实话, 效果的确立竿见影.

第二点也是偷学自GTA, 你要做的Action尽管还是原来那一套, 但是任务的Context则要比以前丰富多彩的多, 例如不是让你去收集某种道具A, 叫你去帮盗贼工会踩点; 又例如不是让你到A点到B点到C点, 叫你去为下一次暗杀在教堂附近踩点. 然后这次除了Basic Gameplay搞重用和Ramp Up之外, 终于给我们做了几段帅气的Unique Gameplay, 例如马车和滑翔翼, 只用一次群众才会印象深刻嘛.

第三点就是时代背景了(1450-1500). 当然初代十字军东征的背景其实也不错, 但是由于故事线过于简单的缘故, 最后连除了主角连印象深刻的名字也没记下一个...这次的剧本对于政治戏+亦真亦假历史背景的使用终于到了登峰造极的地步. 除了主角家族以外, 大多数的登场人物都在历史当中有迹可循, 而且为了满足群众这方面的需求, 游戏还特地设计了Codex和The Truth系列互动谜题, 把阴谋论的Scope扩大化, 把几千年历史可能可以用来搞阴谋论的人物事件说了个遍.

当然游戏的技术优势在过了两年后一样还在, 至少在这个世代在Free-Running这个Catagory估计不会有这个游戏的敌手了.

有史以来最大Scope的代价就是3个Studio一起才好不容易完成了这个游戏的Content制作, 据说顶峰时期有近600人挂在这个项目的名号下...就算如此, 除了Firenzi和Venice之外的几个城市几乎没有啥主线剧情, 好多人物也是匆匆登了个场之后就再也没有出现过. 估计也是到后来实在没法按时做完, 只能砍掉一点了...就算如此这游戏还是有近20小时的游戏时间, 比一般ubi游戏的长度长了一半还多...

最后发一点牢骚. 感觉现在Console业实在是Risk越来越大, 像EA这样几十个项目同时开工, 凑到今年这样不大好的年份也只能吃瘪, 先前的资本输得底裤也没了. 而Activision或者2K这样的如果一年没有个千万级的Blockbuster估计剩下项目也要歇火, 归根到底还是渠道和受众实在太单一. 特立独行的游戏群众看不到也买不到, 大多数项目的精力都花在翻版去年或者今年的Marketing Trend上, 只是加上不同的味精而已, 死于同质化竞争也是活该吧.

August 6, 2009

Filemaker库存管理数据库

花了一个礼拜时间, 帮老婆用Filemaker折腾了个库存管理的数据库...不知道Filemaker是什么的同学, 可以点击Link瞧一眼, 可是有简体中文版的哦...通俗的来讲就是一只能用的Access, 更通俗一点来讲, 就是Excel的多表关联功能+自定义UI进化版

Why Filemaker

其实开搞以前也没怎么做过横向对比...不过弄到后来...发现自己对写这个东西渐渐上瘾了...-.-...总而言之就是越用越顺手...还是罗列一下这只东西的好处吧...

  1. 轻量级. 不需要啥后台数据库, 打开软件即可编辑...整个数据库只有一个文件, 配合Dropbox方便做版本管理...
  2. 入门门槛一般但是Script和Calculation都很简明易用且强大. 不用会SQL, 但是对数据库Relationship的理解并不是马上就能让人用得顺手的...不过一旦掌握了其中要领, 此后就融会贯通了...
  3. 自定义Layout. 不仅仅是用来做数据的呈现, 配合Portal, UI很大程度上是用来指引工作流和软件的功能...
  4. 跨平台. 不管Win还是Mac都能并行修改...

功能定义

  • 库存管理: 管理进出库, 维护产品列表和库存统计
  • 进货/出货: 管理进货单/出货单, 包括日期, 进货商和顾客列表和进出货明细
  • 利润分析: 给定时间节点的毛利/净利分析 

 
(库存管理)

(利润分析)

制作流程

  1. 分析数据关联性, 建立初步的表格. 设定字段的类型以及自动计算的字段的计算公式
  2. 设定表格的关联结构, 增加某些关联需要的字段
  3. 制作初步的Layout和Report, 方便数据录入
  4. 用内建的Script制作某些自动化操作的流程, 并且和Layout绑定简化输入 
 
(表格)

(表格的关联)

Lessons & Suggestions

  • 对Relation的理解真的非常重要...两个关联的表, 几乎所有的变量都可以直接引用, 期间的关系要比我最初YY的自动很多~
  • 两本入门书: Filemaker Pro, the missing manual, Filemaker Pro 10 Bible...
  • 基本上Script可以做到一切你想做到的事情...如果要对Portal项操作...通常的做法是Find Related Records, 然后遍历
  • 如果有机会再写一遍的话, 应该把UI/Script和数据分开, 这样就可以不影响数据直接更新程序了
  • Workflow->Design->Data Structure

July 22, 2009

日食

5分钟的黑暗其实感觉让这一天变得长了很多...
希望这冗长的一年也能这么快过去...

验证码:5aw5atRa