Hatena::ブログ(Diary)

技術の切れはし

2009-12-31

iPhoneの画像処理アプリ

iPhone 3GからiPhone 3GSに切り替えて非常にサクサクとアプリが動くようになってからTwitteriPhoneでとった画像をiPhoneから投稿することが多くなった。

そうなるとどうしても必要になるのが画像処理ソフト。

レベル補正とか色調補正とかをしたくなる。

いくつかのその手のアプリを紹介。


今使っている画像処理のアプリ

  • Photoshop.com Mobile
  • Photogene
  • PhoneGrafer
  • ColorSplash

Photoshop.com Moblileは機能が少なめでわかりやすい。

また、エフェクトの質がいい。

色関係の処理としては

露出度と彩度の変更などができる。

アプリページへ(無料)


Photogeneは上のPS Mobileよりも機能が多く、レベル補正や色温度の調整ができるのが個人的にとても嬉しい。

私が普段GIMP@PCで画像を編集する際にいじるのがレベル補正、色調補正なので。

ただし残念なのはレベル補正の質があまり良くない。うーん。

アプリページへ(230円)


PhoneGrafer

いろいろなカメラでとった場合の効果を模倣するソフト。レベル補正とかそういう一般的な編集用ではない。

Russianなどは印象的な写真を作るのにおもしろい効果。

アプリページへ(230円)


ColorSplash

画像の一分をグレースケールにして、かっこいい画像を作れる。

ちょっと試しに作ってみた画像。

f:id:halhorn:20091231160510j:image

しかもこれ非常に操作性もいい。

カラーにしたい部分を指でなぞっていくインターフェース

拡大縮小は自由自在。Undoも複数回可能。ブラシサイズも自由に変更可能。

一時期これで遊んでいた。



などなど。

レベル補正が綺麗にできるアプリを知っている方があればご一報を。

Twitterのbotの簡単な作り方@PHP

(以前mixiに上げたものを再編集して掲載)

Twitterbotはとても簡単に作れてしまうので紹介。

作成にはServices_Twitterというものを使う。


参考にしたサイト

プログラミングができなくても作れるTwitter botの作り方

http://pha22.net/text/twitterbot.html

ここの配布してるphpのソースを参考にしながら作った。


Services_Twitter

http://labs.transrain.net/products/services_twitter/

上のサイトはこれを使ってボットを作ってる。非常に便利。getFriendsTimeline();みたいな関数が用意されてる。



作り方を書こうかと思ったけど、ソース見た方がずっと早いと思うので最低限の説明と、ソースを書く。

基本的には、

Service_Twitterクラスのオブジェクト作成。$stとかそういう変数に入れる。

$timeline = $st->getFriendsTimeline(); // タイムライン読み込み。
$st->setUpdate("かきこむないようだよー"); // タイムライン書き込み。

こんな感じで簡単。

読み込んだタイムラインのデータは、配列連想配列の入れ子になってる。

$timeline[何番目]["text"]:本文
$timeline[何番目]["id"]:TweetのID
$timeline["user"]["name"]:つぶやいた人の名前

などなど。詳しくはService_Twitterのサイトへ。


getFriendTimelineで取得したTLを自分でつぶやき直すボットのコード。

<?php

$username = "_haltest";
$password = "ないしょ";

require_once("Services/Twitter.php");

$st =& new Services_Twitter($username, $password);


// 前回読み込んだTweetの最後のIDを取り出す。
$id = file_get_contents("data.log");

// タイムライン取得。
$timeline = $st->getFriendsTimeline();

// タイムラインごとに処理。
foreach($timeline as $tweet)
{
 // まだ書き込んでないTweetなら
 if($tweet["id"] > $id){
  // かきこむ。
  $st->setUpdate($tweet["text"]);

  // デバッグのためにブラウザ上でも表示。
  print $tweet["id"] . " --- " . $tweet["text"] . "<BR>\n";
  $id = $tweet["id"];
 }
}

// 最後に書き込んだTweetのIDを覚えておく。
$fp = fopen("data.log", "w");
fwrite($fp, $id);
fclose($fp);

?>

※本来はgetFriendsTimeline()に引数を与えてある時間以降のタイムラインのみとるのが正当な方法。

ちなみに、$timeline = getFriendsTimeline();で取得したデータ$timelineがどういう構造になってるかは、

print_r($timeline);で見れる。

phpの動くサーバーさえあればできるのでやってみると面白いかも。




若干細かいいろいろ。

いわゆるbotとして動いてもらうためには、定期的に上のプログラムを動かさないといけない。紹介した一つ目のサイトにも書かれているけど、クローンジョブというのを使って定期的にプログラムを呼び出してもらう。

どのようなものが無料で使えるか等は上記サイトに載っているので割愛。

私はXREA+のサーバーを使っているのでそこのクロンジョブを使用した。

もう一つ。

Services_Twitterの説明を見ているとenableJsonConvert()というのを呼び出してやればgetなんたらの返り値はjson式の文字列ではなく連想配列($hoge["text"]とかいうやつ)にしてくれる、との話だったけどどうもそれがうまくいかなかった。

なので、紹介した一つ目のサイトのソースコードを参考にして、Services_TwitterのTwitter.phpを少し変えた。具体的にはデータを返すときにjson文字列の変換を行うようにした。

require_once("Services/Twitter/Jsphon/Decoder.php");

と最初の方でやっておいて、

_getData, _setDataの最後の行、

return $body;

となっているところを

$json =& new Jsphon_Decoder();
return $json->decode($body);

とした。これでjson文字列連想配列に変換される。

Decoder.phpは一つ目のサイトの方で使われているServices_Twitterに入っていた。



ちなみに今はタイムラインを見て受け答えを勝手に学習するbotを動かしています。

@nisehorn

みなさまもお試しあれ。

PHPの変数

Web上のプログラムとしてよく使われるPHP。実はこんなことができる。

$ごはん = "かれーらいす♪";
$methodName = "hoge";
$object->$methodName();

日本語で変数

PHPでは変数名に日本語が使える。

<?php
$やること = "ブログ書く!";

print $やること;
?>

出力結果

ブログ書く!

ちなみに、これでももちろんOK。

print "$やること";

これはダメ。

print "$やることhoge";

これだと何も表示されない。

$やることhogeという変数だと勘違いするから。

こういう事をしたい場合はこうしてやればいい。(公式に推奨されるやり方かは知らない

print "${やること}a";

出力結果

ブログ書く!a

つまり、変数名を{}で囲えば明示的にそこが変数名ですよ!ってなる。



ちなみに私がよくやる失敗はこれ。

<?php
$todo = "ブログ書く!";

print "$todoと言ったにも関わらず・・";
?>

これ、実は何も表示されない。読んでる人はわかると思うけど、「$todoと言ったにも関わらず・・」という変数名として解釈されるから。

日本語が変数につかえるというのは結構弊害のほうが大きいのではないか・・とか。

なんでもできるというのは楽しいけどね!

もちろんこれも、

print "${todo}と言ったにも関わらず・・";

でOK。

もしくは

print $todo . "と言ったにも関わらず・・";

こちらのほうが一般的なのかな。







メソッドやプロパティの指定に変数が使える

あるオブジェクト$objectがあるとする。

そのオブジェクト

$object->name

$object->regist()

のようにプロパティやメソッドを持っていたとする。

これがこんなふうに変数プロパティ名やメソッド名を指定して呼出できる。

$pName = "name";
$mName = "regist";

$name = $object->$pname; // $name = $object->name と同等
$object->$mName(); // $object->regist() と同等

phpではオブジェクトに対してforeachでプロパティを引っ張りだせたりもするし、まるで連想配列のようにオブジェクトを扱うことができる。

上のメソッド名の指定に変数を使う方式を使うと、こんなことができる。

<?php
class Executor
{
	function regist(){
		print "登録しました。";
	}
	
	function showMember(){
		print "メンバー表示だよ。";
	}
	
	function admin(){
		print "管理画面ですよ。パスワードください。";
	}
}

$exec = new Executor();

// クエリが無いとエラーになるため。
if($_REQUEST["command"]){
	$exec->$_REQUEST["command"]();
}
?>

これで〜〜〜.php?command=regist などとクエリによって簡単にやることを決められる。

若干セキュリティ的に危ないような気がしないでも無いけど。呼び出されて困るメソッドをクラスに登録しなければ大丈夫かな。

実行結果(〜〜.php?command=regist)

登録しました。

非常に柔軟というか普通できないだろと思うことができてしまったりするPHPさんでした。

nitoyonnitoyon 2009/12/31 16:22 > こういう事をしたい場合はこうしてやればいい。(公式に推奨されるやり方かは知らない
公式のドキュメントを参照しましょう。
http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing