05 Feb 2015, 12:59

統計解析の基礎を学ぶ! edX の Foundations of Data Analysis をうけた

はじめに

統計の基礎を勉強するために, edX の Foundations of Data Analysis を受けました.

内容

タイトルどおり, 統計学の基礎を 11 週に渡って学ぶ講座. 大学初年度の学生が 1 年かけて学ぶ内容をざっと網羅している.

前半は, 記述統計学・後半は推定統計学, とくに仮説検定.

以下, 用語を思い出しながら主要なキーワードを列挙.

  • 記述統計学
    • 統計モデル
      • 線形モデル
      • 指数モデル
      • 対数モデル
    • 確率分布
      • 二項分布
      • 正規分布
    • 相関
  • 推定統計学

    • サンプリング
    • 区間推定・点推定
    • 仮説検定
      • Z 検定
      • T 検定
      • F 検定
      • カイ二乗検定
      • 分散分析

    言語は R を利用する. R を利用した統計解析の方法が一通り分かるところがよい.

    この講座のかわっているところは, Reading が多いこと. テキストが PDF で毎週ダウンロードできる. その内容を読んでから, R の使い方を学んで, 問題をとくスタイル.

    また, この講座のよかった点は, 課題が現実のデータを利用しているところ. 実験の分析などの, 現実とはかけ離れた内容ではなく, 親しみやすいデー タなので, 興味が沸きやすい.

    あくまで, 基礎的な内容なのでそこまで難しくはない. 1 難しい数式もでてこない. なので, 数学があまり得意でない文系のひとでもついていけると思う.

感想

大学の統計学の授業はつまらなかった

大学生のときに統計の授業を受けたのだが, それよりも圧倒的にわかりやすかった!! 無料でわかりやすい授業がうけら れると, 大学の授業はどうなってしまうのだろう?? That’s MOOC 革命.

大学のときの統計がつまらなかった理由は,

  • データを扱わなかった
  • 数式ばかりをあつかっていた
  • プログラミングで計算しなかった

こんなところで大学の授業の愚痴をいってもしょうがないのだが, 統計学なはずなのに, 実際にデータを分析するようなことは一切なかったし, グラフを書くようなことも一切なかった. 朝一に授業がはじまって, 難しい 数式をノートにひたすら写していた記憶しかない.2

この講座は, 大学生のときにつまらないと思っていた要因の反対のことをし ている. だから, おもしろい.

あくまで基礎

そんなわけで, 大学生以来, xx 年ぶりに統計を学び直した.

  • 覚えていたこと
  • 忘れていたこと
  • 習っていないこと

がそれぞれ出てきて, 毎週おもしろかった. 仮説検定はほとんど大学では学ばなかった 3 ので, 考え方が新鮮だった.

ただ, これは基礎だ. 以下のページに統計学の大まかな図があったのだが, 基礎の先には広大な統計学の応用領域が広がっている.

これから

この先は, 統計学のおもしろそうな領域にすこしずつ手をつけていこう.

統計学が, 今後の人生にどう関係してくるのかはわからない. 勉強の先に宝が埋まっているかもしれないし, 徒労に終わってまた忘れてしまうかもしれない.

でも, 統計学がここ数年で急激に注目されていることは紛れもない事実だ.

必ず役に立つ, いや, 必ず役に立たせると信じることにする.

Footnotes


  1. 英語が難しいのだが… [return]
  2. そして, 朝起きることができなくて次第におサボリ. [return]
  3. 学んだけれども忘れたのかも [return]

29 Dec 2014, 15:57

Haskell で 関数型言語入門! edX の Introduction to Functinal Programming を受けた.

はじめに

edX で Introduction to Functinal Programming を受けた感想です. Introduction to Functional Programming | edX

今年の 2 月ごろに Ruby のブロックというものを知った. これは, いわゆる無名関数なのだが, その概念がとても新鮮だった.

それは, 関数型言語でよく利用されるということを知ったので, もっと関数型言語に触れようというのが今年の目標だった.

今年も終わりに近づく 11 月, edX で純関数型言語の Haskell の講座が開講された.

関数型言語を身につける絶好の機会だと思った.

内容

講座の内容は, 以下の本をはじめから終わりまで解説していくもの.

毎週の課題も 各章の練習問題そのものだった.

講座のスライドは github で公開されている.

感想

難しかった..でも, 学ぶことが多かった

難しかった. 1 日ずっと Haskell 漬けになったりした.

内容はさらっと解説されるのだが, 関数型言語という世界が, 今までいた世界とは異なる考え方を もっているので, 概念を理解するのに時間がかかる.

しかし, 知らない概念は刺激にもなって, おもしろい

  • モナド
  • 代数データ型
  • 遅延評価…

関数プログラミング実践入門

副読本として, 最近出版された以下の本を購入した.

この本はとても分かりやすいのておすすめ.

ボイントは, Haskell の文法に限定していないところ.

題名どおり, 関数型言語とはなにかということについてかかれている. その手段として, Haskell が解説されている.

C や Java と Haskell の比較がかかれているところがよい.

手続き型言語の世界にいるプログラマを関数型言語の世界へ 引っ張ってきたいという, 著者の意図を感じる.

数学とプログラミングの結びつきが見えた気がした

関数型言語における関数や型の概念から, プログラミングのベースには, 数学があることを強く感じた.

以下のような記事を書いている.

数学との関係性.

関数型言語のベースには数学がある.

  • 群論
  • 圏論

代数はプログラミング/ モデリングの数学的な基礎理論. 型とは代数学がベースになっている.

これからどうするか?

講座の終わりで, なんと次回予告の動画が流れた?!

Haskell の次は, 圏論 (Category Theory) の講座を予定しているらしい.

大学のとき群環体で心折れた自分としては, 代数学にやや引け目を感じるもの, 数学とプログラミングのつながりをもっ と知るためにこれも受けてみたい.

そのためには, Haskell の学習をここで終わらせることなく, 継続させたい.

AtCoder に挑戦

なにか, 計画をたてとかないと, 自分は勉強しないだろう.

継続的に学習する仕組みとして, 競技プログラミングの問題をといてみる. atcoder と, codeforces が Haskell に対応しているようだ.

Codeforces は, 海外なので深夜に開催されるが, Atcoder は日本時間に合わせて開催されているので, AtCoder をやろうと思う.AtCoder の問題を月 1 回, Haskell でとくぞ.

10 Nov 2014, 13:12

LinuxFoundation が MOOC に進出! edX で Introduction to Linux を受ける.

はじめに

会社で LPIC の資格をとれという, パワーハラスメントにあっている. ストレスで嫌だったらありゃしない.

なので, しぶしぶと Linux の勉強をするために, MOOC の Linux 講座を受講してみた.

Linux 生みの親登場

この edX の講座は, LinuxFoundation が主催. LinuxFoundation というのは Linux 普及のための教育期間. University 以外の機関が MOOC への参加を発表したことは, 少し話題になった.

すごいと思ったのは, このイントロ動画.

Linux 生みの親, リーナス・トーバルズ直々の宣伝活動だ.

  <div id="outline-container-unnumbered-3" class="outline-2">
    <h2 id="unnumbered-3">
      結構期待はずれだった&#x2026;
    </h2>

    <div class="outline-text-2" id="text-unnumbered-3">
      <p>
        結論から書くと, 期待はずれ.
      </p>

      <p>
        なぜかというと, 知っていることばかりだったから.
      </p>

      <p>
        Linux に触れたことがまったくない人のための, 本当の初心者をターゲットにしているように思う.
      </p>

      <p>
        なので自分のような, 仕事で Linux をつかったり, 自宅のノート PC に ArchLinux を入れて遊んでいるような人にとっては, 常識的なことばかりが書いてあるので, まったくつまらない.
      </p>

      <p>
        自分にとっては, この講座は意味がなかったな&#x2026;
      </p>

      <p>
        いやいや, そういう屁理屈は, LPIC L1 の試験に合格してから言わねば&#x2026;
      </p>
    </div>
  </div>

  <div id="outline-container-unnumbered-4" class="outline-2">
    <h2 id="unnumbered-4">
      LPIC L1 の試験対策になるかな. .ならない
    </h2>

    <div class="outline-text-2" id="text-unnumbered-4">
      <p>
        edX で勉強しても, それが対策にはならないというのが感想.
      </p>

      <p>
        LPIC という試験は, 問題を暗記すると受かる試験なので. LPIC の勉強は, 問題集や ping-t をとくのがよい.
      </p>

      <p>
        ただし, Linux に触れたことがないひとには, この edX の講座はいいかもしれない. 毎週, Lab という項目で, 実際に手を動かして Linux にふれる課題が出される.
      </p>

      <p>
        暗記すれば, 試験には受かるが, 知識としてはすぐにわすれてしまう. 手を動かすと, 知識は体に残る.
      </p>
    </div>
  </div>

  <div id="outline-container-unnumbered-5" class="outline-2">
    <h2 id="unnumbered-5">
      LPIC L1 と Introduction to Linux の対応
    </h2>

    <div class="outline-text-2" id="text-unnumbered-5">
      <p>
        最後に, LPIC L1 の出題範囲と, 今回の edX の講座の対応をかいておく.
      </p>
    </div>

    <div id="outline-container-unnumbered-6" class="outline-3">
      <h3 id="unnumbered-6">
        101 試験
      </h3>

      <div class="outline-text-3" id="text-unnumbered-6">
        [sourcecode language=&#8221;language&#8221; title=&#8221;&#8221;]<br /> * 主題 101:システムアーキテクチャ<br /> 101.1 ハードウェア設定の決定と構成<br /> 101.2 システムのブート<br /> 101.3 ランレベルの変更とシステムのシャットダウンまたはリブート</p> 

        <p>
          Chapter 01: The Linux Foundation<br /> Chapter 02: Linux Philosophy and Concepts
        </p>

        <p>
          主題 102:Linux のインストールとパッケージ管理
        </p>

        <p>
          102.1 ハードディスクのレイアウト設計<br /> 102.2 ブートマネージャのインストール<br /> 102.3 共有ライブラリを管理する<br /> 102.4 Debian パッケージ管理を使用する<br /> 102.5 RPM および YUM パッケージ管理を使用する
        </p>

        <p>
          Chapter 03: Linux Structure and Installation<br /> Chapter 07: Finding Linux Documentation
        </p>

        <p>
          * 主題 103:GNU と Unix のコマンド
        </p>

        <p>
          103.1 コマンドラインで操作する<br /> 103.2 フィルタを使ってテキストストリームを処理する<br /> 103.3 基本的なファイル管理を行う<br /> 103.4 ストリーム, パイプ, リダイレクトを使う<br /> 103.5 プロセスを生成, 監視, 終了する<br /> 103.6 プロセスの実行優先度を変更する<br /> 103.7 正規表現を使用してテキストファイルを検索する<br /> 103.8 vi を使って基本的なファイル編集を行う
        </p>

        <p>
          Chapter 06: Command Line Operations<br /> Chapter 10: Text Editors<br /> Chapter 13: Manipulating Text<br /> Chapter 17: Processes
        </p>

        <p>
          * 主題 104:デバイス, Linux ファイルシステム, ファイルシステム階層標準
        </p>

        <p>
          104.1 パーティションとファイルシステムの作成<br /> 104.2 ファイルシステムの整合性を保持する<br /> 104.3 ファイルシステムのマウントとアンマウントをコントロールする<br /> 104.4 ディスククォータを管理する<br /> 104.5 ファイルのパーミッションと所有者を管理する<br /> 104.6 ハードリンクとシンボリックリンクを作成・変更する<br /> 104.7 システムファイルを見つける, 適切な位置にファイルを配置する
        </p>

        <p>
          Chapter 08: File Operations<br /> [/sourcecode]
        </p>
      </div>
    </div>

    <div id="outline-container-unnumbered-7" class="outline-3">
      <h3 id="unnumbered-7">
        102 試験
      </h3>

      <div class="outline-text-3" id="text-unnumbered-7">
        [sourcecode language=&#8221;language&#8221; title=&#8221;&#8221;]<br /> * 主題 105:シェル, スクリプト, およびデータ管理</p> 

        <p>
          105.1 シェル環境のカスタマイズと使用<br /> 105.2 簡単なスクリプトをカスタマイズまたは作成する<br /> 105.3 SQL データ管理
        </p>

        <p>
          Chapter 15 : Bash Shell Scripting<br /> Chapter 16: Advanced Bash Scripting
        </p>

        <p>
          * 主題 106:ユーザインターフェイスとデスクトップ
        </p>

        <p>
          106.1 X11 のインストールと設定<br /> 106.2 ディスプレイマネージャの設定<br /> 106.3 アクセシビリティ
        </p>

        <p>
          Chapter 04: Graphical Interface<br /> Chapter 18: Common Applications
        </p>

        <p>
          * 主題 107:管理業務
        </p>

        <p>
          107.1 ユーザアカウント, グループアカウント, および関連するシステムファイルを管理する<br /> 107.2 ジョブスケジューリングによるシステム管理業務の自動化<br /> 107.3 ローカライゼーションと国際化
        </p>

        <p>
          Chapter 05: System Configuration from the Graphical Interface<br /> Chapter 09: User Environment
        </p>

        <p>
          * 主題 108:重要なシステムサービス
        </p>

        <p>
          108.1 システム時刻を維持する<br /> 108.2 システムのログ<br /> 108.3 メール転送エージェント (MTA) の基本<br /> 108.4 プリンターと印刷を管理する
        </p>

        <p>
          Chapter 14: Printing
        </p>

        <p>
          * 主題 109:ネットワークの基礎
        </p>

        <p>
          109.1 インターネットプロトコルの基礎<br /> 109.2 基本的なネットワーク構成<br /> 109.3 基本的なネットワークの問題解決<br /> 109.4 クライアント側の DNS 設定
        </p>

        <p>
          Chapter 12: Network Operations
        </p>

        <p>
          * 主題 110:セキュリティ
        </p>

        <p>
          110.1 セキュリティ管理業務を実施する<br /> 110.2 ホストのセキュリティ設定<br /> 110.3 暗号化によるデータの保護
        </p>

        <p>
          Chapter11: Local Security Principles<br /> [/sourcecode]
        </p>
      </div>
    </div>
  </div>

20 Aug 2014, 14:25

感動駆動学習こそ最強の学習法だ! MOOC をはじめて 1 年たったまとめ.

20140821_study.jpg
photo credit: betta design via photopin cc

はじめに

MOOC をはじめてから だいたい 1 年くらいたったので, ここでまとめをしてみる.

受けた講座

かなりいろいろと平行して取り組んでいたので, どれも中途半端だったり, 途中で挫折したりした. そういうのもひっくるめて, 今まで受けたものを時系列にまとめてみる.

coursera: Algorithms Part 1

はじめて受けた講座.すべてが新鮮だった. 英語が聞き取れなかったり. そして, この講義と続編の Part2 が今まで受けたなかで, もっとも難しかった.

coursera: C++ For C Programmers

C 言語しか知らない自分にとっては理想的な内容.これで C++ を身につけたつもり. そして, ここでの知識は仕事にも直結した.

coursera: Algorithms Part 2

Algorithms Part1 の続編.最難関だった.

しかし, この講義をすべて終えたときの達成感はものすごかった. プログラミングの基礎のアルゴリズムをついに学びおえたのだなあと…感動.

coursera: Creative, Serious and Playful Science of Android Apps

ノンプログラマ用の内容だったので, 結構楽勝. Android タブレットを購入した. くだらないアプリも作成したが, こういうものづくりの感動も大事.

edX: Embedded Systems - Shape the World

エセ組み込みエンジニアの自分としては, 工学部で習うような知識をどこかで学びたいとずっと思っていた. そして MOOC で学べた. 念願が叶った! 感動.

この講義は途中で挫折してしまったけど, それでもとても有益だった. L チカ!

coursera: Programming Mobile Applications for Android Handheld Systems

前に受けた Android の講義は, 純粋にアプリ作成の楽しさを伝えるものだったが, この講義はガチで Android Architecture を解説していく. これはあまりおもしろくなかったな.

そしてこの講義は, Android 3 部作のスタートの講義. 3 つの講座が連携することで, Android 開発のすべてを徹底的に学べるとか.

coursera: Web Application Architectures

仕事で Ruby をつかいはじめたので, rails をいじってみたいがために受けた. Web アーキテクチャは自分とは畑違いなので, 知らないことが多いことに気づかされた.

edX: Paradigms of Computer Programming

もっとも, 感動した講義.プログラミングのパラダイムを学べる. これはすごい. こういう体験を待っていたのだ!

edX: Unlocking the Immunity to Change: A New Approach to Personal Improvement

唯一, CS 以外の講義.心理学だ.

この講義で使われている理論と, それがかかれた自己啓発本はもっとはやるべき. 自己啓発本のなかでは, かなり独創的に感じる.

coursera: Functional Programming Principles in Scala

Scala 作者じきじきの講義. すげえ. そして, 関数型言語をずっと学びたいと思っていた欲求を満たす講義.

Scala はまだこの講義を終えても身についたとは言えないが, これからもま なんでいきたいというモチベーションと, 関数型言語を学びたいというモ チベーションには火がついた.

coursera: Pattern-Oriented Software Architectures: Programming Mobile Services for Android Handheld Systems

Android 3 部作の 2 つ目. POSA2 の著者が登場.

ずっと, デザインパターンを学びたいなと思っていたのだが, POSA とともに, gof のデザインパターンもかなりでてきた.

POSA は日本ではあまりメジャーではないが, これももっとはやるべき.と いうか, POSA2 以降が訳されてほしいな.

coursera: Software Defined Networking

話題の Software Defined ちょめちょめを学ぶために受けた. ネットワークは専門外なので, よく分からなかった.

その他: 現在受講中

edX: Introduction to Linux

Linux Foundation が MOOC に進出して講座を開いたというもの. Introduction の動画が, Linus Torvalds 氏じきじきのお話なところがすごい. LPIC L1 対策に受けてる.

coursera: Programming Cloud Services for Android Handheld Systems

coursera: The Hardware/Software Interface

アセンブリ言語と C 言語を学ぶことで, 低レベルな高レベルのプログラ ミングを学ぶ. これはとてもおもしろい! そのうち感想を.

おもしろかった講義ベスト 3

  1. Paradigms of Computer Programming: おもしろいというよりも, 感動体験の連続.
  2. Algorithms: 1 番難しく, 1 番苦労した.しかし, Assignment がどれもおもしろかった.
  3. Pattern-Oriented Software Architectures: パターンにはある種の憧れがあり, それを学ぶことができた.

つかった言語

いろいろつかった.

  • Java
  • C++
  • Ruby
  • Oz
  • C
  • Assembly
  • Scala

そして, あたって砕ければとりあえずどんな言語もできる気がしてきた. それまでは, まともに使える言語が C しかなかった. この恐怖心と苦手意識 をを打ち破れた心の変化は大きい.

そして, どんな言語にも対応できる Emacs の偉大さを知った.

自分はどのようなときに感動を感じるか?

感動があれば, どんなに疲れて泣きたいときでも前に進める. モチベーションが湧き上がる.

どういうポイントで自分が感動するか, ピックアップしてみた.

作者直伝の講義に感動

Scala や POSA, Immunity to Change, Paradigms of Computer Programming の講義のように, その分野の権威が直々に登場することに感動する.

そういう人たちの講義は情熱的であり, 説得力があり, 震える瞬間がよくある.

こういう講義こそ, MOOC を利用して学習するメリットだと思う.

長年学びたいと思っていた講義に感動

C++ や Embedded Systems, POSA など, いつか学びたいと思っていたことを学ぶと感動する.

欲求不満が解消されることろに感動のポイントがあるのだと思う.

これは, MOOC に限ったことではないけど.

知識と知識がつながりあい, 新しい世界がみえる瞬間に感動

POSA や Scala,Paradigms of Computer Programming など, 新しい考えをしり, より深くプログラミングの世界が見えるようになると 感動する.

学生時代にかじったことを学ぶと感動する

自分は一応? 情報系の学部を卒業している. なので, それと関連する内容を学ぶと, 感動した. グラフ理論だったり,情報理論だったり.

自分はたいへん lazy な学生でほとんど勉強しないで後悔しているので, その罪悪感が軽減されたという, 負の感動もあるのだろう.

感動駆動学習こそ最強の学習法

MOOC の講義を次々と受けた理由は, *感動に駆動される*から.

感動しつつ, 学習し, 成長する

これが最高の学習スタイルではないだろうか?

書籍でも学習できる.しかし, MOOC を利用すれば, 最先端の技術や最高クラスの講義がいつでも, どこでも, だれでも, 無料で手に入る. 21 世紀の教育革命バンザイ! MOOC に幸あれ!

MOOC の講義も有限だし, そもそも自分の時間が有限. そして, 社会人をしながら MOOC をバリバリやるのは, かなりつらいときもある. この学習スタイルがいつまで続くかはわからない.

しかし, もう 1 年やってみようとおもう.具体的には, 機械学習と統計学を学びたい. そういうモチベーションと, それが叶ったとき, そしてそれを学ぶことによって見える新たな世界に, 来年もぼくは感動するだろう.

21 Jun 2014, 06:13

[Edx] ライフハックでは人間は変われない!Unlocking the Immunity to Changeで早寝早起きに挑戦した

Edxで Unlocking the Immunity to Changeという講座を受講した記録です。

[//www.youtube.com/embed/lPiWUjbtQvk]

[toc]

感想について

課題を通じて自己変革

<div class="outline-text-3" id="text-1-1">
  <p>
    この講座は、目標達成のための理論が紹介される。
  </p>

  <p>
    受講者は、はじめに自分の達成したい目標を決める。 そして、毎週課題に取り組むことで自分自身の変革を目指す。
  </p>

  <p>
    毎週課題に取り組むというスタイルがよかった。 自己啓発本を読んではその都度挫折してきたこんな自分でも、 継続して自己変革に取り込むことができた。
  </p>

  <p>
    成果も着実にでているので、この講座は大変に満足している。
  </p>
</div>

もっと評価されるべき Immunity to Change

<div class="outline-text-3" id="text-1-2">
  <p>
    いわゆる自己啓発のひとつ。以下の本の内容が講義になっている。
  </p>

  <div class='amazlink-box' style='text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;'>
    <div class='amazlink-list' style='clear: both;'>
      <div class='amazlink-image' style='float:left;margin:0px 12px 1px 0px;'>
        <a href='http://www.amazon.co.jp/%E3%81%AA%E3%81%9C%E4%BA%BA%E3%81%A8%E7%B5%84%E7%B9%94%E3%81%AF%E5%A4%89%E3%82%8F%E3%82%8C%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B%E2%80%95%E2%80%95%E3%83%8F%E3%83%BC%E3%83%90%E3%83%BC%E3%83%89%E6%B5%81-%E8%87%AA%E5%B7%B1%E5%A4%89%E9%9D%A9%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%B7%B5-%E3%83%AD%E3%83%90%E3%83%BC%E3%83%88%E3%83%BB%E3%82%AD%E3%83%BC%E3%82%AC%E3%83%B3/dp/4862761542%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4862761542' target='_blank' rel='nofollow'><img src='http://ecx.images-amazon.com/images/I/41H8nvJbCML._SL160_.jpg' style='border: none;' /></a>
      </div>

      <div class='amazlink-info' style='height:160; margin-bottom: 10px'>
        <div class='amazlink-name' style='margin-bottom:10px;line-height:120%'>
          <a href='http://www.amazon.co.jp/%E3%81%AA%E3%81%9C%E4%BA%BA%E3%81%A8%E7%B5%84%E7%B9%94%E3%81%AF%E5%A4%89%E3%82%8F%E3%82%8C%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B%E2%80%95%E2%80%95%E3%83%8F%E3%83%BC%E3%83%90%E3%83%BC%E3%83%89%E6%B5%81-%E8%87%AA%E5%B7%B1%E5%A4%89%E9%9D%A9%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%B7%B5-%E3%83%AD%E3%83%90%E3%83%BC%E3%83%88%E3%83%BB%E3%82%AD%E3%83%BC%E3%82%AC%E3%83%B3/dp/4862761542%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4862761542' rel='nofollow' target='_blank'>なぜ人と組織は変われないのか――ハーバード流 自己変革の理論と実践</a>
        </div>

        <div class='amazlink-powered' style='font-size:80%;margin-top:5px;line-height:120%'>
          posted with <a href='http://amazlink.keizoku.com/' title='アマゾンアフィリエイトリンク作成ツール' target='_blank'>amazlink</a> at 14.06.21
        </div>

        <div class='amazlink-detail'>
          ロバート・キーガン
        </div>

        <div class='amazlink-sub-info' style='float: left;'>
          <div class='amazlink-link' style='margin-top: 5px'>
            <img src='http://amazlink.fuyu.gs/icon_amazon.png' width='18' /><a href='http://www.amazon.co.jp/%E3%81%AA%E3%81%9C%E4%BA%BA%E3%81%A8%E7%B5%84%E7%B9%94%E3%81%AF%E5%A4%89%E3%82%8F%E3%82%8C%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B%E2%80%95%E2%80%95%E3%83%8F%E3%83%BC%E3%83%90%E3%83%BC%E3%83%89%E6%B5%81-%E8%87%AA%E5%B7%B1%E5%A4%89%E9%9D%A9%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%B7%B5-%E3%83%AD%E3%83%90%E3%83%BC%E3%83%88%E3%83%BB%E3%82%AD%E3%83%BC%E3%82%AC%E3%83%B3/dp/4862761542%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4862761542' rel='nofollow' target='_blank'>Amazon</a> <img src='http://amazlink.fuyu.gs/icon_rakuten.gif' width='18' /><a href='http://hb.afl.rakuten.co.jp/hgc/g00q0724.n763w947.g00q0724.n763x2b4/archives/c=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F12523496%2F&#038;m=http%3A%2F%2Fm.rakuten.co.jp%2Frms%2Fmsv%2FItem%3Fn%3D12523496%26surl%3Dbook' rel='nofollow' target='_blank'>楽天</a>
          </div>
        </div>
      </div>
    </div>
  </div>

  <p>
    書店にいくと自己啓発本はたくさん売っている。 そんな数ある本のなかでもこの本で紹介されている手法は、 際立って理路整然としてまた独創的な印象を受けた。
  </p>

  <p>
    課題は本に載っている内容とほぼ同じ。 ちなみに、課題にはすべて日本語で取り組んだ。
  </p>

  <p>
    この本はもっと評価されるべき!以下、講義の内容についてのメモ。
  </p>
</div>

Immunity to Changeの理論について

この本は、キーガン先生とレイヒー先生の、 25年に渡る研究者人生のすべてを費やして書かれた本。 こういうことを書かれると、それだけで理論に凄みが増す。

以下の大前提をもとに、この本はかかれている。

~ 大人になっても人間は成長できる ~

死ぬのをわかっていても変われない

<div class="outline-text-3" id="text-2-1">
  <p>
    はじめの書き出しがとても印象的だ。
  </p>

  <blockquote>
    <p>
      最近の研究によると、食生活を改めたり、もっと運動したり、<br /> 喫煙をやめたりしなければ心臓病で死にますよと専門医から警告されたときに、<br /> 実際に自分をそのように変えることができる人は七人に一人にすぎないという。
    </p>

    <p>
      たった七人に一人だ!
    </p>

    <p>
      人は、自分の命に関わる問題でさえ、自分自身が心から望んでいる変革を実行できない。
    </p>

    <p>
      自分が本心からやりたいと望んでいることと<br /> 実際に実行できることの間には大きな溝がある。
    </p>
  </blockquote>
</div>

技術的課題と適応的課題

<div class="outline-text-3" id="text-2-2">
  <p>
    課題には2種類ある。適応的課題に技術的なアプローチをしても失敗する。
  </p>

  <p>
    たとえば、ダイエットの達成のために高いマシンや情報教材を購入して 一時的に目標を達成しても、時間がたつとリバウンドする。
  </p>

  <p>
    これは、心が変わらないから。恒常性を維持する自然な免疫力で適応を阻まれたから。
  </p>
</div>

免疫マップ

<div class="outline-text-3" id="text-2-3">
  <p>
    人が変われない原因は、心の免疫システムにある。
  </p>

  <p>
    その免疫システムを4つのステップで解明していき、 各ステップの関わりを見える化したものが、免疫マップ。
  </p>
</div>

<div id="outline-container-sec-2-3-1" class="outline-4">
  <h4 id="sec-2-3-1">
    1.改善目標
  </h4>

  <div class="outline-text-4" id="text-2-3-1">
    <p>
      改善したい目標。一般的な意味と違いはない。 しかし、この1から展開される2から4が独創的なのだ。
    </p>
  </div>
</div>

<div id="outline-container-sec-2-3-2" class="outline-4">
  <h4 id="sec-2-3-2">
    2.阻害行動
  </h4>

  <div class="outline-text-4" id="text-2-3-2">
    <p>
      1の目標を達成しようとしたときに、それを妨げる自分の行動をリストアップする。 心の免疫システムによって、変化しようとしたときに生じる行動を明文化する。
    </p>
  </div>
</div>

<div id="outline-container-sec-2-3-3" class="outline-4">
  <h4 id="sec-2-3-3">
    3.裏の目標
  </h4>

  <div class="outline-text-4" id="text-2-3-3">
    <p>
      2の阻害行動をやめようとしたときに、生じる感情を不安ボックスに記入する。 ここで記入するものは、感情につよく関連しているものである必要がある。
    </p>

    <p>
      くそっ!ちくしょう!Shit!, Fuck! 汚い言葉であれば汚いほど推奨される。
    </p>

    <p>
      そして、その不安ボックスの中から1の改善目標に対立する考えをあぶり出す! 変革に重要なことは、この考えを取り除くこと。これこそが裏の目標。
    </p>
  </div>
</div>

<div id="outline-container-sec-2-3-4" class="outline-4">
  <h4 id="sec-2-3-4">
    4.強力な固定概念
  </h4>

  <div class="outline-text-4" id="text-2-3-4">
    <p>
      強力な固定概念とは、3の裏の目標をもつような人が抱いている思い込み。
    </p>

    <p>
      変革阻害システムの根底にある思い込みを言語化することで、表舞台に引きずり出す。 そのことによって、免疫観念を克服しやすくなる。
    </p>
  </div>
</div>

継続的発展(Continuum of Progress)

<div class="outline-text-3" id="text-2-4">
  <p>
    3つの視点から、 目標の達成と強力な固定観念の除去が達成されたときの状態を分析する。
  </p>

  <ul class="org-ul">
    <li>
      Behaviors(振る舞い)
    </li>
    <li>
      Thoughts(理性的な思考)
    </li>
    <li>
      Feeling(感情、心情)
    </li>
  </ul>

  <p>
    3つタイムスパンから、 目標の達成と強力な固定観念の除去が達成されたときの状態を分析する。
  </p>

  <ul class="org-ul">
    <li>
      initial steps forward
    </li>
    <li>
      Significant Progress
    </li>
    <li>
      Full success
    </li>
  </ul>
</div>

SMART

<div class="outline-text-3" id="text-2-5">
  <p>
    よい実験の条件。
  </p>
</div>

<div id="outline-container-sec-2-5-1" class="outline-4">
  <h4 id="sec-2-5-1">
    SAFE
  </h4>

  <div class="outline-text-4" id="text-2-5-1">
    <p>
      Safe means that if the worst-case outcome were to occur, you could live with it!
    </p>
  </div>
</div>

<div id="outline-container-sec-2-5-2" class="outline-4">
  <h4 id="sec-2-5-2">
    MODEST
  </h4>

  <div class="outline-text-4" id="text-2-5-2">
    <p>
      Modest means that the test is relatively easy to carry out (ideally, it doesn&#8217;t require you to go out of your way at all, but rather is an opportunity to do something different in your normal day). It can also mean you make a small change in what you do.
    </p>
  </div>
</div>

<div id="outline-container-sec-2-5-3" class="outline-4">
  <h4 id="sec-2-5-3">
    ACTIONABLE
  </h4>

  <div class="outline-text-4" id="text-2-5-3">
    <p>
      a good test will be actionable in the near-term. This means that you are able to carry it out within the next week or so. You can easily imagine a setting or upcoming situation in which to run your test.
    </p>
  </div>
</div>

<div id="outline-container-sec-2-5-4" class="outline-4">
  <h4 id="sec-2-5-4">
    RESERCH
  </h4>

  <div class="outline-text-4" id="text-2-5-4">
    <p>
      &#8220;how accurate is my Big Assumption?&#8221; and, like any good research, it requires collecting data (including data that would qualify your assumption or call it into doubt). In addition to how people react to you, your feelings can be a very rich data source.
    </p>
  </div>
</div>

<div id="outline-container-sec-2-5-5" class="outline-4">
  <h4 id="sec-2-5-5">
    TEST
  </h4>

  <div class="outline-text-4" id="text-2-5-5">
    <p>
      The test, in fact, tests your Big Assumption. A &#8220;test&#8221; should not be some clever way to prove that your Big Assumption is true! Your test should be designed so that it can generate disconfirming data (data that proves that your Big Assumption is not always true),if it exists.
    </p>
  </div>
</div>

Running Your First Test

<div class="outline-text-3" id="text-2-6">
  <ul class="org-ul">
    <li>
      強力な固定観念からスタートする。
    </li>
  </ul>

  <p>
    What experiment would give you information about how accurate it is (or isn&#8217;t)?
  </p>

  <ul class="org-ul">
    <li>
      振る舞いからスタートする。
    </li>
  </ul>

  <p>
    What behavior could you change that would get you useful information about your Big Assumption?
  </p>
</div>

<div id="outline-container-sec-2-6-1" class="outline-4">
  <h4 id="sec-2-6-1">
    どのようなデータを集めるか
  </h4>

  <div class="outline-text-4" id="text-2-6-1">
    <p>
      ビデオテープに収めることができるデータまたは、 自分の心情の経験的データをあつめる。
    </p>

    <p>
      自分の行動に依存しないような、行間を読むような、 たとえば他人の心情を推し量るようなデータはダメ。
    </p>

    <ul class="org-ul">
      <li>
        Directly observable data
      </li>
    </ul>

    <p>
      the actual things people say or do, the words or action that would be captured on videotape if the event were recorded. This includes what you do and say, as well as what any other people in the test situation do and say.
    </p>

    <ul class="org-ul">
      <li>
        Experiential data on your own inner states
      </li>
    </ul>

    <p>
      how you feel or make sense of what happens during your test. Depending on your Big Assumption and your test design, this type of data may be the only type you can collect.
    </p>
  </div>
</div>

DICE

<div class="outline-text-3" id="text-2-7">
</div>

<div id="outline-container-sec-2-7-1" class="outline-4">
  <h4 id="sec-2-7-1">
    Did, do data
  </h4>

  <div class="outline-text-4" id="text-2-7-1">
    <p>
      What you actually did and the data you collected
    </p>
  </div>
</div>

<div id="outline-container-sec-2-7-2" class="outline-4">
  <h4 id="sec-2-7-2">
    Interpretation
  </h4>

  <div class="outline-text-4" id="text-2-7-2">
    <p>
      How you interpret that data (or the multiple interpretations you make)
    </p>
  </div>
</div>

<div id="outline-container-sec-2-7-3" class="outline-4">
  <h4 id="sec-2-7-3">
    Connection to Big Assumption
  </h4>

  <div class="outline-text-4" id="text-2-7-3">
    <p>
      What the data tells you about your BA
    </p>
  </div>
</div>

<div id="outline-container-sec-2-7-4" class="outline-4">
  <h4 id="sec-2-7-4">
    Encore
  </h4>

  <div class="outline-text-4" id="text-2-7-4">
    <p>
      What the data tells you about your BA What text can you run next
    </p>
  </div>
</div>

継続的発展(Continuum of Progress)

<div class="outline-text-3" id="text-2-8">
  <p>
    3つの視点から、目標の達成と強力な固定観念の除去が達成されたときの状態を分析する。
  </p>

  <ul class="org-ul">
    <li>
      Behaviors(振る舞い)
    </li>
    <li>
      Thoughts(理性的な思考)
    </li>
    <li>
      Feeling(感情、心情)
    </li>
  </ul>
</div>

Hooks and Releases

<div class="outline-text-3" id="text-2-9">
  <p>
    変化には4段階ある。
  </p>

  <p>
    Hooks(落とし穴)とRelease(脱出ルート)を意識することが必要。
  </p>

  <ul class="org-ul">
    <li>
      どのような状況でBAは正しいか
    </li>
    <li>
      どのような状況でBAは猛威をふるうか
    </li>
    <li>
      BAに支配されそうになったときに、 その状態から抜け出すための手軽な方法やセルフトークを確立できているか
    </li>
  </ul>
</div>

<div id="outline-container-sec-2-9-1" class="outline-4">
  <h4 id="sec-2-9-1">
    UNCONSCIOUSLY &#8220;IMMUNE&#8221;(無意識的に影響下)
  </h4>

  <div class="outline-text-4" id="text-2-9-1">
    <p>
      はじめの段階。
    </p>

    <p>
      This is where we all are when we first begin the process you have learned in this program.
    </p>
  </div>
</div>

<div id="outline-container-sec-2-9-2" class="outline-4">
  <h4 id="sec-2-9-2">
    CONSCIOUSLY &#8220;IMMUNE&#8221;(意識的に影響下)
  </h4>

  <div class="outline-text-4" id="text-2-9-2">
    <p>
      意識的に変化しようとしている状態。
    </p>

    <p>
      This is a stage in the process that may not seem like to you like big progress, since so many of us judge success only on behavioral change,
    </p>
  </div>
</div>

<div id="outline-container-sec-2-9-3" class="outline-4">
  <h4 id="sec-2-9-3">
    CONSCIOUSLY &#8220;RELEASED&#8221;(意識的に自由)
  </h4>

  <div class="outline-text-4" id="text-2-9-3">
    <p>
      Big Assumptionsから距離をおいて考えるようになった状態。 Big Assumptionsを意識的にコントロールできる状態。
    </p>

    <p>
      どういうときにBAの影響がつよくなり、 その時にどのようなself-talkをすればBAの影響を防ぐことができるかを 自覚している状態。
    </p>

    <p>
      Being Consciously Released from your Big Assumptions means that you have begun to win some distance from their control.
    </p>
  </div>
</div>

<div id="outline-container-sec-2-9-4" class="outline-4">
  <h4 id="sec-2-9-4">
    UNCONSCIOUSLY &#8220;RELEASED&#8221;(無意識的に自由)
  </h4>

  <div class="outline-text-4" id="text-2-9-4">
    <p>
      新しい信条によって自然に行動できる状態。 自然とBAに反する行動ができる状態。
    </p>

    <p>
      At this point, you automatically act and think in ways that run counter to your previously held Big Assumption in those situations where it is not valid.
    </p>
  </div>
</div>

自分の挑戦

自分の挑戦体験記を後悔。間違えた、公開。

免疫マップ

<div class="outline-text-3" id="text-3-1">
</div>

<div id="outline-container-sec-3-1-1" class="outline-4">
  <h4 id="sec-3-1-1">
    1.改善目標
  </h4>

  <div class="outline-text-4" id="text-3-1-1">
    <p>
      早寝早起きをして規則正しい生活をする。
    </p>

    <p>
      早寝早起き、自分にとってはもっとも改善が必要な課題。
    </p>

    <ul class="org-ul">
      <li>
        社会人なのに、朝起きられず、遅刻ばかりしてしまう。
      </li>
      <li>
        朝起きられないため、精神科に通って毎日坑不安剤を飲んでいる。
      </li>
    </ul>

    <p>
      しかし、かつては早起きができていた。 改善しようという努力によって短い間だけれども、早起きが定着してた。
    </p>

    <p>
      今の状況は、リバウンドだと思っている。 より、早起きできなくなった。これは適応的課題。
    </p>
  </div>
</div>

<div id="outline-container-sec-3-1-2" class="outline-4">
  <h4 id="sec-3-1-2">
    2.阻害行動
  </h4>

  <div class="outline-text-4" id="text-3-1-2">
    <ul class="org-ul">
      <li>
        家に帰ってから寝るまでの間に計画していないことをする。
      </li>
      <li>
        その日にしなくてもいいことを、その日のうちにしてしまう。
      </li>
      <li>
        寝る前にネットサーフィンしてしまう、ドラクエしてしまう。
      </li>
      <li>
        就寝儀式にしたがって行動していない。
      </li>
      <li>
        翌日の予定を立てて寝ない。
      </li>
      <li>
        寝る時間が不安定。
      </li>
      <li>
        目覚ましをかけて寝ない。
      </li>
    </ul>
  </div>
</div>

<div id="outline-container-sec-3-1-3" class="outline-4">
  <h4 id="sec-3-1-3">
    3.裏の目標
  </h4>

  <div class="outline-text-4" id="text-3-1-3">
  </div>

  <ul class="org-ul">
    <li>
      不安ボックス<br /> <div class="outline-text-5" id="text-3-1-3-1">
        <ul class="org-ul">
          <li>
            ちくしょう!ただでさえ自分の時間がないのに、早く寝るのなんてまっぴらだ!
          </li>
          <li>
            明日もきっと自分の好きなことができない。
          </li>
          <li>
            くそ、今日中にするべきことが終わらない。絶対にこれは今日しなければいけないのに。
          </li>
          <li>
            また起きれなかったという虚無感を味わうくらいなら、 取り返しがつかないほどに夜更かししてしまえ。
          </li>
          <li>
            今更寝たってどうせ起きられないよ。またダメだという気持を味わいたくない。
          </li>
        </ul>
      </div>
    </li>

    <li>
      裏の目標<br /> <div class="outline-text-5" id="text-3-1-3-2">
        <ul class="org-ul">
          <li>
            朝ゆっくり休みすぎたことよって、満員電車で疲れるようなことはしたくない。
          </li>
          <li>
            今の幸せや快楽に溺れた挙句、長期的な大きな喜びを手放したくない。
          </li>
          <li>
            寝坊してしまい、またダメだった、また変われなかったという屈辱感を味わいたくない。
          </li>
          <li>
            どうにでもなれという投げやりで計画性のない人間にはなりたくない。
          </li>
          <li>
            よい習慣がいつになってもみにつかず、時間が経っていつも後悔したくない。
          </li>
          <li>
            その場の感情で投げやりになって計画性がない人になりたくない。
          </li>
          <li>
            どうせダメだろうという諦めの気持だけで、挑戦をしないような人間になりたくない。
          </li>
        </ul>
      </div>
    </li>
  </ul>
</div>

<div id="outline-container-sec-3-1-4" class="outline-4">
  <h4 id="sec-3-1-4">
    4.強力な固定概念
  </h4>

  <div class="outline-text-4" id="text-3-1-4">
    <ul class="org-ul">
      <li>
        寝坊すると怠惰な人間に思われる。
      </li>
      <li>
        寝坊すると計画性のない人間に思われる。
      </li>
      <li>
        寝坊するとなんの目標も達成できない。
      </li>
      <li>
        寝坊するとダメな人間になる。
      </li>
      <li>
        その場の快楽や感情に流されているとダメな人間になる。
      </li>
      <li>
        早く寝たって、明日もどうせ早く起きることができない。
      </li>
      <li>
        いつも時間がない。
      </li>
      <li>
        明日もきっと自分の好きなことをする時間がない。
      </li>
      <li>
        よい習慣を身につけようとしてもどうせ続かない。
      </li>
      <li>
        寝坊するとひどい罪悪感と虚無感を味わうことになる。
      </li>
    </ul>
  </div>
</div>

<div id="outline-container-sec-3-1-5" class="outline-4">
  <h4 id="sec-3-1-5">
    完成した免疫マップのレビュー
  </h4>

  <div class="outline-text-4" id="text-3-1-5">
    <p>
      ここまでの分析をして、自分には&#8221;いつも時間がない&#8221;という固定観念があるように思えた。
    </p>

    <p>
      朝起きることができない理由は、時間管理にあるのでは?本当に時間がないのか? 時間がない、という思い込みこそが固定観念で、事実とは違うのでは?
    </p>

    <p>
      また、なんどもなんども朝起きようとしては挫折してきた結果、 &#8220;頑張ってもどうせおきられない&#8221;という固定観念があるように思えた。
    </p>

    <ul class="org-ul">
      <li>
        どうせ、早く寝ても朝起きられない。
      </li>
      <li>
        睡眠時間を記録しても、どうせ途中で止めてしまう。
      </li>
      <li>
        どうせ、またギリギリまでふとんのなかでぬくぬくしている。
      </li>
    </ul>

    <p>
      まとめると、以下の2つが固定観念として浮かび上がってきた。
    </p>

    <ul class="org-ul">
      <li>
        いつも時間がない。
      </li>
      <li>
        どうせ早く起きられない。
      </li>
    </ul>

    <p>
      この2つの固定観念に関する検証をすることにした。
    </p>
  </div>
</div>

目標分析

<div class="outline-text-3" id="text-3-2">
</div>

<div id="outline-container-sec-3-2-1" class="outline-4">
  <h4 id="sec-3-2-1">
    前に進むためのはじめのステップ(Initial Steps Forward)
  </h4>

  <div class="outline-text-4" id="text-3-2-1">
    <ul class="org-ul">
      <li>
        Behaviors(振る舞い~する。) <ul class="org-ul">
          <li>
            家にかえったら、決めたこと以外はやらないで、まっすぐにふとんに入る。
          </li>
          <li>
            夜、やりたいことが発生したら、メモして後日にまわせるようになる。
          </li>
          <li>
            今飲んでいる抗うつ剤、抗不安剤の量を減らす。
          </li>
          <li>
            ジムに通う習慣を取り戻す。(時間がないといいわけしない)
          </li>
        </ul>
      </li>

      <li>
        Thoughts(理性的な思考~知る、考える) <ul class="org-ul">
          <li>
            遅くまで起きようとしたときの感情を距離を置いて観察できるようになる。
          </li>
          <li>
            自分がどのようなときに遅くまで起きているか、早く寝るかを観察できる。
          </li>
        </ul>
      </li>

      <li>
        Feeling(感情、心情~感じる) <ul class="org-ul">
          <li>
            明日もきっと早く起きれると、信じてふとんに入ることができる。
          </li>
        </ul>
      </li>
    </ul>
  </div>
</div>

<div id="outline-container-sec-3-2-2" class="outline-4">
  <h4 id="sec-3-2-2">
    スゴい発展(Significant Progress)
  </h4>

  <div class="outline-text-4" id="text-3-2-2">
    <ul class="org-ul">
      <li>
        Behaviors(振る舞い~する。) <ul class="org-ul">
          <li>
            朝5時に起きる習慣が身につく。
          </li>
          <li>
            見積りと実績の作業時間を記録し分析する習慣が身につく。
          </li>
        </ul>
      </li>

      <li>
        Thoughts(理性的な思考~知る、考える) <ul class="org-ul">
          <li>
            やりたいことが発生したときに、その感情を抑制することができる。
          </li>
        </ul>
      </li>

      <li>
        Feeling(感情、心情~感じる) <ul class="org-ul">
          <li>
            &#8220;時間がない&#8221;という無意識的に心の中で唱えつづける声が聞こえなくなる。
          </li>
        </ul>
      </li>
    </ul>
  </div>
</div>

<div id="outline-container-sec-3-2-3" class="outline-4">
  <h4 id="sec-3-2-3">
    満ち足りた成功(Full Success)
  </h4>

  <div class="outline-text-4" id="text-3-2-3">
    <ul class="org-ul">
      <li>
        Behaviors(振る舞い) <ul class="org-ul">
          <li>
            目覚ましをつかわないでも、早寝早起きができている。
          </li>
          <li>
            早寝早起きが当たり前のこととして、継続できている。
          </li>
          <li>
            規則正しく、安定した睡眠時間が継続できている。
          </li>
          <li>
            満員電車をさけて出社できている。
          </li>
          <li>
            澄み切った心で集中して勉強に取り組み、数々の成果を出す。
          </li>
        </ul>
      </li>

      <li>
        Thoughts(理性的な思考) <ul class="org-ul">
          <li>
            その場の欲望に流されず、感情をコントロールすることができる。
          </li>
          <li>
            やりたいことが発生しても、優先順位を見極めて感情を抑制することができる。
          </li>
        </ul>
      </li>

      <li>
        Feeling(感情、心情) <ul class="org-ul">
          <li>
            寝坊しても、罪悪感を感じなくなる。
          </li>
          <li>
            時間に余裕を感じる。時間に対する不安感や焦り、動悸を感じなくなる。
          </li>
          <li>
            寝るときと起きたときは、澄み切った感覚を得ることが出来る。
          </li>
          <li>
            時間の不安感から開放され、意欲が沸いてくる。
          </li>
        </ul>
      </li>
    </ul>
  </div>
</div>

実験計画1 目覚ましをかけずに21時に寝る

<div class="outline-text-3" id="text-3-3">
</div>

<div id="outline-container-sec-3-3-1" class="outline-4">
  <h4 id="sec-3-3-1">
    実験計画
  </h4>

  <div class="outline-text-4" id="text-3-3-1">
    <p>
      目覚ましをかけないで、21時に寝る。
    </p>

    <p>
      目覚ましがないと起きられないのか?今までのように寝坊するのか?
    </p>
  </div>

  <ul class="org-ul">
    <li>
      どのようなデータを集めるか<br /> <div class="outline-text-5" id="text-3-3-1-1">
        <p>
          起床時間。
        </p>
      </div>
    </li>

    <li>
      どういう結果が得られたときに固定観念が反証されたとみなすか<br /> <div class="outline-text-5" id="text-3-3-1-2">
        <p>
          目覚ましをつかわなくても5時に起きれた日が3日あったら。
        </p>
      </div>
    </li>
  </ul>
</div>

<div id="outline-container-sec-3-3-2" class="outline-4">
  <h4 id="sec-3-3-2">
    実験結果
  </h4>

  <div class="outline-text-4" id="text-3-3-2">
  </div>

  <ul class="org-ul">
    <li>
      はやく寝ようとしたときに生じた感情記録<br /> <div class="outline-text-5" id="text-3-3-2-1">
        <p>
          まっすぐにふとんに入ると、そわそわする。 しかし、それははじめだけで、次第に早く寝たいと思うようになる。
        </p>
      </div>
    </li>

    <li>
      実験データ<br /> <div class="outline-text-5" id="text-3-3-2-2">
        <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
          <colgroup> <col class="left" /> <col class="right" /> <col class="right" /> <col class="right" /> </colgroup> <tr>
            <th scope="col" class="left">
              Date
            </th>

            <th scope="col" class="right">
              Bed
            </th>

            <th scope="col" class="right">
              Wake
            </th>

            <th scope="col" class="right">
              &#xa0;
            </th>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-04-14 月></span></span>
            </td>

            <td class="right">
              21.0
            </td>

            <td class="right">
              4.5
            </td>

            <td class="right">
              7.5
            </td>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-04-15 火></span></span>
            </td>

            <td class="right">
              23.5
            </td>

            <td class="right">
              7.0
            </td>

            <td class="right">
              7.5
            </td>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-04-16 水></span></span>
            </td>

            <td class="right">
              21.5
            </td>

            <td class="right">
              5.0
            </td>

            <td class="right">
              7.5
            </td>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-04-17 木></span></span>
            </td>

            <td class="right">
              22.0
            </td>

            <td class="right">
              7.0
            </td>

            <td class="right">
              9.
            </td>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-04-18 金></span></span>
            </td>

            <td class="right">
              23.5
            </td>

            <td class="right">
              7.5
            </td>

            <td class="right">
              8.
            </td>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-04-19 土></span></span>
            </td>

            <td class="right">
              22.0
            </td>

            <td class="right">
              4.5
            </td>

            <td class="right">
              6.5
            </td>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-04-20 日></span></span>
            </td>

            <td class="right">
              21.5
            </td>

            <td class="right">
              4.5
            </td>

            <td class="right">
              7.
            </td>
          </tr>

          <tr>
            <td class="left">
              Average
            </td>

            <td class="right">
              22.142857
            </td>

            <td class="right">
              5.7142857
            </td>

            <td class="right">
              7.6428567
            </td>
          </tr>
        </table>
      </div>
    </li>
  </ul>
</div>

<div id="outline-container-sec-3-3-3" class="outline-4">
  <h4 id="sec-3-3-3">
    結果の解釈
  </h4>

  <div class="outline-text-4" id="text-3-3-3">
    <ul class="org-ul">
      <li>
        目覚ましをかけなくても自然と目が覚める。
      </li>
      <li>
        だいたい7.5時間で目が覚める。
      </li>
      <li>
        残業して遅く寝た日ははやく起きられない。
      </li>
      <li>
        夢をよくみる。
      </li>
    </ul>

    <p>
      早くふとんにはいって寝た日は目覚ましをつかわず、目が覚めた。
    </p>

    <p>
      よって、固定観念は反証された。
    </p>
  </div>
</div>

実験計画2 計画外の時間と感情の記録

<div class="outline-text-3" id="text-3-4">
  <p>
    夜更かしをしてしまう日は、心に余裕がないときが多い気がする。
  </p>

  <p>
    心の不安は、計画どおりにタスクがこなせなかった日が多い気がする。
  </p>

  <p>
    予定外の仕事をした日と、心の不安感には相関関係があるか? 時間がないという思い込みは、予定どおり計画が進まない不安感からくるか?
  </p>

  <p>
    実験する前からそんな気がするが、 この仮説を裏付けるデータを採取して検証してみる。
  </p>
</div>

<div id="outline-container-sec-3-4-1" class="outline-4">
  <h4 id="sec-3-4-1">
    どのようなデータを集めるか
  </h4>

  <div class="outline-text-4" id="text-3-4-1">
    <p>
      タスクを予定・予定外でわけて、予定外の作業に費やした時間を収集する。
    </p>

    <p>
      一日の終わりに、&#8221;時間がない&#8221;と感じたか、を5段階で評価する。
    </p>
  </div>
</div>

<div id="outline-container-sec-3-4-2" class="outline-4">
  <h4 id="sec-3-4-2">
    どういう結果が得られたときに固定観念が反証されたとみなすか
  </h4>

  <div class="outline-text-4" id="text-3-4-2">
    <p>
      予定外の作業時間と不安感に相関関係があったとき。
    </p>
  </div>
</div>

<div id="outline-container-sec-3-4-3" class="outline-4">
  <h4 id="sec-3-4-3">
    実験結果
  </h4>

  <div class="outline-text-4" id="text-3-4-3">
  </div>

  <ul class="org-ul">
    <li>
      実験データ<br /> <div class="outline-text-5" id="text-3-4-3-1">
        <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
          <colgroup> <col class="left" /> <col class="right" /> <col class="right" /> <col class="right" /> </colgroup> <tr>
            <td class="left">
              date
            </td>

            <td class="right">
              next
            </td>

            <td class="right">
              unplan
            </td>

            <td class="right">
              feeling
            </td>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-04-29 火></span></span>
            </td>

            <td class="right">
              5.6
            </td>

            <td class="right">
              4.4
            </td>

            <td class="right">
              &#xa0;
            </td>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-04-30 水></span></span>
            </td>

            <td class="right">
            </td>

            <td class="right">
              1.0
            </td>

            <td class="right">
              2
            </td>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-05-02 金></span></span>
            </td>

            <td class="right">
              6.9
            </td>

            <td class="right">
              3.4
            </td>

            <td class="right">
              2
            </td>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-05-03 金></span></span>
            </td>

            <td class="right">
              5.35
            </td>

            <td class="right">
              4
            </td>

            <td class="right">
              2
            </td>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-05-05 月></span></span>
            </td>

            <td class="right">
              11.25
            </td>

            <td class="right">
              1.8
            </td>

            <td class="right">
              2
            </td>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-05-06 火></span></span>
            </td>

            <td class="right">
              12.5
            </td>

            <td class="right">
            </td>

            <td class="right">
              3
            </td>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-05-10 土></span></span>
            </td>

            <td class="right">
            </td>

            <td class="right">
            </td>

            <td class="right">
              4
            </td>
          </tr>

          <tr>
            <td class="left">
              <span class="timestamp-wrapper"><span class="timestamp"><2014-05-11 土></span></span>
            </td>

            <td class="right">
              12.5
            </td>

            <td class="right">
            </td>

            <td class="right">
              2
            </td>
          </tr>
        </table>
      </div>
    </li>
  </ul>
</div>

<div id="outline-container-sec-3-4-4" class="outline-4">
  <h4 id="sec-3-4-4">
    結果の解釈
  </h4>

  <div class="outline-text-4" id="text-3-4-4">
    <ul class="org-ul">
      <li>
        やや相関関係があるが、つよくはない。
      </li>
      <li>
        予定外のことをした以外にも、以下の要因がある。 <ul class="org-ul">
          <li>
            見積もった時間を大幅にオーバーしてしまったとき。
          </li>
          <li>
            寝坊して、一週間のうちにやろうと思っていたことが遅れているとき。 日の単位ではなくでもっと長いスパンで遅れを感じると不安になる。
          </li>
        </ul>
      </li>
    </ul>

    <p>
      この実験では、あまりよい成果が得られなかった。
    </p>

    <p>
      時間がないということは、
    </p>

    <ol class="org-ol">
      <li>
        物理的に時間がない
      </li>
      <li>
        不安感から時間がないと感じる
      </li>
    </ol>

    <p>
      の2つしかない。2の場合は、克服できるはず。
    </p>

    <p>
      また、不安感は2つからくることを知った。
    </p>

    <ul class="org-ul">
      <li>
        予定どおりに進まない、見積りを誤る
      </li>
      <li>
        予定外のことをする
      </li>
    </ul>
  </div>
</div>

実験計画3 走る

<div class="outline-text-3" id="text-3-5">
  <p>
    以下のbig assumptionを検証
  </p>

  <p>
    いつも時間ない。
  </p>
</div>

<div id="outline-container-sec-3-5-1" class="outline-4">
  <h4 id="sec-3-5-1">
    どのようなデータを集めるか
  </h4>

  <div class="outline-text-4" id="text-3-5-1">
    <p>
      走る前と走り終わったあとの心情をノートに記録する。
    </p>

    <p>
      よい習慣は、毎日小さく(5分から)はじめることで継続できることを検証する。 時間がないという思い込みは、心理的な不安からくることを認識する。
    </p>

    <p>
      走り終わったあとに、走る前と同じように時間がないと感じていたか。
    </p>
  </div>
</div>

<div id="outline-container-sec-3-5-2" class="outline-4">
  <h4 id="sec-3-5-2">
    どういう結果が得られたときに固定観念が反証されたとみなすか
  </h4>

  <div class="outline-text-4" id="text-3-5-2">
    <p>
      走り終わったあとに、時間がないという感情が減ったとき。
    </p>
  </div>
</div>

<div id="outline-container-sec-3-5-3" class="outline-4">
  <h4 id="sec-3-5-3">
    実験結果
  </h4>

  <div class="outline-text-4" id="text-3-5-3">
    <p>
      別のノートに記録。
    </p>
  </div>
</div>

<div id="outline-container-sec-3-5-4" class="outline-4">
  <h4 id="sec-3-5-4">
    結果の解釈
  </h4>

  <div class="outline-text-4" id="text-3-5-4">
    <ul class="org-ul">
      <li>
        走り終わるとそこまで時間がないようには感じない。 時間がないと感じるのはストレスが生み出す心理的な問題。
      </li>
      <li>
        むしろ、時間がないはずの夜に5分走ったほうが、 その後の就寝と起床の効率があがる。
      </li>
      <li>
        事実として時間がないのではなくて、時間がないと感じている。 疲労とストレス解消によって時間がないという気持ちが薄れる。
      </li>
      <li>
        時間がない感じたときは、あせるのではなくて、 ストレスがたまっているからどうやってストレスを減らすかを 考えるのがよい。 <p>
          この実験はやや予定調和的ではあるものの、期待どおりの結果が得られた。
        </p>

        <p>
          いつも時間がない、という思い込みは反証され、心の声は弱くなった。
        </p>
      </li>
    </ul>
  </div>
</div>

実験計画4 認知療法

<div class="outline-text-3" id="text-3-6">
  <p>
    以下のbig assumptionを検証。
  </p>

  <p>
    明日もきっと虚しい一日になるに違いない。
  </p>

  <p>
    寝る時間が多いときは、ストレスが高いとき。 睡眠は現実逃避の手段になっているから。
  </p>

  <p>
    以下のfull sccessに近づくための実験を計画してみる。
  </p>

  <ul class="org-ul">
    <li>
      寝るときと起きたときは、澄み切った感覚を得ることが出来る。
    </li>
  </ul>
</div>

<div id="outline-container-sec-3-6-1" class="outline-4">
  <h4 id="sec-3-6-1">
    どのようなデータを集めるか
  </h4>

  <div class="outline-text-4" id="text-3-6-1">
    <p>
      一日の終わりに、つまらない、虚しい、つらいと感じた出来事を取り出す。 以下の2つをデータとして残す。
    </p>

    <ul class="org-ul">
      <li>
        認知療法のフレームワークにしたがって、出来事を解釈。 <ul class="org-ul">
          <li>
            状況
          </li>
          <li>
            気分
          </li>
          <li>
            自動思考
          </li>
          <li>
            合理的な考え
          </li>
        </ul>
      </li>

      <li>
        解釈のあと、その結果をどう感じたかを記録
      </li>
    </ul>
  </div>
</div>

<div id="outline-container-sec-3-6-2" class="outline-4">
  <h4 id="sec-3-6-2">
    どのような結果を期待するか
  </h4>

  <div class="outline-text-4" id="text-3-6-2">
    <p>
      出来事の解釈によって、虚しさが減少すること。 その結果、きっと虚しくなるという思い込みが弱まること。 積極的に別の解釈をしようと心がける習慣ができること。
    </p>
  </div>
</div>

<div id="outline-container-sec-3-6-3" class="outline-4">
  <h4 id="sec-3-6-3">
    どういう結果が得られたときに固定観念が反証されたとみなすか
  </h4>

  <div class="outline-text-4" id="text-3-6-3">
    <p>
      出来事の解釈によって、幸福度が変化したとき。
    </p>
  </div>
</div>

<div id="outline-container-sec-3-6-4" class="outline-4">
  <h4 id="sec-3-6-4">
    実験結果
  </h4>

  <div class="outline-text-4" id="text-3-6-4">
    <p>
      省略
    </p>
  </div>
</div>

<div id="outline-container-sec-3-6-5" class="outline-4">
  <h4 id="sec-3-6-5">
    結果の解釈
  </h4>

  <div class="outline-text-4" id="text-3-6-5">
    <p>
      解釈のあと、その場ではあまり気持ちは変化しない。 数日おいて改めて見直してみると、 自分の感じていたことはとても些細なことだったり、 そこまで考え込まなくてもいいことだったりすることに気づいた。
    </p>

    <p>
      時間をおいて出来事を解釈するとそれは気分を深く落ち込ませない。 結果によって、仮定が実証された。
    </p>

    <p>
      テクニックとして、より早くそのような距離を置いた思考に至るようになりたい。
    </p>
  </div>
</div>

まとめ

早寝早起きをするためには、以下の3つの強力な固定観念を克服する必要がある。

  • どうせ明日も早くおきることができない。
  • いつも時間がない。
  • 明日もきっと虚しい一日になるに違いない。

まだ、克服できたとはいえないが、着実に成果はでている。

免疫マップが完成したとき、以上の固定観念が浮き彫りになったことに驚いた。

世の中には睡眠についてはたくさんのライフハックや睡眠グッズがあふれている。 自分も、早起きのためにそのような情報をあつめ、睡眠グッズを買ってきた。 しかし、それらでは睡眠を克服することができなかった。 睡眠を克服するということは、技術的課題ではなくて、適応的課題なのだ。

技術的なライフハックでは変われない。 強力な固定観念の克服によってのみ、変わることができる。

10 May 2014, 23:16

[edX]Embedded Systems – Shape The World ずっと受けたかった組み込みソフト開発の授業

はじめに

レジスタも触ったことのないニセエセ組込みエンジニアなので、 リアル組込みエンジニアになりたくて、edXで組込み開発の学習をしました。

結果は、途中で挫折しました。全15週の10週目くらいで挫折。 なので、この記事も中途半端な記事になります。

自分はリアル組み込みエンジニアにはなれませんでしたorz.

[toc]

内容

0,1のフリップフロップから電子回路、レジスタへと、基礎からしっかり解説される。 オームの法則とか、忘れた。電子回路は読んで読まないふりをした。

期待していた?電子回路の知識は十分過ぎるほど出てきた。 ADC,DACあたりはほんとうに挫折。

言語はC言語

<div class="outline-text-3" id="text-2-1">
  <p>
    言語はもちろん、C言語だ。補足的にアセンブラ言語もでてくる。楽勝楽勝。
  </p></p>
</div></p>

実践も重視

<div class="outline-text-3" id="text-2-2">
  <p>
    知識的な部分だけではなく、開発プロセスや品質の考え方、デバッグ手法など 実践的な部分も説明される。
  </p>

  <p>
    開発プロセスでは、フローチャートやサブルーチンといった、 手続き型用語が解説されて、やや時代遅れを感じた。
  </p></p>
</div></p>

進め方

講義の流れ

<div class="outline-text-3" id="text-3-1">
  <p>
    イントロダクションとして、2人のコント?から始まる。 動画よりも、文章の方が多め。
  </p>

  <p>
    動画ではとくにパワーポイントは使わずにホワイトボードで解説されるので、 字がきれいでなく読みにくい。
  </p></p>
</div></p>

Labについて

<div class="outline-text-3" id="text-3-2">
  <p>
    講義よりも比重が置かれているのが、Labと呼ばれている実機学習。
  </p>

  <p>
    毎週課題が出されて、それに取り組むことで講義の内容の理解を深める。
  </p>

  <p>
    課題の評価はテストコードで自動でチェックされる。 シミュレータと実機の両方で評価することが求められる。
  </p>

  <p>
    評価ボードは、Texas Instrumentsの EK-LM4F120XLというものを買った。 ネットで注文して購入する必要がある。ARMの Cortex-Mが載っている。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.tij.co.jp/tool/jp/ek-lm4f120xl">Stellaris LM4F120 LaunchPad 評価ボード &#8211; EK-LM4F120XL &#8211; TI ツール・フォルダ</a>
    </li>
  </ul>

  <p>
    開発環境としては、Keil uVision for the ARM, MDK-Lite (32KB) Editionを利用する。 ARMの開発をするためのIDE.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.keil.com/uvision/default.asp">µVision IDE &#8211; Overview</a>
    </li>
  </ul>
</div>

<div id="outline-container-sec-3-2-1" class="outline-4">
  <h4 id="sec-3-2-1">
    Lチカ
  </h4>

  <div class="outline-text-4" id="text-3-2-1">
    <iframe width="560" height="315" src="//www.youtube.com/embed/32fij3U6SUo" frameborder="0" allowfullscreen></iframe>
  </div></p>
</div></p>

感想

自己紹介

<div class="outline-text-3" id="text-4-1">
  <p>
    まず、なぜ私がニセエセ組込みエンジニアなのかを説明したい。 そのために、まずは自分のしていた仕事を書こうと思う。 このブログに仕事の話を書くのも初めてな気がする。
  </p>

  <p>
    今は別のこと(社内ニートとも)をしているけれども、ちょっと前までは、 ストレージ装置の組込みソフトエンジニアだった。
  </p>

  <p>
    開発はそこそこ大規模で、機能モジュールごとに担当チームが別れている。
  </p>

  <p>
    自分の所属していたチームは、エラー発生時のリカバリが担当。 つまり、装置でエラーが発生したときに、 可用性を失わないためにあらゆる手段をつかってあれこれする役目。
  </p>

  <p>
    そのなかでも、自分が担当していた部分は、 ハードエラーが発生して装置内の各種ドライバから通知を受けたときに、 装置の可用性を失わないためはどうすればいいかを一生懸命考える部分。
  </p>

  <div class="figure">
    <p>
      <img src="http://futurismo.biz/wp-content/uploads/wpid-sample5.png" alt="sample.png" />
    </p></p>
  </div>

  <p>
    ハードと接するinterfaceはドライバ層で隠蔽されているため、 実は自分はレジスタを触ったことがない!
  </p>

  <p>
    そもそもレジスタがなんだかわからない。 雑誌『Interface』や『トランジスタ技術』が 会社の休憩ゾーンにおいてあるが、書いてあることがほぼわからない。
  </p>

  <p>
    これって、組込みエンジニアとしてどうなの? これが、ニセエセ組込みエンジニアたる所以である。
  </p></p>
</div></p>

課題

<div class="outline-text-3" id="text-4-2">
  <p>
    自分は、組込みエンジニアという肩書きではあるものの、 実際はハードウェアを理解していない。
  </p>

  <p>
    以下の記事にとても共感する。
  </p>

  <p>
    <a href="http://monoist.atmarkit.co.jp/mn/articles/0703/26/news101.html">組み込みギョーカイの常識・非常識(8):組み込みソフトウェアって何</a>
  </p>

  <p>
    ちなみに、この記事を書いた著者のことを調べてみるとこんな本を書いてた。
  </p>

  <div class='amazlink-box' style='text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;'>
    <div class='amazlink-list' style='clear: both;'>
      <div class='amazlink-image' style='float:left;margin:0px 12px 1px 0px;'>
        <a href='http://www.amazon.co.jp/%E7%B5%84%E8%BE%BC%E3%81%BF%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E5%85%A5%E9%96%80-%E7%B5%84%E8%BE%BC%E3%81%BF%E3%83%97%E3%83%AC%E3%82%B9Selection-%E3%81%BF%E3%82%8F-%E3%82%88%E3%81%97%E3%81%93/dp/4774140155%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774140155' target='_blank' rel='nofollow'><img src='http://ecx.images-amazon.com/images/I/41MIz39174L._SL160_.jpg' style='border: none;' /></a>
      </div>

      <div class='amazlink-info' style='height:160; margin-bottom: 10px'>
        <div class='amazlink-name' style='margin-bottom:10px;line-height:120%'>
          <a href='http://www.amazon.co.jp/%E7%B5%84%E8%BE%BC%E3%81%BF%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E5%85%A5%E9%96%80-%E7%B5%84%E8%BE%BC%E3%81%BF%E3%83%97%E3%83%AC%E3%82%B9Selection-%E3%81%BF%E3%82%8F-%E3%82%88%E3%81%97%E3%81%93/dp/4774140155%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774140155' rel='nofollow' target='_blank'>組込みソフトウェアエンジニアのためのハードウェア入門 (組込みプレスSelection)</a>
        </div>

        <div class='amazlink-powered' style='font-size:80%;margin-top:5px;line-height:120%'>
          posted with <a href='http://amazlink.keizoku.com/' title='アマゾンアフィリエイトリンク作成ツール' target='_blank'>amazlink</a> at 14.05.11
        </div>

        <div class='amazlink-detail'>
          みわ よしこ
        </div>

        <div class='amazlink-sub-info' style='float: left;'>
          <div class='amazlink-link' style='margin-top: 5px'>
            <img src='http://amazlink.fuyu.gs/icon_amazon.png' width='18' /><a href='http://www.amazon.co.jp/%E7%B5%84%E8%BE%BC%E3%81%BF%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E5%85%A5%E9%96%80-%E7%B5%84%E8%BE%BC%E3%81%BF%E3%83%97%E3%83%AC%E3%82%B9Selection-%E3%81%BF%E3%82%8F-%E3%82%88%E3%81%97%E3%81%93/dp/4774140155%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774140155' rel='nofollow' target='_blank'>Amazon</a> <img src='http://amazlink.fuyu.gs/icon_rakuten.gif' width='18' /><a href='http://hb.afl.rakuten.co.jp/hgc/g00q0724.n763w947.g00q0724.n763x2b4/archives/c=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F6186429%2F&#038;m=http%3A%2F%2Fm.rakuten.co.jp%2Frms%2Fmsv%2FItem%3Fn%3D6186429%26surl%3Dbook' rel='nofollow' target='_blank'>楽天</a>
          </div>
        </div>
      </div>
    </div>
  </div>

  <p>
    ハードウェアの担当者と一緒の打ち合わせに参加しても、正直ちんぷんかんぷん。
  </p>

  <p>
    ということで、以下が学習目標。
  </p></p>
</div></p>

学習目標

<div class="outline-text-3" id="text-4-3">
  <p>
    DMA Driver が DMA Portのハードエラーを検出して、 そのエラー要因ごとに異常を通知する仕組みを理解すること。
  </p>

  <p>
    DriverがDMAなのは、 仕事で一番お世話になったのが DMA Driverの担当の人だったから。
  </p>

  <p>
    ここからは、勉強メモ。
  </p></p>
</div></p>

Embeded System

組み込みシステム。

特定の機能を実現するために機械や機器に組み込まれるコンピュータシステム。

組み込みシステムの主な構成要素は以下。

  • Embedded Systems
    • MicroCotroller
      • Memory
        • RAM
        • ROM
      • Processor(CPU)
      • I/O Ports
      • DAC
      • Bas
      • Timer
    • External Circuits
    • Physical Device
      • Sensor
      • ADC

以下のような特徴をもつ。

  • A microcontroller hidden inside
  • A dedicated purpose
  • Run in real time
  • Input/output is important
  • High volume, low cost
  • Extremely reliable
  • Low power
  • Small size and weight

MicroController

マイクロコントローラー。いわゆる、マイコン。

Microcontrollers, which are microcomputers incorporating the processor,
RAM, ROM and I/O ports into a single package,
are often employed in an embedded system because of their low cost,
small size, and low power requirements.

I/O Port

<div class="outline-text-3" id="text-6-1">
  <p>
    Input Port/Output Portの略。 Input Portは 外部の世界(外部の集積回路、sensor, etc) からの情報をコンピュータのなかに入れる。Output Portはその逆。
  </p>

  <p>
    A port is a physical connection between the computer and its outside world.
  </p></p>
</div>

<div id="outline-container-sec-6-1-1" class="outline-4">
  <h4 id="sec-6-1-1">
    device driver
  </h4>

  <div class="outline-text-4" id="text-6-1-1">
    <p>
      a set of software functions that facilitate the use of an I/O port.
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-6-1-2" class="outline-4">
  <h4 id="sec-6-1-2">
    GPIO
  </h4>

  <div class="outline-text-4" id="text-6-1-2">
    <p>
      GPIOはGeneral Purpose Input/Output(汎用入出力)の略語。
    </p>

    <p>
      <a href="http://ja.wikipedia.org/wiki/GPIO">GPIO &#8211; Wikipedia</a>
    </p>

    <p>
      LSIチップや電子機器の備える入出力端子の一種で、 設定次第で様々な用途に利用できるもの。
    </p>

    <p>
      ソフトウェアの指示によって任意の入力あるいは出力に利用することができる。 複数の端子がGPIOに割り当てられている場合には、 これを一つのグループとして一括して制御することができ「GPIOポート」などと呼ばれる
    </p>

    <p>
      <a href="http://e-words.jp/w/GPIO.html">GPIOとは 【 General Purpose Input/Output 】 &#8211; 意味/解説/説明/定義 : IT用語辞典</a>
    </p>

    <p>
      PinはGPIOの構成要素。たとえば、GPIO PortAは、PA0-PA7の8つのPinからできている。
    </p>

    <p>
      Pins can be configured for digital I/O, analog input, timer I/O, or serial I/O. For example PA0 can be digital I/O or serial input.
    </p>

    <p>
      Pinのそれぞれが外部デバイスに接続される。 用途は、レジスタの設定によって自由にできる。
    </p>

    <ul class="org-ul">
      <li>
        PA1 &#x2026; LEDへのOutput用
      </li>
      <li>
        PA2 &#x2026; Switch からの Input用
      </li>
      <li>
        PA3 &#x2026; UART の Input用
      </li>
      <li>
        PA4 &#x2026; UART の Output用
      </li>
    </ul>
  </div></p>
</div></p>

Register

<div class="outline-text-3" id="text-6-2">
  <p>
    コンピュータのプロセッサなどが内蔵する記憶回路で、 制御装置や演算装置や実行ユニットに直結した、 操作に要する速度が最速の、比較的少量のものを指す。
  </p>

  <p>
    一般に、論理回路において、フリップフロップなどにより状態を保持する装置をレジスタと呼ぶ。 コンピュータにおいては、プロセッサが内蔵しているそれを指す。 プロセッサには、プログラムが読み書きできるレジスタ以外に、 プロセッサ自身が動作するためのレジスタがあり、内部レジスタなどと呼ばれる。
  </p>

  <p>
    <a href="http://ja.wikipedia.org/wiki/%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)">レジスタ (コンピュータ) &#8211; Wikipedia</a>
  </p>

  <p>
    Registers are high-speed storage inside the processor.
  </p></p>
</div>

<div id="outline-container-sec-6-2-1" class="outline-4">
  <h4 id="sec-6-2-1">
    Registerのプログラムでの扱い
  </h4>

  <div class="outline-text-4" id="text-6-2-1">
    <p>
      Pinを操作するためのレジスタには、 アドレス空間の決められたアドレスが割り振られている。(仕様)
    </p>

    <p>
      プログラムでは、あらかじめDefineを利用してレジスタのアドレスを宣言するのが王道。 volatileをつけることで、コンパイラが最適化してアドレスを変更するのを防ぐ。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">#define PA5   (*((volatile unsigned long *)0x40004080))

    <p>
      これは以下と同値。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">data = (*((volatile unsigned long *)0x40004080));

data = 0x40004080; data = (*0x40004080);

    <p>
      そうすると、以下のようにして Registerの値を Read/Writeできる。
    </p>

    <div class="org-src-container">
      <pre class="src src-language"># Register Write

PA5 = 0x20;

Register Read

data = PA5;

    <p>
      初期設定はこんな感じ。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">void PortF_Init(void){ volatile unsigned long delay;

SYSCTL_RCGC2_R |= 0x00000020; // 1) F clock delay = SYSCTL_RCGC2_R; // delay
GPIO_PORTF_LOCK_R = 0x4C4F434B; // 2) unlock PortF PF0 GPIO_PORTF_CR_R |= 0x1F; // allow changes to PF4-0
GPIO_PORTF_AMSEL_R &= 0x00; // 3) disable analog function GPIO_PORTF_PCTL_R &= 0x00000000; // 4) GPIO clear bit PCTL GPIO_PORTF_DIR_R &= ~0x11; // 5.1) PF4,PF0 input, GPIO_PORTF_DIR_R |= 0x08; // 5.2) PF3 output GPIO_PORTF_AFSEL_R &= 0x00; // 6) no alternate function GPIO_PORTF_PUR_R |= 0x11; // enable pullup resistors on PF4,PF0
GPIO_PORTF_DEN_R |= 0x1F; // 7) enable digital pins PF4-PF0
}

<div id="outline-container-sec-6-2-2" class="outline-4">
  <h4 id="sec-6-2-2">
    LチカExample抜粋
  </h4>

  <div class="outline-text-4" id="text-6-2-2">
    <div class="org-src-container">
      <pre class="src src-language">// symbolic names instead of addresses

#define GPIO_PORTF_DATA_R (*((volatile unsigned long )0x400253FC)) #define GPIO_PORTF_DIR_R (((volatile unsigned long )0x40025400)) #define GPIO_PORTF_AFSEL_R (((volatile unsigned long )0x40025420)) #define GPIO_PORTF_PUR_R (((volatile unsigned long )0x40025510)) #define GPIO_PORTF_DEN_R (((volatile unsigned long )0x4002551C)) #define GPIO_PORTF_LOCK_R (((volatile unsigned long )0x40025520)) #define GPIO_PORTF_CR_R (((volatile unsigned long )0x40025524)) #define GPIO_PORTF_AMSEL_R (((volatile unsigned long )0x40025528)) #define GPIO_PORTF_PCTL_R (((volatile unsigned long )0x4002552C)) #define SYSCTL_RCGC2_R (((volatile unsigned long *)0x400FE108))

// 2. Declarations Section // Global Variables unsigned long SW1; // input from PF4 unsigned long SW2; // input from PF0

// Subroutine to initialize port F pins for input and output // PF4 is input SW1 and PF2 is output Blue LED void PortF_Init(void){ volatile unsigned long delay; SYSCTL_RCGC2_R |= 0x00000020; // 1) F clock delay = SYSCTL_RCGC2_R; // delay
GPIO_PORTF_LOCK_R = 0x4C4F434B; // 2) unlock PortF PF0 GPIO_PORTF_CR_R |= 0x1F; // allow changes to PF4-0
GPIO_PORTF_AMSEL_R &= 0x00; // 3) disable analog function GPIO_PORTF_PCTL_R &= 0x00000000; // 4) GPIO clear bit PCTL GPIO_PORTF_DIR_R &= ~0x11; // 5.1) PF4,PF0 input, GPIO_PORTF_DIR_R |= 0x08; // 5.2) PF3 output GPIO_PORTF_AFSEL_R &= 0x00; // 6) no alternate function GPIO_PORTF_PUR_R |= 0x11; // enable pullup resistors on PF4,PF0
GPIO_PORTF_DEN_R |= 0x1F; // 7) enable digital pins PF4-PF0
}

void FlashSOS(void){ //S GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08; delay(1); GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08; delay(1); GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08; delay(1); //O GPIO_PORTF_DATA_R |= 0x08; delay(4); GPIO_PORTF_DATA_R &= ~0x08;delay(4); GPIO_PORTF_DATA_R |= 0x08; delay(4); GPIO_PORTF_DATA_R &= ~0x08;delay(4); GPIO_PORTF_DATA_R |= 0x08; delay(4); GPIO_PORTF_DATA_R &= ~0x08;delay(4); //S GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08;delay(1); GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08;delay(1); GPIO_PORTF_DATA_R |= 0x08; delay(1); GPIO_PORTF_DATA_R &= ~0x08;delay(1); delay(10); // Delay for 5 secs in between flashes }

Memory

ROM

<div class="outline-text-3" id="text-7-1">
  <p>
    書き込んだデータは消去できないが、電源を切ってもデータが消えない読み出し専用のメモリ.
  </p></p>
</div></p>

RAM

<div class="outline-text-3" id="text-7-2">
  <p>
    データの読み書きは自由に行えるが、電源を切ると内容が消えるメモリ(Random Access Memory)
  </p></p>
</div></p>

Interface

ハードウェアとソフトウェアを結ぶもの。ここでいうところは、ハードウェアインタフェース。

interface is defined as the hardware and software that combine to allow the computer to communicate with the external hardware.

I/O Port, 外部電子回路、物理的デバイス、ソフトウェアなどを集めたもの。

An interface is defined as the collection of the I/O port, external electronics, physical devices, and the software, which combine to allow the computer to communicate with the external world.

以下の4つに分類される。

Parallel Interface

<div class="outline-text-3" id="text-8-1">
  <p>
    パラレルポートとは、コンピュータシステム内で、 ばらばらの周辺機器をケーブルで接続するために使われる物理的なインタフェースの一種。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E3%83%91%E3%83%A9%E3%83%AC%E3%83%AB%E3%83%9D%E3%83%BC%E3%83%88">パラレルポート &#8211; Wikipedia</a>
    </li>
    <li>
      <a href="http://www.sophia-it.com/content/%E3%83%91%E3%83%A9%E3%83%AC%E3%83%AB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9">パラレルインターフェースとは 「パラレルインタフェース」 (parallel interface): &#8211; IT用語辞典バイナリ</a>
    </li>
  </ul>
</div></p>

Syncronization

<div class="outline-text-3" id="text-8-2">
  <p>
    ハードウェアとソフトウェアの同期処理。
  </p>

  <p>
    ハードウェアのスピードとソフトウェアのスピードは、 ソフトウェアの方が早いため相互でやりとりするためには以下の手段がある。
  </p></p>
</div>

<div id="outline-container-sec-8-2-1" class="outline-4">
  <h4 id="sec-8-2-1">
    Blind-Cycle
  </h4>

  <div class="outline-text-4" id="text-8-2-1">
    <p>
      決められた時間SleepしたあとにI/Oステータスをチェックする.
    </p>

    <p>
      the software writes data to the output device, triggers (starts) the device, then waits a specified time. We call this method blind, because there is no status information about the I/O device reported to the software.
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-8-2-2" class="outline-4">
  <h4 id="sec-8-2-2">
    Busy-Wait
  </h4>

  <div class="outline-text-4" id="text-8-2-2">
    <p>
      Input deviceのデータが更新されたときにI/Oステータスをチェックする。
    </p>

    <p>
      状態がBusyならばWait(loop), Readyならば次のステップへ。
    </p>

    <p>
      Busy Wait is a software loop that checks the I/O status waiting for the done state. For an input device, the software waits until the input device has new data, and then reads it from the input device,
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-8-2-3" class="outline-4">
  <h4 id="sec-8-2-3">
    Interrupt
  </h4>

  <div class="outline-text-4" id="text-8-2-3">
    <p>
      ハードウェアが発生させる特別な通知。
    </p>

    <p>
      An interrupt uses hardware to cause special software execution. With an input device, the hardware will request an interrupt when input device has new data. The software interrupt service will read from the input device and save in global RAM,
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-8-2-4" class="outline-4">
  <h4 id="sec-8-2-4">
    Periodic Polling
  </h4>

  <div class="outline-text-4" id="text-8-2-4">
    <p>
      クロックタイマの割り込み契機でI/Oのステータスをチェック
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-8-2-5" class="outline-4">
  <h4 id="sec-8-2-5">
    DMA
  </h4>

  <div class="outline-text-4" id="text-8-2-5">
    <p>
      Direct Memory Access あるメモリから別のメモリに直接情報を書き込む
    </p></p>
  </div></p>
</div></p>

Serial Interface

<div class="outline-text-3" id="text-8-3">
</div>

<div id="outline-container-sec-8-3-1" class="outline-4">
  <h4 id="sec-8-3-1">
    UART
  </h4>

  <div class="outline-text-4" id="text-8-3-1">
    <p>
      Universal Asynchronous Receiver/Transmitter (UART). 調歩同期方式によるシリアル通信をするための汎用I/F。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://ja.wikipedia.org/wiki/UART">UART &#8211; Wikipedia</a>
      </li>
    </ul>

    <p>
      有名なので、最近のほとんどのマイコンに搭載されているらしい。
    </p></p>
  </div></p>
</div></p>

Thread/Process/Task

Thread

<div class="outline-text-3" id="text-9-1">
  <p>
    A thread is defined as the path of action of software as it executes.
  </p></p>
</div></p>

Process

<div class="outline-text-3" id="text-9-2">
  <p>
    A process is defined as the action of software as it executes.
  </p>

  <p>
    スレッドとプロセスの違いは、変数のスコープの違い?
  </p>

  <p>
    Threads share access to I/O devices, system resources, and global variables, while processes have separate global variables and system resources. Processes do not share I/O devices.
  </p>

  <p>
    実際は、OSによってバラバラ。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/2245">スレッドとタスクの違いについてしらべてみた(C++/Linux) | Futurismo</a>
    </li>
  </ul>
</div></p>

Interrupt

Hardware Interrupt Software Action.

Busy-Waitの制御で待ってられない場合は、Interruptを利用する。

ここからは、一般的な説明ではなくてedXの中だけの定義。

Arm/DisArm

<div class="outline-text-4" id="text-10-0-1">
  <p>
    Armとは、ハードウェアが割り込みをあげることを有効化する。
  </p>

  <p>
    DisArmとは、ハードウェアが割り込みをあげることを無効化する。
  </p></p>
</div></p>

Enable/Disable

<div class="outline-text-4" id="text-10-0-2">
  <p>
    Enableは一時的に割り込みを有効化する。
  </p>

  <p>
    Disbleは一時的に割り込みを無効化する。
  </p>

  <p>
    Disable中に発生したInterupptは Pendingされて、Enable時に通知される。
  </p></p>
</div></p>

Interruputの初期化処理

<div class="outline-text-4" id="text-10-0-3">
  <ol class="org-ol">
    <li>
      Trigger flag set by hardware
    </li>
    <li>
      the device is armed by software
    </li>
    <li>
      the device is enabled for interrupts in the NVIC
    </li>
    <li>
      the processor is enabled for interrupts (PRIMASK I bit is clear)
    </li>
    <li>
      the interrupt level must be less than the BASEPRI.
    </li>
  </ol>
</div></p>

Context Switch

<div class="outline-text-4" id="text-10-0-4">
  <p>
    割り込みをハードウェアが検知したときに、 foregroundとbackgroundのスレッドを入れ替える。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81">コンテキストスイッチ &#8211; Wikipedia</a>
    </li>
  </ul>

  <p>
    現在のプロセスの実行を一時停止して、 スタックにレジスタ情報を覚えておく。
  </p>

  <p>
    割り込みハンドラを実行して、 ハンドラの実行が終了したらもとのプロセスを再開する。
  </p>

  <ol class="org-ol">
    <li>
      Current instruction is finished,
    </li>
    <li>
      Eight registers are pushed on the stack,
    </li>
    <li>
      LR is set to 0xFFFFFFF9,
    </li>
    <li>
      IPSR is set to the interrupt number,
    </li>
    <li>
      PC is loaded with the interrupt vector
    </li>
  </ol>
</div></p>

Interrupt Service Routine(ISR)

<div class="outline-text-3" id="text-10-1">
  <p>
    割り込みサービスルーチン。割り込みハンドラともいう。
  </p>

  <p>
    <a href="http://ja.wikipedia.org/wiki/%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9">割り込みハンドラ &#8211; Wikipedia</a>
  </p>

  <p>
    コンテキストスイッチによって、 foregroundで動作している busy-waitなスレッドとISRがスワップされる。
  </p>

  <p>
    割り込み受け付けによって起動されるオペレーティングシステムや デバイスドライバのコールバックルーチン。 割り込みハンドラは割り込み原因によってそれぞれ存在し、 割り込みハンドラがそのタスクを完了するまでにかかる時間も様々である。
  </p></p>
</div>

<div id="outline-container-sec-10-1-1" class="outline-4">
  <h4 id="sec-10-1-1">
    NVIC
  </h4>

  <div class="outline-text-4" id="text-10-1-1">
    <p>
      割り込みハンドラに対応させたい関数は、 startup scriptに事前に登録しておく。
    </p>

    <p>
      vectorというメモリ領域にシステムにどの関数を実行すればいいかをアドレスとして教える。
    </p>

    <p>
      interrupt発生時は vectorを参照して、それに対応する割り込みルーチンの関数を呼ぶ。
    </p>

    <p>
      nested vectored interrupt controller (NVIC) manages interrupts, which are hardware-triggered software functions. Some internal peripherals, like the NVIC communicate directly with the processor via the private peripheral bus (PPB). The tight integration of the processor and interrupt controller provides fast execution of interrupt service routines (ISRs), dramatically reducing the interrupt latency.
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-10-1-2" class="outline-4">
  <h4 id="sec-10-1-2">
    Acknowledge
  </h4>

  <div class="outline-text-4" id="text-10-1-2">
    <p>
      割り込みをISRが認識すること。 ISRが割り込みの認識を行った後、同じデバイスからの割り込みが発生しないよう割り込みマスクをする必要がある。 そうしないと、クラッシュする恐れがある。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://d241445.hosting-sv.jp/community/report/report31.html">レポート31:割り込みサービスルーチン(ISR)の処理</a>
      </li>
    </ul>

    <p>
      実装でやってはいけないことは以下。
    </p>

    <ul class="org-ul">
      <li>
        長時間の処理はしてはいけない。
      </li>
      <li>
        待ち状態になってはいけない、Delay Loopはつかわないほうがよい。
      </li>
      <li>
        呼んではいけない関数がある。
      </li>
    </ul>

    <p>
      割り込みハンドラでは必要最小限の処理のみを行い、別のタスクに通知して、 メインの処理はそっちでさせるように実装すべき。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-10-1-3" class="outline-4">
  <h4 id="sec-10-1-3">
    ISRからメイン処理への通知方法
  </h4>

  <div class="outline-text-4" id="text-10-1-3">
    <p>
      ISRとメイン処理はグローバルなメモリ領域を介して情報を受渡しする。
    </p>

    <ul class="org-ul">
      <li>
        Binary Semaphore
      </li>
    </ul>

    <p>
      ISRで 決められたflagを立てて、メイン処理でそのフラグを監視する。 flagが1ならば、それのフラグに対応する処理を実施する。
    </p>

    <ul class="org-ul">
      <li>
        MailBox
      </li>
    </ul>

    <p>
      flagとともにデータも渡すこともある。
    </p>

    <p>
      flagをStatusといい、flagとdataを合わせたデータ構造をMailという。 (MailBox Pruducer-Consumer Pattern)
    </p>

    <ul class="org-ul">
      <li>
        FIFO queue
      </li>
    </ul>

    <p>
      ISRでFifoなメモリ領域にデータをPUTし、 メイン処理のloop処理でで定期的にFifoなdataをチェックし、順次実行する。
    </p></p>
  </div></p>
</div></p>

07 May 2014, 10:36

プログラミングの世界観を変える衝撃!Paradigms of Computer Programmingで震えるほどの知的感動を体験した

はじめに

MOOCのEdxでParadigms of Computer Programmingという講座を受けた。

感動というものを頭に走る電撃と定義するならば、 このCourseは自分にとって、まちがいなく最高の感動だった。

[toc]

内容

感動的な講義の展開

プログラム言語のパラダイムやコンセプトが紹介される。

5つのパラダイムが紹介される。

  • Functional Programming(関数型プログラミング)
  • Object-Oriented Programming(オブジェクト指向プログラミング)
  • Deterministic Dataflow Programming(決定性データフロープログラミング)
  • Multi-Agent Dataflow Programming(マルチエージェントデータフロープログラミング)
  • Active Object Programming(アクティブオブジェクトプログラミング)

感動すべきは、その講義の展開だ。

はじめに、すべてのBaseになる関数型パラダイムからスタート。

そして、関数型パラダイムに、 State(状態)という概念を追加することで、 オブジェクト指向パラダイムに発展させる!

また、関数型パラダイムに Concurrency(並行性)、Thread(スレッド)という概念をを追加することで、 決定性データフローパラダイムに発展させる!

そして、決定性データフローパラダイムに Port(ポート)という概念をを追加することで、 マルチエージェントデータフローパラダイムに発展させる!

最後に、オブジェクト指向パラダイムとマルチエージェントデータフローパラダイムを 融合させることで、アクティブオブジェクト指向パラダイムへ発展させる!

新しいパラダイムやコンセプトが紹介されるごとに、 価値観を覆す感動が自分の頭の中で電撃としてピリピリ走った。 めくるめく感動体験の連続である。

こんな体験はそうめったにできるものではない。スゴい!

情熱的なビーターバンロイさん

レクチャーをするビーターバンロイさんの語り口がとても情熱的だ。

語り口にも感動した。重要な概念になるたびに、 声の音程と強さがあがり、情熱的に語りかけてくる。感動に拍車をかける。

Oz(マルチパラダイム言語)と参考書について

Ozというマルチパラダイム言語を利用する。

個人的には、MozartがEmacsをベースにしているところがとてもよかった。Emacs最高!

しかし、Ozの文法がわからない・・。

情報元やサンプルコードが少なくて、文法を調べるのに苦労した。 概念的にわかっていてもその実装するための文法がわからず時間かかったり。 loopを書くのに2時間つかったり。参考書とforumでサンプルコード漁りまくった。

参考書

分厚くて重い。。900ページある。しかし、これがないと辛い。実はEnglishが一番難しい言語。

通称、CTM本、CTMCP本、ガウディ本というらしい。

感想

モチベーション

講座のなかでは、以下のような利点を強調してモチベーションをあげようとしている。

  • いくつものプログラミング言語がある。全てを学ぶことは不可能。
  • プログラミング言語はパラダイムで分類できる。
  • パラダイム、そこから導出れるコンセプトを抑えることで、多くの言語を理解できる!

なるほど、利にかなっている。

今は、オブジェクト指向が全盛だが、その天下もいつまで続くかは分からない。

技術が進めばマルチコアや並列処理に対応するために、それに適した言語が必要になるかもしれない。 HTMLなんかは宣言的プログラミングの典型で、オブジェクト指向ではどうにもならない。

プロフェッショナルなプログラマを目指すのならば、 オブジェクト指向だけでなくて、他の考え方も知っておきたいところだ。

また高校生のころにこんな本を読んで、とても感激を受けた。

パラダイムを学び、そしてその考えに触れることで自分の価値観が揺るがされる。 新たな世界が見えるようになる。そんな知的興奮をパラダイムは与えてくれる。

実際は、、

講座は2月からはじまったのだが、他のことが忙しくてスケジュールどおりには進められなかった。

なので、4末に講座が終了したあと、5月のGWの休みに集中して一気に勉強した。

AssignmentやExamは締切り後に解いたりして、点数にはならず。それが残念。

プログラミング言語の分類学

プログラミングパラダイムを分類したポスターが以下のサイトからダウンロードできる。

- Classification of the principal programming paradigms

今まで3つのパラダイムしかしらなかった。

  • Declarative Programming(宣言的プログラミング)
  • Procedural programming(手続き型プログラミング)
  • Object-Oriented Programming(オブジェクト指向プログラミング)

このポスターを眺めてみると、プログラミングの世界は広大であり、 自分は視野が狭かった、ほんの片鱗しか見えていなかったと思った。

そして、この講座で紹介されなかったパラダイムもまだまだたくさんあることに驚いた。 もっともっと、いろんな言語やパラダイムに触れたいと、強く思った。

ちなみに、最後にオススメ言語が紹介される。 よい言語は、広く様々なパラダイムをカバーしてていること。 その意味で、ScalaとErlangがオススメ、 C++とJavaもややマルチパラダイムだけどちょっとレガシー、だそうだ。

Coursereで紹介されたプログラムパラダイムのメモ

メモをとりながら、動画を見ていたのでそのメモ。

今まで、あまりメモはとらなかった。満員電車で動画を見ることが多かったので。 今回はGWに集中して取り組めたので、メモをとることはよいことだと思った。

以下、引用がほとんどのメモだけれども、内容が間違っているかもしれないので注意。

これはEmacs org-modeで階層的にメモをとった。 これからも、今回触れられなかったパラダイムを追加していき、 パラダイムツリーを生涯にわたって進化させていきたい。

プログラミングパラダイムとは

プログラミングパラダイムとは、プログラミングの分類方法、スコープ、見方。

なにかを定義しているようでなにもいっていない・・・詳しくはwikipedia参照。

Base Concepts

Valiables

変数の構成要素は以下の2つ。

  • 識別子(Identifier)
  • 格納域実体(Store entity)

Identifires and Store Entity

x = 1 ということはどういうことかを説明する概念。

数学的な写像関係で x = 1 を説明しようとしている。{ X -> x1=1 }みたいな感じ。 x1がメモリ上の実際の(束縛された)値で、Xがそれを指し示す識別子。

environments

識別子と変数の写像関係を環境という。

State

State(状態)とは、必要とされる計算の途中結果を含む、値の時系列。 (sequence of values calculated progressively, which contains the intermediate results of a computation)

状態の導入によって、プログラムに時間の概念を与える。

Declarative Programming

宣言型プログラミング。

第1の意味は、 処理方法ではなく対象の性質などを宣言することでプログラミングするパラダイム。 第2の意味は、 純粋関数型プログラミング、論理プログラミング、制約プログラミングの総称。

HTMLはStateless、Declarative Programming language. 状態はクッキーを導入してしばしば実現する。

Functional Programmming

Impliclite(declarative) State

暗黙的状態。宣言的状態ともいう。

  • 関数の実行結果が値をもつ
  • 同じ入力には必ず同じ出力を返す。
  • Explicite Stateとの対概念。
  • 参照透明性。

Higher-order programming

高階プログラミング。procedure valueをサポートしている言語でのプログラミング技術。 関数を引数としてわたす能力。

Rubyではlambda, procなど。C言語には関数ポインタがある。C言語は2階。

Recursion

再帰的プログラミング。

accumulater

C++の、numericライブラリ(accumuulateなど)で利用されている。

スタックのサイズが均一なことが特徴的。

tail-recursion

末尾再帰。

その中にただ1つの再帰呼び出しがあり、 かつその呼び出しが手続き本体の最後にあるもの。

invariant programming

不変式プログラミング。再帰的に呼ばれる度に、数学的に真になる式。

Imperative Programming

命令型プログラミング。 計算をプログラム状態を変化させる文の列で記述するパラダイム。

Imperative Programmingとは、Function paradigmにCellの概念を加えたもの。

  • Declarative Programingの対になる概念。 Imperative vs Declaretive is also Stateful vs Stateless
Imperative programming = Function paradigm + Cell

  • 実行するたびに、内部の状態によって結果がことなる。
  • 手続き型と同義のこともある。(Procedural programming)

手順やチェックリストはプログラムではないが、 命令型プログラミングのスタイルに似たコンセプトである。 それらのステップが命令であり、実世界が状態を保持している。

  • 械語は命令から構成される

低レベルから見た場合、 プログラムの状態はメモリの内容によって定義され、文としては機械語の命令が相当する。

Explicite State

明示的状態。

  • 生存期間が2度以上の手続的呼び出しに渡るような一つの状態。
  • 関数の実行の中に値をもつ。
  • 手続きの引数に現れないもの。

同様なことを関数型パラダイムで実現するためには、仮引数に状態を持たないといけない。

Cell

Explicite State(明示的状態)を表す基本型。二つの構成要素からなる。

  • 名前値(Vaiue)
  • 単一代入格納域への参照(Identifier)

Function ParadigmsとImperative Paradigmの違いは、

  • Function
    • 状態変化しない(Immunity)
    • 機能追加時にインタフェースの変更の影響度がおおきい。
  • Inperative
    • 機能追加時にインタフェースの変更の影響度がない。(モジュール性, モジュールプログラミング)
    • 状態変化する。

Structured programming

構造化プログラミング。

構造化プログラミングではプログラミング言語が持つステートメントを 直接使ってプログラムを記述するのではなく、 それらを抽象化したステートメントを持つ仮想機械を想定し、 その仮想機械上でプログラムを記述する。 普通、抽象化は1段階ではなく階層的である。 各階層での実装の詳細は他の階層と隔離されており、 実装の変更の影響はその階層内のみに留まる(Abstract data structures)。 各階層はアプリケーションに近い抽象的な方から土台に向かって順序付けられている。 pこの順序は各階層を設計した時間的な順番とは必ずしも一致しない(Concluding remarks)

- 構造化プログラミング - Wikipedia

標準的な制御構造のみを使い、 プログラム全体を段階的に細かな単位に分割して処理を記述していく手法。

「制御の流れ」を構造化しただけであり、 「データ構造」には何の制限や規則も設けていない。

「芸術品」から脱却して「工業製品」へ遷移すること、 あるいは、「処理性能重視」から「保守性重視」へ向かったもの。 別の見方をすれば、処理効率を犠牲にして、作りやすさや理解容易性を求めたもの。

三つの構造化文

ダイクストラが提唱。

  • 順次

順接、順構造とも言われる。 プログラムに記された順に、逐次処理を行なっていく。 プログラムの記述とコンピュータの動作経過が一致するプログラム構造である。

  • 反復

一定の条件が満たされている間処理を繰り返す。

  • 分岐

ある条件が成立するなら処理Aを、そうでなければ処理Bを行なう。

- 構造化プログラミング - Wikipedia

Object-Oriented Programming

オブジェクト指向型プログラミング。

CTMCP, Chapter 6,7

Data abstraction

データ抽象。3つの構成要素がある。

  • Input
  • Output
  • Interface

データ抽象は内部と外部からなるプログラムかつ、両者がインターフェースを通じてやりとりするもの。

A data abstraction is a part of a program that has an inside, an outside, and an interface in between The inside is hidden from the outside.

Input/Output

内部は外部からは隠蔽されている。-> カプセル化という。

The inside is hidden from the outside

Interface

The interface is a set of operations that an be used according to certain rules.

データ抽象には、主に二つの方法がある。

  • Abstract Data Type(ADT) keeps values and operations separate.
  • Object groups together value and operations in a single entity.

Encapsulation

プログラムと内部と内部をインタフェースで分けること。

カプセル化のメリットは大規模開発をシンプルにする。

  • 正しさを保証する。
  • 複雑さを解消する。

Abstract Data Type

抽象データ型。ADTと略されることも。

構造化プログラミングは仮想機械モデルに基づく段階的詳細化法(stepwise refinement)をもたらしたが、 データ構造の変更を行うと変更部分がソースコード中に散在してしまうという弱点があった。 データ抽象の概念はその欠点を補完するものであった

An ADT consists of a set of values and  a set of operations.

  • Integer型
    • Value:1,2,3
    • Operation:+
  • Stack型
    • Value: elemtent
    • Operation: push, pop, …

ValueとOperationそれ自体はStateを持たない。

CTM, p433

Diference between ADT and Object。Stackをつかった実装の違い。

  • ADT
local Wrap Unwrap in
  {NewWrapper Wrap Unwrap}
  fun {NewStack} {Wrap nil} end
  fun {Push W X} {Wrap X|{Unwrap W}} end
  fun {Pop W X} S={Unwrap W} in X=S.1 {Wrap S.2} end
  fun {IsEmpty W} {Unwrap W}==nil end
end

この手法はStateful ADTという。

そして、C言語では、こうやってデータ抽象化を行うことがおおい。 もちろん関数ポインタ配列を使えばC言語でもObjectをつくることができるが、 実際にはそこまでやらない。(面倒)

  • Object

オブジェクトでは、データに対する操作はプロシージャ変数として扱われることに注目。

fun {NewStack}
  C={NewCell nil}
  proc {Push X} C:=X|@C end
  proc {Pop X} S=@C in X=S.1 C:=S.2 end
  fun {IsEmpty} @C==nil end
in
  stack(push:Push pop:Pop isEmpty:IsEmpty)
end

オブジェクト指向言語は、 単にObjectをサポートする言語ではなくて、Abstruct Data Typeも強力にサポートしている。

ObjectとADTの意味がごっちゃにつかわれているのが現実の現状。

Object

値と操作をひとつのまとまりとしたもの。以下の構成要素をもつ。

  • 値 ・・・Explicite State(明示的状態)
  • 操作 ・・・Procedural Data Abstruction(手続的データ抽象)

以下の能力を備えている。

Data Abstruction

オブジェクトは内部と外部はインタフェースを通じてやりとりされる。

内部の明示的状態をAttributes,インタフェースをMethodsという。

Procedure Dispatch

オブジェクトは単一なエントリポイントをもつ。(エントリポイント = 呼び出し口) エントリポイントに渡される引数をメッセージという。

下の例だと、Counterがエントリポイント。エントリポイントにinc,getメッセージを送る。

   {Counter inc}
   {Counter get(X)}

エントリポイントから、メッセージに対応するプロシージャが呼びだされる。

メッセージとプロシシージャはあらかじめDispatch(バンドリング)されている。

Instantiation

オブジェクトは一つのメソッドで、 異なる属性をもつ複数のオブジェクトを生成できる。

この能力をInstantiation(インスタンス化)という。

Classes

メソッドと属性を定義する特別なシンタックスをClassという。

属性とメソッドはレコードデータ構造によって管理されているだけである!

Classという概念によって、オブジェクトの”宣言”と”生成(new)“を分離する。

Inheritance

継承。あるオブジェクトが他のオブジェクトの特性を引き継ぐこと。

Exceptions

例外。プログラムがある処理を実行している途中で、 なんらかの異常が発生した場合に、 現在の処理を中断(中止)して、別の処理を行うこと。 その際に発生した異常のことを例外と呼ぶ

よくある2つの概念。

  • try ・・・ 例外ハンドラをもつ例外補足コンテクストを生成。
  • raise・・・ もっとも内部の例外補足コンテキストへjampし、そこにある例外ハンドラを起動。

各コンテキストはスタックで管理され、tryはスタックの1つにmarkerをつける。 raiseはmarkerにジャンプしてmarkerの場所に例外処理のコンテキストを挿入する。

CTM p93参照。

例外をつかわないと、コンテクストごとの結果を検証必要があり、 case文が乱立するうんこコードが出来る。

Concurrenct Programming

複数の相互作用を及ぼす計算タスクの(同時)並行的実行をおこなうパラダイム。

平行プログラミング。(並列プログラミングではない)。

Multiple progressing activities that exist at the same time Activities that can communicate and synchronize

  • Communicate: information passes from one activity to another
  • Synchronize: an activity waits for another to perform a specific action

平行プログラミングには3つの代表的なパラダイムがある。

  • Detarministic Dataflow
  • Message-passing concurrency(Erlang and Scala actor)
  • Shared-State concurrency(Java monitors)

その他、並列実行の競合をさけるためには、以下ようなパラダイムもある。

  • Lazy Deterministic Dataflow
  • Constraint Programming

Detarministic Dataflow Programming

決定性データフロープログラミング。

関数型パラダイムをべースにしている。

スレッド処理、時間経過をともなうのにも関わらず、実行結果はつねに一定! これが、Deterministicと名づけられた所以。

Deerministic is not Obsarbable.

アイデア自体は70年代に提示されたアイデアのに、今まで忘れ去れれていた。

  • MultiCore, ManyCore Processing (マルチコア、メニーコア)
  • Destributed Computing
  • Concurrent Deployment
  • BigData Computing

以上のようなキーワードとともに、 21世紀の今こそ注目をあびるべき、次世代プログラミングパラダイム! (とピーターバンロイさんがいっていた)

CTMCP, Chapter 4

Detarministic Dataflow

Unbound Value

メモリ上に値が存在しないが、宣言された変数。

  • C/C++では、ゴミ(不定データ)が格納されている。
  • Javaは0初期化されている。
  • Prologは実行時にエラー終了する。
  • Ozは値がbindされるまでまちあわせる。

DataFlow Value

Unbound Valueがbindされるまでプログラムの実行を待ち合わせるような宣言的変数。

Bindされたときの実行を Dataflow Executionという。

このデータフロー変数によって、No Race Conditions(非強豪状態)を実現する! (これがもっともこのパラダイムで大事)

Threads

プログラムの処理の単位(Thread of Program)

  • Each thread is sequential.
  • Each thread is independent of the others.
  • Two threads can communicate if they share a variable

WikipediaではCPUのひとつの処理単位と定義されている。

- スレッド (コンピュータ) - Wikipedia

Streams

リストの終端がUnbound Variableであるもの。

Streamsは2つのThread間の通信チャネルとして利用できる。

Streamの構成要素は以下。

  • Producer ストリームのデータを生成。
  • Consumer Producerから生成されたストリームのデータを受け取ってアクションを起こす。
  • Transformer ProducerとConsumerとの間を仲介する。
  • Pipeline ProducerとConsumerとTransformerの間を仲介する。

単一格納変数(single-assined value)の性質(一度しか代入できない) を同期のスレッド間通信のための手段にする。

平行スレッドのなかでStreamを読み書きするものをAgentsという。

  Produce ———-> Transformer ——–> Consuemer

NonDeterminism

非決定性。プログラムの実行結果を決定ことができるシステムの能力。

Nondeterminismはmanagedされることが必須! しかし、制御がとても難しい。 だからこそ、Determinismが重要なのだと。

Scheduler

どのスレッドを実行するかを決める、システムの一部をスケジューラという。

Concurrency Transparency

平行透過性。

複数のユーザーが1つのリソースを共有して使用するとき、 それらユーザーに競合状態を気づかせてはならない。

concurrency for dummies

平行性のためのダミースレッド。

平行透過性のためには、いくらスレッドを動的に追加しようとも、削除しようとも、 最終的に得られる結果はかわらない(Deterministic!)

それは、スレッドの各処理をincrementalに動作させることで可能となる

Multi-agent dataflow programmming

マルチエジェーントデータフロープログラミング。

Concurrency を解決するためのいろいろなパラダイムのなかで、 最強のパラダイムがこれだとピーターバンロイさんはいう。

なぜなら、Deterministic Dataflow Programmingをベースに、 NonDeterminismの制御を機能追加したから。

(Deterministic Dataflow Programmingに、Portという明示的状態をくわえた)

Distributed Systemともいう。

CTMCP, Chapter 5

Port

ボート。Named Steram.名前のつけられたストリーム。

以下の操作をもつ、Abstruct Data Structure。

  • Port Creation
  • Message Sending
    • Asyncronize
    • Syncronize

Agents

通信モデルは大きく2つに分けられる。

  • Client-Server Architectures
  • Pear-to-Pear Architectures

Client,Server,PearをAgentという。

以下の構成要素をもつ。

  • have identity … mail address
  • recieve messages … mailbox
  • process messeges … orderd mailbox
  • reply to messeges … pre-addressed return letter

エージェントは独立実体で、自身の局所的な目的を目指して仕事をする。 相互作用が適切に設計されていればエージェントは大局的仕事も達成する。

CTMCP, Chapter 5より。

Agentをもちいるプログラミングを、 Object-Oriented Programmingと対比されて、 Agent-Oriented Programmingということもある。

ただし、Agentは必ずしもObjectでなくてもよい。2つのうちのどちらか。

  • Object
  • Transition state-functions

Coordinator

AgentのなかでほかのAgentをまとめるAgentをCoordinatorという。以下の性質をもつ。

  • 代理性 ・・・他のAgentの代理をして処理をおこなう。処理の結果をAgentに通知。
  • 知性 ・・・ 他のAgentから情報をあつめを代表して判断を下す。
  • 移動性 ・・・他のAgentを代表して判断を下す。

Master(Coordinator)-Slave Archtecture.

Stateless Agent

あるメッセージを受信したときに、そのメッセージに応じてアクションをとるAgents. アクションは受信メッセージに依存する。

Agentはひとつのスレッドと複数のポートをもつ。ボートは明示的変数(Cell)と同義。

このPort以外はImmutableなデータ構造。Portのみがメモリ上に確保される。

State with Agent

ポートの他にState(明示的状態)をもつこともある。

処理の実行自体はStreamデータ構造に入ったfunctionのプロシージャごとに実施する (Immutable and incremental)が、StateによってReplyの方法を変える。

Protocol

Messageの送信と受信のルール。

- 通信プロトコル - Wikipedia

プロトコルにしたがうことで、デッドロックを防ぐ。

BroadCast

他の複数のエージェント(Multi-Agent)に通信を送る。

Contract Net

Ozma

Multi-agent dataflow programmmingを実現するための言語。ScalaとOzを合体させた。

ピーターバンロイさん直々の説明動画は以下で見れる。

github repository.

Active Objects Programming(Object-Based Agent)

オブジェクト指向におけるオブジェクトを、 自ら判断し処理できる機能を持ったエージェントと呼ばれるモジュールに 置き換えたもの。

Object-Oriented Programming とMulti-Agent Programmingの2つのパラダイムを 合体させてできたパラダイム。

オブジェクトの属性ではなくて振る舞いが重要視される。

EnglishのWikipediaに OOPとAOPの対応比較表がある。