Month of 12月, 2009

プログラミングHaskell (第五章の練習問題・シーザーの暗号)

in

5.7 (8) シーザー暗号のプログラムを大文字も扱えるように変更せよ

だんだん、プログラムらしくなってきました。問題のシーザー暗号のプログラムがどこまでのことを指すのか今ひとつわかりませんでしたが、crackの箇所は大文字の出現頻度がわからないのでとりあえず、暗号化するところまで。まず、let2intを改造して大文字もint変換できるように修正します。

プログラミングHaskell (第五章の練習問題)

in

5.7 (1) リスト内包表記を使って1から100の二乗の和を計算する式を考えよ

sum' = sum[x^2 | x <- [1..100]]

まぁまぁ、このあたりは...ね。

5.7 (2) replicateをリスト内包表記を使って定義せよ

プログラミングHaskell (第四章の練習問題)

in

4.8 (1) 偶数の長さをもつリストを半分に分割するhalve::[a] -> ([a],[a])を定義せよ

havle::[a] -> ([a],[a])
havle xs = (take n xs, drop n xs)
where n = length xs `div` 2

リストの長さが奇数でもOKだが?例外をスローすべきなのか?この章までではエラー処理についてはなにも言及されていないのでこのままで。解答には、

halve xs = splitAt (length xs `div` 2) xs

というのもありました。通常、こちらを使うべきですね。

プログラミングHaskell (第三章の練習問題)

in

まだまだ、調子よく進んでますが...

3.11 (1) 以下の値の型は何か?

a :: [Char]
a = ['a','b','c']
b :: (Char,Char,Char)
b = ('a','b','c')
c :: [(Bool,Char)]
c = [(False,'o'),(True,'l')]
d :: ([Bool],[Char])
d = ([False,True],['o','l'])
e :: [([a]->[a])]
e = [tail,init,reverse]

最後の問題は、括弧はつけなくとも大丈夫だとは思いましたがあえて関数のリストということであえてつけてみましたが冗長なのでむしろわかりにくくなるかもしれないので減点。

プログラミングHaskell (第二章の練習問題)

in

プログラミングHaskell 第二章練習問題。(Hugsを用いて実行はghc v6.10.4です)このあたりはまだ、余裕があります。(^^)

2.6 (1) 括弧をつけよ

-- 2^3*4
a=(2^3)*4
-- 2*3+4*5
b=(2*3)+(4*5)
-- 2+3*4^5
c=2+(3*(4^5))

2.6 (2) Hugsを用いて実行せよ。

*Main>: a
32
*Main> b
26
*Main> c
3074
*Main> d

2.6 (3) エラーを修正しHugsで実行せよ

NSURLのエスケープ指定

in

clippyのエイリアスに日本語ファイル名を指定すると読み込めないというバグがありました。自分では滅多に日本語ファイル名などというのは使わないので全然ノーマーク。

NSString:stringWithContentsOfURL:encoding:errorを使って読み込みする際、読み込むファイルのNSURLを単純に生成してました。

NSString *contents = 
  [NSString stringWithContentsOfURL:[NSURL URLWithString:filename] 
  encoding:NSUTF8StringEncoding error:&err];

これだとNSURL:URLWithStringはnilを返しますが、なんのチェックもなしです。(^^ゞなんでもかでも一行に納めるとこういう場合がきつい。ちゃんと2ステップ踏んで、fileスキームもちゃんとエスケープしないとダメですね。

NSURL    *url = [NSURL URLWithString:
  [filename  stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSString *contents = 
  [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&err];

便利なものがあって助かりました。しかし、どうせならエスケープするというのをデフォルトにすればいいのになぁ。などと少し思ったりもします。

プログラミングHaskell (翻訳版)で再び (第一章の練習問題)

in

しばらく頭を冷やしている間に立て続けにProgramming in HaskellとRreak World Haskellの翻訳がでて大忙し。Programming in Haskellが翻訳中なのは知っていましたが山本さんとうとうですねー。お疲れ様。ということで、邦訳でもう一度丁寧に読み返しはじめました。

すべてのウィンドウ情報を取得する方法。Scripting Bridge vs AX*

in

OSXである時点の表示されているすべてのウィンドウ位置を取得するのはScripting Bridgeで簡単にできると思っていたのですがいざやってみたらうまくできませんでした。やり方は、起動中のすべてのプロセス取得。そのプロセスが持っているウィンドウ情報を引き出すという手法でできると思ったですが...

まず、起動中のプロセス取得。これはシステムイベントから取得できます。

  SystemEventsApplication *systemEvents   = 
  [SBApplication applicationWithBundleIdentifier:@"com.apple.systemevents"];
  SBElementArray *procs = [systemEvents processes];

でこのプロセスからウィンドウ情報を取得します。

for(SystemEventsProcess* proc in procs)
{
   for (SystemEventsWindow *w in [proc windows])
   {
      NSLog(@"%@ :%@ (%.1f:%.1f,%.1f:%.1f),%d,%@,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
            [proc name],
            [w name],
            w.bounds.origin.x, w.bounds.origin.y,
            w.bounds.size.width,w.bounds.size.height,
            w.closeable,
            [[w document] name],
            w.floating,
            w.id,
            w.index,
            w.miniaturizable,
            w.miniaturized,
            w.modal,
            w.resizable,
            w.titled,
            w.visible,
            w.zoomable,
            w.zoomed
         );
     }
  }

これで完璧だと思ったのですが、取得できたのはw.nameだけ。あとは皆NULLかゼロという悲惨な状況でした。プロパティはあるのになんで!

Witchにかえて...

in

長いことWitchが試用状態のままです。ずっと気になっています。僕がこのアプリを使う理由はただ一つで、XCodeのヘルプをサクサクとエディタウィンドウと切り替えたいだけなんです。標準の[cmd + tab]はアプリケーション単位だし、Exposeはマウス操作が面倒。witchテイストなアプリの自作を試みたこともあります(^^ゞ。

それで昨日突然何か代替の手段があるのじゃないかと思い至って「環境設定」-[キーボード]調べてみたら[cmd + F1]に「アプリケーションの次のWindowを操作...」というのがありました。これはWitchのようにすべてのアプリケーションのウィンドウが対象ではありませんが、コード書いている最中はXCodeがアクティブですから違うプロジェクトウィンドウやヘルプウィンドウ間を行ったり来たりできて僕の欲しかった機能はここにアリって感じ。Withchの時と同様「Opt + Tab」に設定を変えて、どうやらお金を払わずに済みそうです。訳あってどうしてもPayPalを利用するのが嫌で長いことを試用のままでしたがこれでひとつ荷を下ろせた気がします。