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

nesheep5's blog

プログラミング・子育て・音楽 etc...

ロジカルシンキング入門

先日、ロジカルシンキングについて講習を受ける機会がありました。
エンジニアも打合せや仕様検討など、論理的に思考することや伝える技術が必要ですが、私を含め苦手な方が多いのではないかと思います。
ロジカルシンキングを勉強して考えのまとめ方、伝え方がスムーズになった気がするので、教わったことをまとめておきます。

ロジカルシンキングとはなにか

一貫していて筋が通っている考え方、説明の仕方のこと。

  • きちんと深掘りし、良い案をだすこと
  • なるほど、とおもってもらう
  • 分かりやすく伝える

人間の頭はそもそもロジカルシンキングにむいていない
→すぐに結論を出したがる
→訓練が必要

本質:頭の中でどう考えているかよりも、それが相手に伝わる「メッセージ」として具現化できているかが重要。

ロジカルシンキングの考え方

  • 考えるべきことを3つ出す

    • 具体的な要素ではなく、1つ上の概念を出すこと
      →「開発要員が足りない」、ではなく「社外」「社内」「採用」 という”観点”を考える

    • ひたすら訓練する

      • 「ゼロ秒思考」
        テーマについて、1分で5つ以上答えをだす(例:自分の強みは何なのか)
        単語ではなく文章としてアウトプットする(日本語力の強化)
  • マトリックスで整理する

    • 3×Nのマトリックスをつかう
      →軸を決めて整理することで、相手に納得感をもってもらう

思考のテクニック

ボトムアップ

答えから考えていく方法。これをやってしまいがち。
理解しているテーマには強いが、まったく新しいことには対応しづらい。

例:要件定義は必要か?
→結論:Yes
→なぜ?
・システムに必要な機能要件をについて共通認識をすり合わせる
・要件を分類整理することで、必要工数など算出できる

トップダウン

答えを出すにあたって、必要な要素、観点を洗い出し、組み合わせて深掘りしていく方法。
新しいことを考えるにはこれが大事。
観点をふくらませるには、一つの観点に対し、対極・中間・上位・下位など相対的に考えていく。

例:要件定義は必要か?
→要素・観点:
・人(設計者、ユーザ、システム管理、経営層)
・モノ(サーバ、他システム、データ)
・時間(開発期間、大量データの処理時間)

フレームワーク

ロジカルシンキングの伝え方

テンプレートを意識

  • 〜の件についてですが  (テーマを最初に確認する)
  • 〜は〜だと考えます。  (結論を最初に言う)
  • その理由は3つあります。  (理由を列挙)
  • 1つめに〜であること、
  • 2つめに〜であること、
  • 3つめに〜であること
  • よって〜は〜だと考えます。

SCQAの型を意識する

  • 状況提示(Situation) :御存知の通り〜ですよね
  • 複雑化(Complication):そんな中、〜ですよね
  • 問い(Question):だから〜について、〜するべきですよね
  • 主張・提案(Answer):この点、〜と考えます

  • SCが難しい、答えを急ぎがちなので注意

  • 話し手はずっと考えている、聞き手は初めて聞く(SCを省きがち)

ロジカルシンキングのトレーニング

以下を徹底する

  • 結論から話す
  • 理由を説明する(なぜなぜ、、、)
  • 紙に書いて整理する

補足

  • ロジカルシンキングだけではだめ、感情力も大事
    • データ・数字より、より感情的に訴える内容のほうが心に残る(免許更新センターの動画)

おすすめ書籍

HHKBで小文字英字が入力できなくなったら(CapsLock)

普段、HHKB(Happy Hacking Keyboard)というキーボードを使用しています。
ある日、突然大文字英字しか入力できなくなってしまい戻すのに少し手間取ったのでメモ。

挙動的にCapsLockがかかったのだろうと推測したのですが、HHKBにはCapsLockキーがありません。
じゃあショートカットキーかな、、と思い色々調べたところ、公式サイトのFAQに記載がありました。

Happy Hacking Keyboard サポートFAQ

以下、引用です。

Q1:“Caps Lock” を有効にするにはどうしたらいいですか?
A1:キーボード後部のDIPスイッチで、設定したモードにより動作が異なります。
HHKモード】
“CapsLock"の機能はありません。
【Lite拡張モード、Macモード】
【Fn】+【Tab】キーで"CapsLock"の働きをします。

私はMacモードで使用していたので、Fn + Tabキーで無事CapsLockを解除できました。
FAQの一番上に書かれていたので、意外と皆さん引っかかるのかもしれませんね。

リフレクションで引数名を取得するときはjavacに-parametersオプションをつける

Javaでリフレクションを利用してメソッドの引数名を取得したかったのですが、ちょっと詰まったのでメモ。
結論としてはコンパイル時、javacに-parametersオプションをつける必要がありました。
以下検証までの手順です。

問題:リフレクションで取得した引数名がargNになる

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class GetArgsName {
    public static void main(String... args) throws NoSuchMethodException, SecurityException {

        Method m = Calc.class.getDeclaredMethod("add", int.class, int.class);
        Arrays.stream(m.getParameters())
            .map(Parameter::getName).forEach(System.out::println);
    }

    public static class Calc {
        public int add(int x, int y) {
            return x + y;
        }
    }
}

上記のプログラムで引数名を取得できると思い、実行してみたところ以下のような結果が。

arg0
arg1

引数名であるx,yを取得したかったのですが、なぜかargNで取得されました。

解決法:javacに-parametersオプションをつける

いろいろ調べた結果、以下のサイトにドンピシャの答えが書いてありました。
ひしだまさんにはいつもお世話になっています。笑

Javaリフレクションメモ(Hishidama's Java Reflection Memo)Javaリフレクションメモ(Hishidama's Java Reflection Memo) 

リフレクションで引数名を取得したい場合、javacに-parametersオプションをつける必要があるとのこと。
またEclipseで実行するときは、プロジェクトのProperties > Java Compiler より以下にチェックを入れればOK。
f:id:nesheep5:20170202140221p:plain

再度実行した結果、以下のように思惑どおり引数名を取得できました。

x
y

エンジニアのヘルスケアで本当に買ってよかったもの5選

エンジニアになってから十余年、日々のデスクワークのによる肩こり・腰痛・腱鞘炎が辛いです。職業病ですね。
放っておくとどんどん悪化していくため、なんとか改善しようと試行錯誤の毎日です。
色々試した中で、これは本当に買ってよかった!と思えるものを紹介します。

LPN ストレッチポール®EX

LPN ストレッチポール(R)EX ネイビー 0001
LPN
売り上げランキング: 73
  • プロアスリート御用達
  • 猫背の矯正、肩甲骨まわりのストレッチに効果
  • 体幹トレーニングにも利用可能

ラグビーをやっているエンジニアの方に薦めてもらいました。
プロのアスリートも多く使われているそうです。
ポールの上に寝そべり、エクササイズをすることで正しい姿勢に矯正することができます。
寝起きに使うと、いかに体が凝り固まっているか実感できると思います。特に猫背の矯正、肩甲骨まわりのストレッチに効果があり、ググーっと伸ばすことでデスクワークで凝り固まった体をほぐすことができます。
また体幹トレーニングにも利用できるため、体を鍛えて凝りや痛みを未然に防ぐ使い方も可能です。
類似品が色々ありますが、正規品は作りがしっかりしていてヘタりもなく硬さも絶妙だったのでおすすめです。

参考サイト
ストレッチポールとは|ストレッチポール公式サイトストレッチポールとは|ストレッチポール公式サイト 
ストレッチポール®がベスト体幹ツールの理由と効果的使用法ストレッチポール®がベスト体幹ツールの理由と効果的使用法 

ドクターエア 3Dマッサージロール

  • 充電式でとにかく手軽に使える
  • 継続することで体質改善に

とあることからモニターをやることになりこの商品を知りました。
3段階のバイブレーションで凝っている箇所をほぐします。充電式でとにかく手軽につかえるので、テレビをみながらソファーで使用したりと、「買ったけど面倒になって使わない」がなく毎日使用しています。
バイブレーションだけでコリが取れるのか?と半信半疑だったのですが、筋肉を振動させることで筋膜剥がしのような効果があるそうです。足などに使うとむくみがとれ、柔軟性も高まります。
モミ玉でゴリゴリやったときのようなもみ返しがないのもメリットです。

参考サイト
3D MASSAGEROLL(マッサージロール) | DOCTOR AIR (ドクターエア)3D MASSAGEROLL(マッサージロール) | DOCTOR AIR (ドクターエア) 

PFU Happy Hacking Keyboard Professional2 墨

  • 知る人ぞ知る高級キーボード
  • キー入力のしやすさで指・手首の負担軽減

MacBookを使うようになってから薄いキーボードのせいで指が痛むようになったため、購入しました。
静電容量無接点方式のためキーがとても軽く底打ちせずに入力できるので、指や手首への負担が格段に減りました。
また矢印キーもないほどコンパクトなので、マウスへ手を伸ばす距離が最小限になり、腕への負担も少なくなります。
知る人ぞ知る高級キーボードで購入までかなり悩みましたが、本当に買ってよかったと思える一品です。

参考サイト
Happy Hacking Keyboard | PFUHappy Hacking Keyboard | PFU 
僕がHHKB(Happy Hacking Keyboard)を愛用する理由 - give IT a try僕がHHKB(Happy Hacking Keyboard)を愛用する理由 - give IT a try 

無印良品 ネッククッション

  • 昼休みの仮眠に最適
  • 寝る姿勢に合わせて形を変えられる

昼休みに15分ほど仮眠を取っているのですが、良い枕がないか探したところこれにたどり着きました。
中身がサラサラのビーズクッションになっているため、寝る姿勢に合わせて形を変えることができます。
使う前は起きた時に首が痛かったのですが、使ってからは短時間でしっかり体を休めることが出来るようになりました。

MOLDEX 耳栓お試し8種類セット

MOLDEX 耳栓お試し8種類セット
Moldex
売り上げランキング: 4,026
  • 抜群の遮音性
  • 8種セットで自分に合うものが見つかる

集中したい時、仮眠を取るときに使用するため、いろんな耳栓を試してこれにたどり着きました。
遮音性が抜群で、人の声もきちんとカットできます。(逆に声をかけられても反応できないくらいです)
大きさや柔らかさ、遮音特性などが異なる8種がセットになっているので、自分に合うものが見つけられると思います。
個人的にはカモフラージュ柄のカモプラグがおすすめです。

参考サイト
Moldex JapanMoldex Japan 
うるせぇ、MOLDEXの耳栓比較記事ぶつけんぞ!うるせぇ、MOLDEXの耳栓比較記事ぶつけんぞ! 

すぐできる!Java100本ノックをSlackに自動投稿するBot

先日、JJUG CCC 2016 Fallに参加してきました。 その中でJava100本ノックが紹介されており、面白そうだから社内でもやってみようかという話になりました。 Slackに問題を自動投稿するBotスプレッドシートとGASで作ってみたので、よければ参考にしてみてください。

手順

1.問題番号を保存するスプレッドシート作成

Java100本ノックSlackBot_-_Google_スプレッドシート.png

2.スクリプトエディタを開く

スプレッドシートのメニューから「ツール」→「スクリプトエディタ」を選択します。

3.GASにSlackAppライブラリを導入する

スクリプトエディタのメニューから「リソース」→「ライブラリ」を選択し、以下のLibrary Keyを入力します。

SlackAppのLibrary Key → M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO

4.Slackのトークンを発行

こちらの記事を参考に、Slackのトークンを発行します。

5.コード作成

スクリプトエディタに以下のコードを貼り付けます。 TOKEN定数は上記で取得したトークンに置き換えてください。

var URL = "https://github.com/JustSystems/java-100practices/tree/master/contents/";
var TOKEN = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // 取得したトークンを貼り付け

function main() {
  // 平日のみ投稿
  var today = new Date();
  if(isJapaneseHoliday(today) || today.getDay() == 0 ||today.getDay() == 6){return;} 
  
  var qNumRange = SpreadsheetApp.getActiveSheet().getRange(1, 2);
  var qNum = qNumRange.getValue();
  postSlackMessage(qNum);
  
  // 問題インクリメント
  qNum++;
  if(qNum > 100){ qNum = 1;}
  qNumRange.setValue(qNum);
}


function postSlackMessage(qNum) {
  var slackApp = SlackApp.create(TOKEN); //SlackApp インスタンスの取得
 
  var options = {
    channelId: "#java100knock",
    userName: "Java100本ノックBot",
    message: "今日の問題はこちら!\n" + 
             URL + ('000' + qNum).slice( -3 ) // 問題番号0埋め         
  };
 
  slackApp.postMessage(options.channelId, options.message, {username: options.userName});
}

function isJapaneseHoliday(date) {
  var year = date.getFullYear();
  var month = date.getMonth();
  var day = date.getDate();
  
  var startDate = new Date();
  startDate.setFullYear(year, month-1, day);
  startDate.setHours(0, 0, 0, 0);

  var endDate = new Date();
  endDate.setFullYear(year, month-1, day);
  endDate.setHours(23, 59, 59, 999);

  var cal = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
  var holidays =  cal.getEvents(startDate, endDate);

  return holidays.length != 0;
}

この状態でmainメソッドを実行すると、Slackのjava100knockチャンネルに問題が投稿されます。

6.起動トリガーを設定

スクリプトエディタのトリガーアイコン(時計のマーク)より、トリガーを設定します。 Java100Knock.png

この設定で毎朝8~9時に問題が自動投稿されます。(ソース内で平日のみ投稿するように制御しています)

投稿された問題は以下のような感じになります。 Slack_-_Paygent.png

参考