blogですかい

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

Jenkinsの移行作業(Debian)

移行用のプラグインもあるっぽいけれど、Jenkinsのホームディレクトリを丸々コピーでいけるようなので、似たような環境(jenkinsのユーザIDが変わらないような)であれば、丸々コピーが簡単です。

移行元にて

$ cd /var/lib/jenkins
$ sudo tar -zcf /tmp/jenkinsbackup.tar.gz .

もしワークスペースを除外したければ
tar -zcf /tmp/jenkinsbackup.tar.gz --exclude workspace .

ftpなりscpなりで、移行先にjenkinsbackup.tar.gzを移動する。

移行先にて

$ cd /var/lib/jenkins
$ sudo tar -xcpf ~/jenkinsbackup.tar.gz
$ sudo service jenkins restart

Ubuntu14.04LTS + Nginx + HHVMでWebアプリを動かす準備

少々出遅れた感アリですが、HHVM(というかHack)の勉強を始めようと思い、環境を作りました。
備忘録として、やったことをここに書き残します。

Ubuntu 14.04 LTSの環境は用意されている前提で

Nginxのインストール

$ sudo apt-get update
$ sudo apt-get install nginx

HHVMのインストール

標準のリポジトリには無いので、公式Wikiに従い追加します。

$ wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | sudo apt-key add -
$ echo deb http://dl.hhvm.com/ubuntu trusty main | sudo tee /etc/apt/sources.list.d/hhvm.list
$ sudo apt-get update
$ sudo apt-get install hhvm

NginxとHHVMを連携するための設定

/etc/nginx/hhvm.conf

デフォルトのままで良いです

location ~ \.(hh|php)$ {
    fastcgi_keep_conn on;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

/etc/nginx/sites-available/hello-hhvm.conf

新規に作成します(ファイル名、ドキュメントルートは任意で)

server {
        listen 80 default_server;

        root /var/www;
        index index.php;

        server_name localhost;

        include hhvm.conf;

}

設定を有効にするためにソフトリンクを作る(Debian系特有の儀式)

/etc/nginx/sites-enable/に、先ほど作成した設定ファイルへのリンクを作成します。 また、デフォルトの設定ファイルへのリンクを削除します。

$ sudo ln -s /etc/nginx/sites-available/hello-hhvm.conf /etc/nginx/sites-enabled/
$ sudo rm /etc/nginx/sites-enabled/default

NginxとHHVMデーモンの起動

$ sudo service nginx start
$ sudo service hhvm start

HHVMデーモンの自動起動設定

Debian系はupdate-rc.dコマンドを使用します。RedHat系だったらchkconfigですね。

$ sudo update-rc.d hhvm defaults

/var/www/index.php

HelloWorldアプリを作成します。

<?hh
echo 'Hello HHVM!';

これで、Webブラウザでhttp://サーバ名orIPアドレス/index.phpにアクセスしてみて「Hello HHVM!」と表示されれば成功です。

Amazon S3 でマルチドメイン名対応のWebサイトを作りたい人生だった

S3とは

AWSの提供するクラウドストレージで、ファイルの保管場所としても使えるし、静的コンテンツのWebサーバとしても使用できるというステキなサービス。

画像や動画などの静的コンテンツをS3から配信しているWebサービスは多い。HTMLも静的なものだけであれば、S3のみで運用が可能。

やりたかったこと

S3にバケットを作って、そのエンドポイントを*.example.comのCNAMEにセットする

以下略
と、任意のサブドメイン名でアクセスできるWebサイトを作りたかった。

でも、S3ではできなかった

S3では、Webホスティング独自ドメインを使用する場合、バケット名はFQDNと同一にしなければならない。
よって、ひとつのバケットで複数のドメイン名に対応することはできない。

  • aaa.example.com というバケット
  • bbb.example.com というバケット
  • ccc.example.com というバケット
  • 以下略
    と、大量のバケットを作り、それぞれのCNAMEレコードを設定し、それぞれのバケットの中身を管理しなければならない。 当然、そんなことはできないのでS3ですることは諦めた。

IaaSやVPSなら簡単にできる

春イベント戦績 その1(とケッコンカッコカリ)

E-1

参加者(レベル・索敵値は攻略完了時のもの)

艦名 レベル 索敵 主な役割
鳥海 98 55 旗艦・眼鏡
摩耶 76 50 対空・火力
北上 78 35 対潜・開幕
大井 66 31 対潜・開幕
木曾 55 36 対潜
金剛 76 51 火力
伊勢 77 48 対潜・火力
赤城 46 78 索敵値・航空
加賀 75 89 索敵値・航空
隼鷹 24 44 対潜・航空
五月雨 57 - 支援
雪風 49 - 支援

出撃回数 : 8
敵主力到達回数 : 6
撤退回数 : 2 (操作ミス1, 隼鷹大破)
使用バケツ数 : 7

E-2

参加者(レベル・索敵値は攻略完了時のもの)

艦名 レベル 索敵 主な役割
鳥海 100 61 旗艦・眼鏡
摩耶 77 51 対空・火力
北上 78 35 開幕・夜戦
大井 67 32 開幕・夜戦
木曾 55 36 火力
金剛 76 51 火力
伊勢 77 48 火力・航空
山城 59 48 火力・航空
赤城 48 78 索敵・開幕
加賀 75 89 索敵・開幕
隼鷹 25 44 支援
飛鷹 14 41 支援
五月雨 57 - 支援
雪風 49 - 支援

出撃回数 : 10
敵主力到達回数 : 6
撤退回数 : 2 (操作ミス, 赤城大破)
使用バケツ数 : 16

編成は 重/重/戦/航戦/雷/航 とすることが多かった。
雷巡や空母が旗艦をかばうことが無いよう、基本的に単縦陣。

操作ミスについて

なんか、以前のUIと比べて撤退ボタンが押しやすくなった気がする。
間違えて大破進軍するというミスは起こさなかったが、起こり得ると思うので、戦果やドロップ画面の操作には注意したい。

弾着観測について

弾着観測のカットインや連撃をするための必要条件としてまず制空権をとるか航空優勢にする必要がある。
しかし、まともに戦えるレベルの空母が加賀・赤城しかいないという現状・・・なんとかしたい。

千歳甲(39)や千代田甲(36)を航改にすべきなのは分かっているが、踏み切れないでいる。
ちなみに、水母は弾着観測のカットインや連撃が出来ないっぽい(要検証)

ケッコンカッコカリ

E-2攻略の途中で、ようやくケッコンカッコカリできた。

動画は、手続きの方法が分からず右往左往している様子。(ケッコンカッコカリ自体の映像はカット)

HowToKekkonKakkoKari from Yoshihiro Ohsuka on Vimeo.

AzureのWebサイトでIDN TLDは使えないっぽい

前回の続き

msdnのフォーラムで質問を投げたところ、REST APIを使用すれば登録できるという解答をいただいた。

REST APIを直接使う方法がわからなかったので(証明書周り)、コマンドラインツールを使用したところ、設定はできた。

しかし、設定したFQDNにWebアクセスしてみると404になる。

$ azure site list
info:    Executing command site list
+ Getting locations
+ Getting sites
data:    Name                         Slot  Status   Location    Mode      URL
data:    ---------------------------  ----  -------  ----------  --------  ------------------------------------------------------------------------------------------------------------
data:    hoge-nanimokamo-minna              Running  Japan East  Shared  hoge-nanimokamo-minna.azurewebsites.net,hoge.xn--u8j1cd6gb.xn--q9jyb4c
info:    site list command OK

$ curl -I http://hoge.xn--u8j1cd6gb.xn--q9jyb4c
HTTP/1.1 404 Site Not Found
Content-Length: 66773
Content-Type: text/html
Server: Microsoft-IIS/8.0
Date: Wed, 02 Apr 2014 11:20:25 GMT

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にこれといって何も入っておらず、使い道がない