KLab Expert Campに参加した

夏休みが終わってしまいました。休み明けの学校というのは本当に辛いもので先週はずっと瀕死の状態だったのですが、そろそろ回復してきたのでこの記事を書いています。

KLab Expert Campとは

ラブライブ! スクールアイドルフェスティバルを起動したときに出てくるあのKLabが主催する技術系インターンの特別版です。 今回が初めての開催のようで、「TCP/IPプロトコルスタック自作開発」がテーマでした。 講義ベースでプロトコルスタックの実装に関する知見を深めるコースと実装ベースで発展的なテーマに取り組むコースの2つが用意されていて、自分は後者で参加しました。

やったこと

実は自分は参加初日に実装ベースのコースに配属されていたことを知ったので、当日の思いつきでRIP(Routing Information Protocol)をmicropsの上で実装することにしました。 実はこのKLab Expert Campの前の週に先輩からルーティングのいろはを教えてもらっていたのでその影響がかなりあったと思います。 4日間だけでの突貫実装でしたが、講師陣の方々に質問しまくりながら最終日にはそれっぽいルーティングができるように仕上がりました。

スライドも公開してみたのでよければ見てください。

www.slideshare.net

開発風景

感想とか

先週のセキュリティキャンプに参加したときにも思ったことですが、気軽に質問できる環境っていいなーと思いました。 質問することで、自分がどこまで理解できているのかちゃんと把握できるし、わからないことがわかるし、質問したこと以上の付随知識がもらえることもあるので本当に美味しいです。

あと、4日間本当に集中して取り組むことが出来ました。家の部屋だとこうはいかないのでやっぱり環境って大事だなあと思います。 環境に関して、まずオカムラの椅子が最高でした。そして昼食がとても美味しかったです。さらに、ルーティングプロトコルデバッグ用に対向用のスイッチやルーターも用意してもらえてトリプル役満でした。

懇親会のときにネットワークのアカデミックな話が聞けたのもとても良かったです。

懇親会とお弁当

(奥の方にスイッチが写ってる)

楽しい4日間でした。ありがとうございました。

PS. KLabの読み方は、「クラブ」らしいです(ずっと「ケーラボ」って読んでた...)

セキュリティ・キャンプ全国大会2019に参加した

タイトルの通りなのですが、セキュリティ・キャンプ全国大会2019を修了したのでその参加記的なのを書いていきます。 前に応募用紙晒しをしたときにも書きましたが私はYトラックのOS開発ゼミのフルスクラッチOSを書こう!というテーマで参加しました。 集中開発コースなのでずっとOSを開発してたわけですが、OSの機能など細かい解説は復習も兼ねてじっくりとやっていきたいので追々scrapboxのほうにまとめていきます。この記事は開発日誌的なものだと思っていただければ良いと思います。

1日目

1日目は顔合わせの日なので開発はしませんでしたが、特別講演やLT大会、それとグループワークがありました。 余談ですが、実はこの日お昼くらいから偏頭痛をこじらせていて、ずっと痛い頭を抱えていたので何があったのかよく覚えていません。悲しい。こんなことにならないようにキャンプ前日はちゃんと休みましょう。

2日目

2日目は開発時間が一番長い日でした。

午前中はuchan先生つきっきりでOSのデバッグをしていました。

バグの内容は割り込みハンドラの設定後、割り込みがあると再起動してしまうというものでした。再起動の直接的原因はトリプルフォルトというもので、x86の場合ダブルフォルトまでであればダブルフォルト例外を発行しますが、トリプルフォルトの場合は再起動します。おそらく目的の割り込みハンドラだけでなく、例外ハンドラも正しく設定できていないためトリプルフォルトとなっているのだろうと検討をつけ、まずはIDTを設定するコードにバグがないか静的解析を試みました。しかし問題がなさそうに見えたので、今度はsidt命令を使って登録したIDTRやディスクリプタが正しいか確認したところ、ディスクリプタに登録したハンドラ関数のアドレスが正しくないことが判明。実はこの事象、数日前に同じくOS開発ゼミに参加していた突撃隊さんも遭遇していたものを踏んでいたことがわかったのです。結論としてはコンパイルオプションに-fno-picをつければ解決するということだったのですが、もっと詳しく知りたいという方はこちらをご覧ください。

バグが取れてうれしい私↓

例外ハンドラが正しく登録出来たことでデバッグもしやすくなりました↓

そして午後からはメモリ管理をしてみようと思い勉強や実装を始めました。メモリ管理をするためには、メモリマップを知らなければなりません。メモリマップはUEFIのBoot ServicesのgetMemoryMap()によって取得できます。

上記の通りメモリマップを取得するプログラムを書いていたのですが、ここで「配列の先頭アドレスのアドレス」を渡さなければいけない箇所を誤って「配列の先頭アドレス」を渡してしまっていたが為に、次の日の午前まで時間を溶かしてしまいました。

3日目

この日は寝坊して、IPAの方と看護師さんが起こしにきました。本当に申し訳ないです。

起床技術者試験に落ちた後、朝食抜きで始まった開発ですが午前中は先程言ったバグのデバッグをチューターのPG_MANAさんとやっていました。C言語はもう少し人間に優しくなってほしいです。

同じくOS開発ゼミに参加していて、Rustで組み込みOSを自作していたikubakuさんからこんなこんなお言葉を頂きました↓

取得できたメモリマップ↓

午後は取得できたメモリマップをもとにメモリ管理を実装していくのですが、ページングを利用しているOSではまずページ単位でメモリの割当をするページフレームアロケーターを使い、その中でmalloc()などが細かくメモリの割当をするということがほとんどなそうなので私もそれにならうことにしました。

せっかくページフレームアロケーターを実装するのであればページテーブルの設定も出来たほうがいいと思い、PG_MANAさんに教えてもらいながらページテーブルの設定をしました。

この日の開発は夕食前までで、夕食後は企業紹介やグループワークがありました。

4日目

4日目はしっかり6:30に起床し朝食にありつくことができました。

そして午前は3日目に設定したページテーブルに合わせて空き領域を4KiBにアラインメントしページフレームのブロックを作りました。

また、簡単な実装ではありますがページフレームアロケーターも午前中にできました。

Yトラックでは昼食後に成果発表会を行うことになっていたので、午後はその準備をしました。 発表時間は一人2分ととても少なく、あまりいい発表が出来ずお見苦しいところをお見せしてしまいました。

発表会が終わってから夕食まではとりあえず今まで実装してきた機能がすべてちゃんと動作するか確かめてみようと思い、コメントアウトしていた関数をすべてもとに戻し動作確認してみたところ、シリアル通信がqemuでは動くものの実機では正しく動いていないことがわかりそのデバッグをしました。

しかし原因はよく分からずそのまま夕食、企業紹介、グループワークへ。

シリアル通信の設定が悪いのかなと思い、シリアル通信に詳しそうな坂井弘亮師匠に見てもらったところ、コンパイラの最適化でシリアル通信の送信が可能かどうか判断する関数の呼び出しが、1回しか行われていない(ソースコード上ではbusy loopで呼び出してる)のではないかというアドバイスを頂きました。

そこでコンパイルオプションに-O0を追加し動かしてみたのですがこれでもまだ動かず。 講師のuchan先生にも見てもらい、最終的に原因はアセンブリで定義していたinb()関数が間違っていたことであることがわかりました。悲しい。

5日目

5日目は最終日です。他のトラックも含めた成果発表を聞きました。 井上root取っ太郎が面白かったです。

全体を通しての感想

色んな人が自分のOSのデバッグを手伝ってくれるのが本当に心強いなと思いました。こんな機会なかなかないです。

今までは30日OS自作本やブログ記事、同人誌を見て写してただ動作を確認してみるということが多かったのですが、キャンプではオリジナルなコードもたくさん生やせてやっと自分でOSを作るということがわかった気がします。

5日間お疲れ様でした。

6日目?

7日目??

セキュリティ・キャンプ全国大会2019へ参加することになった(応募用紙晒し)

中間試験が一段落したので少し出遅れた感はあるけれど、この記事を書いています。

題名のとおりセキュリティ・キャンプ全国大会2019のシステムプログラミングトラックOS開発ゼミに参加することになったので、恒例の応募用紙晒しをしてみようと思います。 ちなみにセキュキャンに応募するのは今回が2回目です。実はリバースエンジニアリングゼミにも興味があってそちらの応募用紙も完成させてはいたのですが、最終的にOS開発ゼミのほうで提出することにしました。

あらためて自分の応募用紙を見直してみると結構はずかしいです。そういえば書いている最中も自分の文章にあまり自信がもてなくて何回も消したり書いたりしてたなあなんて思いだしました。

以下で掲載している応募用課題はこちらで公開されています https://www.ipa.go.jp/files/000073173.txt

セキュリティ・キャンプ全国大会2019のホームページはこちら https://www.ipa.go.jp/jinzai/camp/2019/zenkoku2019_index.html

応募用紙

  • 共通問題A
我々講師は、普段いくつかのOSを使っていますが、使い込むうちに色々な発見をします。
皆さんもきっとそういう体験があると思います。
あなたが普段使っているOSで、好きな機能と改善してほしい部分について、思いのたけを聞かせてください。
この問では、皆さんが普段どの程度興味を持って既存OSを観察しているかを評価します。

私が使っているOSで好きな部分は、OSのソースコードが大変に簡潔に記述されていること、そして余計な機能を一切入れないこと、またそれらによってOSに存在する脆弱性を限りなく少なくすることを目的にしていることです。 このOSのソースコードは本当にびっくりするくらいにきれいです。私はOSというものにそこまで深く触れたことがなく、C言語C++でのプログラミングを少ししたことがある程度なのですが、それでも他のOSのソースコードを読もうとしたときより「これは楽に読めるぞ」と感じたのでトリッキーなコードが少なく素直なのだと思います。また、余計な機能を一切入れないこともコードの単純化に寄与しています。普段ほとんどの人が使わないような機能のためにOSの開発がより困難なものになってしまうのは私は良くないと思います。このようにOSの構造を簡潔に、わかりやすくすることで見通しを良くすることに私はとても共感しています。 しかし、これらは決していいことづくしというわけではありません。このOSはソースコードの単純さや余計な機能を一切入れないことによってパフォーマンスを犠牲にしています。ハードウェアの性能向上を待てばパフォーマンスは良くなると思いますが、ハードウェアの性能向上にそこまで期待していいのかという問題もありますから、なかなか難しい問題だなと思います。

  • 共通問題B
皆さんが仮にOSを作るとしたら、「どんなOS(やOSの機能)を作ってみたい」でしょうか?
(既にOSを作った事がある人は、その特徴を書いてくれても構いません。)
そして、なぜそれを作ってみたいと思ったのでしょうか?
皆さんが心の中で夢描いているであろう、ワクワクするようなOS像を教えてください。
※「Linux開発者を目指そう!」テーマを受講したいと思っている方は「どんなLinuxカーネルの機能を作ってみたいか」を答えてください。
※「Raspberry Pi向け組み込みOSを作ろう!」テーマを受講したいと思っている方は「どんな組み込みシステムを作ってみたいか」を答えてください。

Linuxでは現在Linux向けにコンパイルされたプログラムしか実行することができなかったと思いますが、他のOS向けにコンパイルされたプログラムを動かすことができるバイナリエミュレーションの機能をつくってみたいです。 動機としては、この機能が特別ほしいなと思ったというわけではなく、単に実装してみたいなと思ったからです。私は数多くあるOSの機能のうちユーザーアプリケーションを実行する機能が好きです。もともと私がOSに興味をもったきっかけが、自分の書いたプログラムがどのように動いているのか知りたかったことにあるのが影響しているのかもしれません。ユーザープログラムを実行するに際してはいろんなOSでいろんな工夫がされているなと思います。例えば、LinuxにはVDSOというものがありますが、これはシステムコールはkernel側で処理されるものだという常識を覆すおもしろい発明だなと思います。

  • 共通問題C
C言語で双方向リンクリストとそれを操作する関数を作り、ソースコードを提出してください。
  リンクリストを生成する関数、要素を任意の場所に挿入する関数、全ての要素を順に標準出力に印字する関数、の3つがあれば十分です。
  やる気があればもっとたくさんの機能を実装しても構いません!
#include <stdio.h>
#include <stdlib.h>

int init(void);
void end(void);
struct node * search_tail(void);
int insert_tail(int value);
void delete_tail(void);
int insert_index(int value, unsigned int index);
void print_list(void);

struct node {
    int value;
    struct node *next;
    struct node *prev;
};

struct node *head;

int
init(void)
{
    head = malloc(sizeof(struct node));
    if(head == NULL) return -1;
    head->value = 0;
    head->next  = NULL;
    head->prev  = NULL;
    return 0;
}

void
end(void)
{
    struct node *tail = search_tail();
    while(tail != head) {
        delete_tail();
        tail = search_tail();
    }
    free(head);
    return;
}

struct node *
search_tail(void)
{
    struct node *search = head;
    while(1) {
        if(search->next == NULL) return search;
        search = search->next;
    }
}

int
insert_tail(int value)
{
    struct node *ins;
    struct node *tail = search_tail();
    
    ins = malloc(sizeof(struct node));
    if(ins == NULL) return -1;
    
    ins->value = value;
    ins->next = NULL;
    ins->prev = tail;
    tail->next = ins;
    return 0;
}

void
delete_tail(void)
{
    struct node *tail = search_tail();
    if(tail == head) return;
    tail->prev->next = NULL;
    free(tail);
    return;
}

int
insert_index(int value, unsigned int index)
{
    unsigned int counter = 0;
    struct node *current = head;
    struct node *ins;

    ins = malloc(sizeof(struct node));
    if(ins == NULL) return -1;
    
    if(index < 0) return -1;
    while(counter < index) {
        if(current == NULL) return -1;
        current = head->next;
        counter++;
    }
    if(current == NULL) return -1;

    ins->value = value;
    ins->prev  = current;
    ins->next = current->next;

    current->next = ins;
    return 0;
}

void
print_list(void)
{
    struct node *current = head->next;
    while(current != NULL) {
        printf("%d\n", current->value);
        current = current->next;
    }
    return;
}

int
main(int argc, char *argv[])
{
    if(init() < 0) return -1;
    if(insert_index(5, 0) < 0) puts("error");
    if(insert_tail(6) < 0) puts("error");
    if(insert_index(3, 1) < 0) puts("error");
    print_list();
    end();
    return 0;
}
設計・実装で工夫した点を述べてください。

整数型の符号の有無や関数の引数などを最小限に抑え、簡潔な実装を心がけました。また、メモリリークなどのバグがないようエラーチェックをしっかりと行ったつもりです。

  • 選択問題S3
Linuxカーネルについて知りたいこと、それについてこれまで調べたこと、
つまづいたことを教えてください。最終的に解決しなかったとしてもOKです。
技術力が優れているかではなく、どれだけ試行錯誤したかという観点で採点をします。
「この機能のこのコードの意味がわからなかった」という高度なものでもいいですし、
「そもそも何から手を付けていいのかもわからなかった」というものでも構いません。

共通課題でも述べたのですが、私はプログラムを実行する仕組みに興味があるのでそれに関連するコードを少しだけ読んだことがあります。そこで不思議に思ったことなのですが、linuxのローダーの実装はfsというディレクトリの下に配置されています。fsというのはおそらくfilesystemのことをさしているのだと思いますが、自分にはこの理由がよくわかりませんでしたし、調べてもこれについて述べているものは探した限りなかったです。また、実際にLinuxにコントリビュートするとして、どういう機能を実装するかというアイデアをどうやって思いつくのか知りたいです。Linuxは多くの優秀な人がコントリビュートしていると思いますが、そのなかで必要とされる実装をどうやって生み出すのか私には全然分かりません。

  • 共通問題D
その他、書ききれなかったことを好きなだけ書いてください。

いままで自分一人では解決できなかった疑問をこの機会にぜひ解消していきたいです。そして、自分もLinuxや他のOSも含め貢献出来るような人になれるように努めていきたいです。

FreeBSD12.0設定備忘録

WiFi切り替え

$ wpa_cli
> select_network {num}
> quit

# service netif restart

蓋を閉じたときのサスペンド

/etc/sysctl.conf

sysctl hw.acpi.lid_switch_state=S3

Thinkpadの真ん中のボタンを有効化

/etc/rc.conf

moused_enable="YES"
moused_flags="-A 2.0,2.0 -a 1.2 -V"

Emacsの設定@Gentoo&X11

春休みで時間があるので環境づくりに勤しんでおります。 今回は、前から気になっていたEmacsをインストールしたのでその設定方法を備忘録として残しておきます。

一番苦労したのはGUIのフォントの設定でした。ですから、まずはフォントの設定について述べておこうと思います。

フォントの設定@GUI

まず、Emacsのインストールですが「xft」のコンパイルオプションをpackage.useで有効にしておきます。

app-editors/emacs xft

次に~/.Xresourcesを以下のように編集します。

Xft.antialias: true

最後に、~/.emacs.d/init.elに以下の文字列を追加します。

(cond ((display-graphic-p)
       (set-default-font "{FontName}")
       (set-fontset-font (frame-parameter nil 'font)
             'japanese-jisx0208
             '("{FontName}" . "unicode-bmp")) )
      (t 0))

これで、GUIEmacsのフォントがいい感じになって幸せです。

package.elの設定

~/.emacs.d/init.elに以下を追加。

(require 'package)

(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))

(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/"))

(add-to-list 'package-archives  '("marmalade" . "https://marmalade-repo.org/packages/"))

(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/"))

Mozcインストール

M-x package-list-packages
mozc i
x

~/.emacs.d/init.elに以下を追加。

(require 'mozc)
(set-language-environment "Japanese")
(setq default-input-mothod "japanese-mozc")
(prefer-coding-system 'utf-8)
(global-set-key (kbd "C-j") 'toggle-input-method)

mewインストール

SMTP: STARTTLS, IMAP: STARTTLSで設定。

stunnelをコンパイルしておきます。

~/.emacs.d/init.elに以下を追加。

(autoload 'mew "mew" nil t)
(autoload 'mew-send "mew" nil t)

(setq read-mail-command 'mew)

;; Optional setup (e.g. C-xm for sending a message):
(autoload 'mew-user-agent-compose "mew" nil t)
(if (boundp 'mail-user-agent)
    (setq mail-user-agent 'mew-user-agent))
(if (fboundp 'define-mail-user-agent)
    (define-mail-user-agent
      'mew-user-agent
      'mew-user-agent-compose
      'mew-draft-send-message
      'mew-draft-kill
      'mew-send-hook))

(setq mew-prog-ssl "/usr/bin/stunnel")
(setq mew-name "{Name}")
(setq mew-user "{Name}")
(setq mew-mail-domain "{Domain}")
(setq mew-smtp-user "{Name}")
(setq mew-smtp-server "{Domain}")
(setq mew-smtp-auth t)
(setq mew-smtp-ssl t)
(setq mew-smtp-port {Port})
(setq mew-smtp-ssl-port mew-smtp-port)
(setq mew-proto "%")
(setq mew-imap-user "{Name}")
(setq mew-imap-server "{Domain}")
(setq mew-imap-auth t)
(setq mew-imap-ssl t)
(setq mew-imap-port {Port})
(setq mew-imap-ssl-port mew-imap-port)
(setq mew-use-cached-passwd t)
(setq mew-ssl-verify-level 0)

以上。

Gentoo Linuxを使い始めた

TL;DR

前々からsystemdから抜け出したいなーという気持ちがあったので、initシステムを含め随所で選択の自由が与えられているLinuxディストリビューションGentoo Linuxを使い始めました。 この記事は、Firefoxコンパイル中に暇だから書こうと思い立ち、とりあえずインストール手順をまとめてみたポエムです。

さてインストールですが、基本はwikiに忠実にやっていけば大丈夫です。とても親切にわかりやすくまとめられているなと感動しました。

wiki.gentoo.org

以下、自分で選択する必要があったところについて簡単に書いていきます。

インストール環境

手順

Live Mediaを用意し、起動する

自分はminimalのやつをUSB Memoryに書き込みました。起動するとおなじみのgrubが出てくるので適当に選んで進みます。

インストールの準備をする

  • ネットワーク

自分のPCにはRJ45がささらない(かつUSBtoRJ45を持ってなかった)のでWiFiでインストールしました。 Live環境にはもとからwpa_supplicantが入っているのでこれでよしなに繋いでdhcpcdでip addressを貰えばいい感じです。

% ifconfig {interface} up
% wpa_supplicant -B -i {interface} -c <(wpa_passphrase {SSID} {PASSWORD})
% dhcpcd
  • ストレージ

自分のPCのSSDにはすでにOpenBSDとArchLinuxとUbuntuが入っていて一杯だったのでUbuntuの入っているパーティションをmkfs.ext4して使うことにしました。

  • 日時

ntpがちゃんと降ってくる恵まれた環境だったのでntpdで時間を合わせました。

  • stage tarballのダウンロード&展開

current-stage3-amd64を選択しました。tar.xzの展開方法が分からなかったので調べました。

  • make.conf

CFLAGSに-march=nativeを足して、MAKEOPTSに-j3を指定しました。

  • mirror serverの選択

北陸先端科学技術大学院大学にお世話になります。

  • DNS情報のコピー

これ最初忘れてて、あれ?インターネットにつながらないぞ!!を20分くらいやってました。

あとは適当にマウントしてchrootすればベース環境に入れます。

ベース環境の整備

よくわからないのでwikiに従って適当にやりました。eselectでprofileを選ぶところ、変にgnomeとかついているやつを選んでしまったので@worldの更新に3時間くらい取られました。まいった。

カーネルビルド

Gentooの象徴とも言えるカーネルビルドのお時間です。 まともに使えるLinuxカーネルのビルドはいままでに一度もやったことがなかったので結構苦戦しました。 とりあえず大事なのは、使うファイルシステムのドライバとUSBドライバをちゃんと選択しておくことです。これだけクリアしてればあとから何度でもやり直しできます。

自分がいじった設定としては、MMCとSCSI周りとUSBのNetworking Frameworkの有効化、それとNICのドライバをカーネルに含めてしまう設定くらいのものです。

今後いじってみて足りない機能は追加してみます。

設定が終わったらmakeしてカーネルモジュールとbzimageのインストールをして終わりです。このとき、/bootをマウントするのをお忘れなく。

fstab

必要に応じて書きます。最低限、/と/bootがあれば良さそう。

Hostname

かっこいい名前をつけましょう。モテるための秘訣です。

あとはwiki通りにやってumountして、grubのコンフィグをいじるとブートできます。 ブートしたあとはx11とwmを入れてstartxすると幸せになれます。

(ポエム書き終えたけどまだFirefoxコンパイル終わってない...)

アマチュア無線技士3級試験に合格した

CTFのWriteupに続いてアマチュア無線技士試験のWriteupを書きます。

昨年、僕はこんな記事を書きました↓

yukium.hatenablog.jp

要するに、デジタル通信訳わかんないから、とりあえずアナログ通信から勉強してみたかったわけです。 それで取り敢えず3アマを取ってハムになってみようと思っていたのですが、バイトとかCA行きとかSecHack365とかプロコンとか色々盛りだくさんの一年だったおかげで、試験は受けられずにいました。 ずっと受けよう、受けようと思っていたのですがなかなか時間が取れず結局平成最後の年、2019年になって時間が取れたので受けてきた、という次第です。

ところで、3アマは東京にある日本無線協会本部で当日試験というものを行っています。当日行って申し込んで、当日試験を受けて、当日合否が分かって更に免許の申請も出来ちゃうという素晴らしい制度です。 なのでこれを目指して試験日の2週間くらい前から勉強し始めました。もともと、電磁気学や電波工学には少し興味があって参考書を読んだりしたことがあったので、過去問は法規さえ暗記すればイケるなーと思っていました。

参考書には以下の2冊を使いました。

第3級ハム国試 要点マスター 2018 (アマチュア無線技士問題集)

第3級ハム国試 要点マスター 2018 (アマチュア無線技士問題集)

初めての3級・4級アマチュア無線技士試験

初めての3級・4級アマチュア無線技士試験

1冊目は、暗記するにはかなり効率的に作られていて2冊目はもう少し丁寧に抽象的な理論と共に解説してくれていて合わせて読むといい感じでした。

それで、試験当日はセンター試験2日目ということだったので、高専生でセンター試験とは縁がない身ではあるのですが取り敢えず気分だけ味わっておこうとセンター試験気分で会場へ行きました。

会場は勝どき駅から少し歩いたところで、東京駅方面へ都営バスも走っているのでなかなか便利なところです。この東京の東側の地域は、人が程よくまばらで建造物が比較的新しくいい街です。 試験は11時からだと思っていたのですがそれはどうやら受付開始時間だったようで、実際は13時からでした。9時30分には会場入りしていたので相当待ちました。時間はちゃんと確認しておきましょう。

それで、試験自体は15分もかからず終わっちゃうような内容で、素っ気なかったです。試験時間は70分ですが、30分立つと中途退出出来るようになります。 退出して、自己採点してみると満点でした。過去問流用の簡単な試験ではありますが嬉しい。 合格発表は50分くらい経ってからでした。自己採点で満点だったのでまあ合格だろうと先に免許申請書等を書いておいて、一応合格を確認してすぐに免許申請へ行きました。 ちなみに合格発表の掲示はこんな感じ。

というわけで、スムーズに3アマの取得が出来ました。勉強時間は合わせて10時間くらいです。不毛な授業中に内職したりしておくと不毛な授業時間が3アマ免許に化けた気がしてお得です。

せっかく免許を取ったので、取り敢えず電波を出してみたいです。もしこの記事をご覧の方で、ハムの方が居たらぜひ交信してください!