AOJ2199 Differential Pulse Code Modulation

 Python in Excelに向けて改めてPythonの勉強をしようと思ったことと、AOJでPyPy3が使えるようになったのをたまたま知ったことから、以前ハマった問題を解いてみました。

https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2199&lang=jp

  • xの配列で与えられる量子化信号(0~255)を、そのままではなく差分を取る形で記録する
  • 差分はx[i]-x[i-1]で取得するのではなく所与の配列c(コードブック)から選択する(xの1つごとに選び直せる)
  • 復元後の信号には当然誤差が発生するが、誤差の二乗和が最小になるようcを選択していった場合の最小値はいくらか
といった内容です。

 なんとか通ったPyPy3でのAC例はこちら。Python3だと遅すぎて無理です。

while True:
    n, m = map(int, input().split())
    if n == m == 0:
        break
    else:
        c = [int(input()) for i in range(m)]
        x = [0]+[int(input()) for i in range(n)]

        dp = [[10**9]*256 for i in range(n+1)]
        dp[0][128] = 0

        for i in range(n):
            for j in range(256):
                for k in c:
                    to = j+k
                    if to < 0:
                        to = 0
                    elif to > 255:
                        to = 255
                    dp[i+1][to] = min(dp[i][j]+(to-x[i+1])**2, dp[i+1][to])

        print(min(dp[n]))

 2次元dpをやるわけですが配列dpの軸の1つは0~n(xに対応)、もう1つは0~255(信号値が取りうる範囲)とします。
 改めてやってみてもこの選択が思いつきませんでした;-o-)解説を見ればごもっともという気がするんですが、考えていると0~m(コードブックcに対応)を使うのではないかなどとセンスのない方向に行ってしまいます。
 漸化式自体は難しくなく、cの各要素に対応する次の信号値を計算し、二乗和が小さくなるようなら置き換えるというだけです。ただし復元後の信号値が0未満になる場合は0に、255超になる場合は255に丸めるというのが曲者で、これにより
   dp[i][j] = min(dp[i-1][from]~)
のように配列を後戻りする形で参照しようとすると面倒が増えるという罠があります。
 最終的な答えは最後のxにおける二乗和の最小値つまりmin(dp[n])となります。


 言語の恩恵でコードは割と短く済んでいるものの、実際は試行錯誤しているうちに何時間かかかってしまいました。
 問題は学生向けプログラミングコンテストで出題されたものだそうですが、こんなものを30分とかで解ける人たちはやっぱり頭の作りが違うと思いました。

Python in Excelが導入されるようです

 あけましておめでとうございます。
 しばらくブログに手を付けられずにいましたが、時間に余裕ができたので再開したいと思います。


 本題ですが、10日ほど前から「ついにPythonがExcelに搭載!」と話題になっています。

forest.watch.impress.co.jp

 Pythonの導入については何年か前から噂があったのを知っていますし、そのときから漠然と「古くなったVBAを置き換えるもの」というふうに捉えていました。しかし今回のPython in Excelはそうではなく「セルにPythonコードを直接書き込む」という仕組みになっているとのことで、つまり色を塗ったり印刷したりといった手作業の代替ではなく、強力なライブラリを使ってデータ分析やら機械学習やらができる、という部分がメインになっているようです。


  というわけでPythonについては初心者ですしライブラリもよく知らないのですが、Insiderプログラムを適用しているサブマシンで10分ほどいじってみました。
 当たり前ですがwhileループや関数定義(def)ができ、LAMBDA関数単体では困難だった再帰も楽勝でできます。これは素晴らしい。キュー/スタックのようなデータ構造が扱えるのもデカいです。LAMBDAのときに「これでExcel数式が完全なプログラミング言語に!」といった(いささか誇大な)宣伝がされていましたが、今回のは文句なしにプログラミングです。あと正規表現が扱えるはずなので、文字列の扱いも改善してくれそうです。
 コードはクラウドで実行され結果が返ってくる仕組みなので留意すべき点はありますが、アルゴリズムの適用とデータ処理の可能性が大きく増したのはとても良いことなので、勉強をしながら正式リリースを待ちたいと思います。

情報処理安全確保支援士試験を振り返る

 令和4年度秋の情報処理安全確保支援士試験に合格しましたので、詳細をまとめました。

 目次

試験結果

 午前Ⅰ免除
 午前Ⅱ100.00点
 午後Ⅰ86点(問2,3)
 午後Ⅱ66点(問2)

 終わってみれば午前番長;-o-)これまでの試験を通じて満点は初でした。
 午後Ⅰは手応え以上に取れたものの、さらにいけたと思った午後Ⅱが伸びませんでした。自己採点はやってませんが、何か見落としがあったかもしれません。

受験の経緯

 昨年秋の応用情報技術者試験を受ける段階でセキュリティとネットワークに力を入れてましたのでその延長として受験を意識するようになりました。
 1月ごろにいわゆる上原本を買って眺めてはいたのですが、途中で資格名のかっこ悪さに絶望して今年春はお休みしました。その後もなかなか意志が固まりませんでしたが、そのうち必置化されるのではないかなどと考えるようになり、ようやく7月になって受験を決定しました。

使用した参考書等

1.情報処理安全確保支援士ドットコム
2.ネットワークスペシャリストドットコム
3.情報処理教科書 情報処理安全確保支援士(翔泳社)
4.情報処理安全確保支援士過去問題集(技術評論社)

 1は応用情報の時もお世話になったドットコムの姉妹サイトです。さすがに午後の採点機能はないのでアウトプットもこれ1つで十分、というわけにはいきませんでしたが、午前Ⅱはここでやりこみました。
 2は午前対策のダメ押しでやりました。確かに効いたかもしれません。
 3はいわゆる上原本です。頼りになりますが結構な分量なので言語のほか法制度などは手を付けませんでした。
 4は受験直前に購入しました。もともと必要はなかったものの3の本(2021年版)を買ったときに過去問解説を期限内にダウンロードするのを忘れて公式解答しか利用できない状況がずっと続き、かといって同じ本を買い直すのも癪だったのでこちらを買いました。解答が公式と異なる点があるのがよく批判されるようですが、その根拠は記しているので特に気になりませんでした。ただ、公式解答と異なる見解を述べておいて最後に公式解答を示すという箇所があるのはさすがに不自然なので、せめて両論併記でやってほしかったです。

学習戦略

 学習は7月上旬から開始しました。
 8月までは午前Ⅱと午後Ⅰを、9月からは午後Ⅰと午後Ⅱを中心に過去問を解き、最終的にH26秋以降の午後Ⅰと午後Ⅱをそれぞれ2周しました。
 総学習時間は応用の時と同じく180時間程度だったと思います。取り掛かりは遅いというほどではなかったものの、思ったほど時間を割くことができず9月がちょっときつくなったので、もっと余裕を持ったスケジュールにした方がよかったと思います。


 名前のカッコ悪さを克服する

 モチベーションに関わる問題です。名前がカッコ悪すぎるのに嫌気が差して受験を一回諦めたので、これを克服することがまさに合格への第一歩でした。
 それにしてもカッコ悪いだけでなく、セキュマネより下に見えるのがどうかしているので、セキュリティスペシャリストのままで良かったんじゃないかと思います。


 午前は暗記あるのみ

 くどいですが過去問については選択肢だけ見て反射で答えられるぐらいになる必要があります。午前Ⅱは最も落ちにくい科目とはいえ、ここで浮足立ってしまうようでは安心して午後に取り組めませんので最善を尽くしておくべきです。
 ちなみに午前ⅡのH25秋問23とH28秋問23が激烈に紛らわしくて嫌な感じですが、答えはどっちもイです;-o-)


 応用情報でセキュリティとネットワークをやっていればいい勝負ができる

 高度試験の午後問題というといかにも難しそうで、取り組むのに二の足を踏んでしまいがちですが、ネットワークスペシャリストなどと比べると明らかに簡単です。
 応用情報でこれらのジャンルをある程度やりこんでおけば意外なほど解けます。午後Ⅱも長いだけで内容的な難度は午後Ⅰと変わらないので、恐れることはありません。早いうちに手を付けましょう。
 いきなり躓きたくない方には易しいといわれるH27秋午後Ⅰ問2、R3秋午後Ⅱ問2をおすすめします。


 何よりファイアウォールのはたらきを理解する

 ネットワーク機器に関してはFWが何をやっているのかを理解することが肝心です。フィルタリングルールについて問われる問題も多いので、なんだかんだでFWがかなりの部分を占めていると思います。
 次いでプロキシ,DNS,メール,ログ管理サーバです。さらに内部/外部サーバの働きの違いを区別できるようになればネットワーク図に関して怖いところはほぼなくなります。あとはURLフィルタリングでセキュリティベンダへの接続が遮断されないようにするとか、機器の未活用機能を使って問題に対応するといった定番回答を押さえていけば得点力は上がっていきます。
 アプリやDB,NTPサーバ等については問題としてみれば味付け程度というか、さほど深く理解している必要はありません。あと知らなくて良いというわけではありませんが、午後問題に至ってL2/L3スイッチの区別などはあまり問題にならない感じです。


 差がつきそうなのは認証関連

 シーケンス図が出てきて鍵やら何やらを交換しているやつです。それぞれ何を検証しようとしているのか把握する必要がありますが、ここがなかなか難しくて勝負所になります。問題選択で避けられるかもしれないものの、さらに比重が増えそうな気がするのでやりこんでおく価値はあると思います。


 午後の90分/120分の時間に慣れる

 応用情報を経ていれば心配はないと思いますが、問題慣れしておけば基本的な設問で手堅く得点し、難問をさっさと見切ることが容易になります。とにかく設問自体の難度はそれほど高くないので、あとは時間感覚さえつかんでおけば「あと10分なのに設問1しか埋まっていないんだが」といった事態は起こりません。


試験当日

 ただの体験記。
 午前Ⅱは早々に「もしかして全部いけるのでは」と思うぐらいの会心の出来でした。応用情報の午前の方が問題が多くてしんどかったです。ただ最近はSQLも全然触っていないため、外部結合が最後に残ったのが情けないです。
 昼食は午後に眠くならないようカロリーメイトだけにしたところ、ちょっと足りなくて困った感じでした。加減が難しいです。
 そして午後Ⅰの問題選択が最も悩ましかったと思います。5分以上かかったのでちょっとヤバいと思ったものの、いざ解き始めると過去問と同じようなペースで解くことができました。ここは慣れておいてよかったところです。
 午後Ⅱは残り30分ほどであまり考えることもなくなり、時間的にはかなり余裕がありました。強キャラっぽい受験者が次々退席していたように思います。自分は信条として最後まで居残りました。その後どれほど手直ししたか覚えてませんが、結果的にギリギリだったことを考えると粘ってて良かったのではないかと思います。

登録について

 費用が高すぎてメリットもまるでないので、登録の予定はありません。

終わりに

 セキュアドの時も思いましたが、「これで私も一線級のサイバーセキュリティ人材」というほど簡単な話ではないです。この分野に関しては特にそう思います。
 あと、午後試験が1科目に簡略化されるようです。しかしそんなことより登録・維持費用を大きく引き下げれば登録目標など速攻でクリアできるはずなので、さっさとそうしてほしいです。