F13

RSS

Homebrewをインストールする

インストール

以下のコマンドでHomebrewをインストール

$ ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"

環境の確認

インストール後に、以下のコマンドを行い正しく環境が設定されているか確認

$ brew doctor
    Your system is raring to brew.

ということなので、大丈夫そうだ。

UITableViewのtableHeaderViewをリサイズする

UITableViewのtableHeaderViewをリサイズする方法ではまったのでメモ。

まず、headerViewそのものサイズを変更し、tableHeaderViewに再設定すればよかったみたいだ。

Tumblrでgistのソースを表示させる

そもそも、gistにはembedするためのスクリプトが用意されているがTumblrに貼り付けてもうまく動かない。

そこで、以下のGistを使用するとうまく表示することが出来る。感謝!

https://gist.github.com/1395926

あとは自分のレイアウトにあわせて、cssを定義するだけだ。

dartsliveのデータ取得スクリプト

最近よくダーツをやっているので、DartsliveからRating等を取得できないかと思いスクリプトを書いてみた。

App EngineのUnit Testでxmppなapi proxyがないと怒られてしまった

以下のようなメッセージで、Unit Testが動かなくなってしまった。

No api proxy found for service “xmpp”

Channel APIを使うようにしたのだが、それの影響でどうやら、XMPPのStubを登録しておく必要があるみたいだ。

ということで、Unit Testの最初の方で以下のように登録してあげる。

from google.appengine.api import apiproxy_stub_map
from google.appengine.api.xmpp import xmpp_service_stub

apiproxy = apiproxy_stub_map.APIProxyStubMap()
apiproxy.RegisterStub('xmpp', xmpp_service_stub.XmppServiceStub()) 

# WebkitのNotification(通知)を使ってGMAILのようなデスクトップ通知を表示してみる

ということで、ChromeだとGmailのNotificationのような通知を結構簡単にできる。

注意点としては、requestPermissionはユーザのアクションによる呼び出しでないとうまく動かない。

<html>
    <head>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
    </head>
    <body>
        <ul>
            <li><a href="#" id="permission">Allow notification</a></li>
            <li><a href="#" id="notification">Show notification</a></li>
        </ul>
        <script>
var notify = function(message) {
    if(window.webkitNotifications.checkPermission() != 0) {
        return;
    }
    var n = window.webkitNotifications.createNotification('favicon.ico', 'Alert', message);
    n.show();
    // close after 3000 ms
    setTimeout(function(){
        n.close();
    }, 3000);
};

$('#permission').click(function(e) {
    window.webkitNotifications.requestPermission(function() {
        notify('Notification Allowed');
    });
});

$('#notification').click(function(e) {
    notify('Message');
});

        </script>
    </body>
</html> 

TextMate 2をソースからコンパイルしてみる

準備

コンパイルに必要なものをインストールする

Brewを使う。(オフィシャルにはPortを使った方法も書いてある)

$ brew install ragel boost multimarkdown hg ninja

※hg(mercurial)はSCMのライブラリのテストに使うだけなのでSkip出来る。

ninjaが見つからないと言われてしまった、Formulaが古かったようなのでアップデート

$ brew update
$ brew install ragel boost multimarkdown hg ninja

Lionを使っている場合は、pgrep と pkill のためにproctoolsをインストールする必要がある。

これもBrewを使ってさくっとインストール

$ brew install proctools

他にも、Xcode 4.4 以上が入ってない場合は、clangをインストールする必要がある。

試していないが、以下のコマンドで入れられるらしい。

$ brew install --HEAD llvm --with-clang

ソースの取得

ソースコードをGithubからCloneしてくる。

$ git clone https://github.com/textmate/textmate.git
$ git submodule update --init

コンパイル

準備ができたらコンパイルを行う。

$ ./configure && ninja

コンパイルに成功するとそのまま、TextMateが起動する。

NSErrorで、Potential null dereference エラー

NSErrorで、以下の様なメッセージが出て怒られてしまった。

Potential null dereference. Accordning to coding standards in ‘Creating and Returning NSError Objects’ the parameter maybe null

以下の様な実装をしていたのだが、

- (void)testHoge:(NSError *__autoreleasing *)error {
    ...
    *error = [NSError errorWithDomain:@"ErrorDomain" code:1 userInfo:nil];

}

errorがNullの可能性があるので、errorにNSErrorを代入する前にチェックが必要だった。

if (error) *error = [NSError errorWithDomain:@"ErrorDomain" code:hasLength userInfo:nil];

jinja2のMacroのなかで、Contextに定義した関数が使えなかった

標題の通りはまってしまったのでメモ。

Macroとは

以下の様に、テンプレート内で共通の表示部分をまとめることができる。

{% macro input(name, value='', type='text') -%}
    <input type="{{ type }}" value="{{ value|e }}" name="{{ name }}">
{%- endmacro %} 

そして、以下の様にMacroを呼び出すことができる。

{% import 'forms.html' as forms %}
{{ forms.input('username') }} 

非常に便利なのだが、Macroから、Contextに定義した関数がが使えなかったのだ。

というのにちょっとだけ、はまったのだがドキュメントを見たら書いてあった。

importする際に”with context”を付けてあげる必要がある。

先ほどの例だと以下の様にすれば大丈夫だった。

{% import 'forms.html' as forms with context%}
{{ forms.input('username') }} 

UIViewにグラデーションを設定

UIViewの子クラスを使い、以下の様にawakeFromNibでグラデーションを設定

- (void)awakeFromNib {
    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = self.bounds;
    gradient.colors = [NSArray arrayWithObjects:(id)[
        [UIColor whiteColor] CGColor], 
        (id)[[UIColor colorWithRed:0.69 green:0.769 blue:0.871 alpha:1] CGColor], nil];
    [self.layer insertSublayer:gradient atIndex:0];
}