はてなキーワード: 整数とは
割りとマジだよねと思う出来事をふと思い出したので書いてみる。
といっても後輩が俺の思ってもいないところでつまづいて、それに俺がカルチャーショックを受けたというだけの話。
問題の話なんだけど、とある有名サービスのJSON APIを叩いて呼び出し結果を手元のオブジェクトにマッピングするというただそれだけのコードを書くというもの。
普通に考えて一日もしないで出来ると思うような代物だけど、三日以上悩んで彼はそれでも出来なかった。
{ ..., "count": 10000000000000000000000000000000000000, ...}
という感じで多倍長整数がリテラルとして書かれているのを前提として受け取る仕様だった。
JavaScriptの通常の整数と違って、JSONの整数リテラルは仕様上大きさの制限の記載がないので、上のようなのも合法。
で、彼の使ってたプログラミング言語のオブジェクト から JSONの変換ライブラリが、多倍長整数を文字列("")としてシリアライズするような仕様なことがわかって、彼は行き詰まった。
そこで何をやり始めたかというと、JSONの整数がそのまま1000000000000000みたいにシリアライズされるライブラリ探し始めたんだけど、それは見つからないまま。
というわけで「増田さん、詰まってるんですけど……」と言われて助け舟出すことになったはいいものの、彼のコード見るとJSONの抽象構文木クラスがそのまま使えるようだった。
なので、
String serialiaze(Ast.JsValue value) { return switch(value) { case Ast.JsNull nullValue-> "null"; case Ast.JsInt bigIntValue -> bigIntValue.toString(); case Ast.JsArray arrayValue -> arrayValue.stream().map(v -> serialize(v)).collect(Collectors.joining(", ", "[", "]")); // 他のJSONの木についても同様に処理 default -> throw new RuntimeException("cannot reach") }; }
1時間しない内にこんな感じのコード(言語はJavaじゃなかったけど、だいたいこういう感じ)を書いて無事問題解決。細かいタイポとかあるかもだけど、日記では確認してないのでそれはおいといて)。
結局、JSONの形が期待と違って、しかも既存のAPIじゃいいのがなかったのに延々API探すことしか出来なかったのが問題解決できなかった原因だけど、このくらいのは割りとちょこちょこある。
きっと、それから一週間放置しても問題解決できなかっただろうし、どうも同じチームの同僚も問題を解決できなかったようだった。
最近、APIは叩けるけど、そこでトラブルとどうにもならなくエンジニアにちょくちょく遭遇するんだけど、やっぱりもうちょっと基礎出来てないと駄目だなと思った出来事だった。
自動で安価をつけて返信するプログラムでもこんなに長く複雑になる(一部抜粋)
/**************************************
以下のCSV_DIR, FILE_PATHS, SETTINGSを書き換えてね。 <h3>o- *************************************/</h3>
//CSVファイルが置かれてるディレクトリのパス。投稿前にエラー出たら大体ここの設定ミス。 例:"C:\\Users\\sakuraimasahiro\\Documents\\iMacros\\Macros\\rentou\\";
'C:\\Users\\USER\\Desktop\\iMacros\\Macros\\rentou\\';
//ファイルのパス。CSVは絶対パスで、拡張子も必要。iimは相対パスでよく、拡張子不要。
const FILE_PATHS = {
textCsv: CSV_DIR + 'textNoAnker.csv',
//レス用投稿文が書かれたCSV。通常とレス用で分けないなら同じファイルを使えばいい。
replyTextCsv: CSV_DIR + 'textReply.csv',
};
baseWaitTime: 5,
//baseWaitTime+0~waitTimeRange(ランダム)だけ待つ
waitTimeRange: 5,
//連投しすぎだと忠告された場合に処理を一時停止させる時間(秒)
waitTimeForAvoidingPunishment: 60 * 30,
//メール
mail: 'sage',
//名前設定
name: '',
//以下、偽装ワッチョイ設定。浪人でワッチョイを非表示にしてるときだけtrueにしてね。
//妙なニックネーム(ワッチョイ、アウアウウーなど)をランダムで決めて付加するかどうか。true=付加する。false=付加しない。
//妙なニックネームの後に付く8桁の文字列をランダムで決めて付加するかどうか。
},
//アンカー無し投稿をするならtrue。しないならfalse。noAnkerPostかreplyPostのどちらかはtrueにすること(両方trueでもOK)。
//アンカー付き投稿(返信)をするならtrue。しないならfalse。もしnoAnkerPostとreplyPostの両方がtrueの場合、投稿は返信が優先され、返信対象が見つからなくなったらアンカー無し投稿をする。
//最初に取得するアンカー無し投稿文CSVファイルの行番号。もし返信用と同じCSVファイルを使うなら-1と入力。
noAnkerPostTextCsvStartRow: 1,
//最初に取得する返信用投稿文CSVファイルの行番号。もしアンカー無しと同じCSVファイルを使うなら-1と入力。
//テキストCSV/返信用テキストCSVの取得行が最終行に達したら最初の行まで戻るかどうか。true=戻る。false=マクロ終了。
//返信する場合、これより小さなレス番には返信しない。返信を投稿すると、この数値は前回の返信先のレス番に更新される。
minAnker: 895,
//返信する場合、名前に以下の文字列を含む投稿にアンカーをつけて返信する(ワッチョイやIPなど名前フィールドにあるものならなんでも可)。配列で複数指定可能。指定無しなら空配列([])。filterNamesとfilterNamesNotIncluded共に無指定ならレス番1から順に返信していく(minAnkerが設定されてればそこから順に)。以下のfilter系は全て併用可能。
//↑とは逆に、名前に以下の文字列を含まない投稿にアンカーをつけて返信する。↑と併用も可能。
//返信する場合、本文に以下の文字列を含む投稿にアンカーをつけて返信する。
filterText: ['自演かな', '自演わらわら', 'スクリプト使うの', '安価ガバ', '>>660', '自演で擁護', '最後' ,'あいうえお', 'かきくけこ', 'さしすせそ', 'なにぬねの', 'はひふへほ', 'まみむめも', 'やいゆえよ', 'やゆよ', 'らりるれろ', 'わいうえを', 'わをん', 'わいうえをん'],
},
//自分のIPアドレスの確認。VPNとかでIPを変更してマクロを動かしてるとき、突然VPNが作動しなくなってIPが元に戻ったときにマクロを止めるためのもの。
//以下の文字列が自分の現在のIPアドレスに含まれている場合、マクロを一時停止する。基本的に自分の本当のIPアドレスを入力。
},
//浪人設定。最後に動作を確認したのは5年くらい前で、今も同じように動作するかは、浪人を持ってないから確認できずわからない。
//浪人にログインしてるかどうかをチェックするかどうか。trueならする。falseならしない。trueにしていてもし浪人にログインしていないことを確認したらログインしにいく。
password: '1234',
},
};
/**************************************
設定箇所終わり。
https://info.5ch.net/index.php/%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E6%97%A9%E8%A6%8B%E8%A1%A8 <h3>o- *************************************/</h3>
/**************************************
・NULL演算子(??)は使えない。論理積(&&)は使える。
・オブジェクトの分割代入はできない。
・importはできない。 <h3>o- *************************************/</h3>
/**************************************
関数 <h3>o- *************************************/</h3>
/**
* ここから始まる。
*/
checkSettings();
var _TextCsvCursors = new TextCsvCursors(
SETTINGS.postSettings.noAnkerPostTextCsvStartRow > 0
? SETTINGS.postSettings.noAnkerPostTextCsvStartRow - 1
: SETTINGS.postSettings.noAnkerPostTextCsvStartRow,
SETTINGS.postSettings.textCsvLoop,
),
SETTINGS.postSettings.replyPostTextCsvStartRow > 0
? SETTINGS.postSettings.replyPostTextCsvStartRow - 1
: SETTINGS.postSettings.replyPostTextCsvStartRow,
SETTINGS.postSettings.textCsvLoop,
),
);
var _LoopStatuses = new LoopStatuses(0, SETTINGS.postSettings.minAnker);
const _MyPosterName = new MyPosterName({
name: SETTINGS.nameSettings.name,
});
const _ThreadUrl = openPromptThreadUrl();
//ループ
while (true) {
SETTINGS.ipSettings.checkIp && checkCurrentIpNotTheIp();
//スレを開く
openUrl(_ThreadUrl.fullUrlHttps());
//浪人にログインする設定なら、浪人にログインしているかどうかを確認し、していなければログインしにいく。
if (SETTINGS.roninSettings.checkLogin) {
}
}
if (SETTINGS.postSettings.replyPost) {
const targetAnkerNumber = createPostDOMList()
.filterPostnumberHigher(_LoopStatuses.currentMinAnker())
.filterByPostername(SETTINGS.postSettings.filterNames)
.filterByPosternameNotIncluded(
SETTINGS.postSettings.filterNamesNotIncluded,
)
.filterByText(SETTINGS.postSettings.filterText)
if (targetAnkerNumber !== null) {
const r = _TextCsvCursors.takeNextRowTextAsReply(targetAnkerNumber);
messageDisplay(`返信対象有り。アンカー先: ${targetAnkerNumber}`);
return {
...r,
updatedLoopStatuses:
_LoopStatuses.updateMinAnker(targetAnkerNumber),
};
}
}
if (SETTINGS.postSettings.noAnkerPost) {
//返信対象無し、或いは返信しない設定の場合。アンカー無し投稿文を作る。
const r = _TextCsvCursors.takeNextRowTextAsNoAnker();
messageDisplay('返信対象無し。アンカー無し投稿。');
return {
...r,
updatedLoopStatuses: _LoopStatuses,
};
}
return null;
})();
if (p) {
//投稿。
nickname: SETTINGS.nameSettings.nickname,
korokoro: SETTINGS.nameSettings.korokoro,
area: SETTINGS.nameSettings.area,
}),
SETTINGS.mail,
p.text,
);
//_TextCsvCursorsと_LoopStatusesを更新。
_TextCsvCursors = p.updatedTextCsvCursors;
_LoopStatuses = p.updatedLoopStatuses.incrementPostCount();
`投稿回数: ${_LoopStatuses.currentPostCount()}`,
`minAnker: ${_LoopStatuses.currentMinAnker()}`,
`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,
`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,
]);
} else {
`返信対象が現われるのを待機中...。`,
`投稿回数: ${_LoopStatuses.currentPostCount()}`,
`minAnker: ${_LoopStatuses.currentMinAnker()}`,
`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,
`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,
]);
}
wait(SETTINGS.baseWaitTime + randomRange(0, SETTINGS.waitTimeRange));
}
}
/**
* 投稿処理と投稿結果を見てリトライしたりマクロ終了したり。
* @param {string} serverName サーバー名
* @param {MyPosterName} _MyPosterName
* @param {string} postMail メール
*/
serverName,
postMail,
_MyText,
retryTimes = 0,
) {
const r =
retryTimes === 0
? new ValuesOfPost(serverName, _MyPosterName, postMail, _MyText).post(
postTo5chTread,
)
serverName,
postMail,
_MyText,
).postSubstring(retryTimes, postTo5chTread, postConfirm);
if (r) {
back();
return;
}
wait(7);
const error = createPostErrorMessage().analyze();
messageDisplay(error.message);
if (error.order === 'KILL') {
kill();
} else if (error.order === 'SKIP') {
return;
} else if (error.order === 'TRUNCATE') {
back();
serverName,
postMail,
_MyText,
retryTimes + 1,
);
} else if (error.order === 'WAIT') {
wait(SETTINGS.waitTimeForAvoidingPunishment);
serverName,
postMail,
_MyText,
retryTimes,
);
} else if (error.order === 'LOGIN') {
serverName,
postMail,
_MyText,
retryTimes,
);
}
return;
}
/**
* 現在のIPアドレスに、SETTINGS.ipSettings.avoidTheIpの値が含まれていないことを確認する。含まれていたらマクロを一時停止。
* @returns
*/
function checkCurrentIpNotTheIp() {
openUrl('https://www.cman.jp/network/support/go_access.cgi');
const _IpAdress = createIpAdressFromCMan();
if (_IpAdress.includes(SETTINGS.ipSettings.avoidTheIp)) {
pause('現在のIPに指定した値が含まれていることを確認。');
}
return;
}
/**
* @returns
*/
if (
SETTINGS.postSettings.noAnkerPost === false &&
SETTINGS.postSettings.replyPost === false
) {
return kill('設定エラー。noAnkerPostとreplyPost両方ともfalseになってる。');
}
if (
SETTINGS.postSettings.noAnkerPostTextCsvStartRow < 0 &&
SETTINGS.postSettings.replyPostTextCsvStartRow < 0
) {
return kill(
'設定エラー。noAnkerPostTextCsvStartRowとreplyPostTextCsvStartRow両方とも-1になってる。',
);
}
if (
SETTINGS.postSettings.noAnkerPostTextCsvStartRow === 0 ||
SETTINGS.postSettings.replyPostTextCsvStartRow === 0
) {
return kill(
'設定エラー。noAnkerPostTextCsvStartRow/replyPostTextCsvStartRowの初期値は-1或いは1以上で。',
);
}
}
/**
* 入力フォームを表示して入力されたスレのURLを受け取る。
*/
function openPromptThreadUrl() {
const url = prompt('スレURLを入力');
}
/**
* 開いてるスレのレス全て読み取ってPostListインスタンスを作って返す。
* 重すぎるので使うのやめ。どうやらインスタンスの大量生成が原因な模様。
*/
const posts = window.document.getElementsByClassName('post');
return new PostList(Array.from(posts).map((e) => new Post(e)));
}
/**
* 開いてるスレのレス全て取得してPostDOMListに格納して返す。
* @returns
*/
function createPostDOMList() {
const posts = window.document.getElementsByClassName('post');
for (let index = 0; index < posts.length; index++) {
//HTMLCollectionからElementを1つずつ抽出して配列に。
arrPostDOMList.push(posts.item(index));
}
return new PostDOMList(arrPostDOMList);
}
/**
* 開いてる投稿結果画面に表示されてるエラーを読み取ってPostErrorMessageインスタンスを作って返す。
*/
function createPostErrorMessage() {
window.document
何を重視するかは多少変わると思うが、落ちぶれるデメリットを無視して書いてみる
1. 高校受験をしなくて良いので、中学で内申点を気にせずに過ごせる、つまり中高の、6年間、成績を気にしないで、まとまった時間をもてることで、本当に没頭したいことに没頭できる時間を作れる
2. 1は、勉強以外の意味で書いたが、勉強に関しても、先取りで勉強できるので、大学受験で有利なのは言うまでもないが、中学受験で、算数をしていることで、整数問題とか確率とかそういうのに抵抗がなくなっていることがむしろ大きく、難関大学の数学に有利
なるべく軽い方法で三つの異なる数字を求めたい(例123、526)言語はJavaScript
今はLoop文で
1つ目をランダムで出す
2つ目をランダムでだし、1つ目と値が同じなら、5以上ならー1,5以下なら+1(10とかー1にはしたくないため)
3つ目は12と比べてどっちかと同じなら上と同じ処理ってやってるけど、そうなると手を加えた後にどっちかと同じ値になる可能性がでてきそう
Loopで全部の桁をそれぞれチェックするってやつは処理回数が多いからあまり使いたくない
じゃあ最初から数学でよくありそうなそれぞれの桁で値がことなる3桁のランダムな数字を求めるのが一番効率いい処理なんじゃないかと思ったけど数学がわからない
つまり、組合せを計算する際の分子は必ず分母で割りきれるわけ。
これって、誰も言わないけど、かなり驚きのことだと思う。
例えば、10×9×8×7×6が5×4×3×2×1で割りきれるかって考えてみてほしいんだけど、計算しないですぐわかる?
直感的にはわからないじゃん。でもこれって、10C5の分子と分母だから、割りきれるわけですよ。
他にも、111×110×99×98×97×96×95が7×6×5×4×3×2×1で割れるとか、わからないでしょ。
すごさがわかったよね?
すなわち、組合せnCrって、任意の整数nから下に連続するr個の整数を、r×r-1×…×2×1で割った値だけど、
こんな変な割り算が、自然数nとrがどんな値でも常に整数になるなんて驚き!!
マジすごくない?
マジですごいと思うのに、誰も感動してないから、教養の殿堂たる増田に書き込んでみたよ!
(追記)
ちょっと証明してみるかーと思ったら思いの外手こずった。ググったらパスカルの等式っていうのが出てきてこれがわかれば帰納法でいけるのか。この等式自体もなかなか面白い
なるほど。
パスカルの三角形ってやつで、一番上が整数だから下側は全部整数になるってわけか。
厳密な証明をするまでもないよ。
7個の数字が並んでいたらどこかに7で割れる数字が混じっている。n個の数字が並んでいたらどこかにnで割れる数字が混じっている。
いやいや、重複があるかもしれないじゃん。
この説明もわかりやすいとは思ったんだけど、証明としてはダメなのかな?
ほんとそれ。整数論的にちゃんと証明するにはルジャンドルの定理的な考察が必要。
分からない人は高校数学の美しい物語の記事: https://manabitimes.jp/math/589 を見て、どうぞ。
国立大受験、共通テストにプログラミング…25年から「情報」追加で6教科8科目に
https://www.yomiuri.co.jp/kyoiku/kyoiku/daigakunyushi/20220128-OYT1T50158/
https://www.asahi.com/articles/ASQ1X7S36Q1SUTIL01M.html
国立大協会、共通テストに「情報」追加 25年以降、6教科8科目に
https://mainichi.jp/articles/20220128/k00/00m/040/332000c
2022年4月に高校に入学した生徒を対象にした大学入学共通テストから教科情報の試験が追加されることはもう決まっていたのだが「そんなのわざわざ受けるやついるの?」とならないように、文科省と入試センターが布石をうった結果としての国立大学の入試での必須化だと思う。
これについては、私立大学には強制できるスキームがない(補助金をちらつかせればできるかもしれないが)のと、地方の高校などにその衝撃波が届くように、だと個人的に思っている。
ぶっちゃけ首都圏などは、高校の情報教員は余ってはいないが足りてはいるが、地方では情報教員の採用をまだ実施していない県もあれば、ようやく始めてまだ数名しかいないという県もある。
そんな情報教員の採用に消極的な地方での、高校のKPIの一つに国公立大学への合格者人数というものがある。教育委員会によっては、特定の進学校に助成金みたいなのを出して、進学実績をさらに上げさせようとしている県もあると思う。そんななか情報をきちんと教えられる教員がいないと、国立大学に不利になるよ、というのは地方の高校や教員区委員会への圧力になるのである。
「急すぎるじゃないか」とお怒りの校長とかもいるだろうけど、受験には関係ないからという言い訳で、教育委員会が教員も採用してこなかったり、未履修問題のように高校が勝手に情報をやらずに他教科に置き換えて授業を潰していたりしたことが、結果としてスマホしか使えない大学生を大量生産してきたのではないだろうか?
高校の情報という授業は実は2003年に高校に入学した生徒から必修科目となっている(正確には必履修科目)。ということで教科が出来てからもう20年近くになる。
商業高校や工業高校は別として、全ての普通科で必修の教科が「ドーン」と爆誕したのがその年だったのだが、文科省の失政を今の今まで引きずっていたのだった。
それまでにない教科(情報処理に類する科目は無かったわけじゃないが)が誕生するということは、教える人が新たに必要となるということである。
それが全国何千校の普通科の高校で急に始まるのである。まあ、時代で必要だったのでそれはしょうがないと思うが。
大学の教員養成課程で、一気に何千人も情報科教員を輩出できるわけではないので、現職の教員に講習を行って新たな免許を持たせることにした。
まずは意識高い教員に、現職講習の講師役となるための研修を行い、育成された講師たちが各都道府県で現職教員にたった15日間の講習で「教科情報をもう教えられるよ」ということにした。
しかも希望した受講者だけ目標ノルマ人数にとても足りず(講習を受けられる教科に縛りを付けた失策があり、そもそも希望しているのに受けられなかった教員もいる)、各学校で肩たたきのように希望しなくても免許を取りに活かされた数学や理科、家庭科の教員が多数いるというわけである。
これを時限的な教員免許とすれば、大学で情報の教員免許をとった新しい教員がどんどん入ってきたのだが、いかんせん恒久的な免許だったのだ。
あと教員免許更新があるじゃないかと思われるかもしれないが、免許更新はどの教科で更新するとかはなくて、文科省が認めている免許更新の講座だったら何の教科の内容でもいいし、生徒指導でもレクリエーション論でも何でもアリなのだ。一気に全部の免許の有効期限が延びる仕組みである。
情報処理学会は、教科情報の内容で更新講習をやってはいるが、知名度は高くないようである。
そんな石器時代のような人たちが令和の時代に、「情報とは」と教えている現状があるから、それを刷新したいという文科省の意図もあったような気がする。
恒久免許をいまから取り上げるわけにもいかないし、全て定年退職するまで待っていたら日本が沈没するのが加速するだけである。
学習指導要領という教科で教える内容が決められる教育界の法律みたいなものがあって、だいたい10年に1度のペースで改訂される。
最初の情報は、情報A、B、Cという科目があり、いわゆる町のパソコン教室的な内容でも教科の内容をけっこう満たしてしまうものであった。
とはいえ、TCP/IPやWWW、DNSの概略や、アルゴリズム、知財などの法規は当時から教科書に載っていたのであるよ。
その次の世代の学習指導要領で、「社会と情報」「情報の科学」の2つに再編され、今の高校1年生の代まではこれを勉強している。2年後に高3で始めて習う生徒もいるかもしれないが。
今度の4月からの入学生では、情報1に一本化されて、全ての高校生が共通の範囲を勉強している(これが大事)はずなので入試に出しても良いよね、と出来たわけである。
それまではどれかだけ勉強したら卒業はOKという扱いで複数科目あったので。
今年の1年生が浪人して1個下の代と一緒に国立大学を受けると、他教科の試験は移行措置で現行科目の試験が用意されるのだが、情報は今の科目での出題がないからどうするの?という問いかけが国立大学協会からあった。さっきの複数科目の問題があって浪人生に強要できるのかよーという問題だったのだが、文科省&入試センターは強気に「社会と情報か情報の科学か、どっちかだけでもやっていれば100点分になる問題をその年だけ新たに設置するので、無問題」という回答により、国立大学の入試必須化が正式に決まった。
情報1にはプログラミングだけではなく、問題解決の考え方、情報デザインとコミュニケーション、データサイエンスの基礎などが入っている。
ちなみに、情報2という科目もできて、数学みたいに1をやったあとでなければ2を勉強できない、より高度な内容になっている。物理基礎に対する物理みたいな。
データサイエンスといえば聞こえがよいが、それよりちゃんとした統計を学ばせるのが先じゃね?と思う人も多いと思う。
実は数学1で統計の内容が必須化して10年経つのだが、10個や20個の整数を手計算で計算して、分散・標準偏差・偏差値を出してたり、相関係数と散布図くらいしか届かない、「紙の上で鉛筆でやる意味があるのか?」という内容である。センター試験や共通テストでは奇をてらうことが難しい分野だったが、今年の共通テストはやらかした。
次の学習指導要領では数学教育者と統計教育者のバトルなどがあって、それも興味深いのだが、それはまた別のお話。
劇薬ではあるが、かわいい生徒たちの志望大学進学という、餌をつるされた教員たちの良心で今まできちんとした情報教育を受けることができなかったかもしれない地方の高校生が報われるようになるといいと思っている。
あ、あと入試改革すると、企業が儲けるために結託しているんじゃないかと思う方もいるかと思うが、情報1にからめてうちは底辺校と呼ばれる学校なのだが、プログラミング教材とかの売り込みはかなり来るし、ベネッセはすでに高校情報1のオンライン教材の売り込みをガンガンやっている。東進ハイスクールも情報の講師を確保しているようである。
なので「教える教員がいない、地方を見捨てるのか!」となった場合は、ベネッセやら東進の高校向け教材でもやらせてお金で解決してください。
国立大受験、共通テストにプログラミング…25年から「情報」追加で6教科8科目に
https://www.yomiuri.co.jp/kyoiku/kyoiku/daigakunyushi/20220128-OYT1T50158/
https://www.asahi.com/articles/ASQ1X7S36Q1SUTIL01M.html
国立大協会、共通テストに「情報」追加 25年以降、6教科8科目に
https://mainichi.jp/articles/20220128/k00/00m/040/332000c
2022年4月に高校に入学した生徒を対象にした大学入学共通テストから教科情報の試験が追加されることはもう決まっていたのだが「そんなのわざわざ受けるやついるの?」とならないように、文科省と入試センターが布石をうった結果としての国立大学の入試での必須化だと思う。
これについては、私立大学には強制できるスキームがない(補助金をちらつかせればできるかもしれないが)のと、地方の高校などにその衝撃波が届くように、だと個人的に思っている。
ぶっちゃけ首都圏などは、高校の情報教員は余ってはいないが足りてはいるが、地方では情報教員の採用をまだ実施していない県もあれば、ようやく始めてまだ数名しかいないという県もある。
そんな情報教員の採用に消極的な地方での、高校のKPIの一つに国公立大学への合格者人数というものがある。教育委員会によっては、特定の進学校に助成金みたいなのを出して、進学実績をさらに上げさせようとしている県もあると思う。そんななか情報をきちんと教えられる教員がいないと、国立大学に不利になるよ、というのは地方の高校や教員区委員会への圧力になるのである。
「急すぎるじゃないか」とお怒りの校長とかもいるだろうけど、受験には関係ないからという言い訳で、教育委員会が教員も採用してこなかったり、未履修問題のように高校が勝手に情報をやらずに他教科に置き換えて授業を潰していたりしたことが、結果としてスマホしか使えない大学生を大量生産してきたのではないだろうか?
高校の情報という授業は実は2003年に高校に入学した生徒から必修科目となっている(正確には必履修科目)。ということで教科が出来てからもう20年近くになる。
商業高校や工業高校は別として、全ての普通科で必修の教科が「ドーン」と爆誕したのがその年だったのだが、文科省の失政を今の今まで引きずっていたのだった。
それまでにない教科(情報処理に類する科目は無かったわけじゃないが)が誕生するということは、教える人が新たに必要となるということである。
それが全国何千校の普通科の高校で急に始まるのである。まあ、時代で必要だったのでそれはしょうがないと思うが。
大学の教員養成課程で、一気に何千人も情報科教員を輩出できるわけではないので、現職の教員に講習を行って新たな免許を持たせることにした。
まずは意識高い教員に、現職講習の講師役となるための研修を行い、育成された講師たちが各都道府県で現職教員にたった15日間の講習で「教科情報をもう教えられるよ」ということにした。
しかも希望した受講者だけ目標ノルマ人数にとても足りず(講習を受けられる教科に縛りを付けた失策があり、そもそも希望しているのに受けられなかった教員もいる)、各学校で肩たたきのように希望しなくても免許を取りに活かされた数学や理科、家庭科の教員が多数いるというわけである。
これを時限的な教員免許とすれば、大学で情報の教員免許をとった新しい教員がどんどん入ってきたのだが、いかんせん恒久的な免許だったのだ。
あと教員免許更新があるじゃないかと思われるかもしれないが、免許更新はどの教科で更新するとかはなくて、文科省が認めている免許更新の講座だったら何の教科の内容でもいいし、生徒指導でもレクリエーション論でも何でもアリなのだ。一気に全部の免許の有効期限が延びる仕組みである。
情報処理学会は、教科情報の内容で更新講習をやってはいるが、知名度は高くないようである。
そんな石器時代のような人たちが令和の時代に、「情報とは」と教えている現状があるから、それを刷新したいという文科省の意図もあったような気がする。
恒久免許をいまから取り上げるわけにもいかないし、全て定年退職するまで待っていたら日本が沈没するのが加速するだけである。
学習指導要領という教科で教える内容が決められる教育界の法律みたいなものがあって、だいたい10年に1度のペースで改訂される。
最初の情報は、情報A、B、Cという科目があり、いわゆる町のパソコン教室的な内容でも教科の内容をけっこう満たしてしまうものであった。
とはいえ、TCP/IPやWWW、DNSの概略や、アルゴリズム、知財などの法規は当時から教科書に載っていたのであるよ。
その次の世代の学習指導要領で、「社会と情報」「情報の科学」の2つに再編され、今の高校1年生の代まではこれを勉強している。2年後に高3で始めて習う生徒もいるかもしれないが。
今度の4月からの入学生では、情報1に一本化されて、全ての高校生が共通の範囲を勉強している(これが大事)はずなので入試に出しても良いよね、と出来たわけである。
それまではどれかだけ勉強したら卒業はOKという扱いで複数科目あったので。
今年の1年生が浪人して1個下の代と一緒に国立大学を受けると、他教科の試験は移行措置で現行科目の試験が用意されるのだが、情報は今の科目での出題がないからどうするの?という問いかけが国立大学協会からあった。さっきの複数科目の問題があって浪人生に強要できるのかよーという問題だったのだが、文科省&入試センターは強気に「社会と情報か情報の科学か、どっちかだけでもやっていれば100点分になる問題をその年だけ新たに設置するので、無問題」という回答により、国立大学の入試必須化が正式に決まった。
情報1にはプログラミングだけではなく、問題解決の考え方、情報デザインとコミュニケーション、データサイエンスの基礎などが入っている。
ちなみに、情報2という科目もできて、数学みたいに1をやったあとでなければ2を勉強できない、より高度な内容になっている。物理基礎に対する物理みたいな。
データサイエンスといえば聞こえがよいが、それよりちゃんとした統計を学ばせるのが先じゃね?と思う人も多いと思う。
実は数学1で統計の内容が必須化して10年経つのだが、10個や20個の整数を手計算で計算して、分散・標準偏差・偏差値を出してたり、相関係数と散布図くらいしか届かない、「紙の上で鉛筆でやる意味があるのか?」という内容である。センター試験や共通テストでは奇をてらうことが難しい分野だったが、今年の共通テストはやらかした。
次の学習指導要領では数学教育者と統計教育者のバトルなどがあって、それも興味深いのだが、それはまた別のお話。
劇薬ではあるが、かわいい生徒たちの志望大学進学という、餌をつるされた教員たちの良心で今まできちんとした情報教育を受けることができなかったかもしれない地方の高校生が報われるようになるといいと思っている。
あ、あと入試改革すると、企業が儲けるために結託しているんじゃないかと思う方もいるかと思うが、情報1にからめてうちは底辺校と呼ばれる学校なのだが、プログラミング教材とかの売り込みはかなり来るし、ベネッセはすでに高校情報1のオンライン教材の売り込みをガンガンやっている。東進ハイスクールも情報の講師を確保しているようである。
なので「教える教員がいない、地方を見捨てるのか!」となった場合は、ベネッセやら東進の高校向け教材でもやらせてお金で解決してください。