2020年5月30日土曜日

ゼミ紹介2020

2年生向けにゼミ紹介の動画を作成しました.うちの2年生だけに見せるのはもったいないので,宣伝がてら,公開します.これ観て面白そうと思ったかたはご連絡ください.








大学教員もYouTuber化の時代?

昨年から「プログラミングのための数学」という1年生向けの数学を担当しており,新型コロナウイルス禍によるオンライン講義化のなか,この科目は非同期型の動画配信型で対応してみることにしていた.せこせこと空き時間を見つけては動画を収録して毎週の配信に備えている.

現時点で既に第5回までは配信し,いま準備できているのは9回(9コマ)分なので,あと5回分作れば今期の数学のコンテンツは撮影終了予定(本学は100分x14コマなので)である.動画配信型の講義準備は,実はけっこうたいへんで,音声収録型や双方向ライブなど動画収録型ではないタイプと比べると準備に時間がかかる.まあ,この科目にはいろいろ思い入れがあるので,しんどいけどやってて楽しい.とても楽しい.

さて,動画の内容だが,自分で気に入っているポイントは,Keynoteの資料を提示するばかりではないところ.ときにはRstudioを使い関数のグラフを描いたり数値データを取り扱ってみたり,あるいはNumbersやMS-Excelを使い数値計算してみたり.またあるときには,OneNoteやZoomのホワイトボードを使って落書きをし(けっこうな頻度で落書き画面は登場する.ペンタブ導入して本当によかった!),場合によっては端末で操作する画面を見せて,簡単なプログラミングも披露する.私のバストショットでやさしく語りかけることは滅多にないが,最初と最後の挨拶くらいは,私の顔が大きく出るのを許してもらいたい.

大学で使っているLMSに大きな動画を置いてはならじというのでYouTubeから配信するようにしていて,それはそれでいろいろと面白い(アクセス状況など簡単な分析機能が提供されている).受講生のなかには日本語がまだ得意ではない留学生もいるのだが,YouTubeだと自動で字幕を出せる点も,教育効果がありそう.まあ,精度はまだまだのようだが,多少の役にはたつだろう.図はYouTubeの管理画面が示している再生リストのスクリーンショット.もはや私がYouTuberになるのも時間の問題か?

ML宛の間抜けなランサムウェア全文

こんにちは!

私はあなたに悪い知らせがあります。
2019年7月23日 - この日、私はあなたのオペレーティングシステムをハッキングし、あなたのアカウント(※ここに某ML@HOGEのメールアドレス)にフルアクセスできました。

それはどうだった:
その日接続していたルータのソフトウェアには、脆弱性が存在しました。
私は最初にこのルータをハックし、その上に悪質なコードを置いた。
インターネットに接続すると、私のトロイの木馬はあなたのデバイスのオペレーティングシステムにインストールされました。

その後、私はあなたのディスクの完全なデータを保存しました(私はすべてあなたのアドレス帳、サイトの閲覧履歴、すべてのファイル、電話番号、あなたのすべての連絡先のアドレス)を持っています。

あなたのデバイスをロックしたかったのです。ロックを解除するために、私はお金がほしいと思った。
しかし、私はあなたが定期的に訪れるサイトを見ました, そしてあなたのお気に入りのリソースから大きなショックを受けました。
私は大人のためのサイトについて話しています。

私は言う - あなたは大きな変態です。 無限のファンタジー!

その後、アイデアが私の頭に浮かんだ。
私はあなたが楽しんでいる親密なウェブサイトのスクリーンショットを作った (私はあなたの喜びについて話しています、あなたは理解していますか?).
その後、私はあなたの喜びの写真を作った (あなたのデバイスのカメラを使って). すべてが素晴らしくなった!

あなたの親戚、友人、同僚にこの写真を見せたくないと強く信じています。
私は$851が私の沈黙のために非常に小さいと思う。
それに、私はあなたに多くの時間を費やしました!

私はBitcoinsだけを受け入れる。
私のBTCウォレット: (※ここに口座番号みたいな文字列)

Bitcoinウォレットを補充する方法がわからないのですか?
どの検索エンジンでも、「btc walletにお金を送る方法」と書いてください。
クレジットカードに送金するよりも簡単です!

お支払いの場合は、ちょうど2日以上(正確には50時間)をご提供します。
心配しないで、タイマーはこの手紙を開いた瞬間に始まります。はい、はい。それはすでに始まっています!

支払い後、私のウイルスと汚れた写真は自動的に自己破壊されます。
私はあなたから指定された金額を受け取っていない場合、あなたのデバイスはブロックされ、あなたのすべての連絡先は、あなたの "喜び"と写真を受信します。

私はあなたが賢明であることを望みます。
- 私のウイルスを見つけて破壊しようとしないでください! (すべてのデータはすでにリモートサーバーにアップロードされています) - 私に連絡しようとしないでください(これは実現可能ではありません、私はあなたのアカウントからメールを送りました)
- 様々なセキュリティサービスはあなたを助けません。 あなたのデータは既にリモートサーバー上にあるので、ディスクのフォーマットやデバイスの破壊は役に立ちません。

P.S. 私は支払い後にあなたに再び邪魔をしないことを保証します。
これはハッカーの名誉のコードです。

これからは、良いアンチウィルスを使用し、定期的に更新することをお勧めします(1日に数回)!

私に怒らないでください、誰もが自分の仕事をしています。
お別れ。

2020年5月28日木曜日

無音が怖い症候群

大学の先生たちって挨拶させたら止まらんくなるなーって,昔からずっと思ってた.しかし,いざ自分がなってみると,その理由は痛いほどわかる.

なんでこんなこと考えたかっていうと,先日実施したオンライン授業中,学生たちに作業やらせてるあいだの時間が手持ち無沙汰でねえ.教室だったら,作業している学生たちの間をぐるぐる回って,様子みたり助言したり軽口たたいたりできるんだけど,オンラインだとそうもいかないでしょ?ついつい,余計なお喋りしちゃうんだよねー.無音が怖い,みたいな.ラジオ局じゃあるまいし.放送事故?んな阿呆な.

君たち作業してるあいだ,お茶飲んでくるねー,なんてわけにもいかないし,ていうかちょっとだけ中座したけど,すぐに戻ったし.

そこはもう開き直るしかないのかなあ.どうせ講義時間以外でたっぷり質問に答えたりしてるんだし,トータルでみれば相当のケアをしているはずで,講義コマ中だからって,しゃっちょこばる必要はないよね?

オンライン講義スタイルのスタンダードが確立するまで,我々の試行錯誤は,まだまだ続く.

2020年5月26日火曜日

手順の検討は慎重に

下に掲載した写真は,文学部教員時代の研究室に貼ってあったフローチャートである.

多摩キャンパス3号館の建物は古く,学生運動の余韻さめやらぬなかで建設されたもののため,研究室の扉は鉄でできており窓がない.したがって「とくに女子学生を指導するときにセクハラ等の冤罪に巻き込まれぬよう,部屋に居るときはドアを半開きにしておいたほうがよい」と赴任時に指導された.なので,在室時にはドアが半開きにしているという習慣にしていたのだ.幸いにして?扉の立て付けが悪く,勢いよく閉めないときちんと閉まらないというドアだったため,この運用はとてもうまくいっていた.

ところで,このフローチャート,大きな瑕疵があることにお気づきであろうか?

そう,ドアが半開きで中から反応がない場合,延々とノックを繰り返さないと終われないのである.少し待つ,という処理を加え,さらに,何回か繰り返して反応がなかったら,出直すというパスを用意する必要があるだろう.

今はこの張り紙もなくなってしまった.たぶんまだこの部屋は空き室になっているはずだが,次にここに入る先生には,アップデートしたフローチャートを貼っておくように,アドバイスしたいところである.


2020年5月25日月曜日

オンラインQAどこまで丁寧に対応すべきか問題

最後に添付したスクリーンショットを見ていただきたい.ある科目で,学生が提出したレポートの対応状況を示すLMS(manaba)の画面から一部を切り取ったものである.

右端の数字が何を意味しているかというと,レポート課題に添付されたコメントの数だ.その多くが「1」となっているのは,1. 学生から課題が提出され,2. それに私がコメントを返して終了,というやり取りの結果である.平和な結果といえる.

(オレンジ色のオビは,最後にコメントを書いたのが学生側であることを示している.「ありがとうございます」というような終わり方をしているケースでは,その返答はしていないので,オレンジ色のまま放置しているが,この仕様,どれに答えないといけないのか分からなくなるという点で,ちょっといただけない?)

注目してほしいのは,たまに3とか4とか,多いのでは14なんていう数字がある点である.2というのは,学生が「添付ファイル」をアップロードするためにコメント欄を使ったという状況が考えられるので,1の場合と大差はない.

なぜこんなことになるのか?

14というコメント数を叩き出している学生の例は,質問と解説を何度も何度も繰り返した結果である.7往復したということになる.このような状況は(教員の負荷を考えなければ)悪いことではない.向学心に燃えて分からないことは質問する.学生のあるべき態度であろう.

オンライン講義だからこそ,このような状況が発生しているようだ.昨年度も,熱心に質問にくる学生は居ないことはなかった.しかし,オンライン講義になり,気軽に質問しやすくなったようで,質問を繰り返す学生の数は増えた.

オンラインのため,こちらから伝える情報量も少ない,ということもあろう.学生の理解度を伺いながら講義する対面での講義と比べると,動画配信型の非同期講義は,やはり不利な面があるのは否めない.その結果,質疑応答の頻度が増えることになったと考えるのは自然な帰結である.

どう対応すべきか?

受講学生が繰り返し繰り返し質問してくることは,こちらとしても喜ばしいことではある.指導のし甲斐があるというものでもある.しかし,有限な時間をいかに効率よく使うかという点では,うまく立ち回らないとたいへんなことになってしまう.

幸いにして全受講生が50名強であり,質問を重ねてくる学生もいまのところ数名なので,とりあえずは時間の許す限り丁寧に付き合ってみようかと腹を括っている.ただ,この対応が,今後,高い評価を得てしまうと,ますますタイヘンになりそうで,どうしたもんかな?と思わないでもないな.

2020年5月24日日曜日

なにコレ広告

インターネットの広告って,ターゲット広告,つまり読者の好みを推定して「これなら広告の効果がありそう」ってのを選択的に出すのが主流ちゃうん?と思っていたがそうでもない,かなりテキトーな世界なのかな.

例その1

楽天の広告で「ゴムクローラー」.どないすんねん?こんなの,何に使うの?トラクタも建機も持ってないし!w


例その2

今日,Facebookに挟み込まれていたのがコレ.「箱切り名人」?たしかに自宅蟄居生活で通販モノ増えてるけど.でも,要らんわこんなん!w
 

2020年5月23日土曜日

オンライン講義のスタイルその3(音声録音方式)

わりと演習を中心とした講義では,講義資料を配布してあとは演習を自習しなさいという感じのものもある.当初は資料と解説を提供してそれだけの予定だったが,学生から「音声による説明もほしい」というリクエストがあり,音声による説明も別途追加した.

音声録音方式の手順

音声録音方式は,次の手順で実施している.
  1. 事前に講義資料を用意しておく
  2. 資料と教科書を参照しながら,演習課題の説明を音声で収録する
  3. 課題の提出は演習の成果.課題提出とともに寄せられた質問には都度フィードバックする
先般紹介したラジオ方式動画収録方式より,さらにシンプルな方法である.動画収録方式と同様,録音する音声は細切れにして,編集はしない.失敗したら取り直すというのは動画配信方式と同様の方針である.

音声録音方式のメリット・デメリット

メリットとデメリットを考えてみよう.

講義動画配信方式と同様に,収録した音声による説明は資産として残り,しばらく使いまわせるというメリットがある.資産として残った音声と資料で事前に予習させ,講義時間内には質問に重点的に答える,さらには応用・発展的な話題に触れてみるというような,反転授業への移行が期待できる.

映像を用意するわけではないので,気楽に収録できるという点もメリットかもしれない.結局のところ収録用のソフトウェアとしてはZoomを使っているので,動画も記録できてしまうのだが,音声のみの配信には音声のみのメリットがある.学生が演習で手を動かすことを考えると,動画を視聴しながらというよりは,音声を聞きながら手を動かすという点は利点のひとつだろう.

デメリットは,音声の情報量というところか.やはり,画像が伴ったほうが分かりやすくなるのは致し方ないところ.また,動画配信以上に「喋り方」に気を使う必要がありそうという点も気になる.コンテンツとしてそっけないというところも受講学生にとっては魅力が薄いかもしれない.

一部で推奨されているような,スライド資料に音声を組み込む方法は諦めた.まず,作成に手間がかかるということと,視聴環境によっては再生できたりできなかったりという話をちらほら耳にするからである.それをやるくらいであれば,スライド資料を流しっぱなしの動画を作ったってほぼ同じ,ということにもなるし.まあ,それも一長一短あるので全否定するわけではないが.そのかわり,説明のなかで「資料の何ページをみてください」「教科書の何ページに記載があります」といった指示は多用するようにした.

2020年5月22日金曜日

「プログラミングのための数学」公開授業

中央大学・国際情報学部(iTL)で1年生向けの「プログラミングのための数学」という選択科目を担当しています.2020年は緊急事態宣言の影響で前期はオンライン講義で実施することになりました.同科目もすべての講義回を動画配信方式で提供することとしたので,実際のオンライン講義実施と並行しつつ,最終回までの準備を進めています.

「中央大学のiTLではこんな授業をやっているよ」という情報公開の一環として,今回,特別に,同授業の公開版を作成しました.興味のある方は,ぜひ,ご覧ください.10分前後の動画が6本です.実際には,これに手を動かす演習が加わるので,これでだいたい一コマぶんの内容となっています.演習用の資料などをほしい!という奇特な方は,飯尾まで個別にご相談ください.








なお,本件,あらかじめお断りしておきますが,黒川弘務検事長の賭け麻雀事件とはなんの関係もありません.悪しからず.

2020年5月21日木曜日

九蓮宝燈を聴牌する確率はどのくらいか?

(注意:実際の麻雀のルールに則って「九蓮宝燈を聴牌する確率」を計算したわけではありません)

先日,萬子牌36枚から任意の13枚を選び,並べたときに純正九蓮宝燈を聴牌する確率は,はたしてどのくらいだろうか?という話題になった.面白そうなテーマだったので考えてみたのだが,そもそも,麻雀を知らない人のために,まずは麻雀のルールから解説し,純正九蓮宝燈とは何かを説明する資料を用意した.

数値実験

数値実験をしてみる.数値実験をするために,次のようなコードを用意した.

このコードを動かしてみると,だいたい0.00011という値になる.パーセンテージにして,0.01%程度.そんなもんかな?

計算してみた

まず,パターンがいくつかあるか考えてみる.1と9は,4つの牌から3つずつ選ぶので,その選び方はchoose(4, 3) (※ R言語による表現)となる.2から8までは,4枚ずつから1つずつ選ぶので,それぞれ4.したがって,36個の牌から無作為に13個を選んだときに純正九蓮宝燈の聴牌となる選び方は,choose(4, 3) ^2 * 4^7 だけある.

そして,全てのパターンの選び方は,これはchoose(36, 13) でよい.したがって,その確率は choose(4. 3) ^2 * 4^7 / choose(36, 13) だ.

choose(4, 3) = choose(4, (4-3)) = choose(4, 1) = 4だから,けっきょく分子は4^9,分母はcoose(36, 13)ということになって,計算もそんなに難しくない.4^9・13!・23!/36! を計算してみよう.まず23!を消したいので,P = 4^9・13! / (36・35・…・24) = 4^7 / 35・34・31・29・27・5 = 2^13 / 35・17・31・29・27・5 = 8192 / 72212175 = 0.000113... 

そんなもんでした\(^o^)/

2020年5月20日水曜日

T先生との対話(オンラインで学生の顔出しさせるべきか問題)

双方向リアルタイムなオンライン講義では,学生のプライバシー配慮を重視して,学生顔出しNGという方針が主流のようですね.それに関して,先日,T先生とした対話が面白かったので記録しておきます(T先生には転載の許可を得ています.句読点を揃えるなど,若干,手を加えていますが,基本的にはそのまま二人の対話を以下に引用します).

飯尾淳: プライバシー保護の重要性もわかりますけど,この問題,話すほうの人権はどうなっているんだ!ドンッ!(←机を叩く音)という観点も重要だと思っています.皆さん,反応ナシの画面に向かって,どうやって「自分の声がちゃんと相手に伝わっている確信」を持てているんだろう?私だけポンコツで,他の皆さんは超能力を持たれているのだろうか.



T先生: Zoomの場合は必要ならば拍手やサムアップのボタンでリアクションしてもらいます.真っ暗な画面にポツポツと拍手やサムアップが示されると「みなさんありがとう!その拍手やサムアップがとっても励みになりますよ」と語りかけたりしてます(笑).伝わらない事(これは「事」というかむしろ「相手」なのかもしれませんが)は,相手が見えても見えなくてもあまり伝わる気がしませんので,さらにできる事は極力質問を投げやすくすることくらいでしょうか.その意味で,学生の顔出しにはこだわらなくなりました.

飯尾淳: それは,やってるんですよね.意識して.最初に「〇〇なひと,手を挙げるボタンで手ぇあげて」って.でも,長いことネット使ってると(もう30年以上になりますね……)ネットの回線って基本的に信用してないので,大丈夫かなー,大丈夫かなー,って,途中でも気になっちゃって.途中から,誰も聞いていない虚空に向かって話しかけているという構図になってしまっていないか,不安に苛まれてしまうのです.

T先生: 「ネットの回線って基本的に信用してない」これわかります.技術的にも相手方の(最終的には)人としての条件においても,考えだすと不安しかありませんね.その意味で私もまさに顔出しのない画面を見て「虚空」だと直観して面食らいました.その上でなんですが,教室内でも目の前に学生がいながら同じように「虚空」だなぁと思ったりすることもあることを思い出し(これは私の力量ゆえですが……苦笑),技術的な工夫の余地はいろいろあるにせよ,私自身のパフォーマンスは通常の授業とたいして変わらないと思うようにしています.

飯尾淳:対面で虚空に向かって云々は,なんかデリケートなところに触れてしまいそうなので置いておくとしてw ネットを信用していないメンタリティっていうのは,若かりし頃の経験によるものなのです.昔,AFS(Andrew File System)なる,理念こそ壮大だったものの,それはそれは不安定なシステムがありましてですね,/home 以下がAFSでマウントされていたため(世界中のどの研究所からでも,ログインすれば同じ環境ですぐに作業できる,という目的だったと聞きました),これがしょっちゅう落ちていて「あー今日もAFS落ちてる,昼まで何もできんじゃんよう」っていうことがしばしば.そんなこんなでローカル至上主義者が1人できあがり,ってな寸法です.


T先生: AFSは「聞いたことがある」だけなんですが,そんな感じだったんですね.何かとローカルに置きたくなる習性って自分も昔はあったんですが,最近だんだん薄れてきました.やはり私のほうがキャリアが浅い分,トラウマの絶対量が少ないのでしょう(笑).対面で虚空は,それはもう……(爆

ブックカバーチャレンジ・第2週

第2週めをまとめます.

第8日

あれれ?本の紹介は終わったはずじゃあ…… ルール無視,天邪鬼が本領発揮というところでしょうか.気が変わったので今日もやります.

故・阿佐田哲也の「Aクラス麻雀」です.今読み返すと,むむ?そう?と思うところも無きにしもあらずですが,青春時代のバイブルでございました(そんな学生時代を送っていた人物がいまや学生に対して「ゲームに耽溺して時間を無為にすごすなよー」とか言っているんだから臍で茶が沸くとはまさにこのことか)

阿佐田哲也といえば「麻雀放浪記」も傑作です.坊や哲,ドサ健,チン六,出目徳…… 個性的なキャラクターに痺れますな.これももう,何度読み返したことか.

明日はハードボイルド小説のお話でもしますかね(7日じゃ,足りません)

第9日

しつこく本の紹介です.飽きるまでやるよ.

というわけで昨日の予告通り,今日はハードボイルドからの1冊です.原りょう(←漢字が出ない)か藤原伊織か悩みましたが,世紀の寡作作家,原りょうのデビュー作を紹介します.「そして夜は甦る」.次作の「私が殺した少女」のほうが有名かな?私立探偵沢崎が活躍するハードボイルドの世界.チャンドラーとか好きな人だったらぜったいハマるはず.和製ハードボイルドとバカにすることなかれ.調べたら2年ほど前に久しぶりに新作が出てました.読まねば.

藤原伊織も根強いファンが多い作家ですよね.「テロリストのパラソル」は読んだことがある人もいるのでは?「てのひらの闇」もヨイ.たいへん残念なことに十数年前に亡くなってしまいました.もっと読みたかった.遺作となった作品は途中で話が終わってしまってなんだかモヤモヤした記憶があったんだけど,いま,ググって調べてみたら,そうでもないみたい.なんか私,勘違いしてるかなあ.

ハードボイルド成分がだんだん薄れてくるけど,東直己もヨイ.「探偵はBARにいる」シリーズは,映画化されたほどのメジャー作品,ススキノ探偵シリーズ,面白いよね.

明日は,再び海外の翻訳モノから.SFのオススメ本を思い出したので……(もはや古典ですが,10年ほど前に新訳が出て,読み返した本です.さあ,何でしょうか?)

第10日

新訳版が10年ほど前に出た古典的名著というのは,ロバート・A・ハインラインの「夏への扉」でした \(^o^)/

このお話は,SFでもあり青春小説でもあり,とにかく爽快な読後感をはっきりと記憶しています.読んだあと幸せな気持ちになることは保証します.オススメ.

本書に出てくる重要なキャラクターである猫のピート,東京FMでこの春までやっていた「ピートのふしぎなガレージ」(しばらく聴かないでいたら,終わっちゃったのね.残念)のタイトルは,本作品へのオマージュなんですよ.あのラジオ番組も,タイムマシンで過去へ戻ってどうこう,という設定でした.先日,タイムリープものが云々という話をしていて,ああそういえば「夏への扉」も紹介しておかねばなあと思った次第です.

明日は,そうですね,今まで取り上げてこなかったジャンルで,ジュブナイルから!(何だと思いますか?)

第11日

ジュブナイルからのオススメは,角野栄子の「魔女の宅急便」でした( Mitzyuki Imaizumi さん,大正解!)

ジュブナイルなのか?っていう疑義が出ましたが,まあ,ジュブナイルということにしといてください.古典的名作と思ってましたが,初版は1985年なんですね.まあ,35年前なら十分に古典といってもいいかな?

このシリーズ,全6巻あって,実はジブリのアニメ映画になったのは最初の部分だけです.そして,後半が面白い.キキが大人になって,結婚して(誰と?そりゃ,あの人ですよ),子供も産まれて,と,物語は進んでいきます.人生の酸いも甘いも噛み分けた大人が読み返すと,いや,大人にこそ読んでほしい.楽しめますよ.

いつもなら魔法使い繋がりで関連書籍を紹介するところですが,いま思い出しちゃったファンタジー本は,ここでしれっと紹介するにはもったいないので,明日,稿を改めて紹介します.翻訳モノですが,たいへん面白い.さあ,わかるかな?

第12日

もう何日目かわからなくなった本の紹介シリーズ,本日は海外のファンタジー本を紹介します.

ITギョーカイ人が楽しめるファンタジーとは,シャンナ・スウェンドソンの「ニューヨークの魔法使い ㈱魔法製作所」およびこのニューヨークの魔法使いシリーズです.この本,本当に楽しい.

「BOOK」データベースの紹介文には「おしゃれでキュートなファンタジー,魔法版『ブリジット・ジョーンズの日記』」とあります.「ブリジット・ジョーンズの日記」も面白い話ですが,ああいうのが好きなヒトにはもう絶対にオススメ.

ええとしこいたオッサンがラブコメの紹介と嗤うなかれ.読後,幸せな気分になれる本です.シリーズ物なので,しばらく楽しめますよ.

明日は,ちょっと変わったタレント本を紹介します.タレント本?うーん,まあ,マイナーだけど,著者はいちおう芸能人,なんでしょうねえ.

第13日

タレント本と呼んでいいのか微妙なところではありますが,芸人の書いた本で皆さんにオススメしたいのは,サンキュータツオの「ヘンな論文」です.続編の「もっとヘンな論文」も合わせてどうぞ.

このサンキュータツオという芸人,TVであまり見ないのが残念ではありますが,早稲田大学で博士後期課程まで学んだ(学位はとってないのかな)という超高学歴タレントです.まあ,身近にも学位持ってるパントマイマーひとりいるけど.

タレント本といえば最近読んだなかでは南キャンの山里の「天才はあきらめた」はわりと面白かった.オードリー若林のも面白かったけど,山ちゃんのほうがよく書けてた.

さて,明日は超マイナーな小説です.コンゲームものです.たぶん誰も知らないかも?でも私は大好きで,これまで何度となく読み返しています.3編の小説が収録されていて,そのうちのひとつは映画化されてるから,ひょっとしたら知ってるひと,いるかな?

第14日

さて,コンゲームものといえば,谷俊彦の「東京都大学の人びと」です.とうきょうとだいがく,ではありません.ひがしきょうとだいがくのひとびと,です.

東京都大学の人びと,駱駝市役所の人びと,木村家の人びとの3編が収録されています.木村家の人びとは映画化もされました.いわゆるコンゲームものですが,みみっちいコンゲームなのが素晴らしい.とっても面白いお話で,オススメです.

東京都大学の人びとは,鬼教員と不良学生のカンニング戦争が描かれます.カンニングを題材にした映画,Amazonに出てる書影のオビには「That'sカンニング!」という映画(達也主演だって!当時はまだTOKIOに達也が!ってのはまた違う話 ^^;)が出ていますが,有名どころでは仏映画の「ザ・カンニング[IQ=0]」(1980年)でしょうねえ.これ,私まだ小学生でしたが,父に連れられて映画館で観た憶えがあります.教育上よろしくないと思う.どんな父親や.

まあ,カンニングって数年前…… というかあれ2011年だったのか,月日が経つのは早いなあ,の京大入試知恵袋事件みたいに事実は小説よりも奇なりを地でいく事件があったりして,いろいろ面白いもんですな(などと大学教員がしみじみしていてはイケマセンね)

2020年5月19日火曜日

ペンタブ,やっぱり便利

オンライン講義実施のために自腹で安めのペンタブを導入したら,そこそこ便利だったという話は以前にも報告しました(ペンタブの活用例).動画講義中,ホワイトボード代わりに利用するという方法も使い勝手は悪くないし,そうではなくちょっとしたコンテンツを作るときも便利に使えるということで,重宝しています.

以下の例は,LMSの課題で提出された,ある学生の質問に関してコメント欄で答えている様子ですが,テキストだけでくどくどと説明するより,よっぽど情報を伝えやすい.まるで,研究室に質問に来た学生に対して,ホワイトボードの前で説明しながら回答しているような気分で説明できます.

OneNoteの1ページに,あらかじめ座標軸を描いておいて,それを呼び出してそこに落書きする,というワザも憶えました.なんか,自分がどんどんと進化していく気がする.バッドノウハウなのかもしれないけど……



2020年5月18日月曜日

簡易SNSを作ってみよう(16)

管理画面の作成
現在のバージョンでは,データの管理にはコンソールから操作するか,データベースを直接いじらなければならない.不適切な投稿があったときに削除できるように,管理画面を用意する.
Administrateのインストール
管理画面を簡単に作ってくれるgemであるAdministrateをインストールする.以下の手順でルーティングの設定まで自動でやってくれる.なお,そのままだとエラーが出るため,設定ファイルに若干の追記を行う.
【手順】
vi Gemfile
(以下を追記)
gem 'administrate'

bundle install
bin/rails g administrate:install
vi config/initializers/assets.rb
(以下を追記)
Rails.application.config.assets.precompile += 
    %w( administrate/application.js administrate/application.css )

bin/rails assets:precompile
Administrateのテスト
サーバを起動し,http://localhost:3000/adminにアクセスする.管理画面が出てきたらOK.

アクセスコントロール
このままだと誰でも管理画面にアクセスできてしまうので,下記の修正を行い(とりあえずは)先生だけが管理画面にアクセスできるようにする.

【手順】
vi app/controllers/admin/application_controller.rb
(以下を追記)
module Admin
  class ApplicationController < 
Administrate::ApplicationController
    before_action :authenticate_admin

    def authenticate_admin
      # TODO Add authentication logic here.
      redirect_to '/', alert: 'Not authorized.' \
        unless current_user && current_user.role == 'teacher'
    end

    # Override this value to ...
    # on index pages. Defaults to 20.
    # def records_per_page
    #   params[:per_page] || 20
    # end
  end
end

管理画面のカスタマイズ
このままでは管理画面が見づらいので,ちょっとしたカスタマイズを行い見やすくする.
【手順】

vi app/dashboards/user_dashboard.rb
(以下を修正)
class UserDashboard < Administrate::BaseDashboard
  # ATTRIBUTE_TYPES
  # a hash that describes the type of each of the model's fields.
  #
  # Each different type represents an Administrate::Field object,
  # which determines how the attribute is displayed
  # on pages throughout the dashboard.
  ATTRIBUTE_TYPES = {
    posts: Field::HasMany,
    visits: Field::HasMany,
    id: Field::Number,
    #email: Field::String,
    #encrypted_password: Field::String,
    #reset_password_token: Field::String,
    #reset_password_sent_at: Field::DateTime,
    #remember_created_at: Field::DateTime,
    #created_at: Field::DateTime,
    #updated_at: Field::DateTime,
    username: Field::String,
    fullname: Field::String,
    password: Field::Password,
    role: Field::String,
  }.freeze

  # COLLECTION_ATTRIBUTES
  # ...
  # Feel free to add, remove, or rearrange items.
  COLLECTION_ATTRIBUTES = %i[
  id
  username
  fullname
  posts
  ].freeze

  # SHOW_PAGE_ATTRIBUTES
  # an array ....
  SHOW_PAGE_ATTRIBUTES = %i[
  id
  username
  fullname
  role
  ].freeze

  # FORM_ATTRIBUTES
  # an array of attributes that will be displayed
  # on the model's form (`new` and `edit`) pages.
  FORM_ATTRIBUTES = %i[
  username
  fullname
  password
  role
  ].freeze

ページネーションの表示が崩れているのでそれを修正する.Bootstrap4対応のKaminariではなくdefaultのKaminariファイルを必要とするので,quick hackではあるが一度そのファイルを生成してAdministrate用に置いたあと,再度,Bootstrap4に合わせたページネーション用ファイルを生成するということをやる.
【手順】

bin/rails g administrate:views:index
vi app/views/admin/application/index.html.erb
(以下を追加)
<%= paginate resources, views_prefix: 'admin' %>

bin/rails g kaminari:views default -f
mkdir app/views/admin/kaminari
mv app/views/kaminari/* app/views/admin/kaminari/
bin/rails g kaminari:views bootstrap4

Administrateのテスト(2)
サーバを起動し,http://localhost:3000/admin にアクセスする.user000でログインしたとき「のみ」管理画面にアクセスできることを確認する.

学生も教員も混乱中?

ちょっとした話題です.どの大学でもオンライン講義が始まったようで,もう日本全国,いや世界中で,学生も教員もひたすら試行錯誤の毎日ではないかと想像します.そんななか,ちょっと気付いたことが2点あり,学生への注意喚起も兼ねて,次のようなアナウンスを流しました.


「記録は全部,残ってんで?」という話は,脅してもしょうがないし,と思ってはいたものの,少し目に余る感じを受けるようになってきたので,つい,書いてしまいました.

学生も大変だし,教員も大変だし,でも,ここで得た知見をうまく反映させられれば今後の教育価値も上がるだろうし,とまあ,ポジティブシンキングで捉えるしかないかなあ.

2020年5月17日日曜日

オンライン講義のスタイルその2(動画投稿方式)

いろいろなスタイルでのオンライン講義を試している.今回,紹介する方法は,講義動画を事前に収録してそれを配信するスタイルである.こちらも反転授業に近い感覚で実施している.

動画配信方式の手順

動画配信方式は,次の手順で実施している.
  1. 事前に講義動画を収録しておく
  2. 1週間前にそれを配信し,1週間のうちに課題を提出させる
  3. 現状はリアルタイム講義をやっていないので,寄せられた質問には都度フィードバックする
先般紹介したラジオ方式よりは,シンプルなやり方かもしれない.なお,作成する動画はなるべく細切れにして,編集はしない.失敗したら取り直すくらいの細切れ加減でちょうどよい.

当初,LMS(manaba)の50MB制限に引っかからないようにと10〜15分で刻んだのが功を奏した.その後,manabaの制限が10MBと厳しくなったためYouTubeに移行したが,それでも長い動画はYouTubeでも制限があるようなので,このサイズが妥当と考える.

1コマぶん延々と動画を見させられるのは苦痛,という指摘がある(もっとも,それに対しては「停止ボタンの使い方を教えて差し上げろ」といった意見もあり,もっともだと思う).動画は細切れにして,間に,小テストやLMSの様々な機能を入れ込む工夫があるとよいようである.

動画配信方式のメリット・デメリット

さて,先般と同様,その得失を考えてみたい.まずは,メリットから.

なんといっても講義動画は資産として残り,しばらく使いまわせそうだという点が最大のメリットと考えられる.対面講義ができるようになったら,資産として残った動画で事前に予習させ,講義時間内には質問に重点的に答えたり,あるいは応用・発展的な話題に触れたりというような,反転授業に移行することができそうである.やりたくてもなかなか実現できなかった反転授業への大きな足がかりになりそうという点で大きなメリットを感じている.

教育効果についても,まあこれは動画配信方式に限ったことではないが,LMSを用いたやりとりで熱心な学生には重点的かつきめ細やかな指導ができるという点で,その効果に期待ができる.もっともこれは諸刃の剣で,教員の負担がかなり高い.私がしんどい.どれだけ頑張れるか,これも程度問題ではあるので,落とし所をどこにするかが問われそう.

デメリットはやはり,対面の講義ではないので,話す方も聴く方も「疲れる」という課題がある.これって慣れれば多少は解決するのかなあ.対面の講義では,受講生の顔色を伺って,分かったかな?難しかったかな?などと調整しながら喋っていたことを実感する.やはり,人に向かって喋るのとカメラに向かって喋るのでは,基本的なスキルが異なる,ということを痛感させられる.

また,やはり準備が大変だ.だいぶ慣れてきて時間を短縮できるようになってきたとはいえ,当初は1コマぶんの動画を準備するのに半日かかった.教員の負担感をなんとかして軽減する必要があるだろうなあ.作り込めば作り込むほど学生の理解度や満足度は高くなるだろうが,悩ましいところではある.

動画を提供するので,通信量的な問題があるという点もデメリットだろうか.ただ,これについては「そのぶんヘンなYouTuberの動画みるの少しは我慢しろよ」とも言いたくなる.幸いにして私のいる学部は情報系でBYODに対応するようにと学生に指示しているので,ギガ不足のような問題はほぼ発生しなかった(「ごめんなさい自分の使い方が悪いんですぅ」と反省の弁を述べつつ改善を誓った学生が1人だけいたらしい).

その他の工夫

その他の工夫として,ペンタブレットを導入したこと,その効果は大きかった.まあ,これは講義の内容にもよるだろうが.この方式を取り入れた講義は数学なので,グラフや数式など,適宜,落書きができる必要があった.

最初は白板に書いて動画を撮影してみるなどの工夫をしてみたが,自宅で動画を撮影せねばならないことになり白板の使用は断念した.やむなく,比較的安価なペンタブを買ってきておそるおそる使ってみたところ,なかなかよい.これまで食わず嫌いで手を出さなかったことが悔やまれるレベルだった.


2020年5月15日金曜日

オンライン講義のスタイルその1(ラジオ方式)

オンライン講義がだいぶ軌道にのってきて,なんとなくリズムも出てきた.現在は,講義の内容や対象によって,いろいろと使い分けてみているところ.せっかくなので,そのメリットとデメリットとともに,整理してみたい.

ラジオ番組方式

以前,ラジオ番組方式のオンライン講義として紹介したもののその後である.手順を再掲する(多少,アップデートしている).
  1. 事前に翌週の資料をLMSで提示し「教科書の対応箇所を読みながら紐解け」と指示する
  2. それに対して,わからないところ,深く理解したいところなどを簡単なテキスト形式のレポートとして提出させる
  3. 講義実施の前日に,それらに対して簡単な返答を書く
  4. 実際のオンライン講義では「質問が多かったところを重点的に」説明する
事前の資料提示は,有りものの資料があるので,それをそのままアップする.もちろん,その資料には要点しか書かれていないので,学習の理解を深めるには,教科書を読み込めるかどうかがカギとなる.

学生が出してくる質問の粒度は様々だが,ときどき,かなり突っ込んだ質問をしてくる学生がいる.それに対してひとつひとつ答えるのは大変だが,こちらにとっても楽しい作業でもある.

受講者は100人ほどいるので,3の返答書きは,力の入れ具合が難しい.念入りにやると相当に時間をとられてしまうので,肩の力を抜いて,「それについてはオンライン講義で説明するから」でよい.同じような質問が重なるところもある.それは定型文をコピペで許してもらおう.

オンライン講義実施時の注意事項

オンライン講義の実施時に注意することは,資料は画面共有で共有するものの,基本的に「それを見ていなくても理解できる」ように喋ること.コレとかソレとか資料のココ,というような指示は使わないように注意する.図の説明をするときも,できるだけ日本語で説明しながら,聴いているだけで分かるように喋る.

ときとして脱線してくだらない話題を入れたり,チャットなどを利用して学生に意見を書かせたりという変化を入れることも必要かも.なにしろラジオのDJは「それではここでリクエスト曲を……」と休憩できるが,こちらは曲を入れて休憩するわけにいかないので.

以前の計画では,前半説明,休憩を挟んで,後半は質問に答える時間としようとしたが,それはやめた.理由は2つ.まず質問をアレンジする手間がけっこうたいへんなこと.それと,説明のなかに質問に対する返答を入れてしまうほうが,円滑に時間が流れるから.

なお,4のオンライン講義は諸事情によりZoomを使ったリアルタイム配信をしているが,大学によってはそれが不可能なこともあるかもしれない.その点は,非同期の動画配信方法や,場合によっては映像を使わない方法でも代替できるだろう.

メリットとデメリット

メリットは,学生の理解が深まる作用が期待できること.これが一番大きい.事前に質問に目を通すので,だいたいどのあたりを難しいと感じているのかが分かる.したがって,事前の独学だと理解できてないだろうなーという点にアタリをつけることができる.そのあたりを重点的に説明すれば,学習効果は高まるはず,ということは誰でも思いつくだろう.

そして対面よりも学生との絆が深まりそうだということ.なにしろ学生との接点が,オンラインの通話と質問のやりとりくらいしかない.しかも前者は,こっちは顔出ししてるのに,学生の顔は基本的には見えてないので,一方向でしかない.しかし,質問やコメントのフィードバックを読む限りは,学生の満足度も悪くなさそうな感触を得られている.お世辞でも「丁寧な説明で理解できました」とか「面白かった」とかのコメントが書かれてくると,教員冥利に尽きる.

デメリットは,やはりどうしても手間がかかってしまうことかなあ.今までの対面講義に,反転学習のいいところを取り入れたスタイルになっているので,これは対面講義が再開したとしても使える手法で,高い学習効果は期待できそうな反面,教員の負担はこれまでより高くなる.もうへとへとで,今回限りと割り切って頑張っているけれど,毎回このスタイルを続けるのはかなり覚悟がいりそうだ.


ブックカバーチャレンジ・第1週

誤解されてる人もいるみたいなので冒頭で明記しておくと,本の紹介,それ自体を否定しているわけじゃないの.チェーンメール的な情報伝播の方法に苦言を呈しているだけであってね(まあ,それを読み取れない皆さんが私の主張を勘違いして批判されてるので,そういうのは放っておく).

というわけで,本の紹介をひたすらしている昨今,ここにもまとめておくことにします.まずは第1週,どうだったか.

第1日

7日間自分の本を宣伝していいっていうチャレンジが回ってきたよ!ぜひお買い求めください.飯尾淳,「情報を集める技術・伝える技術」

おっと,私の自著,7冊もなかった orz

※ このときは,まさかずっと続けるとは思っていなかったのですが……


第2日

一部のかたの心証を害したお詫び,というわけでもありませんが,何名かの方から,チェーンメール的拡散はともかくとしてお前のオススメ本は何なんだ?とのリクエストを受けましたので,しょうがないなー,じゃあ2冊めを……(1冊めは既に紹介した自著ということで)

何がいいかなーと少し悩んで選んだ本はコレ.アンドリューハントの「達人プログラマー」です.ITギョーカイに従事する者は必読の書かと.私は,技術書を読んでいてフムフムと感心したところに付箋を付けながら読む癖があるんですが,読後,付箋だらけになった本のひとつです.残念ながらいま手元にありません.

明日は筒井康隆から1冊を.さあ,何でしょうw

第3日

さて,筒井康隆からの1冊は「文学部唯野教授」です!中野先生のコメント,大当たりでした
\(^o^)/

筒井康隆ご本人にとってはこんな読まれ方をするのは本意ではないでしょうが,なかで唯野教授に語らせている文学論の部分はぜんぶスキップしちゃっても問題ありません.それよりも大学内部のドタバタが面白い.マジかよ…… と荒唐無稽に思える描写が,意外と大学のなかではフツーにあったりする,あっ,何をするくぁwせdrftgyふじこlp

ついでなので,大学での仕事,ちゃんとしたことを知りたい方には,今野浩先生の工学部ヒラノ教授シリーズとか,最近は錯視でずいぶん有名になられた杉原厚吉先生の「大学教授という仕事」あたりをオススメします.

明日は海外の作品を紹介します.これはさすがに分からないデショ.

第4日

さあ,7冊の本を紹介するアレ,本日は海外作品からです.Daniel Keyesの,Flowers for Algernon.日本語訳版のタイトルは「アルジャーノンに花束を」ですね.

叙述トリック?っていうんでしょうか,ミステリーじゃないので,トリックっていわないか.まあ,小説,という形態を最大限に活用した傑作ですね.日本語訳でもうまいこと翻訳していて感心させられます.同様のアイデアによる作品はいくつかありますが,先般紹介した筒井作品にも似たようなアイデアによる「残像に口紅を」がありますね.筒井作品ではそれ以外にも「虚人たち」や「虚航船団」みたいな実験小説が大好きなんだけれども,そういうのは読み手を選ぶかもしれません.

ペーパーバックといえば他にもMichael ClaytonとかPKDとか,そのへんの有名どころは比較的読みやすいので英語の勉強にもなるし良いですね.同じマイケルでも,いちどMichael F. Mooreに手を出したらスラングばっかりで読めなかった orz
/(^o^)\

さらに話が脱線して叙述トリックの代表作といえば乾くるみの「イニシエーション・ラブ」を紹介したい.こちら,映像化不可能と言われていたのに数年前に映画化されました.いったいどうやって?と興味津々で映画館に足を運んだのを憶えています.ネタバレになるので詳しくは書きませんが,感心させられました.最後の5分間に流されたネタバラシは不要だと思ったけど,商業映画の悲哀とでも言いましょうか,「分からない人向け解説」ってのも付けてあげないといかんのでしょうなあ.「イニシエーション・ラブ」に限らず,乾くるみ作品は,いろいろと仕掛けがしてある作品が多く,往年の筒井康隆に迫る面白さ(そういうの好きな人向け)があるのでオススメです.

えー,7冊といいつつ勝手に何冊も何冊も紹介しているこのシリーズ,明日は再びコンピュータ書籍に戻ります.ガチンコです(なーんだ?)

第5日

さて7日間にわたり本を紹介するアレ,今日,何日目だっけ?5日めか.今日を入れてあと3回ですね.昨日,「明日はまたコンピュータ書籍です」と宣言してました.というわけでコレ.オライリーの「UNIXパワーツール」
\(^o^)/

宣伝文句から引用します.「UnixユーザによるUnixユーザのための技と知識の集大成と呼ぶにふさわしい1冊」だそうですよ.WindowsもとうとうWSLなんて仕組みを組み込んできたし,あとはドライブレターなんていう概念を捨ててちゃんとマウントさせるようにして,パスの区切りも正しい方向に直して…… 本の紹介から脱線するのでこのへんでやめときます.

Unix布教本としては他にも「Unixという考え方―その設計思想と哲学」「UNIXの1/4世紀」あたりに感銘を受けました.前者は文句なくオススメ.後者は面白いけどちょっと読みにくい.リーナスの「それがぼくには楽しかったから 全世界を巻き込んだリナックス革命の真実」も面白かった.これら,いずれも2000年前後くらいの本ですね.あのころ,私もまだ若くて,感情移入が激しかったかも.最近この手の本出てないですかね?出てたら知りたい.教えてください.

本書の紹介に戻ります.この本,なにがすごいって1,400ページです.もう鈍器.十分,武器になります.同類の書籍としては,すぽっすぽっ先生※の「ストラウストラップのプログラミング入門」とか「プログラミング言語C++ 第4版」とかも.いずれも千ページ越えてて,もう,頭大丈夫?としか.私が2012年に出したCの本も500ページ越えててずいぶん分厚くなっちゃったなあ,と反省したものですが,もう,あちらのかたは「厚けりゃ厚いほど( ・∀・)イイ!!」と考えてるとしか思えん.せめて上下巻,上中下巻にせえよw

と,いうわけで,次回は文庫版全6巻のアレです(このヒントでたぶんわかる人にはわかるはず).満を持しての登場ですよ.

※ 「すぽっすぽっ」については「びゃーね・すぽっすぽっ」で調べてみてください

第6日

はい,本の紹介チャレンジ,第6日めは「深夜特急」です.推薦文は…… 紹介するbookコラムを読んでください(手抜きィ)

遅いデビューというか,仕事で東南アジアをウロウロするようになってアジアの面白さに気付いたので,学生時代にバックパック担いで,ってなわけにいかなかったのがたいへん残念.そして今となっては自宅で蟄居生活,もう,だいぶ我慢が限界に来てるよ?

かのコラムでは,下川裕治の貧乏旅行本なんかも紹介しています.そういや冒険譚といえば早稲田大学探検部出身の,高野秀行による冒険本もかなり脱力系なのでオススメです.「ワセダ三畳青春記」とか「腰痛探検家」とか(それって世界を股にかける冒険本じゃないじゃん!比較的本格派なものとしては「幻獣ムベンベを追え」とか「アヘン王国潜入記」とか,そんな探検モノもあるので,そういうのがお好きなかたはそっちをどうぞ).

そういえばワセダで思い出した.最近は読んでないけど「東京物語」を読んで奥田英朗にハマった時期がありました.田舎から東京に出てきて東京でもがく若者を描くところに,つい,自分を重ねてしまうんですよねえ.奥田英朗も「最悪」だの「邪悪」だの,重〜い本もヨイですけど,伊良部シリーズとか,平成の家庭シリーズとか,「噂の女」とか,軽い作品も楽しい.感動したければ「サウスバウンド」が良いですよ.

最終回は漫画から.かなりの変化球を予定しているので,これ当てたら凄い.

第7日

はい,7日間本を紹介するシリーズ,最終日の本日は漫画から「地底人の逆襲」です.ほぼ,ビーンボール.

漫画も素晴らしいものがたくさんあるので迷いました.が,やっぱりいしいひさいちは天才やと思う.がんばれタブチくん,おじゃまんが山田くんなど,素晴らしいシリーズは他にもありますが,あえての「地底人対最低人」を紹介したい.

なおこの投稿には,現在の社会に巣食う最低人たちをなんとかしたいなどという社会的・政治的メッセージは全く込められておりません.誤解なきよう.

これでオシマイです.(→続きもあるよ)

2020年5月13日水曜日

簡易SNSを作ってみよう(15)

データダウンロード用APIの作成
隠し機能として,データダウンロードAPIを用意しておく.ネームスペースとしてAPIという別空間を用意しておき,そのなかでデータダウンロード用の手続きを実装する.

【手順】
vi config/routes.rb
(以下を追加)
Rails.application.routes.draw do

…(略)…
  namespace :api, { format: 'json' } do
    resources :users, :only => [:show]
  end
end

mkdir app/controllers/api
vi app/controllers/api/users_controller.rb
(以下を作成)
class Api::UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    ary = [@user]
    ary.push(@user.posts)
    render json: ary
  end
end

このようにしておくことで,ユーザーごとの投稿データをJSON形式でダウンロードできるようになる.アクセスは,http://localhost:3000/api/users/{id}でよい.ブラウザからアクセスして確認してみること.
本来はデータ保護のため,ログインしないとアクセスできないようにしておくべき(before_ action authenticate_user! をきちんと書いておく)だが,プログラムからの一括ダウンロードを可能にしたいので,とりあえずはこのままにしておく.

簡易SNSを作ってみよう(14)

ページネーションの導入
投稿が多くなるといろいろと問題が発生する,1画面に大量の投稿を表示するわけにはいかない.また,大量の投稿を処理するための時間がかかってしまいシステムのレスポンスが低下することも問題である.そこで,複数のページに分割することを考える.これをページネーションという.
ページネーションは,Kaminariというgemを使うと簡単に実現できる.
Kaminariのインストール
ページネーションを簡単に作ってくれるgemであるKaminariをインストールする.

【手順】
vi Gemfile
(以下を追記)
gem 'kaminari'

bundle install
bin/rails g kaminari:config

vi config/initializers/kaminari_config.rb
(以下を修正.とりあえず8件ずつ表示することにする)
# frozen_string_literal: true

Kaminari.configure do |config|
  config.default_per_page = 8
  # config.max_per_page = nil
  # config.window = 4
  # config.outer_window = 0
  # config.left = 0
  # config.right = 0
  # config.page_method_name = :page
  # config.param_name = :page
  # config.max_pages = nil
  # config.params_on_first_page = false
end

vi app/controllers/users_controller.rb
(以下を追加)
class UsersController < ApplicationController
  before_action :authenticate_user!

  def show
    @user = User.find(params[:id])
    @posts = Post.where(user_id: @user.id).order('created_at desc')
    @posts = Kaminari.paginate_array(@posts).page(params[:page])

…(略)…
vi app/views/users/show.html.erb
(以下を追加)
<% if @posts != nil %>
   <% l = @posts.length; @posts.each_with_index {|post, i|
…(略)…
           <div class="card-body">
                <%= simple_format(h(post.body)) %></div>
    </div>
   <% } %>
   <br />
   <%= paginate @posts %>
   <br />
<% end %>


最後に,見栄えをよくすべく,Bootstrap4に対応させる.

【手順】
bin/rails g kaminari:views bootstrap4
ページネーションのテスト
いずれかのStudentユーザーでログインして,9件以上のメッセージを投稿してみよう.図8のようなページネーションのコントロールが出てきたらOK.

簡易SNSを作ってみよう(13)

ページ参照を用いた「新規投稿」の表示
Teacherロールでログインしたときに,参照記録を辿って,ページを参照した日時よりも新しい投稿があった場合には,配列@updated_usersに入れるようにする

【手順】
vi app/contorollers/users_controller.rb
(以下を追記)
 def show
   @user = User.find(params[:id])
   #@students = ... 削除
   @posts = Post.where(user_id: @user.id).order('created_at desc')

   visit = current_user.visits.find_by(visitee: @user.id)
   if (visit != nil)
     visit.touch
   else
     current_user.visits << Visit.create(visitee: @user.id)
   end

   if @user.role == 'teacher' then
     @students = User.where(role: 'student').order('updated_at desc')
     @updated_users = []
     current_user.visits.each {|v|
       st = @students.find_by(id: v.visitee)
       next if st == nil
       @updated_users.push(st.id) if \
(Post.where(user_id: v.visitee)
            .where(updated_at: v.updated_at ... Time.now).size > 0)
     }
   end
 end

さらに,Viewも変更し,@updated_usersのユーザーは警告色で表示されるようにする.

【手順】
vi app/views/users/show.html.erb
(以下を修正)
<h1>MyPage for <%= @user.fullname %></h1>
<% if @students != nil %>
  <p>
   <% @students.each {|st|
      color = @updated_users.include?(st.id) ?
        'btn btn-warning' : 'btn btn-light' %>
   <%= link_to st.fullname, user_path(st.id), class: color %>
   <% } %>
  </p>
<% end %>
…(略)…

初期データとしてTeacherロールによるVisitを作成しておく必要があるため,db/seeds.rbを修正して,データを再構築する(以下はローカルのサーバを想定.Herokuの場合は後述の手順で実施すること).
vi db/seeds.rb
(以下を追記)
names.each_with_index {|name, i|
  uid = sprintf "user%03d", i
  User.create(username: uid, fullname: name, password: '123456', 
                role: ((i == 0) ? 'teacher' : 'student'))
  Visit.create(user_id: 1, visitee: (i+1))
}

bin/rails db:drop
bin/rails db:create
bin/rails db:migrate
bin/rails db:seed
「新規投稿」の確認
サーバを起動し,Studentロールの適当なアカウントでログインしたのち幾つかのコメントを投稿してみる.しかるのちに,Teacherロールのアカウント(user000)でログインして,新規投稿のあるユーザーがハイライト表示されていることを確認する.

「新規ユーザー」の対応
ところで,この実装だと,新規ユーザーを作成し,そのユーザーが投稿したときに,うまくハイライト表示にならないという問題がある.なぜならば,ハイライト表示させるかいなかを,投稿がポストされた時刻とVisitエントリの比較で判断しているが,新規ユーザーにはVisitの記録がないためである.そこで,新規ユーザー登録されたときに,TeacherロールでダミーのVisitが行われるように,処理を追加する.

【手順】
vi app/controllers/users/registrations_controller.rb
(以下の該当部分をコメントアウトして追記)
class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]
  before_action :configure_account_update_params, only: [:update]

  # GET /resource/sign_up
  # def new
  #   super
  # end

  # POST /resource
  def create
    super
    teachers = User.where(role: 'teacher')
    teachers.each {|t|
      t.visits << Visit.create(visitee: current_user.id)
      # 上は Visit.create(user_id:t.id, visitee:current_user.id) と同じ
    }
  end

…(略)…
動作確認
サーバを起動し,新規ユーザー登録,そのユーザーで投稿する.一度ログアウトしてTeacherロールのユーザー(user000)でログインしなおして,該当ユーザーがハイライト表示されていることを確認せよ.