blogですかい

仕事、プライベートで学んだことなどを発信し、その内容がたとえ少数でも誰かの役に立ったらなら、それはとっても嬉しいなって

PaaSなWebサーバの日本語TLD対応状況

「.みんな」のドメインをいくつか取得したので、何か簡単なサービスをAzureのWebサイトで作ろうと思ったら、「.みんな」のドメインが設定できなかったので、他のPaaSはどうなのか調べてみた。

EngineYard

OK

Heroku

OK

Sqale

OK

Webサイト(Windows Azure)

NG

バリデーションがかかり、登録できない。

f:id:oh-sky:20140322181251p:plain

SSLを有効にして、専用のIPアドレスをバインドすれば、もしかしたらできるかもしれない。(それでもAzureのコントロールパネル上ではできないだろうけど)

canvasで編集した画像をAWS SDK for JavaScript in the Browserを使ってS3にアップロードする

アップロード用ユーザの作り方は「S3 IAM policy」で検索

バケットの設定は「S3 Bucket policy」で検索

単にローカルファイルをアップロードしたいだけなら

AWSの公式サンプルを参考にすれば簡単に実装できます。
http://aws.amazon.com/jp/developers/getting-started/browser/

canvasで作成した画像をS3にアップロードするには

ここから本題
S3へファイルをアップロードする際には、putObject()というメソッドを使用します。

putObject()に与えるハッシュのBodyというキーの値は、input[type=file]か、ファイルのバイナリ列を渡さなければなりません。

ところがcanvasから画像のバイナリ列を取り出す手段は(たぶん)無く、toDataURL()でBase64エンコードされた文字列を取り出し、バイナリにデコードする必要があります。

dataURLをバイナリに変換するライブラリをGithubで見つけましたので、それを使用しました。 https://github.com/rgeraldporter/canvas-polyfill-DataURLtoBlob/blob/master/dataURLtoBlob.js

以下のようなコードを書きました。(canvasの操作をする処理等は省略しております)

<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
    <script type="text/javascript" src="https://sdk.amazonaws.com/js/aws-sdk-2.0.0-rc1.min.js"></script>
    <script type=“text/javascript” src=“https://rawgithub.com/rgeraldporter/canvas-polyfill-DataURLtoBlob/master/dataURLtoBlob.js”></script>
</head>
<body>
<div>
    <canvas id="TheCanvas"></canvas>
    <button id="TheButton">upload</button>
</div>
<script type="text/javascript">
var bucketName = 'YourBucketName';
var regionName = 'ap-northeast-1';
AWS.config.update({
    accessKeyId: 'YourAccessKeyId',
    secretAccessKey: 'YourSecretAccessKey',
});
var bucket = new AWS.S3({
    params: {
        Bucket: bucketName,
        Region: regionName,
    },
});
$(function () {
    $('#TheButton').on('click', function () {
        var canvas = $(‘#TheCanvas’);
        var dataURL = canvas[0].toDataURL(‘image/jpeg’);
        var binaryData = dataURLtoBlob(dataURL);
        bucket.putObject(
            {
                'ACL': 'public-read',
                'Key': ‘YourUploadingObjectKey’,
                'ContentType': 'image/jpeg',
                'Body': binaryData,
            },
            function (error, data) {
                if (error === null) {
                } else {
                }
            }
        );
    });
});
</script>
</body>
</html>

注意

  • 性質上、アクセスキーを隠すことができないので、publicなアプリケーションには使用しないこと

気になること

  • putObject()のコールバック関数に渡されるdataにこれといって何も入っておらず、使い道がない

はてな認証API使ってみた

はてな認証APIとは

http://auth.hatena.ne.jp/

はてな認証APIははてなアカウントによる認証システムをサードパーティアプリケーションに搭載するための Web API です。はてな認証APIを使うと、サードパーティアプリケーションのアカウント管理をはてなに任せることができます。

使用例

アクセスしてきたユーザのはてブRSSを表示するPHPのアプリ

動作例

思ったこと

GPUとか使ってグルグル回したら、わりと簡単に秘密鍵を特定できそうな気がする。
まぁ、取得できる情報は少ないし、コールバック先は固定なので、悪用はできそうにないけども。

CakePHP2でModelのアソシエーションをまとめて外す方法

全て外したいだけなら

$this->Model->recursive = -1;

一旦全て外して、アソシエーションを設定し直したいなら

たくさんのアソシエーションが設定してある。 この場所では1個だけJOINすれば事足りるのだけれど、不要なものを全てunbindModel()するのが面倒。そんな時に

例えば、コントローラの中で

$this->Model->belongsTo = array();
$this->Model->hasMany = array();
$this->Model->hasOne = array();
$this->Model->hasAndBelongsToMany = array();

あるいは、AppModelクラスに次のようなメソッドを定義する

// app/Model/AppModel.php
class AppModel extends Model {
    public function unbindAllAssociation() {
        $this->belongsTo = array();
        $this->hasMany = array();
        $this->hasOne = array();
        $this->hasAndBelongsToMany = array();
    }
}

上の例は少々乱暴な気がしますので

// app/Model/AppModel.php
class AppModel extends Model {
    public function unbindAllAssociations($reset = true) {
        foreach ($this->_associations as $associationName) {
            foreach ($this->{$associationName} as $modelKey => $modelValue) {
                $modelName = is_numeric($modelKey) ? $modelValue : $modelKey;
                $this->unbindModel(array($associationName => array($modelName)), $reset);
            }
        }
    }
}

全てのアソシエーションを外してからModel::bindModel()で必要なモデルを結合すれば良い。

ここまでするなら別のModelを書いたほうが良い気もするけれど

CakePHP2でMySQLのレプリケーションスレーブからデータを取得する

CakePHP2で、特定のモデルでのSELECTでレプリケーションスレーブを参照する方法 Ap ...

  • app/Config/database.php にmasterとslaveの設定を書く
  • app/Model/AppModel.php のbeforeFind()に、参照先を変更する処理を書く
    -- $useReplica というプロパティを設定し、特定のModelのみでslaveを使用するように
    -- belongsToのモデル(JOINするテーブル)も、slaveを参照するように
  • slaveを参照したいModelでは $useReplica = true;

コミットしたら鳥海が抜錨するgit hookをつくった #艦これAdventCalendar 5日目

「好き」と伝えるAPIを実装したけど、特にログ取ってないので使われたかどうかわからない。

http://oh-sky.hatenablog.com/entry/2013/04/21/201719

よく考えたら、大人になって、社会人になって、エンジニアになって、
おじさんと話すことは多くなったが、女の子と話すことがない。
告白なんて夢のまた夢だと気づいた。

でも、やっぱり女の子に告白されると嬉しい。
とくに可愛い女の子に告白されたら嬉しい。

可愛い女の子といえば、高雄型重巡洋艦四番艦 鳥海だと思う。

鳥海に「私も嬉しいです」とか言われたい。僕も嬉しいです。
鳥海に「こっ、これも何かの任務なのですか!?」とか言われたい。とても重要な任務です。

なので、コミットしたら鳥海の台詞が流れるgit hookを作った。

$ git init
$ alias vim=emacs
$ vim .git/hooks/post-commit

--
#!/bin/bash
dir='/path/to/chokai/voices/dir/'
files=(`/bin/ls $dir`)
afplay $dir${files[($RANDOM % ${#files[@]})]} &
--

$ chmod +x .git/hooks/post-commit

コードを書いてコミットをする、たったそれだけで鳥海に 「私の計算通りだったわ。もちろん、司令官さんの作戦だから、できたのよ。」とか言われる。最高。重油漏れそう。

n番煎じ、ごめんなさい。

以上、艦これAdventCalendar 5日目でした。
5日目でした。
大事な事なので2度言いました。

ブラウン管テレビを処分する下調べ #大掃除AdventCalendar

大掃除AdventCalendarとは

こちら http://www.adventar.org/calendars/164
絶賛参加者募集

なぜテレビを処分するか

テレビはスマイルプリキュアが終わってから一切見ていない。
いい加減、無駄に受信料払い続けるの嫌なので、テレビ処分してNHKとの契約をやめます。

テレビの処分方法

リサイクル料金を払って、自治体で処分してもらう

埼玉県川口市では、自治体での回収は行っておらず、業者に持ち込むか運搬を依頼(有料)する必要があるらしい。
http://www.city.kawaguchi.lg.jp/kbn/28050024/28050024.html
リサイクル料に加えて運搬費用がかかるというのは大変にアレなので却下

無料で引き取ってくれる業者があるらしいが

http://www.highbridge-computer.jp/recycle/products/
送料だけで済むのは魅力的だが、2000年製以降という条件・・・。
うちのテレビ。1998年製なんだ・・・。

他にも、2000年製以降という条件でのみ取り扱う業者が多数。2000年の前後で何があったというのか。

ここで処分することに決めた

ここ http://pc-danboru.com/form_tv.html

処分費用と送料がかかるが、たぶん川口市公式の方法より安く収まると思う。 問い合わせをしたところ、処分費用は1,500円と言われた。(時期やモノによって違うらしいので、要確認)

テレビ処分残タスク

  • 処分費用振込
  • 梱包・発送
  • NHK解約