前の月 / 次の月 / 最新

MuraTaka 速記メモ / 2008-10

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

2008-10-29 Wed

VirtualBox に Windows XP を [Tool]

IE での表示確認用に VirtualBox on Mac に Windows XP を入れておいた。

日本語の入力の ON/OFF 切り替えをどのキーで行うのかよくわからない・・・
適当に触っていたら、[英数]キー + Space で切り替わるのに気付く。
使えるからよいが、これってホントに正しいの??。。

2008-10-28 Tue

Prototype & script.aculo.us を読む8 [JavaScript]

・第9章 もっと便利なヘルパーオブジェクト

いろいろと便利なヘルパーオブジェクト。

Template オブジェクトは便利に使えそうだ。

・第10章 パフォーマンス上の注意点

さらっと読む。

・第11章 総仕上げ

タスクリストシステムを作成して総仕上げとする。

Prototype のおかげで短いコードで、分かり易く、表現豊かな UI の記載が行える。
素晴らしいライブラリだ。
また、本書でそのパワーを生かす方法を学び、非常に参考となった。

2008-10-27 Mon

Rack [Ruby]

- 5分でわかるRack - Greenbear Diary (2008-07-16)

Rackの思想

「Webアプリって要するにリクエストをレスポンスに変換するだけの関数だよねー」 ってのがRackの基本っぽい。

確かに。

- Greenbear Laboratory - Rack日本語リファレンス
- ウノウラボ Unoh Labs: RackでWebアプリのWebサーバー依存を無くす

2008-10-26 Sun

Prototype & script.aculo.us を読む7 [JavaScript]

・第8章 Ajax がこんなに簡単になった

「8.3 効率を高める Ajax.Updater」サンプルの取り上げ方はうまいなぁ。。
そこまで手数のかからないソースで、ちゃんと役に立つものを取り上げている。

1点だけ、Ruby のライブラリを検索する server.rb のソース(p.178)で、

def get_search_results(g)
  suffix = "/*#{Regexp.escape(g)}*.rb"
  $LOAD_PATH.collect do |dir|
    Dir.glob(dir + suffix, File::FNM_CASEFOLD).collect do |f|
      File.basename(f, '.rb')
    end
  end.flatten.sort.uniq
end
となっているのだが、suffix は、
suffix = "/**/*#{Regexp.escape(g)}*.rb"
としておいた方が実用性は高いかと。

Ajax.Updater 固有のオプションの1つである evalScript は、デフォルト false となっているが、true とし、戻りのソースに Script を含めることで描画系で便利に使えそう。

「8.4 ポーリングを行う Ajax.PeriodicalUpdater」

ポーリングも楽に。

「8.5 Ajax の動作を監視する Ajax.Responders」

何かと便利かと。

8章まで終了。

ジョエル・テスト [Dev]

Joel on Software
Joel on Software
posted with amazlet at 08.10.21
Joel Spolsky
オーム社
売り上げランキング: 9302
おすすめ度の平均: 4.5
5 本当のソフト開発を本当の意味でわかってもらうのにいい本
4 楽しい
5 実際に現場で使わせてもらってます
3 優秀なソフトウェア開発者の日々の徒然
3 プログラミングチームを率いるときに


有名なジェル・テスト。このトピックの翻訳が Web でも公開されている。

- Joel on Software - ジョエル・テスト

ジョエル・テスト

1. ソース管理システムを使っているか?
2. 1オペレーションでビルドを行えるか?
3. 毎日ビルドを行うか?
4. 障害票データベースを持っているか?
5. 新しいコードを書くまえにバグを修正するか?
6. 更新可能なスケジュール表を持っているか?
7. 仕様書を持っているか?
8. プログラマは静かな労働環境にあるか?
9. 買える範囲で一番良い開発ツールを使っているか?
10. テスト担当者はいるか?
11. プログラマを採用するときにコードを書かせるか?
12. 「廊下での使い勝手テスト」を行っているか?

Prototype & script.aculo.us を読む6 [JavaScript]

・第7章 フォームを操作する

フォームのあるページをロードした際には、最初の入力フィールドにフォーカスがあたっているのが確かにうれしい。
# 何を最初のフィールドとするか?込み入ったページでは悩むこともあるだろう。。。

そんなとき、

formElt.focusFirstElement();
を dom:loaded のタイミングで読んでやるがよいかなと。

■ フォームのシリアライズ

フォームが送信される時、そのフォームの内容はブラウザによりシリアライズされて送信されており、特に意識する必要がない。
ただ、送信前に何らかの自前のロジックを入れ、自前で submit する場合、シリアライズを自分で行う必要がある。

そんなとき、
formElt.serialize();
を呼んであげればよい。

p.154 にて、document.observe のイベント名に"contentloaded" が指定されているが、これは "dom:loaded" と同じこと。
- Prototype 1.6: Observe "contentloaded" changed to "dom:loaded" Deconstructing the Web with Larry Root

・第8章 Ajax がこんなに簡単になった

よくある Ajax 本ではこの章の内容がまずメインになるのだろう。
本書のよいところは、Ajax という言葉に対して、単に XHR だけにフォーカスする訳ではなく、Prototype ライブラリの説明を加えつつ(必要に応じて JavaScript 自体の説明も)、ここ8章になってやっと XHR を題材に持ってきているところにあると思う。
また、簡易的な Web Server WEBrick を使用してサーバ側の実装を分かり易く見せ、クライアント側の実装とサーバ側の実装をうまい感じでバランスをとって説明している。

しかし、ドラッグ&ドロップの実装がこんなに楽になったんだ。。。

「8.2.1 理解のポイント:ジオメトリ(座標)の保存」まで。

段組 CSS メモ [CSS]

■ DOCTYPE 宣言で、標準準拠モードで表示させる

ブラウザは DOCTYPE 宣言でレンダリングモードを切り替える。
標準準拠モードと互換モードのどちらかで動くことになるのだが、互換モードで走らせてしまうと、各バージョンのブラウザにおいて、どのような挙動になるか把握するのが非常に面倒。
そのため、標準準拠モードで動作させておくようにする。
以下の宣言を頭に入れておく。
ただし、XML 宣言をこの前に入れてしまうと、DOCTYPEスイッチが起こってしまう(IE6のみ?)ため、XML 宣言は省略する。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

■ 段組の基礎となる position プロパティ

指定できる値には4つある。

- static
  何も指定しない時のデフォルト。
  通常の要素の配置方法をとる。

- relative
  left、top といったプロパティを併用することで、ボックスを通常の配置位置から相対的にずらして配置する。
  絶対配置(absolute)の起点としての使われ方が一般的か?。

- absolute
  その名の通り絶対配置だが、その起点が何になるかが重要。
  親ボックスを起点とするが、その親ボックスは、static 以外の値が指定されているボックスになる。
  また、他のボックスの配置には影響を与えない。

- fixed

■ 段組の基礎となるもう一つのプロパティ float プロパティ

指定できる値には3つある。

- left
  その名の通り左寄せ。
- right
  その名の通り右寄せ。
- none
  その名の通り何もしない。
  float プロパティを指定しない場合のデフォルト。

- float を使う時には width もして指定しておく
- float を使ってレイアウトが崩れる場合はボックス領域の width の値を疑ってみる
  段組を行った際に、ボックスとして中に入っているものの幅が親ボックスより大きくなってしまっている場合、レイアウトが崩れる。
- float による回り込みを解除するには、clear プロパティを使う。
clear: both;

2008-10-25 Sat

NetBeans 6.5 RC1 をインストール [NetBeans]

RC 1 が出ていたようなので、インストールして使ってみることに。

[2008-09-24] に書いていた HTML Project Support プラグインが RC1 ではデフォルトのプラグインの参照では見えない。
プラグインの設定にて、
- Latest Development Build
  http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastStableBuild/artifact/nbbuild/nbms/updates.xml.gz
を追加してインストールしておく。

[2008-09-12] にて、不満点(というかかなりストレスとなっていたところ)として上げていた Emacs キーバインドにて、インクリメンタルサーチである Ctrl + s が効かない点だが、これは、再度キーマップの設定にて割り当てを実施すると効くようになる。
何が悪いのかはよくわからないが、これは Mac OS X Tiger (Leopard は使っていないのでわからない) だけの不具合。Windows では問題なかった。
何はともあれ、これでストレスがかなり減る。。
# こんなことだったら、とっとと試しておけばよかった。。

他のキーバンドでも、何故か動かない・・・ということがあれば、一度キーマップの設定をやり直してみるとうまくいくものがある。

Referrer (Inside): [2008-11-26-1]

2008-10-21 Tue

読んでいる本::Joel on Software [Books]

たまたま図書館で手にして読み始めた本。

訳書の発売が 2005/12 となっているので、原書はさらに数年前になるのかと思うが(本文で出てくる日付がだいたい 2000年 - 2003年)、この移り変わりの早い業界の中にあって古さを感じさせない。
いろいろ新しいものは出てくるが、やっぱりソフトウェアは人が作るもの、と改めて思わせてくれる。と言っても、まだ最初の数章しか読めていないのだが。。

たまたま手にとった本がこんな良書だったとは。
流石に図書館の本に落書きはできないので、タイミングをみて購入しようと思う。

と、どこかで見たことのある著者名だなぁと思っていたら、[2008-10-02] に取り上げていた読みたい本「BEST SOFTWARE WRITING」も Joel Spolsky だったんだ。

Joel on Software
Joel on Software
posted with amazlet at 08.10.21
Joel Spolsky
オーム社
売り上げランキング: 9302
おすすめ度の平均: 4.5
5 本当のソフト開発を本当の意味でわかってもらうのにいい本
4 楽しい
5 実際に現場で使わせてもらってます
3 優秀なソフトウェア開発者の日々の徒然
3 プログラミングチームを率いるときに

2008-10-14 Tue

会津若松市 オープンオフィス導入に関する情報公開 [Tool]

- 会津若松市 オープンオフィス導入に関する情報公開

がんばれ!会津若松市役所!
# 3.0 まもなくでるけど。。

2008-10-13 Mon

JavaScript::変数宣言における var の注意 [JavaScript]

初歩的なことだが、非常に重要な点。

JavaScript の変数宣言では、var を使用するが、var を使わなくても、変数の宣言は行える。
ただ、var を使用しない場合、その変数はグローバル変数になってしまうことに注意。
関数内でグローバルな変数を定義することなんて滅多にないので、デフォルト var を付ける。

JavaScript の場合、ブロックレベルにスコープは無く、関数スコープしかない。

Prototype & script.aculo.us を読む5 [JavaScript]

・第6章 これで DOM が楽しくなる!

DOM の操作、巡回は Web アプリでは必須の要素。
しかし、ここをちゃんとやったことはない。。。よい勉強になる。
Tree 構造でデータを表現する。

■ DOM を渡り歩く (6.2.5)

W3C 仕様の素のプロパティで渡り歩くのは何かとメンドイ。。
Prototype は、Element のメソッドとして、
- DOM を巡回するためのメソッド
- 要素のコンテンツを変更するメソッド
を用意してくれている。

- DOM を巡回するためのメソッド
  - down
  - firstDescendant
  - next
  - previous
  - up
firstDescendant を除き、引数に文字列、整数を与えられる。
文字列の場合、CSS セレクタとして解釈され、整数の場合メソッド名の方向で index 番目の要素得られる。
文字列、整数、両方一緒にも指定できる。

また、これらのメソッドが巡回するのは、"要素"単位。テキストノード、コメントノード、実体参照などは巡回しない。

- 要素のコンテンツを変更するメソッド
  - cleanWhitespace
  - remove
  - replace
  - update

- CSS クラス名を調整するメソッド
  - addClassName
  - hasClassName
  - removeClassName
  - toggleClassName

- 要素の可視性を操作するメソッド
  - hide()
  - show()
  - toggle()
  - visible()

■ 参考になったソース

- p121:L20 prototype/dom/fragments/people_6.js

this.selected = (this.selected && this.selected.id == id ? null : this.find(id));
選択されているもの自身を選択するとその選択が解除されるようにするためのものである。
本来の意図も確かになるほど、だが、&& 演算子と ? : 演算子をこのように組み合わせるのはうまいなぁ。

- p123:L1 移行の handleTreeClick

ツリー表示のペインにおけるイベントの拾い方とその後の処理の為の要素の捉まえ方。
なるほどね、こうしておくと便利だ。

6.2.9 まで進んだが、内容がものすごく濃かった。。

2008-10-12 Sun

Prototype & script.aculo.us を読む4 [JavaScript]

・5章 統合されたイベント処理

初めて Prototype で書かれたイベント処理を見た時に、よく使うページ読み込み時の load イベントにdom:loaded という記載を見てハテ?と思ったものだが、その説明もある。

load が外部リソースも含めてロードされたタイミングであるのに対して、dom:loaded は、DOM 要素が全て読み込まれたタイミングのイベントとなるのでそれよりも先に発生する。

■ リスナーの登録に関する注意点

バージョン 1.6 で変更点、及び注意点がある。

- イベントの伝播でキャプチャリングの指定はできなくなった。
  というか、これまでもできなかったのだが、切り替えのオプションがあったため、できるものと勘違いされていた。
- イベントの解除に、イベント名の提供のみでいけるようになった。
  実際、JavaScript の世界では、登録した際のハンドラ、イベント名など登録を行った時と同じ引数で解除をしないといけないのだが、element.stopObserving() で、Prototype がよきに計らってくれるようになっている。
- イベントハンドラは自動的に登録された要素にバインドされる。
  イベントハンドラの中の this は常に W3C の currentTarget プロパティと同等のものをさす。
  とはいえ、リスナーは、その持ち主であるオブジェクトに依存するメソッドとして定義されるので、ハンドラ内でもメソッドが this を正しく参照する必要があり、bind() を使うことにはなる。
  ただし、bind() では引数の順番が保証されないので、bindAsEventListener() を使う。
- bind() メソッドは、オリジナルのものをラップした"新規"の無名メソッドを返す。
  これを意識しておかないと、stopObserving を使ったイベントの解除で嵌まることがあるので注意。

実際に動かしてみて、慣れていかないといけない。。

session.el + minibuf-isearch を入れておく [Emacs]

- session.el + minibuf-isearchが便利すぎる
で知った。
入れておく。

必要な elisp は以下のもの。

- Session Management for Emacs
- minibuf-isearch

設定は、
- dotemacs-session-el.txt
を参照。

Prototype & script.aculo.us を読む3 [JavaScript]

・4章 Enumerable で高度なコレクション

■ Array#each での脱出方法

列挙の切り上げ next(continue), break はどう書くのか?
- next(continue)
  return。
  古いバージョンの Prototype には、$continue もあるようだが、現在はなく、return を使う方がパフォーマンス的にも優れている。
- break
  $break という特別に用意された例外定数を使う。

throw $break;

■ 要素のグループ化とコレクションの結合(4.4)

partition() メソッドって使ったことがなかったけど、便利。
イテレータの条件を満たす要素と、そうでない要素をそれぞれ2つの配列にわけて返す。
数値を偶数と奇数にわけて返す。
$R(1, 10).partition(function(n) {
  return 0 == n % 2;
});
=> [[2, 4, 6, 8, 10], [1, 3, 5, 7, 9]]

当然 Ruby にもあった。
>> (1..10).partition { |n| 0 == n % 2 }
=> [[2, 4, 6, 8, 10], [1, 3, 5, 7, 9]]

この項では、
- eachSlice(size, [, iterator = Prototype.K]) => [ slice, ... ]
- inGroupsOf(size [, filler = null]) => [group, ... ]
- zip(sequence... [, iterator = Prototype.K]) => Array
メソッドが紹介されている

上記 iterator のデフォルト引き数値として、Prototype.K という記載があるが、これは、

働きとしては、最初の引数を受け取り、そのまま何もせずに返します。

で、何がうれしいのか?

この関数を使うことで、ほとんどのメソッドのイテレータ引数を省略可能にすることができるのです。


eachSlice など集計を行う際に便利なメソッド。

■ グローバルな値を計算する(4.5.1)

- inject(accumulator, iterator) => value
Ruby でもよく使う inject。
JavaScript でも使えるのはうれしい。

■ 各要素を別の形に変換する (4.5.2)

- collect/map(iterator) => Array
- invoke(methodName [, arg.... ]) => Array
- pluck(propertyName) => Array

collect は Ruby でもなじみがある。
invoke と pluck は便利だなぁ。
ほぼ同じ使い方となるが、
- invoke は、それぞれの要素に対して"メソッド"を呼び出す必要がある場合
- pluck は、それぞれの要素に対して"プロパティ"を取得する必要がある場合
に使用する。

collect を使う前に、invoke、pluck が使えないか、考えてみること。
コードの可読性もそうだが、パフォーマンス的にもすぐれている。

Ruby に同様のものは用意されていないのかな?
なさそうだ。
書くとしたら、以下のような感じ?特に invoke と pluck の違いは意識する必要ないかな?

class Array
  def pluck(mtd)
    inject([]) { |r, e| r << e.send(mtd) }
  end
  alias :invoke :pluck
end

Prototype & script.aculo.us を読む2 [JavaScript]

・1章 Prototype を理解する
・2章 $() 関数のクイックヘルプ
・3章 普通の JavaScript もパワーアップ
まで。

結局 Prototype とは何か?
- Prototype は、ブラウザの JavaScript 環境を向上させるべく設計された JavaScript ライブラリ
- 組み込みの型(タイプ)と DOM を拡張し、便利なメソッドを追加し、形象可能なクラススタイルのオブジェクト指向を実現している。
- 高度なイベント処理と強力な Ajax 機能もサポートしている。

便利なライブラリであるが、既存の JavaScript に新規のライブラリを追加するだけのものではない。既にある DOM、メソッドを拡張し、非常に扱い易いものとなっている。
また、Ruby に触発されて書かれたものであるため、その言語思想が反映されており、Ruby 愛好家にとって心地よい。

便利になる、ことは非常にうれしいことであるが、何よりも最もうれしいのは、Prototype が便利な機能を提供しつつ、最も悩まされるブラウザ間の互換を保ってくれることがある。状況によっては、全く 0 にはならないだろうが、各ブラウザのバージョンを調べて、思った通りの動作をするのか、1つ1つ調べていく手間を削減してくれる。

■ $() 関数

document.getElementById('id 値') とタイプしなくとも、$('id 値') でいける。
単なるショートカットではなく、$() 関数で取得される要素は Prototype で拡張された要素となる。

■ $$() 関数とCSS セレクタ

CSS にあまり馴染んでいなかった自分にとって、本書で触れられていた CSS セレクタは参考になった。
$$() 関数は、その引数に CSS セレクタを渡すことで、そのセレクタに基づいた要素を取得することができる。
本来この CSS セレクタはブラウザによりサポートされている CSS のバージョンに依存し、使用できる/できないケースがあるのだが、そこは Prototype が吸収してくれる。と、書くと誤解を招くかもしれない。正確には、Prototype でサポートしている CSS セレクタを使用すれば、基本ブラウザの互換をコーディングする人が考える必要はない。Prototype は独自の CSS パーサ(CSS3 対応)を持っている。

■ $A() 関数

これはかなり強力。DOM のコレクションを扱うケースは多々あるが、$A() はコレクションを Array オブジェクトに変換してくれる。
それで何が幸せか?返される Array オブジェクトは Prototype で拡張されており、Enumerable モジュールが mixin されているため、その恩恵にあずかることになる。

■ for...in 文

これは,オブジェクトの列挙可能なプロパティやメソッドに対して反復処理を行うもの。
単なる配列を列挙するためのもの、として使うと想定外のものが出力される。

Prototype を使用していない環境では、

ary = [1, 2, 3]

for (var e in ary) {
  console.log(e);
}
の結果は、1, 2, 3 が表示されるだけだが、Prototype を使用している環境で上記のスクリプトを実行すると拡張されたメソッドがズラズラと並ぶ。

■ Object.extend() と Element.extend() の違い

異なるので注意。
Object.extend() は2つのオブジェクトをとり、2番目のオブジェクトのプロパティを最初のオブジェクトに移植する。
Element.extend() はDOM 要素を受け取り、必要であれば実際の型に応じて Prototype の提供する拡張を加える。

■ 関数のバインディング(bind)
   「3.2 適切な関数バインディング」

ここは最初つまずく。
JavaScript で使用される this の参照先は、Java、Ruby などでの this の参照先と異なるケースが発生する。
JavaScript には、関数のバインディングと呼ばれる特殊な概念があり、

関数のバインディングとは本質的に、this が参照しているオブジェクトと関数を実行時に結合させることを意味します。

そう、実行時の self が this になる。

JavaScript ではレシーバー(オブジェクト)を省略すると、window オブジェクトが暗黙のうちにバインドされ、window オブジェクトのスコープをもつ。
当然、レシーバーを省略した時の話だけではない。

これは扱いにくい。

Prototype ではこれに対する解決策として、Function に2つのメソッドを提供する。
- bind(thisRef, [, arg...]) => boundFunction
- bindAsEventListener(thisRef, [, arg...]) => boundFunction
bind() の1つめの引数(thisRef)にバインドさせたいオブジェクトを指定する。
関数に対するメソッドってところがかっこいい。

2008-10-11 Sat

Prototype & script.aculo.us を読む1 [JavaScript]

作成中のアプリで、JavaScript で悩む。
Prototype を使いこなしたいため、読み始めた。
Prototype Core チームの一人である Christophe Porteneuve 氏による解説。

Prototype & script.aculo.us JavaScriptライブラリによるAjaxアプリケーション開発
Christophe Porteneuve
オライリージャパン
売り上げランキング: 8761


1章から濃いねぇ。。

「1.3 Prototype を使うと JavaScript はどう変わるか」でテーブルのソート機能を扱っている。
なるほど、こうやるとスマートだね。

2008-10-09 Thu

IPアドレスを基にエリアターゲティングを行う特許はジェイ・キャストが持つ [Business]

- J-CASTが持つ隠れた“財産”:ITpro
ほう、そうなんだ。

- J-CASTニュース ビジネス&メディアウォッチ

2008-10-07 Tue

オンラインで動画・音声・教科書を無料で公開している大学の講義・授業まとめ [misc]

- オンラインで動画・音声・教科書を無料で公開している大学の講義・授業まとめ - ひげぽん OSとか作っちゃうかMona-

Internet Working Group (SOI) はじめようRuby on Railsの講義 [Ruby]

- はじめようRuby on Rails〜フレームワークで作るWebアプリケーション〜
  - SOI 講義案内
      Internet Week 2006
    から。

2008-10-05 Sun

Ruby::String [Ruby]

- String#[](regexp, nth = 0)
  [] 内に正規表現(文字列でも)を与えた場合、マッチした部分文字列全体を返す。

マニュアルより。

正規表現 regexp の nth 番目の括弧にマッチする最初の部分文字列を返します。
nth を省略したときや 0 の場合には正規表現がマッチした部分文字列全体を返します。
正規表現が self にマッチしなかった場合や nth に対応する括弧がないときは nil を返します。


整数を与える使い方しかしていなかった。。

ホワイの(感動的)Rubyガイドを読む 3 [Ruby][Books]

- ホワイの(感動的)Rubyガイド
■ 5. ルールを作るものと夢を生きるもの
  6. ルールを作る者たち
にはいる。

グローバル変数について、
- $"
  require でロードされた全てのライブラリ

ミックスインについて、ドクター・チャムとヤギの会話。
「7. 夢を生きる者たち」から。

「そう、includeでクラスに取り込まれるモジュールは、そのクラスのミックスインだ。scan_for_a_wish に戻って見てみれば、それがself.readメソッドを呼んでいるのがわかるだろう。MindScanner がミックスインされるクラスがread を持つか確認するだけでいい。持っていないとエラーが投げられることになる」

「ミックスインがまだないメソッドを必要とするというのは奇妙だ。自分でやるべきように思える」

ドクター・チャムはキーボードから目を上げてヤギを見た。「これは君のビデオコレクションみたいなものだ。君のビデオカセットは、そのビデオカセットを使う機械に 入れないと使えない。それらは互いに依存しているのだ。ミックスインは基本的な要求を持っているが、クラスがひとたびその要求を満たせたなら、すべてのそのほかの機能を手に入れることができるんだ」

「そいつはクールだ」とヤギが言った。


■ 6.ダウンタウン

「3. スポンサー付きのドラゴン退治」からメタプロに入っていく。

・Creatureのコード

クラスのメタクラスを取得するイディオム。

class Creature
  # このクラスのメタクラスを取得する
  def self.metaclass; class << self; self; end; end
end

・Eval - 最小のメタプログラマ

この項の中で、instance_eval と class_eval についての説明がある。
- instance_eval メソッドは、オブジェクトのインスタンスメソッドの中であるかのように
  コードを実行する。
- class_eval メソッドは、クラス定義の中であるかのようにコードを実行する。

マニュアルでは、

- Object#instance_eval

オブジェクトのコンテキストで文字列 expr またはオブジェクト自身をブロック引数とするブロックを
評価してその結果を返します。

オブジェクトのコンテキストで評価するとは評価中の self をそのオブジェ
クトにして実行するということです。また、文字列/ブロック中でメソッ
ドを定義すればそのオブジェクトの特異メソッドが定義されます。


- Module#class_eval

モジュールのコンテキストで文字列 expr を評価してその結果を返します。

.....

ブロックが与えられた場合にはそのブロックを
モジュールのコンテキストで評価してその結果を返します。
ブロックの引数 mod には self が渡されます。

モジュールのコンテキストで評価するとは、
実行中そのモジュールが self になるということです。
つまり、そのモジュールの定義文の中にあるかのように
実行されます。


「3. スポンサー付きのドラゴン退治::あなたを登場させる。」まで。

いやぁ、内容が凄く濃くなってきた。

EeePC 4G-X で Ubuntu [Ubuntu]

Xubuntu -> gOS の遍歴を辿り、結局本家 Ubuntu を EeePC 4G-X で使用することにした。
こんなに OS のインストールを行ったのは何年振りだろう。。。

使用する Ubuntu は、
- ライブCDの部屋
から取得した
- eeeubuntu-8.04-desktop-i386-0925.iso

他に1台家庭内共有サーバとして動かしているのが Ubuntu なので、起動した画面を見ると少しほっとする。

$ uname -r
2.6.24-16-generic

最新の状態にアップデートを行うが、この時、カーネルのバージョンアップも行われる。
カーネルのバージョンアップが行われる場合、EeePC 用に入れてあるドライバも再度インストールし直す必要があるのだが、これを自動的にやってくれるスクリプトが eeeubuntu には埋め込まれている。
カーネルのバージョンが変わったことを検知し、起動後の画面にて通知を行ってくれる。
ダイアログにてインストールし直すか聞いてくるので[OK]ボタンをクリックするだけでよきに計らってくれる。
非常にありがたい。
eeexubuntu の場合、これは必要なファイルをとってきて、手作業で行う必要があった。

しかし、このアップデートを行った後、無線 LAN の設定が消える。。
無線 LAN を使えた方が便利は便利だが、自宅では有線でもよいし、出先(移動)で使うことがメインとなるため、D02HW の接続が問題なければよい。PPP の接続は問題ない。

ちなみに、無線 LAN は、
- Ubuntu Weekly Recipe:第7回 EeePCでUbuntuを使う/無線LANドライバの追加|gihyo.jp … 技術評論社
- Bruno Abinader's Blog: Atheros AR5BXB63 on Ubuntu Hardy Heron 8.04 with madwifi
というところを確認すればいけるかもしれない。時間のある時に。

D02HW の設定については、
- 今日の気分はバリいくつ?: Ubuntu Linux 7.10でD02HWを使う(まとめ)
- 今日の気分はバリいくつ?: D02HW on Ubuntu7.10
- Alphageeker: Ubuntu 8.04でEMOBILE(D02HW)
が参考になる。

Ubuntu の起動時に D02HW を繋いで居ない場合、USB ドライバの読み直しをやらないと NG。
一旦切り離す。
$ sudo modprobe -r uhci_hcd
再度読み直し。
$ sudo modprobe uhci_hcd
これで PPP 接続の「モデムのポート」の設定で行っている /dev/ttyUSB0 として D02HW が認識される。

バージョンアップ後のカーネルは、
$ uname -r

EeePC 4G-X に今度は gOS を試す [Ubuntu]

Xubuntu でシステムアップデートをかけた後、ネットワーク系に混乱が発生した。。

1つ1つ潰していくのもありだが、gOS がノートブックにも力を入れている、との記載をどこかで読んだのを思い出し、ちょっと gOS を試してみることにする。
- gOS - Discover a Good OS - Download gOS 3.0

確かに、Gadgets は楽しい。。

ただ、設定変更を行う GUI にて、「予期しないエラー」が頻発する。
例えば、「システム」→「システム管理」→「ネットワーク」で「ネットワークの設定」画面などで「ロックの解除」の解除を行いたいのだが、パスワードはあっているはずなのに、「予期しないエラー」、もしくはパスワードが合ってない、とくる。
GUI でのスーパーユーザへの権限昇格で何かへくってる??
何はともあれ、のきなみ「ロックの解除」ボタンを使うところはそういう状況。

さて、本家 Ubuntu かな・・・

redo と retry [Ruby]

redo は、現在の繰り返しをやり直しますが、ループを一番最初からやり直したいことがあります。
retry 文はまさにそのようなとき使用します。retry は、あらゆるループを起動し直します。

「プログラミング Ruby」より。

- ホワイの(感動的)Rubyガイド :: 5. ルールを作るものと夢を生きるもの
にある LotteryTicket::new_random の記載にある

class LotteryTicket
  def self.new_random
    new( rand( 25 ) + 1, rand( 25 ) + 1, rand( 25 ) +1 )
  rescue ArgumentError
    redo
  end
end
だと、
>> LotteryTicket.new_random
LocalJumpError: unexpected redo
        from ./lottery.rb:20:in `new_random'
        from (irb):32
LocalJumpError が発生する。
retry か?

Ruby on Rails用 統合開発環境(IDE) 比較レポート [RubyOnRails]

- Ruby on Rails用 統合開発環境(IDE) 比較レポート:CodeZine

2008-10-04 Sat

Linux で Adobe AIR [AIR]

Linux 向けにはまだ Beta 版だが、使用してみる。
- Adobe Labs - Adobe AIR for Linux

- Adobe Labs - Downloads: Adobe AIR for Linux Beta
からダウンロード。
ダウンロードされた adobeair_linux_b1_091508.bin ファイルに実行権限を与えた上で起動する。

$ cd ~/Desktop
$ chmod +x adobeair_linux_b1_091508.bin
$ ./adobeair_linux_b1_091508.bin
GUI のインストーラーが起動される。日本語になっているので画面のガイドに沿ってインストールを行う。
さて、AIR のランタイムは難なくいったのだが、AIR アプリのインストールはどうすればいいのだろう??
Google Reader の AIR バージョンである ReadAir を入れたいのだが・・・。
- readair - Google Code
からダウンロード後、ReadAir.0.3.air をダブルクリックしても、ファイルが展開されるだけ。。。

AIR のランタイムは、
- /opt/Adobe AIR
配下にインストールされているので、直接インストーラーを叩いてみることにする。
$ /opt/Adobe AIR/Versions/1.0
$ ./airappinstaller ~/Desktop/ReadAir.0.3.air
インストーラーの画面が起動し、なんとなくインストールは完了した模様。
で、作成された ReadAir のアイコンをダブルクリックしてみると・・・

Unkown desktop manager((null)), only Gnome and KDE are supported

だそうで。。。そう、Xubuntu を使っているので、desktop manager は xface なんだよね。。
まだ Beta 版だが、AIR のサポート Gnome と KDE だけになるのかな・・・
だとすると無念。

Mac OS X では普通に使える。

EeePC 4G-X に Xubuntu をいれておく [Ubuntu]

ほったらかしにしていたが、EeePC に Xubuntu をようやく入れた。

用途して、
・移動中の連絡
・ネットでの情報チェック
・サーバ管理
となっている EeePC なのだが、Windows XP よりも、Linux 系の OS が入っておいておいてくれた方が勝手がいい。しばらくデフォルトでインストールされている XP を使っていたが、ようやく Linux 系 OS Xubuntu に切り替えた。

使用したのは、
- ライブCDの部屋
からダウロードした
- eeexubuntu-8.04-desktop-i386-lcr-0909.iso

ドライバなど EeePC 用に準備してくださっているパッケージのようで、インストール後、特に何もすることなく使い始めることができた。感謝です。
インストール後、そのまま無線LAN、EMOBILE の D02HW も使用可能。

D02HW の接続はモデムの設定として行っておけばよいのだが、
- 今日の気分はバリいくつ?: D02HW on Ubuntu7.10
に書かれている内容のままでいける。
ただ、一応使えるには使えるが、OS 起動時に D02HW が繋がっていないと、接続がうまくいかない。なぜかな?

日本語の言語パックは追加が必要。
追加を行うまでは中途半端な日本語環境のままとなる。

「バッテリーが壊れています」のメッセージがでるのだが、一応バッテリーは問題無く使えている。

251 個の Update があったのでやっておく。
流石にこの数だと結構時間がかかる。
また、ディスク容量が 600M 消費される。。4G しかなく、インストール時に残り 1.3G となっていた状況ではこれはきつい。。

sudo apt-get clean
でキャッシュをクリアしておく。260M 節約。



と、ここで今回行ったアップデートにはカーネルのアップデートも含まれていたようで、ドライバーを再度セットアップしておかないと、無線 LAN 等ドライバーが書き変わってしまうようだ。
- Eee PC用ディストリビューションのTips
確かに無線 LAN が使えなくなっている。

対象は、2.6.24-19-generic となるようで、
$ uname -r
2.6.24-19-generic
確かに該当している。

再インストールしておく。
作業は、http://simosnet.com/debian/packages/eeepc/2.6.24-19-generic/ にある readme に従って。

ファイルのダウンロード。
http://simosnet.com/debian/packages/eeepc/2.6.24-19-generic/
にあるファイルを一通りダウンロードしておく。
以下の例では、/home/hoge/tmp 配下にダウンロード。
$ sudo -s
# dpkg -i linux-ubuntu-modules-2.6.24-19-generic.deb
# cd /lib/modules/2.6.24-19-generic
# tar xfz /home/hoge/tmp/modules-2.6.24-19-generic.tar.gz
# mv net/* madwifi
# rm volatile/ath_hal.ko
# cp /home/hoge/tmp/eeepc_acpi.ko kernel/drivers/acpi/
# cp /home/hoge/tmp/uvcvideo.ko ubuntu/media/usbvideo/
# mkdir kernel/drivers/net/atl1e
# cp /home/hoge/tmp/atl1e.ko kernel/drivers/net/atl1e/
# cp /home/hoge/tmp/rt2860sta.ko kernel/drivers/net/wireless/
# depmod -a

うわっ、作業の途中に子供の世話していたら、
# echo "linux-ubuntu-modules-2.6.24-19-generic hold" | dpkg --set-selections
うつの忘れてた・・・
後から打ち直す。

うーん、ネットワークの設定に無線 LAN が出てこなくなっている。
EMOBILE の PPP 接続も接続が行えなくなってしまっているようだ。

アップデートをかけた後、全滅状態。。。うーむ、困った。



■ SSH サーバを有効に

ssh コマンドはデフォルトで入っているようだ。
サーバ(sshd)も有効にしておく。
$sudo tasksel
を使うのがてっとり早い。
OpenSSH server を選択しておく。

最近では、aptitude を使うのが正しいのか??
- Debian リファレンス - Debian パッケージ管理
  6.2.2 aptitude

■ キーボードのレイアウトを変更

Caps Lock キーを Ctrl に割り当てる。

変更するのは、/etc/X11/xorg.conf
$ diff -u /etc/X11/xorg.conf.org /etc/X11/xorg.conf
--- /etc/X11/xorg.conf.org      2008-10-05 06:07:47.000000000 +0900
+++ /etc/X11/xorg.conf  2008-10-05 01:43:10.000000000 +0900
@@ -20,7 +20,7 @@
        Option          "XkbRules"      "xorg"
        Option          "XkbModel"      "jp106"
        Option          "XkbLayout"     "jp,jp"
-       Option          "XkbOptions"    "grp:alt_shift_toggle,grp_led:scroll"
+       Option          "XkbOptions"    "grp:alt_shift_toggle,grp_led:scroll,ctrl:swapcaps"
        Option          "XkbVariant"    "106,"
 EndSection

■ デフォルトでインストールされている使わないであろうアプリケーションを削除

[Applications]->[システム]->[追加と削除]

- ゲーム全て
  しないので。。
- Brasero
  CD をこのマシンでは焼かない。
- Thunderbird
  Web メールへ移行しており、メールクライアントは最近使わないので。。

■ 参考

- ASUS Eee PCで eeeXubuntu Linux

2008-10-03 Fri

ホワイの(感動的)Rubyガイドを読む 2 [Ruby][Books]

5. ルールを作るものと夢を生きるもの
   オブジェクトの誕生
より、

Class とObjectの間にModuleがあるのに気付いた? Objectが王で、Rubyの他のすべての父祖だとすると、Module は貧しい孤児たちの修道女で、Rubyの街の子どもたちを守り、保護している。(アナロジーを完成させるなら、Class は村の学校の先生で、Kernelは尊大な村の顔役だ。)


'<<' は、対象が何であっても、素直に全て連結オペレータと思ってよいな、と思った。

それが文字列の場合、

>> name = 'Taro'
=> "Taro"
>> name << ' Yamada'
=> "Taro Yamada"
文字列は追加(連結)される。

それが配列の場合、
>> a = [1]
=> [1]
>> a << 2
=> [1, 2]
>> a << [3, 4]
=> [1, 2, [3, 4]]
配列は追加(連結)される。

それがオブジェクトの場合(クラスもオブジェクト)
>> class Hello; end
=> nil
>> class << Hello
>>   def say
>>     "Hello"
>>   end
>> end
=> nil
>> Hello.say
=> "Hello"
オブジェクトにメソッドはクラスメソッドとして追加される。
Hello というクラスオブジェクトにメソッドを追加するので、それはクラスメソッドとなる。

配列の重複チェックで、
elsif picks.uniq.length != 3
       raise ArgumentError, "3つの数字は違うものでなければなりません" 
と、
if [note1, note2, note3].uniq!
       raise ArgumentError, "異なる鳴き声を選んでください"
という2つの書き方を行っている。
前者はすんなり受け入れられるが、後者は一瞬何だ?と思う。

なるほど、そうか、uniq! の破壊的メソッドの場合、もし重複があった場合には、詰められた新しい配列を返し、無かった場合には、何もしない、つまり nil を返す。それを利用している訳だ。
こんな使い方があるんだね。

5. ルールを作るものと夢を生きるもの
  5. 盗まれたくじ主
まで。

2008-10-02 Thu

読みたい本::BEST SOFTWARE WRITING [Books]

BEST SOFTWARE WRITING
BEST SOFTWARE WRITING
posted with amazlet at 08.10.02

翔泳社
売り上げランキング: 57468
おすすめ度の平均: 4.0
5 ゆっくり楽しめる本です
3 原著の意図を考えると…

Referrer (Inside): [2008-10-21-1]

2008-10-01 Wed

ホワイの(感動的)Rubyガイドを読む 1 [Ruby][Books]

- ホワイの(感動的)Rubyガイド

いくらか冗長な記述もあるが。。作者のユーモアにつきあって読んでいると楽しくなる Ruby の入門書の翻訳。
正直物語ははしょって読んでしまったが、摩訶不思議なストーリーの中で展開される扱っている Ruby のエッセンスの切り口は短い文書の中でもキレがある。

「4. 浮いている小さなコードの葉っぱ」の unless の説明にある

unlessキーワードは負電荷を持ったものだけを受け入れるというポリシーだ。つまりnil とfalseということだ。

なんて表現はうまいなぁと思った。

5章 ルールを作るものと夢を生きるもの
「つぶやきなしの耳栓」まで。

読みたい本::Eric Sink on the Business of Software 革新的ソフトウェア企業の作り方 [Books]

Eric Sink on the Business of Software 革新的ソフトウェア企業の作り方
Eric Sink エリック・シンク
翔泳社
売り上げランキング: 14856

2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2009-10-14 00:22