2013年5月23日木曜日

CでJSONをパースする

自分でゴリゴリ書くと辛い。そんな訳で、parsonを試してみた。
[{"Name":"Taro", "Age":"10"}, 
  {"Name":"Hanako", "Age":"20"}]
みたいなJSONを解析するには
int i;
JSON_Value *root_value;
JSON_Array *persons;
JSON_Object *person;

root_value = json_parse_file("ファイル名");

persons = json_value_get_array(root_value);
for ( i = 0; i < json_array_get_count(persons); i++ )
{
  person = json_array_get_object(persons, i);
  printf("%s, %s\n", 
                json_object_get_string(person, "Name"), 
        json_object_get_string(person, "Age"));
}
json_value_free(root_value);
みたいな感じでやればパース出来る。 日本語とか大丈夫なのかはまだ未確認だけど、便利そう。

2012年4月3日火曜日

iPhoneでYouTube(その2)

先日の投稿で書いた通りにやると、うまくいかなくなってしまった。gdata-objectivec-clientにSBJSonが入らない状態でダウンロードされるためと思われる。 で。こんな感じで回避。

1. svn checkout http://gdata-objectivec-client.googlecode.com/svn/trunk/ gdata-objectivec-client-read-only

これでSBJSonの入っていないgdata-objectivec-clientが取得できる。

2.ここからさらにダウンロード。 

2に入っているJSONフォルダを1のSourceにコピー。

そのあとはここで紹介されている手順で作業。

もしかしたら2つめにダウンロードしたやつだけでうまくいくのかもしれない....と後で思った。

2012年2月10日金曜日

iPhoneのPush

とりあえず、SandBox使用の場合

1) App IDではちゃんと開発用のPushの設定をしておく
2) Pushが使えるProvisioningで署名をする
3) 1. で取得した証明書とか秘密鍵でp12ファイルを作って、サーバーにおいておく

3を忘れてひどい目にあったので、めもめも。

2012年2月8日水曜日

YouTube API for Objective-C(iPhone)

設定はここを見れば、大体問題なし(YouTube APIになっていないところは、適宜直す)。

xxx.hでは
#import "Headers/GDataYouTube.h"
#import "Headers/GDataServiceGoogleYouTube.h"

を記述した上で、プロパティにGDatFeedYouTubeVideo*を設定しておく。

特定ユーザのフィードを検索するにはviewDidLoadあたりで

    GDataServiceGoogleYouTube *service = [self youTubeService];
    NSURL *feedURL = [GDataServiceGoogleYouTube youTubeURLForFeedID:nil];
    GDataQueryYouTube* query = [GDataQueryYouTube 
            youTubeQueryWithFeedURL:feedURL];
    [query setStartIndex:1];
    [query setMaxResults:5];
    [query setAuthor:@"ユーザ名"];
    [query setOrderBy:@"published"];
   
    [service fetchFeedWithQuery:query delegate:self
          didFinishSelector:@selector(request:finishedWithFeed:error:)];
   
    [super viewDidLoad];       


とやっておく。

youTubeServiceは
- (GDataServiceGoogleYouTube *)youTubeService {
    static GDataServiceGoogleYouTube* _service = nil;
    if (!_service) {
        _service = [[GDataServiceGoogleYouTube alloc] init];
        [_service setUserAgent:@"てきとうに"];
    }
   
    // fetch unauthenticated
    [_service setUserCredentialsWithUsername:nil  password:nil];
    return _service;
}

検索が終わったら
- (void)request:(GDataServiceTicket *)ticket
finishedWithFeed:(GDataFeedBase *)aFeed
          error:(NSError *)error {
    if (!error) {
        [self setFeed:(GDataFeedYouTubeVideo *)aFeed];   
        [self.listView reloadData];
    }
}

みたいにして、検索結果をプロパティに設定して、UITableViewを更新する。
タイトル文字列なんかは
    GDataEntryBase *entry = [[feed entries] objectAtIndex:indexPath.row];
    NSString *title = [[entry title] stringValue];
    NSString *descriotion =
   [[[(GDataEntryYouTubeVideo *)entry mediaGroup]
               mediaDescription] contentStringValue];
    NSArray *thumbnails =
   [[(GDataEntryYouTubeVideo *)entry mediaGroup] mediaThumbnails];


こんな感じでとれる。

ここから基本的なコードは取得できる。






2011年10月28日金曜日

階乗のプログラム

Lipsで書くと、こんな感じ。
(defun fact (n)
    (if (zerop n)
        1
       (* n (fact (- n 1)))))
カッコの数があっているのか心配になる。

Prologで書くとこんな感じ。
fact(0, 1).
fact(N, X) :- N1 is N - 1,  fact(N1, X1), X is X1 * N.
分かりやすい。ステキ☆

Haskellで書いてみる。
fact :: Integer -> Integer
fact 0 = 1
fact n = n * fact(n - 1)
やっぱりこのあたりはHaskellが一番きれいかも。分かりやすいし。

Javaで書いてみる。
class Fuctorial {
  static int fact(int x) {
      if ( x == 0 )
          return 1;

     return x * fact(x-1);
  }
}
この程度のことでも色々書かなくちゃ行けない辺りが面倒。

2011年10月27日木曜日

Objective-C... メモリ管理

処理iOSのフレームワークMac OS Xのフレームワーク
データ処理FoundationFoundation
グラフィック処理
ユーザインタフェース処理
UIKitAppKit
マルチメディア処理AV Foundation, Media PlayerAppKitの一部、QTKitなど

オブジェクトの生成と削除 
オブジェクトはRetain Countが0になった時に削除される。オブジェクトの作成時には、Retain Countは1で初期化されている。

<普通のオブジェクト>
通常のオブジェクトは、メソッド終了時に自動的に破棄される。
イベントの発生によりメソッドが実行される場合、メソッド実行の直前にAutorelease Poolが作られ、メソッドが実行されている間に作成されたオブジェクトの管理を行う。メソッドが終了する直前にAutorelease Poolは削除されるが、その中で管理されていたオブジェクトに対して一斉にreleaseメソッドが送られる。これによりRetain Countが0になるため、オブジェクトは削除され、メモリが解放される。
メソッド開始
     →Autorelease Pool作成

NSString *str2 = [str substringFromIndex:3];
                 →ここでstr2のRetainCountは1。Autorelease Poolの管理に入る

メソッド終了
     →Autorelease Pool削除。releaseが呼ばれてstr2のRetainCountが0になる


<明示的に管理する場合>
retainをオブジェクトに対して実行すると、保持カウントが+1される。
この場合は、Autorelease Poolで管理されていても、Autorelease Pool削除時のreleaseにより保持カウントが0にならないので、オブジェクトは削除されない。
イベント処理が終了した後でも使用したいオブジェクトに対しては、retainを呼び出しておく。
[str2 retain];

この場合は、オブジェクトが不要になった時点で明示的にreleaseを送り、保持カウントを減らす必要がある。
[str2 release];

< Autorelease Poolで管理されないオブジェクト >
  • alloc, newという文字列を名前の先頭にもつメソッド
  • copyという文字列を名前に含むメソッド
により作られたオブジェクトはAutoreleasePoolの管理に入らない。
  • 明示的にreleaseする
  • autoreleaseメッセージを送っておく(AutoreleasePoolの管理に入る)

< allocの注意 >
allocでオブジェクトを作る時は、initから始まる初期化メソッドを呼び出すことが必要。
オブジェクトの生成(メモリの確保)は行うが、初期化を行わないため。
NSString *str2 = [[NSString alloc] initWithString:@"ABC"];
NSString *str2 = [[[NSString alloc] initWithString:@"ABC"] autorelease];

 

2011年10月5日水曜日

Linuxキーマップの設定

ThinkPadのキー配列がUSな関係で、キーマップの設定が必要になることがある。
VMWare上のCentOSでキーマップが違ったので直した。

よく忘れるのでメモ。



  • RedHat系:ファイルは/etc/sysconfig/keyboard

  • JPの場合
    KEYBOARDTYPE="pc"
    KEYTABLE="jp106"
    
    USの場合
    KEYBOARDTYPE="pc"
    KEYTABLE="us" 
     

  • debian

  • JPの場合
    # cp /usr/share/keymap/i386/qwerty/jp106.kmap.gz /etc/console/boottime.kmap.gz
    
    USの場合
    # cp /usr/share/keymap/i386/qwerty/us.kmap.gz /etc/console/boottime.kmap.gz