犬ターネット

Archive : 2014年05月

速攻直してリリース

ちょっと前だったら簡単な修正でもゆっくり作業して、お客さんに「いやー大変でした、結構時間かかりましたよ、お金たくさんください」みたいなことしていた気がするんだけど、最近はメールもらった瞬間に全力作業して30分くらいで直してリリースみたいなことばっかりしている。

そんなことを続けたらお客さんから「仕事はやい」「安心できる」みたいな評価がついて、たまに結構大変な仕様変更がきてちょっと時間喰ったりしても「こんだけ時間かかるってことは大変なんだな...お金はらってやんないとな...」みたいになって、見積もり言い値でOKだったりする。

小さい嘘なんかつかないで正直に生きたほうがよい。


カチカチ山

まんが日本昔ばなし動画のカチカチ山 を娘と見てたんだけど、娘が「おばあさんなんでいなくなっちゃったの?」って聞くから、おばあさんは悪いタヌキに殺されちゃったんだよ、って言ったら「パパもママもしんじゃやだ~、ひとりになっちゃうのやだ~(泣)」って泣きだしたから、パパとママが死ぬわけないだろ、ママなんか鬼より強いんだから絶対死なないって、って言いながらギュっと抱きしめて頭なでなでしたら安心してそのまま寝た。


mod_rewrite を使ったアクセス拒否いろいろ

(いろいろっつうか、どんな環境変数使えるかってだけだな...)

基本形は以下。RewriteCond の条件に一致した場合に 403 Forbidden を返す。

# 基本系
RewriteEngine On
RewriteCond 条件
RewriteRule ^.*$ - [F,L]

# 条件1,2,3全部満たす場合にアクセス拒否 (AND条件)
RewriteEngine On
RewriteCond 条件1
RewriteCond 条件2
RewriteCond 条件3
RewriteRule ^.*$ - [F,L]

# 条件1,2,3いずれか満たす場合にアクセス拒否 (OR条件)
RewriteEngine On
RewriteCond 条件1 [OR]
RewriteCond 条件2 [OR]
RewriteCond 条件3
RewriteRule ^.*$ - [F,L]

IPアドレス関連

# 192.168.0.100 からのアクセスを拒否
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^192\.168\.0\.100$
RewriteRule ^.*$ - [F,L]

# 192.168.0.100 以外からのアクセスを拒否
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^192\.168\.0\.100$
RewriteRule ^.*$ - [F,L]

# 192.168.0.100, 192.168.0.101, 192.168.3.* からのアクセスを拒否
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^192\.168\.0\.100$ [OR]
RewriteCond %{REMOTE_ADDR} ^192\.168\.0\.101$ [OR]
RewriteCond %{REMOTE_ADDR} ^192\.168\.3\.
RewriteRule ^.*$ - [F,L]

ユーザエージェント関連

# ユーザエージェントに Test が含まれていたら拒否
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} Test
RewriteRule ^.*$ - [F,L]

# ユーザエージェントがからっぽだったら拒否
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule ^.*$ - [F,L]

リファラ関連

# リファラが http://example.com で始まってなかったら拒否
RewriteEngine On
RewriteCond %{HTTP_REFERER} !(^http\:\/\/example\.com)
RewriteRule ^.*$ - [F,L]

# リファラが空だったら拒否
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^$
RewriteRule ^.*$ - [F,L]

リクエストメソッド関連

# HEAD/GET/POST以外のリクエストメソッドは拒否
RewriteEngine On
RewriteCond %{REQUEST_METHOD} !(^(HEAD|GET|POST)$)
RewriteRule ^.*$ - [F,L]

認証関連

# Basic認証時、ユーザ名が「hoge」以外はアクセス拒否
RewriteEngine On
RewriteCond %{AUTH_TYPE} ^Basic$
RewriteCond %{REMOTE_USER} !(^hoge$)
RewriteRule ^.*$ - [F,L]

リクエストURI関連

# IPアドレスが 192.168.0.101 以外の場合、/login へのアクセスは拒否
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !(^192\.168\.0\.101$)
RewriteCond %{REQUEST_URI} ^\/login
RewriteRule ^.*$ - [F,L]

クエリストリング関連

# クエリストリングにNULバイト文字(\0, URLエンコードで%00 )が含まれていたらアクセス拒否
# 例えば http://example.com/?param=abc%00123 とか
RewriteEngine On
RewriteCond %{QUERY_STRING} %00
RewriteRule ^.*$ - [F,L]

その他

# ブラウザが gzip 圧縮対応してない場合はアクセス拒否
RewriteEngine On
RewriteCond %{HTTP:ACCEPT-ENCODING} !(gzip\,\s*deflate)
RewriteRule ^.*$ - [F,L]

詳しい仕様は以下を参照。

mod_rewrite - Apache HTTP Server


あいつの写真

昼散歩すると結構な確率で出会う猫、通称「あいつ」の写真をまとめた。


discotortion! ミミレミミ!

discotortion 観に行ってきた。

ツインドラムにツインギター(バリトンギター含)の音圧は半端じゃなく、振動で鼻の粘膜がムズムズしてクシャミが出た。

たまにこうやって音楽を体に浴びないと体調悪くなる。今日はまさに「浴びた」感じだった。はー楽しかった。

前売り予約でポスターもらえるはずだったんだけどもらえなかったな...まあいいか...

そういえば、対バンのミミレミミ(EEVEEでイービーって読むらしい)が最高だった。メタリックなリフに高速なキメにブラストビートに必ず入る長めのギターソロ。超おもしろかった。あんまり東京こないみたいだけど是非またみたい。

(2014.05.24 at fever, shindaita)


mod_rewriteを使って特定URIに対するアクセスを拒否する

instagrss の特定IDに対して、中東あたりのIPアドレスから1秒間に10~30回の過剰なアクセスが続いているから、.htaccessに以下を記述してアクセス拒否(403 forbidden)した。

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/特定ID$
RewriteRule ^(.*)$ - [F]

未だにアクセスは続いている。俺なんか悪いことしたっけ...


海苔ってやつだ

Convex Level の donotcl、楽曲の良さはもちろんだけど録音もろもろ担当しているツバメスタジオ君島さんの手腕も炸裂して超名盤になっている。

君島さんの録音やミックスって他の作品(gaji, Z, skillkillsなど)を聴いても空気感を超大事にしてる感じだし、じゃあ波形でみるとどんな感じになってんのかなと思い立って、perfumeの音源と見比べてみた。

上が Convex Level の human reciever(人体アンテナ)、下が perfume の だいじょばない。

前者は小さい音だとパっとしないけど、音量を上げてゆくといろんな音が聴こえてきて臨場感が増してきて味わいぶけー感じになる。

後者は音量上げても下げても聞こえる印象が変わらない。いわゆる海苔ってやつだ。

どっちがいいって話は一概には言えないけど、聴くたびに何かしら発見があるのは前者だと思う。そういう音楽が俺は好きだ。


OpenShift のログってローテイトされるけど消えないぽい? [追記]消えるぽい

OpenShift のログって $OPENSHIFT_LOG_DIR ディレクトリ内に吐かれるんだけど、さっき見に行ったら *.log-2013121112345678 みたいなログが大量に残っていた。

ドキュメントちゃんと読んでないからわかんないけど、このままほったらかしだとディスクスペース圧迫しそうだから、cron動かすときに

# 最終更新日から7日経ってたら削除
cd $OPENSHIFT_LOG_DIR
find ./ -name '*.log\-*' -mtime +7 -exec rm -f {} \;

みたいなシェルスクリプトも一緒に仕込んでおくのがいいのかもしれない。

----[追記]----

instagrssっていう instagram の RSS feed 返すサービス作ってるんだけど、そっちのログを見たら削除されてるから大丈夫そう。


hiromi, Convex Level

Hiromi Uehara - ALIVE

ほんとうにかっこいい。

hiromi - alive

Convex Level - donotcl

ほんとうにかっこいい。

convex level - donotcl

いい買い物した。


ReKognition API を使った顔検出

ReKognition API っていう顔認識webサービスがあったからちょっと触ってみた。

まずアカウント登録

ReKognition API を使うにはアカウント登録して API Key と API Secret を取得する必要がある。

つうことでまずは https://www.rekognition.com/user/create にアクセスして必要事項記入してアカウント登録。

登録後に届いたメール内の activate tour account をクリックしてアクティベート。

アクティベートが終わるとAPI_Key, API_Secret が発行されましたメールが届く。API回数も書いてあるけど、月5000回までって少ないな...(※追記: https://www.rekognition.com/user/price を見るとAPI超過分は課金されるっぽい?)

顔検出してみる

https://rekognition.com/developer/face#facedetectを見ると、仕様は以下みたいな感じ。

URL

http://rekognition.com/func/api/

レスポンスヘッダに Access-Control-Allow-Origin:* がついてるから、ajax使ってクロスドメインで動かせる。

method

POST (GETでもOKぽい)

params

  • api_key : 発行された API_Ky
  • api_secret : 発行されたAPI_Secret
  • urls または base64 : 画像URL または base64エンコードした画像文字列
  • jobs : face_aaa_bbb... のように取得したい情報をアンダースコアで連結させて渡す。以下が設定可能。
    • aggressive: 回転した顔を検出できるようにする。
    • part: 鼻、目、口角の位置を返す。
    • part_detail: さらに細かい情報を返す。
    • gender: 性別を返す。0に近いと男性、1に近いと女性。
    • emotion: 感情の状態を返す。
    • race: 人種を返す。
    • age: おおよその年齢を返す。
    • glass: メガネをつけてるかどうか。0に近いとメガネなし、1に近いとメガネあり。
    • mouth_open_wide: 口が開いているかどうか。0に近いと閉じてる、1に近いと開いてる
    • eye_closed: 目が閉じているかどうか。0に近いと閉じている、1に近いと開いている。

例えば「性別と年齢」が知りたい場合は jobs=face_gender_age とする。

試しにゲイリームーアの画像を jQuery.ajax 経由で顔検出してみる。

ソース。

結果。年齢は47歳、超笑ってる、性別は男女どっちつかず...と。

ちなみに ajax使うと OPTION リクエスト投げてから POST リクエスト投げる関係で、API を 2 個消費するっぽい。回数考えるなら、サーバサイドで処理したほうがいいかもしれない。


娘の誕生日

いつのまにか5歳になった。ほんとうにあっという間。

今年の誕生日は娘たっての希望で夢の国へ。

娘はシンデレラのドレスに身をつつみ、魔法がとけるまでの時間をたっぷりと堪能した。

俺はスキルキルスTシャツに身をつつみ、ストロベリーチョコレートチュロスとか食べた。


心臓日記III

ツバメスタジオ心臓日記III を買ってきた。

よしだは「もう満足した」みたいなスタンスだけど、10年超えのよしだ日記ファンとしては文章書くのはこれからも続けてほしい。


Twitter で利用可能な ID を調べるには

以下の HTTP リクエストを送る。

https://twitter.com/users/username_available?lang=en&username=調べたいtwittterID
例:https://twitter.com/users/username_available?lang=en&username=parishilton

利用可能な場合は

{"desc":"Available!", "msg":"Available!", "reason":"available", "valid":true}

利用できない場合は

{"desc":"That username has been taken. Please choose another.", "msg":"Username has already been taken", "reason":"taken", "valid":false}

の JSON レスポンスが返ってくるから、valid 値で判断できる。

ちなみに lang=ja にすると日本語のメッセージが返ってくる。空いてる ID をサジェストしてくれるパラメータもあるけど割愛。


input:range のスライダー変更検知イベントは oninput?

onchangeだと変更後のイベントしか取れない。リアルタイムに変更イベントを取るにはoninput。

jQueryだったら $("#range").on("input", function(){...}); で実装。

onchange : 0
oninput : 0

------------

ちがうな、ブラウザでばらつきがある。

browseronchangeoninput
Firefox○(リアルタイム)
Chrome○(リアルタイム)
IE10○(リアルタイム)×
iOS Safari○(リアルタイム)○(リアルタイム)

jQueryだったら $("#range").on("input change", function(){...}); ってしとけば問題ないかもしれない。

------------

...うーん、やっぱり保留...


Betaface API を使った顔検出処理について

Betaface API ( https://www.betafaceapi.com/wpa/ ) についての日本語情報があまり見つからないから少しまとめておく。

Betaface API とは

フリーの顔認識/検出webサービス。有償版もあるっぽい。

画像をアップロードすると、顔座標や顔情報(性別、年齢など)を検出するだけでなくモーフィングなどの変換処理も行える。

データのやり取りは HTTP + XML で行われる。最近 JSON 版も公開されたけど動かないものが多いので XML を使ったほうが無難。

例えば、以下の画像から

顔部分だけを切り出したり、

モーフィングしたり、笑わせたり(?)といったことが可能。

公式ドキュメントなど

ツイッターもフォローしとくと吉。

APIキー、利用制限など

フリー版のAPIキーは以下。

api_key: d45fd466-51e2-4701-8da8-04351c872236
api_secret: 171e8465-f548-401d-b63b-caf0dc28df5f

新規画像アップロードは 500枚/1日、15,000枚/1ヵ月。顔検出リクエストについては制限なし。

参考 : https://twitter.com/betaface/status/431178439110819840

処理の流れ

  1. 画像をアップロードする ( UploadNewImage_File, UploadNewImage_Url )
  2. アップロードした画像の顔情報を得る ( GetImageInfo )
  3. 顔画像の変換処理をする (Transform_Faces )
  4. 変換した顔画像を取得する ( GetTransformResult )

メソッド

とりあえずよく使いそうなものだけ。

UploadNewImage_File

画像ファイルをアップロードして img_uid を取得する。画像ファイルは base64 encode した文字列で指定する。

  • url : http://betafaceapi.com/service.svc/UploadNewImage_File
  • method : POST
  • params
    • api_key
    • api_secret
    • detection_flags : 顔検出方法を定義するフラグ。以下が指定可能。
      • (未指定) : "propoints,classifiers" フラグが設定される。
      • bestface : もっとも顔スコアが高い(?)顔情報をひとつだけ返す。
      • propoints : 「右目中央」「左目の端」みたいな細かい座標情報を検出する。変換処理を行うにはこのフラグが必須。
      • classifiers : 性別、年齢、髭の有り無し、といった拡張情報を検出する。
      • extended : その他拡張情報を検出する。処理時間が増加。
    • imagefile_data : 画像ファイルの base64 文字列
    • original_filename : ファイル名
  • requestサンプル

    <?xml version="1.0" encoding="utf-8"?>
    <ImageRequestBinary>
      <api_key>d45fd466-51e2-4701-8da8-04351c872236</api_key>
      <api_secret>171e8465-f548-401d-b63b-caf0dc28df5f</api_secret>
      <detection_flags></detection_flags>
      <imagefile_data>/9j/4gIcSUNDX1...</imagefile_data>
      <original_filename>test.jpg</original_filename>
    </ImageRequestBinary>
  • Responseサンプル

    <BetafaceImageResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <int_response>0</int_response>
      <string_response>ok</string_response>
      <img_uid>22755636-7d67-458b-adbd-fafa7b90ae15</img_uid>
    </BetafaceImageResponse>

UploadNewImage_Url

画像ファイルをアップロードして img_uid を取得する。画像ファイルは url で指定する。

  • url : http://betafaceapi.com/service.svc/UploadNewImage_Url
  • method : POST
  • params
    • api_key
    • api_secret
    • detection_flags : UploadNewImage_File の params の項を参照。
    • image_url : 画像url
  • requestサンプル
    <?xml version="1.0" encoding="utf-8"?>
    <ImageRequestUrl>
      <api_key>d45fd466-51e2-4701-8da8-04351c872236</api_key>
      <api_secret>171e8465-f548-401d-b63b-caf0dc28df5f</api_secret>
      <detection_flags></detection_flags>
      <image_url>http://upload.wikimedia.org/wikipedia/commons/2/2f/Early_White_Stripes.jpg</image_url>
    </ImageRequestUrl>
  • responseサンプル
    <BetafaceImageResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <int_response>0</int_response>
      <string_response>ok</string_response>
      <img_uid>89760281-b14a-424f-bb1f-e167f290cb89</img_uid>
    </BetafaceImageResponse>

GetImageInfo

img_uid に紐づく画像情報を得る。個々の顔情報は <FaceInfo>~</FaceInfo> に含まれる。

  • url : http://betafaceapi.com/service.svc/GetImageInfo
  • method : post
  • params
    • api_key
    • api_secret
    • img_uid : UploadNewImage_File, UploadNewImage_Url で取得した img_uid を設定する。
  • requestサンプル
    <?xml version="1.0" encoding="utf-8"?>
    <ImageInfoRequestUid>
      <api_key>d45fd466-51e2-4701-8da8-04351c872236</api_key>
      <api_secret>171e8465-f548-401d-b63b-caf0dc28df5f</api_secret>
      <img_uid>89760281-b14a-424f-bb1f-e167f290cb89</img_uid>
    </ImageInfoRequestUid>
  • responseサンプル
    <BetafaceImageInfoResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <int_response>0</int_response>
      <string_response>ok</string_response>
      <checksum>91513f414a2ee5ce5aee64bb11e606ee2ec344302f4569dde6b514a8e36f8f81</checksum>
      <faces>
          <FaceInfo>
              <angle>-3.6756</angle>
              <height>86.83</height>
              <image_uid>89760281-b14a-424f-bb1f-e167f290cb89</image_uid>
              <points>
                  <PointInfo>
                      <name>basic eye left</name>
                      <type>512</type>
                      <x>149.44</x>
                      <y>208.19</y>
                  </PointInfo>
                  <!-- 略 -->
              </points>
              <score>6.14</score>
              <tags>
                  <TagInfo>
                      <confidence>-0.3</confidence>
                      <name>age</name>
                      <value>29</value>
                  </TagInfo>
                  <!-- 略 -->
              </tags>
              <uid>a5bf1ba6-db01-11e3-a3fc-80ee734cfa77</uid>
              <user_points i:nil="true"/>
              <width>86.83</width>
              <x>166.22</x>
              <y>217.97</y>
          </FaceInfo>
          <FaceInfo>
              <!-- 略 -->
          </FaceInfo>
      </faces>
      <uid>89760281-b14a-424f-bb1f-e167f290cb89</uid>
    </BetafaceImageInfoResponse>

GetFaceImage

uidに紐づいた顔情報を返す。<face_image>~</face_image>には顔画像の base64 encode 文字列が設定される。

  • url : http://betafaceapi.com/service.svc/GetFaceImage
  • method : post
  • params
    • api_key
    • api_secret
    • face_uid : GetImageInfoで検出した顔情報のuid
  • requestサンプル
    <?xml version="1.0" encoding="utf-8"?>
    <FaceRequestId>
      <api_key>d45fd466-51e2-4701-8da8-04351c872236</api_key>
      <api_secret>171e8465-f548-401d-b63b-caf0dc28df5f</api_secret>
      <face_uid>a5a956df-db01-11e3-a3fc-80ee734cfa77</face_uid>
    </FaceRequestId>
  • responseサンプル
    <BetafaceFaceImageResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <int_response>0</int_response>
      <string_response>ok</string_response>
      <face_image>/9j/4AAQSkZJRgABAQAA....</face_image>
      <face_info>
          <angle>0</angle>
          <height>139</height>
          <image_uid>89760281-b14a-424f-bb1f-e167f290cb89</image_uid>
          <points>
              <PointInfo>
                  <name>basic eye left</name>
                  <type>512</type>
                  <x>71.41</x>
                  <y>132.22</y>
              </PointInfo>
              <!-- 略 -->
          </points>
          <score>5.49</score>
          <tags>
              <TagInfo>
                  <confidence>0.41</confidence>
                  <name>age</name>
                  <value>44</value>
              </TagInfo>
              <!-- 略 -->
          </tags>
          <uid>a5a956df-db01-11e3-a3fc-80ee734cfa77</uid>
          <user_points i:nil="true"/>
          <width>139</width>
          <x>99.21</x>
          <y>146.12</y>
      </face_info>
      <uid>a5a956df-db01-11e3-a3fc-80ee734cfa77</uid>
    </BetafaceFaceImageResponse>

Transform_Faces

GetImageInfo で検出した顔情報の uid を使って画像変換処理を行い transform_uid を得る。

※公式ドキュメント上は deprecated になってるけどちゃんと動く。

  • url : http://betafaceapi.com/service.svc/Transform_Faces
  • method : post
  • params
    • api_key
    • api_secret
    • action : 変換処理を指定する。以下が指定可能。
      • average : 複数の uid の顔画像を平均化してモーフィングする。
      • expression_smile : faces に指定した uid の顔画像を笑わせる。
      • expression_wow : faces に指定した uid の顔画像をびっくりさせる
      • expression_excited : faces に指定した uid の顔画像を興奮させる。
      • expression_love : faces に指定した uid の顔画像をLOVEする。
    • faces : 顔情報uidの配列。action が expression_* の場合は uid はひとつだけ指定。複数指定時はどれが変換されるかは不明。
    • parameters : action が expression_* のときに使用。rangeは -1.5 ~ 1.5 まで? -3.0 ~ 3.0 まで。
  • action = average 指定時の request と response サンプル

    • request
      <?xml version="1.0" encoding="utf-8"?>
      <TransformRequest>
      <api_key>d45fd466-51e2-4701-8da8-04351c872236</api_key>
      <api_secret>171e8465-f548-401d-b63b-caf0dc28df5f</api_secret>
      <action>average</action>
      <faces>
        <guid xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
            a5bf1ba6-db01-11e3-a3fc-80ee734cfa77
        </guid>
        <guid xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
            a5a956df-db01-11e3-a3fc-80ee734cfa77
        </guid>
      </faces>
      <parameters>1.5</parameters>
      </TransformRequest>
    • response
      <BetafaceTransformRequestResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <int_response>0</int_response>
      <string_response>ok</string_response>
      <transform_uid>22e1d4d2-db04-11e3-a3fc-80ee734cfa77</transform_uid>
      </BetafaceTransformRequestResponse>
  • action = expression_smile 指定時の request と response サンプル

    • request
      <?xml version="1.0" encoding="utf-8"?>
      <TransformRequest>
      <api_key>d45fd466-51e2-4701-8da8-04351c872236</api_key>
      <api_secret>171e8465-f548-401d-b63b-caf0dc28df5f</api_secret>
      <action>expression_smile</action>
      <faces>
        <guid xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
            a5bf1ba6-db01-11e3-a3fc-80ee734cfa77
      </guid>
      </faces>
      <parameters>1.5</parameters>
      </TransformRequest>
    • response
      <BetafaceTransformRequestResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <int_response>0</int_response>
      <string_response>ok</string_response>
      <transform_uid>08ff342d-db05-11e3-a3fc-80ee734cfa77</transform_uid>
      </BetafaceTransformRequestResponse>

GetTransformResult

Transform_Faces で得た transform_uid を渡して変換後の画像を取得する。画像は base64 encode 文字列で返される。

  • url : http://betafaceapi.com/service.svc/GetTransformResult
  • method : POST
  • params
    • api_key
    • api_secret
    • transform_uid : Transform_Faces で得た transform_uid
  • requestサンプル
    <?xml version="1.0" encoding="utf-8"?>
    <TransformResultRequest>
      <api_key>d45fd466-51e2-4701-8da8-04351c872236</api_key>
      <api_secret>171e8465-f548-401d-b63b-caf0dc28df5f</api_secret>
      <transform_uid>22e1d4d2-db04-11e3-a3fc-80ee734cfa77</transform_uid>
    </TransformResultRequest>
  • responseサンプル
    <BetafaceTransformResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <int_response>0</int_response>
      <string_response>ok</string_response>
      <result_image>/9j/4AAQSkZJRgABA...</result_image>
      <transform_uid>22e1d4d2-db04-11e3-a3fc-80ee734cfa77</transform_uid>
    </BetafaceTransformResponse>

その他

処理正常終了時/異常終了時の判定

正常に処理が終了した場合、XML レスポンス内の int_response に「0」が設定される。処理中やエラーの場合は int_response に「0」以外が設定される。エラーメッセージは string_response に何かしら設定される。

処理が即時完了することはまずないから、プログラム側で適当にwaitかけてリクエストを投げてあげる必要がある。

バグっぽいやつ

TransformFaces 処理で expression_* すると、たまに全然違う画像が返ってきたりする。

以下は expresson_excited 指定したら何故か男性の顔が返ってきたケース。誰だよあんた...

パラメータ少しいじってもう一度リクエスト投げると正しい画像が返ってくるかもしれない。


favstar.fm の一覧を JSON で返す API

favstar.fm をスクレイピングしてJSONで返すやつ作った。

Favstar JSON response API

そういや何件ファボられてるかが実装されてないな...[追記]実装した


たのしい音楽

「アナと雪の女王 コード」で検索してヒットしたサイトを見ながらギターをジャンジャカ弾いてたら娘がやってきて二人で歌った。すげー楽しかった。

俺は小さい頃ピアノ教室に通わされて、当時ピアノは女のする習いごとだ!みたいな風潮だったから「やーい男女(おとこおんな)~」なんてからかわれてすげー嫌だったし全然楽しくなかった。

音楽に限らず、何かをするときは楽しみをみつけないとダメだよな。娘にはとにかく「楽しむこと」を沢山教えていきたい。


法事

法事のため日帰りで帰省。

「私たちが生きてる間で多分最後の法事かな、あとは頼んだよ」と両親に言われた。

色々めんどくせえなあって思ったけど、あとは任せろって言ってきた。

写真は実家の裏庭にある秘密基地。30年間ずっと裏庭を見守っている。だんだん味わいぶけー感じになってきた。


サイト名を決めかねている

以下候補

  • 童貞日記
  • ふれ愛ひろば
  • トミーの部屋
  • 犬ターネット
  • ビーサンでマラソンに挑戦

Markdwon と emmet を絡めたのを作った

MarkdownはHTMLも書けるからemmetと絡めると便利だよなと思って作った。

Markdown + emmet

ちょっとしたHTML書いたりするのに重宝する。


誤爆

Tumblr のブラウザ拡張で Tombfix っていうの使ってるんだけど、エロサイト見てる時に誤操作してエロサイトのURLをタンブラーにPOSTしていたのに気がついて、もう俺はダメだと思った。

そうだよ、女子大生素人もの見てたんだよ、悪いか


ansicon で コマンドプロンプトの出力に色づけする

Windows7(64bit)で試した。

  • http://adoxa.altervista.org/ansicon/ から ANSICON v.1.66 をダウンロードして解凍する
  • 解凍したディレクトリを任意の場所に配置する(ここでは C:\tool\ansi166 に置いた)
  • コマンドプロンプトで C:\tool\ansi166\x64 に移動して ansicon -i を実行してインストール。アンインストールは ansicon -u

PHPUnitで試すとこんな感じで色づけされる。やっぱり色あるといいな。


パンケーキ焼いた

おおさじスプーン一杯くらいの量で何枚も焼くのが好きだ。ラップにつつんで冷凍保存しておけば朝食やおやつにもできる。

今日は知り合いからもらったオレンジ&生姜のマーマレードをつけて食べた。超うまかった。


LOSTAGE x uri gagarn

レコード再生する機械もってないから聴けない。以前買った CriptCity もまだ聴けてないから、そろそろレコードプレーヤー買わないといけない。


ぴょんぴょん舎の冷麺

休日はどこにもでかけないで家でゴロゴロしてるのが好きなんだけど娘がちょっと不憫だから銀座のぴょんぴょん舎に行って冷麺を食べてきた。大変おいしかった。