ビルドツール capistrano メモ

capistrano

デプロイツールのメモ。

基本的なことはこのあたりから。

AWS上でのWebアプリケーションデプロイ
Capistranoを使ったデプロイ | アライドアーキテクツ エンジニアブログ

■ローカルのgit を使う

cohakim's blog » capistrano でローカルリポジトリからデプロイする

単純に :repository にローカルのディレクトリのパスを指定してやったらいいだけでした。

set :scm, :git
set :branch,      "develop"
set :repository,  "/Users/cohakim/Public/Dropbox/projects/Rails/FanArts"
set :deploy_via,  :copy
set :deploy_to,   "/var/www/app/fanarts/"

SSHのパスワード

capistrano - 知識の屋-CLLDCOOL

11 set :application, "project" # <- アプリ名。
12 set :user, "ccc" # deploy 先のアカウント名 (sudo 権限を与えておいてください)
13 set :password, "dummypass" # deploy 先のパスワード (sudo に使います)
14 set :use_sudo, true
15 set :ssh_options, :port=>22, :forward_agent=>false, :keys=>"C:/id_rsa", :passphrase => "HiMiTsu"

■SCMのログイン

リンギオ - Capistrano で リポジトリのパスワードを動的入力にする

set :scm, :subversion
set :scm_username, "foo"
set :scm_password, "bar"
set :repository, "https://example.com/svn/app/trunk/"

■deploy.rb の設定例

cat config/deploy.rb

set :application, "myapplication"

# デプロイ先はパスワードで SSH ログイン
set :user, "hoge"
set :password, "fuga"
set :ssh_options, :port=>22, :forward_agent=>false
set :use_sudo, false

# git はローカルのみでリモート共有リポジトリなし
#subverion, git, mercurial, cvs, bzrなど
set :scm, :git
#gitリポジトリ
set :repository,  "/Users/user/IdeaProjects/myapplication"
#gitブランチ名
set :branch, :master
# どういう方式でデプロイするか
# copy デプロイ元でソースを最新化してからデプロイ先にコピー
# checkout デプロイ先に接続した後、scmに応じたcheckoutコマンドを実行する
set :deploy_via, :copy
# deploy先ディレクトリ
set :deploy_to,    "/home/hoge/test"

role :web, "192.168.0.1"                          # Your HTTP server, Apache/etc
#role :app, "your app-server here"                          # This may be the same as your `Web` server
#role :db,  "your primary db-server here", :primary => true # This is where Rails migrations will run
#role :db,  "your slave db-server here"

task :list do
    run "ls"
end

Mac で Apache,PHP,MySQL

MacApache,PHP,MySQL

Mac でさっさとApache,PHP,MySQL を動作させたかったときのメモ。
ソースビルドまではしないけれど、オールインワンパッケージのインストールまで楽もしない。
中途半端に手動。

環境

mysql

dmg でインストール

MySQL :: Download MySQL Community Server

わたしはこれ(dmg,64bit)をおとす。環境にあわせてください。

Mac OS X 10.7 (x86, 64-bit), DMG Archive        5.6.17  157.0M  
(mysql-5.6.17-osx10.7-x86_64.dmg)   

システム環境設定 -> その他 -> MySQL

f:id:isann:20140330190825p:plain

から

Start MySQL Server をクリックして MySQL サーバを起動

f:id:isann:20140330190633p:plain

apache

→ プリインストール のもの

Mac:Apacheの開始と停止 - devlog [naru design]

history • Mac:Apacheの開始と停止 - devlog [naru design]

ドキュメントルートは

/Library/WebServer/Documents

php

→ プリインストール のもの

php を使えるようにする

vim /private/etc/apache2/httpd.conf

LoadModule php5_module libexec/apache2/libphp5.so

コメントアウトを外す

php.ini pdo の設定

cp /private/etc/php.ini.default /private/etc/php.ini
vim /private/etc/php.ini

mysql のソケットファイルのパス
mysql 起動してから find / -name mysql.sock とかで調べておく
ここだった /private/tmp/mysql.sock

1077 ;pdo_mysql.default_socket=/var/mysql/mysql.sock
1078 pdo_mysql.default_socket=/private/tmp/mysql.sock

sudo apachectl restart

phpinfo() とかでみてみる
PDO の mysql は Default で使えるようになっていたのでインストールはしてない
めんどくさいのかな・・・

IntelliJ IDEA で coffeescript をデバッグする設定メモ

IntelliJ IDEA で coffeescript をローカルデバッグするまでのメモ。

環境

  • OSX 10.8.3
  • nodebrew 0.6.2
  • node v0.10.4
  • CoffeeScript version 1.6.2 ← source maps を作成するには 1.6.1 以上が必須!
  • IntelliJ IDEA 12.1.1 ← node.js & coffeescript プラグイン導入済み、node.js & coffeescript PATH 設定済み

設定手順

まず、ざっくりと coffeescriptデバッグどうやるかというと、オリジナルの coffeescript から Source MapsJavaScript ファイルを作成、その JS ファイルRun/Debug Configurations で設定して実行する、といった感じ。
あ、もちろん、Breakpointcoffeescript の CodeEditor 内で設定しますです。
基本的には Debugging CoffeeScript を参照しながらやれば大丈夫だったのですがわりとハマったのでメモ。

File Watchers

まず、File Watchers の設定をしないといけねーです。
Transpiling CoffeeScript to JavaScript 参考です。
IntelliJ IDEA > Preferences > File Watchers (Command + A で File Watchers のがはやいかもね)で Project Settings の File Watchers をひらく。
以下よりただ実行したいだけのときは、CoffeeScript を選択、CoffeeScript Source Map を選択とある。

If you are going to run your CoffeeScript without debugging, choose CoffeeScript. Your code will be just translated to JavaScript.

If you are going to debug your code, choose CoffeeScript Source Map. As a result, the source maps will be created.

デバッグしたいので CoffeeScript Source Map かなっと思ったけどデバッグのときは両方とも選択します。

で、選択云々の前に CoffeeScript や CoffeeScript Source Map がそもそもないので下部の + ボタンから追加します。

CoffeeScript のほうは、コンパイラとして設定するので標準のよいです。

Name Description File type Scope Program Arguments Working directory Output paths
CoffeeScript Compiles .coffee files into .js files CoffeeScript Files Project Files /Users/user/.nodebrew/current/bin/coffee --compile $FileName$ $FileDir$ $FileNameWithoutExtension$.js

f:id:isann:20130522172047p:plain

CoffeeScript Source Map のほうがちょっとハマりまして、Source Maps を出力できる設定にしてやる必要があり、標準の coffeescript ではなかったのですよ…。
IDE 関係なく、CLI な感じでやるばあい(というかここおさえてから IDE やるべきだよな)はこちらから。Node.js+CoffeeScript でソースマップを使ってデバッグを楽にする方法 - てっく煮ブログ

Name Description File type Scope Program Arguments Working directory Output paths
CoffeeScript Source Map Uses Redux compiler to generate source map for .coffee file CoffeeScript Files Project Files /Users/user/.nodebrew/node/v0.10.4/lib/node_modules/coffee-script-redux/bin/coffee --source-map -i $FileName$ $FileDir$ $FileNameWithoutExtension$.js.map

f:id:isann:20130522172052p:plain

Environment variables はどちらも設定していませんので省略してます。オプションもデフォルトのままです。
ファイル変更するたびに tasks 動かないようにもできるはずですがわたしはうまくいってないので Immediate file synchronizastion もチェックしたままです。

Watchers の設定はこれでいけるはずです。

File Watchers で出力させる

適当に coffeescript のファイルを作成してコードを書いてみます。
自動でか、設定によっては Command + S の File > Save All のタイミングで tasks が実行されます。
結果、hoge.coffee の左側に▷みたいな三角ができます。
開くと hoge.js と hoge.js.map ができとりますです。
できてなかったらミスっとります。

f:id:isann:20130522172407p:plain

hoge.js.map の中身はのぞいてみとくといいかもです。
わたし、coffee-script-redux ではなく普通の coffee を指定していて中身が coffee> になっていました。これはダメですよ。

Run/Debug Configurations

ここまできたらもう少し。
Run/Debug Configurations から Node.js で設定作成。
ポイントになるのは Path to Node App JS File でオリジナルの coffeescript から生成された javascript を指定すること。
coffee とか source maps ではないことに注意です。
また、Run with CoffeeScript plugin をチェックいれないです。 ここまでやってOK。
あとは元の coffeescriptBreakpoint を設定してみて、今設定した設定名を選択、虫のボタン(デバッグボタン)をクリックするとデバッグできます。

f:id:isann:20130522172054p:plain

終わり。

そのうち、coffee-script-reduxcoffeescript 本体に統合されるんでしょうかね。

alias で 引数を動的に指定するためのやり方

bash で alias を使うことはよくあるのですが、alias に引数を渡したくなりまして、そんなときどうすればよいかを備忘録。
簡単に言うとログインシェルでコマンドのラップ関数を作ってしまって、この関数を alias で呼び出す、だけです。
ちなみ、Amazon EC2 を使ってボコボコインスタンスを stop/start したりするとそのたびにhost nameが変わる。
ssh config 書き換えるのも億劫だし楽したいなっておもったのが動機だったりします。

~/.bash_profile

function _sshserver() {

    ssh -i ~/.ssh/sharekey.pem ec2-user@$1

}

alias sshserver=’_sshserver’

こんな感じでシェル書いておく。

あとは CLI から sshserver hostname とすると ssh -i ~/.ssh/sharekey.pem ec2-user@hostname がじっこうされるようになる。
おわり。

参考URL

ループと非同期処理で変数の参照に気をつける

知ってる人には当たり前のことなどを。
ループ内で非同期処理をする際に、ループ内で有効な(i などのインデックスとか)変数を非同期処理のコールバックで参照しようとする期待したものと異なっていることがある。
こんなときの回避方法。

test.coffee

fs = require 'fs'

# ループで非同期処理をする失敗
for i in [0...100]
  fs.readFile './memo.txt', (err, data) ->
    console.log i, String(data), err

# 100 'test' null
# 100 'test' null
# 100 'test' null
# こんなのが出力される。i が 100 ではなく、連番になることを期待する場合、これはうまくない。

# ループで非同期処理をする正解
for i in [0...100]
  hoge = (i)->
    fs.readFile './memo.txt', (err, data) ->
      console.log i, String(data), err
  hoge i

# 0 'test' null
# 1 'test' null
# 2 'test' null
# 3 'test' null
# i がちゃんと連番になっている。連番を期待するのでこれで良い。

書いてしまえば当たり前なのだけれども、これを実装するためにループを回さずに再帰処理を書いたり、async の forEach 使おうとしたりいろいろまよった。

※下のループ内で関数をわざわざ定義する必要はないですね。ループ外で一度記述しておくほうがいいね。

参考URL

CoffeeScript の継承 extends を読んでみる

CoffeeScript の継承を読んでみる

CoffeeScript で次のように書くと

class Animal
  constructor: (@name) ->

  alive: ->
    false

class Parrot extends Animal
  constructor: ->
    super("Parrot")

  dead: ->
    not @alive()

次のようにコンパイルされる。(整形、コメントは入れてます)

(function () {
    var Animal, Parrot,
        __hasProp = {}.hasOwnProperty,
        __extends = function (child, parent) {
            for (var key in parent) {
                if (__hasProp.call(parent, key)) {
                    child[key] = parent[key];
                }
            }

            function ctor() {
                this.constructor = child;
            }

            // ctor の prototype に parent の prototype を代入。
            // オブジェクトの参照は同じ。
            ctor.prototype = parent.prototype;
            // サブクラスは ctor を継承。
            // ctor は prototype に parent の prototype を持つので
            // constructor は Animal だが、
            // new 演算子を使ったときに constructor を
            // child 自身(Parrot)に変更して、
            // これを child の prototype に代入。
            // ctor の prototype と parent の prototype の参照は同じだが、
            // new すると ctor の prototype のオブジェクトが
            // __proto__ にコピーされるような動きで同じ参照とはならず、
            // parent の constructor は変更されない。
            child.prototype = new ctor();
            child.__super__ = parent.prototype;
            return child;
        };

    Animal = (function () {

        function Animal(name) {
            this.name = name;
        }

        Animal.prototype.alive = function () {
            return false;
        };

        return Animal;

    })();

    Parrot = (function (_super) {

        __extends(Parrot, _super);

        function Parrot() {
            Parrot.__super__.constructor.call(this, "Parrot");
        }

        Parrot.prototype.dead = function () {
            return !this.alive();
        };

        return Parrot;

    })(Animal);

}).call(this);

このコードを理解するためのことをいくつか。

javascript の apply と call

このへんを参照。

javascript の constructor

このへん参照。
オブジェクトの初期化で使用されたコンストラクタ関数を参照する。

var a = new Array();
a.constructor == Array;//>trueになる

Array の constructor は?

function Array(){
    // Array の定義
}

↑と↓は、ほぼ同義です。(コンテキストが違うくらい?)

var Array = new Function("Array の定義");

こうすると Array の constructor は Function だとわかる。

※で、たぶんこれ↓もほぼおなじかな。function の宣言とはコンテキストが違うんだろうけれども。

var Array = function(){
    // Array の定義
};

※※ コンテキストが違うというのは、次のようになるということ。

hoge(); // 実行可能
function hoge(){};

fuga(); // 実行時エラー
var fuga = function fuga(){};

javascript の prototype

このへん参照。
関数が定義された時に自動的に生成される。初期値は constructor プロパティのみを持つオブジェクト。
prototype といえば、チェーンだったり継承という話にはなるんだけれども、そこは割愛しています。

javascript の prototype.constructor

このへん参照。
コンストラクタ関数自身を参照する。

で、ここでひとつ。次は実行するとエラーになります。

function Hoge(){
}
var hoge = new Hoge();
console.log(hoge.prototype.constructor == Hoge); // Error

これは、 prototype が関数が定義された時に自動的に生成されるものでり、変数 hoge は関数として定義されたものではないためだそうです。もう少しいうと、new 演算子を使ってオブジェクトを作成したタイミングで prototype は参照できなくなり、proto に prototype のオブジェクトはコピーされています。

これらより、つぎが理解できるはず。

hoge.constructor == Hoge.prototype.constructor; //>true

Hoge.constructor == Function.prototype.constructor; //>true

javascript の new 演算子

このへんを参照。
既存のオブジェクト (プロトタイプ) をベースに、新しいオブジェクトを生成するための演算子

javascript の 関数とメソッド

このへんを参照。 関数はオブジェクトであり、関数名は変数。

function Hoge(){
}

var Hoge = function(){}

var Hoge = new Function("");

が関数(/関数オブジェクト)。

メソッドは関数オブジェクトの参照が代入されているプロパティのこと。

var Hoge = function(){};
var hoge = new Hoge();
hoge.method = function(){console.log("execute method")}; // オブジェクトのプロパティに関数オブジェクトを代入。このプロパティがメソッド。
hoge.method(); // メソッドを実行。

javascript の this のスコープ

こことかここを参照。
ざっくりいうと、メソッドとして呼び出すとオブジェクト自身、関数として呼び出すとグローバルオブジェクトになる。例は次。

var obj = {
    func: function(){
        print(this);
    }
}
// 以下は等価
obj.func();
obj.func.call(obj);

↑これは、メソッドとして呼び出す場合。

var obj = {
    func: function(){
        var local = function(){
            print(this); // グローバルオブジェクトを参照することになる
        }
        local(); // ここで関数として実行することになり
    }
}
obj.func(); // まずはここでメソッドとして実行するが、、、

↑これは、関数として呼び出す場合。

あと、次の時、this はオブジェクト自身で、グローバルオブジェクトではないです。

function Hoge(){
    console.log(this);
    console.log(this.constructor);
}
var hoge = new Hoge();

コールバック関数のときは、関数として呼び出されるので、this はグローバルオブジェクトをさします。

function Hoge(){}
var hoge = new Hoge();
hoge.method = function(){
    console.log(this.constructor);
}
hoge.method(); // メソッドとして実行なので、this は hoge になる
setTimeout(hoge.method, 1); // 関数としてコールバックされるので、this は グローバルオブジェクトになる。

javascript の prototype の値

CoffeeScript で extends すると次のコードが出力されるが、このとき、parent.prototype を ctor.prototype に代入してそのあと ctor をnew したときに constructor の値を変更しているので、parent.prototype.constructor が変更されてるんじゃないかと思った。調べてみたけっかそんなことはなかったです。

function ctor() {
    this.constructor = child;
}
ctor.prototype = parent.prototype;
child.prototype = new ctor();

これはどういうことかというと、prototype の参照をもとにして new で新しいオブジェクトを作っているだけで、同じ参照が引き継がれているわけではないです。次のようになります。

function Hoge(){}
Hoge.prototype = {
    "a":"a",
    "b":"b"
}
var ttt = Hoge.prototype;
ttt.c = "c";
var hoge = new Hoge("xxx");
console.log(hoge.a); // a
console.log(hoge.b); // b
console.log(hoge.c); // c
console.log(hoge.prototype); // エラーになる
console.log(hoge.__proto__); // プロトタイプチェーンはこれを参照していくみたいですが、このプロパティが参照できることは保証されていないみたいです。

Ubuntu Server SetUp

Ubuntu Server SetUp

Ubuntu Server 12.10.VirtualBox 環境で。AWSだとビルドツールが apt-get できなかったので心折れました。

VirtualBox のおはなし

そんなに気をつけることはないんですが、host-only-network だけはちゃんと設定しておくこと。

VirtualBox そのものの 環境設定->ネットワーク->ホストオンリーネットワーク を追加。

仮想マシン側の設定で、設定->ネットワーク->アダプター1 NAT、アダプター2 ホストオンリーアダプター する。あとはデフォルトのままにしました。

これで VB 側はOK.

あとは、Ubuntu Server をインスコした後、コンソールに入って sudo vi /etc/network/interfaces で

auto eth1
iface eth1 inet dhcp

を末尾に追記。
参照元 ホストオンリーネットワークを試す。 - 谷本 心 in せろ部屋

UbuntuServer

本体のコンソールで文字化けしちゃう

Ubuntu日本語フォーラム / 日本語の文字化け Ubuntu server 11.04 64bit

vi ~/.bashrc
---------------------------------------

case $TERM in
  linux)LANG=C ;;
  *)LANG=ja_JP.utf8 ;;
esac
---------------------------------------
source ~/.bashrc

build ツール

Ubuntu日本語フォーラム / make installするタイプの導入方法を教えてください

sudo apt-get install build-essential

redis install

Redis Quick Start – Redis

wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make

./src/redis-server &

./src/redis-cli ping

てきとうに

mv ../redis-stable /usr/local/src
vim ~/.bashrc

PATH=$PATH:/usr/local/src/redis-stable/src
export PATH

とかしてパスを通しておく。