AFAIK

Valar Morghulis

今天逛知乎的时候看到了一份计算 \(\pi\)代码。我试图跑了一下,发现其输出的 2400 位居然全部是对的。我试图学习了一下其中的姿势,感觉还是很神奇的。

int a=10000,b,c=8400,d,e,f[8401],g;main(){
for(;b-c;)f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);}

然后我就试图分析这段代码到底是在干啥。

Read more »

大家好我是来除草的。

由于 Hexo 更新了导致 blog 莫名奇妙跪了,于是我就很久没有更新了。(其实就是懒了不想更新了。)

于是趁着这个五一假期顺手把 hexo 修复了一下。所谓的修复,就是推倒重来……于是干脆物色了一个新的主题。当前这个主题看起来还不错,NexT.Mist。 看起来非常干净,很适合我这种……只想吐槽不想写公式的人。

在修复的时候遇到的一个奇葩错误,hexo server 老是启动不来,我也不知道为什么。 根据不停的二分哪个文件的哪一行的哪几个字符,终于让我找到了:{ # 这两个字符似乎不能同时出现……

于是 hexo server 终于能跑起来了,但是 Disqus 莫名其妙跪了我也不知道为什么,我几乎什么都没改…… 修了一下失败了,我还是不知道为什么……于是弃疗了。 找到是什么问题了……disqus_url 这是个啥参数呀,我注释掉就好了 = =

寒假的时候写了个小网站,本来想着一个月妥妥的写完,后来发现自己还是 naive。 寒假写了一个月没写完,回到学校后继续写又写了一个月,勉强能用了,但是还是有一堆 bug 要修。 用的技术大概就是 Koa 作为后端,MongoDB 数据库,AngularJS 前端。界面用的是 SemanticUI, 感觉写起来挺爽的,就是查 API 真蛋疼。

然后在这个学期刚开学的时候,由于 Arch 一堆问题要修,于是我就修 qi 复 liao 了一发,直接装了 Ubuntu,所谓的新学期新技术嘛…… Firefox 也换成了 Chrome,装了几个小插件,用起来也感觉还行。 印象最深刻的是一个加空格的小插件,简直好用的无与伦比。 密码管理也换成了 LastPass 。以前写的那个无聊的 HMAC 虽然还在用,但只是用来做兼容的了。

最近出了啥 Visual Studio Code 我也来玩玩。说起来这是要变成码农了吗……我可是青年理论计算机科学家 →_→

说起来上个学期刚开学的时候陪同学去买笔记本,然后我也顺手买了一台……Thinkpad New X1C,轻倒是挺轻的,到处带着基本没问题。 续航的话刚买回来 6h,现在大概 5h 。重装一次系统应该又可以回来。 上个学期天天出去自习,还去罗姆楼刷了几次夜,所以电池充放次数几乎是一天一次。 这个学期又赖在寝室出不去了……然后我也懒得装 Linux 了,用的 Windows 8 也还算凑合。Listary 实在是太好用。

计算机科协的那个啥 vpn9 实在是良心。妈妈再也不用担心我的流量了……但是不知道为什么经常掉线…… 我现在的用法是 Win8 上装了一个 OpenVPN ,树莓派上也装了 OpenVPN 。 然后树莓派上跑一个 cow ,iPad、iPhone、老笔记本全部用 cow 做代理,这样默认就是走 vpn 了……

上学期期末的时候在玩 Portal ,回家后我老弟要玩,那就给他玩呗……结果……结果…… 结果上来就直接联机对战,找到了一个好老师,我当时就被他吓得目瞪口呆。 寒假的时候老弟有时候吃夜宵,于是我也顺带着吃夜宵,老弟给我煮面、煮馄饨、炒蛋炒饭,真是太幸福…… 然后现在在玩炉石……技术实在是菜的不忍直视都快弃疗了。

寒假的时候到外面讲了几天课,然后回学校讲课,现在讲课也讲不动了,出题都出不动了。心好累……反正现在有一些存款,就不急着去圈钱了…… 三月底的时候去师大附中讲了两天课,这应该是最后一次讲课了。然后这几天在给一个大学出 ACM 模拟题,也应该是我最后一次出题了。 以后应该就见不到我在这方面活动了。这一代终究要退去。 CTSC 懒得去出了,其实也没有好的 idea ,于是放弃了。明天 CTSC day1,祝 cyb 小朋友好运吧。

现在就安心的和 papa 一起搞搞 TCS,继续上个学期的课题。但是现在似乎到了瓶颈期,我的所有 idea 看起来都用光了…… 原来想和 clj 一起上 ATCS 的,发现和博弈论冲了我就没上了。看 clj 现在的样子我发现自己真是 naive,不知道何时才能追上去。Anyway……

最近一段发生了一些情感上的事,然后发现我自己真是一个玻璃心的妹子。想太多,猜太多,遇到啥事都要紧张半天。 心情经常 biu 的一下就糟糕的无以复加。Anyway,我并不认为这样太糟糕,我也不打算改,就这样吧。

这学期的数值分析准备和老师套磁一发,用课程报告翘期末。 我写的主题是 Toeplitz 矩阵,其实现在主要在写 Circulant 矩阵的一些性质,把高中学的 FFT 又可以写上去,简直爽。 老师给的模板是 Word,然后我就去和老师套磁改成了 TeX,但是 TeX 模板仍然蛋疼……算了我就用 ctex 默认模板好了。

我现在急需一发鸡血……罗老师不行了,罗老师要倒了……

好吧我就是无聊了……

这玩意是为了解决这么一个问题的:我的 QQ 跑在虚拟机里面,因此里面有消息了我在外面并不知情。消息推送有几个可能的解决方案:

  1. WineQQ。我对稳定性产生怀疑。
  2. QQ for iPhone。其推送并没有那么及时。
  3. 戴上耳机就可以听到 QQ 的声音了。但是我的歌都放在 iPhone 里面且耳机只能用在 iPhone 上。
  4. 换成 Windows/Mac 系统。我没那么土豪。

于是就想能不能写一个小程序使得虚拟机里面有消息了就在外部的 KDE 里面出个提示之类的。

琢磨了以下,QQ 自带的提示似乎只能播放声音。于是第一想法是监听声卡播放。搜了搜没找到相关资料(其实是自己懒,觉得如果这样的话有得进行 WinAPI 编程。感觉监听声卡这还是比较底层的,感觉不好搞。),于是就放弃了。

第二想法是播放声音的时候肯定得访问声音文件,我记得 png 还是 jpeg 可以嵌入一个奇怪的东西,不知道 WAV 是否可以。搜了搜还是没找到类似东西。放弃。

第三个想法是监视屏幕,我打开一个 QQ 窗口,如果有消息过来了,其图标会有相应的变化。在我使用的这个版本里面,窗口合并后如果一个人有新消息,其名字后会出现一个橙色小圆圈,里面一个数字表示其消息数目。如果我定时扫描这个位置,获取此时此像素的颜色,就可以知道有没有消息了。后来想到,如果我把 QQ 不设置为当前窗口,那么当有新消息过来的时候 QQ 在任务栏里的图标会变成那种一闪一闪的黄色。于是我监视的点的位置基本上是不变的,只要我保证 QQ 在任务栏中的位置不变就好了。

于是就用了 AutoHotKey 这个小工具,代码大概就长这样:

#Persistent
#SingleInstance
SetTimer, CheckQQNotification, 1000
return

CheckQQNotification:
CoordMode, Pixel, Screen
PixelGetColor, col, 187, 775
; 颜色就是 %col%
return

现在我们知道颜色了。实践发现,图标的颜色不是两种颜色,新消息过来后,由于会闪所以可能会有其余的颜色。于是就直接用 RGB 三元组的 Manhatton 距离来判断处于什么状态了。

现在考虑如何将颜色这个信息传到 Linux 里面去了。第一想法是造一个小型 http 服务器。看起来没那么复杂,就开始写了。

框架用的 Node.js 的 Express 框架,而且我只需要得到一个信息,直接 POST 过去就好了。那么考虑在 AutoHotKey 中如何发送一个 POST 请求。据说 AHK 有一个包可以做这种事,但是我试了试发现不 work ,果断下了一个 curl for Win 然后直接 POST 过去。我很想吐槽 AHK 带参数运行一个程序,照着别人的程序写都发现不 work 。这里有个一个小细节,AHK 运行这种 Console 程序会闪出一个黑框,很影响用户体验。解决方法是找了一个叫做 Hidden Start 的程序, hstart /NOCONSOLE curl 就好了。Win 这边差不多布置好了。

在 Linux 这边,弹窗的话我用的是 notify-send 还附赠一堆小图标。由于请求是 1s 一个的过来的,不能对于每个 Active 的请求我都弹一个窗,于是就设置:如果上一次表示 QQ Active 的请求是在 5s 以前,那么就弹窗,否则不弹。另外如果我现在就在虚拟机里面操作也可以不弹窗。如何判断在是否在虚拟机里面?第一想法是在 Win 里面获取鼠标位置,发现不 work 。第二想法是在 Linux 里面获取活跃窗口,用的 xdotool getactivewindow getwindowname 搞的。为了好看还加了当前时间,moment.js

(我是不是又造了一个轮子?)

最近买了一个 Raspberry Pi ,原意是想鼓捣成一个支持 IPv6 的路由器。趁着放假先来玩一下。

Read more »

据说最近的墙越来越厉害了。

上次打 GCJ 的时候遇到了文件下不下来传不上去的情况,不能更囧。后来的几天内学习各种走出国门的知识,现在感觉已经差不多了。

hosts 大法

这个是我用的最久的方案之一了吧。其优点是迅速快捷方便,缺点同样非常明显,只对特定的网站有效,且封锁起来特别容易。

我用的是 Smarthosts,在前一段时间的封锁中不幸牺牲,经常出现 too much request 的情况。

卒。

去阿根廷

这个是最广为人知的方案(没有之一?)

优点是通用,流量虽有限制但是约等于没有。便捷,一个文件夹带着走天下,还可以给别人用。

缺点,部分人对速度要求较高。最近抽风率较高。

如果你愿意一层一层一层的拨开我的心

……我先去学学解剖学

试了一下,速度慢出翔。

原理似乎是基于一层一层的节点转发,因此需要许多志愿者做中间节点。

优点不明。

VPN

免费的著名的有 vpngate.net 。

这是一个很奇怪的论证,你要上 vpngate.net 的话需要翻墙,但是你要翻墙需要 vpngate.net 上面的东西。

当然你要土豪可以自己买个。但是据说靠谱的不好找。

缺点是上国内网速度也不怎么样。当然用个什么 chnroutes 之类的来分流。不过这么高级的我就没用过了。

VPS

目前用的就是这个方案了。

直接蹭了 drd 的 VPS 。DigitalOcean 还算可以吧,最低端的都可以供一堆人一起用了。1T/month 肯定用不完。

具体方案是 shadowsocks 。蛋疼的是 shadowsocks 有好几种不同的实现,我不知道这些实现的区别。后来统一用的是 shadowsocks-libev ,全部是自己手动编译,反正不大,编译起来挺快的。听说 Singapore 的服务器有 ipv6 了,试图折腾了一下,失败。

后来考虑直接通过 tunnel 来搞。我用的是 HE IPv6 ,挺赞的。网上有一些教程。我在这里折腾了好久,原因是因为某些 shadowsocks 对 ipv6 的支持不好(或者是我姿势不对?)

这个月流量只剩下 300M 了,剩下的日子只能靠 IPv6 来打发了。

吐槽一下,看 jzp 买了一个极路由,于是我也查了查相关资料。查了半天没查到开发者资料,这是准备自己一个人写插件的节奏么……反观小米路由,虽然还没见到影子(还不一定抢的到是吧),但是人家的开发者教程已经出来了。如果极路由出了开发者教程的话我还可以考虑买一个,如果不出的话就我还是慢慢等小米路由好了。

不知道从什么时候从 Jekyll 转移到了 Hexo 。我觉得 Javascript 这门语言挺漂亮的,除了其奇怪的变量作用域。起码 Hexo 渲染比 Jekyll 快了一个数量级吧(喂这样比较真的合适吗!)。

转移过去的时候其实出了点问题。大致表现就是首页的 description 里面全是汉字的 unicode 码,然后 & 又被转义掉了,导致汉字一个都显示不出来。我试图在 ejs 里面找问题,似乎是某个地方多转义了一次(<%= %><%- %> 的区别)。修了很久没修好,最后 sudo npm install hexo -g 好了。

另外前一段时间的 Arch Linux 有 3 个 bug 我修不好(其实是不想修了):

  1. 输入法的快捷键。每次启动时我都要将快捷键重新绑定一次。
  2. 休眠后的 VirtualBox 不能启动 Win7 。
  3. 休眠启动后连不上 Wi-Fi 。

前两个还可以忍,最后一个简直不能忍。于是一怒之下换了 openSUSE (jzp 眼中的“长者 OS”)。不小心丢了 .emacs.d 呵呵呵呵呵幸亏有早期备份。现在的用户体验还算 OK ,毕竟新学期新系统,新系统新气象。fanhq 表示很喜欢里面的 YaST ,希望 Ubuntu 也搞一个,感觉有点不靠谱。不习惯的一点是 Ctrl-Backspace 的 delete-word ,这个 word 的判定似乎太严格了, tabopen google.com 我习惯 delete com 而不是 google.com

为了禁水,将人人客户端从移动设备上卸载了。于是少了一堆水的时间。同时带来的就是我越来越困了,按照 jzp 的介绍:“我的室友 lyp 已经连续几天十一点起床了。”臣妾睡不够啊……

发现让自己从悲伤中缓过来的最好的方法就是让自己忙起来 —— 不过,这算不算的上一种逃避?思考人生哲学问题什么的,一个人凌晨在外面散散心也是不错的——如果有人陪那就更加美妙了。当你想起大物、微积分、电原、线代等等科目都要考试,史纲论文还没写的时候真就没时间忧伤了。

有人说这东西发出来就是 public knowledge —— 反正你也不会看是吧。有些私人信息可以不说但是雷区范围让我难以接受 —— 其实我还不知道具体雷区。而我觉得自己去扫雷挺累的……所以就不管了,安全第一。(其实雷区不可怕,雷区比一般人都大这才可怕吧。)……(安全真的第一吗?)

三点了,去睡了。

为了庆祝 @hym 妹子过生日,他特意写了个游戏让大家玩,请戳 这里

作为他无聊的室友,我们就有了各种刷分的乐趣。还未 release 的时候是可以各种刷分的,因为当时 \(10^9\) 这种数的权值非常大。release 之后不那么好刷了,起码手刷不好刷了。我手刷最多只刷了 12w ,就是一轮中凑了两个 99999999 。

于是今天花了一天时间写了个自动刷分机,刷个 30w 基本没问题……

代码主要用 Livescript 写出来的,其实就是一个 GreaseMonkey 脚本 。

使用方法:

  1. Firefox:对不起 hym 不支持 Firefox;
  2. Chrome: 请先安装 TamperMonkey, 然后安装该脚本;
  3. 其余: 自行解决。

我写的主要就是随机一条路径,交给 NAN.Analyzer.analyze 去求值,每次选权值最大的那个……所以基本上没有什么代码。我随机选择了 3k 条路径,各位同学可以根据自己的机器进行相应的配置。

Javascript 代码在 这里 ,Livescript 源文件在 这里

2048 已经打入敌人内部了是吗……

Problem

给定一种奇怪规则的 2048 ,问可能凑出来的最大的数是多少。

规则比普通的 2048 多了一条:如果这次合并后还可以继续合并,那么就不会出现新的方块。

注意每次可以出现 2 或 4 。

Solution

其实 yy 一下就可以猜出答案是 \(2^{17}\)

怎么解释呢……一开始我的想法是在一个局面中出现两个相同的数是不优的,可是怎么证明是不优的呢。我觉得这显然,但是 Michael 说要给理由,于是我就没继续想下去了。

后来脑洞大开,yy 了另外一个思路。就是考虑整个局面中所有元素的和。每次这个和要么增加 2 要么增加 4 。注意到这个和的二进制表示中 1 的个数的意义,1 的个数表示这个局面中最少要多少个方块。如果要产生一个 \(2^{18}\) ,那么一定存在一个时刻使得整个和要么为 \(2^{18} - 2\) 要么为 \(2^{18} - 4\) 。注意到显然不能为 \(2^{18} - 2\) ,因为 \(2^{18} - 2\) 有 17 个 1,而 \(2^{18} - 4\) 里面有 16 个 1,已经把棋盘塞满了,游戏已结束,也是不可能的。所以 \(2^{18}\) 是不可能出来的。

这样的话就只要考虑 \(2^{17}\) 了。显然这是可能的,很容易构造的吧……

周末还有微积分考试,我现在是不是在作死……

cellBlockA

这一关很简单,就是走过去拿走 Computer ,再走到出口就好了。

theLongWayOut

也很简单。

分别在上面黑线和下面黑线处填入 /**/ 就好了。

validationEngaged

这一关限制了 # 的数目必须为多少,所以不能删掉代码……

改一下位置不就好了。

multiplicity

文件名已经告诉你一切了……

再放一个出口。

minesweeper

背景是红色的这是红果果的提示吧。

照模子画瓢把所有的 mine 标成另一种颜色好了。

drones101

那个 drone 很讨人嫌……

造几个 # 把他挡住不就好了。

colors

重点是要利用 phone 的 Callback 。(也只能利用这个吧)

在里面循环换颜色:红 -> 绿 -> 黄。用 phone 切换颜色。

intoTheWoods

注意 generateForest 这个函数是会清除已有障碍的。

所以你所需要的就是把 phone 的 Callback 设为 generateForest 然后使劲往出口走。走不动了就重新生成。

fordingTheRiver

在 phone 的 Callback 里面把 raftDirection 改掉。

ambush

把 Drone 的移动策略改掉:能向上就向上,否则向右。

robot

写一个简单的 AI 。

先向下,再向右,再向下。

robotNav

你可以用 robot 这一关的技巧继续加强,也可以用下一关的技巧。

robotMaze

迷宫会变,这使得这一关特别蛋疼,不能用 robot 的技巧了。

写个最短路什么的自然可以。

所以你在 behavior 里面写:如果 player 的位置在哪里就往哪边动。

相当于你通过操作 player 远程操作 robot

crispsContest

把使用 greenkeyremoveItem 后面的东西改成 empty 就好了哈哈哈。

然后你就可以不用 greenkey 了。依次进入左上、右上两个角最后再去取 Algorithm 就好了。

exceptionalCrossing

这关实在不会就看了教程。

这要利用 javascript 的异常处理机制。你在里面直接调用一个不存在的函数就不会进入 killedBy 这个过程。

@cxq 的方法就是主动把括号闭合掉,然后加一句 type: "item" 然后你就可以自由自在踏上去了。

lasers

laser 的颜色改掉然后继续用 phone 来切换颜色……

pointers

这一关过了纯属巧合。

我把所有的安全的 transporter 标了出来。手动 bfs 几次就过了。

后来又试了好几次,发现成功率不高……

superDrEvalBros

主动把 jump 闭合掉。

既然你用 timer 了那我也可以用是吧……

你的 gravity 是 45ms 一次,那我的 jump 就搞成 30ms 一次好了。

documentObjectMadness

你看代码中的 overrideKey 就知道了。

目标就是和红色的 @ 重合。

bossFight

这一关是我代码量最大的一关。

一开始的想法是——以子之矛攻子之盾。我也 define 一个奇怪的 boss ,发出横着的子弹来打那些 boss 。

但是由于 validateLevel 检测了 dynamic 物体的数目,所以我又添加了一种新的物体,动态的,通过 onCollision 去触发。触发后就放置两个我造的 boss 。

endOfTheLine

说起来也是看攻略过的……

其实重点已经差不多知道了啊……

我想在 placeObject 或者 placePlayer 的时候把 map.finalLevel 清空,但不知道为什么失败了。

结局就是把代码中判断 finalLevel 的地方改掉, /scripts/objects.js ,L28。

结局

似乎就是浪费了一个晚上。

0%