平々毎々 (Hey hey, My my)

rock and roll can never die.

月別アーカイブ: 5月 2007

transit

changi airport, singapore.

there is no global ime installed and i don’t have a permission to install it. but it’s okay.

changi is interesting. free movie, free internet service, free xbox game, pool, fitness gym, and so on…

広告

輝度

今メインモニタはDell 2005 FPWなんですが、使ってたら目が疲れてきて視力も落ちてきた気がしたので、輝度を下げました。

ディスプレイ自体の設定ではBrightnessは0にしてます。

nvidia

個人的にはこのぐらいでちょうどいいです。まだ下げてもいいくらい。

スマブラXが欲しい

Wii「大乱闘スマッシュブラザーズX」の音楽スタッフが異常すぎる

ギャッ。オタク心をくすぐる……

Wii持ってる友人夫婦にプレゼントしようかな(そして自分がプレイしようかな)

Day 17: Alt+Enterで全部修正(あと赤い電球の紹介も)

元記事

31日間ReSharper一周」の17日目にようこそ。

数日間続けてAlt+Enterをネタにする。今日のネタはAlt+Enter > Change All の利用だ。

赤い電球

最初に言っておきたいのは、昨日の機能(Alt+Enterで名前空間をインポートする)は、たとえどこにカーソルがあっても動作する点が特殊だということだ。Alt+Enterがそういう動作をするのは名前空間だけなんだ。通常は位置との関係性が強くて、現在カーソルがあるコードに対してだけ作用する。これからネタにしていくAlt+Enterの機能は全部そうなっている。

ReSharperが修正方法を知っている問題(赤や灰色や波線)があったとき、カーソルを問題のコードに持ってくれば、ReSharperはその行の隣に赤い電球を表示する。

赤い電球。Alt+Enterで修正できる問題を示す。

赤い電球は、何かを修正しなければならないことを示している。黄色の電球も存在する。こっちの場合、修正してもいいけど全ては自分の判断に任されている。こっちは後日の投稿でネタにしよう。

電球はクリックしてもいいし、Alt+Enterを押してもいい。どちらの方法でも、エラーを修復する方法の選択肢がドロップダウンメニューで表示される。

Alt+Enterのドロップダウンメニュー。コンパイルエラーを修正するChange Allなどの選択肢を表示する。

追記: このドロップダウンメニューのコマンドは「応急処置」と呼ばれている。(最初に投稿したときに言及しておけばよかったね。)

Change Allについて

赤いシンボルのための応急処置のうちの1つがChange Allだ。これは名前から連想される通りのことをする。全ての(赤い)シンボルを、別の(定義済みで赤くない)シンボルに変える。これが便利なのは、たとえば、あるメソッドからコードを切り取って別のメソッドにコピーするときに、変数またはパラメータ名が違っている場合だ。

Change Allには2つの部分がある。提案リストと同期編集だ。

提案リスト:読心術稼働中

Change Allコマンドの提案リスト

Change Allを選ぶと提案リストが表示される。しばしば提案が1つしかなく、それがまさに希望のものだったりする。便利すぎて気味が悪い。

今この機能について書きながら、どう動くのか正確に理解しようとして限界を試しているんだが、改めて感心した。この機能は基本的にはCtrl+Shift+Spaceの裏返しだ。

何が起きているかと言うと、シンボルが赤く表示されている場所を全部見て、(同名の赤くないシンボルを持つメソッドは全部無視して、)各々の場所でどのように使われているかを知り、エラーのない利用法に沿ったシンボルを提案している。

だから、もしシンボルがif文の条件式なら、ReSharperはbool型の変数だけを提案する。もしシンボルの後に「.PixelOffsetMode =」とあるなら、ReSharperはGraphics型の変数だけを提案する。(別の型にPixelOffsetModeプロパティを定義していなければね。)

多くの場合、シンボルの使い方に合致した、ただ1つのパラメータまたはプロパティになる。だからReSharperが心を読んでいるかのように見える。(そう言っても過言ではない!)

注意点:Change Allの提案リストは、変数のようなもの(変数やパラメータやプロパティ)を対象とする。メソッド名や型名にもChange Allを使うことができるけど、Change Allのリストにはそれらの提案が出ない。

同期編集がVisual Studioにやって来た

これは素晴らしい感触だ。新しい名前を入力するダイアログボックスをポップアップする代わりに、Change Allではエディタ上の1箇所で直接新しい名前を入力できて、入力したとおりに他のところを変えることができる。

ReSharperのドキュメントにはこの「エディタウィンドウの指定場所でリネームする」機能に名前がない。でもこれはDelphi 2005の同期編集機能とほぼ同じもののようだから、そう呼ぶことにする。Visual Studioでこの機能が利用できてうれしい。

不在のお知らせ

知人以外どうでもいい話だが。

5/24~6/6まで旅行に行ってくる。6/2まではインターネットにもアクセスしない(できない)ので悪しからず。

Day 16: Alt+Enterで名前空間をインポート

元記事

31日間ReSharper一周」の16日目にようこそ。

今日から数日の間は、ReSharperでいちばんよく使うキーストロークの1つについて話そう。Alt+Enterだ。前に言及したときにはReSharperの「十徳ナイフ」と呼んだけど、それはとにかく万能だからだ。ある種のコンパイラエラーを修正できたり、コードを補完できたり、使われていないコードを削除できたり、総じて言えば、コーディング中に繰り返し現れる作業を自動でやってくれる。

今日のネタ: 名前空間のインポート。

基本

前にも言ったけど、ReSharperは認識できないシンボルを赤く表示する。でも、まだusingしてない別の名前空間の中に存在するシンボルであることが分かっていれば、ReSharperは別のものも表示する。エラーを修正させようとするヒントだ。

Alt+Enterを押して名前空間をインポートするよう促す

だから、もしソースファイルPixelOffsetModeとだけ入力したら(しかも、まだusing System.Drawing.Drawing2Dをやってなかったら)、ReSharperは名前空間を全部スキャンして、その名前のクラスを探し出し、目的のものはこれですかと聞いてくる。Alt+Enterを押して同意すれば、ソースファイルに using System.Drawing.Drawing が追加される。

この機能について知っておくべき追加情報を以下に記す。

  • ソート。ReSharperは、予期した順序でusing文を追加する。その順序とは、修正版アルファベット順だ。最初にSystem名前空間以下の全部を(アルファベット順で)並べ、その後ろに残りの全部を(アルファベット順で)並べる。注意してほしいのは、この機能では、今言った順序に並んでいないときだけ並び替えをするんだけど、再度並び替えるときはCtrl+Alt+Fを押すだけでいい。
  • 場所にあまり依存しない。Alt+Enterで実行できる他の機能については後から話すけど、普通は、カーソルが存在するコードに特有のものだ。でも、今回に限った使い方――名前空間のusing――では、その必要はない。たとえカーソルが赤いシンボルの上になくても動く。(赤いシンボルがファイル内に複数あるなら、Alt+Enterの対象になるのはいつもカーソル位置に近い方だ。)
  • (あんまり)瞬間的ではない。コードの色分けと同じだけど、ヒントが表示されてAlt+Enterを押せるようになるまで、入力を止めて1~2秒待たないといけない時もあるだろう。ReSharperはコードを調べて、(a)型が認識されていないことと、(b)その型が別の名前空間に存在していることに気がつかないといけない。これが終わってからでないとAlt+Enterのヒントは出せないし、それまではAlt+Enterを押しても何も起こらないだろう。長くはかからないけど、時々は手を止めて待つ必要があるだろう。
  • あいまいさの解消。もしシンボルが複数の名前空間で見つかったら、ReSharperはどっちにするか聞いてくる。ヒントには「(複数の選択肢)」と表示されるだろう。Alt+Enterを押したら、選択肢一覧の中から欲しいものを選ばないといけない。
    Alt+Enterを押した後の選択メニュー
    Alt+Enterを押してインターフェースのどれかをインポートするよう促す
  • 参照に依存する。これは驚くような事じゃない。新しいアセンブリを作成して、クラスに[TextFixture]属性を追加すれば、ReSharperはそれを赤く表示するだろうけど、アセンブリを右クリックしてNUnit.Framework.dllへの「参照を追加」しないと、修正の手助けはやってくれない。

Ctrl+Alt+Spaceとの比較

昨日はCtrl+Alt+Spaceで型名が自動補完されusing文が追加されることを話した。

Alt+EnterはCtrl+Alt+Spaceが動かないところで動く。たとえば、オンラインのサンプルコードをコピペしている時に、必要なusing文が追加されていないような場合とか。でもコーディング一般ではCtrl+Alt+Spaceの機能の方が向いているとは思う。ただね、こっちを使うことをどうしても思い出せないんだな。「そうそう、今はメソッド名じゃなくて型名を入力しているんだから、Ctrl+Alt+Spaceを押すんだったな。」って考えられるようになるには時間がかかる。でももし使うことを思い出せたなら、何か入力してAlt+Enterを押すよりも適してるように思われる。

主な理由は、どっちの機能でも1~2秒待たなきゃいけない場合があるんだけど、待ちのタイミングはCtrl+Alt+Spaceの方がふさわしいからだ。

Alt+Enterだと、識別子を入力してスペースキーを押した時には、気持ちはもう次に入力する内容に移っている。でもコードが赤くなったことに気づいて、さっき書いた内容に注意を戻さないといけなくなる。「ありゃ、この文を入力し終わったらAlt+Enterで修正しないといけないな」という判断を意識の裏でするだけとは言っても、まあ気が散るよね。

一方Ctrl+Alt+Spaceでは、識別子の一部を入力したらキーストロークを押す。ここまでが識別子の入力の範囲だ。そしたら頭を行内の次のところに切り替える。だからすでに書いたコードの確認で流れがさえぎられるってことがない。

人によってメリットは違うだろう(し、僕のメリットだってそうだ)。べ、別にAlt+Enterがダメ機能だって言ってるわけじゃないんだからね!ただ、Ctrl+Alt+Spaceに適したところではそっちを使ってもいいんじゃないかって思っただけなんだから……

Visual StudioのAlt+Shift+F10との比較

Visual Studio 2005にも似たような名前空間をインポートする機能がある。VSが知っているシンボルを入力したときには、小さいスマートタグが表示される。マウスを乗せる(か、Alt+Shift+F10を押す)とドロップダウンメニューが表示され、そこからusingを追加することができる。ReSharperのAlt+Enterと比べるとどうかな?

  • キーストローク。もしシンボルが1つの名前空間だけに存在するなら、ReSharperではAlt+Enterを押すだけでいい。Visual StudioだとAlt+Shift+F10を押した後にEnterも押さないといけないから操作しにくい。ReSharperの勝ち。
  • ソート。Visual Studioだとusingブロックの最後尾に名前空間が追加されるし、すでにあるusing文の順番がでたらめでも放置される。ReSharperだと自動的に並べ替えられる。ReSharperの勝ち。
  • 位置関係。Visual Studioでは、カーソルがシンボルの上にないとスマートタグは表示されない。ReSharperでは、赤いシンボルが画面内にあるなら常に「名前空間の追加」というAlt+Enterのヒントが表示されるので、名前空間をインポートするときにカーソルを動かす必要がない。ReSharperの勝ち。
  • 応答時間。Visual Studioでは、型名の最後の文字を入力したらすぐにスマートタグがポップアップ表示される。ReSharperでは、シンボルが赤くハイライトされてヒントが表示されるまでに1~2秒かかることがある。かろうじてVisual Studioの勝ち。(3GHz/2GBの開発マシンよりも800MHz/256MBの個人用ノートPCの方が、もっと差が目立つけど)

Yakety Yak

Hackety Hackを見て思い出したのが、The Coastersの”Yakety Yak”という曲。映画”Stand By Me”のサントラに入っていたなあ。

散らかした紙くずを捨てなさい
じゃないとお小遣いあげない
台所の床も磨きなさい
じゃないともうロックンロールさせない
無駄口叩かない 口答えしない

部屋の掃除はちゃんとやりなさい
ほうきで余計にほこりが舞ってるじゃない
そのがらくたは全部片付けなさい
じゃないと金曜の晩に遊びに行かせない
無駄口叩かない 口答えしない

コートを着て帽子をかぶりなさい
そしたらコインランドリーに行ってきなさい
終わったらワンちゃんを部屋に入れなさい
入れ替わりに猫ちゃんは出しなさい
無駄口叩かない 口答えしない

そんなだらしない格好しない
お父さんを見習って格好よくなさい
不良のお友達は帰ってもらいなさい
車を運転する年にはまだ早い
無駄口叩かない 口答えしない

んー。50年前のアメリカでも、母ちゃんはやっぱりやかましい。

Day 15: Ctrl+Spaceの一族

元記事

31日間ReSharper一周」の15日目にようこそ。

昨日はReSharper版Ctrl+Spaceについて話した。今日はReSharperが追加する2つの仲間を取り上げる。Ctrl+Shift+SpaceとCtrl+Alt+Spaceだ。

(「パラメータ情報」は以前はCtrl+Shift+Spaceだったが今はCtrl+Pになっているのを忘れないように。)

Ctrl+Shift+Space:予想される型でフィルタリング

Visual Studioの標準のCtrl+Spaceは(ReSharperでもそうなんだけど)、現在インポートしている全名前空間に含まれるあらゆる型を表示する。ReSharperにはコンテキスト依存の選択肢もあり、それだと正しい型だけを――現在のカーソル位置から予想される全ての型を――表示する。コンテキスト依存版はCtrl+Shift+Spaceで起動する。

たとえば、

Stream stream = new FileStream(fileName, FileMode.Open);
StreamReader reader = new StreamReader(

と入力してCtrl+Shift+Spaceを押せば、かなり短い補完候補一覧が得られる。というのは、StreamReaderのコンストラクタの第1引数となりえるものだけを表示するからだ。streamは候補の1つだし、Stream.Nullもそうだ。それに、文字列を返す静的メソッドの山もそうだ。StreamReaderのコンストラクタには文字列を受け取るオーバーロードもあるからだ。

この機能はコンストラクタではまだ動作しない。

Stream stream = new

と入力してCtrl+Shift+Spaceを押したときは、このコンテキストで使用できる具象クラスが全部表示されることを期待するだろう。ところが表示はされない。「候補なし」となるだけだ。サポートいわく、新しいシナリオはまだサポートされていないけれど、すでに将来のリリース計画にはあるとのこと。

でもなー。こういう時ばっかりはDelphiで作業するほうがいいと思うわけだよ。(もちろん、Delphi IDEが「バックグラウンドで」コンパイルしようとして(そして何度もやり直して)いる間、マウスを動かそうとしても30秒ずつ固まったりしないならと仮定しての話だけどね――ありえない希望だとは思うけど、人は夢を見る生き物だし。)どうしてかと言うと、今でもDelphiのCtrl+Spaceの方がすごいからなんだ。こっちもコンテキスト依存だけど、正しい型を持つ式を表示するってだけではない。正しい型を得ることができる式をも表示するんだ。たとえば、Integer型が予想されるコンテキストなら、Delphiは一覧にTFormのインスタンスを表示する。なぜならInteger型のプロパティ(Width、Height、Constraints.MinWidthなど)を持つからだ。この機能にはあっという間に慣れるよ。だから僕は、制限がずっと多いReSharperのコンテキスト補完に慣れるのに苦労している。とはいえ、たぶんそのせいで、Delphiが候補一覧を作るのは泣くほど遅い。

追記: 空のメソッドを新しく作って、その中でCtrl+Shift+Spaceを押すと、補完できる型がないはずなのに自動補完ボックスがポップアップする。ReSharper開発者のIlyaが言うには

空のメソッド内か、文が予想されるならどんな場所でも――たとえば、ある2つの文の間とかで――Ctrl+Shift+Spaceを押すと、「void」型が予想されるから、戻り値のないメソッドだけが表示される。

Ilyaありがとう!

Ctrl+Alt+Space: どこかの名前空間に属する型全部

方向性が違うんだけど、Ctrl+Alt+Spaceは型名だけを表示する――プロパティも、メソッドも、定数も表示せず、ただ型だけ。でもCtrl+Spaceとは違い、全ての名前空間から探してくる。しかも、その時点でusing文がある名前空間に限らない。

Ctrl+Alt+Spaceのドキュメントには、現在のソリューションの中にある型名を補完するとある。でもそれは正しくなくて、参照しているアセンブリからも型が補完される。だから、マイクロソフトやサードパーティが作ったアセンブリから来る、FileStreamやTestFixtureAttributeのような型でも動作する。)

ここまで聞いただけだと、まあ少し面白いけどねーって感じだと思う。いやいや、ここからが面白いんだ。型を選択したとき、まだusing文がなかったなら、ReSharperは適切なusing文を自動的に追加する。

(ReSharperには、必要なusing文を追加する別の機能もある――実は、明日その話をしようと思っているんだけどね。それでも、ちょくちょくCtrl+Alt+Spaceを使うくせをつけたほうがいいと思う。こっちの方が速くて簡単であると断言しよう。)

Ctrl+Alt+Spaceは、押す前に型名の最初の数文字を入力しておかないといけない。これはわざとなのかサポートに連絡して聞いたところ、ええ、その通りですと言われた。全部のアセンブリから候補一覧を拾ってくるから、何か入力してフィルターをかけないと時間がかかりすぎるだろうとのこと。納得いく理由ではある(その理由をドキュメントに記載していたなら素晴らしかっただろうけれど)。

Day 14: たとえばこんな変数名

元記事

31日間ReSharper一周」の14日目にようこそ。

ReSharperは、Ctrl+Spaceを独自のバージョンに入れ替える。ほとんどはVisual StudioのCtrl+Spaceと同じ動きをするが、ReSharper番には追加機能が1つある。変数名を提案できるんだ。

変数宣言を入力してCtrl+Spaceを押すと……

ReSharperが変数名を提案中

ReSharperは型名に基づいた名前の候補を自動補完ドロップダウンで表示する。ドロップダウンリストの振舞いは他の自動補完ドロップダウンと同じだから、項目にカーソルを合わせてEnterを押すことも、そのまま入力することもできる。そうすれば現在の選択肢で名前を決定し、セミコロンを入力してくれる。

賢いことに、インターフェース名の先頭にあるIは無視してくれる。しかも、型名が1単語だけなら邪魔なドロップダウンを出さない。だから、もしISprite (空白)と入力してCtrl+Spaceを押せば、黙ってspriteと入力してくれる。

もちろん、この機能はローカル変数だけのためにあるのではない。パラメータとフィールドでも動作する。独自の命名規則を教えることだってできる。例えば、全てのフィールド名は_で始めないといけないとか。ReSharperオプションの「命名規則」のページを見てくれ。

Ctrl+Spaceを押す前に、接頭語を入力することもできる。

名前の接頭語を指定した後、ReSharperが変数名を提案中

残念なことに、ReSharper 2.5.1だとバグがある。提案では、もともとキャメルケースで入力していた接頭語が、全て小文字に変えられていることに注意。(このバグ用のチケットが作製されている。)

変数名の提案は、変数宣言の際のCtrl+Spaceに限らない。ReSharperの他のところでも出てくる。たとえば、引数を定義しているとき、名前を入力するか提案から1つ選ぶかすることができるコンボボックスが出てくるとか、変数をリネームしているとき、名前の提案がポップアップするとか、メソッドを抽出しているとき、パラメータ名でも提案が作動するなど。

Day 13: ファイル構造ビュー

元記事

31日間ReSharper一周」の13日目にようこそ。

Delphiのいくつかのバージョンには「構造」ビューがあり、フィールドとメソッドとプロパティをツリー表示する。ReSharperは「ファイル構造」ビューで更に数歩進んでいる。Ctrl+F11でアクセスできるが、素晴らしいショートカットってわけではない。多分、一旦ウインドウを表示したら、後はそれをドッキングさせたままにするだけだろう。

ReSharperの「ファイル構造」ビュー

メソッドのソート

名目上は、コードの構造を一目で見るためにこれを使える。でも実のところ僕はそのためには使っていない。僕の指は「すべて折りたたむ」のショートカットを覚えこんでいる(Ctrl+M、Ctrl+Oだと思うけど、気にとめた事ないからな……どれどれ……ああ合ってた)。

僕が「ファイル構造」ビューを使うのは並べ替えのためだ。全メソッドがアルファベット順になっていれば、僕らの人生はさらに楽ちんだろう。しかしReSharperにはその選択肢がないので、抽出したメソッドは常に間違った場所に置かれる。でも、「ファイル構造」ウインドウではドラッグ&ドロップができて……

ReSharperの「ファイル構造」ビュー

メソッドを新しい場所にドロップすれば、ReSharperはコードエディタでメソッドを移動する。

空行についてはたまにおかしな動きをする。でも、ものごとを正しい順序に保つ選択肢がReSharperに追加されるまでは(世の中には無数の異なるコーディングスタイルがあることを思えば、それは難しい注文なのだが)、ツリーのノードをドラッグ&ドロップした後に「すべて折りたたむ」をし、空行の一部を取り除く、というのはカット&ペーストよりはるかに速い。

リージョンが好きなら……

リージョンを実際に使っているし気に入ってるという人たちのために、ReSharperの「ファイル構造」ビューのリージョンは見栄えがするし、折りたためる。

ReSharperの「ファイル構造」ビューでリージョンを展開している所
ReSharperの「ファイル構造」ビューでリージョンを折りたたんでいる所

リージョンが嫌いなら……

個人的には、コードにリージョンがあると読みにくくなると思う――それに、もしコードが複雑すぎるからリージョンによる組織化が必要だっていうのなら、それはクラスから匂いがするってことだよ。

もしこの陣営にいるのなら、ReSharperが力になれる。リージョンボックスの右上に、小さくて青い「X」が見えるかな?それを1回クリックすれば、リージョンタグを消せる(#regionと#endregionのコード行が削除されるだけで、リージョンの中身は削除されない)。そしたらすでに「ファイル構造」ウインドウの中にいるわけだから、メソッドをドラッグして並び替えする作業に取り掛かれる。

もちろん、意図しないときにうっかりリージョンタグを消してしまったとしても、それは他と同じくコードの変更だから、元に戻すことができる。