2013年12月31日火曜日

2013年を振り返りつつ、2014年を考える

去年の記事

2012年を振り返りつつ、2013年を考える

今年やった仕事



今年やった仕事ですが...


  • 秋ぐらいまで、昨年に引き続き、コミュニティ系のサービスの機能開発と保守
  • 上記のサービスが体制変更となり、秋〜現在までEC系サービスの機能開発と保守


でした。

扱っているテクノロジー的にはStruts2 からSpring MVC になりました。

前者のサービスは、トータルで1年ちょっと関わることになり、個人的にも大変思い入れがあったのですが、ビジネス上の判断が下され、自分の無力を感じています。チームもとてもよい人ばかりで、それも名残惜しい物でした。

後者のほうは、リリース1ヶ月後にJoinしたので、まだいろいろなものが途中でかえって勉強になって良かったです。いわゆるフレームワーク部分を作った人が隣にいるのでいろいろ聞きながら機能追加できるのは幸せなことかもしれません。


今年の課外活動


これ、今年はまったくと言っていいほどやっていません。どうしましょ。

感想と抱負



今年は、意図した結果ではありましたが、仕事に大変打ち込めた年でした。関わっているサービスが担当変更になるという事件はありましたが、総じて仕事に集中でき、スキルの向上に務めることができました。

ただ、課題としては、

  • スキルの成長角度がまだ小さい
  • オープンソースにコミットできていない
  • ビジネス上の結果を残すことができなかった

というのがありました。

それを踏まえて、2014年は

  • オープンソースにコミットする(ために足がかりでもつかむ)
  • スキルの深さと幅をひろげていく
  • ビジネス上のとある目標を達成するために、必要な自分のスキルを向上させる
を意識して過ごしたいな、と思います。
ま、定性的ですが、定量的なものは別途個人でつくっています。

総じて、今年の路線は踏襲するものの、角度は上げていきたいという感じです。

また、個人的なところでは、今年よわい30を迎えることになりそうです。30代なにをしようか、というのも暫く模索したいと思います。

最後に、今年は本当に一緒に働く同僚に恵まれた年でした。この場でお礼を言いたいです。ありがとうございました。


小話



学生の頃使っていたFreeBSDのインストーラ(当時はsysinstall(8))では、インストール時に下記のような区分がありました。参考リンク

Developer
Kern-Developer
User

当時私が所属していた研究室のヒエラルキーも、これに習って決められていたのですが。。。それはともかく。

自分はこれでいうと、Userレベルなままであり、今年こそはKern-Developerの足ぐらいはつかめるくらい頑張らないとなぁ、と思っています。

2013年11月11日月曜日

debianのapacheでrewrite有効化メモ

たぶんubuntuでも一緒。

今組み込まれているモジュールを表示してみる

# /usr/sbin/apache2ctl -l

mod_rewriteがなかったら下記で組み込む

# a2enmod rewrite

apache再起動
httpd.confとかでonすればあとは普通につかえる。下記みたいに。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ http://shase428.blogspot.jp? [R]
</IfModule>

2013年11月10日日曜日

JJUG CCC 2013 Fall 参加めも

今回はじめて、JJUG CCCに参加してきました。
http://www.java-users.jp/?page_id=695(これ)

なんか、devloveさんのイベントとかぶっていたので、こちらに来れなかった人もいるのかもしれませんね〜。

全般的にとても楽しく、モチベーションの向上につながりました。次もぜひ参加したいなーと。

運営の皆様ありがとうございましたm(_ _)m

今回は下記のセッションに参加しました。

参加したセッションと簡単な感想


  • JSR 310 "Date and Time API" への招待
    • 8以降だと、日付周りはJSR 310使うと楽そうだな〜と思います。
  • テンプレートエンジンを利用して、プログラマーとWebデザイナーが共同作業をする上で大切なこと
    • 問題意識の部分はかなり同意できた
    • これからテンプレートエンジン使わない開発になっていくから、どういう分業になるのか、まだちょっとわからないよな〜とかモヤモヤ考えていた
    • 自分の環境だとフロントのエンジニアとバックエンドのエンジニアがいて、デザイナー⇔フロントエンジニア⇔サーバサイドエンジニアの3層構造になっていて、またちょっと違う(が、境界の部分はいろいろ考えないといけないことがある)
    • このセッションはデザイナ⇔エンジニアの2層構造のときの話
  • ユニットテスト改善ガイド
    • 問題意識が、だいたい同じで、そんなズレてなくてよかったと思った。
    • Junit徹底入門ちゃんと読みます。。。
  • Javaアプリケーションサーバ構築・運用の勘所
    • 知ってることもあったが、知らないこともあった。とても勉強になったわー。
  • JVMコードリーディング入門 ~JVMのOS抽象化レイヤーについて~
    • いつかチャレンジしたいJVMのコードリーディング
    • やっぱc++勉強しないと、という気に
  • Over the Node.js. An Introduction to Vert.x
    • Javaにもこんなものが!(はじめて知った)
  • Spring Frameworkの今 (2013年版)
    • なんかすげードキュメントが公開予定らしいので期待
  • 懇親会
    • みなさんのLTおもしろいww

スライドリンク

公式まとめあるのかな?とりあえずtwitterで拾えたもの貼りました

LTのかた

以下完全に雑多なメモになります



◯Date and Time APIへの招待

時間の定義

UT:世界時
 観測地点に依存しない
 1928

TAI:原子時
 1955
 原子時計に基づく正確な時刻

UTC:協定世界時
 1972
 TAIにうるう秒を加え、UTIとの誤差を調整

地方標準時とタイムゾーン
 UTCに時差を加える

タイムゾーンはコンピュータの世界では標準化されている
 tz database(tzdb)
 tz databaseは随時更新されている
 例:Asia/Tokyo
 javaのupdateのたびに、tzdbも更新されている

Java 8における時刻、時間の表現

java.util.Date   ANSI/ISO Cのtime_tと同等。現在は表現のみに徹する。
java.util.Calendar  Java国際化対応(JDK 1.1で導入)。日付・時刻の作成・編集に用いる。
java.time.*   JDK8から。Date/Calendar代替が当初の目標。日付・時刻を総合的に扱うフレームワーク。規模的にもJDK8の新APIでも最大級
(JSR 310)

Dateの課題
 フィールド操作が面倒
 年フィールド+1900が実際の年
 月が0から始まる
 フィールドの直接操作が非推奨(Calendarを使う)
 日付部と時刻部が混在
 日付演算が貧弱
 フォーマットも使い勝手に難
 JDK1.1以降、一部例外を覗いてメンテナンスなし

Calendarの課題
 フィールド操作が面倒(Dateよりはまし)
 月が0から始まる
 フィールド操作の使い勝手がいまいち
 日付演算が貧弱
 日付・時刻型と認識されないことも多い

Java8でのCalendarの改善
 JDK8より、Calendar.Builderを導入

とはいえ貧弱

JSR310:Date and Time API
 Date,Calendar,DateFormatを置き換えが目的
 ISO 8601形式の表現
 immutableかつスレッドセーフなAPI

 

内部表現
 時間軸:clock
 ある時点:instant


◯ユニットテスト改善ガイド

参考書
実践アジャイルテスト

写経のススメ
 サンプル問題
 ローカルjenkins
 問題意識はズレてない

テストコードのメンテナンスをしましょう
 プロダクション以上に冗長
 量も多い
 後でリファクタリングするでは遅い
 3つ目をコピペする、ではプログラマーではない!!!!!!!!!!!!!!!!
 あとでリファクタリングする、では遅い!!!!!!!!!!!!!!!!!!!
 最初からリファクタリングする
 とてもコストがかかります

◯Javaアプリケーションサーバ構築・運用の勘所

ログ管理
 ログをきちんと取得していないシステムはスピードメーターが壊れている車と同じ

なんといってもGCログ
日時データがないログは意味が無い
GCViewer便利
 本家はstopしてしまった
 forkされてなんか開発中(datestamp対応)
GCログの上書きに注意

ヒープダンプの前に、ヒープのヒストグラムを取るケースもあるかも
通常時のヒープダンプと差分を取る

スレッドダンプ解析ツール
 ThreadLogic
 WebLogicに向いている、が、他のアプリケーションでも使える

Mbeanの分析
 Java Mission Control
 お金取られます.Java SEのAdvanceライセンス

2013年10月28日月曜日

apacheのrotatelogs

よく知られていますが、httpd.conf等に下記のような記述をすることが多いかと思います

CustomLog '|/hoge/apache/bin/rotatelogs "logs/access_log.%Y%m%d 86400 540' "combined" "



マニュアルに書いてますが
http://httpd.apache.org/docs/2.4/programs/rotatelogs.html


86400ってのは、1日を表す「秒」
540ってのは、offsetなんですが、なぜか「分」なんですね。


上記を設定すると下記のようなファイルができます

access_log.2013101

知らなかったのですが、どっかのバージョンから -l というオプションがついてまして、これを使うとローカルタイム(UTCではなく)を使うようになるので、540が不要になったみたいです。

つまり、+9時間してくれると。

手元のapacheにローテートが入ってなくて、久しぶりにぐぐったので、φ(`д´)メモメモ...

2013年10月25日金曜日

mockito参考になるリンク集(あとでかく)

http://www.slideshare.net/momomoblue/mockito-12627783

tmux & screen チートシート

tmux


デフォルトはctrl + bだけど、置き換えたほうが使いやすい...

ショートカットキー

  • ペイン分割(縦)
    • ctrl + b %
  • ペイン分割(横)
    • ctrl + b "
  • ペインレイアウト変更
    • ctrl + b [space]
  • ペイントを閉じる
    • ctrl + b &


コマンド
  • 再接続
    • tmux attach


screen

  •  セッションのデタッチ
    • ctrl + a , ctrl +d
  • セッションの再接続
    • screen -r
  • セッション一覧
    • screen -ls
       


Clean Code 2章のメモ

社内の輪講で使ったやつ

2章

意味のある名前


意図が明確な名前にする

これはだめ

public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList)
if( x[0] == 4 )
list1.add(x);
return list1;
}


ここがよくない
・暗黙さ

こんなかんじ

public<Cell> getFlaggedCells() {
List<Cell> flaggedCells = new ArrayList<Cell>();
for (Cell cell : gameBoard)
flaggedCells.add(cell);
return flaggedCells;
}

偽情報を避ける

似情報の例

・hp,aix,sco などの変数
unix由来?と錯覚する
・Listではないものに、hogeListとする
acoountsぐらいにしておく
・ごく一部のみが違う名前
・小文字のL,大文字のOなど


意味のある対比を行う

ノイズワード

・数字の連続(a1,a2...)
無情報です
source,destinationなど意味のあるものに

・意味のはっきりしない単語
Info? Data?
おなじです

・aとかtheのようなもの
明確な違いが生じるのであればOK
zorkがあるときに、theZorkはNG


発音可能な名前を使用する

・英単語として発音できるものにしよう


検索可能な名前を用いる

・1文字の名前は小さなメソッドのローカル変数でのみOK
・長い定数はあり
なるべく、enum、でいいんじゃね?


エンコーディングを避ける

・読めないものはよくない
・新たなことを覚えさせるのもだるい


ハンガリアン記法

・辞めよう

例)
long整数 lData
PhoneNumber phoneString; // やってしまう...


メンバープレフィックス

・m_など
そもそもなんで昔つかってたの??


インターフェースと実装

・Iを前置、IHogeFactory
やめよう
・HogeFactoryImp or CHogeFactory
Cは具象のconcreteかな


メンタルマッピングを避ける

・i,j,kはループの中ぐらいなら可
・プロのプログラマは透明性を大事にする(賢い、のではない)


クラス名

・名詞あるいは名詞句をつけろ
Customer,WikiPage,Account,AddressParserCustomer
・Manager,Processor,Data,Info は避けるべき
・動詞を避けるべき


メソッド名

・postPayment,DeletePage,save などの動詞、動詞句
・Accessors,mutators,predicatesといった名前はメソッドが扱う値に付けるべき(get,set,isを前置しろ)
・コンストラクタがオーバーロードされている場合は、staticなファクトリメソッドを用意し、名前に引数を表現するものを含める

気取らない


1つのコンセプトには1つの単語
・複数のクラスで、fetch,retrieve,getを同じ意味で提供するとかやってはいけない
・controller,manager,driver なんかも紛らわしい
・整合性を持った語彙が大切


語呂合わせをしない

・addに、連結とコレクションの追記、2つの意味があるなどやってはいけない



解決領域の用語の使用

・すべての名前をいちいち業務用語か取り出すのは推奨しない
・プログラマーが分かる言葉(JobQueue,AccountVisitor)がよい


問題領域の用語の使用

・処理がプログラマちっくでないのであれば、業務側から用語を持ってきてもよい



意味のある文脈を加える


根拠のない文脈を与えない

2013年10月18日金曜日

eclipse俺俺チートシート

ショートカット
(macなんで、ctrl ≒ cmd)

移動

  • ジャンプ
    • f3
  • ジャンプからもどる
    • cmd + [
  • クラス検索
    • cmd + shift + r
  • クイック階層移動
    • cmd + t
  • workspaceの検索
    • ctrl + h

生成

  • javadoc生成
    • cmd + shift + j

整形

  • フォーマット
    • cmd + shift + f

TIPS


参考になるリンク
http://hutyao.hatenablog.com/entry/eclipse-shortcutkey



まだ書きかけ

2013年10月8日火曜日

自前のWordPressを運用する意義が見いだせなくなったので、Bloggerに引っ越しました。

wordpress形式をexportしたものを下記のサイトでconvertして、bloggerにimportできました。

http://wordpress2blogger.appspot.com/

ありがたい。

wordpressのほうはしばらく放置しておきますが、そのうち消します。

2013年9月2日月曜日

かつて、フィールドワークコンサルティング手法を勝手に試してみた話

とどのつまり、何をしたらゴールなのかよくわからない仕事ってあると思います。

普通、なんの仕事でも、始まりの時に、勝利条件を明確にするものですが、仕事を依頼する側も、仕事を受け取る側も、勝利条件がわかっていないとき、まずゲームのルールを探らなければいけない時があります。

現実世界は、ゲームのルールなんて、どっかに書いてあることも少ないので、みんな(利害関係者たち)これがルールかな、とおもったものが、ゲームのルールとなります。

で、ゲームのルールを探る必要があるときに、その手法っていろいろあるかと思います。

何年か前のしごとで、フィールドワークコンサルティング手法を勝手に使ってみたことがありました(フィールドワークコンサルティングという言葉は使ってない)。その時の感想をメモがてら書いておきます。

参考リンク
フィールドワークを活用したコンサルティング手法とその効果

(今日skypeでなぜなぜ分析の話題を出したら、この数年前の仕事を思い出しました)

フィールドワークコンサルティング手法に対する自分の理解



  • 文化人類学のフィールドワークをベースにしている

  • STEP1.えらいひとにインタビュー(まとめておく)

  • STEP2.業務フローをつくる

  • STEP3.現場に張り付く


    • 現場の人の動きをひたすらメモる(なるべく先入観なしで)

    • 邪魔者扱いされるが泣かない


  • STEP4.現場の人を含めた利害関係者で、ディスカッションしたり個別にインタビュー

  • STEP5.まとめて、改善の実行案つくる(もしくは改善案の実行まで行って)おしまい(次につなげる)


きっかけ:とある依頼



  • SE派遣をしているSIerがありました

  • 派遣している方(SIer)も、受け入れている方(お客さん)も、現場でなにをやっているのかイマイチよくわかってません

  • でも、改善したいです

  • 改善とかしていきます前向きさをアピールしたい

  • あと、実際現場ブラックボックスなんだよねー


前提条件



  • 期間は半年

  • この件に裂ける人員は俺一人

  • 0.3人月 * 6ヶ月ぐらいでよろぴく

  • 俺はただのしがないSEだった(25歳ぐらい?)


    • この手のしごとはしたこともなかったし、誰もやり方を教えてくれない。



どうしよう



  • 契約や、日々のドキュメント類は見せてもらったが、これだけだとやっぱりよくわからん

  • とはいえ、きれいなBPRっぽいテンプレドキュメント出したところで、なんか納得されなさそう

  • 逃げたい

  • ぐぐる

  • 富士通のサイトに面白いはなしがのってる

  • これだ


まず、やったこと



  • 仮設を立てる


    • 現状こういう問題があるんじゃない?


  • スケジュールを立てる


    • ざっくりと


  • キックオフをする


    • 利害関係者を集めれる範囲でキックオフをして、これから半年やることを宣言する

    • この時は、調査3ヶ月、施策3ヶ月ぐらいにしといたと思う

    • 怒られたらその部分はなおす


  • シートを作る


    • インタビューシート、フィールドワークのメモ用シートなどをつくる



じゃあインタビューしてみよう



  • 利害関係者のなかでも偉い人方面にインタビューしてみる


    • 同じ船に乗ってるとは思えないほど、認識が違う

    • 逃げたい

    • 無知な若者が、失礼なことを聞いてるんですぅという感じで相手の器量に期待する方向で物事をすすめることを決意する。若くて良かった。


  • 現場の人にインタビューしてみる


    • 現場ならではの問題意識をいろいろ抱えている

    • よくわからないところは、フィールドワークで補うか

    • この時点で現場の人が助かる方向に物事を進めようという気になる

    • 偉い人方面は、政治のできる人になんとかしてもらおうという気になる



で、フィールドワーク



  • 週2回ぐらい、現場にいく

  • 現場のSEの後ろについてまわる(マジで)最初はすごく恥ずかしかった。

  • だんだん慣れてくる。

  • あんたなんなの?の視線にもめげない。

  • やっぱり答えは現場にある。


仮説の修正、結果の報告、施策案を提示



  • ブラックボックスってのが気になるのであって、箱を開けてあげれば、具体的な議論ができる


    • ブラックボックス→あいつら仕事してんの?(不安の裏返し)

    • ブラックボックスを紙に可視化

    • フィールドワークの結果があるので、説得力はある


  • 現場は疲弊している


    • こういう理由で疲弊しているので、戦力増強なり、効率化(のためのコストをかける必要がある)みたいな話を、利害関係者の偉い人にいう。


  • 紙をいっぱいつくる


    • 現場に近い人にとっては有用な資料

    • 偉い人向けには、ちゃんとエグゼクティブ・サマリーをつくるのを忘れない

    • 偉い人は細かい文書を読まない。くれって言われたら出すぐらいでちょうどいい


  • 改善案を出す


    • この時は現場よりの改善案だった。

    • 実行も結局俺がやることになってしまった。


  • 改善案のゴールを明確にする(KPI)


    • フィールドワークの結果をもとに、定性的、定量的な改善目標を立てる

    • これがゲームのルール



その後



  • 業務改善のためのツールをつくった


  • 施策の結果は、多分、利害関係者全員が納得できるものではなかった。

  • これはひとえに俺の力不足であった。

  • 継続的にコミットできる仕事として、このツールをブラッシュアップしていかないと意味ないなーと思った。


    • そのために、ツールをつくるにしても、その現場の人が扱えるテクノロジーを採用するってのが大事。

    • ただ、自分がそれに習熟しているかは別問題なのであった。。。





まとめ



  • フィールドワーク手法はかなり有用だった


    • 机上で資料を眺めているよりはるかに意味があった

    • 日本の仕事のスタイルで、現場のドキュメンテーションが少ない、ってのも大きい


  • 改善案の実行を定量目標を満たすように達成するのはすごく大変


    • 特に自分でやる場合、その業務なり、テクノロジーに造詣が深くないと、その成果は微妙なものになりがち。

    • なんの仕事でもそうなんだけどね。。。


  • とにかくすばやく


    • ゆっくりやっていると、組織だったり、技術だったりが変わってしまう

    • 来月ココかわるから、手を入れても意味ね~じゃんとか普通に起こりまくる

    • メスを入れるべきところの見極めと、素早さが重要


2013年8月22日木曜日

macでbind使いたい人のメモ

Macでインターネッツ共有をしたときに、自前のDNSを参照させたい時ってあると思います。
そんなときに、MacでBINDを使うメモです。

環境


Max OS X Lion

事前準備



/etc/rndc.keyの作成

sudo rndc-confgen -a


named.confの設定

vim /etc/named.conf


以下サンプル


include "/etc/rndc.key";

controls {
inet 127.0.0.1 port 54 allow {any;}
keys { "rndc-key"; };
};

options {
directory "/var/named";
pid-file "/var/run/named.pid";
allow-query { any; };

// query-source address * port 53;

};

zone "." IN {
type hint;
file "named.ca";
};

zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};

zone "blog.shase.info" IN {
type master;
file "blog.shase.info.zone";
};

logging {
category default {
_default_log;
};

channel _default_log {
file "/Library/Logs/named.log";
severity debug;
print-time yes;
};
};



zoneファイルを作る


vim /var/named/blog.shase.info.zone


以下zoneのサンプル

$TTL 86400
@ IN SOA localhost root.example.jp.(
2002122001 ; serial
3600 ; refresh 1hr
900 ; retry 15min
604800 ; expire 1w
86400 ; min 24hr
)
IN NS localhost.
hoge IN A 0.0.0.0


他のファイルはデフォルトです。

起動と停止



フォアグラウンド起動


$ sudo named -g


デーモン起動

$ sudo launchctl load -F /System/Library/LaunchDaemons/org.isc.named.plist
Password:
$ ps aux |grep named
hoge 41792 0.2 0.0 2434892 548 s007 S+ 9:27PM 0:00.00 grep named
root 41784 0.0 0.1 2439512 6280 ?? Ss 9:27PM 0:00.02 /usr/sbin/named -f


デーモン停止

$ sudo launchctl unload /System/Library/LaunchDaemons/org.isc.named.plist
$ ps aux |grep named
hoge 41800 0.0 0.0 2434892 548 s007 R+ 9:29PM 0:00.00 grep named


あわせてどうぞ


MacOSXのインターネット共有で、MACアドレス制限を行いたい

2013年8月5日月曜日

JBODはややこしい

カイワレ先生のブログを見て、自分のメモがてら、JBODについて書いてみます。
JBODって、なんぞやって、日本人なら誰もが一度は考えると思うからです。(RAID0と何が違うの?って)

現状、JBODという言葉は非常に曖昧な言葉です。
日本語wikipediaにも3つ定義があります。


1.JBOD機能を持つRAIDコントローラカードを取り付けて、JBODにしたいハードディスクをRAIDコントローラカードに接続する。
2.JBOD用として製造されたディスクアレイ製品をSCSIやファイバーチャネル等のインターフェースに接続する。
3.すでに接続されている複数のハードディスクを、ソフトウェア的に統合してJBODとする(Windows NT系列のOSには「スパン」という名称でこの機能が標準装備されている)。


http://ja.wikipedia.org/wiki/JBOD
より。これはこれで微妙なんですが。。。

まず大雑把な理解として、JBODの特徴を2つ挙げます。(どちらともRAIDに対する優位点です)

  • A.複数のディスクにて、容量が異なる場合も(単純な足し算の)単一のボリュームを構成することができる

  • B.I/O性能がよい、とされる



ちなみに、Aが成立するのは、上記wikipedia定義の1,2,3のときです。
Bが成立するのは、1,2です。(とはいうものの、状況によってRAIDのほうが性能がよかったりします。これは使い方によって変わります。)

3のとき、なぜBが成立しないかというと、ソフトウェアで処理している分オーバーヘッドが大きく、I/Oが出ません。

以下は、ざっくり、1と2は、ハードウェアベースのJBOD。3をソフトウェアベースのJBODとします。

ハードウェアベースのJBOD


ハードウェアベースのJBODとHadoopの話に入りますね。ハードウェアベースのJBODも2つの意味があります。1つは、「束ねられたディスク群」という意味のJBOD。

もうひとつは「物理ディスクが別々の論理ボリュームにマッピングされて、並列書き込み可能な状態(仕組み)」です。上記とはぜんぜん違いますね。

つまり、OSから見えるマウントポイントと物理的なディスクが紐付いている状態ということです。(そして、きちんと別々に書き込むように対応したコントローラがいわゆるJBOD対応のコントローラってやつです)。

Hadoopはアーキテクチャ上、並列に書き込みをしてくれるようです。これは、マウントポイントと実際のディスクが一対一で結びついている時に、その並列性が意味を成すということです。逆にRAIDを組んでしまうとストライプ書き込みをしてしまうので、そのラウンドロビン並列書き込みの意味がなくなってしまうということですね。

ハードウェアのJBODは外付けのエンクロージャで使用されることが多く、サーバ筐体の内蔵ディスクで対応しているものがどのくらい世にあるのかは知りません。

ちょっとだけ調べたら、さすがにDELLのCシリーズとかはJBOD対応のチップ(HBAとしての役割しか果たさないモード)を搭載したLSIのチップとか積んでるみたいですね。

ソフトウェアベースのJBOD


ソフトウェアベースのJBODの話は余談です。こっちは束ねる方だけ触れておきます。

お仕事用途ではあまり使われないので。カイワレ先生がWindows Home Serverの例を出してましたが、あれは、「Drive Bender」の実装の話だと思います。(別に、HOME鯖が最初のJBOD実装ってわけではないです)。

なぜ、Home Server(家庭用鯖)にJBODが必要とされてMSが実装したかというと(最新のHOME鯖では外されているようです)、発売当時、まだ、HDDの値段はそれなりに高く、ユーザのニーズとして、「ジャンク屋で買ってきたHDDいくつか、組み合わせて、でかいOneボリューム構成したいんだけどなー」というのがあったからです。

そのニーズに合致していたのが、ソフトウェアJBODだったんですね。

Linuxの場合は、LVMでソフトウェアのJBOD(のようなもの)を構成することができます。

まとめ


JBODという言葉は、いろんな人が勝手にオレオレ定義で使っている言葉です。さりとて、代替になる適当な言葉もないので、JBODいいよーって言いたいエライ人は、適当に新しい言葉をでっち上げていただけると、世のエンジニアが助かります。

ちなみに、Hadoopのクラスタ組もうと思って、JBOD使えないRAIDカードしか積んでないサーバ渡されたら、しょうがないから、1ディスクでRAID 0ってのを一つの筐体で何個か組む感じの構成になるかと思います。お金くれるんだったら、LSIとかのちゃんと対応したチップ詰んだ鯖にしたいですが。

世の事例を見ると、RAID 0を並べたようなものをJBODなんて言ってる例もあるので、みんな適当に使ってる単語といえばそんな感じ。

おまけ


JBODではWriteキャッシュを切りましょうが一般的なお約束なのですが、もしかしたらHadoopだと気にしなくてもいいのかもしれません。ぐぐればどっかにそんなこと言ってる人いるかも。

2013年7月13日土曜日

struts2参考になるリンク集

本家




日本語記事



マイナビ




codezine


MacOSXのインターネット共有で、MACアドレス制限を行いたい

MAC,MACややこしいですが、T/Oです。
MACのインターネット共有は便利なので、ついつい使いたくなってしまうのですが、はやりセキュリティを考慮しないのは危険ということで、インターネット共有を行う際に、指定したMACアドレス以外は、接続できないようにしたいと思います。

環境



  • Mac OS X Lion



どのレイヤーでやるか


最初、ipfwでやろうとしたのですが、どうにもうまく行かず。

インターネット共有では、dhcpでIPアドレスをばらまいてるわけですが、ココで指定したMACアドレス以外にはdhcpでアドレスを付与しない方向に切り替えました。

想定外の端末が直接アドレス指定してアクセスしてくるリスクには、払い出すアドレス数の管理+ipfw等で対応することとします。もちろん、無線LANのキーを設定するのは言うまでもありません。

もし、下記を実行して、セキュリティインシデント起こしても当方は知りません( ー`дー´)キリッ

概要:インターネット共有の手順


[システム環境設定] -> [共有] -> [共有する接続経路(Ethernet)] + [相手のコンピュータが使用するポート(Wi-Fi)]を選択し、インターネット共有チェックボックスをONにします。

そうすると、bootpが動き出し、/etc/bootpd.plist が生成されます。このファイルを編集するのですが、難があり、デーモン起動時に新規にファイル生成し、デーモン停止時にファイルを削除しやがります。この点、多少ケアが必要です。

/etc/bootpd.plist 実際のファイルサンプル


[xml]




Subnets


_creator
com.apple.InternetSharing
allocate

dhcp_domain_name_server

10.0.2.1

dhcp_router
10.0.2.1
lease_max
86400
lease_min
86400
name
10.0.2/24
net_address
10.0.2.0
net_mask
255.255.255.0
net_range

10.0.2.2
10.0.2.254



allow

xx:xx:xx:xx:xx:xx

bootp_enabled

detect_other_dhcp_server

dhcp_enabled

en1

use_server_config_for_dhcp_options



[/xml]

allowの部分に注目して欲しいのですが、
[xml]
allow

xx:xx:xx:xx:xx:xx

[/xml]
allowで指定したMACアドレスだけに、IPアドレスを割り振るようになります。(その他はデフォルト値です)

実際のオペレーション


[bash]
#設定ファイルを編集して
sudo vim /etc/bootpd.plist

#chflagsを立てます
sudo chflags uchg /etc/bootpd.plist

# インターネット共有開始
[/bash]

ファイルが消されてしまう対策として、BSD系OSで使用出来るchflagsを利用します(chmodでreadOnlyにしても消されるので)。
もっとエレガントな方法ありそうな気はしますが。。。

再度ファイルを編集したくなったら
[bash]
sudo chflags nouchg /etc/bootpd.plist
[/bash]
上記を叩けばOKです。

ではでは。

参考にしました


https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/bootpd.8.html

2013年7月11日木曜日

2013年前半振り返り

さらっと振り返ってみる

1月

  • インフルで死んでた記憶しかない


2月

  • 新チーム体制になったけど、裏側の保守っぽいことメインに仕事してた気がする。



3月

  • 2月とやってること変わらず保守っぽいのがメインだったけど、エイプリルフールの実装とかは、初めてまともに機能的なものを仕込んだかも。



4月

  • チームでフロント周りのリソースが薄かったので、かなりの部分、マークアップっぽいことしてた気がする。FTL/CSSに少しだけ詳しくなる。



5月

  • r***とか、e***とかのある程度のカタマリ機能を実装。



6月

  • 保守っぽいのから、***の機能とかを実装。手広く浅く。



振り返り

  • この半期開始時点よりは、ずいぶんマシになった気がする(元が酷すぎるんだけど)

  • 6月ぐらいから自分に不足してる知識とかがかなりクリアになってきて、Inputの元気も戻ってきたので、最近は本とかも読めている



後半戦へ向けて

  • もーちょいマシなエンジニアになりたい。

  • QCDをあげていきたい。

  • 設計〜実装〜テスト:やっぱりこのあたりを強化していきたい。分析とかは当分いいいや。

2013年6月11日火曜日

FreeMarkerのハッシュの要素にアクセスする(2)

前回「FTLのハッシュの要素にアクセスする」というのを書いたのですが、このときやりたかったことって、配列の「最後」にアクセスしたかったからなんですね。

でも、値直接指定じゃなくて、配列の最後を判定する構文がちゃんと用意されていたのでした。。。

マニュアルはちゃんと読みましょうというはなし。


[java]
<#assign foobar = ["hoge", "fuga", "piyo"]>

<#list foobar as str>
${str}
<#if str_has_next>さいごじゃ


[/java]


参考


http://freemarker.org/docs/ref_directive_list.html

2013年5月23日木曜日

FreeMarkerのハッシュの要素にアクセスする

T/Oなんですが。FTLのお話。

こんなハッシュがあったとして
[java]
<#assign hoge = [

{
"title":"fuga",
"id":"piyo"
}
] />
[/java]

ずらーっとね。で、特定要素にアクセスするときは、こんな感じで書けるっぽい。
[java]
<#list foo.hoge as bar>
    <#if bar.id == "piyo">
    ぴよぴよ
    

[/java]
みたいな。

2013年5月15日水曜日

ドキュメントについてのリンク集

書きかけ

ウォーターフォール



  • 即活用!業務システムの開発ドキュメント標準化


    • http://thinkit.co.jp/free/project/4/1/1.html


  • グラス片手にアジャイル開発 第4回 - ハイブリッドアジャイルの実践法


    • http://codezine.jp/article/detail/5498



アジャイル



  • ドキュメントを効果的に利用する


    • http://it.impressbm.co.jp/e/2010/08/20/2665


2013年4月20日土曜日

EclipseがWorkbenchのロード中で止まっちゃうとき

環境は

  • MacOS X Lion

  • Eclipse 3.7 (英語版/JavaEE)

  • Java 6




間違って電プチしちゃったときとか、バッテリー切れて落ちたとか、Eclipseが突然死するとかで、
不意に落ちるとworkspace選択->workbenchのロードで止まっちゃうことが多いです。

その時用のまとめ。

やること1.ログを見よう


このへんのログを見る。解決の糸口があるはず。

workspace/.metadata/.log


やること2.cleanで立ち上げよう


こんな感じのログの場合

!ENTRY org.eclipse.core.resources 2 10035 2013-04-20 02:00:14.017
!MESSAGE The workspace exited with unsaved changes in the previous session; refreshing workspace to recover changes.

ワークスペースをリフレッシュせよとあるので、一旦

./eclipse -clean

を試してみる。ケースにもよるけどこれで割りと復活する。

やること3.snap的なファイルを消してみる


こいつらが居たら消す

.metadata/.plugins/org.eclipse.core.resources/.snap
.metadata/.plugins/org.eclipse.core.resources/.projects/*/.*.snap


だいたいこれで治る。

とても参考になりました


http://www.andr0o0id.com/?p=854

2013年4月18日木曜日

シェルスクリプトで添付ファイル付メール送信

例によって、備忘録。CentOS 5系にて

※ わかりにくい箇所を書き直した 2015.10.13

uuencodeが入ってなければInstall
$ sudo yum install sharutils


mailコマンドでメールが送信できる前提での、
動作サンプル:本文+添付ファイル
$ (echo "mail_body"; uuencode file_path file_name) | mail -s 'mail_title' mail_address

見にくいので、ちょっと補足すると、

mail_body : 本文
file_path : 添付するファイルのpath
file_name : 添付ファイル名
mail_title : メールの件名
mail_address : 宛先メールアドレス(to)

ちなみに、日本語とか文字化けするので、
mailコマンドに渡す前に、nkf -j をパイプで通すとよい。

2013年4月16日火曜日

シェルスクリプトで自身のフルパスを取得

T/Oです。
いっつも忘れるので。
[bash]
#!/bin/sh

hoge=$(cd `dirname $0`; pwd)/`basename $0`
echo $hoge
[/bash]

こんな感じで。

2013年4月7日日曜日

スタンドアローンで動作する祝日判定スクリプト

タイトルどおりなんですが、仕事で必要なので作ってみました。(ついでに社内のレポートもあったので)。
でも、最近仕事が忙しくて、悲しいかな業務時間に作業してないので、せっかくなのでブログにも置いときます。
社内のレポートは業務時間を使ってもいいことになっているので、有難い制度なんですけどねー。

やりたいこと


日本の祝日を判定したい

1.元データ


スタンドアローンということで、何らかの元データをローカルに保持しないといかんわけで、今回はGoogle カレンダーのAPIを利用しました。

今回利用したXMLリクエスト


http://www.google.com/calendar/feeds/outid3el0qkcrsuf89fltf7a4qbacgt9@import.calendar.google.com/public/full-noattendees?start-min=2013-01-01&start-max=2013-12-31

リクエストパラメータの意味


詳細は、Google Calendar API v2 Atom Referenceを。























outid3el0qkcrsuf89fltf7a4qbacgt9@import.calendar.google.com比較的信頼度が高いとされる、mozillaプロジェクトの祝日一覧(mozzila Calendar Project)
 full-noattendees full版からgg:whoを抜いたもの(今回は不要なので)
 start-min=2013-01-01 期間の始まり
start-max=2014-01-31 期間の終わり

2.実際のコード


[python]
#!/usr/bin/env python

from xml.dom.minidom import parse
import sys
import re

def get_parse(fileName):
try:
obj = parse(fileName)
except IOError:
obj = 0

return obj

def get_arg2(arg2):
pattern = re.compile("^\d{4}-\d{2}-\d{2}$")
matched = pattern.search(arg2)

if matched:
argDate = arg2
else:
argDate = 0

return argDate


def main():
fileName=sys.argv[1]
obj = get_parse(fileName)

if obj == 0:
print "file not found"
return 1

argDate = get_arg2(sys.argv[2])

if argDate == 0:
print "argument is unjust. ex)2013-01-01"
return 1

obj_list = obj.getElementsByTagName("gd:when")

for i in obj_list:
if argDate == i.getAttribute("startTime"):
return 0

print "unmatch holiday"
return 2


if __name__=='__main__':
sys.exit(main())
[/python]

3.ざっくり仕様



  • 第一引数に元xmlのファイルパス

  • 第二引数に確認したい日付をyyyy-MM-ddにて渡す

  • 祝日であれば、0、祝日でない場合は2、その他のエラーは1を返す


4.動作イメージ


[bash]
shase$ ./holidayCheck.py japanHoriday.xml 2013-10-15
unmatch holiday
shase$ ./holidayCheck.py japanHoriday.xml 2013-05-05
shase$ echo $?
0
[/bash]

2013年3月26日火曜日

Linuxでのhostsの反映

前に、macでのhostsの変更の反映メモを書いたけど、Linuxでも似たような話があるので、メモ代わりに。


Linuxはリゾルバキャッシュがありましぇーん、とかよく(古い)記事とかであったりしますが、最近のディストロだとだいたい、nscdっていうネームサービスキャッシュデーモンたんが動いており、時々、hostsやらpasswdやらの変更が反映されないみたいな悪さをしてくれやがります。(LDAP関連のトラブルでもよくでてくるんじゃないかな?)

余談だけど、最近のFreeBSDでも動いてるらしい(余談おわり)。

詳細は「man nscd」してもらえればいいんですが、とりあえずhostsのキャッシュをクリアしたいとき(nscdの再起動:nscd restartでもいけるけど)。

/usr/sbin/nscd -i hosts

とかすればおk

2013年3月24日日曜日

macでipfwを使って特定ホストに対する通信を止めたい

環境はMacOS X Lion


ipfwのチートシート


  • sudo ipfw list
    • ルールの表示
  • sudo ipfw delete "number"
    • ルールの削除
  • sudo ipfw add "rule"
    • ルールの追加"rule"のところはmanでもみてくれ
  • sudo ipfw show 
    • ルールとパケットの表示
  • sudo ipfw -f flush
    • 既存の設定のflush

で、特定ホストに対する通信のblock


denyのところに止めたい宛先アドレスを入れよう
以下、設定シェルの例

#!/bin/sh
ipfwcmd="ipfw"
add="$ipfwcmd -q add"
# flush old rules
$ipfwcmd -f flush
$add deny tcp from me to xxx.xxx.xxx.xxx
$add deny icmp from me to xxx.xxx.xxx.xxx

細かいルールはmanでも見てね(・ω<)

2013年3月23日土曜日

2013年2月16日土曜日

mavenプロジェクトでのjvmのバージョン指定してるトコ

mavenのサイトに書いてるけど。

http://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html
maven-compiler-pluginのトコで指定だってさ。下の例はjdk1.4を指定してる様子。
[xml]

[...]

[...]


org.apache.maven.plugins
maven-compiler-plugin
3.0

1.4
1.4



[...]

[...]

[/xml]

2013年1月1日火曜日

2012年を振り返りつつ、2013年を考える

最初、2012年のまとめを書こうかと思っていたんですが、2012年は個人的に激動すぎて、ちょっと今の段階で振り返って、それをまとめることが難しいという結論になりました。

外部環境の動きによって、もたらされた自分の変化。

自分から能動的に動いた結果の自分の変化。

それぞれあるのですが、どれも今の段階でどうだったのか、評価を下すには早すぎると感じました。2〜3年して振り返った時に、2012年の評価ができるんじゃないかな、と思っています。

個別の事項についての、KPTはできるんですけどね。

というわけで、2013年の豊富を。

仕事の面で。

世の中の動きがどうなるかわかりませんが、Web系のエンジニアとしてやっていこうという気持ちに変わりはありません。今年選択した道を深化させて行きたいと思います。(Web以外のインターネット産業が勃興した場合はその限りではありませんw)

2011年の今頃は、モヤモヤしていたのですが、2012年は個人的な決断を行ったので、今は雑念も少なく、仕事に取り組むことができています。

多くの人にご迷惑をかけました。働くようになって、今年ほど自分の無力を感じたことはありませんでした。スキル的なところもそうですし、人間的なところもそうです。

スキル的なところは、一朝一夕にどうしようもないので、積み上げをしていくしかありません。そのスピードは上げていく必要がありますが。

人間的なところは逆にすぐできることも多くあります。同じ失敗だけはしないようにしたいと思います。今年はそこで、大きな失敗をしました。IT業界ではよくある話ですが、よくある話しとして済ませてはいけないと個人的には考えています。

抽象的なことばかり書いてもあれなので、1つだけ今年記憶に残ったエピソードを書きます。

弊社では、運用と開発に役割が分かれているわけではなく、エンジニア職は基本的に両方をこなします。

今年は3ヶ月ぐらい、実際のサービス運用から離れていた時期がありました。ニートしていたとかではなく、仕事で別のミッションがあったからなのですが。

その後、またとあるサービスの開発&運用をやることになったのですが、運用の感覚みたいなものが欠落していることに気が付きました。

具体的に言うと、リソースのモニタリングにおける気づき、であったり、何かのオペレーション時のリスク(事前察知?)に疎くなっていたり、等。

このあたり、日々の筋トレに近いものがあるのかもしれません。やらなくなると、徐々に衰える。

よくよく考えてみると、仕事って現場から離れると現場感覚が無くなんて、よく言われる話。ただ、それを如実に実感したのは初めてでした。