iovxw

Crystal 中自定义数据结构的 json 编解码

没文档

图

上图为煎蛋无聊图爬虫里的comment储存结构体,在编码为json时发现需要定义几个东西,如下:

在 Linux 上玩 Space Engineers(太空工程师)

还是靠Wine

参见:https://appdb.winehq.org/objectManager.php?sClass=version&iId=30180&iTestingId=88496

具体流程就是

先安装最新版1.7 Wine和winetricks,步骤什么的就不用我说了,应该都会

如果你直接装的64位wine,需要先设置成32位wine环境

export WINEARCH=win32(可以放在~/.bashrc或者~/.zshrc里自动设置,具体什么文件还得看你用的什么shell)

然后winetricks steam安装Steam

winetricks会把steam装在一个新的WINEPREFIX目录里

为了省事,以后的配置就在这个目录里进行,所以设置一下全局的WINEPREFIX

export WINEPREFIX="~/.local/share/wineprefixes/steam"

设置完成以后安装运行库

winetricks vb6run dotnet40

然后还依赖几个dll,所以从网上下载32位的mscoree.dlloleaut32.dllx3daudio1_7.dll,覆盖到

~/.local/share/wineprefixes/steam/drive_c/windows/system32目录里

启动Steam,会自动更新,有机率更新失败。我是直接放在虚拟机里更新成功的

在Steam设置中关闭游戏中Steam界面,不然会挂掉

然后常规流程安装或者下载游戏就行

运行前记得删除游戏安装目录里的Content/checksum.xml,不然会启动失败

游戏配置在游戏里因为balabala什么的没法改,自己想办法吧

附上成功截图一张:

如果你看见这个说明图挂了,自己脑补去吧


最后是个悲报……我电脑配置太渣玩起来太卡所以白折腾了

在 ubuntu 上编译安装 Crystal

水晶

Crystal 是一个语法像 Ruby,性能堪比C的语言

详细就不介绍了,直接去官网看吧

正文


其实直接参考里面的Vagrantfile就行(Dockerfile太久没更新就无视吧)

curl -s http://dist.crystal-lang.org/apt/setup.sh | bash
apt-get install -y crystal git libgmp3-dev zlib1g-dev libedit-dev libxml2-dev libssl-dev libyaml-dev libreadline-dev
curl -s http://crystal-lang.s3.amazonaws.com/llvm/llvm-3.5.0-1-linux-x86_64.tar.gz | tar xz -C /opt
echo 'export LIBRARY_PATH="/opt/crystal/embedded/lib"' > /etc/profile.d/crystal.sh
echo 'export PATH="$PATH:/opt/llvm-3.5.0-1/bin"' >> /etc/profile.d/crystal.sh
git clone https://github.com/manastech/crystal.git
make

顺便照着写了个Dockerfile

FROM ubuntu:14.04
RUN apt-key adv --keyserver keys.gnupg.net --recv-keys 09617FD37CC06B54 && \
    echo "deb http://dist.crystal-lang.org/apt crystal main" > /etc/apt/sources.list.d/crystal.list && \
    apt-get update && \
    apt-get install -y build-essential crystal curl git libgmp3-dev zlib1g-dev libedit-dev libxml2-dev libssl-dev libyaml-dev libreadline-dev && \
    apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
    curl -s http://crystal-lang.s3.amazonaws.com/llvm/llvm-3.5.0-1-linux-x86_64.tar.gz | tar xz -C /opt
ENV LIBRARY_PATH=/opt/crystal/embedded/lib
ENV PATH=$PATH:/opt/llvm-3.5.0-1/bin
RUN git clone https://github.com/manastech/crystal.git /root/crystal
WORKDIR /root/crystal

也可以直接docker pull bluek404/crystal我build好的

默认只是配置好环境,进去之后make什么都随便


顺带一提里面的轻量级线程还有channel好顺手啊,还带select

def generator(n : T)
  channel = Channel(T).new
  spawn do
    loop do
      sleep n
      channel.send n
    end
  end
  channel
end

ch1 = generator(1)
ch2 = generator(1.5)
ch3 = generator(5)

loop do
  case ch = Channel.select(ch1, ch2, ch3)
  when ch3
    break
  else
    puts ch.receive
  end
end

Go语言函数多返回值转换为切片

并没有什么用

golang里面函数的多返回值就相当于一个展开过的切片

像这个样子:

[]interface{}{返回值1, 返回值2}...

于是我们把它反过来就行了

package main

import (
	"fmt"
	"strconv"
)

func toSlice(v ...interface{}) []interface{} { return v }

func main() {
	fmt.Println(toSlice(strconv.Atoi("1")))
}

The State of Go

"Where we are in May 2015"

大致就是性能优化、GC优化、新增架构支持以及包可以导出给其他地方使用,还有给map加了个语法糖


Show

Rust 1.0 发布

只是发个新闻,没别的了

http://blog.rust-lang.org/2015/05/15/Rust-1.0.html

Linux下Wacom数位板相对定位画笔移动速度的设置

折腾

新买的Wacom CTL680,因为折腾驱动还换了几遍linux内核

具体驱动折腾过程就不说了,旧版内核害死人啊。

好不容易弄好驱动和数位板设置成相对定位模式之后(实在不习惯绝对定位)

发现xsetwacom貌似没有提供设置画笔移动速度的选项?

又是各种查资料

找到了如下设置办法:


首先找到画笔的ID

xsetwacom --list

Wacom Intuos P M Pen stylus             id: 17        type: STYLUS    
Wacom Intuos P M Pen eraser             id: 18        type: ERASER    
Wacom Intuos P M Pad pad                id: 19        type: PAD  

我这里的ID是17

然后xinput watch-props 17

输出:

Device 'Wacom Intuos P M Pen stylus':
        Device Enabled (137):        1
        Coordinate Transformation Matrix (139):        1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
        Device Accel Profile (261):        0
        Device Accel Constant Deceleration (262):        1.000000
        Device Accel Adaptive Deceleration (263):        1.000000
        Device Accel Velocity Scaling (264):        10.000000
        Device Node (257):        "/dev/input/event15"
        Wacom Tablet Area (637):        0, 0, 21600, 13500
        Wacom Rotation (638):        0
        Wacom Pressurecurve (639):        0, 0, 100, 100
        Wacom Serial IDs (611):        803, 1, 0, 0, 0
        Wacom Serial ID binding (612):        0
        Wacom Pressure Threshold (613):        27
        Wacom Sample and Suppress (614):        4, 4
        Wacom Enable Touch (615):        0
        Wacom Hover Click (640):        1
        Wacom Enable Touch Gesture (616):        0
        Wacom Touch Gesture Parameters (617):        0, 0, 250
        Wacom Tool Type (399):        "STYLUS" (395)
        Wacom Button Actions (618):        "Wacom button action 0" (619), "Wacom button action 1" (620), "Wacom button action 2" (621)
        Wacom button action 0 (619):        1572865
        Wacom button action 1 (620):        1572866
        Wacom button action 2 (621):        1572867
        Device Product ID (256):        1386, 803
        Wacom Debug Levels (636):        0, 0

找到我们要设置的Device Accel Constant Deceleration后面括号里的数字

xinput set-prop 17 262 2.5

就搞定啦

后面的值(就是那个2.5)设置的越大笔移动速度就越慢

Nim语言尝试

几乎没人用

从solidot看到,稍微尝试了一下

打开官网后,第一感想是:

诶这个代码高亮的配色不错

然后看了语法什么的,觉得还算顺眼,就把首页的所有链接全部点开了

第一个版本发布的日期是2008-08-22,比go还早一点,但是没什么人用。(果然还是得拼爹啊)

教程方面,只有Tutorials栏里的两个是最新版本的,其他都是旧版

语法层面还没深入研究,就不说了

不过有两个比较有意思的特性,大体介绍一下

首先是各种命名方法可以互相兼容

就是说不管你是喜欢帕斯卡命名法还是驼峰命名法,都一样用

比如标准库里的system.hostOS,你在使用的时候可以写成system.host_os或者system.host_OS再或者system.h_Os_tOS都是可以的。除了首字母以外其他地方都不区分大小写,而下划线只要不是首尾字母,其他地方也是可以随便插入的

然后是foo(bar)可以写成bar.foo() (这个我还没用到,但是好像会很有用?)

至于编辑器支持方面,不要去看官网FAQ里的,那里面也是好久没更新了

可以直接看github上的wiki https://github.com/Araq/Nim/wiki/Editor-Support

最新更新的就是emacs的插件和官方的IDE Aporia

emacs的插件我怎么弄自动补全也没搞定,虽然有提供一个ac-nim.el

Aporia的master分支里的完全不能用!有很多严重问题。比如这个,还有自动补全和定义转跳完全不起作用(以及里面的nimrod还没有更名为nim,虽然官方开了一个分支修改名字吧)。不知道是我配置问题还是怎么着(也根据提示设置nim路径了),开发者有一个答复是nim的idetools本身挂掉了,看了下Aporia的源码照着打了几句nim idetools命令也没什么输出

去翻更新记录找到了https://github.com/nim-lang/nimsuggest这个东西,好像是0.10.3以后会用它代替idetools。于是开始折腾

先是升级nim和Aporia到0.10.3开发版,然后用nimble install nimsuggest来安装nimsuggest。但是出现错误提示~/.nimble/pkgs/compiler-0.10.3/compiler/nimfix/prettybase.nim(10, 7) Error: cannot open 'ast'

重试几遍无果,手动编译了一下compiler,发现没问题啊

浪费掉十几分钟后发现是编译器没有读取cfg?直接把源码扔到compiler文件夹里编译,成功。

我激动的打开Aporia开始尝试语义转跳,刚按下快捷键

……

Error: unhandled exception: 拒绝连接 [OSError]

窗口吡的一下就关掉了!

关!掉!了!

我还没有放弃,手动开启nimsuggest服务

再试

Traceback (most recent call last)
nimsuggest.nim(197)      nimsuggest
nimsuggest.nim(187)      handleCmdLine
nimsuggest.nim(149)      mainCommand
nimsuggest.nim(132)      serve
nimsuggest.nim(106)      action
modules.nim(203)         compileProject
modules.nim(151)         compileModule
passes.nim(197)          processModule
passes.nim(137)          processTopLevelStmt
sem.nim(450)             myProcess
sem.nim(419)             semStmtAndGenerateGenerics
semstmts.nim(1340)       semStmt
semexprs.nim(893)        semExprNoType
semexprs.nim(2196)       semExpr
importer.nim(171)        evalImport
importer.nim(161)        myImportModule
modules.nim(164)         importModule
modules.nim(151)         compileModule
passes.nim(197)          processModule
passes.nim(137)          processTopLevelStmt
sem.nim(450)             myProcess
sem.nim(419)             semStmtAndGenerateGenerics
semstmts.nim(1340)       semStmt
semexprs.nim(893)        semExprNoType
semexprs.nim(2196)       semExpr
importer.nim(171)        evalImport
importer.nim(161)        myImportModule
modules.nim(164)         importModule
modules.nim(151)         compileModule
passes.nim(197)          processModule
passes.nim(137)          processTopLevelStmt
sem.nim(450)             myProcess
sem.nim(419)             semStmtAndGenerateGenerics
semstmts.nim(1340)       semStmt
semexprs.nim(893)        semExprNoType
semexprs.nim(2189)       semExpr
semstmts.nim(1134)       semProc
semstmts.nim(1074)       semProcAux
transf.nim(788)          transformBody
transf.nim(773)          processTransf
transf.nim(761)          transform
transf.nim(104)          transformSons
transf.nim(706)          transform
transf.nim(472)          transformFor
lambdalifting.nim(1022)  liftForLoop
ast.nim(941)             []
SIGSEGV: Illegal storage access. (Attempt to read from nil?)
*** Error in `aporia': free(): invalid pointer: 0x00007f1f16667700 ***
SIGABRT: Abnormal termination.

我仿佛已经知道十万只草泥马在心中奔腾而过的感觉了

可能永远也不会续的未完待续

坑开的有点多了

吐槽

又过了很长时间没写博客了

这次真不是因为懒

各种忙

然后还不小心开了几个大坑


近期做过的事:

先是帮go-zh翻译了一个package(只有几行的翻译量,结果还各种不准确,几乎都是minux纠正过来的)

又写了个各种意义上都弃坑了的golang下载package

一旦下载超大文件就会直接挂掉,是因为线程分配的问题(直接平均分配给每个线程,所以缓冲区会爆掉),但是也懒得改了。要是有人发现了,发个issue可能会给我点动力

然后又为了给coding.net的PaaS弄个Dart的Buildpack

用着电信的渣出口从google code拖了1.7G的源码,编译了最新的Dart SDK

又因为各种原因以及buildpack原作者的脚本有些许问题,弄了2天才下载好了完整的源码

简直生不如死

关键是,最后部署的时候,才想起来dart的包管理网站 被!墙!了!

于是所有的package都要预先下载好再改包管理路径然后全部提交到git

又涉及到了协议什么的一大堆东西,果断还是弃坑不维护了

在用go写一些小程序的时候需要用到图形界面。而go的ui库我基本都用遍了

缺点大致如下(部分问题可能有解决方法,如果知道还请留言告诉我哈):

于是!

就开始写一个用node-webkit做框架的ui库

用html+js做控件,然后可以自定义css,前后端通信用websocket

依赖只有一个nwjs,基本什么平台都可以用

然后支持很方便的自定义控件(只要实现一个方法即可,会自动用反射来调用),以及写一个自定义控件的教程(计划中)

来一段例子:

	var w *Window
	w = &Window{
		Title:  "window",
		Width:  800,
		Height: 600,
		Controls: []interface{}{
			&Button{
				ID:   "btn0",
				Text: "button",
				OnClick: func() {
					println(GetConByID("btn0").(*Button).Text)
				},
			},
			&Button{
				ID:   "btn1",
				Text: "button",
			},
		},
	}
	w.Show()

当然这个库还只是写了个框架(就是说上面说的大部分功能都还没实现(别激动别激动))

控件什么的也只写了一个按钮和一个自定义窗口边框来做演示

上张图(实际运行截图):

img

然后就在这货刚写完框架之后

我又开了个坑(因为Stepladder在长链接下会有几率始终占满一个CPU线程的使用率(具体触发原因不明),然后因为是tcp所以延迟什么的还比较大)

于是准备重写个基于udp的

在github上翻了一遍发现这货https://github.com/skywind3000/kcp

以浪费10%流量为代价换取更低的延迟?

貌似不错

还有人弄了个go版本的https://github.com/vzex/dog-tunnel

就是里面的ikcp,貌似是直接用的c2go转换的,所以编码风格还是有点奇怪

c版本的源码协议是GPL,但是这个是转换的所以貌似可以不用?

总之拖了一份到本地,然后修改了一下编码风格

这货就诞生了https://github.com/go-ukcp/ukcp(里面的ikcp文件夹)

只是把编码风格转换了一下,然后ukcp本来是想封装一下的

但是因为发送端的判断什么的(还要传给kcp所以识别很麻烦),就又弃坑了……

(不过里面的ikcp还是可以单独拿出来用用的)

当然还不能放弃,开始自己封装一个udphttps://github.com/Bluek404/rudp

然后嘛……现在为止还没写完


就这么多了,坑还是慢慢填吧

2014浏览器A-Z

冬天好冷啊

好吧其实也算不上一年的

因为中途从Firefox换到了Chrome(谁让Flash不支持了嘛),然后导入的记录没有浏览次数记录