声明:这里不再更新

已移居段错误:http://segmentfault.com/blog/root

@galeki 貌似失踪很久了啊

对单子的求索

原文见 Bartosz Milewski 的系列博文

如是我闻:

单子空空,力量无限
用之愈多,所得愈多
谈之愈多,知之愈少

           ——《单子之道》

这样说不知是否夸张,似乎每个懂得了单子的程序员都会写一篇关于它的文章(而且每一篇的开头都是:网络上已经有了许多单子指南,但是……)。原因是对于单子的理解像是一种灵魂感悟,你想与他人分享。

人们对单子的认知如同盲人摸象。你会看到有的人将它描述为容器,有的人将它描述为动作。有的人认为它是用于封装副作用的,也有人将其视为范畴论中自函子的实例。

很难说清楚单子是个什么东西,因为它与我们日常生活中的事物毫无关系。对于面向对象编程中的对象,即使婴儿都知道对象是什么(可以放进嘴里的东西),单子该如何具化?

继续阅读

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 的三封邮件,让这件事情看上去有了一些眉目。

继续阅读