「これだけでわかる!初歩のUMLモデリング」を読んだ
これだけでわかる!初歩のUMLモデリング―基礎から各種テクニックまで第一人者が伝授!! (@ITハイブックス)
- 作者: 萩本順三
- 出版社/メーカー: 技術評論社
- 発売日: 2004/02
- メディア: 単行本
- クリック: 2回
- この商品を含むブログ (9件) を見る
UMLについて本を探していたところ、匠道場主催の萩本さんが書かれている本があったので読みました。
読んだ動機
- クラス同士の関係性を俯瞰できるようになりたい
- ソースを読んで理解だと時間がかかりすぎる
- 技術的なコミュニケーションをUMLを使うことによって改善したい
- 設計を考えるときの思考ツールとしてUMLを使いたい
- UMLで実装アイディアを説明している本を読めるようになりたい
SQLやPGを一行単位で日本語で訳したエクセルドキュメントしか作れないようでは、 設計スキルを向上させたり設計ノウハウを学ぶことはできないという危機感がある。
UML
クラス図
クラス間のメンバとクラス間の関係性を記述する。 個人的にはUMLといえばクラス図、という印象がある
メンバの可視性
記号 | アクセス修飾子 | 意味 |
---|---|---|
+ | public | 効果 |
- | private | 効果なし |
~ | なし | パッケージ内に効果 |
# | protected | サブクラスにのみ効果 |
関係性
関係性には以下の5種類がある
- 集約(Aggregation)
- 汎化・特化(Generalization)
- コンポジション(Composition)
- 依存関係(Dependency)
- 実現関係(realization)
このリンクが網羅的・簡潔でわかりやすい 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の説明とそれを活用したプロジェクトの進め方が約5:5で構成されている。
UMLを最初に見たとき(学部の授業)の感想は「なにこれ使えるの?」だった。最初に覚えることが多すぎる割に実践する機会がないのですぐに忘れてしまった。資格試験でたまに見るけど、4択クイズになっているので適当に選んでほぼ正解するし、深い部分の理解は得られない。 そんな矢先、最近デザインパターンの本を読んでUMLに再開した。 クラス図を書け、という章末問題をといた際、汎化の矢印を逆向きに書いてしまったことから、改めて復習する必要があると感じて本書の購入に至った。
この本は実際のシステム開発にUMLをどう適応していくか、という視点で書かれているのでかなり参考になった。
クラス図だけじゃない
UMLと言えばクラス図、というイメージがあるが、 ユースケース図などは、使ったことがない。必要でなくなったのではなく、それが表す必要がある概念を別の方法で表しているだけだ。
大体は箇条書きになった文章やよくわからない長文になっているように思う。 そこからユースケース図で表していることを読み取ったり、整理するのに非常に時間がかかる
ユースケース図はエクセルでも簡単に作れると思うので、現状のシステムや要件の分析から始めたい。 そして技術者同士のコミュニケーションに積極的に利用していきたい。 オレオレUMLになってしまうと思うが、なるべくスタンダードなものに近づけたい。
UMLは古くなったのか?
それぞれの図で表せなければいけないことを、長い時間を書けて個人が再発明してしまうだけだと思うので、UML自体を学んで活用することは無駄ではないと思う。
UMLを使ったプロセスの話
「テスト駆動開発」読書会 Vol.6 に参加
- 作者: Kent Beck,和田卓人
- 出版社/メーカー: オーム社
- 発売日: 2017/10/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
23章から28章を読みました。
- xunitは自作するようなものなのか?
- Assertionエラーと実行時エラーの扱いを分けることについて
- 悩み:Todoが爆発してしまう
- TDDを普及させるにはプロジェクトに余裕が必要
- 設備について
- テストコードは納品するのか
- モック
- equalsのテストは書くのか
- 標準ライブラリのテストは書くのか?
- 正規表現が使われている処理のテスト
- わからなかったこと
- 初心者おすすめ
- 感想
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を始めたが、うまくいかずタスクに親(前提として行う必要がある作業)子供と孫(そのタスクのサブタスク) が増殖してしまう。
- 書き始めるとテストの準備ができていなかったり(まずはtestableなコードにリファクタリングする)負債の返却
- 本書ではTODOはそんなに爆発していない。
- 結局目の前の作業に集中できていないのでは?
- Todoリストでググった結果の1件目が面白い
- Todoに対してスループットが追いついていない
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のテストは書くのか
Javaのequalsのテストはちゃんと書くならObject.equalsに書かれている5つの契約を満たすようなテストケースがいると思う。Effective Javaで得た知識😊
— yuyabu (@yuyabu2) 2018年1月1日
勉強会後、改めて思ったが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を採用した場合は書くこともある。
- 標準ライブラリにも変なメソッドがある
正規表現が使われている処理のテスト
- OSSで正規表現を使っているところのバグを見つけたことがある
- 正規表現は念入りにテストしないとダメ
- 誤った正規表現がよく使われている。例えば「.」をマッチさせたいために
/./
を使ってしまう等(正しくは/\./
) - 正規表現で言語をパースするのはだめ。
わからなかったこと
トランザクショナルメモリの記述は何が言いたいのかわからない
参加者全員が頭を掲げることになりました。
ミュータブルなオブジェクトについての議論
ORマッパーやDSL,Rubyのrakeの話になり、どれも名前は知っているが 経験がないので話についていけませんでした。
Self Shunt
テストクラス自体がモックオブジェクトになるようなテスト実装のことらしいです。 サンプルがpythonで書かれているため、*3勉強会中に理解できませんでした。 これはPatternらしいのでJavaの実装をよく読んで理解したいです。
モック
自分のモックの理解が参加者のそれとずれてしまっているような不安を抱いてしまいました。 話を聞いてインターフェースをメソッドの引数の型にする。ということ以上のことがわかりませんでした。 ここは後述のTest Doubleを掘り下げていけばわかる気がします。
初心者おすすめ
勉強会に参加してやはり経験者との知識の壁を感じた。 まず入門書が読むべきドキュメントはありませんか、と質問したところ主催者のはむはむさんから、Test Doubleをオススメいただきました。
感想
写経パート(第1部、第2部)が終わったため、コードを読むページが減り*4、実際のノウハウについての議論が多くなりました。
今までTDDは完全に絵空事でしたが、最近TDDを導入し始めたので、実践の悩みというものを持てるようになりました。 一人でやっているとわからないことだらけなので、こういう勉強会は本当に助かります。
テストは情報が多すぎてどこから手をつけていいのかわかりません。いつも英語で分厚い*5xUnit-Test Patternsにたどりついてしまいます*6
xUnit Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series (Fowler))
- 作者: Gerard Meszaros
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2007/05/21
- メディア: Kindle版
- この商品を含むブログ (2件) を見る
とりあえずオススメいただいたTest Doubleから着手しようと思います。
「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前書きより
- 作者: KentBeck
- 出版社/メーカー: オーム社
- 発売日: 2017/11/13
- メディア: Kindle版
- この商品を含むブログを見る
- 不安な箇所のテスト粒度はどうしても細くなる
- 自身がある箇所のテストはステップが大きくなる
という傾向があり、TDDでテストを作ると基本的に粒度が揃わないそうです。 実装していない人が、後からテストを見直しても、粒度の違いから何も読み取れず、
作者の気持ちを答えよ、
状態になってしまう。という指摘がありました。
TDDで開発した後に、テスト粒度を揃えることが大事です。 常に対称性を持たせろ、という意味ではなく、意味のある構造を持たせろとのことでした。
最近は前任者がよくわからないテストを残していったが、なんのためのテストかわからなくなっているが、 消すのも怖いので管理するコストが増加している、というのが最近の傾向とのことです。
10年前に比べてテストは書くようになったけど技術的負債になりがち*2
LT
錬金術MeetUpへのお誘い
TDDの読書会に参加されておられる方のLTです 賢者の石を作ろう、的なものではなく お金を編み出す技術、についての会合らしいです。
UnitTest Anti-Pattern
Unit Testのアンチパターンの紹介です。 実践している人向けだと思います。経験値のない初心者(私)には厳しいです。
オンラインPython学習サービスPyQの価格決め
主催の佐藤社長の発表です。
ぐるぐる読書会というコンセプトがいいなと思いました。
各自が本を持ち合って、付箋などで気づいたことを共有しながら本を読むそうです*3
電子書籍でもKindleやePubで遠隔地の人同士でSNS的に出来ると面白そう、と思いました。 ビジネス的には本は共有出来なくてもメモは共有できると思います。 epubのリーダーにSNS的な機能がつけば実現できるのかな?と思いました。
おすすめの本は早速書いました。
人もお金も動き出す! 都合のいい読書術 [新書版]バカになるほど、本を読め! (PHPビジネス新書)
- 作者: 神田昌典
- 出版社/メーカー: PHP研究所
- 発売日: 2017/08/19
- メディア: 新書
- この商品を含むブログを見る
感想
自動テストではありませんが、FizzBuzzのテストは一度考えたことがある、ので
TDDならこうなるのかというコントラストが印象的でした。
TDDを実践すると、少しずつソース・テストが育っていくのだ、ということを改めて実感しました。 講演中に和田さんがなんどもおっしゃっていましたが、「どちらが正しいとかはない」「正解はない」というのは本当だと思います。
「テストの自動化」とか「テスト駆動開発」はかなりのパワーワードなので手段が目的化しないように気をつけたいところです。
わからなかったこと
私は業務でテストコードを書いたことがまだない、全くの初心者ですが、例えばFizzBuzz程度の小さなプログラムでも テスト駆動で作るようなものなのか気になりました。
というのも私のTDDデビューとなりそうなプログラムがFizzBuzz並みに小さく、TDDで書くより普通に組んだ方が早く思えてしまいます。 加えてデータベース接続とファイル作成削除があるのでTDDをやろうと思うと、モックやインターフェースやラップクラスがたくさん出来てしまい、 単純な機能なのに無駄に管理コストが高くならないか、という日頃の不安から、上記の疑問点を思いつきました。 *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
- 出版社/メーカー: バッファロー
- 発売日: 2009/08/02
- メディア: Personal Computers
- 購入: 38人 クリック: 89回
- この商品を含むブログ (8件) を見る
- USBの子機は上記のものを利用している。
- virtual box + usbのWifi子機でやったが無理だった
中華系メーカーのbluetoothイヤホンが充電中に溶けた件
- 中華の廉価イヤホンだからまあこんなもんかと思っていた
- 雑談の話題に出したところ、発火などの人命に関わる被害があるものは他のものと優先度が違うらしい。
- きちんと販売元に送って調査してもらったほうが良いとのこと。
Kali Linuxは普通にDLするのではなくTorrentでDLするのが良いとのこと。
- この記事に書いた通り、日本にミラーがないと勝手に困っていたが、Torrentを使うのがいいらしい。
- P2P怖い。多少時間かかってもDLかなぁ。まぁ参考にしてみてください。
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のドキュメントを見てるだけでも、多少はネットワークの経験値をあげれそうな気がして来た。
参考または関連
- https://speakerdeck.com/ctrl_z3r0/hatukingudao-chang-penetorelian-xi-yong-vmfalsegoshao-jie
- インフラ系の勉強会でよく見るhiroさんの資料。他のスライドも面白いのでおすすめ
- https://www.virtualbox.org/manual/ch06.html
- 公式のネットワークの説明ページ。リファレンス的に使うといいかも
- https://blogs.oracle.com/scoter/networking-in-virtualbox-v2
- 公式のブログ。読み物として良さそう。
- http://vboxmania.net/content/ネットワーク設定
- 有志のサイト。公式の内容をかなりわかりやすく書いている。
*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
「テスト駆動開発」読書会 Vol.5 に参加
読書・議論した箇所は第二部の最初である18章から23章まで
第2部ではTDDをしながらテストフレームワークを作る、ということをPythonで行っているが 作成しているテストツールの比較例としてJUnitが話題に上がることが多かったです
参加した理由・今まで参加しなかった理由
この勉強会自体は以前から注目していたのですが、少人数の勉強会は参加したことがなかったので若干抵抗があり、 また初回などは一瞬で枠が埋まってしまっていたため、競争率がたかそう、という先入観がありました。 そのため今まで参加していませんでした。第5回は空きがあったので思い切って参加してみました。
テストを実践している人の生の声を聞くのが初めてだったので刺激的な1.5hでした。
18章
- WasRunクラスはテストツールの部分なのか、それともテスト内容なのか?
- PythonのPluggable Selectorパターンを利用している箇所はJUnitだとリフレクションで呼び出している。
- パイソンのIDEは何が良い?
- デフォルトのPycharm派
- Eclipseにpluginを入れて使う派
19章
- setUpをWasRunからTestCaseクラスに引き上げたのはチートくさい。(普通は思いつかない)
- そもそもPythonには組み込みでAssertionがあるのに、このテストツールを作る意義は?
- 3AはデフォルトのAssertionではできない。
- 後々レポート部分なども作ることとなるが、そこまで高機能なものはデフォルトで搭載されていない
- この章はテストツールを作る、ということを体験してもらい自動テストに必要な要素が学べるという重要な側面がある。
20章
- 失敗してもtearDownを呼び出す、というTODOに関して
- このTODOは普通この時点では思いつかないかと。発想が飛躍しすぎ。
kent beckがJunitを作ったと思うけど、その知見がベースになっているのでは?*1*2
- 確かJUnitの引数の順番は私のせいだ(他のxUnitと統一性がない)、という趣旨の懺悔を見たことがある
ちなみにxUnitというのは具体的なソフトウェアの名前ではなく、様々なプラットフォームに置ける単体テストツールの総称であってるか?
- あってる。ちなみに起源はSmalltalkのsUnit。
Pythonのバージョンが2だと動かない。そのことに気付くのに時間がかかった
- 検索したところ後書きに書いてある
- やや不親切。前書きにも書くべきでは?
- もはやPythonは2と3で全く違う言語ですね。
21章
- jUnitだとrunnerとレポーターは疎結合になっている。代償としてasertionのないテストが成功になってしまう。
- rubyだと中身が書かれていない(空の)テストメソッドは失敗扱いになる。
- TestResultクラスがrunCountを持っているのに違和感がある。
22章
テストをコメントアウトしている箇所があるが、これってあり?
- 短期的ならたまにやる。
- 数ヶ月解決に時間がかかるような問題なら@skipや@ignoreで明示すべき。*4
コメントアウトしたことを忘れてマージしてしまわない?
余談
私にとって今まで絵空事だったTDDは今や現実のものとなりつつある 今の職場ではvbを使っているがちょうど本日、TDDの環境が準備できたので明日から実践しようと思う。
1章を5分で読む、というのは最初早すぎるように感じたが、 読書は一人でできるので各自が自宅で時間を欠けて、当日は見直すくらいであまり時間をかける必要はないと思ったので ちょうど良い時間だと思った。