IkeTの日記 このページをアンテナに追加 RSSフィード

2009-04-22

JJUG Cross Community Conference 2009 Springに行ってきた

前回に続き、JJUGのCross Community Conferenceに行ってきました。業務の都合上、午後のセッションから参加です。

毎度、イベント関連の記事は長くなるので、読みやすいように各セッションごとに分けてみます。そして、書いた記事から順次投稿する予定。

本日中に終わるかな...

クラウド時代のUIデザイン検討(デザイナー/矢野りん)

スピーカーである矢野りんさんが、スマートフォンUIに対するひとつの提案を行い、会場に参加した皆がそのテーマについて共に考え、そして、より良いアイデアが生まれたという、今までのJJUGには無い、異色のセッションでした。

矢野りんさんの提案

まず、矢野さんからスマートフォンUIについて以下の提案がありました。

問題提起

スマートフォンにおいて、現在の「デスクトップ」という考え方は、アプリケーションの数が増えるにつれて利便性が著しく損なわれる。これは「整理されていない鞄から、アイテムを探しだすようなもの」といえる。

スマートフォン特有の条件

パソコンはWhat「何」があって始めて利用されるものであるが、スマートフォンは携帯できるという特性上、Where「どこ」という条件が加わるため、これをアプリケーションの検索方法として活用できるのではないか?

ワークスペース」の提案

具体的な提案は次のような内容でした。

  1. デスクトップ」を「ワークスペース」と考えてみる
  2. フォルダ(情報を仕分ける階層構造)の呼称を 「place > spot > scene」 としてみる
  3. 「フォルダを開く」ではなくて「placeに入る」と考えてみる

そして、この提案は、以下のような効果を生み出すとの事でした。

参加者から生まれた提案

残り10分の突っ込みタイムで参加者より以下の提案が生まれました。

「どこ」というヒントからアイデアが膨らみましたね!どれもすばらしいアイデアだと思います。矢野さんが提案された機能も、別のロケーションで利用するアプリケーションを検索する手段として必要であると思います。

私の提案

私から一つ提案させていただくとすれば、アプリケーションを実行したGPS情報、タイムスタンプの履歴を単純に共有するだけでもおもしろいかな?と思いました。これは矢野さんが提案されたRecommend機能と似ていますが、例えば「30代男性がPM21:00に渋谷で利用されているアプリケーションのランキング」などもRecommendといえます。PCでは収集できない情報ですからね。

このアイデアを提供するプラットフォーム

カンファレンスの終了後、同僚との夕食の中で、このアイデアを提供するプラットフォームとして「iPhone SDKでこの機能を提供するにはSundboxの観点から難しいのでAndroidになるのかな〜」といった意見がでました。詳しい仕様は分からないので別途調査する必要がありますが、まあ、プラットフォームOS)が提供するのであれば実現可能ですよね。

Appleさん、Googleさん、いかがでしょう?

雑感

最後に良いアイデアが生まれる結果となりましたが、それを導いた矢野さんの「どこ」という発想には、目から鱗が落ちました。目の付け所が違いますね! 他のプログラマーはともかく、私は、与えられたプラットフォームOS)の制約に囚われがちなため、なかなかこのような発想が生まれません。利用者の立場に立つことの重要性を再認識させられる良い機会となりました。

また、デザイナーさんのセッションが聴けるのもクロスカンファレンスの醍醐味といったところでしょうか。今後も、デザイナーさんによるセッションは継続していただきたいと思います。今回のようにプログラマの凝り固まった脳をほぐしてくれる、そんな効果があると思います。また、カンファレンスの半ばのセッションで、このような提案ベースのセッションは、非常に良いと思いました。基本的に参加者は考えることが好きな人が多いですからね。今後も良いアイデアが生まれると思います。

あと、このセッションに影響を受けて、私も「日本Androidの会」に参加してみました。

それにしてもこのアイデア実現したいな〜...

Java NW プログラミングと SIP Servlet(yuripop)

何故か、飛んでid:yuripopセッション。タイムリーに書きたい記事から書きます。

id:yuripop が従事する業務で使用するプロトコル、SIP(Session Initiation Protocol)について

  1. アナログ電話について
  2. SIPについて
  3. SIP Servlet

の流れで説明されました。

身元判明?

まずは、最初の自己紹介で身元が明かされました。これにより、NTTデータの社員であるという疑いはこれで晴れたのではないでしょうか。

SIPについて

私は、このセッションでSIPを次のように理解しました。

  • プロトコルはHTTPに類似している
  • アナログ電話のシーケンスをIP網に置き換えたものである
  • SIPは、IP網を利用するプロトコルのため、電話以外のサービスの提供も可能
  • SIPプロキシサーバーが、ルーティングを解決する(交換機のようなもの?)

SIP Servletについて

セッションの中で"SIP Servlet"というキーワードが気になりました。「SIPというプロトコルをサポートするだけであれば"SIP Client"で良く、"Servlet"という事はサーバサイドの実装なのか?」と。そこで、知り合いの誼というわけではなく、まじめに質問してみました。ここで、得た回答は、「SIPにおいては、サーバー/クライアント、という考えはしないほうが良く、SIP Servletは、今のところSIPの実装のために提供されているインターフェイスである」といった内容でした。

SIP Servletの補足説明

カンファレンス終了後、Sunの寺田さんにご挨拶した際に、この質問に対する補足説明をしていただきました。(毎度、ご丁寧な説明ありがとうございます)

その内容は以下。

  • JavaEEの機能として提供することにより、EJBやJMSなどを機能を利用できる。ようするにHTTPで利用していたロジックをSIPにも適用可能である。
  • "HTTP Servlet"と同様のインターフェイスを提供することにより、JavaEEのエンジニアに親しみやすいものとなる。JSLEEは独自インターフェイスのため実装が難しかった。

これによると"SIP Servlet"は、JavaEEを利用する点で、サーバーサイドの実装というイメージを持ちます。ただ、SIPのプロトコル自体は常に要求と応答がリアルタイムに発生する(クライアント/サーバー機能を併せ持つ)ため、id:yuripop の見解も誤りではないですよね。要するに「サービスの提供有無に限らず、JavaEEのテクノロジを利用する」といった感じでしょうか。私の疑問は、「サービスのクライアント(エージェント)として、もう少し軽量な実装は無いのか?」という事でしたが、これについては、実際に利用シーンを考えたり、SIPサービスを実装してみると、腑に落ちるのかもしれません。

テクノロジとして、非常に興味が沸きました!!

雑感

想像以上に良いセッションだったと思います。一緒に緊張感が味わえるかと思っていたら、全然そんなことはなく、安心して見ていられました。きっとjava-jaの皆さんは、その微妙な緊張感が耐えられずに来なかったのかもしれません(今回は、java-jaのLTが無かったからだと思いますが...)。ストーリーも良く出来ていたため、このセッションを通じて、他の参加者の方もSIPに興味を持たれたのではないでしょうか。

しかし、話すのが上手ですね。噛むこともほとんどなかったんじゃないかな? 年齢層の違いや、面識の無さから微妙な笑いどころで引かれる場面は結構あったけど...(ドッピオの「トゥルルル」に、思わず声を出して笑ったところ、周りは全くの無反応。まさにキング・クリムゾンにしてやられた感じです。レクイエムを発動したい気分になりました。)

企業イメージの硬さは拭えないので、この軽い感じでSIPの伝道士になるのも良いと思います。基本構成はこのままで、電話との連携や、SIPを使ったサービスのデモなどがあると面白ですね。

とにかく、お疲れ様でした!

Slim3 for Google App Engine/Java(ひがやすを)

このセッションは立ち見が出るほどの大盛況で、ひがさんの知名度もありますが、一つ前のセッションを含め、GAE/Jが今回のイベントの主役であることを実感させられました。

セッションの内容は、ひがさんが実際のGAE/J開発で体験された内容を元に、GAE/J開発におけるポイントが紹介され、また、ひがさんのプロダクトであるSlim3をGAE/Jで開発する場合のデモが行われました。

内容については、関心の高さから、先に丁寧にまとめられている方がいらっしゃるので私が書くこともないかな。(途中までまとめたのにな...)

以下にリンクを張っておきます。

ということで感想を厚めに。

雑感

このプレゼンは資料を用いずに、話中心の形態であったため、参加者の視線は、終止、ひがさんに注がれていたと思います。テクノロジーのセッションはこの形態が一番集中できますね。(いつもこんなかんじなのかな?)

GAE/J で開発する場合のポイントと、Slim3の特徴が分かりやすく説明され、また、Slim3のコンパクトな実装が、GAE/Jにマッチしていることが理解できました。特に興味深かったのが、以下のポイント。

  • Slim3JDOのタイプセーフで流れるようなインターフェイスがコードアシストを意識している事
  • ファイル保存時にapt実行することによりメタデータ生成する
  • エラーメッセージ駆動で開発が行えること

これらは全てIDEの特性や開発時のアクションを意識するものであり、シンプルでありながら木目の細かい設計方針に好感が持てました。

私の知る限り、ここまでエラーメッセージに次のアクションが指示されているJavaのフレームワークは見たことがありません。 私は、Seasar系のフレームワークに慣れ親しんでいるわけではないので、同じ流れを汲むものか判りませんが、テストケースの実装に限らず、明示的にエラーを発生させた後で正しい実装をするというアクションは、TDDなのだと受け取りました。

GAE/Jのアカウントは取得済みなので、現在のタスクが一段落したらSlim3とともに検証してみたいと思います。Slim3が狙うのは、「クラウドフレームワーク」ですかね!

2009-04-13

Quartzの覚え書き

QuartzのTutorialのメモを淡々と記述。

主な構成要素

  • SchedulerFactory

    スケジューラのインスタンスを提供するファクトリ。

  • Scheduler

    スケジューラ。全体のスケジュールの管理、および起動/停止を行う。このインスタンスにJobとTriggerを追加していく。

  • Job

    スケジューラより実行されるJobのインターフェイス。 Job#execute(JobExecutionContext) を実装する。Jobはスケジューラにより実行前にインスタンス化されるため、パラメータ無しのデフォルトコンストラクタのみを必要とする。

  • JobExecutionContext

    Job#execute(JobExecutionContext) のパラメータとして渡されるオブジェクトで、ジョブの実行に関する情報を提供する。

  • JobDetail

    Jobのプロパティ(Job名、グループ名、Jobクラスなど)を保持するJobの入れ物。スケジューラへJobを登録する時に使用する。

  • JobDataMap

    Mapインターフェイスの派生であり、Jobのインスタンスで利用したいオブジェクトを保持することができる。JobDetail および Trigger オブジェクトの #getJobDataMap() メソッドより取得する。

  • Trigger

    ジョブのスケジューラ。トリガのプロパティを調整することによりジョブのスケジュールを行う。ジョブの実行に関する情報は JobDataMap オブジェクトを使用してJobに渡される。一般的に利用されるトリガは SimpleTrigger と CronTrigger となる。

    • SimpleTriggr

      一回限りの実行、もしくは特定の時間に、ある時間間隔で、複数回繰り返す実行を行う場合に使用されるトリガ。

    • CronTrigger

      カレンダーのスケジュールに基づいた実行を行う場合に使用するトリガ

スケジューラ

スケジューラの起動、停止

SchedulerFactory を使用してスケジューラのインスタンスを取得する。スケジューラは一度シャットダウンすると再びインスタンス化されるまで再起動できない。

Job と Trigger

Job と Trigger の分離

Job と Trigger の役割が分離されているのが特徴。Job は一回分の処理を表し、Trigger は Job のスケジュールを担当する。これにより Job の変更無しで、他の Trigger に適用することや、再スケジュールすることを可能にする。

名前およびグループ

Job と Trigger はそれぞれ Quartz に登録するための名前とグループを持つ。名前はグループの中でユニークでなければならない。グループに null を指定した場合は、Scheduler.DEFAULT_GROUP に所属する。

JobDataMap の利用方法

JobDataMap へのパラメータの格納は、Job登録時に JobDetail より行う。

[...]
jobDetail.getJobDataMap().putAsString(name1, value1);
[...]

格納した値は、Job#execute(JobExecutionContext) 処理内で渡されたコンテキストより取得することができる。

[...]
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
[...]

また、スケジュール実行毎に指定するパラメータについては、Trigger の JobDataMap に格納する。

[...]
trigger.getJobDataMap().putAsString(name1, value1);
[...]

その場合、Job#execute(JobExecutionContext) では、

[...]
JobDataMap dataMap = context.getMergedJobDataMap();
[...]

を使用して JobDataMap を取得する。JobDetail と Trigger に所属する JobDataMap はマージされ、同名で格納された値についてはTriggerの値で上書きされる。

JobDataMapに格納する値は、シリアライズ可能でなけらばならないが、プリミティブ型、および文字列オブジェクトのみを扱うことにより、シリアライズにおける問題を回避できる。

安全に実装するためには、Map インターフェイスの、Map#put(Object, Object) を使用せず、JobDataMap が提供する、JobDataMap#putAsString(String,<プリミティブ or イミュータブル>)を利用すればよい。

StatefulJobについて

StatefulJob を利用する場合、Job#execute(JobExecutionContext) 実行の後も JobDataMap は持続する。ただし、並列実行はできないため、すでに実行されているジョブが存在する場合は、処理が完了するまでブロックされる。これを実現するためには、StatefulJob インターフェイスを implements する必要がある。

尚、Non-StatefulJob の場合は、実行が終了すると JobDataMap への変更は失われる。

Jobのインスタンス

Job は Trigger により fire されるとき、Scheduler にセットされた JobFactory によりインスタンス化される。デフォルトは SimpleJobFactory が利用され、Class#newInstance() よりインスタンスが生成される。

Job実行例外

JobExecutionExceptionは、Job#execute(JobExecutionContext) が返すことのできる唯一の例外となる。フラグ「re-fire immediately」 を指定することにより、アンスケジュールを無視することが可能。

Calendar

java.util.Calendar ではない。Quarts の Calendar は、どちらかというと、fire する時間を定義するのではなく、Trigger のスケジュールを制限(exclude)ために使用する。Scheduler#addCalendar() メソッドよりスケジューラに登録する。

Triggerの優先順位

同一時刻にスケジュールされた Trigger は priority プロパティを使用することにより優先的に fire する Trigger を指定できる。Integer で指定し、数値の高いほうが優先される。priority を設定しない場合は、デフォルトで「5」となる。

TriggerUtils

Trigger および Date を生成する便利なユーティリティ。java.util.Calendar を駆使することなく簡単にそれらインスタンスの生成を提供する。例えば、毎分、毎時、毎日、毎週、毎月に実行される Trigger などの生成メソッドを提供する。

TriggerListener

Triggerが fire するときに通知されるTriggerListenerを登録することができる。

まとめ

とりあえず基本はこんなところかな。あとは個々の使用する機能に応じて対応する。

2009-04-10

メモにはOutlineモードを使う

私が最近利用し始めたEmacsのOutlineモード(outline-mode)を少し紹介。

フォーマット

Outlineモードは、見出しに、アスタリスク`*' をレベルの数だけ付けるというシンプルな形式。見出し行は1桁目に必ずアスタリスクを置く。アスタリスクの無い行は直前の見出しのボディ行となる。

シンタックスはこれだけ。

タイトルテキスト
*見出し1
ボディ1
**見出し2
ボディ2
***見出し3
ボディ3
[...]

アウトラインの操作

それで、何が良いかというと、このアウトラインへのナビゲーションや操作が提供されていること。

アウトラインのナビゲーションはもちろんのこと、見出しやボディの隠蔽/表示が行え、また同レベルの見出しで順序の昇格/降格、選択した見出し以下のマークまで行える。フォーマットはシンプルだけど、それに対する操作がきめ細かく提供されているところが良い。

以下が提供されているアウトラインの操作一覧。

アウトラインのナビゲーション
コマンド移動先
C-c C-n次の見出し
C-c C-p前の見出し
C-c C-f同レベルの次の見出し
C-c C-b同レベルの前の見出し
C-c C-u1レベル上の見出し
アウトラインの隠蔽
コマンド隠蔽の対象のアウトライン
C-c C-t全てのボディ
C-c C-o第1レベルの見出しを除く、現在位置以外の全て
C-c C-d現在位置以下全て
C-c C-c現在位置のボディ
C-c C-l現在位置以下全てのボディ
隠蔽されたアウトラインの表示
コマンド表示対象のアウトライン
C-c C-aすべて
C-c C-q第1レベルの見出しのみ
C-c C-s現在位置以下全て
C-c TAB現在位置の下のレベルの見出し
C-c C-e現在位置のボディ
C-c C-k現在位置以下のボディ
その他
コマンド動作
C-c @現在位置以下全てをマーク
C-c C-^現在位置の見出しの昇格(同レベル内での並び順)
C-c C-v現在位置の見出しの降格(同レベル内での並び順)

マイナーモードも提供されているが...

マイナーモードも提供されているため、他のメジャーモードでも利用したいところ...だが、メジャーモードのキーバインドと区別するために `C-c' の後に `@' を付加する必要がある。これは、操作性を劣化させるためあまり利用する気にはならない。

また、はてな記法アウトラインが似ているため、hatena-mode(メジャーモード)での利用を試してみたが、hatena-modehtml-mode をベースとしているため、愛称が悪かった。

ただし、アウトラインの類似は、私にとって都合が良いので、メモ(outline-mode)→ブログ記事(hatena-mode)といった流れで、コンテンツの昇格を行っている。


まあ、中途半端にEmacsを利用していたためこのモードに気がつかなかった。

ただそれだけの事です。

2009-04-09

本日のLinux Hacks

自分のLinuxの使い方が一本調子なため、The Geek Stuffで配信されているFree eBook: Linux 101 Hacksを着実にこなしていく。

今回は「Chapter 2: Date Manipulation」。

Hack7:システム日時の設定

オプション無しの設定方法。省略する場合も考慮してmanコマンドの記述を引用。

# date [MMDDhhmm[[CC]YY][.ss]]

以下はその例。

# date 013122192009.53

後はよく使いそうな設定オプションをピックアップ。

# date -s "<日付文字列>"
# date +<変更部分の日付フォーマット> -s "<フォーマットに対応する日付文字列>"

以下はその例。

# date -s "01/31/2009 22:19:53"
# date +%Y%m%d -s "20090131"

Hack8:ハードウェア日時の設定

ハードウェアの日時を変更する前にOSのシステム日時を適切な値であるかを確かめる。

そして、システム日時を元にハードウェア日時を設定する。

$ hwclock .systohc
$ hwclock --systohc .utc

尚、引数無しの実行はハードウェア日時を表示する。

$ hwclock

Hack9:現在日時を指定したフォーマットで表示

`--date' オプションに日付文字列を指定して表示する方法。デフォルトでは `now' が指定されたことになる。

$ date --date="<日付文字列>"

指定する文字列についてはHack10とHack11に記述。

もう一つは、Hack7の設定時と同様に `+' の後に表示したい日時フォーマットを指定する。`%' + 文字の形式でフォーマットを指定するが、その他の付加された文字はそのまま表示される。

$ date +"<日付フォーマット>"

以下はその例。

$ date '+Current Date: %m/%d/%y'
Current Date: 01/01/09

フォーマットを忘れたらmanで確認すればよい。

Hack10:過去の日時を表示

`--date' オプションに指定する過去を表す文字列

$ date --date='3 seconds ago'
Thu Jan 1 08:27:00 PST 2009
$ date --date="1 day ago"
Wed Dec 31 08:27:13 PST 2008
$ date --date="1 days ago"
Wed Dec 31 08:27:18 PST 2008
$ date --date="1 month ago"
Mon Dec 1 08:27:23 PST 2008
$ date --date="1 year ago"
Tue Jan 1 08:27:28 PST 2008
$ date --date="yesterday"
Wed Dec 31 08:27:34 PST 2008
$ date --date="10 months 2 day ago"
Thu Feb 28 08:27:41 PST 2008

Hack11:未来の日時を表示

`--date' オプションに指定する未来を表す文字列

$ date
Thu Jan 1 08:30:07 PST 2009
$ date --date='3 seconds'
Thu Jan 1 08:30:12 PST 2009
$ date --date='4 hours'
Thu Jan 1 12:30:17 PST 2009
$ date --date='tomorrow'
Fri Jan 2 08:30:25 PST 2009
$ date --date="1 day"
Fri Jan 2 08:30:31 PST 2009
$ date --date="1 days"
Fri Jan 2 08:30:38 PST 2009
$ date --date="2 days"
Sat Jan 3 08:30:43 PST 2009
$ date --date='1 month'
Sun Feb 1 08:30:48 PST 2009
$ date --date='1 week'
Thu Jan 8 08:30:53 PST 2009
$ date --date="2 months"
Sun Mar 1 08:30:58 PST 2009
$ date --date="2 years"
Sat Jan 1 08:31:03 PST 2011
$ date --date="next day"
Fri Jan 2 08:31:10 PST 2009
$ date --date="-1 days ago"
Fri Jan 2 08:31:15 PST 2009
$ date --date="this Wednesday"
Wed Jan 7 00:00:00 PST 2009

2009-04-08

最近ブログの投稿が増えた理由

最近、ほぼ1日1コンテンツの割合でブログを更新しています。しかも技術系の備忘録ばかり。

理由はサイトでの直接編集をやめて、Emacs`hatena-mode.el’ に乗り換えたことにあります。

ローカルで編集

サイトの下書き機能でも事足りますが、仕事中に直接編集するのは、いくらナレッジだとしても気が引けるんですよね。実際、アクセスしたサイトも監視されてますし。そうなると、ローカルで編集して、投稿は一回だけにしたいと考えるようになります。

そこで、ローカルで編集すべく、メインエディタである Emacs のアドオンを探したところ `hatena-mode.el' が在りました。このアドオンは、ログイン/ログアウト/コンテンツの取得/投稿/更新 など一通りの操作が行えるメジャーモードです。今のところ、はてな記法をある程度覚えている私には、ストレスなく使えています。

Dropboxでコンテンツを同期

ブログ記事の編集はこれでよいのですが、それでは同じ記事の編集がその場でしか行えないことになります。下書き投稿が行えれば良いのですが、今のところ対応していないようです。

そこで、Dropboxを利用してデータの同期を行う事にしました。変数 `hatena-directory' に Dropbox に作成した `hatena' ディレクトリを指定すればOK。これでデータの同期はDropboxが宜しなにやってくれます。家でも職場でもEmacsの `hatena-mode' で編集して保存するだけで、単なるメモをブログ記事に成長させることができます。

アウトプット重視

このオペレーションの変更により、ナレッジに対する意識も少し変わりました。(仕事外の)目標管理にTODOを利用しているのですが、それに加えてアウトプットに重きを置くようになりました(1日1以上のアウトプットが目標)。

TODOも目標を見える化するためには必須なのですが、それだけだと自分に何も残らないことが多いんですよね。個人タスクは自分のさじ加減で完了してしまうし。まあ、タスクの完了を明確に定義できる人はそれで十分だと思います。

変わったこと

Google Notebookへの依存度が減りました。あと、きちんと翻訳するようになりました。

今後

今のところ職場でDropboxを規制する動きは出ていないのでこのまま使い続ける予定。注意されたら止めよう。

本日のLinux Hacks

自分のLinuxの使い方が一本調子なため、The Geek Stuffで配信されているFree eBook: Linux 101 Hacksを着実にこなしていく。

今回は最初に戻って「Chapter 1: Powerful CD Command Hacks」から。

ただし、前回までのようにコンテンツの大部分を掲載するのは問題なので、要点を絞ってまとめる。

Hack1:CDPATHをセットする

CDPATH環境変数を利用することにより、cdコマンドのためのベースディレクトリをセットする。コロン `:' で区切り複数指定可能。

export CDPATH=<ディレクトリ1>:<ディレクトリ2>

複数指定できるところがポイント。ただ、同名のディレクトリが存在する場合、優先されるベースディレクトリは先に宣言したベースディレクトリ(<ディレクトリ1>)となるようだ。

Hack2:エイリアスによる上位ディレクトリへの移動

上位ディレクトリへの移動方法は通常 `../' を繰り返し指定して移動するが、この煩わしいオペレーションエイリアスで解決しようという試み。

この中で私が気に入った方法は以下。

alias ..="cd .."
alias ...="cd ../.."
alias ....="cd ../../.."
[...]

これを `.bash_profile' へ記述する。

Hack3:一つのコマンドでディレクトリの生成と移動

2手間を1手間で済ます関数の作成。

利用頻度は多いと思う。

function mkdircd () { mkdir -p "$@" && eval cd "\"\$$#\""; }

これを `.bash_profile' へ記述する。

Hack4:一つ前のディレクトリとの切り替え

現在のディレクトリと一つ前にいたディレクトリを行き来できる。

これは知らなかった!!

cd -

Hack5:ディレクトリスタック

ディレクトリスタックがあるなんて知ってました?

作業中に、後で戻ると思ったカレントディレクトリを `pushd' で登録し `popd' で戻るのが基本。これは深い階層を持つディレクトリで作業をしているときに是非利用したい。例えばJavaのパッケージ階層とか。

Hack6:ディレクトリ名の自動訂正

以下のコマンドを実行すると、以降の `cd' コマンド実行で、ディレクトリ名のタイプミスを訂正してくれる。訂正されたときは実際に移動したパスの情報が表示される。

これは便利。

shopt -s cdspell
Connection: close