bar_1

contents_map

2011年8月8日月曜日

起動時に文字コードの指定して xyzzy をコマンドラインから起動

概要





前回のエントリ

で、 Vimperator を使用して、Webページの入力欄のテキストを好みのエディタ (xyzzy) で、編集する方法を示した。



しかしながら、この方法だと、 xyzzy の自動判定により、ときどき意図しないエンコード(*encoding-sjis*) で、一時tmpファイルを開いてしまう現象が起きる。



そこで本エントリでは、 Vimperator の editor で xyzzy を利用する場合、強制的に文字コードを指定して一時ファイルを開くためのワークアラウンド(ラッパBATファイルの作成)を、紹介する。


調査



コマンドラインや初期設定ファイル (.xyzzy) で、 change-fileio-encoding などで指定した結果がなぜ反映されないのか、以下の3つの観点から、調査した。

(1) Vimperator の editor コマンド文字列



Vimperator の set editor で与えたコマンド文字列は:
コマンド文字列 一時ファイル名

という形式で、実行される。


つまり、何も対策しないままだと、一時ファイル名は、コマンドに対する最後のオプションとして指定されることになる。

(2) xyzzy コマンドライン・オプションの順序性



xyzzy のコマンドライン・オプションの形式は:
起動時の引数は以下の形式を受け付けます。
xyzzy [-image dump-file] [-config config-directory] [-ini ini-file] [-q|-no-init-file] (other-option|file)*
-image、-configまたは-iniを指定する場合は、それ以外のオプションより前になければなりません。
また、-qまたは-no-init-fileを指定する場合は-image、-configおよび-ini以外のオプションの先頭に
なければなりません。

されている


ここで、このコマンドライン・オプションを含む諸設定は:
初期設定ファイル→コマンドライン・オプション

の順に、実行される。また上記引用のように、コマンドライン・オプションが複数指定されている場合、左から順に、解釈される。

(3) xyzzy ファイル読み込み時の文字エンコーディングの判定



与えられたコマンドライン・オプション中、指定されたファイル名を読み込む際、 xyzzy の
ツール>共通設定>読み込みタブ

が、「自動判定」になっていたならば、自動判定が実行される。これは、ファイル名指定の前に文字コードの指定 (*default-fileio-encoding*) があろうと・なかろうと、実行される。

分析



調査の結果から:

  • vimperator は、ファイル名を、editor に設定されたコマンドの最後につけて呼び出す

  • xyzzy は、ファイルを開く時に、指定のあり・なしに関わらず再度、文字エンコーディングを自動判定している

  • よって、自動判定が正しくない場合に、文字コードの指定を期待通りに行うには、ファイル名指定よりも後で、行う必要がある

ことが判明した。




以下のようなBATファイルにより、xyzzy のファイル名の後ろに文字エンコーディングの設定 (revert-buffer *encoding-utf8n*) をするラッパを作成し、 vimperatorrc の set editor には、このラッパを指定する:


BATファイル: vimpexyzzy.bat
@echo off
rem ///////////////////////////////////////////////////////////////////
rem // vimpexyzzy.bat  - wrapper bat for 'set editor' of vimperator.
rem //   enables xyzzy to specify encoding on reading a file with revert-buffer.
rem //
rem // Aug. 2011 http://voidptr.seesaa.net
rem ///////////////////////////////////////////////////////////////////
"c:\Program Files\xyzzy\xyzzy.exe" -m html-mode ^
-e "(setq *default-fileio-encoding* *encoding-utf8n*)" ^
-e "(set-buffer-fileio-encoding *encoding-utf8n*)" ^
-e "(change-fileio-encoding *encoding-utf8n*)" ^
"%1" ^
-e "(revert-buffer *encoding-utf8n*)"
@echo on



Vimperator の初期設定ファイル: _vimperatorrc の editor の設定
set editor='C:/Program\ Files/xyzzy/vimpexyzzy.bat'




これにより、指定の文字エンコーディングでファイルが読み直されるため、所望の結果を得ることができる。

Conclusion




  • Vimperator で外部エディタを起動するとき、文字エンコーディングが意図していない SJIS (*encoding-sjis*) となってしまうことが、あった

  • xyzzy 起動時のオプションでは、ファイル名の後ろで、文字エンコーディングの設定を行う必要があることが、分かった

  • BATファイルによるコマンドのラッパを作成し、ファイル名の後ろで文字エンコーディングを指定することにより、Vimperator で、所望の文字エンコーディングで一時ファイルを編集することが可能になる


Future Works



もっとスマートなやり方はないものか……

2011年6月27日月曜日

Windows + Firefox 環境で “It's All Text!” の代わりに Vimperator を使うには?

背景

ブラウザ上のテキストエリアなどで、入力する文をエディタを使って編集を行いたい場合、Firefox では、アドオン:“It's All Text!” を利用するのが便利らしい[佐々木2009]。

しかし、自分の環境では、このアドオンを利用することが出来ずにいた。というのも、自分の Windows の ログオン(アカウント)名は、日本語を含むものだからだ; このアドオンでは、一時ファイルをアカウント名を含むフォルダに作ろうとする。しかし、海外製のアドオンということもあり、日本語を含むフォルダについては考慮されておらず、エディタ起動時にエラーとなってしまう。

しかしこの度、別のアドオン:Vimperator [MAX2011]を使用して、まさに望んでいたことができたので、ここに報告したい。

いやー、すばらしい!!

2011年5月14日土曜日

[TIPS]IME の表示が消えてしまったとき


MS-IME, Google IME に限らず、XP を使用していると:

  • 言語バーの表示が消える

  • 一部アプリケーションのみ、言語バーが消えてしまう

  • または、入力モード(IME が ON なのか OFF なのか・ON の場合、英数モードなのか・そうでないのか)の表示が更新されない

などといった現象を経験されている方は、多いと思う。



この場合、再度・言語バーを表示させるには、どうしたらいいか?


手順


1. コントロール パネル>地域と言語のオプション>
  言語タブ>詳細...ボタン
 を、押下する
 →テキスト サービスと入力言語 ウィンドウが出てくる
2.出てきたウィンドウの設定タブ>最下段ペイン(基本設定)の言語バー...ボタン
 >OKボタン
 を、押下する。
3.あとは、残ったウィンドウを、OK ボタンで閉じていく。

これで、元通りに表示されるかと思う。

2011年5月12日木曜日

XPの仮想デスクトップ・ソフト



長年、Windows XP 上の仮想デスクトップとして、Virtual Desktop for Win32 を利用させていただいていた。しかし、最近、そのバージョンを 0.941 へと上げてみたところ、いろんなウィンドウにおいて、表示がおかしくなる現象(たとえば、最小化、最大化のボタンが消えてしまう)が、発生するようになってしまった。


原因は、よくわからない。また、以前使用していたバージョン(0.912)と比較して、動作も重くなっていた(新しいバージョンでは、.NETを使用するようになったせいかもしれない)。一緒に使用しているDvorakJ のせいかな、などとも思ったけど、切り分けの解析は、時間の関係上やめた。この際、気分転換にもなるし、同じような機能を有する新しいソフトを探してみよう、と思ったのだ。


結局、SourceForge にあった VirtuaWin (4.3 unicode support)という仮想デスクトップ・ソフトをみつけて、現在運用している。すごくシンプルな仕様で、速度も申し分ない。3×2の仮想画面で使っている。


References:




2011年4月27日水曜日

Cドライブ空き容量枯渇にともなう既存 XP システムの移行の方法

■Abstract



XPで構築したシステムの移行を行った。移行の目的は、空き領域がほとんど無くなってしまったCドライブを救済することであった。また作業コストの観点から、OSの再インストール等なしに、すなわち構築してある既存のシステムを再構築することなしにそのまま移行をさせる方法を採った。


移行の実作業は、システムのベース(Cドライブ)を、旧式(Primary IDE Slave, 120 GB)から、新式(Serial ATA, 500 GB)のハードディスクへと、移し替えることであった。この手法として、KNOPPIX 6.4.4 CD日本語版の環境で dd コマンドと GParted を利用した方法を用いた。


現在はシステム移行は完了し、問題なく快適に使用できている。


■重要な注意




  • このエントリで述べられていることを実施するには、 OS やディスクに関する基本的な知識、また Linux の基本的な理解を必要とします

  • ここに述べられていることを利用してあなたが損害を被ったとしても、当方は、いかなる責任も取ることはできません。





■Background



Windows XPによるシステムで、数年、自宅PCを利用している。このところ、Cドライブ(IDE 120 GB のハードディスク(HDD))が手狭になってきていた。そこで、以前買ってあった 500 GB の Serial ATA (SATA) HDD へと、システムのマイグレーションが必要とされた(いわゆる「ハードディスクの引越し」)。


この際、せっかく
長年にわたり構築してきた環境を構築しなおすのは、馬鹿げた手間であると考えた。このため、OSの再インストールを要しない方法を模索した。すると、Linux系の特徴的(CDやDVD1枚でLinux環境を利用する)なディストリビューションである KNOPPIX を利用する方法が、いくつかあることが、分かった。
これらの KNOPPIX を利用した方法について調査したところ、partimage と
QTParted のコマンドを使用する方法が、多いように見受けられた。


しかしながら、当方が試した限りにおいて、この方法ではうまくシステム移行を行うことが出来なかった;具体的には、以下のようなメッセージが起動時に表示され、新しい HDD から起動ができなかった:
A disk read error occurred
Press Ctrl+Alt+Del to restart

Reboot and Select proper Boot device
or Insert Boot Media in selected Boot device and press a key



この現象について調査すると、当方の partimage コマンドの使い方が、まずいように見えた。さらに調査を続けたが、解決する方法は見つけることが出来なかった。


そこで、KNOPPIX 環境を利用するものの partimage を使用せずに、dd コマンドで、旧HDDのデッドコピーを新HDDに作成し、そのあとに GParted にて、パーティション・サイズ等を修正する、という手法を取った。


以下に、この手法で用いるツールと移行手順について、説明する。

■使用するツール等



特別なツールはとくに必要としない。KNOPPIXについては、本稿では、
KNOPPIX 6.4.4 CD版(日本語)を使用した。これは作業前に、作成しておくこと。

●使用するツール


◆マザー・ボードの BIOS 関連





  • - American MegaTrends, Inc. BIOSセットアップ・ユーティリティ


    • -- 用途
      新HDD(SATA)の認識、HDDの優先順位の決定、ブート・デバイスの優先順位の選択


    • 始め方
      電源投入後のPower-On Self-Test (POST) 中に、Delキーを押す。
      マザー・ボード(以下、M/B)やPCによって異なるので、説明書で確認する
      こと。


    • 使い方


      • SATA HDD の認識
        Main>Strage Configuration>ATA/IDE Configuration
        →[Enhanced]

      • HDD の優先順位
        Boot>Hard Disk Drives
        →1st ~ nth Drive で、指定する

      • ブート・デバイスの優先順位
        Boot>Boot Device Priority
        →1st ~ nth Boot Device で、指定する


◆Windows XP 関連



  • 「ディスクの管理」ユーティリティ

    • 用途
      XP が認識しているHDDの確認、パーティションに付されたドライブ文字の変更に用いる。

    • 始め方
      スタート>管理ツール>コンピュータの管理 を起動し、左端ペインのツリーから、「ディスクの管理」を選択する。

    • 使い方

  • レジストリ・エディタ regedit

    • 用途
      ドライブ文字の変更(システム、ページファイル属性を持つパーティショ
      ンの為にレジストリを修正する)

    • 始め方
      スタート>ファイル名を指定して実行...>regedit
      ※XPの場合、regedit32というのは、なさそうだ。

    • 使い方
      Ref[3]を参照のこと。

◆KNOPPIX 関連



KNOPPIX 6.4は、mountされるデバイス名の確認、旧HDDの新HDDへのコピー、ボリューム・ラベルとパーティション・サイズの修正に使う。KNOPPIX は、産業総合研究所(産総研)のサーバで配布されている「 KNOPPIX 6.4.4 CD日本語版(LCAT対応)」のバイナリを使用した。


ただ、産総研のサーバ(www.rcis.aist.go.jp/project/knoppix/)は、非常に繋がりにくい―というか、ぶっちゃけ重過ぎる。そこで、ミラーしているサイト(情報通信研究機構)や理化学研究所(理研)の別バイナリのあるFTPサーバを利用するのもひとつの手だろう。以下に、ミラーサイトとバイナリを挙げておく:

  • KNOPPIX 6.4.4 CD日本語版(LCAT対応)

    • サイト(Ref. [2]より)
      --- http://ring.nict.go.jp/archives/linux/knoppix/iso/

    • バイナリ(6.4.4 CD日本語版(LCAT対応))
      --- knoppix_v6.4.4CD_20110130-20110301.iso (699 MB ある)
      --- knoppix_v6.4.4CD_20110130-20110301.sha1


  • 理研(LCAT非対応オリジナル?)

    • サイト
      http://ftp.riken.go.jp/Linux/simosnet-livecd/knoppix/

    • バイナリ
      KNOPPIX_V6.4.4CD-2011-01-30-small-JP.iso (668 MB ある)
      KNOPPIX_V6.4.4CD-2011-01-30-small-JP.iso.md5

md5, sha1 の値は、Cygwin に入っているコマンド:md5sum, sha1sum で、チェックできる。
ああちなみに、このISOイメージを焼くのには、メディアは700 MBのブランクCD-R (maxell) 使いました。


  • ファイル・マネージャ

    • 用途
      新旧の各HDDが、どのデバイス名/dev/sd? として認識されているか、調べる。

    • 始め方
      KNOPPIX起動後、デスクトップの knoppix アイコンを、ダブルクリックする。

    • 使い方
      左端ペインの一覧のHDDアイコンをクリックすると、タブ名またはウィンドウ名に、デバイス名が表示される。

  • ターミナル・エミュレータ(Terminal emulator (LXTerminal))

    • 用途
      dd コマンドの実行をおこなうための端末。

    • 始め方
      KNOPPIX起動後の左下の Terminal emulator のアイコン(設定から、Root Shellを使ってもよい)。

    • 使い方

  • dd コマンド

    • 用途
      旧HDD のデッドコピー作成 (セクタ単位で、旧HDDからデータを読み込み、
      新HDD へと書き込みをおこなう) ため。

    • 始め方
      端末からコマンド入力し、実行する。

    • 使い方(Ref.[1])
      ターミナル・エミュレータで:
      dd -if=/dev/旧HDD -of=/dev/新HDD bs=512

      を実行
      ここで:
      -if=/dev/旧HDD は、読込み用のデバイス名。すなわち、旧HDDのこと。
      -of=/dev/新HDD は、書出し用のデバイス名。すなわち、新HDDのこと。
      bs=512 は、読み書きを 512 Bytes 単位でおこなう指定
      である。
      デバイス名は、sd~という名前になっていると思う。
      繰り返しになるが、ifとofの指定は、絶対に間違えないこと!




  • GParted (0.7.0)

    • 用途
      ストレージ・デバイスのパーティションの移動・サイズの変更、ボリューム・ラベルの修正、フォーマットなどを行うことができるアプリである。

    • 始め方
      KNOPPIXのメニュー>設定>GPartedを選択する。

    • 使い方
      始めに、表示>デバイスの情報、保留中の操作のチェックをしておくとよい。
      数値入力以外に、ドラッグ&ドロップでも、パーティションの移動・サイズ変更が可能である。また、テンキーでの数値の入力は、できないようだ。
      拡張パーティションの場合、はじめに拡張パーティション(LBAフラグのあるパーティション)を選択して、サイズを大きくしてから、その中の論理ドライブを移動するようにする。
      HDDの選択:右上のHDDアイコンをクリックすると、HDD一覧が表示されるので、選択する。
      ラベルの変更:パーティションを左クリックして選択>右クリック>ラベル
      フラグの変更:パーティションを左クリックして選択>右クリック>フラグの編集
      サイズや移動:パーティションを左クリックして選択>右クリック>リサイズ/移動


■KNOPPIX の dd と GParted を使用した移行手順



実際行った手順は、下記に述べるものより、もっと大幅に、細かな確認手順を実施している。ここには、基本的なことをまとめる。


以下の詳細の手順に述べるように、実質的な手順は、大きく分けて1~6ののステップである。

  • 手順1は、新HDDをBIOSレベルで認識させること

  • 手順2は、旧HDDでの起動確認

  • 手順3は、旧HDDから新HDDへのデッドコピー作成

  • 手順4は、ボリュームのラベルとパーティションのフラグの修正

  • 手順5は、新HDDからのXPの起動

  • 手順6は、ドライブ文字の入れ替え


●移行手順の詳細


0. 新HDDのPCへの接続
電源を落とした状態のPCに、新HDDを接続する。
1. 新HDDの認識のためのBIOS設定
1-1. 手順(0)で接続が終わったら、PCの電源をONする。
1-2. BIOSセットアップ・ユーティリティを開く。
1-3. BIOS の HDD関係の設定で、SATA HDD を認識するよう設定する。
1-4. BIOS のブート・デバイスとブート優先順位の設定で、CD/DVD Drive から
の起動を可能に設定する。
※手順2.があるため、ブートのHDD は、この時まだ変えない(旧HDD から起
動のママ)。
1-5. 設定をセーブして、 BIOS セットアップ・ユーティリティを終了する。
2. 旧HDD で旧システムの起動確認
2-1. 手順1-5からひきつづき、旧HDDで今まで使用していた旧システム(XP)の起
動が、できることを確認する。
2-2. ログオンする。
2-3. ディスクの管理で、新HDDがディスクのリストに表示されることを、確認
する。
※ウィンドウを延ばさないと見えないかも
2-4. CD/DVD Drive に、KNOPPIX のCDを挿入して、電源OFFする
3. 旧HDDのデッドコピー作成
3-1. 電源ONし、USB DVD Multi Drive から、KNOPPIX を起動する。
3-2. ファイル・マネージャで、旧HDD、新HDDのデバイス名を確認する。
3-3. 左下のメニューからコンソールを立ち上げて、ddコマンド
で、旧HDDのデッドコピーを作成する
※デバイス名は、**絶対に**間違えないこと!!くれぐれも、逆にして旧
HDDを消してしまうことなど無いようにしてください。
※この処理は、結構時間(数時間)かかります。
4. GPartedでパーティションのフラグとラベルの設定
4-1. 旧HDD で、パーティション・フラグが、 boot となっているパーティショ
ンの bootチェックをはずす。
4-2. 新HDDで、旧HDDでのパーティション・フラグがbootとなっているパーテ
ィションに相当するパーティションのbootチェックを、チェックする。
4-3. 新HDD の各パーティションのラベルを、変更する(デッドコピーしたまま
だと、旧HDD と同じでまぎらわしいため)。
4-5. KNOPPIX をシャットダウンし、PCの電源をOFF。
5. 新HDDからのXPの起動
5-1. PCの電源ONし、BIOSセットアップ・ユーティリティで、新HDDからブート
するように設定する。
5-2. 設定をセーブして、BIOSセットアップ・ユーティリティを終了する。
→XPが起動する
6.  ドライブ文字の旧HDD・新HDDでの入れ替え
6-1. XP起動後ログオンし、ディスクの管理を開く
6-2. 新HDD の非システム・パーティションを使われていないドライブ文字に変
える(但し、変更前のドライブ文字を控えておく)
6-3. XP を再起動
6-3. 旧HDD の非システム・パーティションのドライブ文字を、手順6-2のドラ
イブ文字に変える(但し、変更前のドライブ文字を控えておく)
6-4. 新HDD の非システム・パーティションのドライブ文字を、手順6-3の変更
前のドライブ文字に変える
6-5. XP を再起動
6-6. 同じようにして、システム・パーティションのドライブ文字も入れ替える


KNOPPIX 上の作業が、移行作業の主な部分を占める。XPでおこなう移行作業は、ドライブ文字の変更である。

■Conclusion




  • 産総研の配布するKNOPPIX 6.4.4 CD日本語版(LCAT対応)のISOイメージを利用して、IDE HDD から SATA HDDへと、XP システムの移行を行った

  • partimage を利用した移行は、OS のブートに至らなかったため、dd, GParted を利用した方法とし、その手順を示した


■Future Works



本当はスクリーンショットなどを豊富に使いたかったのだけど、KNOPPIXでの取り方がわからなかった。gnome-screenshot なるアプリが、焼いたCDには、見当たらなかった。

新しいKNOPPIXの版が出るたびに、システムをCD/DVDに焼くのは、CD/DVDのメディアが無駄である。現在、大容量(GBオーバ)のUSBフラッシュ・メモリが安価に出回っているので、これを利用しない手はないだろう。

この場合、以下が参考になるかも知れない:
mk-mode BLOG, “KnoppixをUSBブート!”, 2010/1/6, http://www.mk-mode.com/wordpress/?p=2644
(ただし、メディアがUSBのストレージなので、CD/DVDのようにISOイメージを焼くだけ、ではない。)

■References




  • [1] dd(1), man page

  • [2] susaki, “[debian-users:55003] 【リリース】KNOPPIX 6.4.4 DVD&CD 日
    本語版 (LCAT対応)”,
    http://permalink.gmane.org/gmane.linux.debian.jp.user/20206

  • [3] WINFAQ, “w2k/XP:ディスク管理 - ブートドライブのドライブレターを変
    更できないのですが”, http://homepage2.nifty.com/winfaq/c/ntdisk.html#912

  • [4] KNOPPIX-JP FAQ, http://www.geocities.co.jp/SiliconValley-Sunnyvale/9821/

2011年4月1日金曜日

[読書]パターン、Wiki、XP

作業中Contents



  • ◆Links ……………この書籍中の全URLを、一覧にまとめた。

  • ◆Principles ………

  • ◆History …………


◆Links




2011年3月24日木曜日

[Excel][VBA]COUNTIF関数を複数条件で使うには?

■背景と問題点


以前のエントリ ([EXCEL][VBA] COUNTIF関数で複数条件を扱うには?(OR条件編), 2008.)で、COUNTIF関数によるORで結合された複数条件を扱う方法を紹介した。しかし、この方法だと場合によっては以下のような不具合がある:
  • 条件を満たすセルの数を、二重にカウントしてしまう
  • AND条件については触れていない
また、この問題をググってみても、どうもこれといって、分かりやすい解法が載っているサイトを見つけることはできない(2011年3月現在); 多くのサイトでは、SUMPRODUCT関数、COUNTIFS関数(Excel 2007以降)を使った方法が紹介されているが、この方法では、AND条件しか、指定することができない。
上述の以前のエントリは、本ブログに挙げて以来、継続的にアクセスがある。 COUNTIF関数で複数条件を扱うのに困っている人は、多そうだ。
この問題は、根本的には、COUNTIF関数の第2の引数である検索条件の記述の不自由さに由来するものと、考える。なぜならば(ヘルプ・ドキュメントによれば、検索条件には「式」を書くことが出来ることになっているが、実際には)、検索条件には、「TRUEもしくはFALSEを返す、2項限定の(論理)式」しか、指定 することが出来ないからだ。
そこで、上記の問題点を踏まえ、今回のエントリでは
  • 以前のエントリのように、二重にカウントすることはない
  • ブーリアン演算の指定、すなわち:
    • 条件指定は、AND条件・OR条件どちらも同時に使用可能
    • 条件項目は、いくつでも可能
  • VBAマクロは使用せず、既存の関数のみの単純な方法
であるような、一般化したCOUNTIF関数で複数条件を扱う方法を、紹介する。

2011年3月22日火曜日

[Ruby]配列とハッシュ

インデックス、値、変換配列の値(要素)から、そのインデックスを得る方法を探していたのだが、当初、見つからなかった。
このため、配列を、一旦、ハッシュに変換してから、処理しようと試みた。しかし、Rubyでは、配列でもハッシュでも、要素から(インデックス|キー)を引くのは、同じ方法(indexメソッド)であることが分かったorz

以下は、配列の場合である。

irb(main):001:0> ["foo", "bar", "car", "cdr"].index("car")
=> 2
irb(main):002:0> ["foo", "bar", "car", "cdr"][2]
=> "car"

以下は、ハッシュの場合である。
irb(main):006:0> {1=>"foo", 2=>"bar", 3=>"car", 4=>"cdr"}.index("bar")
=> 2
irb(main):008:0> {1=>"foo", 2=>"bar", 3=>"car", 4=>"cdr"}[2]
=> "bar"

配列からハッシュを生成する(1)ここで、仮に配列からハッシュに変換しようとした場合、どのようにしたらよいだろうか?ここで、変換の際、配列のインデックスは、ハッシュにしたときにキーとなるものとする。
上記を考えたとき、以下のようなトピックを利用すれば、変換することができる:
  • Array http://www.ruby-lang.org/ja/man/html/Array.html
    配列クラス
    • Array#transpose
      配列の配列を行列とみなし、行と列の転置をおこなうインスタンス・メソッド
    • Array#flatten
      階層化された配列から階層を取り払い、一次(インデックスが1種類)の配列にするインスタンス・メソッド
  • Hash
    ハッシュ・クラス
    • Hash.[]
      与えられたオブジェクトで新しいハッシュを生成するクラス・メソッド
  • *[] (多重代入)
    複数の値を、それらに対応する複数の変数に、代入する仕組み

配列からハッシュを生成する(2)
(1) 変換前の配列を元に、二つの配列を用意する; ひとつは、変換前の配列のインデックスを要素とする配列 a、もうひとつは、変換前の配列のを要素とする配列 b である。すなわち:
a = [0, 1, 2, ..., n-1]
b = [e_0, e_1, e_2, ..., e_(n-1)]
n: aのサイズ=bのサイズ
e_i: 変換前の配列の各要素
(2) 配列aの要素a_iとbの要素b_iが、交互に並ぶような配列abを作成する; つまり、
ab = [a_0, b_0, a_1, b_1, ..., a_(n-1), b_(n-1)]
n: aのサイズ=bのサイズ
である。
この処理を行うためには、Array#transpose と Array#flatten を、利用する。
(3) ハッシュを生成する。このとき多重代入によって、配列abをハッシュ生成メソッドに与える。

ソース・コードは以下となる。戯れに、gist.github.comにも格納してみた
(https://gist.github.com/876272 )。
#file: to_h.rb
#conversion method from Array to Hash.
#
#
class Array
def idxarr( x )
Array.new(x) {|i| i}
end
def to_h
Hash[ *[idxarr(self.size), self].transpose.flatten ]
end
end
####endof file: to_h.rb

実行例は以下である:
irb(main):002:0> require 'to_h.rb'
=> true
irb(main):003:0> ['foo', 'bar', 'car', 'cdr'].to_h
=> {0=>"foo", 1=>"bar", 2=>"car", 3=>"cdr"}

Conclusion
- 配列でも、indexメソッドで、値からインデックスを求めることが出来る
- 配列からハッシュへの変換メソッドを実装した
Future Works
- 自分の環境で、gisty で投稿できないので、原因を解明すること
References
- Dave Thomas, et. al.; “プログラミングRuby”, 第2版, 言語編; オーム社
- Dave Thomas, et. al.; “プログラミングRuby”, 第2版, ライブラリ編; オーム社
- buzword, “配列からハッシュを作成する”, http://www.rubylife.jp/ini/hash_class/index7.html

2011年3月21日月曜日

[Cygwin][Ruby]ファイル・システム OR gemの振る舞い(環境?)がおかしくなった?

正確には、当該現象は今は発生していない;原因はわからないが、LoadErrorを発生することなく元通りに実行されるようになった。

しかし、以前にも(gistyとは別件で)、Cygwin上で同様のふるまい―作業したファイルが元に(?)戻ってしまったように見える現象―を、経験している。よって、ここに忘備として記録を残しておく。

現象以前構築したgistyの環境が、おかしくなっていることに気づいた。具体的な症状は:
  • gistyコマンドを実行すると、LoadErrorが発生
  • LoadErrorの内容は、no such file to load -- rr 、つまりrrというファイルが、gem_original_requireメソッドから見つからない

その他の現象gem listすると、パッケージは表示されるものの、gem which パッケージ名 を実行すると:
ERROR: Can't find ruby library file or shared library test-unit
という結果になるものがいくつか存在する。この現象は、回復していない。
環境
$ uname -srvmpio
CYGWIN_NT-5.1 1.7.7(0.230/5/3) 2010-08-31 09:58 i686 unknown unknown Cygwin
$ ruby --version
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]
$ gem --version
1.3.7
$ git --version
git version 1.7.2.3
$ gisty about
mm mm
mm
mmmmmm mmmm mmmmm mmmmmm mm mm
mm mm mm mm mm mm mm
mm mm mm mmmm mm mm mm
mmmmmm mm mm mm mmmmm
mm mmmmmm mmmmm mmm mm
mmmmm mmmm
version: 0.0.14
url: http://github.com/swdyh/gisty/tree/master