2013年5月31日金曜日

MacにHTML::Tidyをインストール



目的


EPUBを作るライブラリを書いているのですが、そのテストを書く際に何も工夫しないと、取得したXHTMLと答え合わせ用のXHTMLでスペース1つでも違うとテストが転けてしまう。
これは面倒なので、両方とも整形してから比較するためにHTML::Tidy を使いたい。


問題


cpanm HTML::Tidy するとテストが失敗する。build.logを見てみるとtidyp.hがないとのこと。


解決


以下のサイトにあった
【PERL】HTML / XML の 整形には TIDY“P”?

このサイトではgithubから持ってきてmakeしていますが、自分は Alien::Tidyp を使いました。



cpanm Alien::Tidyp
cpanm HTML::Tidy



課題


ライブラリとして公開するときに、必要なときだけAlien::Tidyp入れるようにってできないかな。





2013年5月30日木曜日

perlで画像の種類を判定する

モジュール探し

できるだけ依存が少ないモジュールで作りたいなぁと思って探すとImage::Infoというモジュールがあったので使ってみました。
yanchaで質問して、Image::JpegCheckというモジュールがあることを知りましたが、名前の通りjpegだけですので、今回の用途には使えず。
Image::InfoもImage::JpegCheckもやっていることはほぼ同じで、画像の一部だけ読み込んで判定しています。

コード

ファイル名に拡張子がある場合は拡張子を用いて判定しています。
拡張子がなければ画像データから判定。

sub media_type {
    my $image_path  = shift;

    require MIME::Types;
    my ($type) = MIME::Types::by_suffix($image_path); #画像ファイル名から判定

    unless ($type) {
        require Image::Info;
        my $img_info = Image::Info::image_type($image_path); #画像データの一部から判定
        if ( $img_info->{error} ) {
           die sprintf("Can't determine file type: %s", $img_info->{error});
        }
        $type = 'image/'.$img_info->{file_type};
    }
    lc($type);
}

2013年5月13日月曜日

ARC対応のReachabilityでネットワーク状況を確認する

ここからARC対応バージョンをDLして、プロジェクトに加える。

(追記 公式がアップデートしてARCに対応している https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html)

次にBuild PhasesのLink Binary With LibrariesでSystemConfiguration.frameworkを追加。
あとはヘッダを読み込んだファイルで以下を記述したら完了。
コード引用元

Reachability *reachablity = [Reachability reachabilityForInternetConnection];
NetworkStatus status = [reachablity currentReachabilityStatus];
switch (status) {
  case NotReachable:
    NSLog(@"インターネット接続出来ません");
    break;
  case ReachableViaWWAN:
    NSLog(@"3G接続中");
    break;
  case ReachableViaWiFi:
    NSLog(@"WiFi接続中");
    break;
  default:
    NSLog(@"??[%d]", status);
    break;
}

追記

オフラインかどうか調べたいだけなのでマクロにした

#define isOffline \
([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] == NotReachable ? YES : NO )

追記2

2.2にバージョンを上げたら、SystemConfiguration.frameworkを追加しないとコンパイルエラーになる。

2013年5月7日火曜日

XPathQueryでHTML要素取得



XPathQuery


XMLのパーサを利用すると、不完全なHTMLのパースに失敗するので、
ここにあるlibxml2のラッパーを利用して、
XPathで要素を取得。


導入の仕方


ここ
一部変更したのはHeader Search Pathsに追加するのを/usr/include/libxml2にすること。


実装


PerformHTMLXPathQueryを使う。



NSURL *url = [NSURL URLWithString:@"http://google.com"];
NSURLRequest *request = [NSMutableURLRequest requestWithURL: url];

NSURLResponse *response = nil;
NSError *error = nil;

NSData *data = [
NSURLConnection sendSynchronousRequest: request
returningResponse: &response
  error: &error
];

if(error) {
LOG(@"%@", error);
}

NSArray *imgs = PerformHTMLXPathQuery(data, @"//img");
for (NSDictionary *dic in imgs) {
for (NSDictionary *attr in [dic objectForKey:@"nodeAttributeArray"] ) {
NSString *attr_name = [attr objectForKey:@"attributeName"];
NSString *attr_value = [attr objectForKey:@"nodeContent"];
}
}