コンピュータやソフトウェアのあれこれ@道民(&元道民)
Programing
第11回北海道情報セキュリティ勉強会に参加しました
5月 21st
5月18日(土)に開催された、第11回北海道情報セキュリティ勉強会(せきゅぽろ)に参加しました。
今回のテーマは「クラウドのセキュリティ」。
当日朝まで参加を迷っていたのですが(寝だめしたくて…)、セキュリティについての根本的なところの話が聞け、参加して良かったと思えました。
セキュリティとは科学である
株式会社ディアイティの河野省⼆さんがいらっしゃり、3部構成でセキュリティのお話を聞きました。
- 情報セキュリティの現場力・使えるスキルと⼈材像
- クラウドサービスにおけるセキュリティ
- 最近のいろいろなセキュリティの話題
「情報セキュリティは目的ではなく手段である」「ISMSを取得するための情報セキュリティ対策ではなく、真に会社に必要な対策を考えるべき」「利用者の意識を向上させるのではなく、システムで何ができるかを考えるべき」・・・などなど、出てくることが目から鱗の言葉ばかりでした。
特に今まで勘違いしていた(というかそういうもんだと思っていた)ことで、ハッとなったのは次の3つ。
- 社で許可されたUSB以外の外部メディアをPCに接続するのを禁止するのはウィルスが入り込まないようにするため?
→ 否。ウィルスからの保護はウィルスソフトがやればいい。本来の目的は残存データが漏れないようにするため
(USB上のデータは初期化しても消しきれない、復元できる可能性がある) - 大事な書類をメールに添付する危うさ
→ 上司があるファイルに必要事項を入力して返信するよう、5人の部下に書類を添付してメールを出したとする。
この場合最終的に、マスタファイル(1)、上司の送信フォルダ(1)、各部下の受信フォルダ(5)、各部下のマシン(5)、各部下の送信フォルダ(5)、上司の受信フォルダ(5)、上司のマシン(5)合計27ファイル、つまり26ファイルものデータコピーができる。
データコピーができればできるほど、漏洩のリスクが高まるわけなので、共有サーバーやクラウドの利用などで適切に管理するべき。 - メールで重要書類を送る時は、ファイルを圧縮して暗号化し、送信メールとは別便でパスワードを送りましょう
→ 別便でパスワードを送ることに何の意味もない。だって同じNW上じゃない?POPメールなら1つのデータになることもあるよ。(金庫を盗まれた道を鍵を持って歩くようなもの。泥棒は待ち伏せしているだけでよい。)
この場合、パスワードはメール以外の手段で伝えたり、送り先と共通の認識(相手先の会社の電話番号など)をパスワードにするよう取り決めておく方が有効。
どれもやっていることだなあと。しかも何も疑問に思っていなかった。
特に2番目。クラウドなど外部にデータを預けることは危険・禁止となる風潮が多いけれど、ファイルが大量にコピーされるという脆弱性がメールにはあるのだということを恥ずかしながら意識したことがなかったなあ。
適切にログが取れて、管理権限も調整できる共有サーバーやクラウドの方が脆弱性は少ないのですね。
禁止は何も生み出さない
「○○してはいけない」というルールを生み出すことが情報セキュリティではない。これも目から鱗。
どうしても「あれもできない」「これもできない」「これも禁止された」「セキュリティって面倒」となってしまう事が多いので…。
これは「情報活用のための情報セキュリティ」について考えられていないから。
ISMS取得のためであれば、禁止を増やし続ければよいのだろうけれど、新しい事をはじめる・次の時代の事を考えるときに禁止は足かせにしかならない(「一つでも禁止事項があればそれに足を引っ張られて新しい事が導入できない」)。
「してはいけない からの脱却」のために、正しい知識を持った情報セキュリティマネジメントができる人が必要なのですね。(SSCPという資格があるよ!)
クラウドのセキュリティ
「クラウドを利用してリスクがないわけがないじゃないか、でも、リスクがあるからと言って利用を禁止するのはもっと馬鹿」
という最初の言葉が印象的でした。
大事な事は「免疫力を高める」こと(風邪をひくからどこへも行かない?体力つけてどこかへ出かける方がよくない?)。
そのためにはクラウドの特徴を知って、メリットデメリットをきちんと把握する事が大切。
どのようなリスクマネジメントをするかは、その会社・組織に応じた適切な方法や範囲を選択する事になる。
だから資料を参考にしてどーんとは決めきれない事も多い。
そのために中小企業向けのチェックリストなどを作って配布しているようです。
また、ガイドラインは参考程度にとどめておく事も重要。ガイドラインを丸写ししてもリスク対策はできない(「知識を集約するだけではよいものは作れない」)、現場に合わせて息を吹き込む事が大事。
この辺りはプロジェクトマネジメントなどとも似ているなあと思いました。
どちらも人間が関わる、組織によって文化的背景が違う、生のもの。
最近のセキュリティ色々
興味深かったことを箇条書きに。(3部は力尽きていてメモも少なかった・・・)
- アンチウイルスソリューション
クラウド型(ソーシャル型)であれば、ゼロデイ攻撃にも対応できる可能性があるかも?!集合知。 - 標的型攻撃の判定にクラウドを使う
クラウド型(ソーシャル型)であれば、自社が狙われているのか皆狙われているかわかる。 - 結局スマートフォンもガラパゴス化している
Androidのバージョンだけじゃなく、各機種にデフォルトアプリが色々入ってるー。 - スマートフォン対策が大変だけど重要になる
クラウド系のアプリってブラウザだけじゃなくAPIもあるよね?つまりAPIやアプリのレベルでの対策を講じる必要がある。
技術が高度になった分、その辺りの対策は大事になる。
—-
自分のメモ+当日配布いただいた資料で思い出しながら書いてみました。
こうやって、まとめてみると濃いですね。
冒頭に書いたセキュリティについての意識、これが変わったのが一番大きいです。
普段の行動の目的を考える事ができるようになった。
例示がわかりやすい
全体を通して、途中途中で出てくる例示がとてもわかりやすかったです。
例えば
「今財布の中に入っているお金が1円/10円/100円/1000円単位でわかる人?」(それぞれに手を挙げる)
「お財布の中身を1000円単位でしか把握できていない人は10円、100円がなくなってもたぶん気がつきません」
「=セキュリティを高めるには、きちんと管理できている事が重要になります。」
という例。なるほどー!!と思いました。
おやつ
和菓子、和菓子たっぷり。

お団子も柔らかくて素敵でしたが、ここの豆大福、美味!
IT勉強会スタンプラリー
全国規模で行われている勉強会のスタンプラリー、IT勉強会スタンプラリーにせきゅぽろが参加している、ということで、記念すべき1つ目のスタンプを押しました。

北海道では、せきゅぽろ、CLR/H、LOCAL PHP部がスタンプ対象の勉強会です。
「違う勉強会に3回」か「同じ勉強会に3回」で何かもらえるみたいです。
行ったことのない勉強会ばかりだけど、スタンプを押すために参加してみようかなぁ。
面白そうな内容の勉強会があったら飛び込んでみよう、と思いました。
2012年3月31日から1年間で始まっているこの試み、次回はもっと北海道でも参加する勉強会が増えたら上位を狙えて楽しいですね!
Head First JavaScript読書会 06に参加しました
5月 10th
5月7日(月)に開催されたHead First JavaScript読書会 06に参加しました。
GW明けの月曜日というハードな日程でしたが、無事、乗り切ることができました。
今回はFormのバリデーションと正規表現についてです。
Formのバリデーション
Formとは何ぞや?というところから、httpリクエストの話、httpメソッドの種類(GET, POST, PUT, DELETE, OPTIONなど)について一通りざくっとおさらいしました。
その後、Formデータの取得の仕方、バリデーションが大事な理由などについて話しました。
バリデーションの意義について、313ページには「本当に検討なアプリケーションになるとサーバー上でもデータ検証を行います」と書いてあるけれど、安全のためにはむしろサーバーサイドでデータ検証を行うべきだよなあという話をしました。
何度もサーバーとやり取りをするのもイライラするからちょっとした入力ミスを防ぐことができるよう、Javascriptの制御を入れておく、本当のデータチェックはサーバーサイドでやる、のが良い形なんじゃないだろうか。
安全のためのチェックはサーバー上で行い、クライアントサイドのバリデーションはユーザービリティ向上のために行う、というように目的を分けるという観点はとてもしっくりきました。
正規表現
本書では
- 必須チェックをしたい
- 桁数チェックもしたい
- 数字以外は入力してほしくない
- メールアドレスの形式じゃないものは受け付けたくない
というように、バリデーションのケースがだんだん複雑になってきたところで、正規表現が登場しました。
(よりによって、メールアドレスの正規表現を例に出さなくてもという話はちょっとでましたが)
Javascriptの正規表現は//で囲んで書きます。
"Hello World".match(/^\w{5}\s\w{5}$/)
---
[ 'Hello World', //マッチした
index: 0,
input: 'Hello World' ]
"Hello World".match(/^\w{7}\s\d{5}$/)
---
null // マッチしない場合はnullが返る
グルーピングは()で行うことができます
"Hello World".match(/^(\w{5})\s(\w{5})$/)
---
[ 'Hello World', // マッチした文字列
'Hello', // グループ1番目
'World', // グループ2番目
index: 0,
input: 'Hello World' ]
match関数ではなくRegExpオブジェクトを生成することもできます。
本書では自動的に生成されたRegExpオブジェクトを使う方法が載っていました。
var regex = /^\d{5}/
regex.test("12345")
正規表現はとても便利で、ある程度はできるようになっておきたいし、読めるようにしておきたい。
便利さを感じるようになってから読んだり書いたりを積極的にするようになった。
(正規表現使うたびにgoogleで量化子やメタ文字のリファレンスを探しているので、まだまだですが)
だけど、使いすぎると自分自身も後からメンテナンスが辛くなってくることがあるから、どこまで厳密にチェックするかも含めてさじ加減が大事かもしれないなぁ。
第26回北海道開発オフに参加しました
4月 3rd
3月31日(土)に行われた第26回北海道開発オフに参加しました。
なかなか自分のやりたいことにまとまった時間を取る事ができなかったので、まったりと有意義に過ごす事ができました。
シェルスクリプト事始め
Software Design 2011年3月号に載っている「シェルスクリプト事始め」の第一部を読みながら、シェルスクリプトを書いてみました。
ロジックが必要なシェルスクリプトを書いた事がなかったので、新鮮な気持ちで臨みました。
最終的に書いたのはこんな感じでファイルに実行権を与える事のできるスクリプト。
#!/bin/sh
for file
do
if [ -x $file ]
then echo "$file には実行権があります"
else echo "$file には実行権がありません"
echo -n "実行権を付与しますか?[y/n]"
read answer
case $answer in
y) chmod +x $file
echo "$file に実行権を与えました"
ls -l $file
;;
*) echo "$file は変更されませんでした"
;;
esac
fi
done
echo "$# 個のファイルを処理しました!!!"
気になった事
- 何故 if の終わりが fi なのか?
- 何故 case の終わりが esac なのか?
歴史的背景があるのかなあ。esacは覚えられない。
モチベーション3.0を読む
先日行われたAgileJapan札幌サテライト。その中の基調講演で紹介されていた本、気になったので購入しました。
講談社
売り上げランキング: 1117
手元に届いたのが開発オフの前日だったので、じっくり読みました。
まだ、第1部の途中までです。
今は「目の前に人参をぶら下げられただけでは、人間のやる気が上がらない(むしろ逆効果になることもある)」という話を事例とともに分析していっているあたりを読んでます。
開発オフの最後の発表では本に載っていた以下の2つの例を話ました。
人間は自分の利益になることであれば必ず実行する?
Aさんが1万円をBさんにあげるとします。
そのとき、AさんはBさんに条件をつけました。
- Bさんはそのお金をいくらかCさんに分けなければいけません。
- BさんがいくらCさんに分けるかはBさんの言い値で決まります。
- ここで、Bさんの言い値にCさんがOKすれば、AさんはBさんにお金を払い、BさんはCさんにお金を分けます。
- しかし、Bさんの言い値にCさんがNOと言えば、Aさんはお金をあげません。BさんCさん共にお金をもらえません。
このような条件下で実験を行ったとき、Bさんの言い値が1万円の5〜6割であれば、交渉が成立し、BさんCさん共にお金をもらえる確率は高かったのですが、Bさんの言い値が1〜2割だと、交渉が決裂し、両者ともにお金をもらえないケースが多かったそうです。
ここで、考えたいのはCさんの立場です。
Cさんは元々もらえる予定のなかったお金が手に入るわけですから、割合がいくらであっても「自分の得になる事」のはずです。
しかし、なぜ、1〜2割だと自分の利益をふいにしてしまうのでしょうか。
・・・というようなところから、「人間は利益になる事であれば必ずモチベーションが上がるのか?」という話につながっていきます。
楽しいことか仕事か?
幼稚園児を複数のグループに分け、次のような実験をしました。
1日目。あるグループには「絵を描いたらご褒美をあげるよ」と教えます。そして実際にご褒美をあげます。
別のグループにはなにも伝えず、ご褒美もあげません。
2日目。両方のグループにご褒美をあげません。
そうすると、1日目にご褒美をもらっていたグループの子供達は絵を描く事に対する意欲が少なくなったそうです。
ご褒美をもらっていないグループは2日目も楽しく絵を描いていました。
「報酬が発生する時点で、楽しいと思っていた事も仕事になる、その瞬間、内部からやりたい!と思う気持ちが薄れる?」というところから、モチベーション2.0と呼ばれる現代の「飴と鞭」のシステムのよくない点を分析していきます。
事例はだいぶはしょっているので、詳しく知りたい人はぜひ本を読んでみると良いと思います。
個人的にはこの本は小説と同じ、右開き・縦書きで、非常にしっくりと読みやすいです。
時間をみて読み進めたいと思います。
開発オフ恒例ランチ
今回もスープカレーで。カリー・ディ・サヴォイ Curry Di. SAVOY というお店に行きました。
トマトと湯葉と豆腐のスープカレーです。
湯葉としっかりした豆腐と豆腐ハンバーグみたいなものが入っており、けっこうお腹いっぱいになります。
辛かったのだけど、もう少し辛いのも食べてみたくなりました。
あと、キーマカレー気になった。
スペアリブもかなり気になった。
今回も楽しかったです。30回目指して!ゆるーく続けていきたいですね。
Head First JavaScript読書会 03に参加しました
3月 13th
3月12日(月)に開催された、Head First JavaScript読書会 03に参加しました。
本日は第4章「意思決定」。
if, switch
今回のメインはif、switchといった条件分岐。
条件分岐だけで1章使うのは贅沢…というか、薄く多くといった感じになりますね。
同じ事が繰り返されているので頭に入りやすいです。
javascriptの場合、やっぱりbreakをつけるのが大変&ミスしやすいので、ifを使う事が多いなあ。
「セミコロンはブログラム”文”の終わりにつける」
という考え方はなかったので新しい発見でした。
あと、本に書いていた「ifを繰り返すと効率が悪いからswitchを使う」というのはどの部分の「効率」なのか疑問が残りました。
【ifによる分岐】
var str = "E"
if( str == "A") {
alert("えー");
else if( str == "B" ){
alert("びー");
else if( str == "C" ){
alert("しー");
else if( str == "D" ){
alert("でぃー");
else if( str == "E" ){
alert("いー");
}
【同じ事をswitch文で書く】
var str = "E"
switch( str ) {
case "A":
alert("えー");
break;
case "B":
alert("びー");
break;
case "C":
alert("しー");
break;
case "D":
alert("でぃー");
break;
case "E":
alert("いー");
break;
}
これって、「評価回数」は同じだと思うのだけど、違うのだろうか。
評価回数が同じで、それぞれの評価コストが違う(caseでの評価の方がコストがかからない)、というのであれば納得できるのだけど「(ifの場合)5つのテスト条件が全て評価されるから効率が悪い」と書かれていた所に疑問が残りました。
<< 4/25 追記 >>
後日、この記事を教えてもらいました。納得。
ブラウザによってはswitch文がかなり最適化されているのですね。
現在はブラウザ(のjavascriptエンジン)がかなり高性能になっていてここまでの差はないという話もでました。
演算子、コメント、スコープ
途中で出てきた大事な事としては「各種演算子」「コメントの書き方」「スコープ(グローバル変数/ローカル変数)」の3つ。
コメントについて、コメントは「コードの動きを説明するために」書く必要があると書いてあったけど、どちらかというと「どうしてそう書いたか」を残した方がよいよね、という話をしました。(達人プログラマでもでできた話)
スコープについては「グローバル変数は本当に必要なとき以外は使わない」という方針が大事だなと思いました。
変数のスコープが大きいとどこで何をやっているかわからない不安があるから、スコープは可能な限り小さくしていきたいですね。大風呂敷を広げないというか、責任を持てるコードにするために。
今回の発見
「ゲームブック」という言葉を初めて聞きました。
「ゲームブックの14は死亡フラグ」というのも初めて聞きました。
あと、後輩の子がMacBookProを購入していました。(すごく)羨ましかったです。
Head First JavaScript読書会 02に参加しました
3月 1st
2月27日(月)に開催された、Head First JavaScript読書会 02に参加しました。
予習だいじ
今回は前日に該当範囲を読んでから参加することが出来ました。
やっぱり1回読んでおくことは大事ですね。
随所に散りばめられたユーモアをサクっと流しつつ、内容について話し合うことが出来ました。
どんなユーモアが飛び出してくるか、の耐性をつけておくという意味でも事前予習は大切ですね
今回の発見
今回の範囲は、Webアプリを作ったことがあれば、1度は触れることのあるトピックばかりでした。
びっくりしたのは、eval(関数評価)の考え方が突然出てきたところでしょうか。
eval
Timer.setTimeout("alert('hello!!')", 2000); // 2秒後に"hello!!"とアラートを表示する
この”alert(‘hello!!’)”がなぜ「文字列」なのか。
「文字列」じゃないとどうなるのか。
ブラウザのコンソール上で実験しながら詳しく説明してもらいました。
> var bbb = function(){alert('hogehoge')};
undefined
> bbb
function (){alert('hogehoge')} // 文字列がでる
> bbb()
undefined // 実際にアラートが表示される
メモ:nodeを使ってプロンプト上で確認するときはConsole.logを使う
cookie
Cookie周りのソースは、複雑であることを加味してもサンプルソースがちょっとよくないなと思いました。
もう少し見やすくするためには ‘;’ という区切り文字列を、変数に割り当てるか、
‘;’ で結合するためのfunctionを作るか、もう少し可視性の高いコードにしたほうが良いと思いました。
実際に書いてみたら難しいのだけど。
【before】
var date = new Date(); date.setTime(date.getTime() + (30 * 24 * 60 * 60 * 1000) ); var expires = "; expires=" + date.toGMTString(); document.cookie = name + "=" + value + expires + "; path=/" ;
【after(冗長かも)】
var data = keyValue(name, value);
var date = new Date();
date.setTime(date.getTime() + (30 * 24 * 60 * 60 * 1000) );
var expires = keyValue("expires", date.toGMTString());
var path = keyValue("path", "/");
document.cookie = createCookie([data, expires, path]);
function keyValue(key, value){
return key + "=" + value;
}
function createCookie( params ) {
var val = "";
for(var i = 0; i < params.length; i++ ){
if(i != 0 ) val += ";";
val += params[i];
}
return val;
}
※ 書いていて、”=”もうっとうしい事に気がついた
まあ、ライブラリを使うのが確実だと思います。
次回も予習してちゃんとのぞみたいと思います。
4月に入ったらセクションのナビゲーターを担当したいなと思います。(決意)
Sapporo.el に参加しました
3月 1st
2月25日(土)に開催された、Sapporo.elに参加しました。
同日開催されていた、Sapporo.vimの皆様と共同でまずは自己紹介。
和気あいあいと、自己紹介。
twittering-mode.elを導入する
最初は、「便利なプラグインを導入してみよう」編。
初めてEmacsにプラグインを入れました。
auto-install.el
まず最初は、twittering-mode.elを簡単に入れるため、auto-install.elを導入
インストール
$ mkdir -p ~/.emacs.d/auto-install $ cd ~/.emacs.d/auto-install $ wget http://www.emacswiki.org/emacs/download/auto-install.el $ emacs --batch -Q -f batch-byte-compile auto-install.el
Emacs上でauto-installが使えるよう設定
【~/.emacs】
(add-to-list 'load-path "~/.emacs.d/auto-install/") (require 'auto-install) (auto-install-update-emacswiki-package-name t) (auto-install-compatibility-setup) (setq ediff-window-setup-function 'ediff-setup-windows-plain)
上記を書いたら再起動、または M-x eval-region.
twittering-mode.el
auto-installを使って簡単に入れることが出来ました。
GitHubのtwittering-mode.el を開くのに少し時間がかかりますが、待ち時間に出てくるgithubのアイコンが可愛いからいいです。
M-x auto-install-from-url RET URL (): https://raw.github.com/hayamiz/twittering-mode/master/twittering-mode.el
ファイルがロードされたら C-c C-c
これで M-x twit とすればEmacs上でtwitterができるようになります。
twittering-mode.elの設定もろもろ
Sapporo.elでは上記までで時間いっぱいだったのですが、このままではEmacsを再起動すると
twitを立ち上げることができません。これでは困ります。
ということで、設定を書いていつでもtwitterできるようにしました。
まず、
(´・肉・`)<「.emacsに設定を書くよりも、.emacs.d/init.elに設定を書くのがモダンだぜー」
と言われたので、すべての設定を.emacs.d/init.elに移動。
(.emacsが存在すると.emacs.d/init.elはロードされないから.emacsは消す)
んで、設定を追加
【.emacs.d/init.el】
(require 'twittering-mode) (setq twittering-use-master-password t)
この設定を書いたあとEmacsを再起動し、M-x twit をすると以下のエラーメッセージが出た。
“You need GnuPG and (EasyPG or alpaca.el) for master password!”
全く同じ現象だった twittering-mode更新でOAuth認証 – 君のてのひらから を参考にして、gpgをインストール。
$ brew install gpg
これでバッチリか、とおもいきや、どっこい。
M-x twitがうまくいく時とうまくいかない時がある。(gpgが読み込めたり読み込めなかったり)
調べてみると、Emacsをどの権限で起動しているかによるみたい。
こちらも先駆者がいらっしゃったので twittering-mode.el作者が親切すぎて惚れた – かなりすごいブログ を参考にexec-pathを追加
【.emacs.d/init.el】
;; exec-path config (add-to-list 'exec-path "/usr/local/bin") (add-to-list 'exec-path "/usr/bin")
できた!!できたよ!!
init.elは今後整理していきたい。
Emacs Lispテクニックバイブル 読み合わせ
みんなでEmacs Lispテクニックバイブル の輪読。
Lispって難しそう、という印象しかなかったのですが、輪読しながらゆっくり説明してもらったおかげで、ただのカッコがたくさんある記号にしか見えなかったコードが、少し理解できるようになりました。
皆様ありがとうございます。
Emacsマスターの皆様に手取り足取り教えていただき、あっという間に時間が過ぎました。
とっても楽しかったです!!
第2回が開催されることを期待。
肉さん、主催ありがとうございました。
Ruby Sapporo Night vol.14 に行ってきました
2月 25th
2月23日(木)に開催されたRuby Sapporo Night vol. 14 『Ruby札幌 × Sapporo.js』に行ってきました。
このイベントはRuby札幌がApple Store Sapporoで行っているイベントです。
Ruby札幌の方達の今やっている、気になっている技術のお話を聞けたり、他コミュニティとのコラボ企画で色々な分野のお話を聞く事ができます。
不定期開催、事前登録不要のイベントです。
開催はRuby札幌のサイトやAppleStoreのイベントカレンダーで知る事ができます。
リッチクライアントを中心とするセッションのリンク
前半は、Ruby札幌の島田さんによるセッション
「リッチクライアント時代のWebアプリケーションアーキテクチャパターンについて考える」
”MVC” をキーワードに、従来のMVCとは、そして現代のリッチクライアントに必要なMVCモデルの形についてとお話が発展していきました。
後半はSapporo.jsの佐藤竜之介さんのお話
「Testable JavaScript」
”テストしやすいJavascript” にするためにどのように設計をし、コードを書いていくのが良いか。
Testableにしていくために、MVCモデル(KATA)を考えていく事が大事になると言う話でした。
参加していてとても面白いなあと思った事は、全く違うアプローチから入っていっている両者のお話が、絶妙にリンクしていってたんですよね。
核となる部分に同じ思想があって、それにそれぞれの形で向かっている。
うまく言えないのだけど、すごく気持ちのよいイベントの流れがありました。
あと、お二人のスライドはどちらもお二人の話以外のたくさんの情報が詰まっている。
とってもためになる資料です。公開されている事に感謝です。
リッチクライアントのためのMVC
ちょうど数ヶ月前に「Javascriptのテスト、すごく難しい」と思う事があり、どういう形でテストしていくのがいいのかなーと考えていたので、りゅうのすけ氏のアプローチはとても興味深かったです。
テストツールやテスト用のライブラリの紹介も最後にあったのですが、それよりも「KATA」。
手を加える度に、進歩して行ける開発を!
デスクトップアプリケーションを作った時に学んだ考えも生かしつつ、「良い設計」について考える機会・・・もとい
「良い設計」を意識する気持ちを持つ事ができました。
Javascriptだから、時間ないから無理、と諦めないこと大事。
良い時間を過ごす事ができました。ありがとうございました!
MacBook(Lion)にRabbitが入った
2月 23rd
昨年の11月頃、Rabbitをインストールしようとしていたのですが、エラーがたくさん出て
うまくインストール出来ませんでした。 前半の格闘はこちら。
このあと大きく躓いて、心が挫けてしまったのでした。
そのまま諦めかかっていたのですが、最近試しにやってみたところ、
すんなりインストールすることが出来ました(・∀・)!
OSがアップデートされたからかな。
トライ途中まで書いた状態のものが下書きフォルダに残っていたので
ログの記録として残しておくことにする。
———-
- cairoのインストールでエラーが出る
$ brew install pango ==> Installing pango dependency: pixman /usr/local/Cellar/pixman/0.22.2: 9 files, 1.0M, built in 56 seconds ==> Installing pango dependency: cairo ==> Exit Status: 2 http://github.com/mxcl/homebrew/blob/master/Library/Formula/cairo.rb#L20 Error: Failed executing: make install These existing issues may help you: https://github.com/mxcl/homebrew/issues/7658 https://github.com/mxcl/homebrew/issues/8144 https://github.com/mxcl/homebrew/issues/8491
OSのバージョンが同じだったissueshttps://github.com/mxcl/homebrew/issues/8144 のオプションをつけてみる
$ brew install cairo --use-clang /usr/local/Cellar/cairo/1.10.2: 95 files, 6.6M, built in 110 seconds
キタワー
$ brew install pango /usr/local/Cellar/pango/1.28.4: 129 files, 3.9M, built in 2.3 minutes
すんなり!
- n度めの正直なるか?
$ gem install rabbit checking for gdk-pixbuf-2.0... no
世の中そう甘くはない
$ brew install gdk-pixbuf ==> Installing gtk+ dependency: jpeg /usr/local/Cellar/jpeg/8c: 17 files, 1.4M, built in 37 seconds ==> Installing gtk+ dependency: libtiff /usr/local/Cellar/libtiff/3.9.5: 235 files, 3.5M, built in 44 seconds ==> Installing gtk+ dependency: jasper /usr/local/Cellar/jasper/1.900.1: 33 files, 1.0M, built in 49 seconds ==> Installing gtk+ dependency: ping ==> Exit Status: 1 http://github.com/mxcl/homebrew/blob/master/Library/Formula/gdk-pixbuf.rb#L21 These existing issues may help you: https://github.com/mxcl/homebrew/issues/4970 https://github.com/mxcl/homebrew/issues/7400 https://github.com/mxcl/homebrew/issues/7654
エラーメッセージをよく読むと、
configure: WARNING: *** TIFF loader will not be built (TIFF library not found) *** configure: error: *** Checks for TIFF loader failed. You can build without it by passing *** --without-libtiff to configure but some programs using GTK+ may *** not work properly
ライブラリが認識されていない。dependencyでインストールされたライブラリのlinkがうまく貼られていなかったみたい。
その後、以下のlinkをsudo権限で設定してから実行したら無事にインストールできた。$ sudo brew link libtiff $ sudo brew link jpeg $ sudo brew link jaspar
インストール後に忘れずに
$ sudo brew link gdk-pixbuf
そもそも、brew install時のユーザー権限がよくない?
sudo brew install ができないのをここを見て解決。 - ひたすらライブラリを入れ続けるしかない
$ gem install rabbit checking for gtk+-2.0... no
$ brew install gtk+
成功。
$ gem install rabbit checking for librsvg-2.0... no
はい、次。
$ sudo brew install librsvg ==> Installing librsvg dependency: intltool /usr/local/Cellar/intltool/0.41.1: 15 files, 200K, built in 7 seconds ==> Installing librsvg dependency: libcroco /usr/local/Cellar/libcroco/0.6.2: 37 files, 972K, built in 44 seconds ==> Installing librsvg /usr/local/Cellar/librsvg/2.34.1: 50 files, 1.6M, built in 47 seconds
inittoolをいれる際に以下のWarinigが出ていた。
Warning: m4 macros were installed to "share/aclocal". Homebrew does not append "/usr/local/share/aclocal" to "/usr/share/aclocal/dirlist". If an autoconf script you use requires these m4 macros, you'll need to add this path manually.
よし、次。
$ gem install rabbit checking for poppler-glib... no
$ sudo brew install poppler --with-glib /usr/local/Cellar/poppler/0.18.1: 447 files, 21M, built in 2.9 minutes
残っているログはここまで。
このあとまた躓いています。
————
ということで、Rabbitを触ってみようと思います。
1回社内の発表で、うさぎとカメを使ってみたいなー。
mavenで依存ライブラリが同包されている実行可能なjarファイルを作成する
2月 23rd
実行可能なjarと依存ライブラリが梱包されたzipアーカイブを作る、という方法で実行可能モジュールを作成していたのだけど、かなり無駄な構成になっているなと感じていた。
一つのjarファイルに全てのライブラリが同包されて、そのjarが実行できたほうがずっといい。
ということで今回の目標
- コマンドから java -jar で実行可能なエントリーポイントを含むjarを作る
- 上記jarで必要なライブラリ類はjarに同包されていること
外部に依存することなく1つのjarファイルだけでエントリーポイントからの処理が実行できるようにする。
使用するプラグインは maven-assembly-plugin。
maven-assembly-plugin
デフォルトアーカイブ jar-with-dependencies を使用し、エントリーポイントとなるmainClassを定義しておくだけで、目的のjarファイルが作成される。
<pom.xml>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>sample.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-sample-jar</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
これだけ。前と比べてpom.xml自体もとても簡潔になった。
最初にこの設定が出来なかったのは、親モジュールに[descriptors]が定義されていたため。
親モジュールにこれが定義されていると、アセンブリファイルの位置の上書きはできるけど、アセンブリファイルを”使わない”という設定ができない。
[descriptorRefs]を使用してもアセンブリファイルがないとビルドエラーとなる。
今回はプロジェクトの構成をもう一回見なおして、[descriptors]を親モジュールで定義する必要がないとわかったので、それぞれのモジュールで[descriptors]か[descriptorRefs]を定義させるようにして解決。
mavenは使い方になれるまで難しい。
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分前くらいにはぐったりしていました(電池切れ)。
体力つけないと、と感じた勉強会でもありました。
次回、リベンジできるかな。

