bashでビープ音を消す

いつもzshでは,.zshrcsetopt no_beepを書いて,ビープ音を消していた.

bashでも同じ設定をしたくて,調べるとset bell-style noneを書くといいらしということがわかったので, .bashrcに記述したが反映されなかった.

この設定はどうやら.inputrcに書かないとダメらしい. .inputrcに書いたら動いた.

参考文献

bash: scp: コマンドが見つかりません

SCPでファイルをサーバにコピーしようとしたら,

bash: scp: コマンドが見つかりません

というエラーが出てしまい,送信できなかった.

調べてみたら,openssh-clientsが入っていないことが原因らしい. Scientific Linux 6.xを最小インストールするとインストールされないらしいので自分で入れてやる必要がある.

yum install openssh-clients

参考文献

vimで貼付け時に自動でpasteモードにする

vimでOSのクリップボードから貼り付けたいときは, 一度set pasteでペーストモードにしてから貼り付ける.

これが,結構面倒くさいんだけど以下のスクリプトを使うと簡単に貼り付けができるようになる.

ノーマルモードでペーストを行うと自動でペーストモードになって, クリップボードの中身を貼り付けてくれる.

オススメです.

if &term =~ "xterm"
    let &t_ti .= "\e[?2004h"
    let &t_te .= "\e[?2004l"
    let &pastetoggle = "\e[201~"

    function XTermPasteBegin(ret)
        set paste
        return a:ret
    endfunction

    noremap <special> <expr> <Esc>[200~ XTermPasteBegin("0i")
    inoremap <special> <expr> <Esc>[200~ XTermPasteBegin("")
    cnoremap <special> <Esc>[200~ <nop>
    cnoremap <special> <Esc>[201~ <nop>
endif

参考文献

  • あったけどロストしてしまいました...

gitでpull(fetch) 専用のremoteを登録する方法

gitでリポジトリをforkした時に,fork元のリポジトリを追いかけたいっていう事があった. でも,間違ってpushしたくないので何とかしたい.

そんなときには,pull(fetch)専用のremoteを登録するといい.

git remote set-url --push origin no-pushing

参考

git で dry-run

svnで使っているdry-runをgitでも実行したい時があると思います.

しかし,gitにdry-runに当たるものはないっぽいです.

一度マージを実行して,コミットせずに手動で戻すという形をとるようです.

--no-commitをつけてdevelopをコミットなしでマージします.

git merge --no-commit --no-ff develop

ただ,マージはされるので,resetHEADまで戻します.

git reset HEAD

参考文献

gitでディレクトリ構成を維持する

今日もgitネタ.

gitでディレクトリ構成を維持したい時が度々ある. しかし,空のディレクトリはgitで管理されない.

そこで,ディレクトリを保持したい場合は,中に.gitkeepをおいておくといいそうな.

git gitkeep

すべてのディレクトリに,いちいち作成していくのは面倒臭いのでgitのサブコマンド(gitkeep)https://gist.github.com/ringohub/7939324を作りました.

せっかくなので,コードを解説. シェルで書きました.bashが入っていれば動きます.

gitリポジトリかどうかをチェック

gitリポジトリでないところで実行した場合,.gitkeepが作成されてしまうと困るので,ガード文を書きました.

if ! git rev-parse 2> /dev/null; then
  echo -e "\033[0;31mERROR\033[0;39m: This directory is not git repository \033[0;31m:(\033[0;39m"
  exit 1
fi

ディレクトリを探索しながら.gitkeepを配置

次のような流れで.gitkeepを作成してます.

Seek() {
  for DIR in * ; do
    if [ -d "${DIR}" ]; then
      if [ -f "${DIR}/.gitkeep" ]; then
        echo  ".gitkeep already exists .gitkeep in `pwd`/${DIR}"
      elif [ -z "$(ls -A ${DIR})" ]; then
        touch ${DIR}/.gitkeep
        echo  "Create .gitkeep in `pwd`/${DIR}"
      fi
      (cd "${DIR}"; Seek;)
    fi
  done
}
Seek; 
  1. 入力がディレクトリか否かを判定 if [ -d "${DIR}” ]
  2. 対象のディレクトリに.gitkeepが存在するかを判定 if [ -f "${DIR}/.gitkeep” ]
  3. 存在しない場合,ディレクトリが空か判定 elif [ -z "$(ls -A ${DIR})” ]
  4. 空だった場合,.gitkeepファイルを作成 touch ${DIR}/.gitkeep

使い方,

  1. git-gitkeep.shをダウンロードしてパスが通ってる場所に配置
  2. chmod 755で権限を与える
  3. git gitkeepを実行

ディレクトリが空じゃなくなったら.gitkeepを削除するようにした方がいいのかなぁ??

参考

git ignore のデフォルトを設定する

chefネタがevernoteからなくなってきたので,前々回に続きgitネタを. 一人Advent calendar結構しんどいね..

はじめに

毎回,git initして.gitignoreつくって,.DS_StoreとかThumbs.dbとかを追加する. これはすごい面倒くさいので,デフォルトで何とかしたい.

方法1 gitignoreのテンプレートを書く

ホームディレクトリに.gitignore.defaultを作成

.DS_Store
Thumbs.db

git config --global core.excludesfile ${HOME}/.gitignore.default

とすると,デフォで.gitignore.defaultを見てくれる.

でも,できればgit initしたときに, .gitignoreの作成してほしい(今後の課題).

gitignore.ioをつかう

gitignoreを作成してくれるサービス.gitignore.io

これは,shellに関数を定義する. 関数内でapiを呼び出すことによって取得することができる.

function gi() { curl http://gitignore.io/api/$@ ;}

gi osx

自分で.gitignoreを集める必要がないので非常に簡単!

gi osx,javaとすると,java用とosx用のgitignoreが出力される.

まとめ

ということで,gitのサブコマンドを作ってみました

参考

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");