DisplayLinkの暴走

CPU異様に食ってるからなにかおかしい. CPUバカ食いするChromeも閉じたし,再起動してみても直らない.

ActivityMonitorでCPU使用率を見てみるとReportCrashというのが, ポールポジションフロントローを独占している.

f:id:ringo6119:20131212220105p:plain

さらにConsoleでログを見てみると,

f:id:ringo6119:20131212220108p:plain

DisplayLinkが悪さをしてるようだ. これは,USB接続のちっちゃいディスプレイを使うためのドライバ. 使ってたので,インストールしたんだけども,今は使ってない.

対応

とりあえず,/Library/LaunchDaemons にある com.displaylink.displaylinkmanager.plistを消した(デスクトップにとりあえずおいておいた). そして,Consoleでログを確認すると,減って入るがReportCrashが残っている.

仕方ないのでDisplayLinkのドライバをアンインストールした. 再起動したら出なくなった. http://www.displaylink.com/support/mac_downloads.php

公式には対応してるって書いてあるのになぁ.

gitでcommitのメールアドレスを変更する

コミットログのメールアドレスを書き換えようと思って,git filter-branch --commit-filterしたらターミナルが落ちた.

環境は以下のとおり.

  • OSX 10.7.5
  • git version 1.8.3.4
  • iTerm2 Build 1.0.0.20131124
  • zsh 5.0.2 (x86_64-apple-darwin11.4.2)

発生事象

コミットログのメールアドレスを書き変えようとおもって, 以下のコマンドを実行しようとしたが,GIT_AUTHOR_EMAIL="bar@example.com";まで入力したところで, ターミナルが落ちてしまう.何度やっても.

$ git filter-branch --commit-filter '
        if [ "$GIT_AUTHOR_EMAIL" = "foo@example.com" ];
        then
                GIT_AUTHOR_EMAIL="bar@example.com";

対策

使ってるシェルのせいかなーと思って,bashで試したら,何事も無く走った. bashで実行しましよう. あと,一応メールアドレスを書き換えるgitサブコマンドを書いたのでよろしかったらどうぞ.

こういうのって,gistでいいのかな?リポジトリ作ったほうがいいのかな?誰か教えてください.

git-chmail

コミットのメールアドレスを一括変更するgitサブコマンドです.

インストール方法

パスの通ってる場所にDLして,実行権限を与えます.

curl -L 'https://gist.github.com/ringohub/7867738/raw/5f671e7f4b7b05bca7d232346077549152e314ad/git-chmail' -o git-chmail
chmod 755 git-chmail

使い方

old@example.comのメールアドレスをnew@example.comに変更する例です.

git chmail 'old@example.com’ ’new@example.com'

参考

Chefのrecipeを書いてみる その5 -変数をAttribute化してみる編-

前回書いた,Chefのrecipeを書いてみる その4 -インストール済みの場合は実行しないようにしてみる編-に引き続きchefのrecipeを順を追って書いていきます.今日は,バージョンやインストールするディレクトリをnodeファイルから指定できるようにしてみようと思います.

変数をAttribute化

現在,varsioninstall_dirはrecipeに直接書いていますが, 毎回バージョンを指定するたび,recipeを書き換えるのはcoolじゃあありません. Chefにはattributeというモノがあり,nodeファイルにattributeを書くことで,recipeにその内容が反映される仕組みになっています. 例とともにattributeをつかってみます.

まずはdefalt値から

cookbooks/flyway-cliの下にattributesというディレクトリがあります. ここにdefalt.rbを作成し,記述するとdefaultの引数を与えることができます.

flyway-cli/attributes/default.rb

default['flyway-cli'][:version] = "2.2.1"
default['flyway-cli'][:install_dir] = "/opt/flyway"

ここで,:cookbook_nameを使うとCookBook名を取得でます.

flyway-cli/recipes/default.rb

recipeの方はただ置き換えるだけです(-は削除したところ,+は追加したところ).

-install_dir = "/opt/flyway"
-version = "2.2.1"
+install_dir = node['flyway-cli']['install_dir']
+version = node['flyway-cli']['version']

flyway-cli/recipes/mysql-connector.rb

こっちは変数も使ってなかったので,追加します.

install_dir ="#{node['flyway-cli']['install_dir']}/flyway/jars"
execute "mysql-connector" do
  command <<-EOH
     wget http://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-5.1.26.tar.gz -P /tmp
     tar xzfC /tmp/mysql-connector-java-5.1.26.tar.gz #{install_dir}
     ln -nfs #{install_dir}/mysql-connector-java-5.1.26/mysql-connector-java-5.1.26-bin.jar #{install_dir}/mysql-connector-java-5.1.26-bin.jar
  EOH
  not_if { File.exists?("#{install_dir}/mysql-connector-java-5.1.26") }
end

chef-repo/loaclhost.json

nodeファイルにattributeを追加すると,defaultの値が上書きされて,指定した場所,バーションでインストールできるようになります.

{
  "flyway-cli": {
    "version": "2.2",
    "install_dir": "/tmp/test-flyway"
  },

  "run_list" : [
    "recipe[flyway-cli]",
    "recipe[flyway-cli::mysql-connector]"
  ]
}

まとめ

これで,nodeファイルからバージョンやインストール先を指定できるようになりました.

今回使ったソースはこちらにおいておきます.

その1からその5で,chefの基本的なrecipeの書き方は終わりです. 気が向いたらMac用のrecipeや,その書き方も紹介しようかと思います.

Chefのrecipeを書いてみる一覧

参考文献

Chefのrecipeを書いてみる その4 -インストール済みの場合は実行しないようにしてみる編-

前回書いた,Chefのrecipeを書いてみる その3 -recipeを分割してみる編-に引き続きchefのrecipeを順を追って書いていきます.今日は,すでにソフトウェアがインストールされていたら,実行しないようにガードをつけてみようと思います.

実行する前にインストールチェックをする

すでにインストールされていた場合は実行しないようにガードを付けます. 基本的には,only_ifnot_ifを使う事によって達成します. 今回の判定条件は,#{install_dir}/versions/flyway-#{version}が存在した場合インストール済みとみなすことにします.

not_if文を追加する(default.rb)

not_ifなので,評価結果がの時に実行されるように記述します. 次のようなコードを書くと,Fileやディレクトリの存在の有無を判定できます. not_if { File.exists?("#{install_dir}/versions/flyway-#{version}") } この場合は,存在しなかった場合trueになります.

execute "flyway-cli" do
  command <<-EOH
     wget http://repo1.maven.org/maven2/com/googlecode/flyway/flyway-commandline/#{version}/flyway-commandline-#{version}.tar.gz -P /tmp
     tar xzfC /tmp/flyway-commandline-#{version}.tar.gz #{install_dir}/versions
     ln -nfs #{install_dir}/versions/flyway-#{version} #{install_dir}/flyway
  EOH
  not_if { File.exists?("#{install_dir}/versions/flyway-#{version}") }
end

mysql-connector.rb

こちらにも同様に追記します.

execute "mysql-connector" do
  command <<-EOH
     wget http://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-5.1.26.tar.gz -P /tmp
     tar xzfC /tmp/mysql-connector-java-5.1.26.tar.gz /opt/flyway/flyway/jars
     ln -nfs /opt/flyway/flyway/jars/mysql-connector-java-5.1.26/mysql-connector-java-5.1.26-bin.jar /opt/flyway/flyway/jars//mysql-connector-java-5.1.26-bin.jar
  EOH
  not_if { File.exists?("/opt/flyway/flyway/jars/mysql-connector-java-5.1.26") }
end

実行してみる

ちゃんとスキップされてます.

# sudo chef-solo -c solo.rb -j localhost.json
Starting Chef Client, version 11.6.2
Compiling Cookbooks...
Converging 3 resources
Recipe: flyway-cli::default
  * directory[/opt/flyway/versions] action create (up to date)
  * execute[flyway-cli] action run (skipped due to not_if)
Recipe: flyway-cli::mysql-connector
  * execute[mysql-connector] action run (skipped due to not_if)
Chef Client finished, 0 resources updated

まとめ

今回は,すでにインストール済みの場合はrecipeを実行しないようにするガードをつけました.これで無駄なインストールやファイルのダウンロードがおこなわれないようになります.

Chefのrecipeを書いてみる一覧

参考文献

Chefのrecipeを書いてみる その3 -recipeを分割してみる編-

前回書いた,Chefのrecipeを書いてみる その2 -recipeからインストールするversionを指定してみる編-に引き続きchefのrecipeを順を追って書いていきます.今日は,recipeを分割してみようと思います.

Recipeを分ける

現時点のrecipeを実行すると,mysql-connectorのrecipeも実行されてしまいます. もし,MySQLではなく他のDBを使っていた場合,これはインストールしたくないと思います. そのため,この部分を別のrecipeに分けて,必要に応じてインストールするように変更します.

flyway-cli/recipes/mysql-connector.rb の作成

mysql-connectorのrecipeを作成します.作り方はdefault.rbとほとんど変わりません. ついでに,jarファイルにシンボリックリンクを貼るのを忘れてたので追加.

execute "mysql-connector" do
  command <<-EOH
     wget http://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-5.1.26.tar.gz -P /tmp
     tar xzfC /tmp/mysql-connector-java-5.1.26.tar.gz /opt/flyway/flyway/jars
     ln -nfs /opt/flyway/flyway/jars/mysql-connector-java-5.1.26/mysql-connector-java-5.1.26-bin.jar /opt/flyway/flyway/jars//mysql-connector-java-5.1.26-bin.jar
  EOH
end

chef-repo/localhost.json

msql-connectorをlocalhost.jsonに追加します. cookbook名の後ろに::をつづけてrecipe名を指定することが出来ます.

{
  "run_list" : [
    "recipe[flyway-cli]",
    "recipe[flyway-cli::mysql-connector]"
  ]
}

まとめ

今回は,今まで一緒になっていたrecipeを分けました.これでrecipeを使う人が必要に応じて指定することが出来便利になりました.

Chefのrecipeを書いてみる一覧

参考文献

Chefのrecipeを書いてみる その2 -recipeからインストールするversionを指定してみる編-

前回書いた,Chefのrecipeを書いてみる その1 -とりあえずrecipeを書いてみる編-に引き続きchefのrecipeを順を追って書いていきます.今日は,versionを指定できるように改造しようと思います.

versionを指定できるようにしてみる

recipeをみてみると,いろいろ抽象化出来るところがありそうです. version,インストールするディレクトリなどなど. とりあえず,バージョンを指定できるようにしてみましょう.

前回はflyway-cliをインストールするためのrecipeを書きました. DL先を見るとちょっと面倒臭い事になりそうです.. 1.1から2.1.1まではtar.gzのファイル名が{version}-distというsuffixが付き, 2.2からは「-dist」は付きません.. そこら辺を考慮して書いていこうとしましたが,バージョンの判定をして2.2より小さかったら対応してないエラーを出す(色々と名前や,ディレクトリが異なるので今回は排除)という方向で行こうと思います.必要になったら書けばいいのです.

インストールディレクトリと,バージョンの指定

とりあえずファイルの中に変数としてインストールディレクトリと,インストールしたいバージョンを変数に代入しておきます.

install_dir = "/opt/flyway"
version = "2.2.1"

サポートバージョンの設定

バージョンの判定2.2より小さいものはサポートしないということで,対応しないものはエラーを出力して終了するように記述します.Ruby的にこの書き方が合ってるのかはわからないけど,REPLで試したら概ね動いたので,とりあえずいいかな?

if version &lt; "2.2" then
  Chef::Log::error "#{cookbook_name} is supported versions in more than 2.2."
  exit 1
end

インストール先のディレクトリの作成

複数バージョンを持っておくためにversionディレクトリを作成します(そもそも,複数バージョンを保管する需要があるかどうかは要検討).

directory "#{install_dir}/versions" do
  owner     "root"
  group     "wheel"
  action    :create
  recursive true
end

flyway-cliをダウンロードして,展開,シンボリックリンクを貼る(インストール)

すでにシンボリックリンクが存在した場合コケるので,-nfを追記します. バージョンはとりあえず,シンボリックリンクの切り替えで対応することにします.

execute "flyway-cli" do
  command <<-EOH
     wget http://repo1.maven.org/maven2/com/googlecode/flyway/flyway-commandline/#{version}/flyway-commandline-#{version}.tar.gz -P /tmp
     tar xzfC /tmp/flyway-commandline-#{version}.tar.gz #{install_dir}/versions
     ln -nfs #{install_dir}/versions/flyway-#{version} #{install_dir}/flyway
  EOH
end

MySqlを使う場合に必要なconnectorをインストール

MySqlを使う場合にはconnectorが必要なので,これもついでにインストールします.

execute "mysql-connector" do
  command <<-EOH
     wget http://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-5.1.26.tar.gz -P /tmp
     tar xzfC /tmp/mysql-connector-java-5.1.26.tar.gz /opt/flyway/flyway/jars
  EOH
end

まとめ

versionを指定するときはrecipeの頭に書いてあるバージョンを書き換えることで,指定したものをインストールすることが出来ます.nodeファイルなど,recipeの外側から指定する方法は追って書こうと思います.

Chefのrecipeを書いてみる一覧

参考文献

Chefのrecipeを書いてみる その1 -とりあえずrecipeを書いてみる編-

Chefのcookbookを順を追って,説明しながら書いていこうと思います. 最初はナイーブにインストールすることを目標として,次にrecipeを分けてみたり,attributeを設定してみたりします. 今回はナイーブにインストールするところまで.

インストールするものは特になんでもいいんですが,丁度インストールしようとしていたので,flyway-cliのrecipeを書こうとおもいます. FlywayやEvolutions などのDB(Scheme)マイグレーションツールについては前回を参照.

cookbookを書いてみた

chefのrepositoryを準備する

まず,chefのcookbookやノードファイルを置くrepositoryを準備します.

git clone git://github.com/opscode/chef-repo.git
cd chef-repo
knife configure

cookbookを作成

早速,cookbookのひな形を作成します.本当は自作したcookbookはsite-cookbooksに入れるんだけど,今回はcookbooksで.

sudo knife cookbook create flyway-cli -o cookbooks
sudo knife cookbook create [cookbook名] -o [cookbookを配置するディレクトリ]

git で管理

必要であればgitでcookbookを管理しましょう.

git init
git add .
git commit -m 'First commit'

recipeを書く

先ほど作成したcookbookの中に移動します. とりあえず,recipes/default.rbflyway-cliをインストールするrecipeをナイーブに書いていきます. 今回はシェルスクリプトだけでできるのでexecuteを使います. このexecuteの部分に記述するものをresourceと呼びます.

基本的な流れは,次の通り.

  1. wgetでファイルのダウンロード
  2. tarで解凍
  3. lnシンボリックリンクを作成

  4. execute: sh -cでcommandを実行する

  5. command: ここに実行したいshllスクリプトを記述する
  6. <<-EOC: Rubyにおけるヒアドキュメント(キーワードはEOCじゃなくてもいい)
execute "flyway-cli" do
  command <<-EOC
     wget http://repo1.maven.org/maven2/com/googlecode/flyway/flyway-commandline/2.2.1/flyway-commandline-2.2.1.tar.gz -P /tmp
     tar xzfC /tmp/flyway-commandline-2.2.1.tar.gz /opt
     ln -s /opt/flyway-2.2.1 /opt/flyway
  EOC
end

execute "mysql-connector" do
  command <<-EOH
     wget http://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-5.1.26.tar.gz -P /tmp
     tar xzfC /tmp/mysql-connector-java-5.1.26.tar.gz /opt/flyway/jars
  EOH
end

solo.rbの作成

先ほど作成したchef-repoに戻ります.

chefでダウンロードしたファイルを置いておくfileキャッシュのディレクトリと,cookbookを配置しておくcookbooksディレクトリをsolo.rbに記述することが出来ます.

file_cache_path "/tmp/chef-solo"
cookbook_path [File.expand_path("./cookbooks", __FILE__)]

ノードファイル localhost.jsonの作成

chef-repoにlocalhost.jsonを作成します. ノードとはchefを実行してセットアップするコンピュータのことを指します.

このファイルはJSONで記述します.run_listのArrayにrecipeを追加していくことで,chef-soloを実行した時に走らせるrecipeを指定することが出来ます.

{
  "run_list" : [
    "recipe[flyway-cli]"
  ]
}

chef-soloの実行

chef-repoディレクトリでchef-soloを実行します.

sudo chef-solo -c solo.rb -j ./localhost.json

以下のコマンドを実行してUsageが表示されればひとまず完了です.

sudo /opt/flyway/flyway

続きはまた明日.

Chefのrecipeを書いてみる一覧

参考文献

ActionScriptからcookieやSharedObjectを触る

ActionScriptからcookieは直接触れないらしい. ActionScriptのExternalInterfaceを使って,JavaScriptからcookieを書いたり取得したりする方法がある.

ただ,callはglobalにある関数しかよべない(?)ので,名前空間が汚される. なのであんまり使いたくない.

余程のことが無い限り,SharedObjectを使うのが良さそう.

ExternalInterface と JavaScript を使ってCookieを操作する

JavaScript

// Cookieをセットする

function setCookie(str) {
    document.cookie = str;
}
// Cookieを取得する

function getCookie() {
    return document.cookie;
}

ActionScript

// set cookie
ExternalInterface.call("setCookie", "name=value; expires=Tue, 26 Nov 2014 11:52:22 GMT; path=/"); 
// get cookie
ExternalInterface.call("getCookie"); 

Ringo Advent Calendar

Advent Calendarとは

Advent Calendarは本来、12月1日から24日までクリスマスを待つまでに1日に1つ、穴が空けられるようになっているカレンダーです。WebでのAdvent Calendarは、その風習に習い、12月1日から25日まで1日に1つ、みんなで記事を投稿していくというイベントです。 (引用元: Adventar

後輩がひっそりと一人AdventCalendarやってたり,おれおれAdventCalendarをやっているので,ぼくもトライしてみようと思います.

内容は?

とくに限定せずに,フリースタイルで記事を書こうと思います.Evernoteに溜まりまくっているdraft記事をpublishしていこうと思います.さっきやろうと思ったので,スタートは今日(12/4)です.

OSX 10.9 Mavericks に Chefクライアントをインストールする方法

ChefでOSXをセットアップしようとしたんだけど, いつも使ってたインストールスクリプトではインストールできなくなっていた.

curl -L https://www.opscode.com/chef/install.sh | sudo bash

実際に実行すると,No builds for platform: 10.9というメッセージと共に終了してしまう.

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6790  100  6790    0     0   3145      0  0:00:02  0:00:02 --:--:--  3146
No builds for platform: 10.9
Please file a bug report at http://tickets.opscode.com
Project: Chef
Component: Packages
Label: Omnibus
Version:


Please detail your operating system type, version and any other relevant detail

install.sh に10.9の挙動を追加する

これは,install.shに10.9の時の挙動が記述されていないため,インストールできなくなっているらしい. そのため,install.sh"10.9") platform_version="10.7" ;;という一行追記するだけでインストールできるようになる.

     "10.8") platform_version="10.7" ;;
+    "10.9") platform_version="10.7" ;;
     *) echo "No builds for platform: $major_version"

gistに変更済みのものを上げておいたので,以下のコマンドでインストールできます.

curl -L https://gist.github.com/ringohub/7660676/raw/bc25c3274d55a799f11e4aa012bf3e809a7cf285/install.sh | sudo bash

成功!

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6829    0  6829    0     0   6035      0 --:--:--  0:00:01 --:--:--  6038
Downloading Chef  for mac_os_x...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100 23.0M  100 23.0M    0     0   126k      0  0:03:05  0:03:05 --:--:--  147k
Installing Chef
Verifying archive integrity... All good.
Uncompressing The full stack of chef.....................
...
Thank you for installing Chef!

参考

ActionScriptからcookieやSharedObjectを触る

ActionScriptからcookieは直接触れないらしい. ActionScriptのExternalInterfaceを使って,JavaScriptからcookieを書いたり取得したりする方法がある.

ただ,callはglobalにある関数しかよべない(?)ので,名前空間が汚される. なのであんまり使いたくない.

余程のことが無い限り,SharedObjectを使うのが良さそう.

ExternalInterface と JavaScript を使ってCookieを操作する

JavaScript

// Cookieをセットする
function setCookie(str) {
    document.cookie = str;
}
// Cookieを取得する
function getCookie() {
    return document.cookie;
}

ActionScript

// set cookie
ExternalInterface.call("setCookie", "name=value; expires=Tue, 26 Nov 2014 11:52:22 GMT; path=/"); 
// get cookie
ExternalInterface.call("getCookie"); 

IntelliJ IDEA で Flash の開発環境を整えるよ!

ちょっと,調べたら IntelliJ IDEA でFlashの開発が出来るようなので構築してみた.

Adobe Flex SDK のダウンロード

  1. Flex SDKをダウンロードする
  2. 解凍して,好きなところに配置する(/Applications/FlexSDK_4.6 にしました)

 IntelliJ IDEAで Flash/Flex Support plug-inを導入

Cmd+, > Plugins > Flash/Flex Support > Apply > OK f:id:ringo6119:20131123015759p:plain

これで開発環境は整いました.

サンプルプロジェクトを作成

1. Create New Project f:id:ringo6119:20131123015802p:plain 2. Pure ActionScriptにチェック, Flex/AIR SDKを選択 f:id:ringo6119:20131123015756p:plain 3. 実行するとブラウザにHelloWorldが表示される f:id:ringo6119:20131123015753p:plain

参考文献

DBマイグレーションツール(Schemeマイグレーションツール): Evolutions と Flywayについて調べてみた

はじめに

DB(Schemeマイグレーションツールを使うにあたって,いろいろ調べたことをまとめて置こうと思う. 基本的には,EvolutionsとFlyway焦点をあててます. この2つのどちらを採用すればよいかを考えるために調査しました. 実績や運用時の失敗などがあれば教えていただけると幸いです.

DBマイグレーションツールとは何をするものなのか

DBマイグレーションとはDBMSの移行をすることで(例えばMySQLからPostgreSQLへ移行するとか), それをサポートするツールのことを指す. この機能は,Railsでいち早く採用されたらしい(RubyにはMigr8というのがある). しかし,調べているとDBMSの移行という意味よりも, TABLEのSchemeマイグレーションのことを指して言っていることもあった.

EvolutionsもFlywayもPlainなSQLファイルを使ったSchemeマイグレーションツール. 簡単に言うと,スキーマのバージョン管理のようなもの. と言いつつも,TABLEにはデータが入っているため,特定のバージョンに戻すのは難しい.

記述方法

  • DSLで書くものや,生のSQLを記述
  • XMLDBMSに依存しない形で記述
  • EvolutionsやFlywayは生のSQLで記述

記述内容

大きく分けてUpとDownがある. - Up: バージョンを上げるときの動作(Railsでは migrate) - Downs バージョンを戻すときの動作(Railsでは rollback)

ここで,Evolutionsとflywayをみてみると. 基本的にどっちもrollbackはできない(gitみたいに前のバージョンにホイッと戻せない). FlywayはそもそもDownsが存在しない(逆に安全?).

Evolutionsの挙動

挙動があやしいとの噂があるEvolutions.

Downsについて

Downはいつ実行されるかという件を調べていたら次のような記事があった.

簡単に訳すと, Downsはスクリプトが変更された時に使われる. 2.sqlがあって,2.sqlが変更されたとする.するとPlayはDownsを走らせてから新しい2.sqlUpsを走らせる. 知るかぎりではDownsを手動で実行する方法はなく,それはApplicationとDBの関係を崩す状態になるため,エラーが起きる可能性がある. もし,戻したい変更を書くなら3.sqlUpsに書くといい.

 sqlファイルに変更があった場合の実行順序について

簡単にまとめると, Evolutionsは一番purefixの大きいSQLファイルに変更があった場合,対象のファイルのDownsが走ってから新しいUpsが走る.

  • 1.sql, 2.sql, 3.sqlが存在するとする.
    • 2.sqlを変更しても何も実行されない.
    • 3.sqlが実行された場合変更を検知し,3.sqlのDownsが走ってから変更後の3.sqlUpsが走る.
    • 2と3に変更があった場合,3:Downs, 2:Downs, 2:Ups, 3:Upsの順番で実行される.

FlywayとEvolutions

  • どちらもplay-pluginある
  • FlywayはDBPlugin非依存
  • FlywayはUpsのみ - FlywayはCLIがある

FlywayとEvolutionsとかいいつつも,Flywayに関することしか書いてない. Evolutionsを選ぶ理由が特にないというのもある...

どうやって選ぶのか?

  • そもそもSchemeマイグレーションツールを使って管理する必要があるのか?
  • DB-pluginに依存してもいいのか?問題ないか?
  • Downsは必要か?不要か?
  • DSLか生SQLか?

などの条件を考える感じになりそう.

選択肢

  • gitで管理
  • Evolutionsを使う
  • Flywayを使う
  • Liquibaseを使う(XML

Evolutionsはいろいろ,良い噂を聞かないのでまず却下. LiqibaseもDBMSの鞍替えとかは考えないので却下. gitでも,Flywayのどっちかかなという感じ. Playと連携させるとするとFlywayかなぁ.

 Evolutionsを使った人達の声

参考文献

Chef で "yum-dump Locking Error!" がでる

Chefでがーっとインストールしていると,yumでyum-dump Locking Error!というのがでる.

Chef::Exceptions::Package: Yum failed - #&lt;Process::Status: pid 5261 exit 200> - returns: ["yum-dump Locking Error! Couldn't obtain an exclusive yum lock in 10 seconds. Giving up.\n"] 

要はChefがyumを実行している時にタイムアウトしてしまうらしい. タイムアウトに設定されている時間は,エラーログに書いてあるように10秒. ちょっと,これは短いのでなんとか変更する方法はないかと,いろいろ探してたが情報があんまりなかった.

こういうissue(CHEF-3193)があって, 最終的にはattributeとかで設定出来るようにするべきだよねって話がされてた. が,今(2013/11/06)の状態はConfirmed.

最終的には, /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.0/lib/chef/provider/package/yum-dump.pyに記述されている,

# Seconds to wait for exclusive access to yum
LOCK_TIMEOUT = 10

の値を30くらいに変更した.

その他

東京node学園祭 2013に参加してきました

ぜんぜんnodeに触ったことが無いけど,東京node学園祭に行ってきました.

ブログを書くまでが学園祭とのことなので,いままで続いてました. 何を書けばいいかわからないけど,メモったことを書いておきます.

もし,間違っているところがあったら訂正お願いします.

セッション

参加したセッションはこちら.

  1. 基調講演(@meso)
  2. Grunt, Yeoman, Bower(@yosuke_furukawa)
  3. Node.jsを選ぶとき,選ばないとき(@tricknotes)
  4. Node.jsで学生向けe-learningサイトを作った話(吉田徹生)
  5. WebRTCを始めよう(がねこまさし)
  6. 無限LT大会

基調講演(@meso): TheFuture of Programming in Node.js

Nodeの二代目リーダーと言われている Isaac Schulueter さんがMLに投げたメールの話.

Nodeの今後

callback

  • 非同期処理を記述するデファクトの方法で在り続ける
  • generator, promiseは興味深いがあくまでもユーザ拡張の領域(hotだがコアに入れない)
  • ECMAScript 6(Node.js v0.11.4以降)でオプションをつけるとつかえる
  • Bert: callback地獄を根本的に解決する策があったら?

Stream

  • Streamはより早く,一貫性のあるものになる
  • v0.10との後方互換性は100%たもたれる

Domain

  • エラーを継続追跡できる仕組みにします
  • エラーハンドリングの仕組みをユーザ拡張で作れるようにする

ModuleSystem

  • 変更なし.完成された.

AltJS

Binary Addon

Cとかで書いてコンパイルして使うアドオン.

  • v0.12ではV8のAPIが著しく変わったため,基本的に動かない
  • opensslはzlibなどとの組み合わせも難しい
  • 今この問題に取り組んでいる

New Language Features

  • v8に言語仕様が取り入れられ,nodeにもやってくる
  • しかし,自動的にenableにはしない

VM module

  • VMはモジュール化され,contextifyモジュールの特徴をコアに取り入れる

Child Process

  • 子プロセスの同期実行が可能になる

Roadmap

  • v0.12がでたら使ってもらいます

OSS

  • これらの決定は民主主義的意思決定に基づくものではありません
  • しかし,意見を取り込む多くの余地がある
  • 作り方ったらforkして好きなの作るといい
  • OSS For the Win (FTW)

その他

StrongLoop というNodeディストリビューションやMeteorとかいうのがあるらしい. コミュニティとかに所属した経験がないので,こういうやり取りがなされてるのかーと思った.

スライド


Grunt, Yeoman, Bower(@yosuke_furukawa)

Yeomanとは

  • デベロッパーサポートツールの集合体(Yo,GRUNT,BOWER)
  • Yeomanのよさ: 簡単にgeneratorが作れる
  • yomania: generatorを作るまの下準備をしてくれる(npm install yeomania -g)
  • generator-generator: generatorを作るgeneratorひな形を作ってくれる

その他

そういえば,昔に社内勉強会でやったことを思い出した. こういうツールは使っていかないと覚えないので,使っていきたいなあと思う. けど,構造とか使い方とか覚えないといけないから,初動のコストが高い気がする.

おすすめ

スライド


Node.jsを選ぶとき,選ばないとき(@tricknotes)

今日の話

  • Node.jsとRailsを比較しNode.jsの正しい使い方をみていく
  • Node.jsはRailsに影響を受けている部分が多い
  • 対象者: Node.js以外の選択肢を知らない方,Node.jsをあまり使ったことがないかた

RubyをやめてNodeに

  • GitHubAPIをとにかく叩く必要があった
  • Rubyでマルチスレッドきつい
  • リアルタイム通知はSocket.IO

その他

あまり,node.jsもrubyもわからないから,深く理解できなかったが,crawlerとかはnodeがよさそうなのは分かった.

スライド


Node.jsで学生向けe-learningサイトを作った話(吉田徹生)

サイト紹介

  • スタディタウン: 首都圏の過去問の解説映像
  • PHP+FuelPHPで作っていた(Fuelは結構触りやすかった)

フレームワーク候補

  • flation
  • Matador
    • twitterをサウ制したObvious社が作成
    • Connect.jsを利用
    • ViewにはSoyNodeを利用
    • 選定時はベータ版だったので使わなった
    • SoyNodeを利用 (ClosureTemplatesの一つ)
  • express

package

  • ejs(ViewTemplate)
  • config($NODE_ENVによってconfigファイルの読み替え)
  • async(非同期処理を簡単に扱う)
  • node-uuid(被りたくない数字とか作るの便利)
  • aws-sdk(AWSを利用するため)
  • ua-parser-js(ユーザーエージェントでコードの出し分け)
  • nodemailer(SMTP,SES,Sendmailで簡単に利用できる)

スライド


WebRTCを始めよう(がねこまさし)

ちょっと,デモとか面白くて,全然メモってませんでした. でも,簡単に映像とか音声とか渡せたりしてWebRTCは面白そう.

その他

  • WebRTC: Web Real-Time Communication
  • socket.ioのURL指定はなぜhttpなのか?
    • httpハンドシェイクをして情報を伝えるため

スライド


まとめ

nodeのことは殆ど知らなかったけど,新しく知る事が多くて楽しかったです. 台風の影響で,懇親会が中止になってしまいましたが,かわりにビールとピザを楽しみながら無限LT大会が開かれました. 空腹時にビールを飲んだおかげで,少し体調が悪なってしまいましたが,楽しかったです.

勉強会とかカンファレンスとかに出て毎回良かった思うのは,「よし,やろう」とモチベーションがすごい上がることです. なぜか,全然知らない分野でもモチベーションが上がります. なので,最近モチベーションが落ちてきたなーと思う人は,なんでもいいからイベントに参加してみるのもいいと思います.

また,node Knock Outもあるので,Nodeの勉強をしようと思いました. (node使ったこと無いのに,学園祭とかnodeKOとかに出るのもどうなんだって話だけど)