2009年2月21日土曜日

親父のディスプレイのスイッチが壊れた - BenQ G2400WD

1. ディスプレイのスイッチが陥没した

親父の PC のディスプレイのスイッチが陥没した。 (+_+)

親父は、これまでにノート PC を落としては壊し、数々の電化製品をダメにしてきた経歴がある。「またしてもやったか」という思いがすぐによぎった。

しかし、壊れたというスイッチを見てみると、ありえない形でめり込んでいる。スイッチの左半分が押された状態から、元の位置に戻りきっていない。

 

2. スイッチを取り出すために、分解した

困っている親父を横目に、精密ドライバーでスイッチを引っぱりだそうとするがダメ。スイッチの表面に傷がついただけ。

仕方がないので分解してみることに。しかし、ぱっと見たところ裏面にネジが見つからない。が、よく見たらディスプレイを支える柱の裏にネジがあることに気がついた。

DSC02199

早速ネジをはずしにかかる。念のため、真ん中にある四角い部分のネジもとる。しかし、この部分をはずす必要はなかったようだ。アームでディスプレイを支えるときのための部分なのだろう。

DSC02198

ネジをはずしたので、簡単に開くことができるのかと思いきや、全然開けることができる気配なし。

画面の縁をぐるりと一周見回したら、画面の下の辺にマイナスドライバーをつっこめそうな場所が 2 ヶ所あった。ドライバーをやや強引に押し込み、少し隙間が空いたらそこに精密ドライバーを挟み、徐々に真ん中へと移動させる。マイナスドライバーを最初に入れた位置と、画面中央との中程に、パネルがはずれないための「つめ」があった。これをドライバーで軽く押したら、パネルがパカンと簡単にはずれた。それと同時にスイッチがポロっと床に落ちた。

DSC02197

 

3. 折れたスイッチを見たら、折れた理由がわかった

これが、問題のスイッチ。

DSC02200

複数の角度から見ると、折れてしまった位置がわかる。

足のように出ている所が、基盤の上にあるスイッチを押さえる仕組み。その反対の板のような部分が根本から折れている。

DSC02205 DSC02204 DSC02203 DSC02202 DSC02201

折れた部分を接着剤でつけようかとも思ったけれど、補強しない限りまたいつか折れてしまいそうな感じ。

そもそも、指で押すスイッチの真下に対応する基板上のスイッチがあれば、こんな形にする必要はないと思うのだけれど…。基盤に合わせるために無理矢理こんな形にしているように見える。 (@_@;)

結局スイッチを直すのは諦め、はずしたまま、ディスプレイの電源を付けるときは、細い棒で基板上のスイッチを押すことにした。 (+_+)

DSC02214

 

4. ディスプレイの価格の変動

しかし、このディスプレイ、購入して半年以上経過するのだけれど、そのときよりも価格が上昇しているとはどういうことなんだろうか… (@_@;)


関連記事

2009年2月19日木曜日

Firefox のツールバーのカスタマイズにおけるアイコンが消えた

090219-001いったい何が原因かわからないが、突然 Firefox のメニュー下のアイコンの表示がおかしくなった。「表示 > ツールバー > カスタマイズ」で、インストールしたアドオンに対応するアイコンがごっそり消えてしまっている。ついでに Googlebar Lite が全く表示されていない。スペースはあるのだけれど、アイコン類がなくなってしまった。

たまにこういうことがある。しかし、新しくプロファイルを作りなおすのも手間だし面倒。 (+_+) と思いつつ新しくプロファイルを作成したが、これからインストールするアドオンとその設定を想像するだけでげんなり。やはり、もう一度元のプロファイルで原因を探ろうかと思って元に戻してみても表示はおかしいまま。うーん…。

 

Googlebar Lite が原因?

一度、ツールバーのカスタマイズ画面で「初期設定に戻す」ボタンを押しても表示は変わらず。しかし、Googlebar Lite を一度非表示にしたら (表示 > ツールバー より) 、なぜかツールバーのアイコンのカスタマイズにおいて他のアドオンに対応したアイコンが表示された。 ^^

Googlebar Lite がおかしかったのだろうか?仕方がないので本家の Google ツールバー に入れ替えることにした。

2009年2月17日火曜日

Flickr Uploadr 再び

ブログで使う画像は全て Flickr にアップロードしている。アップロードするときは jUploadr を利用。元は Flickr Uploadr を使っていたが、使い勝手が今一だったので使うのをやめた。しかし、久しぶりにインストールしたらよくなっていた。

 

アップロード後のダイアログ

jUploadr にしてもそうだけれど、画像をアップロードした後、「画像をアップロードしたよ」というダイアログが邪魔。ブログを書くとき、予め使う画像が決っているわけではなく、適宜使うものを選択してアップロードするので、何度もアップロードを繰り返すことになる。その度にダイアログが表示されていては、一々それに反応するのが面倒。どうせエラーになることは滅多にないので、エラーがあったときだけダイアログで通知するようにしてほしい。 (+_+)

以前はこのダイアログ、マウスクリックをしなくてはならなかったが、今試している Version 3.1.3 では ESC キーStay here を押したことになりダイアログを消すことができる。マウスを使わなくて済むようになったので非常に快適。 ^^

090217-002

 

ダイアログが表示されていても jUploadr に貼り付け可能

また、ダイアログが表示されている状態でも、エクスプローラでアップロードしたい写真を右クリック > Send to Flickr... によって Flickr Uploader に貼り付けることができるところもいい。 ^^  jUploadr だと、アップロード後に表示されるダイアログを消した後でないと、アップロードしたい画像を jUploadr に D&D できなかったので、齒痒い思いをすることがしばしば。ダイアログを消したかどうかを頭の片隅に覚えているのは負担だったので。 ^^;

 

XULRunner

ところでメニューより、Tools > Add-ons を選択すると、Firefox のアドオンを管理する画面に似たダイアログが表示される。

090217-003

About Flickr Uploadr を見ると、XULRunner と書かれている。

090217-004

 

XULRunner – Wikipedia とは、

XUL+XPCOM アプリケーションの組み込み、起動を可能にするランタイムパッケージである。… XULRunnerは、GRE (Gecko Runtime Environment) の後継技術であり、Gecko レンダリングエンジンの組み込み技術として利用が可能である。…

配布パッケージを利用することで、C++JavaScript (XPConnect)、Perl (PlXPCOM)、Python (PyXPCOM)、Java (JavaXPCOM)、Ruby (RbXPCOM) などから、提供コンポーネントを呼び出すことが可能である。

上記 XUL – Wikipedia とは、

XUL(ずーる、XML User Interface Language)はMozilla FirefoxMozilla ThunderbirdなどのMozillaアプリケーションを作成するためのユーザインタフェースマークアップ言語である。

XPCOM – Wikipedia は、

MicrosoftCOM技術に似た、コンポーネント技術である。C++で実装されており、LinuxWindowsMac OS Xという主要なプラットフォーム上で動作することから、XP(Cross Platform)の名を冠している。

 

今後どうなの?

XULRunnerで動作するアプリケーションとして挙げられている SongBird は有名だけれど、Flickr Uploadr も XULRunner を使っていたとは知らなかった。

有名な XULRunner アプリケーション – MDC にはたくさんのアプリケーションが載っている。そういえば随分前に @IT:連載 役に立つXMLツール集(8) XULとJSFでリッチクライアント (2004/6/16) に目を通したことがあったが、その後どうなったんだろう? 盛り上がっているとは聞いたことがないだけれど。

Firefoxアドオンの未来と課題を考えてみる - builder by ZDNet Japan (2008/06/26) によると、

アドオンを開発する際の主な作業は、XULと呼ばれるXMLJavaScriptの記述(Mozillaのサイトに詳しい)。どちらもWebで標準的に用いられる技術でありWeb開発者であれば作成は容易だ。…

プログラミングやXMLの記述が全く必要ない環境が整えられ、開発者ではないエンドユーザーがニーズに応じてFirefoxを自由に拡張できれば、Firefoxはプラットフォームとしてより魅力的な物になるだろう。

Google Chrome にそいった環境が整えば一気に逆転になるのかなぁ。。。

2009年2月16日月曜日

ビットレートを変更して DVD を焼く – DVD メーカーの代替 DVD FLICK

古いビデオカメラの動画を PC へ取り込む - S端子 ? DV ? の続き。

 

DVD に焼いたら画質が悪い

今度は親父が、DVD に焼くときの画質に注文をつけてきた。ムービーメーカーで編集したものを DVD に焼いたら画質が悪いと。なんでも、Vista にはじめから入っていた DVD メーカーだとなぜか時間が余っているにも関わらず 150 分の長さになってしまう。

教えて! Watch DVDメーカーでのDVD作成について によると、

DVDメーカーは「固定ビットレート」です。

マクセル / Disc活用法:DVDマスター術:ビットレートと画面解像度 - Disc NAVI には、

ビットレートとは映像一秒間あたりのデータ量のことで、単位には「bps(bits per second:ビット/秒)を使用します。たとえば2000kbpsの動画データは1秒間の映像を2000キロビットのデータで表現し、4000kbps の動画データは4000キロビットのデータで表現します。ビットレートを高くするとそれだけ多くの情報を持つことができますので、より高画質な映像が得られます。

なるほど、ビットレートを変更して DVD に焼ければ良さそうだ。

ちなみに上記によると、

できるだけ容量を抑えつつ、かつ高画質な映像を得たい場合には「VBR(Variable Bit Rate:可変ビットレート)」を使用すると便利です。これは映像の動きが大きいシーンなど、より多くのデータ量が必要な部分はビットレートを上げ、逆に動きが少ないシーンなどのビットレートを下げる技術です。すべての映像に同じビットレートを割り当てる「CBR(Constant Bit Rate:固定ビットレート)」方式に比べて、コンパクトで高画質な動画データを作成できるため、スポーツのような動きの激しい映像を動画データ化する場合に役立ってくれます。

(同上より、太字は引用者による)

うーん、何だかややこしい… (+_+)

 

DVD Flick

DVDオーサリングツールの比較 には、各アプリの機能比較がされており、そこにビットレートを変更できる DVD Flick が紹介されていた。調べてみたら、窓の杜 - 2007年 窓の杜大賞 の銅賞を受賞している。

いろいろな形式の動画を1枚のDVDに焼く DVD Flick - 情報考学 Passion For The Future には、

このDVDFlickはMPEG、FLV、H264、WMV、AVIなど多くのフォーマットに対応したDVD作成ソフト。DVDに焼き込みたい動画をドラッグアンドドロップで指定し、メニューを選択するだけで、簡単にDVDができあがる。フォーマットが混在していることなどは意識しなくて良い。

と紹介されていたので、これを使ってみることに。

DVD Flick - オリジナルDVD作成 : MikasaPHP には、日本語化の方法から細かな使い方が解説されている。

 

早速、DVD Flick の Download からダウンロードしてインストールした。

 

DVD に焼く

DVD に焼きたい動画をメインウィンドウに D&D 。

上部のメニューより、Project settings > BurningBurn project to disc にチェックを入れる。

090215-001

 

上部メニューより Create DVD ボタンを押す。

これで、Project settings > VideoTarget bitrate の設定がデフォルトでは Auto-fit になっているので、動画の長さに応じてできるだけ綺麗な設定で焼いてくれる。

2009年2月13日金曜日

Inkscape で手書きのイラスト画像をベクトルデータに変換 - ビットマップをトレース

1. Inkscape に組み込まれた Portrace を使う

GIMP, potrace, Inkscape の 3 つのツールを使い、手書きのデータをベクトルデータに変換できる。しかし、3つのアプリケーションを使うのは面倒。

Potrace - Inkscape Wiki によると、

Potrace is an open source raster to vector conversion utility. It has been embedded in Inkscape and can trace bitmap images into .svg and .pdf formats.

Inkscape に potrace が組込まれているので、Inkscape だけで目的を達成できる。

 

2. Inkscape で、ビットマップをトレース

画像を Inkscape で開く。

対象を選択し、メニューより Path > Trace Bitmap... を選択。

090213-001

ダイアログが表示されるので、右側のペインの Update ボタンをクリックし、OKボタン。

上手く輪郭が抽出されていない場合は、左側のペインのフィールドの値を適当に調整する。

090213-002

 

3. MS Word で読み込むための形式

.eps, .emf 形式で保存すれば、Word に読み込むことができる。

2009年2月6日金曜日

XREA にDrupal をインストール

概略

Drupal 6 クイックスタートページ | ≡ Drupal Japan ≡ を参考にしてインストール。

方法は、Drupal | drupal.org より最新版である本体 drupal 6.9 をダウンロードし、6.x 日本語リソースキット により日本語化するという手順をとった。

 

必要なファイルをダウンロード

drupal-6.9.tar.gz をダウンロードして解凍。

Drupal 6.x 用 公式日本語リソースキットをダウンロード して解凍。README-JA.txt によると、

LICENSE.txt と readme.txt を除く全てのファイルを、解凍した Drupal 6.x パッケージ のルートディレクトリへ、ディレクトリ構造を保ったままコピーしてください。

フォルダの中身を全て選択してコピーした後、Drupal 本体に上書きでペースト。LICENSE.txt と readme.txt は削除。

 

アップロード

フォルダ drupal-6.9 以下にあるものを FTP でアップロード。今回はサブドメインで運用したいので、public_html/test.XXXXX.XXX/ ディレクトリ以下にアップロードした。(cf. XREA でサブドメインを設定)

 

データベースの作成

XREA のコントロールパネル > 管理メニュー > データベース において Drupal 用のデータベースを作成した。文字コードは UNICODE 。

090205-027

ただし、

データベースを作成します。アカウント名に「-」が含まれている場合、データベースはご利用頂けません。(説明より)

よかったハイフン入れてなくて ^^;

ちなみにここで入力したユーザ名は、

データベース名、兼、ユーザー名 (ヘルプより)

 

インストール

ドメイン名が問題

ブラウザで test.XXXXXX.XXX/ にアクセス。しかし、インストールするための画面が表示されなかった。しかし test.XXXXXX.XXX/install.php にアクセスすると画面が表示される。

test.XXXXXX.XXX/.htaccess を見たら先頭に、

<FilesMatch "\.(engine|inc|info|install|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl|svn-base)$|^(code-style\.pl|Entries.*|Repository|Root|Tag|Template|all-wcprops|entries|format)$">
  Order allow,deny
</FilesMatch>

と書かれていた。ミケネコの htaccess リファレンス によると、

<FilesMatch> ~ </FilesMatch> で囲まれたブロック内で指定されるコンフィグレーションを、正規表現 regex にマッチするファイルだけに適用します。

運用するドメインが .info なのでそれが影響しているかと思い、上記の記述より info を削除。 test.XXXXXX.XXX/ にアクセスしてもインストール画面が表示されるようになった。

ただし、このままでは info ファイルにアクセスできてしまうので、info ドメインで 403 Forbidden と表示される | Drupal.0829.info によると、

modules ディレクトリ内に以下の内容を記述した新しい .htaccess ファイルを作成し、それぞれをサーバにアップロードします。

<Files ~ "\.info$">
  Order allow,deny
</Files>

とすると良いそうだ。

 

後はインストーラの指示に従うだけ。 XREA においてはデータベース名とデータベースのユーザ名が同じになる。

090205-028

 

htaccess の設定でハマったけれど、なんとか完了。てゆうか、随分前に同じことでハマったことをすっかり忘れていた。 (+_+)

090205-029

 

必要のないファイルを削除

Drupal 6 インストール - ステップ1 | ≡ Drupal Japan ≡ の説明に従い、

  • sites/default/settings.php を PHP から書き込み可能にします。(例: 666)

  • sites/default/files ディレクトリを PHP から書き込み可能にします。(例: 777)

  • sites/default/files 以下にある全てのディレクトリ(color, css, js, languages, pictures, tmp)を PHP から書き込み可能にします。(例: 777)

  • インストールが完了後、次のような警告の表示がでた。

    ./sites/default./sites/default/settings.php に対して必要なすべての変更は行われました。 セキュリティ上の危険を回避するために、今すぐそれらのパーミッションから書き込み権限を取り除いてください。

    Drupal 6 インストール - ステップ2 | ≡ Drupal Japan ≡ によると、

    ここで /sites/default/settings.php の書き込み権限を取り除くようにメッセージが表示されている場合、指示に従ってパーミッションを 0644 などの読み込み専用権限に変更してください。 また、 install.php ファイルと profiles ディレクトリは、もはや不要ですのでついでに削除しておくとよいでしょう。…

    scripts ディレクトリは Drupal の動作には不要であり、セキュリティ上好ましくないので除外することにしましょう。
    また、robots.txt 以外の、拡張子が .txt のファイルも不要ですので除外しましょう。

    無事完了 ^^

    2009年2月5日木曜日

    XREA でサブドメインを設定

    XREA で借り直してサブドメインを設定」では独自ドメインがない場合の設定を行った。今回は独自ドメインを持っているときのサブドメインの設定方法。

     

    サブドメイン用のディレクトリを作成

    VALUE DOMAIN:バリュードメイン よりログインした後、サーバーアカウントの登録・管理・購入 において、「サーバー設定」を選択。

    090205-022

    「入室」ボタンを押す。

    XREA の管理画面が表示されるので、左側の管理メニューの「FTP 設定」をクリックし、FTP でアクセスするための情報を控えておく。(接続には FileZilla を用いた。)

    090205-023

     

    FTP で接続してディレクトの作成

    FTP で接続し、public_html ディレクトリ以下に

    test.XXXXXX.XXX

    という名称のディレクトリを作成。 (XXXXX.XXX はドメイン名を入力する) これがサブドメイン名となる。

     

    ドメインの設定

    XREA の管理画面に戻り、管理メニューの「ドメインウェブ」をクリック。

    090205-024

     

    ドメイン情報入力」において、空いている行に (この場合は Sub1) に上記で作成した test.XXXXX.XXX を入力し、「ドメイン設定」ボタンを押す。

    090205-025

     

    テスト

    以下の内容の index.html を作成して public_html/test.XXXXX.XXX/ に FTP でアップロードし、ブラウザでサブドメイン名 ( http://test.XXXXX.XXX )が有効か確認する。

    <html>
     <head>
      <title>テスト</title>
     </head>
     <body>
      テストです。
     </body>
    </html>

    ブラウザに記録されてしまった ID とパスワードを削除する–Internet Explorer, Firefox, Google Chrome の場合

    1. ブラウザのオートコンプリート機能による記録

    他人の PC で Internet Explorer を使い Google にログインした。このとき、オートコンプリートにより誤って ID とパスワードを記憶させてしまった。 (@_@;)

    090205-018

    上記のダイアログが出たときに、反射的に「はい」を押してしまったので、ID とパスワードが保存された。

     

    2. Firefox に保存された ID とパスワードを削除する

    Firefox で保存された ID とパスワードを削除するには、

    • メニューより ツール > オプション > セキュリティ > パスワード

    における 「保存されているパスワード」から削除することができる。

    090205-021

     

    3. Internet Explorer に保存された ID とパスワードを削除する

    Internet Explorer では、オートコンプリートが表示されたフォームで削除する。

    Windows TIPS -- Tips:IEのオートコンプリート履歴を削除する によると、

    オートコンプリート履歴がドロップダウン表示されたら、削除したい項目を選択し、Delキーを押す。

    上記の場合、ログイン画面において、ID を入力しはじめると候補が表示される。このとき、下方向のカーソルキーを押し、削除したい ID を選び、Delete キーを押した。Backspace ではないことに注意。

    090205-019

    この操作により、削除する旨のダイアログが表示されるでの「はい」を選択。

    090205-020

    ふぅ~、一安心。 ^^;

    この方法は、Firefox でも同じように機能する。

     

    4. Google Chrome

    Google Chrome の場合、

    1. 設定より、「パスワードとフォーム」で検索する。
    2. 「保存したパスワードの管理」をクリック。
    3. 保存されたパスワードを削除する。

    2009年2月3日火曜日

    Drupal のコンテンツの作成で WYSIWYG – FCKeditor と IMCE を使って

    1. Drupal の投稿エディタをリッチにしたい

    Drupal でコンテンツを作成するとき、標準ではシンプルなテキストエディタを使う。というか、ただのテキストエリア。

    今時のブログと比較すると、珍しくデフォルトでタグ打ちをする。これをリッチなエディタに変更したい。

     

    2. FCKeditor

    Drupal Modules で調べると、Most Downladed の 3 位に

    がある。他のリッチなエディタとしては、

    This module has been replaced by Wysiwyg API,

    今回は FCKeditor を使うことにした。

     

    インストールとモジュールの有効化

    より 6.x-1.3-rc7 をダウンロードして解凍。

    README.txt の Configuration を見ながら作業を進めるた。

    エディタの本体を

    より FCKeditor_2.6.4.zip をダウンロードして解凍。

    先ほど解凍した fckeditor 内に、今解凍した fckeditor フォルダを配置する。

    sites/all/modules に fckeditor を配置。

    Drupal の管理画面を開き、

    • 管理セクション › サイトの構築 > モジュール

    の「その他」において、FCKeditor にチェックを入れる。

    090203-004

    これにより、コンテンツの作成から「ストーリー」を選択すると、テキストエリア上部に、エディタのためのメニューが表示される。

    090203-005

     

    権限の設定?
    • 管理セクション › ユーザの管理 > 権限

    を選択。

    090203-006

    権限の設定があるけど、管理者だけが使うならこのままでいいのかな?

    090203-007

     

    3. IMCE で画像をアップロード

    次に、画像をアップロードするためのモジュールをインストールする。

    の「Image/File browser」によると、

  • The IMCE module which needs almost no configuration.
  • IMCE から 6.x-1.1 をダウンロードして解凍。

    sites/all/modules 以下に配置して、モジュールを有効化した。

    090203-008

     

    FCKeditor との連携

    IMCE | drupal.org によると、

    FCKeditor: Admin->Settings->Fckeditor profile->File browser settings->IMCE integration

    • 管理セクション › サイトの環境設定 > FCKeditor settings > プロフィール

    の Default の操作の「編集」をクリック。

    090203-009

    File browser settings を選択。

    090203-010

    File browser type で IMCE を選択。

    090203-011

     

    4. FCKeditor のメニューが表示されなくなった

    IMCE が使えるのか確かめようとした。そのとき、いつも通りのシンプルなテキストエディタに切り替えようと、テキストエリアの下にある

    `Switch to plain text editor’

    のリンクをクリックした。

    FCKeditor の表示が消えた後、元に戻そうとしたけれど、切り替えるためのリンクが表示されなかった。 (@_@;)

    Issues for FCKeditor に同じような症状はないかと探したが、よくわからなかった。

     

    データベースのテーブルを削除

    一度、モジュールを無効にして、再度有効にしてもダメ。 (+_+)

    関連しそうなデータベースのテーブルを削除することにした。

    MySQL Administrator を起動して、Catalogs から Drupal をインストールした Schemata を選択。

    `fckeditor_’

    という接頭辞のテーブルが 2 つあったので

    • 右クリック > Drop Table

    を選択。

    090203-012

    この後、Drupal にエラーが表示されるようになった。

    • warning: include_once(./sites/all/modules/) [function.include-once]: failed to open stream: No such file or directory in C:\xampp\htdocs\drupal6\includes\bootstrap.inc on line 577.
    • warning: include_once() [function.include]: Failed opening './sites/all/modules/' for inclusion (include_path='.;\xampp\php\pear\') in C:\xampp\htdocs\drupal6\includes\bootstrap.inc on line 577.

    ルートディレクトリにある update.php を実行したらどうかと思い、説明を読んだら、

    Drupalやモジュールの新しいリリースをインストールした際には常に、データベースを更新するために、このユーティリティを使用してください。

    これで元に戻るかと思ったが、ダメだった。 (+_+)

     

    system テーブルの設定情報を削除

    エラーの内容より、includes\bootstrap.inc on line 577. 付近を見ると、$files 変数が関係ありそうな感じがした。$files で同ファイルを検索すると、406 行目に関連した SQL を発行している部分があった。

    $file = db_result(db_query("SELECT filename FROM {system} WHERE name = '%s' AND type = '%s'", $name, $type))

    system テーブルが怪しそう。(@_@)

    MySQL Administrator より system テーブル上で

    • 右クリック > Edit Table Data

    により、MySQL Query Browser を開き、

    SELECT * FROM system
    where name like '%fck%';

    を実行。これにより、fckeditor の設定らしきものが見つかった。

    090203-014

    これに対して、

    delete from system
    where name like '%fck%';

    で削除。これにより、エラー表示がなくなった。

     

    5. FCKeditor, IMCE を再インストール

    再度 FCKeditor と IMCE モジュールをインストール。

    • 管理セクション › サイトの環境設定 > FCKeditor settings

    にアクセスすると、

    There is currently no role with the access fckeditor permission. Visit 権限 administration section.

    と表示された。

    今回は、「管理セクション › ユーザの管理 > 権限 > fckeditor モジュール」 で「認証済みユーザ」の列にチェックをつけた。

    090203-015

    上記の設定をしたら、

    • 管理セクション › サイトの環境設定 > FCKeditor settings > Profiles

    の Advanced ロールに「認証済みユーザ」と表示されたので、「操作」の「編集」をクリック。先ほどと同じように File browser type で IMCE を選択した。

     

    6. イメージのアップロード

    コンテンツの作成において、「イメージの挿入/編集」アイコンをクリックしたら、「サーバーブラウザー」ボタンが表示された。

    090203-016

    「サーバーブラウザー」ボタンをクリックしたら、画像を管理するためのページが表示される。ここで画像をアップロードして FCKEditor へ送ることによってコンテンツに画像を挿入することができるようだ。

    090203-017

    2009年2月2日月曜日

    Haskell で簡単なテキスト処理 (3) – break 関数を使って再帰処理

    Haskell で簡単なテキスト処理 (2) の続き。まいど、習うより慣れろということで。

     

    例1.

    以下の各行から漢数字と空白を取り除きたい。

    一 保健、医療又は福祉の増進を図る活動
    二 社会教育の推進を図る活動
    三 まちづくりの推進を図る活動
    四 学術、文化、芸術又はスポーツの振興を図る活動
    五 環境の保全を図る活動
    六 災害救援活動
    七 地域安全活動

    ( 特定非営利活動促進法 の「別表」より, NPO の活動を分類したもの )

     

    日本語を扱うために

    まずは、対象とソースを UTF-8 で保存。

    ソースの先頭には、(cf. Haskell で日本語表示)

    import qualified System.IO.UTF8 as U

     

    >>= (bind) と関数合成

    前回と同様、do 式を書くと変数を束縛するだけ面倒なので >>= を用いる。

    main = U.getContents >>= U.putStr . unlines . map f . lines

    unlines --- lines で挟むのは、おなじみテキストファイルを行ごとに処理するパターン。map を間に入れると、その引数となる関数は行ごとの処理となる。

    (>>=) の右側は、関数を取るので関数合成を利用して定義。最初読みにくくてしょうがなかった関数の合成にも徐々に目が慣れてきた。「なぜ関数プログラミングは重要か」に目を通したおかげかも。(cf. Haskell で関数の抽象化)

     

    break で文字列の分割

    map 関数の引数を f としたのは、いちいち関数名を考えるのが面倒だったので、というか思い浮かばなかったため。^^;

    さて、関数 f の定義をどうしよう。単純に全角の空白で文字列を分割すればいいので、この前見た break 関数を使うことに。 break 関数の使い方は、例えば、コンマ区切りの文字列があったら、

    *Main> break (== ',') "hoge,piyo,fuga"
    ("hoge",",piyo,fuga")

    というように、述語で指定した基準で分割し、基準となる文字列はタプルの第2要素の先頭に納まる。

    090201-001

    これを用いて、

    f = tail . snd . break (== ' ')

    上記の例の場合だと、例えば 1 行目に対しては、

    (“一", ” 保健、医療又は福祉の増進を図る活動”)

    というようになる。先頭要素は必要ないので tail 関数を続けて適用。つまり、やってることは、

    ぶった切って (break)、 2 番目とって (snd) 、しっぽとる (tail) 。

    ソースを text.hs 、上記のテキストを target.txt として保存し実行。

    runghc text.hs < target.txt > result.txt

    まとめると、

    import qualified System.IO.UTF8 as U
    main = U.getContents >>= U.putStrLn . unlines . map f . lines
    f = tail . snd . break (== ' ')

    こうやって見ると、最初の import を書かなくて済むなら 2 行だけなので結構シンプル。

     

    例2.

    以下のように、表計算に入力する項目が複数あるとする。

    090130-005

     

    これをコピーしてテキストエディタにペーストすると、項目がタブ区切りの文字列が得られる。

    名前 年齢 性別 身長 体重

    上記を以下のように変換したい。

    名前:
    年齢:
    性別:
    身長:
    体重:

     

    再帰的に break

    タブ文字で分割して、それぞれの行にコロンを付ければいいので、全体としては次のように想定。

    main = U.getContents >>= U.putStr . unlines . map addColon . split

    次に、具体的に split 関数と addColon 関数を考える。 addColon の方が単純なので、先に定義。

    addColon = (++ ":")

     

    split 関数はのイメージは、項目を順次スパッと切っていくというもの。普通なら For ループだけれど、Haskell なので再帰。

    090131-006

    break 関数を再帰的に適用する方法は、先頭要素をスパッと切ったら、残りも同じようにスパッとやるということ。

    090131-009

    切った要素は、最後にリストとして返したいので (:) コンスでつなげる。

     

    最初、与えられた文字列を break で分割して、その切り取った部分を結果のリストの先頭に置きたいので、

    split xs = (fst $ break (== '\t') xs) :

    break で分割した後、残りの要素のリストを同様の手順で繰り返し適用したいから、これを再帰的に定義。コードが重複した部分は where 節に括りだす。

    split xs = (fst $ split' xs) : (split $ tail $ snd $ split' xs)
        where 
          split' = break (== '\t')

     

    さて、これで実行したら結果は、

    Prelude.tail: empty list

    あら… (@_@;)

    空文字に tail 関数を適用するとダメかな?つまり、対象の文字列の最後に split 関数を適用した後のこと。例えば、

    *Main> break (== '\t') "hoge"
    ("hoge","")
    *Main> tail ""
    "*** Exception: Prelude.tail: empty list

    ということは、tail 関数の適用を場合分けし、

    split xs = (fst $ split' xs) : (split $ tail' $ snd $ split' xs)
        where 
          split' = break (== '\t')
          tail' [] = []
          tail' xs = tail xs

    これで実行… と思ったら固まった。 (@_@;)

    あ~、そうか。 split [] となったときに延々と繰り返されてしまうか。

    split [] = []
    split xs = (fst $ split' xs) : (split $ tail' $ snd $ split' xs)
        where 
          split' = break (== '\t')
          tail' [] = []
          tail' xs = tail xs

     

    結局全体では、

    import qualified System.IO.UTF8 as U
    
    main = U.getContents >>= U.putStr . unlines . map addColon . split
    
    split [] = []
    split xs = (fst $ split' xs) : (split $ tail' $ snd $ split' xs)
        where 
          split' = break (== '\t')
          tail' [] = []
          tail' xs = tail xs
    addColon = (++ ":")

    しかし、何か不恰好だなぁ… ^^;

     

    case 式とデータコンストラクタによるパターンマッチ

    何か違う実装方法がないか検索したら、Haskell プログラミング ~ 純粋関数型言語への誘い~ に、

    split c cs = case break (==c) cs of
                   (w,"") -> [w]
                   (w,_:cs') -> w:split c cs'

    あ~、case 式使ってリストのデータコンストラクタによるパターンマッチで tail 関数を使わなければよかったのかぁ。 (+_+) (cf. 関数の抽象化リストのデータコンストラクタによるパターンマッチ)

     

    一文字ごとに考える

    The Julipedia: A split function in Haskell では、break 関数を使わない方法で書かれていた。

    split :: String -> Char -> [String]
    split [] delim = [""]
    split (c:cs) delim
    | c == delim = "" : rest
    | otherwise = (c : head rest) : tail rest
    where
    rest = split cs delim

    これを見ると、対象の文字列を一文字ごとに分割してリスト処理をしている。パッと見てよくわからなかったので絵を描いて考える。^^;

    最初は例のごとく、文字列を先頭とそれ以降の要素に、データコンストラクタによるパターンマッチで分割。そうしたら、残りの要素に再帰的に split 関数を適用。その結果の先頭要素を、最初に分割した先頭の一文字とくっつける。そして、またその結果を残りの要素にもくっつけてリストにする。ただし、split する対象の文字列の先頭が区切り文字なら、それを削除してリストにするということか。なるほど。

    090201-002

     

    上記記事のコメント欄には、他に unfoldr を使う方法が書かれていた。

    import Control.Arrow
    split delim = takeWhile (not . null) . unfoldr (Just . (second $ drop 1) . break (==delim))

    しかし、second 関数が Arrow クラスのメソッドのようで、Monad すら理解してないのに Arrow と言われても理解不能。。。 (+_+)

     

    drop 関数を使って

    上記コメントを読んでいたらもう一つ方法が書かれており、そこでは drop 関数が使われていた。えーと、 drop 関数って何だっけ?と思いつつ確認。

    Prelude> drop 1 "hoge"
    "oge"
    Prelude> drop 1 "h"
    ""
    Prelude> drop 1 ""
    ""

    おなじみ take 関数の反対で、第1引数が 1 のとき tail 関数と似た動作をする。しかし、tail と違い、上記のように空文字のときにエラーとならない。ということは tail を使うより drop を使った方がよかったみたい。先ほど定義した関数を少し書き直し、

    split _ [] = []
    split delim xs = (fst $ split' xs) : (split delim $ drop 1 $ snd $ split' xs)
        where 
          split' = break (== delim)

    ちょとすっきりしたかな。

     

    Text.Regex の splitRegex を使うなら

    splitRegex なんてすっかり忘れていた。 (cf. 文字列の分割と結合)

    import qualified System.IO.UTF8 as U
    import Data.List
    import Text.Regex
    main = U.getContents >>= U.putStr . unlines . map (++ ":") . splitRegex (mkRegex "\t")

     

    例3.

    例2 で作成したものに対して、データが以下のように入力されたとする。

    名前:太郎
    年齢:20
    性別:男
    身長:170
    体重:65

    これよりデータの内容だけ取り出して、タブ区切りの文字列にして表計算に貼り付けたい。

     

    import qualified System.IO.UTF8 as U
    main = U.getContents >>= U.putStrLn . foldr (++) [] . map f. lines
        where f = (++ "\t") . drop 1 . snd . break (== ':')

     

    そういえば、リストを特定の区切り文字で連結する関数 intercalate があった。(cf. 文字列の分割と結合)

    main = U.getContents >>= U.putStrLn . intercalate "\t" . map f . lines
        where f = drop 1 . snd . break (== ':')

     

    普段から使わないとスッと出てこないなぁ~ (@_@;)