読者です 読者をやめる 読者になる 読者になる

mokky14's IT diary

IT関係の仕事メモ、勉強会の感想など書いてます。

「見立て」でコミュニケーション問題解決を図るワークショップ に行ってきました。

2015/06/13 のワークショップのレポート。

f:id:mokky14:20150613124903j:plain

妖怪とは?

コミュニケーションの問題

多くのプロジェクトではコミュニケーションの問題が内在している。 このとき、コミュニケーションの問題を理解し、問題を解決する糸口が分からない。時には精神論になり、具体的なアプローチが困難になったりする。 その結果、プロジェクトや現場のQCDが悪化し、大きな問題になることがある。 この身近にあるコミュニケーションの問題を「妖怪」として見つける。

妖怪のしくみがもたらすこと

  • 問題を妖怪のせいにして主体性を確保する
  • 不明な事象を妖怪にして安心と勇気を得る
  • 妖怪は、乗り移り、場を作り出す
  • 問題(妖怪)は善意によって発生する。妖怪を友達にしてバランスを修正する。
  • 妖怪による健全なコミュニケーション

ただし、距離感を忘れると、妖怪に乗っ取られる。

妖怪の見つけ方

  1. 発生している具体的な事象や出来事を見つける。
  2. なぜ、その事象は発生するのか? 問題解決を困難にする理由を見つけて名前を付ける。
    事実と感情は分けて考えること。
現場によくいる妖怪の一部
  • ナワバリン 「僕の仕事じゃありません」
  • タライマワシ 「これよろしく~」
  • クチダケ 「これはね~」
  • シッタカブリ 「それ知ってる」
  • シジマチ 「どうやってやればいいんですか」
  • ダマリン 会議中は黙っていて、後で話しだす

ゾンビ

ゾンビとは「健全なコミュニケーションが取れず学習が停止した状態」

  • 自由で活発に意見が言えない
  • 萎縮してしまう
  • 大したことがないと思ってしまう

その結果、 - 創造性や自主性の芽が摘まれる/損なわれる - 自己組織化が困難になる

ゾンビの種類
  • 否定されたと感じる
  • 途中で投げだし
  • イエスマン、意見が言えない
  • 覇気がない
  • ため息
人をゾンビにさせるアクション
  • 「知らなくていいんだよ」
  • 話を聞かない
  • (不適切な)マサカリ
  • 見下した態度
  • 攻撃的な態度
  • 信じる(意味の支配)
  • 参加意識の欠如
  • 矛盾したメッセージ(その時々で言うことが変わる。ダブルバインド)
  • 価値観の強制、相手の束縛が根底にある

ゾンビに魂を入れるためには

  • 自我状態を分析し、適切な反応を返す
  • 相手の状態により、情報を与える/得る
  • 問題解決せず、その状況を味わう
  • 矛盾しないメッセージを投げる(ダブルバインドの解消)
  • 自信や自尊心などを貯金する良い反応やフィードバックを与える(ストローク)

ストローク

ストロークの語原は「なでる」こと。

ある行動に対してストロークを与える(注目する)と、その行動の継続が促される。
ある行動を無視すると、その行動の消失が促される。

行動に対する肯定的なストローク(条件付)

もらうためには「何かをする」必要があるので、「条件付ストローク」と言われる

  • 具体的なほうがよい
  • 本当の事を言う(お世辞や適当にほめるのは×)
  • ストロークを与えるタイミングは、
    • 気づいたらすぐやる
    • 相手がよい方向に向かっているときにやる(完璧にできるまで待たない)
行動に対する建設的な否定的ストローク

普段からの信頼関係が大事。信頼関係のない人に言われても反感買うだけ。 伝えるときは肯定的なストロークでサンドイッチにして伝えるとよい。

ゾンビは、ポジティブな言葉掛けをしても吸い取ってしまう。
でも、あきらめずに続けることが大切。

自分で「ゾンビ状態」であることを選択することもある。 (ex.よく分からないけどとりあえず従っておこう、とか) このとき、ゾンビ状態であることを、自分で「選択した」と思っていることが重要。
でないと本当にゾンビになる。

妖怪への対応

相手(妖怪)の望みは何か?

  • 相手の立場について想像してみる
  • 妥当なこと(基本的に良いこと)は何だろう?
  • 発生した問題や迷惑ではなく、相手の迷惑に着目する

なぜ問題(妖怪)は起こるのか?
問題には理由がある。問題を起こす人は悪いことをしたいと思っているわけではない。
妖怪は善意によって発生する。

妖怪とうまくつきあう。

「自分が悪い」「誰々が悪い」ではなく、妖怪のせいにして、解決策を考える。
自己悪化(自分が悪い)では解決しない。
自分で妖怪を見つける事が重要。

ワークショップでやったこと

  1. 相手(妖怪)に向かって不満を言う
  2. 第三者的に、自分が妖怪に対する不満を言っている姿を観察する
  3. 妖怪の立場になって、不満を言っている自分を眺める

ワークショップでやったこと2

妖怪に対して、どんな妖怪をぶつければ仲間にできるか考える。 (「退治する」のではなく「仲間にする」がポイント)

感想

後から思い返しても、色々と考えさせられることが多い勉強会だった。 箇条書きで感想。

  • 難しい問題に当たるとどうすればよいか分からなくなることがよくあるが、「自分」で妖怪(対処するべき問題の原因)を見つけて対処するためのフレームワークとしてよく出来てると思う。
  • 問題を「妖怪」とすることで、相手の人格攻撃にならずに済む。 対処するべき相手を人ではなく妖怪とすることで、「なんでこの人は自分の思い通りに動いてくれないのか」という気持ちを抑止することができる。
  • 「事実と感情は分けて考える」は大事。 妖怪の大半は問題そのものではなく、ある事象に対する自分の感情が発生させてると思う。
  • 妖怪を「仲間にする」という考えも面白い。 人は皆何かしらの妖怪(個性)を持ってるので、別の妖怪(人)をぶつけて、その妖怪を友達にする(自分の力にする)ことができる。
  • 映画のキャラクターを何かのメタファーとして見るというのは面白かった。
    キョンシー(ゾンビ)と導師(人をゾンビ化させて自分の思いのままに操る人)という話は納得した。相手の意見をことごとく否定して自分の思い通りに相手を動かす人とか見たことある。 (今の若い人はキョンシー知らないだろうな。。)

当日のTogetter

#DevSen 「見立て」でコミュニケーション問題解決を探るワークショップ 2015年6月13日 - Togetterまとめ

WIndows PowerShellで日本語フォントを使う

Windows PowerShellで日本語を使えるようにしたときのメモ。

参考:コマンドプロンプトの設定

環境:Windows7 Professional(x64)

対応前

dirコマンドでファイル一覧を表示すると日本語のファイル名が化ける。

f:id:mokky14:20150427180029p:plain

プロパティ→フォントを指定しても、日本語のフォントがメニューに出てこない。

f:id:mokky14:20150427180152p:plain

プロパティから「現在のコード ページ」を見ると、「437 (OEM - 米国)」となってる。 このため、日本語のフォントが選択出来ないらしい。

f:id:mokky14:20150427180527p:plain

対処方法

コードページを日本語のものに変更する。
PowerShellのウィンドウから以下コマンドを実行。

> chcp 932

プロパティから、コードページが932(Shift-JIS)になった事を確認。

f:id:mokky14:20150427180844p:plain

フォントタブを指定すると、日本語フォントが指定出来るようになってる。

f:id:mokky14:20150427180726p:plain

フォントを指定すると、日本語のファイル名も正しく表示されるようになった。 日本語ファイルのtab補完も出来た。

フォントのカスタマイズ

MSゴシックとラスターフォント以外のフォントを使う方法。
参考サイトに以下の情報があったのでこれに倣う。

既定のフォント以外に変更するには、選択可能なフォントのリストに新しいフォントを追加し、それを選択します。そのためにはレジストリを書き換える必要があります。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont]に、現在設定されているフォントのリストがあります。ここに種類を「文字列値」、キー名を現在のコードページ番号である[932.]として、値にフォント名を設定した項目を追加します。

レジストリエディタを起動。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont] を開く。

f:id:mokky14:20150427181053p:plain

右クリック→新規→文字列値を選択。
名前に「932.」を指定し、「値のデータ」に追加するフォント名を指定。

f:id:mokky14:20150427184312p:plain

PowerShellを起動し直して、プロパティ→フォントを開くと、追加したフォントが選択可能になってる。

f:id:mokky14:20150427184347p:plain

選択したフォントで日本語も問題なく使えるようになった。

f:id:mokky14:20150427184356p:plain

Agile Japan 2015 仙台サテライト「YOU CAN REDO」 に行ってきました

2015/4/16のAgile Japan 2015 仙台サテライトのレポート。

f:id:mokky14:20150417065232p:plain

基調講演1:アジャイル・テスティング ~ チーム全体のためにテストとテスターができることを学ぶ旅

Janet Gregoryさんによる講演。Janetさんは『実践アジャイルテスト』の共著者。

t.co

分散したチームでのテスティングの話。 開発は一拠点に集まって開発を行うのがBestだが、色々な事情により、分散して開発せざるを得ない場合がある。

分散開発の問題

  • フィードバックが遅くなる(質問に対する回答が24H後になる等)
  • コミュニケーションのコストがかかる
  • ダイバーシティ
    • 歴史の違い
    • 習慣の違い
    • 言語が違う
    • 挨拶のやり方が違う(握手、ハグ等)

スティングに特定した課題

f:id:mokky14:20150416102019j:plain

対策

コミュニケーション
  • 情報(意思決定、計画作り会議、議事録等)を全員にオープンにする。
  • 均等に機会を与える。全員が会議に参加出来るようにする等。
  • コミュニケーションツール(メール、電話、SNS等)を必要に応じて使い分ける。
コラボレーションツールを使用

f:id:mokky14:20150418081507p:plain

メンバー間での会話がある事が大事。 Janetさんが本を書いた時は、パートナーとお互い何を考えているかをMindMapで共有して書いた。

テストを通して共通理解を作る

f:id:mokky14:20150418081830p:plain

人によって、作業の「完了」のレベルは異なる。 作業をテストの形で書いて、その内容について確認(会話)することで共通理解を作る。

「早いフィードバック」が大事。

学ぶことが出来る環境

失敗から学ぶことが出来るようにする。

f:id:mokky14:20150418081354p:plain

異なるチームに対して、文化は簡単にコピーできない。 振り返りが大事。

信頼関係を作る

互いの状況を理解することで、相手を気遣うようになる。
全員に見えるようにすることが大事。

f:id:mokky14:20150418081327p:plain

適応する

f:id:mokky14:20150418081250p:plain

自分のSafe Zoneから出て、周りと話をしましょう。

基調講演2:デジタル革命には アジャイルがよく似合う

横塚 裕志さん(東京海上日動システムズ株式会社顧問)による講演。

デジタル革命

f:id:mokky14:20150423112617p:plain

  • 富士フィルムの本業はもうフィルムではない。
  • 3Dプリンタで車や家の部品が作れる。
  • リアルタイム翻訳システムが今年中にできる。
  • 2014年ワールドカップで優勝したドイツは、選手の靴にセンサー付けてデータを取った。
  • 某便器メーカは、毎朝の尿からその人の健康状態を判定するセンサーを開発してる。 → 医者が不要になる。
  • 自動車の運転が自動化されると、交通事故が起きなくなる → 自動車保険が不要になる。
  • 防犯カメラの精度や監視機能が向上する。 → 警察が不要になる。

今後、少し頭を使うような作業(銀行の融資担当、保険の査定など)はコンピュータに取って替えられると言われている。

この世界で生き残っていくには?

デジタルビジネスの特徴

f:id:mokky14:20150424113232p:plain

競争の軸が変化する。 新聞を例に取ると、紙の時は正確さが大事にされたが、デジタルではスピードが大事になる。

競争優位は続かない。
企業に常にイノベーションを続ける体力が求められる。

勝ち残るためには、「テクノロジーが実現する新しい価値作り」が必要。
企業が「売れる」と思うかは関係なく、お客様が価値を感じるものでないと売れない。

価値作りのための4つの視点

Customer Centric

自動車を作ってる人は、自動車の運転を自動化しようとは考えない。 「運転するの面倒くさい」と考えるお客様目線で考えないとダメ。

考えるためのメソッドとして、デザインシンキングがある。

デザインシンキングでは、プロトタイプを作ったり、実際に体験したりする。 座学だけでは意味がない 。

Collaboration

対話することで気付きが得られる。

  • ビジネスとエンジニア
  • チームとお客様

一緒にどういうものを作るか考える。 考える人と作る人を分離しない。

Visible

見えるようにする。見えるようになれば工夫できる。言葉だけでは分からない。

プロトタイプを作るなどして見える化する。

Iterative

f:id:mokky14:20150423113801p:plain

お客様に見てもらって改善していく。改善、改善、改善。
これから新しいサービスを作ろうとして、最初から良い物を作れるわけがない。 お客様の反応を見ながらフィードバックを受けて改善していく。

常にお客様のフィードバックを得ながら改善していかないとビジネスで勝ち残っていけない。

ウォーターフォールアジャイルか」なんて議論やってる場合じゃない。もうアジャイルに決まっている

Agile is Mind-Set

昔ながらのマインドセットではダメ。 フランクにお互いの言うことをよく聞いて戦略を立てる。

f:id:mokky14:20150423113837p:plain

3年先を考えるなんて無理。4半期くらいで見直さないとダメ。 敵は自分の業界の外から来ることもある。

今変わらないと、10年後、日本はタダの部品メーカに成り下がる。

アジャイルするためにはBA(Business Analysis)スキルが必要。

ビジネスイノベーションアジャイル、ビジネスアナリシスは1セット。 個別で考えるものではない。

ビジネス側に提案できるようになることは技術者の責務。

f:id:mokky14:20150416114905j:plain

午後の仙台セッションに続く。

リンク

Janetさんの著書。

実践アジャイルテスト テスターとアジャイルチームのための実践ガイド (IT Architects’Archive ソフトウェア開発の実践)

実践アジャイルテスト テスターとアジャイルチームのための実践ガイド (IT Architects’Archive ソフトウェア開発の実践)

まとめ:
2015/04/16(木) Agile Japan 2015 ~午前~ #agilejapan - Togetterまとめ

公認レポート:
Agile Japan 2015 レポートコーナー

RedmineにAgileプラグインをインストール

Redmine使ってみて、チケットをかんばんの形で表示するプラグイン探してみたところ、Agileプラグインでいけそうだったのでインストールしてみた。

環境

  • OS : CentOS6.5
  • Redmine : 2.6.0-1
  • ruby : 2.2.2p95
  • gem : 2.4.5
  • bundler : 1.9.4

ダウンロード

プラグインRedmine pluginsからダウンロードする。 ダウンロードにはユーザ登録が必要。
多機能な有償版もあるようだが、今回はフリー版の redmine_agile-1_3_8-light.zip をダウンロード。

インストール

Redmine Agile plugin installation - Agile plugin - Redmine pluginsの手順に従いインストールを実施。
Redmine2.6.0の場合、pluginsディレクトリは、Redmineインストールディレクトリのapps/redmine/htdocs/plugins/ になる。

[root@centos6 htdocs]# pwd
/opt/redmine-2.6.0-1/apps/redmine/htdocs/plugins/
[root@centos6 plugins]# unzip /tmp/redmine_agile-1_3_8-light.zip
[root@centos6 redmine_agile]# bundle install --without development test
Fetching source index from https://rubygems.org/
Could not fetch specs from https://rubygems.org/

Proxy未設定によるエラーと思われるため、Proxyを設定。

[root@centos6 redmine_agile]# vi ~/.gemrc
http_proxy: http://proxyuser:proxypass@proxyhost:proxyport

再度実行。

[root@centos6 redmine_agile]# bundle install --without development test
Fetching gem metadata from https://rubygems.org/.........
Using rake (10.3.2)
Using i18n (0.6.11)
Using multi_json (1.10.1)
Using activesupport (3.2.19)
(途中略)
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /usr/bin/ruby extconf.rb
checking for ruby/thread.h... no
checking for rb_thread_blocking_region()... yes
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lmygcc... no
checking for mysql_query() in -lmysqlclient... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.
(途中略)

An error occurred while installing mysql2 (0.3.14), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.3.14'` succeeds before bundling.

mysql2のインストールでエラー。
エラーメッセージにしたがってgem installしてみる。

[root@centos6 redmine_agile]# gem install mysql2 -v 0.3.14 -r -p http://proxyuser:proxypass@proxyhost:proxyport
Building native extensions.  This could take a while...
ERROR:  Error installing mysql2:
        ERROR: Failed to build gem native extension.

    /usr/local/bin/ruby extconf.rb
checking for ruby/thread.h... yes
(途中略)
checking for mysql_query() in -lmysqlclient... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
(途中略)
        --without-mysqlclientlib


Gem files will remain installed in /usr/local/lib/ruby/gems/2.0.0/gems/mysql2-0.3.14 for inspection.
Results logged to /usr/local/lib/ruby/gems/2.0.0/gems/mysql2-0.3.14/ext/mysql2/gem_make.out

mysql-develがインストールされてないとダメらしい。mysql-develインストールしてからmysql2インストールする。

[root@centos6 redmine_agile]# yum -y install mysql-devel
[root@centos6 redmine_agile]# gem install mysql2 -v 0.3.14 -r -p http://proxyuser:proxypass@proxyhost:proxyport
Building native extensions.  This could take a while...
Successfully installed mysql2-0.3.14
Parsing documentation for mysql2-0.3.14
unable to convert "\xE0" from ASCII-8BIT to UTF-8 for lib/mysql2/mysql2.so, skipping
Installing ri documentation for mysql2-0.3.14
1 gem installed

mysql2のインストールに成功。Agileプラグインのインストールに戻る。

[root@centos6 redmine_agile]# bundle install --without development test
(途中略)
Net::HTTPServerException: 407 "Proxy Authentication Required"
An error occurred while installing ruby-openid (2.3.0), and Bundler cannot continue.
Make sure that `gem install ruby-openid -v '2.3.0'` succeeds before bundling.

なぜかProxyの認証エラー。
色々試したが、最終的には一旦ログアウトして、再度ログインして実行したら動いた。

[root@centos6 htdocs]# bundle install --without development test
(途中略)
<= 1.8.6 : unsupported
 = 1.8.7 : gem install rdoc-data; rdoc-data --install
 = 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!

インストール手順に従い、次のコマンド実行。

[root@centos6 htdocs]# bundle exec rake redmine:plugins NAME=redmine_agile RAILS_ENV=production
/usr/local/lib/ruby/gems/2.2.0/gems/bundler-1.9.4/lib/bundler/shared_helpers.rb:78: warning: Insecure world writable dir /opt/redmine-2.6.0-1/apps/redmine/htdocs in PATH, mode 040777
/opt/redmine-2.6.0-1/apps/redmine/htdocs/vendor/bundle/ruby/2.2.0/gems/activesupport-3.2.19/lib/active_support/values/time_zone.rb:270: warning: circular argument reference - now
Migrating redmine_agile (Redmine Agile plugin (Light version))...
==  CreateIssueStatusOrders: migrating ========================================
-- create_table(:issue_status_orders)
   -> 0.3914s
-- add_index(:issue_status_orders, :issue_id)
   -> 0.0539s
-- add_index(:issue_status_orders, :position)
   -> 0.0218s
==  CreateIssueStatusOrders: migrated (0.4674s) ===============================

==  CreateAgileColors: migrating ==============================================
-- create_table(:agile_colors)
   -> 0.0135s
-- add_index(:agile_colors, :container_id)
   -> 0.0240s
-- add_index(:agile_colors, :container_type)
   -> 0.0230s
==  CreateAgileColors: migrated (0.0607s) =====================================

==  RenameIssueStatusOrders: migrating ========================================
-- rename_table(:issue_status_orders, :agile_ranks)
   -> 0.0049s
==  RenameIssueStatusOrders: migrated (0.0050s) ===============================

手順に従い、Redmine再起動。 再起動後、ブラウザからRedmineのページを開き、管理→プラグインを確認。 無事インストール出来たっぽい。

f:id:mokky14:20150417154537p:plain

使う

プロジェクトの設定→モジュールから、Agileにチェックを入れることで、該当プロジェクトでプラグインが有効になる。

f:id:mokky14:20150417155445p:plain

プラグインを有効にした後、「Agile」タブをクリックすると、かんばんが表示される。

f:id:mokky14:20150417160750p:plain

チケットのステータスは設定したワークフローに従って表示される。 個々のチケットはドラッグ&ドロップで移動可能。
同じステータスのチケットの表示順も変えられるので、優先順の並べ替えが可能。

チケットに表示する情報はAgile pluginの設定画面から設定可能。

f:id:mokky14:20150417163340p:plain

やりたい事は出来るようなのでこれで運用してみる。

参考:
Redmineのアジャイル開発向けプラグイン - torutkの日記
https://groups.google.com/forum/#!topic/redmine-users-ja/r836-uwS2gM
gem install実行時、Proxyサーバ認証ユーザに @ を含む場合のTips - 会長@腹部日記(2013-05-08) Proxy環境でgem install - Qiita
gem インストール時に発生したエラーとその解決方法まとめ - kzy52's blog

POStudy Day 2015 Winter in Sendaiに行ってきた

2015/3/8のPOStudyのレポート。

f:id:mokky14:20150311212639p:plain

はじめに

キャズム理論

f:id:mokky14:20150311212848p:plain

進行形のプロダクトが、今どの状況にいるかは分からない。 (iPhoneを今使ってる人はアーリーマジョリティ? レイトマジョリティ?) 後から振り返った時に「あの時はこの位置だった」と言える。 現在進行形のプロダクトについては「今どのあたりにいるか?」と仮説を立てて戦略を立てる必要がある。

興味を持って先行投資的に買ってくれる人達と、世間一般で「大丈夫だ」と認知されてから買う人達の間には、大きな壁(キャズム)がある。

アーリーアダプターをどうやって見つけるかが午前中のセッション。
イノベーターは探す必要はない。向こうから飛びついて来てくれる。

持っている課題に対し、仮説を立てて、それに対してどういうフィードバックが得られて、新しい仮説を立てるのが午後のセッション。

プロダクトマネジメントのライフサイクルについて

f:id:mokky14:20150311214020p:plain

  1. 現状分析を行う。
  2. どこを攻める(ターゲット、エリア、サービス等)かを考える。(会社であれば上司とのすり合わせも行う)
  3. 「いつどこの誰の課題を、どういう解決策で解決して、どんな未来を作ることが出来て、その先にある価値は何か?」を考える(初期仮説)
  4. 「その課題を持っている人は本当に居るのか?」「解決策は有用なのか?」といった仮説の検証、見直しを行い、仮説検証をやり直す。
  5. ある程度検証が出来たら、プロダクトのリリース(ベータ版等)を行う。

仮説検証の方法として、製品のプレスリリースの検証がお勧め。 これから作る製品のプレスリリースを作成して、それをプレゼンしてみる。 論理矛盾を見つけやすい。

午前のセッション

LeanDiagramを作成する。

LeanDiagramとLeanCanvasの違いについて

他のビジネスモデルの検討を行うフォーマットにLeanCanvasがある。

LeanCanvasでは課題、解決策、対象顧客、独自価値を上段に、収入と支出を下段に書く。 LeanCanvasを使用した時のありがちな失敗として、数字(収入と支出)にばかり時間を割いてしまい、課題や独自の価値にはほとんど時間を掛けない事がある。 その結果、仮説検証を行うと全然ダメだったりする。肩書がある人はその傾向が特に強い。

数字を考えずに、課題解決と価値に思考を集中させるために作ったのがLeanDiagram。

LeanDiagramフォーマット

f:id:mokky14:20150318191453p:plain

左上の箱か、右上の箱から書き始める。 次に書けるのは、隣り合った箱か、実線で結ばれた箱のみという制約がある。 (左上の箱から書き始めたとき、次に書けるのは、左上2番めの箱か、右上1番目の箱のみ)

2箇所の点線は、論理矛盾がないかの確認を促すための箱。
左の点線は、左2と左8が同じ内容になっていないかを確認するための線。同じ内容になっていたらやり直した方がよい。
右の点線は、右2と右4の内容が合っているかを確認するための線。右2が痛み止めなのに、右4が治療薬の内容になってたりしないかを確認する。

課題・動機・原因、最終的に支払う責任者

病院の待ち時間が長くてイヤだと言う人に、4万円で待ち時間を半分にする、と言っても払う人はまず居ない。
でも、病院の経営者であれば、 待ち時間が短くなる→時間辺りの診察患者数増→診察点数が増えて収入増 なので、お金を払っても解決したいと考えるかも知れない。

支払ってもらおうと想定する人にとって、その課題は苦痛(お金を払ってでも解決したい)なのか、愚痴(文句言うだけでお金を出す程のものではない)なのか、判断する必要がある。

ある課題について、その課題を解決したいと考えてる人は複数種類いる。 最初に思いついた課題と困ってる人から、その課題を苦痛と感じてる人は誰? 苦痛と感じてる人が困ってる課題は何? ととブラッシュアップしていく。 課題の根本原因と、その根本原因を解決したい人の最終責任者(支払い権限ある人)を書く。

最初のターゲットを間違うと、この後の検討にいくら時間を掛けても無駄になってしまうため、一番重要。 ここは時間を掛けて考える必要ある。

代替手段
項目 説明
代替手段 現状の手段
使用理由 代替手段を使用している理由
顧客通貨 その課題を解決する事によって、最終支払責任者が得る価値、対価。
売上が上がるのであれば金額、移動手段の高速化であれば時間、等。

既存の代替手段がない所に新しいビジネスは発生しない」という人もいるくらい、「今どうしてるか?」は重要な項目。なお、今全くない新しいビジネスモデルの検討は、このフレームワークの対象外。

Early Adapter

Early Adapterを探すための項目。

項目 説明
キーワード 課題を持った対象者が足を止めてみてしまうようなキーワード。
「私の年収、低すぎ..?」みたいなやつ。
顧客の状況 対象者の状況
どこにいるか? 対象者に会いに行きたいとき、いつ、どこに行けば会えるか。
(仮説検証のため、対象者に会うにはどこに行けばいいか)

なお、ここで対象とするのは、意思決定者(最終責任者)の元で働いている、課題に悩んでいる現場の人(「売上上がらなければクビ!」と言われて悩んでるリーダー等)。

独自価値(「提案」の妥当性)

大企業(GoogleMicrosoft、Yahoo、楽天、etc)が同じビジネスをタダで始めたときの差別化要因は何か? これがないと大企業が同じビジネスを始めた時に負ける。

Value Propositionという独自価値を考えるためのフレームワークがある。 f:id:mokky14:20150328073442p:plain

顧客のしたい事に対して、

  • 嫌なことを減らす
  • 嬉しさを増す

ための方法を価値とする。両者はそれぞれアプローチが異なる。

検討には時間がかかるので、独自価値を考えるのが難しい時に使った方がよい。

顧客に何をお願いするか?

新サービス導入時は、お客様には以下4つのコストを払ってもらう必要がある。

  • イニシャルコスト(サーバ購入費、会員登録費等)
  • 既存の代替手段からの移行コスト(データ移行コスト、業務フロー作成コスト等)
  • 既存の代替手段を捨てるコスト(サーバ解約費、保守解約費、担当解雇費等)
  • ランニングコスト

このコストを払ってでも得られる顧客通貨が大きければ、既存の代替手段からの乗り換えを考えてもらえる。

解決の仕方

解決の仕方。

  • 治療薬 - 問題を根本的になくす(痛みをなくす)
  • 痛み止め - 100困っているのを50や10に減らす(痛みを和らげる)

治療薬と痛み止めではビジネスモデルが異なる。

  • 痛み止めの場合、痛みの和らげ方(移動時間が短くなるのに伴って料金上がる、等)が差別化要因になる。
  • 治療薬の場合、痛みがなくなるのが前提で、痛みをどのようになくすか(痛みゼロにするのに掛かるお金、時間)が差別化要因になる。

内容の検証

  1. 左と右を比べて論理矛盾がないか確認する。
  2. コストを払っても得られる価値が高いかどうかを確認する。
  3. 課題が存在していて、検討した内容で解決できたか確認する。

実践

検討内容は省略。 やってみた感想。

  • 課題が深堀り出来なかった。個人の感情を書いたのみで、「なぜその状況が発生するのか?」まで考えなかった。
    課題はこの表とは別に検討した方が良さそうに思った。(マインドマップ使う等)
  • 問題に対してお金を払ってくれるかも知れない人(支払責任者)が複数種類居そうだったので、それぞれの支払責任者に対して検討してみるのもアリかも。
  • 実務で使おうとした時、検討に時間をどれだけ掛けるかは難しい。(幾らでも時間を掛けられそう)

午後のセッション

デザイン思考とは

f:id:mokky14:20150311213829p:plain

顧客が欲しいものを考えるため、顧客をきちんと観察する。 顧客の観察は実在の顧客を対象にする。仮想顧客(ペルソナ)ではダメ。

イデアを生み出す、プロトを見せてフィードバックを貰ってプロトを作り直すことを繰り返す。
顧客のフィードバックの積み重ねで顧客が本当に欲しいものを提供する、というのがデザイン思考の定義。

デザイン思考の3つのレンズ

f:id:mokky14:20150311213837p:plain

デザイン思考における7つの心構え
  • 言うのではなく見せる
  • 人々の価値観に焦点を当てる
  • 素早く形にする
  • 行動第一
  • 徹底的な協働
  • 過程に注目
  • 明快な仕事
デザイン思考は0/1ではない

f:id:mokky14:20150329061050p:plain

デザイン思考は、分析もするけれども、相手が欲しいものは直感的に決めたりする。 分析的思考と直感的思考の両方の側面を持っている。

デザインプロセス

f:id:mokky14:20150311213857p:plain

上記5つのプロセスをn回繰り返す。

  • 共感
    人間に対する深い共感
  • 問題提起
    どこを攻めるか 着眼点を決める 課題の設定
  • 創造
    イノベーションの可能性を広げる 生成と評価を分ける
    人間の思考の手順には発散と収束というフェーズがある。両者は日にちや時間を分けて検討した方がいい。チームで検討する時はどちらのフェーズかを共有した上で検討する。
    発散にはアナログなツール(ポストイット等)が向いている(発散のときにデジタルなツールを使うと効率が悪い)。収束にはデジタルなツール(Excelマインドマップ等)を使うと収束させやすい。
  • プロトタイプ
    イデアを目に見える形にする。ペーパープロトタイプ、紙芝居、モック等。
    早く作って検証する事が目的なので、時間を掛け過ぎないよう注意。
  • テスト
    ユーザが生活する日常の中で試す フィードバックをもらうことでユーザに対するより深い理解を得る

ユーザのフィードバックを元に、新たな仮説を立てて、プロトタイプを作って、フィードバックをもらうというのが、デザイン思考のプロセス。

実践

d.schoolの「お財布プロジェクト」ワークショップ。 二人一組でペアになり、相手が欲しい財布を作る。

やった事。

  1. パートナーに、今使っている財布と財布の使い方、今困っている事、理想とする財布などをヒアリング。
  2. ヒアリング内容を元に、仮説を立てる。 「~さんは~が欲しい。なぜなら、~だからだ」
  3. パートナーに視点を変えて再度ヒアリング。財布を使う本人に視点を向ける、財布と持ち主の関連等も聞く。
  4. ヒアリングした内容を元に、「財布以外の方法」で課題解決するアイデアを六個検討。
  5. 六個考えたアイデアをパートナーに見せて、気に入ったアイデア、気に入らないアイデアをヒアリング。
  6. ヒアリング内容を基に、パートナーの理想の財布を考える。
  7. プロトタイプ作成。
  8. プロトタイプを見せてフィードバックをもらう。
  9. フィードバックをプロトタイプに反映。

自分が作成した財布のプロトタイプ

f:id:mokky14:20150311214137p:plain

ポイントカードを店舗毎に何枚も持たなくて済むように、ポイントを1枚のカードに集約させて、最小限のカードさえ持てばよいようにした、というのがポイント。

感想

  • パートナーへのヒアリングがうまく進められなかった。パートナーの考えをあまり引き出せなかった。
  • イデアは、断片的なものでも、荒唐無稽なものでも、とにかくパートナーにぶつけてみる事が大事。 相手にぶつけてみないと何も返ってこない。
  • 実現性をどの時点で考えるか難しい。アイデア出すときに実現可能性まで考えるとアイデア出なくなるけど、パートナーにプロトタイプを見せるときに実現性がないものでは意味が無い。

ヒアリング方法、過去に樽本さんにヒアリング方法のワークショップやってもらったのを思い出した。(その当時はブログ書いてなかったので記録残ってない。。) この時のワークショップでは、ユーザが店に入ってから出てくるまでにする事を順番に聞く、という事をやってたので、今回もパートナーが財布を使用する場面について、店に入ってから出て行くまでやる事を順番に聞いてくとか、やってみたら良かったのかも。

おまけ

ポストイットのめくり方、貼り方

f:id:mokky14:20150311214103p:plain

f:id:mokky14:20150311214114p:plain

f:id:mokky14:20150311214120p:plain

重なっても大丈夫なように、糊面を下にして貼る方法もお勧め。 (糊面を上にすると、ポストイットを重ねる時に、ポストイットの上にポストイットを貼るようになるため、重ねすぎると重みで落ちる)

デザイン思考について調べてたら見つけたのでリンク貼っとく。 www.designthinking.or.jp

gdbでリモートデバッグ

コンパイルしたマシンと別のマシンで動作しているプログラムをgdbデバッグする方法のメモ。

プログラムを動かすサーバにgdbserverをインストールする。インストールはyumから出来る。

# yum install   gdb-gdbserver

接続を受け付けるIPアドレスとポートを引数で指定し、起動済みプロセスのPIDを指定してgdbserverを起動。

# gdbserver 10.0.0.1:54321 --attach 16781

コンパイルマシンの方でgdbを立ち上げ、target remoteで、gdbserver起動時に指定したIPアドレス、ポート番号を指定してアタッチする。

$ gdb prog
(gdb) target remote 10.0.0.1:54321
Remote debugging using 10.0.0.1:54321
[New Thread 16781]
Malformed packet(b) (missing colon): re:2;
Packet: 'T0505:786a8ebf;04:406a8ebf;08:2454e400;thread:418d;core:2;'

gdbとgdbserverのバージョンが違うとダメらしい。

gdbのバージョンが6.8-27.el5だったので、そのバージョンのgdbserverをbuildする。

$ tar xjf gdb-6.8a.tar.bz2
$ cd gdb-6.8/
/tmp/gdb-6.8
$ cd gdb/gdbserver
/tmp/gdb-6.8/gdb/gdbserver
$ ./configure --prefix=/usr/local
$ make
$ sudo make install

今回の動作環境では、コンパイルしたサーバとプログラム実行するサーバで、ライブラリのバージョンが違うためうまく動かなかった。

ライブラリバージョンが合えば使えるはず。。

gdbserver: error initializing thread_db library: version mismatch between libthread_db and libpthread

なお、gdbでのデバッグ終了時はdetachで終了すること。 exitで終了すると、リモートサーバ側のプロセスが終了してしまうので注意要。

参考:

BuildingCrossGDBandGDBserver - GDB Wiki

GDB/GDBserverによるクロスターゲットのリモートデバッグ 3ページ | SourceForge.JP Magazine

PythonからOracle接続

PythonOracle接続してデータ検索する方法のメモ。

環境

OS Python Oracle Client
CentOS 6.4 3.3.0 11.2.0.3.0

インストール

Oracleへの接続ライブラとして、cx_Oracleをインストールする。
Oracleクライアントは既にインストールされている環境を使用したので、そちらのインストールは省略。(多分以下の4つのrpmをインストールした環境のはず)

まずは、cx_Oracleインストールに必要なpython3-develのインストール。

$ sudo yum install python3-devel
読み込んだプラグイン:fastestmirror, refresh-packagekit, security
インストール処理の設定をしています
Loading mirror speeds from cached hostfile
 * PUIAS_6_computational: puias.math.ias.edu
 * base: ftp.iij.ad.jp
 * centosplus: centos.mirror.secureax.com
 * epel: epel.mirror.srv.co.ge
 * extras: centos.mirror.secureax.com
 * updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package python3-devel.x86_64 0:3.3.0-1.puias6 will be インストール
--> 依存性解決を終了しました。

依存性を解決しました

===================================================================================================================
 パッケージ                アーキテクチャ     バージョン                   リポジトリー                       容量
===================================================================================================================
インストールしています:
 python3-devel             x86_64             3.3.0-1.puias6               PUIAS_6_computational             169 k

トランザクションの要約
===================================================================================================================
インストール         1 パッケージ

総ダウンロード容量: 169 k
インストール済み容量: 532 k
これでいいですか? [y/N]y
パッケージをダウンロードしています:
python3-devel-3.3.0-1.puias6.x86_64.rpm                                                     | 169 kB     00:01
rpm_check_debug を実行しています
トランザクションのテストを実行しています
トランザクションのテストを成功しました
トランザクションを実行しています
  インストールしています  : python3-devel-3.3.0-1.puias6.x86_64                                                1/1
  Verifying               : python3-devel-3.3.0-1.puias6.x86_64                                                1/1

インストール:
  python3-devel.x86_64 0:3.3.0-1.puias6

完了しました!

続いて、cx_Oracleのインストール。

$ echo $ORACLE_HOME
/usr/lib/oracle/11.2/client64
$ sudo ln -s /usr/include/oracle/11.2/client64 $ORACLE_HOME/include
$ su
# echo /usr/lib/oracle/11.2/client64/lib >> /etc/ld.so.conf.d/oracle.conf
$ sudo ldconfig
$ pip install cx_Oracle
(途中略)
Successfully installed cx-Oracle
Cleaning up...

環境設定(クライアント環境)

自分の環境のOracle周りの設定。 LD_LIBRARY_PATHの設定は必須。 他は関係ない設定もあると思うけどメモがてら載せとく。

export ORACLE_HOME=/usr/lib/oracle/11.2/client64
TNS_ADMIN=$ORACLE_HOME/network/admin
export TNS_ADMIN
export NLS_LANG=Japanese_Japan.AL32UTF8
NLS_DATE_FORMAT='YYYYMMDDHH24MISS'
export NLS_DATE_FORMAT
NLS_TIMESTAMP_FORMAT='YYYYMMDDHH24MISS.FF3'
export NLS_TIMESTAMP_FORMAT

export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=.:$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib

データ取得

テーブルからデータを取得して表示してみた。

$ python3
Python 3.3.0 (default, Feb 12 2013, 17:01:04)
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
>>> conn=cx_Oracle.connect('scott','tiger','xx.xx.xx.xx/tns_service_name')
>>> cur=conn.cursor()
>>> sql="select * from scott.db_tbl  where rownum<20"
>>> cur.execute(sql)
<cx_Oracle.Cursor on <cx_Oracle.Connection to scott@xx.xx.xx.xx/tns_service_name>>
>>> rows=cur.fetchmany(10)
>>> print(len(rows))
10
>>> print(cur.rowcount)
10
>>> for row in rows:
...  print(row)
...
(tupleデータ10行出力)
>>> rows=cur.fetchmany(10)
>>> print(len(rows))
9
>>> print(cur.rowcount)
19
>>> for row in rows:
...  print(row)
...
(tupleデータ9行出力)
>>> rows=cur.fetchmany(10)
>>> print(len(rows))
0
>>> print(cur.rowcount)
19
>>> cur.close()
>>> conn.close()

この内容を元にして、テーブルレコード全件をCSVファイルに出力するPythonスクリプト作ってみた。

#!/usr/bin/python3

import cx_Oracle
import sys
import csv
from itertools import chain

argvs = sys.argv
argc = len(argvs)
if argc != 2:
  print('Usage: %s TableName' % argvs[0])
  quit()

table_name = argvs[1].upper()
file_name = table_name + '_data.csv'

with cx_Oracle.connect('scott','tiger','xx.xx.xx.xx/tns_service_name') as conn:
  # テーブルの列名取得
  column_name_sql = 'select column_name from user_tab_columns where table_name = :tbl'
  cur_columns = conn.cursor()
  cur_columns.execute(column_name_sql, tbl=table_name)
  columns = cur_columns.fetchall()
  cur_columns.close()
  columns = tuple(chain.from_iterable(columns))

  # テーブルのレコード全件取得
  data_sql = 'select * from %s' % table_name
  cur_data = conn.cursor()
  cur_data.execute(data_sql)
  with open(file_name, 'w') as f:
    csv_writer = csv.writer(f)
    csv_writer.writerow(columns)
    while 1:
      rows = cur_data.fetchmany(50)
      if len(rows) == 0:
        break
      csv_writer.writerows(rows)
  cur_data.close()

参考:
pythonからOracleに接続するための拡張モジュール、cx_Oracleの基本的な使い方 at nkjmkzk.net
UbuntuでPythonからcx_Oracleモジュールを使ってOracle Database 11gに接続する - 偏った言語信者の垂れ流し
Cursor Object — cx_Oracle 5.1.3 documentation