bashでビープ音を消す
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 で dry-run
svnで使っているdry-runをgitでも実行したい時があると思います.
しかし,gitにdry-runに当たるものはないっぽいです.
一度マージを実行して,コミットせずに手動で戻すという形をとるようです.
--no-commit
をつけてdevelopをコミットなしでマージします.
git merge --no-commit --no-ff develop
ただ,マージはされるので,reset
でHEAD
まで戻します.
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;
- 入力がディレクトリか否かを判定
if [ -d "${DIR}” ]
- 対象のディレクトリに
.gitkeep
が存在するかを判定if [ -f "${DIR}/.gitkeep” ]
- 存在しない場合,ディレクトリが空か判定
elif [ -z "$(ls -A ${DIR})” ]
- 空だった場合,
.gitkeep
ファイルを作成touch ${DIR}/.gitkeep
使い方,
- git-gitkeep.shをダウンロードしてパスが通ってる場所に配置
chmod 755
で権限を与える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というのが, ポールポジションとフロントローを独占している.
さらにConsoleでログを見てみると,
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
したらターミナルが落ちた.
環境は以下のとおり.
発生事象
コミットログのメールアドレスを書き変えようとおもって,
以下のコマンドを実行しようとしたが,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化
現在,varsion
やinstall_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を書いてみる その1 -とりあえずrecipeを書いてみる編-
- Chefのrecipeを書いてみる その2 -recipeからインストールするversionを指定してみる編-
- Chefのrecipeを書いてみる その3 -recipeを分割してみる編-
- Chefのrecipeを書いてみる その4 -インストール済みの場合は実行しないようにしてみる編-
- Chefのrecipeを書いてみる その5 -変数をAttribute化してみる編-
参考文献
Chefのrecipeを書いてみる その4 -インストール済みの場合は実行しないようにしてみる編-
前回書いた,Chefのrecipeを書いてみる その3 -recipeを分割してみる編-に引き続きchefのrecipeを順を追って書いていきます.今日は,すでにソフトウェアがインストールされていたら,実行しないようにガードをつけてみようと思います.
実行する前にインストールチェックをする
すでにインストールされていた場合は実行しないようにガードを付けます.
基本的には,only_if
かnot_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を書いてみる その1 -とりあえずrecipeを書いてみる編-
- Chefのrecipeを書いてみる その2 -recipeからインストールするversionを指定してみる編-
- Chefのrecipeを書いてみる その3 -recipeを分割してみる編-
- Chefのrecipeを書いてみる その4 -インストール済みの場合は実行しないようにしてみる編-
- Chefのrecipeを書いてみる その5 -変数をAttribute化してみる編-
参考文献
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を書いてみる その1 -とりあえずrecipeを書いてみる編-
- Chefのrecipeを書いてみる その2 -recipeからインストールするversionを指定してみる編-
- Chefのrecipeを書いてみる その3 -recipeを分割してみる編-
- Chefのrecipeを書いてみる その4 -インストール済みの場合は実行しないようにしてみる編-
- Chefのrecipeを書いてみる その5 -変数をAttribute化してみる編-
参考文献
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 < "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のrecipeを書いてみる その2 -recipeからインストールするversionを指定してみる編-
- Chefのrecipeを書いてみる その3 -recipeを分割してみる編-
- Chefのrecipeを書いてみる その4 -インストール済みの場合は実行しないようにしてみる編-
- Chefのrecipeを書いてみる その5 -変数をAttribute化してみる編-
参考文献
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.rb
にflyway-cli
をインストールするrecipeをナイーブに書いていきます.
今回はシェルスクリプトだけでできるのでexecute
を使います.
このexecute
の部分に記述するものをresource
と呼びます.
基本的な流れは,次の通り.
wget
でファイルのダウンロードtar
で解凍ln
でシンボリックリンクを作成execute
:sh -c
でcommandを実行するcommand
: ここに実行したいshllスクリプトを記述する<<-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を書いてみる一覧
- Chefのrecipeを書いてみる その1 -とりあえずrecipeを書いてみる編-
- Chefのrecipeを書いてみる その2 -recipeからインストールするversionを指定してみる編-
- Chefのrecipeを書いてみる その3 -recipeを分割してみる編-
- Chefのrecipeを書いてみる その4 -インストール済みの場合は実行しないようにしてみる編-
- Chefのrecipeを書いてみる その5 -変数をAttribute化してみる編-
参考文献
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");