忍者ブログ

(´゚д゚`)ンマッ!!

Ruby,JavaScriptについての備忘録として書きます。自分用です。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

RubyにもろもろのDLLを簡単にインストールする(まとめ)

Rubyをインストールし、使っていると、

zlib.dll が見つからなかったため、このアプリケーションを開始出来ませんでした。
アプリケーションをインストールし直すとこの問題は解決される場合があります。

のようなエラーに出くわすことがあります。
そしてよく躓きます。のでメモ。


zlib.dll、gdbm.dll、pdcurses.dll、readline.dll
http://blog.cnobi.jp/v1/blog/user/bd4ffa3735bf41c9ed432510ffe298a6/1317541658
にアクセスし、ダウンロードして解凍。
すると中に4つフォルダがあるので、それぞれのフォルダの中のbinフォルダにある「.dll」とつくものを
Rubyのインストールフォルダにあるbinフォルダにコピーします。
Rubyを「C:\ruby」にインストールしていれば「C:\ruby\bin\」にコピーします。
これで、zlib.dll、gdbm.dll、pdcurses.dll、readline.dllの4つのDLLがインストールできます。


このほかにも、iconv.dll,opensll.dllも合った方が安心かも知れません。

iconv.dll
http://www.meadowy.org/meadow/dists/snapshot/old/iconv-1.8.win32.zip
にアクセスしてダウンロード。
それを解凍して、そのフォルダの中のlibフォルダにある「iconv.dll」を先ほどと同じRubyのbinフォルダにコピーします。

openssl.dll
http://code.google.com/p/openssl-for-windows/downloads/detail?name=openssl-0.9.8e_WIN32.zip&can=2&q=
にアクセスし、
「openssl-0.9.8e_WIN32.zip」と表示されているリンクをクリック、ダウンロード。
ダウンロードされたファイルを解凍し、そのフォルダの中のbinフォルダにある「libeay32.dll」と「ssleay32.dll」を先ほどと同じRubyのbinフォルダにコピーします。


これでもうあのエラーには出会わずに済むと思います。

拍手[0回]

PR

Rubyで出力(print,puts)する時の文字コードを設定する

Windowsでプログラムしていると、
コマンドプロンプトの設定はsjisのままがいいけど、Rubyファイルはutf8で扱いたい。なんてことがよくあると思います。(俺だけ?)

で、その何が問題かと言うと、
「Rubyファイルの文字コードをutf8で保存すると、printやputsで出力したときに日本語が文字化けする」ってことです。
じゃあRubyファイルをsjisにするか、コマンドプロンプトをutf8にしろよっていう声が聞こえてきそうですが、
Rubyファイルはutf8じゃないといろいろと問題があって、コマンドプロンプトは他のsjisのプログラムが実行しにくくなるので嫌です。

ということで、出力するときの文字コードを指定できるメソッドを書いてみました。

#!/usr/bin/ruby
$CCODE = 's'
require 'nkf'

def cputs(s,icode="")
	if icode!=""
		case icode[0,1].upcase
			when 'W' then i=icode
			when 'U' then i='W'
			when 'I' then i='J'
			else i=icode[0,1]
		end
	else i='' end
	if $CCODE!=""
		case $CCODE[0,1].downcase
			when 'w' then o=$CCODE
			when 'u' then o='w'
			when 'i' then o='j'
			else o=$CCODE[0,1]
		end
	else puts s;return false end
	puts NKF.nkf("-#{o}#{i}xm0", s)
	return true
end

def cprint(s,icode="")
	if icode!=""
		case icode[0,1].upcase
			when 'W' then i=icode
			when 'U' then i='W'
			when 'I' then i='J'
			else i=icode[0,1]
		end
	else i='' end
	if $CCODE!=""
		case $CCODE[0,1].downcase
			when 'w' then o=$CCODE
			when 'u' then o='w'
			when 'i' then o='j'
			else o=$CCODE[0,1]
		end
	else print(s);return false end
	print(NKF.nkf("-#{o}#{i}xm0", s))
	return true
end
cputsがputsの文字コード指定版で、cprintがprintの文字コード指定版です。
どっちもやってることは同じです。というか、一行しか変わりません。

これを定義した後に、
cputs "こんにちわ"
cprint "ハロー, 世界。"
とすれば文字コードを変換して出力します。

出力する文字コードはグローバル変数、$CCODEで指定します。
$KCODEと同じく、最初の1文字目しか見てませんので、utf8と書いてもuと書いても結構です。
ただし、最初の1文字目が'w'の場合はNKH変換に$CCODEの内容をそのまま使いますので、
NKFのオプションが分かる方は'w16L0'等と指定することも出来ます。
NKFの主なオプションはこちらをご覧下さい
るびま - NKHの主なオプション

また、cputsとcprintのそれぞれの第2引数は、
cputsまたはcprintに渡される文字列の文字コードを指定できます。
文字コードが明確な場合は、指定する方が変換ミスがなくなるはずです。
もちろん、指定しなくても構いません。指定しなければ自動判別になります。

それと、kconvのString#tosjisなどの変換メソッドでは
半角カタカナが全角カタカナになったり、MIMEエンコードされている文字列を勝手にデコードしたりしますが、このメソッドではそのようなことはしません。
逆に言えば、そのようなことがしたいのであれば、NKH変換の部分を書き換えてください。
m0とxを削除すればおkだと思います。

どちらのメソッドの戻り値も、
変換に成功した場合はtrue、
変換に失敗($CCODEが指定されていない)した場合はfalse、です。

$CCODEが指定されていない場合は、普通にそのままprint、putsします。

拍手[0回]

Rubyのifとcaseでは、どちらが速いか

Rubyのifとcase、どちらの処理が速いのかベンチマークを測定してみた。
標準でbenchmarkというライブラリがあるが、どうも使いにくいので簡単にやります。

2通りの結果しかない場合は、if、elseを使えば良いと思うので、
3通りに条件を分岐するという前提でやってみます。

a="d"
n=1000000

st=Time.now
n.times{
	if a=="a"
	elsif a=="b"
	elsif a=="c"
	else end
}
puts "if Times: #{Time.now-st}s"

st=Time.now
n.times{
	case a
	when "a"
	when "b"
	when "c"
	else
	end
}
puts "case Times: #{Time.now-st}s"
100万回回してみました。
結果は、
if Times: 2.171875s
case Times: 2.515625s

ifの==の方が少しだけ速いようですね。

結論、そんなに差はないけどどちらかというとifの方が速い

拍手[1回]

Copyright © (´゚д゚`)ンマッ!! : All rights reserved

TemplateDesign by KARMA7

忍者ブログ [PR]

管理人限定

プロフィール

HN:
starlit
性別:
男性
自己紹介:
Ruby,JavaScriptでWebサービスとか作ったりしています。
こんなん作れば?とかもっとこうすれば?とかもあれば言ってください。

一緒になんか作ろうぜ!とか言う人は
是非メールなりなんなり送って下さい!

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

ブログ内検索

最新CM

カウンター