2014年11月26日水曜日

AWS-EC2へのHadoop+Hiveインストールではまったところ

いろいろハマったけれど、ちゃんと公式ドキュメントを読んでその通りにインストールするのが大事。

Hadoop サンプル実行失敗

下記のようなメッセージが表示され一向に処理が進まない
ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 0

/etc/hosts の 127.0.0.1 の行にec2のホスト名を追加することで解決した


Hive関連


基本はドキュメント通りに。
http://www.cloudera.com/content/cloudera/en/documentation/cdh5/v5-0-0/CDH5-Installation-Guide/cdh5ig_hive_installation.html

metastoreの設定には注意

デフォルトのderbyではうまく動作しなかったため、metastoreにはMySQLを使用した。
またmetastoreのスキーマはドキュメントでは hive-schema-0.12.0.mysql.sql だが hive-schema-0.13.0.mysql.sql を使用する。(0.12.0だと動かなかった)

SOURCE /usr/lib/hive/scripts/metastore/upgrade/mysql/hive-schema-0.13.0.mysql.sql;

Hive-JSON-Serdeを使う場合の注意

rcongiu/Hive-JSON-Serde を使うと最新のHiveに対応していなかった。
最新版に対応してくれている sheetaldolas/Hive-JSON-Serde の json-serde-1.1.9.8 を使うことで解決した。

https://github.com/sheetaldolas/Hive-JSON-Serde

DDL実行時エラーへの対処

create tableを実行すると下記のようなエラーが発生した。
Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: org.apache.hadoop.security.AccessControlException Permission denied: user=hive, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x

下記コマンドで /user の書き込みを可能にして対処
sudo su hdfs -c 'hadoop fs -chmod 777 /user'


2014年10月1日水曜日

僕を苦しめたDockerのバグ2つ

Postfixが動かない!(setgidが効かない)

Docker1.2では修正済みですが、Docker1.1ではsetgidが効きません。
Postfixが何故かうまく動かず、調べてみるとpostfixのコマンドであるpostdropとpostqueueはsetgidされていなければならいないのがされていませんでした。
手動でchmod g+s postqueueとかしてみても、付かない!
Dockerのバグでした。幸いDocker1.2は既にリリースされていたので、Dockerをアップデートするだけで解決しました。

docker pullするとdockerデーモンごとクラッシュする!

当然ですがdockerデーモンがクラッシュすると起動しているコンテナは全滅します。
恐ろしいですね。。。
修正のpullリクエストがマージ済み(2014/10/01現在)のようですが、自分でDockerをビルドするかDocker1.3(Docker.1.2.1?)を待たなければなりません。
https://github.com/docker/docker/pull/7864

2014年7月19日土曜日

QuincyKitでiOSアプリのクラッシュレポートを取得したときに困ったメモ

iOSアプリでクラッシュレポートを取得するためにQuincyKitというライブラリを使ってみた。
https://github.com/TheRealKerni/QuincyKit

わかりにくかったところをメモしておく。

クラッシュレポートが送信されるタイミング

クラッシュレポートはクラッシュした次の起動のタイミングで送信される仕様になっている。クラッシュした時ではネットワークが使えないかもしれないので、ローカルにレポートを保存しておき、次回起動時にレポートを送信するということなのだろう。

symbolicateとは何か

送信されたレポートのスタックトレースには最初は標準ライブラリのシンボル名しか表示されない。
そこで送信されたレポートには手動でアプリ固有のシンボル名を表示できるようにする処理を行う。これをsymbolicateと呼んでいる。

symbolicateで起きた問題

symbolicateするにはリポジトリのserver/localに配置されているスクリプトを使う。
symbolicate.phpはサーバーのレポートをsymbolicateして更新するスクリプトでsymbolicatecrash.plはコマンドラインで指定したクラッシュレポートをsymbolicateするスクリプトだ。

僕の環境ではこれを使うにあたって3つ問題が発生した。

1.原因不明だがfile_get_contents()がWarningを出して止まってしまう
symbolicate.phpのfile_get_contents()を使っている場所をcurlを使うように修正して対応した。

2.MoreUtils.pmがなくてsymbolicatecrash.plが動かない
標準では入っていないパッケージだったようなので下記の通りインストールした。
sudo cpan install List::MoreUtils

3.symbolicateを実行してもシンボル名が表示されない
これは下記のサイトを参考にXCodeのBuild Settingsを修正したところ直った。
http://support.hockeyapp.net/kb/client-integration-ios-mac-os-x/how-to-solve-symbolication-problems
僕の場合はStrip Debug Symbols During CopyをYESに変更する必要があった。




2014年6月21日土曜日

Cannot find daemon loader org/apache/commons/daemon/support/DaemonLoader

Apacheのcommons-daemonを使ってサーバープログラムをデーモン化しようとしていたらjsvcの起動でエラーに遭遇。

「Cannot find daemon loader org/apache/commons/daemon/support/DaemonLoader」

調べても解決してるっぽい記事がでてこない。
原因はjsvcの-cpオプションに指定するjarを相対パスでしていたことだった。
jsvcは-userを指定して実行ユーザーを変えたりできるのでJVM実行時のカレントディレクトリは別の場所になっているようだ。
-cpに指定するパスはすべて絶対パスにすることで起動に成功した。


2014年6月16日月曜日

dockerコンテナを別のコマンドで立ち上げる方法はver.1.1から?

docker1.1からコンテナを別のコマンドで立ち上げることができるようになるかも。
https://github.com/dotcloud/docker/issues/1228#issuecomment-45546178

dockerコンテナは停止してもstartコマンドで再度立ち上げることができる。
しかし、現在(v1.0)はstartコマンドはdocker runの時に実行したコマンドでしか起動できない。
もし障害が起きてコンテナが停止して、更にはコンテナがstartで起動しなくなっていたら、原因解析やデータを救出したりすることが難しくなる。

現時点でできる対策としては
・必ずsshdを同時に起動しておく
・volumeや--volumes-fromなどを使ってデータを隔離しておく
といったところ。

最悪これらの設定をしていなかった場合は停止したコンテナを一度commitしてイメージを作成してから再度docker runすることでコンテナが停止したタイミングのデータにアクセスできる。
まぁこれができれば問題ないじゃんって話もあるけど同じコンテナですぐに繋げられる方が楽だよね。

nsinitというのを使って直接dockerの空間にアタッチする方法があるので、それを使えばデータ救出や障害解析ができそう。

とはいえ、実験とかの時に無駄にコンテナを量産しなくてすむし、ぜひぜひ別コマンドでの起動に対応して欲しい。

dockerのEXPOSEはdocker run -Pもしくはdocker run --linkで意味を持つ

dockerのハマりどころとしてEXPOSEが理解できないというのがあると思う。
EXPOSEは書いただけで何か動作が変わるといったものではなく、他の機能から参照されて意味を持つ。
dockerに入門したてだとEXPOSEを指定しないとコンテナにネットワーク接続できないと勘違いしてしまったりするがそんなことはない。
EXPOSEしなくてもdocker run -pオプションでポートを外部公開できるし、dockerネットワークのIPを使ってコンテナ間もしくはホスト・コンテナ間で通信可能だ。

僕の知っている限り、EXPOSEの指定はdocker run -PもしくはDockerのlink機能を使ってコンテナ間連携をするときだけ意味を持つ。

doker run -PはEXPOSEしているすべてのポートをpublishする。
マッピングの指定をしないのでdockerが勝手にホストのポートを割り当てる。

docker run --link は連携対象のコンテナを指定するとEXPOSEしているポートに接続するための環境変数を付けてコンテナを起動する。

linkのドキュメント:
https://docs.docker.com/userguide/dockerlinks/


(この記事の情報は docker ver0.11.1 にて確認しています)

dockerは再起動しても変更が消えることはない

dockerに関する記事で「dockerは再起動すると変更が元に戻る」っていう書き方をしている人が多いけど誤解なのでこういう書き方はやめていただきたい。
docker run の意味は新しいコンテナでプロセスを起動するということであって再起動ではない。
そしてdockerには再起動という概念は別にあって、それは停止したコンテナに対するdocker startだ。
docker restartというコマンドもある。この再起動の場合にはコンテナ上の変更が元に戻るということはない。

2014年2月14日金曜日

cakephpのカスタムValidationでレコードの存在チェック

cakephp2.xにてカスタムValidationを使ってレコードの存在チェックを行う。
管理画面で各種IDを直接入力するような場合のチェックを想定。

/** 使い回しのため親クラスにカスタムValidationの関数を用意する */
class AppModel extends Model {
    public $uses = array('User');

    public function existsUser($check) {
        // countを使って存在チェック
        $count = $this->User->find('count', array('conditions'=>array('id'=>$check), 'recursive' => -1) );
        return $count > 0;
    }
}

/** validateの設定 */
class SampleModel extends AppModel {

    public $validate = array(
        'user_id' => array(
            'existsUser' => array(
                'rule' => 'existsUser',
                'message' => '存在するユーザーのIDを入力してください'
            )
        )
    );
}

2014年1月15日水曜日

クラウドによるパスワード管理はLastpassかKeePassのどちらが最適か。

クラウドでパスワードを管理

最近ではヘビーユーザーでなくてもWindowsもMacもAndroid端末も使っているという人が多くなってきているだろう。
そういう人は管理しているパスワードをすべてのデバイスから見れるように同期したいと思うようになるはずだ。

これを実現する方法として下記の2つが有力だ。

  • Lastpassというクラウドサービスを使う
  • KeePassというパスワード管理ソフトとDropBoxなどのオンラインストレージを組み合わせて使う

LastpassとKeePass+オンラインストレージの違い

パスワードの保存場所

Lastpass

Lastpassが提供するクラウドストレージ上にパスワードが保管される

KeePass

KeePass自体はクラウドを前提としたものではなく、ただのパスワード管理ツールである。DropBoxやGoogle Driveといったクラウドストレージサービスにパスワードファイルを置くことでパスワードを一元管理できる。

価格

Lastpass: iPhone/Androidから使う場合は1$かかる
KeePass: 無料

その他

ギズモードによれば自動入力などはLastpassの方が便利のよう。
十分なセキュリティ対策はされていると思うが日本ではLastpassはそれほど知名度がないし、ストレージにDropBoxなどが使えるKeePassの方が安心感がある。

参考

ギズモードの本家サイト(英語)の記事:LastpassとKeePassの比較

2014年1月14日火曜日

VirtualBoxにWordpressを入れるとテーマインストールができない(dns解決失敗)

エラー

VirtualBox上のWordpressのテーマを検索しようとすると、エラーが発生してテーマ選択することができなかった。
curl関数の結果をechoしてみると「name lookup timed out 」というエラーメッセージを発見。DNSの解決がうまくいっていないようだった。

構成

VirtualBox 4.3.6
WordPress 3.8

VirtualBoxネットワーク構成
アダプタ1: NAT
アダプタ2:ホストオンリーアダプター

解決方法

VirtualBoxのネットワーク構成との関連で問題が起きているようだった。
/etc/resolve.conf でDNSを 8.8.8.8 (GoogleのパブリックDNS) に向けたところ正常に動作するようになった。

ホストオンリーアダプターのせいかと思ったが、NATオンリーにしても問題は解決しなかった。


2014年1月12日日曜日

ruby1.9のcgiでテキストファイルを受け取る

ruby1.9からはエンコーディングの仕様が変わっているため、適当に検索してでてきたファイルをpostで受け取る方法が動かなかった。 ファイルと内部エンコードが共にUTF-8であり、下記のようなコードで対応した。 cgi = CGI.new value = cgi.params['file'][0] v = value.read() # バイナリ(US-ASCIIのString)として読み込む txt = v.encode('utf-8', 'utf-8') # vをUTF-8として解釈し、UTF-8の文字列として返す ruby1.8だとencode()の部分が不要となる。 フォームのHTMLはruby1.8の時と変更なし。

[Mac]vagrant plugin install vagrant-berkshelfに失敗する

Mac Air/Vagrant1.3.5 の環境で vagrnt-berkshelf プラグインをインストールしようとしたところ失敗。 エラー: ld: in /opt/local/lib/libstdc++.6.dylib, file was built for unsupported file format which is not the architecture being linked (i386) for architecture i386 原因はよく分からないが Vagrantを最新版の1.4.3にしたところインストールに成功した。

2014年1月10日金曜日

Webサイト上に仮想マシンのコンソールを設置するライブラリ

runnableというスニペット共有サイトがWebサイト上に仮想マシンのコンソールを設置していてとても便利だ。

これを実現するためのコードはオープンソースで公開されているので、それを使えば比較的簡単に実現できそうである。

dockworkerというのがコンソールを実現するアプリケーションだ。CodeNow/dockworkerというリポジトリからフォークしているが、CodeNowというのはRunnableの昔の名前で、開発会社は同じのようだ。
また、Runnable.comで使っているDockerの仮想環境定義(Dockerfile)も公開されている
しかし、それぞれライセンスが設定されていないという問題もある。

この仕組を活かしたプログラミングの勉強サイトなどがあったら初心者などには特に便利ではないだろうか。
PHPの勉強をするにしても、環境作りというのはかなり手間だ。xamppなどを使えばそこそこ楽だが、それでもつまづく人はいるのだ。


2014年1月9日木曜日

Runnable.comが便利そう

先日見つけたRunnable.comというコードスニペットの共有サイトがなかなか便利そうだ。
コードスニペットのサイトは他にも色々あるが、Runnable.comは他のサイトよりずっといい。

サイト上でコードを実行できる

スニペットのページには「Run」ボタンがあり、押すとスニペットのコードを即座に実行することができる。
実行環境を用意しなくても実際の結果を直ぐに確認できるのはとても助かる。

サイト上に用意されたLinuxコンソールを使って編集・実行できる

スニペットのページにいくと、スニペットの下にLinuxコンソールが表示され、スニペットを編集したり実行することができる。
Dockerを使った仮想環境になっており、当然vimも使えるし、root権限があるのでapt-get installもできる。

試しにslコマンドをインストールして実行してみた。



対応している言語が多い

  • C++
  • Java
  • PHP
  • Node.js
  • .Net系の言語
  • javascript
  • dart
  • python
など

データベースやいくつかのフレームワークにも対応

MySQLやCakePHPなどにも対応しており、それらに依存するスニペットも実行できる。



Mac Book Air に VirtualBox で Windows8.1 をインストールした感想

VirtualBoxを使ってMac Book AirにWindows8.1(64bit)をインストールしてみた。

インストール

環境

・Mac Book Air(2011年のモデル)
・VirtualBox4.3.6
・Windows8.1(64bit)

仮想マシン

VirtualBoxの新規マシン作成時にWindows8.1をプラットフォームに選ぶと、強制でHDDは25GB以上、メモリは2GB以上にされる。Macのメモリが4GBなので半分持ってかれていしまうorz
使用CPUコアを2に引き上げて表示関連の最適化オプション付ける以外はデフォルトの状態ですんなりインストールできた。

とりあえず数時間使った感想

ユーザーインタフェース

ボロクソに叩かれている新しいユーザーインタフェースだが、僕としては悪くない。
Windows8の頃はどうだかしらないけれど。
情報を見せる場所(スタート画面)と作業場所(デスクトップ)は分かれてていい。

Chromeが動かない

インストールはできるものの起動すると画面が乱れまくって使い物にならない。
ChromeはGPUを使い倒すために色々やってるのが原因と思われる。
結局IEを使うハメになりげんなりする。

Windowsストアのアプリが微妙

「エディタ」で検索しても無料アプリではまともなものがない。diffで検索しても日本語のアプリすらでてこない。
検索結果にでてきたアプリも結局作者のウェブサイトにいかないとダウンロードできなかったりする。
他サイトの記事ではアプリも増えてきたという記述もあるが、まだゲーム探すくらいにしかWindowsストアは役に立たなそう。

遅い

VirtualBox上で動作させているせいもあるだろうがCPUを使いまくる上に、それなりにイライラできるレベルでもたつく。
Mac Book Airのファンも唸りっぱなしである。

まとめ

VirtualBoxがWindows8.1対応したとはいえ、Mac Air + VirtualBox + Windows8 な環境はかなりフラストレーションが貯まる。
どうしてもWindowsじゃないと動かないアプリがあるとかじゃない限り、おすすめできない。



PlanexのMZK-EX300D(WiFi中継器)を使ってみた感想

部屋にある複数のネットワーク危機がありまとめて無線化したかったため、約半年くらい前にMZK-EX300Dを購入して使っていたので、使用した感想をまとめてみる。

無線使用のPS3と共存が面倒

対応している無線の暗号化方式がPS3と異なることが原因で無線接続のPS3と共存するための設定に苦戦した。
PS3はAESという方式にだけ対応しており、MZK-EX300DはTKIPという方式にだけ対応している。
このため、ルーターは両方の方式に対応するために仕方なく、2GHzのバンドをAES、5GHzのバンドをTKIPで接続できるように設定しなければならなかった。
たぶん、初心者の方にはこういった設定は辛いだろう。
無線ルーターの種類によってはそもそも対応できない可能性すらある。
いまどきTKIPしか対応していないMZK-EX300Dにかなり問題があると言える。

長時間使用しているとときどき停止する

特に高負荷をかけていなくても、ときどき停止する。
すべてのランプが完全に表示されたままになり、アダプタを抜いて再起動すると直る。
徐々に頻度が上がっているように感じられ、最近は1~2日に1回くらいの割合で発生。

動作していれば快適

ルーターまではドア2枚を隔てており、直線でも7~8メートルくらいあるが、快適に通信が行える。

まとめ

動作不安定なので、他がどうであろうとおすすめできる製品ではない。
良いレビューも悪いレビューもそれなりにあるみたいで、安定度には個体差があるのかもしれない。
TKIPしか対応していないのも痛すぎる。



2014年1月8日水曜日

CSS3のrotateY/rotateXをするとマウスオーバーの判定ができなくなる問題

rotateY()した要素のマウスオーバー判定がおかしい

CSS3でY軸回転させた要素をマウスオーバー時に回転を戻すという処理を行いたかったのだが、どうもrotateY()で回転させた要素に対してマウスオーバーの判定がうまくいかない。
まったく効かないのではなく、回転によって奥側になった部分だけ判定が効かない。
また、Firefoxではこの問題が発生しない。

下記のコードで再現できる。

再現HTML
<div id="container">
    <div class="rect"></div>
</div>

再現CSS
.rect {
    display: inline-block;
    background-color: red;
    width: 200px;
    height: 200px;
    -webkit-transition: -webkit-transform 0.2s;
    -webkit-transform: perspective(300px) rotateY(30deg);
}
.rect:hover {
    -webkit-transform: perspective(300px) rotateY(0deg);
}

translateZ()とscale()で無理やり解決

どうもwebkitの動作でZ座標が0以下の要素にはマウスオーバーの判定が発生しないよう。
仕方ないのでtranslateZ()で回転しても要素のz座標がすべて0以上に収まるように要素を移動し、scale()でサイズを調整することで対応した。

修正後のCSS
.rect {
    display: inline-block;
    background-color: red;
    width: 200px;
    height: 200px;
    -webkit-transition: -webkit-transform 0.2s;
    -webkit-transform: perspective(300px) rotateY(30deg) translateZ(100px) scale(0.8);
}
.rect:hover {
    -webkit-transform: perspective(300px) rotateY(0deg) scale(0.8);
}


2014年1月4日土曜日

やっぱりJavaScriptが流行っている

JavaScriptが使いやすい言語とは思えないけれどやっぱり流行っている。

GitHubのトレンドリポジトリにおける言語別の内訳

JavaScript: 9
C/C++: 3
Objective C: 3
Ruby: 2
Lua: 1
Go: 1
(2013/1/4)

圧倒的にJavaScriptが多い。

https://github.com/trending

こんなニュースも

PayPal社がバックエンドをJavaからJavaScriptへ移行