北航北航!你的开源协作精神去哪里了!

想写一个 Android app 替换掉学校的那个超不好用的东西。不过用 SDK Manager,Android Source 总是没法更新成功。找除了FQ之外的方法时,找到了一个帖子,设置 SDK Manager 的代理为 http://mirrors.neusoft.edu.cn:80。明显这是一个镜像源,不过那 .edu 的域名还是吸引了我,上去看了一下。原来是东软信息学院的镜像站。

翻到页面最下方,是清华的镜像站。这个名称(二级域名)居然是“tuna”,有点意外。点开,继续翻到页面最下方,是其 GitHub 组织账户。看了看,那些项目都活得很健康!

在其中一个 gdanmaku 项目中,发现了测试地址 http://dm.tuna.moe/。MOE 域名!然后一看,又指向一个二级域名,那么主站呢?点开一看,十分精彩,甚至还有一个 IRC 频道,而且现在(16:48)还在不断刷新(多人参与)!

反观北航。自从年初未来花园关闭了之后,镜像站也一起被关闭(由同一个学长维护的)。社团成什么样子了?MSTC 成了内部组织,Google Camp 和百度那啥(还有一个莫名其妙的 CSDN)不知道具体活动如何,但是主要也是学习使用这些公司的技术,获得更好的实习机会什么的。计算机协会?呵呵,那群只会给人笔记本清灰的家伙能做什么!开源协会,在我前年还在 MSTC 的时候,那次百团大战,微软、谷歌、百度都出了五六个人,而开源协会整个下午只有孤零零一人守在一张小桌子后。我看了一下本学习的社团状况,开源协会已经被下调为1星了(MSTC 是5星),岌岌可危。

跟你们讲个笑话,我们学校自己的软件在自己手里的情况。我现在的专业是机械,我们有一门专业课叫“专业综合实验”,主要就是进行数字化加工实验的。开始是手工编G代码,然后是生成模型用软件导出G代码加工。就在昨天,这课开始讲自动G代码生成软件。一上课,老师拿出一个U盘,说:“同学们用过 CAXA 制造工程师没有?”(“金工实习的时候用过。”)“这次我们还是用 CAXA,你们把这软件装到电脑里去。这里面有32位的有64位的,如果你的系统是64位就选那个2013的,不用解密(他把‘破解’都说成了‘解密’)直接用;如果是32位的就安装那个2010的,只能用30天,到时间重装。需要序列号的话,下面文档里有。……64位这个是‘大赛专用版’,是数码大方他们专门给院校用的,就不用解密了。”看看看看,滥用都成这样子了。CAXA 起源于北航,而现在就如同廉价的奴隶一般被使唤。如果每个软件副本都有自己的感觉的话,它们会不会心塞呢?

虽然领导们嘴上说着建设先进、一流,却没人在这里发力。21系确实有大神将项目玩得溜溜的,但是没有一个联合的组织,没有一个共同的目标、一个兴趣。反观身边的人,想的都是怎么考上本校研究生(对,甚至都不想往外试试,只因为本校考本校,特别是本系,有面试优势),怎么找到最轻松薪酬最高的工作。——这样每个人之间都是敌人,资源有限,你争我夺。我承认我胆小,人脉没学生会、团委的人多,因此也就没法仅凭一人的力量将局势扭转。没有干草,风中的小小火柴怎么能有燎原之势?若有星星点点的汇聚,或许能指出一方光明,但究竟是什么让火种支离破碎呢?

班里一群人每天组团上自习复习考研,其中绝大多数都是考本校本系的。他们应该觉察到,你看现在大家其乐融融、相互鼓励,但是到了考试的战场上,指不定就是谁把谁给刷下去了,所以本质上每个人都是孤立的。认命也罢,不服也罢,没有共同创造的价值,只会剩下残酷斗争的遗骸,咒骂也罢,淡然也罢,事实是板上钉钉的,即使无人知晓。

胡乱写了一通,满纸荒唐言。

分享到 评论

微软的 C++ 编译器将自增自减炖成了一锅汤

《由一个自增引发的问题》的后续,用实验和文档证明微软挖大坑。

附赠:瞥一眼,瞧一瞧给微软报告bug特别是技术bug会有多麻烦。

查看更多

分享到 评论

由一个自增引发的问题

今天晚上,舍友把我叫过去(他用的是 VC++ 6)问:“这里为什么输出的是16?”

程序非常简单:

1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main() {
int i, j;
i = 3;
j = (++i) + (++i) + (++i);
printf("%d\n", j);
return 0;
}

我看了一下,回答说:“我觉得是15吧。”

然而,运行输出的不是预计的15(=4+5+6),而是16。我尝试去查找原因,却发现这似乎是编译器挖的一个大大的坑。

查看更多

分享到 评论

Bulletproof 的当前状态

一直都没回复tt和jabbany,对不起了。

距离上一次 Bulletproof 的代码推送已经超过了一个月。不知star了的各位大神还有多少仍然在关注。这半个月来无声息也是我的问题,不过最近是艰难的一段时间,接下来两个多月也会是。趁着今天还有点时间简要说一下 Bulletproof 的 WebGL 化进度。一些示例截图&目前的问题。

查看更多

分享到 评论

杂记

在B站看到了一个乐正绫发声的《Cras numquam scire》,不管是拉丁语部分还是日语部分都调教得很棒。

于是回到云音乐去找完整版(之前在工作用歌单里放的是 TV size),找到了:http://music.163.com/#/m/song?id=26083399。一看,歌词和翻译提供是木耳也要听歌,就是几个月前漫版群里提到的做了按会社分类的歌单的那位,对 ACG 颇有研究。

想想现在在云音乐上提供的歌词8份,翻译9份(分别还有4/3份现在还在审核中,还有一些待上传。范围……gal 和看过的一些冷番,碰巧听到旋律还行而没有歌词、翻译的就顺手做一份,这样随性的。和那位比高下立判。又是巨大的挫折感,恐怕我永远无法追及……


继前几次的 WebGL 实验,大前天开始整合进来,昨天下午终于能勉强显示一个线框球(示例1)了。但是多个 buffer 还是失败。18日22点成功,发现这次也是漏了投影矩阵,或者设为了单位阵。


在博客园的一篇博文里看到一段话,大意是这样的:

函数式是函数包装数据(引用数据),面向对象是对象包装方法,这是数据和函数结合的两种方式。

于是茅塞顿开,这就是为什么 JavaScript 的函数+原型链能模拟面向对象的编程风格。一直隐隐觉得两个思想指的不是一个方向,但居然能兼容(OOPL 也可以通过引入 lambda 表达式来提供函数式的支持)。或曰,闭包和类在表现上是等价的。

后来突然意识到这个观点给我很深的影响,但是出处找不到了……


http://www.cnblogs.com/suimeng/p/4886561.html Source 里很多这种例子。


WebGL(遵循 OpenGL ES 2.0)不支持 Framebuffer 抗锯齿(anti-aliased Render-To-Texture),只好自己来了。抗锯齿本来想用这个的,不过这是 Unity 下的啊……

暂时用了 FXAA,效果不是很理想,可能还要改。具体技术,下次正式的记录里再说吧。

分享到 评论

TD线上的“缓冲区溢出攻击”

(本文写作时间跨度为12、13日)

对TD线本学期新政策的批评,附照片。照片未压缩,谨慎浏览。

查看更多

分享到 评论

WebGL 测试4 - Framebuffer 和滤镜

示例可以在这里查看。此次的示例挺有意思的(个人觉得),推荐看看。效果的图片预览请展开。

我似乎有几篇博文都说“预览请展开”的,那是因为不想浪费大家流量,如果有图片,或者文章过长的话就把一两句描述放前面,感兴趣的同学可以花一点流量阅读细节。

题外话:

前天晚上和村长对话了。村长得知我要考研之后很惊讶:“你居然去考研?堕落了!”然后推荐我去申国外。其他保守看应该没问题,不过先把外语水平考试(I/T)考了,才能投申请啊(所以不趁有时间考 I/T 的我是不是很愚蠢)。

所以之后会很忙(其实已经比正常的准备时间都推后了),不管是哪条线都会很忙。所以尽快将 Bulletproof 写到能运行示例的程度就暂时放在一边,火力全开为生存而斗争吧。jabanny 的邮件还没回复,和 tt 在 xross 上的试验讨论也暂缓(suspended)了。先说声对不起了。


这次我们来反向的是 Pixi 的滤镜,采用帧缓冲(Framebuffer)作为绘制缓冲区。想当初 Bulletproof 底层换到 Pixi 上就是因为有一个高速滤镜的硬需求。

此次的着色器和 JavaScript 代码都是几乎推倒重来的,因为要考虑迁移到 TypeScript 上时的 OO 特性。

(文中的代码和示例的代码可能有少许不同,以示例为准,因为是之后又经过调试的。)

通过的测试环境:Windows 10, Chrome 45 / Firefox 41 / IE 11 / Edge。

未通过的测试环境(由尝鲜的杨同学提供):OSX El Capitan, Chrome 47-dev / Safari 9。

查看更多

分享到 评论

WebGL 测试3 - 移动元素

示例可以在这里查看。 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄


这次的试验项目是图形的变换,简单平移一下,按上下左右就可以玩了。

查看更多

分享到 评论

WebGL 测试2 - 简单的有粗细的线条

示例可以在这里查看。


续上,这次我们添加一个小小的改进,给线条指定宽度。

查看更多

分享到 评论

WebGL 测试1 - 绘制纯色边三角形

示例可以到这里查看。


Pixi 的数据结构不符合 Bulletproof 的使用要求,要调整的话还要考虑与原架构的兼容性(提供了一个抽象的 Graphics),想想其实也没用到多少其功能,我们有自己的体系,就补充上 WebGL 的一块好了。

对 WebGL 不熟(以前就没写过底层一点的 OpenGL 程序),所以对绘制的基本过程也有点困难。因此就阅读了《WebGL 编程指南》,了解原理。

查看更多

分享到 评论

网上看到的

搜索“cube”,本来是找 CUBE 的官网,然而还发现了 Cube Engine。下面的链接指向了其创作者 Wouter van Oortmerssen 的网站。可以看到这位 Oortmerssen 兄涉猎广泛而且颇有经验。

查看更多

分享到 评论

穿透幻影的太阳 OST

咳咳

查看更多

分享到 评论

「こいはる」の鸡肋

刷过了恋春アドレセンス,真是大鸡肋。

多图杀猫,剧透注意。

查看更多

分享到 评论

Bulletproof 20151001 - 继续前行

多次尝试,xross 异常的原因很可能是存在两条斜率很接近而又相交的线时 JavaScript 的 number 运算精度不够导致无法分辨,或者是散列函数区分度太小。散列上,我原来用的是 x * 2147483647 + y 的形式,足以区分了吧;后来直接用 toString() 之后求字符串散列值(BKDR hash),这样理论上 JavaScript 的数字精度有多高散列就能做到多好。但是还是失败了……

感觉被朴素的二重循环方法狠狠地嘲笑了一把。


开始嵌入 libtess。在其示例页面嵌入的脚本中有这么一段:

1
2
3
4
var startTime = window.nowish();
polyTriangles = triangulate(contours);
initArrayBuffer(polyTriangles);
var endTime = window.nowish();

很好奇 window.nowish() 是个什么东西,于是我用 Chrome 尝试了一下:

1
2
> window.nowish
function () { [native code] }

说明这是原生的代码而不是自定义的 JavaScript 函数。然而这个 API 并没有公开,谷歌了一下,即使限定了搜索词(javascript window "nowish")都找不到。相比之下,Window.performance 要更为人所知一些。


还找到了一个对 Java 的 HashSet 进行散列攻击的例子:http://keary.cn/?p=845。

分享到 评论

xross 进度

整个程序检查了一遍,修正了几个符号和顺序错误(眼花了)。现在能走原来附带的两个示例(test_1() 和 test_2())了。但是 testRandom() 总是报空指针错误(FutureEvent.compareTo(),ipThis 经常为 null)。继续查找原因。

有一个坑是 EventQueue.poll() 使用的是 LinkedHashSet,这是一个有序的集合。开始的时候一切集合都用 XSet(用于自定义类型)和 PSet(用于基元类型)代替,测试1不通过,测试2报错。后来想起似乎见过原实现用了一些名字看上去和链表有关的集合类,搜索了一下,特性是遍历顺序和插入顺序相同。于是写了 LXSet 和 LPSet,这回对了。

调试的时候,debug 状态下的随机测试的朴素方法用时大约是 1400 ms,release 状态下大约是 70 ms。在代码中没有调用 console.*() 的情况下,这个差距略大……估计是预编译了吧。


VS Code 的两个小问题:

  1. 代码格式化(format code)之后,插入光标位置不变。我喜欢在编辑函数参数的时候格式化代码,特别是函数声明很长的时候。原本光标是位于某个参数标识符之后的,由于前面会添加或删除空格,格式化之后光标就不一定在原来语法上的位置上了。此时直接继续输入就不正确了,可能就跑到了某个参数的内部去了。
  2. 屏幕输出变化时,无法调试 Node(?)。课设的文档我是拿 Code 写的,同时还在编辑 xross 的代码。上去展示连接到投影仪,再撤回来,发现无法调试 Node 了,现象为无法启动任何脚本,调试工具栏闪现后闪退。直接执行 Node 表现正常,WebStorm 表现正常。

九月的日志总数达到了30篇,可能以后是无法超越的了。如果不是开学前开始的 Bulletproof 起了个头,就不会有这么多的日志了……

查看更多

分享到 评论

弹幕形式为什么会存在下去

无关的话放前面。

在编辑器上,Atom 确实比 MarkdownPlus 要好用。所以现在写博客,我改用 Atom 了。从 Notepad++ 到 MarkdownEdit 到 MarkdownPlus 再到 Atom,改用顺手的就好。(考虑到启动和编辑效率问题,一般编辑工作是用 Notepad++ 做。)

下面开始正文。

今天我要说的是,“弹幕”这种形式为什么会存在下去。这里的“弹幕”,并不是特指现在流行的弹幕评论方式,而是一种作品媒介和评论行为组成的有机整体。

查看更多

分享到 评论

Java 你……

xross 输入测试样例的时候抛出了异常,定位到似乎在红黑树的实现内部。在 Java 实现内插一些输出,在 TypeScript 实现内插一些输出,二者输出不一样。从第一个点的处理就出现问题了,二者生成并添加的新点不同。handleEvent() 里有什么呢?checkIntersections(),无非是求交、更新红黑树。求交的部分检查了一下,红黑树的部分犯错误的机会更大吧。

JDK 1.8 的 TreeMap 实现(java/util/TreeMap.java),第 2216 行、第 2235 行(其实还有更多):

1
2
3
4
/** From CLR */
private void rotateLeft(Entry<K,V> p) {
// ...
}
1
2
3
4
/** From CLR */
private void rotateRight(Entry<K,V> p) {
// ...
}

看到这个真是乐了。想想 C# 和 Java 在 Hashtable 类上的名称“借鉴”的事,上文的几个“CLR”注释是不是又添了一些料呢?

分享到 评论

Bulletproof 20150926 - Bentley-Ottmann

根据阿卡林/tt君的建议,移植了一下 Bentley-Ottmann 算法实现到 TypeScript 上了,准备去做性能分析。原来的是 Java 实现。

初版本发布在 https://github.com/Hozuki/xross。未测试。

关于坑、配置问题,请展开。

查看更多

分享到 评论

路径

以前看 Windows API,GDI 部分的时候就不知道,GDI Region 这一块是怎么实现的。

1
2
3
4
5
6
hRegion1 = CreatePolygonRgn(&points[0], nPoints, ALTERNATE);
hRegion2 = CreateRectRgn(0, 0, 100, 100);
CombineRgn(hDestRgn, hRgn1, hRgn2, RGN_OR);
FillRgn(hDC, hDestRgn, hBrush);
DeleteObject(hRegion1);
DeleteObject(hRegion2);

学了 CAD 后我知道,这是区域布尔操作。但是就是不知道如何在计算机中存储和表示这样的操作源和结果。区域里到底存着什么呢?点集?几何描述?二者各有缺陷。

到今天都不明白。所以现在碰到 Bulletproof 使用的 Pixi 的混乱填充结果就得开始恶补了。


此问题中的一些有意思的资源请展开。

查看更多

分享到 评论

“热爱编程”是个什么鬼?

博客园新闻区的一篇文章。

我也私下和朋友说过几次,现在我的状态是“面太广,反而找不到着力点”。这个学期杨同学去找工作了,进行了几家公司的笔试。杨研究网页技术和 Docker 有一段时间了,找工作虽然未必说会进入公司立刻就到上好岗位,但是“有专攻”可以帮他活下去,而且他能力不错。我说,我估计就不行了,一个简单的问题“你会干什么”我就答不上来了,因为如果你随便找一个方向,我都是做不了什么的。申请前端?申请运维?申请某技术攻关?想得美,你只能去帮人家端茶倒水写文档(会议文件etc),要不你还是应着本科的专业去某个机械国企做活儿吧——不对,你手上技术没有工人师傅强,设计核算又不是顶尖,只好把你扔到某个未曾听闻的软件研发中心的小角落里去了。

所以我做了些什么?没做什么,纯粹是“热爱编程”了。近期,Source、SDL、MonoGame、编译器、逆向,做过。很久很久以前,还做过安装软件、玩过 OI、做过代码编辑器,还有更早的时候用着 Win32 API 就觉得很高级了。哪一样出了东西呢?没有。

静下来想想我到底要做什么呢?

我觉得,自从入了动漫坑之后,所做的一切都是为了一个能让我表达自己的东西。最初想做一个视觉小说引擎这样“能讲故事的平台”,而后看到了 KiriKiri 及其优秀的脚本语言 TJS,和业界背后更大的宇宙。我希望通过能让我沉浸的方式,将我的故事说出来。(想象力随着年龄的增大而逐渐退化了吧;我要求自己要在任何时候保持理智状态。)更好的结果是,更多人有机会讲故事,而且是用更有感染力的方式呈现出来。为了达到此目的,我认为我要从底层开始学起,所以在绕了一大圈(看看我的工程文件夹,里面充满了早起废掉的做了一点点的编辑器和分析器)之后要从一个具备垃圾回收的语言(方便开发,如果有人希望的话)的代码是如何编译运行的开始学习。虽然乍一看 GC 和 gal game 相差甚远,但是这是计划的基础。可怕的是,如果在这条路上哪怕一个地方踏得过深了,就出不来了。

然后又开始关注画面,图像的信息。动画的一个特点就是大量运用图像和它们的连接关系(当然还有声音),这和其他基于文字(有可能伴随声音)影响人的方式是不同的。恕我绘画天赋也不太好(一直卡在阴影这里,只能用线条),有些菊苣们大叫“呀这个分镜作画很好/很差”的画面我实在看不出什么,而主要关注画面元素的移动和配合。于是又想为了创作更具有形神的画面的工作创造条件(所以有三维二维的尝试号召)。

表达的其中一个方式是语言。因此我还学/想学语言学和符号学,想研究人类表达的基础——在此之上去尝试找找人类的表达到现在是怎么形成和演变的,极限在哪里,或者是怎么能做到更好。

总结起来,目标是 way of expression of art。做不到先进厂家(Disney 啊 PIXAR 啊这些专门做三维技术突破的)的水平,也许这条路并不容易在社会上找到置身之地(如果资源紧缺,人类最终会放弃艺术,而选择物质以存活;对于企业而言也如此),但是这是我心里的方向,这条路能走多远就走多远吧。

分享到 评论