2012年4月5日木曜日

perlでDumperしたデータをテキストデータに書き出す方法

---
use Data::Dumper;

my @colors = qw(red blue green);
my @fluits = qw(orange banana apple);
my %hash;
foreach my $c ( @colors ) {
foreach my $f ( @fluits ) {
$hash{$c}{$f} = 1; # 連想配列を作成
}
}

open(FP,'> dump.txt') or die; # 保存するファイルを開く
print FP Dumper(\%hash); # 連想配列の内容をファイルに書き出す
close(FP);
---


こちらのファイルを元に作ったら、
きちんとデータがテキストデータに保存できました!

---
my $data = $parser->XMLin($document);

print fh "$data". "\n";
---

これではHASH(0X45726..)みたいなエラーばかりが
書き出されていたので、

---
my $data = $parser->XMLin($document);

print fh Dumper($data). "\n";
---

こんな感じに修正しました!
そしたらきちんと表示されました!


2012年4月4日水曜日

Perlを使って、XMLのデータを取得する方法(geocodingで経度・緯度を取得する)

http://www.ibm.com/developerworks/jp/xml/library/x-xmlperl2.html


ここのブログがとても参考になりました。
ありがとうございます!!


住所の一覧があるのですが、それを使って
一度に全ての住所の経度・緯度を取得したくて数日悩んでおりました。

PerlでXMLを操作することで、
経度緯度をgoogleのgeocoding(ジオコーディング)を使って
取得することが出来たのでメモ。


まずはソースから。
こんな感じです。
----------------

#!/user/local/bin/perl

use strict;
use Jcode;
use LWP::Simple;
use URI::Escape;
use XML::Simple;
use Data::Dumper;

my $query = 'ここに好きな住所を入れる';
$query = Jcode->new($query, 'utf8')->utf8;
$query = uri_escape($query);
my $url = "http://www.geocoding.jp/api/?v=1.1&q=$query";

my $document = LWP::Simple::get($url) or die "cannot get content from $url";

my $parser = XML::Simple->new;
my $data = $parser->XMLin($document);


print Dumper($data) . "\n";

------

いつものように、復習しながら見ていきたいと思います。
まず最初のuse ~がついているところ。

use strict;
use Jcode;
use LWP::Simple;
use URI::Escape;
use XML::Simple;
use Data::Dumper;


use strictは、プログラムする際にミスが少なくなるように使います。
コレを使うときは、my $xxみたいに「my」を付けないとエラーが返ってきます。
その下の、
use Jcode;
use LWP::Simple;
use URI::Escape;
use XML::Simple;
use Data::Dumper;

これはCPANのモジュールです。
まだCPANをインストールしていない方は以下のページをよく見て
インストールしてください!



my $query = 'ここに好きな住所を入れる';
$query = Jcode->new($query, 'utf8')->utf8;
$query = uri_escape($query);


これは、文字コードが違う場合は、
文字化けしてしまわないように指定します。
もし文字コードが同じなら、特に指定しなくても大丈夫です。


my $url = "http://www.geocoding.jp/api/?v=1.1&q=$query";


今回はグーグルのジオコーディングを使うので、
そのAPIのURLを指定します。


my $document = LWP::Simple::get($url) or die "cannot get content from $url";

指定した住所と、googleのURLを合体させて、
そこで得られた情報を
$document変数に代入します。


my $parser = XML::Simple->new;
my $data = $parser->XMLin($document);

$documentに代入できた情報をパースして、
$data変数に入れます。


print Dumper($data) . "\n";

最後に$dataを表示させます。


---
34.710834
137.726126
34,42,39.002
137,43,34.054


こんな情報が得られるので、
経度はlatの「34.710834」
緯度はlngの「137.726126」

です!



2012年4月2日月曜日

Perlを使ってRSSのタイトルを取得する!

まずは、今日勉強したソースです。

----
use FindBin::libs;
use strict;
use utf8;
use Encode;
use LWP::Simple;
use XML::RSS;

my $url = "http://rss.dailynews.yahoo.co.jp/fc/rss.xml";
my $document = LWP::Simple::get($url)
or die "cannot get content from $url";

my $rss = XML::RSS->new;
$rss->parse($document);
for (@{$rss->{items}}) {
print encode('shift-JIS', $_->{title}), "\n";
}
----


yahooのRSSから、タイトル部分のみをコマンドプロンプトに表示させます。

復習のためにも、1行目から見てみます。
use FindBin::libs;

これはCPANのモジュール。
ファイルパスを一生懸命探してくれるツールみたいです。


use strict;

これもperlを使うならぜひ利用したほうがいいもの。
初めて勉強しました。

use utf8;

文字コードを指定します。

use Encode;

エンコードを使うので、useで指定。

use LWP::Simple;
use XML::RSS;

両方ともCPANのモジュール
RSSを利用したり、HTTPコンテンツを扱うためにuseで指定します。


my $url = "http://rss.dailynews.yahoo.co.jp/fc/rss.xml";

URLの変数を作って、その中に取得したいRSSのURLを指定

my $document = LWP::Simple::get($url)

URLをゲットしてきてdocumentに保存します。

or die "cannot get content from $url";

もし出来なかったら、「cannot get content from $url」を表示させて終了!


my $rss = XML::RSS->new;

RSSのインスタンス変数を作ります。


$rss->parse($document);

取得して保存したdocumentをパースして$rssに保存。

for (@{$rss->{items}}) {

コンテンツがあるまで繰り返します。

print encode('shift-JIS', $_->{title}), "\n";

タイトルの部分をシフトジスで表示!

}


以上でプログラムの終了です。

print encode('shift-JIS', $_->{title}), "\n";
ここの文字コードを変えることで、文字化けしたり、
文字化けを修正できたりしました。




XML::RSSのエラーに苦戦!perlの勉強

引き続きてこづったのでメモ
use XML::RSS ;

を使ったら、
Can't locate XML/RSS.pm in @INC (@INC contains: D:/Perl/site/lib D:/Perl/lib .)
at rss line 5.
BEGIN failed--compilation aborted at rss line 5.

というエラーが。


perlのXML::RSSモジュールはきちんとインストールしたし、
なんだよーと思いながら、
RSS.pm」を検索してエラーの指定のとおり、
D:/Perl/site/lib D:/Perl/libそれぞれのフォルダにXMLフォルダを作り、
RSS.pmをコピペして入れてみた。


でもまた違うエラーが、、

いろいろ検索したらこちらのブログに書いてあるとおり、

.pmと名のつくファイルを全てコピペして
D:/Perl/site/lib/XML D:/Perl/lib/XMLそれぞれのフォルダに
ファイルを入れてみた!


繰り返すこと10回くらい、
何度もくじけそうになりましたが、
エラーが出るたびに、指定されたフォルダを作ってファイルをコピペして…

って繰り返していたら、
なんとかエラーが解消された!!!

まだCan't locate package XML::RSS::Private::Output::Base for @XML::RSS::Private::Output::V0_9::ISA at C:/perl/site/lib/XML/RSS.pm line10;
Can't locate package XML::RSS::Private::Output::Base for @XML::RSS::Private::Output::V0_9::ISA at C:/perl/site/lib/XML/RSS.pm line11;
Can't locate package XML::RSS::Private::Output::Base for @XML::RSS::Private::Output::V0_9::ISA at C:/perl/site/lib/XML/RSS.pm line12;
Can't locate package XML::RSS::Private::Output::Base for @XML::RSS::Private::Output::V0_9::ISA at C:/perl/site/lib/XML/RSS.pm line13;

ってエラーは出ていますが。。
一応やりたいことが出来ました!

CPANモジュールをインストールしてみよう

今日からperlを少し勉強してみたいと思います。
まったくの初心者なのですが、、
挫折しないように頑張ります!

作って学ぶ、今どきのWebサービス: 第1回 何はなくともCPANを知ろう


ここのサイトを使って勉強していきたいと思います。

まず、今日つまずいたところをメモ。

CPANモジュールのインストールには、
シェルのコマンドラインから利用できるCPANシェルを使うのが便利です。
CPANシェルはroot権限で次のコマンドを実行して起動します。

-----
# perl -MCPAN -e shell
-----


シェル?コマンドライン?なんですかそれは、、
という感じですが、まずはパソコン画面の左下「スタート」→「すべてのプログラム」→
「アクセサリ」→「コマンドプロンプト」を開く

そうすると、
C:\Documents and Setting\myname>

と表示されるのですかさず、
perl -MCPAN -e shell
と文字を打ち込み、エンター!

CPANをインストールすることが出来ました!





2012年4月1日日曜日

libxml / tree.h No such file or directoryエラー(libxml2.dylib)

iphone アプリを作っていて、libxml2.dylibを使って
XMLをパースする時、
きちんとリソースファイルに既存のワークフレームで「libxml2.dylib」を追加したのに、
libxml / tree.h No such file or directoryというエラーが。。。


実は、ヘッダーファイルのパスを修正したら直りました!


1、グループとファイルの一番上のとこをクリック














2、プロジェクトのビルドから、headを検索

「検索パス」のところのヘッダ検索パスのところに、

$(SDKROOT)/usr/include/libxml2

こちらを記入。
そうすると、エラーが解消されました!!



2012年3月31日土曜日

iPhoneアプリがリジェクトされた!!

iPhoneアプリの作成にもちょっとづつ慣れてきて、
※まだまだできないこといっぱいありますが><

3つめのアプリをリリースしようとしたところ、
[Your app status is In Review]のメールが届いてから、
なかなかfor saleされないなーと思っていました。

いつも、[Your app status is In Review]のメールが届いてから、
その日中に、
[Your app status is Processing for App Store]のメールが届いて
数時間後には、
[Your app status is Ready for Sale]のメールが届くのに><


リジェクトされた内容は、
App ストア上で表示されるアイコンと、
iphoneやipod上で表示されるアイコンを一緒にしてくださいということでした。

そんなの知らなかったよー。。。

Appストア上に掲載されるアイコンはけっこう大きめなので、
細かいイラストをいっぱい入れたのですが、
iphoneのアイコンは小さいから、ちょっと違うイメージのイラストを載せたことが原因でした。

これからアイコン修正してもう一度申請してみます!!