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 が動くならそれがいんだけど。
windowsのapacheで .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
と設定したら送信できるようになりました。
Chocolatey
Mingwの情報を探してたら、Chocolatey Gallery というの見つけた。
このツール自体のインストール方法からして素敵すぎる。