コンピュータやソフトウェアのあれこれ@道民(&元道民)
irasally
This user hasn't shared any biographical information
Homepage: http://twitter.g.hatena.ne.jp/irasally/
Posts by irasally
実践アジャイルテスト読書会 01に参加しました
2月 23rd
2月20日(月)に開催された、実践アジャイルテスト読書会 01に参加しました。
今回から始まった読書会、どのようなものかというと(ATNDより)
- 「 実践アジャイルテスト 」をベースにテストに関して学ぶ
- 勉強会の中では書籍の読み合わせ(輪読)は行わない
- あらかじめ該当の章を読み進めて来ることが前提(書籍の購入は必須)
- 担当者が予習して文書(sphinx)にまとめておきそれを元に発表していく形式
大学時代のゼミを思い出します。
1回1回が結構ヘビーになりそうです。
(Head First JavaScript読書会もあるし、アジャイルサムライ読書会もあるし…)
ただ、第1回と第2回は概要についての話になると言う事で「書籍購入不要」。
本を購入せずにどのような勉強会か空気をつかもうと思い参加しました。
まぁ、書籍を持っていなかったの、私だけだったんですけどね…。
アジャイル開発の中でのテスターの重要性
今回の範囲は「1.アジャイルテストとは?」。
大きく分けて以下の3つについて話をしました。
- アジャイルについて
- アジャイルな現場のテスターの役割
- アジャイルなテストについて
アジャイルについて
アジャイル宣言なども読みながら、何に価値をおいているかを理解する。
- アジャイルの価値 “ごく短いリリースサイクルで、ビジネスの価値の小さな塊を提供すること”
- アジャイルの前提 “チームが個々の役割以上の事をする – 職能横断的”
- アジャイルで重要なことは “スピードではなく、高い品質を提供し続ける事”
他の読書会などでも考えていることなので、大きなずれはありませんでした。
スピードではなく高い品質のものを提供し続ける事が大事、と言う部分は絶対に忘れてはいけない。
アジャイルな現場のテスターの役割
チームが個々の役割以上の事をする中で、テスターとはどのような位置づけになるか。
- テスト以上の事をしなければいけない
- バグを見つける事を第一目的とするのではなく、「製品をよくする」為に改善点を探す事を一番大事にする
- テストの中で得られた情報を元に、よりよい方向に “テストを変化させる”
- テスターはお客さんとプログラマの橋渡しができる立場にいる
- テスターの仕事は、顧客がイテレーション毎に実現したいことは何かを顧客が言えるようにすること
ソースコードのテストはプログラマも行う事が多いですが、それによりテスターのやる事がなくなるわけではなく、もっとさらに高い次元のテストを行える事を喜ぶべき、と書いてありました。
プログラマーであっても、テストをする時はテスターの帽子をしっかり意識しないとな。
アジャイルサムライ読書会では開発者各自がどのようなポジションでどのような事をやるかまでは突っ込んでは書かれていない(心構えやチーム作りの話が多い)ので、具体的な「誰はどのような目的でどんな事をやる」というのを整理できたのがよかった。
顧客チームと開発チームの相互作用のベン図はとてもわかりやすかった。
しかし、「顧客がイテレーション毎に実現したいことは何かを顧客が言えるようにすること」って、難しいですね。とてもハードルが高い。
アジャイルなテストについて
アジャイルテストの4象限のうち、アジャイル開発のテスターが行う事は主に「ビジネスに面したテストや要求機能に対するテスト(右上寄り)」となる。
目的は上記テスターの心構えで書いた通り。そのためのテストタイプはたくさんある。
20の質問
今回はその中でも重要になる「探索的テスト」のアプローチを学ぶと言う事で「20の質問」ゲームをしました。
担当者@shuji_w6eさんが頭に思い浮かべたものを、他の人が「Yes/No」で答えられる質問をしながら何かを当てていく(絞り込んでいく)ゲーム。ゲーム?のようなもの。
2回やったのですが、面白かったです。
ちょっと長いですが質問を全部載せてみます。(取りこぼしがあるかも)
<1回目>
現実に存在するか Y
お店に売っているか たぶんN
食べられるか N
自ら動く事ができるか N
さわることができるか N - 触るものじゃない
日本で生まれたものか N
私たちが目にするものか われわれはY 普通の人はN
電気を通す事ができるか N
目に見えるか Y
生き物か N
かべにかかるものか Y かかる時もある
やわらかいものか わからない
光るか N
今日それとかかわったか N
におうか N
カラフルなものか Y カラフルな場合は結構ある
それは絵ですか N 近い
それはホワイトボードか N ホワイトボードに関連する事もある
いろいろなものがまとまっているものか Y
作る事はできるか Y
変化しないものか N 通常は変化する
自分で作った事はあるか Y
アジャイルに関係するか Y する場合もある
それは言語か N
それは工場にあるか Y よくある
それは何かを書くものか わからない
それは何かが書かれるものか Y
それは カンバンですか N 近いけど違う
一般的にあるか 一部の業種の会社にはよくある
一部の業種とは営業か N
一部の業種とは飲食業か N
それは貼る事ができるか Y
それはポスターか N
それがないと使っている人は不便か Y
それは工程表か Y
1回目が終わった時に
「得られた情報を共有しようとする気持ちが足りない、誰が当てるかのゲームではない、チームで当てるために得られた情報から絞り込むというアプローチを考えた方がよい」
と指摘されました。
それをうけてもう一回。
<2回目>
さわれるか Y
食べられるか N
目に見えるものか Y
重いものか 通常はY - 感覚的なものは忘れた方が良い
動くか N
売っているか Y
中に何かを入れるものか Y
どの家庭にもあるものか 通常はY ない家庭もある
独身の家庭にはありますか Y ある場合もない場合もある
それは台所にあるか Y ある場合もある
もつ/もたないは所得に関係するか N
子供がいるかどうかに関係するか N
それでインターネットをする事ができるか N
男性が使うものか N 男性だけのものではない
マンションにあるものか だいたいY
高齢の人が使うものか Y
寒冷地の家庭には必ずあるか Y
沖縄にあるか N 基本的にない ある場合もあるかも
火に関連するものか Y
赤いものか Y 赤い場合もある
冬に使う頻度が上がるものですか Y
それは暖房(ストーブ)ですか Y
「どのような家庭にあるか?」という観点で絞り込みをかけていっているのがわかると思います。
また、1回目に比べてゴールまでの質問数も少なくなりました。
このような感覚やアプローチする方法が「探索的テスト」では必要になるそうです。
なるほどなー。
20の質問ゲームはとても楽しかったです。
皆さんならどんな質問をしようと思いますか?
いろんな人とやってみるとアプローチの方向性が見えて面白いかもしれない。
1回目を終えて
本の内容として、とても高い所を目標にしているので、現実で実現しようと思うと困る所や足りない所がたくさん見えてきそうです。心が折れそうになることもあるようです。
また、本自体も厚く、読み進める事自体がかなり難しそう。
しかも予習必須…! とてもハードな読書会です。
でも、だからこそ、1人でやっても無理なので読書会で学んでいくのが良いのかな、と思いました。
(ということで、読書会中に書籍を購入しました
)
次回もがんばってついていきたいです。
第14回アジャイルサムライ読書会 @札幌道場 開催
2月 15th
第14回アジャイルサムライ読書会 札幌道場を開催しました。
参加者は9名。いろんな方向の話をまとめるのは難しいなあーと感じた回でした。
今回の範囲で「グっときた」ところ
全員が正しい方向へ向かっているかを絶えず確認できるようにしなければならない
お客さんが隣に座っている
勉強会として
自宅に帰って本を読み返しつつまとめのwikiを書いていて、若干文脈が違うディスカッションがあったかもしれないなと感じました。
「必要な分だけ、必要なときに」分析すること
“そのイテレーションで必要なものだけを分析していたら全体像が見えなくならないかな?”という話題がでました。
ここでいう「分析」がどういうものを示すのかをきちんと考えておくべきだったなあ。
見知らぬ土地に連れて行かれて「君のフィールドはここだ!さあ武器と防具を選んで!」というイメージではなくて、
見知った自分の土地のうち「今回はあの区画を耕そう、そのためには何の準備が必要かな」そんなイメージ。
(あまりに抽象的すぎますが。)
本章Ⅲ部の計画の段階で下地ができていて、それをさらに落とし込むという段階での「分析」だと思うのだけど、この段階では全体像はどこまで共有できていて、どこまで準備できているんだろう。
決して「行き当たりばったり」でも「今までの経験とスキルでなんとかなる」ものでもないと思う。
実際の業務の場合、この段階での「分析、設計」ってどんな事をするのかな。そしてその段階で揃っている情報はどんなものなんだろう。仕様面だけじゃなくて、技術的・アーキテクチャの面はどこまで固まっているんだろう。
この本で文書は不要と言っているかどうか
“会話とちょっとした文章だけで伝わるから文書はそんなに必要ないというのは文書化できない事に対する言い訳じゃないのかな?”という話題がでました。
家に帰って気がついたのだけど、完全に議論の途中で自分が文中から読み落としてしまっていたところがありました。
この本で、同じ机を全員が囲めるような小さなチームに必要はないだろうと言われているのは「形式的な」文書、ですね。
文書そのものが全くなくて良いと言っているのではなく、2,3人のチームでは「基本設計書」「○○仕様書」みたいな形式的な文書を作る必要はないよね、というニュアンスなんじゃないかなと、読み返して感じました。
「形式的な」って原著だとどのような単語になっているのだろう。
重要な事は「全員が正しい方向へ向かっているかを絶えず確認できるようにしなければならない」事。
その方法として文書が必要なチームは必要な文書を作ればいいし、膝を突き合わせてじっくり話し合う事でイメージが共有でき、それでプロジェクトを進める事のできるチームは、話し合いの時の絵や図、カードのメモだけでプロジェクトがうまくすすんでいくんじゃないかなあという個人的な結論に今は至っています。
ペアプロの話
今日はペアプロやってどうだった?得たものは何か?という話ができなかったのでここに書いておきます。
何度かペアプロをして、自分が一番変わったなと思った事は「名前を付ける」事に対する意識です。
クラス名とかメソッド名、パッケージ名(Javaなので)、1人で作っている時はそれなりの名前を付けて終わっていたのだけど、ペアプロをしているときは「本当にこの名前でいいのか」考える時間が増えました。
(そういうペアに恵まれた事が多かったと言う事もあるのかな)
新しいクラスやメソッドを作る、ということはペアプロ中の大きなイベント事なので
「さてどうする」とじっくり話し合うきっかけになる時だったのですよね。
それからは1人でコードに向かう時にも「名前大事」を忘れないようにしています。
みんなはどういう風にペアプロしているのかな、どういう時に困るんだろう。
また今度聞かせてください!
運営の立場で
「適切な話題をきちんとテーブルに載せる」「話をぶった切らない、雑にまとめない」「きちんとした言葉を選んで伝わるように話をする」、とっても難しいなあ。
「この本が本当に伝えたいポイントはどこか」をもっとしっかり考えたいなと思いました。
どうやって進めるのが良いか、14回開催しながらまだまだ試行錯誤中です。
あと今回は時間配分をミスりました。
ちょっと長めの休憩時間を取ったのもあって、途中で終わってしまったセクションには進まなければ良かったかなーと思っています。
実際にどうやってペアプロをやっているか、困った事、ペアプロをやって良かったと思った事、変わった事とかみんなの話を聞く時間を持ちたかった X(
反省点が多い回です。
でも、今回も楽しく充実した時間を過ごせました。
バレンタインデーと言う事で、皆さんにコーヒーとチョコレートを差し入れしました ![]()
(写真を撮るのを忘れたのでありました。ご想像でお楽しみください)
ディスカッションをまとめたwikiはこちらになります。
https://github.com/agile-samurai-ja/support/wiki/Readingagilesamuraiinsapporo20120214
最後に、場所を提供してくださっている弊社に感謝。
(今回はコーヒーもいただきましたありがとうございます)
また次回から頑張りたいです!
Head First JavaScript読書会 01に参加しました
2月 14th
2月13日に行われたHead First JavaScript読書会 01に参加しました。
この読書会は、Head First JavaScriptの決まった章を読んできて、追加説明を交えながらJavasciptを基礎から学んでいく勉強会です。
しょっぱなから今日の範囲(1章と2章)、流し読みで参加してしまいまして・・・苦労しました。
次回からはちゃんと読んでいきます。
知らなかった事いろいろ
へえ!そうなんだ!と思った事色々を箇条書きにしておきます。
外部ファイルとして定義したスクリプトファイルのキャッシュを適切に制御する
<script type="text/javascript" src="hogehoge.js?20120102"></script>
ファイル名の後ろに任意の文字列をつける事ができる。
内容を変更したタイミングで末尾の文字列を変えると別ファイルとして認識されるのでキャッシュクリアされる。
あと、scriptタグは外部ファイル定義するときも /> で閉じてはいけない。
prompt
使った事なかった・・・。
constで定数定義、遅延初期化はできない
const A; A = 10; alert(A); // undefined
こんな形で使う事ないけど、しらなかった。
constで定義した定数のスコープってどうなるんだろ。
+演算子のルール
前から評価、前から型を推測。
1 + 2 => 3 "1" + "2" => 12 1 + "2" => 12 1 + 2 + "4" => 34 "1" + 2 + 4 => 124 true + 3 => 4 false + 3 => 3 true + true + "3" => 23 true + "3" => "true3"
parseIntとisNaN
isNaNの方が数値の定義が厳しい。
isNaN("200aaa")
=> true
parseInt("200aaa")
=> 200
parseIntとN進数
0が先頭だと8進数、0xが先頭だと16進数に勝手に解釈される。
文字列から適切な進数に変換するためには第二引数を指定する。
parseInt("077")
=> 63
parseInt("077", 10)
=> 77
ルート、ノード、リーフ、エレメント
(この辺はもう頭が沸騰していてアレでした)
親がルート、末端がリーフ、それぞれがノード≒エレメント。
エレメントのidは重複しちゃだめ、絶対。
今日の発見、ここまで。
—–
学ぶ形式の勉強会、仕事終わりだとなかなかハードですね。
アジャイルサムライ読書会や達人プログラマ読書会とは違った部分の脳を使います。
終わり30分前くらいにはぐったりしていました(電池切れ)。
体力つけないと、と感じた勉強会でもありました。
次回、リベンジできるかな。
Ruby勉強会@札幌-22に参加しました
2月 13th
2月11日に開催されたRuby勉強会@札幌-22に参加しました。
今回はオーストラリアよりアンドリュー グリムさんを迎えての勉強会でした!
初めてのRuby読み合わせ
今回は6.3.5 for式からでした。
覚えたこと
6.3.5 for式
for と each のスコープの違いについて。eachはブロック内で定義した変数のスコープはブロック内だけだけど、forの場合はブロックの外側でも変数を参照できる。
for i in [1,2,3] do a = "hello" end puts a // できる
[1,2,3].each do |i| b = "hi!!" end puts b // NameError: undefined local variable or method `b' for main:Object
このため、ループ内でlumbdaを定義した時の実行結果も変わる
a = []
for i in [1,2,3] do
a << lambda{puts i}
end
a.map{|e| e.call}
--
3
3
3
b = []
[1,2,3].each do |i|
b << lambda{puts i}
end
b.map{|e| e.call}
--
1
2
3
こうして比べてみるとiが定義されている場所が違うんだな。なるほど。
みんなforはほとんど使わないみたいだった。
6.3.6 イテレータ
rubyにはいろいろな繰り返し処理の方法がある
- loop: 無限ループを提供
- n.times: n回繰り返す
- n.upto(m): nからmまでカウントアップ
- n.downto(m): nからmまでカウントダウン
- n.step(m, x): nからmまでxずつ増やす/減らす
カウントアップとカウントダウンは n < m (upto), n > m (downto) となっていないと実行されない。
6.3.7 脱出
break, next, redo.
Javaのbreak + ラベルを使う話がでました。実際ラベルを使った事がほとんどなかったのですっかり忘れていました。
ループを一気に抜けるため、にあるのかな?つかわないけど。
pythonの loop else は何のためにある?という話題もでました。
次回は6.4例外処理からです。
アンドリューさんのお話
[1,2,3].map(&1.method(:+))
という書き方ができるよ、と言う話。
関数の部分適用というらしい。
["9","1","2"].map(&method(:Integer)) => [9, 1, 2]
class MyClass
def to_proc
puts "to_proc called"
Proc.new{puts "doing something"}
end
end
m = MyClass.new
1.times(&m)
--
to_proc called
doing something
こんな順番で説明をしてくれました。
1というオブジェクトの+メソッドを[1,2,3]に適用させている。
・・・・ようなのだけど、話を聞いている時はなるほどと思っていたのだが、難しくて説明できません。
誰か教えてください(;_;)
source_loactionの使い方とto_iとmethod(:Integer)の違いは理解した。
"a".to_i => 0
Integer("b")
// ArgumentError: invalid value for Integer(): "b"
懇親会
また次回もよろしくおねがいします!
WordPressのユーザープロフィールにアイコンをセットする方法
2月 13th
前回の開発オフで教えてもらったことをメモ。
WPでは管理しているユーザーにアイコンをセットすることができるようである。
Wordpress3.3になってから(?)ダッシュボードの右上に「こんにちは、iarallyさん!」という表示が出るようになって、デフォルトアイコンなのが気になってきた。
そこで、いつものオムライスに変更…しようと思ったら、アイコン写真をアップロードする場所がない。
プラグイン必要なのかなーなんなのかなーと思っていたら、Gravaterと連携しているのでGravater設定をすればOKであるということを教えてもらいました。
対応としては次のどちらか。
- ユーザープロフィールの「メールアドレス」欄に、Gravaterで登録しているメールアドレスを使う
- WPのメールアドレス欄で使用しているアドレスでGravaterに登録する
あっという間にこのブログでもオムライスを表示できるようになりました。
@webbingstudioさん、@makiesさん、ありがとうございました!
第25回北海道開発オフに参加しました
2月 7th
2月4日(土)に行われた第25回北海道開発オフに参加しました。
人数が多すぎなかったこともあり、やりたいと思っていたことを集中してやることが出来ました。
当日やったことは次の3つ(実質2つ)です。
はじめる!Rails3を読みながら体系的にRailsを学ぶ
Railsのソースを見たり、機能を追加したり、修正したことはあったのだけど、ゼロから環境を作ってじっくり理解しながら学習したことがなかったので、本を読みながらプロジェクトを作っています。
開発オフでもその続きをやっていました。
自分の環境はRails3.1で開発しているのだけど、本書はRails3.0。そんなに大きな違いはないだろうなと思っていたら、結構違った。
しかし、 『はじめる!Rails3 (1)』をRails 3.1で読み進めるときのポイント というピンポイントで自分が困っていたことをアウトプットしてくれている記事があり、大きく躓かずに進むことが出来ました。
プロジェクトはgitで管理していて、練習問題はGitHubにもおいておくことにしました。
(途中で投げ出さないようにするため)
コミットの頻度や意味のあるまとまりでコミットすることを意識して進めました。その結果
git commit --amend git reset
などのコマンドを覚えることができました ![]()
さらに、git関連のエイリアス設定も充実してきた。
データ投入までできたので、次はデータ表示だー。
マシン起動時にMoinMoinDesktopを起動させるスクリプトを作る
ローカル環境のメモとしてMoinMoinDesktopを使っているのですが、MacBookのPythonのバージョンが上がってしまい、起動エラーが出ていました。
なので、
- Pythonのバージョン指定をしてWikiサーバーを立ち上げる
- ターミナルのログコンソールが立ちっぱなしにならないようにする
スクリプトを作りました。
#!/bin/sh nohup /usr/bin/Python2.6 /Users/xxxx/Develop/moin-1.9.3/wikiserver.py &
この前覚えたnohup。これでログは外部ファイルに記録されるはず。
この.shファイルを右クリックしデフォルトの起動アプリケーションをターミナルにしたうえで
このアプリケーションで開く → ターミナル
システム環境設定 → ユーザーとグループ → ログイン項目
に追加すればOK。
まだ1回しか再起動していないのだけど、うまく行っている模様。
3ヶ月以上放置していた気になることが1個すっきりしました。
もろもろ
ソースコードをEmacsで書きながら覚えていないショートカットを調べて使うなど。
(プラグインには手を出せていない。)
gitにマシン名(本名漢字)でコミットしてしまったソースをGitHubに上げてしまい、本名でググるとソースが出てくる件の修正は
途中まで調べたのだけど完了せず。
あとはみなさんとのおしゃべりて
- よい技術書の選び方
- XSSについて
とか話せたのは良かったなー。
お昼ごはんはsuage+のスープカレー、ハニーマスタードチキンとアボカドの辛口。
ということで、今回も楽しかったです!次回も楽しみです。
mavenで実行可能なjarファイルと依存ライブラリを含めたzipアーカイブを作成する
2月 2nd
以下の条件を満たすアーカイブを作成したいなーという状況が発生したときのmaven設定を忘れないように残しておく。
- コマンドから java -jar で実行可能なエントリーポイントを含むjarを作る
- 上記jarで必要なライブラリ類を同包したアーカイブを作る
外部に依存することなくエントリーポイントからの処理を実行する事が目的。
使用するプラグインは maven-jar-plugin と maven-assembly-plugin。
maven-jar-plugin
jarファイルのManifestファイルを設定することができる。
Manifestファイルを作成しておくことで、メインクラス(-jarで実行する際のエントリーポイント)を指定することができる。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>sample.hoge.Main</mainClass>
<addClasspath>true</addClasspath>
<addExtensions>false</addExtensions>
<classpathPrefix></classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
mainClass: メインクラスをフルパスで
addClasspath: pom.xml の dependenciesをクラスパスとしてマニフェストファイルに出力するか否か
addExtensions: pom.xml の dependenciesの拡張情報もマニフェストファイルに出力するか否か
classpathPrefix: addClasspathがtrueの場合にクラスパスにつける接頭語(lib/とかext/とか)
maven-assembly-plugin
配布用のアーカイブを作成するためのプラグイン。
必要なライブラリのjarも含めたアーカイブを作成するように設定すれば、外部に依存しない完結したアーカイブファイルを作成できる。
<pom.xml>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<finalName>batchfile/hogetarou</finalName>
</configuration>
<executions>
<execution>
<id>make-sample-batch-zip</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
finalName: 出力するファイル名 targetディレクトリからの相対パスになる。
executionタブでの設定は packageフェーズに assembly:single の実行を含むための設定です。
こうしておけば、mvn assembly:single を直接実行しなくても、mvn package 実行時にアーカイブができる。
デフォルトのアーカイブ形式は以下。
- bin: バイナリ配布用のアーカイブ
- jar-with-dependencies: プロジェクトと依存するライブラリをまとめた 1 つの JAR ファイル
- src: ソース配布用のアーカイブ
今回実現したい事は、jar-with-dependencies 形式を指定すれば実現できそうなのだけど、親モジュールとの関係で独自形式でアセンブリの設定をすることに。
依存関係の断ち切り方を時間内で発見する事ができなかったのです(assembly-plugin を使う場合、アセンブリファイルの配置が必須になってしまっていた)。※
独自形式でアセンブリの設定をする場合は pom.xml の他にアセンブリ記述子を配置する必要があります。
アセンブリ記述子はデフォルトで src/main/assembly 配下に置くことになっています。
<executable.xml>
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>sample</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
<scope>runtime</scope>
<outputDirectory>output/</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
output というディレクトリ内にdependencyとMainのjarを含めたzipファイルを作成しますよ、という設定。
上記を設定で maven package を実行すると
- target/batchfile/hogetarou.zip ができている
- hogetarou.zipをunzipするとoutputというディレクトリが展開される
- outputのなかにはMainのjarと依存ライブラリのjarが同列に格納されている
- java -jar [Mainのjar] でプログラムが実行される状態になっている
と、なりました。
この記事がとても良くまとまっていて、自分が作成した方法以外も勉強になりました。
Sacrificed & Exploited – Mavenで配布用zipファイルを作成する
http://d.hatena.ne.jp/cnaos/20100102/1262430319
今後、m※の部分をなんとかできそうだったら、なんとかしてみたいと思います。時間があれば。
その他、四苦八苦している際に参考にさせてもらったサイト
ありがとうございました。
http://www.in-vitro.jp/blog/index.cgi/Maven/20060215_01.htm
リモート接続が切れてもプログラムの実行を続ける nohup
2月 1st
未来の自分へ。
リモート接続しているサーバー上でバッチジョブを実行する際に、
$ java -jar batch.jar &
と、ただジョブをバックグラウンド処理にするだけではssh接続が切れる or ログアウトするとジョブが終了してしまう。
nohupコマンドを使うと、ジョブをプロセスとして管理することができるので、ログアウト後も処理が続行する。
$ nohup java -jar batch.jar &
コマンドを実行したディレクトリに nohup.out ファイルが作成され、処理中に出力されたメッセージは全てnohup.out に書き込まれる。
nohup.outは追記型なので、同じプログラムを複数実行する場合(テスト中など)は、実行前にnohup.outを消す/移動させるなど対応しておいたほうがよい。
nohupを忘れて時間のかかる処理を実行すると、接続切れないから身動きが取れなくなる(経験談)ので注意する。
コマンドの前にバックスラッシュをつけるとエイリアスを無効にできる
2月 1st
きっといつかまたはまるので、未来の自分に向けて残しておく。
あるデータをフォルダごと上書きコピーする必要があった。
$ cp -rp soure target
バックグラウンド処理にしたいから上書き確認を無視(強制上書き)するために -f オプションを付ける
$ cp -rfp source target
しかし、上書き確認が消えない。
CentOS系のOSの場合、エイリアス設定で -i オプションが付いているらしい。
確認
$ alias alias cp='cp -i'
以下のように書くといいとたくさんのサイトに書いてあった。
$ \cp -rfp source target
できた、できたけど、なぜなのか。気持ち悪いので理由を調べる。
\(バックスラッシュ)をつけてコマンドを実行するとエイリアスを一時的に無効にできるんですね。
しらなかったー、しらなかったー。
参考にしたサイト
http://jehupc.exblog.jp/13355017/
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/214dsblalas.html
CentOSにRubyOnRailsを導入したときにハマったところまとめ
2月 1st
達人出版会から出ている「はじめる!Rails3」を読みはじめました。
基本的に開発はMacで行うのだけど、自鯖があるので環境構築だけでもやってみようと挑戦したところいろいろハマりました。(よって今日は眠い)
環境
CentOS release 5.7 (Final)
ruby 1.9.3p0 (2011-10-30 revision 33570) [i686-linux](rvm使用)
ここに「はじめる!Rails3」通りにサンプルが実行できるよう環境を整えていきました。
sqlite
サンプルアプリ用のDBインストールでいきなり躓く。
$ sudo yum install sqlite3-devel Loaded plugins: priorities, security 144 packages excluded due to repository priority protections Setting up Install Process No package sqlite3-devel available. Nothing to do
・・・ない。
sqliteはあるけど、sqlite3はいない。
SQLite/Rubyライブラリにはsqlite3.6.16以上が必要なのだが、yumではsqlite3.3.6以上はインストールできない事が判明。
ということでSQLiteのサイトからソースコードでインストール。
CentOSの場合は「sqlite-autoconf-3071000.tar.gz」を使いました。
# wget http://www.sqlite.org/sqlite-autoconf-3071000.tar.gz # tar xzvf sqlite-autoconf-3071000.tar.gz # cd sqlite-autoconf-3071000 # ./configure # make # make install
一発で成功したー。(珍しい・・・)
ブログ「俺の作業録」を参考にさせて頂きました。ありがとうございました。
http://d.hatena.ne.jp/pirosikick/20101103/1288796756
Bundlerが使えない
gem install rails でrailsはすんなりと入った。
その後、いざ、railsアプリを作ろうと
$ rails new hinagiku
と打ったところ、何やら末尾に大量のエラーが…。
とりあえず、動くかどうかやってみようと動かしてみたところ、やっぱり動かなかった。
エラー出てたもんね。
$ rails server Could not find jquery-rails-2.0.0 in any of the sources Run `bundle install` to install missing gems.
必要なライブラリがないからbundle installをしなければいけない。
(bundlerはこの前のえにしテックカフェで知ったよ ・∀・)
$ bundle install Fetching source index for https://rubygems.org/ (略・・・)LoadError: no such file to load -- openssl (ずらずらずらとライブラリのインストールエラー)
これ、rails newした時に出ていたのと同じエラーである。
なるほど、rails new したときにbundle installしようとしてコケていたのか。
ライブラリがインストールできていないのだけど、元をたどれば「opensslがない」と。
調べてみたら、rvmでrubyをインストールする場合、opensslのオプションを付けてあげる必要があることがわかった。rvmのサイトを見ながらrubyをreinstallして解決。
$ rvm pkg install openssl $ rvm reinstall 1.9.3 --with-openssl-dir=$rvm_path/usr
このあとbundle installしたら問題なくライブラリのインストール、紐付けが行われた。
期せずしてはじめてのbundle installコマンド。
ちなみに、上記はrvmで管理しているRubyのどれかのバージョンで1回やれば大丈夫みたい。
1.9.3でrails環境を作ったあとに、rvmにインストールした1.9.2(opensslの指定なし)でrails環境作ったときにはエラーにならなかった。
JavaScriptエンジンがない?
これでサーバーは立ち上がる・・・はず・・・!
rails server は rails s でも実行できるのね、ふmふm。
$ rails s (略)/lib/ruby/gems/1.9.3/gems/execjs-1.2.4/lib/execjs/runtimes.rb: \ 45:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.
JavaScript runtimeがない、のか。
調べてみたところ、Rails 3.1 から内部で CaffeeScript を使うようになったことで、実行時にJavaScriptランタイムが必須になったようです。
railsアプリケーションフォルダ直下にあるGemfileに
gem 'therubyracer'
を書いてbundle install。
これでRubyで使えるv8インタプリタのtherubyracerが入りましたー。
node.jsでもよかったみたい。
Macにはnode.jsが入っていたから特にエラーにならなかったのかな。
参考にさせてもらったサイト
http://d.hatena.ne.jp/kano4/20110708/javascript_runtime_error
http://d.hatena.ne.jp/kano4/20111201/javascript_runtime_error_part2
http://blog.glidenote.com/blog/2012/01/07/rails3.1-could-not-find-a-javascript-runtime./
http://www.ruby-forum.com/topic/1899392
上記を乗り越えて、自鯖でrails構築ができるようになりました!
rails sを実行してから、自鯖で開発していたらrails sしても外から簡単にアクセスすることができないじゃないと気がついたりはしたのだけど、環境構築は繰り返して勘を掴んでいくのが慣れる近道なのかも。
ちなみにMacで同じ環境を作ったのだけど、1つも躓くことなくサクっと環境が出来上がりました。
開発や学習はMacメインでやっていく予定です。

