ユースケース駆動開発について
これは何
ドメイン知識が複雑で特定の人しか把握していない仕様があり、他のメンバーが仕様が把握しやすいようにする必要がありました。
勉強会で見かけたユースケース駆動開発に興味があり、本を読んでみてユースケースモデリングとドメインモデリングについて書いてみました。
ユースケース駆動開発について
ユースケース駆動開発とは、システムの機能を利用者から見たシステムの振る舞いを記述したもの(ユースケース)に分割し、それを基に要求分析から実装までの工程を進めていく開発手法です。
本はこちら
この本の第2章の「ドメインモデリング」と第3章「ユースケースモデリング」を参照しました。
ユースケース駆動開発自体は古くからあり書籍も古いが、現在でも十分通用する内容だと思います。
ユースケース駆動開発の拡張(と本の中では定義されている)として、TDD駆動開発も可能になるそう。 これは、ユーザー視点で設計していく開発手法なので納得できますね。
ドメインモデリング
ドメインモデリングの目的は、問題領域に対する共通の用語集を作成することによって、プロダクトのコミュニケーションミスによる問題を解決する。
DDDにもドメインモデリングがあり、ユースケース駆動開発と似たような概念になっているので、DDDの導入を検討する際にも役に立ちそうです。
厳密には、DDDのドメインモデリングとユースケースモデリングは違い、DDDのドメインモデリングはクラス図に近い形で書きます。
ドメイン駆動設計の2つのモデリング手法 ユースケース図とドメインモデル図をどう作る? - ログミーTech
ドメインモデル図について
作成するにあたっては、以下のルールで作成するのを心がける。
- 作業は2時間に限定する。
- あくまで、現実世界のオブジェクトに焦点を合わる。
- データベースモデルやクラス設計ではない。
- 属性や振る舞いは記述せず、シンプルにドメイン名のみ。
- 汎化(is-a)・集約(has-a)関係を用いる。
ユースケースモデリング
ユースケースモデリングの目的は、ユーザーの操作
に対する システムの応答
を明らかにし、正常系(基本コース)と異常系(代替コース)を洗い出すこと。
ユースケース記述時のポイント
- ドメインモデルの用語を用いる。
- バウンダリクラス(主に画面名)の名前を使う。
- ユーザーとシステムの対話の両側を記述する。
- 指示的ではなく叙述的に書く。
- 例
×ユーザーは著者名で検索できる。
○ユーザーが著者名を入力して「検索」ボタンを押す。システムは著者名に一致する書籍一覧を検索結果画面に表示する。
- 例
- 基本コース(いわゆる正常系)と代替コース(いわゆる異常系)を記述する。
- ユースケース図上の「関係」を正確に記述することを頑張らない。 ほとんどの場合、ユースケース図の関係は invokes、precedes で十分で、extends や includes が必要になる機会は少ない。
ユースケース記述がなぜ重要か
ユースケース記述はユーザーガイドを書くのに似ている
とのこと。
「ユースケース駆動」は、「まずユーザーガイドを書き、それからコードを書く」というように要約できるらしい。
「ユースケース駆動」の目的は、ユーザーの操作に対する振る舞い要求を実現するためなので、ユーザーの視点でシステムの振る舞いを記述すれば、設計や単体テストもユーザーの視点になる
レガシーシステムにも適用できる。
その際は、ユーザーガイドから開始するのがよいとのこと。
既存の機能を分析し、ユーザーガイドからユースケースを導き出すと、自然と基礎的なコンポーネントにブレイクダウンする(と言う理論らしい)。
ドメインモデリングとユースケースモデリングについて
いきなりユースケース図から作成する (ユースケースモデリングする)のではなく、ドメインモデリングから開始する。
理由は、ユースケースは抽象的に書くのではなく、設計するシステムに近いものであるべき(と著者が言っている)。
※ユースケースを抽象的に書くことが、一般では多いが、ユースケース駆動開発(ICONIXプロセス)では、それとは正反対。
ユースケースは動的な部分の基礎を形作り、ドメインモデルは静的な部分の基礎を形作る。 静的な部分は構造を定義し、動的な部分は振る舞いを定義する。
ICONIXプロセス
ICONIXプロセスでは、ロバストネス分析が肝になるそうなので、厳密にユースケース駆動開発を実践するには、ロバストネス分析以降のステップも含め、実践する事が重要です。
ICONIXプロセス(ロバストネス分析)については、ここでは書きませんので、ご了承ください。
ユースケース駆動開発およびICONIXプロセスの読解は、以下のサイトが割とわかりやすかったです。
読んだ : ユースケース駆動開発実践ガイド - ひだまりソケットは壊れない 明日から使えるDDDのためのユースケース駆動開発(ICONIXプロセス) - Qiita
興味があるマンガについて、[読んだ][読みたい][いいね][買った]のメモが出来るアプリをリリースしました。
あなたは、これまでに読んだマンガをすべて覚えていますか?
私は、いつもマンガ喫茶などで読んだマンガを、
何を何巻まで読んだかを
すぐ忘れてしまいます・・汗
その度に、思い出すのに苦労するので、
いちいち、覚えなくてもいいようにアプリ作っちゃえ
ということで、
- 読んだマンガ
- 読みたいマンガ
- いいねしたいマンガ
- 買ったマンガ
のメモが出来るアプリをリリースしました。
これで、忘れてしまいがちなマンガの記憶をメモしておくことが出来ますよ。
リリースしたアプリは、こんな感じです。
アプリの利用シーン
このアプリの利用シーンとしては、
- 買ったことを覚えてなくて、同じマンガを買ってしまわないようにメモメモ
- マンガ喫茶で読んでいたマンガを、どの巻まで読んだか覚えてなくて、
途中で、読んだことがあることに気づいて時間を無駄にしないようにメモメモ - おすすめのマンガがあり、それを友達に進めようとしたとき、
覚えてなくて、困ることがないように、メモメモ
など。
マンガについて、メモしておきたいことは、アプリに任せちゃいましょう!
もう、いちいち頭の中で覚えることは、ありません。
このアプリにメモしておけば、
- 新刊は何巻を買えばいいのか
- まだ読んでないマンガは、何巻から読めばいいのか
- おすすめしたいマンガがあったけど、何がオススメだったか
すぐ思い出せます。
このアプリを使っていたら、
↓↓↓きっと、こうなります↓↓↓
© タイトル:ブラックジャックによろしく 著作者名: 佐藤秀峰 サイト名: 漫画 on web
URL: http://mangaonweb.com/
アプリの詳細
-------------------------
主な機能
-------------------------
・あるマンガの、ある巻に対して「読んだ」「読みたい」「いいね」「買った」の各メモ
・マンガに対してのメモ
・iBookStoreからの書籍データ検索
・楽天ブックスからの書籍データ検索
・バーコードで書籍データ検索
・円グラフ表示で、マンガのコンプリート状況がぱっと把握出来ます。
・FacebookとTwitterへ、コンプリート状況を投稿できます。
※このアプリは、電子書籍アプリではありません。
月間1,000ページビュー超えたから、何が要因か考えてみた
1. 記事のタイトルを興味を引いてくれそうなタイトルにした
を意識してみた。
例えば、下の記事のように
インスタレーション業界を知らない素人がインスタレーションのことを調べてみた 〜3つの気になるワード「デジタルサイネージ・インタラクティブ・インスタレーション」〜
1は満たしてないけど、上記タイトルは↓のように取り入れてみた。
- 具体的な数字 → 「3つの気になるワード」
- 役に立つ情報 → 「インスタレーション」に関するワード
- 難易度 → インスタレーション業界をしらない素人
- 引きのある文言&読者が求めている情報 → 素人向けぽいタイトルなので、敷居低そう
- SEOキーワード → インスタレーション・デジタルサイネージ・インタラクティブ
大きな変化はなかったけど、おそらく、検索エンジンのクローラーに引っかかりやすくなったようで、僅かながら増えました。
2. はてなブログのグループカテゴリーに登録した
同じような記事を書いてるひとが参加しているグループに参加すれば、見てくれる人もいるだろうと思い、参加登録しました。
3. ニッチだと思ったけど、自分が役に立った情報を公開してみた
以下の2つの記事は、ニッチでマニアックな記事だから、アクセスするひとも少ないだろうと思っていたんですが、結構、需要はあったようで、すぐアクセストップの記事になりました。
auひかり(ひかりちゅら)でBuffaloのPPTPサーバー機能を利用する - 無能プログラマの開発日誌
auひかりのHGW「Aterm BL900HW」で、iPhoneのwifi同期ができない場合 - 無能プログラマの開発日誌
前者は、自分のメモがてら、他のサイトの記事をまとめ、設定画面のキャプチャを張って、より分かりやすくした記事です。
4. 一番アクセスがある記事を整形して更新した
5. 参考にしたブログにお礼のコメントを書いた
auひかり(ひかりちゅら)でBuffaloのPPTPサーバー機能を利用する
私の自宅のネットワーク環境は、BuffaloのPPTPサーバー機能を使って
VPNを使えるようにしているんですが、その設定方法がメンドくさく、
つい先日、引っ越した時に、その環境を再構築するのが、
大変だったので、今後、引っ越ししたり、ネット回線を変えたりしたりなど、
何らかの原因で再構築が必要になった時の為に、
このブログでまとめておこうと思います。
私の家のネットワーク環境は、以下の構成になっています。
・auひかり(ひかりちゅら): HGW Aterm BL900HW
・無線LANルーター: WZR-HP-G300NH (BUFFALO)
環境構築は、以下のサイトを参考にしました。
川向こうからのブログ発信 PPTP-VPN接続を可能にする家庭内ネットワーク設定
無線LANルーターや、HGWのモデルが違いますが、
基本的に構築・設定の仕方は同じです。
このネットワーク構成だと、2重ルーターにもなっていないので、PPTP-VPNが使えます。
先ほど、紹介したサイトがとても役に立ちました。
設定方法を上記サイトの説明を流用して、簡単に説明すると、
◆HGWのポートマッピングで、
・プロトコル TCP、ポート番号 1723-1723
・プロトコル gre、ポート番号 (記入しない)
を追加
◆ HGWのLAN側設定で、
・DHCPサーバー機能のチェックを外す。
・固定のIPアドレスを設定
◆AirstationのLAN側設定で、
・LAN側IPアドレス:固定のIPアドレスを設定
・DHCPサーバー機能にチェック
・デフォルトゲートウェイの通知
:指定したIPアドレス(HGWのIPアドレス)
・DNSサーバーの通知
:指定したIPアドレス(HGWのIPアドレス)
◆AirstationのWAN側設定で、
・DHCPサーバーからIPアドレスを自動取得
(WANには何も挿していないので「見せかけ」の設定です。設定しないとエラーになります。)
・[拡張機能]のデフォルトゲートウェイとDNSサーバーアドレスのプライマリにもHGWのIPアドレスを記入します。
各画面のキャプチャを載せます
auひかりのHGW「Aterm BL900HW」で、iPhoneのwifi同期ができない場合
かなり、ニッチな情報だと思いますが、
急に、iPhoneやiPadのwifi同期が出来なくなって、いろいろ調べてたんですが、
原因は、auひかりのHGW「Aterm BL900HW」の設定でした。
最近、引っ越しして、我が家のネットワークを再構築し、
VPNの設定を行うとき、いろいろ設定をいじくりまわしてて、
不必要な設定までしてしまっていたみたいです。
結論から言うと、iOS7からIPv6が必須になったらしく、
auひかりのHGW「Aterm BL900HW」の
トップページ > 詳細設定 > その他の設定
IPv6設定help
管理外プレフィックス削除機能
こいつが、有効になっていると、iPhoneのwifi同期ができなくなるみたいです。
こことか
iPhoneのWi-Fi同期がうまくいかないときの対処法 - NAVER まとめ
こことか
iTunesでWi-Fiによる同期ができなくなった問題を解決する2つの方法
を参考にしたんですけど、それでも出来なくて、IPv6が必要という記事を見かけて
ぴんと来ました ^^
「iOSアプリ開発でZXingObjCを使ってQRコードを読み取る」をやってみた
仕事でQRコードを使ったアプリ開発の案件があったので、
以下のサイトを参考して、サンプルを作成していたが、
そのままでは、うまくいかなかった
iOSアプリ開発でZXingObjCを使ってQRコードを読み取る
http://dev.classmethod.jp/smartphone/iphone/ios-zxingobjc21-qrcode-decode/
ZXingObjC は、最新の3.0.1を使用
まず、
#import <ZXingObjC/ZXingObjC.h>
ここで、「file not found」エラーが出たので、
Xcodeのヘッダー検索パスに、
「ZXingObjC」のフォルダまでのパスを入れる
私は、サンプルプロジェクトの直下にいれたので、
以下のように設定しました。
$(SRCROOT)/ZXingObjC-master
これで、ビルドは出来るようになったが、
QRコードを読み取ろうとしても
ZXCaptureDelegate のデリゲートメソッド
- (void)captureResult:(ZXCapture *)capture result:(ZXResult *)result;
が反応しない。
ソースを追っていくと、
ZXCapture.m の
if (NSClassFromString(@"ZXMultiFormatReader")) {
_reader = [NSClassFromString(@"ZXMultiFormatReader") performSelector:@selector(reader)];
}
この部分で、if文の中に入って来てない。
つまり、ZXMultiFormatReader クラスが読みに行けてない。
いろいろ調べてると、
NSClassFromStringを利用して、静的ライブラリからクラスをインスタンス化しようとする場合
http://tonio.hateblo.jp/entry/2014/05/17/131439
こういうことだったみたい。
これで、無事にQRコードの読み取りがちゃんと出来るようになりました!
NSClassFromStringを利用して、静的ライブラリからクラスをインスタンス化しようとする場合
ちゃんと、プロジェクトに組み込んで、ヘッダー検索パスにも、パスを追加してるのに、NSClassFromString が nil を返してインスタンス化できない現象に遭遇しました。
解決策は、このサイトを参考
http://stackoverflow.com/questions/2227085/nsclassfromstring-returns-nil
静的ライブラリからクラスをインスタンス化しようとしている場合は、「他のリンカフラグ」ビルド設定に "-ObjCの"フラグを追加する必要があります。
だそうです。めちゃハマった。
まだまだ未熟だな。