2008/12/23

もしもプログラミング言語が宗教だったら

イシカワさんが好きそうなネタなので、旅に出ている間に記事にしておきましょうかね。

もしもプログラミング言語が宗教だったら……(全訳版)

Cがユダヤ教で、Javaがキリスト教原理主義とか。さすがに物議をかもし出すだけあって例えが絶妙ですね。

「PHP」はカフェテリア・キリスト教で、「COBOL」は古代の異教信仰…。「C#」はモルモン教だろう――見かけはJava(=キリスト教原理主義)と同じように見えるが、よくよく見ればそれは単独の会社(しかもそれは多くの Java信者が悪だと信じている会社である。※訳注:マイクロソフト)によって操られており、多くの神学的概念が極めて異なっていることがわかる。…なるほど。ま、春から私はモルモン教徒になるわけですね(予定ですが)。

極めつけは「Visual Basic」は悪魔崇拝。…ぎゃぽん!!正直って、その表現の巧さを分かっちゃうところが悲しいですが。…私、魂売ってますから。ふん!

2008/12/18

Bush's Boot Camp

このニュースは凄いな…、と思っていたら。このニュースのパロディ、靴投げゲームが各国版であれこれでているみたいですね。

マトリックス映像がツボだったので、Wiredあたりのまとめ記事をご紹介しておきましょうかね。→ブッシュ靴投げ事件、ゲームやアニメで大人気:「マトリックス・ブッシュ」も


なんというか、ゲームのストーリーは靴を避けるというストーリーのようですが。靴が当たってもスカッとするところが良いのではないでしょうか。

…それにしても、よくブッシュもあのスピードで咄嗟に避けましたよね。二足も。フィットネスばかりやっているだけのことはありますね…。

2008/12/02

サーバーお買い物

新しいサーバーをリースするにあたって、Win2008ServerでHyperVでサーバーを仮想化して使うぞ!っと思っていたわけですが、情報システム部のヒトに釘をさされました。イテッ!

スタンドアローンな私たちとしては、Webで使うわけでもないし、24時間稼動する必要もないんですが…(そして別にブレードサーバにする必要もなく、昔ながらのタワー型くらいで別にいい)。やたらとファイル数は多く(FAT32とかだと軽くファイル数の制限を越えてしまいます…)、荒っぽい使い方もするわけで。

VMWareのESXに、Win2000Server、Win2003Server、Win2008Server、とそれぞれライセンスを買って、入れた方がいいんじゃないですか?と言われました。彼らの考え方では、運用するのはゲストOSなんだから、ホストOSで使わないものは極力殺すべき、Win2008Serverだと、ホストOSをカスタマイズ(つまり使わない機能を殺すという発想なんでしょう)するのが、大変ですよ、ということらしい。さらに言うならば、私たちの荒っぽい使い方を見透かされて、仮想化より、サーバー2台買った方がいいんじゃないですか、と言われたり。むむむ。

Vista×Office2003もわりとイタイので、Win2008Server×Office2003も、そのまま現行を移植、というわけにはいかないんじゃないですか、とも。えーっ、そーなの?って感じで、無知もいいところでした。

しかしサーバーの選定、という意味で、今日の授業は大変勉強になりました。面白いなぁ、あぁ素直にそう考えればいいのか、などなど。でもこのテの決定、って、思い切りの良さと決断力が必要ですね。

2008/11/28

疑似個人情報

テストデータって作るのが面倒くさいですよね。

なんだかんだで漢字姓、名にフリガナ姓、名。生年月日とか性別、郵便番号、住所に電話番号などなどなど…。気が向くままに乱数とか発生させて、名前が生成されるという微妙なツールとかは遊びで作ったことはありますが…(今考えると、色々ロジックが浮かんでむずむずするー)。疑似個人情報を販売する会社とかもあるようですね。

■疑似個人情報、はじめました。

11/25から3,000件までは1IPにつきフリーで1DL可になったようで、巷で噂になっていました。こちらの特色は統計データを基に、統計的に正しく分布させた、とても現実味のある、ニセモノの個人情報ということのようですね。

うーん、現実味のあるニセデータもいいけれど、別にもうちょっとテキトーでいいかなぁ、と思っていたところ、先輩からこんなサイトも教えてもらいました。

■なんちゃって個人情報

出力形式も選べるし、年齢層の絞込み済みとかもできちゃって、なんかこっちもかなり使い勝手いいカモ。(*´艸`*)

memo→「疑似個人情報、はじめました。」の方の、「疑似個人情報を、ダミーデータとして使う」のページの発想は、ちょっと新鮮でした。「木の葉を隠すなら、森の中」って…。個人情報ネタでそれをやるか!?みたいな…。アリゴリズムとか面倒くさいなぁ…、とは思うものの、アイディアとして、悪くないかもしれませんね。

2008/11/23

図書館のネット予約システム

図書館のネット予約が~、という話が出てきたのでふんふん、と思って、ちょっぴり調査。

それにしても、都内の図書館は平日は20時くらいまで開館していて(豊島区なんて22時までとかもあるし)、それがフツーだと思っていたわけですが。

神奈川県エリアとかになるとそうでもないんですね。午後17時とか…。平日は小学生くらいしかいけませんね。まー図書館スタッフの労働勤務を考えると、17時まで開館して、後始末して18時に帰宅…、というのがノーマルなのかもしれませんけど。

2008/11/22

EmEditor Professional8

EmEditorの8の正式版がリリースされたので、7→8へ入れなおし(EmEditor Professional 4 ~ 7 から EmEditor Professional 8 へのアップグレードは無料デス)。

7をアンインストールするときに、[次のバージョンアップするつもりですか?]といった内容の分岐のダイアログがでてくるので、ここで「はい」を選んでおくと、設定の移行がラクチンですね。7のアンインストール後、8のインストールを行うと素直に設定も移行。


VS.NETユーザーとしては、VSのソリューションを開けちゃう[プロジェクト]のプラグインはちょっとしたオドロキかも!今までもちょっとした途中段階の修正は、エディタでちゃちゃっと書き直したりもしていましたが…。ソリューションを開いちゃうとはねぇ。これはうまいアイディァだなぁ、と感心しました。

マクロ好きとしては、いろいろオブジェクト、プロパティ、メソッドが増えたあたりも楽しみで気になります。

さらに!!8ではバイナリ編集もできるようになったので、もうバイナリエディタを入れる必要もありませんね。

2008/11/21

ブラッディ・マンデイ

ブラッディ・マンデイ」を観ていますか。

原作は漫画のようですが、ドラマで放映されている初回をたまたまみて、なんとなくずるずる観続けています。だって、主人公がハッカーだし。頻繁にUSBブートでLinuxのシーンは出てくるわ、python使いだし、観始めちゃったら、なんとなく目が釘付け。

ネットワーク関係は疎いので、「?」も沢山ですが、ここらあたり(「ブラッディ・マンデイ」を考察する)で復習しながら楽しんでおります。明日の放映ではどれくらい見所があるでしょうかね。

2008/11/11

LiveCDってベンリ

今日はバイナリディですね(1111だから)。


HPのノートを譲り受けたので、クリーンに入れなおそうと思って、工場出荷状態に戻す…。CドライブとDドライブに分けたかったのに、問答無用でCドライブとリカバリのドライブに分かれちまったよ…。

OSはXPproのまま使いたいし、でもXPのメディアはなくリカバリHDしかついていないし、頼みのPartitionMagicはないと言われるし…。こうなったら困ったときのPuppyのLiveCDヨ!──正確には、Puppy4.0日本語版に入っているGpartedでパーティションを分けてやろうという目論見。むしろこのテの作業ってLiveCDの方が、XPにPartitionMagicをインストして作業するより安全なんじゃない?──とウキウキしていたら。

LiveCDを突っ込むとサクサクとPuppyは動いてくれたところまでは良かったものの、なにやらCドライブの調子が悪く、ドライブのマウントがキレイにできないのだ(警告つきで、ムリムリなマウント)。Gpartedでのリサイズも「!(警告)」つきで、マッタク、リサイズできない。警告の文言を読むと、ドライブの何かが壊れて入るらしいようなことを言っているのだが、出荷状態に戻したばかりでナニが壊れているのかだいぶ謎だ…。しかしそこは動物的な条件反射で「とりあえずチェックディスク?」と思い立ち、気長にレッツトライ。

  1. XPで再起動。
  2. とりあえずXPでのCHKDSKをかけてみる。
  3. チェックディスク終了後、再びLiveCD起動。
  4. Gpartedを起動してみたら、警告表示がなくなっていた!

というわけで、いつも通り、ReSize、New、NTFSフォーマット、Applyてな感じで無事、CドライブとDドライブができあがりましたとさ。めでたし。

2008/09/12

隠しファイルThumbs.db

WinXPにて、フォルダのプロパティで確認した数と、実際のファイル数が不一致。

フォルダオプションで[すべてのファイルとフォルダを表示する]のオプションを選択しているのに、何が隠れているのかなー?、と思ってフォルダオプションを再確認していたら、もうひとつ怪しいオプションがあった。

[保護されたオペレーティング システム ファイルを表示しない(推奨)]

こいつのチェックを外すと、現れたのはThumbs.db。エクスプローラの表示形式を[縮小版]にしたときに出来るサムネイルファイルだ。キャッシュファイルであるが故に、2度目のプレビューのときに高速化をはかってくれるわけだけれども。──納品するときに、ウッカリこんなファイルも一緒に納品…、なんてことになるとマズイ(納品相手はWinとも限らないし…。バッチ処理なんかでフォルダ指定でぶんぶん回すとき、ファイル数が合わなくなる、なんてことももしかするとあるかもしれません。…拡張子のフィルタはかけることの方が多いような気もしますが)。スピードは諦めて、そもそもThumbs.dbを生成しない設定に変更した方が安全だな、というわけで。

  • [すべてのファイルとフォルダを表示する] チェック
  • [縮小版をキャッシュしない] チェック
  • [保護されたオペレーティング システム ファイルを表示しない(推奨)] チェックなし

という設定でしばらくいくことにしました。

memo→「Thumbs.db」をググるとこの辺のことはつらつらひっかかってきますが、@ITあたりの記事が詳しいです。

2008/09/04

VM in VM / POWERS OF TEN

小飼弾さんのところで、VM in VMの記事を読みました。

OS X の VMWare上の、 Windows XPに入れた Virtual Box 上で Ubuntu を走らせた図があり、ちょっとこれにはウットリ。

合わせ鏡で、鏡の中に鏡が映りこみ、その中にまた鏡があって…、の不思議さに近いイメージですよね(もっとも合わせ鏡は有限みたいですが)。

宇宙の外側にはまた宇宙があって、その外側には…、とか。ダレダーレみたいな感じで、ミクロの世界にもやっぱり「世界」があって、その「世界」をまた「宇宙」にしている「世界」があって…とか。

昔からとりとめもなく、そういうことをよく想像していたので、つい、VM in VMのキャプチャ画像にウットリ、仮想化ってこういうこともできちゃうんだ…、とココロをざわつかせていたわけです。すると、そんな私の様子をみていた知人が「POWERS OF TEN」という映像を紹介してくれました。タイムリーすぎて、なんだか個人的にめちゃめちゃクリーンヒット。ステキすぎるよ、この映像。(*´艸`*)

Chrome雑感

Chrome、やっぱりなんだか面白いですねぇ…、このブラウザ。じわじわとその面白さを感じてきました。

Ω Ω Ω

ChromeのUIを見た瞬間、まず「表示領域が広い!」と思ったわけですが、これにはブラウザ基盤な思惑、伏線を感じますよね。Webサイトベースで作業をするなら、表示領域こそが大きい方がいいに決まっていますから。Googleのウェブサービスを思い浮かべた場合、機能はすべてブラウザの表示領域の中にあり、ブラウザ自身の機能はそこまでゴテゴテとは不要──そういう割り切りをこのレイアウトからは感じました。

それに[プロセスがタブごとに独立]×[アプリケーションのショートカット作成]あたりは、Webサイト← →デスクトップの乗り入れっぽい感じ、ですかね???

[アプリケーションのショートカット作成]からChromeを起動すると、まるでデストップアプリであるかのようにアドレスバーを見せないレイアウトからもその辺の意図を感じますし、それに加えて[プロセスがタブごとに独立]していることも考え合わせると、殆どデスクトップアプリの座を狙っている…、としか言いようがないような感じですよね。そもそもGoogle Gearsとも統合されているみたいですし…。なんだか準備万端?このところAIRやJavaFXがブラウザから飛び出してきたわけですが、やっぱりそういう流れを思いっきり意識しているんだなぁ、と思いました。

ちなみにChromeはV8 JavaScriptあたりが目玉なんだろうと思うわけですが、これは今後もGoogleはしばらくは今みたいな感じでJavaScript大活躍な路線でいく、ということなんでしょうね。

2008/08/30

Puppy4.00.3日本語版、再起動後のネットワーク接続の維持

再起動する度にネットワーク接続の手続きをしなければならなかったのですが。一応の解決をみました。

うちのこゐぬの場合、無線LAN×WPE接続という環境だったのですが、起動するときに次の呪文が走ればOK…、

#this file called from rc.local0
#you can edit this file
#When firewall is installed, will append lines to this file...
modprobe evdev
rm /etc/dhcpc/dhcpcd-eth0.pid 2
rm /etc/dhcpc/dhcpcd-eth0.cache
rm /etc/dhcpc/dhcpcd-eth0.info

ifconfig eth0 up
iwconfig eth0 essid "ESSID名" key s:WEPのキー
dhcpc eth0

fi

▲上記を[etc/rc.d/rc.local]というファイルに書き込み。

再起動してみると、無事、rc.localが走って、起動と同時にネットワークへつながりました。参考にしたのはフォーラムのこの辺の記事とか。

まぁもともとコマンドをうってネットワークに接続していたので、あれをここに書けばいいのか、という感じで意外と簡単でした。

本日のひっかかり。
  1. 多少のひっかかりとしては最後の「fi」。なんなのか解せません。fineとか終わりとか???これは書かないと終わらない、とかそういう意味なのでしょうかね?Linuxのコマンドのリファレンスを見ても見つけられませんでした…。
  2. 起動画面で[setting up network interface]をbackgroundでやっている風情の表示がでた後に、このrc.localが走るところもひっかかってはいます。backgroundでなにがしかやったあとに改めてrc.localで接続しなおし…、というのは二重手間に思えて美しくないような気がするのですが、どうなんでしょう。[setting up network interface]は不要なんじゃ?と思うわけです。ここでなにをやっているのでしょうか…。

2008/08/29

Puppy4.00.3日本語版、ブートのあとさき

Linux Swapを設定するのを忘れたなぁと思って、LiveCDからGpartedを起動して気が付きました。よくみるとそれぞれのパーティーションのヨコにフラグがたっているではありませんか。

  • /dev/hda2 (Winが入っている) boot,lba
  • /dev/hda3 (Puppyが入っている) フラグなし

これはもしや…と思い

  • /dev/hda2 (Winが入っている) lba
  • /dev/hda3 (Puppyが入っている) boot

とフラグを立て直したら、フロッピーなしでも無事hda3にインストールしたGRUBが動き出してOS選択画面が出てくるようになりました。

その他の課題

  1. LinuxSwap領域を作ったものの、 [swapon -a]とかやると「Device or resource busy」というエラー表示。…使われてない?
  2. 再起動する度にネットワーク接続やりなおし。…HDDにインストールしたのになんでだヲイ。
  3. で、Gpartedで見かけたlbaってナニ?
追記→LinuxSwapについて。

Puppyの場合、お使いのパソコンにLinuxSwapパーティションがあるとパピーはそのSwapパーティションを利用します。というのが正解でした。つまりGpartedなりでLinuxSwapパーティションを作成すれば、なーんにもしなくてもちゃんと認識してくれる。コマンドは

# cat /proc/swaps

とやると、どのパーティションがスワップに当てられているか表示してくれました。etc/fstabとかには記述しなくても大丈夫みたいで、swaponとかのコマンドも少々、世界が違っていたみたいです…。

自動で認識してくれるのはカンタンですけど、一長一短ですね。LiveCDのPuppyを起動するとやっぱりLiuxSwapを自動で認識してくれて便利は便利…、ですが同時にそれはLiveCD版PuppyのGpartedなどからは既存のLinuxSwapのリサイズとかはできないということです。なにしろLiveCD版PuppyはもうそのLinuxSwapを問答無用で使用中ですから。とりあえず、[Swapoff -a]のコマンドでは離してくれないようです。他に切り離すテクニックはありそうですが、いまのところ不明です。

2008/08/28

Puppy4.00.3日本語版、インストール完了

Puppy4.00.3日本語版、無事SHARP PC-BJ140にインストール完了しました。Win98ESEとの共存です。

ネットワーク接続も無事完了。「WLI-PCM-L11GP」「Puppy」でぐぐってみれば、情報がでてくるわけで…。「WLI-PCM-L11GP」のPCカードのモジュールは「orinoco_cs 」を利用すればいいだけみたいでした。

ネットワーク接続の手順としては

  1. [ネットワークウィザート]-[etho0]-[ワイヤレス]で、[WEP]をクリック
  2. ProfileName、ESSID、(WEPの)Keyを設定したのち、一旦、[SAVE]、[Use This Profile]。
  3. [自動DHCP]をクリック

すれば、うちの環境の場合、本来OKみたいです。

が、GUIの設定画面からだと、どーも設定各種の認識がうまくいかないらしく、端末からもコマンドラインで呪文を書いた後、GUI設定に改めてトライした方がいいみたいです(WEPキーとかはコマンドでもやっていることは一緒だと思うんですけれど。[自動DHCP]の画面に行きつくための画面遷移の都合上、同じことをGUIでも改めてやるハメになるような…)。

呪文はこんな感じ。

# ifconfig eth0 up
# iwconfig eth0 essid "ESSID名" key s:WEPキーなどの文字列

ちなみにPuppyのHDDのインストール自体は結構簡単でした。LiveCDの段階から、PC-BJ140はXorgですんなりことが運んでいましたしね。

PuppyのLiveCDに入っている[Gparted]で、パーテッションを作成したあと(ここで女々しくWin98SEをとっておいたので、デュアルブートな状況になったわけです…)、ユニバーサルインストーラーでがんがん行けばいいだけだったので。で、ウィザートをみながら、ぽこぽこやっていたら、意図せず、フロッピーからGRUBでの起動…、みたいな状況になりました。

わかりやすいといえばわかりやすいんですが。GRUB…、ちょっと勉強する必要がありそうです。

2008/08/26

データ変換速度比較

VB.NET/.NetFramwork2で型変換の速度差、特色について気になりだしたので、実験してみました。

興味があった変換は、普段よく使う

  • Object→Int32への変換
  • String→Int32への変換

です。

実験したものはCtype、CInt、DirectCast、Convert.ToInt32、Int32.Parse、 Int32.TryParse。

実験結果としてはこんな感じです。【 】の中の数値はObjectなりStringなりのmyData変数を、それぞれのメソッドなりでの変換したものです。Int32.TryParseで【 0】となっているのは、変換できなかったということですね。

実験結果

(速度の早い順に並び替え)
Dim my_Data As Object = 12345
DirectCast :        【     12345】00:00:00.0004363
CInt :              【     12345】00:00:00.0023329 'CtypeとCInt、Convert.ToInt32は順位が入れ替わるときがあります。
CType :             【     12345】00:00:00.0023815
Convert.ToInt32 :   【     12345】00:00:00.0030900
Int32.Parse :       【     12345】00:00:00.0468925 'Int32.ParseとInt32.TryParseは順位が入れ替わるときがあります。
Int32.TryParse :    【     12345】00:00:00.0475714


Dim my_Data As Object = 12345.5
CInt :              【     12346】00:00:00.0039555
CType :             【     12346】00:00:00.0040038
Convert.ToInt32 :   【     12346】00:00:00.0052587
Int32.TryParse :    【         0】00:00:00.0631435


Dim my_Data As String = "12345"
Int32.Parse :       【     12345】00:00:00.0198393
Int32.TryParse :    【     12345】00:00:00.0206115
Convert.ToInt32 :   【     12345】00:00:00.0214960
CType :             【     12345】00:00:01.7970309
CInt :              【     12345】00:00:01.7990923


Dim my_Data As String = "12345.5"
Int32.TryParse :    【         0】00:00:00.0198050
CInt :              【     12346】00:00:01.8433437
CType :             【     12346】00:00:01.8474300

所感としては、Object型のときは、DirectCastを使うのが一番高速(但しDirectCastは丸め処理などは行わず、Int32に変換するのに小数などを引数に渡すとエラーを吐きます)。String型のときは、Int32.Parseが一番高速…、というところでしょうかね。現実問題としてはInt32.TryParseも、使い勝手がよさそうです。

サンプルソース

▲TextBox1に結果が出るわけです…。

※Int32.Parseの引数はもともとString型なので、Option StrictはOffにしないと走りません。

Imports System.Diagnostics


Public Class Form1
    Private Sub Button1_Click(ByVal sender As Object, _
                              ByVal e As System.EventArgs) _
                              Handles Button1.Click

        Dim sw As New Stopwatch
        Dim sb_Data As New System.Text.StringBuilder
        Dim bl_result As Boolean
        Dim my_Dict As New Dictionary(Of String, String)


        Dim my_Data As Object = 12345  '#---ここをあれこれ差し替えました。
        '                                   少数の値をセットしたりして
        '                                   エラーができるときは、
        '                                   型変換部分も
        '                                   コメントアウトします。
        Dim int_Data As Int32

        '----------------------------------
        sw.Reset()
        sw.Start()
        For i As Int32 = 0 To 100000
            int_Data = CType(my_Data, Int32)
        Next
        sw.Stop()
        my_Dict.Add("CType" & vbTab _
                    & int_Data.ToString, _
                    sw.Elapsed.ToString)
        '----------------------------------
        sw.Reset()
        sw.Start()
        For i As Int32 = 0 To 100000
            int_Data = CInt(my_Data)
        Next
        sw.Stop()
        my_Dict.Add("CInt" & vbTab _
                    & int_Data.ToString, _
                    sw.Elapsed.ToString)
        '----------------------------------
        sw.Reset()
        sw.Start()
        For i As Int32 = 0 To 100000
            int_Data = DirectCast(my_Data, Int32)
        Next
        sw.Stop()
        my_Dict.Add("DirectCast" & vbTab _
                    & int_Data.ToString, _
                    sw.Elapsed.ToString)
        '----------------------------------
        sw.Reset()
        sw.Start()
        For i As Int32 = 0 To 100000
            int_Data = Convert.ToInt32(my_Data)
        Next
        sw.Stop()
        my_Dict.Add("Convert.ToInt32" & vbTab _
                    & int_Data.ToString, _
                    sw.Elapsed.ToString)
        '----------------------------------
        sw.Reset()
        sw.Start()
        For i As Int32 = 0 To 100000
            int_Data = Int32.Parse(my_Data)
        Next
        sw.Stop()
        my_Dict.Add("Int32.Parse" & vbTab _
                    & int_Data.ToString, _
                    sw.Elapsed.ToString)
        '----------------------------------
        sw.Reset()
        sw.Start()
        For i As Int32 = 0 To 100000
            bl_result = Int32.TryParse(my_Data, _
                                       int_Data)
        Next
        sw.Stop()
        my_Dict.Add("Int32.TryParse" & vbTab _
                    & int_Data.ToString, _
                    sw.Elapsed.ToString)
        '----------------------------------

        Dim sorted As List(Of KeyValuePair(Of String, String)) _
                = sortByValue(my_Dict)

        sorted.Reverse()

        For Each kvp As KeyValuePair(Of String, String) In sorted

            Dim str_SPL() As String _
                = kvp.Key.Split(vbTab.ToCharArray)
            Dim str_Num As String _
            = Strings.StrDup(10, " ") & str_SPL(1)

            sb_Data.Append((str_SPL(0) & " :" _
              & Strings.StrDup(20, " ")).Substring(0, 20) _
              & "【" & (str_Num).Substring(str_Num.Length - 10, 10) & "】" _
              & kvp.Value & vbCrLf)

        Next

        Me.TextBox1.Text = sb_Data.ToString
        sb_Data.Remove(0, sb_Data.Length)
        sb_Data = Nothing

    End Sub


    Shared Function hikaku(Of TKey, TValue As IComparable(Of TValue))( _
      ByVal kvp1 As KeyValuePair(Of TKey, TValue), _
      ByVal kvp2 As KeyValuePair(Of TKey, TValue)) As Integer

        Return kvp2.Value.CompareTo(kvp1.Value)
    End Function


    Shared Function sortByValue(Of TKey, TValue As IComparable(Of TValue))( _
      ByVal dict As Dictionary(Of TKey, TValue)) _
      As List(Of KeyValuePair(Of TKey, TValue))

        Dim list As New List(Of KeyValuePair(Of TKey, TValue))(dict)

        'Valueの大きい順にソート
        list.Sort(AddressOf hikaku)
        Return list
    End Function
End Class

2008/08/24

Puppy4.00.3日本語版 ワイヤレスな悩み

Puppy4.00.3の日本語版のLive CDを作って、旧マシン(SHARP PC-BJ140。OSはWin98SE、メモリは119MB?本音を言えば、gOS3 Gadgetsとか入れてみたかったわけですが、ロースペックすぎて入れられなかったっス。Puppyでさえ動作条件は128MB、推奨256Bなので危うい…。PC-BJ140は増設しても最大192MBだもんなぁ。今更このマシンにメモリを積んでも推奨にどーせ届かないし…)に入れてやろうと思ったわけですが。Live CDでPuppyを起動するところまではうまくいったものの、ネットワークにつながらない。

手元にあるPC-BJ140は、PCカードつなぎの無線LAN。モジュールのロード、など試すも、全然ダメ。ちなみにメインマシン(こちらはUSBの無線LAN)でCDブート起動して試すも、こちらもネットワーク接続で挫折。無線LAN接続は敷居が高いですな。

あとはndiswrapperを試みるか…?…ああああ、infがない。○| ̄|_


Windows vs. Puppy Linux。Win、Linux、OSインストールする人は、多分笑います。ま、PC-BJ140は、XPどころではなく、98SEですが…。

PDFCreatorの文字化けをなおす2

[PDFCreatorの文字化けをなおす]でインストールしたPDFCreatorですが、ある程度日本語化しても、肝心のPDF保存の画面で化けるんですね。

▲文字化けしないところは日本語で…。化ける、化けないの違いは一体何故なんだ…。

[\PDFCreator\languages]フォルダを調べると、「TransTool.exe」というソフトがあり、どうやらこのツールで日本語ファイルを作るようです。ところが、このソフトでjapanese.iniファイルを作りなおしても、PDF保存の画面だけは、どうもうまくいかないようです。

…というわけで、文字化けする部分のみ、ひとまず英語で使いまわそうと思って処理(化けるよりはマシです)。english.iniファイルをコピーすることにしました。

  1. japanese.iniをコピーして[japanese_02.ini]ファイルを作成。
  2. [japanese_02.ini]の3行目あたりで「Languagename=Japanese (日本語)」→「Languagename=Japanese2 (日本語)」
  3. [Printing] のあたりをごそっと差し替えて保存。
Author=A&uthor:
BMPFiles=BMP-Files
Cancel=キャンセル (&C)
Collect=まとめて保存 (&W)
CreationDate=Creation &Date:
DocumentTitle=Document &Title:
EMail=&eMail
EPSFiles=EPS(Encapsulated PostScript)
JPEGFiles=JPEG
Keywords=&Keywords:
ModifyDate=&Modify Date:
Now=現在日時
PCXFiles=PCX
PDFFiles=PDF
PNGFiles=PNG
PSFiles=PS
Save=保存 (&S)
StartStandardProgram=ファイル保存後、PDF文書を開く (&A)
Status=ファイル作成中...
Subject=Su&bject:
TIFFFiles=TIFF
  1. [設定]→[言語] の[現在の言語設定]で[Japanese2 (日本語)]を設定

以上、お粗末さまでした。

2008/08/16

MySQLテーブル破損→修復

MySQLでSQLをなげたらエラーがでまくり。なんだと思ったら、こんなエラー。

ERROR 1030: Got error 127 from table handler

リファレンスマニュアルをみると、テーブルの破損。error 127なので、レコードがクラッシュしているらしい。

破損しているテーブルを選択してphpAdminでいうところの[テーブルを復旧する]を実行したらなおりました。

なんで破損したかは調べていません…。○| ̄|_

Access DoEvents

Acccess2003で久しぶりにバッチ処理を書いていたら、DoEventsにハマりました。○| ̄|_

一つのフォームの中に、作業1ボタンと作業2ボタンを準備し、作業1ボタンをクリックし、作業1のプロシージャーが走っている間に作業2ボタンをクリックすると、作業2がどうやら走っている…。

ええーー、そうだったっけ?

と思って調べてみると、作業1のプロシージャー内のDoEventsが原因らしい。ヘルプを見ると、

DoEvents 関数を使ってオペレーティング システムに制御を渡しています。

DoEventsでOSに一旦制御を返しているせいで、ボタンクリックのイベントを拾ってこれるようになるわけですね。そりゃそうか。こいつを利用してキャンセルボタンを実行させることもできる、と。

作業1が終了するまでロックをかけたいわけですが、その方法はあとまわしにするとして、ちょっと面白い動きをしていたので実験してみました。

まず、作業1ボタンと作業2ボタンを準備し、次のようなサンプルソースを準備。

Private Sub cmd作業1_Click()

Dim i As Long

For i = 0 To 10000
    Me.lbl_Count1.Caption = Format(i, "#,##0")
    DoEvents
Next

End Sub
Private Sub cmd作業2_Click()

Dim i As Long

For i = 0 To 10000
    Me.lbl_Count2.Caption = Format(i, "#,##0")
    DoEvents
Next

End Sub

そして

  1. 作業1ボタンをクリック
  2. 作業1が走っている間に作業2ボタンをクリック

してみると、次のような順序で作業を終了しました。

  1. 作業1をクリック→作業1が走り出す。
  2. 作業1の途中で作業2をクリック→作業1を中断して、作業2が走り出す。
  3. 作業2が完了した後、作業1が再開される。

▲その1 作業1をクリック

▲その2 作業2をクリック

▲その3 作業1が再開される

うーん、作業1の途中で作業2がはじまるのは、OSへ制御が戻っている部分が如実で面白いなぁ。そして作業2が終わると作業1を再開する…(これはちょっと予想外)。

ちなみにDoEventsを書いていなければ、自動的にそのイベントのプロシージャーを抜けるまでAccessはロックがかかっています。しかし、ロジックの中でDoEventsを書きたいし、作業の間は各種ボタンイベント等にはロックをかけたい、というときどうすれば良いか?

Accessの場合、フォーカスをもっているコントロールには、ロックをかけられません。つまり作業1ボタンをクリックした場合、作業1ボタンにフォーカスがありますから、作業2ボタンなど他のコントロールにはロックをかけられても、作業1ボタン自身にはロックをかけられないのですね。よって、小技テクニック「透明ボタンを作る」(…なんでボタンにこんなプロパティがあるんだろー…。やっぱりこの為?)。

  1. 新しくダミーのボタンをフォーム上作成する。
  2. ダミーボタンの[プロパティ]→[書式]→[透明]で[はい]に設定する。
  3. で、このダミーボタンにフォーカスをとりあえず、移動させてしまう。

作業1ボタンのイベントプロシージャーの場合だと、こんな感じ。

Private Sub cmd作業1_Click()
Me.cmdダミー.SetFocus
Me.cmd作業1.Enabled = False
Me.cmd作業2.Enabled = False
Dim i As Long

For i = 0 To 10000
    Me.lbl_Count1.Caption = Format(i, "#,##0")
    DoEvents
Next
Me.cmd作業1.Enabled = True
Me.cmd作業2.Enabled = True
End Sub

こんなんで回避できちゃうんですねぇ。まぁグローバル変数とかを使って判定するのもテだとは思いますが。ロックをかけたほうが、ユーザーも見た目でわかりますものね。

2008/08/12

Acces2003のセキュリティ警告

▲こんなイヤンな警告でまくり。ちなみにJet4.0を入れても解決しないような…。

古の技術、Accessネタですいません。

このような警告がデフォルト設定で出るようになったのはAccess2003あたりからであろうと思うのですが、Access2000モードでVBA書きまくりのmdbファイルを、WinXP×Access2003のマシンで動作確認してみようと思ったところ、警告吐きまくり…だったわけなのですね。

「安全でない式がブロックされていません」とかなんとか。

で、ブロックされる関数の一覧なぞを眺めて見ると…。ブロックされる関数使いまくり…。今更排除できないってば。

というわけでセキュリティ・レベルを下げて警告を出さないようにするのが、一番お手軽な方法なので、手順をメモ。

  1. [ツール]→[マクロ]→[セキュリティ]
  2. [セキュリティレベル]で[低]を選択。

[ツール]のメニューになまじっか、[セキュリティ]項目がダイレクトにあるだけに、意外とAccessのこの項目は見つけられないんですよね…。

2008/08/05

JavaFX × Eclipse3.4 Ganymede

▲プラグイン、お手軽!

なーんにも考えずに、Eclipse Ver3.4.0──Ganymedeを入れてしまったので、若干ヲロヲロ。

プラグインは[ヘルプ]-[ソフトウェアの更新およびアドオン]でちゃちゃっとできるので、JavaFXの環境も入れてみたよ。ベンリですねぇ。

  1. [ソフトウェアの更新およびアドオン]-[Manage Sites]-[追加]-[ロケーション]にhttp://download.java.net/general/openjfx/plugins/eclipse/site.xmlを登録して[OK]-[OK]。
  2. http://download.java.net/general/openjfx/plugins/eclipse/site.xmlの左の「+」をクリックしてJavaFXのチェックボックスをチェック。
  3. [インストール]で完了。

サンプルソースの動かし方としては、

  1. [パッケージ・エクスプローラ]を右クリック。
  2. [新規]-[Javaプロジェクト]
  3. [プロジェクト名]に「JavaFXsample」とか。[終了]
  4. [src]-右クリック-[新規]-[その他]
  5. [JavaFX]-[JavaFX File]を選択-[次へ]
  6. [ファイル名]に「FXtest01.fx」などと登録。-[終了]
  7. [FXtext01]のファイルにサンプルソースを書く。
  8. 「JavaFXsample」を選択して右クリック-[実行]-[実行の構成]
  9. [メイン]-[プロジェクト名]には、[参照]から「JavaFXsample」を選択。
  10. [引数]-[プログラムの引数]にfxのファイル名でである「FXtest01」-[実行]

ポイントは[実行の構成]の引数のところで、ファイル名を登録するところかな?(クラス名を入れるのかと思いましたが、違うんですねー。ファイル名=クラス名にしておけば問題ありませんが)

JavaVMで実行されるクラスはFXShellで、このShellに対して実行するべきJavaFX Scriptファイル名を引数として渡す、という理屈みたいです。

コマンドラインだとこんな感じなので…。

java net.java.javafx.FXShell スクリプトファイル名

2008/08/02

JavaFX GUI記述法

なんとなくJavaFX Scriptの言語仕様読み始め。

Javaのジョーシキも知らないのに、読み出すと面白いわぁ。まず目を引くのは、GUIの記述法ですな。

JavaなヒトがSwingがどうとか言っているのは知っているけど、非Javaな私としてはこれまで、「なにソレ?」くらいの感じだったわけです。今回はからずもSwingのサンプルソースをみていて、"JavaFX での GUI 作成は「宣言」式で行うことができる、ワー、拍手喝采!!"みたいなJavaFX界隈のノリを理解できました。下記がJava のクラスのインポートでGUIを実装した場合のソース。

import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.lang.System;

var frame = new JFrame();
var button = new JButton("Press me");
frame.getContentPane().add(button);
button.addActionListener(new ActionListener() {
operation actionPerformed(event) {
    System.out.println("You pressed me");
}
    });
frame.pack();
frame.setVisible(true);

うげげ。面倒くさ…。

.Netの場合だったら、Winフォーム作るとき、普段IDE環境で済ませちゃっていているわけですが。VB.Netの吐くソースをみると、Formクラスを継承して自分自身のフォームのクラスを書いていくわけなんですよね。理屈的には、わかりやすい。Javaはなんで継承して使わないんだろ?せめて土台となるJFrameくらい継承すればいいのに(と思ってウロウロしてサンプルソースを探していたら、JFrameを継承する書き方も、やっぱり王道みたいでした。ということは、.NetもJavaもGUIの記述法は似たり寄ったりってことですね。VS環境以外で.Net開発をしようと思ったことがない私が、さほど記述の手間については気にしたことがなかっただけだってことですね)。

もっともPanelとかのコントロールの中にTextBoxをおくときには、結局

Me.Panel1 = New System.Windows.Forms.Panel
Me.TextBox1 = New System.Windows.Forms.TextBox
Me.Panel1.SuspendLayout()
Me.SuspendLayout()

Me.Panel1.Controls.Add(Me.TextBox1)

とか、書いていくわけなんですけどね。

基本的にはあくまでも土台となるFormクラスのサブクラスを書いているイメージが濃厚デス。さらに各種コントロールについては、コンストラクタでプロパティやなんやかんやの初期値がほぼ設定され済みで。ソレ故に、変えたいところのプロパティだけ設定していっているイメージが強かったんですよね。このイメージの由来は、IDEでの操作感覚からきているのかも。

で、やっと本題です。Javaや.Netでのコントロールのレイヤー感覚等の記述の面倒くささに比べて、JavaFXでの書き方はこうなるそうだ。

 Frame {
              content: Button {
                   text: "Press Me"
                   action: operation() {
                        System.out.println("You pressed me");
                   }
              }
              visible: true
         }

おおお、なんてエレガント。Swing、VB.Netでの書き方に比べて、なんてシンプル。この「うれしさ」はわかるなぁ。

この書き方だったら{}の構造で、どのコントロールがどう重なっているか、一発で見当がついちゃうし。問答無用にスッキリ、大雑把。でもこの大雑把な感じはアリだなぁ。結局初期値を設定しておいて、変えたいプロパティとかだけ呼びだした後、設定しなおしてあげればいいだけの話なんだし。

Excel 二つの列に値の入っている行をカウントする IF文の中でのAND条件OR条件 及び フィルター機能とSUBTOTAL関数テク

今回のお題はExcelに二つの列があり、A列、B列、ともに値の入っている行の数をカウントしたいというもの。

IFのネスト構造でも書けますが、AND関数を使った方がエレガントですね。プログラマの方の場合、論理演算子をパッと思い浮かべるところでしょうが、Excelのセルの中で

=IF((A2<>"") AND (B2<>"")),0,1)

などとやると即エラーです。ExcelにはAND関数、OR関数という関数が用意されていて、ワークシート上ではこの関数を使うわけですね。使い方は簡単。

上記のネタであれば

=IF(AND(A2<>"",B2<>""),1,0)

と書いてやれば、A2、B2のセルの二つがそろって空ではない場合のときのみAND関数からはTRUEがかえってきます。よって上記式では2つのセルに値が入っているときのみ、それ以外はすべて0を返してきます。これを最終行でSUMすれば、二つの列に値が入っている行数がでてきますね。

Ω Ω Ω

▲まずSUBTOTAL関数を仕込みます。

また、別解としてフィルター機能とSUBTOTAL関数での調べ方も紹介します。SUBTOTAL関数とフィルター機能は意外とベンリなんですね。フィルターで抽出したもののみを対象にSUBTOTAL関数は集計作業を行ってくれるから。

書式
SUBTOTAL(集計方法, 範囲1, 範囲2, ...)

集計方法は1~11までの数値で指定します。

集計方法関数
1AVERAGE関数
2COUNT関数
3COUNTA関数
4MAX関数
5MIN関数
6PRODUCT関数
7STDEV関数
8STDEVP関数
9SUM関数
10VAR関数
11VARP関数

ですから、ここではたとえばB列の末尾に

=SUBTOTAL(3,B2:B24)

▲フィルター機能で抽出したものを対象に集計結果を返しています。

と入力したおきます。集計方法は3なのでCOUNTA関数、つまり引数リストの各項目に含まれるデータの個数の合計を返す関数ですね。で、フィルター機能でA列、B列の条件に「空白以外のセル」をいれてあげればSUBTOTAL関数が反応してくれるわけですね。

2008/06/16

PDFCreatorの文字化けをなおす

PDFCreator0.9.5をインストールしました。任意のソフト経由で印刷可能な各種ファイルを、PDF形式に変換できるソフトです。フリーなので自宅マシンのお供に…。

PDF自体は問題なく生成できるわけですが、デフォルトだと、ソフト自身のメニューが凄い文字化けなんですね。何故ならメニュー画面のフォントが合っていないから。

というわけで、手順のメモ。文字化けの嵐なので画像つき。

▲そのイチ:[設定]画面

▲そのニ:[プログラムの設定]画面

  • PDFCreatorを起動する。
  • [プリンタ]→[設定]→[プログラム設定]→[フォント]
  • [プログラムのフォント]→MS UI Gothicを選択
  • [キャラクタ]→128
  • [サイズ]→10くいらい?
  • [保存]

ソフトを再起動すると、文字化けがおさまっているハズです。はー、スッキリ。

Ω Ω Ω

蛇足。会社で私はSOURCENEXTの「いきなりPDF」を使っているのですが、こいつのことをイシカワさんは「どこでもPDF」(それはOpenOffice.orgの拡張機能なのでは…?DokodemoPDF)呼ばわりしたり、「なんでもPDF」(それはシルバースタージャパンの製品なのでは?)呼ばわりするので、「イシカワさん、この辺、大雑把だからなー…」と思っていたわけですが。よくよく考えて見ると、勘違いする程度にどれもかなり似たり寄ったりの名前ですね(そして機能も)。商品名の争いとかにはならないんでしょうかね。ちょっと不思議。

memo→PDFCreatorの文字化けをなおす2

PDF保存の画面で化ける件について…。

2008/06/02

FAT32 ファイル数制限のワナ

何十万件という画像ファイルをを外付けHDDへリネームしながらコピーする──というバッチ処理をしていたわけなのですが、途中で止まる…。

うーわー、私どっかで書き間違えた?

と思ってリネーム・ツールのロジックを調べるわけですが、理屈は通っていて、どうも原因がわからない。というわけで、デバッグモードでリトライ。

再び停止。しかも停止するのはどうやらマッタク同じ画像ファイルのコピー作業ときたものです。

コピー元の画像になんらかの制限がかかっているようでもないし、コピー先のフォルダもちゃんと存在している。どこがおかしいんだろう、と思って、とりあえず

  • 手作業でそのファイルをリネームしてコピー先のディレクトリにコピーする→エラー。
  • 違うディレクトリにコピーするとコピー可。
  • 結論:どうやらロジックのミスではない。

むむむ、と思って、外付けHDDのファイルフォーマットをみると、あろうことかFAT32。FAT32ってなにかファイル数とか制限なかったっけ?と思って、拒否してくるディレクトリのファイル数を見てみると21,844件。…あれ?

FAT32のファイル制限数ってもう少しなかったっけ?──と思ってMSサイトへとんでみると、以下は MS-DOS の 8.3 形式に準拠するファイル名をつけた場合に、ディレクトリ内に保存できるファイル数ですということで、65,534件の数字が出ている。

「でも私のつけているファイル名は8.3形式のファイル名ではないなぁ…」と思って更にヘルプを読み進めると、ファイル名が 13 文字以上の場合は、さらにもう 1 つディレクトリ エントリが使用とあって、その下に実際のファイル名と利用されるディレクトリエントリの一覧がある。65,534=21,844×3だし、原因はこれか…。

というわけで、なんだか8.3形式(しかも大文字で)のワナにハマった話でした。うっかり忘れそうなのでUP。

2008/05/25

Excel コード表にない値を見つけ出す VLOOKUP関数/COUNTIF関数

Exceで知っておくと便利な関数のご紹介。今回は表の整形ではなく、エラーチェック系のテクニックです。

Excelしか入っていない環境のときや、わざわざAccessにデータをいれるまでもない、といったときに便利でしょう。

その関数はVLOOKUP

アビバのCMでも紹介されている関数で、Excel使いの人の中ではメジャーな関数だと思います。一口で言うと、コード表から値を引っ張ってくる関数です。この関数が主に活躍するのは、CMにある通り、本来は入力シーンで、入力する画面ではコード入力、その隣の列にコードの値を表示する、といったものです。以下に、書式と引数のポイントを挙げます。特に引数で注意するべきなのは、範囲と検索の型だと思います。

書式
VLOOKUP(検索値, 範囲, 列番号, 検索の型)
検査値
入力するコード
範囲
いわゆるコード表。コードでソートをかけておくことが重要。ちなみにコードは範囲の中で一番左にくるように設定します。ちなみに大抵VLOOKUPは縦方向へドラッグして使うことが多いと思いますので、ドラッグしても参照する範囲がズレないように、「$」などをうまく使って、範囲を固定しましょう。
列番号
上記コード表の範囲で、何列目にあたる部分を表示させたいか。範囲の中で一番左にくる列番号は1になります。
検索の型
検索値 と完全に一致する値だけを検索するか、その近似値を含めて検索するかを、論理値で指定。この引数を省略すると、デフォルトはTrueに設定されているので、近似値をひろってきてしまいます。しかしコード入力する際、近似値などという厳密さのかけるものなど欲しくない場合が殆どなので、フツーFalseを設定して、コード以外のものが検査値にあれば、わざとエラーを見せる、といった使い方の方が多いのではないかと思います。このオプションのことをうっかり忘れていると、痛い目をみると思いますので、ご注意。なまじ省略可能な引数だからコワイんですよねー。

というわけで、入力シートへ仕込んでおくと便利なこの関数を、「即座にエラー表示となって間違ったコード入力を発見できてしまう」という捉え方をしている私は、後追いでのコードのイレギュラー値の抽出シーンなどでも多用しています。たとえば、Excelデータを渡されて、「A表にあって、B表にない行はどれかな?」とか頼まれるとき。

▲「範囲」はドラッグしてもズレないように、「$」を入れて工夫してください。

他人から咄嗟に渡されるものはExcelのものが殆どですので、列数がたくさんあって、Accessに入れるのも面倒くさいなぁ、と思えば、Accessのクエリの代用としてVLOOKUP関数を利用します。ExcelのA表のヨコにでも、B表のコード一覧にあるかないかのフラグを立ててあげれば、依頼人はそれなりに満足することが多いわけですから、既存のExcel表をそのままサクッと利用できるなら、その方がラクなわけですね。

Excelのまま、ちゃちゃっとB表をコード表に見立てて、B表のコードに当たるものをソートし、A表のコードを検査値と見立ててVLOOKUPを使います。そうした場合の検索の型は当然False設定で、わざとエラーを表示して、エラー表示をフラグ代わりに利用します。

計算式の結果は「フィルタ」機能で引っかかりますので「#N/A」で、エラーの行をピックアップすることも可能です。「#N/A」をそのまま表示するのは見栄えが悪いというのなら、「ISERROR」関数などで囲めば、論理値になります。

さらにVLOOKUP関数を知らないようなExcelの操作が危なそうな人に、調査結果を渡すときには「形式を選択して貼り付」で「値」オプションを選んで、値を固定化(参考)ておく、などの配慮をしておくと完璧でしょう。まぁわざとこのように値を固定化してExcelを渡すと、「ちょっと!俺、式も知りたいんだけど!」と言われることもありますが、そのときはそのときで、式の入ったモトネタを渡してあげればいいと思います。

ちなみに「コード表にない値を見つけ出す」という意味では、COUNTIF関数でも代用できるワザですね。、COUNTIF関数の引数として、B表のコードを範囲に指定して、A表のVLOOKUPでいうところの検査値を、検索条件として設定すれば、B表にないものはすべてゼロになるわけです。この「0」をフィルタにかけてあげれば、B表にないものの一覧は簡単に抽出できますね。COUNTIF関数も面白いと思いますので、いずれまた取り上げたいと思います。

いずれにせよこのテのワザのひとつをイディオムとして覚えておけば、役に立つでしょう。

mubmle→それにしてもこのテの作業の手伝いで「フラグ不要。色つけておいて」と頼まれることほど、萎えることはありません。「え。フラグ消しちゃっていいんですか?フラグが立っていれば、フィルタで抽出するの簡単ですよ?」と愕然として思わず念押しするわけですが、「『色をつける』って話になっているから、フラグはいらないや」とのお返事。

だーかーらー、色なんて飾りなんだってば!!

と思いつつも、そこまでハッキリ云われれば、単なるヘルプの身としては何も云えません。結構行数のある表だと、「どんな手作業をやるのか知らないけど、遅くて、不正確になるだろうなー」と想像もつくわけです。まーそれだけ要領の悪いことをやっているからこそ、Excel/Accessをちょっと使えば瞬殺の程度の作業を、部外者の私に頼んでくるわけですが。

2008/05/24

MSのWebサービス

23日にOffice Live Workspaceの日本語ベータ版が公開されたみたいですね。早速使っている方とかいるのでしょうか。使用感はどうなんでしょう(今のところ自ら人柱になる気なし。すいません)。

MSっ子と言っているわりに、Docsに対抗する(?)この話題を完全にスルーしていました。先週MS絡みのイベントへ行ったので、かろうじで意識していたくらいの感じです。「私ってMSのLive ID(!!ここにえびはらくんがいるとは…)絡みののネタに疎いんだなー」という自覚をもったのも、ごくごく最近のことですし…。そのことに気づかないほど、これまで完全にスルーしていたわけですね。

というわけで、Live IDは会社のアドレスでアカウントを取得したことがあるような気がするものの、「気がする」というコトバが端的にあらわしているように、マッタク使いこなしていない感じです。MS的には、Googleをヨコににらみつつ、多分、この辺に力を入れてきているであろうに、とことん無関心な私。うはは。ダメな感じですねー。私が…、というより、MSっ子でさえも、そんな感じにさせてしまっているWeb関連でのMSが。だからこそのYahoo買収騒動とかなんでしょうけれど。

そもそもWeb絡みでは、個人的にはMSとはビギナー時代からかなり無縁な感じでした。IE自体使うことが稀ですからね。VSユーザーではありますが本業ではWinフォームばかりを相手にしていますので、IEを使う必然もなく、ブラウザは自分の好みで使えたわけですね。というわけで、IE以外のブラウザとはなにかと相性の悪かったMSサイトへ行くのは億劫で、自然とWeb周りではMSのサービスは避けていたわけです。

一方、Googleの方との付き合いは検索に始まり、メールもgmail、DocsやNoteなどを愛用、ブログまでついでにBloggerという状況です。gmailアカウントを一旦とってしまうと、他のGoogleのサービスのアカウント取得も敷居が低いですから、興味本位でごちゃごちゃ試している間に、日常ツールの一つとして気がつけば使いまわしているわけですね。結果として、わざわざMSでアカウントをとってどうこうする気にもならなずに、第二の「悪の帝国2.0」が提供してくる環境に、すっかり入り浸りなGoogleライフが展開されてゆくという次第(…これはこれでヤバいっス)。

「ExcelラブならSpreadSheetsじゃなくて、Office Live Workspaceへ乗り換えろ!」と突っ込まれそうですが、既にDocsを使っている身としては、Excelにラブはあっても(MS信者ではないですが、Excelには苦いも辛いも含めて自分の中にラブがあることは確か)、正直なところかなりビミョーだなと。Office製品群を抱えているMS的にはSoftware Plus Serviceというスタンスをとらざるを得ないのでしょうが、Bookをダイナミックに加工したいときには、ローカル環境のExcelで加工してからSpreadSheetsへアップロードすればいいだけの話なので、SpreadSheetsユーザーとしては特に不足を感じていないわけです。VBAこそ使えませんが、SpreadSheetsではExcelで仕込んだ関数なども一応使えますしね。

イシカワさんには「MSっ子ならば、ストイックにMSを極めて」とからかわれていますが、こちらとしては結果としてMS製品に囲まれていただけで、なにかとMSを叩く人々の存在に対するからかい半分・自虐半分くらいで、MSっ子と云っているだけですので。実質はスタンドアローン的にはMS、Web関連はGoogle、といった単なる新旧「悪の帝国」使いです。あしからず。

とはいえ、迫っているビル・ゲイツの第一線の引退には、一抹の寂しさも感じています(この辺の心情は、MSっ子?)。ビル・ゲイツというギーク率いるMSが、なにかと巨人扱いされて、後続のギークたちにやたらと目の敵にされていた時代。これはこれで結構いい時代だったんじゃないかな?とも思いますし。これだけ目の敵にされる「巨人」も、なかなか今後は出づらいんじゃないかという気もしますしね(Googleもいまや巨人ですけど、気がつくと「隣人」みたいなキャラですからね…)。まーアンチMSの方々がどう思われているのかは知りませんが、「アンチMS!!」と騒いでいた時代はそれはそれで、巨人の姿がハッキリとしていて、結構楽しくはなかったですか?

2008/05/18

軽量Linux

B00186NCQY
特集1 デスクトップ徹底解説-X Windowの基本から最新KDEまで/特集2 Puppy Linuxならサクサク-軽量Linuxのススメ/特集3 Windows対抗馬の実力を探る-エンタープライズLinux最前線/付録-DVD-ROM

アスキーのUbuntu特集のムック本を買おうと思って本屋へ行ったのに、結局別の雑誌を買って帰ってきてしまいました。

Ubuntuで遊んでいるうちに、廃棄予定のノートPCに、試しにLinuxを入れてみようと思いついた私(我ながらすぐこういうことだけは、夢見だすわけなんですなー)。とはいえ、ハード関連に疎く、設定各種に自信はありません。それ故の惜しげのない廃棄予定のマシンなわけですが、廃棄予定マシンはかなりの低スペックマシンです。ゴージャスなUbuntuを入れると相当モッサリとした動きになるであろうことは火をみるより明らか。なにかもっと軽量なディストリビューションを探さなければ…、とモヤモヤしていたわけです(でもGUI環境を手放す気はナシ)。

そこへこの雑誌の「軽量Linuxのススメ」の特集タイトルが飛び込んでくれば、当然立ち読みモード。低スペックマシンを蘇らせる内容は、まさに今の私にどんぴしゃり。→即、購入という流れ。

雑誌を参考にしつつ、軽量Linux──それがどんなものなのかVirtualBoxでまずはあれこ試してみることにしました。

Puppy3.01の日本語版をVBOXに入れてみる

雑誌でもプッシュされていたので、試したわけですが、即効、挫折です。

Puppy3.01の日本語版をVBOXにインストールしようとすると、bootの後、Loading、という文字が出たまま、音沙汰ナシ。

UbuntuのときはVBOX用のイメージを落として使っていたので、大してVBOXの使い方では迷わなかったわけなんですが。

ISOからのVBOXのインストールは、実はこれが初めてだったんですね。「自分のVBOXでの手順が間違っているのかしら」と思ってかなり悩みました。

というわけで、VBOX使い方の検証がてら、Slaxや本家のPuppy4を入れてみました。

Slax(slax-ja-6.0.6-2008042201.iso)と本家のPuppy4(puppy-4.00-k2.6.21.7-seamonkey.iso)をVBOXに入れてみる

これらはあっさりVBOXで起動できました。つまり私のVBOXの設定自体は、そう間違ってはいないハズなんですね。

というわけで、以下は私なりの手順書(ライブCDとして起動しています。仮想化で単にライブCDを使うそこに意味はあるのかい…?という気もしますが、まぁ焼かなくて良いので)。VBOXのVersionは 1.6.0 Editionになります。

  • [新規]→[名前]で、OSとバージョンとかわかるものをつける、[OS]はPuppy3.01の場合、Linux2.6ですよね…。[次へ]
  • [メインメモリのサイズ]512MB
  • [起動ディスク]→[新規]→[可変サイズのイメージ]
  • [イメージファイル名]わかる名前を→[イメージのサイズ]可変で5GBでいきました。→[完了]

で、今度はISOの設定をするわけですよね。

  • [設定]→[CD/DVD-ROM]
  • [CD/DVD-ROMのマウント]にチェック
  • [ISOイメージファイル]をチェックして、落としたISOを設定→[OK]

これでVBOXの設定はおしまいで、あとは起動すればいいだけです。

なのに日本語版Puppyはうまくいきません。背景黒のDOSっぽい画面でpuppyの文字が表示され、Loadingに入るとそのまま音沙汰ナシ!!うーん、なんででしょー。雑誌にはインストーラーが壊れているっぽいみたいなことも書いていましたが、CDブートだしそれ以前の気配が濃厚ですね…。うーむ。

Ω Ω Ω

ちなみに検証がてら入れてみたSlaxと本家Puppyについてのファーストインプレッション…。

▲Slax:左バーでカテゴリわけされているんですが。いかがなものか…。

Slax

Slaxはホントにアッサリ入りました。日本語版ですし、キーボードの設定等も聞かれずラクラクです。ネット環境も勝手に設定してくれていました。でも画面サイズがなんだか大きすぎです(スナップショットをとるまで、画面からはみ出したパネルの存在に気がつきませんでした)。どうやって変更・設定すればいいのかわからずじまい。仮想化環境だからいいようなものの、どこで設定するのでしょうか。

基本的にどう動けばいいのか、わかりづらいUIですね。Winでいうところのエクスプローラーみたいな画面ですべて統一的に扱おうとしているのかな?という気はしましたが、使い勝手はビミョー。慣れていないだけ、とも云えますが、Winの使い勝手とは距離があります。

本家Puppy

▲Puppy:このフォルダは…。どうにかなりませんか。

本家PuppyはSlaxより、レイアウト自体はわかりやすいと思います。しかしここでもエクスプローラー的な役割を果たしているfile機能は何事?と思うくらい、ヒドいですね。自分が今どこにいるのか、パスも表示されません。端末でパスを書くことが多いので、パスは表示された方が便利ですよね。どこかにレイアウトを変える機能などがあるのでしょうか?ちなみにネット環境は自動で取得してくれず、手動設定でした。

起動時の犬の声だとか、PETファイルだとか、その辺のユーモアはかなり好みです。

その他、ライブCDならではのモヤモヤなのかもしれませんが…。

ファイルのセーブの仕方が、イマイチわかりませんでした。とほほ。

CDにセーブしますか?とかなんとかPuppyの場合、終了間際に訊かれます。Slaxの場合は問答無用で、初期化されます(これはこれでヒドイ…)。

CD-Rになんか記録しないから!!(というより仮想化環境なので、CD-Rとか云われても、どうやってライブCDのISOと、「メディア」にあたるものを差し替えればいいのか、わけがわからない…)仮想のCDからブートして仮想のHDDにファイルだけでもキープしてくれればいいのに…、と思うわけですが、なんだかわからず、にっちもさっちもゆかない。多分仮想HDDを認識していないくさい…。

というわけで、Puppyの方は雑誌のHDDへのインストールの仕方を参考に、仮想のHDDへインストールしてみました。

仮想HDDへライブCDからインストール

ざっくりと手順を振り返ると、
  • ライブCDに入っているGPartedとやらで、パーテッションとかを作成。
  • メニューからPuppyのインストールツールを起動して、そこからOSのインストール

まぁこんなものです。GPartedの使い方はこの辺をみてやりました。ただこのテの知識に疎いので、意味とかよくわかってなくて非常に不安です…(ext3とかlinux-swapってナニ?バランスとかわかりません)。

で、結局トータルのHDDがどれくらい食われているのかも、よくわかっていません。Winだとドライブと空き容量の関係が一目瞭然ですけど、Linuxにもきっとそういう画面があるハズですよね。Linuxの場合、ドライブの感覚がないようなのでちょっと違うのかなぁ?とは思いますが、でも物理的な容量は超えられないわけですから、物理的容量と、食っているファイルサイズを表示するような画面はどこかにあるハズ。

ちなみにPuppyの場合、ライブCD起動の際、Xorgでインストールすると落ちてしまったので、Xvesaで起動せざるをえませんでした(この辺は雑誌記事のThinkPadと一緒でした)。せっかく仮想HDDへインストールしたのだからここら辺も編集してやろうと思って、xorg.confを見てみたんですが…。私にはハードルが高すぎました。呪文をどう書き換えればいいのか、さっぱりわかりません…。というわけでXvesaのまま利用していて、動作は意外ともっさり気味です。いつか私にもこのファイルを書き換える知識を手に入れることができるのでしょうか。

日本語フォントと格闘

Puppy4は本家のものなので、日本語フォントも当然入っていません。というわけで、日本語サイトは豆腐の嵐です。

mixfont-mplus-ipa-TrueType-20060520p1.tar.bz2をゲットしてきて、user/share/fonts/defaultの下にあるTTFとType1のフォルダに、解凍したfontsの中身を全部コピーしたら、ネットサーフィンしても日本語を表示してくれるようになりました。

でもいまだに日本語入力の仕方はわかりません。これはIMEみたいなパッケージを自分で入れる必要がありそうですね…。

パッケージあれこれ

ブラウザはやっぱりFireFoxでなくちゃ…、というわけでPuppyにFireFoxのパッケージをインストールしたものの、起動の仕方がわかりません。試しに端末で「firefox」でEnterしたら起動しましたが、毎回そんな起動はやってられませんね(しかも端末を終了させると、FireFoxも一緒に落ちる…)。パネルのようなところへコマンドを打てばいいんだろうな、という察しはつくものの、メニューにもアイコンがないし、フォルダの中をかなり探しましたが、一体、このコはどこにインストールされているのやら……、という大捜索状態でいまだに遭難中です(Search機能とかも一体どこにあるんだ!!フツー、エクスプローラーとセットじゃないんですか?「目」みたいなアイコン押したら、隠しファイルが出てくるし、あーもー)。

Ω Ω Ω

こんな具合に、軽量Linuxについてはペットの方に振り回されている感じなわけですが…。

ちなみにライブCDつながりで云うなら、雑誌付録のKNOPPIXにはトライ済みです。結果:なんだか起動しませんでした(号泣)。

あろうことか、ディスプレイを認識してくれないようで、途中までいったところで真っ黒になって音沙汰ナシ。

省スペースマシンの宿命として、私のマシンのマルチドライブは、無理やりメディアを押し込むタイプなんですよ(お皿をお置くところが出てこない)。ただでさえ、その取り扱いになれずにビクついているのに、うんともすんともいわなくなって、どうやってメディアを取り出そうかとビビリまくりでした。

長押し→電源を落とす→再起動した瞬間、DVDブートが入る前ににサッとメディアを取り出す、みたいな…。一度の失敗で挫けまくりです。

ライブCDって気楽にOSを楽しめて…、と云われているけれど、VBOXに入れる方が気楽ですねー。あーでもKNOPPIXのゴージャス画面をみてみたい。でもVBOXに入れるのは、DVDに入っているものでいかにも容量が大きそうだからイヤだ…。

2008/05/17

XFCE

デスクトップ環境をXfceへ変えてみました。

▲超・地味!!

GNOMEは「BigBoard」というサイドバーがあるんだっけ?──とGoogle依存症ライフを送っている私はそわそわしていたんですけど、Fedra8や9には入っていても、Ubuntuにはまだ導入されていないのか、というところで諦めがつきました。

で、Xfceですが。個人的にはGNOMEより好感触。右クリックでランチャーみたいにメニューがさーーっとでてきて、便利ではないですか。動作も軽いようですし。

Xfceのパッケージをインストールして、GNOME→Xfceへの移行は特に問題ありませんでした。

ちなみにデフォルト状態は、超地味!!

というわけで、テーマをDLして、少し派手にしてやろうと、ごそごそやっていたのですが。変更できずに悪戦苦闘…。

DLしたものを/usr/share/themesへフォルダごとおきさえすれば、[設定]→[設定マネージャー]→[インタフェース]や[ウィンドウマネージャー]などから選べるらしい、というところまではわかったものの、/usr/share/themesへフォルダを移動させてもうまくいかないわけですよ。

しかもフォルダの名前も末尾に「theme-pack」とかがついていて、ヘンな名前だし…。と思っていたら、たまたま私のDLしたテーマのファイルの構造が二重のフォルダ構造になっていて、さらにその下を展開させたフォルダをゲットしなければならなかった、というオチでした。

単に、展開ソフトの扱い方に慣れていなかった私が気づけなかっただけのようです。しょんぼり。

そうこうしてキリのいいフォルダ名をゲットして、/usr/share/themesへフォルダ単位で移動させるとうまくゆきました。なーんだ。わかってみれば簡単。

というわけで、テーマの変更の仕方は以下の通り。

  • XFCE-LOOK.orgからThemesを選んでDL。
  • 展開(キリのよいフォルダ名になるハズです。そのフォルダの直下には、[gtk-2.0]フォルダがいるハズなんですよ)。
  • 展開したテーマのフォルダまでcdで移動。
    sudo mv [テーマのフォルダ名] /usr/share/themes
    
    で、テーマを移動させます。/usr/share/へは権限をもっていないと移動できないようですね。

アイコンも似たような感じで、

mv [アイコンのフォルダ名] /usr/share/icons

で、移動させればOK。

▲色々妙に遠回りして苦労した気が…。そして意図せず、FireFoxは3Beta版です。色々アドオンが足りません。

でも何故かデスクトップのアイコンのデザインは私の場合DLしたものには変わりませんでした。デフォルトで入っているアイコンは、きちんとファイルマネージャーで表示されているアイコンと連動して変更されるのですが、落としたものは何故かダメ。とほほ。

まー今となってはXfceのデフォルルトについているランチャのようなメニューが妙に便利で、結局デスクトップのアイコンはすべて消ししまったので、どうでもいいことではありますが。

あれこれやっているうちにコマンドも少しは覚えてきました。めでたい。

2008/05/11

Ubuntu7.01→8.04アップグレート

4797327421
林 晴比古
Linux/UNIXの活用に必要となる基本的な機能を詳細に解説。起動メカニズム,ジョブやプロセスの管理など,Linux/UNIXがOSとしてどのようなしくみで動いているのかを理解することもできる。Linux/UNIXの全ユーザー必携の1冊。

さっそく前々から狙っていた「新Linux/UNIX入門」を購入してきました。

Ubuntuのデスクトップのくせになんでそんなコマンドラインな本を?──というツッコミが聞こえてきそうですが、GUIはWinに慣れている私にとっての窓口みたいなものなので。まぁ「X端末」からコマンドをうてる環境は手に入れたので、ざっくり動作確認をしながらLinuxの思想が掴めれば、勘も働こうか思ったわけですね。それだけの為には、ちと高くて太い本ですが…。でもわかりやすいことはわかりやすいです。

Ω Ω Ω

さてVirtualBoxにいれたゲストOSのUbuntuですが、7.01→8.04へアップグレートしました。

8.04へアップグレートするとデフォルト画面の背景が変わりました。背景画像の他は7.01とどこが変わったのかよくわかりませんが(7.01とは1日に満たない短い付き合いでしたから)、相変わらずスッキリとしていますね。

今回のバージョンアップでサウンドの設定はVBOXの問題なので、設定しなおす必要はありませんでした。しかし画面サイズの設定はやりなす必要がありました。昨日と同じGuest Additonsをインストールして完了です。

それでは昨日からの活動記録です。ほとんどアップグレートと、他色々無駄な徒労に費やされたわけですが…。

Hostキー

▲VBOXを入れたくても入れられない2000なイシカワさんのためにVBOX設定画面。
ちょっとだけよ…?(笑)

VBOXのメニューを使おうとするとき、HOSTキーというコトバが出てくるのですが、これはなにかというと、VBOXの[ファイル]-[環境設定]-[入力]-[ホストキー]にかかれているキーボートの組み合わせです。デフォルトでは、おそらく「Right+Control]で設定されていますね(右側のCtrlです)。これをHostキーと言っているらしく、私がよく使う組み合わせは、[Host+F]です。これでゲストをフルスクリーンモードに切り替えることができ、ホストの画面を呼び出したいときは再び[Host+F]で戻ってこれるわけですね。ディスプレイが近頃私も折角ワイドになりましたので、Ubuntuのようなデスクトップ的なOSですと、フルスクリーンにしたくなるわけです。

ファイルの共有にいたるまで。

ネットワークに参加させる必要があるのかと思ってかなりウロウロしていたのですが、別にネットワークのことはなにも考えなくても、ホストとゲストのフォルダ共有はできました。とりあえず以下は、ホスト=XP、ゲスト=Ubuntuの場合。

▲VBOXの共有フォルダ設定画面

1.VBOXの共有機能の設定
VSBOXのゲストOSの[設定]-[共有フォルダ]-右側の+つきフォルダアイコンをクリック→[フォルダのパス]にホストであるWinの共有にしたいフォルダのパス、[フォルダ名]フォルダパスの愛称をつける。
2.ゲストOSで共有フォルダを作成
ゲストOSを起動して、ゲストOSなりに共有するフォルダをまずは作成します。
3.ゲストOSからの呪文
[端末]から次のような呪文を唱えるらしい。
sudo mount -t vboxsf [VBOXで設定した共有フォルダの愛称] [ゲストOSで作成した共有フォルダのパス]
このコマンドがうまくいくと、パスワードを訊いてくるので、そのまま入力。うまくいくとゲストOSで作成した共有フォルダのパス]にデータを入れると、Winからでもデータがみることができます。Winで保存したデータも見れます。

早速、共有フォルダ機能を使って、キャプチャとテキストデータを共有してみたわけですが。Shareフォルダ内のファイルをを上書き保存しようとすると、エラーになり、保存できないようです。共有フォルダ以外の場所においてあるファイルは上書きできますので、これはきっと「共有」設定にしているフォルダへ保存しようとするが故におきている現象なのでしょうね。ホストもゲストもユーザーは私一人っきりなので、ここはひとつ、上書きして欲しいところではあるのですが、理屈はなんとなく了解です。

で、後から気がつきましたが。Shareフォルダのマウントって、ゲストOSを再起動する度にやってあげないと、ゲストからみた感じは、カラッポになってしまうんですね!!!(要はゲストで指定したパスと、VBOXでキープしている共有フォルダが、1度ゲストを落とすと初期化されて、マッピングされていないみたいな感じ?)

なんとなくマウントの知識はあるのでうすらぼんやり現状の意味はわかっているのですが…。これってきっとマウントの設定をキープしておく方法がどこかにあるハズですよね。……頑張ります!!

Ubuntu 7.10 on VirtualBox

XP ProへVirtualBoxを入れて、Ubuntu 7.10(日本語ローカライズのVirtualBox用仮想マシン用データ)を入れてみました(8.04へはアップデート機能でどうにかなりそうなので、今後ヒマをみてアップデートする予定です)。これまで私はずーーーーーーーっとWinでしたので、備忘録も兼ねて、Ubuntuトライの雑感なども少々UPしていこうかと思います。

当初はMSっ子の意地で(うそ)、Virtual PC 2007に最新のUbuntu 8.04 LTS(Desktop版)の組み合わせでトライしていたのですが、失敗。落としたUbuntuのバージョンが新しすぎて、ググっても解決方法が探せず、断念しました。「7での解決方法でうまくいくかなー?」と思ったわけですが、インストールメニューなどもよく見ればコッソリ異なっていて、エラーの様子も違っているのです。ド素人の私には乗り越えられない壁でした。

そんなわけで、自信喪失状態の私は、Ubuntuサイトで予めVirtualBox用と銘打っているデータを落としなおして、そっちでトライしてみることにしました。しかしVirtualBoxにしてからも、MSの嫌がらせ(?)は続き、VirtualBoxをXPへインストール中、「システムの動作が損なわれたり、不安定になるなど重大な障害云々」の不穏な警告メッセージがポコポコ表示されました。

そんなのはただの嫌がらせです!(?)僕が一番MSをうまく使えるんだ!!!(もう何が何だかわかりせん…)──親のココロ子知らず。MSっ子としてはあっさり忠告を無視して、インストールを完了しました。Ubuntu 7.10のインストール自体は、存外あっさりと終わります(ただデフォルト状態でサクサク行ったら、どこになにがセーブされているのかマッタク私としては無自覚で、あとから探しました…。HDDの容量も標準の20GBになっていて後から真っ青だったのですが、問答無用でHDDを20GB確保していった様子はなく…。どうやら自動でその都度HDDを侵食していくようです)。

大方サクサクすすんだとはいえ、当初、画面サイズがヘンで、サウンド機能も使えませんでした。

画面サイズの方は、Guest Additonsをインストールしてなおりました

[デバイス]→[Guest Additonsのインストール]を選択するとデスクトップにCD-ROMのアイコンが出現します(※[Guest Additonsのインストール]でCD-ROMのアイコンが出てこないときは、VBOXの[デバイス]→[CD/DVD-ROMのマウント]→CD/DVD-ROMの仮想イメージでVBoxGuestadditions.isoを選択してマウント)。このCD-ROMを開いて、VBoxLinuxAdditions.runのパスを調べます。今回の場合、[/media/cdromO]でしたので、[アプリケーション]-[アクセサリ]-[端末]を起動。

cd /media/cdromO
sudo sh ./VBoxLinuxAdditions.run

という感じで入力して、インストール完了。

ゲストOSを再起動して[仮想マシン]→[ゲストOSの画面を自動リサイズ]で、ワイド画面に対応しました。

サウンドの有効の仕方はホストOS(=Win)のオーディオドライバを使うことで解決するようです。

ゲストOSの[設定]→[オーディオ]→[オーディオを有効にする]にチェック→[ホスト オーディオドライバ]で[Windows DirectSound]を選択。

これで音も鳴るようになりました。

Ω Ω Ω

MSっ子の私は、当然、初Linuxなわけなのですが。Ubuntuというのはだいぶマルチメディア関係に強いみたいですね(←勉強しながら、いじっている感じで、インストしてから、へーそーなのか状態)。ubuntu studioなどのマルチメディアクリエイター向けのディストリビューションもあるようです。とはいえ、そもそも個人的にはあまり興味のないジャンルなので(マルチメディアのクリエイトはやる気ゼロ。センスないのでー)、その辺に関しては個人的には、ふーん、といったところではあるのですが。

でもUbuntuそのものはなんだか面白いですね。私はWin以外のOSはこれまでまともに触ったことがないので、もの珍しく、かなり興味津々です。

デスクトップを複数作れるあたりにもココロ惹かれました。特に会社マシンで案件ごとにデスクトップを変えられたら、なんか便利かも…、とか夢見ちゃったり。

Linuxをメインに使うという選択肢はありだなぁ、とはからずも思ってしまいました。ハードウェアの部分では、苦労しそうな気はしますけど。私の場合、UIなどは、思いっきりGUIで入れましたので、存外すんなり受け入れられました。

ハードウェア等の環境さえ整っていれば、もしも私がMSと無縁の開発者だったら、VBが母国語とかじゃなければ、或いは…、という感じです。余計なソフトがあまり入っていないとか、その辺のシンプルさも好印象ですね。

デスクトップ環境も色々選べるようですね。ディストリビューションごとにある、とうより、ディストリビューションをまたいで、デスクトップ環境があるという感じなのでしょうか?私が受けたざっくりとした印象を素直に並べてみると

KDE
見た目派手ー。重め?レイアウトがWinに似ているので、入れればすぐに馴染めそう。
GNOME
見た目Mac寄り?なんでしょうかね。デフォルトでこれが入っていました。動作は、ファイルサイズから察するとKDEとXubuntuの中間…というより、KDEと似たような感じなのでしょうかね。
Xubuntu
低スペックでもサクサク動くようで、これは魅力的ですね。でも上記2つに比べて、無線LANを勝手に発見してくれないとか、ド素人の私には敷居は高めのようです。
Ω Ω Ω

私の場合、普段から「サーバー」とは関係が薄いので、メインデスクトップとしてのGUI的な使い方ばっかりに目が言ってしまうわけですが、Winにはない面白さがあるなぁ、と、ワクワクしてきました。

それとは別に、少しUbuntuに慣れて、使うソフトなども絞れてきたら、USBメモリにOSを入れることにもトライしたいですね。今はUSBメモリもかなり安いですし…。「いつでもどこでもマイOS」というテーマにはかなり興味があります。

海外のネットカフェでは、この数年の間に殆どのマシンのOSはXP以上なので、日本語入力できるマシンの方が多いわけですが(1台のマシンで何カ国がずつ担当していて、ユーザーの希望で、マシンを割り振って各国語に対応しているお店が多いような気がします。でも、都市部はともかく田舎だとあまり選択肢もありませんので…)。店が混雑していたりして、日本語割り当てのマシンからはずれると、英文入力しかできないわけです。そんなときマイOS環境が持ち歩けたら…(妄想モード)。

とはいえ、冷静にネットカフェでの状況を思い起こすと、カフェのマシンにはタイマーソフトなどが仕込まれており、時間によって課金されたりするわけで…。勝手にUSBメモリでブートしたら、確実に怒られますね。そういう意味では今のところ「いつでもどこでもマイOS」夢想は非現実的ですね…、しょんぼり。でも「モバイルしなくても、いざというとき出先でマイOS環境が…」というテーマには妙に惹かれてしまうわけですね(笑)。

で、未練タラタラでサーフィンしていたら、こんなテクニックを発見しました。USBメモリにOSを入れる場合、USB Deviceが1st Bootにする必要があるわけですが。それよりもCDブートの方が現実的な環境ですよね。というわけで、CDブート用に徹したCD-RとUSBメモリに保存したOSでの組み合わせテクニックが下記になるわけです。

Ubuntu7.04をUSBメモリにインストールしてみた

Ubuntuじゃなくても使えそうなテクニックですね。ミニCD-RとUSBメモリが欲しくなってきました。ま、これはなんだか妙にウキウキするネタなので、いずれトライすると思います(笑)。

2008/05/09

EmEditor Professional7

Newマシン導入に伴い、この度、たまたまEmEditor Professionalの7を入れたわけですよ。

EmEditorはご存知の通り、もともと機能が豊富にあり、このエディタの機能をフルで使いこなしているわけでもない私としては、これまでこのエディタのバージョンアップに、そこまでの熱意はなかったわけなのですが…(旧バージョンでわりと満足しちゃっているタイプだったわけです)。

ver6→ver7へのバージョンアップは、もしかして、かなり激変の世界ではないですか?(それともver6を私が使いこなしていなかっただけなのでしょうか?)完全にアリゴリズムとか違いますよね?UIこそ同じですが、在る意味、別物に近い、オドロキの世界です。

まず目を引くのは、最大248GBのファイルを少ないメモリでスムーズに開けるようになったことでしょうね。メモリ依存ではなくなった──遅延ロード機能搭載ということですね。巨大ファイルを扱う人には、これはかなり嬉しいことなのではないでしょうか。少なくとも私は、今も昔も、バッチ処理することが多いので、かなり嬉しかったです。

バッチ処理そのものをエディタで行うわけではありませんが、インプットにしろアプトプットにしろ、ファイルの中身を確認したくなることは多いわけで、その際にこの遅延ロード機能の有無が重要だと思っていたわけですね。特に新人時代はポンコツ・マシンで、それなりのサイズのファイルを開かなくてはならなかったので、かなり苦労しました。EmEditorと、フリー版でも遅延ロード搭載だったCoolMintあたりを、併用していた時期もあります。その当時の記憶が強烈で、マシンスペックがあがり、メモリ依存のエディタでも大抵のファイルが開けるようになった今でも、EmEditorに遅延ロードの機能がないことについて、多少の危惧はもっていたわけです。ですから、そんな私にとって今回の機能搭載は、「もうこれ1本でどんなに巨大なファイルがきても大丈夫」と思えるものすごい安心感…、プラス、驚きの高速機能という仕上がりで、感動することしきりの体験だったわけです。

遅延ロードだから、パッとみた感じが速いだけでしょ?ホントの100%のロードは暇がいるんでしょ?──とあなどるなかれ。100%表示するまでの時間を見積もってみても、これがなかなかに高速なんですね。7の特徴ページにも書いてありますが、

(1) ファイルの読み込み時間

ver6: 3分54秒 / ver7:13秒

(2) 正規表現を使用してすべての置換にかかった時間

ver6: 9分   / ver7: 1秒

なわけですよ。自分自身では計測していませんが、この速さの違いは、ファイルの読み込みにしろ、検索や置換機能ひとつをとっても、体感できるほどの激変なのです。

さらに私が気に入ったのは、単語補完機能。

まー、私はMSっ子なので、普段それなりに恵まれたIDEを使っていますので、「エディタでコーディングしているわけじゃないんだから、このテのエディタの機能は君にはあんまり関係ないだろう」と突っ込まれそうではありますが。インテリセンス機能に慣れきっているからこそ、このテの機能搭載(プラグインですが、7をインストールしたら、プラグインも既に入っていました)は、なんだか妙に嬉しいわけですね。

さらにおまけ的ではありますが、HTML バーもついたみたいですし…。私の場合、タグはなんとなく昔から手入力派なのですが、色ばっかりはどーも覚えられず、色の表を見て決めるか、別ソフトを使って入力していたわけですね。しかしこれからはEmEditorひとつで済んでしまうわけですね。らくちん(環境設定が…)。

他に大きい機能としてはUSB メモリにインストール可能になったことでしょうか。ローカルにインストールしたEmEditorの[ツール]→[インポートとエクスポート]→[USB ドライブなどのリムーバブル ドライブをセットアップしてすべての設定をINIファイルにエクスポートする]で、そのままローカルにインストールしたEmEditorが、そのポータブル用となってexeから設定ファイルにいたるまで、USBメモリなどへエクスポートできてしまうわけです。このサービスは凄いですねぇ。

あとはこれに自作のマクロファイルをUSBへコピーしておけば、いつでもどこでも自分環境のEmEditorですよ。ベンリーーー。

EmEditorの回し者ではありませんが、毎日使っているものですから、愛着もあり…。特にver4~6までを既に持っている方ですと、ver7へのアップグレードは無料ですので、このアップグードはちょっとプッシュしたいですねー。

2008/05/07

CurrentProject.Connectionの謎

再びAccessVBA教本ネタから。今回はADOの接続部分についてです。

Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset

Set cn = CurrentProject.Connection
Set rst = New ADODB.Recordset
rst.Open "SELECT * FROM TB_ログ ORDER BY ログID", cn, adOpenForwardOnly, adLockReadOnly
Do Until rst.EOF
    rst.MoveNext
Loop
rst.Close
cn.Close

Set rst = Nothing
Set cn = Nothing

なんだかこのサンプルソースを見ていて違和感を感じたわけですね。違和感の部分はConnectionで、オブジェクト変数cnについて注目してください。まず、

Set cn = CurrentProject.Connection

自分自身の接続のインスタンスをSetでcnに渡している──この部分はいいでしょう。既にmdbファイルという自分自身は実体化しているわけですから、改めてNewして、インスタンスを生成する必要性は感じません。

さらにいうならば、CurrentProject──自分自身のことですから、既に接続がOpenされ済みとみなしていいわけで、改めて接続をOpenする必要がないという理屈もナットクできます。

そういう解釈で、上記ソースを眺めていると、Loopの後、

cn.Close

に違和感を感じるわけです。OpenしていないのにCloseしている、という部分で「あれ?」と思って立ち止まったわけですが、Openしていない理由(=CuurentProjectの接続だから)を考えると、CurrentProjectなのに、cn.Closeしちゃっていいいのだろうか?──という疑問も沸いてくるわけです。

CurrentProjectなのだから、CloseせずにそのままSet cn = Nothingするものだと予測しながらソースを読んでいたのに、Closeする必要があるというのはどういうことなんだろう(SetでNothingすること自体には疑問は持っていません。Setはメモリアドレスの代入にすぎませんから、「オブジェクト変数cnに入ったメモリアドレスをNothingするんだろうなぁ」というくらいのものです)。

過去の自分のソースをみても、CurrentProject.Connectionでセットされたオブジェクト変数は皆ちゃんとCloseしているので、教本サンプルソースのミスというわけでもなさそうです(証拠のソース。ちなみにこれを書いていたときは踏襲元も思い出せないくらいのはるか過去からの踏襲/慣習で、なーんにも考えていなかったんです)。

ちなみにmdbが複数個存在していて、別のmdbからもうひとつのmdbの接続するときや、VB6.0からAccessへADO接続する際には、

Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Password='';User ID=admin;Data Source=" & MDB_PATH
cn.Open

で接続して(MDB_PATHは接続したいMDBのパスの入った変数だとします)

cn.Close
Set cn=Nothing

で終了するわけです。OpenとCloseをセットで使っていますし、この記述に対する疑問は特にはありません。

問題なのはCurrentProjectの接続です。Openせずに、Closeする。Openしない理由は予測できるとして、接続をCloseしてもCurrentProjectに影響しないAccessの接続って一体、どーなっているんだ?──と思って、今回改めてじっくりとヘルプを調べてみました。

すると、Connection プロパティのメモに

Connection プロパティは、実際にはアクティブなデータベースに対する ActiveX データ オブジェクト (ADO) 接続のコピーへの参照を返します。このため、Close メソッドを適用したり、Connection オブジェクトのメソッドやプロパティを使って接続を変更しようとしても、カレント データベースとの接続を保持する Access の実際の接続オブジェクトに影響を与えることはありません。

と書いているではありませんか。

接続のコピー!!

そうだったのかー。

CurrentProjectの一意の接続そのものではなく、その複製を受け渡していただけなんですね。しかもおそらく接続をOpenしたままでの複製です。だからOpenせずに、CloseしてもOKなんですね。「複製の受け渡しとは安全設計なんだなぁ、そもそもConnectionプロパティはReadOnlyだし、かなり用心部深いよね。でも考えてみればここまで用心するのも、道理といえば道理だな」──と一人でナットクしつつ、すっかり習慣化して、いまやとくに疑問にも思わずスルーしていた自分に打ちのめされました。足元のこと、わかってないわ…。

2008/05/06

VBAのわかりにくさ

故あってAccessVBAの基礎編ネタを見直しいるのですが…。改めてAccess単体で見直すと、わっっっかりにくいですねぇ、やっぱり。

Access的にはユーザーに優しくするために色々なことを「隠蔽」しているのでしょうが、「隠蔽」しているが故に、「実はこれもこれも根っこは一緒なんだよねー」という原則ルールが見えづらい。

私の場合、クラスを理解するまで、いろいろな事が「謎」でした。VB.NET(VS2003)へ移行してから初めて、それまで「お作法」として捉えていたSetなんかの意味もようやくナットク、色々なことが一気にスッキリ、シンプルに見えてきたんですね。

そんなこんなでVBAユーザーからスタートしている自分を振り返ってみると、VBAでは「クラス」を隠蔽しているから、VBAからはじめるユーザーはいろいろな事がわかりづらいだろうな、と思うわけです。

たとえば他のクラスモジュール(Accessの場合、FormやReportとかしかありませんが)や標準モジュールから開いているフォームを操作したいときに、

Forms!フォーム名!コントロール名

とか

Form("フォーム名").Controls("コントロール名")

とかで突然表現しちゃうのってどーなのヨ?

Accessだって、Formクラスを継承して、新しいフォームクラスをユーザーが定義して、インスタンス生成をいるのに過ぎないだろうに、その辺のあれこれが、VBAの場合、すべて隠蔽されちゃっているわけです(これはVS2005にも当てはまりますね。私はVS2003をいじって、「Formって、Formクラスを継承したこーゆークラスを定義していたってコトだったのか」と、とても腑に落ちたのですが、2005からはVB6.0ライクになってこの辺が隠蔽されるようになりましたからねー…)。

Accessの場合、FormやReportオブジェクトについては、暗黙のインスタンスの生成をAccess側で勝手にやってしまっているのでしょうが、VBAがスタート地点で、コード先にありきだと、この辺が見えてこなくて、混乱の元になっていくんですよね。

自分を振り返ってみても、制御構造類などは見ればわかるものはいいですが、「こう書けばこう動くらしい」というみようみまねで書いていたオブジェクト変数の類は、長らく一種の不思議ボックス状態でした。あわせてSetステートメントもわかりづらい「呪文」でしたね。

DAOやADOなどでSetを使うこと──特にRecordsetなどの、自分でNewと書いているSetのイメージは、何度となく書いているうちに、自分なりにイメージは形成されてはいました。とはいえ、その「理解」も、今思えば、「New」の部分の「インスタンスが生成される」という感覚・イメージの部分だけで、Setの「メモリアドレスをオブジェクト変数に代入している」という役割の部分は、わかっていなかったわけですが…(この辺、我ながらホントに大混乱/未整理状態ですよねー。こんな状態でよく書いていたなー…)。

というわけで「お作法的」にしか飲み込めていなかった私にとって、かなりビミョーだったのが、NewをしないSetステートメント の存在です。Access単体で使うADOで云うならばCurrentProjectだとか。既に開いているFormやReportなどもそうですね。

Dim frmF_001 As Form
Set frmF_001 = Forms!F_001

frmF_001.txtData = "01"

Set frmF_001 = Nothing

というようなオブジェクト変数へ参照させる書き方は、当初、躓いていました。

F_001が開いたタイミングで「暗黙のうちにインスタンスが生成されている」とは明確に考えておらず、「Setステートメントなのに、なんでNewしないんだろ…?」と不思議だったわけです。いろいろな事が悲しくなるくらい、つながって見えていませんでした。

まーそれでも間違った書き方をしていればデバッグでエラーが出るので、デバッグ機能にダメ出しをくらい数をこなしているうちに、「ダメな理由をぼんやりイメージ/理屈を考える」積み重ね、Recordset等で書いているNewとの差を考えてみた結果、「mdbやフォームが既に開いているからには、CurrentProjectやFormなんかは、新しくNewしちゃいけないんだろうな」という感覚程度ならありましたけどね。

当然、継承関係も明確にはわかっていませんでしたので、

Dim frmF_001 As Form_F_001
Set frmF_001 = Forms!F_001

frmF_001.txtData = "01"

Set frmF_001 = Nothing

こうも書けるカラクリもイマヒトツわかっていませんでした(「Form_F_001」という型は、インテリセンス機能で出てくるので、そういう型が存在していること自体は、Accessをいじっているうちにわかるわけです)。断片的な情報から「Formという型がForm_F_001の親玉なんだろうな」というザックリとしたイメージはもってはいましたが、長らく「理論よりもコード先にありき」な状態だったので、それらはコードから自分なりに読み取ったイメージ/予測/解釈にすぎません。

VBAからはじめたユーザーにとっては、親切設計がすぎるがゆえに、いろいろな事が唐突な変形にしか見えないんですよね。フォームのことを「クラスモジュール」と呼ぶことは知っていても、自分がクラスの一部分を書いているという自覚も当時はありませんでしたし…。

これがclassの書き方を知ってからは、それまでのモヤモヤしたイメージ/理屈が、劇的に自分の中では一気に鮮明になったわけですね。

「クラス」と「インスタンス」の関係を知ったときの私の感想といえば、プラトンのイデア論に似ているなぁ、というものなのですが(洞窟の中で焚き火をして、その後ろで踊っているのがイデアで、洞窟の壁にうつる影法師は人間の住む世界だ、というあれですね。周囲からは同意を得ることはできませんでしたが、その関係性は似ていますよね???)。クラスが隠蔽されているVBAの世界は、私にとって影法師のみを見せられているようなものでしたね。

2008/05/05

Basicのお誕生日

5/1はBasicの44歳のお誕生日だったらしいですね。

私が最初に触れたプログラム言語も、学生の頃にちらっと触れる機会のあったBasicといえばBasicです。授業の内容は殆ど覚えてはおらず、妙に地味な印象しか残っていません。毎週のように課題が出され、なにがしかレポートにし、計算とグラフくらいしか描いていないような…。

うーん、どんな言語だったっけ?──と思って本棚をみたら、ちゃんと当時の授業のレポートがごっそりでてきました…(照)。久しぶりに当時のレポートに載せているBasicのコードをみてみると(レポートは課題の出題内容、考察とコード、および結果出力で構成されているので、レポートだけで大体なにをやろうとしたのかはわかります。言語の仕様は教科書がないのでコードから読み取るほかありませんが)、

  • インデントがなく、全部大文字(小文字やインデントはなかったんでしょうかね?)。
  • 配列の変数宣言ではDIMとか書いてありますが、数値型等では明示的な変数宣言もせず、型宣言もしていませんね。
  • FOR NEXTの呼応はあるようですが、IF文はEnd IfがなくTHENの後には、いきなりライナンバ(驚)。
  • IF文も含めて、GOTO文やGOSUB文など、ラインナンバが必須みたいな言語だったんですねぇ。
  • ところでこのラインナンバ、番号がぽんぽん飛んでいるので、エディタ機能ではないようなフシがありますが、もしかすると手入力だったのでしょうか?(手打ちでもしないと、切番などへは調子よく飛べませんからねー。ありうる)

いまのVBにこれらの面影あるか?と云われると、多少あることはあるような気もしますが、かなり変身したものですね。別物といえば別物だし、でもCの系譜にある言語よりは、1行ずつのセンテンスでみれば近いようなところもあるし…。

いずれにせよ、コマンド等も少なく、言語としてやけにシンプルだなぁという印象です(教師の方がマトを絞っていただけなのかもしれませんが。多少のアリゴリズム等をやらせたかったのではないかという形跡もありますし…)。

手元に残っているレポートに載っている範囲では、数値型と文字列型オンリーなのでクラス/オブジェクトのようなものも登場してきませんし、行番号でどーにかしようということ自体、わりとあり得ない感じの驚きはありましたが(←見事に綺麗さっぱり忘れていました…)。

VBはこの辺が始祖なんだなぁ、と思うと、VBユーザーとしては歴史も感じてちょっと面白いレポートです。

2008/05/03

変数のスコープと有効期限

故あってAccessのVBAの講習会へ参加したことのある同僚から、講習会本を借りて、このテの教材はどんなものかなーとちょっと読んでいたわけですが、講習会って、スゴイんですね。「VBAだしなー」と甘く見ていたら、言語の基礎を思った以上にかなりがっつり網羅している。…今思うと、VBA/VB6.0をいじっていた当時、単に私がなにがなんだかわかっていなかっただけなのですが(理屈はわからず「お作法」的に覚えたクチ。VB6.0ユーザーには多いのではないでしょうか)、基本という意味では、VBAの基礎本といえどもそれなりに網羅しているんだなぁ、と妙に感心。普段通いなれた安全な道しか使わない方なので、「そーいえば…」というものも出てきて、勉強/復習になります。

そんなこんなでテキストをみながら、「あぁこのネタにはハマったことがあるなぁ…」と思い出したり発見することも多い今日この頃なのですが、そのひとつが正直に告白しますと、変数のスコープと有効期限です。…基本中の基本ですね!!

VBAにはブロック・レベルのスコープはありませんが、VB.NETにはブロック・レベルのスコープがあります。

「スコープ」についてはブロックの外でブロック内で宣言した変数を呼び出そうとしてもエラーになるので、「あぁこれは使えないんだな」ということがハッキリわかるわけですが、「有効期限」はちょっとわかりにくいですよね。…そうでもないですか?

無教養な私の場合、「スコープ=有効期限」のように思いっきり錯覚していたわけですが、スコープと有効期限は別物なんですよね。VB.NETでのブロック・レベルのスコープでいうなら、変数の有効期間は、プロシージャ全体の有効期間です。

…で、その辺いい加減な理解をしていた私が何をやったかというと、お察しの通り、ブロック内で変数宣言した構造体を、自分で初期化せずに、使ってしまったわけです。当然、「宣言したところで初期化されている」という思い込み、プラス、有効期限もブロック内だという勘違いを前提を元にコーディング。その結果、恐ろしいデータができたので、すぐさまスコープと有効期限の違い、自分の勘違いにも気がつき、「とりあえず、なんでも自分の思うタイミングで初期化しておけば間違いない」というとても初歩的な教訓は自ら体験して得たわけなんですが。基礎本をちゃんと読めばそんなことは書いてあるのに、書いてあることがうまくつながらずに読んでいるとこうなるわけですね。

「スコープ/有効期限といえば、そんなこともやったっけなぁ」と我ながらイタイ思い出を振り返りながらテキストを読んでいると、Accessの場合、「標準モジュールに書いたPrivate変数の有効期限は、MDBを閉じるまで」と書いてあるではないですか。ひょええぇ…。これって、VB.NETでも同じことなんでは?

これまでVBA/VB6.0でいうところのクラスモジュール、およびインスタンス生成のクラスではPrivate変数宣言は使っていました。この場合「フォーム/レポートが開いている間は有効」、「インスタンス生成してそのクラスが生きている間は有効」ということで、迷うほどのこともなくわかりやすく特に問題はありませんでした。でも標準モジュールの類では、私は変数/プロシージャーを含めてPublicなものしか使ったことがなかったんでよね。故にあまり考えたことがなかったということもできますが、スコープ/有効期限は大事、と思いながら、標準モジュールの宣言セレクションで宣言したPrivate変数の有効期限をロクに認識していなかったとは、どーゆーことでしょう。

VB.NETでは標準モジュールにあたるModuleもありますし、それと同等の役割を果たすSharedを宣言しまくりのクラスの場合も、この辺の理屈は一緒の筈です。それなのにこれまでこの辺をロクに認識していなかったとは……。VBA/VB6.0時代同様、このテの場面ではPrivateで変数宣言をしようと思ったことがないので、幸いバグったことはありませんが。あああああ、足元で思いっきり躓いた感じでショックです。痛い、あまりにも痛い…。

モジュールみたいな場所でずっと値の生きているPrivate変数というのは、使いづらそうなので、今後も個人的にはあまり使う場面はイメージできないのですが(インスタンス生成のクラスでカプセル化した方が安心…)、言語の仕様はきっちり読んでいないと怖いですねぇ。自分の使ったことのない新ネタは使う前に仕様は確認はする方ですが、基礎がないと仕様を読む際のポイントもわからないですからねぇ。そしてワナにハマって「あの意味はこれだったのか!」と気がつく。…ときどきこうして基礎本を読んで振り返るのは、なんであれ、まだまだ勉強になります。

2008/04/28

Excel ひとつの列の分割テクニック

同僚からちょっと面白いExcelネタを振られたので、そういうときの一番簡なワザを伝授しました。

その同僚の問いはこんな感じ。

  • A列に「XXXX-XX_999」というフォーマットで、CSVファイル名の一覧が入っている。
  • アンダースコアの後についている「999」はCSVの件数で、この「999」をゲットしたい。
  • 但し「XXXX-XX」にあたる部分の桁数は不揃いだし、「999」の方も、1桁だったり、4桁だったり桁は揃っていない。

同僚は「Right関数とかを使うのかな~?」というところまでは想像したものの、桁が揃ってないのでうまくいかず、関数を調べればどうにかなりそうだと見当はついたものの、調べているヒマもなく、アワアワしていたという話。

私はExcelには、大雑把に言って、オペレーター・テイストな小技と、プログラマー的な小技の2種類があると思うのですが、まずは超ラクチンなオペレーター技から。

  1. 問題の列を選択。
  2. [データ]→[区切り位置]
  3. 「カンマやタブの~」のオプションのまま[次へ]
  4. [区切り位置]のオプションで[その他]のヨコにあるテキストボックスへ、今回の区切り文字となる「_」を入力→[次へ]→[完了](まー、「列のデータの書式」を設定したければ、この辺でどうぞ)。

以上、Excel単体でこのテの問題は、サクッと完了できてしまうわけですね。文字列1文字を区切り文字にできてしまう「その他」オプションは意外と便利なので、試す価値アリです(「カンマやタブ~」のところまではきても、「その他」を使ったことのない人は意外と多い)。

ちなみにうちの新人に「Excelならではの機能を使ってもいいし、それよりはちょっと手間でも関数の組合せでも処理できたりするけど、どーゆー手段があると思う?」と気晴らしにネタを振ってみたところ(現在新人はAccess猛特訓中…)、列をエディタへコピーして、「_」を「,」へ置換。テキストファイルを「.txt」で一旦保存。それから「Excelでのcsv ファイルの取り扱い方」で扱った「ファイルを開く」から始めて、上の手順3に合流した流れへ入っていきました。ちゃんと教えたことを流用していて、なかなか良い解答を出してきました。

他に、SQLで頼まれようが、手続き型言語で処理するときだろうが、思考方法としては同じだから、その後につながる基礎体力になるだろうということで、新人へは関数技もあわせて伝授。一応、新人にはExcelにおける一通り文字列関数は教えたし、簡単な関数のコワザも教えたものの、まだまだそれらを組み合わせたコワザはでてこないようなので(調べてわかればオーケーだと思うので、基本はググって調べるなり、閃くなり、自力で問題解決できればオーケーという感じでやっているのですが)、

=VALUE(RIGHT(A1,LEN(A1)-FIND("_",A1)))

とかをやってみせる。

FIND 関数は指定された文字列(検索文字列)を他の文字列(対象)の中で検索し、その文字列が他の文字列内で最初に現れる位置を左端から数え、その番号を返す関数ですね。今回の場合SEARCH関数でも良いですが…。あまり細々したことを一方的に教えても仕方がないので、その辺の応用・知識の広げ方・好みは本人に任せるとして…。「先日教えてもらった関数はこのように使うのか」というカオをしていたので、大丈夫でしょう。

ちなみにこのテの列の分割ネタでよく頼まれ、しかもわりと面倒なネタとしては、住所の分割で、「都道府県とそれに続く住所を分けたい」とか、「市区町村と~以下同文」あたりなんですけどね。

住所を印字する場合、住所ラベルにしろハガキにしろ、印字面積の横幅は決まっているわけで、長い文字列の住所を扱う場合、ある程度の単位で改行する必要がでてきます。ところが、「なーんにも考えないで住所を収集しました!」という人々のデータというのは、最終的に印刷するときのMAX文字数を考えず(横幅とフォントサイズ次第で、つみこめる文字数は違ってきますが、それにしたって限界というものはあります)、1フィールドだったりするわけです。文字数でばっつり改行を入れても、郵便物は届くようではありますが、番地の途中等で改行されるのは見苦しいので、なるべく住所の文脈で改行したいではないですか。

「こんにゃろー、最初から分割していればくっつけるのは簡単なのに、文脈で分割するのは何倍も大変なんだよー。最終的に何の為にデータを集めるのか、少しは考えて回収しろよー」とブツクサ思いつつ、頭をしぼるわけですね。入力の段階で考えておけば手間いらずなのに、こっちになんの相談もせず、勝手に営業なりド素人が集めた回収データは、なにかとファジーで、データとして汚いものが多いわけです。

ちなみに住所分割のコワザは(特に都道府県分割ネタ)、ググると結構小技が出てくるので、わりとメジャーなネタなのではないかと思いマス。なので省略。

2008/04/27

買ったわー

GWはGeekWeek…。本日、マシンを買ってきました。ひさしぶのマシンのお買い物ですから、ついつい店員さんに根掘り葉掘り、部品ひとつひとつについて、訊いてしまいました。

見れば欲しくなるので普段は見ないようにしている…、というのもあって、ハードはマッタク詳しくないんですよね。ぽんぽん新しいCPUやらが出てくるし、グラフィックス系の部分もよく知らないし、Vistaもいじっていませんし…。ここ数年流行している光沢液晶も、いまだに使ったことがありませんし。

「完全に時代遅れだなー」という自覚があるので、ここぞとばかりにハテナ?と思っていたことはがんがん質問。

「ハードをいじるのことが、この人、かなり好きなんだろうな」という感じのハードへのラブが伝わってくる人で(「ナカを開けるとこのコはキレイなんですよー」と思わず嬉しそうに云う様は、まるで「内臓がキレイですねー」と嬉しそうにいう外科医のよう)、気兼ねなく質問できてヨカッタです。で、このオタな感じの店員さんは、「見た目より実をとれ」的な解説をする人で(さすがにあれだけ質問すれば、私の価値観を見極めますわね)、なんだかんだでディスプレイもノングレア液晶をプッシュされ、ノングレア液晶に…。

「光沢なんてただの飾りです!えらいヒトにはそれがわからんのですよ。映り込むのに!」

…みたいな?

あのツルツルした華やかさにふらふらと気持ちは傾いていたのですが、職場の蛍光灯が明るすぎたりして、常にディスプレイの「反射」には悩まされている日常があるので、「映り込み」の話を聞いて光沢はアッサリ断念。

省スペースのデスクトップが欲しかったので(≠ノートで。この数年ずーーーーーっと家でも職場でもノートだったので、なんというか飽きました)、まー満足です。OSはXP(今回は一応、Vistaのダウングレードで購入。XPはProfessionalなのでIISも使えるわー←所詮なにかとMSっ子)、CPUはCore2Duoとかがいいなーと思っていて(要はCPUが2つ以上ってところに拘っていた)、省スペース、の3つが必須条件。となると、殆ど選択肢がなかったところはありますが…。

お届けは29日の午前中デス。たのしみーー。

え、機種は?…秘密デス。

Excel 汚いデータをキレイにするにあたって便利な関数

データをクリーニングするにあたって便利な関数は、大体においてこんなものでしょう。

  • RIGHT関数/LEFT関数/MID関数…右から、左から、何個目から何個まで文字列を取得
  • TEXT関数…数値を書式変換した文字列にする
  • LEN関数…文字数
  • TRIM関数…左右の空白除去
  • VALUE関数…文字型のものを数字型に変換
  • JIS関数/ASC関数…全角・半角変換
  • UPPER関数/LOWER関数…英数の大文字・小文字変換

Replace関数(特定文字を置換する)も便利な関数ですが、Excelの場合だと、置換機能があるので、ちょっとした半手作業でデータを処理する場合、私はあまり使いません。

オーソドックスな利用シチュエーションは以下の通り。とりあえず、ここでは機能と使い方のヒントを列記していきます。関数の詳細については、Excelのヘルプを見てください。

LEFT関数を使って0つき数字の生成
RIGHT関数はそもそも右から何文字目までをゲットしてくる、という典型的な文字列操作関数。「0001」「0002」など0をつけて数字の桁を揃えたいとき、非常によく使います。
ex)A1に「123」という値が入っていて、B1のセルに「00123」という5桁のゼロつき数字にして表示したいとき
 B1のセルに「=RIGHT("00000" & A1,5)」と書く
 ※()カッコの中の文字列を引数と云います。「引数」というコトバは、頻出単語なので、関数の中に入れる文字列のコトなんだ、ととりあえず覚えておきましょう。この例の場合だと「"00000" & A1」と「5」のことを引数と云います。
 たとえばこのままドラッグすれば、A列の数字が全部5桁の0つき数字に揃います。
TEXT関数を使って数値の書式を揃える
TEXT関数を使って、数値の書式を変換することも可能です。上記の例で0つき数字5桁に揃えるには、
「=TEXT(A1, "00000")」
とかですね。TEXT関数でカンマつきの数値変換、及び日付変換などもできます。VBで云うところのFormat関数のようなものです。
LEFT関数で固定長の文字列の生成
RIGHT関数とは逆に左から何文字目までをゲットしてくる、というタイプの関数。固定長の文字列を作成したいときなどによく使いますね。固定長というのは、全角の6文字なら6文字で、文字と全角スペースで六文字を埋めてしまうこと。PCだと可変のCSVでのやりとりなどが多いのでこのワザの出番はあまりありませんが、ホスト相手にやりとりするデータだと、固定長にすることが多いので、基本はコレです。
ex)A1に「まつもとひろゆき」とかいてあって、B1のセルに「まつもとひろゆき□□□□□□□□□□□□」と表示したいとき。
 B1に「=LEFT(A1 &REPT("□",20),20)」と書けば、
「まつもとひろゆき□□□□□□□□□□□□」
という結果に。REPT関数は今回の場合、□を20コ繰り返すという意味。□を全角スペースと見立てると、固定長になります。
MID関数
左から何個目から、何個までをゲットしてくる関数。ちなみに左から「何個目から…」というところを1に設定すると、LEFT関数と同一の意味で使えます(一番左は1とカウントします)。上記の「まつもとひろゆき」の例の場合、「=MID(A1 & REPT("□",20),1,20」となります。
ちょっとした固定長のデータの検証するときなどにも多用していますねー。このテの仕様書は大抵Excelでいただいているので、フィールド名と文字数などが表になっているわけです。開始文字列の数をExcel上でちゃちゃと計算して(区切り文字があればそれも考慮)、仕様書の文字列数をそのままセットすれば、MID関数で固定長のデータを拾ってこれるわけですよね。私の場合、開始文字列と、拾ってくる文字列数を、仕様書のフォーマットにあわせて縦に向かって計算して、コピー&ペースト術で、それらのタテ型の列をヨコに並べる。で、このフィールドごとの開始文字列のポジションの計算結果と文字数を利用して、MID関数を利用することが多いです。仕様書をそのまま利用できるのでなかなかこのテの組合せは、ちょっとしたときにベンリで重宝しています。
LEN関数
文字数をカウントして返してくるカウント。Replace関数やMID関数、FIND関数などと組み合わせて使うシーンが多いですねー。
TRIM関数
引数の文字列の左右の空白を除去してくれます。「□あいうえお□□」という文字列がセルA1に入っていたとしたら、「=TRIM(A1)」で「あいうえお」を返してきます。空白が入っていれば、文字列の文字コードの組み合わせは変わってきてしまい、「見た目」は一緒なのに、データは異なるデータとして認識されますので、なにかと不都合がおこります。ですからなにかとデータにはTRIM関数を一旦かませてから、比較したり、加工したりすることなどが多いです。
VALUE関数
セルの書式設定が「文字列」のまま、見た目「数字」のデータを計算しようとしても、データ型は文字列として扱われ、四則の計算などの処理は一切出来ません。ですから、数字としてデータを扱いたい場合、一旦「VALUE」関数で、数値型になおしてから、計算などを行います(詳しくは「Excel文字列を数値変換する」を参照)。
JIS関数/ASC関数
JIS関数…半角文字を全角文字に変換する関数
ASC関数…全角文字を半角文字に変換する関数
というわけで、引数に指定された文字列を変換してくれますヨ。いわゆる「全角/半角」を知らないも入力するのがExcelワールドなので、集計作業等をするにあたってデータをクリーニングしたいとき、このテの関数はかなり重宝します。
UPPER関数/LOWER関数
UPPER関数…英文字をすべて大文字に変換する関数
LOWER関数…英文字をすべて小文字に変換する
このあたりも上記同様、押さえておきたい関数ですね。

以上、大抵の言語には、このテの役割を果す関数は、名前は違えど揃っているのではないでしょうか。プログラマーの方はこのテのコワザの思考方法は一通り抑えているのではないかと思います。

Excel的には、これらの関数と「Excelコピー&ペースト術」を組み合わせで、一発限りのちょっとしたデータをクリーニングのときなどは、大方半手作業で処理できてしまうわけです。

理想は勿論このテの加工をせずにすむよう、汚いデータを作成しないことです。その為には、事前にきちんとなんの為にデータを収集しているのだからどんなモノが必要なのか計画を練り入力時のがっつりしたエラーチェックなどは必須事項です。後から修正する方が当然大変ですから…。

しかし現実にはキタナいデータを突然送り付けられたり、特に単発のものであれば、多少の整形処理をしなくてはならないシーンは多いわけです。そんなとき、これらの関数を知っていれば、グンと早く、より確実な仕上がりのキレイなデータにすることができます。手作業部分が増えれば、それだけヒューマンエラーの出る可能性も大きくなるので、なるべく手作業をやらずにすむ部分はやらないというポリシーで、バッチ的に処理する工夫をして、ラクをしましょう。

2008/04/24

Excel文字列を数値変換する~見た目は数字なのに計算できない!とお困りの方へ

セルには明らかに数字が入っているのに、何故かSum関数やら引き算やら、数値計算ができない!──というシチュエーションの原因は、大抵、セルの書式が文字列になっていることによります。この場合、単に、セルの書式設定を「文字列」から「標準」などに変更するだけでは、計算結果を表示してくれません。何故なら文字列の書式 設定で入力されてしまった数字は、単にセルの書式設定を「標準(或いは数値など)」に戻すだけでは、見た目は数字でもやっぱりExcelには「文字列」として認識されてしまうからです。

よってここでは、「文字列」認識されてしまっているセルの値を「数値」として認識するよう、細工する必要がでてきます。以下が私がよく使っている文字列→数値変換の手順です。

  1. VALUE関数を利用して、あいているスペースに、セルの書式が文字列になってしまっているセルを引数にして、だだーーっとドラッッグしてコピー(B1のセルが文字列だとしたら、[=VALUE(B1)]とかです)。
  2. 貼り付け予定先のエリアの書式を[標準]にしておく([文字列]ではなく![文字列]のセルに貼り付けても、再び文字列になってしまいます)。
  3. VALUE関数で表示させたセルをコピー→形式を選択して貼り付け→[値]オプションをチェック!→任意のセル(貼り付け先のセルの書式は[標準]だとか、ちゃんとしたものを選んでください)を選択して、貼り付け!

Excelでのcsvファイルの取り扱い方でやったように、0落ちをおそれるばかりに、シートを全選択して、全てのセルの書式を文字列にしたときなどに、「見た目は数字なのに、Sum関数さえ使えない!」という自体によく陥るわけですね。それはセルの書式が文字列だから計算できないわけで(見た目は数字だけど、あくまでも「文字列」として扱っているわけですなー。Excelはそのセルを数字だとは思っていないので、計算などはできないわけです…、とデータ型の意識の希薄な人々の場合にはちと説明しづらいのですが、そーゆーもんだと思ってください)、計算したい列などに対しては、文字列から数値変換する必要があるんですね。そういう場面で、このテの変換ワザをよく使っていマス。

Excel上で文字列から数字変換するコワザは他にも色々あって、Value関数を使うかわりに、空いているセルに「=文字列のセル*1」という乗算を行なって、乗算を入れたセルの書式を「標準」選択。[形式を選択して貼り付け]→[値]オプションという流れに入るやり方も、王道の一つとしてあります。

さらにExcel2002あたりのバージョンからは、文字列のセルに数字のみを入れていると、左上隅に緑色のエラーインジケータが表示されているセルが現れ、そのインジゲータを選ぶと「!」が表示。「!」をクリックすると、[数値に変換する]というメニューが表示されるので、これを選ぶと、数字に変換される親切設計になっています。エラーインジゲータが一定範囲で連続して出ている列なんかだと、まとめて列のかたまり毎選択して、いっぺんに数値に変換は可能です。ですが、まー、一定の範囲をまとめて数値変換したいときには、イマヒトツ一発の動作で決まりづらいので、個人的には、関数やコピー業に慣れている人は、Value関数などの計算式を入れる方法が、途中、標準のセルが混ざっていようが気にせず確実に数値変換できるので、ベンリと感じるのではないかなー、という気もします。その辺は、その人の好みによりますが…。

他には、空いているセルの書式を[標準]にしてから「1」を入力。そのセルをコピー。文字列の書式になっている数値型にしたいセルの範囲を選択したのち[形式を選択して貼り付け]→[乗算]を選択→[OK]といったやり方。

[データ]→[区切り位置]→[カンマやタブの…]を選択→[次へ]→区切り文字に[タブ]を選んだまま→[次へ]→[列のデータ形式]で[標準/G]を選んだまま[完了]というやり方もあります。しかしこのやり方では、セルの内容的には数値になっているものの(例えば0つき数字であれば、0が落ちている=数値変換はなされているということ)、セルの書式は文字列のままになってしまうので、最終的には数値にしたかったセルの書式を[標準]に設定しなおした方が、キレイに決まると思います。

ちなみにプログラムでExcelにデータを吐き出すとき、シートを全選択してセルの書式は一旦文字列にしてからデータを吐き出す…、という流れで書く人は意外と多いので、納品されたExcel のセルの書式設定が[文字列]になっていて、その後、「数字として加工ができん!」というような場面は、よくありマス。まー、Excelをプログラムで吐き出す立場からすれば、日付だろうと、0つき数字だろうと、書式を文字列にしてしまえば「見た目」は確実に確保されるわけですから、指定された「見た目どおり」という意味では手軽な手段なんですよね。

というわけで「この納品されてきた Excel表にちょっと手を加えたいのに、どーして計算できないの?!」と大騒ぎしている人々の尻拭い/相談されることは、Excelラブを公言している立場上、好むと好まざるとにかかわらず意外と多いわけです。あんまり変換する表の数が多いときは、責任もって確実に全ての表を、単に0つき数字のコードとして使っているのか数値計算用する必要のあるフィールドなのかをイチイチ見極めて、変換するのは私にとっても苦痛なので(そもそも自分の担当案件ではございませんので…)、発注先に再納品を要求するよう薦めたり、数値変換のやり方を教えて、「あとは自力で頑張ってね」と申し渡したりするわけですが(二度とこんなザルな発注をしてくれるなよ…、てなところです)。

そんなこんなで、Excel納品を依頼する場合には、一応、この辺のセルの書式についても、発注先には予め注文をつけていた方が無難 だと思います。その一方で、このテのExcelを納品をしてくるプログラマ側には、素人が発注するとき、この辺のことは当然気づかないで発注しているんだから、プロならその辺まで察してフォローしてやれよ、とも思うわけですが…。発注元の「仕様」に入っていなかった云々というより、そもそもExcel納品を依頼されているときに、Excelとして死んでいる表を納品してどーする、と思うわけですね…。

2008/04/22

Excelコピー&ペースト術 ~ 行列を入れ替える他

Excelのコピー術、形式を選択して貼り付けから、整形する際によく使う、以下2点についての紹介(ドラッグとかについては、常識すぎるので他を当たってください)。

▲クリックすると画像拡大。
コピーしたエリアの左上のセルを選択して、右クリック→[形式を選択して貼り付け]を呼び出せば、式から値へとそのまま入れ替わる感じになりますね。

  • 行列を入れ替える

まず、形式を選択して貼り付けの呼び出し方は共通ですので、説明を。

  1. コピー範囲を選択
  2. 一旦コピー
  3. 貼り付け先のセルを選択
  4. 右クリックで[形式を選択して貼り付け]を選択

以上の動作を行うとずらずらっと、オプションボタンが出てきます。オプションボタンを選択して、[OK]をクリックすれば、便利なコピー&ペーストは完了です。

[値]オプションを選択

これはセルに関数などの式が入っていて、計算結果を固定してしまいたいとき、このオプションを利用すれば、計算式から見たままの値へと固定されます。式は便利ですが、コピーなどしていくうちに相対的に動いたりもして、危ない側面もありますから、値が不動だと決定したならば、固定してしまいたいときがありますよね。その際にご利用ください。

行列を入れ替える

コトバ通り。このチェックボックスを入れると、行と列が入れ替わりますね。たまーに行と列を入れ替えたい場面というのは出てくるかと思いますが、これであっさり解決です。

わりとこのチェックボックスを知らない方は多いみたいですねー。よく訊かれます。

2008/04/21

Excelでのcsvファイルの取り扱い方~0落ち/日付変換対策

データのやりとりはcsv形式(カンマ区切り)、という方が多いと思います。csvファイルをダブルクリックすると、Excelと関連づけられていて、Excelが起動するマシンがほとんどですよね。ここにワナがあります。csvファイルをExcelで開くと、データが壊れる可能性がある、ということを皆様ご存知でしょうか?

壊れる可能性のあるデータの代表格は、

  • ゼロつき数字のセル(「00001」など、ゼロからはじまるもの。Excelで開くと、数字型として認識されて0が消えてしまう)
  • 「2-2-3」など、数字とハイフォンやスラッシュのみで構成されているセル(「住所の番地のみ」のセルなどで、数字とハイフォンだけ、などだと、日付形式として認識され、番地が日付に解釈されてしまう)
  • カッコで囲まれた数字のみのセルはマイナスになってしまう(「(5000)」は「-5000」に)。

値をみてExcelが勝手にデータを、数字型だの日付型だのに解釈してしまって、データが壊れてしまうわけなのです。もらったそのままのデータの中身をみるだけなら、セルの表示書式は「文字列」でなければならないのです(ただし、文字列の書式だと、計算などはできなくなります。あくまでも「文字列」で数字ではないので)。

Excelでデータを確認して、「上書き保存」などされれば、完全にデータは壊れてしまうわけです(0落ちはともかく、日付変換などは致命的)。このテの事故は大変に多いですね。以下、csvファイルに対するお作法。

大前提としては、拡張子を変更しなければならないので、拡張子を表示しているマシンってトコですね。拡張子ってナニ?!という方はまずは拡張子の表示、隠しファイルの表示で、マシンを拡張子表示状態にしてください。Macは…。わかりません。

事故防止対策:Excelとcsvファイルの関連付けを外す(Winでのやり方)

Excelをインストールすると、Excelとcsvファイルが関連付けされるので、まずはこれを解除します。

  1. エクスプローラを起動。
  2. [ツール]→[フォルダ オプション]→[ファイルの種類]→[登録されているファイルの種類]の中から拡張子[CSV]を選択。
  3. 下段[拡張子'CSV'の詳細]→[変更]→[プログラム]の中から、利用しているエディタを探す、もしくは[参照]。→[OK]

以上で、CSVとエディタへの関連付けに変更されます。ハッキリいってデフォルト設定でCSVとExcelを関連付けていても、経験上、役に立つことはほとんどないと思いますので(紛らわしくて事故の元)、外した方が賢明だと思います。

具体的なExcelでのcsvファイルの取り扱い方
  1. [*.csv]というファイル名を[*.txt]ヘ変更。
  2. Excelを起動。
  3. [ファイル]→[開く]→csvファイルを選択。→[開く]
  4. [カンマやタブなどの区切り文字によって…]にチェック→[次へ]
  5. [区切り文字]で[カンマ]にチェック→[次へ]
  6. [データのプレビュー]で、文字列型のフィールドを選択して[列の選択]で[文字列]にチェック(全フィールドの選択も可。私は大抵、データを壊したくないので、とりあえず全フィールドを文字列にして、開いて中身を確認する、というパターンが多いです)→[完了]

ちなみに、ファイル名をtxt名に変更しないと、セルの書式を選択するウィザートが起動しません。

以上がオーソドックスな開き方。

他に、似たような手順としては、[データ]→[外部データの取り込み]→[テキストファイルのインポート]で拡張子を選ぶ[ファイルの種類]のボックスで[すべてのファイル(*.*)]を選択して、任意のCSVを選ぶという方法(その後は[カンマやタブなどの区切り文字によって…]という上記の手順と一緒)もあります。

CSVファイルをエディタで開いてコピー、Excelに貼り付けて、[データ]→[区切り位置]を選択して、[カンマやタブなどの区切り文字によって…]以降の手順に入る方法もあります。

少し気の利いたエスケープシーケンスを利用できるエディタ*1をお持ちの方でしたら、カンマをタブ区切りに変換。Excelのセルの書式を文字列にしておく、エディタのタブ区切りデータをコピーしてExcelに貼り付け、という方法などもOKです。

そんなこんなで、csvファイルよりタブ区切りのデータの方が、好ましいと私などは思っていますが、世の中はcsvファイルが主流ですからね。仕方ありません。

データに0つき数字などのあるcsvファイルで、スタートの私たちから仲介役を渡ってエンドまでの距離が長い場合や、事前に取り扱い方の注意をいくらうながしても、「この人、どーもわかってないな…」と危険を感じるとき、わざと拡張子をtxtにしてファイルを受け渡すこともあります。そうすると大抵素人さんは「Excelでファイルが開かない!」と大騒ぎして、データ作成元のこちらに問い合わせしてくるので、そのタイミングで"待ってました"とばかりに、電話で開き方講座をリモートコントロールして行なうわけです。csv取り扱いのマニュアルをつけようが、事前に注意を促そうが、現実に困るまでは、何を云われているのかわからない人はわかってはくれませんので、拡張子を変えてしまうのが、相手のレベルも測れて、意外と安全なんですよね…。

*1タブは¥t、改行は¥nとかで表現できるエディタであれば、検索対象に「,」カンマを入れて、置換後文字列に「¥t」と入れれば一発で置換完了。WinでフリーのエディタだとTeraPadあたりだと、アドミ権限をもっていなくてもインストール可能なので、わりと万人向けにオススメかも。

2008/04/15

Excel布教ことはじめ

客寄せパンダ的にExcelの簡単な小技・哲学なぞもちまちま載せていこうと思います。新人教育の時節ですし…(遠い目)。

Excel小技サイトは数あれど、私の中にもExcel哲学はありますので…。小技は数ある小技サイトで十分だと思いますし、細かいテクニックはその都度調べればいいと思っているわけですが、最低限覚えておくべき実践的な技、及びExcelを使うときに根底を流れるべき「哲学」の部分が、小技サイトや市販の教本にはどこか物足りないさを感じるわけですよ。私のExcel上における価値の基盤は、速さ、正確さ、美しさ。云ってみれば、処理の最短方法というところでしょうか。

ジオング
足(線引き)なんてただの飾り…!とは云いませんが。エクセルで線を引っ張るのは、最後でいーの!引き方にもちゃんと美学があるわけですから。

普段から私はExcelラブを公言しているので、Excel/Accessネタでは便利屋の如く呼び出され、他人の手元をみるチャンスも多いのですが…。

Excelは手軽なアプリなだけに、ユーザーのレベルも千差万別で、それ故に怖いツールだなーと思うことがしばしばあります。

この辺の「常識」の違いが、人災的ボトルネックになったりもするので(中継ぎ役が確認のつもりでCSVファイルをExcelで開いたせいで、データが壊れた!!とかはたまに聞く話…。運用を考えるとき、この種の余計なことをさせない経路を作るか、「常識」を関係者各位に徹底認知させるかはケースバイケースですが、その辺も読み込んでおかないとあっさり事故になりますからねー)、こちら側から歩み寄る必要は常に感じているわけですが。普段Excelを使い倒す必要のない人たちにどうこう云ってもしょうがないので、わかっている方が、基本、先回りして予防に走るしかないなー、というのが私のスタンスです。

とはいえ、あんなものは飾りです。 偉い人にはそれがわからんのですよ。(byジオン兵)と云いたくなることも、正直多いです。

あんなもの、というのは、罫線引き、セルの結合、フォントサイズ、色つけなどなど。Excelのビギナーであるほど(営業さんとか)「見た目のみ」重視で表を作成しているフシがありますが、私らデータ屋は再利用のしやすさを重視します。

見栄えも重要ではありますが、幾らキレイに色をつけても、表をつくるからには、色だけではなくフラグ(或いはコード)もたってなければナンセンス。フラグさえ立っていれば、色づけ線引きなんて瞬殺ですから。

「データを作成する」ときは、常に再利用(加工のしやすさ)について考慮するべき。偉いヒトにはそれがわからんのですよ。いくら綿密に網掛けをしたって、そのデータを二次利用するとき、網掛けじゃ、フィルターだとか並び替えだとかが全然できないじゃんよ。営業君がご丁寧に網掛けしてくれたデータをみて、その後ぼちぼち手作業でフラグをたてていくときのむなしさときたら…!同じ労力をかけるのなら、色づけじゃなくて、まずはフラグを立ててくれよ!!コストのムダ!──と心中叫んでいるExcelユーザーは多いはず。

タグでいえば、物理タグと論理タグの溝みたいなものでやんす。私は当然論理タグ派です!!なんちゃって。あっ、そこでソースをみないこと!

mumble→今年の新人はカーリング型でしたっけ。超氷河期時代の私たちとは隔世の感がありますの…。

6月以降どこへ配属されるにしろ、ググり方、Excel、Accessの基本は3種の神器として叩き込まねばの、うちで預かるからには。

でも実際の仕事としては、手頃なサイズの課題が今現在、私の手元にはあまりないんだよなー…。入力作業でも集計作業、ラベル印刷でも細かいものならなんでもいいんだけど、誰かなんか軽めの仕事をくれないかなー。やっぱりナマの教材の方が燃えるし。

自分の得意ジャンルのものは、ある意味、気がつくと同時に処理しちゃっているところがあるので、私の周囲では常に残件ゼロ状態…。わりと困る。

2008/04/05

Webアプリのバッチ処理

こんばんは。なにかとスタンドアローンのじょにです(←ちょっとヤケ)。

普段私はバッチ処理系なものを作ることが多いので、大量データを一気に加工するシーンはよくあります(でもMax60万件くらい。まーそんなもんです。Accessなので)。バッチ処理といえども、流して帰る…、という悠長なことはなかなかやってはいられませんので、なんであれ、待ち時間(処理時間)はなるべく短くすることは常に気にかけています。その際、まず私が考えることは、アプリからDBへのアクセス回数を減らこと。

DB設計も絡んでくる話だとは思いますが、手っ取り早い手段としては、

  • コード等が入っているマスターテーブルをハッシュに入れて、いちいちエラーチェックやら情報付加の為にマスターテーブルにアクセスしにいかない。
  • ぶんぶんLoopさせているところは、SQL一本で一挙にカタをつけられないか考える(Loopの回数を減らす)。

あたりでしょうか。

ADO.NET であれば、テーブルをDataSet(メモリ常駐型のデータ表現)へ展開させるので、自然とそれほどDBへはアクセスしなくてすむようになりましたが(もっともメモリに展開してからの書き方は色々で、書き方次第かなり速度に差は出ます。DataViewに突っ込んでRowFilterを使うよりハッシュを使った方が早いとか、リレーションシップを生成した方が早いとか)、Access単体の時はADO/DAO接続なので、インデックスの張り方、Dictionary関数とSQLの使い方に比重がかかってきます。その為には、メモリでもワークテーブルでも使えるものはなんでも使おうとします。

ところがWebのお作法は少し違うようですね。

近頃近所でアワアワしている人が、テストサーバーでWebアプリからよくCSVファイルをテーブルへ登録する実験を行なっています。登録したい件数が多すぎて(といっても4万件くらい?)、1回でアップロードできないので、その原因を探っているとのこと。テスト環境のColdFusionからかえってくるエラーメッセージはメモリーオーバーです(なんでメモリーオーバーのエラー表示???)。そんなこんなで、現時点で本番環境で速やかにできることといえば、CSVファイルを分割して、ちまちまアップロードすることくらいなんですね。あまりにそれでは手間ヒマがかかりすぎるということで、うまいことソースに修正を加えたいらしいのですが…。

実験してみてわかったことは、一見胡散臭そうにみえたCSVファイルの読み込み、INSERT文自体は4万件であろうとも、実はほんの数秒の処理であること。負荷の原因は、どうやらCSVファイルに対するエラーチェックだということです。で、そのエラーチェックのソースがどうなっているかといえば、1件1件エラーチェックする為に、次々、コード表を持っているテーブルを見に行っては値のチェックを行なっている。え。


4万件×何回テーブルを見に行っているの?


担当者は「Oracleだから沢山アクセスがあってもダイジョーブ」とか云っていますが、それってホントのことですか?この辺のことは簡易DBのAccessユーザーの私には正直わかりませんが、仮に1行につき10回DBを見に行ったとすれば、あっという間に40万回の連続ワザ。ホントにそれでヘーキなのでしょうか。なんであれ、ラウンドトリップ回数なんてなるべく少なくするべきものなんじゃないの???

Webの世界だと、色んな人が色々なテーブルを参照したり更新していたりいるし、アプリケーションサーバーでパワーの要ることをやったり(ハッシュとかも私のようにばんばん使っていると、一人分のメモリ消費×同時アクセスしている人数なので、あっという間にサーバーのメモリを消費してしまうわけですね)、色んなレコードに対して一挙にどうこうすると、Webを使っていた他の人が困っちゃう…、という発想があるから、ロックをかけるレコードはなるべく少なく、ちまちま1件ずつレコードを見に行くのがまずは基本のようですが。

CSVファイルの登録なんてバッチ処理なんだし、ある程度のコード表ならいちいちDBへアクセスしにいかずにメモリで持っていた方が断然早いし、既存データとの重複チェックを行ないたいなら、ワークテーブルに一端入れて、SQLで一発チェックした方が手っ取り早い気がするんですけど(或いはテーブルに入れてステータス管理とかでもまぁいいけど、インデックスとか張っちゃったりしていると問題ありそうなので、ワークテーブル)。ワークテーブルにもセッションみたいなものを入れられるフィールドを1列作っておけば、ワークテーブルに入ったデータのうち、どのセッションで利用したデータかの識別はできるわけだし──とか考えちゃうわけですが、なんらかの「失敗」がおきて残っちゃったワークテーブルのデーターをいつ削除するんだ、とか色々あって、そういう考え方自体危険なのかなぁ…、と無知なだけにモヤモヤ。

普段、スタンドアローン寄りのアプリばかり作っているので、この種の「バッチ処理」の実装部分で私はそこまでメモリの消費を気にしたり、同時アクセスしているメンバーのことをあまり考えていません。複数人で使うLAN内で使ってもらうようなアプリに「バッチ処理」を載せるときには、DBへアクセスしている人が自分以外にいないかをチェックする機能をつけて、「バッチ処理を行なう人は現時点で一人」という環境を作ってから、バッチ処理を実行させたり。「運用」とセットで考えると、単体のプログラムの外側で簡単に解決できちゃうことも多いですから、その辺で無理のないような回避方法を考えるとか(←1本のソフト単体でなんでもかんでもどうにかしようとはあまり思っていない。人の動きを簡便にすることは念頭にありますが)。

私の使っているDBはAccessですし、同時アクセスの人数はもともと少なく、それが通ってしまう素朴な世界に住んでいるので、考え方も「素直」なんですよねー。Web界隈に生息するイシカワさんと話していても、この辺からしていつも距離を感じます。想定条件のあまりの違いに、私ってスタンドアローンなんだなー、Winアプリなんだなー、としみじみ思うわけですね。

まーなにはともあれ、とりあえず、1回のアップロードで全部登録することを最優先に考えるなら、処理時間は無視して、5,000件くらいごとに、スリープさせるロジックをループの最中にいれちゃえば、殆ど今のソースを変えずに、全部登録できるんじゃないかなーというのが私の見込みです。どこでメモリーオーバーをおこしているにせよ、ファイルを小さくすれば通るロジックであることは確かなので、ときどきスリープして、ある程度のかたまり毎に処理を完結させてしまえば、どうにかなるのではないかなーという仮説。根本的な解決にはなりませんが、うまくいっているロジックを大改造するよりは安全・お手軽だし、ファイルをちまちま分割してからアップロードする現状よりは、黙って待つ方がラクチンだと思うし。

なんだか誰も信用してくれずに実験すらしてくれないんですけど(カウントして余りがゼロになったときにスリープするだけなのに!!)、実験してもらえないほど的外れな仮説なのでしょうか?なにかとマイノリティの自覚はあるけどさ…(悲)。

2008/04/02

ColdFusionとJava

ColdFusionはイシカワさんと違って素人なのですが(そもそも私はWeb系全般に疎い…。それに比べてイシカワさんはCFの日本語の参考書を全種類買い集めた人です)。隣で他人がColdFusionのソースの改修でアワアワしていたので、なんとなくソースを見ていて、ナゾなところを、ちまちまとググっておりました(好奇心&手伝いです)。

そんなこんなでウワサには聞いていたけど、CFってホントにJavaで実装しているんだなぁ、と妙に実感したサンプルソース。

<cfset fr=CreateObject("java","java.io.FileReader")>
<cfset fr.init("/tmp/testfile.txt")>
<cfset br=CreateObject("java","java.io.BufferedReader")>
<cfset br.init(fr)>
<cfloop condition="true">
  <cfset line=br.readLine()>
  <cfif not IsDefined("line")><cfbreak></cfif>
  <cfoutput>#line#<br></cfoutput> <!--- この部分 --->
</cfloop>
<cfset fr.close()>
参照元:逆引きColdFusion(1)

上記のソースで私にはよくわからなかったのが、initで、これはなんだろうと思ってググってみたら、リファレンスでは以下のような定義になっていました。

Use the init method, with appropriate arguments, to call an instance of the class.

CFML Reference

initメソッドでjavaのクラスのインスタンス生成というわけなんですね。initのカッコの中は当然コンストラクタの引数。なるほど。

さらにもう一つ、冒頭のソースで躓いたのは、

<cfloop condition="true">

conditionの後の""に条件式を入れるようですが、trueの存在がなんとなく唐突に見えてナットクがいきづらかったのですね。

  <cfif not IsDefined("line")><cfbreak></cfif>

で、読みこんだ行がカラッポだったら、ループを抜けるのでどーでもいいといえばどーでもいいのでしょうが、

<cfloop condition="br.ready()">
  <cfset line=br.readLine()>
  <cfoutput>#line#<br></cfoutput>
</cfloop>

とかの方がなんとなく、個人的には読みやすい気がする…。この辺は普段、自分がそういう書き方ばかりをしているせいなのでしょうか(あ、でも条件式にreadyメソッドを入れることが適切なのか、Javaに疎いので実はあまりわかっていません。どーなんでしょう?)。

ちなみにあれやこれやのサーフィンの道中に、書き込み速度のやり方の比較実験の記事も見つけました(読み込みにあらず)。

CFFILE vs Java.IO.BufferedWriter

CFFILE tag を使うより、圧倒的にJava.IOを使った方が早いんですね。

5.5MBくらいの書き込みでCFFILE tagをフツーに使っていたら600秒かかっていたものが、Java.IOを利用したら、1秒になったそうです。上記サイトの筆者は、当然のことながら、CFFILEはとても手軽だけど、大きいファイルを扱う時にはJavaのメソッドを使った方が良さそうだという結論をくだしています。

まーそりゃそうだろうな、と思いつつも、600秒って10分ですよ。落ちているかと思って、途中でブラウザを閉じてもおかしくない長さですよね。道具は適切に使い分けたいものですね。

memo→本日のブックマーク

はてなのブクマ

ColdFusionのブクマ。ColdFusionは手軽だし、エラーとかも返してくれて結構いいツールだと思うけど、なんで流行らないのでしょーか?

ColdFusionカフェテリア

フォーラム。CF8って.NET Framework 2.0も使えるのか。へー。ほー。でも.NETを使うと今のところWinに環境が限定されちゃうもんね(悲)。Monoプロジェクトに期待したいところだけど、そのままの移植は厳しそうかなぁ…。

Coldfusion-Style

なんか追っかけていたら色々と…。

2008/04/01

カネゴンの78ちゃんねるまとめブログ

エイプリルフールですね。あちこち今年も、エイプリルフールサイトが登場しているのでしょうか。

窓の社は毎年なんとなく見てしまうわけですが(今年は携帯サイトっぽいデザイン)、近年個人的に大ヒットしているのは、円谷ステーション。 毎年4月1日のみ存在しているハイクオリティサイト。今年は「カネゴンの78ちゃんねるまとめブログ」。2chのパロディみたいですね(SNSサイトは帰ってこれなかったらしい??)。この1日限りに向ける情熱に、脱帽します…。

1日限りなので、今日もせっせと探索しよーと思いマス。o(%)o

サイバー大学

この仕事をやっているとコンピューターサイエンスを しっかり学びたいという欲求がしばしば起こります。 1人で学ぶのは、ちょっと範囲が大きすぎで難しいですしだからと言って情報系大学に入学するのもスクーリングなどかなり難しい。

そこで、私が注目してるのがサイバー大学
ちょっと、名前があれなのですが、文部省が認可した学位も 取れる正規の大学です。

授業は、すべてネットから受講可能で通う必要がありません。 設立してから、1年が立ちましたが社会人学生が多くそこそこ うまく行ってる様子です。

ですが、問題がひとつ。

学費が卒業までに270万もかかります。 正規の大学なのでしょうがない気もしますが、私みたいな 境遇の人には、かなり厳しい気がします。

せめて100万以下に、ならないものでしょうか。

2008/03/31

イシカワのスペック2008

じょにさんがスペックをさらしていたので、私も続きます。
書き出してみて、改めて思いましたがたいしたことしてませんねぇ。精進せねば

■わかってること・出来ること

  • PHP:現在の主な言語。まあ、普通にWEBサイトを立ち上げられますよってレベル。 (どんなレベルだ?)現在のところ、一番サクサク書けます。
  • ColdFusion:知る人ぞ知る言語。ポジションとしては、PHPみたいな感じでWEB専用言語です。PHPのsmartyなんて、近いかもしれません。で、スキルですが、現在の2番手かな。 普通にWEBサイトを作れますが、PHPよりは、時間がかかるかも。
  • ASP(VBScript):3番手。ちょっと関数とか自信なしです。 でも勉強する気はあまりなし。
  • WEBサイト:セキュリティも含め、基本的な動きは、知ってるつもり。 なので、言語が何であっても、改修なら比較的早く対応できると思います (WEBの動きから、コードを推測できるので。)でも、whitespaceは、厳しいかも(笑)
  • DB:MySQL、postgres、oracle、SQLserverなど一通り、仕事で使っています。 あとは、DB2が入ればコンプリートかな?薄く広くって感じです。 処理を早くするチューニングなどは、苦手。(インデックス張るぐらいしかわかりません。)
  • SQL:仕事で使う範囲は、問題なしです。早い書き方、遅い書き方なども かなり理解したつもり。DBの速さって8割SQLだそうで、結構重要だと思う。 でも、軽視されがちな気が・・・。
  • Linux:FedoraやCentOSなど主にレッドハッド系のものを仕事でいじっています。 LAMP環境のWEBサイトならば、まあ普通に設定できます。
  • シェル:時々、楽するために使ってます。sedとか少々。もう少し使えこなせるようになりたい。
  • ケータイサイト:PC用とどこが違うんだって突込みがありそうですが、いろいろ違います。クッキー使えないとか、絵文字の処理とか。その辺も一通り勉強かつ経験したつもり。

■やりたいこと・身につけたいこと

  • 正規表現:すごい便利。一回勉強しましたが、もう一度しっかり学びたい。 ちなみに、PHPでは(多言語でも?)多用するとオーバーヘッドが発生するので注意。 関数で出来ることは、関数でやりましょう。(数字チェックなどね。)
  • Java:やっぱり、プログラムと言えば、これ。何かと情報も多いし王道って イメージなので、学んでおきたい。市場価値も高いですし、Web系でも 組込み系で、使えるところもグーです。
  • Ruby:matzさんファンなので(笑)。Rubyを勉強すれば、オブジェクト指向も自然と わかるらしいし、Ruby on railsをやるためにもやっておきたい。
  • Ruby on rails(cakephp):フレームワーク自体あまり好きじゃないのですが、話題になっているので、さわってみたい。でも、「DB設計をする必要がない」とか「SQLを書かないでよい」ってどうよ?
  • コンピュータサイエンス:基礎をやっていないので、この先、この業界でやっていけるか かなり不安。なので、この辺の知識を付けておきたい。
  • 大規模開発:今まで、経験したプロジェクトは、1人~数人程度の小さいものが多かったので、大規模での開発を経験してみたい。大規模なりのノウハウがあるはず。