Haskell で UTF-8 のファイル入力

本棚に「ふつうの Haskell」という本があったので Haskell を触ってみたのだけど。
2つめのサンプルプログラムの標準入力を読んで標準出力に出力するというやつがいきなり動かなくて困った。

サンプルだとアメリカの州の名前が入ったテキストファイルを表示してたので、日本の県名が入ったファイルを表示しようとしたところ、

 hGetContents: invalid argument (invalid byte sequence)

と怒られる。どうも UTF-8 だとだめらしい。

私の Haskell 体験は終わってしまった、でも良かったのだけど。まあ流石に早過ぎるかなと思っていろいろ調べた所、hSetEncoding というのでエンコーディングを直接指定するといいらしい。

import System.IO

main = 
  do hSetEncoding stdin utf8
     hSetEncoding stdout utf8
     cs <- getContents
     putStr cs

デフォルトは UTF-8 らしいけど、システムのデフォルトエンコーディングに影響されてうまく読めないとかなんとか。
でも、stdin のエンコーディングを変えると stdout の方が ShiftJIS(CP932?) に変わってしまって謎すぎる。

EA のモデルを YAML に変換

EA のモデルを YAML として出力するスクリプトを書いてみたら78行だった。
やっぱり C# より Ruby が好きかな

# -*- coding: cp932; -*-
require 'win32ole'
require 'yaml'

def read_package(package)
   {
      "Name"       => package.Name,
      "PackageID"  => package.PackageID,
      "Packages"   => package.Packages.to_enum.collect {|sub_package| read_package(sub_package) },
      "Elements"   => package.Elements.to_enum.collect {|element| read_element(element) },
      "Connectors" => package.Connectors.to_enum.collect {|connector| read_connector(connector) },
      "Diagrams"   => package.Diagrams.to_enum.collect {|diagram| read_diagram(diagram) },
   }
end

def read_element(element)
   {
      "Name"        => element.Name,
      "ElementID"   => element.ElementID,
      "Stereotype"  => element.Stereotype,
      "Type"        => element.Type,
      "Elements"    => element.Elements.to_enum.collect {|sub_element| read_element(sub_element) },
      "Connectors"  => element.Connectors.to_enum.collect {|connector| read_connector(connector) },
      "Diagrams"    => element.Diagrams.to_enum.collect {|diagram| read_diagram(diagram) },
   }
end

def read_connector(connector)
   {
      "Name"         => connector.Name,
      "ConnectorID"  => connector.ConnectorID,
      "Direction"    => connector.Direction,
      "ClientID"     => connector.ClientID,
      "ClientEnd"    => read_connector_end(connector.ClientEnD),
      "SupplierID"   => connector.SupplierID,
      "SupplierEnd"  => read_connector_end(connector.SupplierEnD),
      "Stereotype"   => connector.Stereotype,
      "Type"         => connector.Type,
   }
end

def read_connector_end(connector_end)
   {
      "Role"   => connector_end.Role,
   }
end

def read_diagram(diagram)
   {
      "Name"            => diagram.Name,
      "DiagramID"       => diagram.DiagramID,
      "Stereotype"      => diagram.Stereotype,
      "Type"            => diagram.Type,
      "DiagramObjects"  => diagram.DiagramObjects.to_enum.collect {|obj| read_diagram_object(obj) },
      "DiagramLinks"    => diagram.DiagramLinks.to_enum.collect {|link| read_diagram_link(link) },
   }
end

def read_diagram_object(diagram_object)
   {
      "ElementID"   => diagram_object.ElementID,
      "Style"       => diagram_object.Style,
      "Position"    => { "Bottom" => diagram_object.bottom, "Left" => diagram_object.left, "Right" => diagram_object.right, "Top" => diagram_object.top },
   }
end

def read_diagram_link(diagram_link)
   {
      "ConnectorID"  => diagram_link.ConnectorID,
      "IsHidden"     => diagram_link.IsHidden,
      "Style"        => diagram_link.Style,
   }
end

app = WIN32OLE.connect "EA.App"
models = app.Repository.Models.to_enum.collect {|model| read_package(model) }

puts YAML.dump(models)

windows + apache での ruby の shbang

/usr/bin/env ruby

で、どこでも ruby が動くならそれがいんだけど。

windowsapacheで .rbファイルを任意のrubyで実行させるには、http.conf とレジストリの設定が必要だ。これをやっておくと、Windows/Linuxの混在環境で shbang を修正する必要がなくなる。

まずは、http.conf

  ScriptInterpreterSource registry

そしてレポジトリ

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.rb]
"PerceivedType"="text"
"Content Type"="text/plain"

[HKEY_CLASSES_ROOT\.rb\Shell]

[HKEY_CLASSES_ROOT\.rb\Shell\ExecCGI]

[HKEY_CLASSES_ROOT\.rb\Shell\ExecCGI\command]
@="D:\\ruby2-mingw32\\bin\\ruby.exe"

どこかで見たんだけど、どこだったかな。

影舞 on お名前.com 共用サーバー

バグトラッカーが欲しかったので影舞をお名前.comで借りているの共用サーバーにインストールした。最新版は 0.8.8 か〜と思いながら公式サイトからダウンロードしようとするも、404。
なんだと・・・


修正しようとしたけどパーミッションがなくて修正できない。。。
とりあえず sourceforge.jp からダウンロード。


手元で展開したあと、ftp でサーバーにアップロードして *.cgiパーミッションを 0755 に変更。そして、おもむろに guest.cgi を叩くとちゃんと動いた。プロジェクトの作成もできたし、バグの投稿もできる。
すばらしい。このお手軽欲しくて作ったのをいまさら思い出しました。


メールは、全体設定で

mailer : Kagemai::SendmailCommandMailer
mail_command : /usr/lib/sendmail

と設定したら送信できるようになりました。

ubuntu 13 desktop

最近VirtualBoxubuntuを入れて少しずつさわっています。HUDとかソフトウェアセンターとかなかなかいいですね。なかなかいいだけに、役に立たないといらっとしますが。結局コマンドラインでapt-getです。むしろ、そのためにパッケージの名前教えてください、みたいな?
まあ、それは私の知識が足りないだけですが。。。

フォントのレンダリングWindowsよりきれいですね。WindowsのほうはMacTypeを入れてるけど、定期的に設定を見直したくなります。とりあえずemacsの環境を共有できるように整理しなければ。