応用情報技術者試験体験記

応用情報技術者試験に合格しました

令和06年秋に応用情報技術者試験に合格したので、記憶が薄れないうちに感想を書いておこうと思います。ネットにはたくさんの合格体験記がありますが、私自身も受験前にいくつかのブログを読んだので、少しでも役に立てばと思い、書いてみることにしました。

勉強時間

勉強時間はトータルで何時間か、正確にはわかりません。過去問道場や参考書を、ゲームの合間やアニメのCM中などに読んでいたことが多く、結局どれだけの時間を使ったのか把握できていません。

特に急いでもなかったのと、せっかく受けるのであればためにならなければ受ける意味がないという思いもあったので1年間でゆっくり少しずつ進めました。そうはいっても途中やる気もなくなったりしつつだったので最後の3か月くらいにしっかり勉強した感じです。

過去問道場

過去問道場にはお世話になりました。通勤のバスの中や、ゲームの合間にちょくちょく取り組んでいました。全期間合計だと以下のような感じです。最後の方は7割くらいでした。

書籍

最初は最初に記載する合格教本くらいで進めるつもりで実際ほとんど進めていました。しかし残り3か月くらいになっても全然身に付いた気がせずに急がば回れと思い直していろいろと本を追加することになりました。記憶力がいい人、暗記が得意な人は参考書だけで問題ないかもしれませんが私のように暗記が苦手な人は基礎からやった方が結果的に理解が進んでよかったです。

令和05年【春期】【秋期】 応用情報技術者 合格教本 (情報処理技術者試験)

メインとして利用した参考書はこちらです。この本は1年前から2~3か月かけて読破し、その後は少しずつ見直しに利用していました。

令和06年秋に受けたのに書籍は令和05年版なところからして、1年かけていることがわかります。1年分の差分はIPAが公開しているシラバスを見て用語を調べることで学習しました。

SQL 第2版 ゼロからはじめるデータベース操作

SQLの基礎固めとしてチョイスしたのはこちら。本で読むだけではなく、実際に PostgreSQL を使ってSQLを実行して学べるのがよかったです。

達人に学ぶSQL徹底指南書 第2版

正規化なども参考書だけだと暗記に頼るような形になってしまって全く覚えられませんでしたがこちらでステップごとに正規化する意図、意味などを含めて学ぶことができました。

午後試験でデータベース選択しようかな?と思っていたので午後対策も含めて利用しました。

問題解決力を鍛える!アルゴリズムとデータ構造

もっぱら午後試験対策です。連結リストやグラフ、木など途中までよみました。アルゴリズムを選択するかは迷っていたのですが、知っているアルゴリズムが出てきた場合は楽かなと思って、いくらかインプットしました。少し難しめです。

今回は結果的に選択しなかったのであまり活用はできませんでした。

体験しながら学ぶ ネットワーク技術入門

こちらはネットワークの基礎固め用に。午後試験にもネットワークがあるのと、午前もそれなりに出ているので一石二鳥を狙いました。

この本も「体験しながら学ぶ」の名の通り、実際に動かしながら学べるのでとても理解するのに役立ちました。やっぱり動かすことでわかるのはあると思います。

その他

見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑

昨今、AI、人工知能はトレンドでIPAのシラバスでも大改訂が入っていたのですが、単語だけだとよくわからなかったので購入しました。こちらは読了はしていませんが、最初の方とパラパラとシラバスに出てくる内容を確認するのに使いました。

入門 確率過程

応用情報、範囲が広すぎて確率理論を参考書ではものの数ページで記載していたりしてちょっと厳しかったので買いました。しかし、レベルが高く最初の方しか読めてません。

うかる! 応用情報技術者試験

こちらは午後の読めばわかるような長文問題の分野の参考書です。

2~3週間前くらいに一応軽く対策しておこうと思って買いました。合間合間に午前問題の知識も含めて解説してくれているので「答を覚える!」と書いてあるわりにしっかりと知識として身につくような構成で、役立ちました。

応用情報技術者試験(レベル3)シラバス(Ver.7.0)(変更箇所表示版)

こちらはIPAの公開しているPDFです。書籍ではないですがこちらにて記載します。公式でシラバスとして銘打っているだけあって何を理解してほしいのかが用語例として羅列されており非常に役にたちました。これはみておくべきだなと思いました。実際にこちらをみていたおかげで取れた内容も多かったです。

午後試験

最終的に選択したのは★マークのついた5つです。もともと選択しようと考えていた第一はネットワーク、データベース、組み込みシステム開発、情報セキュリティ、難しければ文章系の分野にでしたので結構組み替えた感じになります。

試験の一発勝負でうまくハマる年とそうでない年とあるので下手に最初から絞っておくよりまんべんなく見ておくという方針にしておいてよかったです。

実際データベースなどは本を2冊買って勉強していた割に本番ではシステム監査の方が簡単だなと切り替えました(本の知識は午前でもとても役にたったので無駄ではなかったですが)。組み込みなども途中まで解いてみて知識問題が思い出せずに切り替えました。これだけ途中切り替えしても時間は余裕だったので、そこまで時間的には焦る必要もないのかなという感じでした。

★情報セキュリティ
★経営戦略
戦略立案・コンサルティング技法
プログラミング
システムアーキテクチャ
★ネットワーク
データベース
組込みシステム開発
★情報システム開発
プロジェクトマネジメント
サービスマネジメント
★システム監査

午後試験対策でやったこと

書籍で記載した本で、「ネットワーク」、「データベース」は重点的に勉強しました。

過去問は適当な年の1年分をまず全分野やってみて、その後は「ネットワーク」と「データベース」、「組み込みシステム開発」と「プログラミング」、「情報セキュリティ」のみ数年分実施しました。

その他は長文読解な分野のように感じたので過去問は解かずに「うかる! 応用情報技術者試験」で補完しました。

最後に

基礎を学ぶいい機会にもなり、受けてよかったと思います。

午前免除があるうちに高度試験にも挑戦したいと思ってますが、また詰込みしてもあまり意味がないと思うので春はお休みして秋か来年かを目標としたいです(NWの参考書みてみたらちょっと難易度にくじけたのもあります)。

ただIPAの試験は申し込みが早く、申し込むと他のことが手つかずになってしまったので上手にメリハリつけていきたいです。

SQLメモ

テーブル

作成

CREATE TABLE <テーブル名>
( <列名1> <データ型> <制約>,
  ...);

削除

DROP TABLE <テーブル名>;

変更

-- 列の追加
ALTER TABLE <テーブル名> ADD COLUMN <列の定義>;

-- 列の削除
ALTER TABLE <テーブル名> DROP COLUMN <列の定義>;

集合演算(行方向)

これらは、以下のように使われる。

SELECT <列1>, <列2>
FROM <テーブル名>
UNION  -- このようにレコードの集合に対して処理する
SELECT <列a>, <列b>
FROM <テーブル名>

UNION

和(⋃)。重複行は削除される。 UNION ALL では削除されない。

INTERSECT

共通(積)(⋂)。どちらにも属する行。

EXCEPT

差(-)。A EXCEPT B は AにあってBにない行。

集合演算(列方向)

INNER JOIN

内部結合。FROM <テーブル名> INNER JOIN <テーブル名> ON <結合条件>

OUTER JOIN

外部結合。FROM <テーブル名> LEFT OUTER JOIN <テーブル名> ON <結合条件>。
外部結合では左右どちらのテーブルをマスタとみなすかによって、 LEFT OUTER JOIN, RIGHT OUTHER JOIN を使いわける。

データ

登録

INSERT … VALUES: 基本形。1回で1行を挿入。

INSERT INTO <テーブル名> ( <列名1>, <列名2>, ...)
VALUES ( <値1>, <値2>, ...);

INSERT … SELECT: ほかのテーブルからデータをコピーする場合

INSERT INTO <テーブル名> ( <列名1>, <列名2>, ...)
SELECT <列目a>, <列名b>, ...
FROM <テーブル名>;

更新

UPDATE

UPDATE <テーブル名>
  SET <列名> = <式>
  WHERE <条件式>;

検索

-- 重複を省く = DISTINCT
SELECT DISTINCT <列名>, ...
FROM <テーブル名>

演算

-- 算術
-- +, -, *, /
SELECT <列名> * 5
FROM <テーブル名>

-- 比較
-- = : 等しい
-- <> : 等しくない
-- >= : 以上, <= : 以下

-- 論理
-- 否定は NOT, かつの AND, またはの OR

集約

集約関数

COUNT : 行数をカウントする

SUM : 合計

AVG : 平均

MAX : 最大値

MIN : 最小値

GROUP BY

SELECT <列名1>, <列名2>, <列名3>, ...
FROM <テーブル名>
GROUP BY <列名1>, <列名2>, <列名3>, ...

WHERE を利用する場合、WHEREの絞り込み後にグループ化される。

GROUP BY を利用する場合、SELECT句に書けるのは「定数」か「集約関数(SUMなど)」か「GROUP BYで指定した列」のみ。

処理順序

SELECT <列名a>, COUNT(*)
FROM <テーブル名>
GROUP BY <列名a>
HAVING COUNT(*) = 2;

  句の順序: SELECT ⇒ FROM ⇒ WHERE ⇒ GROUP BY ⇒ HAVING ⇒ ORDER BY ⇒ LIMIT

  実行順序: FROM ⇒ WHERE ⇒ GROUP BY ⇒ HAVING ⇒ SELECT ⇒ ORDER BY ⇒ LIMIT

  ① GROP BY 句を使うときは SELECT 句に集約キー以外の列名を書けない

  ② SELECT 句に AS で別名付けた名前を GROUP BY では利用できない。なぜなら、実行順は SELECT が最後だから。

③ WHERE は GROUP BY より先に処理されるため、集約を使う場合は HAVING。

【復旧】Blazorでクラスを変更する

前置き

この記事は旧サイトの2021.8.24投稿の記事内容のリポストです。

やりたいこと

ある要素の class をクリックイベントで表示を変更したい

方法

ボタン要素のclassをクリックイベントで変更したいとします。

この場合、以下のように class="@変数名" というようにクラス属性の値を変数にすることで、C# のコード上から参照できます。

<button class="@ButtonClass" @onclick="ChangeClass">click me</button>
private string ButtonClass = "btn btn-primary";
private void ChangeClass()
{
    ButtonClass = ButtonClass == "btn btn-outline-primary" ?
        "btn btn-outline-secondary" : "btn btn-outline-primary";
}

Think

Blazorで変数を参照する場合、 @変数名 とすることで、C# (@code { }で囲まれた箇所)側で定義した変数を参照することができます。これは基本的な使い方ですが、最初はテキスト部分は変数にできるが、class属性の値などにも変数を使えるということがわからず悩んでしまいました。

そこで考えたのが 「button に id を付与して GetElementByIdのようなメソッドが使えるのでは?」みたいなことでどうにかDOM操作しようという考えにとらわれていて class属性の値も変数にできるんだということに思い至らなかった・・・。

ということでBlazorで何かしたい場合は対象の箇所を変数にしちゃえば大体いけそうというのが学びです。

【復旧】TCP/IP プロトコルスタック自作入門(microps) 実施録

前置き

この記事は旧サイトの2023.9.16投稿の記事内容のリポストです。

はじまり

Twitterでこんなツイートが流れてきました。

資料とコードをみてみると、 C言語で簡易的な TCP/IP プロトコルスタックを自作してみよう!という内容でした。TCP/IP って普段何気なく使ってはいるもののふわっとした知識しかなかったのでこれを機にちょっとやってみようかな、と。以降では、実施してみた感想と、そのあとに microps を VSCode DevContainer で動作するために行った環境構築、実施中に出会った環境構築不備?のエラー(※暫定対処しかできていない…)をまとめておきます。

資料

Klab Expert Camp (Google Drive)
microps (Github)

感想(完走)

ネットワークのデバイスの管理からはじまり、Ether, ip, udp, tcp, arp と様々なプロトコルの実装で、普段何気なく使っている通信がこんな面倒なことをしてるんだなと改めて感じることが出来ました。特に最後の方のTCPは3wayハンドシェイクなど、ふわっと知ってはいましたが実際やると難しすぎて・・・。(シーケンス番号やら送信して受信しての流れが追い切れない(汗)。

TCP/IPプロトコル入門からは外れてしまうところですが、いわゆる連結リストやメモリの動的確保・解放、関数ポインタ、void * を用いた共通化など、なるほど実際こうやって使うんだというようなところも満載で、C言語の理解を深めるのにも良い教材と感じました。

正直理解を諦めて先に進んでしまったようなとこだと、シグナルやバリア同期など並行プログラミングとかLinuxのシグナルとかを知らないので厳しかった。またmicrps では util.c などに色々な便利関数群が作ってあって簡単にキューの操作やバイトオーダーの変換ができるようになっていました。ここもとりあえず util 頼りでした。

あとは本記事の最後に記載していますが、何故かVSCode で InteliSence がうまく効かずにとりあえず対処で済ませたりしたとこがあるのでそのあたりの原因も確認したいですね。

本来は5日間でこれをやりきっている方たちがいるようなのですが、1か月くらいかかりました。おともには前に興味がでて買ったはいいものの数ページ読んで積んでいた「これ1冊で丸わかり 完全図解ネットワークプロトコル入門」を横に携えてのぞみました。ただ踏み込んだとこだとやっぱり足りなかったですね。UDPのとことか。

総じていい内容でした。

環境構築(Day1以前)

最終的な環境はこちら
https://github.com/AlaAlba/microps/tree/work/.devcontainer

以下の要件に沿って環境構築しました。

– Ubuntu 20.04 を推奨
– 実機or仮想環境どちらでもOK(WindowsはWSL2で動作確認済)
– Dockerで構築する場合には –privileged または –cap-add=NET_ADMIN が必要
– 必要パッケージ(Ubuntuの場合)
– build-essential
– git
– iproute2
– iputils-ping
– netcat-openbsd

使ったことなかったのですが、これを機会にということで、VSCode Devcontainer を利用しています。
* Windows10
* Docker
* VSCode DevContainer

microps を clone したフォルダに、 .devcontainer フォルダを作成し、配下に devcontaienr.json , docker-compose.yml , Dockerfile を作成。

(参考)
Get started with development Containers in Visual Studio Code
Visual Studio Codeで使えるリモート環境のdevcontainerが意外と便利そうだったのでまとめ
Docker Compose な開発環境にちょい足し3分で作るVSCode devcontainer
VSCode Devcontainer 放浪記
Add non-root user to a container
【Rootless】VSCodeのDocker環境をRoot以外のユーザで実行する | ぺんぎんや
How to Set Docker Environment Variables {ARG and ENV}

注意点

docker-compose.yml の devices

Tutorial で sudo ip tuntap add mode tap user $USER name tap0 というコマンドが出てきますが、本箇所を追加しないと、 open: No such file or directory というエラーが表示されました。Docker Compose な開発環境にちょい足し3分で作るVSCode devcontainernetworking – ip tuntap add gives “open: No such file or directory” – Ask Ubuntu によると、Docker は tun/tap デバイスにマッピングしないため、手動で行う必要があるそうです。

–device /dev/net/tun:/dev/net/tun

Dockerfile Userの設定

Tutorial で $USER と指定している箇所があるが、devcontainer はデフォルトでは root ユーザーとなるらしく、また $USER は環境変数に定義されていません。そのため、# Create the user 以降の箇所でユーザーを dev-user として作成し、最後に ENV USER=$USERNAME で環境変数を設定しています。

作業録

P22~

以下の手順でコミットが見つかりませんでした。

git checkout bdbf73f -b work

原因は、fork したときには main ブランチしかとってきていなかったことです。以下の手順で、 bdbf73f のコミットがされている別ブランチを取得する必要がありました。

# オリジナルのリポジトリを upstrem としてリモートリポジトリに追加
git remote add upstream https://github.com/pandax381/microps.git

# フェッチ
git fetch upstream

# ブランチをチェックすると remotes/upstream/* が追加されている
git checkout -a
# * master
# remotes/origin/HEAD -> origin/master
#  remotes/origin/master
#  remotes/upstream/book1.0
#  remotes/upstream/kec3
#  remotes/upstream/kec5
#  remotes/upstream/master
#  remotes/upstream/rebuild

VSCode で net.c によくわからないエラー

STEP1 では net.c を新規追加するのですが、1行目のインクルードで、「コマンドラインエラー C/C++(1027) 指定されている言語モードは互換性がありません」というエラーが表示されていました。

よくわからず無視して進めていたんですが、このせいでコードの補完が全く効いていないという問題が発生してしまったため、解決方法を記載しておきます。

どうやら今開発環境は VSCode を利用しているのですが、 InteliSense が Makefile Tools によって効いているのが原因のようでした。

拡張機能は、ファイル内に Makefile が見つかるとアクティブになります${workspaceFolder}

よって、P41 の Makefile の修正を行えば解決します。今後の作業では先に Makefile を修正することを心がければよさそうです。

Makefile 使ったことないのでわかりませんでしたが、ここでビルド対象に含めないとソースファイルとして認識してくれないようです。

暫定対処しちゃったトコ(VSCodeの設定がオカシイ?)

microps を ドキュメント通りに進めるにあたり何故か make はできるんですが、VSCode上は Intelisence でエラー表記になるものがいくつか・・・。VSCodeのC言語用の設定、もしくはMakeFile用の設定がうまくいってない気がしますね・・・。とりあえずは以下の通りの定義追加などを行うとエラーもなくなり、補完も効くようになりました。しかし原因ははっきりしていません。

STEP2 : 識別子 “pthread_barrier_t” が定義されていませんC/C++(20)

#define _XOPEN_SOURCE 600 /* Or higher */ の定義をインクルード前で定義するとうまくいきましたが、オリジナルの microps ではそんな定義はされていないので、なぜ intelisence がオカシイのかがわかりません・・・。なお、VSCode上、問題として表示されているが、このままでも make は可能でした。
c – unknown type name “pthread_barrier_t” – Stack Overflow

STEP12 : ifreq でエラー

こっちは Intelisence で使用する言語標準のバージョンを変更すれば解消しました。
デフォルトではC**になっているので gnu23 などに変更。

STEP14, 16 : timercmp や timersub がintelisenceが効かない

sys/time.h みるとコンパイルでオフになってたので __USE_MISC を追加したら一応効くようになりました。謎です。

#ifndef __USE_MISC
#define __USE_MISC /* TODO: 暫定 timercmp用 intelisenceが効かない */
#endif

#include <sys/time.h>

STEP26 timercmp

これも同じように VSCode の Intelisence がエラー表示に。make はそのままでも通りました。暫定対処としては STEP14, 16 と同じように上記のインクルードと定義を追加すればエラー表記も取れました。ただこちらに関しては、 tcp.c はそもそも元々は sys/time.h すらインクルードされておらず、なぜこれで make 通るんだろう?ってなりました。

投稿日:

Re! Hello world!

もともと特に何かしたいというわけでもなく、なんとなくで環境構築した WordPress サイトでしたが、4年越しに攻撃にあってしまい、DBの中身を改竄されてしまいました。

というわけでRe! Hello world! です……。

これはかつてのマイサイト。

発覚経緯

発覚経緯は2024/4/8 頃に管理画面をみようとするとなぜか install.php にリダイレクトされるという現象が発生。DBがおかしくなったのかな?と思い、phpMyAdmin を開いてみると、README というテーブルだけになっており、中には「あなたのDBの中身バックアップしたよ!返してほしかったらこのアドレスにビットコインを払って(意訳)」というメッセージがありました。

反省点とか振り返りとか

運用する気もなかった、というのもあるけどセキュリティなんて完全に気にしてませんでした。また、こんな何もないようなサイト攻撃されるのか?という甘い認識でした。4年間は無事でしたが…(笑)

また気にしてなかったとはいってもパスワードは大分適当な文字の羅列にはしてあったので総当たりしないと突破することができないものには一応なっていたので、本当に総当たりで攻撃しに来てるんだということがわかりました。

今回被害にあったのはそもそも db を改竄できるような状況にしてしまっていた、というところなので以下で対策とできるかなと思ってます。

  • phpmyadmin や LiteSpeed のポートを自分のグローバルIPに制限して利用する、また正直不要なのでポート閉じておく。

あと今回は無事でしたが、WordPressの管理画面も危ないと思うので、こちらについては二段階認証でワンタイムパスワードでも利用するようにしておこうと思います。

セキュリティ的にもっとこうしたほうがいいなどの意見がありましたらゆる募です。