ひらめの日常

日常のメモをつらつらと

MacOSアップデート後、gccが壊れたので直した

結論

  • MacOS をメジャーアップデートしてたら、CommandLineTools をアップデートしましょう
  • CommandLineTools がアップデートできない場合、以下の手順でインストールし直しましょう

    >> rm -rf /Library/Developer/CommandLineTools
    >> xcode-select --install 
    

環境

  • macOS Big Sur 11.4
  • gccbrewでインストールしていた

経緯

きっかけは競技プログラミングの問題を1年ぶりに解こうとしたとき

  >> g++-11 -D_GLIBXX_DEBUG ./main.cpp
  In file included from /usr/local/Cellar/gcc/11.2.0_3/include/c++/11/x86_64-apple-darwin20/bits/stdc++.h:33,
                   from ./main.cpp:1:
  /usr/local/Cellar/gcc/11.2.0_3/include/c++/11/cassert:44:10: fatal error: assert.h: No such file or directory
     44 | #include <assert.h>
        |          ^~~~~~~~~~
  compilation terminated.

ヘッダーファイルが見つからずコンパイルに失敗していました。

gcc, g++ は想定した通り brew でインストールした先を指しています。

  >> which gcc
  /usr/local/bin/gcc
  >> which g++
  /usr/local/bin/g++

もう少し細かくコンパイラのオプションを見てみます。

  >> g++-11 -v
  Using built-in specs.
  COLLECT_GCC=g++-11
  COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/11.2.0_3/bin/../libexec/gcc/x86_64-apple-darwin20/11/lto-wrapper
  Target: x86_64-apple-darwin20
  Configured with: ../configure --prefix=/usr/local/opt/gcc --libdir=/usr/local/opt/gcc/lib/gcc/11 --disable-nls --enable-checking=release --with-gcc-major-version-only --enable-languages=c,c++,objc,obj-c++,fortran,d --program-suffix=-11 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl --with-zstd=/usr/local/opt/zstd --with-pkgversion='Homebrew GCC 11.2.0_3' --with-bugurl=https://github.com/Homebrew/homebrew-core/issues --enable-libphobos --build=x86_64-apple-darwin20 --with-system-zlib --disable-multilib --with-native-system-header-dir=/usr/include --with-sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk
  Thread model: posix
  Supported LTO compression algorithms: zlib zstd
  gcc version 11.2.0 (Homebrew GCC 11.2.0_3) 

ここでコマンドラインツールを指定しているようです。
--with-sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk 。一応存在しているか見てみます。

  >> ls /Library/Developer/CommandLineTools/SDKs/
  .              ..             MacOSX.sdk     MacOSX10.15.sdk

...ないですね...

ここで思い当たったのが、MacOSのメジャーアップデートです。かなり前にやっていたのですが、CommandLineTools の更新はしていませんでした。しかも、その後に gcc のアップデートをしています。よって、gcc は最新のOSバージョンを見て CommandLineTools を探していたのかと推測されます。その一方、ローカルには古いOSバージョンの CommandLineTools しかなかったため、ヘッダーを見つけることができなかったと思われます。(ここは自分の推測なので、間違っていたらご指摘ください!)

f:id:thescript1210:20211226213608p:plain:w700
これが

f:id:thescript1210:20211226213637p:plain:w700
こうなった

解決

xcode-select --install はすでにインストールされているとの表示。

  >> xcode-select --install
  xcode-select: error: command line tools are already installed, use "Software Update" to install updates

言われた通りsoftwareupdateを見てもコマンドラインツールのアップデートは存在していませんでした。

そこで、無理矢理コマンドラインツール一式を削除し、インストールし直すことを試します。

  >> rm -rf /Library/Developer/CommandLineTools
  >> xcode-select --install
  xcode-select: note: install requested for command line developer tools

このログが出ますがインストールされません。

よくわからないのですが、OSが最新バージョンではないためでしょうか。More - Downloads - Apple Developerから最新版をダウンロードしたところ、無事にコンパイルができました...!

参考

この辺を大変参考にさせていただきました。

【因果推論】バックドア基準とフロントドア基準

バックドア基準とフロントドア基準

こちらの第3章後半です

バックドア基準

何をしたいか

DAGで表現された因果モデルにおいて、任意の2変数の因果関係を知りたいとする。この時、どの変数集合を条件付けすれば因果関係を知ることができるかが重要になる。バックドア基準を使うことで、どの集合について条件付けすべきかを知ることができる

2変数 XY の因果関係を知りたいとする。条件付けする集合を Z とする。

どのように Z を選べば良いだろうかを考える。すると、以下の条件を満たす Z を選んでくるのが良いとわかる。

  • XY の間の擬似パスを全てブロックする
    • X に入ってくる矢印はブロックしたい。なぜなら、これは X からの因果関係に寄与していないが、XY を従属にしている可能性があるから。
  • X から Y への有向道はブロックしない
    • X の子孫についても条件付けしない。なぜなら、 X の子孫から Y に向かって影響を及ぼしている可能性があるため。これをブロックしてしまうと、本来なら X から Y に向かっていた因果関係までがブロックされてしまうかもしれない。
  • 新しい擬似パスを作成しない
    • これは、条件付けする前は独立だったのに、条件付けによって従属になってしまうケースを避けることと同義。つまり、XY の間に新たに道を開くような合流点について条件付けしないということ。

バックドア基準の定義

上記を満たすような集合 Z は、以下に示すバックドア基準を満たしていれば良い。

  • Z に含まれるいかなるノードも X の子孫ではなく、
  • XY の間で X に向かう有向道全てを Z がブロックするとき、
  • この時、ZX, Y についてバックドア基準を満たすという。

Zバックドア基準を満たす時、XY に及ぼす因果効果は以下で得ることができる。

{
P(Y=y|do(X=x)) = \sum_{z}P(Y=y |X=x, Z=z)P(Z=z)
}

具体例

以下のようなグラフを考える。

f:id:thescript1210:20211226121619p:plain:w500
  • X: 新薬を使用するかどうか
  • Y: 回復したかどうか
  • W: 体重
  • Z: 測定されない変数(社会経済的状況など)

ここで薬がどれだけ回復に影響があるかを調べたいとする。つまり X から Y への因果関係を知りたい。この例では、W で条件付けをすればバックドア基準を満たすことがわかる。

  • WX の子孫ではない。
  • WX\leftarrow Z \rightarrow W \rightarrow Y をブロックしている。

よって調整化公式を使い、以下で新薬を使用したかどうかの確率を得ることができる。

{
P(Y=y|do(X=x)) = \sum_{w}P(Y=y|X=x, W=w)P(W=w)
}

フロントドア基準

何をしたいかと具体例

バックドア基準を満たさないグラフでも、因果関係を計算できる方法がある。そのうちの一つがフロントドア基準である。

以下のようなグラフを考える。

f:id:thescript1210:20211226121710p:plain:w500
  • U: 観測されない交絡因子。今回は遺伝子型とする
  • X: 喫煙しているか否か
  • Z: タール蓄積があるかどうか
  • Y: 肺がんかどうか

このグラフで X から Y への因果関係を知りたいとする。この時、U は観測できず、ZX \leftarrow U \rightarrow Y をブロックしていないのでバックドア基準を満たさない。

まず XY に及ぼす効果は以下で表される。

{
P(Y=y | do(X=x)) = \sum_{z} P(Y=y|do(Z=z))P(Z=z|do(X=x))
}

気持ちとしてはこんな感じ。

  • Zz に固定された時に Y に及ぼす効果は P(Y=y|do(Z=z)) で表される
  • その z が生じるのは、Xx に固定された時の効果 P(Z=z|do(X=x)) で表される
  • よって、X からの効果に注目するのであれば、全ての Z に関して総和を取れば良い。

次に、XZ に及ぼす効果は計算できる。

{
P(Z=z|do(X=x)) = P(Z=z|X=x)
}

さらに、ZY に及ぼす効果も計算できる。なぜなら、X について条件付けすることで Y への道をブロックできるから。

{
P(Y=y|do(Z=z)) = \sum_{x}P(Y=y|Z=z, X=x)P(X=x)
}

これら二つより、XY に及ぼす効果は do オペレータなしで以下のようのに表すことができる。

{
\begin{eqnarray}
P(Y=y | do(X=x)) &=& \sum_{z} P(Y=y|do(Z=z))P(Z=z|do(X=x)) \\
&=& \sum_{z}\sum_{x '} P(Y=y|Z=z, X=x ')P(X=x ') P(Z=z|X=x)
\end{eqnarray}
}

この式は フロントドア公式 と呼ばれる。

フロントドア基準の定義

変数の集合 Z が以下の条件を満たすとき、Z は2変数 X, Y についてフロントドア基準を満たすという。

  • ZX から Y への有向道を全てブロックする
  • X から Z へのバックドアパスは存在しない
  • Z から Y への全てのバックドアX によってブロックされている

Z がフロントドア基準を満たすとき、XY に及ぼす因果効果は以下で得ることができる。

{
P(y|do(x)) = \sum_{z}P(z|x) \sum_{x'} P(y|x', z)P(x')
}

【因果推論】介入と調整化公式

介入と調整化公式

こちらの第3章前半です。

介入とは

介入によってある変数の値を固定するということは、その変数が自然に変化する余地をなくすということである。つまりグラフィカルモデル上は、固定した変数に入ってくるエッジを全て取り除く操作を行う。

f:id:thescript1210:20211225185827p:plain:w500

条件付けした(観測した)場合と、介入した場合とではグラフィカルモデルの依存関係が全く異なることに注意が必要。

変数 X=x に固定する場合を do(X=x) と表記する。つまり、以下のような違いが生じる。

  • P(Y=y|X=x)X=x で条件付けした場合に Y=y となる確率を表す。
  • P(Y=y|do(X=x)) は介入により、X=x で固定された場合に Y=y となる確率を表す。

調整とは

調整化公式

以下のような図を考える。

f:id:thescript1210:20211225185945p:plain:w500

変数はそれぞれ以下を表している。

  • X: 薬の投与
  • Y: 回復
  • Z: 性別

新薬がどれほど効果的かを調べたい。この時は、以下のようなステップで推定を行う

  1. 患者全員に新薬を投与する介入を仮定する。これを do(X=1) とする。
  2. 患者全員に薬を投与しない介入を仮定する。これを do(X=0) とする。
  3. ここでの目的は、平均因果効果(ACE: average causal effect)を推定することである。
    {
P(Y=1|do(X=1)) - P(Y=1|do(X=0))
}

因果効果 P(Y=y|do(X=x)) は、次図のようにグラフィカルモデルを修正した場合における条件付き確率、P_{m}(Y=y|X=x) に等しい。

f:id:thescript1210:20211225190019p:plain:w500

まずは、介入前後で影響を受けていない確率があり、以下の二つの等式が成り立つことに注意する。

{
P_{m}(Y=y|Z=z, X=x) = P(Y=y|Z=z, X=x) \\
P_{m}(Z=z) = P(Z=z)
}

また、修正後のモデルにおいて ZX はd分離されているので、独立である。これらのことより、

{
\begin{eqnarray}
P(Y=y|do(X=x)) &=& P_{m}(Y=y|X=x) \\
&=& \sum_{z}P_{m}(Y=y|X = x, Z = z)P_{m}(Z=z | X = x) \\
&=& \sum_{z}P_{m}(Y=y|X=z, Z=z)P_{m}(Z=z)
\end{eqnarray}
}

最後に介入前後で確率が変わらないことに注意すれば、因果効果を修正前のモデルに表れている確率を使って表現することができる。

{
P(Y=y|do(X=x)) = \sum_{z}P(Y=y | X=x, Z=z)P(Z=z)
}

この式は 調整化公式 と呼ばれる。

Simpsonの例

薬投与 薬投与なし
男性 81/87が回復 (93%) 234/270が回復 (87%)
女性 192/263が回復 (73%) 55/80が回復 (69%)
合計 273/350が回復 (78%) 289/350が回復 (83%)

男女別で見ると薬を投与した方が回復率が高いが、男女合わせて回復率を見ると、なんと薬を投与した方が回復率が下がるという結果になっている。これは実は前の画像のように、薬に関係なく女性の方が男性よりも回復しにくいという、「性別」という変数が影響を及ぼしている事による。

調整化公式を早速当てはめて考えてみる。ここで、X=1 は薬が投与されたこと、Z=1 は患者が男性であること、Y=1 は患者が回復したことを表す。

{
\begin{eqnarray}
P(Y=1 | do(X=1)) &=& P(Y=1|X=1,Z=1)P(Z=1) + P(Y=1|X=1,Z=0)P(Z=0) \\
&=& 0.93\frac{87 + 270}{700} + 0.73\frac{263+80}{700} \\
&=& 0.832 \\


P(Y=1| do(X=0)) &=& 0.87\frac{87+270}{700} + 0.69\frac{263+80}{700} \\
&=& 0.7818
\end{eqnarray}
}

よって、薬を投与した場合の方が明らかに回復することへの効果が高い。これは、単純に男女合計の比率を比べるだけと違って、男女別に確率を計算した後に性別の人数で加重平均を取ることを表している。

調整化公式まとめ

Xの親をPAとすると、XがYに及ぼす因果効果は、以下で与えられる。

{
P(Y=y | do(X=x)) = \sum_{z}P(Y=y|X=x, PA=z)P(PA = z)
}

この分母と分子に P(X=x|PA = z) をかけることで以下を得る。

{
P(y|do(x)) = \sum_{z}\frac{P(X=x, Y=y,PA=z)}{P(X=x|PA=z)}
}

P(X=x|PA=z)傾向スコア と呼ばれる。

トランケート乗法公式

一般的に変数の集合Xについて介入し値を固定した場合、その固定した値が現れる項を取り除けば良い。

{
P(x_{1},x_{2},...,x_{n}|do(x)) = \prod_{i} P(x_{i}|pa_{i})\\
\forall{i}: x_{i} \notin X
}

この公式を トランケート乗法公式 もしくはg推定公式と呼ぶ。

【因果推論】条件付き独立性とD分離

条件付き独立性と d-separation

グラフィカルモデルの基礎的な概念です。

構造的因果モデル

因果関係を適切に扱うために、データにある因果の仮定を記述する方法が必要になる。それが 構造的因果モデル (SCM: Structual Causal Model)。構造的因果モデルの構成要素は次の通り

  • 変数の外生集合 U。モデルの外部に存在し、どのようにして発生するかは説明されない。他の変数の子孫とはならない。
  • 変数の内生集合 V。モデルの内部に存在し、他の変数の子孫となっている。
  • モデル内の他の変数によって、Vの値を決定する関数の集合 f

グラフィカルモデル

これを視覚的に表したのがグラフィカル因果モデル(通称グラフィカルモデル)。グラフィカルモデルの大きな利点として、視覚的に因果関係を捉えることができることはもちろんだが、同時分布を効率的に記述できるということがある。

非巡回なグラフにおけるモデルでは、それに含まれる変数の同時分布は、P(child|parent)を全てのノードに対して掛け算することで得られる。これはグラフィカルモデルの因数分解などと呼ばれる。具体的には、pa_i を変数 x_i の親の変数として以下のように表される。

{
P(x_1, x_2, x_3,...,x_n) = \prod _ {i} P(x _ {i}|pa_{i})
}

これにより、全ての変数の組み合わせを爆発的に数えるのではなく、関連があるところの条件付き分布を適切に取り出して掛け算をすればよくなる。高次元の推定問題を、いくつかの低次元の問題に置き換えることができる。

条件付き独立性とは

3変数 a, b, c を考える。条件付き独立性とは、以下が成り立つことを指す。

{
p(a,b | c) = p(a|c) p(b|c)
}

これは、以下のように表すこともある。

{
\newcommand{\indep}{\mathop{\perp\!\!\!\!\perp}}


a \indep b \ | \ c
}

噛み砕くと、aとbはcに依存していて、cの値によってそれぞれ変化するかもしれない。この場合、aとbは従属である。しかしcが固定されているならば、aの値が変化してもcの値には影響はない。つまりbの値にも影響はないので、aとbは条件付き独立となる(かえってわかりずらい??)。

基本的な例

tail-to-tail (分岐経路)

f:id:thescript1210:20211220095610p:plain:w500

この同時分布は次のようになる。

{
p(a, b, c) = p(a|c)p(b|c)p(c)
}

cに関して周辺化してもaとbは因数分解できないので、独立ではない。

{
p(a, b) = \sum_{c}p(a|c)p(b|c)p(c)
}

しかしここでcが観測された場合、aが変化してもcは変化せず、bに影響を及ぼさない。よって、「aとbはcのもとで条件付き独立」である。

{
\begin{eqnarray}
p(a, b | c) &=& \frac{p(a, b, c)}{p(c)} \\
 &=& p(a|c)p(b|c)
\end{eqnarray}
}

head-to-tail (連鎖経路)

f:id:thescript1210:20211220095550p:plain:w500

この同時分布は次のようになる。

{
p(a, b, c) = p(b|c)p(c|a)p(a)
}

cに関して周辺化してもaとbは因数分解できないので、独立ではない。

{
p(a, b) = p(a) \sum_{c}p(c|a)p(b|c) = p(a)p(b|a)
}

しかしここでcが観測された場合、aが変化してもcは変化せず、bに影響を及ぼさない。よって、「aとbはcのもとで条件付き独立」である。

{
\begin{eqnarray}
p(a,b|c) &=& \frac{p(a, b, c)}{p(c)} \\
&=& \frac{p(b|c)p(c|a)p(a)}{p(c)} \\
&=& p(b|c)\frac{p(a, c)}{p(c)} \\
&=& p(b|c)p(a|c)
\end{eqnarray}
}

head-to-head (合流点)

f:id:thescript1210:20211220095659p:plain:w500

この同時分布は次のようになる。

{
p(a, b, c) = p(a)p(b)p(c|a, b)
}

これはcに関して周辺化するとaとbに因数分解できるので、独立。

{
p(a, b) = p(a)p(b)
}

しかしここでcが観測された場合、aが変化するとcは変化しないため、bもそれに伴って変化する必要がある。よって、「aとbはcのもとで条件付き独立ではない」

{
\begin{eqnarray}
p(a, b|c) &=& \frac{p(a, b, c)}{p(c)} \\
 &=& \frac{p(a)p(b)p(c|a, b)}{p(c)}
\end{eqnarray}
}

ノードcが観測されていない時、このノードはaとbの経路を遮断していると呼ばれる。

有向分離 (D分離)

現実のグラフィカルモデルは上記の例よりも難解で、それを独立な部分に分解することが求められる。その時に重要なのが、D分離という概念である。

pがノードの集合Zにより遮断されている(=D分離されている)とは、以下の条件のうちいずれかを満たしている場合と同値である。

  • pは head-to-tail もしくは tail-to-tail を含み、その中央のノードが集合Zに含まれる場合
  • pは head-to-head を含み、合流点が集合Zに含まれない。さらに、そのいかなる子孫もZ含まれない場合

例えば、以下のグラフでaとbが条件付き独立となるかどうかを考える。cが観測されている場合、集合  {e} によって遮断されない。cは合流点eの子孫であり、D分離の二つ目の条件に反するからである。(cが観測されたなら、cとeが従属。そのもとではaとfが従属になる。bはfに従属なので、aとbは従属となる。)

f:id:thescript1210:20211220101051p:plain:w500

ここでfが観測されたとする。すると、集合  {f} によってaとbは遮断され、条件付き独立となる。fは tail-to-tail の中心ノードであり、D分離の一つ目の条件に当てはまるためである。(fが観測されたなら、eとbは独立。よって、aとbは独立となる。)

f:id:thescript1210:20211220101555p:plain:w500

参考

『OECD Education2030 プロジェクトが描く教育の未来』を読んだ

概要

この本は、タイトルの通り OECD Education2030プロジェクトに関する解説が主となっています。これから、より不確実性の増す、見通しの立たない2030年に必要となるコンピテンシー、そしてそれを育むためのカリキュラムの方向性を定めたのが、このプロジェクトです。

この本の筆者は文部科学省という立場からこのプロジェクトに関わっており、日本という立場からこのプロジェクトにどのように影響を及ぼしたか、日本の立場から見たプロジェクトの中身について、筆者ならではの視点から解説が加わっているのも特徴です。

感想

特に本の前半にあたる4章までが、コンピテンシー・エージェンシー・ラーニングコンパスといった重要単語の解説になっており、個人的に強く印象に残ったところでした。

後半のEducation2030プロジェクトにおけるカリキュラム分析の話では、カリキュラムは「意図されたカリキュラム・実施されたカリキュラム・達成されたカリキュラム」の三つに分割することができ、それぞれの齟齬をどうやって減らしていくかについて言及されていたのが興味深かったです。

その実現方法の一つとして「カリキュラムの策定を分権化し、地方や教室など生徒に近いレベルで策定が可能にする」という案があるが、それは「生徒間や地域間での公平が担保されずに学力に差がついてしまう」と論じられていた点については、まさに最近のICT教育やGIGAスクール構想でも同じことを最近感じているところだなーと感想を持ちました。

特に印象に残ったところ

自分が特に印象に残ったところのみまとめました。詳細は原著を参照ください。

DeSeCoによるコンピテンシーの概念

コンピテンシーは、「ある職務または状況に対し、基準に照らして効果的、あるいは卓越した業績を生む原因として関わっている個人の根源的特性」と定義されることもあったが、さまざまな研究により定義が曖昧になっていた。

そこで、コンピテンシーは1997年に、OECD Educationプロジェクトの前身である DeSeCo (Definitions and Selections of Competencies) プロジェクトで取り上げられ、様々な形で解釈・定義されていたコンピテンシーの概念を整理することが行われた。

DeSeCo が考えるコンピテンシー概念の特徴は以下の2点となる。

  1. 統合的な視点に立つこと:大切なのは、ここの知識やスキルを必要な場面で組み合わせて発揮していくこと
  2. 文脈に即して捉えること:ある状況の中で求められていることに呼応した行動を重視すること

しかしこの特徴に合致するコンピテンシーというものは、多種多様なものが考えられるので、DeSeCo ではこの中から中核となるものを抽出する作業が行われた。その際の基準は以下の通り。

  1. 学習可能であること
  2. さまざまな文脈における重要で複雑なニーズを満たすために役立つこと
  3. 誰にとっても重要であること
  4. メタ認知など高次のスキルを含むこと
  5. 社会的に高い価値が認められる結果につながること

最終的には、以下のように三つのキー・コンピテンシーが掲げられることとなった。

  1. 異質な人々から構成される集団で相互に関わり合う力
  2. 自律的に行動する力
  3. 道具を相互作用的に用いる力

また、このキー・コンピテンシーの枠組みの中心には、省察・思慮深さが置かれており、メタ認知的な技能が重要であるという観点が反映されている。

https://www.nier.go.jp/04_kenkyu_annai/images/key-ver2-2.jpg 図は 国立教育政策研究所 - 研究案内 - 生涯学習政策研究部 より引用

コンピテンシーと日本の学習指導要領

2017年から2018年にかけて行われた日本の学習指導要領改訂も、コンピテンシー重視の動きに連なるものであった。
日本の学習指導要領において、コンピテンシーに当たる「資質・能力」という言葉を採用し、その資質・能力を「知識・技能」「思考力・判断力・表現力等」「学びに向かう力・人間性」という3つの柱で構成している。

学習指導要領:校内研修シリーズ No9|NITS 独立行政法人教職員支援機構 も参考のこと

Education2030 プロジェクトの目的

二つのテーマが掲げられている。

  1. 生徒が未来を生き抜き、世界を作っていくためには、どのような知識やスキル、態度及び価値観が必要になるのか
  2. 教育システムは、どのようにして、これらの知識やスキル、態度及び価値観を効果的に育成することができるのか

前者は「何を」に焦点が当てられており、後者は「どうやって」に焦点が当てられている。

ラーニングコンパス

ラーニング・コンパスは、幅広い教育の目標を支え、『私たちが実現したい未来』、すなわち個人及び集団としてのウェルビーイングの実現に進んでいくための方向性を示すものである

また、生徒が自分で道筋を選び、未知の状況においても自らの力で切り開いていけることを意図して、「コンパス」という表現が選ばれた。

f:id:thescript1210:20211027003057p:plain

画像はOECD_LEARNING_COMPASS_2030_Concept_note_Japanese.pdfより引用

  • コンパスの針の部分に、コンピテンシーの構成要素として、知識・スキル・態度及び価値観が示されている
  • コンパスの円周の内側に、リテラシーやニューメラシーなどの発達の基盤が示されている
  • コンパスの円周の外側に、変革をもたらすコンピテンシーが示されている
  • このコンパスの外周を装用にして、AARサイクルが示されている
    • AARサイクルとは、見通し→行動→振り返りの一連の流れのこと
  • こうしたラーニング・コンパスを用いる上で重要な「生徒のエージェンシー」と目標として「2030年のウェルビーイング」が示されている
    • 2030年のウェルビーイングとは、経済的指標を高めることのみではなく、包括的に人間が心身ともに幸せな状態に移行することを目標としている。

ラーニング・コンパスは評価やカリキュラムの枠組みではなく、「学習枠組み」として強調される。これはつまり、学習が学校だけで行われるのではないという、脱学校的な思想を含むものである。家庭や地域コミュニティを含めたさまざまな場面全体を通して、生徒のコンピテンシーは育まれることを意味している。

エージェンシー

エージェンシーとは、「変化を起こすために、自分で目標を設定し、振り返り、責任を持って行動する能力」として定義されている。

エージェンシーには、「エージェンシーというコンピテンシーを育成する目標としてのエージェンシー」と、「コンピテンシーを育成するプロセスとしてのエージェンシー」の二つの側面があるとされている。エージェンシーは一種のコンピテンシーであり、人は幼少期から自己を発達させ、エージェンシーを獲得していく。その一方で、エージェンシーを発揮することで、自らの学習をより良いサイクルとして改善していくことができる。

生徒のエージェンシーは一人で育まれるものではなく、周囲の人や環境の中で育まれていく。そのためには周囲の人々とともにエージェントを発揮することが必要である。こうした他者とともに発揮するエージェンシーのことを共同エージェンシーと呼ぶ。他者の発想を活用したり、視点を共有したりすることがより一層求められる状況となる。

教師はもちろん、周囲のコミュニティの大人全員が、生徒のエージェンシーを育むんでいくことについて、責任を持ち、生徒とともに共同エージェンシーを発揮することが期待されている。

2030年に求められる知識の類型

教科横断的な知識

よりVUCA(不確実性の高い、将来を予測することが困難)な2030年の世界において、複雑な問題に対処するためには、各教科を超えた横断的な思考が必要になる。教科横断的な知識は、ある知識を他の分野へと転移するために必要な知識となる(教科横断的な知識は、より基礎的な「教科の知識」の基盤の上に成り立つということは忘れてはならない)。ここで、転移とは、すでに学んだことを新しい場面や文脈で使用できる状態のことを指す。

こうした教科横断的な知識を育成するためのカリキュラム上の工夫がいくつか紹介されていたので取り上げる。

  • キー・コンセプトやビッグ・アイディアに関する学習
  • 概念相互の関係性の特定
  • テーマに沿った学習
  • 教科科目の再編統合や新設
  • プロジェクト型学習(PBL)

エピステミックな知識

エピステミックな知識とは、各教科の学問原理をどう捉えるかという考え方や手続きに関する知識。これを獲得することで、生徒は学習の目的を見つけたり学習をどのように適用するかについて理解できる。

日本の学習指導要領では各教科固有の「見方・見え方」がエピステミックな知識とほぼ同義のものとして使用されている。

変革をもたらすコンピテンシー

DeSeCo で定義されたキー・コンピテンシーは2030年の時代においても重要なものとして認識されているが、時代に応じて求められるキー・コンピテンシーも変化すると考えられる。ラーニング・コンパスでは、以下の3つを「変革をもたらすコンピテンシー」と名づけ、2030年の新たなキー・コンピテンシーを位置付けている

  1. 新たな価値を創造する力
  2. 対立やジレンマに対処する力
  3. 責任ある行動を取る力

『Java言語で学ぶデザインパターン入門』を読んだ

ずっと前から教養としてデザインパターンを勉強せなばと思っていてこの本を読みましたので、感想を残しておきます。

Javaは自分が最初に学んだ言語というのもあったし、基本的なインターフェースや抽象クラスあたりの知識があればよかったので、読み進めることができました。

4年前は「Bridgeパターン?何それ?」と思ってissueにメモったりしてたのですが、結局何も理解していませんでした...

4年越しに読んでみると、「機能クラスの階層」と「実装クラスの階層」を分けることのありがたみを理解することができました。やはりコードを書いていくうちに、拡張性などが課題となった経験を重ねて、実際に使う時のイメージが湧きやすくなったからだと思います。

GoFデザインパターンはもちろん、自分の知らなかった新しい単語についても学ぶことができました。

ダブルディスパッチとVisitorパターン

ダブルディスパッチとは、メソッドの引数に渡されたオブジェクトに対して、自分自身を引数として別のメソッドを実行する方法。Scalaだとこんな感じ

class A {
  def foo(b: B): Unit = {
    b.bar(this)
  }
}

Visitorパターンはこのダブルディスパッチの応用。Visitorパターンは、実際のデータ構造と、それに対する処理を分離するのが目的。この本では、ファイルとディレクトリの走査を例としていた。「実際のデータ構造」=「ファイルやディレクトリ」、「それに対する処理」=「走査」でありそれを行うのがVisitor。

まず、Visitorはデータ構造を訪問する visit メソッドを、それぞれのオブジェクトに対して実装する。

trait Visitor {
  def visit(file: File): Unit
  def visit(directory: Directory): Unit
}

そして、訪問者を受け入れるElementはインターフェースとして accept メソッドを持つ。この accept の中でVisitorの visit メソッドを呼び出す。

trait Element {
  def accept(v: Visitor): Unit
}

こうすることによってVisitor側では、(1)visitする対象によって具体的な処理を変更することができる (2) Visitorの具体的な実装によって、それぞれ処理を変更することができる。

そしてElement側では、Elementの具体的なオブジェクトに応じて、Visitorを受け入れた時にそのVisitorをどのように伝播させていくかを変更することができる。

Scalaで実装した詳細はこちらの Github を参照してください

github.com

参考:ダブル・ディスパッチ~ 典型的なオブジェクト指向プログラミング・イディオム ~

intrinsic/extrinsic

  • intrinsicな情報:共有させる情報。主に場所や状況に 依存しないもの
  • extrinsicな情報:共有させない情報。主に場所や状況に依存するもの

今まで暗黙知的に実装していたパターンに名前がつくと、引き出しから取り出しやすくなるし、他の人とのコミュニケーションもスムーズにいきそうですね。

Scalaでのデザインパターンは、関数型プログラミングの影響も受けているので、以下の本を読んだりして別途勉強したいです。

追記:会社の勉強会で読むことになりました!

【Scala】リスコフの置換原則と共変反変

SOLID原則の一つであるリスコフの置換原則と、それに関係の深いScalaにおける共変反変について理解が浅かったのでまとめてみました。まとめてみたものの、いまだにわかりづらいのでまたアップデートします。

リスコフの置換原則

リスコフの置換原則 (LSP) とは、全てのクラスやサブクラスを確実に使用できるような継承階層を作成するための決まり。これに従っていないと、派生クラスを実装する際に、基底クラスやインターフェースの変更が生じる可能性がある。

SがTの派生型であるとすれば、T型のオブジェクトをS型のオブジェクトと置き換えたとしても、プログラムは動作し続けるはずである。

置換原則に従うためのルール

  • 事前条件を派生型で強化することはできない。
    • これはメソッドの引数に関係している。
    • メソッドの引数は反変である必要がある。
  • 事後条件を派生型で緩和することはできない
    • これはメソッドの返り値に関係している。
    • メソッドの返り値は共変である必要がある。
  • 基底型の不変条件は、派生型でも維持されなければならない

Scalaにおける変位指定アノテーション

共変 (covariant)

A extends Bの時のみ

val G[B] = G[A]

という代入が許される性質を表す。

class G[+A]

のように型パラメータの前に + をつけることで共変になる。型パラメータを指定する必要のある派生型を、基底型のインスタンスのように扱うことができる点で、ポリモーフィズムとも関連が深い。

たとえば、Scala では List が List[+A] で定義されている。この性質のおかげで、以下のような代入が可能になる。

scala> :paste
// Entering paste mode (ctrl-D to finish)

abstract class Animal
class Cat extends Animal
class Dog extends Animal

// Exiting paste mode, now interpreting.

defined class Animal
defined class Cat
defined class Dog

scala> val cats = List(new Cat())
cats: List[Cat] = List(Cat@66ee9a20)

scala> val dogs = List(new Dog())
dogs: List[Dog] = List(Dog@4934cf32)

scala> cats ++ dogs
res1: List[Animal] = List(Cat@66ee9a20, Dog@4934cf32)

scala> val animals: List[Animal] = cats
animals: List[Animal] = List(Cat@66ee9a20)

反変 (contravariant)

A extends Bの時のみ

val G[A] = G[B]

という代入が許される性質を表す。

class G[-A]

のように型パラメータの前に - をつけることで反変になる。

たとえば、Scala では Function1 が Function1[-T1, +R] で定義されている。この性質のおかげで、以下のような代入が可能になる。

scala> val x1: String => AnyRef = (x: AnyRef) => x
x1: String => AnyRef = $Lambda$6473/1201460973@326f3807

ここで、StringAnyRef を継承している。AnyRef を扱える関数は当然その派生型である String も扱うことができるということ。(しかし現実的に関数の引数以外で反変を意識することがあるのだろうかと思っている。)

参考