CF

Rust Bevyでelona風ゲームを作ろう(目次のページ)

はじめに

ゲームを作ろうと思い、Rustを手に取りました。 なぜRustかといえば、Rustが使いたかったからです。 なぜBevyかといえば、なんとなくです。

昔流行っていて最近も話題になったElonaみたいなゲームが作りたいですね。

さて、Bevyはまだまだ開発途上 (執筆時点でのバージョンは0.11)で、また記述の方法がバージョンアップごとに結構変わっているようです。

なのでまだまだこれからも変わっていくとは思いますが、とりあえずこのバージョンについて書かれた日本語の記事がなさそうなので、自分の試行錯誤を書いておくことにしました。

記事一覧

Part1:マップチップを読み込んでマップを出力してみる(TBI)

ああCPU実験

理情といえばCPU実験、CPU実験といえば理情です。多分そうです。

書くことが思いつかないのでこれから理情に来る方、もしくはCPU実験が何をやっているのかを知りたいという方向けにCPU実験は大体どんなものであるかということを紹介しようと思います。

概観

そもそも何をするのでしょうか?CPUを作るのでしょうか。誤解を恐れずに言えば、そうです。CPUを作ります。 min-camlという言語で記述されたレイトレーシングプログラムが与えられ、それをFPGAの上で実行するというのが目標です。 即ち、よっぽど変なことをしない限りにおいては、そのmin-camlのコンパイラを作成し、できたアセンブリアセンブルし、そしてそれを解釈するFPGAを作成するというのがCPU実験の全容です。もちろんアセンブリの仕様、ないし機械語の仕様は自由で、既存のRISCVなどを用いてもよいですし、自分で設計しても構いません。 また、外部から入力が与えられないのでは置物ですから、引数などはPCからUARTを用いて与えられます。 それらすべてを一人で行うのは厳しいですから、4人、ないし3人の班でこれを分担します。主にコンパイラを作成するコンパイラ係、FPGAを設計するコア係、FPGAの動くべき動作をソフトウェア的に再現するシミュレータ係、および浮動小数点演算の回路を担当するFPU係に分かれることになります。 この中にはアセンブリを作る係がいませんが、凡そコンパイラ係かシミュレータ係が担当するようです。

お仕事

コア係の仕事

CPUを実装すると言いましたが、FPGAを用いる関係上、はんだごてなどを使う機会はありません。Verilogなどを用いて記述します。自分はあまりこの手の言語に詳しくないのでよくわかりませんが、シミュレーション用の言語であって、一部分がたまたまハードウェアの設計?記述?に使えるらしいという話らしいです。なので時たまかなりプログラミング言語とは思えないほど空気を読む必要が生じるらしいですが、それはきっとコア係になればわかると思います。 何はともあれ、メモリブロックやらを配置し、ALUを作り、デコードして計算してメモリアクセスしてレジスタ書き戻して……な感じのステートマシンを書くみたいです。ハードウェア実験でステートマシン自体は作るしマルチサイクルっぽいこともするので、そこら辺を参考にできそうですね。

コンパイラ係の仕事

コンパイラ係はmin-camlというOCamlのサブセットのような言語のコンパイラを作ります。とはいえ、x86SPARC向けのコンパイラは既に存在しているので、それを改造する形で作成することもできます。もちろんフルスクラッチで作っても構いません。 コンパイラ係は最適化なども含めるとかなりやることが多岐にわたります。そのためか、コンパイラ実験という名前で講義も行われています(コンパイラ係用の課題もありますが全員受けます)。

シミュレータ係の仕事

シミュレータ係は、FPGAがどのように動作すべきかをソフトウェア的に再現します。シミュレータ係の作成したシミュレータと実機の出力が一致することが単位取得の条件とのことなので、「コア係が一発で動かせばシミュレータいらなくね?」は理論的には真ですが単位的には偽です。実用的にも多分偽です。 使用言語は任意です。

FPU係の仕事

FPU係はVerilogなどを用いて浮動小数点演算を実装します。コア係の職掌では?と思う方もいるかもしれません。実際Verilogという意味ではそうなのですが、浮動小数点数計算というのは例えば加算一つ取るだけでも工夫し所があり、予想する以上に深い世界が待っています。夏学期のハードウェア実験のオプション課題の中にFloatの加算を実装するものがありますが、それをやってみれば高速化のための奥深さ、或いはめんどくささが分かると思います。

シミュレータ係の今までしたこと

自分はシミュレータ係なので、全体・シミュレータ係で今やっていること、今までやってきたことを振り返っておきます。

命令アーキテクチャ決め

シミュレータを作るにはまず命令をデコードしなければなりませんから、その規約が必要です。一先ずはRISC-Vに則ることにしました。他の班ではMIPS,自作アーキテクチャなどありました。成果を比較できるのはまだ先になりそうです。

アセンブラを作る

アセンブラはそこまで難しくありません。パースして疑似命令を解してラベルを解消して出力するだけです。しかしその割にバグを生みがちなので、バグを生まないようにアセンブラを自動生成出来たらいいなと思っていた時期もありました。誰かやってください。 アセンブラが動けばシミュレータを動かしだせます。アセンブラを介さずアセンブリを読んで実行するシミュレータを作った班もあるみたいです。確かにそっちのがデバッグ楽かもしれん……(隣の芝が青いだけの可能性もあります)。

動くシミュレータを作る

やっぱりシミュレータが動かないと始まりません。コンパイラの動作が正しいことを確認するにも、コアの動作が正しいことを確認するにもまずはシミュレータが正しい値を返す必要があります。 今回はrustという言語を用いました。あまり触れたことのない言語(夏学期の課題でオセロのAIを作ったのが最初でした)でしたが、何事もチャレンジということで選びました。きちんとコンパイルエラーを出すいい言語です。 後々の拡張を見据え、なるべくコアみたいに動く(フェッチなどの段階を分割しやすくする)ことを意識しました。これはパイプラインを再現するうえで助かりでした。これはいい考えでしたね。

便利なシミュレータを作る

シミュレータはデバッグに用いますから、その時々のレジスタの値やプログラムカウンタの値などを伝える必要があります。中にはGUIまで作っている班があって凄いなぁという感じです。私にはそこまでできなかった。

結合テストをする

コンパイラ係がfibのコンパイルできるよ!って言ってくれたらそれを動かします。シミュレータがバグってる可能性もあるので、シミュレータ係がデバッグするのがいいと思います。 メモをしていない素朴なfibはfib 30の段階で三千万命令ぐらいになります。rust君は早いので余裕です。ちなみにレイトレは数十億命令ぐらいになるらしいので、遅い言語でシミュレータ書くのはやめといたほうがいいかもしれません。 別にfibをやれと言われることはないのですが、再帰が実装できているかどうかはやはりfibが一番単純でわかりやすいということなのでしょう。そのうちコア係がfibを動かしてくれます。デバッグにこの機能ほしいとか言われたら対応しましょ。

そのうちmandelbrot計算しよ!とかいう話になります。これはfloat演算の結果が正しいかどうかを知るよいテストになります。レイトレでは単精度計算で十分なので単精度でやるんですが、OCamlには単精度浮動小数点はないので、適当にほかの言語で比較しないとコケます。

FPUの実装に合わせたfloat計算をする

シミュレータは実機と完全に同じ動作をする必要があります。なので、例えばFPUの結果が組み込みのfloat演算とほんの少し誤差があるとしても、実機に合わせなければなりません。よって、最終的には組み込みのfloat演算ではなくFPUがやってるようなビット的な計算をする必要があります。FPU係に手伝ってもらいましょう。とはいえ、組み込みでも当分は平気ですので最初は気にせず、FPU係と自分の余裕に合わせましょう。

大体ここまでがやったことです。ここから今やってること、或いはやらなければいけないことです。

パイプラインに手を出している

まだ高速化の段階ではないのに勝手にやっています。シミュレータ係は自分の好きな言語でやっていいので進みが早いことが多い気がします。なので、適当にフォワーディングとかを再現するようなものをつくり、それこそfib30とかならストールとかしながらパイプライン実行できたんですが、そろそろデバッグの季節なので中断してます。

デバッグをする

コンパイラ係がレイトレのプログラムをコンパイルできるようになったと連絡してきたのでデバッグです。この時期のFPUやコア係は忙しいので、シミュレータ係がやるのがよさそうです。シミュレータバグってるかもしんないし。 レイトレのアセンブリは一万行とかあるのでデバッグは大変です。友人は5時間眺めてバグを見つけたとか言ってました。自分もやらなきゃ。

シミュレータ係に向いてる人

シミュレータ係の適性は、「暇さ」です。コア係が要望を言ってきたらすぐに返してあげましょう。彼らは毎回回路に少しの変更をするごとにvivadoからコンパイルの待ち時間禁固15分を課せられています。 後はデバッグする機会が多いです。やっぱりシミュレータのバグが一番直しやすいので、シミュレータ係がデバッグして自身のバグならちゃちゃっと直し、そうでなければ各担当に投げましょう。他の係のバグは結構非自明で詰まることが多いですが、シミュレータ係のバグは大概不注意やtypoな気がします。後言語が自由なのでエラーが見慣れている言語で書けますしね。今触れたように、シミュレータ係の一番の特徴は、使う言語を選べることです。コンパイラ係も自分で1から作れば自由ですが、やはり多くの人は改造を選びそのためにOCamlを使っています。ぜひとも習得したい言語があったらそれでアセンブラとかシミュレータとか書いてみてはいかがでしょうか。でもやっぱ人気はC++とかなのかな。

おわりに

CPU実験、まだ終わってません。絶賛デバッグ中です。なので、この記事も短いですがこのくらいで終わりにします。完動したらまた書くのかな、でも大体書いているような気もします。シミュレータ係の記事ってほんとにないので、役に立つような記事が書けるように未来の私にお願いしときます。

この記事を読んでいる私は、再び一万行のアセンブリへと潜っていきます。

理情2020年度3Sを振り返る

理学部情報科学科の3Sの授業が終了し、大体成績も出ました。 理情がどんな授業をしていたのかなということを振り返っていきます。

概観

既に学科同期のシベリアンハスキーチワワが3Sの所感を書いてくれているのでそちらになんとなく譲るとして、実際課題の量はたぶん多かったように思います。プログラム未経験者の人は2Aのうちに授業でやるC言語(とScheme)に慣れましょう。そうでないと多分やばいと思います。とはいえ、土日も頑張ればなんとかなるので頑張りましょう……。ただ、学科側としては土日に課題をすることは想定していないということでそれはかなりビビりました。

私はオールドタイプなので板書は全部ノートに書きましたが、オンライン授業だったので結構大変でした。 itclmsに上がっていた動画もあまり見ませんでしたね……私のオンライン授業への適性の低さが伺えます。

3Sの講義

必修しか履修しませんでした。研究倫理については合不合しか付きませんし、事前に心構えするものでもないので省略です。

月2:オペレーティングシステム

2Aの必修であった計算機システムで習った内容のうち、OS的な部分を中心に扱いました。非同期処理やスケジューリング、メモリ管理などのうち既に固まっている部分を紹介しています。 後述のシスプロで触る部分については触ることでさらに理解できると思います。触らない部分については、自分でしっかり復習したほうがいいかと思います。あまり手を動かす機会はないです。

f:id:cfkazu:20200831151703p:plain

システムプログラミング実験

前半ではシステムコールの使い方、またOSの授業で触ったものを実際に実装しながら学びつつ、後半ではOSの機能をqemu上、および学科PC実機上で実装していきます。 理解すればなんてことないことを躓きながら実装する、やらなければならないことなので頑張りましょう。そういえば軽くですがアセンブラも書きます。

f:id:cfkazu:20200830151259p:plain

離散数学

グラフマイナー理論や最大流最小カットなどを中心にグラフ理論を触りつつ、線形計画法へと進んでいきます。 授業を漫然と聞いているだけではなかなか理解できませんが、問題演習で手を動かす機会が多いので動かしてどうにかしましょう。某の関係で今年はレポート評価となりました。試験であった場合には計算ミスがかなり響くものとなりそうです。

f:id:cfkazu:20200830152536p:plain

関数・論理型プログラミング実験

前半7割はOCaml,後半はPrologを用いました。OCamlの入門を一通りしたのち、lexerやyaccの力を借りながらOCamlインタプリタを作成しました。Prologについては解釈を含め基本的なところを触りました。 最終課題はリバーシを打つプログラムを作成しました。時間制限とうまく付き合うのが面倒だったのでさぼったら多分何回かタイムアウトしました。強化学習しか勝たんという気がするので、だれか頑張ってください。

f:id:cfkazu:20200830155823p:plain

情報論理

形式的論理や集合論、計算可能性を拾いながらゲーデル不完全性定理へと進んでいきました。形式的な話が私は好きなのでとても楽しめました。 教科書は英語ですが、難しい単語があふれているわけではないので大丈夫です。これから多分英語を読む機会が残念なことに増えるので慣れましょう……

f:id:cfkazu:20200831144548p:plain

言語処理系論

コンパイラを作ろうという感じの授業です。関数・論理型プログラミング実験でこれを軽く実践する形になりますが、そこでやらなかったコンパイラ特有の部分、またはlexerやyaccでさぼった字句解析・構文解析もまともにやります。何なら具体的にコードを書いたりもします。

f:id:cfkazu:20200831145026p:plain

ハードウェア実験

今年は某の影響で開始が大分遅れましたが、怒涛の補講を行うことによって夏休みを守りつつ13回やり切りました。 ブレッドボードを用いて論理回路の基礎を学びつつ、最終的にはFPGAで回路を組み、タイミング制約などについて学びました。 必要物資を全員分家に届けるなど、かなり苦労がかかっています。質問にもすぐ答えてくださるし、担当の先生は本当に神。 f:id:cfkazu:20200831145424p:plain

計算機構成論

CPUの中身を学ぼう!今年から先生が変わりました。CPUを早く正確に動かすためにどんな工夫が行われているかを事例を取りあげながら学びます。具体的にはまずは1クロックで1命令動作する単純な回路構成から始まり、パイプラインや分岐予測、アウトオブオーダー実行をするにはどうしたらいいかを触っていきます。

f:id:cfkazu:20200831150346p:plain

情報科学演習1

情報論理演習と離散数学演習を交互に行いました。事前に問題を解いて発表していく形式です。情報論理演習は問題が多く解けそうなのを選んでいく感じ、離散数学は問題があまり多くなくとりあえず解きまくっていくという感じの戦略を取った気がします。 天才が天才な問題を解いてくるのが楽しみな授業なので、発表しないときも毎回出席すると楽しいと思います。

f:id:cfkazu:20200831150936p:plain

おわりに

オンラインであったこともあり、異例の3Sとなりました。特に実験の課題類は締め切りが延びたこともあって例年とは負担のスケジュールが大分ずれていたと思います。とはいえなんだかんだ4月初頭から授業も始まり夏休みにほとんどはみ出ることがなかったなど、理情のオンライン化への適性が明らかになったと思います。これはひとえに先生方、事務の方々などの踏ん張りによるものだと思います。改めてありがとうございます、これからもよろしくお願いします。

……ところで流石に土日やるのが想定されてないというのは多少信じ難いですが、それでも友人などと相談しつつ頑張ればなんとかなるぐらいの重さですので、いいカリキュラムだと思います。

じゃんけんと等比級数

はじめに

皆さんは「等比級数の和の公式」とかいう式、


1+x+x^2+...+x^n=\frac{1-x^{n+1}}{1-x} \\

というものをご存知でしょうか?今回はこの式の導出というか、思い出し方を紹介しようと思います。

具体例:1/3

まずは何事も具体例から始めましょう。ここでは無限等比級数の和1+1/3^ 1+1/3^ 2...=3/2を示してみることにします。

さて、AさんとBさんの2人でじゃんけんをすることを考えます。AさんとBさんが完全にランダムに手を選ぶとすると、一回のじゃんけんでAが勝つ確率は1/3,Bが勝つ確率は1/3、そしてあいこで勝負がつかない確率が1/3となりますね。(9通りのうちAさんの勝つパターンが3通り……みたいな感じでここは計算できます、念のため)
ここからが本番です。これからAさんとBさんには決着がつくまでじゃんけんをしてもらいます。一回目であいこになったら二回目に入り、それでもあいこになったら三回目……といった具合です。
そうすると、Aさんが勝つ確率はいくらになるでしょうか?

そうですね、(1回目でAが勝つ確率)+(2回目でAが勝つ確率)+……と無限に足していけばいいわけです。そして、例えば5回目でAが勝つというのは4回連続あいこで5回目にようやく勝つということですから1/3\times 1/3^ 4=1/3^ 5であることでしょう。つまり、求める確率は1/3^ 1+1/3^ 2...です。
しかし今、勝負がつくまでじゃんけんを繰り返しています。そして、AさんとBさんの間に有利不利はありません。すなわち、最終的にAさんが勝つ確率もBさんが勝つ確率も1/2に違いないわけです。
これをまとめると、


1/3+1/3^2+...=1/2 \\

を得ることができます。収束しているので両辺に1を足すことで


1+1/3+1/3^2+...=3/2 \\

が得られました!

以上でなんとなく空気感が伝わったでしょうか。平等なゲームを設計して、ある特定の一人が勝つ確率がいくらになるかを二通りで計算することで導出を行っています。

無限等比級数に限って

さて、今度はなんとk人でゲームをすることにしましょう。どんなゲームだか想像はできませんが、1回このゲームをするとそれぞれ誰かが確率pで独り勝ちし、残りのx=1-kpという確率であいこになるとしましょう。

それでは先程と同様にこれを決着がつくまで繰り返し、Aさんが勝つ確率を求めることとしましょう。
まずは一通り目、(1回目でAが勝つ確率)+(2回目でAが勝つ確率)+……です。n回でちょうどAが勝つ確率は、n-1回あいこが続いてから独り勝ちする確率ですから、これはpx^ {n-1} です。
一方決着がつくまでこのゲームを繰り返したのですから、Aさんが勝つ確率はまさに1/kでなければいけません。いま、x=1-kpから1/k=p/(1-x)ですからこれを代入すると


p+px+px^2+...=p/(1-x) \\

です。収束してますから両辺からpを割ることで


1+x+x^2+...=1/(1-x) \\

を得ます。おお、これはまさしく無限等比級数の和(|x|<1のとき)ではありませんか!

一般の等比級数に関して

順序が逆な気がしますが今度は無限等比級数でない和も考えます。

今度もk人でゲームをすることにします。ゲームのルールは同じで、それぞれ誰かが確率pで独り勝ちし、残りのx=1-kpという確率であいこになります。

さて、今回は決着がつくまでは繰り返しません。n+1回繰り返して決着がつかなかったら諦めて引きわけ(勝者なし)とします。この時のAさんの勝つ確率を求めてみましょう。
まずは一通り目ですが、ほぼ変わりません。(1回目でAが勝つ確率)+(2回目でAが勝つ確率)+……(n+1回目でAが勝つ確率)なのですから、上の議論からこれはpx+px^ 2+...+px^ {n} と計算できます。
次に二通り目です。これは少し改変が必要です。というのも、Aさんたち参加者の間は平等です。ですが、あいこの確率はそれでは決まりません。極端な話、だれも勝つことができず100%であいこになるようなゲームでも平等ですし、1/2であいこで後の確率をk人で等分するのも平等なのですから。回りくどく言いましたが、あいこの確率を先に求めてからそれをk等分する必要があります。しかしn+1回あいこが続く確率なんて簡単で、それは明らかにx^ {n+1} です。残りの確率をk人で分け合えばいいので、Aさんが勝つ確率は\frac{1-x^ {n+1}}{k}でもあります。

以上をまとめることで、


p+px+px^2+...px^{n}=\frac{1-x^{n+1}}{k}=\frac{p(1-x^{n+1})}{1-x} \\

を得ます。kとp,xの関係は先程と一緒ですね。ここで両辺からpを割ることで


1+x+x^2+...+x^{n}=\frac{1-x^{n+1}}{1-x} \\

が導けました。おお、これまさに等比級数の和になっているではありませんか!結局|x|<1の時しかやってないという話もありますが、それでも感動もひとしおというものです(?)

かなしいおはなし

ちなみに、数学的厳密性は一回置いといて無限等比級数の導出だけ考えるのであれば、


y=x+x^2+...\\

と勝手に収束を仮定するとyが1を足してもxで割っても値が同じということを利用して1+y=y/xから直ちにy=x/(1-x)が出てきます。xで割れば無限等比級数の和ですね。いろいろとガバいのですが思い出すだけならこれでいいことでしょう……以上、お役だち情報でした。ちなみに有限の場合も、


y=x+x^2+...+x^{n+1}\\

と置くとx^ {n+1}+y/x=1+yからy=\frac{x-x^{n+2}}{1-x}が出てきます。xで割れば等比級数の和ですね。あれ?じゃんけんいらなくね?でも楽しいのでOKです。

おわりに

昨日せっかく記事を投稿したので、今日も何かしら投稿しようと思ってネタを探したらこれが一番書きやすそうなので書くこととしました。内容的に目からうろこが落ちるようなものではないんですが、文章書くのは楽しいのでこれからも何か書いていこうと思います。

情報処理技術者試験

この記事はISer Advent Calendar 2019の17日目として書かれたものです。 前日の記事はshikixyxさんの「社会人だった話」でした。そちらもどうぞ!

今回の記事はタイトルにもある通り、情報処理技術者試験というものについてのお話です。今まで何回かこの試験を受けてきたので、所感などをお伝えできればと思います。

概説

情報処理技術者試験は日本の国家試験でありまして、その運営は独立行政法人情報処理推進機構が行なっています。IPAという略称のがよく知られていますね。この法人はこの試験の運営だけが仕事ではなく、セキュリティ情報を発信したり、情報セキュリティに関する技術的な相談なども受け付けているみたいです。 国家試験なだけはあって、例えば警視庁でのコンピュータ犯罪捜査官の任用に置いてはこれらの試験(の一部)に合格している必要があるようです。案外大切な試験ですね……

なりそめ

私がこの情報技術者試験に出会ったのは遠い昔、私がまだ中学二年生だった頃です。中学のコンピュータ部に所属していた私は部活交流LT会に出席していたのですが、そこでどこの高校だったか忘れましたがLTで「うちの部活にはこんなに基本情報/応用情報を持っている人がいます!」的な発表をしていました。当時圧倒的に負けず嫌いだった私はそこで「基本情報がなんぼのもんじゃい!」と試験勉強を始めることにしました。そこから確か基本情報、応用情報、セキュリティスペシャリストを取ったのですがいつしか私の中のブームがすぎて忘れられてしまい、情報科学科に内定したことだし久しぶりになんかやるかということで諸々思い出しつつ、人々に布教しているところです。

雑感

まずこの試験ですが、基本的には午前が選択肢式の暗記問題、午後が記述も交えた考える問題となっています。試験区分のうち簡単な方は午後も選択問題だったりはしますが、それでも午前に比べればよっぽど考える問題となっています。で、一言で言えば「午前はセンター社会、午後は短い記述付きの現代文の試験」です。それ以上でもそれ以下でもないような気がします。

個人的な感想としてはこの試験、「受かるだけではしょうがない」です。というのも、合格基準は全ての小科目で6割を取ることです。他の試験をあまり受けたことがないのでこれがどれくらいゆるい条件なのかはわかりませんが、かなり問題が過去問から使い回されるこの試験において、午前問題の選択肢問題で6割とればいいというのはゆるいというレベルを超えています。なんならこの試験、計算問題の数値、果ては選択肢の順番さえ固定なのです。極端な話、過去問題を全て暗記して出た問題を全て正答し、あとは25%で正解すれば多分合格点までいけちゃうんじゃないでしょうか?

なので本番は午後試験です。確かにレベルが高い高度区分においては大問1つ1つがそれなりに長いです。例えばこれ(せっかくなので私が受けた年のセキュリティスペシャリスト試験の午後Ⅱ問題でもみていってください)。しかしこれらはあくまでも現代文の試験+(求められている範囲の)常識で解けます。知らないと難しそうに見えるとは思いますが……
合格率とか見るとビビりますが、これは合格者数/申込人数であって合格者数/出席者数ではありません。体感ですが高度区分では出席率が半分を切ったりすることもざらなので、受ける覚悟さえ決まればその時点で上位半分、合格率も表示の二倍ということです(?)

試験区分

情報処理技術者試験と言っても、この名前そのものの試験を受けるわけではありません。レベルにして4段階、種類にして13(情報処理安全確保支援士試験含む)の試験に分かれています。ここでは、レベル別にそれぞれを紹介していくことにします。 基本は春秋の年二回行われていますが、特にレベル4のものは春秋の片方しか行われていないものも多いです。気をつけましょう。(掲載している引用、あるいは合格率などはIPAに準拠します)

レベル1

ITパスポート試験

私は受けたことがありません。多分情報科学科に来るような人なら受けなくてもいいんじゃないかなぁという気持ちになっています。 IPAのサイトをみても

職業人が共通に備えておくべき情報技術に関する基礎的な知識をもち、情報技術に携わる業務に就くか、担当業務に対して情報技術を活用していこうとする者

を対象にすると書いてあります。わかったようなわからないような文章ですが、多分情報が専門ではないけど情報知らないとやっていけないかもなぁみたいな人が受けるのでしょう、多分。(個人的には英検5級みたいなポジションだと勝手に思っています) 120分100問の選択問題で、しかも随時試験を行なっているらしいです。お手軽でいいですね。ちなみにH30の合格率は51.7%でした。

レベル2

情報セキュリティマネジメント試験

これも私は受けたことがありません。……というか私が真面目に受けていた頃にはこの試験はありませんでした。ので省略します。

情報セキュリティマネジメントの計画・運用・評価・改善を通して組織の情報セキュリティ確保に貢献し、脅威から継続的に組織を守るための基本的なスキルを認定する試験です。

だそうです。前回の問題をチラッとみた限りでは、インシデントが起こりにくい設計、あるいは想定される攻撃を把握するところに重点が置かれているように思われます。ちなみにH30の合格率は49.9%でした。

基本情報技術者試験

ようやく受けた試験の解説ができます。私が初めて受けた試験でした。 †高度IT人材†となるために必要な基本的知識・技能を持つことを認定してくれるみたいです。ですが相変わらず全部選択肢問題なので、やればできます。しかし、(多分)唯一この試験の午後でだけ具体的なプログラミング言語を扱うことが求められます。私の時はC,COBOL,Java,アセンブラ,表計算のどれかを選ぶ形式でしたが、今はCOBOLがリストラされてpythonが入ったらしいです。時代ですね。私はC#が一番慣れていたのでなんとなくjavaでやろうと考えていましたが、当日になって解いていたらなんだか不安になったのでオリチャー発動してCにしました。 そのほかは基本常識問題か暗記問題です。正規分布の形状であるとかプログラムの流れ図であるとか、果ては労働基準法まで幅広く出題されています。試験時間が午前150分、午後150分と死ぬほど長いですが解き終わったら途中退室できるので利用したらいいと思います。特に午前は絶対時間余るので。ちなみにH30の合格率は25.6%でした。結構低いですね。

レベル3

ここから記述試験が入ってきます。

応用情報技術者試験

これも受けました。基本がいい感じの点数だったのでノリノリで受けた記憶があります。 †高度IT人材†としての方向性を確立した者が対象だそうです。ほんまか……?

上位者の方針を理解し、自ら技術的問題を解決できることが期待されているらしいです。午前は相変わらず基礎知識を問う選択肢問題ですが、午後試験でとうとう記述問題が出てきます。(そのせいで合格発表までに二ヶ月かかるようになります)セキュリティ周りの問題が必答問題で、そのほか10の大問の中から4つ好きなものを選択します。分野は幅広く、だいたいそれぞれの大問がレベル4の分野の記述問題を簡単にしたものに相当している気がします。記述問題ができた、といいつつ記述問題はそれほど多くなく大体は単語の暗記、あるいは選択肢問題となっています。範囲は基本情報とあまり変わらない気もしますが単純な暗記が減って考える問題や計算が多少増えているような気もします。ちなみにH30の合格率は23.1%で、別に基本情報技術者試験と変わらないですね。基本情報技術者試験受かった人しか受けないと思うので比較するのは多分ナンセンスですが。

レベル4(実務経験を要求しないものたち)

ここから専門ごとに分化します。半分近くの試験は、明示的に受験資格にこそしていませんが実質的に実務経験を要求しています。レベル4の試験は午前Ⅰ(50分)、午前II(40分)、午後Ⅰ(90分)、午後Ⅱ(120分)の全てに一気に合格する必要があります。9時半に始めたと思ったら休憩含めると終わるのは午後4時半です。驚きの拘束時間。午前Ⅰは共通問題で、免除制度が充実しています。*1午後は記述問題です。基本午後Ⅰが3問中2問選択、午後Ⅱが2問中1問選択です。120分で大問1つとか……

なおこの辺りになるとなぜか申し込んだのに受けないという人が大量発生します。前回私が受けに行ったネットワークスペシャリスト試験では、部屋に3割ぐらいの人しか座ってなかった気がします。みなさんお金持ちですね。(会社の金で受けてそうな気もする)

情報処理安全確保支援士試験

名前が長いです。私が受けた時はセキュリティスペシャリストという名前でした。略称セスぺ、セキスペ。 レベル4の試験の中でも人気の試験で、5万人近くの人が申し込んでいます。素直にすごい。人気なこともあって、年二回開催されています。

その名の通りセキュリティに関する問題、特に暗号化に関するものが多く出題されます。例えば部下が「自分で暗号化ソフト作ったんでこれ使いましょう!」とか言ってくるのに適切なツッコミをする能力が問われます。部下、失敗しがち。 ちなみにH30の合格率は17.7%でした。またこの試験に合格すると所定の手続きで「情報処理安全確保支援士」になれるらしいですが、お金が結構かかります。

ネットワークスペシャリスト試験

名前がかっこいいです。略称ネスペ。 こないだ受けてきたので数日後の12月20日に合格発表が出ます。ドキドキですね。

内容ですが、当然ネットワークの常識について問われます。セスペと違ってケーブルの形状とかカテゴリーとか、割と物理に近い話もあります。が、そういう問題は最近は出題が減り、さらにセキュリティが世間の関心を集めまくってることからセスペと似たような午後試験となっている気がしました。とはいえセスペよりもIPヘッダの中身など詳しいことも聞かれますので、概念的なことだけでなく、ちゃんと中でどのような処理をしているのかどうかも把握しておくと良いと思います。サブネットマスクとかについてこないだの計算機システムの授業で触れていましたが、ああいうのを使ってネットワークを適切に分割したりする能力も求められますね。 ちなみにH30の合格率は15.4%でした。

エンベデッドシステムスペシャリスト試験

名前がかっこいいです(二回目)。略称はなんなんだろう…… ネスペが受かってても落ちてても次はこれを受けようかと思います。

組み込み系の知識、応用が問われる試験ということらしいです。まだ全く内容を見ておらず組み込みに関してもこれを機に勉強しようという感じなのでほとんど紹介できることはないのですが、デジタル百葉箱を作ったりするらしいですよ。ちなみにH31の合格率は16.0%でした。しかし応募者数が4858名しかいなかったみたいです、悲しい。

データベーススペシャリスト試験

略称デスペ。誰がどう聞いてもデスペナルティだと思います。次の次ぐらいに受けるんですかね、やる気が続いていれば……?

問題ちらっと見ただけですが、午後Ⅱ試験は業務で使われるデータの特性などが与えられ、具体的なSQLも交えながらデータベースを設計していくような問題なのではないかと思います。ちなみにH31の合格率は14.4%でした。

レベル4(実務経験を要求するものたち)

システムアーキテクト試験、ITストラテジスト試験、ITサービスマネージャ試験、プロジェクトマネージャ試験、システム監査技術者試験が相当します。 こんな問題が出ます。実務なしで挑むのはなかなか厳しそうな気もします……というか何をどうしたらいいのか私にはよくわかりません。小論文とかかける人になりたいですね。 特に一番最後のシステム監査技術者試験の合格者平均年齢は驚きの42.2才です。当分いいかな……。でもプロジェクトマネージャ試験に中学生が受かったというのがいつだか話題になっていましたね、特にシステム監査技術者試験なら(その回の)最年少合格者記録とか狙えると思うのでやってみてはいかがでしょうか?

かなしいおはなし

さてそんな情報処理技術者試験ですが、巷ではそれなりに賛否両論です。持っていても仕方ない、みたいなことを言う人もいます。会場に空席が目立つのもその証左で、多分会社から受けなさいと言われたのだけれど気乗りせず、勉強もしてないからどうせ受からんし受けるだけ時間の無駄だろみたいな扱いを受けているのだと思います。なんとも悲しい話です。

まあ実際のところ、情報技術者試験を取ったからといってすぐに何かができるというわけではありません。プログラミング能力ではないもっと事務的というか、概念的なところの力を測っているのも評価されにくいポイントだと思います。ですが、この手の試験によくあることではありますがこれを持っておくと会話がしやすいです。相手がどの程度知っているのかを事前に判断できればかなりやりやすいですからね。

あと、会社によってはお給料にバフがかかったりするらしいです。もちろん日本の一部企業だけだとは思いますが。

勉強の仕方

この試験の難しいところは、受かるだけでいい勉強としっかりその知識を身につけるというところにはかなりのハードルがあるということです。なにせ6割で合格ですから、試験問題の半分わかっていればあと乱数に身を任せれば結構な確率で受かります。午前試験でより顕著ですが、午後試験の記述問題は現代文的な趣が強いので、知識が足りていないときはむしろ記述の方が点が取りやすいと思います。

受かるだけでは意味がないとは言いましたが、それは受かってからでないと負け犬の遠吠えになってしまうのでここではあえて受かることだけを目標に考えてみましょう。 午前試験を突破したいだけなら簡単です。過去問を十年分ときましょう。それをn回繰り返せば受かります。以上です。……実際午前試験の内容は本当に世の中的にも暗記(JIS規格など)なものもあるので、まとめて覚えてしまって損はありません。さすがに計算問題暗記するのはどうかと思いますが、n回やれば自然と覚えるという話もあります(上述の通り、選択肢の順番も数値もおんなじだったりするので)。なので午前試験で落ちるのであれば多分単純に練習不足です。精進しましょう……

午後試験はもう少し対策が必要です。私個人としては、二つの力が問われていると思います。一つは国語的読解力。もう一つはその分野の常識力です。
読解力、とても大事です。それなりに長い文章から引っかかる部分を適切にメモないし記憶しながら読み進め、問題文を見たらそこに目を移せるようになると楽になります。本当に現代文と同じですね。別に心理描写があるわけではないので小説を読めという話ではありませんが、本を日頃から読んでなかったりすると、問題文の中で気になった内容を頭に入れておいてから小問を解いておくのは厳しいんではないのでしょうか。頭の中に連想配列を作りましょう。
次にその分野の常識力です。読解力は使い回しが利きますが、これはあまりそうはいきませんので試験ごとに個別に対応する必要があります。(読解力があればこれだけやればいいという話もあります。)セスペやネスペの場合ですが、DNSサーバ、踏み台ときたらコンテンツサーバとキャッシュサーバの分離とか、そういうのがここに当たります。こういう知識を増やしていくと試験でヒットする確率も上がりますし、試験で沢山出てくるようなものは実務でもそれなりに出てくるんじゃないでしょうか、多分。 肝心の常識を身につける方法ですが、これはまあ素直に出ている教科書を一読か二読して、あとは普通に過去問演習すればいいと思います。かなり量も充実していますので。
センター英語で問題文に書いてあるポスターから情報抽出する問題があったじゃないですか、それのレベルが上がって日本語になったバージョンだと私は思っています。
そういうことを鑑みると実務が事実上条件に含まれているものは例外ですが、経験はあるが時間の足りない傾向にある社会人よりも、経験こそ多少劣るものの時間を使える学生の方がやりやすい試験なのではないかと総合的には思うのです。

おわりに

以上、情報技術者試験のおはなしでした。少なくとも計算機システムの授業で「OSI基本参照モデル知ってる?」とか先生に振られた時にも元気に手が挙げられるようになりますので、皆さん取ると意外に役立つかもしれませんよ。ネスペの合格発表出たら体験記事とか書いてみるかもしれませんので、よろしければそちらもよろしくお願いします。

さてさて明日はliwiiさんの記事です。お楽しみに!

*1:過去2年以内に基準点を取る、ないしは応用情報技術者試験に合格していると免除です