twitpicとtwitterとtumblr 画質比較

twitpicが生画像の提供を中止して今後どこに画像を上げようと大騒ぎな今日この頃、そんな訳で画質比較を行いました。

投稿された画像が最大横幅、最大高さのどちらかをオーバーしていたら縮小されます。
また、全てのサービスで縮小されない横600px 縦1920pxのpng、jpgを投稿し、ファイルサイズがどうなるかの検証も行いました。

サービス名 最大縦幅 最大高さ PNG(2606KB) JPG(2153KB)
twitpic 600px 10000px以上 2595KB 99.6% 827KB 38.4%
twitter 1024px 2048px 3266KB 125.3% 504KB 23.4%

解像度に関しては、twitpicの高さ無制限が目立ちます。横幅は600pxと小さいですが、高さ無制限の為面積では圧倒的です。(高さ無制限がこのまま続けば)
さて次はファイルサイズ。これは色々注目する所があって、まずはtwitpicとtwitter公式。
PNGは両サービスで劣化はありませんでした。つまり、全く同じ画像という訳です。
と言うのも、pngは可逆圧縮 つまり画質が劣化しないフォーマットですので、サーバー側で何らかの処理を施されても画質はそのままです。
twitter公式はファイルサイズが増えていますが、投稿する画像を最大圧縮率 で保存した事が原因です。手元のPCでは最大の圧縮率で保存してもそれほど問題はありませんが、大量の画像が投稿されるとなると圧縮にかかる時間も無視できません。ですのでtwitter公式は画像を素早く処理する為に圧縮率を少し下げていると推測出来ます。

また、tumblrに関しても調査を行いましたが、リサイズの基準は単純に解像度だけでなくファイルの容量も関係しているようです。tumblrはtwitpicやtwitter公式には無い特徴があって、それは生画像を提供している場合がある事です。
JPGの場合ですと、2000KB、1280x1920くらいまでならアップロードしたそのままのファイルをDLする事が出来ます。この特徴のおかげでpict3dsはmpoを投稿させて頂いている訳です。
PNGの場合は容量の制限がもっときついようです。また、ファイルの拡張子がPNGでも中身がjpgに変わり画質が劣化している場合もあるので要注意です。
tumblrの細かいリサイズ条件をご存知のかた、教えてください。


投稿日時:2012/11/29(木)6:31 0件コメント

twitpicがオリジナルサイズの画像にアクセス出来なくなったのでpict3dsをtumblrに対応させた

twitpicがオリジナルサイズの画像にアクセス出来なくなったのでpict3dsをtumblrに対応させた

twitpicが画像を強制リサイズするようになりました。どうやら2012年11月27日の早朝に変更されたらしい。手元のデータだと01:56:36~06:29:31の間。
それが一時的なバグか仕様変更か分からないけど、せっかくなのでとtumblrに対応させる事にしました。

今まではtwitterにだけログインしていれば全サービスを使えたpict3dsだけど、同時にtumblrにもログインする必要が出てきた。
oAuthはそれほど苦労しなかったけど、tumblrのAPIを使う方が面倒だった。ドキュメントが1ページだから楽だけど。

一番頭を悩ませたのは3DSブラウザのタイムアウト。tumblrが遅いのかどうか知らないが、どうしても投稿された画像をtumblrにpostするのに20秒以上かかって
3DSブラウザがタイムアウトしてしまう。処理は正常に行われているからタイムアウトの数秒後にツイートされるんだけど、公開したら連投される事は間違いない。

問題の部分はcurl_exec($ch);で、ここで20秒以上時間がかかっている。
タイムアウトを防ぐには何かを受信させてやればいい。半角スペースでも適当に送信してやれば問題ないだろう。
そう思ったけど、curl_execの実行中に他の事をさせるのがなんとも出来ない。
そこで、一つのコネクションしか貼っていないのにcurl_multi_initを作り、一秒ごとに102バイトの半角スペースを送信する事にした。

最初は毎回1バイトの半角スペースを送信していたのだが、3DSブラウザが容量オーバーで落ちたのでリミッターを付けた。102は1024の1/10。

これでタイムアウトはしなくなったのだが、今度はリダイレクトが出来ない。
投稿が完了したらリダイレクトをさせるのだが、既にレスポンスボディを送信しているのでヘッダを送信出来ない。

そこで懐かしのmeta refreshを使いブラウザを再読み込みさせる事に成功。

試行錯誤したのは楽しかった。


投稿日時:2012/11/28(水)6:59 0件コメント

ブラウザのステータスバーに表示されるリンク先をカスタマイズ

IE6まではwindow.statusでIEに限ってステータスバーに任意の文字を表示する事が出来た。それは色々問題になってIE7から出来なくなった記憶があるけど、今確かめたら普通に出来るようになってた。

IEでもfireFoxでもchromeでも出来る。方法は簡単

見ればひと目で分かる。window.statusの事もあったし、出来ないようになってるんだろうなと思ったら普通に出来てびっくり。
chromeはhttp://が自動的に省略されるから、日本語も表示可能。いいのかなあ


投稿日時:2012/11/24(土)23:24 0件コメント

SI Captchaで表示される文字を入力すべき文字を分離する。

SI Captchaで表示される文字を入力すべき文字を分離する。

どうやら現在の文字認識技術は予想以上のようです。前回の記事で複雑化させたSI Captchaですが、普通に突破してきます。
そこで今度は表示される文字と入力すべき文字を分離する事にしました。例えば、1+1を表示させて2を入力させる…様に。
今回の改造箇所はこちら

これだけで処理部分はOKですが、何の説明も無しだと正規のコメントも入力出来ません。そこで出力されるhtmlに説明文を書き加えます。

これでよし。si-captcha.phpの書き換える場所はお好みで。


投稿日時:2012/11/24(土)0:17 0件コメント

ログイン無しで使えるtwitterのAPIは2013年3月5日以降どうなるの?

Twitter API 1.1リリース 開発者の対応リミットは2013年3月5日に - ITmedia ニュース
twitter API 1.0が廃止されるのは数ヶ月前から言われていて、1.0では認証なしで取得できたAPIの認証が必須となる事も既知のはず。Twitter API 1.1で影響を受けるAPI
認証が必須になるという事は、ログインが必須になり、ソースコードに書かれるconsumer_keyとconsumer_secretを隠すことが必須になる。
通常のアプリケーションならexeの中に、webアプリケーションでもサーバーサイドに隠す事が出来るが全てがクライアント側で実行されjsファイルに全てのソースが書かれているブラウザ拡張等のアプリケーションはそれが不可能。

代表的なAPIで言うと、検索API(search/tweets)とステータス個別取得API(statuses/show/:id)が認証必須になると思って調べ直したのですが1.1ではAuthenticationがRequires user contextと書かれています。
そこには
Application authentication
This form of authentication is not yet supported. Stay tuned.

アプリケーション認証。これはまだサポートされてないよ、お楽しみに!って感じだから、上記のconsumer_keyとconsumer_secretを隠せない問題が解決されるといいな。って言うかお楽しみにじゃなくて1.0廃止のカウントダウンを始めた時に公開しとけよ。
とりあえずhttps://dev.twitter.com/docs/auth/oauthをチェックしときますか。

OAuth 2.0ではまた変わるらしいのですが、まだ難しい。しかも複雑化するみたいだしキリがねーなー
Re: OAuth 2.0のclient_secretって本当に秘密鍵ですか? - OAuth.jp
デジタル・アイデンティティ技術最新動向(2):RFCとなった「OAuth 2.0」――その要点は? (1/2) - @IT


投稿日時:2012/11/23(金)23:41 1件のコメント

SyntaxHighlighterでコピペしたコードが動かない

みんな大好きSyntaxHighlighter。バージョン2とバージョン3がありますが今回はバージョン3のお話。
そもそも、このSyntaxHighlighterにコピペ専用のモードがある事をご存知ですか。そのままマウスでドラッグしてコピペすると、行数も一緒にコピペされてしまいます。
バージョン2であればツールバーのソースを表示ボタンが使えますがバージョン3ではそれが無い。

実はバージョン3では、コードをダブルクリックするとコピペモードになる。しかも自動で選択されている状態だから、後はCtrl+Cを押すだけ。
バージョン2より便利だと思うんだけど、そもそも知られてないんじゃないかなあこの機能。

で、問題はここからな訳でここでコピペしたコードは動かない。思いっきりエラーが出ます。
それは何故かと言うと、コードが勝手に改行されたり連続したスペースが一つになったりするのを防ぐために、コードの半角スペースが  ノーブレークスペースに置き換えられてるんだけど、それがそのままコピーされてる。
半角スペースとノーブレークスペースは別の文字だから、エラーが出る訳。
サンプルを貼ろうと思ったけどこのブログでは対策済みだから逆に無理。

ではその解決方法。
ダブルクリックした時、テキストエリアを作ってそれに置き換えています。その時にノーブレークスペースを半角スペースに置き換えれば良い。
というわけで以下の部分をカスタマイズ

一行でオッケー。ダブルクリックして使ってね!
ノーブレークスペースが全部半角スペースになるから、あえてノーブレークスペースを使おうって人は逆に出来ません。SyntaxHighlighterに渡す前の生タグでは区別されてるからどうにかなりそうだけど、そこまでやる気はない。

と言うかバージョン3が2の後方互換じゃないのが問題だ。折り返し、ツールバーはバージョン2のみだけど、上の画像の通り出来ない理由無いだろ。
そもそもバージョン3のgithubも2 years agoで全然更新されてないし、html5対応してるのかな。


投稿日時:2012/11/23(金)3:49 0件コメント

SI Captchaのイメージ改造

バージョンは2.7.5。

キャプチャの難易度を高いにしてもすり抜けるので色々いじくってみました。
いじくった場所はランダムに入る線の数と色。出来た結果はこんな感じ。

線の色の処理。デフォルトでは最初に色を決めてその色をn本描いているけど、一本一本違う色にする。
線の透明度がゼロで線の本数を増やすと本当に文字が読めなくなっていたけど、色に透明度を指定出来るようにして本数が増えても読めるようにする。
色をHSLにして輝度を調節する。カラフルな方がいいかなと。

drawLinesの下にdrawWordという面白そうな関数があるのが気になる。
これでも止まらなかったら日本語追加、答え合わせ部分に手を加えて1+1等の計算をさせる とか色々ネタがあります。


投稿日時:2012/11/21(水)18:41 0件コメント

とびだせどうぶつの森のスクリーンショットから調査するニンテンドー3DSの3D使用率

とびだせどうぶつの森のスクリーンショットにおける3D率を調査しました
このソフトではゲーム中ほぼ全ての場所でスクリーンショットを撮ることが出来、その時mpoが作成されるかjpgが作成されるかは本体の設定に依存します。
私が作ったpict3dsでスライドショー機能を作る際、3Dかどうかを調査する必要がありましたのでそのデータを纏めます。

調査対象のデータはpict3dsで2012年11月17日にtwitpicに投稿されたとびだせどうぶつの森のスクリーンショット。

2D写真:329枚
3D写真:91枚
合計投稿画像:420枚

3D率は21%となりました。
pict3dsは立体写真を投稿できる!が最大のウリなので低いのはちょっと残念です。

ユーザー数:189人
ユーザーあたりの平均投稿数:2.22枚
ユーザー数のカウントはTwitterアカウント基準。
ユーザーあたりの投稿数分布

約50%が1日1枚、25%が2枚、8%が3枚…最大21枚。
もうちょっと多いかなと思いましたが、パシャパシャ投稿する人は少ないようです。
一度に複数枚投稿できるのもウリですが、需要は薄いようです。

2D写真だけ投稿する人:133人
3D写真だけ投稿する人:49人
合計182人。ほとんどの人がどちらかに偏っています。

2D写真だけ投稿する人の平均枚数:2.3枚
3D写真だけ投稿する人の平均枚数:1.6枚
3D写真を上げている人はがっつりやりこみ一日に何枚も写真を投稿する人が多いかなと思ったのですが、それも違うようです。

まとめ

立体写真を投稿できるのがウリだったが3D率は約2割
一度に複数枚投稿出来るが過半数が1日1枚

pict3dsのウリが否定されてしまったのは残念ですが、立体写真は別に重要じゃない。一度に投稿できるのも一枚で十分。
その方向性で行くと独自性が失われるのもまたつらい所です。
ありがとうございました。


投稿日時:2012/11/18(日)3:18 0件コメント

(object)による配列のオブジェクト化も注意が必要

今度は配列に文字列のキーがあるからオブジェクト化してくれるに違いない!だからtrue!

外れです。falseなんです。

$bと$cをvar_dumpした結果はこちら

zeroのキーが違う!と言うかキーの型が違う!キーの型なんて意識したことねーよォ
例によってjson_decodeのリファレンスを参考に$bのプロパティ0は$b->{'0'}でアクセス出来るのですが、$cのプロパティ0へ直接アクセス出来ません。

全てエラーです。
直接出来ないなら間接的にやればいいじゃないって、つまりforeachで回すわけです。

それか、配列にキャストしてやれば間接的だけどforeachより直接的にアクセス出来ますね

って言うか二回もキャストして無駄だよね。

つまりこういう事だよね。

オブジェクトどこいった。そういう事です。

こっちでも不可能という結論に。いやまあforeachで回せば出来…るに入らない?
[PHP] オブジェクトでプロパティ名がInteger型のものにアクセスする方法 | gdgdな人がgdgdに書く、gdgdな皆様のためのブログ > Not Classified


投稿日時:2012/11/11(日)4:02 0件コメント

配列をjson_decodeしてもオブジェクトになるとは限らない

※ここで言うオブジェクトは$a->bでアクセス出来る値の事。

では問題です。以下のコードはどこでエラーが出るでしょうか。

答えは
$a->add="ok";
$b->add="ok";
の二箇所でした。もちろんokは代入されていません。

順番に見ていきます。
$a->add は$aオブジェクトにaddプロパティを追加します。ここでエラーが出るという事は、$aと$bがオブジェクトではないからです。 
しかし$aと$bはjson_decodeの結果ですし、戻り値が配列になる 第二引数は指定していません。しかし実際にエラーが起きているので、このjson_decodeはオブジェクト以外を返しているのです。

ではjson_decodeには何の値が渡されているか?
渡されている値はjson_encodeの結果です。その結果を直接見てみましょう。

json_encodeに渡す時は全て配列だったのですが、中身が無い キーが連続した数値 それ以外 の差があった為に、json_encodeで配列連想配列に区別されてしまったのです。
(配列と連想配列という名前が正しいか不明ですが、json_encodeの結果の記号が違う事が重要です) 
そもそも二番目の array("0"=>"val","1"=>"val-1")はphp上array("val","val-1")と等価です。===してもtrueです。

{"0":"val","2":"val-2"}の値がjson_decodeに渡された時はオブジェクトを返してくれるので、$c->addは問題なく実行されました。
しかし[]や["val","val-1"]がjson_decodeに渡された時は第二引数が指定されていようがいまいが、配列を返してしまうのです。

固定されていない配列をjson_encodeし、その後json_decodeしてオブジェクトを取得したつもりになっているコードはここでハマります。
PHP: json_decode - Manual json_decodeのマニュアルでも、この様に配列を例に取って第二引数が無いと配列になる。と示しているので勘違いしていました。

これを防ぐには、デフォルトで何か文字列のキーを入れておくこと。

配列で$a["b"] って書くより$a->bの方が書きやすいからオブジェクトを使おう!
二つの配列を合成するarray("a"=>"ok")+array("a"=>"no") がやりたいから配列を使おう!
と、データを保存する部分でオブジェクトと配列を何度も変換していたのでハマりました。 
何を今更と鼻で笑う人はともかく、一人でも同じ勘違いをしている人が救われるといいなとおもいます。


投稿日時:2012/11/11(日)3:31 0件コメント