教育学習とICT関心有り人向けマストドン

教育学習ICT分野のマストドンを立ち上げました。

年中行事になってるサーバー見直し作業のついでに、Twitter後継のSNSツールとして注目を集めつつあるMastodon(マストドン)の独自インスタンス(独自サーバー)を立ててみました。

単なるプライベートMastodonを作るのでは意味もないので、インスタンスの趣向として「教育とICTに関心のある人達向け」ということにしました。まだ実験段階なので学校の先生方や業界の関係者を中心に入っていただいて、いろいろ試してもらってからじわじわと広がってもらえたらと思っています。

ちなみに「elict-mastodon」(エリクト・マストドン)と名乗っています。いまのところelict.netというアドレスで開設中です。ちなみにEducation & Learning with ICTが由来です。教育でのICT活用についてはもちろん、情報活用やプログラミング等の教育学習についてもトゥート(書き込み)し合えればと思います。

私のマストドンアカウントは kotatsurin@elict.net となります。

構築のこと。

Mastodonは、個人単位でのインスタンス構築も可能ですし、そういう使い方もありですが、むしろ関心グループ単位で構築するのに向いてるかなと思います。

Mastodonインスタンス構築には、必要なソフトウェア等がパッケージングされた「コンテナ」を導入して動作させるDockerというプラットフォーム環境を利用するのが比較的簡便な方法です。レンタルサーバーを借りるなどして、Docker環境とMastodonコンテナをインストールしてインスタンスの出来上がりというわけです。

しかし、elict-mastodonではDockerは使用せず、レンタルの仮想サーバー上に一からMastodonをインストールする方法をとりました。面倒が増えるので特段のメリットはありませんが、サーバー構築の学習やノウハウを蓄積ができるというのが理由です。パッケージングされたものを使う方が便利ですが、少しでも裏側に触れたいと思うのがプログラミング的思考っぽいでしょうか。

個人やグループが構築した方が面白いはずなのですが、そのための敷居がまだまだ高いので、また少しずつ構築の手順について紹介していきたいと思っています。

ちなみに今回のサーバーは、EX-CLOUDというレンタル仮想サーバー(クラウドVPS)と契約したものを使用して、CentOS7というシステムを選択しています。ドメインも同サービスで取得しました。

Elict mastodon

学習指導要領案への私のパブリックコメント

2017年2月14日から3月15日まで学習指導要領案に対するパブリックコメントが募集されていました。

政府側にすれば一か月も期間を取っていますから,時間的に不十分とは言わせないつもりでしょうけれど,年度末近くの一か月は,腰を落ち着けて検討するにはなかなか微妙な時期です。

何より,3月15日締切りで11,210件も集まったコメントを,3月31日告示の学習指導要領案に反映させるための検討や作業が2週間弱で足りたのかどうか。むしろそのことの方が国のやっつけ感を漂わせます。

「時間がないのはお互い様」という共犯関係を何とか打ち破りたいとは思いつつ,締切り間際に出すことになった私のパブリックコメントをこちらに残しておきます。

=====

 「小学校学習指導要領案について」
 
学習指導要領案の作成に関する労を多として以下に意見を述べさせていただく。
 
今回の改訂に関して、中教審答申では「2030年の社会」の「よりよい人生とよりよい社会を築いていくため」、教育課程の在り方を検討し、その背景認識には「急速な情報化や技術革新」による人間生活の質的変化等への対応もあった。よって、今回の小学校学習指導要領(案)では,総則だけでなく,多くの教科で「コンピュータや教育機器」と「情報通信ネットワーク」の活用に関する記述が盛り込まれたと受け止める。
 
しかし,各教科の記述バランスには問題が残る。3点述べる。
 
1)各教科「指導計画の作成と内容の取扱」のうち,算数と理科についてはプログラミング体験の要素を入れるため単元レベルの記述があるが,これは学習指導要領の記述として限定が過ぎるのではないか。
 
2)体育「指導計画の作成と内容の取扱」でのみ,他の教科にはない「その際,情報機器の基本的な操作についても,内容に応じて取り扱うこと。」との文言が記述されていることは記述の統一性および教科としての整合性から見直すべきではないか。
 
3)総合的な学習の時間と特別活動を比較した場合,コンピュータや情報通信ネットワークや情報活用能力等に関するについて,量的な差があり過ぎる。学校の日常的な活動における情報活用能力の醸成を考えるのであれば,特別活動における記述を増やすべきである。
 
以上、ご検討いただき,情報化や技術革新を適切に踏まえた学習指導要領の改訂となることを祈る。
 
===== 

(Facebookには掲載したのですが,タイムラインを休止しているので,こちらに再掲するものです。)

Giroptic iO 届く

360度撮影カメラモジュール「Giroptic iO」が届きました!

開封の様子…

すでに新しいファームウェアが登場しているので最初にアップデートを促されますが、カメラモジュールの充電量が足りないのでお預け。このあと準備ができ次第試してみます。

でも、こうしてiPadでも使えるというのは、Insta 360 nanoにはできない、このカメラの強みですね。しかもカメラモジュール自体で自立するので、ちょっと外して置くときに便利です。

使用報告は後日します。

RでPISA2015〈その2〉

RでPISA2015」というエントリーで、いくつかのWeb記事に触発されて、OECDという国際機関が3年間隔で行なっている国際学力調査「PISA」の2015年実施データを、統計向けプログラミング言語「R」を使って触り始めたことを書きました。

R言語の基礎知識が無いまま、サンプルを見様見真似でデータファイルの読み込みからグラフの描画までやってみましたが、まだまだ未完成状態でした。

その後、R言語のリファレンス書籍を購入した上で、さらにプログラムを修正し、思い描いていたグラフを一通り描けるところまで辿り着きました。

PISA2015_IC013Q12NAのグラフ

作成中気になっていたことの一つとして、PISA2015データを日本語で扱うための情報が、明石書店発行のPISA正規報告書(有償)しかないことがあります。

PISA2015関連の情報については、「PISA2015関連」(ICTのある学び)にまとめておきましたが、日本語版を作成して調査協力をした国立教育政策研究所のWebページでさえ報道機関向けレベルの公表資料が掲載されているだけで、PISAに関する正規の日本語情報は明石書店が契約して発行している日本語版報告書くらいしかありません。

そのため、背景指標を得る質問調査(ICT活用調査を含む)の日本語は、販売されている報告書を手に入れないと知ることができません。いくつかのWeb記事で分析・紹介されている調査結果の質問や回答の文章は、OECDがWebサイトで無償公開している英語版報告書を各自で翻訳している状態です。

PISAの趣旨や目的からすれば、調査結果をもとに各国の教育政策に関する議論が様々に誘発されることが大事であるにも関わらず、日本の場合、どうしても日本語要約された報道発表範囲の限られた話題しか扱われず、それ以外は英語原文か有償の日本語版報告書を得なければならない壁があります。

今回のように調査の生データを処理して視覚化する際も、質問文や回答選択肢文を日本語で表示した方が圧倒的に理解がしやすいわけですが、そのためのリソースはネット上に存在しません。

日本語によるPISA調査作業量の大変さとそれを担われている関係者の労力には敬意を持ちますし、それを踏まえて発行される日本語報告書が有償販売されることは理解できます。ただ、もう少し社会的な議論が進むよう無償部分の情報流通量を増やす努力も必要かなと思います。

少なくとも調査データを自前で処理する際に使えるリソースは欲しいものです。

そこで、プログラム処理する際に使えるようPISA2015における「国別コードと国名」「ICT活用調査の質問文」「ICT活用調査の回答選択肢文」をcsvファイルにしておきました。

国別コードと国名
(csv)http://www.edufolder.jp/files/pisa2015/ISO3166_pisa.csv
(xlsx)http://www.edufolder.jp/files/pisa2015/ISO3166_pisa.xlsx
ICT活用調査の質問文
(csv)http://www.edufolder.jp/files/pisa2015/pisa2015_ICT_Familiarity_Questionnaire.csv
(xlsx)http://www.edufolder.jp/files/pisa2015/pisa2015_ICT_Familiarity_Questionnaire.xlsx
ICT活用調査の回答選択肢文
(csv)http://www.edufolder.jp/files/pisa2015/pisa2015_ICT_Familiarity_Questionnaire_answercode.csv
(xlsx)http://www.edufolder.jp/files/pisa2015/pisa2015_ICT_Familiarity_Questionnaire_answercode.xlsx

(csv形式の方は)UTF-8コードで日本語も含めてありますので、英文と日本文を切り替えて利用するのにも便利です。データ構造の解説は今回省略します(ごめんなさい)。

(修正20170116:「〜」を「-」に修正し,xlsx形式も用意しました。)

ちなみに,OECDが用意しているコード表は「Codebooks for the main files」としてダウンロードページに用意されています。これの日本語版があったらいいのになという感じです。

上記のデータファイルを利用したプログラムを作成してみました。質問番号(と表示順序)を設定したら半自動でグラフが出力されるところまで動くようになったと思います。

設定した質問についてグラフ化するR言語ソースコードは以下が現在の進捗です。今回はファイルやライブラリの読み込み(Base部分)と質問ごとに集計してグラフ描画する部分(ICT部分)を分けてみました。Base部分は最初の一回だけ実行すれば、あとは読込み済みのデータで処理できます。

(追記20170114:macOSでの導入を前提としたスクリプトのため,Windows等の他環境では,日本語フォント指定の部分等について改変する必要あり。)

# For PISA2015 Base (※最新のものが下方のリンクに有り)
# K.RIN

library(readr)
library(haven)
library(ggplot2)
library(plyr)
library(tidyverse)

question_items <- read_csv("pisa2015_ICT_Familiarity_Questionnaire.csv", col_names = TRUE, col_types = list(col_character(), col_character(), col_character()))
answer_items <- read_csv("pisa2015_ICT_Familiarity_Questionnaire_answercode.csv", col_names = TRUE, col_types = list(.default = col_character(), items_count = col_character()))
country_code <- read_csv("ISO3166_pisa.csv", col_names = TRUE, col_types = list(col_character(), col_character(), col_character(), col_character()))

student_raw <- read_sav("Cy6_ms_cmb_stu_qqq.sav")
school_raw <- read_sav("Cy6_ms_cmb_sch_qqq.sav")

pisa2015_base.R (←こちらの方が最新版)

# For PISA2015 ICT (※最新のものが下方のリンクに有り)
# K.RIN
#
# ★設定項目
# ・質問ID(「selected_question = " "」の部分)
# ・表示順序の組合わせ(「mutate('list_order' = `1`)」の部分)

#★質問番号
selected_question = "IC010Q09NA"
selected_question_big = substring(selected_question, 1,5)

#質問文読込
q_title <- paste(question_items$questions_ja[grep(selected_question_big, question_items$questions_no, value = FALSE, fixed = FALSE)][[1]])

#質問文整形
q_width = 39
q_title_disp <- character()
q_title_length <- nchar(q_title)
for(i in 1:q_title_length%/%q_width+1) {
 q_title_disp[i] <- paste(substring(q_title, ((i-1)*q_width+1), ((i-1)*q_width+1)+(q_width-1)), '\n')
}
q_title_disp[i+1] <- paste("\n", selected_question,"\n", question_items$questions_ja[grep(selected_question, question_items$questions_no)])
q_title_all <- paste(q_title_disp, collapse="")

#回答選択肢読込
ans_item_count <- as.integer(answer_items$items_count[grep(selected_question, answer_items$questions_no)])
ans_item_colcount <- as.integer(answer_items$items_count[grep(selected_question_big, answer_items$questions_no)][1])

#回答選択肢設定
ans_limits <- as.character(answer_items[grep(selected_question_big, answer_items$questions_no),][1,3:sum(ans_item_count+2)])
ans_labels <- as.character(answer_items[grep(selected_question, answer_items$questions_no),][1,sum(ans_item_colcount+3):sum(ans_item_colcount+ans_item_count+2)])

#ラベル
y_label <- "パーセント %"
x_label <- "国"
legend_label <- "回答"

#回答データ抽出
stu_tmp <- subset(student_raw, student_raw[[selected_question]] != "NaN")
#scl_tmp <- subset(school_raw, school_raw$[[selected_question]] != "NaN")
country_ans_table <- table(stu_tmp[["CNT"]],stu_tmp[[selected_question]])

#縦長dfへ変換
country_ans_long <- as_tibble(country_ans_table,validate = FALSE)
colnames(country_ans_long) <- c("CNT", "answer", "count")
#横長df版クロス表
country_ans_wide <- spread(country_ans_long, answer, count)

#★表示順序用対象項目設定(回答の場合) `1`+`2`
country_ans_wide <- country_ans_wide %>% rownames_to_column('num') %>% mutate('list_order' = `1`)

#文字から数値にモード変換
mode(country_ans_wide$id) <- "integer"

#国名変換
country_ans_wide <- ddply(country_ans_wide, 'CNT', transform, country_name = country_code$Name_ja[grep(CNT, country_code$Alpha3)])

#表示順序用対処数値設定(ナンバリングの場合)
#country_ans_wide <- ddply(country_ans_wide, num, transform, list_order = num * -1)
#ラベルが"X1"などになった場合も想定して…
colnames(country_ans_wide) <- c("num", "CNT", ans_limits, "list_order", "country_name")

#国名付き縦長df
country_ans_long <- gather(country_ans_wide, answer,count,-num,-CNT,-list_order,-country_name)

#並べ替え
country_ans_long <- arrange(country_ans_long, desc(CNT), desc(answer))

#列名変更
colnames(country_ans_long) <- c("num", "CNT", "list_order","country_name","answer", "count")

#パーセント計算(描画計算用)
country_ict <- ddply(country_ans_long, "CNT", transform, percent = count / sum(count) * 100, 0.1)
#小数点以下1桁処理(表示用)
country_ict <- ddply(country_ict, "CNT", transform, percent_rounded = round_any(count / sum(count) * 100, 0.1))

#リスト順序(パーセント計算)
country_ict <- ddply(country_ict, "CNT", transform, list_percent_order = round_any(list_order / sum(count) * 100, 0.1))

#ラベル位置計算
country_ict <- ddply(country_ict, "CNT", transform, percent_label_y = cumsum(percent)-0.5*percent)

country_ict <- arrange(country_ict, CNT, desc(answer))

#フォントファミリー設定(macOS用)
quartzFonts(HiraKaku = quartzFont(rep("HiraginoSans-W3", 4)))
par(family = "HiraKaku")

#グラフ描画
graph <- ggplot(country_ict, aes(x = reorder(country_name, list_percent_order), y = percent, fill = factor(answer))) + 
 ggtitle(sprintf("%s", q_title_all)) + 
 ylab(y_label) + 
 xlab(x_label) + 
 labs(fill = legend_label) + 
 coord_flip(expand = FALSE) + 
 geom_bar(stat = "identity", position='stack') + 
 geom_text(aes(y = percent_label_y, 
 label = paste(format(percent_rounded, nsmall = 1),"")), color = "white", size = 3) + 
 scale_y_reverse(breaks = c(100.0,75.0,50.0,25.0,0.0), 
 labels = c("0%","25%","50%","75%","100%")) + 
 scale_fill_discrete(limits = ans_limits, labels = ans_labels) + 
 scale_color_manual(values = rainbow(7)) + 
 theme_bw() + 
 theme(plot.margin = margin(1, 1, 1, 1, "cm"), 
 plot.title = element_text(family = "HiraKaku", size = 10), 
 plot.caption = element_text(family = "HiraKaku", size = 10),
 legend.title = element_text(family = "HiraKaku", size = 10), 
 legend.text = element_text(family = "HiraKaku", size = 7), 
 axis.title = element_text(family = "HiraKaku", size = 9), 
 axis.title.y = element_text(angle = 0, vjust = 0.5), 
 axis.text.x = element_text(family = "HiraKaku", size = 9), 
 axis.text.y = element_text(family = "HiraKaku", size = 10)) 

print(graph)

#ggsave("pisa2015_graph.png", graph)

pisa2015_ict.R (←こちらの方が最新版)

紅白歌合戦2016

明けましておめでとうございます。徳島文理大学の林向達です。今年は研究室ブログをもう少し緩く使って更新機会を増やそうと思います。というわけで、今回は昨年末の紅白歌合戦について。

この年末年始も帰省して、実家で過ごしていますが、大晦日の夜は特別なことがない限りテレビをつけています。そして、あれこれ迷いつつも、やはりNHK紅白歌合戦を映してます。

今回の紅白については、たとえば産経新聞がこんな記事を書いています。

「【紅白回顧】「謎の演出」「?」の連続だった第67回NHK紅白歌合戦 これでいいのか、国民的番組」(産経ニュース)

最後の勝敗結果も意外だったということや、随時行なっていたネット投票は意味が無かったのではないかということに批判的な声もあるようです。

私個人の感想は、今回の紅白には実験的な演出が散りばめられていて制作者の皆さん頑張ったな、というものです。もちろん不発ネタもたくさんあったと思います。

たぶんですが、今回の番組構成や内容は、狙って実験的だったというよりは、様々な条件上、そうせざるを得なかった結果なのだと思います。

紅白全体の構成については、あのグループが出演するのかしないのかがギリギリまで読めないことを想定して、かなり柔軟に変更できるようにしなければなりません。

それでいて、詰め込まなければならない要素には、それぞれ独自の調子や雰囲気を持ったものが多く(タモリ、マツコ、シン・ゴジラ、PPAP、恋ダンス等)、これらを活かしながら束ねるのはなかなか難しい話だったと思います。

願わくは全体を通して見て欲しいという制作者側の思いを下敷きに番組を具現化した時、一つのネタやってハイ次っ!ではなく、おそらく今回のように、いろいろな要素を同時並行させて進行する道を選んだのだと思います。

視聴者によるネット投票を毎回の合戦ごとに行なう方式にしたのも、リアルタイムに楽しんでもらおうという意図からだったと思います。

ただ、苦肉ながらも取り組んだこうした試みは、かなり綱渡り的なところも多かったと思います。

同時進行しているネタを細切れにして見せていくためには、お互いの絡み合いをうまく制御しないといけません。何事もなかったかのように振る舞うことでシチュエーション的な笑いを誘ったりすることもあれば、伏線を張るためにわざとらしい演技も必要とされました。リハーサルを繰り返されたのだろうとはいえ、極めてデリケートな積み木だったと思います。シュールだったという評価はそういう演出から来ているのだと思います。

ネット投票が最終得点に加えられなかったのは、不特定多数からの投票で懸念される一部の暴走投票を恐れたからではないかと思います。不正な方法を使って勝敗を左右されてないための選択だったのでしょうし、おそらく、制作者側としては、ネット投票の傾向と会場審査員やゲスト審査員の投票傾向は似ているはずなので、それほど問題ないだろうと思っていたのではないかと推察します。

けれども、現実にはネット投票の進捗とは裏腹な最終結果が出てしまい、制作者側も「やってしまった」と焦ったのだろうと思います。きっと、番組進行中に白組優勢の途中集計結果を見てしまえたことで、ゲスト審査員がバランスを取ろうと紅組に入れた投票が、最終結果に反映されたというのが真相じゃないかと思います。ネット投票や会場審査員の得票との重み関係(ボールの数等)をもっとよく説明しておくべきだったのでしょう。

思うに、今回の紅白歌合戦は、全体を成立させるために頑張って制作されたものの、それがゆえに番組がいったん始まってしまうと、途中乗車するのが難しくなったのだと思います。

こんなことを書いた私自身も、番組を見始めたのは開始後30分ぐらい経過して、iPadで昨年インストール済みの紅白アプリを起動してから、「あ、始まってるのか」と気づいて、なんとなくチャンネルを合わせてからです。つまり、投票システムの説明も、ふるさと審査員の件等も分からないまま途中から視聴を始めました。

やはり最初は訳がわからなかったし、差し挟まれる小ネタの扱い方が雑にも見えたし、「?」なところはありました。今回はどんな演出で番組制作しているんだろうという見方をしなければ、楽しむには至らなかったかもしれません。

長く続いている番組をさらに続けることの難しさを改めて感じましたが、昨年末はいろいろな条件を抱え、実験的であったとしても、その挑戦の成果としてはまずまずだったのではないか。むしろ、番組としてちゃんとやり遂げられたことを考えれば、製作者や関係者の努力は素晴らしかったと思います。