My External Storage

ソフトウェアエンジニア向けTips。Qiitaにもメモ

Windows Server 2012 R2 Essentialsを利用してVM上にActive Directoryサーバを構築する。


インストール

準備

 VirtualBoxのバージョンは4.3以上にしておくこと!

VirtualBoxの4.2以前ではWindows8系のOSをサポートしていないので、まずアップデートをしておく。
Oracle、最新版となるVirtualBox 4.3をリリース - Windows 8.1をサポート
http://news.mynavi.jp/news/2013/10/16/194/

今回実施した環境は以下の通り。

VMサーバ(物理PC)のOS : Windows 7 Professional SP1(64b)
VirtualBox:4.3.4
VMで立ち上げるOS: Windows Server 2012 R2 Essentials(64bit)

  1. VitualBoxのマネージャーで「新規」ボタン押下
  2. 「タイプ」を「Microsoft Windows」、バージョンを「Windows 2012(64bit)」に指定。今回は「名前」を「win2012」とする。
  3. メモリサイズなどは後で変更できるので適当に
  4. 仮想ドライブの容量は追加が面倒なので、100Gくらい用意しておく
  5. インスタンスができるまで適当な値で設定する。
  6. 完成したインスタンス「win2012」を選択し、「設定」ボタンを押下
  7. 新しく開いたダイアログから「ストレージ」を選択
  8. コントローラ:IDEの横にある+CDボタンで.isoを追加する。
  9. 追加した.isoを選択して「属性」が「IDEプライマリマスタ」であることを確認
  10. 次に「ネットワーク」を押下する。
  11. 「アダプター1」の「割り当て」を「NAT」から「ブリッジアダプター」に変更
  12. 「高度」を押下してセクションを開き、「プロミスキャスモード」を「全て許可」に変更
  13. (11、12の操作でVMサーバ以外にもアクセスできるようになったはず。)
  14. 「システム」を押下し、「プロセッサー数」を変更するなど、適宜調整
  15. 「設定」ダイアログを「OK」押下で閉じる
  16. win2012サーバを「起動」させる。

以上の手順を踏むことで、VirtualBox上の準備は終了。

Windows Server 2012 essentialsのインストール

下記PDFの手順を参考にOSの初回起動を終える。

http://download.microsoft.com/download/8/0/8/808AC0BA-BA9B-4D65-8F00-E36E0A037D8B/WSE2012_StepByStepGuide_ja.pdf
PDFリンク元
http://www.microsoft.com/ja-jp/server-cloud/windows-server-essentials/technical-documentation.aspx

P26 手順10.の内容を後で変更することは出来ないので注意すること
会社名は問題ないが、内部ドメイン名がADサーバのレルムに、サーバ名がAD上でこのPCのサーバ名になる。 本文書では、「内部ドメイン名:KERBEROS」、「サーバ名:win2012」とする。

以降、Windows Updateなどが選択できるので、PDFに習って実施しておく。

ファイル共有機能を追加する。

あらかじめ、共有用のファイルを作成しておくこと

  1. サーバマネージャを開く。(これは良く使うので、起動後、タスクバーに出てくるアイコンを右クリックし、「タスクバーにピン留めする」をしておくとラク)
  2. 左側のアイコン列から「ファイルサービスと記憶域サービス」を押下
  3. アイコン列の隣に出現する列から共有を押下
  4. 共有されているファイル一覧表示される
  5. 一覧の既存のファイルが無い部分で右クリックを押下するとメニューが出てくるので、「新しい共有...」を押下する。
  6. 登録画面に習って追加共有フォルダを追加する。(今回はshare)

グループポリシーを変更する。

  1. サーバマネージャを開く。(これは良く使うので、起動後、タスクバーに出てくるアイコンを右クリックし、「タスクバーにピン留めする」をしておくとラク)
  2. 右上の「ツール」を押下し、「グループポリシーの管理」を押下する。
  3. マネージャが開く
  4. 左列のツリーを展開すると「KERBEROS.LOCAL」以下に「Default Group Polycy」が設定されている。
  5. 「KERBEROS.LOCAL」を右クリックし、「このドメインにGPOを作成し、このコンテナーにリンクする」を押下
  6. 新しいGPOへのリンクが追加される。(ここではtestPolicyという名前で作成)
  7. 「Default Group Polycy」を右クリックし、「リンクの有効化」のチェックを無効にする。
  8. 「testPolicy」を右クリックし、「リンクの有効化」をチェック、さらに編集を押下
  9. 「グループポリシー管理エディター」が起動する
  10. 「コンピューターの構成」→「ポリシー」→「Widnowsの設定」→「セキュリティの設定」→「アカウントの設定」を確認する
  11. 各種設定が未定義状態なので、設定しておく。

主に設定すべき項目と今回構築した設定は以下の通り。

  • パスワードの設定
    • パスワードの長さ:4
    • パスワードの変更禁止期間:0(無期限)
    • パスワードの有効期間:900
    • パスワードの履歴を記録する:0(無記録)
    • 暗号化を元に戻れる状態でパスワードを保存する:無効
    • 複雑さの要件を満たす必要があるパスワード:無効
  • アカウントの設定
  • Kerberosの設定
    • コンピューターの時計の同期の最長トレランス:30分
    • サービスチケットの最長有効期間:60分
    • チケットの最長有効期間:1時間
    • ユーザーチケットを更新できる最長有効期間:34日
    • ユーザーログオンの制限を強制する:無効

なお、全ての項目でダブルクリックを押下すると新規ダイアログが現れる。
新規ダイアログには「セキュリティーポリシーの設定」タブと「説明」タブがあるので、各種項目が意味する内容の詳細は「説明」タブの内容を参照のこと。

ADユーザーを追加する。

  1. サーバマネージャを開く。
  2. 右上の「ツール」を押下し、「Active Directory ユーザーとコンピューター」を押下する。
  3. 新しいダイアログが開き、ADサーバのマネージャが起動する(これも良く使うので、起動後、タスクバーに出てくるアイコンを右クリックし、「タスクバーにピン留めする」をしておくとラク)
  4. 左列からKERBEROS.LOCAL→Usersを選択する。
  5. Essentialsが追加したユーザーが見えるはず。
  6. 右上にある新規ユーザー追加ボタンより、新たなユーザーを行う。(今回はuser01)

確認

Linuxからマウントを試みる。あらかじめwin2012上でipconfigを行ってIPを確認しておくこと。(今回win2012サーバーのIPは123.123.123.10とする)

LINUXCLIENT:~/tmp>cat /etc/hosts
# File: hosts
# Dynamically created by nicConfig - do not modify.
# Original moved to hosts_last
# IP-Address   Full-Qualified-Hostname   Short-Hostname
127.0.0.1      localhost
127.0.0.2      linux.local               linux
123.123.123.20   LINUXCLIENT   LINUXCLIENT
LINUXCLIENT:~/tmp>cat /etc/krb5.conf

[libdefaults]
 default_realm = KERBEROS.LOCAL
 dns_lookup_realm = true
 dns_lookup_kdc = true
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]    
 KERBEROS.LOCAL = {
  kdc = win2012.kerberos.local
  admin_server = win2012.kerberos.local
  default_domain = kerberos.local
  kdc = win2012
 }
    
[domain_realm]
 .kerberos.local = KERBEROS.LOCAL
 kerberos.local = KERBEROS.LOCAL
LINUXCLIENT:~/tmp>ls
jmdb_ext.txt  krb5-client-1.9.1-24.9.1.x86_64.rpm  share
LINUXCLIENT:~/tmp>kinit user01@KERBEROS.LOCAL
Password for user01@KERBEROS.LOCAL:
LINUXCLIENT:~/tmp>klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: user01@KERBEROS.LOCAL

Valid starting     Expires            Service principal
12/17/13 22:42:23  12/17/13 23:42:32  krbtgt/KERBEROS.LOCAL@KERBEROS.LOCAL
        renew until 12/24/13 22:42:23
LINUXCLIENT:~/tmp>mount.cifs //win2012/secondShare ./share -o sec=krb5i
LINUXCLIENT:~/tmp>ls share/
existFileInDir2.txt  list  mountSuccess2.txt
LINUXCLIENT:~/tmp>kdestroy
LINUXCLIENT:~/tmp>umount share/
LINUXCLIENT:~/tmp>ls share/
LINUXCLIENT:~/tmp>

参考

Windows Server 2012 Essentials テクニカル ドキュメント
http://www.microsoft.com/ja-jp/server-cloud/windows-server-essentials/technical-documentation.aspx

Active Directoryを設定し、検証環境を構築しよう (1/3)
http://www.atmarkit.co.jp/ait/articles/1301/16/news011.html

Hyper-V over SMB の展開
http://technet.microsoft.com/ja-jp/library/jj134187.aspx

Active Directory ドメインユーザーのアカウントポリシー (1/3)
http://www.edifist.co.jp/onepoint/Password_policy.html

【Java】デバッグ用にダミーファイルを生成する。

テスト時にわざわざファイルを用意するのが、めんどくさい。
そんなときはPrintWiterクラスで文字列を流し込んだダミーファイルを用意する。


以下ソースコード

public static void createFile(String fileName) {
    try {
    file = new File(fileName);
    pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
        pw.println("Today max tmp is ");
        pw.println(10);
        pw.println("test Test file FILE ");
        pw.println("testTestfileFILE");
        pw.println("testTestfileFILE");
        pw.println(".");
        pw.close();
    } catch (IOException e) {
        System.out.println(e);
    }
}

【読書】A Guide to the Project Management Body of Knowledge: Official Japanese Translation(プロジェクトマネジメント 知識体系ガイド PMBOKガイド)

 既に英語版では第5版が発行されているけど、
日本語しか読めないので購入。

 プロジェクトマネジメントの根幹となる本であり、
その内容の良し悪しを述べるのは無意味。
なぜならば、現状PMBOKが標準であり、共通言語なのだから。

 PMBOKはあくまで知識体系であり、具体的なプロジェクトへの適用方法は述べられていない。
オブジェクト指向でいうところのインターフェース。
PMBOKを元に、その他から得たスキルを使って実プロジェクトに適用していく。

 各カテゴリで同様のことを述べている部分が散見されるが、
逆を言えば、問題となっているマネジメント部分の章だけ見ることで、
知識を得ることもできる。
 そして、ここまでしなければプロジェクトマネジメントはできないのか?
というほど、各カテゴリでインプット、アウトプットが定義されている。
現実問題として、ここまで厳格なプロジェクトの運用はできないが、
本来(PMBOKが)必要としている成果物や必要情報の入手を省いていることが、
実プロジェクトの8割がうまくいかない理由なのかもしれない。

 PMBOK通りにプロジェクトマネジメントをすることは
人的、時間的コスト上おそらく不可能。
が、知識としては必要。
(PMBOK的には)本来、何が必要か、何を行うべきか。
その知識がアタマにあるだけでも、マネジメントは広がると考える。

【読書】怒りのセルフコントロール

最初の100Pほどは科学的根拠の論述なので、 HowToだけ知りたいのならば、残りの200Pだけ読めばよい。

大別して以下のような方法で敵対心をコントロールする。  ・怒りをそらす方法  ・効果的に行動する方法  ・肯定的な生き方をするための方法

敵対性(怒り)をセルフコントロールをすることで人間関係の摩擦や、 不要な精神衛生の腐敗を防ぐ。

傾聴法、共感法などはファシリテーションでも利用するスキルであり、 本著に書いてあるテクニックをみにつけることは、 単に性格をよくする(?)する以上のメリットもある。

【読書】アジャイルサムライ−達人開発者への道−

アジャイル採用してないから関係ない”

どんな開発プロセスを使っていても、そんな言い訳はしないで読んだ方がいい。
TDD、TiDD、CIの概要もフォローしている。

内容はいまさら言うまでもないとして、本書が優れている点は以下の通り

  • 小サイズ、300P程度で携帯性に優れている
  • 5-6時間で読める
  • 取得言語に関係なく読める(簡単なC#は記載されてるが平気)
  • 訳がとても読みやすい

外食一回ガマンすれば買える値段なのでぜひ買うべき

公衆無線LANを利用する

自宅でフレッツ光を利用している人の場合。


基本方針:追加出費は最小限に。


フレッツスポットというサービスを利用すればWiMAXの追加契約やプロパイダ契約も変更しないで済む。
とりあえず光ポータブルはいらない。(なんのためにあるんだあのハードは)

まず以下のページから自分が利用したい圏内にフレッツスポットがあるのか検索
http://flets.com/spot/ap/ap_search_s.html

”使えそう”ならば以下のページからフレッツスポットを契約する(月額210円)
端末認証のスポットはめんどくさそうなのでやめたほうがいい。
プロパイダの契約はいらない。

フレッツ・スポット 公衆無線LAN
http://flets.com/spot/?link_id=f_spot

以下はWeb認証方式のスポットへの接続方法の説明

受付完了ページの各種情報をメモしておく。
あらかじめ「FLETS-SPOT」と「NTT-SPOT」を無線LAN設定に入れておけば、認証IDとパスワードがあればだいじょうぶ。

あとはお店に行って電波を捕まえて、Webブラウザを起動させれば認証画面になる。
IDの末尾に@e-flets.jpをつけるのを忘れずに。

まあ、ここまで書いたけど、タバコ吸わないならおとなしく無料のスタバLANを利用したほうがいい気もする。
at_STARBUCKS_Wi2


外出先でフレッツスポットを探す


ちなみに外出先でフレッツスポットのアクセス先を探したいときは以下のアプリが便利。
店の情報にDocomo-Wifiと書いてあってもNTT-SPOTならば接続可能のよう。

FLET'S 光WiFi Andoroidアプリ
https://play.google.com/store/apps/details?id=jp.e_flets.hikaristation

iPhoneアプリ
https://itunes.apple.com/jp/app/flets-guangwifi/id529670945?mt=8

JJUG ナイト・セミナー 「Java エンジニアのためのJava(再)入門」


概要


JUnitを使ったJavaのテスト入門」(19:00~19:50)

久保智

発表資料
http://www.slideshare.net/SatoshiKubo1/junitjava

今春に新しくエンジニアになられた方々は新人研修が終わり、
そろそろ現場に配属される頃かと思います。
そのような方々を対象にJavaのテスト方法の基本について解説します。
プログラムはただ作っただけで終わりではありません。
テストをして想定通りに動くことを確認する必要があります。
その第一歩としてJUnitを使った単体テストの方法について解説します。

「from old Java to modern Java ~職業プログラマに聞いて欲しいJava再入門」(20:00~21:00)

谷本心

発表資料
http://www.slideshare.net/shintanimoto/from-old-java-to-modern-java

エンジニアとしてすでにご活躍されている方々を対象に
Javaの新機能について解説します。
Javaが広く使われるようになってから10年以上経ちます。
その間に構文や機能について拡充が行われました。
新しい効率のよいライブラリの使用方法について解説します。


所感


なんとなくJava研修で言及される意味がわかった。
参加者の反応的に、言語仕様に技術者が追いついていない現状がある。

前半:JUnitってなんすかって人向け。
後半:Java歴が非常に短い人 or え?J2SE 1.4とJava SE5.0でそんな違うの?って人向け。

前半は半日で掴むJUnitの概要といった感じ。(新人研修みたいな)
アノテーションの確認から入るレベル。
チュートリアル部分は
Eclipseで右クリックして出てきたメニューの中から。。。」
というレベルだったので、聞いていない。

後半は
「このバージョン以降は○○を使ってスマートにリファクタリングできるよ」
と言った流れ。
今、調べたらリフレクションがJ2SE 1.2からの仕様だったのでちとびっくり。
#「1.4とかジェネリックもリフレクションもないんでしょ()」って思っていたから赤っ恥

いまだにJ2SE1.4で開発しているプロジェクトがあることにも驚いた。
#インフラ系や金融系は簡単に移行できないからしょうがないだろうけど
登壇者も「1.4から7に移行するくらいなら完全新規のほうがマシ」とのこと。

あと、Oracle日本本社でやったのにNetBeansが公開処刑にあっていた
#開発版はすこぶる評判がよくないらしい。

結論

InteliJでJava SE8 EA版を遊び倒すべしべし。
https://jdk8.java.net/download.html

JavaFXのデモzipだけでも結構楽しい。※要install JRE7, JavaFX 2.0


宣伝


ENdoSnipe

http://www.endosnipe.com/ OSSのJava解析ツール
#レガシーコードやOSSのリバースエンジニアリングに使えそう。

TDDBC(Test Driven Deployment Boot Camp)

http://devtesting.jp/tddbc/
次回は7月に楽天タワーにて開催予定。


JUnitを使ったJavaのテスト入門」


発表資料
http://www.slideshare.net/SatoshiKubo1/junitjava

JUnitを使わないと

プログラムがちゃんと動かないときどうするか?

Debugプリント。
デバッガでブレイクポイントとか。。。

上記方法の問題点

テスト方法を記録できない。
テスト実施手順を再現できない。
テスト結果を簡単に参照することができない。
テスト再現には人がもう一度操作する必要がある。
 

 

問題点の何が問題なのか?

一回テストをパスできればいいのではないか。
→そんなことはない。
  例えばWindows OS開発。
Windows OSは短期間にアップデートやセキュリティパッチがリリースされる。
 

ソフトウェア開発一般論

一度リリースしたソフトウェアを更新しないで済むことはあまりほぼ無い。
近年のソフトウェアは大規模・複雑なので、変更の副作用がどこで発生するか予想できない。
機能追加・機能変更後にリグレッションテスト(回帰テスト)することが必須になっている。
 

リグレッションテスト(回帰テスト

変更追加したとき、新たな不具合が起きていないか検証するテストのこと。
しかし、今までのテストを全て再度人力で行うとなると膨大な工数がかかる。#3ヶ月とか
一ヶ月単位でリリース・アップデートを行うソフトウェア開発で上記のような人力テストでは対応できない。

なぜJUnitを使うのか

テストした内容を記録・テスト結果を再現するため。
いつでもテストを再実施できるようにしておくことでデグレを防止する。
テストは機械にやらせて人は開発に集中!

JUnitが不向きなソフトウェア開発も当然存在する。

一度のリリース使い捨てにされるソフトウェア
数年単位でリリースするようなソフトウェア

JUnitの使いかた

・入手方法 IDEを利用しているならば大半がデフォルトで添付されている。

JUnitができること

特定のメソッドに対して、引数を指定し、期待された結果が得られるか検証できる。
#このへんはWikiでも見たほうがわかりやすい。

EclipseJUnitの使い方

#いくらでも転がっている&キャプチャ見ながらのほうがわかりやすいので割愛


HowTo本

JUnit実践入門


assertEqauls()を例にしたが、複数の値を検証できるaseertメソッドの使い方もフォローしている。
JUnitだけではなく、Jenkinsとの連携方法やAndroidアプリでの利用方法も記載されている。

実践テスト駆動開発


JUnitを開発手法のメインにした開発プロセス
テスト駆動開発(TDD: Test Driven Deployment)はxUnitを利用しなければいけないというわけではない。
テストと実装(品質検証と機能実現)を交互に行うことで、
品質を確保しながら実装を行える。


TDDとは

バグが半分以下になることで有名(らしい)
IBMとMSではTDD導入により、欠陥密度が(バグ/ステップ数)が格段に下がっている。
Visual Studio開発などでは実装時間は15-30%増加したが、
欠陥密度はTDDのほうが1/10になった実績がある。


質問時間

なぜ、assertEquals()を例に説明したの?

JUnit初期のバージョンから存在する。直感的でわかりやすい。
#JUnit4を使うならばassertThat()のほうがデファクトスタンダード

Privateメソッドのテストの仕方は?

→リフレクションで強引にやれる。
→しかし、privateメソッドがそんなに重要ならば、Object志向的に別クラスにしたほうがいいのでは。
→リフレクションだと、メソッド名変わったらテスト失敗してしまう。

#本来はメソッド名の変更により失敗するようなテストケースは
#テスト仕様として除外(or変更に対応)されているはずなので、
#テストで失敗するということは、テスト検討漏れ、
#設計変更の影響範囲の過少評価の可能性がある。
#よってテストするにこしたことがない。
#コピペメソッドみたいなのが乱立するならば、privateメソッドで部品化しておいたほうがいい。
#別クラス(Utilクラス?)にするという設計思想はよくわかりまてんでした。


from old Java to modern Java


発表テーマ:イマドキのJava ~文法編

Javaのバージョンアップによって進化する文法について。

発表資料
http://www.slideshare.net/shintanimoto/from-old-java-to-modern-java


Java 1.4→1.5

メンバ変数にthisは付けない。

#thisを付けなくてもIDEが色分けしてくれる。

キャメルケースを用いること

#スネークケースが悪いわけではない。Javaは伝統的にキャメルなのでリーダブル
#エラーはエクセプションで伝播させること。
#異常値をreturnするのはC-Like(関数言語的)な実装。

変数は使う直前に宣言する。スコープはできる限り小さく。

C言語に慣れていると関数の最初に宣言しがち

ハンガリアン記法はつかわない

#int型にiFoo、char型にcBarとか。

引数に戻り値への参照を渡さない。(引数渡しで値を変更しない)

値を返却できたときは正常。異常値は例外で再現する。
#1メソッド1機能の原則が守られているならば、戻り値で変更することが可能なはず。
#どうしても複数変更したいならば、それはクラス化して一括管理(戻り値に)すべき。


Java1.5→Java SE1.6

ListなどのCollectionはジェネリックを利用して扱う型を明確に。

#なんでも入るようなListではいけない。

for each(拡張For)構文を使ってイテレーションはシンプルにするのがリーダブル。
enumクラスを使いましょう。

1.5以降で定数インターフェース使っている場合。
enumクラスをstatic importする。
static importが1つ以上あったら*になるようにIDEを設定しておけばよい。

Native2asciiは面倒だから、IDEのプロパティファイル編集機能を使う。

Java SE6止まりで、Java SE7仕様あたりからあやしい人が多い。


Java SE6→Java SE7

finalyでcloseするのは古い定石。

tryでリソースを宣言すると、tryブロックから抜けるときにcloseされる。
ファイル読むだけならreadAllLines1行で終了することも出来る。
#読込行ごとに処理を変更する場合は別。

hashCodeが自動生成できるようになった。
before

自前で実装すると死ぬからだいたいIDEで自動生成

after

Java SE7はObject.hash一行で終了

Collectionの宣言で右辺の型名は省略する。
ex: List fooList = new List< >
オブジェクトハッシュが追加されたのは大きいですよー。


Java SE7→Java SE8

いよいよ導入されるProject Lambda

Before

ListをSortする場合、Comparatorを使う。

after

Listのstream処理を開始。
stream().filter(抽出条件).sorted(整列条件).collect(結果収集)
これでリスト検索&サーチが完了する。
filterで絞り込んで、sortedでソートして、collectで取り出す。
ファンクションインターフェース。ひとつだけ実装が必要なインターフェース。

List処理や、アクションイベントなどの
単一メソッドの無名クラスはLambda式で解決。
stream()を使うほうが性能的にも俄然早い#そしてスレッドセーフ(!)