連続する奇数番目の改行を除去する

メーラーの関係で、HTMLメールを受信したときに改行コードが連続することがたまにあります。冷静に考えれば送信側のメーラーが動きすぎているんでしょうが、さすがに見づらいので対応するスクリプトなど。

# 連続する奇数番目の空行を除去する
def trim_alternate_newlines(s)
  odd = true
  s.lines.inject('') { |r, line|
    # 空行チェック
    if line =~ /\A\s*\n/
      line = '' if odd
      odd = !odd
    else
      odd = true
    end
    r << line
  }
end

Enumerable#inject に意味は無し。たぶん、String#gsubで一発でしょう。

例
こんにちは



あしたは

すずしくなる

はず、としんじます



では、

さようなら



/~~~

これに対して実行すると、こんな感じ。

実行結果
こんにちは

あしたは
すずしくなる
はず、としんじます

では、
さようなら

/~~~

チラリズムは時として悪だ!

1ヶ月ぶりのアップがこんなネタになろうとは… タイトル見て妄想に走った人!ごめんなさい、そっち系ではありません。
某所でサーバーの設定をして、さて「サービス開始だ」とばかりにポートを開いたときのこと。

ちょっとだけコネクションが開き、データ転送が始まった、
と思ったら、すぐに強制終了してしまう

という現象に見舞われました。
ルーターの設定を眺めてみたり、Google先生に質問したりすること2時間(!)かけるも、状況を説明できる証拠が見つからず・・・ で、結論はぷらら(プロバイダー)がナイスな無料サービス「ネットバリアベーシック」を開始したことが原因でした。

この中で、パケットフィルタのデフォルト値が「レベル1(弱)」なのですが、下記の説明ページでは、「その他通信(着信)」と「ウィニー」だけが「×」となっています。

「×」ならば通信不能とすれば良いところを、わざわざチラリとだけ通信させてからブロックしていたわけですね。挙動の理解はできたものの、共感はできないなと思った次第です。

仕事辞めました

今さら?みたいなことを書きますが、仕事を辞めて里に帰り、学校に行き始めました。
ようやく1ヶ月が過ぎ、ちょっとずつペースをつかんできたところで、GW突入と相成りました。
存外学校が忙しかったり、残作業が多かったり、あると思いますが、それよりもTwitterにシフトしたことの方が、こちらのブログへのインパクトが大きいようです。

ネタが無いわけではありませんので、ちょっとずつ小出しに発表していきたいなぁ、と思う今日この頃です。さしあたり、今さらながら仮想化関係の情報ですかね。最近はこればっかりやってますから。
というわけで、決意表明でした。

第40回 Ruby/Rails勉強会@関西参加

前回に引き続き、Ruby関西で発表してきました。アジェンダと発表資料はこちらです。

何というか、まあ相変わらず空気を読まないテーマで話をしてきたわけですが、時間も短かったせいか前回よりは良い感触だったようです。

まあ、それも偏にWatirの紹介が奏功したからなのでしょうが・・・
さて、訂正が2点。

  1. Watirがサポートするブラウザーに、Operaは含まれていませんでした。以下の4つに限られるようです。
    1. Internet Explorer
    2. FireFox
    3. Safari
    4. Chrome
  2. WatirFireFox起動に失敗したのは、JSSh 0.9をインストールしていたから、のようです。
    • JSSh を入れ直して、v1.0にしたところ、正常に動作するようになりました。

DB2とRailsのことなど

SJISは邪悪だ。
SJISに限らず、文字コード関連は予期せぬ文字化けにあふれています。日曜プログラマーが対応できる範囲を大きく逸脱するため、ボクは文字コードを固定することを推奨しています。
Windows上でRubyのプログラミングをするときは、基本的に文字コードSJIS=>CP932を使った方が何かと気楽です。理由は単純に「不要な変換をしなくて済み、特定文字に限った予期せぬ文字化けを未然に防ぐことができるから」です。
しかし、ことはそう単純ではなく、ReXMLなどの一部のライブラリーはUTF-8を前提としていますし、RailsUTF-8以外にするだけでかなり面倒なことを必要としてくれます。そういうわけで、Railsで開発するときには「UTF-8のみで記載する」方がお手軽となるようです。(これは今回やってみて初めて知りました。)

さて、問題はここからでした。IBM DB2ではDB作成時にIBMSJIS=>CP943という特殊なコードページか、あるいはUTF-8=>CP1208のいずれかが選択可能なのですが、「DB2クライアントがDBのコードページに自動変換する」という挙動をしてくれます。

クライアントがWindowsなら、入出力される文字コードは「SJIS」となり、DBの中ではDB作成時の文字コードとして保存される、という文字化けを未然に防いでくれるはずの挙動をしてくれます。ところが、Railsなど入出力される文字コードが「UTF-8」の場合には、これがうまく機能しません。サーバーに命令を送る前段階で、「文字列の処理失敗」という痛いエラーが出てしまいます。これを修正するためには、「クライアントの文字コードUTF-8に固定する」必要があります。コマンドとしては、こんな感じ。

> set DB2CODEPAGE=1208
> ruby script\server

これで正常に動作するようになるわけですが、NetBeansを使っている場合、F6一発で起動できなくなってしまうため、ちょっと面倒くさい感じがします。
どうせ、DB2でしか使わない環境変数ですし、Railsを日本語で使うのであればUTF-8固定になるでしょう、という理由から、config/environment.rbに以下のコードを一行追加したところ、おまじない無しで動作するようになりました。

ENV["DB2CODEPAGE"] = "1208"

この設定が有効になるのは、IBM提供のアダプターibm_db(v1.1.1-mswin32)を使ったときの話。IBM DB2で生成されるODBCドライバーについては、クライアント側のコードページを変更する方法が見つかりませんでした。よって、面倒でもきちんとibm_dbをインストールする必要があります。バージョン指定無しだと、コンパイル環境を求められるため、以下のようにplatformがmswin32のgemを探すと良いでしょう。(たぶん、IBMのミス?)

> gem specification -r ibm_db --ruby --all | more
> gem install -r ibm_db -v 1.1.1

現在の最新バージョンを使いたい場合、以下のアドレスからmswin32対応のgemをダウンロードし、それをインストールします。

> gem install %USERPROFILE%\downloads\ibm_db-1.5.0-mswin32.gem

ちなみにこのアダプターですが、RDOCのREADMEを読みながら設定していると、きちんとハマります。このように書かれていますが、正しくはuser -> usernameとします。

    - To configure database connection parameters edit config.yaml
      Example:  # 接続できない例
        database: testdrv
        #user:    db2inst1  # userではダメ
        username: db2inst1  # usernameならOK
        password: password
        hostname: localhost # 省略可能
        port:     50000     # 省略可能

まあ、普通はこの記事に行き着くはずですので、あまり困ることは無いと思いますが・・・