■ 日記

日記の一覧 またの名を作業記録かも? 今年も、あと「 」日くらい。

     July 2013      
Su Mo Tu We Th Fr Sa
    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 31 

     June 2013      
Su Mo Tu We Th Fr Sa
                   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 
2013/7/3 Wed
赤鉛筆

紙のコンピュータ系の本を読むときは赤鉛筆なんです。 マーカーとかインク系は裏うつりするから。 最近は大丈夫なものもあるかもしれませんが。 気に入ったところを赤鉛筆で線を引いたり丸とか三角とか書いたり。

赤鉛筆買ってこようかな。

http://www.aguse.jp/

あやしいサイトかどうか判断するのにどこを使っていますか? 私はここなんです。 書き換えとか流行っているそうで、注意したいものです。 でも、事前にチェックって難しいですよね。

Ruby

すっかり 2.0 系を使っているのですが 1.9 系とか 1.8 系を入れるべきか悩んだり。 私がやっているインストール方法だと共存できるはずなので、入れれば入るんですが。

$ ll /usr/local/bin
total 0
lrwxrwxrwx 1 root root 16 May 16 03:26 erb -> /t/bin/erb-2.0.0*
lrwxrwxrwx 1 root root 16 May 16 03:26 gem -> /t/bin/gem-2.0.0*
lrwxrwxrwx 1 root root 16 May 16 03:26 irb -> /t/bin/irb-2.0.0*
lrwxrwxrwx 1 root root 17 May 16 03:26 rake -> /t/bin/rake-2.0.0*
lrwxrwxrwx 1 root root 17 May 16 03:26 rdoc -> /t/bin/rdoc-2.0.0*
lrwxrwxrwx 1 root root 15 May 16 03:27 ri -> /t/bin/ri-2.0.0*
lrwxrwxrwx 1 root root 17 May 16 03:27 ruby -> /t/bin/ruby-2.0.0*
lrwxrwxrwx 1 root root 19 May 16 03:27 testrb -> /t/bin/testrb-2.0.0*
lrwxrwxrwx 1 root root  9 May 16 22:37 tm -> /t/bin/tm*
$ ll /t/bin
total 13548
-rwxr-xr-x 1 root root     4397 May 16 03:24 erb-2.0.0*
-rwxr-xr-x 1 root root      546 May 16 03:24 gem-2.0.0*
-rwxr-xr-x 1 root root      318 May 16 03:24 irb-2.0.0*
-rwxr-xr-x 1 root root     1320 May 16 03:24 rake-2.0.0*
-rwxr-xr-x 1 root root      938 May 16 03:24 rdoc-2.0.0*
-rwxr-xr-x 1 root root      188 May 16 03:24 ri-2.0.0*
-rwxr-xr-x 1 root root 13831901 Jun 27 23:11 ruby-2.0.0*
-rwxr-xr-x 1 root root       78 May 16 03:24 testrb-2.0.0*
$ ll /t/lib/ruby/
total 16
drwxr-xr-x 35 root root 4096 Jun 27 23:26 2.0.0/
drwxr-xr-x  3 root root 4096 May 16 03:24 gems/
drwxr-xr-x  3 root root 4096 May 16 13:14 site_ruby/
drwxr-xr-x  3 root root 4096 May 16 03:24 vendor_ruby/

ここで使っている ll コマンドは Ruby で書いた ll (ls -l) コマンド です。

この方法はパッチレベルでは対応できないのですが。 Vine Linux 6.1 には 1.8.7 は入っているし、1.9.3 を入れれば? どうしたものか。 あ、切り替えは /usr/loca/bin の下のシンボリックリンクを調整すればいいかなと。

$ /usr/bin/ruby -v
ruby 1.8.7 (2012-06-29 patchlevel 370) [i686-linux]

次のようなシェルスクリプトでコンパイルしています。

#! /bin/sh -x

VAR=`grep RUBY_VERSION version.h | head -1 | awk '{print $3}' | tr -d '"'`

if [ -f configure ]; then
 if [ configure.in -nt configure ]; then
  make clean
  autoconf
 fi
else
 make clean
 autoconf
fi

./configure --prefix=/t --program-suffix=-$VAR

make && make test && make test-all

個人的には Ruby 2.0 で満足しているのですが、さてさて。

おまけ

$ tree -d /t/lib/ruby
|-+ /t/lib/ruby
  |-+ 2.0.0
  | |-+ bigdecimal
  | |-+ cgi
  | | |-+ session
  | |-+ date
  | |-+ digest
  | |-+ dl
  | |-+ drb
  | |-+ fiddle
  | |-+ i686-linux
  | | |-+ digest
  | | |-+ dl
  | | |-+ enc
  | | | |-+ trans
  | | |-+ io
  | | |-+ json
  | | | |-+ ext
  | | |-+ mathn
  | | |-+ racc
  | |-+ io
  | | |-+ console
  | |-+ irb
  | | |-+ cmd
  | | |-+ ext
  | | |-+ lc
  | |   |-+ ja
  | |-+ json
  | | |-+ add
  | |-+ matrix
  | |-+ minitest
  | |-+ net
  | | |-+ http
  | |-+ openssl
  | |-+ optparse
  | |-+ psych
  | | |-+ handlers
  | | |-+ json
  | | |-+ nodes
  | | |-+ visitors
  | |-+ racc
  | | |-+ rdoc
  | |-+ rake
  | | |-+ contrib
  | | |-+ ext
  | | |-+ lib
  | | |-+ loaders
  | |-+ rbconfig
  | |-+ rdoc
  | | |-+ context
  | | |-+ generator
  | | | |-+ template
  | | |   |-+ darkfish
  | | |   | |-+ images
  | | |   | |-+ js
  | | |   |-+ json_index
  | | |     |-+ js
  | | |-+ markdown
  | | |-+ markup
  | | |-+ parser
  | | |-+ rd
  | | |-+ ri
  | | |-+ stats
  | |-+ rexml
  | | |-+ dtd
  | | |-+ formatters
  | | |-+ light
  | | |-+ parsers
  | | |-+ validation
  | |-+ rinda
  | |-+ ripper
  | |-+ rss
  | | |-+ content
  | | |-+ dublincore
  | | |-+ maker
  | |-+ rubygems
  | | |-+ commands
  | | |-+ core_ext
  | | |-+ ext
  | | |-+ package
  | | | |-+ tar_reader
  | | |-+ security
  | | |-+ ssl_certs
  | |-+ shell
  | |-+ syslog
  | |-+ test
  | | |-+ unit
  | |-+ uri
  | |-+ webrick
  | | |-+ httpauth
  | | |-+ httpservlet
  | |-+ xmlrpc
  | |-+ yaml
  |-+ gems
  | |-+ 2.0.0
  |   |-+ build_info
  |   |-+ cache
  |   |-+ doc
  |   |-+ gems
  |   | |-+ rake-0.9.6
  |   | | |-+ bin
  |   | |-+ rdoc-4.0.0
  |   | | |-+ bin
  |   | |-+ test-unit-2.0.0.0
  |   |   |-+ bin
  |   |-+ specifications
  |     |-+ default
  |-+ site_ruby
  | |-+ 2.0.0
  |   |-+ i686-linux
  |-+ vendor_ruby
    |-+ 2.0.0
      |-+ i686-linux

112 directores

ここで使っている tree コマンドは Ruby でディレクトリの tree 表示 です。


2013/7/2 Tue
webrick してみる

apache を入れるのもなんだしと。 ここを確認するのにアップロードしてから確認するのではなくてローカルで確認したかったので。 私の書いたツールは、更新しているファイルがあると一気に全部アップロードしてしまうので、書きかけでもアップロードしちゃうのですが...

#! /usr/local/bin/ruby

require 'webrick'

root = File.expand_path '/t/src/html'
server = WEBrick::HTTPServer.new :Port => 80, :DocumentRoot => root

trap('INT') {
  server.shutdown
  exit
}

WEBrick::Config::FileHandler[:UserDir] = 'public_html'

server.start

port 80 を使用しているので(デフォルトなので指定の必要はありません)、root 権限で実行する必要があります。

$ sudo ruby local.rb

これで VMware 上の Linux に Windows7 のブラウザでアクセスできたりします。 便利ですね。

むかしも自分のシステムに httpd 立ち上げてあれこれしてました。 HDD 壊れたときに消えました。 残っていればなー

ブラウザの横幅

こことかブラウザの横幅はあまり広くないほうが読みやすいですよね。 一行が長すぎると視線の移動が難しくなるので、ある程度短いほうがいいようです。 新聞とかそうですね。

横幅が広くても困らないところもあるし、ということで最近はブラウザのウィンドウがふたつになりました。 いままではウィンドウは一つでタブを利用していたのですが。


2013/7/1 Mon
たのしい開発 スタートアップ Ruby

私は技術だけが淡々と書かれている本よりはきっかけを作ってくれる本が好きです。 どう考えてどう解決していくか? とか。 この本は Kindle でみつけて買ったのですが、なかなかよさそうです。 まだ冒頭しか読んでいませんけど。

理想的なチームで働いてみたいとか思ったりもするんですが、私はその中で期待に答えることができるのか? とか考えちゃって無理そうと。 どこか私でも当てはまるところがあるといいのですが。

mruby

Git を使っていないので zip で落としてコンパイル。 試しに Ruby で 8 queens の 8q3.rb を動かしてみたらそのまま動いた。 素敵。


2013/6/30 Sun
Ruby で書いた漢字コード変換コマンド

-I や -O オプションの追加。 これで直接 encoding を指定できるようにしました。 Ruby はたくさんの encoding への変換をサポートしています。 固定にするのはもったいないですから。

/I(.*)?/ と /I(.+)?/ と /I(.*)/ と /I(.+)/

どういう場合にどれを使えばいいでしょう?

I に続く文字列がない場合での $1 の結果は? 「.*」だと「""」(サイズ 0 の文字列)で「.+」だと「nil」なんです。 明確に使い分けができるといいのですが、ついつい忘れてしまいそう。 「.*」は「""」にマッチします。 「.+」は一文字以上なので対象がなければ nil に。

ちなみに最後の「/I(.+)/」はここでは仲間はずれです。 I の次に一文字以上必ずあることが条件になるので。 それと最初の「/I(.*)?/」は「?」は不要ですね。

私は「*」と「+」を明確に使い分けるほうですが、ひっかかったり。

optparse.rb

むかしむかし私が使っているシステムでは optparse.rb を使うとちょっとしたコマンドの反応が一瞬「あれ?」という感じに。 それ以来使っていなかったのですが、最近のシステムではそういう感覚はないですね。 私も使うようにしないと。 いろいろ便利なことがあるようですし。

自分だけが使うなら ARGV をあれこれするのもいいんですけどね。

そうそう optparse.rb を使うと zsh 用の引数の自動補完のための定義を --*-completion-zsh オプションで作ってくれます。 詳しくは misc/rb_optparse.zsh を参照してください。 こういうのってソースコードを自分でコンパイルしないとみる機会がないような。

コマンドラインでのシンタックスハイライト

いまはエディタを使えばシンタックスハイライトされるので less(1) でみたいとかなさそう。 ripper と 256color を使えばできちゃうんですが、さてさて。 HTML の場合 span をネストすると状態が保存されるので楽なのです。 ターミナルの色の場合は状態を自分で管理する必要があるので、ややこしいのはそのくらいかな。 これも状態をスタックに積み上げればいいような。

less のオプションは -XsiR にしています。 X は less が終了したときに画面を戻さない。 これは less で情報をみつけても less を終了すると less の実行時そのままのシェルプロンプトに戻っては困るから。 i は less の内部でサーチしたときに大文字と小文字の区別がないように。 s は空行の扱いで複数の空行があると一行にまとめます。 空行の多いと扱いにくいので。 R は 256color などのエスケープシーケンスをそのまま通すためです。

Brian W.Kernighan

ログイン名は bwk なんですよね。 「プログラミング言語 awk」とか「ソフトウェア作法」とか大好きです。 でも最後に読んだのはかなり前のような。 いくつか著作があるのですが、読んでいないものも。 日本語の電子書籍で入手できるものがあれば読みたいな。


2013/6/27 Thu
TL に流れていた cccbba を c3b2a1 に

String#tr_s とか String#squeeze とかあるけど。 Unix のコマンドの慣用句 uniq -c 的なものがほしいかも。 String#uniq_count とか。 Array クラスでもいいし。 あるとなにがいいかといえば、Array#pack とか String#unpack での template とか。

#! /usr/local/bin/ruby

# cccbba c3b2a1

def uqc1(s)
  s.gsub(/(.)\1*/) do |m|
    m[0] + m.length.to_s
  end
end

def uqc2(s)
  arr = []
  h = Hash.new(0)

  s.each_char do |c|
    h[c] += 1
    if arr.include? c
    else
      arr << c
    end
  end

  r = ''
  arr.each do |c|
    r << c + h[c].to_s
  end
  r
end

def uqc3(s)
  len = s.length

  r  = ''
  count = 0
  b = s[0]

  len.times do |i|
    if s[i] == b
      count += 1
    else
      r << b + count.to_s
      b = s[i]
      count = 1
    end
  end

  r << b + count.to_s
end

p uqc1('cccbba')
p uqc2('cccbba')
p uqc3('cccbba')
EUC-JP cp51932

cp51932 は Windows で使われる EUC-JP の亜種だそうです。 euc-jp や eucjp-ms では三バイトになるものが二バイトになっています。

私が確認した範囲では 373 文字ほど eucjp-ms と違うようです。 で、これ使えるんでしょうか?

該当する 373 文字の UTF-8 を Linux 上で nkf(1) で -We で変換したら cp51932 に変換されました。 Emacs では変換後の cp51932 固有の漢字は ? と表示されました。 TeraTerm を EUC-JP の設定で表示可能でした。

該当する 373 文字の UTF-8 を Ruby の String#encode で UTF-8 から eucjp-ms へ変換しました。 Emacs では一部 ? と表示されるものがありました。 TeraTerm を EUC-JP の設定で表示が化けています。

さすがに扱いにくいものですね。 使用する環境で必要にあわせてということなんだとは思いますが。


渡辺哲也 WATANABE Tetsuya