由一个自增引发的问题

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

程序非常简单:

#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。在其示例页面嵌入的脚本中有这么一段:

var startTime = window.nowish();
polyTriangles = triangulate(contours);
initArrayBuffer(polyTriangles);
var endTime = window.nowish();

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

> 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报错。后来想起似乎见过原实现用了一些名字看上去和链表有关的集合类,搜索了一下,特性是遍历顺序和插入顺序相同。于是写了 LXSetLPSet,这回对了。

调试的时候,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 行(其实还有更多):

/** From CLR */
private void rotateLeft(Entry<K,V> p) {
    // ...
}
/** 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 这一块是怎么实现的。

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 啊这些专门做三维技术突破的)的水平,也许这条路并不容易在社会上找到置身之地(如果资源紧缺,人类最终会放弃艺术,而选择物质以存活;对于企业而言也如此),但是这是我心里的方向,这条路能走多远就走多远吧。

分享到 评论

「こいかの」の逗X

多图杀猫

查看更多

分享到 评论

M

完了,四个都成了黑历史。找出了明显的翻译错误……我说怎么读都读不通……


09-19

学校网络最近总是时好时坏,坏的时候只能顺畅打开百度首页和博客园,其他的126啊Bangumi啊B站啊GH啊全都连接超时。


Python 对新手很不友好,这是它留给我的第一印象,虽然很多人说入门语言应该选 Python。隐式的类型推断(但是执行时是强类型)让智能感知很费劲。

我选用的 IDE 是 PyCharm。想从一个简单的示例入手:

import urllib2
url = "http://www.baidu.com/"
response = urllib2.urlopen(url)

到此为止,都是能从名称中看出来的。但是当我尝试使用 reponse 的时候,敲下“.”却没有任何提示——我根本就不知道它返回的类型是什么。是字符串吗?应该不是,至少要有一个网络错误时的 fallback 吧。如果是一个类,公开了哪些方法呢?看不出。

后来我从网上看到 urllib2 的使用,后面是

print response.read()

突然就冒出一个 read() 方法。由此又得想,如果我只需要读取一部分数据呢?如果网络状况不佳导致超时呢?Python 肯定提供了相关的机制,可是根本就看不到。

去看 Python 的 urllib2 文档,关于 urlopen() 方法是这样描述的:

This function returns a file-like object with three additional methods:

  • geturl() — return the URL of the resource retrieved, commonly used to determine if a redirect was followed
  • info() — return the meta-information of the page, such as headers, in the form of an mimetools.Message instance (see Quick Reference to HTTP Headers)
  • getcode() — return the HTTP status code of the response.

这才知道,原来返回的是一个和普通文件类似的 object。那么文件对象有什么成员呢?

f = open("")

然后查看 f 的成员,才能看到文件对象的成员。很不幸,如果我要使用的话,必须要记住每个常用类型的成员,如果是函数还加上签名,要不由 urlopen() 返回的东西在 PyCharm 眼中就是白板,根本就不知道怎么用。也就是说,如果我现在要去写 Python,要不智能感知就得做好一点,要不就得抱着整个文档去查。

VS + IronPython 还没有尝试,不过估计会好一些。

VB 和 VB .NET 有着强大的延迟绑定(late binding)能力,后来 C# 4.0 中引入了 dynamic。这功能我总觉得是烫手山芋,因为如果没有目标的文档根本就难以开发和维护。例如:

Dim o As Object
' VB 语法
Set o = CreateObject("Excel.Application")
' VB .NET 语法
o = CreateObject("Excel.Application")

接下来知道怎么干些什么吗?不知道,因为此时 o 的类型还是普通的 Object,不带具体的成员信息。相比之下,如果引用了类库,强类型化后再操作就好多了:

' VB 在工程中添加对 Excel 的类型库引用即可
' VB .NET 在工程中添加对 Excel 的互操作程序集引用之后,在使用其的文件内写上这一行
Imports Microsoft.Office.Interop.Excel

' 使用上是相同的
Dim o As New Excel.Application()
o.Quit()

剩下就好办了。因为类型是契约(contract)的一种(我指的不只是接口意义上的契约),有了明确引导后沟通就方便多了。例如,PHP(PhpStorm 下)和 JavaScript(WebStorm 下)都可以在注释中指定类型来影响智能感知的行为:

/**
 * @var string $host
 * @var string $username
 * @var string $password
 * @var string $database
 * @var int $port
 * @var mysqli $mysqli
 */
$mysqli = new mysqli($host, $username, $password, $database, $port);
echo $mysqli->connect_error;

当你输入“$mysqli->”的时候,就会弹出合适的自动完成列表。这样很适合在类型不熟悉的时候帮助探索。

分享到 评论