2010年11月8日月曜日

DashcodeのQuartz Composerにも外から値を与えられたりしないかな?と思ってやってみた

動機
タイトルのまま.


やってみた
0. 'PublishされたInput'のあるQuarz Composerプログラムを用意
Quartz ComposerのテンプレートであるRSS Visualizerを利用してみる.このとき'PublishされているInput'上でPopupをつかってその入力のOriginal Nameをおさえておく.その後保存('RSSFeed.qtz').




1. 前回の記事のようにこれをプロジェクトに追加,インスペクタで設定する

ちなみにこの時点で'パラメータを編集'で後から'PublishされたInput'に値を設定することもできる.


ちなみにこの時点ではこんな感じ

2. 関数('init')を追加し,ライブラリのコード タブから'QCに値を設定するコード'を引っ張ってくる



3. 値を編集し直し,この関数(init)をload関数呼びだし後100ms後に呼ぶようにする.
  • idはインスペクタの属性 タブに書いてあった(QC)に与えてあるものを用いる.

  • inputKeyはQuartz Composerの'PublishしたInput'のOriginal Nameを用いる.

  • 'setTimeout'を利用してload関数の呼び出し後に別途呼び出す.なぜかload中ではうまく設定できずにデフォルト値のままとなった(QCのロード時間とかの都合?).


4. 実行




配置してみた
http://y30.net/pg/cocoa_qc/sample/feedはapple.comのもの

DashcodeをのぞいていたらそういえばQuartz ComposerってEmbeddedでつかえるんだってきいたなぁって思ったのでやってみた

追記(2010/11/08):タイトルのEmbeddedの綴りがEmbededと間違っていたのを修正.

--
動機
タイトルどおり.ついでに先日こんなの動画をyutubeにあげてたので.


やってみた
0.プロジェクト作成
Safari, カスタム

1.ライブラリからQuartz Composerを選んで配置



2. インスペクタのメトリックス タブで位置とサイズを調整


3.ファイルツリーを表示してqtzファイルをインポート




4. インスペクタで属性 タブの'ソースURL'に値を設定

5. 実行



配置してみた
http://y30.net/pg/cocoa_qc/Heart/

2010年11月5日金曜日

Webページ内をXPathで指定して抜き出して保存するなどしてみた.

追記(2010/11/07): NSThread sleepForTimeInterval:でリクエスト間隔をあけるようにしてみた.



動機
 TumblrみたいなバックアップとれればSpotlightで文字列検索できるのになぁ…。


やってみた
条件
・URLでは引数,page=%dでページが送れる
・ページ内のバックアップ単位はdiv要素とclass属性の値で指定できる.
・同div要素にはidがありバックアップが取りたい単位に対して一意である.



#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];


int i, ic, j= 1;
do {
if (j>1)
[NSThread sleepForTimeInterval:30];
NSString *urlString= [NSString stringWithFormat:@"http://hoge.net/user/hoge?page=%d", j++];
NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [NSData dataWithContentsOfURL:url];

NSXMLDocument *document = [[[NSXMLDocument alloc] initWithData:data
options:NSXMLDocumentTidyHTML
error:NULL] autorelease];

NSError *error= nil;
NSArray *nodes = [document nodesForXPath:@"//div[@class='hoge']"
error:&error];
if (error!=nil) {
NSLog(@"%@", error);
break;
}
ic= [nodes count];

for(i= 0;i<ic;i++){
NSError *err= nil;
NSXMLElement *elem= [nodes objectAtIndex:i];
NSString *idString= [[elem attributeForName:@"id"] stringValue];
NSString *content= [elem XMLStringWithOptions:(NSXMLNodePrettyPrint|NSXMLNodeCompactEmptyElement)];
NSMutableString *outputString= [NSMutableString stringWithString:@"<html>"];
[outputString appendString:@"<head>"];
[outputString appendString:@"<meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>"];
[outputString appendString:@"<base href='http://hoge.net/'>"];
[outputString appendString:@"</head>"];
[outputString appendFormat:@"<body>\n%@\n</body>", content];
[outputString appendString:@"</html>"];
[outputString writeToFile:[NSString stringWithFormat:@"/path/to/backup/%@.html", idString]
atomically:YES
encoding:NSUTF8StringEncoding
error:&err];
if (err!=nil) {
NSLog(@"%@", err);
break;
}
}
} while (ic>0);

[pool drain];
return 0;
}





気がついたこと
 divのclassの値の末尾に空白が並んでいるサイトであったがこの空白はXPathで指定する際は削ってあげないと一致として扱われなかった.