放送大学全科目感想 020 情報セキュリティ概論(’22)

  • 情報コース
  • テレビ科目
  • 山田恒夫先生(放送大学教授)
  • 辰己丈夫先生(放送大学教授)
  • 難易度 ★★☆☆☆
  • おすすめ度 ★★★★☆

ゲスト講師も入れて5人での講義。技術的な話はもちろん倫理、教育など扱う内容も広い。聞き手はお茶大博士卒でAI研究家の大西可奈子さん。多くの回で貴重なインタビューを聞くことができ、放送授業を聞く価値が高い。個人的には、辰己先生の慧眼が光っていると感じた。第11回の花岡先生の話は若者のSNS行動を知りたい人にとっては必見。

第1回

AI研究家の大西さんが聞き手。90年代、中学校でコンピュータに触れたらしい(同年代だ)。山田先生は70年代~80年代に動物の研究で使ったらしい。コンピュータが発展して悪いことを考えるやつが増えた。なのでセキュリティを知らないといけない。サイバー空間の特性(ボーダレス性、オープン性、匿名性とか)のせいでセキュリティも重要に。

先生が受けた実際の被害。SPAM。先生のパソコンから東南アジアにアクセスしているという報告(原因は不明)。

情報セキュリティとは何か。企業や官公庁などの組織や個人における情報資産全般の機密性(Confidentiality)、完全性(Integrity)、可用性(Availability)等を保障すること。情報資産→情報を資産としてとらえていること。

脅威とは何か。システムまたは組織に損害を与える可能性があるインシデント(事案)の潜在的な原因。

リスクとは。ある脅威がある情報資産の脆弱性によって、システムや組織に損害を与える可能性。情報資産 * 脅威 * 脆弱性。脆弱性とは、情報資産に影響(損害)を及ぼす、こうした脅威に対する対応策が採られていない性質のこと。

情報セキュリティマネジメントシステム→組織としてのセキュリティ管理の実施、マネジメントとしてのセキュリティレベルを決めた運用、リスク管理。

法。不正アクセス禁止法、電子署名法、特定電子メール法、個人情報保護法、サイバーセキュリティ基本法など。

情報倫理。インターネット社会において生活者がネットワークを利用して互いに快適な生活を送るための規範や規律のこと。応用倫理学の一分野(まじで?)。

第2回

パスワード・認証について。ゲストの東邦大・金岡先生。もじゃもじゃしてる。

認証とは。門番に顔とか通行証とかの証拠を見せたりすることから始まった。今はパスワード。遠隔から、というところが昔と違う。なりすましの可能性が上がる。定義は「相手に自分が何者であるかを主張し、相手に本人性を確認してもらう行為」。名乗ってから確認する。記憶による認証(パスワード)、所持による認証(カード)、本人の特徴による認証(指紋)。

リモート認証とローカル認証。リモートだと通信路・サーバーから漏れる。ローカルだと覗き見・アプリからのアクセスで漏れる。生体認証はリモートでは使えない(機密性が高すぎ)。

多要素認証。例えば銀行口座振り込みはいくつかの認証方法を組み合わせてる。パスワード+スマホ認証とか。

パスワード。サーバー上ではパスワードはハッシュ化されているので、送信したパスワードをハッシュ化して比較する。

チャレンジレスポンス方式。サーバーが乱数でチャレンジを送信し、ユーザーはパスワードでチャレンジを加工、レスポンスとサーバー側で計算した加工データを比較する。この方式だと送信データが加工されていて漏れても安全。ユーザーからの見た目もパスワード入力してるだけだから変わらないはず。

簡単なパスワードにさせないために、パスワード構成ポリシーをつける。強度を表示する。パスワードは単に長くするだけで相当強度が上がるので、16字以上にしてくれとかにすれば結構強い。

ユーザー側のパスワード管理。管理ツールがあるらしい。サービスごとに使い分けろと言われた。まあそうなんですけど、大変ですよね。定期的変更の強制はだめらしい。わかりやすくしてしまう。秘密の質問も簡単に推測できるからダメ。

パスワードに対する攻撃。オンライン攻撃:総当たり攻撃。オフライン攻撃:ハッシュ値を取得して解析。ソーシャルエンジニアリング:ユーザーの心理や認知から取得。リスト型攻撃:漏洩したものを別のサービスで使う。

第3回

暗号について。暗号とは、一定の規則に従って情報を秘匿すること。

古典暗号と現代暗号の違い。昔の暗号は文字列をずらすとか1対1のものが多い。3文字ずらすシーザー暗号が有名。現代では暗号方式のレベルが上がった。1970年代以降、DES、公開鍵暗が登場してかなり変わったのでこれ以降を現代暗号という。

共通式暗号。暗号化と復号化が同じ鍵。長距離の共有が難しいことが問題。はやい。AES(ブロック暗号。数バイトずつ)、ChaCha20(ストリーム暗号。1バイトずつ)。

暗号利用モード。暗号の利用法を定義すること。例えばECB。平文→暗号→暗号文ブロックという単位で変換する。すると同じブロックからは同じブロックができるので、予想ができてしまう。ECBは非推奨。

CBC。平文ブロックと一つ前の暗号文ブロックを組み合わせてXORで暗号化する。すると同じデータは出てこない。

公開鍵暗号。暗号化と復号で違うカギを使う。Diffie-Hellman鍵交換にはじまる。お互いが秘密の情報を持っていて、公開の情報を使って累乗と割り算を行う。割り算の余りを交換して、自分の秘密の情報を使ってまた累乗と割り算を行う。すると、余りが一致する(数学的には印刷教材を見よ)。これを共通鍵として使える。

RSA。Rivest, Shamir, Adlemanさんが作った。素因数分解を使う。秘密鍵と公開鍵を交換できることが特徴で、署名にも使える。DSA。電子署名特化。

暗号学的ハッシュ関数。非改竄性の保障をする。SHA-256、SHA-512など。

疑似乱数生成器。鍵の生成にランダム性が必要になる。再現性がないような乱数を作れなければいけない。でも完璧な乱数は(物理的に?)作れないので、疑似という言葉が付く。具体的な説明はなし。

暗号化の標準化。暗号は鍵以外の情報が公開されたとしても安全でないといけない(ケルクホフスの原理)。ISOとかNISTとかいろんな標準化団体がある。

応用。PKI:公開鍵基盤。信頼ある機関(CA)に証明してもらうこと。PGPは当事者間でやること。TLSではセキュリティレイヤーのことで、セキュリティの機能を提供する。

第4回

マルウェアについて。サイバー犯罪の区分から。不正アクセス、電磁的記録対象、児ポ、詐欺、著作権法。電磁的記録対象犯罪とは、サーバーのデータを書き換えたり、クレカのデータを不正に取得したりすること。

不正アクセスの原因と行為。原因→設定・管理が甘い。不正アクセス後→不正送金・購入、メールの盗み見など。

マルウェアとは。不正な行為を行う意図で作成された悪意のあるソフトウェアの総称のこと。ウイルスだけではなく、ワームやスパイウェア、ボットなど。

具体例、Emotet。2019年ごろ流行る。メールにwordファイルがついてくる。しかもパスワード付きzipだったりする。開封すると感染し、外部サーバーと通信する。サーバーからくるのがマルウェア本体で、随時機能がアップデートされる。情報を取得したり、他のアドレスに同じメールを送信する。

感染経路。メール以外にはweb閲覧、ネットワーク通信経由、USBメモリなどの経由がある。

マルウェアの種類。スパイウェア→ユーザー情報を送信。バックドア→アクセスできない裏口を開く(ポートを開くとかかな)。

ボット→リモート操作可能にする。ボットだけでネットワークを構成してボットネットを作る。サーバーを貸したり売買したりもする。DDos攻撃だけではなくマイニングしたりもする。これをやめさせるのをテイクダウンという。

ランサムウェア→データを使用不能にして、復旧に金銭を要求する。CryptLockerが代表例。金銭支払いにも暗号化で匿名性を確保したので実害が大きかった。

対策。マルウェアを取得して動的解析・静的解析を行う。マルウェアの逆アセンブルってどうやるんだろうね。検体取得方法。ハニーポット→わざと感染させる端末。広域観測→監視ポイントから情報を集約。

対策:OSを最新にしておけ。感染したら?まず通信を切る。クレカを止める。特に企業の場合、どういう被害があったかを把握するためには、電源を切らない方がいい。電源を切るとマルウェア自体が痕跡を消すことがある。

第5回

ネットワークとセキュリティ。スマホはインターネットを介してサービスを得るので、ネットワークのセキュリティを担保しないといけない。

具体的に何をするか。まずネットワークの分離。外部ネットワークと内部ネットワークをゲートウェイ、ファイアウォールで隔離する。外部向けサーバーはDMZに置く。DMZにはIDSという不正アクセス検知機能も付けておく。これで内部ネットワークは外部と完璧に分離できる。

クラサバシステムに、インターネットを挟んだサービスは、複数のサーバーを使っている。システム自体がネットワークを構成している。これを3層アーキテクチャーという。3層アーキテクチャーは、プレゼンテーション層、アプリケーション層、データベース層からなる。プレゼンテーション層がユーザーのアクセスする所(webサーバー)。webサーバーがアプリケーションサーバーにアクセスし、アプリケーションサーバーがデータベースに接続する。外部とアクセスするのはwebサーバーだけ。

分離の利点は、サーバーを簡単に増減できること。さらに、webサーバーまでにアクセスを制限できるからセキュリティ面でも有利になる。

脆弱性対策。まずバッファオーバーフロー、スタックオーバーフロー。スタックオーバーフローだとソフトウェア終了後の処理の行き先が変わる。対策としてはコンパイラで検知、メモリー領域に実行不可属性をつける、アドレス空間をランダム化する(被害を少なくする?)琴が考えられる。どれもOSで何とかする機能かな。

ハードウェアによるセキュリティ確保。ハードウェア上に信頼されたゾーンを用意して隔離実効ができる。有名なのはTPM、TEE。

クラウド上でサーバーをレンタルしている場合(サーバーの外部委託)のセキュリティは。通信がゲートウェイを介して外部とやり取りする機会が増えるから、ゲートウェイが大変になってきているらしい。不正アクセスの余地が高まる。

ゼロトラストネットワーク。組織的ネットワーク内で安全という考えは捨てて、細かい単位で認証と認可とデータ保護を考えること。ユーザー認証以外にもソフト認証、ハードウェア認証などを駆使する。

第6回

個人情報とプライバシーについて。辰己先生。

情報とデータとの違い。意味があるかどうかが違う。記号が意味になるかどうかはそれを扱う人次第。雑音とか、理解できない外国語は意味がないので情報ではない。

日常生活での情報。コンピュータ以前は紙などで伝えていたので、複製が困難、遠隔地に届けるのも困難なので、個人情報は広がりにくかった。現代では、情報は文字・色・画像・音になるので、コンピュータ・ネットワークで扱いやすい。

個人から得られる情報→身長とか国籍とか。これ単独では個人を特定できない。ところが、住所や氏名、顔写真などは、単独や組み合わせて個人を特定できる。

個人情報保護法で定義する個人情報とは、氏名、生年月日その他の記述で、特定の個人を特定することができるものとある。

インターネット普及以前は、転居してきた隣人の指名と年齢と新聞記事データベースは照合できなかった。が、普及以後はニュースサイトなどで簡単に検索可能になった。個人情報を組み和せば特定ができる。病歴とか指紋とか、図書館の貸出履歴からもわかってしまう?こういう結合は法律で禁止するしかない。

個人情報の価値を評価すること。アンケートとか会員登録の経費、マーケティング、生産管理等で得られる利益、流出データの回収費用などを足し合わせた者が価値になる。

個人情報取り扱いの基本。適正取得とか利用目的に通知、安全管理、第三者提供の制限(同意なしだとダメ。でも生命にかかわる場合など例外もある)など。

プライバシー。自分がコントロールできる抽象的な領域のこと。自分の情報の用途を自分で決めることができる権利をプライバシー権という。個人情報保護法で保護する。日本にはプライバシー自体を保護する法律はない。憲法の人権から出てくるしかない。

肖像権。個人の写真を見せない権利。パブリシティ権。有名人の写真や名前を見せて利益を得る権利。

個人情報保護委員会に取材してる。マイナンバーのためにできた。国で使う個人情報の監督権限を各省庁を超えて一元管理することが目的。個人の権利と利益の保護、個人情報の有用性(利益)の2つを調整する。子どもたちに向けての広報もやってる。SNSでの個人情報についての動画を見せてもらった。動画に学校、顔写真、風景、建物が移ってて危ないよということとか、オンラインゲームで連絡先を交換するのは危ないとか。

第7回

情報セキュリティポリシーについて。方針~手順までいろんなレベルがあり、組織ごとにも異なる。今回扱うのは「高等機関の情報セキュリティ対策のためのサンプル規定集」。辰己先生も策定に関わってるらしい。

情報の格付け、CIA。機密性・完全性・可用性のこと。機密性の格付けは3レベル(機密性3、2,1)。秘密文章に相当すれば3。あんまりレベルが高くなければ1。大学だとこれくらいでちょうどいい。複製とか転記とかができるかできないかが変わってくる。完全性も可用性も同様にレベルが設定されている。バランスが必要。機密性を重視しすぎると災害時に必要な情報が手に入れられなかったりする。

規定集の例。目的、実際の規定、義務、罰則で構成される。あと具体的な実施手順。例えばパスワードはこうしなきゃならないとか。

企業と大学だとポリシーが変わってくる。大学の方が研究を進めるために秘密を緩くする必要がありそう。

業務の組織と情報セキュリティの組織は違うという話。社長(CEO)・情報統括責任者(CIO)・情報セキュリティ技術責任者(CISO)・情報技術担当者・一般社員、などのような区分がいいとしている。これは一般的な部長・係長、などとは別の区分にする。CEO・CIO・CISOは兼任可能。

緊急時に運用を変えられるようにするのも大事。チーム(CSIRT)を作れるようにしておくのもよい。

教育・監査・評価も必要。役割ごとに必要な教育が違うこと、日常・抜き打ちの監査の必要性、評価にも基準があることなど。

第8回

連携時におけるトラブルと対策について。

まずCOVIDの影響について。放送大学でも単位認定試験・面接授業に大きな影響があった。

クラウドとオンプレミスについて。クラウド→外注で安い、オンプレ→自社運用、希望通りの実現ができるが管理が大変。セキュリティの面ではオンプレの方がいいかと思われるがそうでもない。運用は大変。XaaS→様々なas a serviceのこと。IaaS(インフラ)、PaaS(プラットフォーム)、SaaS(ソフトウェア)がある。

連携:APIについて。ソフトウェア間のインターフェースの仕様・規約のこと。特にWebAPIを取り上げる。APIを介してシステムとの情報のやり取りをする。マッシュアップという概念もある(ちょっと意味わからなかった)。デジタルエコシステム(よくわからん)。

COVID-19がもたらしたもの:テレワーク、オンライン学習で、信頼できるネットワークの外に端末が持ち出されてしまったこと。ファイアウォールの外側のことを考えなければいけなくなった。境界防御セキュリティ→ゼロトラストセキュリティへの転換。ゼロトラストは7つの基本的な考え方がある(印刷教材を見よ)。ICAMシステム、SIEMシステムなどが必要。

認証と認可の違い。認証は本人確認、認可はアクセス権限を与えること。

実装事例。今まではLMSとか教務システムとか電子図書館とか、全部別個に実装されていた。これをNGDLE(次世代電子学習環境)に統合しようとする動きがある。システム同士の相互運用性とか、最適化された学びなどを提供する。そして教育・学習デジタルエコシステムを構成する。セキュリティ対策ではOAuth2.0による人相、IMS技術に基づくデータ交換などを使う。認証システムはkeio.jpみたいなやつかな。

第9回

リスクマネジメント。リスクとは、損害・被害が予想される状況で、まだ起こっていないこと(起こってしまったのはインシデント)。

避けられないリスク:雨が降る。千葉県は100日だがアスワンは1日なので、アスワンでは屋根はいらない。なので被害の程度・頻度を考える必要がある。他には地震。日本には多い。対策としては、地震に強い建物を作るなど。隕石の衝突。甚大な被害があるが、めったにない。これは対策する必要あるのか?ない。よって、大きなリスクと小さなリスクがあることが分かる。リスクを評価して対策の程度を決めないといけない。

IT関係のリスク。例えばパスワード管理。リスクへの対応はどうするか。先生がおすすめするのは段階的対応。事前防御のほかに、事故対応の準備、事中対応、事後処理。事前:アンチウイルスソフトやアップデート。事故対応の準備:ログをとるとかバックアップをとるとか。事中対応:当事者と連絡を取ったり、復旧したり。事後処理:報告書、再発防止策、ポリシーの改定など。

側面対応。HECTL。人的・教育・費用・技術・法の面から対応する。段階的対応とあわせて、二次元的に分析する。例えば教育+事前防御(E1)とか、技術・事中対応(T3)とか。

個人情報とプライバシーの歴史。宇治市役所データ漏洩事件のインタビュー。平成11年の乳幼児健診システムから漏れた。個人情報を名簿業者に売却してしまった。買った人に対しては情報を回収したらしい。裁判では、目的外で情報が使われたのはダメということで損害賠償が認められた。自己情報コントロール権が認められた。宇治市で見直したこと。個人情報は庁舎内から絶対に出さない。業務のネットワークは内部と外部でしっかり分離する(当時はてきとうだった)。市民へのサービスはどう変わったか。費用は高くなったが、質は下げないようにしたので、職員は大変になった(派っきりは言ってないけど)。研修でも必ず1999年の事件には触れるらしい。

個人情報に関する空気感。80年代までは電話帳にほぼ全家庭が情報を載せてた。80年代からコンピュータが導入、90年代からインターネット。95年のEUデータ保護指令、99年の宇治市データ漏洩事件を契機に2003年に個人情報保護法が成立した。

web広告とトラッキング。行動が追跡されてるのでは?ちょっと違う。SNSやニュースサイトの広告枠が共通になっていることによる。サードパーティ・クッキーを介して情報を受け渡ししている。

第10回

情報社会の方とジレンマ。まずルールの定義から。個人のルールが人格、個人同士なら約束、個人と社会なら法となる。法は約束と違って生まれる前からある。

クリエイティブコモンズライセンスについて。著作物とパブリックドメインの中間のこと。一定の条件を守ったら自由に流通させていいというもの。CCマークを付ける必要がある。

オープンソース・オープンデータ。だれでも利用できる。そういえばなんでオープンにするんだっけ?

他にもいろいろ法律がある。特許、個人情報保護、出会い系サイト規制法とか。

情報社会における倫理的ジレンマについて。まず善から。人の生命と約束どっちを守るべきか。善悪は数量化できるのか。2人の生命のために1人を殺す vs 5人の生命のために1人を殺す、とか。

徳の概念。本人としては矛盾していても約束相手と無矛盾ならよい?黄金律「人にしてもらいたいと思うことは、なんでも、あなたがたも人にしなさい(マタイ7-12)」。本当にそうか?いつも妥当はしないが仕事上なら妥当しそう。相互矛盾の一般的な方法はないが、ジレンマを解決する一般的な方法を学ぶことはできる、というのが先生の立場。

違法→合法、悪い↑善い、の二次元軸を考える。左上と右下がジレンマとなる。例えば戦地に海賊版DVDを持って行った人。著作権法に違反するが兵士は喜んだ。告訴するか否か。映画会社は訴えなかった。反発を恐れてのこと。

広島の中学生がUstreamでスマホで撮った東日本大震災のニュースを流していた問題。元NHKの広報の人、浅生さんにインタビューしてる。著作権法違反、放送法違反。でもNHKはインターネット配信がない。当時、インタビューした人はUStreamをむしろ拡散した。矛盾する行為だった。なぜそうしたか。NHKは公共のもの。公共を守るための著作権法、放送法だから、国民の命と財産を守るための手段は何でも使っていくべきという考えだった。公共の使命を感じていた。ジレンマにある、ルール違反をしているという認識はあった。ジレンマに対する考え。ルールと良心の対立。だれが線引きをするのか。自分が信じている善と社会の善の対立。ジレンマの解決方法は。決まり事を破ったら何かいいことがある場合は、決まり事を変えるのが長期的な解決だが、短期的にはそうはいかない。世の中がどうなるかを考えるしかない。そのためには知識が必要。ルールを知って、ベネフィットも知って、その上でどうするか。知った上でジレンマを抱えてから、あえて踏み込む。そうすれば世の中がよくなるのではないか。先生は、責任をもって浅生さんが行動したと判断した。

優先すべきは?より多くの人が幸せになること(功利主義)?多数の不幸よりも一人の命を救うこと?ここから先は倫理と道徳の問題になる。日本人は命を重視しがちだそう。心の準備をしておくことが重要と先生は言った。

最後にハッカーについて。MITの鉄道模型の同好会の用語らしい。線路をどうやってつなぐかということから出てきた。なので熱心に行為を行う人のことを指す。ハクティビズム。ハッキングして社会を変えようとする人。リークしたりツールを公開して、政府や企業の変化を促す。もちろんテロの一種。先生としてはもっと別の方法を使えばいいんじゃないのと言っている。

第11回

インターネットでのトラブルについて。今日からは花田経子先生。情報教育の人らしい。子どもに焦点を当てた話をするそうだ。

分類。SNSでのトラブルとサイバー犯罪に結びつくトラブルの2つ。犯罪件数自体は減っているが、サイバー犯罪は増えている。不正アクセスは14-19歳も結構やってる。被害者になるだけではなく、加害者になるパターンも。

SNSでトラブルがあった子は10%。少ないようだが軽微なものは多分含まれないので意外と多いような気がする。内容は書き込みに関するトラブル、嫌がらせ、ワンクリック詐欺、マルウェアなど。出会い系サイトは減少したが、出会い系サイトでないサイトからの被害は増えてる。児ポの製造分類は、自画撮り送信が一番増えてる。

なぜ被害に遭うのか。犯罪者が友人を装って女の子に画像送信を促す。「私も画像送ったんだから~」とか言って。ただし犯罪者が使うのは他人の画像。女の子を追い詰めて画像を送信させてしまう。あとグルーミング。悩みを聞くふりをして、など。

トリガーとなる行動。パパ活などの問題行動画像を送信するとか。そうすることで被害者に落ち度があると認識させ、実態把握が困難になる。公表もできないから隠されたトラブルとなる。

こどもはどう解決しようとしているか。身近な大人に相談させる。むずかしくね?と思ったが相談者は、友人+保護者がツートップ。意外に保護者に相談してる。でも相談しづらい。SNSの知識が乏しいとか、説明が面倒、迷惑がかかる、話を聞かない、SNS使ってること自体注意される、普段から話をしないとか。発達段階的に自分で問題を解決したい時期だが、それでは問題が悪化する。

こどもをまもるために。コミュニケーションを密にしておくこと、適切な知識を有しておくこと。いざというときの相談相手として認識される様にせよ!!まったくそのとおりだ。

SNSの使われ方。子どもの世代に多いのはオンゲ、SNS、eラーニング、LINE、動画。少ないのはメール、検索(!?)、ショッピング、ホームページ。

目的に応じて使い分けてる。twitter, LINEは一般的・汎用的な使い方をし、個人的に仲のいい子とはインスタやTikTokらしい(そうなの!!??)。複数サービスは同時に使う。オンゲはDiscord、ツイキャス。大人がたくさん利用しているサービスは避ける。例えばfacebook(たしかにおっさん専用SNSだ)。twitterは大人との使い分けがある。インスタは24時間で消えるストーリーが好まれる。あと利用目的に応じた複数アカウント。twitterを1アカウントで全部やってる私はおっさんなんや。若者の52%が複数垢らしい。中央値は3個らしい。若者は休眠垢をもつ。一番多いのはパス忘れ。あと、若者にはアカウント概念自体がないので、休眠垢を消さないで放っておくらしい。

垢分類。通常垢・裏垢・趣味垢・勉強垢・取引垢・共同垢の6つ。

問題垢。エロ垢・売り込垢・病み垢・捨て垢。通報対象になる。病み垢は座間事件でも有名。

SNSにおけるコミュニケーショントラブル。よくあるのは裏垢の暴露。メッセージアプリで発生しやすい。恋人関係の人と互いにパスワードを教えあったりするそうだ。で、兄弟とか友達に裏垢の内容を見せたり、晒されたりしてしまう(自殺例も)。他人に見られたくない情報は裏垢に出すなよ(難しそう)。

誹謗中傷。弁護士への誹謗中傷、脅迫、嫌がらせなど。少年少女が多数関連。

寿司店のアルバイト店員が店舗内で悪ふざけ、SNSにアップロード→店以上に、店員に個人攻撃、私的制裁。

偽情報。トイレットペーパーが無くなるとか、偽爆弾情報とか。

第12回

情報倫理教育。1970年代に情報公害という言葉が使われるようになった。公害が社会問題になっていることに対応する。背景としては、マークシートの浸透とか、切符の発売システムMARS、銀行間決済のネットワークの誕生など。道具が変化したから不安を持ったというのが先生の分析。

20世紀の情報倫理の出来事。1985年、James Moore “Computer Ethics”。94年、山本など。95年は辰己先生も研究してる。95年はネチケットって言葉も出た。

情報モラルという言葉。モラルっていうのは2人における関係性、特に約束・義務のこと。情報モラルっていうものはないのではないか。87年に教育審議会で情報モラルに言及、2010年にモラル指導者研修ハンドブックってのが出てる。2007年で「情報社会を生き抜き、健全に発展させていくうえで全ての国民が身に着けておくべき考え方や態度」、2008年は学習指導要領にも入った。これはルールの押し付けだというのが先生の考え方。

コールバーグ先生。道徳性発達の6段階。罰回避→最終的には良心へ。先生は重要視している。情報モラル教育は、道徳性の発達に配慮しながら行うべきと先生。心的能力のレディネスに合わせる。子どもはみんなDigital Nativeだという前提で。

海外でもインターネット教育は大事、韓国では3-9歳の83%が利用している。いじめ、自殺も起きている。SunFull運動。善良なコメントを書き込むべきという運動。

2012年、辰己先生が実施したアンケートでは表計算とかプログラミングは学びたいが、著作権、メディアリテラシーとか個人情報とかは別に学びたくないらしい。初等中等教育での情報モラル教育は大学生の情報倫理教育に悪影響があるのでは!!??という先生の主張。以降行為については教えられるが、活用について全然教えてもらってないのでは。具体的には違法っぽいが法解釈すると合法になるような例とか。9回目でやったようなジレンマのことを教えてない。違法でも善、のようなことは学校では教えられないのか。

デジタル・シティズンシップについて。2007年ISTEで提唱。デジタルエチケットとか規範、権利、プライバシーとか。

鳥取県情報モラルエデュケーターの今度珠美先生にインタビュー。教育業界に関わって、いわゆる情報モラル教育(あれはやってはいけないとか)に疑問をもったひと。デジタル・シティズンシップでは、安全かつ責任を持つ、倫理的にふるまう、知的創造を阻害しない、価値観の違いに配慮、ICTの特性を良き利用に結びつけるなどが大事になる。悪影響だけじゃなくて、日常的に活用することで、創造的な活動に結びつけられるよ、あと、公共的なことを学んだらよい使い手に育成できるよ、ということを教でえていく仕事だそう。責任、という言葉が繰り返し登場する。デジタル機器を使う責任。なんだか誇らしい気持ちがしますね。子どもにも響くのではないか。

人権が大事だねーと辰己先生。扱う人の問題。今度先生は今後どうするのかというと、人権問題の研究もしてきたので、日本版のデジタルシティズンシップに人権意識も組み込んでいくそう。活用しない→活用しよう、という教育の方向転換を目指す。

第13回

技術者倫理と人材育成。ゲストの中西先生。

倫理教育から。工学教育プログラムにはABET、JABEEという認定評価制度がある。地球的視点からの能力を教育するらしい。畑村先生の失敗知識データベースが出てきた。JABEEを放送大に適用すると、情報セキュリティに対する責任の理解も教育目標の1つとなる。

チャレンジャー号爆発事故。ブースターの継ぎ目からガスが漏れて爆発。安全が第一でキャリアは次だというインタビューがあった。倫理的ジレンマとしては、雇用主への忠誠と、交易を守るための通報の間のせめぎあいがある。日本の原子力学会の倫理規定でも、公衆安全を優先、速やかに公開せよと言っている。

内部告発と公益通報者制度。これ慶應の労働法でやったな。公益通報者保護法。2020年改正で退職者とか役員が保護対象に、通報窓口の義務化など。

人材育成について。阪大セキュリティ本部の猪俣先生にインタビュー。ものづくりのセキュリティはどうするか。オフェンシブセキュリティにとりくむ。実際に攻撃してセキュリティを確かめる。攻撃者の考え方を知る。弁護士の先生も呼ぶ。

ICMPの可視化。すげーな。

enPitにおける人材育成。大学と大学院でそれぞれカリキュラムがある。基礎、演習、専門、先進演習科目がある。

次はNECでのインタビュー。NECセキュリティでは何をやっているのか。現状把握→システム構築→運用までを行う。セキュリティの監視とは何か。センサーを付けてここから怪しい動きがないか監視している。センサーを企業において監視はNECで行っているらしい。教育としては、スキルの底上げ、人材育成のプログラム、トップセキュリティ人材の教育を行う。海外のSANSという団体に派遣したりもしている。倫理観の育成はどうするか。座学と実践(具体的には何やってるんだろ)。100-1はゼロだと言っている。何かコンプラ違反があったらもう終わりなんで、気を付けよと言っている。経営陣にはどう説得するか。投資ではなく経費と言っている。投資はリターンがいるけど経費はそうではないものね。

第14回

中高、大学、生涯教育でのセキュリティ教育について。

情報モラル→危険の回避がメイン。中学の技術家庭では機密・完全・可用性、多要素認証や二段階認証まで習うらしい。高校。情報Ⅰでももちろんセキュリティを習う。CIA等はもちろんデジタル署名、サイバー犯罪とかまで。情報ⅡではDMZ、ファイアウォールとかも全部習う。情報セキュリティという科目も追加されたらしい。ほぼほぼこの科目と同じ内容。情報セキュリティの要素はCIAのほかに真正性、信頼性、責任追跡性、否認防止を入れて7要素としている。

大学。Computing Curricula 2020というカリキュラムがある。CS, IS, SE, CE, ITのほかにCSEC(サイバーセキュリティ)+データサイエンス。

情報倫理デジタルビデオ小品集7ってビデオがある。放送大(山田先生)が作っていたらしい。DVDか。ネットで見れるようにしてくれよ(放送大の人は見られるらしい)。

Niiが作ったやつもある。倫倫姫のセキュリティ教室というのがある。

倫倫姫の情報セキュリティ教室 – 事業 – 国立情報学研究所 / National Institute of Informatics (nii.ac.jp)

大学で加入してたら見れる(私は見れない)

知識体系。SecBok2021というのがある。

猪俣先生にまたインタビュー。enpitやSecCapについて。セキュリティはもうブランディングの問題になっているらしい。

生涯学習について。インターネット安全教室、青少年インターネット環境整備法がある。IPAがけっこう教育行事やってる。セキュリティキャンプとか。最近の攻撃はスマホ決済、フィッシング、デマ。

また猪俣先生。2004年MSBlasterウイルスというのがかなりでかいインシデントだった。そこから勉強会をやろうという雰囲気ができて、無料の講座がいっぱいできた。高槻市でもやってる。総関西セキュリティ大会は400人くらい参加している。初級者向けリレー講座もある。

第15回

展望と発展学習。全員が登場する。

まず大西さんの質問が4つ。知らん人が脆弱性をついて攻撃してくることは→ある。ゼロデイ攻撃という。ログ採取用のソフトウェアLog4jが攻撃されたりしている。攻撃に必要なソフトウェアが高い価格で取引されている。

ゼロトラストは負担にならないか?→負担はある。なるべく負担にならないようにしないといないけど。

学校教育ではどうなっているか→まず情報活用能力の育成。情報モラルカリキュラムがかなり細かく設定されている。高校まである。2006年策定らしい(古い!)。しかも改訂されてない!やばっ

情報セキュリティ概論の後に学ぶことは?→基本が理解できているか確認せよ。J17の知識体系あたりを参考に。情報Ⅰでもカバーしている。放大には演習科目がないのが問題だなあという話もした。

座談会。人材育成の課題と展望。徳島の病院でランサムウェアでカルテが読めなくなる被害。カルテを手書きにして診療を再開した。なんとDMATが対応した。すげー。情シスが1人しかいないのも問題だった。専門用語で話せるような人が必要、情シスだけでなく外部業者に委託も考えよとのこと。3大温泉シンポジウム→セキュリティのイベントらしい。温泉なのに?夜通し情報交換をしているらしいです。花田先生も越後湯沢の実行委員らしい。

こどもの情報セキュリティ。性的コンテンツが経済的価値を生んでしまう。トリガー行動を行うことも、被害に巻き込まれてしまうこともこどもの責任ではない、大人の責任。大人に知識がないのもダメ。高校大学となっていくにしたがって、知らない人と出会う機会が増える。今までに人と会うなと言われていたのに、今度は会わないといけない。ジレンマが生じる。花田先生は18未満と以上を分けたらと言っているが辰己先生はいきなり大人になるわけではないので・・・と懸念を示している。なのでトレーニングをしないといけないな、という共通認識が得られた。

AIとセキュリティ。AIを使ったセキュリティの実現。もう結構実用されてる。ログ検知、パケット監視、マルウェア検知に機械学習が使える。教師データが必要だけど、教師データが間違っていることがあり得る。twitterにチャットボットを作ったら、よくないことばっかり教えるやつが出てきた。それで閉鎖された。教師データを作るのが難しいってのが現状。

AI自体のセキュリティも問題になる。教師データが盗まれたりしないか。大西さんが解説。教師データに問題がなければAIはおおむね想定通り動作するが、問題のあるデータがあると問題のある振る舞いを学習する。データ量は多いので監視は無理。

これからの学習のアドバイス。辰己先生→アップデートを常に。ジレンマの問題は、ジレンマに陥っているかどうかを認識しないといけない。金岡先生→セキュリティはあらゆるところにあるので、セキュリティという側面をいろんな事象に当てはめてみるとよい。花岡先生→大人に知識がないのが問題なので、知識つけてね。子どもとの関係性も学ぼう。中西先生→Cybersecurity for all, by all。草の根活動に参加するといいよ。山田先生→この科目を基礎として、知識は最新のものにしてね。大西さん→アップデートしていかないとな~

放送大学全科目感想 018 Webの仕組みと応用(’19)

  • 情報コース
  • テレビ科目
  • 森本容介先生(放送大学准教授)
  • 伊藤一成先生(青山学院大学准教授)
  • 難易度 ★★☆☆☆
  • おすすめ度 ★★★☆☆

webを中心としたネットワーク周りの話。HTTPの話が多い。慶應の図書館情報学でやったRDFの話もある。あまり深い話はせず、多種多様な話題を浅く広く学ぶ感じで、お手軽。後半の伊藤先生が楽しそうなのがよい。

第1回

森本先生による概説。森本先生若々しい。こういう同級生いた。

web以前はtelnetとかネットニュースとかあったね。あの人たちどうなってしまったんだろう。95年にwebがトラフィック1位になったらしい。webは一般名詞になったので小文字になった。

webといえばハイパーテキスト。ハイパーリンクのおかげで他のページに飛べるようになった(当時めっちゃ画期的だと思われてたな)。HTMLベタ打ちが紹介されている。テキサイだ!いまは阿部寛のホームページ以外では完全に滅びたよね。

webシステムについて。昔のwebシステムではURLとファイルが1対1に対応していた。静的なwebページという。サーバやクライアントの状態において、同じURLでも異なる結果を返すのが動的なwebページという。webシステム/webアプリケーションという。乗換案内とかショッピングとかネットバンキングとかね。SNSも当然そう。ソフトウェア不要、異なる端末からアクセスできる、更新が楽勝ってのが利点。欠点はwebアクセスしないと無理なこと、セキュリティの問題。

第2回

webの基礎。クラサバモデルから。ユーザ⇔クライアント⇔サーバのデータのやり取りで表現される。ユーザとクライアントの関係は、クライアントとサーバの関係そのまんまとも見える。

URLは構文がある。<scheme>://<host>:<port><path>?<query>#<fragment> らしい。言われてみればそうだ!httpsってhttpとどう違うんかよくわかってない。暗号化されていることだけはわかっているが、実装はどうなのか。相対URLの書き方。//から始めれば、実質http://の略と同じらしい。スキーム名は電話番号でtel:ってのもあるらしい。

リクエストメッセージとヘッダフィールド。空行までがヘッダなのね。GETメッセージにはHTML1.1って書いてあるが、1.1以上のバージョンはあるのか?ステータスラインの404って最近あんま見ないよね。ウェブページがサーバーへのリソースではなくクエリを使って動的表示されることが多くなったから、404より500の方が多い感じがある。メディアタイプはだいたい知ってたけど、octet-stream(任意のバイナリ)はしらんかった。

第3回、第4回

HTML/CSSを2回取り扱うらしい。内容はほぼ知っていたので略。まさか2022年にHTML/CSSベタ打ちについて教えてるとは驚き!

知らなかったこと一覧。HTML上のエスケープシーケンス(&quot;とか)は名前文字参照という。あとHTML5は2021年に廃止されたらしい。今は?(→HTML Living Standardらしいです)

第5回

HTTPについて。今の最新バージョンは2015年、HTTP/2。でもこの授業では1.1の解説をやるらしい。

リクエストもレスポンスも、リクエストライン/ステータスライン+ヘッダフィールド、空行、ボディという構成は変わらない。ヘッダはフィールド名: フィールド値という構成。

HTTPメソッドは8つ。GETのほか、POST、PUT(更新)、DELETE(リソース削除)など。

Refererってスペルミスだったのか!

キャッシュについて。webサーバーからは、キャッシュしてもよいかどうか、リソースの有効期限、最終更新日時、エンティティタグ(etag?バージョンを表す)が得られる。最終更新日時やエンティティタグを見れば、前回と同じリソースかどうかわかる。条件付きGETを送れば、304 Not Modifiedが返ってくるのでキャッシュが使える。キャッシュの可否は、Cache-Control:タグで返ってくる。クライアントからは、GETのあとにIf-Modified-Sinceとか、If-None-Matchタグをつけてやれば、条件付きGETを作ることができる。

持続的接続について。TCP接続を切るかどうかの話。持続的接続をすると負荷が軽減できる。Connection: Keep-Aliveを使えばよい。

第6回

動的webサイトについて。随時変化するサーバー情報、データベース内容のGETとか。ヘッダーでリソースを変えることは、コンテントネゴシエーションという。Accept: とか Accept-Language: で指定したメディアタイプによってサーバーが返してくるリソースを変える。一番よくあるのはクエリやメッセージボディでの指定。ここまでの3つは全部組み合わせられる。

で、フォーム?突然技術が古くなった感じ。フォームデータを+とか&とか=とかで加工する古い方法が出てきたが、これってセキュリティ的にやばいやつじゃなかったっけ?POSTで送信する場合は暗号化できたりするんかな。httpsだと勝手にやってくれるのか?(→TLSという技術を使うらしい)

第7回

RDBMSについて。「データベース(’17)」とかぶってるので略。

第8回

クライアントサイドの技術について。描画処理とか、ユーザ操作に対する再描画とか。JavaScriptを使って表示を変えたりすることもこれに該当する。

JavaScriptが出てくると、HTMLの解釈が一旦停止になるらしい。そういえばページ表示してから実行したかったら、何か特殊な実装をしていた記憶がある(→AddEventListener(“load, …)でやるって説明あった)。JavaScriptの具体的な操作は、知っていたことばっかだったので略。まず

第9回

認証とセッション。基本はIDとパス。注意点については情報セキュリティ概論とかぶってるので略。

HTTP認証。まずBasic認証。何も指定しない場合、WWW-Authenticate: Basicが返ってきて、ID+パスを問われる。Authorization: Basicで返してやる。ID+パスはBase64エンコードで送るけどこれはデコードもできてしまう。ヘッダを見られたらアウトになってしまう。Digest認証を使うとMD5でハッシュ化するので安全。

フォームベース認証。INPUT要素のフォームを使う。これもコンテンツ内にべた書きになってしまうので危険な気がする。

セッション。ブラウザとサーバーのやり取りの1単位のこと。検索→商品ページ→購入→情報入力→確認→完了までとか。HTTPはセッション管理がない(ステートレス)ので、同一ユーザーの推定をすることになる。使う情報はIP、UserAgent、Refererあたりが考えられる。アクセス解析はこれを使ってる。しかしIPは同一ユーザでも変わることがあるし、LANから来たら同一IPから複数アカウントが来ることもある。なのでこれはセッション管理としては使えない。なので、毎回認証用の情報を送受信するという手もある。WebブラウザがAuthorizationヘッダを記憶しておいて、毎回送信する。でもこれも面倒。

これを解決するためにCookieを使う。Cookieとはwebサーバーがwebブラウザに記憶させるデータのこと。サーバとブラウザが毎回保存しておいたCookieをやり取りすればよい。webブラウザからはSet-Cookieヘッダが返ってくる。idが入っているので、ブラウザはリクエストのヘッダに毎回Cookie; id=XXXX を送ってやればいい。クッキーには有効期限や有効なドメインなどを指定できる。クッキーにはショッピングカートの商品番号を入れたり、様々なプロパティを保持させることもできる。けど、後述のセッション管理を使うことが多いから、あんまりやらない。セキュリティ上もよくないし。

クッキーによりセッション管理。セッションIDを含むクッキーを発行する。webサーバー側でユーザ固有の情報をセッションIDと結び付けて保存しておけばよい。例えばID+passを送ったらサーバーはセッションIDを返す。ブラウザ側はあとは毎回セッションIDを送ることで認証済みであることを示すことができる。ログアウト時はクッキーを削除する。削除するという命令はないので、例えばクッキーのExpiresを過去にしてしまう。

シングルサインオン。専用の認証機構で一度認証を受けると、横断的に別のリソースを使うことができるようにする。放送大の認証システムや、keio.jpなんかがこれに該当する。IdP(認証局)とSP(サービスプロパイダ)間の直接の通信はない。

第10回

webのセキュリティ。盗聴、不正誘導、攻撃、なりすましについて。

盗聴を防ぐにはTLSを使う。TLSはSSLが元祖。認証には証明書を利用する。認証局から発行されたものが信頼できる。クライアントから証明書を送って、サーバからサーバ証明書を送ってもらう。TLSはTCPとHTTPの真ん中の層として提供される。HTTPと合わさってHTTPS, HTTP over TLSを作る。

ルート認証局の信頼性はどう確保するか。webブラウザ内に保存される。(ちょっとここらへんはわからんかった)「安全な接続ではありません」的なメッセージが出るのは、証明書の検証に失敗しているということ。

フィッシング。偽サイトに誘導してパスワードなどを搾取すること。以下略

webシステムの欠陥について。脆弱性をついた攻撃について。ヘッダに不正なデータを含めたり、存在しないパスを指定したり、メッセージボディにデータをつけたりすることが考えられる。

SQLインジェクション。パスワードに ’’ OR ‘a’ = ‘a’ と入れる。すると、SQLではORが優先されるため、’a’ = ‘a’ が成り立ち、無条件でSELECT文が通ってしまうというもの。

クロスサイトスクリプティング。フォーム送信するデータの中にJavaScriptを入れる。img src=の後に別サイトのURL+クッキーのデータをエンコードするコードを入れて、クッキーを別サイトに送信させること。

セッションハイジャック。セッションの乗っ取り。ここまでの技術を利用してセッションIDを詐取すればできる。

第11回

大規模webシステムについて。冗長化と負荷分散から。予備システムを用意して、システム障害児の即時復旧を図る。コールドスタンバイ方式(予備システムは通常時は停止)とホットスタンバイ方式が(予備システムは常時稼働)ある。負荷分散はリクエストを複数のサーバーに振り分けること。障害発生時も残りのサーバーで処理できるので可用性が高い。ロードバランサを使う。他の実現方法としてはDNSラウンドロビンがある。同一ドメインについて複数のサーバーを割当てているDNSをそのまんま使って負荷分散をすること。あとリバースプロクシ。ネットとサーバーの間に挿入され、サーバへのアクセス要求を転送する。

データセンター。コンピュータやデータ通信機器などの装置を集中管理するところ。電源が大事なので自家発電装置、UPSを多数配備する。発熱するので空調も大事。あと免震、床の耐荷重も必要。監視カメラ、ICカード認証、高速ネットワーク回線もいる。

IIJのデータセンターにインタビューしてる。広報部課長の堂前さん。昔は電算センターと言ったらしい。いまでは大規模データセンターの一部を借りることが多い。事業者の業務はコンピュータ設置場所の貸出がメイン。電気系統やネットワーク、ラックを提供する。コンピュータ設置の依頼もできる。セキュリティオペレーションセンターに監視を依頼することも可能。建物の特徴:大量のケーブルのため50cmの空間がある。耐荷重、免震も大事。免震がないと地震の際にコンピュータがぶつかって壊れる。エンジニアが出入りするのでセキュリティカードをゲートに通さないとダメ。6600Vの受電装置。非常用発電機。道路工事などで断線しないよう、通常と異なった電気の呼び込み。ラック1個で一般家庭数件分の電力を消費するらしい。あと最近はGPGPU(画像演算CPUの目的外使用)が増えてきて、消費電力が高くなってる。ラック一個で中型電気ストーブ10個分。空調装置が故障すると終わるので、空調装置にも冗長性を確保している。

IaaS、PaaS、SaaS。他でやったので略

CDN。Content Delivery Network。アクセス集中を避ける技術。複数のサーバーを用意してミラーリングする。これもIIJにインタビューしている。メーカー新製品発表会とか、ゲームのアップデートの時にアクセスが集中する。大量の設備を用意するのはコストがかかりすぎ。なので従量制のCDNサービスを利用するとよい。CDNは光回線の物理的遅延を回避するのにもよい。セキュリティ対策としてもCDN事業者に外注できるから有利とのこと。

HTTP/2。リクエスト/レスポンスの多重化の方法が1.1と違う。1.1はTCPコネクションを複数確立する。2ではストリームという仮想的なチャネルを使う。ヘッダもバイナリ形式になり、圧縮して差分だけ送信する方式になって効率化されてる。サーバプッシュ機能。リクエストなしでサーバーからコンテンツが来る。キャッシュも使える。1.1との後方互換性もある。ブラウザとサーバのどちらかが古ければ1.1を使うようにできる。

第12回

検索エンジン。クローラ、インデクサ、検索部からなる。クローラはwebページの選定と制御部分からなる。収集は再帰的に行える。クローラは複数同時に動くので制御が必要。同一ページを収集しないようにしたり、重要度をつけたりする。

インデクサは索引情報で、形態素解析を使って単語に分割したり、一定の文字数を切り出したりする(N-gram)。webページはHTMLなので、タグ構造を踏まえた解析を行わないといけない。

検索部。キーワードとインデックスを照合して、webページをランキング形式で提出する所。検索部の処理は世界中のデータセンターに分散している。

PageRank。webの構造を解析してランク付けする。具体的にはバックリンクの数が多いページを重要なwebページとし、ここからリンクを張られているページも重要な頁とするものである。算出式は卒論にも書いたので略。Σがあるからどうやって計算するのだろうと思ってたが、何回も計算して収束するまでやればいいらしい。

HITS。Hyperlink Induced Topic Search。動的にランキングを作る方法。検索結果に適合したページの集合をR(ルートページ集合)とし、ここからリンクを張られているページの集合を考える。HITSではHubとAuthority問概念を使う。Authorityとは、多くのwebページからリンクを張られていること。これを値で表現する。Hubは、多くの権威あるページにリンクを張っているページのこと。これも値にする。HITSではこの2つを使って重要度を算出している。

接続行列。iからjへリンクが存在したら1、なければ0になる行列のこと。Authority値をa1~an、Hub値をh1~hnとして、初期値は全部足したら1にしたあと、接続行列をかけたり、L1ノルムを正規化するということを何回も続けていく。するとだんだん収束していく。これをAuthority, Hubの最終的な値とする。実は接続行列の固有値を求めることでも計算できるので、こっちの方が楽。

マルチメディア検索。テキスト(メタデータ)に基づく方法(TBIR)と、画像特徴量に基づく方法(CBIR)の2通りがある。画像でも音声でもやることは同じ。

第13回

セマンティックwebとリンクトオープンデータ。セマンティックwebとは、人間と機械とのコミュニケーション実現を目指すwebのこと。意味情報の記述にはRDFを使う。

RDFはリソース、プロパティ、プロパティ値の3つの組(トリプル)でリソース間の関係を表す。主語、述語、目的語に相当する。http://kazuanri.org→(dc:creator)→伊藤一成なら、http://kazunari.org がリソース、伊藤一成がプロパティ値、dc:creatorがプロパティ。どれもURIで表記する。プロパティはリテラル(文字列や数値)も指定可能。RDFはXMLを使って表記する。スペース区切りのTurtle形式もある。プロパティ値をURIにすれば、リンクと同様になって関連を表すことができる。

ダブリンコア。あらゆる情報資源に付与可能な語彙集合のこと。titleやcreatorなど15要素がある。図書館情報学でやったな。

ダブリンコア拡張語彙(DCTerms)。dctermsをつける。より厳密なメタデータ記述ができる。available, created, dateなど。foaf(friend of a Friend)というのもある。foaf:knows(知ってる人)とか。

語彙の定義づけはRDFS(RDFスキーマ)で定義する。例えばライオン(S)が肉(O)を食べる(P)は意味をなすが、朝顔(S)が肉(O)を食べる(P)は意味をなさない。これはどうやって定義するのか。クラスを用いる。OOPLに近い。rdfs:Resourceが基底クラス、rdfs:classがクラスそのもの、rdfs:Literalがリテラル値・・・など。他にも下位インスタンス、サブクラスを表すプロパティもあるし、リソースであることを表すプロパティもある。

スキーマ定義の例。これは文字で表すのは難しい。rdfs:typeとかrdfs:SubClassOfとかを使って関係性を記述していく感じ。現実世界をクラス化してrdfs:で構造化していくようなことをするのかな。

OWL。Web Ontology Language。概念間の高度な関係を表せる。犬と猫は互いに素とか、年齢は0以上の整数とか。難しいのであまり実現されてないらしい。

リンクトオープンデータ(LOD)。個々の情報をまず共用することを優先しようとする試みのこと。政府、図書、メディア、ライフサイエンス、地理情報などで使われている。すでにLODのクラウドができている。

5スターオープンデータ。オープンライセンスを使う、構造化データを使う、非独占形式を使う、URIを使う、他のデータへリンクする。これを守るとLODにしやすい。

DBpedia。wikipediaからLODを生成するプロジェクトのこと。

SPARQL。RDFの検索に使うクエリ言語のこと。SQLに似てる。

第14回

HTMLテクノロジ。HTML5では大きな機能拡張があった(廃止されてなかったっけ?)今ではスマホ対応など多様な環境を前提にしたwebシステムを作らないといけない。例えばデバイスごとにCSSを切り替えるとか、user-agentに応じてページを切り替えるとか。

センシングデータの利用。先生が作ったGOSEICHOというコンテンツを見る。

GOSEICHO

スマホを裏返すと「ご清聴ありがとうございます」というというアプリ。デバイスの軸を検出する仕組みがある。alphaがZ軸、gammaがy軸、betaがx軸「を中心とした回転」を検出する。回転なんだね。javascriptの実装としては、deviceorientationイベントをゲットすればいい。abs(e.beta)が170↑、abs(e.gamma)が10↓なら裏返しと判断する。なるほど!

SVG。HTML内にインラインでSVGを書ける。アフィン変換すれば位置や向きも簡単に変換できる。transform=”translate(100. 20) rotate(40)” などと書けば平行移動+回転ができる。JavaScriptと組み合わせて、図形を要素とみなして操作も可能。

ストレージ技術。WebStrageを使えばローカルストレージを使うことができる。形式はキーバリュー(KVS)。Local Storage(期限なし)とSession Storage(セッション終了まで)がある。

リアルタイム双方向通信。今まではAjaxを使ってた。これはクライアント側で動作し、ブラウザでポーリング(定期的にリクエストすること)していた。一定時間ごとに更新の有無をチェックするので、無駄が多い。

Comet→サーバ側でリクエストを保留し、任意のタイミングでレスポンスを返す。コネクションを維持しておき、更新があったらレスポンスを返す。無駄がないがTCPコネクションを占有するのが欠点。これはHTTPの限界と言える。

これを克服するのがWebSocket。まずハンドシェイクでコネクションを確立。プロトコルが確立したらあとは双方向通信を行える。JavaScriptではonmessageイベントとして処理できる。

第15回

WoT時代のwebについて。IoTはデバイスやネットワークが標準化されていないので、インタフェースを統一したい気持ちがある。これをWoT(web of thing) という。

Web API。サーバが提供するAPIのこと。WoTの前提となる。APIのデータ交換にはJSONが広く使われている。JSON形式のライブラリは充実しており、相互運用性を意識することなく利用できる。

JSONにはスキーマがないので、スキーマ付きのものとしてJSON-LDがある。リンクトオープンデータを表現できる。

REST。Representational State Transfer。クラサバが原則、インタフェースは統一、ステートレス(情報や状態の保持なし)、キャッシュ可能、階層型システムという5原則を満たすこと。これを満たすとネットワークを状態機械として扱える。ROA(Resource Oriented Architecture)。リソース指向のアーキテクチャ(?)。識別子にはURIを使う。Restful WebAPIの実装では、CRUDをPOST, GET, PUT, DELETEのHTTPメソッドに対応付ける。

WoTの実例。モータ、LED、光センサをつける。これをROAで階層化しておく。例えばGETメソッドで光量をJSONでゲットできる。POSTでサーボモーターの回転方向を移動させられる。実際にロボットを動かしてる。かわいい。先生がなぜか人形と同じ格好をしている。

KDDIの高木悟さんにインタビューしてる。スマホでアプリケーションを動かす時代なので、ブラウザが大事。KDDIの仕事が増えてる。W3Cにも関わっている。GitHubを中心に標準化のプロセスを議論してるらしい。全部オープン。W3Cの勧告は仕様書と同時に実装がないといけないらしい。ブラウザとOSはほぼ同じ概念になりつつある。webOSという考え方もある。WoTの考え方が浸透し、画面表示できるものなら何でも動くという時代になった。

WebDINO Japanへ。瀧田さん。mosaic時代からブラウザに関わっているらしい。多言語対応を行っていたらしい。CHIRIMENというコミュニティがある。ハードウェアをフルオープンにしようというプロジェクト。ラズパイを使って、ブラウザ上で動く開発環境を作っている。センサーの状態がブラウザで簡単に見られるようになっている。サーボもJavaScriptで操作可能。コードはHTMLとJavaScriptを同時に表示し、簡単に編集できるようになっている。すげー。

WoTの未来。Webがプログラム可能、知識表現の構築、即時処理、活発な交流がキーワードとなる。

放送大学全科目感想 017 データベース(’17)

  • 情報コース
  • テレビ科目
  • 辻靖彦先生(放送大学准教授)
  • 柴﨑順二先生(放送大学教授)
  • 難易度 ★★★☆☆
  • おすすめ度 ★★★★☆

AccesなどでSQLを実際に使っていく、という講義ではない。データベースがなぜ使われるのか、数学的な定義は何かというところから掘り下げていくので、特に辻先生担当の所は難解な部分もあるが、データベースが有利な点についてかなり具体的に学ぶことができる。リレーショナルデータベースを中心とした講義で、後半はRDB以外のデータベースについても学ぶ。

第1回

イントロ、辻先生。

データを体系的に収集・加工、効率的に管理・運用するのがデータベースで、中核的な要素であるとのこと。例えばWAKABA。個人情報や成績・履修情報を管理できる。他にも銀行システム、ネット通販システム、顧客管理システムなど。いずれも業務に密接にかかわるデータの塊を持っている。目的を満たすための必要なデータ、実世界で必要な規則を取り扱うことが望まれる。実世界に沿ってデータベースの構造も変わっていく。

データベースとは、この授業では、目的を持った一定のデータの集まりと定義する。

ユーザーには誰がいるか。データベース管理者とアプリ開発者、それからユーザーがいる。普通は管理者と開発者が同一のことが多いような。

データモデル作成について。実世界→概念データモデル→論理データモデル→物理データモデルの3段階がある。いずれも別々に設計が必要(物理の方はあんまやらないかな)。論理データモデルの例としてリレーショナルデータモデルがある。いわゆるRDBMS。

データの整合性の維持。これはデータモデルで実装できる。例えば、学生の学籍番号の一意性とか、学生が必ず学籍番号を持たなければいけないとかは、データモデル自体に制約が内包されている。これが重要な機能の1つ。

データベース言語には、データ定義(DDL)、データ操作(DML)、データ制御(DCL)がある。データ操作に相当するのがSQLかな。

データ格納方式は木構造、ハッシングなど。検索は効率的に、高速に行われないといけない。

機密保護について。アクセス制限、権限の付与を行うことができる。

同時実行制御。処理単位をトランザクションと呼び、並列処理が可能になる。ロック機能も必要。

三層スキーマ構造。外部スキーマ(見え方、ビュー)、概念スキーマ(テーブルの設計)、内部スキーマ(物理的格納方法)の3つ。それぞれ独立性をもって、どれか1つを変更しても他に影響がないようにしている。

データベースを使う利点。データの整合性の保持が最も重要。副次的な要素として、効率の向上や機密保持、同時アクセスへの耐久性なども挙げられる。

最近登場したNOSQL(Not Only SQL)について。ビッグデータなど膨大で複雑な構造のデータを高速処理する時に使われる。

ここまで駆け足のイントロだったが、この後は講義全体の構成。技術的な話も押さえつつ、実際のデータベースの適用の様子をかなり見せてくれる講義のようだ。

第2回

身の回りのデータベースについて。柴﨑先生。声が大きい。

裏方として働くデータベース。経済活動自体がデータベースに依存しているという。電子カルテが例になってる。確かに私の開発してる電子カルテもデータベース操作がほとんどっす。座席情報は昔は手作業だったのでダブルブッキングがあったが今はほとんどないらしい。ATMは昔からデータベースだよね。絶対に間違いあっちゃいけないし。

WIndows95によってインターネットが開始され、ここから予約サービスのデータベースの役割が大きくなった。2000年以降ブロードバンド回線が普及し、一気にデータ量が増えてデータセンターなどもいっぱいできた。ポータブルデバイスが発達して、データはネットワークの向こう側に置くようになってきた。これらもデータベースで管理されている。

個人の生活とデータベース。まず検索エンジン。私たちが検索しているのはwebページそのものではなく、検索ロボット(クローラ)が巡回して作成したデータベースによるものである。大きなサイトだと数百万台のサーバーを抱えているそうだ。データベースはオンラインショッピングの土台にもなっている。商品情報、在庫情報、顧客情報、発注情報を全部管理しているので何度もデータベースへのアクセスが発生している。

ヤマトシステム開発のデータセンターに取材してる。クロネコヤマトやね。サーバーは3000台、データベースは270台。メンバーズの管理とか問い合わせ、大和グループの基幹システムで使ってる。一日4600万件(!)。問い合わせも700万回。インタビュイーのおじさん、技術者じゃないなー。広報って感じ。ふわっとした解答がおおい。もはや社会インフラなんで、ガス発電装置とか災害時にもばっちり対応しているらしい(データベースとあんま関係ない)。リアルタイムがどうとか伝票レスがどうとかしか言ってないのでデータベースの技術的なことに触れられてないっす。。なぜこのおじさんに高給を払うのだ。。

あっ先生技術的なこと他の人に聞いてるじゃん!!さすが!!

まずヤマトのDBはメンバーズのサービスは完全に別個扱いで、独立。あとはトレーシングDBとダウンロードDBの2つ。ダウンロードDBが大事で、現場で使うデータが全部入ってる。トレーシングDBは現場の状態を随時上げていくDBで、これは問い合わせのときに使う。不在率は20%もあって大変なので、DBを使ってこれを下げていきたいらしい(どうやって?)。

POSシステムって顧客の見た目のデータも入れてるんですね。これそのうちビデオカメラで自動でできるようになるんちゃうのかな。

第3回

データベースの仕組み。

データと情報との違いから。データはただの客観的な真実(今日は雨)で、情報はデータを役立つように加工したもの(今日の降水確率は80%だから傘を持っていこう)という違いがある。情報は正確・整合性・スピードなどいろいろな価値がある。これらを踏まえるとデータベースとは、「データに情報としての価値を持たせ、データを有効に活用できるようにする目的のために、共有性や再利用性を意図して、一定の規則に基づいてコンピュータ上に格納されたデータの集まり」である。

データは昔は紙集計だった。一部がファイル形式のデータになったのち、データ処理の高度化に対応するためデータベースが利用されるようになったといえる。ファイルシステムだと専用プログラムが必要になるし、汎用性がない。一意性もないし不整合も起きる。メンテが大変。データアクセスも煩雑。これをデータベースにすると管理も楽になるし、ほかのプログラムでデータベースにアクセスして再利用すること(マッピング)や複数ユーザー間の共有も可能になる。データベースは無駄のないデータ集合体である。おお、データベース使うメリット大きすぎじゃん!

データベースの概念について。過不足なくデータを蓄積して、適切な規則を作っておかなくてはならない。たとえば図書館の書誌情報。すべて同じ規則(ISBNコードがあるとか、同じ書籍を重複して登録しないとか)に従って入力されているので、データの増減があっても問題なくなる。データベースを図書館に例えると、データベース自体は書棚、DBMSは司書さん、アプリケーションはカウンターである。データベース管理システムが挟まってるところが便利なところなんだろな。

データベース管理システムはエンジンみたいなもん。データベース自体はただのデータの塊なので、実際に問い合わせる管理システムが重要。実際やることは、データモデルの提供や、整合性の維持、排他制御、障害対応。。いろいろある。

データモデルとモデリングについて。モデリングとは現実をデータに定義しなおすことをいう。概念データモデルの代表はE-Rモデル(実体-関連モデル)という。実体・関連・属性で表す。例えば、実体が商品・取引先、関連に発注、属性が商品コードとか価格とか。論理データモデルは前出のリレーショナルデータモデルとか。

3層スキーマアーキテクチャについて。データベース構造を外部スキーマ、概念スキーマ、内部スキーマに分ける。外部スキーマがビュー、概念スキーマがさっきのE-R図、内部スキーマが容量設計とかメモリ設計とかに対応する。それぞれが独立で他に影響しない。独立性ってのがコンピュータ系ではほんと大事な概念なんだね。

第4回

データベースの歴史。先生の声が小さくなった気がする。速度も落ちた。

データベースの起源は、1950年アメリカから始まる。軍の基地の中で分散していた情報を統合して一か所にまとめたところからデータベース(base)という言葉ができた。1957年スプートニクショックで、データの分散化と、分散されたデータの収集・処理・管理が望まれるようになった。

学術的には1959年のマギー氏、源泉ファイル(Source File)という言葉が初めて。データを階層的に管理し、蓄積する仕組み。重複回避や拡張性、機密保持などの必要性を唱え、現在のDBMSに通じる概念を作った。

商用DBは1960年のGE社のIDSがはじめて。社内生産管理システムを電算化したとき、索引部を介して情報をDB化した。まだまだコンピュータが高価な時代。国家機関しか利用できてない。COBOLにIDSを組み込んだのがCODASYLというグループらしい。聞いたことある気がする。1965年発足。1969年ごろからDBの仕様が一般的にできてきたそうだ。

初期のデータベースで採用されていたのが階層データモデル。データを階層木構造で表現する。常に親と子が1対nとなる。データへのパスは1つなので重複が発生してしまう。複数の親を持てないことが欠点。データ構造に変更があるとプログラム変更が必要なのも欠点。もう一つの流派であるネットワークデータモデルだと、データに達するパスは複数になるから、重複はなくなる。ただプログラム変更は複雑で、毎回変更が必要なことも同じ。

新しいデータモデル。リレーショナルモデルはIBMのコッドさんが作った。1970年代。幹や枝の考え方をやめて、表にする。数学の関係代数、集合理論に基づいているらしい。データベースは集合だったのか!!!なんつっても表とSQLとDBMSがあればオッケー。負荷はかかるが、ハードウェアの進歩とともに負荷は相対的にかからなくなっていった。

リレーショナルモデルはすぐには実用化されなかった。原因は既に以前のモデルに基づいて投資がされていたこと、コンピュータのパワー不足、実装の困難さなどがあった。RDBMSは70-80年代にだんだんと発展してきた。80年代になるとワークステーションが発展して、Oracleなんかも成長してきた。LANも発展してクラサバ型サービスができてきたので、需要が高まった。90年代はAccessやMySQLなども登場した。

オブジェクト指向データベース。バイナリやマルチメディアファイルを扱うのに適している。スキーマ不要で複雑な構造を表現できる。オブジェクト指向型プログラミング言語で扱うデータ(インスタンス?)をそのまんまDBに入れちゃうらしい。リレーショナルデータベースと組み合わせたPostgreSQLが代表。

NoSQL。データを分散して保管するためのニーズで生まれた。Microsoft Azure DocumentDBとか、Amazon RDSとか。キーバリュー型のAmazon DynamoDBというのもあるらしい。

第5回

データベースの動作環境。プラットフォームとしてのコンピュータがどのような変化をしてきたか。大型コンピュータ→ミニコン→Unix→ワークステーション→PC→クラサバという流れ。C言語って移植性が優れていたから発展したのか。おおまかには、データベースの動作環境はWindowsやUnixなど汎用化し、コンピュータも安くなって簡単に環境が構築できるようになった。

クラサバで主に使われているのはweb-データベース連携システムという。webブラウザ使えば特殊な端末も必要なく利用できる。近年はweb化が進んでいるのでwebアプリケーションサーバーをつけて、負荷を少なくする仕組みが確立している。webサーバ、アプリケーションサーバ、データベースサーバと負荷を3階層に分散することで、セキュリティも向上する。3階層システムという。

クラウド型データベース。手元にDBを持たなくていいのでコストがかからない。AWSとかね。

分散型データベース。データベースを分割し、複数のデータベース管理システム同士が通信を行う。ユーザーは通信を意識する必要はない。危険分散と負荷分散ができる。

webとXMLデータベース。XMLデータベースはXMLスキーマ自体をデータベースの定義として使うというもの。XMLは階層性を持ち、拡張性が容易な特徴がある。そしてデータ自体も書ける。これをそのまんま蓄積すればXMLデータベースになる。巨大なXMLデータをいかに効率よく管理するか、というのがXMLデータベースの必要性を生んだ。XMLだから別にテーブルじゃなくてもいい。XMLデータベースは基本的には単に蓄積するだけ。タグ情報をインデックス化することで高速アクセスを可能にする。データ定義の変更が頻繁にあるようなデータに向いている。汎用性も高いしマルチメディア情報も格納できる。

xpassとSQLの相互変換は可能なので、その意味ではRDBMSと共存ができる。XMLはDOMに読ませてしまえばオブジェクト指向DBとも連携できる。

オープンソースソフトウェアを組み合わせて構築できる環境としてLAMPがある。Linux Apache MySQL Python/PHP/Perl の略らしい。安価で高性能な環境が構築できる。

データベース言語について。ネットワークデータベースの規格がNDL(1987年)、リレーショナルデータベース言語のSQLも同年。SQLは2016年の定義まであるらしい。標準化は様々なメリットがある(略)。

第6回

概念設計の話。データモデルを作成すること。既出のように概念、論理、物理データモデルの3つ。まずは実世界からE-Rモデルを使って概念データモデルを作成する。概念データモデルを基に論理データモデルを設計する。また既出のように階層、ネットワーク、リレーショナル、オブジェクト指向モデルがある。最後は物理モデルだが、これはDBMSが勝手にやってくれる。

概念設計について。実体関連モデルは計算機科学者のピーター・チェンって人が作ったらしい。E-R図も別名はピーター・チェン記法という。

実体とは。実世界の個々の対象物のこと。一人一人の学生、教員、科目など。「学生」のようなカテゴリは実体型という。クラスのことかな?実体型は属性 attributeを持てる。例えば学生には氏名、住所、学籍番号などを持っている。学籍番号のような一意なキーを主キーという。

関連とは。2つ以上の実体同士の相互関係のこと。関連も関連型としてとらえることが多い。例えば学生→(履修)←科目のような関係。関連型に主キーなんてあるんかいな。人→結婚←人みたいな、同一の実体型の結びつきを表す関係もある。こういう場合関係性(ロール)が与えられる。結婚なら、夫や妻があるね。

1対1の対応関係は、考えやすい。教員→所属←研究室みたいな場合を考えることができる。このとき多重度は1対1という。主キーは教員でも研究室でもいい。

1対多の対応関係の場合は、多の方が主キーになる。例えば部活動と学生。学生の方が多いので、主キーは学生。多対多、例えば学生と科目の関係の場合は、主キーは両側の実体型の主キーの和集合(全組み合わせ)となる。主キーってのは一意性を満たす関係のことね。

実際の図を見て考える。図にするとどうやってモデルを作ればいいかわかりやすいね。昔、電車がリアルタイムで走るモデルを作ったことがあるけど、こんな風にモデルを作っておけばもっと楽だったな。

制約について。部活動と学生は1対多だけど、部活に所属していない学生や、だれも所属していない部活動があってもいいのかは明らかではなかった。これを認めるか認めないかを、参加制約という。関連図に最小値や最大値を書くことで参加制約が明確になる。

ある実体に依存して初めて存在できる実体型のことを弱実体型という。例えば科目に対するレポート。単体で存在できるのは強実体型という。弱実体型は、対応する強実体型の主キーに対して、部分キーを持つことができる。強キーと必ずペアで用いられる。

3項関連型。例えば履修を複数年度にしたい場合。学生、科目だけではなく年度(時期)も関連として採用してやればいい。

Is-A関連。社員に対する営業部員・製造部員のような関係。社員がスーパータイプ、営業部員・製造部員はサブタイプという。継承ともいってるし、クラスに近い考え方だ。

UML。統一モデリング言語の略。今使われてるのかな。ここまでの概念は全部表現できるみたいだよ。属性を実体型に含めて書けるので見やすい。

第7回

リレーショナルDBモデル。論理データモデルの1つ。リレーションは数学的に定義できる。情報の単位自体をリレーションと呼んでる。スキーマとインスタンスがある。構造、操作、制約が3つの要素である(?)

リレーションインスタンスというのは、表1個のこと。リレーション名とは、いわゆるテーブル名のこと。行はタプルという(いろんなデータの集合だからかな)。

主キーはスーパーキー(一意なキー)かつ候補キー(スーパーキーかつ極小単位)であるキーの中で、設計者が選んだもののこと。NULLを取らないという制約がある。

リレーションの定義は、全リレーションの直積集合のこと。いくらでもあるね。

リレーションは同一要素を持ってはならない。タイムスタンプとか通し番号とか持ってないとダメね。順番にも意味はない。

正規形。入れ子型を禁止すること。入れ子のものは別のテーブルに分けてやれば正規化できる。

リレーショナル代数。和集合とかの集合演算のこと。同じ属性とドメイン(テーブルのことかな?)をもっていないとだめ。商演算は難しいな。直積演算の逆。選択(select?)や射影もある。射影は要素の重複ができてしまうので、重複は排する。

整合性制約。ドメイン制約(変数の範囲の制約)、一意性制約(同じ値の排除)、非NULL制約(空データはダメ)、主キー制約(=一意性制約+非NULL制約)、参照整合性制約(外部キーは必ず外部リレーション内にある)がある。

概念データモデル→論理データモデルの変換について。実体-関連図を使えばそのまんま変換できる。っていうかこの図自体がほぼ論理データモデルなんだな。ID関連型(弱実体型への関連)の関連はリレーションに入れる必要がない(どうせ1対1になるしってことかな)。弱実体型に所有実体型の主キーを持たせとけばいい。関連は、やろうと思えばリレーションに併合してしまうこともできるみたい。その場合、1対1関連ならどちらでも、n対1型ならn側に併合できる。n対mの場合は無理。

第8回

データ操作について。ユーザーの要求は主に、問い合わせと更新である。今回は問い合わせについての学習。

リレーショナル代数→集合論に基づく問い合わせの体系。リレーショナル論理→論理式を用いてデータを表現。代数と論理は等価らしい(ほんとか?)

リレーショナル代数はコッドさんが作った。演算は8種類。和集合とか差集合とか。8種類のうち3つはほかの5つで表現可能だから実質5つ。和、差、直積、選択、射影。

和集合演算。同一ドメインの表を合算して重複するものは排除したもの。論理式だと、または(∨)で表現可能。

差集合演算。論理式だとA∧¬Bで表現可能。

共通集合演算。かつ∧と同義。和、差、共通集合演算は同一ドメインで同一属性じゃないとダメ。和両立という。共通集合は R – (R – S) でも表現できる(図を書いてみよ)。

直積演算。全タプルの組み合わせで結合する演算のこと。膨大な数になるね。別ドメインに同一の属性があっても、リレーション-属性を一組にして区別し、問答無用で組み合わせを考える。

選択演算。これが一番重要。選択条件を使って絞り込む。選択はσで表す。

射影演算。指定した属性だけ残す。減らした結果重複が生じたら、重複は削除。

商演算。R/Sなら、Sの属性値が全部含まれているRの属性値だけを残すことに相当する。例えば「S:アメとガムとカップ麺」で「R:コンビニ」を割れば、アメとガムとカップ麺を持っているコンビニが残ることになる。商はめっちゃ頑張れば射影、直積、差を組み合わせまくって表現できる(詳細は略)。

自然結合演算。2つのリレーションに共通の属性があるとき、同じ属性を持つタプルを結合すること。直積+選択+射影で表現可能。共通の属性がないタプルをダングリングタプルという。

θ結合演算(または単に結合演算)。共通の属性がなくても、結合条件を与えて結合させることで一般の場合に拡張したもの。これも直積+選択で表現可能。

外部結合。ダングリングタプルをNULLを用いて強引に結合してしまうこと。結合に使った全タプルが含まれることになるが、NULLがあるから扱いにくそう。

第9回

正規化。リレーションスキーマがよいものかどうかを判断する手掛かりになる。論理設計の一部。

関数従属性。Xの値が等しいすべてのタプルにおいて必ずYの値も等しいということ。X→Yの関係が成り立つことと同じ。学籍番号→氏名とか。リレーションRの出現しえるインスタンスの満たす性質のこと(リレーションを作るための必要条件ってことかな)。

関数従属性は実世界上の規約で決まる。例えば「受注番号が受注ごとに新しく発行される」という規約があれば、「受注番号→受注年月日、顧客番号」のような関数従属性が成り立つ。

関数従属性の表記方法。A1, A2, … Am → Y と表記する。カンマを省略することもある。A1A2…→Y 。X∨YはXYと書くこともある。

Kがスーパーキーであるとは、関数従属性K→A1A2…Anが成立することと定義することができる。Kが候補キーであるとは、Kの部分集合K’がスーパーキーにならないことともいえる。

A1A2…Am→B1B2…Bnという関数従属性が成り立っていたら、A1A2…→B1,A1A2…→B2のように分割できる。例えば、受注番号と項番が候補キーになっていれば、ここから受注年月日、顧客番号、単価などを一意に決定できるでしょ?ということ。受注番号単体では一位にならない。直感的にはそりゃそっかーって感じだけど式にして一般化も可能なんだね。

アームストロングの公理系。まず反射律。YがXの部分集合なら、X→Yが成り立つ。添加律。X→YならX∨Z→Y∨Zが成立。推移律。X→YかつY→ZならばX→Zが成立する。この3つが基本になる。

関数従属性の閉包。リレーションRにおける関数従属性集合Fが与えられたとき、①Fの要素と②Fの要素の任意の組の関数従属性が考えられ、①②をあわせてFの閉包という。F+と書く。なんのこっちゃって感じです。具体例が欲しい。

アームストロングの公理系は健全で完全であるという。健全→Fの各要素にアームストロングの規則を用いると、どれもF+の要素になる。完全→F+の関数従属性は、全部Fの各要素にアームストロングの公理系の各規則を適用すれば、導出できる。というわけで、関数従属性集合の閉包はアームストロングの公理系を使えば求められるってわけ(foon)。

閉包を求めるアルゴリズム。全然意味わからんが、「スーパーキーというのは数学的な手続きを踏めば必ず求められる」ということまでは理解できたので、そこまでにしておこう。

更新時異状。第一正規形では全部スカラー値になっているが、異状が起きることが3パターンある。

修正時異状。ある事実を表す情報が複数のタプルに存在する場合。例えばある商品番号の単価を更新したら、全部更新しないといけない。更新漏れがあるのが修正時異状。

挿入時異状。ある事実を表す値をデータベースに追加したいが、情報が足りなくて追加できない場合。

削除時異状。ある値を削除する時、意図しない形で別の事実を表す情報が失われること。受注情報を1行削除したら商品情報がなくなるとか。

これらをなくすために正規化が必要。まず第2正規形。Rの全ての非キー属性が、Rの候補キーに完全関数従属していること。完全関数従属性とは、Xの任意の真部分集合X’についてX´→Yが成立しないことをいう。成立してしまうことを部分関数従属という。部分関数従属をなくしていけばよい。

第三正規形。第二正規形かつ、Rの全ての非キー属性が、Rのいかなる候補キーにも推移的に関数従属しないこと。推移的関数従属性とは、関数従属性X→YかつY→ZのときX→Zが成り立つこと。推移的関数従属をなくしていくことになる。実質、全ての候補キーについて第二正規形と同じようなことを行えばよいということになる。

ボイス・コッド正規形。X→Yが自明な関数従属性であるかXがRのスーパーキーである、という条件を満たすこと。具体例を見せてくれたがよくわからんかった。

第10回

データベース言語。SQLについてくわしく。SQLはIBMが作ったSEQUELが原型。その後ベンダーごとに拡張が進み、ANSIやISOが標準化した。

リレーションとは属性の構成、ドメインの直積の部分集合のこと。リレーショナル代数とは、データ操作演算体系のこと。リレーションとSQLはデータの扱い方が少し違う。リレーションでは重複タプルは許されないが、SQLでは許される。また、リレーションでは順序が意味を持たないが、SQLでは順序があり、行や列の順序も支持できる。

SQLはDDL(データ定義)、DML(データ操作)、DCL(データ制御)で構成される。

DDLは具体的にはCREATE、ALTER、DROPの3つ。

表の種類。実表(実体)、ビュー(論理的な表??)、導入表(一時的な表)。

CREATE文。CREATE TABLE 表名+(列・データ・列制約)*n+表制約。表制約では、PRIMARY KEYで主キーを設定したり、CHECKで値の範囲を制限したりできる。

ALTERは属性の変更・追加。DROPは表の削除。

DML。選択はSELECT *(よく使うので略)。射影はSELECT文で列名指定。重複除去はSELECT DISTINCT。和集合はUNION ALL、差集合はEXCEPT ALL、共通集合はINTERSECT ALLを使う。ALLを省略すると重複除去も兼ねる。副問い合わせは()の中にSELECT文を入れる。

第11回

DBMS1回目。データベースには大量のデータが蓄積されていることが前提。高速処理、データの整合性の保障、同時処理が必要になる。他にも障害復旧、セキュリティ、操作手段(言語の提供)も必要。

構成。問い合わせ処理部、トランザクション管理部、記憶管理部からなる。

前回のデータ定義、操作、制御はそれぞれメタデータ管理、問い合わせ処理、トランザクション処理として実装される。

メタデータ管理。メタデータとはデータのデータのことで、テーブルに関するデータや、列、索引、型構造のデータのこと。データ辞書に格納される。

データベースの格納方式。揮発性では困るので磁気ディスクに格納する。レコード、ファイルといった単位を使う。テーブルとファイルは1対1対応する。レコードは行、フィールドは列。論理的配置と物理的配置は違うことに注意。

代表的な格納方法に、ヒープ、索引編成、B+木、ハッシュがある。

ヒープ。効率的だが、順序はキー値の順にはならない。順次探索しかできないのでノロい。

索引検索。インデックスのことかな。主索引(主キーかな)と二次索引(主キー以外のフィールド)がある。二次索引を用いると検索が効率化できるが、レコードの格納位置が変わると、索引中の格納位置も変えないといけない。なので、ディレクトリ参照(どこにレコードがあるかの情報)をするようにする、ここでいうディレクトリはwindowsのファイルシステムとは違うようだ。レコード挿入は索引修正が必要になる。レコードをずらさなくていい工夫が必要。—バーフロー領域を使ったりしてなんとかする(よくわからん)。

索引を階層化して検索時間を減らすことを考える、これがB+木。木の高さをなるべく等しくするような木のこと。葉以外の節が索引(どうやってるの?)。B+木自体が探索木になる。キーの値を二分探索していくといずれ辿り着く。レコードの挿入は木構造の再編成をすることで実現する。

ハッシュ。ハッシュ関数を用いてキー値からレコードの格納位置を算出すること。高速。でも範囲指定とか全レコード読み出しが無理。

問い合わせ処理。コストをできるだけ小さくすることを最適化という。処理の流れは構文の判定→最適化と実行プランの生成→実行プログラムの生成→実行。

多様な実行プランの存在要因。代数演算処理には組み合わせに任意性がある(等価なものがいっぱいある)こと、代数演算処理がデータへのアクセス処理の仕方に影響を受けることなど。例えば選択と射影をする方法には、選択→射影でも、射影→選択の順でもいい。

テーブルの結合方法。まず入れ子ループ法。結合先から1行読んで、結合元の各行を読んで言って結合。これだと結合先(外部)に行数が少ない方を持ってくる方が速い。

マージ結合法。各テーブルを結合フィールドでソート後、フィールド値の小さい順に結合する。ソートにコストがかかるが、その後は速い。

ハッシュ結合法。ハッシュ表に両方とも行を読み込んで、同じハッシュ値になるものを結合。ハッシュ表が主記憶上に保持できれば高速処理が可能。

第12回

DBMSの第2回。トランザクション管理について。トランザクションは処理の単位のこと。例えば5000円の振り込み処理を考えると、出金と入金が両方同時に行われないといけない。片方では困る。

ACID特性。原子性、一貫性、隔離性、持続性。これが順守されていないといけない。原子性→全部完了 or 全く実行されないこと。一貫性→DBに矛盾が生じないこと。隔離性→各トランザクションは独立して実行できる。持続性→トランザクションが終了すれば、障害発生しても結果が消えないこと。

トランザクションが終わったら、コミット(終了)かアボート(障害発生、中止)のどっちかになる。

同時実行制御。口座の話だと、送金処理中に他人の入金があった場合どうなるか。制御がないと他人の入金が上書きされてなかったことになってしまうかもしれない。複数のトランザクションが同時実行されるとき、矛盾が起きないようにしないといけない。代表的なのはロック方式。排他制御する。1つのトランザクションだけがロックをかけられる。後のトランザクションはアンロックされるまで待つ。まあこれもプログラミングの実務でよくやるよね。

直列化可能性。複数のトランザクションを並列処理した結果、逐次処理と等価になること。これがうまくいけば並列処理可能になる。2相ロッキングプロトコルでこれを保障できる。複数のトランザクションで読み書きの対象データをロックし、処理終了までアンロックしないこと。ロックを解除したら再度ロックできないようにする。これでいいらしい(数学的に証明できるのかな?)。ただ、複数の資源を同時にロックせざるを得ないので、効率がちょっと悪い。

共有ロックと占有ロック。共有ロックは読み込み用。参照を許可する。占有ロックは書き込みを行うのでアクセスも禁止する。これを使い分けて高速化を図る。

デッドロック。複数のトランザクションが互いに他のアンロックを待っている状態になること。T1がxをロック、T2がyをロック、T1がyを待ち、T2がxを待つとデッドロックが発生する。こういうときはDBMSが強制的アボートをして解消する。

隔離性レベル。未コミット読取り→コミット済み読取り→再読み込み可能読取り→直列化可能、の順でレベルが高い。

障害と回復。トランザクション障害。トランザクションの途中で異常が発生した場合のこと。システム障害。全トランザクションが停止すること。メディア障害。ディスククラッシュのこと。一番障害が大きい。

ロールバックとロールフォワード。ロールバックが実行開始前、ロールフォワードは実行完了にすること。アボートしたらロールバック、コミットしたら障害発生してもロールフォワードする。

メディア障害をに備えるためには、フルバックアップしたり差分バックアップしたりする。差分バックアップはトランザクションだけ記録して実装してる。

ログ。データベースの更新を記録したもので、更新前と更新後の状態とか、トランザクションそのものを記録する。ロールバックもロールフォワードもログを見て実行する。

ログを取るタイミングの問題。WALプロトコル。ログ先行書き出し(Write Ahead Log)のこと。データベース更新前に全部ログを記録してしまうこと。そうしないとロールフォワードが不可能になる。更新後ログも先に書いてしまう。

チェックポイント。一定間隔でバッファのデータをディスクに書き込むこと。ログはでかいので復旧には時間がかかる。チェックポイントがあれば、これ以降のログを用いて回復処理が行えるから、処理時間短縮になる。

第13回

データベースの発展技術1。データストアについて。

データベースの機能から。本質的な機能として、データの論理形式・格納と操作。選択的な機能は永続性・整合性・高速応答性・堅牢性。

データ操作の4要件、CRUD。Create, Read, Update, Delete。

キャッシュデータベース。応答性の優れたキャッシュデータベースを真ん中に挟んで高速化を図ること。これうちの実務でもやってるぞ!不整合が起きないようにする工夫が必要になる。

データストアとは何か。データベースの機能、性能を特徴づけるデータ集合の入れ物。データ取扱い単位の概念を含む。実装の詳細は含まない。論理的モデルと物理的モデルの中間あたりに位置する。

データストアの5分類。キーバリュー型、列指向型、リレーショナルデータベース、ドキュメント指向、グラフデータベース。

キーバリュー型。キーとバリューの組(タプル)のこと。大規模性、高速性が特徴で、演算機能はない。

列指向型。タプルを識別するキーと、属性:値の多数の組。タプルごとに異なる属性を持てる。キーバリュー型のもう一段階複雑なやつって感じ。リレーショナルデータベースと比べると、列単位の読み書きや列の追加が簡単なことが特徴。逆に、リレーショナルデータベースは行指向といえる。

ドキュメント型。XMLデータベースとか。柔軟なデータ形式が特徴で、入れ子構造も行ける。集計は無理。

グラフデータベース。次回に回す。

社会での様々なデータベース。IoTのことを聞くため、ソラコムのCTO安川さんにインタビュー。今私たちは時計とかカメラとかいろんなものからDBにデータを上げてる。で、こういうデータは消えない、消さない。データベースは大規模化してる。web、IoT時代だと24/365で稼働、高速応答が求められる。リレーショナルデータベースは何でも使えるのが利点。ただ、いつも使いやすいわけではない。アプリケーションによっては特定の機能に絞った方がよいこともある。そこでデータストアの選択が大事になる。

キーバリューストアを使う場合。ショッピングストアとか、可用性、高速性、分散処理が大事な分野で有利。性能の向上も簡単。線形でできる。一方でSQLだと大掛かりになってしまう、重い。スケーラビリティが厳しい。柔軟なクエリ、トランザクションが必要ならRDBを使えばいい。

オンライントランザクション型では、ランダムアクセス性能に強いSSDの方が有利らしい(!)。ハードディスクはランダムアクセスは苦手。なのでサーバーでもSSDが好まれるようになってきている。連続したデータならハードディスクでも強いので、今でも使われることがある。

Update、Deleteが実際ないようなデータベースもある。再配置とか面倒なんでやめて、リンクだけなくしてしまう。そうするとかなりコストを省くことができる。メッセージを削除してもデータベース中には残っているという話。デリートマークだけつけてるってことかな。

列指向データベースの使いどころ。RDBはオンライントランザクション型に強い。トランザクションが行と同じだから。一方でデータの分析には列指向が強い。ユーザープロファイルからデータを取りだして解析したいって時、RDBだと全部の表を読まないといけないけど、列指向だと速い。

第14回

グラフデータベースについて。グラフの基本についてはほかの講座でやったので略。

プロパティグラフ。ノードには名前がついているほかに、プロパティも持っている。エッジにも名前やプロパティがついている。

グラフデータベースの構成。リレーショナルモデルなら、関係性をデータベースに保存することができる。JOINすればいろんな関係性がわかるが面倒。一方でグラフモデルなら、エッジをたどることで簡単に関係性が分かる。ネイティブ処理エンジンというのを使って、高速にエッジをたどる機能がある。

Cypherという言語を使う。SQLに似ている。

CREATE (alice{name: ‘Alice’}), (bob{name:{‘Bob’})

みたいにノードを生成できる。エッジを生成するときは

CREATE (alice{name: ‘Alice’}) – [:FRIEND] -> (bob{name:{‘Bob’}), (alice) <- [:FRIEND] – (bob)

みたいにやればよい。直感的だ。

RDBとの違い。例えば人テーブルに年齢という列を加える。RDBだと非常にコストがかかる。グラフデータベースなら、プロパティの追加で済む。列指向型と同じで簡単。また、1対多の関係も簡単。エッジを追加するだけ。

エッジの検索。

MATCH(p) WHERE p.name = ‘Alice’ RETURN p

で、Aliceというノードを検索できる。

MATCH文とCREATE文を組み合わせることもできる。MATCHした結果を使って、そこにCREATEでノードを追加できる。

MATCH (p{name:’Alice’}) – [:FRIEND*2] -> (friend_of_friend) RETURN DISTINCT friend_of_friend.name
にすれば、Aliceの友達の友達の結果を検索できる。グラフの特性を大いに使った問い合わせだ。これをRDBでやると、JOINを何度も使うことになり、非常にコストがかかってしまう。隣接性を使う場合はグラフの方がとても有利。友達の友達の友達の・・・ってやるときは数字を増やすだけでいいしね。

第15回

分散データベース。

検索高速応答性を考える。インデックスはある程度範囲を絞ったうえで線形探索するから、場合によっては遅い。B+木の計算量はO(logN)で速いし範囲検索も可能。ハッシュはO(1)でめちゃはやいが範囲検索は無理。

ストアドプロシージャ。データベース側に処理内容を保存しておいて、例えばSELECTとログのINSERTを同時に行うようにする。バッチ処理をDB側においておくようなもんかな。アプリケーション側との通信の削減と、処理の漏れが無くなる。

Map Reduce。入力した文章群をMap Stepでクラスターごとの文章にノード単位で分割、さらにReduce StepでShuffleしてwordに分割。出力でwordごとの回数の合計を得る。大量のデータを処理できるのが特徴で、分散処理もできる。ストアドプロシージャの分散DB版。

スケールアップとスケールアウト。スケールアップは高性能なハードウェアを使えばいい。が、金がかかる。スケールアウトでは、処理を分散させて全体としての性能を向上させること。金がかからない。協調動作が難しいのが欠点。

スケールアウトの手法。まずレプリケーション。データベースの複製を用意して、同期する。負荷は減るが、データの変更が大変。

シャーディング。データの一部分をドメインみたいな感じで分けて管理。北海道、青森県、岩手県で分けるとか。同期がいらない。ただ、ボトルネックが一番処理の集中するDBになる。東京ってDBを作ったらそいつが辛い処理になってしまうね。

分散データベース。まずCAP定理。C整合性、A可用性、P分断耐性。整合性はどのノードからも同一の値が読み出せること。可用性は、アクセスできればリクエストに応答できること。分断耐性は、システムが分断されても機能を継続できること。故障があってもこれを満たしてほしいが、全部は無理。2つはいけるが1つは諦めなければいけない。これがCAP定理。

CAだけ生きていて分断されてるときは、互いに通信をシャットアウトすればよい。CPだけ生きているときは、一つの断片だけ機能させる。すると整合性はなんとかなる。APだけのシステムにするなら、全断片を機能させるが、不整合は生じる。いずれかの組み合わせを選択しないといけない。だいたいはCPかAPを選択する。

BASE。Basically Avaliable Soft-state Eventual consistency。基本的に可用、データ状態は厳密でない、結果的に整合性をもつ。例えば分散DBで、住所データベースを実現するとして、新住所を更新したとする。これを他のDBに通知して、いずれは全ノードで新住所に更新されればいいやという考え方。一定時間内は不整合が発生する。障害があれば不整合の時間は長い。

決済への応用。決済は素早く行わなければいけないので、中央データベースに毎回アクセスしていられない。そこで少額の決済処理を店舗側データベースでも行えるようにする。で、処理は順次中央データベースに送られていくようなモデルにすれば、正確性と迅速性を確保する。一定金額以上は中央にアクセスしないといけないようにすればよい。

気象情報などのセンサネットワークはそもそも分散してデータが発生するし、逐次的に発生する。これも分散処理に向いている。

放送大学全科目感想 016 コンピュータの動作と管理(’17)

  • 情報コース
  • テレビ科目
  • 葉田善章先生
  • 難易度 ★★☆☆☆
  • おすすめ度 ★★☆☆☆

前半ではハードウェア周りからコンピュータの動作とは何なのかを攻めていく。後半はOSを中心とした話題。先生はハード専門なのか、ハードウェアの方が突っ込んだ話が多い。全体的に情報量は多め。ひたすら先生が一人でしゃべっていて、インタビューなどはなし。印刷教材で十分かもしれない。

第1回

葉田先生一人での講義。OSの話らしい。

いろんなコンピュータがあるよねって話から。基本的な機能を提供するのがOS。

10回でハードウェアの話。5回でOSの話。結構知ってる話も多いので知らない話だけ書いていこう。

OSはプログラムとハードウェアの管理を両方行う。プログラムについてはタスク管理をしてマルチタスクを実現する。OSがハードウェアを管理するので、プログラム側からはハードウェアの違いを意識しなくてよい。

ハードウェアの話。同一コアのCPUのことをホモジーニアスというらしい。異なるコアだとヘテロジーニアス。CPUは命令セット空間(命令の集合)を持ち、ヘテロジーニアス型だと命令セット空間が異なる。なので別々のプログラムが必要になる。

レジスタには汎用レジスタと制御レジスタがある。制御レジスタにはプログラムカウンタ、PSW(フラグを集めたもの)などから構成される。汎用レジスタはデータレジスタといい、算術論理演算回路(ALU)で使われる。

OSの重要な機能として抽象化がある。プログラムがCPUのことを意識しないようにする。1つのCPUをOSが仮想CPUに分割したりできる。実際は1つのCPUが並列処理をシミュレートしたような動作をする。入出力装置についても仮想メモリとメモリを同一に扱ったり、SSDやHDD、USBメモリを同一に扱うことができる。

第2回

演算装置について。

プロセッサは電子回路でできている。電子回路の例としてLEDが光る回路が出てきた。スイッチに電流が流れればLEDが消灯。スイッチに流れなければLEDが光る。これがNOT回路。実際は電圧の高低で表現する。コンピュータの01は電圧の高低で表している。高電圧を1、低電圧を0とするのが正論理で、逆は負論理。先生が見せてくれたNOT回路はICで実装されている。

クロック信号について。クロック信号はパルスで出力される。電圧の高低を速い周期で繰り返す。電子回路はこいつに同期して処理を行う。命令1つあたりのクロック数をCPIという。CPUの速さを測定するとき、クロック周波数ではあてにならないので、平均CPI(全命令のCPIの平均)で比較することが多い。プログラム実行時間は命令数 * 平均CPI / クロック周波数 となる。

クロック信号にはノイズが入る。このような場合でも動作するようにしきい値を設定する。しきい値と比べた高低を調べれば少々ノイズが入っていてもよくなる。

シングルコアとマルチコア。シングルコアだと書かれた順で処理が実行されるが、マルチコアだと、命令を並列処理できる。OSの管理機能と組み合わせて処理速度を上げていく。

プロセッサーの処理方式。データ処理と命令方式をそれぞれシングル、マルチにするかによってSISD, SIMD, MISD, MIMDがある(頭が追っつかない)。

命令セット空間について。だいたい基本的な機能はどの命令セットにもある。独自の命令を拡張命令セットという。

プロセッサのコアについて。ALUの例として、D型フリップフロップというICを考える。割と簡単な回路図で表現されている。電圧の高低を記憶できるので、01のどちらか、1ビットを表現できる。4bitを記録するなら、D型フリップフロップが4つ必要になる。読み出しでは4つの値を結合して解釈すればいい。このとき、4つのフリップフロップにクロック信号を同時に与えれば、4つの値を同時に解釈することができる。

レジスタが値を保持するにはどうするか。出力を入力に直接つなぐと、クロック信号が変わっても同じ値が保持される(なんのこっちゃ)。

演算を行うためには、出力→入力の間に回路を置く。例えばNOT回路を置けば、レジスタの値が更新される。保持回路(ただの線)とNOT回路をスイッチで切りかえれば、処理の切り替えと同義になる。スイッチも回路で実現できる(要復習)。

プログラムカウンタについて。プログラムの例が出てきた。プログラムカウンタには次の命令のアドレスが入っている。プログラムカウンタを変更するタイミングは、クロックの立ち上がりのタイミングと同じ。(駆け足でよくわからんかった)

第3回

CPUの処理について。

64bitと32bitでは命令セットが違うが、64bitCPUは32bitプロセスも実行できる。互換性があるという。

ASCIIコードは8bitである。データに何を対応付けるかはプログラムによって違う。データの基本単位のことをワードという。64bitOSならワード長64bitってわけ。データ長がワードを長える場合はどうするか。データをワード長で分割すればいい。64bitOSで32bitのデータを扱うと、32bit余るのでプロセッサの性能が完璧に使えるわけではない。

命令とオペランドについて。命令は命令部とオペランド(命令用のデータのこと。任意)。オペランド部のデータのことをイミディエイトデータともいう。

機械語を数値で表すと16進数2桁(命令部+オペランド)であるが、これを人間でもわかるように記述したのがニーモニック。ADD A, 6 のように書く。アセンブリ言語の単位である。もっと人間にわかりやすくしたのがプログラム言語。結局最終的には機械語にするんだけど。

命令実行について。命令フェッチ(読み込み)→デコード(命令解釈)→オペランドフェッチ→演算→書き込みという流れ。この一連の流れを命令サイクルという。一部の処理が省略されることもある。最初の二つをフェッチサイクル、残りの3つを実行サイクルともいう。フェッチサイクルはメモリからデータを持ってきて、命令デコーダーで解釈することに相当する。実行サイクルは、読みだしたデータをALUに投入してレジスターなどに書き込むことに相当する。

何やら概念的で具体的なイメージが全然わかないな。

命令が連続している場合、フェッチ、実行サイクルは別々の回路なので、並列して処理できる。先取制御、先回り制御という。細かく区切ればパイプライン処理になる。

命令にもいろいろ種類がある。転送命令、演算命令、算術演算。。。

最後にアーキテクチャの話。CISCは可変長命令、簡単な命令は短いなど最適化されている。RISCは命令が固定長。単純な命令が多く、パイプライン処理に向く。プログラムは大きくなる。

第4回

周辺機器との通信について。

直接制御と間接制御。入出力ポートなどでつないでCPUが直接アクセスできるのが直接制御。プロセッサをかますと間接制御となる。間接制御では制御はプロセッサが行う。たぶんプログラム的にはインターフェース用の関数があるんだろう。

個別ポート方式とバス結線方式。ポート+インターフェース+周辺機器をセットで組み合わせるのが個別ポート方式。ポートのアドレスが分かればプログラム的にはやり取りが可能になる。バスという専用線を使うのがバス結線方式。バス→インターフェース+周辺機器の組み合わせだが、バスは全周辺機器で共通のため、交通整理が必要になる。

入出力ポートによる接続について。まずメモリーマップドI/Oについて。メモリ空間にI/Oポートを割り当てる。メモリ操作によって周辺機器を操作できる。ポートマップドI/Oはメモリ空間ではない専用のI/O空間にポートを割り当てる(windowsはこっちか?)。マイコンではレジスタにI/Oを割当てたりもする。いずれの接続方法でも、I/Oポートを介して周辺機器のレジスタにアクセスしてデータをやり取りする。どのポートでも電圧の高低と0 1を対応付けて入出力する。演算回路の途中にポートを入れることで、信号を入出力することができる。

バスを介した入出力について。バスは乗り合いバスのバスからきているらしい(まじで!?)プロセッサとタイミングを取り合って、みんなで共通のバスを使っていく。データバスの信号線の数をデータバス幅といい、32bitなら32本信号線がある。このほかにアドレスバス、制御バスがある。

バスを使ったデータ読み出し。よくわかりませんでした。制御バスが、他のバスの動作を抑制しているってことかな?バス使用中はほかの装置はバスを使えませんよってするんだと思う。

第5回

効率的なプログラム実行について。プロセッサの方が周辺機器より速いので、待機状態を避けるためにいろんな工夫が必要になる。

プログラムは待機状態をとるためにループ構造を持つことが多い(ループがないと一瞬で終了するから)。機能ごとにサブルーチンに分けて、都合に応じて呼び出す、という構造をとっている。これに合わせて周辺機器の制御を行えばよい。

まず繁忙待機。メインプログラム内では、ループ内で外部回路操作命令を定期的に行うことをいう。ポーリングともいう。周辺機器のステータスが何か変化したら何か処理を行うって感じの処理になる。周辺機器の状態変化が速すぎると取りこぼしが出る。

割り込み。プログラムに割り込み処理を設定しておいて、周辺機器側から割り込み処理を呼び出すやりかた。プログラムにはやっぱりループが必要。割り込み処理は取りこぼしはないが、プログラム構造がとても複雑になる。中断再開の仕組みが必要になるから。

割り込み処理の詳細。仕組みは仕事中に電話がかかってくることと同じ。割り込みには外部割込み(異常を表す機械チェック、入出力割込み、タイマーとか)、内部割込み(0除算した場合など、プログラムによる割込みや、SVCスーパーバイザーコール・システムコールのこと、がある)がある。

データバッファを使うかどうか。バッファなしだと割り込みに全対応しないといけないので大変。バッファありだと、細切れでデータ転送ができて、一定量溜まったときに初めて通信できるから、割り込みの回数が減る。なので便利。効率的。

割り込みサイクルはどこに挿入されるか。フェッチサイクル→実行サイクルの次に挿入するしかない。フェッチサイクル→実行サイクルの間に割り込みフラグを立てておいて、フラグが立っていたら割り込み処理をする、という方式になる。詳細としてはPSW退避サイクル→PSWロードサイクルの実行、の2ステップになる。これが終わったら、退避サイクルで退避していたデータから最初の状態に復旧して、またフェッチサイクルに戻ればいい。

割り込み検出方法。まずベクター割り込み方式。割り込み番号を周辺機器に割り当てておく。番号込みで割り込み処理が伝えられるので、番号ごとに対応ができる。割り込みハンドラー(割り込み番号+αの情報のことと思う)を保存しておく割り込みベクターが必要になる。ポーリング割り込み方式では、割り込みハンドラーを1つだけ持つ。これだと誰が割り込み処理を投げたかわからないので、全周辺機器の状態を調べて発生元が誰なのかを特定する。割り込み番号がかぶっていても対応可能という利点がある。

割り込みにも優先順がある。割り込みハンドラーに優先順をつけておいて、エラーなどレベルの高い割り込みから処理していく。レベルの低い割り込みと高い割り込みが競合したら、やはり高いものから処理する。多重割り込み処理という。

第6回

補助記憶装置について。

ハードウェアを使うプログラムには、ハードウェア制御のプログラムと目的の処理を行うプログラムの二種類がある。ハードウェア制御はOSに任せておけば、目的の処理だけを行うプログラム(アプリケーション)は自分の処理に集中できる。

物理的資源と論理的資源。物理的資源はハードウェアのことで、論理的資源は実際には存在しない思考上の存在のこと。OSは物理的資源(CPU)から論理的資源を作って割り当てる役割をする。論理プロセッサ、仮想プロセッサともいう。

抽象化。携帯音楽プレイヤーの再生操作とか、対象の共通の操作方法を取り出すこと。周辺機器も種類ごとに抽象化を行えば操作が簡単になる。コンテンツプレイヤーの回路構成や部品の違いは、インターフェースの統一によって解決できる。ハードウェア抽象化も同じように、プリンターならプリンターの機能、記憶装置なら記憶装置の操作方法を決めておいて、どれでも同じ操作ができるようにする。カプセル化ができる。

データの抽象化について。ファイルは抽象化の1つ。ただのデータの集まりを、とらえやすいものにする効果がある。また、電圧の高低や磁気による記憶を0-1に変換することも抽象化の1つ。フォルダーも抽象化の1つである。

データの記憶について。物理的性質を吸収する役割を持つのがボリューム、フォーマット、ファイルシステム。補助記憶装置はデータを記録する1単位があるが、OSはそれを意識させないようにする役割がある。

OSによる記憶装置の認識について。物理ボリューム内に複数の論理ボリュームを作ることができる。OSは論理ボリュームを別ドライブとして認識する。未対応のファイルシステムは見えない。

第7回

OS構造と周辺機器について。ソフトウェアは他への影響が少ないような課題に分割され、モジュールとして実装される。できるだけ機能の重複がないようにして、モジュールを組み合わせてソフトウェアができる。これを構造化という。中身をブラックボックスにしてインターフェースでやり取りできるようにすれば便利。構造化プログラミングという。

オブジェクト指向プログラミングについて。オブジェクトとインスタンスの話は略。

分割によるソフトウェア開発について。分割されたモジュールそれぞれを見ていくと、ユーザーに近い部分とハードウェアに近い部分では機能が異なる。ユーザー付近では主にUIなど抽象化レベルの高い機能が、ハードウェア付近では抽象化レベルの低い機能が実現される。

OSの下部にはハードウェア抽象化層(HAL)があり、ハードウェアの違いを吸収している。

OSの基本的な機能をカーネルという。スーパーバイザーともいう。モノリシックカーネルは一つのカーネルで全部を補う。UNIXなど。効率的だが、一つのメモリ空間で全部を補わなければいけない。だから一つ不具合が起きれば再起動するしかない。マイクロカーネルはOSの提供する機能を別々に動作させ、OS内にシステムサーバーを設けてマイクロカーネルをそれぞれ担当させる。独立したメモリ空間で実行されるので、異常が発生しても個々のサーバーの問題になる。(具体的なOSは?)手間はかかる。最近は両方を組み合わせたハイブリッドカーネルが流行りである。

ようやく周辺機器の利用について。周辺機器を利用するにはOSに認識させないといけない。周辺機器を接続するとOSからデバイスIDが割り当てられる。デバイスにはHDDのようなブロック型デバイス、キーボードのようなキャラクター型デバイス、ハブのようなパケット型デバイスがある。

デバイスドライバ。HAL層に入るのがデバイスドライバである。階層構造があり、個別のドライバの層と、共通の機能を持つHID(マウス+キーボード)、ディスクドライバ、プリンタ、ネットワークの層がある。ネットワーク層の上にはプロトコルスタックもある。デバイスドライバの上には管理機能の層もある。デバイスドライバを都度勝手に設定してくれるのがプラグアンドプレイ機能。

データ転送の高速化の工夫について。データ転送をずっとやっているとプログラムが止まってしまう。DMAを使うと、DMAコントローラを介して周辺機器とメモリーがCPUを介せず直接アクセスできる。CPUのキャッシュメモリも速度を上げる工夫の一つである。メモリインターリーブは物理メモリにアドレスを分割して記録することで高速化を実現する。

第8回

OSによるプログラム実行管理について。補助記憶装置に記録されたプログラムからプロセスが作成され(ロード)、メインメモリに格納される。プロセスをインスタンスともいう。プロセスはメモリ空間に領域を確保する。プロセスのメモリ空間はコード領域、データ領域(グローバル変数)、ヒープ領域、スタック領域に分割される。ヒープとスタックは容量が可変。コード領域は下から上(アドレス小→大)に向かって実行される。

プロセスの生成と終了。ロード→実行・資源の割り当て→終了・資源の解放という順。プロセスの終了は、正常終了・異常終了・強制終了がある。

複数プロセスの実行。3つのプロセスが実行されているとき、メモリにはそれぞれのプロセスがある。仮想プロセッサがそれぞれのプロセスを担当する。マルチタスクを実現する方法はいろいろある。マルチコアならそれぞれのプロセスを対応させられる。プロセスを担当するコアを動的に切り替えていけば効率的に動作させられる。

プロセス切り替えについて。実行状態を退避するには、記憶装置に、メモリー空間に加えてプロセッサの制御などのコンテキスト空間も保存しないといけない。復旧の時は、コンテキスト空間も一緒に復旧すればよい。プロセス切り替え(コンテキスト切り替え)にはコンテキスト空間も切り替えないといけない。仮想プロセッサに割り当てるコンテキスト空間をそれぞれ記憶装置に持っておいて(コンテキスト退避領域)、プロセスごとに物理プロセッサに毎回割り当てていけば動作を実現できる。マイクロカーネルはカーネル機能をプロセスとして動作させている。常駐プログラムみたいなもん。

スレッド。プロセス内の処理の流れのこと。スレッドごとに仮想プロセッサが割り当てられる。動画エンコーダーとか、webブラウザを考えればよい。画像やら動画やら、画面ごとの処理やらを分割して並列処理している。コンテキスト切り替えのコストは同一プロセス内なので少ない。軽量プロセスとも呼ばれる。

プロセス・スレッドの管理。実行可能状態・実行状態・待ち状態の3つの状態がある。実行可能状態では仮想プロセッサが割り当てられていない状態、実行状態は仮想プロセッサが割り当てられて動作している状態、待ち状態はプロセッサとは関係なく実行の中断している状態をいう。プロセスが開始すると実行可能状態と実行状態を行き来して、終了する。待ち状態は、主に周辺機器を使う場合に実行状態から遷移する。待ちが終わったら実行可能状態に遷移する。

OSの特権モード、非特権モード。特権モードは全ての機能が使える。入出力や制御機能も使える。非特権モードは通常の使い方で、制限がある。モードは階層構造も持てる。

スケジューリング。OSのカーネルが持つ。実行可能状態のプロセスを順序だてて実行する。スループットがなるべく高くなるようにしたい。待ち状態や無限ループが発生している場合は飛ばしたい(具体的なやり方は不明)。ここは詳しいことがわかんなかったっす。。

第9回

プロセスの協調動作とメモリー。プロセス協調とは。プロセスが複数同時に実行されること。プロセス内には複数のスレッドがある。すると資源の譲り合いが必要になる。プロセスにはそれぞれ仮想プロセッサを割り当てる。プロセス間のを同期を取る必要がある。

プロセスαとβがあるとする。同じ資源を利用する命令がある場合どうするか。例えばファイル書き込み。同時に書くとファイルが壊れるから、一方が書き込み中は他方の書き込みを禁止しないといけない。プリンターも同時に使えない。資源の取り合いが発生することを競合という。資源の解放待ちの時間のことを封鎖ブロックという。封鎖ブロックが終わったらプロセスは再開する。

相互排除。資源を利用するスレッドを1つにすること。利用中であることを占有とかロックという。利用できないことを封鎖とかブロックという。資源管理はOSが行う。資源を利用する機会は全てのプロセスに公平に与えられるし、時間がかかっても必ず資源が利用できる。

資源管理用のプログラムを制御プログラムという。管理を行うところをクリティカルセクションという。クリティカルセクションでやること。一番簡単なのは割り込みの禁止。簡単だが他のプロセスに支障が出ることがあるから、できるのは短時間だけ。

次にフラグを使う。記憶領域に01のフラグを作っておいて、1にするのをフラグを上げる、0にするのをフラグを下げるという。資源のフラグを上げておけば、利用中というわけ。

セマフォによる管理。セマフォ変数を使う。0以上の値を記録できる。最大で使える回数を最初に設定しておいて、P操作(acquire)でデクリメント、V操作(release)でインクリメントする。0なら使えないってわけ。

資源の管理を行っていてもデッドロックになることがある。みんなが解放待ちになって処理が進まないこと。

プロセス間通信。プロセス同士のデータ交換のこと。メモリー共有、メッセージ通信といった方法がある。共有領域つかったことあったっけ?あんまやんないよね。危険だし。メッセージ通信にはIPCとか。メッセージで同期を取ることもできる。これはけっこう実務でもやる。データベース管理ツールと、メインのプログラムでよく通信してる。チャネル、ポート、メッセージボックスなどを介する。

メモリー管理。OSを使ってメモリを管理することを考える。カーネルとプロセスの間に連続した空き領域ができる。プログラムに応じて連続した空き領域の所を使っていくが、細切れになってしまうことがある。断片化という。断片化解消の方法としてコンパクションがある。デフラグみたいなやつ。実行中に再配置できるのをリロケータブルという。

ページング。物理アドレス空間と論理アドレス空間は違うという話。たしかに、論理アドレス使わないとコンパクションとかできないよね。論理アドレスがあるからこそ連続したメモリ領域の確保ができる。C言語では論理アドレス使ってるんじゃないか?物理アドレスの1単位をページとかフレームという。論理アドレスと関連付ける機能をMMUという。関連付け自体をマッピングという。

仮想メモリ―の仕組み。まずオーバーレイから。プログラムをオーバーレイローダー+ルートモジュール+モジュール(複数)に分割。機能が必要になった時点でモジュールを切り替える機能のこと。

仮想メモリ―。物理メモリーに加えて補助記憶装置(バッキングストア)を足して仮想メモリーにすること。ページングによって、論理ページ⇔物理ページの対応表(ページテーブル)が作られるが、物理ページが割り当たってない論理ページを参照(ページフォールト)が起きれば、バッキングストアからデータを持ってくることになる。これをページインという。頁アウトは意味わかりませんでした。印刷教材を読みます。

第10回

記憶装置とOSの起動。記憶装置の話。一次記憶装置と二次記憶装置。プロセッサ、電源と連動した記憶保持をするのが一時記憶装置。いろんな記憶装置を紹介してくれてる(略)。

半導体メモリーの分類。RAM→SRAM(Static RAM、高速低容量), DRAM(Dynamic RAM、高容量)。ROM→マスクROM(完全読み込み専用)、EEPROM(Electronically Erasable and Programmable ROM、たまに変更できる)、フラッシュメモリー(ほとんどはこれ、書き換え可能)。マスクROMはこれファミコンのカートリッジだな。電池ついてるし。

フラッシュメモリーの分類。NOR型。アドレス指定でランダムアクセス可能なのでプログラムも記録できる。BIOSやスマホのファームウェアなど。NAND型。ページ単位のアクセスが可能。大容量用。SSDとかUSBメモリとか。NAND型にはSLC(Single Level Cell)型とMLC(Multiple Level Cell)型がある。MLCの方が大容量。

フラッシュメモリーと記憶素子について。記憶素子ごとに記憶できる回数が決まっている。まんべんなく使えば寿命を延ばせる(ウエアレベリング)。

補助記憶装置(略)。

OSの起動と動作モード。起動中の動作をブート、ブートストラップという。電源ON→リセット割り込み発生→ブートローダーがBIOSを実行→IPLを実行して二次ブートローダが実行→OS実行という流れ。

コールドスタート(ハードウェア初期化有)、ウォームスタート(ハードウェア初期化されてる状態からの起動)。

OSの動作モード。サスペンド→待機状態。メモリのみ電源保持。ハイバネーション→補助記憶装置にメモリの内容を移してから電源OFF。ハイブリッドスリープ→両方の組み合わせ。

第11回

OSについて。OSの種類から。スパコンは専用OS。組み込み機器はTRONなど。サーバーはUNIXだよね。規模にあったOSを適用することをスケーラビリティという。最近はスマホ→PCの順でソフトウェアが移植されるようになってきた。これをモバイルファーストという。

スケジューリングの違い。単位時間をタイムスライスと言い、タイムスライスごとに平等にプロセスを回るのがラウンドロビン。時間が長いプロセスを優先することになる。これを使うのはタイムシェアリングOSという。

リアルタイム処理。携帯電話の着信があった場合を考える。タイムシェアリングだと通信の途切れが発生する。なので優先度を上げたい。イベントに基づいた優先順位付けをイベントドリブン・スケジューリングという。優先度が高いプロセスが来たらプロセッサを横取りする。これがリアルタイム処理。このような動作をするOSをリアルタイムOSという。

定期的に同じ処理を行う処理を周期プロセスという。これは動作を予測できるので、アルゴリズムに組み込みやすい。リアルタイム処理にも二種類、ハードリアルタイム(〆切が厳しい)、ソフトリアルタイムがある。

汎用OSと組み込みOS。規模が大きい場合は汎用OS、タイムシェアリングを利用しがち。スマホ、携帯、組み込み機器は組み込みOSになる。

汎用OSの動作。ROMにブートローダーが記録されていて、まずこれを実行する。OSは補助記憶装置からRAMに読み込み、OSが実行される。

組み込みOSの動作。OSはROMに書いてある。一部はRAMに転送。ほとんど書き換えないで高速に動作させる。一部のデータだけをRAMに書く。

省電力モード。プロセッサ停止モードとクロック停止モードがある。ハイバネーション=クロック停止モードのこと。プロセッサー停止モードの方が簡易。何か押せば元に戻れる。クロック停止モードだと何か特殊な操作が必要(電源ボタン押すとか?)。

第12回

OSとソフトウェア開発について。ソフトウェアはアプリとも呼ばれる。

家電や携帯機器のプロセッサの選択。低コスト、小型化、省電力、軽量が望まれる。PCよりも性能が最低限のものになりがち。

プログラム実行とOS。OSがない場合もある。OSがない場合、リソースがいらないというメリットもあるが、だいたいはOSも搭載してる。

ポットの制御を考える。ヒーターをONにすると水温上昇、OFFなら下降する。温度センサーで水温を測定し、設定温度との比較を行い、ヒーターのON/OFFを切り替える。これならOSはいらない。

複雑な制御をする場合。プログラムXがモジュールA,B,C,Dでできていると考える。モジュールが関係しあっている場合は、これを制御するのが大変。そこでOSを使った方が楽になる。開発の利便性を取る場合はOSを搭載した方が有利。

組み込み機器では必要な機能を絞ったOSを使うことになる。必要な機能はタスク管理、割り込み管理、ネットワークと通信、グラフィック機能があればよい。

分割によるソフトウェア開発。APIを搭載していればモジュールに分割して開発できる。

システムコール。割り込みを発生させる処理のこと。システムコールには番号が割り当てられている(システムコール番号)。スーパーバイザー呼び出しをプログラムが呼び出して割り込みが発生する。

プログラム開発について。セルフ開発とクロス開発。セルフ開発はホストとターゲットが同じ、クロスは例えばPCでスマホの開発をする場合など。

互換性。バイナリレベル互換とソースレベル互換。バイナリレベルはそのまんま使える互換。ソースファイルは複数環境でコンパイルできるのでこれで互換性を保つことををいう。移植はソースファイル互換では足りない環境依存部分だけを修正すること。仮想マシンを使えばどんな環境でも同じプログラムの実行ができる。Javaとか。

第13回

ユーザーインターフェースについて。昔の出力部分はLEDとか電球とかだった。入出力装置としてはほかにDIPスイッチがある。4bitメモリーと同じ。昔はメモリーがないので、マークシートやパンチカードを使っていた。オペレーターという担当者を介していた。OSと同じ。

最初の使い方はバッチ処理。オペレーターに渡して、コンピュータを使って実行してもらう。コンピュータが決められた手順でプログラムを連続して実行していた。1970年ごろまで。

次は対話形式。コンピュータにコマンドを入力して、結果を返してもらう。これの繰り返し。

フォントによる文字の表示。文字列をコンピュータがビットマップに変換してディスプレイに表示する。

ウインドウシステムの登場。GUIを使って直接操作方式を採用し、より直感的になった。

インターフェースの分類。ハードウェアインターフェース(機器同士)、ソフトウェア・インターフェース(ソフトウェア同士)、ユーザー・インターフェース(コンピュータと人間)をつなぐもの。

人間とコンピュータとの接点について。メンタルモデル。マニュアルを読んで操作方法を獲得する。この時に頭に作られるモデルをメンタルモデルという。インターフェースを工夫すると、メンタルモデルが作られるまでの時間を短縮できる。インターフェースには日常生活のメタファーが用いられる。例えばデスクトップ画面。机に見立てている。

アフォーダンス。人に行動を誘発させること。アイコンやボタンのデザイン。プチプチを見るとつぶしたくなるよね。ボタンがあるとクリックしたくなるよね。色の対比でもアフォーダンスを表現できる。配置も大事。視野に配慮したゲシュタルト特性を考えることもある。

入力装置。人間の中にある情報を入力する場合と、外にある情報を使って入力する場合がある。キーボードは前者。ポインティングデバイスや音声認識もある。出力。ディスプレイが用いられる。HMD(ヘッドマウントディスプレイ)なんかも出現している。

これからのインターフェース。モバイルの文字入力。携帯ではT9というテンキーベース。スマホやタブレットではソフトウェアキーボードが使われる。

ウエアラブルコンピューティング。いつも利用できる、人間の能力の拡張、コンピュータによって外界との情報の調停を行うこと。

第14回

OSとセキュリティー。複数の利用者でコンピューターを共用するには、プライバシー保護と個人環境の維持が必要になる。これを可能にするのをマルチユーザー機能という。なので利用者識別のアカウントとパスワードが必要になる。ファイル操作については略。

OSによる資源の保護について。アクセス制御。操作に属性を付加する。具体的には書き込みとか読み込みとか。アクセス制御情報はアクセス制御行列で表される。行が主体(domain)、列が対象(object)となる。それぞれR(読み), W(書き), X(変更)ができたりできなかったりを設定する。

ケーパビリティリスト。ドメイン(主体)と対象、操作(ファイルAとRとか)の一覧にしたもの。これは一覧の作成が大変なので、普通はアクセス制御リストを使う。対象ごとに、ドメインとアクセス権をセットにしたもの。

セキュリティと暗号化。CIAの要件がここでも出てきた。脆弱性、暗号化、ユーザー認証などは情報セキュリティ概論でやったからいいか。

第15回

コンピュータの利用形態とOS。最初の開発の部分は今までの復習って感じなので略。

SoC。System on Chip。チップ一個で必要なシステムを実現すること。基盤の構成が簡単になる。小型化、高速化にも有利。

ユビキタスコンピューティング。パーベイシブコンピューティングともいう。いたるところにコンピュータを組み込むこと。前から言われてたねこれ。小型化高速化でだんだん現実味を帯びてきてる。

クラウドコンピューティングの定義。「構成の変更が可能な計算機資源の共用領域に簡単にそしてオンデマンドにネットワーク経由によるアクセスを可能とするモデル」ああいわれてみれば。特徴は①オンデマンドセルフサービス②幅広いネットワークアクセス③計算機資源のプール④迅速な伸縮性⑤計測されるサービス。

仮想化技術。OSの上にハイパーバイザーを載せて、さらにその上でOSを複数実行する。これをゲストOSという。ハードウェアの上に直接ハイパーバイザーをおくパターンもある(ハイパーバイザー型)。クラウドコンピューティングではよく用いられているらしい。

IoT。ウエアラブル端末とかも入るのね。ヘルスケア端末もネットワーク利用ができる。蓄積された情報の分析も可能。自動車のプローブ情報(運行情報のこと?)も活用が期待されている。

センサーとアクチュエータ。ボタン、動き、温度湿度を計測したり、LEDを光らせたりできる。プログラミングしたらいろいろ動作可能(なんてアプリだろこれ?)。

実世界と仮想世界。IoTで得た情報を「実世界⇔仮想世界⇔コンピュータ処理」の相互作用に載せて、実社会に役立てることができる。

放送大学全科目感想 014 データの分析と知識発見(’20)

  • 情報コース
  • テレビ講義
  • 秋光淳生先生(放送大学准教授)
  • 難易度 ★★★☆☆
  • おすすめ度 ★★★☆☆

Rを使ってデータ分析を行う。生徒さん3人(本業はみんな声優さん)と秋光先生が講義する形式で進む。印刷教材との使い分けができているという意味ではよいが、生徒さんがRで演習しているところは放送授業の無駄遣いって感じもする。講義内容自体はすばらしい。非常に短時間で簡潔に、Rの基本から仮説検定、主成分分析、因子分析のような統計の基本だけではなくニューラルネットワーク、形態素解析などにも踏み込んだ説明をしてくれる。かなりわかりやすい。

第1回

基本的にRの話らしい。学生役が3人。俳優さんという感じ。柔らかい雰囲気。講義ではR-Studioを使う。各項目を見る限りでは結構分析手法が本格的で大変そう。

Society5.0について。もう5.0なの?4.0とかどんなんだったん?あらゆるものがインターネットにつながっているということらしい。

データの利活用について。客観的根拠に基づきに判断せよとのこと。分析結果の読取りはもちろん、結果は言葉で表現できないといけない。データは何を表しているのか?何が読み取れるのか?ということが大事。

データは収集選択し、処理して変換するもの。分析に適するように変換したものを様々な手法を通して解釈し、検証し知識を発見する。ここら辺はウォーターフォール的ではなく行きつ戻りつする。データマイニングは言葉としてはもう古いらしい。

Rの基本操作について。オープンソースで無料らしい。先生macよりwindowsを先に言ってるからwindows派だな。とおもったらmacの画面出てきた。生徒さんはwindowsだ。生徒さんの操作の過程がでてきてる。自分でも操作した方がいいのかなあ。

1+2と入力すると3が出る。変数にも x1 <- 2 のようにすれば値が代入できる。生徒さん操作に慣れなさすぎで、先生がJISキーボードの解説してる。ライブ感はあるが生徒さんが操作してる時間が長い。印刷教材とギャップがあるのでは。。

第2回

レポート作成。平均や分散を計算したりする。生徒さん服が変わったので毎回別の日に収録してるのね。

メモをどう取るか。私はスマホ派ですがカレンダーに書いたりもします。

代表値。最大・最小・平均・最頻・中央値などのこと。今日はこれらを計算するのかな。中央値とかも一発で計算できるのかな?

平均値の定義。いきなり大変な数式になった。平均はμで表す。分散をn-1で割る場合はこれを不偏分散というらしい。

Rは配列をc(combine)で表す。 y1 <- c(80,91,22,67,88) みたいな感じ。mean(y1) で平均、var(y1)で標準偏差が求められる。配列の範囲は[1:5]みたいに表す。Rは0ベースじゃなくて1ベースなのね。y1[1] <- 40 のようにすれば配列の要素にアクセス・代入できる。

Rスクリプトについて。スクリプトのウインドウを開いて、命令を書きまくっていけばバッチ実行できるってわけか。Rはスクリプトがメインだろうなあ。当然ファイル読み込みもできる。コメントは # 井桁で表す。標準出力はprintを使えばいい。

knitrを使ってレポートを作ること。wordでも作れるらしい。でも文章自体はmarkdown形式なんだなあ。便利だよねmarkdown。

マークアップ言語とWYSIWIGの違い。マークアップはHTMLなど文章と命令がセットになっているもののことを言う。Markdownはマークアップを簡略したもののこと。R MarkdownはR独自のMarkdownなのか。例えば“`で囲むとRの命令をそのまま出力することができる。#は見出し。先生けっこう難しいこと話してるから、生徒さんついてけてるか心配や。

第3回

ファイル操作。

Rのデータ型には整数とかbooleanのほかにファクターってのがあるらしい(あとで学ぶ)。データ形式にはスカラ、ベクトル、行列のほかにリスト、フレーム(?)ってのもある。

行列は A <- matrix(c(1,2,3,4,5,6),ncol=3,nrow=2) みたいに代入する。デフォルトでは列ごとに代入だが。nrow=2のとこをbyrow=Tにすると、行から代入する。

リストはジャグ配列と同じ。sasaki<-list(“英語”,…)みたいに代入。

データフレームは一番よく出てくる。データベースとほぼ同じ。リストで列ごとにデータ型を固定したもの。代入はheightとweightの配列があったとき、 D<-data.frame(height, weight) みたいにすればよい。D と入力すれば表が表示される。

ファイル読み込み。csvかタブ区切りが基本みたい。まあ基本はタブだよね。文字列にカンマ入ってたら終わりだから。タブ区切りファイルはread.table(), csvはread.csv()で読める。

生徒さんの操作確認の所が壮大に無駄だぜ!

共分散、相関関係の計算方法。原理原則は高校の数Iでやったことの復習だ。var()が分散+共分散、cor()が相関係数を算出するコマンド。一発で出るので楽じゃん。Rは統計に特化して、頻発する命令を短くしたものなんだな。言語ってそういうものかも。よく出る語彙は短いよね。

第4回

表の作成(クロス集計)について。秋光先生と生徒さんのやり取りはアドリブかな。秋光先生の反応けっこう変わってる。

尺度について。質的データ(名義尺度、順序尺度)と量的データ(間隔尺度、比例尺度)がある。尺度ってのは単位のことだろうか。名義尺度はそのまんま名前のこと。名前にはあんまり意味がない。区別することだけが目的。順序尺度は順位とかアンケートの度合いとか。間隔がどれも等しいわけではないことが特徴。先生が持ってるデジタル式のレーザーポインターみたいなやつ便利だな。間隔尺度は全部等間隔に並んでるデータのこと。比例尺度は何かを基準にして1.5倍とか7倍とかで集計するやり方のこと。比例尺度は0が決まってないといけない。0がないこともある。例えば温度。摂氏0度には存在しないという意味はない。西暦も同じ。これらは比例尺度は使えない。

クロス集計表。2つの事象が起きた・起きなかったことを○○ ○× ×○ ××の4つに分類して正方形の形で集計すること。1つの事象だけ集計したものを周辺度数、全部合計したものを全体度数という。相対度数は3種類になる。行についての相対度数、列についての相対度数、全体度数に対する相対度数。全体度数が一番見やすいかな。項目を増やせば多重クロス表も作れる。

シンプソンのパラドックスについて。全体でみると勉強した人の方が合格しているのに、40歳以上・未満で集計するとどちらも勉強しなかった人の方が合格している。足し合わせるのと個別で見るのでは別の見た目になることが起きる(なんで??)。

相関の考え方。ファイ係数とユール係数がある。どちらもad-bcを計算している。-1~1の値が出る。相関関係があれば1に近づく。事象2つではなく複数になった場合は、期待度数とかカイ二乗値を考える。期待度数は行や列の合計から各項目の値の予想値を計算したもの。これの実際の値とのずれ具合がカイ二乗値らしい。

実際にRを使っていく。table関数でクロス集計表の作成、addmarginsで合計を計算してくれる。

第5回

グラフの作成。生徒さんみんな家で自学してるらしい。えらい。

散布図はplot() 折れ線はtype=o (plot使うってこと?) 円グラフはpie() (色遣いはどうやって指定するんだろ?)棒グラフはbarplot() ヒストグラムはhist() で書く。

円グラフは全体の割合、棒グラフは0から始まる(とは限らない)ことが大事。

見出しはmain= 軸の名前はxlab= ylab= 凡例はlegend で表す。点とか文字とかを追加したければpoints()とかtext()とかを使う。

実際やってみる。やはり折れ線はplot(type=”o”)でやるらしい。b(プロットにかぶらない線), l(ただの線)も使える。text(h1,rownames(h1)) ならテキストがグラフ上に表示される。plot→textの順で呼べばグラフにテキストが追加される、という流れになる。

関数のグラフ。curve(log(x))でlogxのグラフが書ける。curve(sin(x))でsinxのグラフ。これいいな。tex文章に追加できないかな。

ファクターについて。size <- factor(c(“S”, “M”, “L”)) などのように指定する。数値にラベルを付けることもできる。範囲はcut(sh, breaks(c(min(sh)-1, 10, max(sh)), label=c(“N”, “Y”)) などのように指定する。これで年齢層を3分割できたりする。col=rainbowにすれば虹色の棒グラフができる。

生徒さん意味わからなさ過ぎてつかれている。

第6回

検定の話。生徒さんが宿題出されててそれをちゃんとこなしてるのがすごい。Rってグラフきれいですね。

仮説検定。母集団から標本を取り出したとき、標本の特徴から母集団の特徴を取り出すことができるのか?というのが検定。標本を取り出したら、めったに起きないことが起きたのが第1種の過誤、本当には起きていないのに起きたと間違えるのが第2種の過誤。

確率分布の話。連続分布と離散的分布。離散的分布で代表的なのは二項分布。サイコロの出る目の確率でよく使う。10回投げて10回全部表になるのはめったに起こらない。連続分布だと正規分布が一番有名。形は難しいけどこれってたしか積分したら1になるようにしてるんだよね。

Rではdで始まるやつが密度関数。dbinomとか、dnormとか。確率(積分したところの値)ははp、確率点(?)q、乱数はr。検定は.testでカイ二乗検定ならchisq.test。短い名前でだいたい全部の分布が実装されている。よく使うんだね。例えばpnorm(2.0,1)なら2σ以下になる確率で、0.997…となる。

正規分布の曲線、グラフがたったの8行で書けている。すごいね。

rbinom(10,10,1/6)みたいにすれば、10回サイコロを振って何回1が出ますか、という意味になる。二項分布が正規分布に近づく、ということもR上で確かめられる。

カイ二乗検定の実践。先生私プログラマーですけど、意味わかりません。概念的には、プログラム上で乱数を発生させて、カイ二乗検定をして、集計してヒストグラムに表せるってことなんですね。それ以上のことは不明。

第7回

回帰分析。線形の多項式について、データからこれらの係数を求めることが目的。係数aは最小二乗法で求める。実際どうやって内部で求めてるんだろね。行列?→偏微分 = 0で求めるらしい。

偏微分 = 0 を解くと、全体平均を必ず通ることが分かる。回帰曲線の係数aは、分散、共分散を用いて Sxy – aSxx = 0という関係があるらしい(まじで!!??)数学的な意味は印刷教材でじっくり見てみよう。この関係から、変数がn個の場合でも分散、共分散の行列を考えれば、逆行列を出すとaが出てくる。

先生~数学的に厳密であろうとして生徒さんが置いていかれてます!!逆行列も概念的に説明しようとしてますます意味わからなくなってます!でも数学理解できてたらグラフの意味が分かってくるってのは同意です。数学大事。

予測の精度の話。回帰曲線は分散が0でなければ出せるけど、予測が正しいかどうかはなんともいえない。乱数を足したり引いたりするとわかる。測定値の分散というのは、数学的に計算すると、予測値の分散と残差(予測値の差)の分散の和になっていることが分かる。残差の分散が少なければ少ないほど誤差が少ないといえる。そこで残差が少ないほど1に近づく変数を定義し、決定係数と呼ぶ。決定係数が0.9なら残差少ないね、よかったね、ということになる。

偏相関係数について。見かけの相関を説明する係数のこと(いみわからんかったので印刷教材にパス)

Rでやる方法。h2 <- lm(weight~height, data=h1) って打つだけ。lm? 短いな。で、plot(h1), abline(h2) で終わり。これで回帰曲線が書ける。summary(h1) って打つだけでいろんな検定値、平均やら分散やら全部出てくるので便利。str(h2)ってやるとさらに、回帰分析的なデータがいっぱい出てくる。

第8回

主成分分析について。変数をできるだけ減らすことらしい。データの圧縮のこと。先生スライド分かりやすいっすね。

平均化→平均を0にする。標準化→平均化+標準偏差で割って標準偏差が1になるようにする。

主成分分析の導出。y個のデータをz個に減らす場合、y1~yrまでのデータに係数をかけてzmを定義してやる。そうして変数を減らしていく。というわけで係数の導出がまた問題になってくる。概念的には、立体(変数3つ)を平面(変数2つ)で切って膨らんでいる方向を決定していく過程になるらしい。

元々の情報量を射影して、損失(直交する量)がなるべく小さくなるようにするのが原則。いろいろ掛け合わせて足し合わせると、また分散と共分散が出てくる。標準化すれば結局相関係数を使えば係数が出てくることになる。で、これを最小にするためには、ラグランジュの未定乗数法を使う。これは結局、分散・共分散行列の固有値・固有ベクトルを求めることと同じ。これで求まる。

寄与率。主成分分析の決定係数みたいなやつらしい。どれだけうまく予測できているかの尺度。さっきの式で固有値が出てくるけど、この固有値が大きい順に第1主成分、第2主成分というように決定できる。寄与率は、(自分の固有値 / 全固有値)、で求まる。累積寄与率は、でかい方から寄与率を足していって自分まで足したときの値になる。

Rでやってみる。prcomp() を使えば一発。ここまではprcompで何やってるのかっていう解説なのね。

身長体重で主成分分析をすると、両方√1/2にしたやつが第一主成分になる。これでほぼほぼ表せてしまうらしい。ほとんど比例ですねってときはこうなるのかな。身長体重両方を主成分分析したグラフの軸にすると、ほとんど重なってしまう。

主成分分析は回帰分析と似ているけど、回帰分析が縦方向の値を減らすのに対して主成分分析は(回帰直線の?)垂線方向の値を減らしている。ので、目的が違うという話だった。

第9回

因子分析。観測データの背後に潜む因子を見つけること。独自因子、共通因子の2つがある。共通因子がメインで、それにプラスして独自因子を使うって感じらしい。変数より因子の方が数が多くなる。

Y=CF+DEと表現できる(行列)。Cは係数行列、Fが共通因子、Eが独自因子。共通因子、独自因子は平均0、分散1。共通因子、独立因子は独立で相関なし、共通因子間には相関があることもある。ない場合は直交解、ある場合は斜交解。

分析手順。共通因子の個数を決める。カイザーガットマン基準(相関行列の固有値1以上)、スクリープロット(相関行列の固有値のグラフから決める)を使う。→因子負荷量を求める。最尤法、最小二乗法、主因子法がある。→因子軸の回転を行う→解釈。

最尤法について。5回闘って3回勝つ確率は?二項分布で考えると5C3 * p^3 * (1-p)^2 である。(それで??)

因子の回転について。因子負荷量は一意には決まらない。回転によって特徴が分かりやすいような、解釈しやすいような軸を探す。直交回転(バリマックス法)、斜交回転(プロマックス法)がある。

演習。まずread.tableでテーブル読んで、corで相関係数を計算、plot(eigen())で固有値をプロット。これはスクリープロットにあたる。次にw3<-factanal(w1, 2, rotation = “promax”)で因子分析。プロマックス法を使ってる。で、最後にplot(w3)で結果表示。Rで書くと一瞬だね。

eigen()で固有値が1以上なのが2個、スクリープロットで見ても2個だけ固有値でかいから、2つを採用する。今回の例なら統計学+心理学史、精神分析+神経科学+認知心理学にそれぞれ共通因子があるように見える。これをFactor1, Factor2とする。共通因子行列Fが作れる。後は独自因子をつけていけばいい。例だと共通因子で50%くらい説明できたということらしい。

第10回

多次元尺度法。まず距離の公理について。非負性(負にならない)、非退化性(点が等しければ0)、対称性(順序を逆にしても等しい)、三角不等式(a<b+c)。要するに三角形の頂点間の距離について成り立つことだと思う。

古典的多次元尺度法。距離が分かっている仮定で座標を求める。距離行列Dを考える。各成分は各点間の距離の二乗。

各点を表す行列Xから、ヤングハウスホルダー変換をして距離行列Dに変換する。回転、反転、平行移動をして、距離行列を満たすようなXを求める。感覚としては行列ごと二乗するような感じ。これをまたよくわからん変換をして対角化、固有値を求めると中心を原点に来るような座標に変換してあげられる(ぜんぜんわかりませんでした)。

Rでの演習。cmdscaleを使う。サンプルとして山手線の駅間所要時間の二次元行列を使う。readしてからas.distで距離の形に変換、そのあとcmdscaleで多次元尺度法の計算を行う。あとはplotで表示。textで座標の上に名前を表示してあげる。何ができるかというと山手線ができます。cmdscaleでk=2を指定して二次元に変換したところ、65%くらいの情報が説明できているということになった。

第11回

クラスター分析。

前回の山手線のデータを使って階層的クラスター分析。渋谷、原宿が近いのでグループとしてまとまる。もう少し距離を挙げていくと高田馬場・池袋とか、上野・秋葉原とか。サブグループをまとめていくと山手線の西、東でまとまる。最後に全部が一つにまとまって終わり。こういう束ね方を階層的クラスター分析という。樹形図で表現できる。

作り方。まず距離の近い2つの点をまとめる。二点間距離がわかってればできる。で、点をまとめるんだけど、まとめた点と他の点との距離を計算する方法はどうするか。例えばABとCの距離。AB間の真ん中を取るか、ACとBCの最小値にするか。どちらかを採用して、また計算し直す。再計算法には最短距離法、最長距離法、群平均法(距離の平均を求める)、重心法(真ん中を取る)、ウォード法(クラスターが巨大にならないようにする。グループ間の距離が最小になるようにする)がある。

演習。また山手線のデータを使う。read.csv→as,distまでは前回と同じ。そのあと、hclust()でクラスター分析する。method=””に方法を指定。最短距離法はsingle、最長距離法はcomplete、群平均法はaverage、重心法はcentroid、ウォード法はward.D2を指定。ここではウォード法を使う。で、plotでプロットする。

プロットしてみると5つとも距離が結構違う。singleだと品川がハブられてしまう。バランスが悪い。completeだとグループはいい感じになる。centroidも品川がハブられる。ウォード法もいい感じ。

k平均法。k個のグループに分けること。2個点を選んで、2つのグループの代表者として、近い点の代表点のグループに分ける。次に、グループの重心を代表点とする。次に重心からグループを作る。これを繰り返して、グループが変わらなくなるまで続ける。これだと最初ランダムに適当に2点を選んでも必ずどこかに収束する。ただ、収束する点は一意になるわけではない。

Rで演習。read.table→kmeansで終わり。plotとpointsで表示。

第12回

アソシエーション分析。まず因果関係の話。ビールと紙おむつの相関は。紙おむつを買いに来たお父さんがビールも買って帰る。相関というのは、同じ人が買ったという関係がある、ということ。

アソシエーションルール。100人の学生がA~Eの5科目のいずれかを学習する場合、学生+受講科目の組をトランザクションデータという。例えばAとBという科目に注目。n(A) n(B) n(A, B) などの集合が考えられる。A→Bが言える場合は、AがBの部分集合ということになる。するとBに占めるAの割合なども計算できる。

アソシエーションルールの指標。支持度、期待信頼度:自分/全体。支持度はAかつBの割合で、期待信頼度はBの割合。信頼度は条件付確率みたいなもので、リフト値は信頼度/期待信頼度。期待信頼度は打率、信頼度はチャンスの時にヒットを打つ割合。リフト値はチャンスの時のヒットを打つ割合は通常の打率と比べてどのくらいか。

例。100人いてA25人B40人AかつB20人→支持度は20/100=0.2 期待信頼度40/100=0.4 信頼度20/25=0.8 リフト値0.8/0.4=2

Rで演習。arulesというパッケージを使う。Groceriesを読む→as(g0, “data.frame”)で変換→itemFrequency→apriori()で計算。パラメータはlist(confidence=0.5,support=0.01)に設定。→sort(d=T, by=confidence)→inspectで調べる。supportは支持度、confidenceは信頼度かな。

(confidence=0.5,support=0.01) のところはフィルターのようなもので、数値が大きければルールはいっぱい見つかるし、小さければ絞れるが0個しか見つからないかもしれない。

第13回

決定木。グラフの定義から。頂点(ノード)と枝(エッジ)があるのがグラフ。ループがないグラフを木という。集合は分割して木構造にすることができる。図だとわかりやすいんだけどちょっと言葉では表しにくい。分け方は一意ではないので構造は一通りではなく、分割方法に依存する。

とはいっても一番特徴をよく表している木を作りたい。どうするのか。例えば成績データ。属性と点数を関連付けた気を作りたい。属性を説明変数、点数を目的変数と呼ぶ。目的変数がカテゴリー変数(数種類ある)なら分類木。連続変数なら回帰木にするのがよい。今回は点数を70点以上、70点未満に分けているので、分類木がよい。

40歳以上、未満、男性、女性という属性で分類すると、70点以上/未満の散らばり具合はどうか。年齢か性別のどっちがいいかどうやって判断するか。指標となるのはジニ係数。不純度が低くなるように分割する。不純度が低いというのは、別のものを取り出す割合が小さいということ。ジニ係数の計算方法は1 – pa^2 – pb^2。確率の二乗を引いたもの。分割前は0.5だけど、男女で分けると0.444, 0.375。年齢で分けると0.32, 0.32。年齢の方がいいね、ということがわかる。なので年齢を使って木構造にしよう。

Rで演習。rpartというパッケージを使う。read.csv→rpart(?? + ?? + …, method = “class”)→library(rpart.plot)→rpart.plot(extra=2)で。

第14回

ニューラルネットワーク。なんか突然神経の話になった。神経はパルスを出す。シナプスを出して他の神経細胞に伝えていく。電位が上がったり下がったりするんだけどある程度高くなると突然パルスを出す(らしい)。神経細胞をモデル化すると数式にできる。重みを掛け算して足し算して、ある程度のしきい値を超えるとパルスを出す。uを足し算した値とすると、パルスはy=f(u)。f(u)をシグモイド関数という。パラメータの取り方によっては急激に1に近づくようにもできる。

階層型ネットワーク。ニューロン同士は複雑なネットワークを作れる。これを簡単にするために、左から右に繋がっていくようなネットワークを考える。例えば入力、中間層、出力で構成するネットワークを考えることができる。どれも複数あるので、多入力多出力の関数という。

バックプロパゲーション。入力と出力、あと教師信号を用意する。教師信号と出力と比較して誤差を計算し、また後ろに流す。誤差は二乗で評価。結合荷重wは偏微分で-をつける。(よくわからんかった)

最急降下法。結合荷重が誤差に与える影響を計算し、誤差が減る方向に結合荷重を修正するのだけれど、偏微分を使うので、どこに解を持ってくるかが問題となる。局所解に収束してしまうので、初期値によって結果が変わってくる。

汎化と過学習。教師信号が誤差を含むことがある。学習が不十分でもありすぎてもいけない。粒度が問題になる?

Rで演習。サインカーブを用いる。訓練用データと検証用データを使う。nnetライブラリを使う。nnet(output~input, data=train, size=1, maxit=1000)→predict()でできる。あとはplot, pointでグラフを書いて検証。中間層を大きくしたり、イタレーションを大きくすると時間がかかる。あんまり中間層が大きいと過学習になる。

第15回

テキストマイニング。まず形態素解析から。自然言語処理と同じ話や。文を語に分解するのが形態素解析、これを組み合わせると構文解析になる。「横浜に行った」なら「横浜(名詞)」「に(助詞)」「行っ(動詞)」「た(助動詞)」。ソフトウェアで有名なのはChasen, MeCab, Jumanなど。

演習。青空文庫テキストを使う。RMeCabを使って、docMatrix(“C15, pos=c(“連体詞”,”副詞”))を実行、a1[row.names(a1) != “[[LESS-THAN-1]]”,] で1回以上出てくる集合をゲット、さらにa3[row.names(a1) != “[[TOTAL-TOKENS-1]]”,]で数を数える。さらにt, distで距離を取って、cmdscale, kmeansを使い多次元尺度法にかける。すると指定した副詞、連体詞を含むような文章をグループ分けすることができる。

放送大学全科目感想 012 データ構造とプログラミング(’18)

  • テレビ科目
  • 情報コース
  • 鈴木一史先生(放送大学教授)
  • 難易度 ★★★☆☆
  • おすすめ度 ★★★☆☆

同じ鈴木先生の講座「アルゴリズムとプログラミング(’20)」の上位互換で、同講座と半分くらいかぶっている。アルプロと比べるとこちらの方が内容が高度で、C言語の程度も高いのだが、テレビ講座の利点を生かし切っておりこっちの方がわかりやすい。毎回動作確認を丁寧に行ってくれて好感度が高い。なお先生はにちゃんねらーでまどマギのファンと思われ、タイトルに関連AAが毎回ちりばめられている。

第1回

イントロと配列について。C言語はある程度知っていることが前提なので、同じ先生のアルゴリズムとプログラミング(’20)を履修してからの方がよいね。

C言語をwindowsで簡単にコンパイル・実行する環境って何があるのかなー。web上でやった方が速い気がする。

( ´∀`)モナーがいるんだけど。。先生にちゃんねらーじゃん。

テレビ科目で見やすいんだけど、windows3.1味のある古いグラフィックで洗練されてない。

配列ってなんで添え字0から始まるんだろうね。

C言語のrand()ってintの最大値までの値を返すのか。だからrand() % 100 みたいにしないとだめなのね。てっきり0~1の間なんだと思ってたけどそれだと不便だな。

構造体の配列。まあだいたいDBに対応する。固定長だけど。メモリ量が多くなってきたら、mallocで動的確保した方が無難とのこと。ヒープに確保できるので。

スライスって配列をぶった切る関数じゃないの?配列を拡張したものみたいに紹介がされている。

配列へのデータ挿入。最大n個のデータを移動しないといけないから計算量はオーダーnになる。削除も同様。つまり負荷が大きい。

データ探索について。線形探索はこれもオーダーn。二分探索は整列済みの配列に対して行わなければいけない制約があるが高速。図解してくれていてこれはわかりやすい。配列の場所としてlow, mid, hiの値を用意して、探索する値がmidと比べて大小どちらか確認、またlow, mid, hiを設定しなおす…の繰り返し。midにある要素と検索したい値が一致したら終了。

線形探索が遅いことを実践。30万件のデータを30万回検索すると当時の最新のCPUでも18秒。一方、二分探索だと0.02秒。ちなみに事前に要素をソートするqsortも0.029秒しかかかってない。

第2回

スタックについて。スタックと言えばお盆(食器の方)らしい。たしかにそうだね。

先生の手元が常に動いているのが気になる。

swap(頂上と2番目の値を取り換える)、duplicate(頂上のデータをコピーしてpush)って操作は知らなかった。

スタックの実際の実装方法。アルゴリズムとプログラミングの所でも習ったけど、ようやく映像で見られる。まず配列で実装する方法。添え字を保存しておけばOK。ただ配列サイズがいっぱいになる可能性がある。挿入も削除もオーダー1で高速。コード例も映像で見られるからいいな。

スタックを1億個使ってCore i7で動作実験。乱数発生も含めて1秒で終わった。高速ですね。

文字列データについて。Linuxには48万件程度の辞書データが入ってるらしい。文字データとしてこいつを使い、スタックに積む処理も高速で1秒だった。

スタックの応用について。まず文字列の反転。たしかにpopしてけば逆になるな。今後使ってみよう。それから逆ポーランド記法。78+(7+8と同じ)のように記述するやり方。どこまでが被演算子かわからないので、7 8 + のように区切りを入れる必要がある。処理方法としては、演算子が出てきたら2回popして計算してpushすればいいってわけ。楽だね。

3 4 + 5 * なら→3 4 をpushした後 + が出てきたから、3, 4 をpopしたあと3 + 4 = 7をpush。次に5をpushしたら * が出てきたから、7, 5をpopして、7 * 5 = 35を計算してpush。これで35が答えになる。逆ポーランド記法ではカッコがいらないことが特徴。

スタックはSTLに入ってますよって話もしてる。STLの場合、可変長になってるだろうから処理速度はどんくらいなんだろうね。

第3回

キューについて。タイトルにキュゥべえ出すなよ。。。先生。。。

キューの構造はわかってるからいいとして、実装が気になる。配列を途中から途中まで使うようなイメージなのか。だから先頭と末尾の添え字が必要。オーバーフローと空のチェックも必要。使っていけばすぐ配列の末尾に達するから、リングバッファ化するしかない。計算量はO(1)。はやい。

C言語のコード例、穴だらけ(MAXが小さいとかリングバッファになってないとか)なんだけど、教育用だから仕方ないか。。

enqueueを1億回やるテスト。1.2秒で終わった。バッファも1億個作ったのな。4バイト変数で4GBか。まあできなくはないか。

stdにもキューがある。queue<int>みたいな。ただ、メソッド名がpushとpopなのでスタックとまぎらわしい。

キューの応用。まず両端キュー。頭と後と両方で追加削除が可能。enqueとdequeueの意味が普通のキューと変わってくるのでわかりづらい。

優先度付きキュー。dequeueのときに、優先度の高いもの(値が小さい場合のことが多い)から取り出される。だからenqueueした順とは限らない。利用例としては、イベントの待ち行列、OSの割り込み、ダイクストラ法、ハフマンコードなど。なのでかなり大事な技術みたい。効率の良い実装が望まれる。配列(n)、順序配列(n)、ヒープ(logn)といった実装があるがヒープが一番効率がいい。配列だとdequeue、順序配列だとenqueueにコストがかかってしまう。

あれ、ヒープの実装はどうやるの?→第14回でやるみたい。

第4回

連結リストについて。汎用的なDBを作るのと同じなんだって。リスト自身が他の要素へのポインタを持ってることまでは把握してる。もしかしてDB自体が連結リストなのかな?

C言語依存の解説だけど、他言語でも実装方法は変えようがないから同じだよな。基本的な関数名は教えてくれるので親切。

ノード作成のコード、head->next->next->next->next->next = NULL とか糞コードに見えるけど意地でもポインタ変数を使わないためにはしょうがないのかな。

nullってナルって呼ぶのが最近の流行りなの?ヌルじゃないの?日本語読みだからダメ?

連結リストって都度メモリ確保してるけど、例えばC#のListなんかはこれ使ってるのかな?それとも配列型で、数が大きくなったらメモリ追加確保なのか?

ノード挿入。先頭、中間、末尾に挿入する場合の3パターンに処理が分かれる。先頭ならheadを更新、中間なら前のノードのnextを変更、末尾ならnextにNULLを入れないといけない。挿入は、メモリの並べ替えをやらなくていいから効率はよい。

実際のコード、毎回引数にheadを入れないといけないのか―。面倒だけどしょうがないか。XMLのオブジェクトが常にdocumentのポインタを必要とするのと一緒かな。

10万件でテスト。0.004秒で終わった。はやっ。ただこれは、全て先頭への挿入だったから。末尾だとどうなるか。12.6秒。毎回ノードを全部たどるから遅い。10万件でもけっこうきついね。そういえば以前、鉄道駅をノードにしてこれをたどりまくるJavaScriptのコードを書いたことがあるけど、遅かった。速くするための工夫がいろいろ必要になるんだな。

ノード1億個を先頭に挿入→4秒。1億ノードの末尾に1個だけ挿入→0.382秒。おそい。

ノード削除。これも先頭、中間、末尾で処理が変わる。先頭ならheadを変える。中間ならノードを繋ぎかえる。末尾なら1個前(これをgetするのが面倒そう)のnextをnullにする。で1個メモリを解放すればいいね。

10万件削除(先頭)の実行時間は0.006秒。楽勝ですね。

第5回

連結リストの応用。まず探索について。連結リストは基本的にシーケンシャルアクセスなので、オーダーはO(n)になる。整列はどうするか。整列済みリストに挿入するなら簡単で、リンクをたどりながらどこに挿入するか判定していけばいい。これもオーダーはO(n)。ソートアルゴリズムはマージソートっぽくなるらしい(要コード例)。

接続は単にnextと他のリストのheadを繋ぐだけだから簡単。マージも楽。分割も簡単。

連結リストでスタックを実装する。pushでheadに1個データを追加する、popでheadから1個データを取っていけばOK。簡単じゃん。計算量も両方ともO(1)。はやい。配列と同じ。しかも容量制限なし。

キューの実装。enquereは末尾に1個データを追加、dequereはhead1に1個データを追加でOK。これも簡単。enquereは末尾のポインタ取っとけばO(1)かな。とっとかないとO(n)だから遅い。実際、末尾まで全部サーチする場合のデータ削除は10万件で12.6秒もかかる。

コード、テレビの画面で見ても理解が難しいことを先生が認めている。そうか?わかりやすいと思うけどな。

連結リストから派生したデータ構造。双方向連結リストとか、環状連結リストとか。前のノードへのポインタを保持する双方向連結リストは、データ量は大きくなるが実装としては妥当な感じがする。便利。近代的プログラミング言語でも標準的らしい。stdでも<list>で提供されているらしい。C#のListも同じか?

環状連結リストはどういう場合に便利なのか謎。→OSのプロセススケジューリングで使われているらしい。たしかに、終わるまでずっと繰り返すような処理には向いてる。で、当然環状双方向連結リストも実現できる。これもどういう場合に使うんだろう。。

第6回

バイナリサーチツリー。ようやく実装方法が全然わからん奴が出てきた。

ツリーとは階層関係を表現するもの。数学的にはグラフの一種。ツリーはノードとエッジからなる。エッジはリンクと同じ。先頭ノードのことを節、vertexという。ツリーはベン図でも表現できる(!)。カッコでも表現できる(!)。例えばXMLもツリーだから、カッコとかベン図で書けるんだなあ。ノードのレベル(階層)はルートを0とする流儀と1とする流儀があるらしい。授業では0で定義。ノードが持つサブツリーのことを自由度という(なんで?)。

バイナリーツリーは子ノードの数を最大2個に制限したものをいう。日本語では二分木とか二進木とかいう。完全二分木は、最下層以外全部2個のノードをもっていて、かつレベルが全部同じ場合。で、バイナリサーチツリーは、左ノードの方が小さい、右ノードの方が小さい、というように配置したツリーのこと(別に完全二分木じゃなくていいみたい)。コード的には、左右ノードへのポインタを持っていればよい。

実装コード、左右に手動で挿入していくKUSOコードになっているが、挿入関数を作っていないからしょうがないか。

走査について。決まった規則で(全)ノードにアクセスすること。走査にもいろいろあって、行きがけ、通りがけ、帰りがけ走査がある(定義は略)。このうち通りがけ順操作は整列と同じ効果になる。どうにかしてバイナリサーチツリーを作ればソートできるってわけか。3つとも実装は簡単で、再帰呼び出しと出力の順番を変えるだけ。

最大値、最小値を求めること。簡単で、左ノードをたどれば最小値、右ノードをたどれば最大値になる。どちらもノード数が少なく、すぐ求められる。実装も楽勝。結局、バイナリサーチツリーを作るところが最大のポイントになるのでは?ノード数を数えるコードも簡単で、左右のノード数を再帰で数えて+1(自分の数)を返せばいい。ノード数は別にバイナリサーチツリーじゃなくてもよくて、ツリーなら何でも使えるね。高さを求めるコードも再帰で行ける。再帰ってかなり頭使うなぁ。

第7回

バイナリサーチツリーの操作について。探索と削除と挿入。探索は前回やったんじゃ?

探索はルートノードから値を比較して左右に辿っていけばOK。これは性質から明らかなんでそりゃそうだよね。ツリーにない値を探索しているかどうかは、末端まで行けばわかる。葉ノードまで到達しても値にヒットしなければ、該当なし。

挿入はまず探索から行う。葉ノードまで行ったら左右に挿入してやればいい。何もない場合からツリーを作るときは1番目のノードをルートにする。けど、これだと毎回ルートの取り方によって異なるツリーができない?どういうツリーにすれば効率的(レベルが浅くなる)になるんだろうね。

ノード削除について。削除は3通りの場合分けが必要になる。

  1. 葉ノードなら、単に消すだけでよい。
  2. 子ノードが1個ある場合、親ノードと子ノードを接続して自分は自滅する。
  3. 子ノードが2個ある場合。これが大変。inorder predecessor(順序内前任者、削除したい左側のサブツリーで最も右側にいるノード)を考える必要がある。通りがけ順走査では削除したいノードの一つ前のノード=ソートした時一つ前に来るノードを、これから削除するノードの所に入れてやる。これで順序を保てるというわけ。うわーコード大変そう。もう一つのパターンとしては、inorder succesor(順序内後継者、削除したい右側のサブツリーで最も左側にあるノード=ソート順で一つ少ないノード)を同様に、これから削除するノードの所に入れてもいい。それで削除ノードをdeleteする。これ、自分で思いつくかというと思いつかないなぁ。

コード例は印刷教材参照だって。そりゃそうだよなー。

バイナリサーチツリーの挿入順の話。整列してから挿入すると、単なる連結リストになりレベルが深くなってしまう。完全バイナリツリーだとツリーの高さはlog2(N+1)となり、高さに比べてノードをたくさん収納することができる。すると探索が楽。100万個でも高さはせいぜい20個。乱数を適当に挿入してもだいたいそうなる。ツリーの高さに計算量は比例するから、すべてO(logn)ということになる。ただ、形が悪いとO(n)になる。

じゃあいい感じの完全バイナリツリーに近いツリーを作るためにはどうするんだ、ってことが気になるけどそれは教えてもらえなかった。残念。ぱっと思いつくのは、だいたい中央に来る値からツリーに入れていけばいいんじゃないかってことくらいか。

第8回

ツリーの応用。平衡木とかいうのも説明するらしい。

まずはツリーの全ノード削除について。子が1-2個ある場合は削除が面倒なので、なるべく子が0個の場合(葉ノード)を削除したい。帰りがけ順走査をつかえばよい。コードとしては、左側にあるノードを優先して再帰で削除していくだけ。そうすると自動的に左側の葉ノードから消えてく。簡単!

メモリリークの話が出てきた。ちゃんと削除すればリークは起きないですねって言ってる(けど、最近の言語はみんなGCついてますよ!)

パス表示。すべてのパスを表示するためには、葉ノードを網羅してそこまでのパスを求めればよい。というわけで再帰的にノードを辿り、葉についた時点でパスを表示するとよい。

左右のノード反転。これも再帰的に左右反転関数を実行しまくるだけで終わり。コード短いでしょ!?って言ってる。

ツリーの高さの計算。サブツリーの高さを比較して+1して返す、これを再帰。この授業は再帰を勉強する科目なのかもしれない。

平衡木。やっと本丸に来た。葉ノードまでの高さをなるべく同じにするツリーのこと。AVLツリー、レッド・ブラックツリー、スプレイツリー、AAツリーなどいろいろあるらしい。ここではAVLツリーを見る。AVLツリーは、左右のノードの高さの差が必ず1以内になるらしい(どうやってやるんだ?)。

基本的に挿入・削除方法はバイナリサーチツリーとやり方は同じだが、挿入・削除後の処理が大変。でも見ていってくれるらしい。ルートからみて、高さが低いツリー、高さが高いツリーに挿入する場合、さらに高い方のツリーの左右のどちらに挿入するか、の場合分けが必要(以降は印刷教材を参照らしい。残念)。

実例。データ数を増やしていくと、ランダムの場合と高さがだいぶ違う。AVLツリーはランダムの場合の半分以下の高さになっているように見える。速度はAVLツリーの方が若干遅いがそこまでではない。ほぼランダムと同じ。でも計算量はlognに保たれる。いい感じのアルゴリズムだ。でも後処理が面倒らしい。実際どうなのか印刷教材が楽しみ。

第9回

ハッシュテーブルとオープンアドレスの話。

ハッシュ法は定数時間で速い。最速。本当なの!?そういえば配列のサイズとかってどうなってるんだろ。要はキーから算出したハッシュ値を配列に割り振ればいいんだよな。キーからの狭い配列に対する写像って感じ?ハッシュテーブルの配列数はバケットというらしい。

具体的なハッシュ関数について。ハッシュは切り刻むということ。一番簡単なのはmod。でもこれ10で割るんだったら、10までの配列にしか使えないよね?

ハッシュ値は衝突する。まず起こりにくくするには、配列を大きくしたり、演算を工夫したりする。演算の工夫、中央積算法。二乗して真ん中の方の値(6桁なら3-5桁目とか)をハッシュ値にする。折り畳み法。数字を分割して足し算して上から二桁とか必要な桁を取り出す。どっちにしても結局衝突は起きると思うけど。。?

衝突したらどうするか。その時の手段の一つがオープンアドレス法。空いてる配列を探すやり方のこと。具体的なやり方にはまず線形探索がある。+1していって空きを探す。簡単だが空きが連続して埋まるクラスターが発生してしまう。すると負荷がかかりやすい。

平方探索。再ハッシュ回数の定数倍とか再ハッシュ回数の2乗の定数倍とかを足して空きを探す。いい感じに見えるが、どれも同じ間隔の位置を探しちゃうから、セカンダリークラスタが発生する。

ダブルハッシング。ハッシュ関数を2つ用意し、片方は必ず足す、片方は再ハッシュ回数で掛ける。用意するハッシュ関数も工夫する。探査間隔が毎回変わるので、クラスタリングが避けられるというわけ。

ハッシュテーブルを実際に動かしてみる。データ数1億で、バケット数は2億、1.5億、1.1億とすると、1.1億は衝突がおきまくって遅いはず。実際、2.3倍くらいの速度差があった(思ったほどではない)。バイナリサーチツリー(o(logn))と比べるとすっごく高速。20倍速くらい。ただしメモリを食う。

第10回

ハッシュテーブルと連鎖法について。連鎖法とはハッシュテーブルの衝突解決のための手法の1つ。同一ハッシュ内のデータは連結リストにしてやればいいってわけ。(たぶん)メモリの使用量がかなり少なくなるが、衝突があると計算量は連結リストの計算量と等しくなるので、O(1)ではなくなるという欠点がある。

実装としては、ハッシュテーブル自体を連結リストの配列として実装する。で、ハッシュ値を格納するときに連結リストのノードを毎回確保して挿入していく。

実際計算量はどうなるのか。連結リストの長さL = データ数 / バケット数を考えると、計算量はO(1) + O(L/2) となる。バケット数が少ないほど、衝突が起きやすくなるので計算量はO(L)に近づく。バケット数と計算の速さはトレードオフというわけか。計算してみると、バケット数を1/100にすると、10倍の時間がかかった。

実装例、ハッシュテーブルの挿入に成功しているとなぜかエラーを返しているんだけどミス?

文字列データをハッシュテーブルのキーにする場合。まずK&R法。データをASCIIコードに変換してから全部足し算して、バケットの数で割り算すればハッシュ値になるというわけ。K&R本に載ってるんだってさー。djb法。左ビットシフトしながら足す(詳細はよくわからん)。ビットシフトがあるので、ハッシュ値はかなりでかい値になる。

コンピュータのメモリはだいぶ大きくなった(40年で100万倍)。なぜか光るメモリの紹介をされた。メモリが増えたのでハッシュテーブルで少々メモリを食っても速度の恩恵の方がでかいというわけ。

ハッシュ関数の応用として電子署名や改竄チェックのMD5、SHAなどがある。ほんの少しの改竄でもMD5は全然違う値になるので簡単にチェックができる。

ハッシュタグとは。# のことを井桁(いげた)記号とよぶ。米国ではナンバーサイン、パウンドサイン、欧州ではハッシュと呼ぶらしい。データ構造のハッシュとは関係ない(そうだったんか)。

第11回

再帰について。再帰と言えばマトリョーシカ人形。机に人形置いたまんま先生が話進めてる。

再帰コードは自分自身を呼び出して、毎回異なる(たしかに)引数を渡していくのが特徴。

簡単な例が階乗。20の階乗で243京になるらしい。コードは5行で終わり。ほぼほぼ return n * factorial(n-1); だけだしね。

再帰のコードは、まずwinding(再帰呼び出しが続くこと)が続き、terminate condition(終了条件)を満たしたら、、unwinding(もとの場所に戻っていくこと)の処理が行われて終わる、という捉え方をする。

フィボナッチ数。実質 return fibonacchi(n-1) + fibonacchi(n-2); だけ。再帰が2種類あるところがポイント。この再帰関数は廃棄されている計算結果が多く、無駄が多い。fibonacchi(30)を計算すると、400万回の関数コールが行われるらしい。じゃあどうやって効率化すればいいのかは示されなかった。

ユークリッドの互除法。本体は return gcd(y, x%y)); のみ。これはx, yの大小関係が考慮されてないけど大丈夫なんだろうか?

フラクタル図形への応用。フラクタル図形は自己相似になっているので再帰と相性が良い。POV-Rayというソフトが使いやすいらしい。例としてシェルピンスキー三角形をあげる。中点を結んだ正三角形をどんどん取り除いていくときれいな図形ができる。三次元のテトリックス図形というのもある。3Dでもそんなにコードの行数がいらない。メンガーのスポンジというのもある。同じことを立方体とか正方形でやればいい。

再帰とスタックについて。スタックを使うと再帰処理と同等の処理を扱うことができる。メモリが少ない時代はよく使われた。再帰は簡潔で数学的な記述もできるが、トレース(っていうかデバッグ)が難しい。バイナリサーチツリーの例をスタックにしてくれたがわかりづらい。コード量が増えたことだけがわかった。速度はどうなのか?

末尾再帰。実行する最後のステップが再帰になっていること。これをfor文に変えてやると、いろいろと節約できる。ちょっと例が分かりにくかったので、印刷教材で要復習。

第12回

ソーティングについて。さんざん他の講義でやったことだから、飛ばし気味に差分だけ学んでいこう。

ソートをやるためには必ず大小関係がないといけない。大小関係さえあれば昇順降順で並べ替えられる。

ソート前と同じキーの順序を変えない、安定ソートを実装するにはどうするのか。この講義では言及されず。バブルソート、挿入ソートは安定らしい。選択ソートは不安定。原理上安定になるかどうかで判定するしかないのか。

バブルソート10万件。O(n^2)だし時間かかるはず。12秒。厳しいね。ループ内がソート済みならなにもしない、という改良版バブルソートだと50%整列済みの配列を使って10.1秒。メモリ移動のコストを省くと2割くらいは速くなるのね。95%整列済みだと5秒。

選択ソート10万件は2.8秒。バブルソートよりはだいぶ速い。バブルソートはswapの回数が多いから遅いらしい。やはりメモリ内移動のコストはでかい。ただ、不安定ソートなのが悩みどころ。

挿入ソート、コード見ても何もわからん。困った。整列済みだと非常に速いのが特徴らしい。10万件でやはり2.73秒と速い。選択ソート並み。50%整列済みだと2.0秒、95%整列済みで0.262秒。とてもはやい。

古いPCと新しいPCでのソート時間の比較。先生の趣味のコーナーだな。99年のCeleron 300MHz vs 2017年のCore i7 2.8MHzを対決する。バブルソート10万件をおこなうと99年で315秒、2017年で15秒。22倍の差があった。ここで99年PCでクイックソートを行うと0.110秒。2017年PCよりずっとはやい。アルゴリズムによってこんなに差が出るのか。なお2017年PCでクイックソートをやると0.006秒。

第13回

ソートの応用。また他でやったアルゴリズムなので飛ばし気味で。

クイックソートは1960年にはもう作成されていたらしい。ホーア卿とか言う人が発明した。イギリス発祥なのか。分割統治アルゴリズムともいわれる。C言語のqsortはクイックソートの改良版(?)らしい。具体的にコード見てみたいね。クイックソート10万件の実験、0.009秒。はやい。1億件でも10秒で行ける。

クイックソートを2回行うこと。2回目は整列済み配列をさらにソートすることになる。どのような速度になるか。1回目は一瞬で終わるが、2回目は18.9秒。あれ、整列済みだと弱いのか??なんで???理由としては、ピボットの選択手法によっては再帰の深さがめっちゃ深くなってしまうかららしい。というわけで、ピボットの選択方法によって対策をすれば整列済みデータでも全然速くなる。

再帰ではなくスタック利用のクイックソートについて。メモリが少ない環境では利用価値がある。大変な感じのソースになるが印刷教材に載ってるのかな。

C言語のqsortを使うとソート済みでも30万件→0.01秒で終わる(未整列よりはやい)。

マージソート。まず配列を分割し、少しずつマージしていく。実装としては、マージ用の配列と同じ要領のtemp領域が必要なのが特徴。1億件も13秒で終わる。たぶん、配列の分割がlog回で済むからだろう。利点は配列の整列未整列に依存しないこと。安定ソートであること。欠点は、メモリコピーのせいで若干パフォーマンスが落ちること。実測でもクイックソート比で3割遅い。結局、実用ではクイックソート改良版が最強ということになる。

第14回

ヒープの話。ヒープとは、ツリーに基づくデータ構造のこと。ノードの挿入と削除を高速に行える。完全二分木である。葉の高さが同じか、左>右になっているもの。なんか今回先生飛ばしてるな。

最大ヒープ。親ノードの値が子ノードより大きいか等しいもの。最小ヒープもある。他にはフィボナッチヒープ、d-aryヒープなど。普通はバイナリヒープ(二分木のみ)を指す。

ノード挿入。まず最下段に追加、次にヒープ条件(最大とか)に従って値の交換を行う。ヒープ条件を満たしてなければ上段のノードと交換しまくっていけばいい。この時の計算量はo(logn)になる。交換の可能性は1/2と仮定できるので、正確には0.5 * logn。葉が多いから行える操作だ。

ノード削除。ルートノード削除を例にすると、まず葉ノードとルートノードを交換する。その後挿入と同じで、上から下に向かって交換を行っていけばいい。この際、どっちの子ノードと交換するかについての条件は不明。計算量はやっぱりo(logn)になる。

実際の実装では配列で行う。ルートが配列の1番目、レベル1が2,3番目、レベル2が4,5,6,7番目…などのように実装していけばいい。ダイレクトアクセスも可能にある。添え字kの左の子ノードは2k、右は2k+1、親ノードはk/2(切り捨て)で表現できる。なるほど!!添え字0からスタートでももちろんできて、左を2k+1、右を2k+2、親を(k-1)/2でやればいい。でも1からスタートした方がコストが少ないので、だいたいは1からスタートで実装しているらしい。

ヒープを利用したアルゴリズムの実装。まずは優先度付きキュー。ヒープで実装すればどれもo(logn)でいける。どうやって実装しているかは謎。印刷教材を見よってとこか。最大ヒープを使ってキューをenqueueの度に並べ替えれば、優先度の高い順に勝手に並べ替えられるってことなのかな。

ヒープソート。まず全部データをヒープに挿入して、ルートから最大値を取り出し(削除するってことか?)ヒープを再構成しながら挿入済み配列にデータを移していく。計算量はo(logn)が2回分。クイックソートよりはこの2回が効いてきて若干遅いが、整列済みかどうかに影響を受けない。あと、クイックソートと同じく不安定ソートであるのが欠点。10万件で0.009秒、1億件で82秒。クイックソートよりけっこうかかる(コードが適当だからかもだって)。

第15回

グラフの話。グラフとはノード同士をつなぎまくったデータ構造のこと。ツリーもグラフの一種である。

グラフ周りの用語について。頂点Vertex(ノード)と辺Edge(ポインタでリンクを張ることに相当)。辺の両端にある頂点は隣接しているという。ある頂点から別の頂点に至る連続する辺のことをパスという。パスは複数ありうる。

連結グラフと非連結グラフ。すべての頂点を行き来できれば連結で、分断されていれば非連結。輪になっていたら閉路グラフ。Cnと表記する。辺に方向性があるグラフを有向グラフという。

辺に重みをつけると重み付きグラフ。これはカーナビとか運賃でよく使う。完全グラフは全頂点間に辺があるもの。辺の数は計算できる。

コンピュータでどう表現するか。まず隣接リスト。a→b,c b→a,c c→a,b,d d→c みたいな感じ。有向グラフも重み付きグラフも表現可能。自己参照もOK。

隣接行列。辺があるかないかを二次元行列で表現。ちょっとテキストで書くのは無理。ピクロスみたいな感じ。容量が大きい。有向も行けるし重みは数字を大きくすればいいからいける。無向グラフなら三角行列で十分。

実装。行列の方が楽で探索時間も少ない。ただしメモリを食う。

グラフの密度について。密度が低いと隣接リストが、高いと隣接行列が有利。だいたいeの数がvの2乗に等しくなってくるとけっこう密度が高い。

コード例。ぜんぜんいみわからん。

グラフの探索。接続情報に基づいて全頂点をたどることをいう。まず深さ優先探索。頂点をたどって行って先に進めなくなったら後戻りする。未訪問の頂点を訪ねて、頂点をスタックにpush。進めなくなったらpop。C言語で300行くらいになる。大変。とりあえずスタック使うんだなってことだけがわかった。

幅優先探索。近くにある頂点を優先的に訪ねていく。キューで実装する。頂点に隣接する未訪問の頂点をenquere。未訪問の頂点がなければdequere。動作例を見て何となく意味は分かった。深さ優先探索より速そう。どういう欠点があるのかな。

放送大学全科目感想 010 コンピュータとソフトウェア(’18)

  • 情報コース
  • テレビ科目
  • 辰己丈夫先生(放送大学教授)
  • 中谷多哉子先生(放送大学教授)
  • 白銀純子先生(東京女子大学准教授)
  • 難易度 ★★☆☆☆
  • おすすめ度 ★★★★☆

ソフトウェアの動作する仕組みを、ハードとソフトの両方の視点から学ぶ。3人の講師で、話題はPCの分解から簡単なアルゴリズムやプログラミング、データベース、開発の考え方など多岐にわたる。広く浅くという感じで、トピックごとの難易度は高くない。個人的には第8-9回目のプログラミング入門が素晴らしいと感じた。

第1回

全般的ガイドとコンピュータの構造について。聞き手は河原さん(アナウンサー?)。

この授業では一般的にコンピュータについて知ってほしいことを扱うらしい。

ソフトウェアが起動する仕組みから。今日は中谷先生の担当。ソフトウェアはなぜハード「上」で動くというのか、それは階層構造があるから。OSIレイヤーみたいなのが出てきて、ハード→OS→アプリの順に上に上がっていく。先生、AndroidをiOSより先に言ってるから、Android派だな。OSはソフトウェアとハードウェアの間に入ってハード資源を使う役割を果たす。

ソフトウェアを使うにはインストールする必要がある。インストールとは導入する、記憶させること。スマホもそう。スマホってソフトウェアってパッケージ化されてるんかな。PCだとファイル群をコピーしてレジストリ登録して。。が一連の手続きだけどスマホだとどうなってるのかな?

中谷先生って間とノリツッコミが独特。説明はすげーわかりやすい

下部構造へ。ハードウェアの説明になった。OSはソフト→ハードの命令の翻訳を担当する。ソフトウェアからハードウェアに直接データを送ればいいではないかと思われるが、そうもいかない。ソフトウェアにハードウェアの全ドライバを実装しないといけない。しぬ。

白銀先生と一緒にコンピュータを分解・組み立てするパートになった。マウスコンピュータのやつだ。まず静電気を放電(やったことなかった。やばい)。PCを自作する利点とは何か。まず自分の希望に合わせてパーツをカスタマイズできること。次に部品ごとに交換ができること。HDDはよく壊れるのでHDDだけ取り換えればいいとか。中谷先生は自作派ではなかったらしい。

マザボに電源をつなげて、HDDを取り付け、SATAケーブルでつないでる。CPUにはファンも付ける。グリースを塗るのは実はCPUのファン側には穴がたくさん開いてるのでそれを埋めるためらしい。マザボには全部どこに電源をつければいいか書いてある(これもよく知らんかった)のでこれを見ていけば簡単に作れるらしい。そのあとメモリを取り付けてる。最後にビデオカード(実は使ったことない)。蓋にCPUファン用の穴がついてる(これも見たことない)。うちのPC古いので、そろそろドスパラで部品そろえて自作しなおしたくなったな。

次に稼働させる段階の話。スイッチって0-1を示してたのか!!0がOFF、1がONってわけだ。OSを入れたUSBメモリを指して電源を入れた。電源ボタンは0-1を組み合わせている記号がついてる(これもそうか!)。電源を入れると表示されるBIOSはBasic Input Output Systemの略(だったのか)。CMOSってのは何の略なんだろうな。CPUはi5らしい(4年前だしな)。メモリ8GB(4年前としては多め)。ESCキーを押すと画面戻るとか、いろいろ細かく教えてくれてる。最後にUSBからWindowsインストールしてる。USBからだとはやいな!

最後にコンピュータの部品の説明と仕組み。メモリの仕組みになって突然難しい図になった。主記憶装置とメモリ、周辺機器の関係図。さてこの図だとソフトウェアがどこにあるかわからない。先生の定義だと、ソフトウェアとは、プログラムとデータから構成されるものだという定義になった(これ卒論で使えそうだ)。データ伝送路というもので周辺装置、CPU、メモリがつながっている。伝送路の速さにも性能は依存する。具体的には16-32-64bitアーキテクチャのこと。ああそっか64ビットのアドレスを保持できることが前提じゃないと、広大なメモリ領域とか、計算の基本単位とかが保障されないもんな。

第2回

辰己先生とネットワークの基礎について学ぶ。

原則、コンピュータ同士は電線でつなぐ。それもそうか!?光ファイバーだって、電線だもんね。

糸電話を始めた!しかも辰己先生の自作!さて、コンピュータの通信では、両者がかなり離れている。なので、送信と受信のタイミングを相手に伝えないといけない。また、送信と受信のチャネルを分けないといけない。それに、1対1とは限らない。3人かもしれない。そしたら、だれがだれに話したかわかるようにしないといけない。すると宛名をつけて、他の人宛のメッセージは無視しないといけない。ということを3つのコップのある糸電話とか、1人2つコップのある糸電話を使って説明してくれた(これも自作)。

AさんとBさんの会話を第三者Cさんに聞かれないようにするには?それぞれA-B B-C C-Aの3本の線を繋げばいい。これが4人だと4*3/2=6本。5人だと5*4/2=10本。6人だと15本。ということでnの2乗のオーダーで増えていくので大変。

通信はホスト同士で考える。6台のホストは、1本の線を中心において、そこにみんなが接続していくようにするとすっきりする。これをバス型という。ホストの場所のことをMACアドレスという(そういう定義だったのか!?)。MACアドレスを宛先に入れて、自分宛て以外のメッセージは無視するようにすればいい。

自分宛てのメッセージを待つ方法をCSMA/CD方式という。バスを共有している場合、2人がずっと通信していると、バスを占領して全員が通信できなくなる。占領する度合いをトラフィックという。スイッチングHUBを使うと、他の人のところに通信がいかないようになるので、問題が解決する。ハブは、MACアドレスを見て通信を振り分ける。ただし、インターネット宛になると話が変わってくる。

インターネットの話に変わった。インターネットはネットワーク同士をつなぐ約束事(プロトコル)の集合のこと。以前はThe Internetと言われてたが、最近では一般名詞になって小文字になった。

サーバと中継機器。この人たちは常に動いていないと困る。動いていないということは、道路や信号が止まっているようなものだと思う。先生は、サーバーが落ちるというのは、ネットワークが圏外になってるようなものという表現を使った。クライアント、サーバーの性能を比較すると、動画やゲームを動かすクライアントに比べて、サーバーの性能はあまり必要ない(計算量が少ない)。だから、パソコンでサーバーを立ち上げるのは性能的には簡単。

通信プロトコルの話。通信のルールのことをプロトコルという。プロトコルは上位・下位の層があるという。どういうこと?例えば切符を買うときのプロトコルでは、文字は下位、切符の買い方は上位、みたいな感じ。

何か話をすることを考える。言語は?日本語。手段は?電話。何の話をする?服装の話。この3つについて、どれか1つだけ独立に変えることができる。例えば言語だけ英語にするとか、電話をLINEみたいなアプリに変えるとか。これがプロトコルの層という話になる。どれか1つを変えても、他の層に影響を与えない場合、多層構造であるといえる。あーそういう観点無かった。一つ層を変えたら全部変わるもんだと思ってたわ。

おなじみOSI参照モデルが出てきた。例えばスマホがwifi→モバイルネットワークになっても、上層部は何も変わらないじゃない?たしかに!!インターネットは3-4のネットワーク、トランスポート層だったはず。

インターネットについて。通信単位をパケットという。データをパケットに分割して順番をつけて送信する。メリットは、トラフィックを長く占有しないことと、データの一部が無くなっても再送することができること。結構データが切れることは多いけど、再送にはどんな仕組みがあるんだろうな。あんまり機能してない気もするけど、、

IPアドレス。電話番号のようなものという定義になった。IPアドレスはMACアドレスのように機械出荷時のとき固定するわけではなく、動的に変わることがある。だから電話番号ってこと。IPアドレスは42億しかなくて足りないんで、IPv6にするって話だけどあんまり普及してない気がする。実際どういうところでv6になってるのかよく知らんなあ。

第3回

インターネットについて。ソフトウェアの科目にしてはネットワークの話多いね。今日は辰己先生。

封筒を使ってパケットをシミュレート。OUJの文字を送る。裏面にASCIIで表した数字が書いてある。手が込んでるなー。封筒に宛先を書いて、さらにルーター宛の封筒に入れて渡していく。ルーターは一つ封筒を一つ開けて宛先を見て、また宛先に近いルーター宛の封筒に入れて次のルーターに渡す…を繰り返す。そのうち宛先にパケットが到着する。パケットが来なかったらまた再送のお手紙を出す。最後までパケットが届いたら届きましたーって通知も出す。封筒をパケットのヘッダーに見立てているんだろうなーよくできてる。準備がたいへんや。

IPアドレス→ホストにつけた番号。電話番号と同じ。可変。ただし有効範囲はインターネット全体。一方でMACアドレスは不変。でも有効範囲は部屋の中だけ。MACアドレスが衝突することってあるのかな。

IPV4ってまだまだ現役だよね。32ビット、2の32乗で42億通りしかできない。32ビットアーキテクチャと関連してるから42億って数値は覚えておこう。

ネットワークアドレスについて、例えば12.34をある組織ということにすると、組織内で65536通り割り振れる。市外局番みたいなもん。ネットマスクというのは、ネットワークアドレスに使う部分の長さのこと。2023新課程の情報Ⅰの試験の例にでてきたよこれ。将来の高校生はみんなこれ知ってるんだよなあ。

IPV6は128ビット。3.4*10の38乗通りのアドレスが割り当てられるのでなんでもいける。

IPは変わりうるが、ドメイン名とIPが結びついているので問題ない。これを対応付けるのがDNS。世界規模の電話帳といっていい。DNSは分散管理されている(後述)。DNSはドメイン→IP(正引き)、IP→ドメイン(逆引き)のどちらの変換もできる。

www→ホスト名。ouj.ac.jp→ドメイン名。www.ouj.ac.jp→FQDNというらしい。

.jpの中でもac.jpとかed.jp、go.jp、lg.jpのほかにtokyo.jpとかもあるらしい(しらんかった)。これをセカンドレベルドメインという。オリジナルドメインは高いと言ってる。そうでもないっすよ。rokujo.orgは年3000円です。

jpのドメインはルートサーバ(?)、ouj.ac.jpのドメインはJP DNSサーバ、www.ouj.ac.jp内のIPアドレスは放送大のサーバが管理している。このように分散管理がなされている。ここら辺の仕組みももっと詳しく知りたいっす。いろいろ参考文献ほしい。

経路問題について。どうやってホストからホストに通信をするか。近いホストは簡単だけど、遠いホストはどうするのか。デフォルトゲートウェイというものを利用する。ネットワークの外側に行きたかったら、とりあえずデフォルトゲートウェイにパケットを送ってあげる。空港とか駅みたいな感じ。あとはゲートウェイ同士が通信をする。ゲートウェイ同士は太い通信線で結ばないとだめですね。あとは「数学的にいろいろ工夫がされています」とぼかされてしまった。知りたいです。

検索エンジンを簡単に解説してる。クロール→データベース化→検索サイト接続→表示って流れ。データベースをいかに工夫するかが大事なんだろうな。

CDN。米国サーバと同じ内容を日本国内においておく。すると米国のサイトにつないているのに日本でも同じものがトラフィック軽めでみられるようになる。

仮想マシン。ネットワーク経由で、コンピュータの真似をする。仕事で結構使ってます。コンピュータのシミュレートなので丸ごとコピーできたり、時間を止めたり進めたり簡単なので便利。最後の方はずいぶん詰め込んだな。

第4回

UI(ユーザーインターフェース)について。白銀先生+中谷先生。

インターフェースとは接合点のこと。例えば電源と電源プラグ。USB機器とプラグ。何かと何かを連携・連結するところのことをいう。

コンピュータでは何があるか。キーボード。あっ白銀先生カンペみえてるよ!Bluetoothもそう。スマホの画面入力のソフトウェアキーボードもそう。QWERTY配列は、タイプライターに由来する。バー同士がぶつからないように調整したんだって。メカニカルな理由だったんだ。他の配列は?dvorakというのが有名らしい。頻度の高いアルファベットが押しやすくなっているらしい。親指シフトってのが日本語ではよく使われる。聞いたことはある。文字入力たくさんやることが多いし、ひらがな入力もトレーニングしてみようかな。

マウス。最近トンと見なくなった機械式と、光学式のマウスが出てきた。機械式はゴミが中に入るのが欠点。トラックボールも出てきた(これまだあるの?)

出力装置。ディスプレイから。昔はCRTだったね。今は液晶。テレビと同じ。液晶はバックライトをあてて光らせて表示させてる。12.1型みたいな名称は、ディスプレイの対角線の長さをインチで表したもの。ppiはドットの密度のこと。

1ドットは3つの点(!?)で構成されている。RGBで1点ずつ。それぞれ256段階で光らせればフルカラーになる。出力が256段階ならデータがフルカラーより細かくても意味ないね。拡大したドットを見せてもらった。確かに正方形を縦に3分割してRGBがそれぞれ光っている。しらんかった。スマホは細かすぎてルーペでは3分割した点が見れないかもしれないとのこと。

プリンタはCMYK方式。どうしても印刷物に違和感が出るのは色の表現方法が違うから。実物で比較してもらった。たとえば空の水色、雲の青っぽい黒がだいぶ異なってくる。これ例えばカメラのキタムラで印刷してもらった写真でもそうなのか?できるだけディスプレイに近づける工夫があると思うんだけどどういうことをやってるんだろ。

画面読み上げの話。マウスポインタの下の文字を読み上げてくれてる。windowsだとしょぼい。siriの方が読むの上手。

タッチ入力、ペン入力。誤認識問題のことをfat finger問題というらしい。対象物より指が大きいためにおきる。

CUIとGUI。CUIは命令を覚えなきゃいけない(けど、速い)。今でもネットワーク機器でよく使う(し、コマンドプロンプトでいつの時代でも使えるよ)。GUIは90年代~。命令を覚えなくていい。私は90年代からPCに触れてるから、ちょうどCUIとGUIのハイブリッド世代だな。cygwinでファイル見てる。エクスプローラとプロンプトで両方とも同じファイルが表示されていることを確認。lynx 命令でwebページを表示することもできる。テキストベースのインタフェースが用意されてないと無理だな。WYSIWYG(古い)も紹介された。texも紹介してもらった。あれ、wordってtexそのまんまサポートしてるんだ!?

第5回

今回は辰己先生と大阪電通大の兼宗先生。見えない情報技術について。取材がメインだそう。

いろんなものにコンピュータが入ってますねーという話からスタートした。コンピュータは汎用、高性能、安価なので使われている。

人間は五感を使って情報を収集した後、文字などを使ったりして何かを出力している。コンピュータも同じ。入力と出力がある。

組み込み型コンピュータについて。コンピュータを頭脳に見立てて、センサーやアクチュエータを五感、筋肉として活用し、入力と出力を行う。アクチュエータとしてはエンジンとか、モーターとかが例になる。

楽器の中のコンピュータの例。辰己先生の取材。辰己先生ギター弾けるんだ!KORGに取材してる。シンセでアコギの音を引いてる。サンプリングしてメモリーに収録しているらしい。オルガンの音もドラムもならせる。基盤を見せてくれた。CPU、DSP、メモリ、ユーザーインターフェースからなる。あれ最近のMIDIキーボードってBluetoothでいけるんだ!確かにシンセの音鳴ってるわ。switchでも音楽作るソフトがあるみたい(ほしい)。iPadにも音楽作るやつ入ってるみたい(BandLab?)。

認証について。静脈認証システムの取材。富士通だ。ATMに手のひらをかざして認証してる。暗証番号はどっちにしても必要なんか。まだ岐阜の大垣共立銀号しか採用してないらしい(2018)。クレジットカードを手のひら認証することもできる。近赤外線を照射して、血管が赤外線を吸収することを使っているそうだ。画面が洗練されていないのが富士通って感じ。

手のひら認証は、犯罪の指紋とはちがって、積極的に個人情報を提供していくことと同じだから、意思の確認としても使えるということ。あーそういう視点無かった。他人とご認識される確率は1/1000万。すげ。双子でも誤認識しないらしい。流出対策としても、静脈情報は取り直せばいいらしい(どういうこと?一意性がないの?)

人と一緒に働くコンピュータについて。店舗ロボットだって。慶應でもあったやつや。今回は大阪電気通信大学の鄭先生。コンビニの商品陳列ロボット。まずキャリブレーション(初期位置確認)を行う。準備運動みたいなもん。まずおにぎりを掴む。これ力の加減難しいよな。アッ落とした。倒した。まだプログラミングが不足らしい。腕を上げてなかった。シールをつけて何の商品なのか認識する仕組みらしい。弁当は吸盤で吸着。おっこれはうまくいった。使っている技術としては画像認識、モーターの制御など。安全性がこれからの課題だそう。なんと学生の手作りらしい!

辰己先生談、カメラの性能が高いので、コンピュータも高性能じゃないと解析が不可能という面があるらしい。

フィードバック制御について。屋内ではGPSが使えない。位置と動きを微調整しながら動作するためにフィードバックのような仕組みが必要になる。

車輪を使うこと。店では広いスペースがないから、車輪を3つ使って小さな半径で回れるようにしている。

辰己先生、10年前にも取材をしたことがあって、その時と比べてずいぶんと進歩したらしい!コンピュータの性能向上が最も大きな要素だそうだ。今後は人工知能がデフォになるからAI視点が重要になってくるらしい。

第6回

辰己先生。コンピュータにおける数値表記について。多分計算の科学と手引きとかぶってる。

位取り記数法から。数字を大きくしていってあふれたら左側に1桁増やすことをいう。n個数字を使えばn進法になる。点10個を表す場合、2進法なら1010、3進法なら101。混乱を防ぐため十進法、二進法などと漢字で書くことが多い。1010(2)という書き方と、(1010)2と書く流儀がある。前者が多い。

二進法と十六進法の対応表を見てる。プログラマーにはなじみがあるけど初めてだと大変そうね。

六十進法は身近に使ってるという例。時分秒で使ってた!

ビットとバイトの話。まず先生がパンチカードを出してきた。そもそもビットとは、穴のことらしい(そうなの!?)8ビットで1バイト。コンピュータの中身は実際は0と1ではない。電流とか磁気とかだから。それもそうだった。01が実際に数として記録されれるわけじゃーないや。

なぜ固定長なのか。大きな数を取り扱う前提で場所を数を記録する場所を取り過ぎると無駄なので、昔は8bitだった。固定長の場合は、小さい数字は00010000みたいに、左に0を補ってやればいい。区切ってやれば、処理しやすくなる。8bitでは255までしか表せないから、2つ、4つ並べていって大きな数を表していた。

2進法→10進法の変換してる。辰己先生、字があまり上手じゃないのが好感を持てる(私も下手なので)。ビットシフトすると2倍、半分になるって話もしてる。倍々にしていって1を足したり足さなかったりする変換方法もある(知らんかった)。

負の数と小数の表し方。4桁のカウンターで説明。9997は、3回押したら0000にある。だから、9997は-3と同じではないか?同じように、時計の9時57分は、10時-3分と同じではないか?という考え方をするらしい。これを補数という。1000をフルだとすると、999に対する1が補数。256をフルだとすると、10に対する補数は246。補数、基本情報とか応用情報でやったけど、意味わかんなかったなあそういえば。ようやく意味わかったです。

コンピュータでは、マイナスは補数で表す。-10は246表す。-100は156で表す。どこからどこまでがマイナスなのか、プラスなのか、はコンピュータ上の決まりとして決めておく(signedとunsignedの約束事のことだと思う)。この仕組みならプラスもマイナスも一緒くたに計算してやることができる。

小数はビットでどう表すのか。印刷教材を見ろとのこと。ここでは小数の記数法の話。10進法では1/10にすると小数点が一個ずれる。これをn進法にすると、小数点を一個ずらすことは、10(n)分の1にすることと同じ(あーそっか!)。

3進法で一桁ずらすと、循環小数になる。n進法でも循環小数になる。逆もそうで、10進法ではきれいだけどn進法では循環小数になる場合もある。

第7回

(しんどくなってきたので以降感想は適当です)

データの符号化について。

ISO-2022-JPって漢字のin-outに3バイトとも使ってるのか。大変な仕様だ。UNICODEは?と思ったら解説無し。

紙テープ折って0-1で長さを表す実験。辰己先生こういうの上手だなー。

色のデジタル化。加法混色と減法混色について。つまみでRGBを調節して色を作る装置が出てきた、楽しいのでほしい。

3ビットカラーの写真。8色でもそれなりに写真が見えることが驚き。

ラスタ形式とベクトル形式。ベクトル形式って実際どんな風にコンピュータ上で表されているのか気になる。二次元ベクトルをいっぱい書いてあるだけなのかな?

MIDIのはなしのとこでボカロがでてきた。メジャーになったもんだね。

パリティビットの実演。1や0が偶数になるようにすればエラー訂正が確かにできる!

第8回

プログラミングの基礎。兼宗先生。

プログラミング言語は自然言語と機械語の中間である。人も機械も両方理解可能なところをとったもの、と考えるのがよい。今回は宗近先生が作った(!)というドリトルという言語をフューチャーする。

『「かめた!90左回り 200歩く」!4回 繰り返す』みたいな感じの命令文がある。日本語じゃん!そして、登場人物がscratch風の動きをしている。

★書いてる。144度ずつ回すとちょうどうまくいく(720度/5)。

回数と角度を変えるだけで画像がいろいろ変わっていく。プログラムは書いていろいろ実行してくと面白いことがわかる。プログラミングってとにかく動かすしかないよねー。いやこれは素晴らしいイントロだなあ。

対話型プログラム。ちょっとこれは。。見づらい。ドリトルは、直感性を重視して、可読性をおとした感じの言語なんだな。あとシンタックスエラー頻出しそう。カメがひたすら動いて、物にあたるとそれを消す、というプログラムだった。

プログラミングの要素。流れ・制御と反復処理、条件、入出力、データ型あたりが大事。変数を使うと一気にプログラムが便利になる。ドリトルのfor文、「|n| かめた!(20*n) 歩く」みたいな感じで、初見だと見づらい。慣れたら簡単そうだけど。

ドリトルは関数定義もできる。かめた:星を描く=「(命令文)」みたいに書けば、かめた!星を描く、でコールできる。JavaScriptとおんなじや。これはまあ、見やすい。

配列は データ=配列!10 20 30 40 みたいに書く。配列処理は データ!「|要素| 合計=合計+要素」みたいな感じ。よみにくい。

最後にC言語。やはりCは大事らしい。コメンテーターの河原さん、見た目は暗号みたいだけど、意味を教えてもらえばわかりやすいということ。かえるぴょこぴょこ・・・を表示させるプログラムを作ってる。これはわかりやすい。

この回神回かもしれない。プログラミングに抵抗ある人、ぜひこの講義見てください。

第9回

辰己先生回でアルゴリズムの話。アルゴリズムは終了することが重要。最大の整数を見つけてください、というのはアルゴリズムではない。それもそうか。

アルゴリズムは書き方は問題ではなく、何をするかが問題となる。書き方はいくらでもある。

良いアルゴリズムとは。だれが動かしても大丈夫、読みやすい、メモリを使わない、処理が速い、などなど。

数学的なアルゴリズム。まずユークリッドの互除法(えー!?)。世界で最古のアルゴリズムらしい!授業のネタになるね先生126*35の紙作って持ってきてる。。すげえ。。折って切って折って切って、、長方形が正方形になるまで折って切ってを繰り返す。このプロセスをドリトルで書くとなんと7行に。

ソートとサーチ。天秤を使ってバブルソートを行っている。6個の重りで15回の比較をすればいい。整列を手を動かしながらやるとめっちゃわかりやすいな!そしてドリトルで書くと見づらいな。先生、変数はせっかくだから日本語にした方が。

二分探索を広辞苑でやってる。これはわかりやすい!100万ページでも20回、10億ページでも30回の探索でできる。logで探索できるってのはすごいねぇ。

ハノイの塔を使って再帰プログラムを解説する。文字で書くのは難しいが結構感動した。円盤の枚数を1枚増やすごとに、1つ前の手順と同じことを繰り返していけばいい。2枚だろうとn枚だろうとやることが同じ。これが再帰的か。なおハノイの塔は64枚にすると2の64乗回の処理が必要らしいので、フリーズするそう。

最後に、天秤と重りでクイックソートやってる。。すげえ。。神。確かにクイックソートは再帰的だわ。しかも2分で説明終わったで。

第10回

シミュレーションについて。辰己先生+兼宗先生。

モデルとは何か。実物ではないけど特徴を良く表しているところのもの。

メルカトル図法の図は最短距離を求めるにはうまくいかないが、地球儀だとうまくいく。モデルには、抽象化が不可欠だが、問題に合わせた抽象化が必要。抽象化したものを記号や図で表すと、モデルになる、つあmり地図とは、モデルである。

シミュレーションとは。現実をモデル化して、モデルによってさらに現実を模倣すること。具体的にはこういうこと。200mの道を1.2m/sと0.9m/sで向かい合って歩いている人がいる。何秒後に出会うか。中学数学の問題だ。これの式を立てると、式が数式「モデル」である。グラフで表してもモデルと言える。

数学で表されるのは、解析的な解。現実はそうとは限らない。

つるかめ算。河原さん手馴れてるので中受経験者か。これは連立一次方程式で解ける。エクセルでも余裕。プログラムでも、for文で回して総当たりにすれば解ける(まじめにやるなら、クラメルの公式使ったりするのかな)。

物理エンジン風のものをドリトルで再現している。ドリトル、こういうのが得意なんだな。

突然、京コンピュータの取材に行った。河原さん上がってる。わたしもあがってます。8万ノードもあるらしい。現実の計算をするためには、大規模かつ複雑な計算をする必要がある。これを可能にするのがスーパーコンピュータ。実際には、大気シミュレーションなどに利用されている。モデル化がうまくいかなかった例としては、車のドアミラーの風切り音についての計算。これは、計算の細かさ(メッシュ)が足りていなかったために、起こりえない現象がシミュレーションで起こってしまったということ。計算で工学的なシミュレーションができるようになったので、効率化・費用削減効果がすごい。

兼宗先生によれば、うまくいかない計算はまだ三通りあって、京コンピュータでも太刀打ちできない複雑な現象と、はっきりとした式で表せない現象(囲碁とか)。それから、人間の心理に関わる現象。

第11回

データベースについて。今回は兼宗先生。

DBは表計算では扱えないような量になってきたときに役に立つ。昔あった階層型とかネットワーク型ってどんなものなんだ?印刷教材に書いてあるかな。

リレーショナルデータベースって、好きな表を作れるのがいいよね。マクロ使ったりするともっと複雑なもの作れるし。

データベース用の言語として、教育用にサクセス言語ってのがあるらしい。なんじゃそりゃ。ってこれも先生が作ったやつかもしれない!!

「表示 売上データ」 とか、「選択 時間帯 夕方」みたいに入力して操作する言語らしい。SQLを簡便にして日本語化した感じかな。あと表が見やすい。どういう操作をしたかも、スタックに積んでいく方式で見ることができ、わかりやすい。

SQLになった。文字列に%を付けたらそこは任意の文字を表すっての、超基本なんだろうけど知らなかった。。やば。

DB設計について。いずれDBスペシャリスト受けるし、しっかり見とかないと。E-R図を使ったりするとけっこううまくいくみたい。二つの実体を関係を使って結んでやるのが基本かな。例えば、商品と顧客を、購入という関係で結ぶ。家計簿もE-R図でDBにならないか?

リレーショナルDBにする理由。全部一緒くたの表だと、矛盾する更新ができてしまう。A社と東京が必ず結びついている場合に、A社と京都みたいな記述があると困る。つーわけで、A社とその所在地については表を分けてしまうのがよい。

DBシステムの安全機能。ACID属性の、独立性だけちょっとよくわからない。原子性は、例えば簿記の記録で貸方と借方の片方だけが記録されるようなことがあったら、やばいということがわかる。で、これ実際ソフトウェア上でどうやって実現しているのかな?

第12回

オブジェクト指向の話。中谷先生担当。

まずは単位をそろえないといけないという話から。変数名だけだとプログラマーがずっと単位を覚えていないといけない。例えばキロとメートルを間違えると大変なことになるが、これをバグとしてで見つけるのは大変。これを解決するのがオブジェクト指向らしい。オブジェクト自体に単位変換をやらせればいいじゃんってこと。メートルなのかキロメートルなのかっていうのは、オブジェクトにメートルをくれとか、キロメートルをくれとか聞けばいい。

aNagasaみたいに変数名にaをつけるのって最近の流行りなのか。

オブジェクトの主人公としては、長さとか重さとか、人、図書館、状態などが考えられる。属性と操作があればいい。状態自体をオブジェクトにすれば、if文で大量に分岐することを避けられるね、というのも、原理としてはわかるが、実際コード的にはどう書けばいいのかな。

オブジェクトは関数の集合体(プラス、データの集合かな)。

自動販売機というオブジェクトを考えると、お金を識別したりランプを点灯させたり、いろんな役割があるよね。あと自動販売機の中に、お金を受け取るオブジェクトとか、ランプを点灯させるオブジェクトとか色々必要になる。役割分担が技術者に求められる技術の大事なものの1つになる。

Javaのプログラム例が出てきた。オブジェクト作ってデータ入力、演算、と出力をする典型的なオブジェクト指向プログラムのやつだ。異なる単位の演算を勝手にやってくれるのでありがたい。けど、けっこう行数が多くなるんだよね。多くてもいいんだけどさ―読みやすければ。

オブジェクト指向用語集が出てきた。情報隠蔽って、自動販売機の例だとわかりやすいね。内部でコインがどう動いてるとか、他のオブジェクトは知らなくていいし。あと、オブジェクト自身が自分の処理に責任を持つっていう考え方もいい。特にエラー処理、デバッグの時に大事になる考え方だ。

役割分担の上手くいっていないオブジェクト設計の例。主人公が少なくて、処理がごっちゃごちゃになってる。整理するためには、お金を処理する人とか、ランプを表示する人とかをオブジェクトにしないといけない。

情報隠蔽の意義は、隠蔽されている中身の処理を変えても、他に影響を与えないということ。効率的な役割分担の一貫だったんだな。私面倒で、隠蔽を一部解除して他のオブジェクトに編集可能にしてしまったりすることがあるのだけど、こういうことをすると保守性が著しく落ちるのな。反省した。中谷先生的には、オブジェクト指向では情報隠蔽が一番重要らしい。

良いメソッドの数は20くらい、中身は10行くらいがいいらしい。だからクラス一個は200行か。これならプログラマは5分で読めるらしい。たしかにそんくらいかも。

ドリトルもオブジェクト指向言語らしい。JavaScriptの仲間。小規模用。C++やC#, Javaなどはクラスベース。大規模用。オブジェクトベースでは委譲というやり方で、継承のようなことを実装する(詳しくはどんな感じなんだろ?JavaScriptならわかる気もする)。

第13回

ソフトウェア工学の考え方について。今回も中谷先生。

ソフトウェア工学とは何か。ソフトウェア開発において系統的で統制された、定量化可能な方法を適用すること。できるのかそれ?できればだいぶ見通しとか見積もり、開発保守の誰でもできる再現性のある方法が確立できるよね。情報技術者試験ってのはそういうことを学ぶ試験なのかな。例えば某手法を採用したのでプログラムのコードを1/100にできましたってことが分かれば、その手法を定量化して評価できる。特に大規模開発になったときに大事。私仕事はほとんど1人でやってるからあんま恩恵は受けられないんかな。。

納期の話。決められた通りにやるとうまくいかないので〆切のために適当にやると、仕様書通りにならなくなる。私らの場合だと、暫定でとりあえず動くようにして仕様書の方を(未実装)とか書いちゃうけどな。仕様書に合わせるために嘘のコードを書いた方が悲劇が起こるんじゃないんかな。

ウォーターフォール型プロセスについて。一発で要求→実装→運用までやっちゃうやつだ。これ見るたび危険だなって思う。テストにもいろいろレベルがあるけど、うちの会社だと基本的に単体テストの積み重ねが多いよなー。小規模なプログラムでもないのに、常に結合テスト、システムテストも兼ねてる感じ。

スパイラルプロセス。要求定義→プロトタイプを作る→リスク分析(これが大事)→またプロトタイプを作る、の繰り返し。webアプリなどはじめに何が必要なのかよくわかんない場合、よく用いられる。

リスクには何があるか。人員不足、間違ったスケジュール、間違った機能の開発、頻繁な仕様変更(!)、インターフェースの不整合が主なもの。

もう少し違うアプローチの開発方法について。まず簡単なプログラムを作って、徐々に完成に近づけていく方法をインクリメンタル型。これに対して、大枠は変えずに機能や品質を高めていく場合はイテラティブ型という。私はインクリメンタル型の方が好き。

Eclipseでてきた。JavaScript開発するときに昔使ったことある。今でも健在なんだな。

astahというモデリングツールの紹介。詳細な属性の入ったUMLが簡単に作れてる。放送大のモデリングをしている。わかりやすい。コードの自動生成機能もあるらしいよ。

要求分析の説明してる。学生で実務したことないと、これ意味わかんないんだよね。実際に人が動いているところを想像できないと、ただの抽象的な文字の羅列に見えてくる。

保守。基本的には予防保守=デバッグがメインだけど、例えば新しいwindowsに対応するため適応保守しないといけないことってけっこうある。そういえば今日ゲーセンに久しぶりに言ったらpop’nでXP embeddedがまだ使われていて驚いた。下手にwindowsを更新すると、ゲームみたいなハード依存が激しいソフトウェアは動作しない、不具合続出みたいになるからしょうがないよね。

第14回

UI理論について。白銀先生。

UIの品質はどうやって計るのか。今の時代は使いやすさよりもユーザエクスペリエンス(UX)が大事と言われる。ソフトウェアを使ったときのユーザの体験が大事ということ。使用前、使用中、使用後にどう感じるかが問題になるらしい。

国際規格がいくつかある。まずISO9241-11(1998)。有効性、効率、満足度を測定する。

次にSQuaRE。ソフトウェアの品質全般を定義している。利用時の品質、製品品質を評価する。ISO9241-11を拡張したもの。

最後にISO9241-210。人間中心主義を標榜する。前2つとは違い、言葉の定義だけが書かれている。

SQuaREの利用時品質モデルでは有効性、効率性、満足度のほかにリスク回避(経済とか安全性とか)、利用状況網羅性を評価する。評価しづらいソフトウェアの品質を定量的に評価するために、うまいこと考えたもんだな。製品品質モデルでは、使用性として適切度認識性(ユーザがニーズを満たしているか確認できる度合)、習得性、運用操作性、エラー防止性、ユーザインタフェース快美性(変な単語)、アクセシビリティ(障害者対応)が評価される。こういう観点を日々の開発に取りいれると、よいソフトウェアができそうな気がしてきた。

カーナビを例にしてUIをみてみる。パイオニアに来た。カーナビはユーザ操作の仕組みがなかったらしい。タッチパネルが登場したので操作が可能になった。スマホの普及によって、UIもスマホに寄せてきているらしい。フリック、ドラッグ、長押しでスクロール(知らんかった)、二点タップで拡大縮小などなど。

使いやすさと分かりやすさはトレードオフ。機能を置くすれば使いやすくなる。でもわかりにくくなる。そこで一貫性を持たせる。パイオニアさんは9*5のマスにすべての操作が収まるようにしてある。ミスを防ぐため、キャンセル操作は「はい/いいえ」を毎回表示している。

カーナビはターゲット層がいない。だれでも使う。そこで高齢者・障害者への工夫が必須になる。道路の色は一般的な地図を踏襲していて、これが色覚に障害のある人にそのまま認識しやすい色らしい。微調整としては、色温度を変えることができる。

通知の段階。車間距離が近づいてきたら黄色く警告、もっと近づいたら赤で大きく表示、など。最初に大きく表示するとびっくりするので。

ここまで見てきた内容は全部SQuaREの項目に関連付けることができる。運用操作性とか、アクセシビリティとか。

人間中心設計(HCD)のサイクルについて。まずHCDのための計画をして、ユーザの利用状況を特定する。ユーザ要求も特定して、具体的に設計する。最後に大事なのが評価。評価をフィードバックしてこれまでのサイクルに戻っていったりもできる。

具体的にGUIを開発することについて。GUIはオブジェクト指向と相性が良い。JavaのSwingクラス図を見ると納得できる。例えばボタンの子クラスに普通のボタンとメニューアイテムがあったりする。実例。Android Studioを使ってる(先生もAndroid派か)。実機、微妙にSONYのロゴが見えてるからXperiaかな?

第15回

社会で利用されているソフトウェアについて。中谷先生。総まとめと応用。

ポイントカードがいっぱいになってしまうことを例にして、高速化の説明。財布、カード入れ、手で持つ3パターンがある。手がキャッシュメモリ、財布がメモリ、カード入れがHDDに相当する。ただキャッシュメモリと手は、ポイントカードをどうやって認識するのか、という点で違う。キャッシュではポイントカードを認識するためにひと工夫必要となる。

ダイレクトマップ方式。主記憶装置のアドレスをキャッシュの大きさで割った余りとキャッシュのアドレスを対応付ける。これだとキャッシュ上の複数のアドレスが多対一で対応付けられてしまう。そこで上位ビットをタグにして、キャッシュにも入れておく。タグとアドレスが両方とも合致すれば、実際にそこに内容が入っているということが分かる。さらに、内容が実際に入っているかどうか保障するために有効ビット(最終ビット?)をオンにする。

キャッシュを大きくすれば速くなるんだけど、高い。そこで別の方法で速くする。マルチコアにしたり、コンパイラを工夫して最適化する。

主記憶装置を大きくしてもいい。次は仮想記憶について。主記憶装置が足りないときにHDDを使うやつ。いわゆるスワップってやつか。昔のwindowsで速度低下の原因になるやつ。ポイントカードの例えなら、財布からポイントカードがあふれた時にカード入れに放り込むことに相当する。カード入れというのは仮想記憶装置に相当する。あっスワップはめっちゃパワー食うって言ってる。だよねー。で、使わなくなったポイントカードを家に引き出し(HDD)に入れる。

情報システムの仕組み。wakabaを例に。わー機能多すぎ。たいへんや。DB自体は少ない(3つ)が、操作や管理機能が多すぎ。これをOSIモデルで表現すると、プレゼン層、アプリケーション層、データ層の3層だけで表現できる。

機械学習の話。主に教師ありと教師なしがある。教師あり学習では、正解を与えて学習させる。教師あり学習ではSVM(サポートベクターマシン)を使う。まずはデータを回帰曲線の上と下に分ける。そして上にある方について、どういう特徴量を持っているのかを学ぶ。

担当学生さんが手書き機能のパームリジェクション機能を機械学習で行うというので、その話の紹介をしてくれた。手のひらを置いたまま指の動きだけを検出したい。実際に手を置いて書きまくってもらいデータを取る。そしてどのような特徴量が手のひらで、指なのかを教えていけばよい。あーなるほど。原理だけでもすげーなって思う。

放送大学全科目感想 008 計算の科学と手引き(’19)

  • 情報コース
  • テレビ科目
  • 辰己丈夫先生(放送大学教授)
  • 高岡詠子先生(上智大学教授)
  • 西田知博先生(大阪学院大学教授)
  • 村上祐子先生(立教大学特任教授)
  • 難易度 ★★★★☆
  • おすすめ度 ★★★★☆

4人の先生が交代で、計算機科学の基礎となる理論をかなり突っ込んで解説する、導入科目とは思えないほど高レベルの講義が展開される。15回で数、暗号、プログラミング、アルゴリズム、確率、符号化、論理演算、記号論理学、などなど幅広いテーマを詰め込みまくりで高密度な講義が目白押し、理解できれば達成度も高いが難しすぎるという学生も大勢いるだろう。特に村上先生のパートは難解で理解に時間がかかる。個人的には、高岡先生パートがおすすめ。聞き手の雨宮さんは京大卒のイケメンで、理解力が高すぎて学生が置いていかれることもしばしば。

第1回

コンピュータにおける数の表し方から。聞き手は雨宮さん(男性、珍しい)

数と数字の違い。数字は数を表す文字のことで、表し方が多様である。数は文字で表さなくても概念として存在している。例えば個数。碁石でもテキストでもなんでも表せるし、文字で表さなくても表現できる。

個数を数える時は「同じ」かどうかで判別する。同じかどうかは相対的なものである。赤と青のコップがあったら、コップ自体は別のもので1つずつだが、「コップ」でくくれば2つとなる。

数の定義。自然数はここでは0を含むらしい。太文字のN。整数はマイナスを含んで太字のZ(Zahl:独)で表す。有理数は太字のQ(quotient:英)。実数はR。無理数は実数の行き着く極限という考え方らしい。例えばπは3→31/10→314/100→3141/1000→…と極限に進んでいくから。無理数=比で表せない数のこと。

記数法とは。数字を使って数を表す方法で、文化によって違う。アラビア数字とか漢数字とか。私たちが使っている記数法を、位取り記数法という。アラビア数字を桁が上がるごとに左に追加していく記数法のこと。n進法は、n個の数字を使った位取り記数法と定義できる。十六進法は0x2C、十進法は0d44、八進法は0o134、二進法は0b101100などと書く。

いろんな記数法について。古代バビロニアの数字は10進法で0がない。ローマ数字はI(1), V(5), X(10), L(50), C(100), D(500), M(1000)を使う。444はCDXLIV。実例として昔の看板がでてきた。MDCCXLVIII(1000+500+200+40+8 = 1748年)。

そろばん。位取り記数法で10進法。十干十二支は位取り記数法ではない。十干と十二支を組み合わせて数字を表す(しらんかった!)なんと両方とも同時に動く。10と12だから組み合わせは10*6=60通りで、奇数ずれは存在しないから半分の組み合わせは使われてない。

命数法。大きな数を表すときに使う。万とか億とか。10の4乗ずつ進む。万進法ともいう。英語は千進法。なお、2進法で大きい数を使うときは、KiB(2の10乗=1,024)が単位となる。ギガはGiB=1,073,741,824、2の30乗なので一般的なギガより少し多い。

桁区切り。ドイツは千九百を1.900みたいに書くらしい。フランスだとスペース区切りで、1 900。

辰己先生は文字通り、数字に強い先生だな!

第2回

二進法やビットについて。宇宙人の指が14本だったら?14進数になるのではないか、という話から始まった。

固定長表記と可変長表記。固定長と言えば電話番号と郵便番号、ロッカーとか。0が付く固定長と、つかないもの(ナンバープレートとか)がある。なぜ固定するか。範囲を決めておくと便利なことが多いから。固定長でオーバーフローすると、桁あふれが発生する。桁あふれが発生すると、右側だけ見て計算したのと同じになる。昔のゲームのバグはだいたいこれを利用したものが多いですよね。アイテム無限増殖バグとか。あれは桁あふれもあるけど、メモリ破壊を使ってる気もする。

二進法を十進法に直すやりかた。ちょっと変わったやり方をしてる。2倍して1を加えたり加えなかったり、を繰り返してる。たしかにそれでもあり。十進法→二進法は、高校でもおなじみの2で割っていくやり方。2倍して1を加える…のやりかただと、なぜ2で割っていって余りを並べていけば2進法になるのか、がわかりやすい。なるほどなー。これ授業で使ってみよ。

百進法。[00] [24]みたいに2桁で1桁というように扱う。[99] + 1 = [01][00]。見た目は十進法っぽい。なんで先に百進法が出てきた?いうと二進法と十六進法の関係がまさにこれだから。

2C9(16)→[0010](2) [1100](2) [1001](2)→1011001001(2)

110100100(2)→[0001] [1010] [0100] → 1A4(16)

というわけ。

小数とは。10進法なら1桁動けば10倍だけど、2進法なら2倍。小数点以下3桁なら8で割ればいい。2進法を2倍していけば10進法に直せる。が、2倍していっても一生終わらない場合があって、これは循環小数になる。二進法の循環小数も有理数になる。これは証明も可能。ちょっと速いのでここはテキストでしっかり復習したい。

椿の目付字。江戸時代に2進法があったという話。これいったいどういう仕組みなの。。?すげー不思議。

指数対数の話。対数の例としてデシベルの話を、放送大学の音声担当さんに取材してる。

デシベルは絶対ではなく相対的な話。音声業界では、最高に出せる音を0dBFSと呼んでる。放送大の音声は、-20dBFS(0dBFSの10分の1)を基準にしている。騒音レベルは、可聴範囲の最小限を0dBとしてそこから上げていく。100dBが地下鉄、120dBがジェット機くらい。なぜデシベルか。対数にすると刻みがちょうどいい感じになるから。100倍とか1000倍とか言ってもよくわからんし。

デシベルは20上がると10倍、つまり10の0.05x乗倍だけど、マグニチュードは1上がると31のx乗倍。1上がって31倍。2上がれば31の二乗で1000倍。でかいですね。

第3回

今日から高岡先生。計算とは何か、という話。

四則演算の仕組みの話。13*18の計算を筆算するときは、13*8と13*10を足す。

68*62を暗算するときはどうする?十の位が等しい、一の位を足すと10になる場合は、まず60*70 = 4200を計算する。さらに、8*2=16を計算する。足して4216が答え。なんで?

→(x+a)(x+10-a) = x^2 + 10x + a(10-a) = x(x+10) + a(10-a) で、x=60, a=8とおいたものと等しいから。xの1乗の項の係数がちょうど10になるところがポイントだと思う。

47*67はどうするか。十の位が足して10、一の位が同じ。

→(10a+b){10(10-a) + b} = 100a(10-a) + 100b + b^2 = 100{a(10-a) + b} + b^2 で、a=4, b=7とすればいい。(4*6+7)*100 + 49 = 3149となる。今度は、前半が100でくくれるところがポイントかな。

次に一般的な問題。13*18。ちょっと複雑なので文字で表すのは無理だけど、長方形を切り取って貼り付けて・・・を繰り返すと、(10+8+3)*10 + 3*8 = 234 と計算できる(らしい)。

32*26。32 = 20 + 12、26 = 20 + 6と考える。すると32 * 26 = (20+12+6) * 20 + 12 * 6 = 760 + 72 = 832となる。工夫の問題。

次は割り算。621 / 45はいきなり計算したくないが、ここで公約数3を考える。207*3 / 15*3 = (207/15) * 3 = (13あまり12) * 3 → 13あまり36(=12*3) と考えればいい。

合同式。5≡8≡11(mod 3)とか。5≡8→5倍してもいい。25≡40となる。

(17*19*23) / 13の余りは、17, 19, 23を13で割って、余りを掛け算すればよい。4*6*10≡4*6*(-3) = -72 ≡ -72 + 13*6 = 6となる。13*6を足すとこが、勘が必要になりそうな気がする。

で、ここまでの話はどうコンピュータに関係してるのか。東大の喜連川(きつれがわ)教授の研究室を訪ねた。ビッグデータがメインの研究で、ナンバーワン(=競争が激しい)よりオンリーワン(=誰もやったことのない)の研究をすることをモットーとしてるらしい。具体的にはでかすぎるデータ。サイバー空間内のソシオシステムというのが対象らしい。サイバー空間が現実の射影と考え、現実がわかるかも?という信念に基づく。日本語のページを全部集めたりしているらしい。

日本の一級河川のデータをリアルタイムで集めたものを研究したりもしている。25ペタバイト(!!)のデータがある。豪雨のときのデータなども集めている。あと、データベースの非同期による命令(!?)の研究もしているらしい。順序実行原理というものを開発して、プロセッサの数を増やさないでも100倍~1000倍の実行速度になったらしい。本当に珍しい研究が多い。発想で勝負できる。

非順序型データベースエンジンの解説。従来型データベースは処理順序がプログラムで決定されている。これを非決定的にする。ストレージが返せる順番で順番にデータを返していく。すると単位時間あたりの処理量がとても多くできる。実際のデモも見せてもらった。HDD24台分の10億件のデータを抽出する。従来型だとハードディスクが暇な時間が多い。20分かかる。非順序型にすると、ハードディスクのランプがよく点滅する。10秒で終わった。すげーー-。

仮想機械の話。チューリングマシン。現在のコンピュータと全く同じらしい。マシン、ヘッド、テープから成る。ある状態→テープから記号を読み取る→書き込む→ヘッドを動かす→状態が変わる、ということを繰り返す。これがコンピュータの基礎になる。トレースしないとよくわからん。要復習

第4回

誤り訂正、暗号化法など。

まずはパリティビットの考え方。最終列、最終行に偶数or奇数を決めておいてチェック用のビットを置く。するとエラーが発生しているかどうかわかるし、1ビットの誤りなら訂正できる。そういえばPCが「パリティエラー」ってエラー出してビープ音が鳴って起動できなくなったことがあったなあ。あれはメモリかHDDのデータが壊れてたんだな。

チェックサムも同じ仕組み。これはISBNコードでの例。

①チェックサム以外の奇数桁の和をとる。

②偶数桁は3倍して足す。

③①②の和の下一桁をとる。

④10-③とチェックサムが等しいかチェックする

ISBNコード以外のチェックサムは多分違う仕組みだろう。放送大のIDの最終桁チェックサムなんじゃない?商品のバーコードもそうだよね。

暗号。まずはシーザーの暗号から。アルファベットをずらす。ずらす文字数が暗号鍵といえる。共通鍵暗号方式である。鍵を第三者に知らせずに送信するのが難しいのが問題。

これを解決したのが公開鍵暗号方式。暗号化を公開鍵で行い、秘密鍵で復号する。秘密鍵を送らなくていいので安全だが計算量が多い。また、電子署名はこの逆で、秘密鍵で暗号化し、公開鍵で復号する。実は今までここら辺の関係を散々聞いてたのに全然わかってなかったのだけど、意味わかったので助かりました。

クレカの暗号化の仕組み(SSL)。SSLはハイブリット方式といい、共通鍵と公開鍵を両方使う。通信データの暗号化には共通鍵を用い、共通鍵を暗号化するのに公開鍵を使う。

具体的には、

①クライアントからSSLを要求

②サーバ→クライアントに公開鍵を送信

③クライアントは共通鍵を生成し、サーバの公開鍵で暗号化

④サーバはクライアントにもらった暗号化された共通鍵を、サーバーの秘密鍵で復号(鍵はデータ量少ないから復号が速い)

⑤これで共通鍵が両者に渡ったので、安心してクライアント⇔サーバ間で共通鍵で暗号化したデータを受け渡しする

ってわけか!よくわかった!

電子署名。本人証明と非改竄証明の両方の機能がある。本人証明には、なりすまし防止のため、PKIという仕組みがある。鍵の有効性を第三者に認証してもらうことで信頼性を高めている。非改竄証明については、平文→一定の手法で要約→秘密鍵で暗号化→受け手側が公開鍵で不幸語か→受け手が行った平文の要約と一致しているか確かめる、というやり方。ここでは要約って言ってるけど、たぶんハッシュ関数のことだろうな。説明しづらいから要約って言ってるだけで。

RSA暗号について。素因数分解を使うということまでは知ってたけどちゃんと解説してもらえるらしい。短時間でできるのか?

まず素数の説明。2と自分以外では割れない数。次に余りの話。合同とはnで割った余りが等しいこと。a≡b(mod n)のように書く。

RSA本体の説明。まず暗号化プロセスでは、平文をe回掛け算する。そしてnで割る。これを暗号化鍵(e, n)と呼ぶ。

復号プロセスでは、暗号文をd回掛け算して、nで割る。すると平文に戻る(!?)。これを秘密鍵dと呼ぶ。

このようなことが可能である正の整数e,d,nの組み合わせを作るのが難しいところが、RSA暗号のキモということになる。

前提として、平文をe乗して、さらにd乗すると、元の平文に戻るという仮定があるらしい。なんでed乗すると元に戻るのかは謎で、よくわからんかった。(→余りの話をしているから大丈夫と後でわかった)

さらに、割り算に使うnは、素数pとq(どっちも大きめ)の積ということにしておくと、edは(p-1)(q-1)で割った余りが1になるように選べばいいらしい(なんでじゃ!?→直観的には、余りを1にすれば、何度も掛け算していった後に最後の1乗が効いて、元の文が復元するからだと思う。要数学的証明→やりました https://t.co/v7J1KjcyG7 こっちも参照→RSA暗号の正しさを徹底的に証明する – Qiita)。

実例。

平文M=4とする。鍵に使う素数p=3, q=7とすればn=21、(p-1)(q-1)=2*6=12と互いに素になるように(なぜ!?→互いに素にしないと、edを12で割った余りが1にならないから)eを選ぶ。とりあえずe=5にする。

暗号化。M=4の5乗で、4*4*4*4*4 = 16*16*4 ≡ (-5) * (-5) * 4 = 100 ≡ 16(mod 21)。暗号文C=16になった。

次は、β=edの候補。 (p-1)(q-1) = 12で割った余りが1になる数は、13,25,37,…だけど、e=5にしたから、d=5(β=25)か17(β=85)にしないといけない。とりあえずd=5にする。

では復号化する。d=5にしたから、また5回かけてn=21で割る。16*16*16*16*16 = 32*32*32*32 ≡ 11*11*11*11 = 121*121 ≡ 16*16 ≡ (-5)*(-5) = 25 ≡ 4 (!!!) と、元に戻った。

公開鍵のnは公開しておいてもよいが、pとqが分からなければ破れない。つまり、素因数分解しづらいnを選んでおけばいいというわけ。nが100桁でも現代コンピュータでは結構難しいらしい。実際は300~1000桁のものが使用されているらしい。1桁上がるだけでめっちゃ破りにくいらしい。

やっとRSA暗号の仕組みがわかった!しかもほんの30分くらいで!先生ありがとう!

村上先生にチューリングのエニグマについて聞く。2014年イミテーションゲームという映画の暗号解読の話。ナチスドイツの暗号はエニグマというしくみで計算されていた。チューリングが作った自販機くらいの大きさの機械が出てきた。なんでこれで暗号復号ができるんだ!?こいつをつかってイギリスがナチスドイツの暗号を破って勝利したらしい。もっと暗号の度合いが高いローレンツ暗号器もイギリスがコロッサスという解読器で破ったらしい。でっかいテープを読み取る装置が出てきた。0.6秒に1クロックという速さだったらしい。当時、コンピュータは人間コンピュータを意味し、女性の仕事だったらしい。そういえばこの科目の教授、2人も女性がいる。中谷先生もいるし情報系は女性に相性がいいように見える。でも日本だと情報科学は男性ばっかに見える。何かおかしいのではないか。私も以前は情報科学は男性向きだと思っていたが、どうもそうではないらしい。

第5回

画像と音声のデジタル化の話。今日も高岡先生。

まず音の話。振幅と周波数、周期の説明から。雨宮さんよくわかってる人っぽいけど、調べたら京大院卒、日本科学未来館のコミュニケーターさんだったよ。

雨宮 崇 TAKASHI AMEMIYA | ブルーバックス (ismedia.jp)

さて音の波が0-1に変わるまではどうするのか。標本化→量子化→符号化をする。標本化とはデータを一定間隔で区切ること。よく言われるサンプリング周波数(44.1kHzとか)ってのは1秒間の標本化の数のこと。可聴周波数の2倍のサンプリング周波数が必要なのはなぜか。ナイキスト、クロードシャノン、等が「標本化定理」として証明したらしいから難しい話っぽい。要調査。それにしても予想を超えていつも一気に難しい話になるなあ。楽しいけど。

ハイレゾにはどんな意味があるか。聞こえない高周波、100kHzとかは脳によいと言われている。ハイパーソニックエフェクトやん。ここでも紹介されてる。

量子化は標本化した波形を離散的な整数の値に変換すること。ビット数が多ければ元の波形に近づく。音楽CDは16ビット=65536段階。ハイレゾは24ビット=1670万段階。ビットが変わると臨場感も変わるんだって。

最後に符号化。標本化と量子化で得られた数値を2進数で表すこと。2進数はビットの窪みで表せる。CDの量子化の掛け算を実際に行う。10分は16ビット=2バイト*44100Hz*10分(600秒) = 50MB。70分で350MB。ステレオなら2倍で700MBになる)。たしかにこんなくらいだね。

次は画像。標本化は画像データを区切ることになる。解像度とは画像をどのくらい細かく区切るかということになる。量子化は1つのピクセルをどのように表現するかという問題になり、量子化ビット数は色の数に対応する。モノクロなら2色、RGBならまあ24ビット640*480(古いな!)の生データは24*640*480=1MBになる。いわゆるフルカラーは24ビット1677万色だが、48ビットにすると281兆色(!)になるらしい。

次は社会の情報の可視化。喜連川研究室の取材が出てきた。ソーシャルメディアの可視化の話。ってtwitterじゃん。震災の際の情報の広がりを見た。阪神大震災に関連付けたある1つの避難情報(ガスの元栓を閉めろ!みたいな)をRTしていく様子が、まるで蜘蛛の巣っていうか花火みたいに広がっていく様子が可視化されている。もう少し縮小すると、微生物の繁殖みたいにコロニーがいくつかできている。コロニーはだいたい有名な人がリツイートすることでできるみたい。こういうノードのつながりみたいな可視化ツールってどうやって作るんだろうな。やったら楽しいじゃん。twitterはAPIも公開されてるし、作るの楽なのかもなー。リアルタイムで見ることができるとめっちゃ面白い。社会全体の動きを知ることができる。教授やマーケティングで実際にもう利用されてるらしい。

プリンタの話。モニタとプリンタと色の表現方法が違う。モニタは加法混色という。混ぜると明るくなる。RGB方式。印刷は減法混色。混ぜると黒くなる。CMYK方式。変換については印刷教材について書いてあるらしい。楽しみ。

ビットマップとベクタの差異について。ベクタは図形の点、線、面を数値で表したものなので拡大縮小には強いが、複雑な色情報を持つのが難しい。ビットマップ→ベクタの変換はまず無理らしい。

アナ→デジ変換について。実際に変換する(!?)。紙を縦に四等分して切ってる。2人ともA~Dと名前を付けて、Eiko, 雨宮と書いた(洗練されたYouTube動画なら、ここは5倍速再生してるところだ!)。先生がAに点を打って、雨宮さんが目視でBに同じ場所に点を打った。雨宮さんがAに点を打ち、先生がBに目視で点を打った。

次はAの紙を半分に折って、点が左にあれば0、右にあれば1と書く。以後繰り返して01を書いていき、線の上に点が乗ったら1と書いて終わり。実はこれで、紙の左側からどのくらいに点を打ったかが分かる。先生のAでこれを行うと、011となった。これは0.011 = 3/8ということになる。これは、点の位置のデジタル化に相当する。雨宮さんのAは0.111→7/8になった。

次にCにAで計算した値を書いて相手に渡す(デジタル信号の伝送)。さらにCを書かれた01に従って折っていき、点を書く(デジアナ変換)。次にAを交換するとA、B、Cを比較できる。AとCはデジタル変換なのでほぼあってるが、Bは目視(アナログ→アナログ伝送)なのでだいたいずれてる。という面白い実験でした。紙を使ってもデジタル伝送ってできるんだね!!

第6回

題名が「おはなしコンピュータ」!?今回から西田先生が4回担当する。関西弁だ。コンピュータがどうやって計算していくのかという話らしい。

まず温度計のようなPCを用意した(超ミニwinPC?)。温度センサーというinputをコンピュータが処理して、液晶outputに最高気温を出力する装置。

変数の説明から。変数委は名前と値が必要。アドレスと名前が紐づけられている。次は情報処理技術者試験でおなじみの疑似コードでif文、代入の説明。まずmaxにセンサーの気温を代入(ちゃんと初期化してた。)次はtempにセンサーからの気温を代入し、temp > maxならmaxを更新する。これを1分ごとに行えばOK。一日分なら1440回ループすればよし。

さっきのミニPCを図解してる。入力装置、出力装置に加えて、記憶装置、制御装置、演算装置で構成される。CPUにちゃんとヒートシンクついてる。記憶装置は主記憶装置(メモリ)と補助記憶装置(HDD、SSD、USBメモリ等)に分類できる。そういえばCD-ROMやDVD-ROMってもう下火だよね。みんなダウンロードになっちゃった。出現したときは革命だったのにもう割に合わなくなってしまった。

CPUとメモリの関係。CPUはレジスタ、ALU(算術論理演算装置)、特殊なレジスタ(プログラムカウンタ、命令カウンタ、メモリアドレスレジスタ)で構成される。レジスタはCPU内のメモリみたいなもん。プログラムカウンタコンピュータが次に実行する命令のメモリのアドレスを示すレジスタのこと。命令レジスタ、メモリアドレスレジスタは命令の保存、データの位置を保存するレジスタ。

アセンブリの疑似言語を使ってCPUの動きを見る。アドレスにloopやらloopendのようなラベルを付けて、番地と紐づけておいて命令で使う。命令は例えば「count(0016番地)の値が0以下ならばloopend(0013番地)に行く」のように書かれる。昔のBASICみたいだね。「1分待機」みたいな命令もあるけどこれ実際はアセンブリでどうやって実装されてるんだろうな。

実際のプログラム言語の説明。プログラムはあいまいさがなく実行できるような形式で記述する必要がある。雨宮さんも触ったことあるって(すごいレベルだと思う)。聞き手として優秀だなあ。

アセンブリ言語は低水準言語、CとかPythonとかは高水準言語。今回はPythonを使うらしい。Pythonはインタプリタ言語。実行するまでエラーがあるかどうかわからないからちょっと恐怖だよね。

Pythonはオランダ人グイド・ヴァンロッサムって人が作ったらしい。オランダ発なんだ。簡単(大事)、インタプリタ、動的型付け、ライブラリが多い(大事)ってことが特徴。

macのPython3.7.0 Shellを使ってる。5 + 4 – 2と書くと7と返ってきた。print(5*4/2)と書くと10.0となった。/2があるから小数になるらしい。print(10/3)は3.33333333333335になる。print(int(10/3))は3、print(10%3)は1になる(余り)。

m = "おはよう"
a= "こんにちは"
import datetime
datetime.datetime.now().hour →12 (12時なのか)
if datetime.datetime.now() hour < 12:
    print m
else
    print a
→"こんにちは"

こんなの作ってた。

第7回

本格的にプログラムを作るらしい。制御構造と計算の手順の話。

制御構造は順次構造、分岐構造と反復構造がある。順次構造はA→B→Cみたいなやつ。当たり前だけどこれがないと確かに進まないね。あとはifとfor。構造化定理:すべての計算手順は全部3つの構造で記述できる(そうなんだ!?)。たしかにこれ以外の構造ないかも。

計算の順序について。3 + 5 * 8は、3+5からか、5*8からか。私たちは5*8からやる。四則演算には優先順位があるから。優先順位が同じなら左から計算する。プログラム言語内でもいろいろ優先順位がある。

分岐構造。pythonなら

t = int(input("最高気温を入力してください:"))
if t >= 25:
    print("夏日です")
else
    print("暑くありません")

みたいな書き方をする。先生pythonのShellつかうのはやい。

反復。whileが例。

a=0
i=1
while i<=10:
    print(str(i) + "を加算")
    a=a+i
    i=i+1
print("計算結果:" + str(a))

のように書く。forなら

a=0
for i in range(1, 11):
    print(str(i) + "を加算")
    a = a + i
print("計算結果:" + str(a))

のように書く。pythonの仕様上、range(1, 11)は1~10の配列を作るといった意味になる。zero based indexなのだろう。range(2, 11, 2) にすると、2,4,6,8,10の配列ができる。3つめの数字がstepを表すということだろう。応用すれば、nまでの和(rangeを1,n-1にする)とか階乗(rangeをn,0,-1にする)を求めることができる。

三角形の面積を求めるプログラム。底辺*高さ/2にすればよくない?input使って入力させてる(コードは略)。float使えば実数になるのね。pythonのfloat型って何バイト型なんだろ?

ヘロンの公式つかう場合。import mathとmath.sqrt関数を使う必要がある。で、三角不等式を満たさないといけないので、if a<b+c and b<c+a and c<a+b で括ってあげてる。まじめだなあ。でも三角不等式満たさないと面積が虚数になったりするから仕方ないか。

FizzBuzzゲーム。3の倍数ならFizzと言う。5の倍数ならBuzzという。15の倍数ならFizzBuzzという。これがプログラム志願者の適性を見分ける問題として知られるらしい。

あ、アレクサ出てきた!アレクサでもできるのか!!!

アレクサと雨宮さんが対決している!!負けた

コード的にはこんな感じ

for i in range(1,101):
    if i%3 == 0:
        print("Fizz")
    elif i%5 == 0:
        print("Buzz")
    elif i%15 == 0:
        print("FizzBuzz")
    else:
        print(i)

これは間違い。15の倍数の時にFizzになってしまう。正しくは15の倍数かどうかを先に判定する。

for i in range(1,101):
    if i%15 == 0:
        print("FizzBuzz")
    elif i%3 == 0:
        print("Fizz")
    elif i%5 == 0:
        print("Buzz")
    else:
        print(i)

私なら上のように書いちゃうけど、面白い別解もある

for i in range(1,101):
    if i%3 == 0:
        print("Fizz", end="") #改行しない
    if i%5 == 0:
        print("Buzz", end="") #改行しない
    if i%3 != 0 and i%5 != 0:
        print("FizzBuzz")
    else:
        print(””) #いらないんじゃね?と思ったけどここは改行のため入れてる

あー言われてみればなるほどだわ。さらに、割り算を使わない別解

n3 = 3
n5 = 5
for i in range(1,101):
    fizz = ""
    buzz = ""
    if i == n3:
        fizz = "Fizz"
        n3 = n3 + 3 #次の3の倍数を指す
    if i == n5:
        buzz = "Buzz"
        n5 = n5 + 5 #次の5の倍数を指す
    if fizz == buzz:
        print(i) #3の倍数でも5の倍数でもないから数字を出力
    else:
        print(fizz + buzz)

これは思いつかないわ!!

第8回

アルゴリズムについて。

いきなりプログラムを書くと失敗するので、まずアルゴリズムを書くのがよいという話。そーだよね。

アルゴリズムの定義。問題の解き方の手順を明確に示したもの。フローチャートみたいなやつでもいいし、表現方法は何でもいいが、あいまいさがないようにすること。

アルゴリズムが充たすべき性質。健全性:正しい答えが出ること。停止性:有限回で終わること。両方を満たすと完全性があるという。絶対これが充たされるとは限らないので、近似的にこれを満たすような近似アルゴリズムという考え方もある。特に統計的な話だと健全性を満たすのは難しいよね。

ユークリッドのアルゴリズム(最古のアルゴリズム)。

aとbが等しくない間、以下を繰り返す
    aがbより大きければ、
        a = a - b
    そうでなければ
        b = b - a
最大公約数としてaの値を表示

36と24の最大公約数なら、a=36, b=24→a=12, b=24→a=12, b=12で12

11と30の最大公約数なら、a=11, b=30→a=11, b=19→a=11, b=8→a=3, b=8→…→a=1, b=1で互いに素

なるほどねー。で、これはなぜ正しいのか!!??

引き算を割り算で置き換えられる。引き算しているのを割り算の余りにすれば次のようになる。

a≧bを仮定する
bが0でない間、以下を繰り返す
    aをbで割った余りを新しいbとする
    元のbを新しいaとする
最大公約数としてaの値を表示する

これでユークリッドの互除法になった。計算は同じ。引き算って割り算の余りなんだな!

アルゴリズムの手間の話。ユークリッドの互除法は数回で済む。n^2とかの話かな?と思ったけど途中で終わった

おかあさんといっしょのアニメが出てきた。正方形の迷路の数え方。1*1なら2通り、2*2で12通り。3*3で182通り。4*4で8512通り(!)。ではどういうアルゴリズムを使えばいいか。二分木を作るとよい。道にA, B, C…と名前を付けて、二分木を作っていく。ところが真面目に二分木を作ると2*2でも8190本の二分木ができてしまうので、いろんな工夫によって37本まで減らすことができる(具体的にどうやるんだ!?)4*4でも2兆。16*16で不可思議とか使っても全然表せない天文学的どころでもない数字になる。これがAIのとこでよく言ってた計算爆発ってやつか。グラフ処理はpythonだとGraphillionというツールでできるらしい。

大根のいちょう切りのアルゴリズム。40片のいちょう型が欲しい。使える操作は輪切り+十字切りのみ。

①輪切り*9+十字*20 →29カット

②十字*2→半円柱の輪切り*9 *2→20カット(①より早い)

②で円柱のままやれば11回だが無理。なので②が妥当。アルゴリズムは、現実的実施可能性も大事になる。

次は金種計算の話。お釣りをどういう紙幣・硬貨で払うか。なるべく硬貨が少なくなるようにしたい。

高額の硬貨から順に支払えるだけの枚数を支払う→枚数最小、過不足もない。これを貪欲法という。問題を分割し、それぞれ最も好ましい解を選ぶ方法。今回は大丈夫だけど、毎回妥当とは限らない。

500で割って余りをとる、100で割って余りをとる、50で割って余りをとる→同じ処理じゃない?そこでpythonではリストを使って、処理をひとまとめにする。[500,100,50,10,5,1]で割って余りをとっていけばいい。

Kinshu = [500,100,50,10,5,1]
kingaku = int(input("金額を入力してください:"))
for k in Kinshu:
    n = int(kingaku/k)
    if n > 0:
        print(str(k) + "円玉×" + str(n))
        kingaku = kingaku - k*n

7行でできた!

逆に財布から小銭を支払う場合は、自分の持っている硬貨の枚数を最大値として保持していないといけない。枚数を配列に保持し、入れ子型の配列にすればいい。KTabke = [[500,1], [100, 2], [50, 3], [10,12], [5,4], [1,10]]みたいに財布の中身を表現すればよし。コードはちょっと長いので略します。要は枚数の最大値まで払うっていうif文を入れるだけでいいんだけれども。

こういう形でアルゴリズムを紹介するってことは、プログラムってのは数学的にはアルゴリズムの写像って考えていいのかな?

第9回

アルゴリズムと能率について。問題を解くときにかかる時間の話をしてくれるらしい。計算量とその評価がメイン。

計算は使う資源が少ないほど効率が良い。資源には時間、空間(メモリ)がある。最大公約数を求めるプログラムをforループで総当たり(2~最小値まで公約数かどうか判定)で実現すると、例えば10179と24360の最大公約数を求めると20356回も割り算をすることになる。ユークリッドの互除法なら6回。ここには大きな差がある。つまりアルゴリズムには良し悪しがある。

どうやって評価するか。時間だけで評価してもいいが環境に左右されてしまう。なので主要な処理が何回行われるかを調べればいい。さっきの話なら前者は2(n-1)回(常に)、後者なら5log10n以下(ラメの定理?より)になる。logが出てくると一気に強くなるね。しかも以下なのでもっと少ないかも。計算量は2のn乗が一番大変で、logが出てくるとすごく小さくなる。

漸近的評価。nが非常に大きい時だけを考えればいいから、主要な項だけ考えればいいし、2もいらない。2(n-1)はnと考えてしまえばいい。2nの2だってコンピュータが発展すればすぐ覆いつくされるので。。と先生は言ったが確かにそのとおりだ。で、これをオーダといってO(n)などと表す。オーダの定義は、カッコの中の値で割ってnを無限大に飛ばせば定数になる、ということ。

さてnの10000000万乗と2のn乗は、2のn乗の方が速い。ここでまた前回のおかあさんといっしょのVTRに飛んだ。高校数学でよくある迷路の問題って、最短経路だから場合の数はたいしたことないけど、最短ではない経路も含めると本当にやばい数が出てくる。数えるのも大変。例えば5*5の迷路は126万通り。6*6は5.7億通り。7*7は7893億通り。8*8。3266兆通り。2のn乗のオーダで増えるとこんなに大変なことになる。

京大の湊先生。アルゴリズムは目に見えないので、目に見えるようにいろんな展示を作る努力をしていらっしゃる。さっきのおかあさんといっしょのビデオも京大のグループで作ったらしい!

年月日から曜日を計算するアルゴリズムについて。西暦1年1月1日以降の任意の年月日を計算する。

普通は1年で1つ曜日がずれるが、閏年は2つずれる。曜日を数字で表し(0が日曜とか)、1年1月1日の曜日に毎年ずれる日数を加えて7で割ればOKじゃない?これを基準日から計算するアルゴリズムという。

これを実現すると、forループが2個できる。1個目は年ごとのずれの判定、2個目が今日を表す月の日数を足していくループ。1個目のループは年nの繰り返し。2個目は最大11回なので定数。計算量はO(n)となる。

ツェラーの公式で計算する。年+閏年のずれ(切り捨て)+月のずれ(切り捨て)+日数を7で割る。月のずれの所がこの公式のすごいとこで、(13m+8)/5で計算すればいいらしい。7で割ると、前の月までの日数を7で割った値と同じになる。上手に調整した感じの数。こういうのを見つけるのが数学マニアってやつですよね。これはオーダがO(1)で計算できてしまう。はやい。

探索処理。ランダムに並んだ15枚のカードから指定した数を選ぶ。普通は前から総当たりで攻めていくしかない。これを線形探索という。最悪n回で平均はn/2回。オーダはO(n)になる。

順番に並んでいるデータを探索する方法。2分探索法が有名。真ん中のデータを調べ、大小を比較してから次に探索する範囲を半分にする。私も、どのソースコードの変更で不具合が起きたか、履歴を総当たりで調べなければならない時によく使う。オーダーはO(log2n)となる。n=100000でも最悪17回で探せる。はやい。雨宮さんは2分探索知ってるみたいだった。

第10回

いろんなアルゴリズム、特にソートについて。辰己先生に戻ってきた。

探索の計算量について。2分探索の計算量はなぜlognになるのか。これは漸化式で求められる。つまりk回の操作でak個の数が判断できるなら、a1=1, ak+1 = 2ak + 1を解けばいいってわけ。これを解くと(中略)ak = 2k-1なので、n = 2k-1とすると、逆算してk = log2(n+1)となる。なるほど!!

先生、放送大学図書館に来た(行ってみたい!)。本の探し方、並べ方について聞きに来た。The art of computer programmingを調べたい。司書の人異様にタイピングとPC操作速い。番号が出たのですぐ見つかった。もし本がばらばらに並んでいたら、全探索するしかない(詰む)。

ソートとは。ある関係に従ってデータを並べる作業のこと。「ある関係」は任意のものである。整列されているデータ、されていないデータで大きく使い勝手が異なる。コンピュータは大小関係しか判断できない(これがコンピュータの頭悪い所だと思う)ので、大小関係を何度も判定して全体を並べるアルゴリズムが必要になる。

まずバブルソートから。隣り合う2枚を総当たりで全部比較する方法。一度全部比較したら最大値だけ取り除いてやり直し。計算量はO(n2)で、まあまあでかいオーダ。実務でもC++だとコード書くのが面倒なときに使ったことがある。

選択ソート。まず左端の値を決めたいから、最小値を選んで一番左に置く。次に最小から2番目の値を選ぶ。。。と繰り返すが実質バブルソートと同じで、オーダもO(n2)。

挿入ソート。整列済みの配列に挿入していく。まず1枚の場合は何もしなくていい。2枚目は前か後ろにつける。3枚目は適切な位置に挿入する。。。を繰り返す。手間がかかる場合(降順に並んでたら大変)とかからない場合(最初から整列済みならなにもしない)がある。オーダは最小O(n)~最大O(n2)。

マージソート。整列されてないリストを2つに分割してから、整列して、マージ。これどういうメリットがあるんだ?分割は再帰的にできるので、まず全体を全部2つずつに分割。それぞれ大小比較して整列する。次にマージして4つにする。8つにする。以下繰り返し。人間がやると大変だが、計算量はnlognになるのでだいぶ小さい。なぜnlognになるかというと、やはり漸化式(証明はちょっと長いので略)。

最後にクイックソート。リストにおいてある値を軸として分割を繰り返して整列させる(!??)。なんのこっちゃ。

とりあえず1つ軸を選ぶ。1~15のカードで8を軸とする。次に8より小さいシリーズ、大きいシリーズに分ける。小さいシリーズの中でまた軸を決め、大小に振り分ける。振り分けたとこのサイズが1~2だったらそこで大小比較して、軸の左と右に置く。これで軸を含む要素がソートされた。で、しかもソート済みの要素はこれ以上マージする必要もなく結合するだけでいいから、結構はやい。計算量は印刷教材を見よだって。いったいいくつなんだ。

n2とnlognの計算量はどのくらい違うか。n=10で後者は1/3の計算量で済む。n=100だとどのくらいなの?

組み合わせ爆発の話。正方形の迷路の道順を真面目にスパコンで計算すると9*9は6年半、11*11は290億年かかるらしい。雨宮さんによるとこの間の話が面白いらしい。で、動画に戻る。なかなか強烈な動画なので皆さんにも見てほしい。っていうかこの動画、科学技術館のやつだし雨宮さんのチームが作ったんじゃ、、

オチが。。。悲しいです。。。

最後に無限の猿定理の話。サルが適当にキーボードをたたくと偶然シェークスピアの小説が出てくるかもしれない?か?実際計算した人もいるらしい。これも組み合わせ爆発の話で、2-3文字なら簡単に出てくるが、数十文字になると無理になってきて、結局、シェークスピアの小説のごく一部分が出てくるだけでも数百億年以上かかるらしい。公開鍵暗号もいっしょ。適当な数字を並べていけばいつかは当たるが、まず当たらない。

第11回

集合と確率の話。

外延的な記法と内包的な記法について。列挙するのが外延的 {1,3,5}とか、定義を書くのが内包的 {x|x≧1}とか。

集合が同じとは、ある要素がすべて別の集合の要素である、逆も成り立つ、ということをいう。大学受験でたまに使う論証だ。なお、この定義だと同じ要素が複数入ってることは考慮されない。

命題の真偽で定義する積集合と和集合の話。ベン図で書ける奴やつ。補集合と全体集合も出てきた。補集合を考えるためには、必ず全体集合が何なのかを考えなければいけない。

中国人剰余定理。「aとbの最大公約数が1のとき、ax+by=1を満たす整数x,yが必ず存在する」

例えば11x – 7y = 1→x=2, y=3。21x-7y=1→解なし。じゃあこれを一般的にどうやって説明するか。

a=11, b=7とすると、11k-1を7で割った余りは、k=0,1,2,3,4,5,6に対して6,3,0,4,1,5,2となる(重ならない)。これはどのような互いに素なaとbについても成り立つ(余りが等しいと仮定すると、引き算した時bで割り切れてしまうから、矛盾を導ける)。つまり全体として集合が一致している。で、必ず余りが0になるところがあるから解があるという論理の流れになるらしい。

フェルマーの小定理。「pを素数とする。aがpで割り切れないとき、ap-1はpで割り切れる」

実例。a=2, p=13として、2の12乗は4096で、(4096-1) / 13 = 315余り0となる。適当な数字が素数かどうか判定できるテストの第1段階として使える。

証明の概略。途中までは中国人剰余定理と同じで、pで割った余りの集合が1~pになるねって話。そのあとが難しい(略、印刷教材見よ)。二人ともほ~そうなんだ~って感じでスイスイ進んでいくけど私全然わかんないです。大事なのは集合が使われているって話です。

この定理、どこで役に立つか。公開鍵暗号でこの定理がないと先に進めない。ので暗号で役に立つ(以前私も証明に使いました)。

確率の定義。「その自称がまだ起こっていない状態で、起こりえる可能性があるかを数値的に表現したもの」。確かに起こってない!!打率みたいにすでに起きたことは「記述統計」という。確率とは違う。

事象→起こっているか起こっていないかをはっきりと判定できること(確かにはっきり判定できないとダメだ!)

確率変数→とりうる値の集合(確かに!?)

5回に1回傘を忘れるAさんがA, B, Cの教室で授業を受け、傘を忘れた。それぞれの教室に忘れた確率を求めよ。

考え方の例:125本傘を持ってきたと仮定→Aに25本忘れる、Bに20本忘れる、Cに16本忘れる。忘れた本数は61本だから25/61, 20/61, 16/61。これは思いつかないっす。。いきなり難しい例です。

さらに難しい例。モンティ・ホール問題。宝物を当てるゲーム。3つの箱から宝物を選ぶ確率で、どういう戦略をとるのが賢いか考える話。ちょっと言葉で説明するのが難しいのでこれも印刷教材見よう。

モンテカルロ法。あーこれ昨日アルゴリズムとプログラミングの講義でやったやつや。この授業では視覚的にやってる。米を円を書いた紙の上に均等にばらけさせてから、円周の中と外の米粒の数を数えることで円周率を計算するってわけ。143個と491個になった。合計634個で、理論的には全体と円の面積の比が1 : π/4だから、π = 4 * 491 / 634となるはず。3.0977なのでまあまあいい値になった!!

単純な計算方法が見つかってない場合はいまでもモンテカルロ法を使ってる。囲碁のAIとか(そうなの!!??)。ランダムに試合をすると勝つ・負けるが確定するから、勝つように学習を重ねていけばいい。1秒で1局できれば1日で何十万局もできるじゃんってわけ。なんかわくわくしてきたぞ。音楽とか絵とかはどうすればいいんだ?→人間が評価していくしかないって話になった。でも、一定の評価方法が確立していれば音楽でもできるのでは。。?これは研究に使えそうな気がするぞ。論文いっぱいできてるだろうし調べてみよう!

第12回

高岡先生だ!データと計算量について。特に量についての話になるらしい。

情報とは何か。シャノンの情報理論だ。はい-いいえの質問に答えると1ビット使う。8個の選択をするためには3ビット。2のn乗をの選択肢の中から1つの情報を伝えるにはnビット必要。ただし、全部等確率という仮定が必要。じゃあ等確率でない場合も考えないといけない。

ある事象が起こる確率をP(X)、情報量をH(X)とすれば、H(X) = log21/p(X) = -log2P(X)と定義できる。例えば確率1/8ならH(X) = 3ビットになる。つまり確率が低ければ情報量が大きくなる。確率が低ければ受け取った価値が大きいということになる。例えば宝くじが当たることを誰かが教えてくれれば、その情報は価値が高い。

情報源の話。なんか歯ブラシいっぱい出てきた。4つ+4つの歯ブラシと、8本異なる歯ブラシ。平均情報量は、個々の情報量*確率を足したものと定義できる。前者は確率1/2で4本ずつなので、1ビット*1/2 が2種類、足して1ビット。後者は3ビット*1/8 * 8 = 3ビット。まあ確率が全部同じだからそうか。平均情報量(≒情報エントロピー?)は、ネットワークの通信速度などで使われるらしい。エントロピーが高い→知らないことが多い、エントロピーが低い→知っていることが多い、ということ。情報の圧縮(エントロピーが低いと圧縮しやすいのかな)とかAIとかでも使うらしい。

東大の豊田先生の研究室へ。ドラレコのデータをビックデータにして研究してる。事故が起きた場所と運転状況を掛け合わせる(かける!?)といろんなことが見えてくるらしい。事故が起きる場所はパターンがあり、まだ起こっていないとしても、事故が起きやすい場所もわかってくる。すると事故の起きにくい場所をナビするということができる。

次の話。道の凸凹をスキャンするシステムを作った。業務用車両にセンサーを付けてもらって情報をとってきたらしい。地図で可視化すると道の状態が悪いところがよくわかるので、自治体がどこを優先に直していいかがわかる。経時的情報もあるから、道の補修履歴もわかる。ズームするだけで詳細な情報が出てくるからめっちゃわかりやすい。すげ。

次も東大の生駒先生の気象データについての話。いろんな気象データを統合するためのシステムを開発してるらしい。理系らしい、めっちゃ見づらいスライドや。しかも速い。とりあえず気象データが発展して詳細になったことがわかった。DIASというシステムで基本的なデータベースやネットワークを提供し、使いたい人がアプリを作ってDIASにアクセスしてデータを持ってくる基盤を作った、ということもわかった。基盤作るのって大変だよね。だれでも使えるような仕様策定がめっちゃ大変そうだし障害も頻繁に起きそう。

雨宮さんが突然01100011みたいな暗号を出した。それから暗号解読表も出してきた。ところが解放が一意に安定しないという欠点が見つかった。これを一意復号ではないというそうだ。また、順次に復号できていって、最初からやり直しにならないことが保障されていることを瞬時復号というらしい。しかし高岡先生って感情表現が極端に苦手な感じがする。本当は気持ちが大きく動いていると思うのだけれども。瞬時復号を満たすための必要十分条件ってなんだろね。二分木が完璧に作れることなんだろうけど、数学的にはどうなんだろ?

平均符号長とエントロピーについて。平均符号長はエントロピー以下になることはない(情報源符号化定理)。例えばA B C D を 11 10 01 00 で表すとすると符号長は2ビット、確率1/4で等確率。平均符号長は2ビット。エントロピーは2ビット * 1/4 * = 2ビット。直感的には、確率がばらけると平均符号長はかわらないがエントロピーが増える気がする。講義でも確率がばらける場合を計算してるけど平均符号長=エントロピーになった。エントロピーに平均符号長を近づけていくと効率が良くなる→エントロピーまでは圧縮できる!ってことらしい。

17歳男子の身長分布。きれいな正規分布になってる。最頻値、平均値、中央値が大体同じ。標準偏差をsとすると、-s~sの間にだいたい68%が来る。2sなら95%。17歳男子のデータを見る-s~sの間に73%、2sの間に96%。やはりほぼ正規分布である。体重は正規分布に従ってない。左に山が偏っていて、最頻値60、中央値61、平均値62.6kg。3つの値がずれていない=ほぼ正規分布であるということになるらしい。

第13回

今日から最後まで立教の村上先生。一階述語論理について。日常言語を論理言語に翻訳する所がメインらしい。

文と命題の違いについて。命題とは真偽が一義に決まる文のこと。文はそうでもない。「この問題は難しい」、とか、「それをとってください」とか。

で、科学的命題とは、真偽が実験・観察等の統計的な確かさにより決まる文のことを言う(えっ、100%じゃないのを命題って言っていいんだ!?)。例えばカラスは黒いということは、白いカラスは無視する。統計的に高い確率で成立すればいいや、ということ。これに対して演繹的命題は、真偽が100%はっきりしている命題のこと。例えば、一次方程式ax+b=0には解がある、という命題について。

「この一次方程式ax+b=0には解がある」→aとbが不明だから命題ではない

「一次方程式ax+b=0(a=0、b≠0)には解がある」→偽→命題である

「一次方程式ax+b=0には解がある」→偽→命題である ※最初に「すべてに」を補わないといけない。暗黙の量化という。あっこれ慶應の論理学でやったやつや。

全称量化→∀のこと。「すべての」と表現する。

存在量化→∃のこと。「ある」と表現する。

この授業では記号を使ってないのでわかりづらい。

量化の例。Everybody loves somebody. は①「誰もに好きな人がいる(全員が誰でもいい誰かのことが好き)」②「誰もが好きな人がいる(特定の1人のことを全員が好き、本人含む)」の2通りに取れる。①は∀∃、②は∃∀と表現すればよい。

じゃあこれを否定するには?「誰もに好きな人がいるわけではない(ある人が存在して誰も好きでない人がいる)」¬∀∃「誰もが好きな人がいるというわけではない(すべての人に好かれている人は存在しない)」¬∃∀

「すべてAだ」「Aでないものがない」は同じ意味。

「あるものはAではない」と「Aでないものがある」は同じ意味。

雨宮さん、ついていけてるけど正直ぜんぜんいみわからん。記号で表現してください。たのんます。

空虚な真について。そもそも対象がない場合は反例を作れないから絶対に真になる。否定が不可能=真である命題を空虚な真という。これってあれか?反出生じゃん。「まだ存在していないわが子がかわいそう」みたいなやつ。これぞ空虚な真。真だけど意味がない。つまり論理的真であることは真実を意味しないかもしれない。

「ならば」について。Aが偽か、Bが真なとき。前者は直感に反する。前者は反例を作ることができないからって理屈。前提が間違っているときは必ず「ならば」が成り立ってしまうというのは、皮肉な感じがする(慶應の論理学でも思った)。それにしてもこの授業は早すぎていみわからん。駆け足すぎる。AならばB、の場合は包含関係が成り立たないといけない(B⊂A)。ベン図のよくある重なってる奴だと絶対成り立たない(反例があるから)。

ってか記号使ってくれよ!意地でも使ってないけど印刷教材では使ってるんだろうか?

カードゲームで論理の話をしている。ちょっとわかんないです。どうも対偶の話をしているような気がする。対偶を調べれば勝てるみたいな感じ?あっやっぱそうか。

条件文と同値文の違い。日常言語だと「ならば」を同値文の意味として扱うことがある(ここはスライド作ってください!)例えば「雨が降っていたから動物園に行かなかった」は同値の例。逆が真だから。あれそうか?雨が降ってなくても動物園に行かないかもしれないじゃない?

演繹的推論について。0個以上の推論を使って結論を導くこと。妥当な推論とは、すべての前提が(内容にかかわらず)真なら結論が真になる推論のこと。まともな推論(?)とは、前提が実際にすべて真であるような妥当な推論のこと。

結論だけの妥当な推論はあり得るか?例えば1=1かな?

妥当な推論は空虚な真も含まれてしまうので、中途半端な感じだそうだ。

妥当な推論の例。三段論法。クジラは哺乳類である、哺乳類は温血動物である→だからクジラは温血動物である。集合の包含関係が成り立つから必ず成り立つ。

妥当でない例。たまたま前提も結論も真のケース。例えば、クジラはサメではない、クジラは哺乳類である→だから、サメは哺乳類ではない(サメをイルカに変えるとおかしさが分かると考えた)

前提がすべて真だが結論は偽のケース。ハトはスズメではない、ハトは鳥である→だから、スズメは鳥ではない(上のイルカの例と同じ)。だからこの推論はおかしい、妥当ではない。

妥当であるかどうか調べる方法。同じパターンの推論で、前提が真なのに結論が偽になるシナリオ(=反例)が存在するかどうかを調べる。とにかく反例を考えなければいけない。たいへんや。なので、これを自動化したい気持ちがある。すると一階述語論理が出てくるらしい。で、それを実装したのがコンピュータってわけ。と考えると面白くなってくるね。

第14回

タブローによる計算の話。タブローって慶應通信の論理学でもちょっと出てたあれだ。

妥当性の検証を自動的に行うのがタブロー法らしい。

言語とは何か。共通している文法があるものが言語?シグナルの部分と意味の部分を分けるのが言語学らしい。記号列→文法に従って構成されている単位→統語論の世界。記号列を解釈して結びつけること→意味論の世界。例えば(シグナル)赤信号が青になった→(意味)前進してもよい。(シグナル)イルカが音を出す→(意味)意味あるかもしれんけどわからない。などなど。

人工言語の話。人工言語は意味はもとより統語論は得意。意味は私たちが決めればいい(?)。これから語彙と文法と操作規則を定義する。

述語記号P, Q, R、関数記号f, g, h、変数記号x,y,z, 定数記号a, b, c、等号=、論理演算記号∧、∨、¬、⇒、⇔、量化記号∃、∀を使う。いわゆる記号論理学のやつだ。

項。変数や定数、これらを関数に入れたやつは項。例えばf(x), f(g(x,f(z)))など。(≧∀≦)は項ではない。gzもだめ(関数の定義にあってないから!?)。

文。項を統合でつないだやつ t=s は原子文である。Pが述語記号ならP(t1, t2, …)も原子文。これを演算子でつないだやつが文。つまり∧、∨、¬、⇒、⇔でつないだり、前に∃、∀を付けたやつが文。もう文は無限個あるね。

等号=→項と項を結ぶ。同値記号⇔は文と文を結ぶ。f(x) = g(w, y)は文だが、f(x)⇔g(w, y)は文ではない(文法的ではない)。

量化記号の復習。だれもに好きな人がいる→∀x∃yAxy、だれもが好きな人がいる→∃x∀yAxyと書ける(x, yは人を表す変数として、Aはなんだろう?→好き、というかんけいのことだとわかった)

代入すること。同じ変更が「自由に」表れているとき、同じ記号で置き換えられる。先の例なら、∀x∃yAxy→∃yAay、Aabって感じ(!?いみわかりません)。

「自由に」ってなんだよ?→複雑なのででテキストをお読みくださいだって。あんまり詰め込まないでほしいぜ!

意味論の話。一つの個体に対して牛若丸=義経(原子文)みたいに複数の名前がついていることがある。これは統語論の話。あれ?この話どう関連してるかわからない。とりあえず対象の集合を領域にするってくらいの意味らしい。次は、付置関数。約束の話。弟はだれ、妹は誰、みたいなこと。

例。兄弟の定義を記号でやる。R→兄弟である。f→父、g→母なら Rxy⇔∃z(f(x)=z∧f(y)=z) となる。真面目に言葉で解釈すると「xとyが兄弟であるとは、xの父がzでかつyの父がzであるようなzが存在することと同値」ということになる。まあ確かにそうだ。

頼朝と義経の関係を記号で表している。雨宮さん、歴史の教科書これで表してくださいよって言ってる(やめてほしい)。実際やってる奴がいるらしい。

タブロー法。これは反例があるかどうか自動的に検証する方法らしい。偽であると仮定して文を分解→矛盾が発生したシナリオを却下→以下繰り返し→却下されないシナリオがあれば判例になる、ということらしい。

スズメ、ハト、鳥の例でタブロー法を実演してる。ちょっとwordpressでは書けないので、テキストを参照するしかない。雨宮さん、よくついてけるなこれ!

全体的にいえば、間違った三段論法を機械的に判定できるということ。中身を全く考えなくていいのがすごいけど、案外、直感的にわかるかもしれん。反例を構造的に頭の中で考えられたら最高だけどそれは、タブロー法を全部頭の中でこなした上で、直感レベルまで訓練を続けないと無理だね。将来的にはそういう教材を作成してもいいかもしれん。

ここまでやったら論理的な話、数学的な話は全部コンピュータができるんじゃね?と思われたが、無理らしい。なぜ無理か。それを次回やるそうです。

第15回

証明と計算について。まず自然数と帰納法の話。

文通クラブのパズルについて。4つの条件からメンバーが何人かを推理する。

  • ①どのメンバーも少なくとも1人に手紙を送っている
  • ②自分宛てに手紙を送らない
  • ③どのメンバーも多くても1人からしか手紙をもらっていない
  • ④誰からも手紙をもらっていないメンバーが1人だけいる

④から始めるとわかるが、これは無限になる。

①→一人にだけ手紙を送った、に変更するとどうなるか。やっぱり④から始めると無限になってしまう。一人から次の人次の人…と手紙が受け渡されるので、直線的な関係になる。→自然数の公理と同じらしい(!?)

というわけで自然数は関数S(次の数に進む)を使って表すことができる。

  • ①0が存在する
  • ②Sx=SyならX=y
  • ③xが0でなければ、x=Syとなるyが存在する
  • ④すべてのxについて、Sx=xでない
  • ⑤Sx=0となるxは存在しない

どれも手紙ゲームのルールと同じ(言われてみれば)。

さて、前述の手紙ゲームで、命題A「どの手紙についても手紙を書いた人の髪が青ければ、受け取った人の髪も青い」という条件を追加すると、全員の髪は青くなるか?これは、青くなる。最初の人④に当たる人が青ければ全員青いのだけど、最初の人は青いかどうかわからない。でも青い。なぜかというと、命題Aを否定するには、前半が真かつ後半が偽にならないといけないが、そのような場合はない(全員青いから)。というわけで反例が作れず、全員青い。ここ理解するのめっちゃ時間かかったんだけど雨宮さん2秒でわかってる。すげーなー。

これは数学的帰納法という手法でした。わかりやすいですね。高校との違いは、一直線の論証だけじゃなくて、分岐しても大丈夫ってこと。

帰納法の誤りを指摘する問題。どんな馬の集合でもの馬が1色であることを証明するために、次の帰納法を使おうとした。

  • ①1頭なら1色(自明)
  • ②どんなn頭の集合をとってきても1色と仮定
  • ③n+1頭にしても、任意のn頭は1色なのだから、n+1頭でも1色
  • ①~③より、どんな馬の集合でも馬は1色

一見すると正しそうだが、結論がどう考えてもおかしい。ということはどこかに穴があり、これは③がおかしい。n+1頭目が別の色なら1色にならない(反例)。よってこの帰納法は間違っている。一々難しいな。こういう論証の誤りを一瞬でつけるようになりたいよ。

集合の濃度について。無限集合は部分集合と全体集合の濃度が同じになることがあり、これを「濃度が等しい」という。例えば自然数には濃度がある。自然数は元を数えることができるという特徴があり、これを可算、ℵ0という。ℵはヘブライ文字でアレフと読む。

濃度が変わらないというのは、1対1対応があること(?)。自然数に何か有限個のものを加えても、tanという関数を区間[-π/2, π/2]の間で考えても、1対1関係があるから、幅を大きくしたり小さくしても実数と濃度は同じ。

有理数の濃度は?有理数は分数で表せる、すなわち自然数と自然数の組だから数えられる(可算)。また、有利集の集合は自然数の集合を部分集合としている一方で、この集合の部分集合とみなされるから加算(「この」が何を指しているかわからず意味わからんかった)。

実数Rはどうか?これは加算でないことが証明できる。まず実数の濃度は有限区間[0, 1]実数の濃度と同じである。次は背理法。[0,1]の実数が全部数え上げらえると仮定する。すると、0.a1a2a3a4…というすべてを網羅するリストができることになるはず。ところが、リストに入ってない数を作ることができてしまう。例えば、数え上げたリストを斜めに取っていって各桁を+1した無限小数を考える。するとこの小数はリストにない。なぜかというと、これはi番目に入っているはずだが、i番目にある無限小数のi桁目は+1されていて、リストのi番目のと違う。だから矛盾する。よって実数は可算ではない。以上。対角線論法というらしい。

正直全然わからん論証なので、おとなしく印刷教材を真面目に読みます。

同様の理由で無理数も可算ではない。そして無限も無限にあるらしい(!?)。集合論をまともに勉強しないと意味わからんです。

なぜこんな七めんどくさい表現をするのかというと、みんな同じ数を使っているんだ!っていう前提をはっきりさせておかないと、議論ができないからなんだね。数学、機械のためのルールを一意にしないと、すべてが曖昧でめちゃめちゃになってしまう。数学はこういうことをはっきりさせているからとても好きです。

放送大学全科目感想 002 問題解決の進め方(’19)

  • 基盤科目
  • テレビ科目
  • 秋光淳生先生(放送大学准教授)
  • 柴山盛生先生(放送大学客員准教授)
  • 難易度 ★☆☆☆☆
  • おすすめ度 ★★★★☆

問題がおきたとき、それをいかにして解決していくかについて、さまざまな方法論があることを教えてもらえる。こんなにたくさん方法論や問題の捉え方があるなんて知らなかったし、ものの見方、考え方の基本、フィードバックの手法など様々な面で効率化、明確化が測れると思われる。学問や社会生活の基礎としておすすめ。抽象的な話が多く、具体的な社会経験があった方が楽しめる。

第1回

問題の定義について。

問題を現状とのギャップとして捉える。想像と結構違ってびっくりだけど、言われてみればそうかも。ギャップは埋められるものなのだから、解決できるはず。非常にポジティブな捉え方ですね。

文科省的な力ってグループの協調性の項目が多くてたいへんだな。と思ったら、そもそも組織が必要なのは何故かの話もあった。人間は普通凡人だから。だから道具とみんなの力、を借りられる。しかも問題解決の幅が広がるし、継続的である。

個人だと限界があることは、いつも意識しておかないとだめだね。

先生方優しそう!!今回はイントロでしたが期待大です!!

第2回

ゲストの水木さん頭の回転が速くていいな〜

問題解決のためには、解決策を立てるのはもちろん、現状認識、目標設定、検証が大事になる。一連のプロセスの中で、どれが抜けても困る。塾で成績の振るわない生徒さんのための説得的なプロセスを考えるときに便利だ。

現状がひどくないと、ギャップと認識できない。これを見えない問題という。現状認識がないと問題に気づけない。たとえば書けば認識できやすくなる。先生は付箋を手帳に貼っていく方法をとってる。スマホアプリで同じことできるかな〜。私ならツイッターに書いちゃうかな。

現状認識のためには定量的に考えるのが大事。私はよくやってるよ!勉強時間と結果の相関関係とか!あと根拠も大事にしよう。視点視座視野も考える。視座(どこから見ているか)はあまり意識しないね。

問題発見のために。PDCAサイクルでてきました。計画、実践、評価、改善。疑問を持つこと、は難しいけどがんばろう。不満とか不のつく言葉はギャップを表すから、問題であることが多い。

省庁や自治体のサイトは問題の情報にあふれているとのこと。たしかに、市の広報なんかは問題に関する情報だらけですよね。省庁のサイトも見てみよう。

第3回

秋光先生はマニュアル世代!?

目的と目標の違い。目的が大きなゴールで、目標は目的の途中にある目印。目的は大きすぎるから、もしくは捉えにくいから、目標に進んでいくとやりやすい。

SMART戦略。具体的、測定可能、合意可能(誰でもできる)、達成可能、長すぎないこと。これも生徒さんに使えそう。

目標はゴールから設定するだけでなく、原点から目指してもいいし、将来的なことを見据えてもいい。あと、結果が望ましいものだったかのフィードバックも必要。アウトカム(自分が得られたもの)とアウトプットが見合っているか、望ましいものか。

制約条件と前提条件。制約条件は、時間とか金銭とか。どうしようもないことが多い。前提条件は、大学を卒業したいとか。前提条件は忘れがち。制約条件を考えるときはMECE、もれなくダブらなくで挙げる。6W3Hで考えよう。

大雑把に目標に進んでるからいいや、ではなくて、目標を具体的に設定して、いま進捗はどうなのか、得られたものはどうなのか、など、プロセスに目を向けていくことが重要になりそうだ。

第4回

情報収集について。

情報収集の話なのにまず情報を作り出すことが話題に?というのも、必要な情報というのは、ないことが多い。インタビューなどを経て作らないといけない。目的の明確化、因果関係の妥当性や信頼性の確保が望まれる。外部情報を使うなら、方法やコスト、時期や信頼性も吟味せよ。情報を作り出す場合、科学実験、社会実験が考えられる。実験群と対象群の差があるか確認せよ。記録、測定といった調査も情報の作成となる。インタビューもグループにするか個人にするか、コストや制約条件が複雑に絡み合う。アンケートだと質問票の設計が要になる。

外部情報の使い方。情報は多い。意見と事実を区別せよ。調査報告書、白書は基礎データがとれる。概要から詳細へ向かえ。検索について。あんまり目新しいことはなかった。SNSにブログが入ってること、twitter等がないのがちょっと古くない?

情報の保存。一次情報は原文のまま。二次情報は書誌情報や概要を保存。体系化して、分類した方法まで記録しておくと良い。

整理方法。時系列順、手順の流れに沿って整理したり、マップにする、論理関係の整理、表形式の整理、マトリクス型でも良い。

味泉さんから業務用調味料開発で実例を聞かせてくれた。てか家庭用とはっきり別れてるのね。釜で生産して充填する。世界標準の基準でオーダーメイドしているという。まずトレンドを一次情報として集める。店で食べる。実験する。開発する。業務用だと保存性も大事。酢と食塩で保存できる。pHと水分活性で測定可能。味の濃さや粘度も測れる。規格に沿わなければいけないので大変。検査工程で、試作品と完成品が規格と同じか確かめないといけない。トレンドは管理栄養士さんなどがあたるらしい。実例たのしい!

第5回

数値情報のについて。表やグラフの読み方?雨が降りそう、と降水確率が60%、重い、と10kgでは印象が違うという話。

質的な分析と量的な分析。質には名義(A型B型とか)と順序(よくわかる・わからないなど)がある。順序の間隔が同じとは限らないので、平均をとってもあまり意味がない。量にも間隔尺度(温度、時刻)と比例尺度(所要時間、距離)がある。間隔尺度はゼロ点の取り方で意味が変わる。比例尺度はスカラーかな。

クロス集計、表について。データベースとほぼ同じに見える。放送大の学生って7万人いるんですね(適当な数字か?)。クロス集計とは、行と列を使って集計すること。全科履修生、専科科目を行、男性女性を列にしてる。相対度数を求めたりもできる。男性の方が科目履修生が多い、全体を見ると女性が多い、など。相対度数は何に対する相対度数か(全体か、ぎょうか、列か)で意味が変わってくる。

グラフについて。どのグラフをどの目的で使うか。円グラフ→年齢別割合とか。割合が一目でわかる。ただ実際の数字がないと比較が難しい。比較するなら棒グラフ。棒グラフは略されることがあるので数字マジックを使いやすい。ヒストグラムでは分布、折れ線グラフでは推移がわかる。これも数字マジックが使える。散布図では(相関)関係がわかる。レーダーチャートでは比較ができて、全体の傾向がわかる。数字は誇張なく伝えよ。マジックを使うな。

何を伝えたいのか、数字の使い方は誤解を生まないものか、などを考えて、正確に伝えるためのツールとして数字をー使っていきましょう、と言うお話でした。

第6回

図解について。

道案内は言葉よりも地図の方が楽。英語でよく道案内の問題出るけど実は地図の方が簡単だよね。とはいえ道を尋ねられた時は地図を書いて渡せないこともあり、場合によるのかな。

全体像を描くのが図の役目。物理図解の他に論理図解も重要。現代文の読解の時よくやってました。

図の作り方。まずはキーワードを抽出して、それを含むように箇条書きにするとこからスタートする。円は概念、四角は具体的事象の名前、白抜き矢印は変化の方向、実線は関係、点線は薄い関係、など図にもルールを設けておくと見やすい。

先生やさしいな

いろんな図解のパターン。トーナメント図、関連の枝分かれ図、収束、変化の図はあんまり使ったことないですね。階層関係の三角の図は学習過程、目標設定で使えそう。私はいつも直線的にしてしまいますけど。

図解の手順は下書き→検討→改善→やっと図解化→構造化という流れで行う。問題を図解化するところが一番大変。問題の構造化にあたっては、現状とのギャップや制限、条件を表せているかを確認する。

病院の受付を例に。スライドの絵を見るだけでは問題はわからない。まず立場に箇条書きをつけると問題点がはっきりする。現状と目標、問題点を抽出する。原因を考えて、解決策を3つ立てている。受付の立場なら、問題は窓口によって列の長さが異なること。解決策としては時間によって窓口の数、職員の数を変えるなど。図解することで、問題の切り分けや考えるための切り口がはっきりする。

練習問題。傘がない。目標は目的地まで行くこと。現状は傘がない。制約条件は雨に濡れないこと。解決策は、待つ、近いから濡れて行く、タクシーに乗る。条件と照らし合わせてどれを選択するかを選べる。目標が濡れないことなら解決策も変わってくる。

伝えるための技術として図解は重要である。とともに、問題点を整理して現状を正確に把握できる効果も期待できる。

第7回

分析的に考えることについて。分析するとは細かく分けて明らかにするということ。

まずは問題の領域をはっきりさせ、領域にあった考え方をする。規則性がある→論理的に考える。偶然が大きい→統計的に考える。選択性が強い(複雑)→システムで考える。

集合(包含)、提言(ある、すべて)、命題(A→B)かどうかも重要。演繹、帰納、仮説も使う。しばらくは論理学の基本なので略。演繹は正しいが帰納は正しくないことも示してくれた。仮説は可能性としてはあること。でもこれがないと話が進まない。

因果関係。相関関係+時間的順序+第三因子ないこと、が必要。

確実にいえないことは確率で考える。掛け算と足し算の話。分析的な話はほぼ数学的な話になる。ディシジョンツリー。樹形図と確率を組み合わせた感じ。期待値を計算するのに便利。

選択性がある場合の決定の方法。問題の設定→定義→目的の体系化→掘り下げ→目標設定→選択肢の作成→結果のまとめ→妥協点の模索、という順序で進む。

分析の視点についてのヒントたち。文章の意味を検討する。ゼロベース、何もない状態から考える。ブレークスルーを見つける。全方位の視点、満遍なく見渡す。

チーム医療で実例。千葉の総合病院の透析の例。高齢の透析患者が増え、32万人もいる。65歳以上が半分くらい。人工腎臓はどれを選択するか。栄養状態が関わってくる。透析は栄養分も除いてしまうため。栄養士さんと連携が必要。透析患者は他疾患も併発する。転倒もあるし、筋力低下もあるのでリハビリも必要。連携にはコーディネーターも必要。なんとその役は看護師だそうです。患者さんごとにどの方法が適切か選択している。

第8回

学習記録と振り返りについて。

水木さんは自分の出た数時間のラジオの生放送も聞き直してるらしい。すげーな。

社会に出ても学ぶことと振り返りは大事。PDCAサイクルまた出てきた。コルブという人が、具体的経験→省察的観察→抽象的概念→実践、というプロセスに経験学習という名前をつけた。まあ学習の一般的な形ですよねこれ。経験をなるべく形にしようということかな。偶発的学習→計画的でない学習のこと?でも学習って大体偶発的では?

振り返り。ギブスさんのサイクル。経験を記述→感情や判断を記述(経験と分ける)→評価(良い点悪い点)→分析(意味づけ)→一般的な結論(一般性)→個人的な結論(特殊性)→個人的なアクションプラン。分析が難しいみたい。大事なのは客観的に見ること。主観を客観的にみるのもいいかもね。

マインドフルネスに言及された。価値判断をしないこと。マインドフルネスについてはまた調べよう。

一つの経験が次のプランまで波及して次の経験に活かせればいいサイクルになるね。一連の流れがうまく繋がるとよいですね。

先生は変わることが学びとおっしゃってる。そのためには記録をする。eポートフォリオ用のMahara というソフトの解説してる。学んだことを箇条書きにしてる。自分のページ作ったり、コメントしたり掲示板やグループ作ったりできるSNS機能もあるみたい。検索したらいまいち流行ってないな。スタプラでいいんじゃない?あとこのブログも立派な記録じゃない?

リカレント教育。知識をアップデートするために大学に入り直すなどして学び直すこと。頭が固い場合はアンラーニングも必要。枠組みが古すぎる場合もあるもんね。

第8回までのまとめ。水木さんは問題が起きてから解決していたけど、書き出したり記録することをしてなかったという。振り返りすればギャップが少なくなるはず。記録はなんだって大事なんだな。このブログもなんらかの形で役に立てるといいな。

第9回

発想を広げること。柴山先生の担当。知識から発想を広げる方法について。どんな人でも自分の知識から発想する。そこがスタート点。

通常と異なる発想をするにはどうするか。まずアイディアをたくさん出す。突飛でもいい。

引き出しの材料として短期記憶と長期記憶の話。発想は長期記憶でやる。手続き記憶と宣言記憶、宣言的記憶の中に意味記憶とエピソード記憶。知識の体系の図を見る。これだけでは発想にならない。体系を組み替え直さないといけない。

視点。目標に則して考えたり、言葉遊びをしてみる。ブレーンストーミングみたいなもの?ヒントに結びつける。連想ゲームとか。イメージをわかせる。画像や映像と関連づけたりする。勝ちパターンに結びつける。

マインドマップについて。真ん中に自分を置いて、関連する事柄を樹形に適当に繋げていく。箇条書きに似ている。繋がりは思いつくままでよい。体系的にする必要はない。

発想の技法。属性。ものの特性をたくさん挙げていく。新製品開発の時に役立つ。

ナインチェックリスト。転用、応用、変更、拡大、しゅくしょう、代用、再配列、逆転、結合。作曲に使えそう!!

メタファー。シネクドキ、メトミニー、メタファー。シネクドキは部分と全体性、ご飯(食事)、花見(桜)など。メトミニーは電話を取る、など。メタファーは目玉焼きなど。

アナロジー。シネクティクスともいうらしい。当事者のつもりになる、似たものの類推、視覚イメージを重ねる、空想する。。など。これ全部アナロジーなんだ!?

最後に図解。まずマトリックス図。テーブルにして2種類のものや場面を組み合わせて考える。次にkj法。情報収集してラベルを作り、グループ化して、並べて、最後に文章にする。連関図法。関連を矢印でつないでいく。系統図法。大分類→中分類→小分類と細分化していく。ワラスの思考モデル。準備→あたため→ひらめき→検証。数学みたい。ひらめきに至るまでには、準備の段階がかなり大変に思える。

事例。こども科学教室の例。つかみが大事。わー不思議だな!と思ってもらう。塾講師でもつかみを大事にしたい。アオギリの種を落とさせて体験させる。発表させる。発想が広がる。らしい。私は発表のできない人だったので、これで発想できるようのなるのなら羨ましい感じがする。大人が楽しんでないと子供も楽しくない。好きなことじゃないとだめ。そこは私も自信ある!工夫することが発想。そうするとプログラミングって発想の塊じゃない?発想一つで構造もスピードも大きく変わってくるもんね。

第10回

組織での問題解決の実例1。門奈先生。今回はグループワーク。

水木さんの描写すげー。私はグループワークやったことないです。

組織運営について。組織で問題が起きたらどうする?個人だと行き詰まって悩む。組織なら知恵を出し合える。ワークショップはグループワークを発展させて、活発に意見を出してもらうもの。利点は広範囲に考えられる、PDCA回しやすい(大事。継続性が期待できる)、お互い補い合える。短所は協力が必要なのと、時間がかかること。

意見が異なったらどうする?多数決とかジャンケンとか。却下された考えも取り込まないと火種になるから大変。

262の法則。意識の高い、ふつう、低い人が2、6、2割になる。高い人だけ集めてもまたそうなる。働きアリみたい。低い人もうまく取り入れないといけない。

ワークショップの要素。参加者、ファシリテーター、上司、主催者や事務局、サポートスタッフ。単純に参加者だけではない。

3Mジャパン相模原事業所に取材した。ファシリテーターの太田さん話を聞いてる。ワークショップをデザインするひと。ワークショップでは課題を発見、解決していく。研修とは違う。研修はゴールがある。個人の問題になる。繰り返しもできる。ワークショップではチームで成果が出る。シナジー効果をねらう。プロセスも毎回違うのでファシリテーターのデザイン能力が問われる。放送授業が研修、面接授業がワークショップに相当する。

アイスブレイク。ワークショップに参加する人は緊張してるので、それを解かすこと。自然体で参加してもらう。ファシリテーターはアドリブもするし、相互関係は大事なのでアイスブレイクを1時間することもある。参加者は予習はしない方がいい。協調性を育むのが目的。

ファシリテーターはデザインに6、実施は1、フォローは3の割合で行う。デザインでは方法論と技法の検討が大きい。フォローはアンケートとか。

イノベーションも必要。ファシリテーター自体が色々ワークショップに参加して研究してる。時間は短く。切羽詰まってたほうがいい。締切が全てってクリエイターはみんな言ってる。

女性のエンジニア同士のワークショップを開いた時。女性は孤立しがち(少ないから?)。ワールドカフェ?方式でテーマを決めて話し合う。成功体験をシェアしながら語り合う。ファシリテーターは目立たないのがいい。アウトプットは本人のモチベーションアップと、経験を生かして勇気をもって離せるようになったことなど。

個別塾講師にも通じるね。教師はあんまり前に出ない方がいいね。グループとちょっと違うけどさあ。

最後に太田さんからアドバイス。人のワークショップに参加せよ。1人ではだめ。いいワークショップも悪いワークショップも経験になる。どんどん言語化して意見交換せよ。

第11回

グループワークの実施方法について。水木さんはワークショップに参加し、622の法則をリアルに体験したらしい。

まずはチームビルディングから。1分間自己紹介する。他己紹介もする。1分が大事らしい。話すのが苦手な人はどうするのか?傾聴すると話しやすいかもということ。ゲームをしてなごむようにすることも。ストローでタワーを作らせるとか。5分で協力が学べる。

小道具。付箋紙、ペン。ファシリテーター側はベル、タイマーなど。

アイデア出しのほうほう。ブレーンストーミングから。略してブレスト。アイデアを付箋紙に書いてはっていく。カードを使うのも良い。ブレーンライティング。小さな紙にアイデアを書いて他人に渡す。制限時間は2分。全員同時にやるのではやい。

なぜ付箋紙を使うか。頭の整理と、紙に残せること、可視化など。言葉が主体から離れて客体化する。パソコンのほうが早くないか?という門奈先生の意見には、可視化しやすい、個性が出る、関連づけが楽、と太田さんが反論。

アイデアの収束。アイデアを分類(kj法)。親和図法。似ているアイデアをまとめていく。付箋紙をグループ分けして貼り直していくなど。ここからシールを貼って人気投票させたり、マトリクスにまとめたりする。シールの数が多いほどマトリクスの端に貼っていく。

ワールドカフェ方式。テーブルを複数用意する。テーブルごとにテーマを用意して、議論したら1人以外全員移動する。未来志向のアイデアになる。

プロトタイプの作成。アイデアを可視化する。個人でもグループでも良い。ポスターにまとめるとか。グループ外に発表し、改善する。シールを貼って評価するのでよい。多数決で選ばれたものに加え、違和感を覚えたシールも多く獲得した多様決を獲得した人が発表してた。

最後に振り返り。グループ単位が良い。カードブレストに個人の意見を書き、ディスカッションする。意見を出しにくい人もカードなら書きやすい。わかったことやよかったこと、疑問点、新たなアイデアを書く。

参加者の話。新規テーマの発見、収束に役立つ。同じテーマでも異なった考え方があること、視点を変えて自分の業務の別の解決策が見える、刺激的だった、など。時間制限があると尖った斬新なアイデアが出やすくなる。時間を取ると信頼性は高まるが、アイディアはつまらなくなる。

こーいう試みを文化祭の出し物の検討に使ってみたら?クラス委員がワークショップの手法をちょいと学んでからみんなでアイディア出したら面白いものができそう。私は意見を出せない人間のだったけど、カードなら何か書けそうだよなー。若いと面倒な自己意識があるから、属人性をとっぱらった意見を出せるのはとても良い。

第12回

組織の実例3回目。静岡市大沢の縁側カフェ。観光客が来るようになったらしい。

システム思考とデザイン思考。ざっと、左脳と右脳。理性と感性。評価と独創。両方の視点で考える。

システム思考について。木の枝という要素ではよくわからないが、お箸という機能をつけるのがシステム思考。人口増→企業数が増える、企業数が増える→人口増のような相関関係、プラスのサイクルを考えるのがシステム思考。

デザイン思考はデザイナーの手法。デザインとは問題の発見と解決(そうなの!?)。誰でもできるらしい。有用性、経済的実現性、技術的実現性を考える。共感→問題定義→発想→プロトタイプ→テストの順で行う。失敗と改善を繰り返す。なるべく早くする。プログラミングと一緒やん。

大沢の実例。2013年からスタート。静岡から車で1時間。お茶が名産。週2で開催して、300円でお茶とか餅とか出してる。10軒くらい。農家の縁側を使ってる。おばちゃんと話せるのがよい。年7200人も来てる。お茶の需要減が危機意識の始まりだった。大間お茶カフェというのがあり、先行してた。無理しないで続けてるらしい。都会から若い人も来てる。ピザ出してるとこも。嫁いできたひと、親から茶畑を受け継いだ人、いろんな人がいる。集落全員で長期間話し合い、全員賛成になるようにした。人が来るようになって、高齢者の元気が出た。外から来た人が、大沢のいいところを話してくれるのがよかったそう。

システム思考での分析。茶業が安定⇄人口増にしたい。売上→利益→働き口→事業者のループが欲しいが、お茶飲料の登場でマイナス要因ができた。縁側カフェでは、魅力、入場者を増やす。ただ入場数が増えるとサービスが低下する。などのモデルが書かれてた。で、実は静岡市の販売促進研究会というとこが関わってた。町おこしは時間がかかるが、一年でということで引き受けたらしい。住んでるとわからないが、どんな地域でも強みがあるらしい。アンケートを取ると、お土産が欲しいらしい。事業を拡大して、求めるものを提供していけるようになれば人口流出も防げるのではということだった。大沢ブランドを作ればいい。

デザイン思考での分析。何もない→人が財産→人を中心としたデザインという発想で、縁側でおばあちゃんと対話すればいいのでは、となった。問題。意思決定は全員一致にしたい。そこで隣村の視察をしたり、自分の家でできるところだけ、自由にやることにした。有用性→人が財産、会話が欲しい、経済的実現性→場所、茶、人の提供、技術的実現性→できる家庭だけやる。誰のためか→お客さんと自分たちのため。

どんな地域でも強みがあることは中からの視点ではわからない。外からの視点を取り入れれば必ず何かわかる。今自分が住んでる地域は、わかりやすい強みもあるが分かってない強みもいっぱいあるはず。

第13回

(今回から感想が簡素になります)

久しぶりに見ると水木さんが生徒役になってるのって微妙な感じがする。必ず女性だよね生徒役。おっさんが生徒役じゃだめなんか。

今回は集団の意思決定について。集団で物事を考えるとだいたい個々人の和にならない。どうせなら積とか、数倍の生産性になってほしいけどそうもいかない。個人ではどうにもならないことを補う効果はあるが、他人の意見や立場を気にして思うような意見が言えないことも多い。

なので信頼関係が最も大事になる。何を言われても否定されない(反対意見は否定ではない)という関係を築けば相乗効果が期待できる。そういう対等な関係を基盤とする自己主張のことをアサーション、アサーティブネスという。そういえばプログラミングで一時エクストリームプログラミングってのが流行った。あれがアサーションなんだろうな。夫婦関係もアサーションっぽい関係が理想かなぁ。親子関係は垂直的要素があるからなかなかそうもいかないが、子が成人したらアサーティブネスになればいいなとも思う。

第14回

問題解決の実践方法だけど、主に集団による実践方法の話。役割分担やスケジュールの立て方、会議のやり方など。

スケジュール管理は勉強計画を立てるときに役立ちそう。適当に書いても絵に描いた餅になるので、実際過去の自分の振り返りなどを参考にしてフィードバックを入れていけば、相当な制度で学習効率が上がりそう。

会議のやり方、もっと早い段階で中高生に教えるべきだよね。集団で議論してわやくちゃになることばっかじゃん会議って。今でも覚えてるけど小学校で新聞委員会の部長にさせられてしまい、そこでみんなから意見を募るとき何も意見が出ず毎月辛い時間を過ごしていた。先生は横で見てるだけだったしなにかノウハウのアドバイスを出してくれればよかったのに。ほんとうに苦しかったから今でも覚えてますY本センセイ。

第15回

評価について。評価の種類と定量化についてのお話がメイン。

まず評価の重点をどこに置くか。動機か過程か結果か。私の評価って結果ばっかだなぁと思う。でも動機や過程ってどうやって評価すればいいのか難しい気がする。尺度の問題も議論されるがやっぱわかりやすいのは投入資源(試験なら投入時間)。あと成果(試験なら点数)。主観ってのもあるがこれも重要じゃないかな。やってて楽しいかどうかとか。

評価のための表を三種類紹介していただいた。功罪表、評価表、利得表。利得表が一番わかりやすいのでこれの解説が続いた。平均とかマキシミン戦略とかいろいろ使えるようになってくるので。やはり数値化すれば強い。評価はなんとかして数値化する試みをするのがよい。