イマドキっ子の Objective-C

イマドキの流行に敏感なキミだったらもう知ってるかもだけど、今日はそういうのに鈍感なオジサンたちのために、今風の Objective-C について書いちゃうよ。もちろん互換性的な感じで、すぐに変えられないかもってコもいると思うけど、知っててもソンじゃないから、いま覚えとこう!それとこういうのって、けっこー変わっていくものだから、半年後とかにはもう流行後れになるから注意してね!

インスタンス変数

Objective-C のインスタンス変数と言えば、ヘッダの @interface に書くというのがこれまでのルールでした。典型的な例として、以下のように書いていました。

@interface MyObject : NSObject
{
    NSString *aString;
}
...
@end

今風には、インスタンス変数の宣言は実装部の @implementation に書きます。

@implementation MyObject
{
    NSString *aString;
}
...
@end

宣言済みプロパティの場合は自動生成されますから、書く必要はありません。外部からアクセスする際にはアクセサを通すべきで、普通はプロパティを使いますから、インスタンス変数は隠蔽しておきます。

これらについて Apple の日本語ドキュメントにも書いてあります。『Objective-C プログラミング言語』の35ページ、クラスインターフェースの注記として書かれた部分には以下のようにあります(強調は筆者による)。

インスタンス変数は実装詳細であり、通常、クラス自身の外からアクセスされることはありません。さらに、実装ブロック内に宣言すること、あるいは宣言済みプロパティから自動生成させることも可能です。したがって通常は、インスタンス変数宣言をパブリックインターフェイスで行うべきではないので、波括弧も省略してください。

また37ページのクラス実装の項に、実装ブロックでのインスタンス変数の宣言について書かれています。

続きを読む

快適 Growl 術

注目

Growl

Growl 使ってますか!Mac ユーザーの皆さん、Growl が OS X の標準機能ではないことに驚いたのも一度や二度ではありませんね!そういえば Windows 版もありますけど、使ったことないからよく知りません。

最近、Mac App Store から “Growl 1.3” がリリースされました。OS X Lion 以降に対応して170円。これを活用する『快適 Growl 術』をいくつか紹介します。


Growl があれば色んな通知が画面の端っこに表示されてとっても便利なわけですが、そもそも Growl に対応しないアプリケーションもいっぱいあります。そう、Apple 純正のアプリケーションとか。

Mail と iChat を Growl

Apple 製の Mail.app と iChat.app で Growl しちゃいましょう。この二つのアプリケーションが Growl したらとっても便利です。GrowlMail は本体から分離されましたからここでは取り上げません。[[wiki:AppleScript]] を使いましょう。

Mail

Mail

Growl with Mail

iChat

IChat

Growl with iChat

それぞれ上記のように設定しましょう。これで良い感じに Growl されますね。ちなみにこれらは Growl 1.3 と OS X Lion で動きます。古いバージョンだとちょっと変えないと動かないと思います。


適当なスクリプトを書いてコンピュータに仕事させるとき、どこまで進んでいるのか、処理が終わったのか、いちいち確認するのも面倒。そう、Growl させちゃえば良いですね。Growl 1.3 なら “GNTP (Growl Notification Transport Protocol)” に対応しています。これはネットワーク経由の通知を可能にし、さらに Windows 版とも互換性があります。これを使いましょう。

Python と Ruby から通知

Python でも Ruby でも、GNTP を利用して Growl するためのライブラリが公開されています。それを用いて、ライブラリがインストールされていれば Growl 通知し、そうでなければ標準出力にメッセージを表示するメソッドを定義してみましょう。

Python

Python

Python では gntp モジュールを使います。

pip install gntp
def notify(title, message):
    try:
        import gntp.notifier
        
        growl = gntp.notifier.GrowlNotifier(
            applicationName="Python/GNTP",
            notifications=["notify"]
        )
        growl.register()
        
        growl.notify(
            noteType="notify",
            title=title,
            description=message
        )
    except ImportError:
        print(title + ": " + message)
    
notify("Title", "Message")

Ruby

Ruby

Ruby では ruby_gntp クラスを使います。

gem install ruby_gntp
def notify(title, message)
  begin
    require 'ruby_gntp'
    
    growl = GNTP.new("Ruby/GNTP")
    growl.register(:notifications => [{
      :name     => "notify"
    }])
    
    growl.notify(
      :name  => "notify",
      :title => title,
      :text  => message
    )
  rescue LoadError
    puts "#{title}: #{message}";
  end
end

notify('Title', 'Message')

これでタイトルとメッセージを通知できました。ライブラリがない場合でも何となく使える感じですね。GNTP を使っているので Windows でも動くはずです。


Automator

Automator

[[wiki:Automator]] からも Growl できます。簡単ですね。

Automator


気付かないといけないことに気付くことのできない皆さん、知らないうちに大切なことは過ぎ去っていきます。がんがん Growl していきましょう!

Autocompleting username UI

2006年にサービスが開始されてから怒濤の勢いで普及し、いまや Web 上で誰も彼もが利用している Twitter。そしてサービスを便利に利用するため、世界には数多くのクライアントソフトウェアが蔓延っています。これらを全て把握することは、困難の域を通り越して、もはや不可能と言っても過言ではありません。そんな中、Mac や iPhone、iPad 上で世界的に流行っているクライアントを独断でいくつか選び、メンションを送るときなどに便利なユーザー名補完機能に焦点を当て、その UI を比較してみたいと思います。

Twitter

Twitter Inc.atebitsTweetie を買収し、公式クライアントとして無料で配布しているもので、Mac、iPhone、iPad それぞれに提供されています。

Twitter for Mac version 2.1

Mac App Store から配布されています。最新のバージョン2.1でユーザー名補完機能が搭載されました。“@” を入力するとすぐ下にアイコンとユーザー名のリストが表示され、文字を入力する毎にインクリメンタルに候補が絞られていきます。ここから選択することでユーザー名が入力されます。キーボードからもアクセスしやすいように配慮されていることにも注目です。

Twitter for iPhone version 3.3.4

iPad 版とはユニバーサルで、App Store から配布されています。“@” の描かれたボタンを押すか、“@” を入力することでリストが表示され、やはりインクリメンタルに候補が絞られます。これをタップするとユーザー名が入力されます。

Twitter for iPad version 3.3.4

iPhone 版と同じように動作します。

公式クライアントでは、iOS 版で “@” ボタンによるアクセスが用意されているほかは、Mac 版も含めた3つでほとんど同じように動作しています。また “#” から始まるハッシュタグでも、同様の補完機能が用意されていることも付け加えておきます。

公式クライアントという特性上、Twitter Inc. が想定する Twitter サービスの使い方に沿って各機能が実装されているという印象を強く感じます。

Twitterrific

Twitterrific は Iconfactory が世界で 初めて Mac 向けに作ったクライアントに端を発するソフトウェアです。現在のバージョン4シリーズでは、Mac OS X の Cocoa フレームワークに iOS の Cocoa touch フレームワークを移植することを目的とした、“Chameleon Project” という彼らが主催するオープンソースのプロジェクトによって、Mac 版と iOS 版でコードベースの多くを共有しており、そのためそれぞれの機能や UI はとても似通ったものになっています。またどのプラットホームでも基本は広告付きの無料版であり、Mac では Mac App Store で有料版を購入するか Iconfactory のサイトからプロダクトキーを購入することで、iOS 版ではアプリ内課金で、それぞれ広告を非表示にすることができます。

Twitterrific for Mac version 4.1

“@” に続けてユーザー名を入力することで、Tweet を書き込む欄の下側にアイコンとユーザー名の候補が横に並んで表示され、インクリメンタルに絞り込まれていきます。この横に並んでいるのが特徴的で、ちゃんとスクロールもします。

Twitterrific for iPhone version 4.1

Mac 版と同じく、候補が横に並びます。候補がキーボードのすぐ上に位置していて、選択するときにあまり指を移動しなくても良いように配慮されています。

Twitterrific for iPad version 4.1

iPhone 版と同じ感じです。

Chameleon Project によって、ユーザー名補完についてもプラットホームを問わず同じような UI になっていることが分かります。マウスカーソルを前提にした UI と、タッチを前提にした UI ではそもそもまったく考え方が異なるため、果たしてこの同じような UI であるということがどういった意味を持つのか、十分議論が必要な部分ではありますが、それでも Twitterrific では最低限の調整は加えられていることが伺えます。

また横に候補を並べることにより、ユーザー名の長さが短い場合に表示面積を節約できるというメリットが生まれています。これは副次的に、人間の認知の中でユーザー名の長さがある一定の役割を果たしていると仮定すれば、目的のユーザー名を見つけやすいという効果が得られている可能性があります。

Tweetbot version 1.1

iPhone 向けのアプリを自立するロボットのキャラクターに見立て、次々と独創的な UI と共に送り出してきた Tapbots が挑んだ Twitter クライアント、それが Tweetbot です。鳥型のロボットに見立てられたこのアプリは、これまで同様に特徴的な UI を備えています。全体的なレイアウトは公式クライアントを下敷きとしているように見受けられますが、随所に独特の工夫がみられます。

自動補完の UI は、“@” を入力すると現れる吹き出し風のボタンか、またはキーボードのすぐ上に表示されているツールバー上のボタンを押すことで表示されます。これはモーダルに画面を覆って、インクリメンタルにユーザーを検索するようになっています。

基本的には公式クライアントと同じ構成ですが、“@” を入力したあとにもう1ステップ、ボタンをタップするという動作が加えられています。これは排他的にに検索画面が表示されるため、“@” をユーザー名以外に使いたいとき、すぐに画面遷移しては困ることから、明示的にそれがユーザー名であることを指示するという意味合いがあるのだと考えられます。しかしこれは排他的な検索画面を表示することで起きる問題であり、公式クライアントがそうであるように非排他的な選択肢を提供すれば、1ステップ操作を減らせるのではないかと思われます。排他的に検索画面を表示しなければならない合理的な理由があるとは思えませんし、検索するという UI に何かこだわったのかもしれません。

Designing of UI

ここまで大きく分けて3種類、プラットホームも分けると7種類の UI を見てきました。それぞれ少しずつ、機能の見せ方が違っていました。多くの部分が似通っているのは、この機能自体がある程度その見せ方を規定しているからであると考えられます。逆にこの少しずつの差異は、その開発者が何を考えてデザインしているのかを知る手がかりとなります。

UI のデザインとは、すなわち機能そのもののデザインであると言っても過言ではないでしょう。利用者にとってはその実装に関わらず UI こそが機能です。ですから、ひとつの機能をソフトウェアに追加するとき、機能を実装することよりその UI を実装する方がよほど神経を使うことも少なくありません。デザインとはそれほど重要なことなのです。機能の働きが正しく利用者に伝わるように、そしてそれが不便を強いたりすることのないように。

[blackbirdpie id=”69091587338153984″]

コロラド大学からのサバイブ — コーディング編

前回の準備編に続いて、今回はコーディングに移りますが、まず最初に完成形となるコードを掲載します。

# coding: UTF-8

import os
import datetime
import mechanize
import urllib

# Set directory name.
directory_name = "images"

if not os.path.isdir(directory_name):
    os.mkdir(directory_name)

# Set dates.
start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2010, 12, 31)

current_date = start_date

while current_date <= end_date:
    
    print current_date
    
    browser = mechanize.Browser()
    browser.set_handle_robots(False)
    
    # Open web page.
    response = browser.open("http://argo.colorado.edu/~realtime/modis/")
    
    # print "=== HTML Source ==="
    # print response.read()
    
    # Check forms.
    # print "\n=== Fomrs ==="
    # for form in browser.forms():
    #     print form
    
    # Select first form.
    browser.select_form(nr=0)
    
    # Set day.
    browser["month"] = [current_date.strftime("%m")]
    browser["day1"] = [current_date.strftime("%d")[0]]
    browser["day2"] = [current_date.strftime("%d")[1]]
    browser["year"] = [current_date.strftime("%y")]
    # Set location.
    browser["alon0"] = "135"
    browser["alon1"] = "160"
    browser["alat0"] = "30"
    browser["alat1"] = "45"
    # Set options.
    browser["day_opt"] = ["7"]
    browser["cont_opt"] = ["T"]
    browser["cont_anot"] = ["T"]
    
    # Check forms.
    # print "\n=== Forms ==="
    # for form in browser.forms():
    #     print form
    
    # Submit.
    response = browser.submit()
    
    # print "=== HTML Source ==="
    # print response.read()
    
    # Check links.
    # print "\n=== Links ==="
    for link in browser.links():
        # print link
        if link.url[-4:] == ".gif":
            print link.url
            urllib.urlretrieve(link.url, directory_name + "/" + current_date.isoformat() + ".gif")
    
    current_date += datetime.timedelta(7)

print "Ended."

ここからはこのコードを目指して、どういった手順で書いていくかを説明します。 続きを読む

コロラド大学からのサバイブ — 準備編

[blackbirdpie id=”55654540422295552″]

我々の人生はとても短く、クリックするたびに寿命は縮んでいきます。

日本近海のクロロフィルと海面高度を衛星画像にオーバーレイした画像を、1週間毎5年分ほど集めたかったぼくは、コロラド大学の Web サイト “Colorado Center for Astrodynamics Research Real-Time Altimetry Project” の “Global Near-Real-Time SSH Anomaly/Ocean Color Data Viewer” で、画像を生成することに。ところがぎっちょんこの Web ページでは、結構な数のフォームを埋めて、画像生成に毎回10秒ほど待たされる。それを270回も繰り返すとかなり寿命が縮むし、コロラド大学ヤバい!!! 続きを読む

Realmac software – Courier

Realmac software から リリースされた “Courier”。「配達人」の名を持つこのアプリケーションは、封筒 (envelope) と切手 (stamp) をモチーフとして、ファイルをオンラインの共有サービスにアップロードする。これまでにも美しいビジュアルの UI を生み出してきた Realmac software が、遊び心いっぱいの UI で送り出した、珠玉のソフトウェアである。 続きを読む