強火で進め

このブログではプログラム関連の記事を中心に書いてます。

Google Toolbox for MacをiPhoneで使ってOSのバージョン取得

Google Toolbox for Mac」を解凍したディレクトリにはiPhone向けらしい名前の付いたプロジェクトが存在します。

そこでこっちについても試してみようとちょっと開いてみました。

確認したところこちらはFrameworkを生成などはしておらず、UnitTest用を行っているプロジェクトでした。

とりあえず、.mと.hファイルをコピーして使えば良いのかな?と思いコピーしてOSのバージョン取得のライブラリを動かしてみました。

以下のファイルをコピーし、

  • GTMDefines.h
  • GTMSystemVersion.h
  • GTMSystemVersion.m

ファイルの先頭に

#import "GTMSystemVersion.h"

を記述し、以下のプログラムで確認してみました。

    long major, minor, bugFix;
    [GTMSystemVersion getMajor:&major 
                         minor:&minor 
                        bugFix:&bugFix];
    NSLog(@"Version:%d.%d.%d", major, minor, bugFix);

で出力した結果がこちら

Version:10.5.6

へー、iPhoneっていつの間にかそんなにバージョン進んでたんだー。って明らかにMacのバージョンですな。シミュレータだし、まあ良いかな?(反映してくれた方が使い勝手いいけど)。

実機で動かしたらちゃんと以下のような結果に

Version:2.2.1

ちなみにこんな感じでOSのバージョンを取得した場合はシミュレータ、実機ともに 2.2.1 となりました。

    NSLog(@"Version:%@", [[UIDevice currentDevice]systemVersion]);

今のところ(Ver 1.5.1)、OSのバージョンはこちらの方法で取得した方が使い勝手が良さそうですね。

Google Toolbox for Macの解説記事一覧はこちら

Google Toolbox for Macを使ってHTMLのエスケープ処理をする

これはiPhoneでも結構使う機会も多いと思われるHTMLのエスケープ処理。
エスケープ処理とは

<

&lt;

などに変換する処理です。

また、逆にエスケープ処理されたものを元に戻すメソッドも有ります。

必要なファイルはこちら

  • GTMDefines.h
  • GTMNSString+HTML.h
  • GTMNSString+HTML.m

プログラムはこんな感じ。カテゴリを使い NSString にメソッドを追加する形で実装されています。

    NSString* str;
    
    // エスケープ処理
    str = [NSString stringWithString:@"<p>test</p>"];
    NSLog(@"<p>test</p> -> %@", [str gtm_stringByEscapingForHTML]);
    // エスケープ処理された文字を元に戻す
    str = [NSString stringWithString:@"&lt;p&gt;test&lt;/p&gt;"];
    NSLog(@"&lt;p&gt;test&lt;/p&gt; -> %@", [str gtm_stringByUnescapingFromHTML]);

結果はこうなります。

<p>test</p> -> &lt;p&gt;test&lt;/p&gt;
&lt;p&gt;test&lt;/p&gt; -> <p>test</p>

Google Toolbox for Macの解説記事一覧はこちら

Google Toolbox for Macを使ってみた

ちょっと出遅れた感がありますが噂の「Google Toolbox for Mac」を触ってみました。

Google Toolbox for Mac」についてはこちら

GoogleからMacデベロッパへの贈り物「Google Toolbox for Mac」 | パソコン | マイコミジャーナル
http://journal.mycom.co.jp/news/2008/02/01/024/index.html

Google Toolbox for Mac
http://kirika.la.coocan.jp/cocoa/3rdlib/google/toolbox/foundation.html

とりあえず以下の Google Code から google-toolbox-for-mac-1-5-1.zip をダウンロード。

google-toolbox-for-mac - Google Code
http://code.google.com/p/google-toolbox-for-mac/

「プロジェクト」-「アクティブなビルド構成を設定」-「TigerOrLater-Release」に変更し、ビルド。

ここまで進めたところで標準のFramework以外の使い方を知らなかったので使い方を以下のサイトでチェックし、なんとか使用できる様になりました。

Use framework - Programming Room - Mac OS X
http://variousible.sakura.ne.jp/Apple/Creating/Tools/Xcode-useFramework.html

早速、Base64エンコードのライブラリを使ってみました。
ウィンドウにボタンを配置し、アクションに以下の様なプログラムを設定しました。

#import "AppController.h"
#import "GoogleToolboxForMac/GTMBase64.h"


@implementation AppController

- (IBAction)run:(id)sender
{
    NSString *str;

    str = [NSString stringWithString:@"TEST"];
    NSLog(@"--Ascii文字だけのとき");
    NSLog(@"Ascii :%@", [GTMBase64 stringByEncodingData:[str dataUsingEncoding:NSASCIIStringEncoding]]);
    
    str = [NSString stringWithString:@"TEST文字列"];
    NSLog(@"--日本語を含む文字列");
    NSLog(@"Ascii :%@", [GTMBase64 stringByEncodingData:[str dataUsingEncoding:NSASCIIStringEncoding]]);
    NSLog(@"EUC-JP:%@", [GTMBase64 stringByEncodingData:[str dataUsingEncoding:NSJapaneseEUCStringEncoding]]);
    NSLog(@"UTF   :%@", [GTMBase64 stringByEncodingData:[str dataUsingEncoding:NSUTF8StringEncoding]]);
}

@end

標準のFrameworkを使うときみたいに

#import "GoogleToolboxForMac/GoogleToolboxForMac.h"

このように書いていてずっとエラーになってちょっとハマりました。こいつはそれぞれ必要なヘッダファイルだけimportして使うみたいです。

出力結果はこんな感じバッチリBase64になってます。

--Ascii文字だけのとき
Ascii :VEVTVA==
--日本語を含む文字列
Ascii :(null)
EUC-JP:VEVTVMq4u/rO8w==
UTF   :VEVTVOaWh+Wtl+WIlw==

日本語を含んだ文字列をAsciiだと言い張って実行すると null になるみたいです。

他にもHTMLやXMLのパーサもあるみたいなのでそちらも色々とチェックしようかと思ってます。

あとソースにiPhone用のFramework作成用のプロジェクトも入っているみたいなのでそちらiPhoneでも使えそうな感じです。

Google Toolbox for Macの解説記事一覧はこちら

Google Toolbox for Macの正規表現を使ってみた

Google Toolbox for Mac正規表現を使ってみました。

前回と同様、ウィンドウにボタンを配置し、アクションに以下の様なプログラムを設定しました。

#import "AppController.h"
#import "GoogleToolboxForMac/GTMRegex.h"


@implementation AppController

- (IBAction)run:(id)sender
{
    NSString *str;
    GTMRegex* regex;
    NSArray* array;
    
    // 正規表現に使用する文字列をエスケープ
    NSLog(@"--escapedPatternForString:");
    str = [NSString stringWithString:@"^.[$()|*+?{\\"];
    NSLog(@"%@", [GTMRegex escapedPatternForString:str]);

    // 0番目にマッチした文字列全体。以降はサブパターンにマッチした文字列を返す。
    // マッチしていない場合は NSNull となる。
    NSLog(@"--subPatternsOfString:");
    regex = [GTMRegex regexWithPattern:@"(fo(o+))((bar)|(baz))"];
    array = [regex subPatternsOfString:@"foooooobaz"];
    int num = 0;
    for (NSString *match in array) {
        NSLog(@"%d: %@", num++, match);
    }
    // 0: "foooooobaz" -> マッチした文字列全体
    // 1: "foooooo"    -> (fo(o+)) にマッチした文字列
    // 2: "ooooo"      -> (o+) にマッチした文字列
    // 3: "baz"        -> ((bar)|(baz)) にマッチした文字列
    // 4: NSNull       -> (bar) にマッチした文字列
    // 5: "baz"        -> (baz) にマッチした文字列

    // 最初にマッチしたものを返す
    NSLog(@"--firstSubStringMatchedInString:");
    regex = [GTMRegex regexWithPattern:@"foo.bar"];
    NSLog(@"%@", [regex firstSubStringMatchedInString:@"foo1barfoo2barfoo3bar"]);

    // マッチしたかをBOOLで返す
    NSLog(@"--matchesSubStringInString:");
    regex = [GTMRegex regexWithPattern:@"foo.bar"];
    NSLog(@"%d", [regex matchesSubStringInString:@"foo1bar"]);
    NSLog(@"%d", [regex matchesSubStringInString:@"foo123bar"]);
    
    // マッチした文字列を置き換え
    NSLog(@"--stringByReplacingMatchesInString:withReplacement:");
    regex = [GTMRegex regexWithPattern:@"(foo)(.*)(bar)"];
    NSLog(@"%@", [regex stringByReplacingMatchesInString:@"foo123bar"
                            withReplacement:@"<b>\\2</b>"]);
    
    // NSStringにカテゴリが定義してあるため、NSString でも今までに紹介したメソッドと
    // 同様な処理が可能になっています
    // ※NSString のデータはパターンの文字列ではなく、検索対象の文字列になるため多少
    //  引数が異なることに注意
    NSLog(@"--gtm_stringByReplacingMatchesOfPattern:withReplacement:");
    str = [NSString stringWithString:@"foo123bar"];
    NSLog(@"%@", [str gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)"
                                            withReplacement:@"<b>\\2</b>"]);
}

@end

出力結果はこうなります。

--escapedPatternForString:
\^\.\[\$\(\)\|\*\+\?\{\\
--subPatternsOfString:
0: foooooobaz
1: foooooo
2: ooooo
3: baz
4: <null>
5: baz
--firstSubStringMatchedInString:
foo1bar
--matchesSubStringInString:
1
0
--stringByReplacingMatchesInString:withReplacement:
<b>123</b>
--gtm_stringByReplacingMatchesOfPattern:withReplacement:
<b>123</b>

また、正規表現をどのように処理しているのかプログラムを確認したところ内部的には regexec() という関数を呼んでいました。

この関数、今まで知らなかったんですが調べたところC言語正規表現を行う関数でした。Googleが自前で作ってたりするのかなぁ?と思ってたのでちょっと残念でした。

Manpage of REGEX
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/regex.3.html

フレームワークのプログラム内で REG_EXTENDED がセットしてあるため正規表現としては「POSIX 拡張正規表現」が使えるようです。

そのためPerlレベルの凝った正規表現は無理ですがちょっとした正規表現が必要なときなどには便利に使えそうです。

ちなみに正規表現についてこちらの本などが評判良いです。

詳説 正規表現 第3版

詳説 正規表現 第3版

でもまぁ、自分は難易度高そうなのでこっち使ってるんですけどw
正規表現の良く使うパターンの例題が載っていて実践にすぐ使えて便利です。
後、各種環境や言語別の方言について載っているのが良かったです。
正規表現ハンドブック (Technical Handbook Series)

正規表現ハンドブック (Technical Handbook Series)

Google Toolbox for Macの解説記事一覧はこちら