rvm+shoes的安装

UPDATE1:在更新了3.2之后,shoes的安装方法简化了很多。官网上的.run文件能用了,在ubuntu之下只需要用sh命令运行.run文件,然后进入相应目录,在终端中运行./shoes即可。之后也可以通过ln -s命令在usr/bin中创建一个快捷方式,省得以后每次找shoes的路径了。

UPDATE2:如果用gem install shoes安装的话,会安装一个很古老的shoes的版本,基本没办法使用。目前shoes4正在解决这个问题。现阶段如果想通过gem安装的话,推荐gem install green_shoes。不过绿鞋和红鞋之间存在部分差别

UPDATE3:由于shoes3在更新到了3.2之后,终于解决了.run文件运行出错的问题。所以如果是装3.1版本的shoes,下文才有用。

这篇文章中提到了,迫于shoes难装,被迫转向tk的痛彻心扉的经历。不过世上无难事,只要有东哥。在东哥的催促下,我还是把昨天的那个nokogiri装不上的问题解决了。

其实按照官方的这个wiki,rvm+shoes装起来超简单。rvm装ruby的过程在这篇短文中提到了,所以前面那些都不用看,所需要的就是从后半段开始。即,这么一段。

$ gem install bundler
# Clone Shoes source and build
$ git clone git://github.com/shoes/shoes.git ${SHOES_DIR}
$ cd shoes
$ rvm use 1.9.3
$ bundle install
$ rake

不过在运行bundle install的时候会装到一半就错误跳出,提示如下。

An error occurred while installing nokogiri (1.5.5), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.5.5'` succeeds before bundling.

昨天也就是卡到这里不知道该怎么办了,最后转向了tk。

今天又祭出stackoverflow,发现是libxml2没有装,于是按照下方顺序即可完成安装。

$sudo apt-get install libxml2
$gem install nokogiri
$bundle install。
$rake

既然shoes都装好了,那还是转回shoes吧,感觉shoes比tk好用了不是一点...

rvm+tcl/tk的安装

暑假放假一个月了,这一个月里百无聊赖。在尝试了玩游戏、画画、看游戏视频、跟美剧,最终纷纷腻掉之后,还是决定继续完成上个学期中期开始搞起的那个字模转换程序。

之前在这篇文章中也提到了要用shoes写GUI,那中类似于css的方法确实很好用。不过鉴于当时只有一台电脑,而且是windows,搞ruby实在是头疼,遂决定等几个月研究生开学了有新电脑了把旧电脑装成ubuntu,会轻松很多。

不过理想很丰满,现实很骨感。昨天下午尝试了整整一下午,结果一直装不好shoes。一怒之下,我决定还是用自己原来用过的东西,回归tk好了。

于是我抓起最后这根稻草,果断$ dpkg -l tk,发现ubuntu果然自带,还是最新版的8.6,奈斯。

于是信手搞了个Hello World!

结果就这也报错。

1:in `require': no such file to load -- tk (LoadError)

于是跑到/.rvm/src/ruby-1.9.3-p547/ext/tk下,$ruby extconf.rb看看缺了些什么。

log如下。

juiceyang@juiceyang-pc:~/.rvm/src/ruby-1.9.3-p547/ext/tk$ ruby extconf.rb
check functions.checking for ruby_native_thread_p() in ruby.h... yes
.checking for rb_errinfo() in ruby.h... yes
.checking for rb_safe_level() in ruby.h... yes
.checking for rb_hash_lookup() in ruby.h... yes
.checking for rb_proc_new() in ruby.h... yes
.checking for rb_obj_untrust() in ruby.h... yes
.checking for rb_obj_taint() in ruby.h... yes
.checking for rb_set_safe_level_force() in ruby.h... yes
.checking for rb_sourcefile() in ruby.h... yes

check struct members.checking for struct RArray.ptr in ruby.h... no
.checking for struct RArray.len in ruby.h... no

check libraries.checking for t_open() in -lnsl... no
.checking for socket() in -lsocket... no
.checking for dlopen() in -ldl... yes
.checking for log() in -lm... yes

Use ActiveTcl libraries (if available).
Search tclConfig.sh and tkConfig.sh...............................
Fail to find [tclConfig.sh, tkConfig.sh]
Use X11 libraries (or use TK_XINCLUDES/TK_XLIBSW information on tkConfig.sh).
checking for XOpenDisplay() in -lX11... yes

Search tcl.h.checking for tcl.h... no
......
Search tk.h.checking for tk.h... no
......Can't find "tcl.h".
Can't find "tk.h".

Can't find proper Tcl/Tk libraries. So, can't make tcltklib.so which is required by Ruby/Tk.
If you have Tcl/Tk libraries on your environment, you may be able to use them with configure options (see ext/tk/README.tcltklib

合着tcl和tk都没有?!我赶紧再次$ dpkg -l以防自己老眼昏花幻视了,结果发现都有啊!

好吧,果断还是得祭出stackoverlfow。发现8.6版本还不支持...

于是又把8.6版本的tcl/tk删除掉。然后从这里下载到了8.4.20版本的tcl/tk。(据说大神都是直接wget从sourceforge上下...)

然后将tcl和tk分别解压,添加到$PATH里,然后分别安装如下。

$ cd tcl8.4.20/unix
$ ./configure --prefix=/usr --enable-shared
$make
$make install
$ cd ..
$ cd tk8.4.20/unix
$ ./configure --prefix=/usr --enable-shared
$make
$make install

然后再$ruby test.rb,发现没问题了。

rvm安装ruby

最近买了新电脑,旧电脑装了ubuntu想熟悉一下linux,顺便以后的代码工作估计多数就要转移到ubuntu上做了。

今天在装ruby的时候遇到了一个问题。就是在按照这个ruby安装指南的时候,在安装完rvm之后,执行"rvm install"命令的时候会出现错误,log为

“Requirements installation failed with status: 100.”

后来在stack overflow上查到了原因,是因为执行这个指令的时候会update一下,但是有的repo是404 not found,update失败之后就会安装ruby失败。

所需要做的也很简单,就是首先确定是哪些repo是404的,然后在/etc/apt/sources.list下找到对应的自定义的repo的文件,删除掉这些文件(需要sudo)。删除掉之后首先执行"sudo apt-get update"一下,然后再执行"rvm install"即可。

最后执行一下"rvm list",可以看到安装成功了。

12864液晶屏定制版字模生成程序

在之前这片短文用Ruby和HZK16字库进行字模提取中提到了如何使用HZK16字库提取逐行扫描的字模。

但是12864这块液晶比较奇怪,是逐列扫描的,所以用普通的字模提取软件提取出来的字模是不行的。

本着没事干写代码权当消遣的想法,用Ruby写了下12864液晶屏特供版的字模提取程序。代码的前半部分和之前用的一样,先提取出来正常的字模。然后用最傻大黑粗的方法直接将16x16的字点阵的数据存到一个16x16的二维数组里面,然后在用逐列输出的方法输出一下即可。如果再碰到其他的奇怪的液晶,也可以采用这种傻大黑粗的方法,虽然不太文雅,不过代码写起来也不用怎么想,抬手就能写,一会就能写完。

废话不多说,代码见下吧。

print "input the Chinese character:"
cstr = gets
str = cstr.encode("gb2312")
arr = []
code = []

str.each_byte {|b| arr<< b}
offset = (arr[0]*94+arr[1]-15295)*32
print "offset in the HZK16 fonts file:"
puts offset

f = File.new("HZK16")
f.seek(offset)
print "file pointer position:"
puts f.pos

if offset==f.pos
puts "file pointer is at the right place!"
end
puts "----------------------------------------"

puts "traditional fonts array:"
for i in 0..31
	code[i] = f.getbyte		#code[i] type: string
	#print code[i].to_s(16)
end
print "{"
for i in 0..30
	if code[i] <= 0x0F
		print "0x0"+code[i].to_s(16)+","
	else
		print "0x"+code[i].to_s(16)+","
	end
end
if code[31] <= 0x0F
	print "0x0"+code[31].to_s(16)
else
	print "0x"+code[31].to_s(16)
end
puts "}"
puts "----------------------------------------"
f.close

#end of original fonts.rb

puts "data matrix (space for 0, # for 1):"
dataMatrix = Array.new(16) { Array.new(16) }
j=0
for i in 0..31
	if (i%2)==0
		for p in 0..7
			dataMatrix[j][p] = (code[i]&(1<<(7-p)))>>(7-p)
		end
	else
		for p in 8..15
			dataMatrix[j][p] = (code[i]&(1<<(15-p)))>>(15-p)
		end
		j+=1
	end
end

for i in 0..15
	for j in 0..15
		if dataMatrix[i][j]==1
			print "# "
		else
			print "  "
		end
	end
	puts ""
end
puts "----------------------------------------"

out = []
for i in 0..31
	out[i]=0
	if i<=15
		for p in 0..7
			out[i] += (dataMatrix[p][i]<<p)
		end
	else
		j = i-16
		for p in 8..15
			out[i] += (dataMatrix[p][j]<<(p-8))
		end
	end
end

f = File.open("fonts output.txt","w+")
puts "fonts in 12864:"
print "{"
f.write("{")
for i in 0..30
	if out[i] <= 0x0F
		print "0x0"+out[i].to_s(16)+","
		f.write("0x0"+out[i].to_s(16)+",")
	else
		print "0x"+out[i].to_s(16)+","
		f.write("0x"+out[i].to_s(16)+",")
	end
end
if out[31] <= 0x0F
	print "0x0"+out[31].to_s(16)
	f.write("0x0"+out[31].to_s(16))
else
	print "0x"+out[31].to_s(16)
	f.write("0x"+out[31].to_s(16))
end
puts "}"
f.write("}")
f.close

puts "press enter to quit:"
while true
	edstr = gets
	if edstr == "n"
		break
	end
end

另外最后写完尝试使用了一下ocra,编译出来了一个exe文件,HZK16也被编译在了里面。妈妈不用再担心字库丢了的问题了!携带更方便!

用Ruby和HZK16字库进行字模提取

又是5.1小长假(3天也叫假?!)。在宿舍补觉之余觉得万般无聊,于是准备把之前一直想做的字模提取的软件做了(主要原因还是之前接触到的12864的字模数据写入方式比较奇葩)。鉴于平时只写过C,而C写GUI简直坑爹。最后挑了个时髦的Ruby从头学学,而且貌似用Shoes做GUI还是挺惬意的样子。

这片短文大致记录一下字模提取的过程。

使用的是UCDOS这个时代的眼泪里自带的16x16点阵字库,从网上简体繁体都能下载到,关键词是HZK16和HZK16F。话说google一下首页都没有UCDOS的官方信息...果然是时代的眼泪么...

大致提取过程也很简单,就是计算一下偏移量(计算的过程网上一搜一大堆,就是计算一下和0xA1A1之间的相对位置关系,而之所以是0xA1A1是因为GB2312从0xA1A1开始),然后连着读取32个字节(16*16/8)存到数组里用16进制输出一下。代码如下所示。

str = "码".encode("gb2312")
arr = []
code = []

str.each_byte {|b| arr<< b}
offset = (arr[0]*94+arr[1]-15295)*32
print "offset:"
puts offset

f = File.new("HZK16")
#if traditional Chinese character is needed
#f = File.new("HZK16F")
f.seek(offset)
print "file pointer position:"
puts f.pos

for i in 0..31
	code[i] = f.getbyte		#code[i] type: string
    #code[i] = f.getc
	print code[i].to_s(16)
	#print code[i].unpack("H*")     #cant split A5FE
	print "tt"
	puts i
end

f.close
sleep

中间碰见的一个问题就是一开始是用f.getc来逐个字节获取字模的,但是不知道为什么第9行的数据0xA5和0xFE会被同时读出来,输出个0xA5FE。导致会把下一个字的字模的第1个数据读出来附到最后,导致无法正常显示。

最后也没找到原因,还是使用getbyte替代了getc来读取字节。

附上最后的输出结果(傻乎乎手动在其他人的字模软件中点亮的...),以后再抽时间把字模的其他的排列方式和GUI写了吧...目前GUI决定用ImageMagick和shoes来搞...到时候再记录吧。