沖縄が日本のシリコンバレーのようになってほしいと願うiOSエンジニアのブログ

世のエンジニアの役に立つようなブログにしたいなぁ

ユースケース駆動開発について

これは何

ドメイン知識が複雑で特定の人しか把握していない仕様があり、他のメンバーが仕様が把握しやすいようにする必要がありました。

勉強会で見かけたユースケース駆動開発に興味があり、本を読んでみてユースケースモデリングドメインモデリングについて書いてみました。

ユースケース駆動開発について

ユースケース駆動開発とは、システムの機能を利用者から見たシステムの振る舞いを記述したもの(ユースケース)に分割し、それを基に要求分析から実装までの工程を進めていく開発手法です。

本はこちら

この本の第2章の「ドメインモデリング」と第3章「ユースケースモデリング」を参照しました。

ユースケース駆動開発自体は古くからあり書籍も古いが、現在でも十分通用する内容だと思います。

ユースケース駆動開発の拡張(と本の中では定義されている)として、TDD駆動開発も可能になるそう。 これは、ユーザー視点で設計していく開発手法なので納得できますね。

ドメインモデリング

ドメインモデリングの目的は、問題領域に対する共通の用語集を作成することによって、プロダクトのコミュニケーションミスによる問題を解決する。

DDDのドメインモデリングとの違い

DDDにもドメインモデリングがあり、ユースケース駆動開発と似たような概念になっているので、DDDの導入を検討する際にも役に立ちそうです。

厳密には、DDDのドメインモデリングユースケースモデリングは違い、DDDのドメインモデリングはクラス図に近い形で書きます。

ドメイン駆動設計の2つのモデリング手法 ユースケース図とドメインモデル図をどう作る? - ログミーTech

ドメインモデル図について

作成するにあたっては、以下のルールで作成するのを心がける。

  • 作業は2時間に限定する。
    • ICONIXプロセスではドメインモデルを完璧に作成するのではなく、以降のプロセスで成り立たせていく。
  • あくまで、現実世界のオブジェクトに焦点を合わる。
    • データベースモデルやクラス設計ではない。
  • 属性や振る舞いは記述せず、シンプルにドメイン名のみ。
  • 汎化(is-a)・集約(has-a)関係を用いる。

ユースケースモデリング

ユースケースモデリングの目的は、ユーザーの操作 に対する システムの応答を明らかにし、正常系(基本コース)と異常系(代替コース)を洗い出すこと。

ユースケース図とユースケース記述を作成する。

ユースケース図よりも、ユースケース記述がより重要。

ユースケース記述時のポイント

  • ドメインモデルの用語を用いる。
  • バウンダリクラス(主に画面名)の名前を使う。
  • ユーザーとシステムの対話の両側を記述する。
  • 指示的ではなく叙述的に書く。
    • ×ユーザーは著者名で検索できる。 ○ユーザーが著者名を入力して「検索」ボタンを押す。システムは著者名に一致する書籍一覧を検索結果画面に表示する。
  • 基本コース(いわゆる正常系)と代替コース(いわゆる異常系)を記述する。
  • ユースケース図上の「関係」を正確に記述することを頑張らない。 ほとんどの場合、ユースケース図の関係は invokes、precedes で十分で、extends や includes が必要になる機会は少ない。

ユースケース記述がなぜ重要か

ユースケース記述はユーザーガイドを書くのに似ているとのこと。

ユースケース駆動」は、「まずユーザーガイドを書き、それからコードを書く」というように要約できるらしい。

ユースケース駆動」の目的は、ユーザーの操作に対する振る舞い要求を実現するためなので、ユーザーの視点でシステムの振る舞いを記述すれば、設計や単体テストもユーザーの視点になる

レガシーシステムにも適用できる。

その際は、ユーザーガイドから開始するのがよいとのこと。

既存の機能を分析し、ユーザーガイドからユースケースを導き出すと、自然と基礎的なコンポーネントにブレイクダウンする(と言う理論らしい)。

ドメインモデリングユースケースモデリングについて

いきなりユースケース図から作成する (ユースケースモデリングする)のではなく、ドメインモデリングから開始する。

理由は、ユースケースは抽象的に書くのではなく、設計するシステムに近いものであるべき(と著者が言っている)。

ユースケースを抽象的に書くことが、一般では多いが、ユースケース駆動開発(ICONIXプロセス)では、それとは正反対。

ユースケースは動的な部分の基礎を形作り、ドメインモデルは静的な部分の基礎を形作る。 静的な部分は構造を定義し、動的な部分は振る舞いを定義する。

ICONIXプロセス

ICONIXプロセスでは、ロバストネス分析が肝になるそうなので、厳密にユースケース駆動開発を実践するには、ロバストネス分析以降のステップも含め、実践する事が重要です。

ICONIXプロセス(ロバストネス分析)については、ここでは書きませんので、ご了承ください。

iconixprocess-feature-image.png

ユースケース駆動開発およびICONIXプロセスの読解は、以下のサイトが割とわかりやすかったです。

読んだ : ユースケース駆動開発実践ガイド - ひだまりソケットは壊れない 明日から使えるDDDのためのユースケース駆動開発(ICONIXプロセス) - Qiita

興味があるマンガについて、[読んだ][読みたい][いいね][買った]のメモが出来るアプリをリリースしました。

あなたは、これまでに読んだマンガをすべて覚えていますか?

私は、いつもマンガ喫茶などで読んだマンガを、
何を何巻まで読んだか
すぐ忘れてしまいます・・汗


その度に、思い出すのに苦労するので、
いちいち、覚えなくてもいいようにアプリ作っちゃえ

ということで、

  • 読んだマンガ
  • 読みたいマンガ
  • いいねしたいマンガ
  • 買ったマンガ

のメモが出来るアプリをリリースしました。

 

これで、忘れてしまいがちなマンガの記憶をメモしておくことが出来ますよ。

 

リリースしたアプリは、こんな感じです。

f:id:apla:20140927135938g:plain  f:id:apla:20140927132738p:plain

f:id:apla:20140927135938g:plain f:id:apla:20140927132746p:plain

 

f:id:apla:20140927135938g:plain f:id:apla:20140927132754p:plain

 

f:id:apla:20140927135938g:plain f:id:apla:20140927132756p:plain

 

 

アプリの利用シーン

このアプリの利用シーンとしては、

  • 買ったことを覚えてなくて、同じマンガを買ってしまわないようにメモメモ

  • マンガ喫茶で読んでいたマンガを、どの巻まで読んだか覚えてなくて、
    途中で、読んだことがあることに気づいて時間を無駄にしないようにメモメモ

  • おすすめのマンガがあり、それを友達に進めようとしたとき、
    覚えてなくて、困ることがないように、メモメモ

など。

マンガについて、メモしておきたいことは、アプリに任せちゃいましょう!

もう、いちいち頭の中で覚えることは、ありません。
このアプリにメモしておけば、

  • 新刊は何巻を買えばいいのか
  • まだ読んでないマンガは、何巻から読めばいいのか
  • おすすめしたいマンガがあったけど、何がオススメだったか

すぐ思い出せます。

 

このアプリを使っていたら、

↓きっと、こうなります

 

f:id:apla:20140927134013p:plain

© タイトル:ブラックジャックによろしく 著作者名: 佐藤秀峰 サイト名: 漫画 on web
URL: 
http://mangaonweb.com/

 

アプリの詳細 

 

-------------------------
主な機能
-------------------------

・あるマンガの、ある巻に対して「読んだ」「読みたい」「いいね」「買った」の各メモ
・マンガに対してのメモ
・iBookStoreからの書籍データ検索
楽天ブックスからの書籍データ検索
・バーコードで書籍データ検索
・円グラフ表示で、マンガのコンプリート状況がぱっと把握出来ます。
FacebookTwitterへ、コンプリート状況を投稿できます。 

※このアプリは、電子書籍アプリではありません。

 

 http://tonio.jp/ComicReminder/

月間1,000ページビュー超えたから、何が要因か考えてみた

マンモスブロガーからしたら、糞みたいで、取るに足らないことだと思うけど、これからブログを始めようと思ってる人や、単に記事だけ書いて終わっている人には、納得してくれるかも
 

1. 記事のタイトルを興味を引いてくれそうなタイトルにした

まず、内容はさておき、興味を引いてくれるようなタイトルにするには、どういうようなタイトルにすればいいか考えてみました。
いくつかサイトを参考にしましたけど、
  1. 30字までにおさめる
  2. 具体的な数字を入れる
  3. 役に立つ情報という事がわかる言い回しを使う
  4. 技術記事は難易度が分かるようにする
  5. インパクト重視!引きのある文言を入れる
  6. 読者が求めている情報を満たす記事である事が分かるタイトルにする
  7. SEOキーワードを意識した単語選び

を意識してみた。

 

例えば、下の記事のように

インスタレーション業界を知らない素人がインスタレーションのことを調べてみた 〜3つの気になるワード「デジタルサイネージ・インタラクティブ・インスタレーション」〜

1は満たしてないけど、上記タイトルは↓のように取り入れてみた。

大きな変化はなかったけど、おそらく、検索エンジンクローラーに引っかかりやすくなったようで、僅かながら増えました。

 

2. はてなブログのグループカテゴリーに登録した

 さすがに検索エンジン頼みだと、そんなに変わらないので、はてなブログのグループカテゴリーに登録しました。

はてなブログ グループ - はてなブログ

 

同じような記事を書いてるひとが参加しているグループに参加すれば、見てくれる人もいるだろうと思い、参加登録しました。
 

3. ニッチだと思ったけど、自分が役に立った情報を公開してみた

以下の2つの記事は、ニッチでマニアックな記事だから、アクセスするひとも少ないだろうと思っていたんですが、結構、需要はあったようで、すぐアクセストップの記事になりました。

 

auひかり(ひかりちゅら)でBuffaloのPPTPサーバー機能を利用する - 無能プログラマの開発日誌

auひかりのHGW「Aterm BL900HW」で、iPhoneのwifi同期ができない場合 - 無能プログラマの開発日誌

 

前者は、自分のメモがてら、他のサイトの記事をまとめ、設定画面のキャプチャを張って、より分かりやすくした記事です。
後者は、内容はかなり特殊な環境でしか役立たない記事で、検索しても誰も記事にしていないものだったにも関わらず、現象的には「iPhonewifi同期ができない」という結構、遭遇しそうな現象だったので、アクセスがありました。
実際に役立つ情報かどうかは抜きにして、書いてみるもんだと思いました。
 

4. 一番アクセスがある記事を整形して更新した

元々、自分のメモ代りに、どっかのサイトのページを書き殴りで公開してたものだけど、悲しいかな、それが一番、アクセスが多かった。
SEO的な観点から言うと、更新日の高い記事の方が、検索エンジンにクローリングされやすい。

SEOにおける日付の重要性|ウェブシュフ

 このサイトにあるように、「重要なのは公開日ではなく最終更新日」ということで、見やすく整形した上で、記事を更新しました。
 

5. 参考にしたブログにお礼のコメントを書いた

 感謝を込めて、参考にさせて頂いたブログにコメントさせて頂きました。
こういった細かいことを、やっていけば、月間1,000pvへは簡単に届くんだなぁと感じました。
次に目指すは10,000ページビュー!!
きっと、今回のような小手先なものでは無理だと思うので、いろいろ四苦八苦してみます!!
 

auひかり(ひかりちゅら)でBuffaloのPPTPサーバー機能を利用する

私の自宅のネットワーク環境は、BuffaloのPPTPサーバー機能を使って
VPNを使えるようにしているんですが、その設定方法がメンドくさく、
つい先日、引っ越した時に、その環境を再構築するのが、
大変だったので、今後、引っ越ししたり、ネット回線を変えたりしたりなど、
何らかの原因で再構築が必要になった時の為に、
このブログでまとめておこうと思います。

 

私の家のネットワーク環境は、以下の構成になっています。
auひかり(ひかりちゅら):  HGW Aterm BL900HW 
無線LANルーター: WZR-HP-G300NH (BUFFALO)

 

環境構築は、以下のサイトを参考にしました。

川向こうからのブログ発信 PPTP-VPN接続を可能にする家庭内ネットワーク設定

無線LANルーターや、HGWのモデルが違いますが、
基本的に構築・設定の仕方は同じです。

f:id:apla:20140607002027p:plain

 

 このネットワーク構成だと、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アドレスを記入します。

 

各画面のキャプチャを載せます

 

f:id:apla:20140607003517p:plain

f:id:apla:20140607003519p:plain

f:id:apla:20140607003551p:plain

f:id:apla:20140607003547p:plainf:id:apla:20140607003545p:plain

 

f:id:apla:20140607003548p:plain

f:id:apla:20140607085754p:plain

 

auひかりのHGW「Aterm BL900HW」で、iPhoneのwifi同期ができない場合

かなり、ニッチな情報だと思いますが、
急に、iPhoneiPadwifi同期が出来なくなって、いろいろ調べてたんですが、
原因は、auひかりのHGW「Aterm BL900HW」の設定でした。

最近、引っ越しして、我が家のネットワークを再構築し、
VPNの設定を行うとき、いろいろ設定をいじくりまわしてて、
不必要な設定までしてしまっていたみたいです。


結論から言うと、iOS7からIPv6が必須になったらしく、
auひかりのHGW「Aterm BL900HW」の
トップページ > 詳細設定 > その他の設定
IPv6設定help
管理外プレフィックス削除機能
こいつが、有効になっていると、iPhonewifi同期ができなくなるみたいです。

 

f:id:apla:20140603235711p:plain

こことか

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の"フラグを追加する必要があります。

 

 

 

だそうです。めちゃハマった。

 

まだまだ未熟だな。