Yabu.log

ITなどの雑記

「これだけでわかる!初歩のUMLモデリング」を読んだ

UMLについて本を探していたところ、匠道場主催の萩本さんが書かれている本があったので読みました。

読んだ動機

  • クラス同士の関係性を俯瞰できるようになりたい
    • ソースを読んで理解だと時間がかかりすぎる
  • 技術的なコミュニケーションをUMLを使うことによって改善したい
  • 設計を考えるときの思考ツールとしてUMLを使いたい
  • UMLで実装アイディアを説明している本を読めるようになりたい

SQLやPGを一行単位で日本語で訳したエクセルドキュメントしか作れないようでは、 設計スキルを向上させたり設計ノウハウを学ぶことはできないという危機感がある。

UML

クラス図

クラス間のメンバとクラス間の関係性を記述する。 個人的にはUMLといえばクラス図、という印象がある

メンバの可視性

記号 アクセス修飾子 意味
+ public 効果
- private 効果なし
~ なし パッケージ内に効果
# protected サブクラスにのみ効果

関係性

関係性には以下の5種類がある

このリンクが網羅的・簡潔でわかりやすい http://blog.asial.co.jp/712

オブジェクト図

https://www.ogis-ri.co.jp/otc/swec/process/am-res/am/artifacts/objectDiagram.html 調べてみるとインスタンス図と呼ばれることがあるらしく、名称はこちらの方がしっくりくる。 多重度・メンバを全て排除した状態で展開し、クラス名の左にインスタンス名を加えて、インスタンス同士の関連を表現する。

クラス図に対して実際のインスタンス同士を図示するとこうなる、といった点を表現するのに便利。 クラス図を補足するような位置付け。あくまで主役はクラス図であるが、抽象的な思考が苦手であったり、具体例をイメージしたい場合は有効。

シーケンス図

クラスの完の処理の流れを書く インスタンスの生成から消滅までを扱う。

ちょっと使い方は違うけど、クラス設計ではなく、DB設計の時に利用した。 複雑なトランザクションが必要な業務要件をシーケンス図で表したことがある。 具体的には「私のテーブル設計だと、このように処理が進むのでうまくいく」ということを示すのに使った。

コラボレーション図

シーケンス図を抽象化したもの

ユースケース

ユーザーがシステムを何に利用するか?という点を整理した図。 これは読みやすいので、アクターを利用者、ユースケースを業務とかに置き換えれば ユーザーと同じ資料を共有できると思う。

ユースケースモデル

  • 棒人間で表現したアクター
  • 楕円で表現したユースケース を繋げる。

システムのどの機能にどのユーザーが関わるか? を記述する。

ユースケース記述

  • 概要
  • アクター(利用者)
  • メインフロー(処理の流れ)

の3つがワンセットになる。

アクティビティ図

業務フローを表現する 格アクターの行う処理をフローとしてつなぐ

フローチャートっぽいけど、処理の詳細は書かずに、概念レベルでまとめる。 どのアクターの処理がどの順番で行われるか?という点が大事。複雑な承認の流れを整理したい時に使えると思う。

感想

  • UMLはクラス図だけじゃない。
  • 活用の具体例が豊富
  • 上流で開発する人向け?
    • UMLの適用をシステムではなく、ビジネスにフォーカスしている。
    • コードはあまり出てこない
    • 下流工程でのノウハウは少なめ

この本はUMLの説明とそれを活用したプロジェクトの進め方が約5:5で構成されている。

UMLを最初に見たとき(学部の授業)の感想は「なにこれ使えるの?」だった。最初に覚えることが多すぎる割に実践する機会がないのですぐに忘れてしまった。資格試験でたまに見るけど、4択クイズになっているので適当に選んでほぼ正解するし、深い部分の理解は得られない。 そんな矢先、最近デザインパターンの本を読んでUMLに再開した。 クラス図を書け、という章末問題をといた際、汎化の矢印を逆向きに書いてしまったことから、改めて復習する必要があると感じて本書の購入に至った。

この本は実際のシステム開発UMLをどう適応していくか、という視点で書かれているのでかなり参考になった。

クラス図だけじゃない

UMLと言えばクラス図、というイメージがあるが、 ユースケース図などは、使ったことがない。必要でなくなったのではなく、それが表す必要がある概念を別の方法で表しているだけだ。

大体は箇条書きになった文章やよくわからない長文になっているように思う。 そこからユースケース図で表していることを読み取ったり、整理するのに非常に時間がかかる

ユースケース図はエクセルでも簡単に作れると思うので、現状のシステムや要件の分析から始めたい。 そして技術者同士のコミュニケーションに積極的に利用していきたい。 オレオレUMLになってしまうと思うが、なるべくスタンダードなものに近づけたい。

UMLは古くなったのか?

それぞれの図で表せなければいけないことを、長い時間を書けて個人が再発明してしまうだけだと思うので、UML自体を学んで活用することは無駄ではないと思う。

UMLを使ったプロセスの話

著者はユーザーとのコミュニケーションにもUMLを活用するよう進めているが、私は所詮下流担当なので厳しい。

「テスト駆動開発」読書会 Vol.6 に参加

テスト駆動開発

テスト駆動開発

23章から28章を読みました。

xunitは自作するようなものなのか?

24章にxUnitは作って当然、といった態度の記述がある。

私が新しいプログラミング言語に触るときには、まずxUnitを実装してみる。8個から10個のテストが動作するようになるころには、日々のプログラミングに必要な機能は登場していることだろう。(テスト駆動開発24章より)

過去のプロジェクトで開発に試用版(Express Edition)を使っていたため、MSTestが使えず、また客先なのでライブラリの導入も難しいという実体験がありましたが、こういう時に簡単なテストツールをサクッと作るようなものなのか、という私自身の実体験から話題に挙げてみました。*1

普通はだいたいどの環境にも標準のものが用意されているので、必要になって作ったりしない。これは趣味の領域。*2ということだそうです。

Assertionエラーと実行時エラーの扱いを分けることについて

xUnitを使い始めると、アサーションの失敗と、テスト実行中に起こる他のエラーとの大きな違いに気がつく。アサーションの失敗は、デバッグにずっと多くの時間がかかる傾向にある。このため、xUnit実装の多くは失敗(アサーションの失敗)とエラーとを区別する。UIも2つを分けて表示する。特にエラーを上のほうに表示することが多い。

テスト駆動開発24章より引用

  • Error:実行時のエラー(ぬるぽとかの実行時例外等)
  • fail:Assertionの失敗(メソッド戻り値が期待していたものと違う)

は分ける必要があるのか?

  • 実行時のエラーはプログラムが壊れている、Assertionのエラーはロジックが壊れているということでは?
  • 一部のビルドツール(Ant)ではテスト中の実行時エラーをビルド失敗とみなすのでこの違いは重要。

悩み:Todoが爆発してしまう

とりあえずTDDを始めたが、うまくいかずタスクに親(前提として行う必要がある作業)子供と孫(そのタスクのサブタスク) が増殖してしまう。

TDDを普及させるにはプロジェクトに余裕が必要

TDDを普及させるにはプロジェクトに余裕がないと難しい。 どうしても短納期だと最短パスで動くものを作ることになってしまう。

  • 会社の方針(教育)も重要。
  • 自社開発しているところだとTDD積極的にできそうですね。
    • 自社開発でもプレスリリースを出されちゃうと納期が決まるのでどうしてもウォーターフォールになってしまう。

設備について

  • 背もたれのついていない椅子を使うのは辛い。
  • 職場に外部ディスプレイがないときつい
    • 自分だけ持ち込んで使っている(猛者)

テストコードは納品するのか

  • そこは契約による。
  • QAのコードはTDDのコードとちょっと違う。

モック

27章のモックのコードは、モックの準備をしているだけ。

@Test
public void testOrderLookup() {
    Database db = new MockDatabase();
    db.expectQuery("SELECT order_no FROM Order WHERE cust_no = 123");
    db.returnResult(new String[] {"Order 2" ,"Order 3"});
    . . .
}

...以降このモックを利用したテストが続く。未経験者には理解が厳しいかもしれない。

  • モックは作るようなものなのか?
    • だいたいどの言語でも標準のモックが作られているからそちらを利用するのが推奨。
  • ファイルの入出力のモックはどうやって作れば良いのか?
    • プロダクションコードの方を引数をreade,writeのインターフェースを利用したメソッドにする
  • そもそもモックはなるべく使わない方が良い(必要最低限にするべき)
  • 外部に接続するような処理(URL)のモックだと、ローカルのディレクトリを使ったりする。

    equalsのテストは書くのか

  • IDEに生成させたロジックなどテスト不要では?
  • そもそもEqualsをIDEに作らせるのは危険
    • クラスに新しくメンバを追加した時、Equalsに反映されない。バグに繋がる恐れがある。
    • Javaは最近だとLombokなどを使う。

勉強会後、改めて思ったがEquals契約が守られているかを検証するテストをきちんと書こうとすると難しいと思った。

  • 反射性(reflexive): null以外の参照値xについて、x.equals(x)はtrueを返します。
  • 対称性(symmetric): null以外の参照値xおよびyについて、y.equals(x)がtrueを返す場合に限り、x.equals(y)はtrueを返します。
  • 推移性(transitive): null以外の参照値x、y、およびzについて、x.equals(y)がtrueを返し、y.equals(z)がtrueを返す場合、x.equals(z)はtrueを返します。
  • 一貫性(consistent): null以外の参照値xおよびyについて、x.equals(y)の複数の呼出しは、このオブジェクトに対するequalsによる比較で使われた情報が変更されていなければ、一貫してtrueを返すか、一貫してfalseを返します。
  • null以外の参照値xについて、x.equals(null)はfalseを返します。

https://docs.oracle.com/javase/jp/9/docs/api/java/lang/Object.html#equals-java.lang.Object-

標準ライブラリのテストは書くのか?

例:JQueryのparseJSONはJSON.parseをそのまま利用している。

https://github.com/jquery/jquery/commit/93a8fa6bfc1c8a469e188630b61e736dfb69e128

...
jQuery.isArray = Array.isArray;
jQuery.parseJSON = JSON.parse;
jQuery.nodeName = nodeName;
...

正規表現が使われている処理のテスト

  • OSS正規表現を使っているところのバグを見つけたことがある
  • 正規表現は念入りにテストしないとダメ
  • 誤った正規表現がよく使われている。例えば「.」をマッチさせたいために/./を使ってしまう等(正しくは/\./)
  • 正規表現で言語をパースするのはだめ。
    • 初期のphpperlを呼び出して正規表現でパースしていた気がする
      • 今はそんなことやっていないと思います。

わからなかったこと

トランザクショナルメモリの記述は何が言いたいのかわからない

参加者全員が頭を掲げることになりました。

ミュータブルなオブジェクトについての議論

ORマッパーやDSL,Rubyのrakeの話になり、どれも名前は知っているが 経験がないので話についていけませんでした。

Self Shunt

テストクラス自体がモックオブジェクトになるようなテスト実装のことらしいです。 サンプルがpythonで書かれているため、*3勉強会中に理解できませんでした。 これはPatternらしいのでJavaの実装をよく読んで理解したいです。

モック

自分のモックの理解が参加者のそれとずれてしまっているような不安を抱いてしまいました。 話を聞いてインターフェースをメソッドの引数の型にする。ということ以上のことがわかりませんでした。 ここは後述のTest Doubleを掘り下げていけばわかる気がします。

初心者おすすめ

勉強会に参加してやはり経験者との知識の壁を感じた。 まず入門書が読むべきドキュメントはありませんか、と質問したところ主催者のはむはむさんから、Test Doubleをオススメいただきました。

goyoki.hatenablog.com

感想

写経パート(第1部、第2部)が終わったため、コードを読むページが減り*4、実際のノウハウについての議論が多くなりました。

今までTDDは完全に絵空事でしたが、最近TDDを導入し始めたので、実践の悩みというものを持てるようになりました。 一人でやっているとわからないことだらけなので、こういう勉強会は本当に助かります。

テストは情報が多すぎてどこから手をつけていいのかわかりません。いつも英語で分厚い*5xUnit-Test Patternsにたどりついてしまいます*6

xUnit Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series (Fowler))

xUnit Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series (Fowler))

とりあえずオススメいただいたTest Doubleから着手しようと思います。

*1:請負をメインでやっている会社だと、案件で開発を効率化するツール(xUnit)を作りたいとなっても、 開発時間や予算を了承するのは困難を極めると思う。

*2:作ったことがある猛者もいるらしい

*3:私の母国語はJavaなのです。。。

*4:コードが乗っていると、どうしても実装の詳細に踏み込んでしまいがち。

*5:833ページ🙄

*6:この本は諸事情により翻訳が難しいそうです。

「BPStudy#125〜テスト駆動開発(TDD)の真髄」に参加

ビープラウドさんが主催されているBPStudyに参加しました。 生でt_wadaさんを見るのは初めてだったのでちょっと緊張しました。

ライブコーディング

@t_wadaさんのライブコーディング(TDD)を見ることができました。 ライブコーディングではFizzBuzzをコーディングしながら、 TDDにおけるノウハウ・テクニックを和田さんが実践して提示する、というスタイルでした。

基本的書籍のテスト駆動開発に書かれているテクニックと同じでしたが、 ライブコーディングを見ていて本には書かれていない、面白いテクニックが何点かありました。

わざとエラーとなるコードを書いてEclipseにコードを生成させる

これは私もVisualStudioでよくやるのですが、 足りないメソッドを追加させたり、が関の山で、t_wadaさんはテスト対象のクラスまでEclipseに作らせていました。 確かに、完璧にテストファーストで実践すれば、IDEのメニューをマウスでカチカチ選んで追加するのはテストファースの「テスト」のみで良いはずです。 これは新しい気付きでした。

排除すべき重複の判断

RED -> GREEN -> リファクタリング(重複を除く)

のサイクルがTDDの基本ですが テストコードの重複の排除は慎重に行う必要があり、 2箇所だと行わない、という意見もあるそうです(3つ以上で初めて本質的な重複と考える)

これをスリーアウトと呼ばれていました。

Assert rouletteアンチパターン

xUnit Test Patternsの「テストコードの不吉な匂い」に書かれている内容の一部のようです。

xUTP Magazine - xUTP Topics: 第三回 xUnit Test Patterns の世界観「テストコードの不吉な臭い」

まだ、本書を全部読んだわけではないですが、antiとか rouletteとかで検索してなかったので多分載っていないと思います。 FizzBuzzだと3,5の倍数以外は普通の整数を返しますが、それをまとめて

@Test
void testNumber(){
  assertEquals(fizzBuzz(1),"1");
  assertEquals(fizzBuzz(2),"2");
  assertEquals(fizzBuzz(2),"4");
  ...(以下略)
}

という風に書いてはいけない、ということです。

理由は ・失敗した場合、どのデータで失敗したのかわからない ・失敗した時点でテストが切り上げられる ・後から見返した時に何をテストしたかったのかわからない。 などです。

@Test
void testNumber1(){
  assertEquals(fizzBuzz(1),"1");
}

@Test
void testNumber2(){
  assertEquals(fizzBuzz(2),"2");
}
...(以下略)

のように、assertionを追加するのではなく、テストメソッドを新しく作りましょう、 という提案がありました。*1

TDDの現状

テスト駆動開発は、プログラミング中の不安をコントロールする手法だ。”

抜粋Test-Driven Development前書きより

テスト駆動開発

テスト駆動開発

  • 不安な箇所のテスト粒度はどうしても細くなる
  • 自身がある箇所のテストはステップが大きくなる

という傾向があり、TDDでテストを作ると基本的に粒度が揃わないそうです。 実装していない人が、後からテストを見直しても、粒度の違いから何も読み取れず、

作者の気持ちを答えよ、

状態になってしまう。という指摘がありました。

TDDで開発した後に、テスト粒度を揃えることが大事です。 常に対称性を持たせろ、という意味ではなく、意味のある構造を持たせろとのことでした。

最近は前任者がよくわからないテストを残していったが、なんのためのテストかわからなくなっているが、 消すのも怖いので管理するコストが増加している、というのが最近の傾向とのことです。

10年前に比べてテストは書くようになったけど技術的負債になりがち*2

LT

錬金術MeetUpへのお誘い

TDDの読書会に参加されておられる方のLTです 賢者の石を作ろう、的なものではなく お金を編み出す技術、についての会合らしいです。

UnitTest Anti-Pattern

Unit Testのアンチパターンの紹介です。 実践している人向けだと思います。経験値のない初心者(私)には厳しいです。

オンラインPython学習サービスPyQの価格決め

主催の佐藤社長の発表です。

ぐるぐる読書会というコンセプトがいいなと思いました。

各自が本を持ち合って、付箋などで気づいたことを共有しながら本を読むそうです*3

電子書籍でもKindleePubで遠隔地の人同士でSNS的に出来ると面白そう、と思いました。 ビジネス的には本は共有出来なくてもメモは共有できると思います。 epubのリーダーにSNS的な機能がつけば実現できるのかな?と思いました。

おすすめの本は早速書いました。

感想

自動テストではありませんが、FizzBuzzのテストは一度考えたことがある、ので

qiita.com

TDDならこうなるのかというコントラストが印象的でした。

TDDを実践すると、少しずつソース・テストが育っていくのだ、ということを改めて実感しました。 講演中に和田さんがなんどもおっしゃっていましたが、「どちらが正しいとかはない」「正解はない」というのは本当だと思います。

「テストの自動化」とか「テスト駆動開発」はかなりのパワーワードなので手段が目的化しないように気をつけたいところです。

わからなかったこと

私は業務でテストコードを書いたことがまだない、全くの初心者ですが、例えばFizzBuzz程度の小さなプログラムでも テスト駆動で作るようなものなのか気になりました。

というのも私のTDDデビューとなりそうなプログラムがFizzBuzz並みに小さく、TDDで書くより普通に組んだ方が早く思えてしまいます。 加えてデータベース接続とファイル作成削除があるのでTDDをやろうと思うと、モックやインターフェースやラップクラスがたくさん出来てしまい、 単純な機能なのに無駄に管理コストが高くならないか、という日頃の不安から、上記の疑問点を思いつきました。 *4

  • 質問の際にうまく考えがまとまらなかった
  • 初心者だから遠慮するというしょうもない選択肢を取ってしまった

ので質疑応答の際に発言できませんでした。

*1:DBアクセスを伴わない、オンメモリ上で完結するクラスの計算などの場合は・・・と前置きして説明されましたが、DBやネットワークなどが絡んでくるとまた違うのでしょうか?そこの説明は特にありませんでした。

*2:私に関しては10年前にもいけていませんが

*3:きちんとメモを取っていなかったので勘違いでしたらすいません

*4:またシグネチャを凍結するレベルの詳細設計書を書いてからコーディングをするような雰囲気があるのでリファクタリングなど禁じられないか不安です。

「第33回 ゆるいハッキング大会」に参加

犯罪に繋がりそうな具体的な手法・知識については書きません。 感想と自分が勉強会から得たことを備忘録程度に投稿しようと思います。

この勉強会について

大会と名前に付いていますが、戦ったり、競技要素はありません。*1

この勉強会への参加は4回目。 業務でサーバーやネットワークの設定を一切しない、SSHを一切叩かない自分にとっては セキュリティやインフラについて生きた知識をまなべる数少ない場です。

また派遣で働いているので、インフラ部隊と開発部隊が綺麗に分業されているせいか、 仕事でそういう知識の人とほとんど出会えません。とにかく参加されている方は素敵な方ばかりなのでかなり楽しめました。

感想

セキュリティ・インフラについて完全に素人の私からすると、かなりディープな内容ですが、 インフラを職業にされている方にとっても「初めて見ることがほとんど」とのこと。どのような業界の人でも得ることは多いと思います。

ハッキング・・・と聞くと、ガチガチに固めた政府機関を天才少年が突破していくイメージがありますが、*2 いわゆるペネトレーションツールを使った攻撃、というのは適切な防御が貼られていない場所*3にのみ置いて有効というのが私の理解です。

ペネトレーションツールを使った実際の攻撃方法を知ることで、どのようなセキュリティ方針をとるのか、今のセキュリティは本当に大丈夫なのか? といったところにフィードバッグを流せることがが醍醐味だと思います。

以下勉強会の収穫(知らなかったこと)

Linuxの実機での環境の作り方

仮想環境上(vmware virtualbox)にしか構築したことがなかったのでこの辺の知識は知らなかった。

ラズパイ上に作るときの注意

Raspberry pi用のKali LinuxはOSが利用できる領域がデフォルトで8GBになっているらしいが、 OS自体がほぼ8GBあるため、ギリギリOSアップデートはできるが、apt-getができないらしい。 対策としてmicroSDに書き込む前にOSが利用可能な領域を16GBに増やす用に設定するようにアドバイスがあった。

microSD上にOSを複数入れれば、まるでゲームのカートリッジを切り替えるようにOSを切り替えれるのではないか? と思ったが、よく考えるとUSBブートと変わらない。けどあの小さな個体でできるということにワクワクする。

shadowファイル

etc/の下にuser名とパスワードをhash化?(暗号化?)したペアを保持しているファイルがある。

https://qiita.com/n0bisuke/items/4e4419290d789699cafa

こちらの記事を参考にユーザーを追加してみたところ、shadowファイルに追加したユーザーの情報が 追加されていた。

他の勉強会でも「侵入したOSのXX配下にshadowファイルらしきものを発見〜」という説明を聞いて 意味がわからなかったが、今回の勉強会で丁寧な説明があったので理解できた。

詳細は書かないが、このshadowファイルにも解析ツールがあるらしいが、最近は対策されており解析しにくくなるハッシュアルゴリズムが使われているとのこと

PSKは危険

過去の勉強会中にPSKの解析に成功した方がいたらしい。(すごい!!!!) PSKはもう危険だからWPA2でも使うなとのこと。*4

exploitという語句の意味

よく聞くが意味を知らなかった。 対応が完了していない脆弱性を悪用したコードというくらいの意味らしい。 PoCは似ているけどちょっと意味が違ってて脆弱性を証明する再現コードのこと。

仮想環境に置けるWifi子機の利用について

BUFFALO 無線LAN子機 Air Station NFINITI 11n/g/b USB用 WLI-UC-G301N

BUFFALO 無線LAN子機 Air Station NFINITI 11n/g/b USB用 WLI-UC-G301N

  • USBの子機は上記のものを利用している。
  • virtual box + usbのWifi子機でやったが無理だった
    • 起動・動作するが、パケットのキャプチャを5分程度連続して行うと、Wifi子機から反応がなくなる。
    • Kali Linuxに詳しい人がいたが、同じ機種で行なっていたので驚いた。
      • そのため必ずしもWifi子機が悪いわけではないらしい。
    • typeC & USB3の変換ケーブルが悪いのでは?との指摘を受けた。
      • usb Cはまだいい加減なものが多いらしい。
    • 帰宅後早速検証してみたところ、USBのバージョンの設定がUSB3ではなくUSB2になっていた・・・
      • USB3に設定したところ、うまく動作した。WEPのクラックがずっとできなかったが、やっと成功した。
      • こんな簡単なパスワード(AAAAA)でも20分以上かかった。またファンのなり用がすごい
        • MacBookProにかなり負荷がかかっているようだ
          • 仮想環境だからなのだろうか?実機でも厳しそうな気がするが・・・

中華系メーカーのbluetoothイヤホンが充電中に溶けた件

  • 中華の廉価イヤホンだからまあこんなもんかと思っていた
    • 雑談の話題に出したところ、発火などの人命に関わる被害があるものは他のものと優先度が違うらしい。
    • きちんと販売元に送って調査してもらったほうが良いとのこと。

Kali Linuxは普通にDLするのではなくTorrentでDLするのが良いとのこと。

yuyubu.hatenablog.com

  • この記事に書いた通り、日本にミラーがないと勝手に困っていたが、Torrentを使うのがいいらしい。 
    • P2P怖い。多少時間かかってもDLかなぁ。まぁ参考にしてみてください。

*1:少なくとも私が参加した回では

*2:年始の相棒とかそんな感じでしたね。

*3:弱いパスワード、不適切なゲートウェイの設定等

*4:無線LANのセキュリティはWEPが危険、しか意識していなかった

VirtualBoxのネットワーク設定

Not attached

ネットワークを使わない

NAT

VirtalBoxが提供しているしているNATの機能を使う。 デフォルトでは動かなかった。何か設定が必要らしい。 一応ゲスト→外部は通信できるが、もちろんNATなので逆は不可能。 行いたい場合はポートフォワーディングが必要。 また同ホスト上のゲストOS同士は通信できない。

NAT Network

NATとほぼ同じだが、NAT Networkでは同ホスト上のゲストOS同士が通信可能

Bridged Adapter

  • 指定したネットワークIFをホストと共有する。
  • ホストとは別のIPが振られる。
  • ホストと通信可能。(ホストゲスト双方向からのPingが通る)
  • ホストと同じネットワークに存在している端末とも通信可能

一番設定が簡単だが、不用意に周りの端末に影響を与えてはいけない場合は使うべきではない*1

Internal Network

ホストとの通信は不可。 ただし複数起動させたゲストOS同士の通信は可能。 またホスト側のネットワークIFを一切利用しない

同ホスト上のゲストOS同士は通信可能

Host-only Adapter

ホストとの通信のみが可能。 例えば隔離したWebアプリの検証用のサーバーを作りたいけど、どうしてもホスト側のOSではダメな時に有用だと思う。

所感

以前ネスペの敗北記事にネットワークの経験値をあげるには、実務経験か課金(高額な機材の購入)が必要という趣旨のぼやきを書いたが、 Oracleのドキュメントを見てるだけでも、多少はネットワークの経験値をあげれそうな気がして来た。

参考または関連

*1:自分だけの閉じたNWとかなら問題ないと思う。

Octaveの基本的な使い方

機械学習のプロトタイプを作るのはOctaveが効率的らしい。 RやPythonなどを使う人もいるが、入門者が学習目的で学びながら作成したり、 プロトタイプを作るのにはOctaveが一番効率的、とのこと*1

基本的な演算

加減乗除

%はコメントです。

5+6 % 加
3-2 % 減
5*8 % 乗
1/2 % 除
2^6 % 冪

比較

1 == 2 % eq
1 ~= 2 % not eq

論理演算

1 && 0   % AND
1 || 0   % OR
xor(1,0) % XOR

画面表示にまつわるTips

  • コンソールの表示を変える
octave:1> PS1(">>");
>>

これで下記の例だと一行目のアプリ名が省略されシンプルになる。*2

  • セミコロン(;)を文末に加えることで代入じの画面表示を抑制
>> a = 3
a = 3
>> a =3; %次の行の出力で何も表示されない
>>            
  • フォーマット文字列
octave:2> disp(sprintf('pi is: %0.2f',pi))
pi is: 3.14
octave:3> disp(sprintf('pi is: %0.5f',pi))
pi is: 3.14159

formatコマンドで通常時の出力の形式を指定することも可能

octave:10> pi
ans =  3.14159265358979
octave:11> format short
octave:12> e
ans =  2.7183

行列・ベクトル

列はスペース区切り、行はセミコロン(;)で分割

octave:13> [1 2; 3 4; 5 6]
ans =

   1   2
   3   4
   5   6

便利な生成方法

繰り返しによる指定

>> v = 1:0.1:2 % 開始:増分:終了
v =

    1.0000    1.1000    1.2000    1.3000    1.4000    1.5000    1.6000    1.7000    1.8000    1.9000    2.0000

各要素が1または0の行列作成

もちろん列数を1とすることでベクトルも生成可能

>>ones(5,2) %ones(行数,列数)
ans =

   1   1
   1   1
   1   1
   1   1
   1   1
>>zeros(4,5)
ans =

  0   0   0   0   0
  0   0   0   0   0
  0   0   0   0   0
  0   0   0   0   0

各要素が乱数になる生成

>>rand(3,3)
ans =

   0.73882   0.56016   0.60064
   0.11604   0.50570   0.85379
   0.39978   0.77641   0.19745

>>rand(3,3) %乱数なので毎度結果が異なる
ans =

   0.89295   0.34303   0.34988
   0.56998   0.35830   0.72597
   0.94476   0.56983   0.84483

正規分布

>>randn(3)
ans =

  -1.432169  -0.156601  -1.509394
  -0.015477  -0.704944   0.749234
  -0.653065   0.098928  -0.296580

ヒストグラム

>>w = rand(1,1000);
>>hist(w,100)

行列・ベクトルのサイズ

size(m)   % 行数 列数の1*2の行列を返す
length(v) % 行列の長さのうち長い方を返す

どちらも行列、ベクトル双方に利用可能だが、混乱の元になるので 行列にはsizeを配列にはlengthを利用するのが良い。

ワークスペースにある変数の操作

どのような変数があるか調べる

>>who
Variables in the current scope:

a    ans  v    w
>>whos %型まで表示する
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        a           1x4                         32  double
        ans         1x1                          1  logical
        v           1x11                        24  double
        w           1x1000                    8000  double

Total is 1016 elements using 8057 bytes

変数を消す

>>clear a % clear <消す変数(指定がなければ全部削除)>
>>who
Variables in the current scope:

ans  v    w

>>clear
>>who
>>

ファイル操作

ファイルに保存する

>>save matrix.mat m; % save <保存ファイル名> <保存する値>
>>ls
matrix.mat

vim で保存したが、読めないことはない。

# Created by Octave 4.2.1, Fri Jan 19 13:01:52 2018 JST <俺の個人情報>
# name: m
# type: matrix
# rows: 3
# columns: 2
 1 2
 3 4
 100 200

ASCIIのTEXTとして保存する

save matrix.text   -ascii % acii形式で保存する

vim で開いてみた なんか有効数字的なのがついてる

1.00000000e+00 2.00000000e+00
3.00000000e+00 4.00000000e+00
1.00000000e+02 2.00000000e+02

保存したファイルを開く

load matrix.matで保存したデータを読み込める

>>who
>>load matrix.mat
>>who
Variables in the current scope:

m

データ操作

A = [1 2; 3 4; 5 6]

indexで行列の要素を指定する

A_32に当たる

>>A(3,2)
ans =  6
>>A(2,:) % 二行目全て
ans =

   3   4
>>A(:,2) %2列目全て
ans =

   2
   4
   6
>>A([1 3],:) % 1、3行目全て
ans =

   1   2
   5   6

indexで代入する

>>A(3,2) = 100
A =

     1     2
     3     4
     5   100
>>A(:,2) = [10;11;12] %2列目に代入
A =

    1   10
    3   11
    5   12
>>A = [A,[100;200;300]] % ベクトルを連結
A =

     1    10   100
     3    11   200
     5    12   300

小ネタ

行列の要素を全て連結してベクトルを作る

>>A(:)
ans =

     1
     3
     5
    10
    11
    12
   100
   200
   300

行列の連結

A = [1 2;3 4;5 6] B = [11 12; 13 14; 15 16]

横に連結

>>C = [A B]
C =

    1    2   11   12
    3    4   13   14
    5    6   15   16

縦に連結

>>C = [A;B]
C =

    1    2
    3    4
    5    6
   11   12
   13   14
   15   16

*1:RやPythonは規模の大きな開発になって初めて検討するのが良い、とのこと

*2:Macならデフォルトのもので気にならないが、Windowだと.exeまで表示され画面表示が煩わしいので有効かと

「テスト駆動開発」読書会 Vol.5 に参加

読書・議論した箇所は第二部の最初である18章から23章まで

第2部ではTDDをしながらテストフレームワークを作る、ということをPythonで行っているが 作成しているテストツールの比較例としてJUnitが話題に上がることが多かったです

参加した理由・今まで参加しなかった理由

この勉強会自体は以前から注目していたのですが、少人数の勉強会は参加したことがなかったので若干抵抗があり、 また初回などは一瞬で枠が埋まってしまっていたため、競争率がたかそう、という先入観がありました。 そのため今まで参加していませんでした。第5回は空きがあったので思い切って参加してみました。

テストを実践している人の生の声を聞くのが初めてだったので刺激的な1.5hでした。

18章

  • WasRunクラスはテストツールの部分なのか、それともテスト内容なのか?
    • まだ明確に別れていない
    • テストツールだと思う。
    • テストツールに対するテストとして紛らわしいものは現実にもあり、例えばJUnitのテストはJUnitで書かれている。
  • PythonのPluggable Selectorパターンを利用している箇所はJUnitだとリフレクションで呼び出している。
  • パイソンのIDEは何が良い?
    • デフォルトのPycharm派
    • Eclipseにpluginを入れて使う派

19章

  • setUpをWasRunからTestCaseクラスに引き上げたのはチートくさい。(普通は思いつかない)
  • そもそもPythonには組み込みでAssertionがあるのに、このテストツールを作る意義は?
    • 3AはデフォルトのAssertionではできない。
    • 後々レポート部分なども作ることとなるが、そこまで高機能なものはデフォルトで搭載されていない
  • この章はテストツールを作る、ということを体験してもらい自動テストに必要な要素が学べるという重要な側面がある。

20章

  • 失敗してもtearDownを呼び出す、というTODOに関して
  • このTODOは普通この時点では思いつかないかと。発想が飛躍しすぎ。
  • kent beckJunitを作ったと思うけど、その知見がベースになっているのでは?*1*2

    • 確かJUnitの引数の順番は私のせいだ(他のxUnitと統一性がない)、という趣旨の懺悔を見たことがある
  • ちなみにxUnitというのは具体的なソフトウェアの名前ではなく、様々なプラットフォームに置ける単体テストツールの総称であってるか?

    • あってる。ちなみに起源はSmalltalkのsUnit。
  • Pythonのバージョンが2だと動かない。そのことに気付くのに時間がかかった

    • 検索したところ後書きに書いてある
    • やや不親切。前書きにも書くべきでは?
    • もはやPythonは2と3で全く違う言語ですね。

21章

  • jUnitだとrunnerとレポーターは疎結合になっている。代償としてasertionのないテストが成功になってしまう。
    • rubyだと中身が書かれていない(空の)テストメソッドは失敗扱いになる。
  • TestResultクラスがrunCountを持っているのに違和感がある。
    • またTestResultという名前も微妙。
      • そういえば、第一部の最初から名前の変更を一切やっていないが、*3リファクタリングとしてリネームはあまり行わないものなのか?
        • リネームは実際の仕事中でも一番やってると思う。
        • リネーム時テストは行いますか?
          • リネームは動的言語だと危険なのでスモークテストからテストするべき。
          • Javaだといらないかも・・・

22章

  • テストをコメントアウトしている箇所があるが、これってあり?

    • 短期的ならたまにやる。
    • 数ヶ月解決に時間がかかるような問題なら@skipや@ignoreで明示すべき。*4
  • コメントアウトしたことを忘れてマージしてしまわない?

    • 確認するのでありえない
      • カバレッジなどで確認するのか?
      • そういえばカバレッジは100%の縛りはあるのか?
      • 100%にしてる方がおかしい
      • そこまで行くとgetterやsetterなどに対する無意味なテストを書いてしまている気がする
      • それはSIer的な発想だと思う。

余談

私にとって今まで絵空事だったTDDは今や現実のものとなりつつある 今の職場ではvbを使っているがちょうど本日、TDDの環境が準備できたので明日から実践しようと思う。

1章を5分で読む、というのは最初早すぎるように感じたが、 読書は一人でできるので各自が自宅で時間を欠けて、当日は見直すくらいであまり時間をかける必要はないと思ったので ちょうど良い時間だと思った。

*1:と言いかけたところ、JUnitの作者の話題で盛り上がり流れてしまった。。。

*2:ちなみにJUnitの作者がKent Beck、というのはレガシーコード改善ガイドで知りました

*3:本日再写経を行ったところ、21章でリネームを行っていた「〜さらにtestSetUpの名前を変えよう」

*4:@ignoreなどのアノテーションをつければログに残る