2010年4月29日星期四

几个磁盘数据恢复工具

就通常的用途,这些数据恢复工具是用来是反删除被误删的文件,或者用来尝试读取损坏的磁盘上的文件。
这里的磁盘不是指磁介质啦,Disk仅仅是用来表示对储存介质的通称。
这里恢复的原理是,对于众分区格式下进行的删除文件操作后,文件的数据在未被新数据覆盖前,仍会存在于磁盘上。
注意,删除到回收站是一个移动操作。
文件会更名移动到同分区的特定目录下,在清空回收站时再执行通常的删除操作。

以下按差异列出若干个人觉得有使用价值的:

Recuva
http://www.piriform.com/recuva
在Windows下的免费软件中,这个用起来比较方便,一般就用它啦。
扫面分普通和深度,扫面结果可以按文件名或路径来过滤。
貌似没什么可说的,需要时找出来用就可以了。

TestDisk
http://www.cgsecurity.org
这是一个开源产品,在Win下Linux下Dos下都可以使用,而且支持的分区格式十分广泛。
Debian是在testdisk包中,其包含两个组件,都是在终端下的交互界面。
TestDisk用来恢复分区和undelete已删除的文件。
通常的误删文件即可尝试用它来解决。
PhotoRec则用来扫面磁盘,根据二进制数据中可识别文件信息,来恢复若干格式的文件。
比如用来从损坏的多媒体介质中恢复文件。
注意,两者通过命令行启动是,程序名称是小写单词。

WinHex
商业软件
一个16进制编辑器,支持直接编辑内存和磁盘。可以进行手工操作,功能强大。
也集成一个叫Davory的数据恢复模块,不过通常仍视为专业工具使用。
这个感觉是个好深度的软件啊。

Restoration
http://www3.telus.net/mikebike/RESTORATION.html
特点是程序文件很小很小,而且在NT及以后的系统下只有单文件。
文件恢复的基本功能已经提供了,用起来感觉还是不错的。
我用lzma压7z后是78.8 KB,用upx后85.5 KB,upx+zip后81 KB。

DiskGenius
http://www.diskgenius.cn/
源于DOS时期的DiskMan,是一款磁盘分区及数据维护软件。

低级格式化工具
这个是修复磁盘,而不是恢复文件了。也算略有关系,列在最后。

----
顺便说下 重复文件删除工具

DoubleKiller
一般用这个了,特点是文件比较小。而且用起来还挺方便的感觉。
http://www.bigbangenterprises.de/downloads/doublekiller.zip

Duplicate Cleaner
特色是可以将重复文件在NTFS上转换为硬链接,总之功能也相当多来着。
http://www.digitalvolcano.co.uk/download/dc_down.html

Linux下的话
Debian包里有个fdupes,
用shell或python的话也可的。

----
本帖来写个简单轻松的话题了。

2010年4月27日星期二

编程语言与科学计算 - 篇二

从现在的行文看,还会有篇三的,因为一下子内容还写不完全不的内容。
那么本篇就先侧重在Maxima这个CAS上了。
也不打算代替手册或教程什么的,只是去提及一些有关要点吧。

词汇表

这部分是简单的中英对照,以方便下面内容的阅读。
先列在前面也是写这些内容方便来着,
由于词汇在之后都会对照提及,所以在之后会移除这部分。

factor因数
expand
simpliy
solve
plot
reduce
rectform
ODE常微分方程

(下面是手册中关于Maxima内置功能对数学领域的分类)
Polynomial多项式
Constant常数
Logarithm对数
Trigonometric三角函数
Elliptic Functions椭圆函数
Limit极限
Differentiation微分
Integration积分
Equation方程
Differential Equation微分方程
Numerical数值的
Array数组
Matrix矩阵
Affine仿射
Tensor张量
Series级数
Number Theory数论
Symmetries对称性
Group群

Maxima
http://maxima.sourceforge.net/

说明
Maxima是历史悠久CAS的Macsyma维护至今的开源版本。它是一个用LISP编写的计算机代数系统,可以精确地进行符号运算。这不同于数值计算软件中强调的高性能,以及通过计算的累计来逼近数值。因为此篇的内容是想关注数学方法与数学模型的运用,选择Maxima来使用是一个简明而有效的手段。

安装
因为Debian是个人比较喜欢的发行版,其包管理功能可以为应用安装带来很大的方便。所以为了减少在一些方面不必要的麻烦,这里选择了最新的Ubuntu版本作为实验环境。
最基本的一步是安装maxima包,然后便可在终端下交互使用了。由于目前Ubuntu9.10的打包问题,该包其实无法正常使用。一个简单的方法去 http://packages.debian.org/sid/maxima 下载符合硬件架构的包来安装。
可选的GUI有wxMaxima和Lyx。前者以在界面的菜单中列出了常用的命令,以提供方便和减少门槛。后者是一个LaTex排版软件,支持用不同的数学后端来对可视化编辑中表达式进行运算和显示。其他较简单的一些GUI前端也有一些,也可作为对打开字符界面的终端的一个代替。
本篇的选择是iMaxima,是Emacs的一个模式。它可以自动用Tex对Maxima的输出进行处理来生成美观的公式图像,也提供若干编辑器上的增强。需要安装的包有emacs23, texlive, texlive-math-extra, maxima, maxima-emacs。
然后在.emacs中插入
(autoload 'imaxima "imaxima" "Frontend of Maxima CAS" t)
(autoload 'imath "imath" "Interactive Math mode" t)
(autoload 'imath-mode "imath" "Interactive Math mode" t)
(setq imaxima-fnt-size "Large")
(setq imaxima-use-maxima-mode-flag t)
其中最后一行是让imaxima模式中也有maxima模式在编辑方面功能,不过其实这部分内容就是照搬imaxima的网站上简单安装使用的说明啦。
配置好后进入Emacs输入M-x imaxima [ret]便可运行,也可直接执行
emacs -f imaxima

额,还有个XMaxima忘说了,也是图形前端。然后,如果在Windows下的话,下载官网的安装包后,里面包含了Maxima/WxMaxima/XMaxima了,其实也很好用的。


使用方法
在Maxima的文档页,即 http://maxima.sourceforge.net/documentation.html,提供了使用手册和若干篇中英文的教程,很适合对照着来学习和使用。而本帖中对Maxima的使用也将以此为参照,并结合一些个人的实际体验。
同时,在下面的内容中,打算依照对基本的数学知识点的展开来安排,并想侧重在体会数学工具的应用上。
另一份值得参考的中文Wiki是 http://wiki.ubuntu.org.cn/Maxima,人气还行。
接下来将列出一些较基本的概念和用法,不过更推荐去实际尝试和使用。

基本使用
Maxima是通常是通过交互方式使用(也可编写成脚本再用batch装载,库则通过load),直接在命令行中输入表达式交互执行。
分号(;)表示语句结束,之后输入回车Maxima便会对表达式计算并显示。用"$"则执行但不显示。
单引号(')前缀用来阻操作符被求值,而两个单引号('')则相反是noun到verb的过程(可以用在函数定义中对符号进行运算)。
ev(expr, arg_1, ..., arg_n)
用来为表达式附加操作/标志/条件,也可略写成逗号表达式的形式
"%"用来表示上一个计算结果,等价于"%o3"(数字不一定是3啦)。而"%e/%i/%pi"是三个常用的常量,注意它们代表精确值哦。
quit();
用来退出,中断运算则是按键control-C。

联机帮助
describe("sin");
用来在线查询手册内容,也可用"? sin"。"?? sin"则是名称部分匹配(特别是用在只记得部分函数名称的时候)。
example(append);
这个用来显示示例,参数非函数名的话要加双引号。空参数则显示示例列表。
通过这两个命令,就可以用来查询别的指令的意思了。
比如:apropos查询Maxima内置的名称,demo调用演示文件。
注释用 /* 和 */ 包围。

操作符与表达式
操作符是用来连接符号构成表达式的,常见的如"+""-""*""/""**""^"算数操作符。
x:%pi
":"是赋值操作符,用于执行计算并关联值与符号(变量)。
F(x,y):=cos(y)-sin(x)
":="用于函数定义,函数有自变量。
=和#是表示相等和不等的关系操作符,也可用其他不等符号如"<""<="。
还有很多操作符是以函数的形式提供的,如"sqrt""abs""mod""floor""round"...。
从Lisp的角度说其他形式的操作符也是用list表示出函数形式的直观表达,它们在Maxima内部仍以list来处理并可转换表示法。

符号与数|Symbol&Number
上面说过,Maxima表达式等价于几个多层List,而Maxima的运算也是针对表达式而不是针对数的:
(%i1)1/3;
(%o1)
1
-
3
其中分数根号%pi什么的都会计算结果的一个部分。
如果需要显示小数形式的结果的话,可以:
%,numer;
float(%);
(","是"ev"函数的简写)
"numer"标志和"float"函数/标志用于将将结果转换为浮点数。
而转换为高精度浮点数则用"bfloat"函数来进行,其位数由全局变量"fpprec"决定。
注意,直接输入浮点数也将在内部以二进制形式处理,其值并不等于高精度浮点数。
如果要Tex格式输出用于排版文档的话,可用tex函数。
表达的式中出现的字母也是符号的意思,在计算时可能有赋值或指定性质也仍可能只是一般的符号。而赋值操作会让一个符号表示了计算得到数或符号表达式。
对"f(x):=x^2;"可以使用"f(2);"来求某值对应的函数值。


绘制图形|polt
这个功能用来绘制函数图形的,比较直观来着。执行
(%i1) plot2d (sin(x), [x, -%pi, %pi])$
(%i2) plot3d (2^(-u^2 + v^2), [u, -3, 3], [v, -2, 2])$
Maxima就会去调用gnuplot来显示了。
其中最重要的参数是,被绘制的函数,以及绘制的坐标各轴(至少是提供自变量)的范围。
函数参数也可以通过名称传递事先定义的函数或一组函数构成的列表,而且可以是分段函数。
更可以使用discrete/parametric形式表示被绘制图形。
控制绘图也可跟其他许多参数,可能用到的有:
"[grid,30,30]" 网格
"[nticks,29]"
"[logx]"/"[logy]" 使用对数尺度
"[box,true]" 边框
每个参数都构造成列表的形式传递,单原子列表传递参数名或者将参数作为列表中的剩余原子。
比如:
(%i1) plot2d (exp(3*s), [s, -2, 2], [logy])$

也有"gnuplot_"开头的一组参数,用来作传递向gnuplot的命令。
绘图还有contour_plot绘制登高图线函数,以及"load(draw)$"后可以使用的绘图包提供的Maxima-Gnuplot界面。

化简|Simplify
这是通过对表达式的等价变换,得到我们需要的形式,或者用来手工帮助Maxima处理复杂的表达式。
被化简的可以是带符号的表达式,也可以就是单独一个数。
一些简单的化简(也是运算啦)Maxima是会默认进行的。
下面列了一些会用到的化简类的函数(先暂且考虑实数域吧):
"%,x=5/z;" 替换表达式中符号,功能同subst函数。
"sublis"则可以用来把一组解代入某个表达式。
"factor" 因式分解
"expand" 分解多项式
"ratsimp" 有理数化简(通常是通分,逆操作为"partfrac")
"radcan"(=radicals+canonical)化简log/e/根式
"trigsimp"(=simplify trigonomtric)化简三角函数
"logcontract"(=contract logarithms)合并log
三角(Trigonometric)方面的还有"trigexpand"和"trigreduce"
还有"rootscontract"和其他一些,手册中有分类的完整列表。
多项式除法用"divide"函数

方程|Equation
solve([x+y+z=5,3*x-5*y=10,y+2*z=3],[x,y,z]);
solve(x^2-5*x+6 =0,x);

solve用来求方程或方程组的解,结果将会表示出所有符合等式(表达式则"=0")的解(结果中的变量用%r加数字表示)。
也可用allroots函数数值方法求根的近似值。
这里的原理用到矩阵变换来着。关于微分方程,见下面一节。
其他可能用到的:
"linsolve"(=solve linear system)解线性方程组
"algsys"(=solve algebraic system)解多项式方程组
"eliminate"(=eliminate variable)从方程组中消除变量
"find_root"用二分法查找一个根
差分方程用"solve_rec"

微积分|Calculus
先来求极限,导数,和求积分的简单示例:
limit( (2*x+1)/(3*x+2), x,inf );
diff(cos(x),x);
integrate(x/(1+x^3),x);
integrate(1/x^2, x, 1, inf);

这里被运算的是表达式,函数或等式会对等号两边都执行运算,可以使用预先定义的符号。
符号f(x)和f是不同的符号来着,前者会表示符号的依赖关系。
如果仅仅是用来表示而不计算,可以用单引号"'",常用于写微分方程。
"diff(expr,x_1,n_1,...,x_m,n_m)"参数中可跟多个符号来一次求导和在符号后使用数次参数表示求导次数.
"limit"极限有"plus""minus"两个方向。
又涉及了几个常量:"%phi" 黄金分割,"inf" 无穷大,"minf" 无穷小,"infinity"复数无穷,"%c"/"%k1""%k2"是一阶和二阶的积分常数。
有时也可用Romberg函数数值方法来求近似积分。
求解常微分方程,例如
ode2('diff(y,x)+3*x*y = sin(x)/x, y,x)
ode2可以用来求一阶和二阶的ode。
初值用到ic1和ic2函数,而二阶的边界用bc2函数。
depends函数用来表示函数间的依赖,相当于一种抽象的函数关系,会对求导产生影响。
另一种用到的高阶微分方程解法是运用"Laplace"拉普拉斯变换函数(用到"delta")。
通常是直接使用desolve函数,它即是用Laplace变换来解线性微分方程
这里还涉及"del(x)"是解释微分中dx的写法,"atvalue(expr,x_1=a_1,c);"用于建立边界值。
使用"assume(x>0)$"可以给表达式中的符号指定范围,一些运算在不同范围或者特定值上会有不同的意义。
有时积分要用"changevar"用一个符号来代替部分表达式。

级数|Series
首先是求和和求积,即∑,∏这两个符号:
sum (a[i], i, 1, 7);
sum (1/3^i, i, 1, inf),simpsum;
product (i^2, i, 1, n);
求1..100的和就是"sum(i,i,1,100);"了
"simpsum"标志则用于对结果化简,例如使用等差数列求和公式。
也有些其他的标志:
sumexpand: true$
cauchysum: true$

然后,来将表达式展开为泰勒级数:
taylor (cos(x) - sec(x), x, 0, 5);
"taylor (expr, x, a, n)"是将自变量是"x"的表达式"expr"在点"a"处展开(显示出的部分)到"(x - a)^n"。
要输入泰勒级数的话可用"trunc",然后输入一个展开式的片段。
或者展开:
niceindices(powerseries(%e^x, x, 0));

这里有个有趣的例子:
taylor(%e^x, x, 0, 5);
plot2d([trunc(%), %e^x], [x,-5,5]);
很直观来着。

线性代数|Linear Algebra
这里主要是来进行矩阵(Matrix)的表示和计算:
A:matrix([1,2],[3,4]);
B:matrix([1,1],[1,1]);
A + B ;
A . B ;
A^^-1 ;
determinant(matrix([a,b],[c,d]))
"matrix"是按行来表示矩阵的。
矩阵的运算符表示为"+"".""^^",其中"A^^-1"等价于"invert(A)"求逆矩阵。
其中"determinant"是用来求行列式。还有"transpose" 求转置,"eigenvalues" 特征值,"eigenvectors" 特征向量。
取矩阵的部分可以这样
row(A,2);
col(A,2);
A[2,3];
要取子式的话,可以用"minor"函数。
其他可能用到的有:"ident" 单位矩阵,"adjoint" 伴随矩阵,"echelon" 梯形矩阵,"charpoly" 特征多项式。"rank"什么的就是字面的意思啦。
矩阵可使用"genmatrix"由一个lambda表达式创建其元素。
也有些附带的包提供的函数,比如"mattrace"。
稀疏矩阵的话。。。

曲线积分|Line integral
这个涉及多重积分,其实也是微积分的一部分。因为没有直接的函数,就分开说了。
参见 http://maxima.sourceforge.net/docs/tutorial/en/gaertner-tutorial-revision/Pages/lineint0001.htm
这篇从原理上说,就是把"[x = cos(t), y = sin(t), z = sin(t)]"代入,类似于手工操作。
代入操作使用"sublis"函数。
简单的表示就是:
lineIntegral(fn, path, param, p0, p1) :=
block ( [substitutedFn, x, xx],
substitutedFn: sublis(path, fn),
x : ev (substitutedFn, diff),
xx: subst(1, diff(param), x),
integrate(xx, param, p0, p1)
)$

lineIntegral(x^2*y*diff(x) + y*z*diff(y) + z*x*diff(z),
[x = cos(t), y = sin(t), z = sin(t)],
t, 0, 2*%pi);


集合|Set
创建用"set();",然后也有好些用于集合的函数,
这里就不展开说了。
...

复数|Complex
复数域和实数上一些函数会得到不同的结果。
首先是"%i^2=-1"然后就可以来写:
1 + 2*%i;
实部和虚部用"realpart"和"imagpart"得到。
"gfactor"是复数域的因式分解。
"domain : complex$" 保留"x^2"
"declare(z,complex)"
"rectform" 转换为"a + b %i"形式

补遗|Others
length 返回一个数量,对不同类型的值有不同意义。
at 用于假定符号的值
declare定义符号的类型,会影响符号在表达式中的作用。
block 一个有局部作用域的语句序列,可以用"go(tag)"。
kill 清除符号,可以"kill(all);"
分段函数可以用"if"语句表示
流程控制见"Programming"分类
列表是Maxima内置结构,也有些对应的操作函数。
"map""lambda"等用于函数编程。
用"to_lisp()"和"(to-maxima)"可以在Lisp与Maxima的语法表示法间切换。
也可用":lisp"命令后Lisp语句,用|$%o1|引用输出。
一些有趣的例子:
block([fpprec:100],bfloat(%pi));

Fib[0] : 0;
Fib[1] : 1;
Fib[n] := Fib[n-1] + Fib[n-2];

block([w:0], for i:1 thru 10 do (w:w+i^2),w) ;
(取自xmaxima的介绍文件)


声明和推论|Declarations and Inferences
这是涉及数学概念上的推算。
参见 http://docs.huihoo.com/homepage/shredderyin/maxima.html
用到的函数有:"assume","facts","maybe","is","forget","declare"。
可以给变量指定范围,也可以给函数指定奇偶性。

统计|Statistics
虽然不如R在这方面功能丰富,不过有个包叫"descriptive"提供了相关的基本功能。
使用前要先"load (descriptive)$",然后就可以求均值方差什么的了。
详见手册上对此包的说明。

概念|Concept
复制自维基百科,只是个片段的东西来着。
微积分基础
函数
数列
级数
初等函数
极限
无穷小量
收敛数列
收敛性
夹挤定理
连续
一致连续
间断点
▲一元微分
导数
不定积分
高阶导数
介值定理
中值定理
泰勒公式
求导法则
乘法定则
除法定则
倒数定则
链式法则
洛必达法则
导数列表
导数的函数应用
单调性
极值
驻点
拐点
凹凸性
曲率
▲一元积分
积分的定义
黎曼积分
达布积分
勒贝格积分
积分表
求积分的技巧
换元积分法
分部积分法
三角换元法
降次积分法
部分分式积分法
定积分
牛顿-莱布尼茨公式
广义积分
判别法
柯西判别法
阿贝尔判别法
狄里克雷判别法
主值
柯西主值
β函数
Γ函数
数值积分
牛顿-寇次公式
辛普森积分法
▲多元微积分
多元函数微分
多元函数
偏导数
隐函数
全微分
方向导数
梯度
泰勒公式
拉格朗日乘数
多元函数积分
多重积分
广义多重积分
路径积分
曲面积分
格林公式
高斯公式
斯托克斯公式
散度和旋度
▲微分方程
常微分方程
分离变数法
积分因子
欧拉方法
柯西-欧拉方程
伯努利微分方程
克莱罗方程
全微分方程
线性微分方程
差分方程
拉普拉斯变换法
偏微分方程
拉普拉斯方程
▲微积分的应用
微积分的几何应用
平面图形的面积
平面曲线的切线和弧长
平面曲线的曲率
旋转体的体积
旋转曲面的面积
曲面的切平面和法线
空间曲线的切线和法平面
微积分的物理应用
运动的位移、加速度
力所做的功
物质的质量
静力矩、惯性矩和重心
微积分的经济应用
边际
弹性、交叉弹性
收益流的现值和将来值
成本分析、净资产分析


数学建模|Model
下一篇再说这个吧

……|...
...

Links
这个是补充,更重要的列在上面了
http://www.math.harvard.edu/computing/maxima/ [推荐]
http://cadadr.org/maxima/faq.html [推荐]
http://math-blog.com/2007/06/04/a-10-minute-tutorial-for-solving-math-problems-with-maxima/
http://maxima.sourceforge.net/docs/tutorial/en/gaertner-tutorial-revision/Contents.htm

2010年4月26日星期一

现代电影中的真实

标题是《现代电影中的真实》,明显标题又起得太大太宽泛了。
以自己的认识还不足以挖掘开这个话题的深度,况且下文还打算跑向电影所不具有的交互功能等。

关于真实,传统戏剧有两种看法:
一种是,在观众和舞台之间建立距离感。观众是一个置于表演之外的思考者,获得了一次审视生活的机会。
另一种是,要设法让观众融入到表演之中。让观众有身临其境的之感,来体会舞台上传递的感受。

而现代电影的理论,可以从的20世纪60年代的“第一电影符号学”作为开端。
In the 1960s and 1970s, film theory took up residence in academe, importing concepts from established disciplines like psychoanalysis, gender studies, anthropology, literary theory, semiotics and linguistics.
http://en.wikipedia.org/wiki/Film_theory
(好吧,虽然维基百科不是很严谨,不过这方面话题查阅不能是个遗憾。)
上面的英文的意思说,电影理论引入了艺术之外人文科学界的概念与视角。

还是尽理解力来写吧。
总之这是将艺术,由对现实的拟真,转移到追求意识层面的绝对真实。
由此,可以去观察其中的一些特征:
1.多样的媒体渠道的展现
2.作者意识的存在与表现
3.人物与冲突模型的变换
4.对梦与意识方面的分析
5.在影像中对自我的发觉
6.社会意识与虚构间的交织
7.对现实世界与人生的隐喻

其他的有关于:
性欲理想和敌人等关于人的满足方面的追求
叙事结构与影片类型的运用与打破
生命,死亡,成长,记忆,真实与虚幻等等话题的探讨
对历史,预言,宗教等固有认识的重新审视
艺术之外的衍生,包括相关的探讨和带来的影响力
关注人物的潜意识,以及造成的对观众对自我的发觉

恩,按自己之前想法,这是一种关于体验的艺术。对艺术品的欣赏是一个体验(动词)的过程。它是一种能够成为记忆中的过去,并面向于未来的体验活动。就像梦和回忆一样,都成为自身过去的一个组成部分。
这里虽然在说电影,并使用了一个名词叫“现代电影”,不过我更想关注是这种特征在多样的艺术形式中所共有的成分。比如某些新闻,小说,事迹,游戏。。。
同时,对体验的关注也涉及到观赏过程本身。这是一个电影的信息逐步展现的过程,也是体会其中的节奏铺垫高潮期望猜想与满足的过程。

关于小说的淡化情节,从目前的小说电影上看这种设想是可行的。
它是把叙事作为一种表现的手段,而不是其内容的全部,或者目的。

关于艺术中的交互成分,我承认交互是个我感兴趣的话题。首先,交互是个直接体验的过程,就是一个有参与有回应的部分(因果关联之类)。不过有时候,交互也只需要是一种感受,实质是一种伪交互。比如在文本(这当对艺术品内涵的泛指用)中“我”的视角的存在感,故事的非线性(时序上和逻辑上的)在观赏者意识中的重新组织,故事的世界观历史观其自身的关联与完整性。

这里再选择在影像中对自我的发觉这一点来展示其中表现手法上的特征:
故事中存在对观赏者视角的代表。可以是一个人物,他不需要是故事的主角,但他在故事中的行动有明显的东西,比如逃避什么寻找什么或者向往什么。也可是一种上帝视角,获得比故事中单一人物更多的认识。通常在一个电影中,这两种视角是相互结合的。
影像和屏幕的视角就是对人与梦境之间的一个类比,观众自身不属于故事中,但在这种缺失中希望得到一个自身存在的位置。在假想和现实(对故事的期望(观众自身的愿望)与实故事的际进行,也涉及错觉的利用以及观众对现实生活的体验的清醒感)的矛盾之间,感受的自我的存在。
其中也包括对记忆的屏蔽和认识的掩埋。出于不开心的经历或者生活的挫折,人的一些想法会一直存在,但是被忽视了。那么整个故事也就是一个揭开回忆重新认识的过程(获得与丧失,表象下体验的转变,其实也是一个转递过程)。这是故事和观赏者在一定的体验时间中所共有的。
故事本身存在一个环状结构。从冲突的引发到解决,给观赏者一个现实没有改变但是人的意识在改变的感觉。故事是对意识中的矛盾在生活之外的演绎。也可在故事变现其主线对其中琐碎之处带来的影响,虽然观众在之后通常只记得主线的内容。
其他的,在故事中表现人物间的影响,因为这是一个可以脱离屏幕的阻隔的传递。阻隔还存在于自恋(自我存在)与他恋(比如对故事中人物或物品的喜欢与讨厌)之间,是一个自我面对镜像可以操纵想象的自由和只能限制于镜像的挫败感,让影片在展现自我的缺失中成为对自我意识投影的凝视。就像婴儿的自我意识觉醒的感觉一样的,呈现了一个自我视角上的体验。
这个,能指转移,拉康与第二电影符号学是什么东西?反正有关,不过未懂其含义。总是这里关注的是现代社会中的自我意识啦,实现与影像之外的getter和setter作用。

关于文化的社会意义,我是简单地相信他们是相互作用的。

====
以上其实是看到一本书后的感想。
话说批评文字其自身就是对电影的一次再创作,产生出了新的具有艺术的价值的文本。
同时,批评文字也是对电影的挖掘与反思,让人看到了电影的优点不足和希望。
这本书呢,也是有意追求一种传统的关于艺术趣味之外的视角。

《电影批评》
作者:戴锦华
目录:
《电影批评》
前言

电影的视听语言与叙事分析:《小鞋子》
第一节 电影语言与叙事组合段理论
第二节 伊朗电影与《小鞋子》的叙事结构
第三节 叙事·表意·修辞

电影作者论与文本细读:《蓝色》
第一节 “电影作者论”及其矛盾
第二节 电影作者:基耶斯洛夫斯基
第三节 《蓝色》:主题与色彩
第四节 生命与死亡的变奏

叙事学理论与世俗神话:《第五元素》
第一节 叙事学的基本分析类型
第二节 叙事范式与批评实践
第三节 类型的变奏与类型的意义

精神分析、女性主义与银幕之梦:《香草天空》
第一节 梦·释梦与电影
第二节 精神分析女性主义的电影理论
第三节 《香草天空》与梦的套层结构
第四节 男性的噩梦与成长故事

精神分析的视野与现代人的自我寓言:《情书》
第一节 “镜像”理论与第二电影符号学
第二节 爱情故事或自我寓言
第三节 记忆的葬埋与钩沉
第四节 结局与结语

意识形态批评:《阿甘正传》
第一节 意识形态·政治·社会
第二节 《阿甘正传》:成功而及时的神话
第三节 重写的历史与讲述神话的年代

第三世界寓言与荒诞诗行:《黑板》
第一节 “第三世界理论”的前提
第二节 《黑板》的寓言
第三节 寓言的寓言

影片分析举隅Ⅰ:《人·鬼·情》
第一节 女性的主题
第二节 自抉与缺失
第三节 拯救的出演与失落

影片分析举隅Ⅱ:《霸王别姬》
第一节 历史写作
第二节 男人·女人与人生故事
第三节 暴力迷宫


最后传送
2009奥斯卡 - 最佳动画短片 - 回忆积木小屋
http://v.youku.com/v_show/id_XNzQwMTU5MjQ=.html
在水滴分明的声响中,这不是一个关于海平面上升的故事,值得细细品味其影像中所寻找的东西。

See Also
http://baike.baidu.com/view/188541.htm

现在真的最后了,仅在提示一下,热血也是一种风格哦。

2010年4月22日星期四

编程语言与科学计算 - 篇一

编程语言是用来向计算机发出指令,而计算机起初是用来做科学计算的,比如ENIAC最早就是被用作火炮弹计算和设计氢弹时计算断面中子密度。通过电子技术获得了比算盘更强大的计算能力。出于“标题什么的只是个引子”的理由,接下来要说的还是集中在计算工具上。
打算以历史发展的角度来说,并且重点在提及而非严谨,内容也会是选择性的来说。
第一个正式的高级编程语言Fortran最初就是发展于数值计算方面的需要。它命名是Formula Translation即公式翻译的意思,并且在特性上有接近数学公式的自然描述,很高的执行效率,直接对矩阵和复数进行运算,以及在这一领域长期广泛的积累。
下面按时间顺序说到Algol/Pascal。Algol的名称国际代数语言表示它一种算法语言,使用接近伪代码的表达式来描述计算过程,也就是直接面向算法的。Pascal基于ALGOL,强调了结构化编程以及数据结构的运用,在教学和开发中一直有着广泛的运用。这里也体现了“算法+数据结构=程序”的说法。
然后到了某种意义上算是第二个高级语言LISP/Scheme。LISP即LISt Processor列表处理语言,是一种基于λ演算的函数式编程语言。它是人工智能(AI)上的运用在与计算机的结合,比如做自然语言分析。利用它特有的λ演算和LIST结构,可以设计数学上的符号积分系统。Scheme是LISP的一个方言(显著的是静态作用域),在如今的动态语言上留下了很明显的痕迹。LISP的一个分支LOGO被用在了直观的儿童教学和简单建模。
(GW)BASIC命名是初学者的全方位符式指令代码,是针对初学者简化自FORTRAN的人机交互式语言。这里想说的版本是GWBASIC(至少现存着),因为它本身接近原本ROM-Basic的形式。在启动PC后直接通过语言解释器的界面交互使用设备,并可以第门槛的来运用编程语言的功能。
APL/J让它作者获得了获得图灵奖,如今至少我没见过它的运用。不过它对数组和矩阵有很强的表现力,在现在看来接近于书写复杂的数学表达式(有点∑的感觉)。
Brainfuck,这个,貌似名称不文雅了。拿出来仅想说一下最简单的语言也可表示图灵完备的,也就是理论上最高的计算能力。而且图灵完备也不一定要冯诺依曼结构(比如用λ演算)。
然后说SQL/Prolog,果然开始慢慢跑开话题了。SQL呢,和数学上的联系在于关系代数,是用于数据库中的结构化查询语言。Prolog是代表Programming in Logic,其中显著的特性是Horn子句,设计为用于人工智能以及专家系统。在meta元编程上和LISP有共同的地方,即利用自身的特性施行特定领域语言的识别与使用。
电子表格软件EXCEL/VBA明显不是一种语言,但确实是数据处理上很实用并通用的东西,比如用在金融领域中。它本身可以直观的展示和编辑数据,而且在功能上除了丰富的内置函数,还提供了图表展示和求线性规划等等。公式和函数已经可以用来实现复杂的逻辑了,vba脚本反而不是很常用。
计算器calc,终于到了一个最熟悉的角色了。不论是实体还是软件,它就是一个简单纯粹的计算工具。使用最简单的计算器,就可以进行轻松的四则运算了。不过这里我的分类乱掉了,因为谈论计算器是从一个专用的计算设备的角度来看的,而编程语言是从语言的功能和实现对设备的使用的角度来说的。复杂的计算计算器可以用来算微积分数据分析图形展示等等,也提供了编程的接口。Linux下可以安装extcalc来玩玩。
C/C++因为在系统以及通用语言上的地位,可以用来代替Fortran和Algol处理运算和算法。因为C本身是一种较底层的语言,有着性能上优势以及系统的紧密的结合。C++上一个值得关注的方面是泛型编程。在STL中,利用C++的对象机制和模板机制,抽象了数据结构和相关算法。还提供了复数类供方便使用,Numerics库用于数列和矩阵上的高效扩充。
数学软件(用英语写成Mathematical software)是用来模拟分析计算数值符号几何数据的软件(额,断句有点问题,这里是三个动词加三个名词。这里是说到了专用软件和系统的话题)。从语言上说是使用了专用的接口,可以看作是一种DSL(Domain Specific Language)。而且比一般可用来计算的软件要可靠。其中的代表有MATLAB,实现了数值矩阵计算,建模仿真以及对专用工具箱的界面。在数值分析领域,有同源的若干开源实现比如Octave,而Scilab则倾向于实现出较完整的功能。
CAS是Computer Algebra System计算机代数系统的缩写,是用于进行符号运算的软件。其中一个维护至今的开源实现是Maxima(本身是LISP实现),它的前身Macsyma也影响了Maple及Mathematica的出现。速度方面会不如数值运算软件。
其他的还有一些有关的软件的例子。比如:统计分析软件R语言,用于。排版系统TeX,可以精美的展现出数学表达式。
最后,在这部分的最后,来说说SmallTalk的对象浏览器。它是出于ST的纯OO特性,在其集成且开放的应用开发环境GUI中,是用来提高编程效率的工具。至少现在说数学软件已不仅仅是指功能和组件了,开发环境也是作为一个要素和工具在使用的。
好了,以上的内容是从科学计算的角度回顾了一下编程语言发展。所以没有提及商务以及通信媒体方面的语言及应用,而数学软件也仅作为了一个来提(其实这方面的应用我也确实很不了解,话说这才是真正广泛并深入的部分),在此说明一下。

##分##看过一个艾薇儿演唱会加采访的视频,话说那种对行为细致叙述的歌词是很有魔力的。##割##

接下来要说的Python与科学计算,我只是觉得这是一个省事的方法。毕竟Py这里更多只是在作为一个界面与胶水,而我也只是要一个能用的方案而已。
已经有人写过详尽的专文了,传送:
《用Python做科学计算》 http://hyry.dip.jp/pydoc/index.html
也有一个使用了Py的集成系统Sagemath,它是对大量相关工具的集成。
教程可以见 http://www.sagemath.org/zh/ 感觉是很实用的一篇
用Py的好处是它在MacOS和众Linux发行版中是自带的,拿出来就可以当计算器用,而且它本身可以清晰的用来表现算法。另一个很重要的方面是,Py有着广泛的库和接口以及在有关领域一定规模的社区支持。比如会用到的库:NumPy,SciPy,SymPy(这个还在开发,目前不是很可靠。还是去用maxima吧,sage就是这么做的。也像Matlab用Mapple的感觉),matplotlib。。。
好了,我发现其实这里和具体的语言没什么关系,来提Py只是在把话题引到一个手头上可以具体使用的工具上来。
在开源方面GMP是个底层库,其他数学软件可以用它来计算的。而仿Matlab的开源系统也有很多来着,一些已经是完备并实用的了,如Freemat,Scl。其他也有一些实验性的,比如Mathomatic,是一个C语言的小巧便携的CAS实现,功能简单但移植方便。不过我这里是要能干活的工具来着。

下面以数值积分为例,来涉及一下数学软件的简单原理。
数值积分是计算机可用的定积分算法。它的概念源于对积分区间的分割,通过细分出的区域的面积和来无限逼近积分值。而利用计算机强大的计算的能力,可以有效地执行对分割出的区域的积分值的累加。其中用到的方法有牛顿-寇次公式,即将积分区间等分后用多项式的和来表示原函数来进行计算。可用梯形法,即用线段表示被积函数将积分面积表示为梯形面积之和。也用辛普森积分法,以二次曲线代替矩形或梯形进行积分。
另一种积分的求法是通过符号运算(如CAS中用到的)。原理是牛顿-莱布尼兹公式,将定积分表示为两个求两个函数值的差,通过求函数的积分函数来求定积分的值。
我不能确保我的解说是完全正确的。况且这里仅一个示例,也不会去谈论涉及到的更多的数学原理。这一小部分只是想展示科学体系的完整性,而且希望在后面的内容中去更多地关注数学模型的运用。

有关方面详细的,可以阅读数值计算Matlab的相关书籍,也可以再看一下关于LISP实现符号积分的文章。

打算写的东西,在下一帖里再继续,本篇先暂且到此了。

中英名词对照表:(补充中)
这部分在是对下面内容的汇集,以提供阅读和使用的方便。
...

Todo:
高等数学
线性代数
离散数学
数学建模
声波和位图

其他:
Mathematica有个在线版http://www.wolframalpha.com/

2010年4月21日星期三

使用Emacs编写Python

下面要说些零散的内容,标题什么的暂且做一个引子吧。

编辑器日常用还是Sctie之类的多一些。比如目前以Notepad++为主,上手即用。最多打扮一下,熟悉下插件。不过感觉不必在编辑器的功能上注意太多。因为对这类编辑器,都只是在Scite提供的编辑控件里编辑要编辑的文本,然后再使用额外提供的功能。而IDE则是针对特定用途,对编辑器和相关组件的结合了。在GUI编程中嵌入一个编辑器控件也不是麻烦的事情。对它们的使用都可以建立在对比如Win自带的记事本之类的感觉之上。

在Unix的传统的命令行工具中,提供有ed来编辑文本。ed是交互的文本编辑工具,通过输入命令来执行文本行的编辑。而另一个工具sed流编辑器,则可用对一个完整的文本流进行处理。编程语言也可用来处理文本,比如一个专门的工具是awk,在其中充分的运用正则表达式和模式匹配。sed和awk都常作为shell编程的命令。通用的编程语言,比如Perl因为在文本处理方便丰富的功能
,也能很实用地执行对文本的操作。好了,下面可以来说vi/vim。它仍然是一个基于命令的文本编辑器,但是一个显著的差异是能够可视化的展现命令执行的效果。命令可以是基本的光标移动文本插入打开保存,也可以是对整个文本的复杂操作。可以通过vimtutor来熟悉的vim命令的使用。同时vim的插件机制使得它的用途丰富和多样起来。而其他软件中也可嵌入vim来使用。

终端下还有另一种类型的文本编辑器,例如gnu/nano和dos/edit,这里不涉及年代的讨论,而它们也确实出现的相对较晚。可视为简单的纯粹的可视化文本编辑器,除了全屏幕的文本编辑域外,也显示了可用的快捷键或者菜单。使用起来和上面最开始时说到记事本之类十分相似。下面终于说到本篇的主角了,就是Emacs。它呢,可以看作是nano的增强增肥版(好吧,nano某种意义上确实是emas简化来的)。我们可以用Emacs来编辑文本,就像用记事本一样,F10使用菜单。只不过有些略微的习惯差异,比如是先指定文件名再编辑文件,以及在GNU中影响广泛的快捷键风格。抛开些许习惯差异,拿Emacs来编辑文本也是一个很方便的事情。这个。。。除了有点笨重的感觉。

Emacs在Linux的图形界面下界面很普通,不过字体渲染得很好看,至少我看着很喜欢。菜单中的帮助下面有一个教程,可以用来熟悉一下它这种风格的使用习惯并训练一下常用的编辑操作。其实Emacs的操作也是基于命令的,不过倾向于通过一个或一组快捷键来使用命令,比如C-h就可继续帮助的操作(然后按k,v,m。。。中的一个)。如果是打开或创建一个.py文件,就进入了python的mode。明显的变化是菜单有了改变,可以使用py相关实用的命令,比如执行当前程序什么的。编辑窗口中,也会开启针对py的语法加亮和缩进方式。好吧,我承认我暂且就是拿它当文本编辑器用的,仅觉得用起来挺好使的工具而已。
话说历史悠久的Emacs用起来确实有压力很大的感觉,如果不是因为这里的关注点转到了文本编辑和python上,我可能就仅仅是知道而不会去使用到它了。因为正巧对Emacs有所了解,而手头又需要一个编辑python的工具。所以这里写到的目标就是把两样东西都好好的给用起来。
传送
http://www.gnu.org/software/emacs/tour/
http://emacser.com/
http://www.emacswiki.org/
http://forum.ubuntu.org.cn/viewforum.php?f=68&sid=8b61fab8810b7da29f44cc6d84dfec8a

修改.enacs文件,文件在home目录下,我们的配置文件就是它了。其他脚本可以放在 ~/.emacs.d/ 下。Emacs为配置文件提供了图形界面了,只不过文本的性质更方便集中修改和添加启动脚本。配置文件是自动载入的一系列命令,这些命令也可以运行程序后手动执行的。所以说配置文件其实是默认启动的程序。可以去手册查API列表配置GUI看看可设置的属性,别人写好的代码。
比如:
(setq x-select-enable-clipboard t);让emacs可以和其他程序复制粘贴


下面的操作是可选的,来安装一个扩展,这是一个不同于Emacs自带的那个的python-mode
http://www.python.org/emacs/python-mode/
这是一个elsip文件,文件开始的注释里有安装方法。
其他可以用到的若干程序,可以参见:
http://www.emacswiki.org/emacs/PythonMode
扩展的以及自带的模式属于单独的程序,需要看其自身的帮助文件或说明

以上是个工地,也仅仅是个开始而已。不过接下来更多的是在如何用编辑器更好的做要做的事情,而不是编辑器本身或离开它就没法做等等的问题。

See also
http://www.ibm.com/developerworks/cn/aix/library/au-textedit.html
维基百科中Emacs及其他编辑器的页面



下面进入本篇第二个主角Python,安装了后就运行IDLE来交互的执行代码,iptyhon相比于自带的终端交互也有了增强。
话说并不喜欢Py,因为自己固执地认为“声明>命令”,所以喜好偏向于Lisp/Scheme风格。算法可以用函数表示,数据结构用List表示,结合函数和列表也能抽象出对象。虽然在函数内也用有序的命令,但关注点整个程序的结构上的。而且函数也是一个值,可以写成List中的一个元素。只要遵守了严格语法规则作用域规则什么的,可以很方便嵌套和递归。
当然Py有它自己的风格,给我的感觉是:对它使用是基于习惯的,它的语法是对语言使用抽象,而不是语法规则的展开。从PEP上可看到通过增强语法来实现更多功能的讨论,这使得Py语言在持续发展着。作为一个图灵完备和支持C语言扩展来说是不用担心Py不能做什么的,由于语言本身的修改以及实现更多的特性,让之前写的代码就会有了新的表达方式。不过这不影响把Py作为一个工具来使用,这也是关注到语言本身的表达,而不必在意其背后的规则。当看到教程或别人的为了某个表达用了如何的语法之后,自己之后做类似的表达时也可拿来用。PEP上也有倾向把语言用法的转到语法层面的指定上来。在不断在语法层面来表达库,而没用库来补充语法特性。
这种风格使得Python成为一种很好用(重音在“用”上),详细感觉可以在《The Zen of Python》中体会(通过执行import this语句获得)。使用是要做的是把算法表达出来,至于语法实现的部分和全部则可不必在意。自己上面也说了个人的喜好,但这不影响有很实际的价值来用它,包括语法特性可相关库等众多方面的。自带库是语言的一个部分,手工或使用swig自动的可以绑定C++库。其实,也是让语言可以被看作是对第三方库和宿主的接口。
http://www.python.org/doc/
http://wiki.woodpecker.org.cn/
有两个比较实用的函数是dir和help,参数是一个字符串,需要是当前环境可访问的包,比如help('__builtin__')查看内置函数的说明。

先跑题一会儿,说点其他琐碎的方面。C++对象方面的语法是申明+定义+实现,声明表明了其结构,定义则决定了生存期和作用域,实现可以同于连接器分离开(只在乎存在,而不是顺序)。C++的这种形式和它的编译时处理是分不开的。动态语言常用字典表示对象实例,不过对象仍然是很少用字典的构造语法来创建,如果一定要这样的话可以通过原型继承和单实例类的实现。C++的模板机制实现了duck-tpye机制,一个类可以如何用那么它就能拿来用,而STL则将很多数据结构都可以按照序列来处理。动态类型语言让变量都成为一个引用,赋值语句只是用来改变绑定,而有时赋值也会是对象setter方法的一个别名,变量分为mutable和immutable,对前者的改变会影响所有应用,而对后者的修改操作是绑定到一个新的副本。JavaScript和Lua用起来很有Lisp/Scheme的感觉,被用于嵌入来表示数据的内容和操作。目前常用的C语言的是版本89和99的混合,而C++是98。
注意,这里是在说语言的特性。因为使用是使用的语法表达的特性与表达的方式,而不是语言的语法本身。喜好不妨碍对使用价值的判断。

最后,在Py的语法内来玩出些有趣的东西,尝试下略魔幻的用法。比如这个:
Py语法上表达的数据结构有tuple,list,dict(str是一种tuple),它们涉及的语法有sequence,iterator,generator。注意,它们是语法的一个部分,而不仅仅是一个类型,比如用在函数调用中

#注意,以下示例收集自一些教程。

#tuple
#immutable类型,括号可省略
>>>t=1234,5567,'hello'

#list
>>>test=[1,2,"yes"]

#dict
>>>tel={'jack':4098,'sape':4139}
>>>tel['guido']=4127

#=
>>>a,b=b,a


#slice
>>>a=['spam', 'eggs', 100, 1234]
>>>a[1:-1]
['spam', 'eggs', 'bacon', 4]

#iterate
>>>for i in range(10):
... print(i)

#generator
>>>sum(i*i for i in range(10))
285


#enumerate
>>> [x for x in enumerate(['tic', 'tac', 'toe'])]
[(0, 'tic'), (1, 'tac'), (2, 'toe')]

#zip
zip([1,4,6],[2,6,2])
[(1, 2), (4, 6), (6, 2)]

#reversed
>>>for i in reversed(xrange(2)):
... print i
1
0

#sorted
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
... print f
...
apple
banana
orange
pear


#dict
>>>dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
>>>dict([(x, x**2) for x in (2, 4, 6)])
{2: 4, 4: 16, 6: 36}
>>>dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}

#list([iterable])
#tuple([iterable])


#in,用于for和条件判断
#function=callable object
#在2.x中range是得到list,而xrange是得到一个可用于迭代的对象。

好吧,我承认是在玩C++中语言标准的正交原则。比雅尼·斯特勞斯特魯普 告诉我们“如果两个语法可以结合使用,那么就实现这个结合使用的特性”,虽然原话不是如此。至少从我上面的尝试的感觉来看Py是可以适当的这样玩一玩,不过这不是Py的原则,Py是基于习惯用法的。

补充说一下Python中数学方面的:
长整型是支持高精度的,decimal库则用来对应小数的算法,复数complex用j做虚部。
还有非内置库比如numpy,scipy。

See Also
http://docs.python.org/library/stdtypes.html
http://docs.python.org/library/functions.html
http://wiki.woodpecker.org.cn/moin/PyAbsolutelyZipManual
《简明 Python 教程》

上个截图




接下来是补遗阶段

首先是文本字符编码相关
话说以前还真看过GBK,UTF-8,Unicode在二进制上的关系,然后尝试手工写识别转换代码(其实和没写差不多)。不过只要了解的程度,就能来冷静应对这方面的问题了。
不过感觉统一成UTF-8保存然后转成wchar处理可以免除很多麻烦。
在Emacs中的选项菜单里有,见
Python中第二行coding=utf-8,转换方面用Codec库。
See Also
http://www.hickwu.com/?p=237
http://wiki.woodpecker.org.cn/moin/PyInChinese

Emacs中也可"M-x viper-mode"使用vi的按键,阅读文件有个"view-mode"。
mode的列表,可见 http://www.emacswiki.org/emacs/CategoryModes 。

果然是很琐碎的一篇,只是感觉在提及了一些东西罢了。
教程或手册之类才是更用的多的东西。

写本文的动机是我拿Python当计算器算微积分的,这是很强力的动机来着。
文本长度现在回顾了一下,发现和以前好多篇都很一致,是巧合吧。

继续跑一段。话说迭代器呢可分为外部和内部迭代器。C++是在旧有的语法上通过迭代器对象来实现外部迭代器的。内部迭代器通常表现为.each方法,参数为一个闭包。Py本身没去实现完美的作用域和匿名函数的特性,加之追求纯粹的风格(比如不提倡嵌套)没有出现.each方法,而是使用yield,for,__iter__两个接口和一个模板方法。JavaScript因为本身由于很灵活以及兼容性问题,语言的改变变得艰难和让人接受。这使得在使用上(Ajax普及的时候)对具体功能的需要移到库的层面,众多使用方便的库几乎让JS面目全非,比如用来提供.each方法。也使得一个库的学习成本接近一个语言(虽然缺少语法上的糖衣和隐式调用),不过也让人尝试(也算触发思维)了语言更有效的使用方式。体现出来重用的不同方式的表达,不过语言差异也只是在如何实现某特性与模式上。
恩,用记事本洋洋洒洒的一大段代码也很省心的。不过那是把关注灵活易修改,以及接口和层次上了。用来表示算法的话,还是更在意语义的表达上的。所以这就算Py也有不适当的地方。
好了,我想黑Py的,也想说它确实有使用价值。怎么办呢,还是想黑它。
社区的价值有时是远大于一个语言本身的,它让人用语言到更关注的领域上去。Py的成功很大一部分可以归结到它基于社区的开发模式。
既然都写到这了,说下Ruby吧。它算Py的伙伴来着。Ry呢,有类似SmallTalk的简明核心,然后利用语法上的便利可以模拟出Perl和Java等等的使用风格(至少不必js那样版本和扩展库满天飞,还容易滞后)。社区和使用上更关注应用,而不是语言一层。
注意,以上不是在谈论差异,因为在特性层面上的并不多。这里在关注的是工具的使用价值,虽然某种意义上也算是特性提供的。比如C++的设计就是在语法层面鼓励并规范了OO,并提供了OO的一个高效实现。

最后,来一个Py的广度搜索算法,我相信这会是个让人印象深刻的例子:
...


##全文完##
Programming languages should be designed not by piling feature on top of feature, but by removing the weaknesses and restrictions that make additional features appear necessary.
——Scheme

当然,还有另一种不容忽视的思路则是 高级语言->DSL->自然语言。然后也可去涉及CLI/GUI的人机界面的话题上。

2010年4月16日星期五

阻隔的梦

阻隔的梦
深山之中,失去自由的地方,他从小生在这里。
在他成长的每一个傍晚——
坐在地上依着石块,望天上的云层渐渐模糊,
直到树的间隙中已透不出温暖的风。
“今天的饭菜还是这么难吃啊”
拖着一天下来疲惫的身躯,这也只是大家凭口说说的抱怨。
而他在一旁,一人默默地一口一口地,把饭菜咽了下去。
又将是一个夜晚,一个忘记存在与痛苦的时间。
因为父母年轻时就被当作敌人困在这个受难营里,
他自出生起就生活在这里。
虽然也会对所处的世界感到不同寻常,可是这种异样
在他幼小的心中只是孩童那无知地对一切的好奇而已。
父母都离开了,凭空的消失了。这也只是他生活中淡淡的痕迹,
因为他要做的只是每天劳作,然后等待下一天。
当生活在一个危险的战乱年代中,这是种安宁幸福的生活。
夜又平静了,平静得仿佛时间都停止了一般。
他机敏地打探周围,等待着一个熟悉的深沉的声音浮现。
“白天干了一天苦力,晚上再多幸苦点。
你是我们的希望,你能逃出这里的。
你身子还小,今天也要加紧执行这个训练方案哦。”
似乎是在为了将来的什么,秘密训练在持续进行着。
就这样一天天的,一天天的,他在长大。
“危险!”他叫喊着,随后是划破黑夜的枪声。
在他面前是那个刚转身的背影,被子弹击中,倒下了。
他顾不得悲伤,翻进一旁的树丛中。
在树的背后,他感受到不远的地方的危险,心猛烈地跳着。
“好了,终于到了现在,行动开始。”
他从树后伸出头,看到了温热的尸体上
那份死亡下仍保留的坚定眼神,心中的信念更加坚定。
他明白,自己一直为之准备着的,正是这个时刻。
于是转身,留下他最后的一个淡淡背影。
关于他的故事,自此结束。
据说最终是逃出去了,可能很快死掉了,也或许一直生活到老。
因为之后再也没有人认识他,而他大概又消隐于山林中了吧。
而且在很久以后,那片深山中囚禁之地早已荒芜,
已经没有了丝毫可探寻的痕迹。

ImageMagick

ImageMagick: Convert, Edit, and Compose Images
http://www.imagemagick.org/
ImageMagick® is a software suite to create, edit, and compose bitmap images.
Features and Capabilities

  • Format conversion: convert an image from one format to another (e.g. PNG to JPEG).
  • Transform: resize, rotate, crop, flip or trim an image.
  • Transparency: render portions of an image invisible.
  • Draw: add shapes or text to an image.
  • Decorate: add a border or frame to an image.
  • Special effects: blur, sharpen, threshold, or tint an image.
  • Animation: create a GIF animation sequence from a group of images.
  • Text & comments: insert descriptive or artistic text in an image.
  • Image identification: describe the format and properties of an image.
  • Composite: overlap one image over another.
  • Montage: juxtapose image thumbnails on an image canvas.
  • Motion picture support: read and write the common image formats used in digital film work.
  • Image calculator: apply a mathematical expression to an image or image channels.
  • Discrete Fourier transform: implements the forward and inverse DFT.
  • High dynamic-range images: accurately represent the wide range of intensity levels found in real scenes ranging from the brightest direct sunlight to the deepest darkest shadows.
  • Encipher or decipher an image: convert ordinary images into unintelligible gibberish and back again.
  • Virtual pixel support: convenient access to pixels outside the image region.
  • Large image support: read, process, or write mega-, giga-, or tera-pixel image sizes.
  • Threads of execution support: ImageMagick is thread safe and most internal algorithms are OpenMP-enabled to take advantage of speed-ups offered by the dual and quad-core processor technologies.
  • Heterogeneous distributed processing: certain algorithms are OpenCL-enabled to take advantage of speed-ups offered by executing in concert across heterogeneous platforms consisting of CPUs, GPUs, and other processors.

以上内容摘自官网。
总之是个对CLI和API方式使用很有用的图像工具。
常用于图像格式转换和流水化的图像处理。
用法示例见 http://www.imagemagick.org/Usage/
Win下可以找Binary Releases使用。

2010年4月14日星期三

都市传说

都市传说
是一次在维基百科上看词条的时候注意到这个词的。虽然当时是第一次看到,却在看了解释后有了“原来就指那个”的感觉,虽然说其实我到现在说不上这个词的定义来。
大致特征是,传说的就关于身边正在发生的事情,通过人之间的转递而成为一种共有意识,出于担心或愿望会希望相信故事的真实性。
这里不想以严肃的态度去思考这个话题,而仅仅在担当一个故事的传递者。下面我想从自己的口中来转述《试衣间的暗门》这个故事。
一对日本的新婚夫妇到香港游玩,在十分开心的逛街,渐渐走到一个略偏僻的服装店里。妻子看中一件衣服,就去试衣间试衣,先生在外面等着。可是看妻子却始终不出来,先生去查看却发现妻子不见了。问店员,却说根本没看到他妻子那样的人来过店里。后来他向警察寻求帮助,仍一无所获。只好暂且回国。
一年后,他再次利用休假赶往香港。走遍大街小巷,依旧没有丝毫的线索。当即将身心疲惫的无功而返时,他看到一间珍奇小屋,看板上写着“日本不倒翁”。他只是想进去排解一下郁闷的心情,不过却看到了很让他恐惧的东西。小屋里的舞台上有一个全裸的女性,手脚都被切断,舌头已被拔掉,像花瓶一样放着,还发出奇怪的呻吟。
他跑开后发觉不对劲,又回头去看女人的脸,发觉正是她失踪的妻子。后来他花重金赎回妻子,但是已经晚了。现在她还在日本的某个医院里,不断发出奇怪的呻吟声。。。
我对维基百科上的转述没怎么改动,而且现在只是在单纯地记录,并没有说出什么用来吓唬人或告诫别人的。比如这则传说被认为源于法国的奥尔良事件,再似乎是由日本传入香港再传入国内的。那个事件被看作是当地人和犹太人之间冲突的结果,而这个传说则被用来提醒海外旅游以及女性的安全。
好了,现在可以把话题回到都市传说本身,那么这里值得分析的有其具有的故事背景,传播方式,带来的影响等等了。通常呢,因为故事就像发生在身边,也可被称为是当代传说。
那么,我的传递,就暂且中断在这里。

CodeIgniter框架

CodeIgniter 是一套给 PHP 网站开发者使用的应用程序开发框架和工具包。它提供一套丰富的标准库以及简单的接口和逻辑结构,其目的是使开发人员更快速地进行项目开发。使用 CodeIgniter 可以减少代码的编写量,并将你的精力投入到项目的创造性开发上。


开始|begin

CodeIgniter是EllisLab针对PHP开发动态站点开发的开源Web应用程序框架。
类似于Ruby on Rails,CI为开发者提供了基于MVC的架构模式,并提供了一组丰富的标准库。
这对于组织复杂的应用,以及应用的快速开发都有很大的帮助。
CI本身定位于小巧优雅,它有清晰的文档,而没有限制的编码规则。
也有一个社区分支叫Kohana,是个严格基于PHP5的OO框架,并有一些较大胆地实用增强。

首先,列出以下用到的参考文档和教程
CodeIgniter用户指南 http://codeigniter.org.cn/user_guide/index.html
CodeIgniter入门 http://www.ibm.com/developerworks/cn/web/wa-codeigniter/
20分钟创建一个博客(视频) http://codeigniter.org.cn/tutorials/watch/blog
《CodeIgniter for Rapid PHP Application Development》
本文的目的也仅仅是传递对《用户指南》的一的大体印象,并假设已经有了对类似的框架的了解。

在解开从CI官方下载的压缩包,其中system目录和index.php文件就是我们所要的程序了。如果把他们放在xampp的htdocs目录下,就可以通过http://localhost/来浏览了一下效果了。
将关注转向其中的application目录,这里已经为不同的用处划分了子目录了,包括config|models|views|controllers|...。站点的修改与开发就将在这里进行。
例如这里需要找到config/config.php文件,找到base_url设置,并修改
$config['base_url'] = "http://localhost/";
下面将要并行的展开若干关注点

路由|route

对站点的访问从一个URI开始。
如果没有用rewrite重定向掉index.php的话,对于http://example.com/index.php/news/article/my_article
参考默认控制器 controllers/welcome.php:
class Welcome extends Controller {
function Welcome()
{
parent::Controller();
}
function index()
{
$this->load->view('welcome_message');
}
}
(文件名小写,类名首字母大写,两者一致)
将是对News的实例调用article("my_article");。
这里用到了View,它调用的是views目录下对应的php文件。
在View中可以使用例如,$title由view方法的第二个哈希数组形参数传入。
而如果要生成一个链接的话,可用
echo anchor('news/local/123', 'My News');
。它属于URL辅助函数(helpers),所以需要调用
$this->load->helper('url');
,可以放在使用前,构造函数中,或者在配置文件设置自动装载。
类库(library)则是
$this->load->model('display');
,然后使用$this->display对象。
这里涉及文件名的操作允许多级目录。

数据库|db

相关配置在config/database.php,比如通常是指定我们创建好的MySql数据库。虽然也可用CI提供的操作,不过一般已可先用phpmyadmin等工具设计好数据库表格。在使用前调用
$this->load->database();
,或者使用自动加载。
CI提供了数据库类,对数据库的操作都可以通过$this->db对象进行的query。同时CI也提供了Active Record 模式,可通过方法调用的形式生成SQL查询,例如
$query = $this->db->get('mytable');
// Produces: SELECT * FROM mytable
。这样可以简化SQL的书写,封装数据库间差异。
对于一组数据库操作,可以创建一个模型Model来表示站点的数据结构。例如创建models/user_model.php:
class User_model extends Model {

function User_model()
{
parent::Model();
}
}
(命名约定同Controller)
使用则按照
$this->load->model('Model_name');
$this->Model_name->function();

对数据库的操作定义为模型类的成员方法。同时也可定义数据成员
var $title = '';
var $content = '';
var $date = '';
,把$this当作一个hash数组使用。

其他|other

$this->input提供了xss_clean()post()cookie()等方法,用于安全的获得输入。
跟踪用户状态的会话机制,CI提供了PHP本身之外的Session类。
对通过view文件的输出,Codeigniter提供了缓存技术的支持。
CI的提供了plugins插件机制,官方Wiki上能找到一些可用的。
测试所编写的应用会用到:基准测试类,以及单元测试类。
创建表单用到的了,表单辅助函数,以及表单验证。
CRUD与REST,前者是基本的数据造作,后者是一种设计风格。
Ajax可以结合jQuery使用,以获得无刷新装载的体验效果。
自带类库和辅助函数在用户指南中有详尽的列表和用法说明。
CI有i18n支持,不过不自带ORM和访问角色控制的实现。
像Drupal那种CMS通常也是可当框架来用的,而且相比插件更丰富些。

结束|end

就先上面这些了。
http://en.wikipedia.org/wiki/Category:Web_application_frameworks

2010年4月12日星期一

两个人的梦

两个人的梦
“我听你的,下面去哪?”她两手放腰间,在我面前睁大双眼看着我。
我急忙躲开她的眼神,随口说道“不~知~道~”
她似乎更加兴奋了,转身看着光线发白的远方。
伸出手,指着,“那么,就是那儿,走吧。”
我的手被她拉着,一时步子没调整过来,不过还好没跌倒。
然后就这么,随着她的身影,在夕阳的映衬之下,奔跑在河岸边的公路上。
不知路有跑了多久。天由明亮,变得暗黄,变得只能看见路。
风声和脚步声告诉我——这是在奔跑。
“这啊,这算什么梦”在食堂的桌子对面,她刚才好奇的眼神变得失望。
“那你,还干嘛非要我说呢?”
“我看你从早上就没精打采,而且~刚才吃东西又一点不香的样子。”
我看她嘴里还有食物,
但她继续说着,“我刚才问你‘怎么了’,不是你说‘那个讨厌的梦啊’的吗?”
我听她说着,缓慢地动着嘴里的食物。
她停下来,觉得说着无趣。而我却仍从心里感受着失落,所以双方都默不作声。
然后吃完饭,回各自的教室了。
下午放学,我去她教室找她,没有看见。就问了门口出来的一个女生。
“什么!受伤了,从楼梯上,还估计一段时间来不了学校!”
我听着,不知该想象事情会严重到何种地步。
想着要临近期末,都和她认识了一学期了,看来最后还是我自己一个人。
我一个人默默地走出校门,一人走在回家的路上。
之后我向她的电话就一直再也没有打通过。
一个忙碌的考试过去,又到了悠闲的假期。她已经被埋在记忆深处,我没有再去在意了。
放假了,是个出去游玩的机会。拿着机票,就要飞往遥远美丽温暖的那座岛屿。
我望着冬日里温和的太阳,心头充满期待。
可是,意外的事情还是发生了。
在寂静和显得空旷的海边上,我们又相遇了,谁也没发躲开对方。
画面停留的这一刻,而在我心中,不知这是曾期盼的,还是一直的害怕呢。
我们麻木地坐在一起,看着潮水的起落。
距离感之中,只在说着各自的故事,填补着在一起的时间轴的空白。
我们谈论的是种幸福,坚持得越久就能体会得越多,可是也就越会害怕消失。
在快乐与欢笑的一天天里,会默默地不断地积累着担心和若有若无的疼痛。
一直害怕着有一天会明白,什么是快乐,什么是珍惜,便不能再体会到它们了。
可是还是有这么一天,她的伤好了,腿伤已经恢复了。
内心的不安也渐渐平静了,就仅记得当初说过“对不起,让你们担心了”。
当初伤心和难过的痕迹已经模糊,可是始终总是不敢抛开它们的存在。
仿佛自己一直还受着伤,仿佛自己还不用去想曾经中断的愿望。
不过在此刻来试探自己心底的想法,其实可以说我们是仍旧期望着呢。
不用担心失去,或者哪怕短暂的分离。只要你还想着它,它一定会回来的。
现在我们又能够在一起。最后,她传来一个微笑。
拉着我的手在海岸上奔跑,在夕阳之下,回忆着永远的美好。

Qt框架简述

Qt is a cross-platform application and UI framework.
以上是Qt官方的定义,地址是 http://qt.nokia.com/
最基本的,Qt是一个XWindow函式库,可用于基于Widget的图形UI开发。
但更重要的是也提供了跨平台的C++语言扩展和众多实用库,以及一些开发工具。
这些对于高效的开发跨平台程序是强有力的支撑。
以下内容根据Qt4.5的文档,这是NOKIA收购后Trolltech推出的重要版本,具有很好的向后兼容性。
传送在线文档地址 http://doc.trolltech.com/4.5/index.html

Qt通过预编译器moc和类型QObject来对C++的class特性进行了扩展,它是Qt的物件的基础类
class MyClass : public QObject {
Q_OBJECT
public:
MyClass(QObject *parent = 0);
~MyClass();
signals:
void mySignal();
public slots:
void mySlot();
};
这样就可以清晰地使用Qt的Signals and Slots机制,
这是Qt物件间常用的通信方式与解耦合方式。
signal按 emit mySignal(arg); 语句使用,Slot则是可以被connect的特殊的成员函数。
比如通过这样的方式使用
QObject::connect(
&QObjectA, SIGNAL(valueChanged(int)),
&QObjectB, SLOT(setValue(int))
);

下面是一个简单的GUI实例
#include <QtGui>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget window;
window.show();
return app.exec();
}
}
QWidget是GUI组件的基础类
通过构造时指定parent构件,组成层次关系。子对象会被其父对象自动delete或show。
比如增加一个按钮
QPushButton *button = new QPushButton("Press me", &window);
如果这里在QObject里可以用tr("Press me")包裹的QString来实现i18n。
除了使用构件的resize或move方法,Qt提供QLayout来布局构件的位置。
比如使用水平布局
QLabel *label = new QLabel(tr("Name:"));
QLineEdit *lineEdit = new QLineEdit();
QHBoxLayout *layout = new QHBoxLayout();
layout->addWidget(label);
layout->addWidget(lineEdit);
window->setLayout(layout);
layout并不派生自QWidget。它是通过addWidget或addLayout来添加构件或布局,然后在窗口中用setLayout来使用。
一般来说,窗口是通过继承QMainWindow来实现。
class MainWindow : public QMainWindow{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
};
在这里的构造函数中,除了用来创建(QWidget)this的子对象外,还可以使用QMainWindow的添加菜单工具栏以及停靠构件的操作。这里菜单项是添加了QAction对象。
构建的事件处理也需要在此用Signals and Slots机制来connect,
connect(button, SIGNAL(clicked()), this, SLOT(on_button_clicked()));
这里on_button_clicked()是为MainWindow定义好的Slot成员。
事件也会用到QEvent对象,通过重写QWidget中event相关的虚函数来处理。
消息框使用QMessageBox,
StandardButton QMessageBox::information ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton ) [static]
对话框则通过QDialog派生出。dialog用show();hide()操作可见性,exec()执行模式对话框,accept()在对话框中确认对话框完毕。
对文件的操作会用到的有 QFile,QDataStream,QFileDialog。其中前两者类似C++库中相应的类,但增强了对Qt类型的支持。
QVariant包含了基本的Qt类型,其中
QString的arg()可以用来替换"%1, %2, ...",number和toInt方法用来在数字和字符串间转换。
也提供相应的数据结构QStringList:QList和一些算法。
这些Qt类型属于QtCore模块,而GUI组件属于QtGui模块。来使用时需要引入类型的头文件。
Qt也提供若干实用的模块,比如网络数据库脚本方面的功能。

相关的工具:
使用QtDesigner是Qt提供的可视化GUI生成工具,通过.ui文件创建布局和设置信号。
布局通过Form菜单中Lay Out使用布局,构件间可以使用事件的关联,可以定义新的槽。
本地化使用QtLinguist。
使用QtTest可以进行单元测试,可以实现测试驱动的开发。
程序生成使用qmake,可以跨平台使用。
其他Core和Gui上的特性要点:
复杂的表格或树形视图是通过Model/View结构的编程实现。
图像的操作是通过Paint System,主要用QPainter对象,图片用QPixmap表示。
拖放由QDrag和QEvent实现。
继承QThread用来实现多线程。
GraphicsView是用来代替QCanvas实现2D对象显示。

Qt的API设计
http://www.cuteqt.com/bbs/viewthread.php?tid=195
Qt是作为库是可以在多种语言中使用的,但本身API是按C++设计。
其中处理相关的技术要点,值得关注的是类的继承关系,Public和Protected的Type,Property ,Function,Signal&Slot以及Static Member。其中Property涉及getter和setter两个方法。

See Also
http://qt-apps.org/
http://www.kde.org/
http://www.telegraph-road.org/writings/gtkmm_vs_qt.html

----
相比于其他选择如Glib/GTK,.net,...
通过Qt可以增强对C++的使用,获得跨平台的特性,提供易用OO的API。
而且这里更在意的是,使用了Qt能够以如何的代价获得什么。
Python感觉用PyGTK和wxPython的更多一点,他自身还带了简单易用的Tk。
思考着C++,安装好QtCreator,就算是Qt使用的开始了。。。
Qt的官方教程叫 C++ GUI Programming with Qt 4, Second Edition。

----
关于i18n问题,还是要补充一下的。
首先是字符串编码的问题:
Qt的处理方式是QString对象存放Unicode(和源码编码无关),而如果和系统使用的编码不一致就会显示乱码。
所以在QString与系统会文件间字符串转递时如过需要,就要对编码进行转换了。
如果仅是中文显示问题,可用这个
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

另一个,是涉及到的Qt中翻译工具的使用:
待补。。。
----
Qt处理Qui库,也是个开发框架,支持库的复用和设计的复用。通过moc有对C++语法的扩展比如foreach。Qt4之前版本下编译的文件可以在之后的dll或so文件下使用的。
Qtcreater是Qt自带的IDE,可以同时使用支持多版本Qt库的,编辑器支持VIM操作模式。

一个基于SDL的CPP多媒体框架

这是之前一个尝试产物,命名为SdlView,定位是一个简单的基于SDL的CPP的跨平台多媒体框架。
实现的结构上参考过Qt,PyGame,HGE和PopCapFramework,源码看过ONScripter和sdlbasic‎。
话说好久没Code了,有生疏的感了。话说车库中当时记录下的文档还是看起来充满想法的,算然说仅仅是个开始来着。
先传送吧:http://code.google.com/p/z091204/ ,等页面自然死。
因为CPP修改不方便而且开始时用的自己的脚本引擎也很残,所以后来就尝试写成一个Lua库来自用。

Ok,主题回来。本文是的重点是这个框架结构设计上的想法。
开始前先作些约定,文本必须无BOM的UTF8格式,图片建议png,声音建议ogg。这只是想在可用的前提下,为初步实现少些麻烦而已。
程序通过继承SdlView来实现,SdlView提供init和quit方法,来对所有组件执行对应操作。
View是一个基本的交互单元,可以在几个View中切换出当前活动的,也可以复合使用。
需要重写update(event)和draw(Surface)两个方法。其中根据update的返回确定是否自动调用draw,或者是要结束流程。View的run方法默认定义调用msgloop,而msgloop是按照消息循环的方式使用update和draw。
所用资源通过私有指针成员,可由私有构造和析构函数负责管理,或者定义init和quit方法。
首先是Video模块,模块的全局变量通过Video类成员的保护继承来实现。
用到的封装好类型有矩形Rect,方位Pos(x,y),颜色Color,表面Surface。
使用上提供的类型 精灵Sprite,可以由图片文件创建。负责对一个Surface的引用管理。
为结构方便它继承自一个可以重写update和draw方法,并支持对Pos进行操作的节点类。
同样也派生出了类型 场景Scene,用双向列表来实现的,也是Composite模式的一个运用。
其中draw方法支持相对相对坐标的转化。
一般使用都是对Sprite和Scene的派生,比如使用派生自Sprite的按钮的事件判断:
Pos m = event.mouse();
if (bn.has(m)){
printf("Button actived.\n");
}
一组选项的处理则可以用Scene来处理。
此外定义了 声音类Sound 提供类型 Music Chunk在创建资源对象。
文字的渲染由字体类Font的实例render方法负责,可以得到一个Sprite。
为方便折行,可以指定渲染宽度,然后返回尚未渲染的字符串。
事件处理有三种类型,其中常用的是消息列队msgloop和timerloop。
对消息的使用是通过Event对象,在使用前需要让Event对象处理消息,或者让Timer对象安排延时。注意当前活动且有效的E和T是什么。
实现Event时,定义了两层结构。一层是直接的封装,另一层为方便使用会为正在处理的消息类型使用对应的方法(也提供按键到坐标的转化,isSkip()等)。可根据性能和易用性的方面来使用。
消息的使用流程 init();事件循环:处理事件,绘制,update();quit(); 已经封装在View中了。
此外还提供了类型 效果Effect 是类似Sprite的Surface+Pos的结构,用来实行对Sprite的增强使用,比如更多的融合效果,一些实现好的动画效果也被放置在这里。也可多重继承出EffectSp负责出如 EffectSp(wqy.render(str,color),Pos(54,y)).print(); 这样的效果。

后来用SWIG做了Lua的绑定。因为Lua本身不是基于类继承的语言,SWIG也不是Lua的专用绑定程序。Sprite类型就只被充当了Image类型的实现来使用。也考虑过增加通过类型Type来实现Null对象。
最后,实现的定位是一个自用的基础模块。并不很在意功能的完整性,有用和接口稳定反而更加重要的感觉。其他可考虑的有Box2D以及ImageMagick的接口。而OpenGL自己还了解的不多。
话说Qt+JS也像是不错的方案。
恩……Wiki格式写出来的文档结构分明很漂亮的,不过这里不是。
当然,搜索一下可以发现同类型的完整实现已经很多了。

See Also
http://wiki.gamedev.net/index.php/PopCap
http://www.renpy.org/
http://love2d.org/

2010年4月11日星期日

星球之梦

星球之梦
“这就要走了”,我再次望了望身后的世界。
星球即将面临它的最后一刻,这或许真的就是最后一眼了。
画面停留在公元2x42年4月1日,我告别星球的那一天。
曾随着星球上的资源枯竭与环境失衡,人们一直在寻找新的生存场所,
后来终于在50年前,发现了这样一颗条件适合的新星球。
那时我还没有出生,在此刻是通过别人的语言来
回忆那时的事情的。
“当时的人们很兴奋”为一个新的家园而兴奋。
那时月球之旅已经很方便了,人们也能去更加遥远的地方。
想到可以自在地体会曾经人们的太空梦想,内心总不由感到幸福。
可是这仅仅是一种能够被称为幸福的幸福,因为周围在改变,
在人们切实生存的星球上,已经开始遍布它衰老的痕迹。
将来如果有一天星球消失了,星球上的生命消失了,
这是星球到达了它注定的结局,还一切仅仅只是场意外呢。
可是毕竟终于在那个时候,人们有机会去抛开旧星球的约束了,
终于不必再担心地生存在一个即将枯竭即将毁灭的世界中了。
“新的星球,我们只是去远方安家而已”
当太空的路程变得仅仅需要瞬间的时候,空间的距离已经不能再称为遥远。
新的家园也建设得很快,人们能感受到美好和幸福正在迎接大家踏上旅途。
而且至少是在旧星球上的时候,可以为生活舒口气了。
不必去顾及毁灭,可以轻松地向周围索取排放,
大家可以感受内心的压抑正在被强烈地释放着。
那是一种在心灵上放弃理性而获得解脱的氛围,
这似乎就是星球传递出的最后的也是永恒的意志吧。
“可是那天我哭了,没能迈开步子”同样是出发的一天。
是在远行吧,是在开拓新的家园吧,自己是在做这样的事情吧。
可是心里明明还想着,这不也正是告别吗,面对着家族传递下来的星球。
传递着的一个即使生活在遥远的地方,还能用来守护曾经的存在的某处,
一个还能用来珍藏丰收与喜悦的场所,一个在某一天迈出过脚步的地方。
有时旅途的阻隔反而成为一个纽带,让自己在新的星球上时,
仍在意识中让原先的星球是一个分离之后还可以重回的地方。
可是这次的旅行就不准备再回来了,原本的星球已经是一个在被抛弃的世界了。
“我们同行的人,一个人哭了,又一个人哭了,最后大家都哭了
我们抱在一起,希望能用皮肤接触传递的温度来互相安慰。
可是当时那种情况,已经是容不下思维而任由感情发泄的时候了。”
之后大家也释然了。因为这只是旅行,只是一场远行而已。
让就是在50年后的今天,人们依然可以在这个原本的星球上生存。
可是后来意外还是来了,一颗黑洞的随机运动让星球不久就要毁灭。
人们已经设法来解决这个危机,最终还是没能找到办法。
这就是星球的尽头啊,这次是真的就要离开了。
此刻在我对星球的最后一眼里,已经不需要遗憾。
因为大家已经把星球延续下来了,而且足够远了。
即使星球就要消失,这份理想的传承也还依旧能够延续下去,
延续向着远方,向着一个没有尽头的幸福的场所。

#这个是重写版本,变动不大。
#本来主题是可持续发展之类的,还是写偏了。

2010年4月9日星期五

身的转角,回忆的暗影

本篇是打算加上之前那个《女孩之梦》写成一个连续短篇的。

下面是篇二

星球的最后一刻
“这就要走了。”
我再次望了望身后的世界,
或许真的就是最后一眼了。
这是公元2x42年4月1日,
我告别星球的那一天。
随着星球资源枯竭环境失衡,
人们一直在寻找新的适合生存的场所,
在50年前,人们终于发现了这样一颗新星球。
那时我还没有出生。
在此刻,我是通过别人的语言来回忆
那时的事情的。
“当时的人很兴奋。”
因为终于可以去一个新的世界是太让人兴奋了。
当时月球之旅已经很方便了,
人们也能够去更远的地方。
想到可以随意地体会曾经人们太空的梦想,
内心总不由的感到幸福。
可是这仅仅是一种能够被称为幸福的幸福,
切实生存的星球上却已经遍及了它已经衰老的痕迹。
如果将来有一天星球消失了,星球上的生命消失了,
这是星球注定的结局,还仅仅是一场意外呢。
可是终于,人们有机会去抛开旧星球的约束了,
不必再担心地生存在一个即将枯竭即将毁灭的世界中。
“新的星球,我们只是去远方安家而已。”
当旅途变得仅仅需要瞬间的时候,空间的距离还能称为遥远吗。
新的家园建设得也很快,
人们能感受美好和幸福正在迎着大家踏上旅途。
至少旧星球上的大家可以为生活舒口气了,
不必去顾及毁灭,可以轻松地索取排放,
感受到内心的压抑被强烈地释放着。
这是一种放弃理性而获得解脱的的心灵氛围,
或者也可认为是星球一种永恒的意志吧。
“可是那天我哭了,没能迈开步子。”
远行吗,开拓新的家园吗,自己是在这样做。
可是这不也正是告别吗,面对着家族传递下来的星球。
传递一个即使生活在遥远的地方,还能用来感受自身存在的某处,
一个还能用来安放记忆的场所,一个能在某一天再次到达的地方。
此刻旅途的阻隔反而成为一个纽带,让自己的在新的星球上
原先的星球在意识里是一个可以分离可以重回的地方。
可是这次的旅行就不准备再回来了,
原本的星球已经是一个要被抛弃的世界了。
“我们同行的人,一个人哭了,又一个人哭了,最后大家都哭了。
大家抱在一起,希望用皮肤接触的温度来互相安慰。
可是当时那种情况,已经是不容思维而任由情感发泄的时候了。”
之后的事情就是大家都释然了。这是旅行,一场远行而已。
50年后的今天,人们依然可以在这个原本的星球上生存。
可是意外的是一颗黑洞的随机运动将导致星球在不久后毁灭,
人们已设法来解决这个危机,可是最终还是没有办法。
这就是星球的尽头啊,这次是真的就要离开了。
此刻在我对星球的最后一眼中,已经不需要要了遗憾。
因为大家已经让星球被延续的足够远了。
即使星球就要消失,这份传承也还依旧可以延续下去,
向着远方,向着一个不需要尽头的幸福场所。
http://220.170.79.105/html/music/20100409/91630.html

====
以上这段由重写过,后来的几篇都分开贴了。
这贴先晒在这里,过后再来处理吧。

2010年4月8日星期四

使用ffmpeg转换FLV文件

转换从优酷上下载的视频在移动视频上看,
可以到用的这个命令:
for /f "delims=" %%i in ('dir *.flv /b') do ffmpeg -i "%%~nxi" -s 320x180 -ab 32k "%%~ni.mp4" 2>null
它会转换当前目录下的所有的flv文件。
这里ffmpeg没有用太新的版本,
其中涉及706d编码和faac的问题,
会导致一些设备不能正常解码。
转换后的好处是调节了文件码率和分辨率,对移动设备的储存空间解码能力缩放的性能消耗上获得方便。
之前也试过用mencoder转换,不过视频音频可能会不同步。
命令中可以把MP4改成avi或wmv,会自动选择对应的编码方式。
这里是针对QVGA分辨率的屏幕的,宽屏转换到320x180,不然就是320x240。
其中默认码率音频64k视频200kb,码率的选择要参考原视频和需要的播放质量来选择。
复杂用法在ffmpeg的文档里找。
好像要默认覆盖同名文件的话的加 -y 参数。

如果从土豆上下载的FLV文件会用到这个
for /f "delims=" %%i in ('dir *.flv /b') do ffmpeg -i "%%~nxi" -s 320x240 -ab 28k -b 128kb/s "%%~ni.mp4" 2>>null
参数要更具具体情况,现在而言是土豆会加黑边但码率比优酷高,但优酷的分辨率会很高。
话说我之前误解过分辨率和码率间的关系过。

ffmpeg的另两个组件是
ffplay和ffserver

几个软件的个性化设置

K-Meleon

除了有布局上的修改,
安装了Page Zipper和FireBug扩展
还有搜索栏增强,历史检索增强,键盘安全保护之类的工具
标签打开方式用来接近chrome的方式
PrivacySecurity和Menu放到工具栏上了
就是toolbars.cfg里这样的:
%ifplugin macros
Proxy{
macros(Proxy_None)|PrivacySecurity
quick privacySecurity
mainbarhot.bmp[9]
mainbarcold.bmp[9]
mainbarcold.bmp[9]
}
%endif

Options{
ID_PREFERENCES|Compact Menu
View Preferences. Right-click to view Compact Menu.
mainbarhot.bmp[10]
mainbarcold.bmp[10]
mainbarcold.bmp[10]
}
不过目前在纯浏览时不用它了
----
扩展安装地址:http://kmext.sf.net/

Xubuntu

布局参考了debian上Xfce的设置
Xfce菜单使用默认配置,桌面栏合为单条浮动在上方。
GTK主题是clearlook,Qt使用GTK作为主题(用qt4-qtconfig设置)。
上面那个 终端 图标的命令是 exo-open --launch TerminalEmulator。

Notepad++
最近版本里增加的插件管理很有用,比如用来安装Light Explorer
喜欢Bespin主题,用熟了后可以精简下界面
还有个XML Tools 在写HTML时用得到

foorbar2000

是直接在预设布局选择的,主要是为了利用文件库管理和用来访问压缩包内文件。
额外解码器需要时再去官方站点找,可有一些扩展增强之类的。
不过貌似itunes的音乐库功能更丰富一点。

Avast4.8

这个是什么皮肤都没有的样子。

本帖是顺带秀截图。
最后,
Windows
还有就是Windows下的ClearLook的也相当顺眼来着。
http://schmoove.deviantart.com/art/ClearLooks-for-Windows-XP-18591720
我喜欢CL原本的清凉蓝色,然后桌布用一个柔和的或者色彩鲜明的。
总之是色调很一致,然后纯度高或低就是不同的风格了。

目前的PDF阅读器中还是看Adobe Reader比较舒服,不过个性化的余地不高。
就当UI的艺术品来看吧。

播放器嘛Mplayer,在用CLI版本的。
好了好了,其实只有最上两则是重点的。
----
Firefox下Hide Caption+Vimperator+Foxdie后,就成了全键盘的样子了。

PHP: Hypertext Preprocessor

PHP是一个常见的用于编写动态网页的脚本语言
它原本是Perl编写cgi程序的替代,可以用<?php ?>的形式把代码嵌入网页文件之中。
执行过程通过URI请求某个php文件,返回执行后输出的部分。
PHP是语言风格源于Perl/C的动态语言,也可使用类似JAVA的面向对象特性(比如反射机制)。
内部库对函数式与命令式两种风格的用法都提供支持,你可以像使用一个熟悉的语言来用它。
作为一种针对网页开发设计的语言,PHP具有轻便易用支持完备的特点。
其中对语言本身值得关注的有语法特性,运行环境的功能和限制,以及支持库三个方面。
个人感觉适合从教程+手册+实例的角度来运用它。

传送:PHP手册
http://docs.php.net/manual/zh/manual.php
以下内容将选择地列出其中的关注点。

输出header或者对输出流的操作需要放在输出开始之前。

Cookie与Session处理

关于魔术引号
这个功能会自动对HTTP请求数据执行addslashes()用'\'转义方便安全的使用SQL查询。
可以用下列代码关闭,以防止不同设置带来的功能的不一致
set_magic_quotes_runtime(0);
@ini_set(‘magic_quotes_sybase’, 0);

之后在需要时手工在使用SQL等执行转义操作。

数据库
例如开始自 $db = sqlite_open("gbsys.db");

数据验证
PHP自身提供的相关功能有filter_var()函数

框架
...

#这篇暂且就这么吧

2010年4月7日星期三

类的模式 - OO系列之三

本文的内容按照Gang of Four的《Design Patterns: Elements of Reusable Object-Oriented Software》,也就是通常所说的设计模式。
设计模式原本是建筑上的说法,指可重用的对问题的解决方案。
这里把这个概念借用到OO上,总结了Class的若然模式。不同模式有各自可以应用的问题,以及如何运用一定的语言特性来实现它的方法。

首先来说语言特性。《DP》一书是针对C++和SmallTalk来写,不同类型(动态/静态)的语言,和已经通过语言层面实现的特性,会影响到具体场合中会遇到的问题,以及解决方式。
下面行文的侧重会在类的常见使用方法上,会针对Class这个语言特性来说,并扩展到OO的层面上来。虽然只是记录下来书中在这些用法方面的展示出的冰山一角,但是我想这对于OO的运用以及设计的重用的方式方法都能引出广阔的视野的。

《DP》已经展示了语言相关的问题功能和使用的思路,它们涉及:的类型与接口,类与对象的用法,实现继承与接口继承,面向接口的编程与复用,使用对象的组合,对象的委托关系,对象间的聚合与相识,依赖耦合与灵活性,应用工具箱以及框架。
对此具体的一一解释仍见原书。下面来设法就其中的启示扯开一下:
对象本身是若干数据和方法的集合,它储存自身一份数据(对象说某接口的指针)并判断其所属的提供方法的类。对象可以被使用,调用对象的成员函数或向对象发送消息,可以使用对象提供的功能或者进行于对象状态相关的操作。对象可以被传递,可以传入一组数据或者功能,同时针对引用的传递可以是基于接口的或者表示使用的许可。对象间可以建立起层次和关联,这可以用来表现对象间的关系,和实现功能的重用。

不同的设计模式本身涉及了各自产生的问题环境,设计的意图,一定特性下的实现方法,封装产生的可变性与灵活性,以及模式间的关联。
同时设计模式是经验的总结,并不代表运用方法的方法全貌。而固定模式名称可以为设计与实现带来方便。
以下是《DP》中例举的模式,会列出原书的部分目录在略加注解:
第3章 创建型模式
创建一个符合界面的对象,返回指针
3.1 Abstract Factory(抽象工厂)
提供创建一组对象的工厂对象一直的界面
3.2 Builder(生成器)
将一步步创建对象操作交给一个对象
3.3 Factory Method(工厂方法)
把创建对象的操作放到具体类的成员方法中
3.4 Prototype(原型)
以克隆类对象的方式创建新对象
3.5 Singleton(单件)
实现只同时创建一个实例的类
3.6 创建型模式的讨论
关注的是创建对象的方法上
第4章 结构型模式
这里是讨论对象间的组合关系
4.1 Adapter(适配器)
为对象包装出所需的接口
4.2 Bridge(桥接)
连接分离的接口与实现部分
4.3 Composite(组成)
为枝和叶提供一致的界面
4.4 Decorator(装饰)
通过链式结构为对象的曾加功能
4.5 FACADE(外观)
为一组对象定义使用的界面
4.6 Flyweight(享元)
实现大量小对象的储存与操作
4.7 Proxy(代理)
控制或操作对另一对象的访问
4.8 结构型模式的讨论
4.8.1 Adapter与Bridge
4.8.2 Composite、Decorator与Proxy
是涉及接口的调整以及接口上的功能的讨论
第5章 行为模式
这里是讨论对象功能上的分配与执行
5.1 CHAIN OF RESPONSIBILITY(职责链)
以消息链的形式传递待处理的调用
5.2 Command(命令)
将操作实现为一个对象,方便储存传递
5.3 INTERPRETER(解释器)
用对象表示语法树的节点,并实现执行方法
5.4 ITERATOR(迭代器)
提供遍历某对象的功能界面
5.5 Mediator(中介者)
用一个对象负责一组对象间的消息传递
5.6 MEMENTO(备忘录)
用一个对象保存另一个对象的状态
5.7 OBSERVER(观察者)
一个对象改变时会通知它的观察者
5.8 STATE(状态)
用接口相同的子类表示不同状态
5.9 STRATEGY(策略)
封装算法到一个对象
5.10 TEMPLATE METHOD(模板方法)
用override来实现对象功能
5.11 VISITOR(访问者)
将能对某对象的操作的对象传递给被操作者使用
5.12 行为模式的讨论
5.12 1 封装变化
5.12.2 对象作为参数
5.12.3 通信应该被封装还是被分布
5.12.4 对发送者和接收者解耦
5.12.5 总结
这里关注的是对象的可替换与对象间通信

上述模式对OO的设计,也是若然对Class的使用方法。
关注的是通过封装使组件具有灵活性,而实现软件的规模与复用。
自己是按照笔记的态度来写的,内容在于整理和记录,并想把关注引到Class的用法上来。

传送:
《Design Patterns: Elements of Reusable Object-Oriented Software》
http://book.51cto.com/art/200706/50164.htm
http://en.wikipedia.org/wiki/Design_pattern

----
来补充下,其实是因为上面的内容有遗漏,不过结构有点乱了,只是来补完而已。
一个模式除了它的名称外,还包括其产生自的问题,应对的解决方案,使用后得到的效果。
语言的特性会影响解决某问题需要的代价,甚至不必额外的针对某种模式去实现。
一个对模式综合运用上Smalltalk的MVC(Model/View/Controller)。M会通知V数据的改变,一个M可以对应多个V,V可以组合使用,V将事件给C处理,可以单独的改变C,...通过设计以清晰的结构增强了灵活性与复用性,从而实现了表现层和逻辑层的分离。
当然,以上只是充当了所见与所想的记录而已。

使用Eclipse&CDT

Eclipse是一个IDE,完整的说就是集成开发环境。最初由IBM开发,之后开源。
个人对IBM的软件较有好感,虽然大多有沉重感,但是能发挥所用。
它源于Smalltalk的环境,是由JAVA编写,主要用于Java的开发,也自身包含了若干Java的项目。
但同时它也是一个跨平台的RCP,即富客戶端平台。可以通过外挂程式来支援更多的编程语言,在C++以及PHP开发方面的功能尤为突出。

在本文这里的目的是搭建一个C++的开发环境。
不过当初第一次使用Eclipse还是手足无措的感觉,因为那时自己在面对一个庞然大物。
用文本编辑器加Makefile就能够做开发使用的功能了(有时也会有SVN什么的)。
但是其中涉及到的问题是:我会渐渐用到更多辅助工具的功能,也需要知道以前不知道的有用辅助功能。
此时IDE就可以就是一个很好的入口了,它正是若干实用工具紧密的结合。

用来写C++的话,需要依赖组件有:
JRE,Eclipse核心,MinGW/GCC
那么这里首先从外挂组件CDT的安装说起。
在有JRE启动机器上Eclipse,菜单Help>Install new software,填入CDT的地址然后在线安装。其中有调用GCC工具链的组件。

以下只是对若干使用功能的列举,用意仅仅是为获得一个大体的印象。
创建项目:
一些的开始,File>New>Project。
项目浏览:
用于对项目内文件的操作,也可以软链接其他地方的文件。
编辑器:
提供语法高亮,智能提示,自动完成
大纲:
显示代码中的主要元素的整体结构。
构建:
对第三方的库的link需要在构建属性中设置。
调试:
提供了用于调试的布局。可以设置断点单步运行以及观察变量等。
重构:
最基本的Rename工具,也提供其他类型的重构。
查找:
用来以不同限定在项目中查找代码。
导航:
根据代码关系跳转到相应位置。
编辑历史:
可以比较代码在项目进行中的改变。
任务:
在代码中添加有关注释用于导航。
扩展:
为Eclipse安装或编写新的外挂组件。

以上是从初识一个工具的视角来展开的,只是在对其部分功能建立一个大体的印象。
不过工具的价值更让人在意的还是要做什么,能做什么,以及如何去做的问题。

See also:
Eclipse帮助文档
http://www.ibm.com/developerworks/cn/
VISUAL STUDIO HACKS

2010年4月6日星期二

女孩之梦

这个之前参照弗某的儿童性心理方面的论述来写的,
而且似乎写成了一种感觉奇异的东西了。

女孩之梦
——“我以前是个男孩”
我清楚的记得,在我很小的时候是个男孩。
那时,妈妈又生下一个小弟弟。
我看着他,白白胖胖的。
是给我的礼物吗,让我的成长不孤单。
我真是个幸福的孩子,我们一起睡觉一起说笑。
有一天父母带我们去儿童泳室,学游泳。
更衣时弟弟跟了爸爸,而我跟了妈妈。
“不用在意吧,”我心里想着。
“我还小,是个无所谓性别的年龄。”
我换上了妈妈给我的泳衣,我只是麻木地穿上的。
当我拉着妈妈的手指,有着体温有着血液流动的手指走出来时,
我看见了弟弟,他握着爸爸的手从另一面走出来。
我们小小的身高,在同一层次上互相看着,以不知如何是好的视线互相看着。
我们逃开了对方的眼睛,放低视线。僵住身子,不敢动身去接受刺激。
“不一样的泳衣。
“弟弟只穿了一条三角泳裤,而我呢,全身被包裹着。”
弟弟是我的,看到爸爸妈妈脸上的微笑我就更加生气。
凭什么我要打扮得和弟弟不同。我有什么丑陋要如此包裹。
终于我决定合上眼,去骗自己,让自己想象成另一个我。
我去想像一个只属于我的世界,让自己沉溺在一个人的麻木的幸福当中。
我想像在一个森林中,高大的树木生长在四周,那里只有我和弟弟两个人。
那是在一片没有出路的森林之中。
我睁开眼,手里拿着一个纯白的阳帽。
这是曾给他的礼物,或者至少是在我手上转交给他的礼物。
有过就在这样的一个森林中一个时刻。
我把帽子交到弟弟手上,
他微笑着收下了。
那天,正是记忆里不能改变的那天,
我同时也把内心的另一样永远的交给了弟弟。
他是个男孩,也将一直是一个男孩。
我带着泪光看着他的微笑,我也要笑,
即使内心在痛哭我也要笑,笑,笑给弟弟看。
因为弟弟是我的,一直属于我。我要让他快乐的成长,幸福的成长,一天天成长。
就像水果由青涩变得红润,那时我就可以把弟弟亲口吃掉了。
他是我精心相处累积下的。
鲜红的血液是最美的汁液。
香甜的果肉一口口的品尝,品尝这
世界上自己种下的最美的味道。
可是,他是弟弟,和我不同。
他会有一天和我告别,在以后,或者就可以算从现在起。
他不会一直属于我的,是谁对我如此残忍。
让我这就要交出弟弟,从现在起就不敢再要他了。
因为我,毕竟和他是不同的。
所以从此,我开始做一个女孩,一个有些沉默的女孩,
让大家看着美丽而又有些喜欢的女孩。
就是这种你们的目光所憧憬的形象。又可能是小时候,
我很小很小的时候,和弟弟一起所向往的。

类的责任 - OO系列之二

本文是TC++PL第四部分的转写,并侧重在Ch25 Roles of Classes。
Class是C++的一个重要的语言特性,同时它也是连接OO的一座桥梁。
所以这是一个在语言层面和设计层面上一致的话题了。
以下一些名词的译法是按照个人喜好来的,观看时请自己对应用意。

首先在看一下不同种类的Class:
这里涉及设计出它们不同的作用,以及在语言形式上的表现。
具体类:
表示一个具体的概念,通常定义为一个实例来使用,而不是用于继承。
抽象类:
形态为定义一组纯虚函数,用来定义对象接口,按照共有继承的方式使用。
节点类:
通过类继承表示概念上的抽象关系,可以具体化某类型,或者增强功能。
行为类:
作用类似于一个函数,但是以一个对象的形态来储存和使用,需要定义一致的调用方法。
界面类:
用于调整其他类的表现,以实现某种接口,或者使用方法。
手柄类:
用于操作表现类,以实现访问控制对象管理等需求。
框架类:
用于设计的重用,通过继承和重定义来实现应用的功能。

下面来看C++为我们提供的特性来支撑基于Class的设计:
设计语言:
C++通过类的关联和特性,处了编程之外,也是表达设计的一个手段。
Class的关系:
继承,包含,使用,其他(比如托管),类内成员的关联
不过这里的重点在这里略去了,即如何使用语言中表示这些关系。
组件:
类,类层次,命名空间
组件是重用的一个单元,表示为一个库或框架。其中包括模板以及界面实现关系的使用。

然后把关注引向更抽象的部分,设计在开发中的作用:
设计Class:
寻找概念及关联,定义涉及的操作,定义层次和依赖,指定接口
问题扩展开还包括了类的目的,组织,参照,实验,分析,测试,维护以及性能。
这些都是当需要创造组件时进行的一个环节。
开发的进程:
分析问题,设计结构,实现设计,实验原型,测试实现,分析设计和实现,编写文档,进程管理
开发是为了完成目标的途径,设计是其手段的一个环节,来获得对所分析问题的实现。
开发的管理:
模块重用,规模控制,知识教育,设计的混合
这里的侧重是语言特性的角度在管理上做出的行为。
不过仍来跑题一下迭代模型和基于测试的开发吧。

开头也说了本文是只是篇转写,其中没有表达个人体会,也可能会带来误解。
但是这里想表达的是种关注。
这是把对C++中的Class这个语言特性的使用的关注放到设计的角度来,
让程序语言成为一个解决问题的工具。

此外程序的设计方法并不唯一,这里考虑的面向对象的设计方法。
它不是银弹,不是通用的高效解决方案,也可能带来某些累赘。
但是在手段的发展中,何不以激动人心态度来迎接着工具的发展与改变呢。

TC++PL=The C++ Programming Language Special 3rd Edition
这里所写的具体请参照此书。

2010年4月2日星期五

这个叫...关于DoIt!的

当初在《老人与海》里看到提及棒球比赛,而且不仅是提及还作为了一个连接始末的重要要素时,觉得无法接受。
这或许叫多数人看来并无不妥,因为故事是肯定需要它发生的背景的。而透过对棒球比赛的关注,能够发现主人公所生存的环境。
现在分析起初的想法,可能自己是以一种对待西方神话的态度来观察的了。那是一种只有个别人物存在,于是在和自然界的交互中就像预示什么的故事。
而那本书所写的是在接近一种经历,是普通人也会遇到的,而需要别人的经验来帮助自己。也可是作为在遇到别的事件时思维的一个线索。

以上是开场了,而本句就是自己不大喜好的在写文字时却发表单纯针对文字而不是所写内容的看法。
好了,既然开场就说明下用意。其实只是在想说本文要如何进行。是想寻求启示呢,还是记录经历呢。虽然从上面的例子来看两者不矛盾,但我想还是有风格上的侧重问题。
貌似无关又写多了。

说“无关”,尤其在文字进行到这里的时候。
插一句,下面就这么顺着想法写了,就是没有框架全凭意识那种的文字。如果就此停笔,虽然可以认为以上文字依然有些许道理,但是就需要而言是为了引出之后的正文部分,而没有发挥作用。作为全篇来说,这些已写的还没有开始到所要写的内容。

那么现在就来谈论一下以上部分是否有继续往下写的需要。
作为开场来说,通常是需要的,这里基于交流的习惯来说的。这样可以调节气氛,也可以用来引出下文。
但是过多的开场又会显的累赘,就像本文有意造成的感觉一样。
而且文字的堆积而言,这又模糊了重点,分散了需要关注的事情。

其实照我本意,现在不是讨论开场要如何写的问题。开场后切入正文才是现在需要的关注,堆一篇文字的目的。
所以可以认为在开场的时候,如何切入正文是考虑开场自身存在更有价值的问题。引到正文成功,然后按正文部分的结构来便是了。
这里已经设法用堆文的话题展开来作为一个事例了,当然也取了个人对这个话题看法的一些假设。就像对《老人与海》的不同预设,会对故事情境的安排有不同态度一样。这里暂且仅仅是个事例。

好了,这篇里展开的话题依然散的很散很乱。但我这么说并不是想就此受到指责,因为我需要文字来表达所要传递的东西。
这里在思考的问题是:当正文完成后,发现了不满意,会去抱怨已经写了过多的开场。
虽然直觉的判断是很少人会直接的这样抱怨,更多可能是分析原本行为有什么不足。但是其中存在着一种很容易让人感到满足的假设:事情可以做的更好,只要当初怎么怎么。
这也是一种合理的假设,说合理是指至少有某种可能性。但是这里想说的是这一种让人感到满足的可能性。当事后来寻找到某个用来说的有关事情时,是假设如果不去做,或如果去做了,就会结果又如何的可能性。
往往一个必须的结果就是由可能性积累而成,这里不是要怀疑这点。靠这里的文字还不足去证明各种看法的对错评价。
这里只是在单纯的暗示一点:关注的点到底是什么。

继续回到堆文的话题上来,依旧说开场与正文的事情。遇到的状况是正在结束开场,转向正文。那么这里所关注的事情是正文要如何。
不论开场是否已经显示出了累赘感,现在不是要判断其他开场可能并做出后悔的时候。对于不可改变的做出的每一步,现在进行的是更为重要和珍惜的。往日的经历,至少是作为经历,是当前判断的重要依据。依据是用来参照而不是用来后悔的。
如果仅仅以假设的某事的做与未做,来寻求一个满意的结果。那么会发现事情的推进只会更使人陷入假想的满足之中。

来找个例子吧。虽然已经感觉堆了不少文字,而且还是那种不论怎么都看起来都似乎占些许道理的东西。
这是个压力与生病的假设。
首先肯定生理感受是真实的,然后来观察其中的心理感受。这已经是本文的后续部分了,所以请放轻松了来看。而且我也没多了解过这方面的知识,只是单纯借一个话题来继续说说而已。
这存在的假设是,如果不生病就会事情做好。有两种可能,一个是压力导致生病,另一个是生病时遇到压力。不过都不是本文在涉及的话题,这里只是讨论的一个单纯的“如果...就...”问题。
这是一个从“如果生病,就会如何”到“如果不生病,就不会如何”的推断。在一个似乎有道理的推断中,推断的前提却不经意中发生改变。从把过去时刻可能性的判断从趋向于否定,转变为趋向于肯定了。而对于如何如何的问题关注的压力,也在另一个问题的可能性的探讨下得到释放。

全文完。
====
100406
来补充一下想法。
其实当初写的时候也在想收起自身的想法,想更多的通过文字的逻辑来获得一个较完整的表达。
有时候心情什么的就像是对自己的借口来着,这里拿写文来说吧:
写之前是相信自己能写出某种效果,然后照此构思并动笔。在写的时候不断的发现不足,并设法改进。在越接近完成的时候,也是越接近失落的时候。然后就是若干时候之后又在其中寻找些许满足感。
不过写文的好坏,和写文感受关系不大。事情不是靠想象和可能性就会变成现实的。但是这里的矛盾在于不能因此就对原本的感受产生回避的态度,是纵然觉得无用却原原本本存在的感受。感受着自己在做错了什么,却又不得不做的事情。
那是在一直感受着失去,包括对过去以及对未来能与不能的可能性什么的,却仍旧对改变在做的期望。
不过原本的文字也算完整的。