Centos 编译安装 MySQL-python

这次标题党了,这次不是写安装过程的,前几天配置新环境,把编译的问题记录一下,应该是很全的编译 mysql + python 的问题了,妈妈以后再也不用担心我在 centos 上编译 python 和 mysql。

MySQL 现在四分五裂的,服务器上跑的是 percona-server。我打算去搞 PostgreSQL 了,在搞熟悉之前就先用这个了,看各方面的评价都不错~ Read more »

windows打开控制台查看log输出

#include <wincon.h>

//open console
AllocConsole();
freopen("CONOUT$", "w+t", stdout);
freopen("CONIN$", "r+t", stdin);

//close console
FreeConsole();

 

Mac下dds格式图像转pvr

游戏移植时有个需求要一个命令行工具把dds图像转换成mac下效率更高的pvr图像,在网上找了很久,有以下几个工具:

  • Imagination 有一套工具 PVRTexTool ,可以将各种图像格式转换成 pvr 格式,但是只在 windows 下支持 dds 格式的转换,另外还有一套SDK,但是由于网络问题实在下不动,只好想别的办法. PVRTexTool在新浪爱问上有人共享,2.10版本有问题不能用,2.08版本就比较正常.官网传送门->http://www.imgtec.com/powervr/insider/powervr-pvrtextool.asp
  • Ios sdk 里带了一个 texturetool, 可以将 png 转换成 pvr, 但是只支持方形纹理转换.
  • Nvidia 提供了一套工具支持 dds 格式的转换,也是 windows 版的, 我放到mac下编译了一下,有两个小错误改了改就编译成功了, 其中的 nvdecompress 工具可以将 dds 格式解码成 tga 格式,传送门:https://developer.nvidia.com/content/texture-tools-208-64-bit

最终的解决方案是用 nvdecompress 将 dds 转换成 tga , 然后用 PVRTexToolCL 将 tga 转换成 pvr.

后记:最后还是写了一个转码工具,利用官方的 pvrtexlib, 里面有个 transcode 函数可以在 pvr 支持的各种格式之间转码,还比较方便,另外发现国外某大牛把压缩算法写出来了,回头仔细研究一下。传送门->https://sites.google.com/site/richgel99/early-pvrtc-compression-experiments

ZFS on OSX 性能测试

Mac 用了半年了,已经玩转了,于是重装了一下,顺便折腾了下文件系统,装了个 ZFS 玩。

对 Mac 上的 HFS 和 ZFS 做了一个不完全的测试,机器是 2013 年 2 月的时候买的最低配的 pro MD711,说“不完全测试”,是因为没有关闭其它的程序,CPU 在忙别的,free 内存也一直在 10M 多,4G 真的不够用。

ZFS 用的 greenbytes 出的 ZEVO,只建了一个 zpool,没做其它操作,测试工具用的 bonnie++,直接上图了:

300M 20M 1M

 

折腾永无止境…

Render Monkey v1.82 基本使用方法

Render Monkey 是一个 shader 开发工具,免去了与具体 API 打交道的繁杂,使用者可以专心于 shader 的开发.

该软件貌似已经停止更新了,最终版本为 1.82,以下使用 DirectX ,且不包括 Artist 模式的使用方法. Read more »

设计模式学习心得

最近看了<<head first设计模式>>这本书,图文并茂的书的确让人容易读进去,如果能多一些这样的技术类书籍就好了,很多书写的太枯燥看几眼就会睡着…先推荐下这本书~

以前不知道设计模式这个东西,但是看别人的代码好多地方都用到了,然后看书的时候恍然大悟原来用的是这种模式啊.

总结来看,设计模式的目的是OO设计时减少类之间的耦合度(loose coupling),这样在以后面对需求变动要进行修改时可以只进行较少的改动,从而避免引进更多的错误,增加可维护性.通常的代价是增加了类的数量.

良好的OO设计要满足可复用,可扩充,可维护的特性. Read more »

mochiweb reloader 实现代码热更新

在用 mochiweb 的时候有一个 reloader 模块用来实现代码热更新,在自己的项目中也想加进去用一用,于是把这个东西搞了出来。

我的程序是用 rebar 配置的,用的 rebar generate 来运行,配置 reloader 之后,rebar compile generate 之后却不生效,于是在 reloader 的源码中找答案。

init([]) ->
    {ok, TRef} = timer:send_interval(timer:seconds(1), doit),
    {ok, #state{last = stamp(), tref = TRef}}.

doit(From, To) ->
    [case file:read_file_info(Filename) of
         {ok, #file_info{mtime = Mtime}} when Mtime >= From, Mtime < To ->
             reload(Module);
         {ok, _} ->
             unmodified;
         {error, enoent} ->
             %% The Erlang compiler deletes existing .beam files if
             %% recompiling fails.  Maybe it's worth spitting out a
             %% warning here, but I'd want to limit it to just once.
             gone;
         {error, Reason} ->
             io:format("Error reading ~s's file info: ~p~n",
                       [Filename, Reason]),
             error
     end || {Module, Filename} <- code:all_loaded(), is_list(Filename)].

这2个函数足以看出 reloader 的逻辑,是每秒检查一次当前加载的 beam 文件,如果有更新,就 reload。“有更新”的判断标准是更新发生在 From 和 To 这 2 个时间之间,这 2 个时间也就是定时器的间隔时间,为 1 秒。

在 reloader 里面加了调试日志,把 From To Mtime 都输出出来,结果如下:

doit {_,{10,19,57}} {_,{10,19,58}} {_,{10,13,34}}
doit {_,{10,19,58}} {_,{10,19,59}} {_,{10,13,34}}
doit {_,{10,19,59}} {_,{10,20,0}}  {_,{10,19,50}}
doit {_,{10,20,0}}  {_,{10,20,1}}  {_,{10,19,50}}

这样问题就已经确定了,reloader 检测到了文件的更改,但由于 generate 的延迟,文件的更新操作没有在更新的那一秒之间被 reloader 检测到,检测到的时间已经是 From 之前了,所以没有执行更新操作。

解决方案:

reloader 只是开发的时候测试使用,所以在开发调试阶段就不使用  rebar generate 来运行程序,改为用 Bash 脚本

erl -pa ebin -s demo -s reloader

 

circus —— supervisord 的完美替代品

简介:

circus (http://circus.readthedocs.org) 是 mozilla 开发的一个 socket 管理工具,用来代替 supervisord ,circus 与 supervisor 的区别这2张图一目了然。

supervisor:

circus:

chaussette 是专门用来配合 circus 的 wsgi 服务,不过 chaussette 官方说 “Chaussette is just a bit of glue code on the top of existing WSGI servers, and is organized around back ends. ”,因为 chaussette 自己并不做为 server 来运行程序,而是支持已有的 backend,支持列表参见 http://chaussette.readthedocs.org/en/0.8/#backends

折腾了几天 circus 的配置,留一份备忘。

Read more »

Mathematics for 3D Game Programming and Computer Graphics 笔记 Chapter 4

Chapter4 3D Engine Geometry

4.1 Lines in 3D Space

P1 P2 是3D空间中两点,则经过这两点的直线可表示为

P(t) = (1 – t) P1 + tP2         (4.1)

t的范围是所有实数.t在0-1之间时表示 P1 到 P2 的线段.

一个端点S和一个方向V可以表示一条射线:

P(t) = S + tV         (4.2)

t的范围是[0,+∞),若t为整个实数范围,上式也可以表示直线,若令 S = P1, V = P2 – P1, 则等同于 4.1 式.

4.1.1 点到线的距离

Read more »

Mathematics for 3D Game Programming and Computer Graphics 笔记 Chapter 3

Chapter 3  Transforms

在任何3D图形引擎中,常常需要把一组向量从一个空间转换到另一个空间,例如一个模型的坐标通常处于物体空间,在渲染时需要转换到相机空间.这章讨论在不同笛卡尔坐标系下的转换,例如缩放,平移,任意旋转.

3.1 线性变换

假设在坐标系 C 中有一点 P(x,y,z) , P 在另一坐标空间 C’ 中的坐标是 (x’,y’,z’) , (x’,y’,z’) 可以表示为 (x,y,z) 的线性函数,其中向量 U, V, W为 C 中基向量 (1, 0, 0), (0, 1, 0), (0, 0, 1) 在 C’ 中的坐标:

x'(x,y,z) = U1 x + V1 y + W1 z + T1
y'(x,y,z) = U2 x + V2 y + W2 z + T2
z'(x,y,z) = U3 x + V3 y + W3 z + T3

这构成了从 C 到 C’ 的线性变换,用矩阵来表示就是:

┌  ┐ ┌        ┐┌ ┐ ┌  ┐
│x'│ │U1 V1 W1││x│ │T1│
│y'│=│U2 V2 W2││y│+│T2│
│z'│ │U3 V3 W3││z│ │T3│
└  ┘ └        ┘└ ┘ └  ┘

从 C’ 到 C :

┌ ┐ ┌        ┐-1┌  ┐ ┌  ┐
│x│ │U1 V1 W1│  │x'│ │T1│
│y│=│U2 V2 W2│ (│y'│-│T2│)
│z│ │U3 V3 W3│  │z'│ │T3│
└ ┘ └        ┘  └  ┘ └  ┘

向量 T 可以看作是从 C 的原点 移动到 C’ 的原点的位移, 向量 U, V, W 表示坐标轴方向的变化.

多个线性变换矩阵可以通过相乘来结合成为一个变换矩阵,这个矩阵等价于依次进行一系列变换. Read more »