マネジメントの秘伝のタレ

今回は私が今までチームマネジメントやヒューマンマネジメントを通して学んだTIPSを整理してみたいと思います。
マネジメント(≒コミュニケーション)を支える技術について都度メモして、自分への戒めとして利用していたものを箇条書きにまとめました。
ある特定の状況だけでしか適用できないものが多いですが、応用はいろいろ効くと思っています。
マネジメントの立場にこれからチャレンジしていきたい人の一助になればと思ってます。

※自分向けのメモを整理しただけなので、一般的にこうあるべきという内容ではありません


会議編

-全員の参加を促そう

全員の発言機会が均等になっているか常に意識しよう
一言でも意見を言うことによって、その議題を決めたという意識を持てる

- 自分自身(チーム自身)で決めたという感覚に落としもう

「決められたこと」ではなく、「自分たちで決めたこと」という意識を促そう
その決定が実行されなかった時に他責にしずらくなる

- 話が長い人は最後に要約を返してあげよう

「つまり〜〜ということであってますか?」
まわりが飽きてしまうと会議からの離脱が増える
要約してあげることで離脱者を引き戻すことができる

- 視界から消えよう

マネージャーに向かって話すと、複数人なのに一対一のようになってしまう
マネージャーは目を合わせない、ホワイトボードに向かう、後ろに立つ、歩き回るなどして存在を消そう
そうすれば、自然と視線がメンバー同士になる

- 話が長い人はインターセプトしよう

ペンを落とす、くしゃみをする、携帯を鳴らす、トイレに行くなどして会話を途切れた瞬間に話題を変えよう
ただ、あからさまだと失礼なので注意

- わちゃわちゃし始めたときは議論の立ち位置を確認しよう

議論が広がりすぎたときはホワイトボードに簡易マインドマップなどの関連図を書いて、全員で位置関係の認識を合わせよう
空気がけっこう引き締まる

- 空気を占拠しよう

最終的にはマネージャーが責任を持つべきなので、その意思表示のためにも率先して場の空気を占拠しよう
最初にホワイトボード前に立つ、ホワイトボードマーカーを最初に手に取るなどをすればそんな空気になる

- 個人攻撃はすぐにやめさせよう

何も生まれないし、チーム内に禍根の残すきっかけになってしまう

- メンバー同士が衝突し始めたら目線を逃がすように誘導しよう

メンバー同士で正面から目が合った状態で、議論が白熱すると言葉が荒くなったり、喧嘩腰になったりする人もいる
そんな時は、ホワイトボードやノートに書き出したり、モニターを映してみたりして全員の目線を外に逃がそう

- 誰か喋るまで待とう

喋りすぎなマネージャーは議論の邪魔
静かな空気が苦手でも誰かが喋るまで待とう
それでも喋らなかったらそもそも会議自体の内容を見直そう

- よーく観察しよう

寝てる人はいないか、飽きていないか、明らかに他の作業をしていないか常に観察しよう

- 眠たそう、寝ている人がいたらあからさまに意見を求めよう

「寝ないでください」と直接言うのはスマートじゃない
あからさまに何度も意見を求めることによって本人が気づいてくれるのを促そう
それでもだめなら休憩をいれよう

- PCを開けないように机をなくそう

「PCを開くな」や「PCを持ち込むな」と注意するのはクールじゃない
仕組みで解決しよう

- 時間をコントロールしよう

(25分 + 5分) or (50分 + 10分)のワンセット一本勝負

- 議論の決定は必ず実行しよう

実行されないと、発言しても意味がないと思われるので参加意欲が失われる

面談編

- 注意・説教はやめよう

注意する時は、必ず信頼関係が築けてから
そうでない限りは注意・説教しても何も影響しない

- 期待は伝えずに聞いてみよう

「あなたに期待されていることってなんだと思いますか?」
先に質問することでメンバーの意識とマネージャーの意識のギャップを確認しよう

- 相手のテンションを下げないようにしよう

相手のテンションを下げても何も生まれない
テンションをあげるような言葉遣いを意識しよう

- 条件反射を徹底的になくそう

カチンとすることを言われても、反射的に反論しないようにしよう
3呼吸ぐらいは置こう(短気だと思う人は5呼吸ぐらい)
もしくは、スルーしてから面談の最後にどうしても言いたかったら言おう

- 権利と義務はセットではないことを意識しよう

権利は権利、義務は義務
納税していない人でも選挙権はある

- 期待をはっきりと伝えよう

どういう人材になってほしいか誠実にはっきりと伝えよう
実際に相手のやりたいこととマッチするかは別にして、まずは伝えよう

- 徹底的に相手の立場を想像しよう

どのように伝えられたらテンションがあがるか?
どのような言葉を使われたら気分が悪いか?

- うわべの会話はやめよう

うわべで話していると相手は必ず気づく
本心から興味を持っていないことは必ず伝わる
うわべで褒めても必ず見抜かれる
そのためには日頃から観察しよう

- 指示ではなく、提案をしよう

条件、目標、作業など相手が決めきれない時は複数提案してあげよう
ちょっとの違いでもいいから複数だそう
"選択した" という行為によって、自分で決めたことになる

- 相手の心を揺さぶろう

扇動的な言葉を使って、相手の心を揺さぶろう
そこにモチベーションを上げるヒントがある

- 評価しないように意識しよう

マネージャーがその人の全てを評価できると思うことはおこがましい
評価はさまざまなプロセスで最終的に決まる
面談しただけの印象で固定観念に落とさないようにしよう

- 直接プレッシャーをかけないようしよう

直接的なプレッシャーは人を潰すだけ
期待をする、期待をされることでプレッシャーは相手の中で勝手に醸成される






マネジメントは技術です。
本もたくさん出ていますし、バイブルと言われているような有名な本もあります。
知識をつけて、実践して、失敗して、工夫して、身につけていくものです。

プログラミングと全く同じですね!

wordpressのdockerコンテナからRDSに接続する

waysaku.hatenablog.com
の続き

今度はRDSに接続してみる。
RDSはとりあえずdevでぽちぽち立ち上げ。

mysql -h ${RDS ENDPOINT} -P 3306 -u ${RDS USER} -p

で接続できることを確認。
接続できない時は立ち上げたVPC上のSecurity Groupの設定で接続元(この時はローカルのMacから接続してたので自宅のグローバルIP)とポートを許可する



RDSに接続できることを確認できたらwordpressのコンテナ起動オプションに
https://hub.docker.com/_/wordpress/
に従い -e オプションで接続先のDB設定を追加する

docker run --name wordpress -e WORDPRESS_DB_HOST=${RDS ENDPOINT} -e WORDPRESS_DB_USER=${RDS USER} -e WORDPRESS_DB_PASSWORD=${RDS PASSWORD} -p 80:80 -d wordpress

起動できたら前回同様にブラウザでアクセスしてみる
#dockerホストのIP確認

$ docker-machine ip wordpress
>192.168.99.100


http://192.168.99.100にアクセス -> OK

同一dockerホスト上でwordpressとmysqlをそれぞれのdockerコンテナで起動して接続してみるメモ

※環境はMacOS
virtualBoxとdocker-machineはセットアップ済み


#docker-machineでwordpress起動用のdockerHostを起動

$ docker-machine create --driver virtualbox wordpress

# 環境変数を設定

$ eval "$(docker-machine env wordpress)"

#mysqlのdockerコンテナを起動

$ docker pull mysql
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql

#接続の確認

mysql -h $(docker-machine ip wordpress) -uroot -p

dockerでwordpressを起動

$ docker pull wordpress
$ docker run --name wordpress --link mysql -p 80:80 -d wordpress

ブラウザでアクセスしてみる
#dockerホストのIP確認

$ docker-machine ip wordpress
>192.168.99.100


http://192.168.99.100にアクセス -> OK

Raspberry Pi2 Model Bでmdadmを使ったraid1構築

  1. apt-get install mdadm でmdadmをインストール
  2. sdaとsdbをfdiskで初期化してから、それぞれsda1とsdb1のパーテーションを作成
  3. mdadm --create /dev/md0 --level=raid1 --raid-devices=2 missing /dev/sda1 でまずはsda1だけの片肺状態で/dev/md0を作成
  4. mkfs -t ext4 -c /dev/md0 で/dev/md0にext4のファイスシステムを作成する
  5. /etc/fstabに /dev/md0 /data ext4 defaults 0 0を追記する
  6. 試しに mount /dev/md0でマウントしてみる→OK
  7. mdadm --add /dev/md0 /dev/sdb1 で残りのsdb1をraidに参加させる

haskellでなぜfoldrだと無限リストが扱えてfoldlだと扱えないのか

畳込関数fold:foldrとfoldlの違い (あるいはfold_right, fold_left) - 一歩前進
無限リストをfoldrで扱う(foldlでは扱えない)


haskellは遅延評価が特徴。
式の評価は外側から行う。
つまり外側の評価をするその時に内側の結果が必要なら計算する。

算数で例えると

(1 + (2 * 3))

という計算の場合は、外側の1 + の部分を計算するためには(2 * 3)の結果が必要なので、しゃーなしにその時に(2 * 3)を計算するみたいな感覚っぽい。

なので

foldl (+) v [x0,x1,...,xn] = (...((v + x0) + x1) ...) + xn
foldr (+) v [x0,x1,...,xn] = x0 + (x1 + (... (xn + v)...))


のような場合だと
foldlの場合は一番外側の式がxnの計算、つまり無限の終端を対象とする計算になってしまうので計算不可能。
foldrの場合は、一番外側がx0でリストの最初の数を対象にしているので計算(を開始することは)可能。

ということみたい。

試しにGHCIで

Prelude> foldl (+) 0 [1..]

は返ってこない

Prelude> foldr (+) 0 [1..]
[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380,382,384,386,388,390,392,394,396,398,400,402,404,406,408,410,412,414,416,418,420,422,424,426,428,430,432,434,436,438,440,442,444,446,448,450,452,454,456,458,460,462,464,466,468,470,472,474,476,478,480,482,484,486,488,490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,538,540,542,544,546,548,550,552,554,556,558,560,562,564,566,...

で一応実行できる。

Java Flight RecorderとMission Controlのまとめ

Java Flight Recorder(以下JFR)はいわゆるJavaプロセスのプロファイラ。
Java Mission Control(以下JMC)はJFRで取得したプロファイリングデータをGUIで見る事ができるビューア。
f:id:flick-flick:20140722012201p:plain

もともとはJRockitで搭載されていたのが, Java 7 Update 40以降で搭載されるようになった。
詳しくは
http://www.infoq.com/jp/news/2013/10/misson-control-flight-recorderHotSpot JVMで動作するMission ControlとFlight Recorder

で。



この機能は商用ライセンスのみになっているので、プロダクト用に利用する場合は商用ライセンス契約が必要。
ただし、JVMのオプションを指定することで利用できるようになっているのでお試しで利用することはできるみたい。


使い方は基本的には
http://docs.oracle.com/javase/8/docs/technotes/guides/jfr/toc.htmlTable of Contents

に全てが書いてあります。

起動方法

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder

JVMオプションに指定してあげればOK.

プロファイリングの開始

$ java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr MyApp

のようにプロセス起動時に開始するか

$ java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder MyApp

で起動してから
jcmd(後述)でJFR.startコマンドを投げることによって開始される。

プロファイリング開始後の操作

jcmdコマンドを使ってjavaプロセスにコマンドを投げることによって、プロファイラに命令を送ることができる

#javaプロセスの確認
$ jcmd    
3857  ←プロファイリングしたいプロセス
20762 sun.tools.jcmd.JCmd

#このプロセスに投げることができるコマンド一覧の確認
$ jcmd 3857 help
3857:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
Thread.print
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
help

プロファイリングスタート

$ jcmd 3857 JFR.start
3857:
Started recording 1. No limit (duration/maxsize/maxage) in use.
Use JFR.dump recording=1 filename=FILEPATH to copy recording data to file.

recordingという番号がプロファイリング開始番号みたいな扱いらしい。
duration(期間)などの指定もオプションでできる

プロファイリングの状態の確認

$ jcmd 3857 JFR.check
Recording: recording=1 name="Recording 1" (running)

recording番号は1でプロファイリング実行中(runnning)というのが確認できる

プロファイリングデータのダンプ取得

$ jcmd 3857 JFR.dump filename="/tmp/myprofile.jfr" compress=true recording=1

filenameでダンプファイルのパスを指定して、zipでの圧縮がしたければcompress=trueを指定する。
recorindg番号を指定は必須

プロファイリングの終了

$ jcmd 3857 JFR.stop recording=1

これもrecorind番号は必須

JMCの起動

$ [JDK_PATH]/bin/jmc

で起動
JMX経由の情報も見ることができるが、今回はプロファイリングデータから読み込むのでメニューのファイルから開くで、ダンプした/tmp/myprofile.jfrを指定する。
f:id:flick-flick:20140722012301p:plain
時系列ごとによく使われいてるMethodやThreadの一覧、メモリの割り当て状況やIO(ファイルやネットワーク)の状況も全て解析できる。

プロファイリング対象の設定

デフォルトのプロファイリングの設定だとメモリの割り当て状況(Memory -> Allocations)やヒープのオブジェクト解析(Memory -> Object Statistics)がオフになっているので、有効にする。
(JMCでウィンドウ開いてもEvent type 'Allocation in new TRAB' is not enabled in this recordingとかEvent type 'Object Count' is not enabled in this recordingとか出て何もグラフに表示されない)

ちなみにTLABはThread Local Allocation Buffersの略。

$ls -l [JDK_PATH]/jre/lib/jfr
-rw-rw-r--  1 root  wheel  18574 Oct  8  2013 default.jfc
-rw-rw-r--  1 root  wheel  18531 Oct  8  2013 profile.jfc

これがプロファイリング用の設定ファイルらしい
とりあえずdefault.jrcをmyprofile.jfcとしてコピーして必要そうなところをfalse -> trueに書き換えて有効にする

$ diff default.jfc  myprofile.jfc
118c118
<       <flag name="class-loading-enabled" label="Class Loading">false</flag>
---
>       <flag name="class-loading-enabled" label="Class Loading">true</flag>
237c237
<       <setting name="enabled" control="heap-statistics-enabled">false</setting>
---
>       <setting name="enabled" control="heap-statistics-enabled">true</setting>
267c267
<       <setting name="enabled">false</setting>
---
>       <setting name="enabled">true</setting>
446c446
<       <setting name="enabled" control="allocation-profiling-enabled">false</setting>
---
>       <setting name="enabled" control="allocation-profiling-enabled">true</setting>
451c451
<       <setting name="enabled" control="allocation-profiling-enabled">false</setting>
---
>       <setting name="enabled" control="allocation-profiling-enabled">true</setting>

そしてプロファイリング開始時にこの設定を使ってプロファイリング開始するようにする

$ jcmd 3857 JFR.start settings=myprofile

これで先ほどと同じ通りにプロファイリングデータのダンプを取得してJMCに読み込ませれば、該当のプロファイリングが有効になってました。




参考:
Java Mission Control + Flight RecorderをGlassFish4で使ってみた - ブログなんだよもん
Running Java Flight Recorder
[http://hirt.se/blog/?p=370Creating Flight Recordings | Marcus Hirt
[http://hirt.se/blog/?p=381Allocation Profiling in Java Mission Control | Marcus Hirt