Railway gun

Web系企業に勤めるサラリーマンが書くブログ

git pushで「Gtk-WARNING **: cannot open display」とエラーが出た場合

bitbucketにgit pushしようとしたら、エラーで怒られてしまった。

$ git push
(gnome-ssh-askpass:XXXXX): Gtk-WARNING **: cannot open display:

cannot open displayというエラーは
「パスワード入力窓をgnomeがオープンできないよ!」
と言われているらしい。

httpsでログインを試みる設定にしていたため、パスワードを求められているようだ。
色々な方が書かれているが、「SSH_ASKPASS」を環境変数から削除すれば良さそう。

$ unset SSH_ASKPASS
$ git push
Password:

無事、うまくpushできた。

とはいえ、ssh-keyも登録しておいたはずなので、sshによるアクセスに切り替えよう・・。

RMagickのインストールエラー

他の方が開発したrailsアプリを引っ張ってきて、
自分のCentOS環境でbundle installした際に下記のエラー発生。

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

checking for Ruby version >= 1.8.5... yes
checking for gcc... yes
checking for Magick-config... no
Can't install RMagick 2.13.2. Can't find Magick-config
・
・
・
An error occurred while installing rmagick (2.13.2), and Bundler cannot continue.
Make sure that `gem install rmagick -v '2.13.2'` succeeds before bundling.

ImageMagickが入っていないためのようだ。

$ sudo yum install ImageMagick ImageMagick-devel
$ bundle install

・
・
Installing rmagick 2.13.2
Your bundle is complete!

無事、解決。

Datanodeのエラー:Initialization failed for block pool Block pool BP-xxxxxxx

久しぶりのHadoopクラスタ構築で出てきたエラー。

DataNodeを起動しようとするとログに下記のエラーが吐かれて勝手にシャットダウンしてしまう。

FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for block pool Block pool BP-<<ユニーク値>> (storage id DS-<<ユニーク値>>) service to <<ドメイン名>>/<<IPアドレス>>:<<ポート>>

エラーの内容はBlock poolを初期化できませんでしたよ、という内容。
Hadoopが生成する"current"ディレクトリ配下のVERSIONファイルがおかしいのかと思ってみてみるが、
特におかしい所は無い。

何が原因なのか悩んだあげく、結論としては/etc/hostsファイルにドメインが記載されていなかった。

vim /etc/hosts

でhostsファイルにドメインを記載してやったら解決。

DNSで名前解決は出来ている状態になっていたのだが、Hadoopはhostsでしっかり記載してやらないと予期せぬエラーが起きる事がある。以前も同じ原因で別のエラーが出た事があった。

もし、何か理不尽なエラーが出る事があったら/etc/hostsを確認してみるといいかもしれない。

文字列の合成と評価させる方法

R言語に限らず、ループカウンタ等の変数を使って文字列を作りたい事がある。
Rでのやり方は簡単。paste関数を使うだけ。

i=1
paste("hoge",i,"hoge")  #-> "hoge 1 hoge"

単純に繋ぎたいオブジェクトを「,」区切りで渡せば良い。
デフォルトだと、スペースが区切り文字として入ってしまうため、

i=1
paste("hoge",i,"hoge",sep="")  #-> "hoge1hoge"

このようにsepプションで区切り文字を無しに指定すると、そのままつながる。

ちなみに、paste関数で生成された文字列は単なる文字列として扱われるため、
例えば既存のオブジェクトと同じ名前を作ったとしても評価されない。

オブジェクトとして評価させたい場合は,eval(parse(text=...))を使う。

tmp = "success"
eval(parse(text=paste("t","m","p",sep=""))) #-> "success"

これでオブジェクトとして認識されます。

パスワードジェネレータpwgenをUbuntuで使う

CentOSなどではmkpasswdが使えると思うんだけど、ubuntuには無いようだ。

調べたところpwgenというのが一般的らしい。
まずはインストール

$ sudo apt-get install pwgen

インストール完了。簡単な使い方は

# 5文字のパスワードを1つ表示
$ pwgen 5 1
yaCh9

パスワードの長さを変えたい時は第一引数をかえれば良い。
デフォルとだと、英数字大文字小文字の集合ができるようだ。

ちなみによく使いそうなオプションはこちら。

オプション 効果
-s ランダムに生成する。デフォルトでは「覚えやすい」物を出力する。
-B 紛らわしい文字を使わない。1とlのような。
-y 記号を含める。
-0 数字を含めない。
-A 大文字を含めない。
-h ヘルプを表示。

read.tableでのfactor型生成を防ぐ方法

read.tableは各種の外部データを読み込んでくれる非常に便利な関数だが、
そのまま使うと、Factor型で読み込みが行なわれてしまう。

今までFactorで読み込んだ後文字列に直していたが、
読み込むときにオプションをつければその手間は防げる事に今更気づいた。

例えば、Tabで区切られたtxtデータを読み込む際には、

read.table("xxx.txt"sep="¥t",stringsAsFactors=F)

のように

stringsAsFactors

をFALSEにしてやれば文字列として読み込みを行なってくれる。

標準の編集エディタ変更

crontabやvisudoで標準起動するエディタを変更したい事が有る。

そんなときは、

$ select-editor

で標準の編集エディタを変更できる。ubuntuはデフォルトがnanoだったので、
これを使ってvimに変更。