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

『経済は「予想外のつながり」で動く』『How Google Works』を読んだ

読書

経済は「予想外のつながり」で動く

経済は「予想外のつながり」で動く

経済は「予想外のつながり」で動く

著者はハーバード・サイモンが述べた人間の限定合理性を根拠にして、従来の経済学で想定されている合理的な人をベースにした経済理論に対して懐疑的な意見を述べています。

現実の人間の行動は、周りの意見等に左右されており、従来の経済学で想定されている個々の判断は独立して行われるということを幾つかの実験を引用して批判しています。

その上で、ネットワーク理論から新しいモデルの構築を試みているようでした。

ただ、全体的にマクロとミクロの例が入り混じっており、モデルもあまりはっきりしたものが示されておらず、消化不良の感のある本でした。

How Google Works

How Google Works (ハウ・グーグル・ワークス)  ―私たちの働き方とマネジメント

How Google Works (ハウ・グーグル・ワークス) ―私たちの働き方とマネジメント

グーグル社内で行われいるマネジメントについて記された本です。「スマートクリエイティブ」と呼ばれる高度な専門知識と実行力を兼ね揃えた人材をマネジメントするにあたり、どのような点に着目しているかが網羅されています。

個人的には、人材の「採用」について重視していると感じました。それが端的にまとまっていると思うのは以下の部分です。

グーグルの「採用のおきて」

・自分より優秀で博識な人物を採用せよ。学ぶもののない、あるいは手強いと感じない人物は採用してはならない。

・プロダクトと企業文化に付加価値をもたらしそうな人物を採用せよ。両方に貢献が見込めない人物は採用してはならない。

・仕事を成し遂げる人物を採用せよ。問題について考えるだけの人物は採用してはならない。

・熱意があり、自発的で、情熱的な人物を採用せよ。仕事がほしいだけの人物は採用してはならない。

・周囲に刺激を与え、協力できる人物を採用せよ。ひとりで仕事をしたがる人物は採用してはならない。

・チームや会社とともに成長しそうな人物を採用せよ。スキルセットや興味の幅が狭い人物は採用してはならない。

・多才でユニークな興味や才能を持っている人物を採用せよ。仕事しか能がない人物は採用してはならない。

・倫理観があり、率直に意思を伝える人物を採用せよ。駆け引きをしたり、他人を操ろうとする人物を採用してはならない。

・最高の候補者を見つけた場合のみ採用せよ。一切の妥協は許されない。

「採用の質を犠牲にしてまで埋めるべきポストはない」とも書かれており、並々ならぬ力の入れ具合を感じた次第です。

mbed CLIでのコンパイルを楽にするシェルスクリプト

プログラミング mbed

はじめに

この記事はmbed Advent Calendar 2016の6日目の記事です。

mbed CLIがリリースされ、ローカル環境でのコンパイルが楽になりました。 しかし、コンパイルするときにボードを設定したり、コンパイルされたファイルが結構深い階層にあったりと、何度も手作業で繰り返すのは結構面倒です。 そこで一発でボードを自動的に判定し、mbedへのコピーまでやってくれるスクリプトを作ったので紹介します。

mbed CLI自体のインストールについては、既に日本語の記事がまとまっていますので、以下をご覧ください。

mbed CLI (コマンドライン・インタフェース)を Mac OS X で使ってみる | mbed

作ったスクリプト

#!/bin/bash

set -eu

PROGRAM_NAME=$(basename `pwd`)
MBED_DETECT=$(mbed detect | grep Detected | sed 's/,//g' | head -n 1)

if [ -z "${MBED_DETECT}" ];then
    echo "[info] No mbed boards are found."
    exit 1;
fi

TARGET=$(echo ${MBED_DETECT} | cut -d' ' -f3)
MBED_VOLUME=$(echo ${MBED_DETECT} | cut -d' ' -f7)

echo "[info] Target:"${TARGET}", Volume:"${MBED_VOLUME}

TOOL_CHAIN="GCC_ARM"

mbed compile --toolchain ${TOOL_CHAIN} --target ${TARGET}

BUILD_PATH=$(echo "BUILD/"${TARGET}"/"${TOOL_CHAIN}"/"${PROGRAM_NAME}".bin")
cp ${BUILD_PATH} ${MBED_VOLUME}/
echo "[info] Success to copy from "${BUILD_PATH}" to "${MBED_VOLUME}

適当な名前(compile.shなど)で保存し、$ bash compile.shとするか実行権限をつけて直接スクリプトを叩けば実行されます。

手元のLPC1768で試して動くことを確認しましたが、それ以外のボードでは未検証です。動かない場合は教えてください。

なおMacでしか動かないと思います(Linuxは動くかもですが)。

やっていること

mbed detectでターゲットとコピー先のボリュームを取得し、mbed compileで生成されたbinファイルをコピーしています。

mbed newmbed importするとディレクトリ名がbinファイルのファイル名となるので、それも利用しています。

複数のmbedがPCに接続されている場合はmbed detectで先頭になる1台に対してコピーが行われます。

mbed OS 5でのイベント処理(mbed events libraryの使い方)

電子工作 プログラミング mbed

はじめに

この記事はmbed Advent Calendar 2016の4日目の記事です。

mbed OS 5でイベント駆動なプログラムを書くためのライブラリ mbed-events-library の使い方を紹介します。 なお、ドキュメントに書いてあるコードは古いのか正常に動かないところがあったので、GithubのREADMEを参照して検証しました。

mbed-events-libraryが追加されたことで、従来の RtosTimer はdeprecated*1となったようです。

動かしてみる

青mbed(LPC1768)を使って実験しました。 p18 にPullUpでタクトスイッチをつけています。

1. 即実行されるイベント

EventQueueインスタンスを作成し、callメソッドを呼び出すことで即実行されるイベントを追加することができます。

dispatch メソッドを実行するとイベントループが廻り続けるため、最後に while(true) といった記述は必要ありません。

サンプルコードと実際の動作

#include "mbed.h"

DigitalOut led1(LED1);
InterruptIn sw1(p18);

// イベントキューを作成する
EventQueue queue;

// LEDのON/OFFを切り替える関数
void toggle_led() {
    led1 = !led1;
}

// タクトスイッチが押されたときに実行される関数
void pushed() {
    // 即実行されるイベント
    queue.call(&toggle_led);
}

int main() {
    // スイッチピンをPullUpにする
    sw1.mode(PullUp);

    // タクトスイッチが押されたときの割り込み処理
    sw1.fall(&pushed);

    // イベントループが廻り続ける
    queue.dispatch();
}

動作させたのが以下の動画です。スイッチを押すとLEDがON/OFFします。

f:id:mia_0032:20161203210614g:plain

2. 指定時間後に実行されるイベント

EventQueueインスタンスに対して call_in メソッドを呼び出すことで 指定ミリ秒後に実行されるイベントを作成することができます。

サンプルコードと実際の動作

先ほどのコードに queue.call_in(2000, &toggle_led); を追加し、ボタンを押してから2000ミリ秒(2秒)後に消える処理を追加しました。

#include "mbed.h"

DigitalOut led1(LED1);
InterruptIn sw1(p18);

// イベントキューを作成する
EventQueue queue;

// LEDのON/OFFを切り替える関数
void toggle_led() {
    led1 = !led1;
}

// タクトスイッチが押されたときに実行される関数
void pushed() {
    // 即実行されるイベント
    queue.call(&toggle_led);
    // 2000ms後に実行されるイベント
    queue.call_in(2000, &toggle_led);
}

int main() {
    // スイッチピンをPullUpにする
    sw1.mode(PullUp);

    // タクトスイッチが押されたときの割り込み処理
    sw1.fall(&pushed);

    // イベントループが廻り続ける
    queue.dispatch();
}

動作させたのが以下のようになります。スイッチを押すとLEDがONし、2秒後にOFFになります。

f:id:mia_0032:20161203210632g:plain

なお、ON/OFFするイベントをひたすらキューに積んでいる形になるため、連打するとON/OFFの順番は崩れます・・・

3. 指定時間ごとに定期実行されるイベント

EventQueueインスタンスに対して call_every メソッドを呼び出すことで 指定ミリ秒ごとに実行されるイベントを作成することができます。

サンプルコードと実際の動作

先ほどのコードからスイッチの処理を取り除き、call_every で1秒ごとに実行されるイベントを追加したものになります。

#include "mbed.h"

DigitalOut led1(LED1);

// イベントキューを作成する
EventQueue queue;

// LEDのON/OFFを切り替える関数
void toggle_led() {
    led1 = !led1;
}

int main() {
    // 1000msごとに定期実行するイベント
    queue.call_every(1000, &toggle_led);

    // イベントループが廻り続ける
    queue.dispatch();
}

動作させると以下のように、1秒ごとにLEDのON/OFFを繰り返します。

f:id:mia_0032:20161203210643g:plain

おわりに

今回のコードは以下のリポジトリに公開しています。 mbed import してお使いください。

github.com

以前、mbed OSのTechnical Preview版のときはMINARと呼ばれるイベントスケジューラーがあり、それを検証したことがありました。

そのときは結構な行数のコードが必要だったのですが、mbed-events-library は非常に簡潔なで直感的なコードで同様のことが実現できるようになったようです。

どんどん進化していますね。