2014/02/27

LookingGlass 3D

LookingGlass 3DというJavaで実装された3次元デスクトップ環境がある。
その上で動く3次元のUIを持ったアプリを作ったこともあるんだが…、正直「こんなのパソコンの正当な進化じゃない」と思っていた。ゆらゆら動いたりアンチエイリアスが掛かってすごく見ずらいウィンドウたち。ウィンドウ同士(というかウィンドウを含む立体オブジェクト同志)の3次元の位置関係をアプリ側で指定出来て、その位置関係でそれまでに無い意味を表現することも出来る、のだが結局それを2次元のディスプレイにマッピングしている。するとこの小さく見えるオブジェクトは「手前にある小さいやつ」なのか、「奥にある大きいやつ」なのか分からない。分からないのでゆらゆらっと揺らすと揺れ方で分かる。なんか手間が増えてる…。軸が増えると理解するのも大変になる。(あと「奥にある小さいやつ」は行方不明になる)。
で一般的なユーザが主にPCでやることは変わらずオフィスとかインターネットとかメールとかだもんなぁ。デスクトップを3次元にってのは明らかにやり過ぎという感じ。それが2005年くらいのこと。

そんな中でVistaのエアロインターフェースを見た。(2006年くらい)
グラフィックカードの機能を使ってウィンドウの周囲に影が落ち、タイトルバーが磨りガラスのように透けて後ろが少し見えるようになった。これが衝撃というか、本当に必要なのはこういう表現だと思った。
WindowsXPとの差異はそれ以外にも色々あったと思うがこの2点だけで十分だった。3次元でも何でもないのに、影があったり透けて後ろが見えることで、ウィンドウ同士の前後関係が一目で把握出来るようになっている。奥行き感があり、ウィンドウが何枚開いていてどのくらい重なり合ってるか、などがパッと見て分かる。そして実際は3次元でも何でもないので奥のが小さくなったりはしない。2次元のディスプレイに表現するデスクトップ環境としてはかなり良い、むしろこれ以上無いくらい良いんじゃないかと思った。

そして今、Windows8.1でテストするためにVMに環境を作ったんだが、平面に戻ってた。ウィンドウ同士の前後関係が絶望的に分からん。フラットデザインていうの?なんで退化したの?バカなの?

2014/02/21

if ( 状態変更関数() ) ←これ止めて

関数の戻り値は実行の成否のbool値。まぁいつもいつも細かいことを愚痴々、、と思うかも知れない。でもJavaではifの条件文でオブジェクトの状態が変わるような書き方は初歩的な非推奨の書き方のはずだ。そんなにジャバジャバ言うならCの世界に入ってくんなと言われそうだが嫌なものは嫌だ。

if(isEmpty()) // OK
is〇〇()という名前の関数はオブジェクトの状態、内容で真偽値を返すが、その実行によってオブジェクトの状態や内容は決して変わらない。

BookTitle myTitle = myBook.getTitle();
if(myTitle == null) // OK
getter関数も決してオブジェクトの内容を変えてはいけない。
だからと言ってgetter呼び出し、ローカル変数に設定、nullチェック、までをifの条件式の中でやるような人は居ないだろう(居ても関わっちゃいけない)。
ちなみに便利さとのトレードオフでwhile文の条件式ではたまにやるかもしれない。
while((line = br.readLine()) != null)
というのがよく見る例だ。でもこれはfor文で
for(String line = br.readLine(); line != null; line = br.readLine())
って書いた方が良いんじゃないかな。

bool ret = myBook.changeTitle("Happy Java Life -第2版-");
if(!ret) // OK
そしてこれが状態を変化させる関数の成否を判定する場合。setterは大抵voidだと思うのでchangeTitleという例にした。タイトル変更に成功したらtrue、失敗したらfalseが返り、その成否を判定する例。インデントに頼ってコードをザッと追いかけるときに異常系のチェックは読み飛ばしがちだが、このコーディングなら問題無い。

if(myBook.changeTitle("mogomogo -第2版-")) 
// NO! ABSOLUTELY NO!!! WHAT THE FUCKING WRITING!!?? GAAAA!!! DIE REBEL!!!!

(追記)
怒りは理解力の足を引っ張ります。
怒りが理解力を妨げることは科学的に証明されています。
コードを追っている時に心穏やかでいることは、速やかな理解に役立つに違いありません。
残念なことに我々はしばしばF〇CKなどと口走り、時に罵るようなコメントを書き込みながら他人のコードを眺めています。

既存のコード、リリース審査を通り抜け、動作実績のあるコードを仏の心で受け入れましょう。


ちなみに「怒りが理解力を妨げることは科学的に証明されている」という元ネタのレポートは見つかりません。いかにも本当に聞こえる嘘かも知れません。でも怒ってはいけません。

2014/02/20

ExcelのVLookUpの使い方

 エクセルに用意された強力(?)な検索機能VLookUp(ぶいるっくあっぷ)について書きます。
使い道は多いんですが、使い方が難しいので個人的にはVLookUpを設定したサンプルを常備してます。どういう時に使えるのか、まずこの説明が難しいので具体例挙げましょう。以下の時に力を発揮します。
  • 小学校の教室で、「出席番号」と「名前」の出席簿と、出席番号で班分けしたリストがあるとき、各班の名簿(出席番号と名前)を作るにはどうしたらよいでしょう?
出席簿が以下、
 1 綾小路キミ麻呂
 2 伊藤博文
 3 上野比佐
 4 江頭二時五十分
で班分けが以下
 一班 1、3
 二班 2、4
で欲しい結果が
 一班 1:綾小路キミ麻呂 3:上野比佐
 二班 2:伊藤博文    4:江頭二時五十分
です。小学校の班分けに嫌な思い出がある人も少なくないのではないでしょうか。分かりずらいと思いますが上野比佐は麻雀がすごく強い人のつもりです。
このくらいなら人力で簡単ですが、人数が増えた時、機械的にやろうとすると意外と困ってしまうはずです。エクセルのVLookUpはまさにこのためにあります。

構文はこう。
 =VLOOKUP( 検索値のセル,  検索対象テーブルの区画,  検索対象テーブルから引っ張ってくる値の列数,  あいまい検索)
引数はもっと自由なのだが大抵こういう形で使うでしょう。最後のあいまい検索は通常の検索をしたいなら省略可能。つまり
 =VLOOKUP( 検索値のセル,  検索対象テーブルの区画,  検索対象テーブルから引っ張ってくる値の列数 )
で良いです。
例で言うと
 =VLOOKUP( 班の出席番号のセル,   出席簿の区画,   出席簿の2列目が名前なので「2」)
となるようにします。出席簿の区画と出席簿の2列目の値を引っ張ってくる、のは変えず、班の出席番号のセルだけ連番になるようにします。
 
  実際のエクセル画像で言うとまず上図の状態です。Excel2010の機能でテーブルの見た目が良くなってます。
式を設定しています。「E5」が班の1人目の出席番号のセル。出席簿の範囲は「B4:C18」ですが、以降で連続で設定するため、$でアンカーリングします。今回は横にはずらさないので「B$4:C$18」にしましたが「$B$4 : $C$18」とするとより確実です。
一行目でエンターを押して確定するとエクセルの機能で一班が全員設定されました(!)。「E5」から「E9」まで勝手に設定されています。普通は最初のセルだけ設定して二行目以降はズルズル引きずって設定します。その設定方法も一応載せます。
二班の最初のセルにVLookUpを設定し、そのセルにカーソルを合わせ、セル右下の小さな四角にマウスカーソルを合わせてマウスカーソルが「+」に変わったところでドラッグ開始、二班の下までドラッグしてドロップします。これで同様に設定されます(出席簿の範囲を$でアンカーリングしないとこの時にずれていくのです)。

 プログラマは案外エクセルを使うことは少なく、必要に迫られて困った時にWeb検索して関数を見つける、ということが多いと思います。しかし役立つ関数がまとまった小さな本を電車などで眺めておいて、いざ困る前に「それに使える関数があったはずだ」と思い出せると心強いと思います。
エクセル関数ワザ100

最後に図のように設定したエクセルをテキストにしたものを載せておきます。

2014/02/17

Liver rest day

キューカンビ(・∀・)キューカンビ(・∀・)
キューカンバ{・∀・}キューカンビ(・∀・)
「休肝日を設けるために養命酒を買ってみたwww」
「ってお酒やないかーい」
というジョークは置いといて別に休肝日のためでなく、風邪気味でもお酒飲みたい、そこで養命酒を買ってみたってことです。きっと美味しいだろうと勝手に思い込んでましたが実際美味しいです。ガムシロップを直に飲んでるような甘さがちょっとキツイですが。香りはコーラのようで14度もあるアルコールをほとんど感じません。そして薬なので一回20mlだけしか飲みません。薬としての効果はあまり実感できないかな~て感じですが、一本飲み終わるまで判断は保留しましょう。
( むしろコーラでもいい気が…)
あらためて読み直すと何が面白いと思ったのかさっぱりだ。もう少しちゃんと風邪を治した方が良さそうだ。

2014/02/11

NaCl

 「自宅で作るカレーはお店のカレーに敵わない」という真理を発見してしまった。

 その理由は別に技術や設備の差ではない。方向性の違いだ。自炊では美味しさも求めるが同時に健康的なもの、少なくとも健康に悪いものは作らないようにするだろう。端的に言って食塩、砂糖、油は出来るだけ控えるということだ。一方お店が作るカレーは健康よりも美味しく感じることが第一である。まぁ塩が濃ければ美味しいって訳でもないんだけど、絶対こういう方向性の違いはある。 実際お店のオムライスのレシピなどは一人分に平気で卵3個+生クリーム、フライパンにはたっぷりのバター、などとなっているだろう。自炊では予算の関係だけでなく、まずこういう分量にはしない(よね?)。

 そういうわけで家で作るカレーはちょっと塩が足りなかったり甘さが足りなかったりするのだ。ここまでの考えに至ってやっと栄養士という職が理解できたようだ。健康を損ねない中で最も美味しいバランスを取る、そういう知識や技術は自炊をする全ての人に必要かもしれない。

2014/02/10

JavaプログラマがC/C++を使うにあたってぶつかる壁!

一応プロ-プログラマとして過ごしているので、使う言語がJavaからC/C++に移って感じたことを挙げてみる。

1.文字列がねぇ!

間違いなく最初の壁。std::stringというテンプレートはあるが入門書ではたぶん使わない。
JavaやJavaScriptなどに慣れているとCの文字列の扱いに本当に苦労する。
文字の配列しかない、つまり最初に最大文字数を考慮しないとダメ(これはかなり厄介)。
最後に「\0」を入れないとダメ(このせいでただでさえ厄介な文字数がさらにややこしくw)。
文字列を連結したいだけなのに関数呼ばないと出来ない。配列なので文字数の増加に厳しい。
不便過ぎ。Javaではノータイムで出来ていることについて1つ1つ引数が分かりずらい標準関数を呼ばないと出来ない。
(std::stringを使えば楽になるが、それはそれでイメージが分からなくて苦労すると思う)

2.命名規約。大文字小文字の慣例が分からない

大文字で始まる関数もあれば小文字で始まる関数もある。
boolとBOOLがある。
命名に関しては今でも全て理解したとは言い難い(大きく外すことも無いと思うが)。

3.ポインタが分からない

プログラム未経験者がぶつかるポインタの壁と違ってJavaを使えるなら参照が分かるし、Javaにもプリミティブ型と参照型というのが有るので概念はすぐ理解できるだろう。が、問題はそこじゃなく「&」とか「*」の使い方に慣れてないので困る。今はほぼ理解したと思うが、「void** 」とかは試してみるまで分かんないw。
そして何故かヒープ領域とスタック領域の違いは誰も教えてくれない。
ポインターについて参考

4.クラスを作るのにヘッダファイルと分ける意味が分からない

いや意味は分かったんだけど、めんどうだなと思う。
あと結構C/C++に慣れてる人がヘッダファイルにクラスの中身まで書いたりするよね。あれでまた混乱したりする。

5.なんか似たような型が沢山ある

boolとBOOL、charとCHAR、何でなのか未だにちゃんと理解していない。まぁVC++特有の定義が多いのかなと思うけど。charって書けば済む話なのにライブラリごとに独自の型の名前にしてる。コンパイラが変わっても大丈夫なようにそうなってると、ぼんやり理解していてもどうせWindowsしか相手にしないし、と思えば面倒なだけ。
一応boolは小文字、それ以外のプリミティブ型的なのは大文字定義の型を優先して使うようにしている。

6.GUIが作れない

新しい言語でGUIアプリを作れるようになるとテンション上がるから意外と重要。JavaのGUIは優れていると思う(NetBeansとか)。.Netなどを使わないでGUIを作ろうとするとウンザリする。
Qtを学ぶと面白いかも知れないが最初の一歩が難しいので結局Win32APIで良いかなとなる。
GUIアプリなら素直に.Net使えば良い。(Win32APIのGUIは他のGUIと違って超高速なので楽しいと言えば楽しい)。

7.やっぱり難しい

プリプロセッサで#ifdefで場合によってソースが変わる、とかマクロが展開される、とかはコードリーディング時に単純に脳のスタック領域を圧迫する。書く時にもマクロやtemplateを使いこなそう、作ってみよう、と思うと結局のところJavaよりかなり難しいというのが実感…。

8.VCが使い辛い

番外編。特に周りがEclipseを使っているのにVC6.0を使うよう言われた時はつらかった。こんなのテキストエディタじゃん・・と思った。(今はVC2010に拡張機能入れて快適になっている

逆にこれらだけクリアすればJavaもC/C++も大丈夫!

2014/02/07

同じ年じゃなくて同い年

「なぜ同じ年じゃなくて同い年なんですか」という疑問が昔からあった。全く同じ質問がヤフー知恵袋にあった。音便と言って発音の便宜のために変化したものだという。まぁそんなことだろうと想像が付いてたが、「オナイドシ」という発音がぬるっとしててやらしい感じで嫌だと思ってたw 文脈上も同年代の他人のことを言うので生理的に警戒するのかも知れない。そんなふうに感じてる人は他にいるだろうか・・
 「急いで」が実はこの音便で「急ぎ-て」の変化だそうだ。「衝い立て」も「衝き立て」の変化だそうだ。そう考えると全然自然だ。そして「埼玉」は実は「サキタマ」が「サイタマ」になったそうだ。それらは別に「イ」に変わったとしても変な感じはしないが、「オナイドシ」という発音に覚えるやらしい感じは変わらないなぁ。