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++,直接上图了:
折腾永无止境…
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 的配置,留一份备忘。
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 点到线的距离
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 »