月額263円からのかわいいサーバー!ロリポップ!

最近、tumblrの最大画像の置き場が変わったみたい。

以前は、
amazonS3に最大サイズの画像(high resolution)を格納していたみたいだけど、
いまは、
tumblr自体のサーバに持ってきているみたい。昔のモノも含めて。

apiで
をみると、分かる。
(後ろが_1280.jpgとかに)

けど、移行期間中なのか、以前のpostの最大サイズ画像を見ようとすると
エラーになってしまう。
まぁ、ある程度の期間が必要なんだろうな。

それにしても、たぶん、ディスクが安くなった、という事なんだろう。

テーマ : web制作 - ジャンル : コンピュータ

MySQLを扱うPHP関数おぼえがき

よく忘れてしまうので、
PHPからMySQLを使う時に、
よく使う関数の一覧とカンタンなメモ。


mysql_affected_rows()


直前で実行されたSQLの変更件数が分かる。

update(更新)とかinsert(挿入)とかdelete(削除)。
selectの件数は、この関数では取得できない。
( mysql_num_rows() を使う )


例:
update [table] set 商品属性 = '冷凍' where 商品CD = '8001'
と実施した後に、
$aaa = mysql_affected_rows(); を行うと、
updateした件数が変数$aaaに入る。
失敗した場合は、-1。
sql文を書き間違えていても、-1。
update,deleteしてない場合は、0。


注意点:
1)
update時において、tableに入っている値と同じ値で更新した場合、
mysql_affected_rows()
が返す値は、「0」。
上書き更新していない、という事だろう。

2)
insert時において、一意制約の場合
(tableにユニーク設定、プライマリー設定している場合に、
すでに存在 しているユニークな値を入れようとした時に発生するエラー)
mysql_affected_rows()
が返す値は、「−1」。 構文エラーなどと同じ処理になる。


使い方:
1)何件更新したか、削除したかを表示させる。

2)プログラムミスで、大量に更新してしまうことを検知。
作り方にもよるが、だいたいwebサービスの場合のupdateは、
1件ずつじゃなかろうか。
そういう場合は、updateの後で、
mysql_affected_rows()の値を取得して、
「1」じゃない場合は、強制的に処理を終わらせたり、ログを書き残す。
回避したい場合は、事前にselectで件数を調べてから、updateするのが良いが、
その場合、ワンアクション処理が遅くなる。
なので、結果的に、大量更新されてしまうが、その状況をいち早く検知し、
次の状態を防ぐ事ができる、のは、まぁ重要かと。

3)一意制約を検知する。
どちらが確実になるのかわからないが、
insert時における、一意制約エラーを検知するために、
いままでは、 mysql_errno() を使っていた。
こちらを使ってもいけるかも。

※mysql_errno()での、1062と1022が、一意制約エラー。
※(エラーが無い場合は、0)




他で、忘れそうな、MysqlのPHP関数は、

前述した
mysql_errno()
と、
 ( mysql_err()だと、コメントが出る。けど、ログに吐くぐらい。 )

直前に実行した、select件数が格納される
mysql_num_rows()



あとは、
SQLを安全に実行させるエスケープ処理や
実行管理系(mysql_query()、mysql_result() )や、
selectで取得したデータを1行ずつ処理するための関数などが
あるけど、
このあたりは、またあとで。

テーマ : プログラミング - ジャンル : コンピュータ

タグ : PHP MySQL

tumblrのcaptionやtagsを書き換える場合

注意:以下の内容は、tumblr API V1です。

注意:すみません、プログラムの参考にした場所を忘れてしまったので、
    参考にした時と、同じコードを自分で作ったかのように記載しております。
    何か問題がありましたら、ご連絡ください。


photoのcaptionやtagをAPIで書き換える方法。


仕様上は、オプションと書いてあるが、気をつける事が2点。
書き換える際に、
click-through-url
date
を、元のpostから持ってきて、一緒に更新しないと、あまりよくない。

何も設定しないと、
click-through-url
は、クリア、
date
は、更新した日付時刻になってしまう。

tumblrのblog上では、このDate順に
表示されるため、一番上に表示されるようになる。
click-through-urlが、クリアされると、photoなどをクリックしても、
引用元のサイトには遷移しない。あまりよろしくない。

よって、
まず、更新する前に、
$req_url = http://".$tumblrname.".tumblr.com/api/read?id=".$id;
$xml = simplexml_load_file($req_url);
$photolinkurl = $xml->posts->post[0]->{'photo-link-url'};
$date = $xml->posts->post[0]->attributes()->{"date-gmt"};

のように、2つを取得しておく事。

その上で、
$request_multipart = array(
'email' => $tumblr_email,
'password' => $tumblr_password,
'post-id' => $id,
'click-through-url' => $photolinkurl,
'date' => $date,
'caption' => $photocaption1,
'tags' => $tags1 );

$c = curl_init('http://www.tumblr.com/api/write');
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $request_multipart);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$result1 = curl_exec($c);
$status = curl_getinfo($c, CURLINFO_HTTP_CODE);
if (curl_errno($c)) { echo curl_error($c)."
\n"; exit(); }
curl_close($c);

を実施する。(ここのコードは、tumblrAPIからの使い回し)

なお、その後のステータス処理は、

$status == 201 が成功。

$status == 403 は、Invalid post-id or reblog-key specified. (idとか違います)
$status == 503 は、over capacity。(tumblr側のサーバ負荷大)
$status == 400 は、Rate limit exceeded (今日のリミットを超えました)
  ※更新もリミット数に含まれたりしている?
  ※公式には、以下のように書いているが、変わった?
   400 Bad Request - 
    There was at least one error while trying to save your post

テーマ : web制作 - ジャンル : コンピュータ

タグ : PHP tumblr

自分のtumblr上でダブり投稿を検知する方法

自分のtumblrBlog上でのダブり投稿を見つけ出す方法。

やっぱり、reblog_keyを使うのがお勧め。


tumblr apiで取得できる、
postごとの、
「reblog_key」 (V1もV2も同じ)
が、
世界中全てのtumblrBlogの中でのユニークキー。


いまの所、アルファベットの大文字と小文字と数字で構成。
8桁。
ただし、今後、増えたら、たぶん桁を増やすんだと思う。

このreblog_keyが同じpostは、ダブり。

たぶん、tumblrのsystemでは、
このreblog_keyで管理していて、notesのカウントは、この単位のはず。

※未確認だが、reblogツリーの中のコメントは、もしかすると、新しいidの方で
 表示されるような気がする。昔のidのままだと、そのidよりも新しく書きこまれた
 コメントは表示されていないかも。。。


なお、idは、blogの1pageを示すようなもの。
同じモノをreblogした場合、idは変わる。新しく振られる。
blogを削除したい場合は、このidを指定して削除。
すると、ダブりの方だけ削除できる。

また、reblogされたときに、postの形式(photoやtextなど)を
変更することが可能。なので、同じreblog_keyでも、postのtypeが
違う事もありえる。( text,link,quoteのみらしいが未確認)


一番カンタンなダブりチェックは、よって、
reblog_keyを、自分のデータベース内に格納して、ダブりチェックする
というのが、ベターか。
もしくは、javascript等でブラウザ内かクッキーににreblog_keyを
貯めこみ、reblogする際にチェックするとか?


別の方法:(だけど面倒)

tumblrAPIではtypeがphotoの場合、
その画像の置き場所として、photo_urlを取得する事ができる。

このURLを見ると、
widthのサイズが500までは、tumblrサーバに格納されているが、
これを超える、大元の画像は、amazonのクラウドに格納されている。
ここのURLを指し示す場合、自分のtumblrBlog名が記載されている
ため、単純にreblogする前に、photo-urlをチェックしようとしても、
reblog元のtumblrBlog名が入っているため、一致しない。
が、まぁ、その辺りを外しても大丈夫では無いかと思うが、
昔のpostなどでは、形式が違っていて、XMLのtag取得ができない
ケースもあった。
が、そのURLの中のハッシュ?のような文字列は、どうも同じようなので
ここを見つけて、ダブりチェックする、という手もある。
が、
そこまでするよりかは、
tubmlrのsystem自体が用意してくれている、reblog_keyを使うのが、
妥当。

さらにまた別の方法:
tumblrAPIには、photo-link-urlというDataも取得する事が
できる。これは、photoの場合だと、本当の大元のサイトのリンク情報。
(画像等をクリックした時の遷移先)
しかし、、、
人によって、サイト(HTML)でpostしたり、画像(jpg)でpostしたりして
いるため、この部分でのダブりチェックは難易度が高い。
livedoorやfc2の場合、jpgは別サーバに格納されているようだし。


補足:
世界中のいろいろな人のtumblrのデータを見てみたところ、
同じDataだが、reblog_keyが違うケースがある。

これは、
(サーバ資源の無駄遣いではあるが)
正しいreblogをしていない場合で、
tumblrのblogのPhotoなどに対して、postしている状態。
この場合は、新しくreblog_keyが振られ、
さらに、Dataの格納場所も変更される。


もったいないので、気をつけよう。


あとは、
なんとか、サーバサイドでの、類似画像チェックプログラムを
作って、そこでなんとかごにょごにょすれば、できると思うが、
難易度が高い。。。

テーマ : web制作 - ジャンル : コンピュータ

タグ : PHP tumblr

PHPでtumblrAPIのData取得方法(V1)(XML)

注意:以下の内容は、tumblr API V1です。

注意:すみません、プログラムの参考にした場所を忘れてしまったので、
   参考にした時と、同じコードを自分で作ったかのように記載しております。
   何か問題がありましたら、ご連絡ください。


tumblrAPIのV1仕様。の、PHPでの取得。(XML版)


まず、
$req_url = http://".$tumblrname.".tumblr.com/api/read?start=".$start."&num=50&type=photo;

のように、変数を用いて、URLを作成。
その後、PHPのXMLを解釈する関数に投げ込む。

$xml = simplexml_load_file($req_url);


これで、$xmlの中に、データが格納される。

とりあえず、firefox等で上記のURLを見てみると、XML構造が
わりかし分かると思うので、まずはそれを見てからだが、

この$xmlからデータを抜き出すには、

まず、num=50で取得しているので、postが、50個ある。
ので、
for ($i = 0 ; $i < count($xml->posts->post); $i++) {
 処理
}
という感じで、forを回す。

countは、この$xmlの中の最大post数をカウントする関数。
$i++で、$iの値が1個ずつ、1個のpostずつアップしていく。


forの中の処理は、
postのヘッダ情報は、このようなカタチで。
$date = $xml->posts->post[$i]->attributes()->{"date-gmt"};
$reblogkey = $xml->posts->post[$i]->attributes()->{"reblog-key"};
$type = $xml->posts->post[$i]->attributes()->{"type"};
$id = $xml->posts->post[$i]->attributes()->{"id"};

postの下にぶら下がっている各種情報は、このよなカタチで。

$photourl4 = $xml->posts->post[$i]->{'photo-url'}[4];
 ※ホントのXMLはphoto-url max-width="100"などと入っているが、
  max-widthでの取得方法がよくわからないので、上から5番目を取得。(0からスタート)
 ※一番小さい、正方形サイズのURLや、最大の大元のURLなどがあるが、
  この数は、どうも途中で仕様変更?があったようで、昔のを見たら、数が違う。。。


$photourl = $xml->posts->post[$i]->{'photo-url'};
 ※このように記すと、一番上のデータが取得できる。一番上は、一番大きなサイズのデータ。

$photolinkurl = $xml->posts->post[$i]->{'photo-link-url'};
 ※リンク元。これは1個しかないので、普通に。

$tag1 = $xml->posts->post[$i]->{'tag'}[0];
 ※タグは、たくさん入れる事ができる。ので、取得するには、このように一番初めを
  取得するなり、[0]のところに、さらに変数を入れて、forで取得するとか。


$photocaption = strip_tags (strval($xml->posts->post[$i]->{"photo-caption"}) ) ;
$photocaption = str_replace(array("\r\n","\r","\n"), '', $photocaption);
 ※photo-captionには、HTMLコードが入っている。
  HTMLコードを外したかったので、上記では、色々やっている。


typeがphotosetの場合:
※photoset形式とは、1つのpostの中に、複数のphotoが入っているモノ。
 この場合、以下のようなカタチで、それぞれのURLが取得できる。
 が、こちらも、tagと同じ?ように、限界数がわからないので、
 全部取得するなら、forで回すのが吉。

$photoset1 = $xml->posts->post[$i]->photoset->photo[0]->{'photo-url'} ;
$photoset2 = $xml->posts->post[$i]->photoset->photo[1]->{'photo-url'} ;


なお、他にもtextやquoteなどのpostのtypeがある。
タグ名は違うが、XML構造は、大体同じなので、上記を参考に。

テーマ : web制作 - ジャンル : コンピュータ