声明:这里不再更新
已移居段错误:http://segmentfault.com/blog/root
@galeki 貌似失踪很久了啊
对单子的求索
如是我闻:
单子空空,力量无限
用之愈多,所得愈多
谈之愈多,知之愈少
——《单子之道》
这样说不知是否夸张,似乎每个懂得了单子的程序员都会写一篇关于它的文章(而且每一篇的开头都是:网络上已经有了许多单子指南,但是……)。原因是对于单子的理解像是一种灵魂感悟,你想与他人分享。
人们对单子的认知如同盲人摸象。你会看到有的人将它描述为容器,有的人将它描述为动作。有的人认为它是用于封装副作用的,也有人将其视为范畴论中自函子的实例。
很难说清楚单子是个什么东西,因为它与我们日常生活中的事物毫无关系。对于面向对象编程中的对象,即使婴儿都知道对象是什么(可以放进嘴里的东西),单子该如何具化?
CWEB 不权威指南
为了准备上次所说的 Haskell 文学编程项目,这两天浅尝辙止的学习了一点 CWEB 的知识,勉强可以进行 C 语言的文学编程了。
Nautilus 的 Hash Check 脚本
下载一些光盘镜像文件后,最好进行 Hash 校验保证文件的正确性。这一点对于 Linux 用户而言,属于常识的常识。只不过我经常因为一时想不起来校验命令,又懒得再去 google,所以就不校验。这个 Nautilus 的 Hash Check 脚本利用了 Zentiy 实现了一个图形界面的校验工具,可以直接在 Nautilus 中选中文件后在右键菜单中调出校验工具生成校验码,并且还能够将校验码与文件名扔给 google,完成校验码的核对工作。
Cikada 0.5 发布
自从版本 0.0.2 发布后,工作和学习上的事情比较多,所以一直未进行更新。上个月,决定要将以前的设计推倒重来之后,这一个多月的时间里将全部的代码重写了一遍,现在又基本上可以用了,功能也多了一些。
用鱼鱼换掉了 bash
鱼鱼(fishfish)是鱼(fish)的一个 fork。
fish 不是真的 fish,只是 friendly interactive shell 的简写。
可以监视目录变化的小程序
这是我在写 Cikada 时遇到的一个小问题,发现利用 GIO 库的 GFileMonitor 类与 GLib 提供的 GMainLoop 主循环可以很方便的解决它。
Clutter 不支持多线程
看这个简单的例子:
#include <clutter/clutter.h> static gpointer gen_slide (gpointer data) { return clutter_cairo_texture_new (800.0, 600.0); } static gboolean on_stage_button_press (ClutterActor *stage, ClutterEvent *event, gpointer data) { g_thread_new ("test", gen_slide, NULL); return TRUE; } int main(int argc, char *argv[]) { if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) return 1; ClutterColor stage_color = { 0x21, 0x43, 0x5e, 0xff }; ClutterActor *stage = clutter_stage_get_default (); clutter_stage_set_title (CLUTTER_STAGE (stage), "CairoTexture!"); clutter_actor_set_size (stage, 400, 400); clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color); clutter_stage_set_user_resizable (CLUTTER_STAGE (stage), TRUE); clutter_actor_show_all (stage); g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); g_signal_connect (stage, "button-press-event", G_CALLBACK (on_stage_button_press), NULL); clutter_main (); return 0; }
编译它:
gcc `pkg-config --cflags --libs clutter-1.0` test.c
这个程序需要 >=glib-2.32 版本的支持。运行程序时,鼠标点一下窗口内部区域,在我这里程序便会崩溃。不知是不是只有我遇到这个问题。
这样子,Cikada 就没法实现单独加载 pdf 页面的线程了。
将 Cikada 推倒重来
很长一段时间以来,因为要处理的主要矛盾太多了,Cikada 这种次要矛盾只好推到一边,虽然它是我最想做的一件事情。这是 Cikada 项目自发布 0.0.2 版本之后一直都没什么进展的主要原因。
虽然这个项目搁置了好久,但是也不是坏事情,在这段时间中我对报告中的演示需求有了更多的体会。下面是一些粗略的新的规划:
- 去掉那个时钟模式的概览视图。主要因为用了一段时间感觉很不方便,观看进度时画面是不应该切换成概览模式的。
- 保持只有“淡入/淡出”的页面切换效果不变。
- 提供演示文档的“剧本”支持。基本思想是:演示文档的每一页,用户都可以将其视为演员,可通过“剧本”来控制文档主题树、演讲时间,甚至添加一些辅助文本、图形与视频。
- 报告的进度应当直接呈现在演示画面当中,并且进度的测度不应当由当前页数与总页数的比值来表示,应当将其表示为预期的报告时间以及各个页面对应的报告时间。
- 分段加载页面时,在各段的起点时页面切换会出现停滞,决定使用一个线程负责页面切换,另一个线程负责预加载页面。
- 以树状图的形式建立概览视图,这样可以快速的跳转到各个子主题。
面向 GTK+ 3 的 GtkGLExt 现状
自 GTK+ 3.0 发布后,GtkGLExt 一直没有支持它,并且这个项目已沉寂了很久。最近 GtkGLExt 邮件列表中 Thomas Zimmermann 的三封邮件,让这件事情看上去有了一些眉目。