小塌客

石头的博客

Archive "2011"

json_formatter

最近一直在用sinatra做API, OAuth2的东西, 调试用的curl, 数据的返回格式是json, 默认情况下一对一对字符串是直接在console输出出来的,不方便查看,像这样:
{"accounts":[{"name":null,"id":"4ea060742c76682ab800a807","api_url":"https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts/4ea060742c76682ab800a807","email":"skidave32289@gmail.com"},{"name":null,"id":"4ea06b5e2c76682aa6002ac5","api_url":"https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts/4ea06b5e2c76682aa6002ac5","email":"skidave32289+20@gmail.com"},{"name":null,"id":"4ea071862c766848c3000055","api_url":"https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts/4ea071862c766848c3000055","email":"skidave32289+21@gmail.com"},{"name":null,"id":"4ea075e02c766848c8000ae5","api_url":"https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts/4ea075e02c766848c8000ae5","email":"skidave32289+22@gmail.com"}]}
今天在rubyflow上看到一个不错的工具gem: json_formatter, 直接gem install后,就可以在命令行用了:
#curl -H 'EXAMPLE-API-KEY: b60b5400dd6f012eg16c12313b0ecdxc2' "https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts?per_page=100" | json_formatter 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5812  100  5812    0     0   3358      0  0:00:01  0:00:01 --:--:-- 11049
{
  "accounts": [
    {
      "name": null,
      "id": "4ea060742c76682ab800a807",
      "email": "skidave32289@gmail.com",
      "api_url": "https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts/4ea060742c76682ab800a807"
    },
    {
      "name": null,
      "id": "4ea06b5e2c76682aa6002ac5",
      "email": "skidave32289+20@gmail.com",
      "api_url": "https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts/4ea06b5e2c76682aa6002ac5"
    },
    {
      "name": null,
      "id": "4ea071862c766848c3000055",
      "email": "skidave32289+21@gmail.com",
      "api_url": "https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts/4ea071862c766848c3000055"
    }
  ]
}

#也可以直接输入字符串
#json_formatter "{}"

ps: 关于curl
上面提到了curl,就再多说一点吧,在用curl进行POST请求添加数据时需要注意, 使用 -d "name=value" 的方法是不会自动给value进行编码(url escape)的, 如果想让curl给数据进行escape需要使用 --data-urlencode 选项:
#curl -d "site=www.ccok.me" --data-urlencode "email=li+lei.hand-some2@yottaa.com" -H 'EXAMPLE-API-KEY: b60b5400dd6f012ec57c123112b0ecda2' "https://api-dev.example.com/partners/4ea05b812c76682ab800a0b0/accounts"

Google Analytics更新了

又快半年没更新了.., 为了证明shitou's blog仍然活着, 凑点字数吧..

 

最近Google的活动又多了起来, 收购Moto的手机业务, Android 4.0的发布, Google Music, 新的UI页面..

 

今天收到封Google Analytics的邮件, 说有更新了, 主要有:

实时的数据更新. 现在可以看到几秒之前用户活动信息了

Google Realtime

 

Multi-Channel Funnels, 这个是针对电子商务网站, 提供各种用户来源的转化率.

Google Multi-Channel Funnels

 

Mobile Reporting, 移动端数据统计的加强, 之前GA已经支持查看访问来源的UA(User Agent)了,不过功能比较简单,这次是在原来基础上的加强,支持直接查看访问用户的手机型号, 还有手机图片.

Google Mobile Reporting

 

Flow Visualization, 这个功能也是之前功能的加强,以更直观的曲线图查看用户的访问数据.

Google Flow Visualization

 

上面的图可能会被q-i-a-n-g掉, uncle fu****

 

Google HTML5 web font

Goole HTML5 Web Font

HTML5支持自定义字体,Google专门开设了一个服务开发者可以上传和共享自己的字体,使用方法很简单:

 

1) 查看字体列表,选择你要使用的字体

 

2) 然后在header中加入CSS调用,比如:

<link href='http://fonts.googleapis.com/css?family=Ubuntu' rel='stylesheet' type='text/css'>

 

3) 最后就是使用了:

h1 {font-family: Ubuntu}

或者在Canvas中使用

var context = document.getElementById("canvas").getContext("2d");

context.font = "bold 12px Ubuntu";

context.fillText("Hello World", 20, 20)

 

HTML5 & Impactjs

HTML5 Powered with Connectivity / Realtime, CSS3 / Styling, Device Access, Graphics, 3D & Effects, Multimedia, Performance & Integration, Semantics, and Offline & Storage

最近一直在看HTML5游戏开发这方面的东西,从小学FC上的超级玛丽 ,魂斗罗一直到现在的全机种制霸(这绝对不是赤果果的炫耀...),shitou的玩龄也有快15年了,虽然一直在做程序开发的东西但从来没接触多游戏开发这方面的内容,个人严重抵触flash,虽然几年前研究过flex,但是还是不想用flex/flash来起步做游戏,最近HTML5已经被各大浏览器厂商推到风口浪尖了,各种支持也越来越完善,尤其是HTML5中的Canvas, Audio标签对游戏开发都是很至关重要的,在没有HTML5之前,web game都是javascript和flash来实现的,现在有了新选择。

 

加之iOS对flash的封杀,所有基于flash的web game都是被悲剧了,而各大厂商(包括移动浏览器)都力挺HTML5,这样用HTML5开发的游戏经过简单的修改(基本上是用户控制方面的,比如鼠标的点击,屏幕触摸等操作)就可以运行在移动平台了。

 

关于游戏引擎/开发库

目前有很多基于JS+Canvas的游戏开发库,大部分都是开源的,不过功能都不是很完善,也有商业的,比如Impactjs,shitou目前就是用的这个引擎,版权费用是99刀,在研究了近两个星期后,简单总结了这个引擎的一些特点:

 

  • 地图完全是基于tile-based
  • 非常适合开发横版滚动卷轴类的游戏,像古董级的超级玛丽,魂斗罗,最近XBLA上的Limbo(地域边缘),Super Meat Boy(超级肉肉哥)这类游戏; 垂直视角的RPG或者SLG战棋类游戏,像塞尔达传说,早期版本的最终幻想3/4(不是NDS上的3D妇科版...),GBA上的火焰文章; 还有横版(或竖版)射击类游戏也可以
  • 对collision detect, tile-based map, sound, music, image animation, mobile support, input, timer都有不错的支持,目前版本不支持isometric类型的地图,还有没有path finding
  • 已经整合了Box2djs
  • 引擎中有一个自带的地图编辑器weltmeister,功能非常强大,适合用来编辑关卡
  • 官方文档非常完善;官方论坛也比较活跃,而且有很多第三方插件可以使用
  • 通过Phonegap可以直接将自己的游戏打包成iOS, Android, WP等上的本地app应用
  • 对游戏元素的鼠标点击事件支持的不好,需要通过hack的方法才能实现

 

总体上impactjs的功能还是很不错的,尤其对于刚接触游戏开发的朋友来说,而且授权价格也还可以接受,感兴趣的同学可以买一个license研究研究,也可以和shitou联系一起研究。

 

ps: 欢迎各位同学来信骚扰,mytake6ATgmailDOTcom

 

How to fix any computer

http://www.ccok.me/photo/image/82/job-fails-so-true-it-hurts.jpg

在gen_server中spawn新的进程

最近Joe在erlang mail lists中频繁现身,估计是因为许多人对gen_server的使用有很多误解,忍不住出来解救众生的...

其中Joe专门解释了怎样在gen_server中管理新的进程的问题 代码:
foo(X) ->
    gen_server:call(?Mod, {foo, X}).


%% Write a gen_server handle call method like this:

handle_call({foo, X}, From, State) ->
    State1 = func1(X, State),
    State2 = func2(X, State),
    spawn_link(fun() -> do_something(State1, X, From) end),
    {noreply, State2}.

do_something(State, X, From) ->
    Reply = func3(X, State),
    gen_server:reply(From, Reply).
上面的do_something可能是一个time-cost任务,为了不阻塞当前的gen_server进程,可以spawn一个新的进程来专门处理,do_something和当前gen_server进程会并行运行,gen_server会以State2继续运行,并且不会给client返回任何消息,client一直处于等待状态(因为这里是gen_server:call), do_something在处理完毕后会负责给client答复(gen_server:reply)