イマドキっ子の 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 していきましょう!

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

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

# 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回も繰り返すとかなり寿命が縮むし、コロラド大学ヤバい!!! 続きを読む