哆啦比猫's Blog - I'm an ArchLinuxer

2015 夏休总结

编程

项目:

  • makelessPerl5):无需配置即可使用的单文件 C++ 构建系统(build system),用 makeless -h 可以出文档。
  • renay 和 rematePerl5):摸索服务器编程,实现了一个多客户端的 UDP 中继 renay,以及基于 renay + mosh + tmux 实现的终端共享 remate (名字和功能 inspired by tmate)。
  • font-renderC++):探索 OpenGL 文字渲染,距离场字体的生成,实现了 fontconfig 的 C++ 封装文档)。
    • TODO:实现字体管理/缓存
    • TODO:做成完整的字体渲染引擎
  • gnome-extensionsGNOME JavaScript):我制作或维护的 GNOME Shell 扩展(一个扩展一个分支)。现在用的第三方扩展几乎全部换成自己实现的啦:
    • iso-clock:GNOME 本身的时钟太挫了,尤其是在 en_US.UTF-8 环境下,居然拒绝按照 ISO 8601 格式(YYYY-MM-DD)显示日期,必须换掉。
      • 彩色显示周次、日期、时间
      • 周日到周六分别用 ⊗①②③④⑤⊙ 表示(工作日用带圈数字,周末用非数字)
    • netspeed-ng:netspeed 改造的,显示网速的一个插件,目前只改了一个地方:所有文字都纵向居中了(我 OCD 快被这个插件折磨死了)。
    • maximus-ng:去掉最大化窗口的标题栏。比 maximus 代码简化很多,抽象很多。而且干掉了两个 bug:
      • 有时会出现需要鼠标选择窗口的交互的 bug:弹出新窗口的时候,整个画面卡着,就等你用鼠标随便点一下。
      • 创建时就最大化的窗口顶部有很厚的黑边的 bug:原来的标题栏的地方变成了黑色。
    • capslipcapslip@repeatcapslip@shrink:大小写锁定键状态指示,在屏幕左边中间泛起涟漪。解决 ThinkPad 键盘无指示灯的坑。我原来用的插件是在切换大小写时发送一个消息,消息从顶上弹出,挡住各种重要的地方,而且鼠标还能碰到。现在显示在左侧,动态的,透明的,可以看到但是鼠标碰不到,great。感觉挺中二就不上 gif 了。三个分支,三种动画。
    • rotten-tray:左下角 legacy tray 太恶心了,缩起来还要露出个头,轻碰就会弹出,有时还会抽搐,作为 OCD 简直无法忍受。以前的 GNOME Shell 底栏的设计多好,用力推才会显示,平时完全可以忽略它的存在。所以这个插件就是要让左下角彻底隐藏,用力推才显示。
    • top-fence:替代我以前写的 top-struggle,用来阻止鼠标指针从下方穿过 y = 14 这条直线,只有很用力的推才能穿过。之前用的是一种 dirty hack 方法(等待鼠标移动,检测鼠标指针是否 y < 14,过线则用 libxdo 把鼠标拉回来,etc),现在终于找到正确实现的方法了,即 XFIXES 5 Pointer Barriers(X 的一个扩展,GNOME Shell 已大量使用,可以阻止鼠标从某个方向穿过某个横着或竖着的线段,只阻止不放行),GNOME 扩展里面可以用 Mutter 的 MetaBarrier(在看 GNOME Shell 源代码时发现的我会乱说)。虽然 GNOME Shell 提供了 PressureBarrier 实现了用力推就放行,不过感觉手感太渣,所以还是自己实现了一个。
  • vimlight 0.19C++, Lua, VimScript):Vim 里的 C 和 C++ 语义高亮插件,基于 clang 实现。新版本改进的地方见发行注记吧。
  • 我的 VPS 流量统计页面HTML, CSS):学习 responsive design 页面的制作。

继续阅读

OpenGL 实现的距离场渲染器试验

距离场渲染(多材质),伪雾,反射,伪折射,天空(日),光晕,HDR,FXAA抗锯齿,OpenGL 3.3 core profile,SDL,可执行文件不足8KB(没能力做成 4K intro,只能当作 8K 了)

继续阅读

C++ 全局单例封装 C 语言库

C 语言的很多库都需要在程序开头初始化,程序结束时释放资源。在 C++ 中常规的封装方法是:

module.hh
 1 namespace module
 2 {
 3     // life time management
 4     void init();
 5     void free();
 6 
 7     // operations
 8     void foo();
 9     void bar(int baz);
10 }

这样的 API可以和 C 语言中的对应起来,但是这种 API 极易出错,比如,有可能会在 init 前调用了 foo,也可能在 free 后调用了 bar,可能 init 了多次,也可能忘了 free 等等。本文将讨论这种类型的 API 在 C++ 中该怎样设计才能更安全、更 fool-proof。

继续阅读

「译」 C++ 五大谣言(及辟谣),第1部分

译者注:本文于 2014年12月9日 由 C++ 之父 Bjarne Stroustrup 发表于 C++ 官方网站上 https://isocpp.org/blog/2014/12/myths-1

「为了您在冬季能享受阅读的快乐,我们很高兴地推出了这个由 Bjarne Stroustrup 写的三部分系列文章。本文是第一部分,第二和第三部分将会在接下来的两个星期一发表,届时正好是圣诞节。Enjoy. ——小编」

简介

在这个由三个部分构成的系列文章中,我将会探索并破解以下五大 C++ 谣言:

  1. “要理解 C++,你必须先学会 C”
  2. “C++ 是面向对象语言”
  3. “要写可靠的软件,你需要垃圾回收机制”
  4. “为了软件运行的效率(efficiency),你必须写底层代码”
  5. “C++ 只适合大型、复杂的程序”

继续阅读

用 vlc 看优酷等网络视频的脚本(简洁版)

自然是借助于 flvcd.com 的力量了。用 vlc 看的好处么,可以不需要 flash 了,而且没广告,最重要的是可以变速,上 MOOC 看惯了加速的视频,看普通速度的就有点受不鸟了。网上有相关的脚本,不但长,而且还用不了(应该是太久没更新了吧)。现在来一个简洁的版本:

继续阅读

rtl8188ce 无线网不稳定终极解决方案

先容我废话

据说 realtek 的无线网卡就这个系列问题多多。以前连接不太稳定,但不会频繁掉线就凑活用了。自从不知哪次升级以来,掉线越来越频繁,最后已经发展到 10秒必掉 了,以至于要上网就得拼命到终端里重连网络。网上也有各种解决方法,装官方驱动,关闭省电功能等等,全部试过,都不成功。(前者网上传言无法编译,后者没有效果,等等)

继续阅读

lua 序列化(serialization)

学习就是自己发明轮子的过程。lua 里序列化的库有很多(这里有一堆),要用的话可以直接选一个,但是一个成熟的库学习起来会有一定难度,所以干脆自己设计实现一个。

考虑比较常用的数据类型,以及实现的难度,决定实现以下类型的序列化:nil,number,string,boolean,table(with cycles 带环)。(带环的表其实挺常见的,像各种树结构,一般每个节点都要保存孩子和父亲)。

继续阅读

评论系统换 disqus 了……

以前的评论应该就消失了……不知道要怎么导入……

笔记本中键拖拽+滚动解决方案

本方法仅适用于有物理中键的笔记本。

由于需要作图,中间拖拽和中键滚动对我来说同等重要。但是我的笔记本只有一个物理中键,开启指点杆后触摸板又只有有限的功能(反正滚动区和两指滚动都没啦),所以想来想去,干脆这样:

按下中键,1秒内移动鼠标就是拖拽,1秒后移动鼠标就是滚动。

研究了一个下午+晚上,终于搞定了。程序托管在 GitHub 上:https://github.com/cjxgm/hiddle

原理如下:先用 xinput set-button-map 屏蔽鼠标中键,然后读取 /dev/input/mice 获取鼠标数据,处理后用 libxdo (xdotool)发送鼠标事件。 

GNU make 比想象中的强大

一直想找一个替代 make 的工具,因为想要自动分析依赖。兜了一圈后又回到了 make,why?因为 make 其实完全可以做到自动分析依赖(当然要借助 gcc 咯),后悔当初没有仔细学习 GNU make 啊喵~

继续阅读




© 2010, 2011, 2012, 2013, 2014 and 2015 Giumo Xavier Clanjor (哆啦比猫/兰威举).
© 2013, 2014 and 2015 The Dark Color Scheme Designed by Giumo Xavier Clanjor (哆啦比猫/兰威举).
知识共享署名·非商业性使用·相同方式共享 3.0 中国大陆许可协议
| © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee