ラベル プログラミング の投稿を表示しています。 すべての投稿を表示
ラベル プログラミング の投稿を表示しています。 すべての投稿を表示

2025年1月25日土曜日

令和6年度秋期 応用情報技術者試験に合格した件について

令和6年度秋期 応用情報技術者試験に合格しました。

令和1年度秋期 基本情報技術者試験に合格していて、当時どのように勉強していたか曖昧だったので、備忘録として。

また、この投稿直前に (R6秋期)応用情報技術者試験に一発合格した勉強法・合格体験記【Notion活用】 という記事を拝見させていただいて、受験前に午後試験の過去問でなかなか点数が取れない気がして、いろいろな方の記事を拝見させていただいたことを思い出したので。

過去の記憶を思い出す限り、皆さん書かれている内容に似ているような部分と似ていない部分があったりします。

午後試験の勉強方法で苦労したのに、その点についてはあまり書かれていた記憶がないので、それについての備忘録として。

参考までに

  • 午前得点    80.00点
  • 午後得点    72.00点
  • 午前分野別得点(得点率)
    • ストラテジ系  18.75点(75%)(満点25.00点)
    • マネジメント系 11.25点(90%)(満点12.50点)
    • テクノロジ系  50.00点(80%)(満点62.50点)
       
  • 午後問題分野
    • 問1    情報セキュリティ
    • 問3    プログラミング
    • 問4    システムアーキテクチャ
    • 問5    ネットワーク
    • 問7    組込みシステム開発

 

最初にまず大事なことを2点

  • 過去問道場はマメに解く

  • 計画をしっかり立てる

     

    過去問道場に関してはインプットした情報をちゃんとアウトプットできるかの検証です。

    基本情報ではノート作っていた気がしますが、応用情報ではノートや単語帳は作らなかったのです。

    ノートとか作るにしても、絶対にアウトプットが大事なのかなぁと思います。

     

    計画を立てることとしましては、勉強量が幾分量が多いからです。

    幸いなことに章立てであるので、それと参考書のページや問題などの項目をもとに計画を立てましょう。

    午前を理解した上で午後の過去問もきちんと解く時間が必要だと思います。

    また、気持ち多めに午後の問題に解く時間をさきましょう。

    思った以上に解けませんでした。

 

午前問題の対策として

他の方とほぼ同じです。

午前の内容に関して教科書的なもので一通りは頭に入れておきます。

私は以下のものを使いました。

キタミ式イラストIT塾 応用情報技術者 令和07年 

他の方の記事では違うものを使ったりしていますし、良し悪しもあると思うのですが、自分が読んでみて頭に入りそうなもので評判が悪くなければよいかと思います。

参考書も解いているご自身も全てをカバーできるわけじゃないと思いますので、聞かれそうなことの70%位をカバーできていれば問題ないと思います。 

これに関して、過去問道場で解いた章から解いていって、最終的に8割くらいを初見で解ければいいのかなと思います。

また、午後の問題を解くにあたって、苦手だなぁと思う分野を見定めておくのもよいかと思います。

私はストラテジ系とマネジメント系が厳しいと思いました。 


午後問題の対策として

まずは過去問道場で午前を6割程度理解しておくことが必要と思います。

一部の記事では午前をきちんとすればあまり午後は勉強しなくて済んだとおっしゃっている記事もあるほど、情報が必要十分にインプットされている必要があります。

私は以下のものを使いました。

2025 応用情報技術者 午後問題の重点対策

みなさんと同じでした。

午後は記述で、応用がまさに問われました。

まずは全ての章の問題を解いてみて、雰囲気を理解する必要があると思います。

私は解けそうな問題と無理だなと思う問題に別れました。

私はデータベースは速攻で無理だなと思いました、SQLの構文覚えていない。

最終的に必修のセキュリティ以外で5,6問解けそうな分野、余分に1,2分野を解けるようになっているのが良いかなと思いました。

また、この問題集に関しては解かない分野の問題を除いて、全ての問題を解いておくべきでした。

なぜならば、分野は同じでも聞かれている内容がちょこちょこ違っていて、何がポイントか理解するには数をこなすしか無いのかなと思いました。

ポイントを理解する点において、問題集の解説をきっちり読むことは大事だと思います。

選択肢であっていたとしても、実は考えていたことと解答の理由が異なっていることがありました。

採点においては、過去問道場の午後も参考にすべきだと思います。


最後に

ぶっちゃけR6秋は例年と比べて合格率が5%くらい高かったので、参考にならないかもしれないです。

頭の中で情報のグラフができているのが大事かなと思います。 

そして、ちゃんと情報を引き出せるということが大事かと思います。

出来ていないならば、その分野のことは理解していないと思います。

そのような分野が小さいなら、午後はなんとかパスできると思いますが、午前も突破できない中途半端なグラフが出来ているなら、まずはその分野をしっかりすべきと思います。

2023年3月26日日曜日

Dissipative Lagrangian Neural Networksについて

最近まで学業で研究をしていました。

その内容がDissipative Lagrangian Neural Networks(github)という先行研究のDissipative Hamiltonian Neural Networks(arxiv.org,github.com)とLagrangian Neural Networks(arxiv.org,github) を合体したものです。

具体的にどういうものかというと

ラグランジュ方程式に基づき、エネルギー散逸を考慮した力学系の学習が可能なニューラルネットワーク

  • Dissipative Hamiltonian Neural Networksでは必要であった正準座標系に依存しない
    • つまり、重さを知らなくても良い。 
  • Lagrangian Neural Networksでは考慮できない散逸を考慮できる
    • 保存場のみの計算が可能であるが、散逸場を含むと計算できない。
    • 空気抵抗などの粘性抵抗、摩擦などのエネルギーロスがあっても良い。

という感じです。
物理屋ではないので間違っていたら、書き換えると思います。たぶん。


ここでは苦労話を書こうと思います。


  1. DLNNで予測するモデル構造には複数のモデルが存在する

    ラグランジュ方程式を解くのですが、
    $$ \ddot{q} = - {\nabla _q \nabla _\dot{q} \cal{L}} + {\nabla _q \cal{L}} - {\nabla _\dot{q} \cal{D}} $$
    という微分方程式で表現することが最終的に求めることなのですが、この過程でヘッシアンで直接求めるか、頑張って二階微分するかです。
    ここで頑張って二階微分するとモデルとしての柔軟性が失われますが、一括で処理することができ、大幅な高速化が見込まれます。
    しかし、今回はvmapで並列化するという手法を取りました。
    これはすべての計算をニューラルネットワークのもつ自動微分で行わないので追跡性(backward?)を損なうと考えております。
    実際にはこのヘッシアンを使っています。
    なぜかそのほうが精度が良かったです。

  2. optimizerなにが良いのかがわからない
    投稿した現在もたくさんのoptimizerが出てきており、投稿時点ではLionというものがここ数週間で出てきた感じとなります。
    最初から備え付けのAdam,AdamW,自分でインストールしたDadapAdam,Lionを試しました。めんどくさくなって、サンプル結果だけAdanとかSGDとか見ました。
    他の方の検証によってはAdamWが良かったり、Adanが良かったり、Lionのタイパが良かったりするなどありました。

  3. optimizerやschedulerの扱いがよくわからない。

    今はdadaptationのAdamとtimmのCosineLRSchedulerを使っています。
    ただ、使用方法に書いてあるとおりに使用しておりません。
    何故かその通りに使用するとあまり芳しい結果が得られませんでした。
    dadaptationは
    「dadaptationがlrも管理するのでスケジューラーは使わないでね。それとd0は1r-6、lr=1でお願いね。」
    というふうに書いてあるように読み取れましたが、そのとおりにするとあんまり芳しくないんですよね。
    なんか試行錯誤の末、選んだ感じになりました。

  4. dadaptationはエポック数を稼ぎにくい

    試行回数が増えるほどnanやなんかdadaptのパラメータがおかしくなります。
    やだねぇ...。

  5. Lossの取り方がよくわからない

    一般的にMSE、平均二乗誤差を取るかと思います。
    これは一般的に有用であると考えます。バッチサイズにも影響を受けず、安定した値を返します。
    ただ、逆に細かな値の調整や外れ値に弱いと考えております。
    今回のような小さな値(0~100)を取り扱い、外れ値のような結果も外れではないという場合にはあまり良くないのではないかと考えております。
    $$ sum(abs(predict-train)) $$ という形でLossを取る場合、ノイズに弱くなると思うところがあるので、今後の課題の一つであるかと思います。

  6. バッチサイズが一般論とは違う
    リソースが許す限り、一般的にバッチサイズは大きければ大きいほど良いみたいな感じがあるのですが、これはそうではないです。
    なぜならば、Lossの取り方が$$ sum(abs(predict-train)) $$になっている場合、バッチサイズが大きくなればなるほどLossが大きくなります。
    しかし、エポック数を無闇矢鱈に増やす訳にはいかない...普通のものと比べるとエポック数を多少増やす必要があるようには思います。

  7. 活性化関数がよくわからない
    結局swishを使っているのですが、形としてはtanhshrinkが合いそうな気がするんですよね。
    結局は使っている活性化関数が答えですね。理由はわからないです。

  8. 隠れ層やその種類について
    現状はdenseで512次元です。
    これは最近になってどうするか考え出したので、結局答えはわからずじまいです。

以上より、なかなかに苦労したところでもあり、今後の参考になる部分ではないかと思います。

 

まとめ

 最近は力学系ニューラルネットワークが盛んになってきている傾向があると思います。これはHamiltonian Neural Networks(arxiv.org,github.com)を提案したSam Greydanus氏が恐ろしいほどすごい人であるからと考えております。

普通こんな事考えないよねと思ったりもしますが、いつの日かこういうニューラルネットワークが普通になるのかもしれない日が来るのかもしれないですし、来ないのかもしれないです...。 


余談

LNNは自身の環境では再現できませんでした。

再現できた方はおめでとうございます。

再現できた環境をネットの海に放流してください。

2022年6月20日月曜日

C++で常微分方程式を解く方法

私はラグランジュ方程式による二重振り子の計算(たぶん)という常微分方程式をPythonのscipyのsolve_ivpやodeintで解いていましたが、もう少し速度がほしいと考えました。

 

そのため、コンパイル型の言語で常微分方程式を解くことができるライブラリを探していました。

 

そこでC++でBoostのOdeintを用いました。

しかしながら、BoostのOdeintではダメでした。

そこで、ODE-Solverを探したところ、「heyoka」に出会いました。


heyoka


 テイラー展開を手法としては用いているようで、一般的に聞く、オイラーやルンゲクッタ法ではないようです。


このライブラリを使うのに個人的には苦労したので、インストールから実際にプログラムを書くまでを記しておこうかと思います。


  1. インストール

    実行環境は以下の通りとなります。
    • Linux:Pop!_OS 22.04LTS(Debian系Ubuntu派生ディストリビューション)
    • gcc:11.2.0
    • Boost:1.74
    • {fmt}:8.1.1
    • LLVM:12~14
    • spdlog:1.9.2
    • TBB:2021.5.0-7

    これらのインストールは
    「apt install libfmt-dev libspdlog-dev libtbb-dev libboost-serialization-dev clang-13 lldb-13 lld-13」
    としておけば、問題ないかと思われます。
    その後、「git clone https://github.com/bluescarni/heyoka.git」 を実行し、githubからリポジトリをクローンしましょう。
    そして、そのリポジトリのディレクトリに移動し、「cmake .」 を実行し、cmakeの準備をしましょう。
    そして、ライブラリとしてインストールするならば、「cmake --build . --target install」と実行しましょう。

  2. プログラムの実行

    適当にプログラムを書きましょう。
    以下は公式にあるサンプルです。(As a simple example, consider the ODE system corresponding to the pendulum)
    single_pendulum.cppと命名。

    #include <iostream>
    
    #include <heyoka/heyoka.hpp>
    
    using namespace heyoka;
    
    int main()
    {
        // Create the symbolic variables x and v.
        auto [x, v] = make_vars("x", "v");
    
        // Create the integrator object
        // in double precision.
        auto ta = taylor_adaptive <double> {// Definition of the ODE system:
                                          // x' = v
                                          // v' = -9.8 * sin(x)
                                          {prime(x) = v, prime(v) = -9.8 * sin(x)},
                                          // Initial conditions
                                          // for x and v.
                                          {0.05, 0.025}};
    
        // Integrate for 10 time units.
        ta.propagate_for(10.);
    
        // Print the state vector.
        std::cout << "x(10) = " << ta.get_state()[0] << '\n';
        std::cout << "v(10) = " << ta.get_state()[1] << '\n';
    }
      

    これを
    g++ simple_pendulum.cpp -o single_pendulum.out -lheyoka
    と実行。
    こうすると実行ファイルが生成されます。
     

    まとめ

    今日触ってみた限りでは、あまり高速だとは感じませんでしたし、Pythonとくらべても0.07sしか差がありませんでした。
    しかしながら、バッチ化やもっと正しい時間の進め方があるようなので、もっと高速になるかと思います。
    また、Boostのライブラリでは得られなかった正しい解を得ることができたので、満足です。

2022年6月5日日曜日

VS Code上のjupyter notebookでmatplotlibのアニメーションを再生する方法(How to play matplotlib's animation with jupyter notebook on VS Code)

こんにちは、WhiteTiger-21です。

タイトル通りの答えは(The answer of title is below)

from IPython.display import HTML
from matplotlib import animation, rc
from matplotlib import pyplot as plt

"""
animへアニメーション処理を行う
"""

HTML(anim.to_jshtml())

です。

細かい話を順に追って

matplotlibでアニメーションを表示する際に、普通は


from matplotlib import animation, rc
from matplotlib import pyplot as plt

def init():
	"""
    アニメーションの処理
    """

def animate(i):
	"""
    アニメーションの処理
    """

"""
ゴニョゴニョしたなにか
"""

anim = animation.FuncAnimation(fig, animate, init_func=init,frames=Nt, interval=1000*(t[2]-t[1])*0.8, blit=True)

plt.show()


という感じで書きますよね。

ただ、jupyter notebookでは

 

from IPython.display import HTML
from matplotlib import animation, rc
from matplotlib import pyplot as plt

def init():
	"""
    アニメーションの処理
    """

def animate(i):
	"""
    アニメーションの処理
    """

"""
ゴニョゴニョしたなにか
"""

anim = animation.FuncAnimation(fig, animate, init_func=init,frames=Nt, interval=1000*(t[2]-t[1])*0.8, blit=True)
HTML(anim.to_html5_video())

という感じで書きますよね。

 これでは画面に真っ黒なプレイヤーの画像が出るだけで再生されません。

これの原因は、VS Codeではビデオコーデックが入っていないからだそうです。

Cannot playback video clip in Jupyter within VSCode #7753 

その参照で、別のシステム(plotly)を使うことをおすすめされていますが、matplotlibで構築したシステムならば、こちらを使うほうが楽ですよね。

 

というわけで、

HTML(anim.to_jshtml())

を使うことがVS Code上でjupyter notebookを動かし、アニメーションを再生する方法として楽なものだと思います。

2021年8月22日日曜日

ZIPで圧縮した画像をZIPで圧縮したまま、画像のリサイズするスクリプトを書きました

みなさん、お久しぶりです。白虎21です。

皆さんは「P1×1v Faиb0×」や「Faиt1a」、「Patre0и」などをご活用されていますでしょうか?

絵師さんをサポートしている場合、画像を見返りとして受け取ることが多いかと思います。

その場合、 画像をZIPで圧縮されたデータとして受け取ることがあるかと思います。

その圧縮されたデータをスマホで見ることがあるかと思いますが、画像サイズが大きくて読み込みに時間がかかったりすることがあるのではないかと思います。

そもそもにスマホでは画素数が多すぎても意味がないと思うところがあります。

そのため、ZIPで圧縮された画像を新たなファイルなどを生成することなく、画像のリサイズを行うことができるスクリプトを書きました。

https://github.com/WhiteTiger-21/python_resize_zip_images

このサイトの「zip.py」が上記の内容が可能なスクリプトです。

他のファイルは開発段階の副産物です。

 

利用方法は該当のZipファイルが存在するところでPowerShellやターミナルを開いて、pythonを実行できる状態にしてください。

そして、次のようなコマンドを入力します。

python zip.py 「任意のファイル」

 

具体例として、「Sample.zip」のイメージをリサイズしたい場合は、次のようになります。

python zip.py Sample.zip


ただし、このスクリプトが利用するにはいくつかの条件があります。

  1. 第一に実行環境である「python」と開発するにあたって使用したパッケージファイルが入っていること。
    pythonが入っていなければ、pythonをインストールする必要がありますが、ただ単にこのスクリプトをダウンロードして、実行したいだけであれば、マイクロソフトの「ストア」アプリから「python」をダウンロードしてください。
    マイクロソフトストアのPythonのダウンロードサイト

  2. MITライセンスに同意する。
    端的に言うと何が起こっても一切の責任を負いません。
    必ずバックアップを取ってください。
    そもそもスマホ向けに画像を圧縮するようなツールなので、劣化なしの元のデータをしっかり取っておいてください。

  3. gifファイルが含まれていないこと。
    gifファイルは連番によりアニメーションのようになっているものがあります。
    それに対する対処を行っていないためです。

  4. ディレクトリが入れ子構造になっていないこと。
    具体的には以下のようなディレクトリ構造となっていることが好ましいです。
        
    Sample
    |-- 01.png
    |-- 02.png
    |-- 03.png
    |-- 04.png
    |-- 05.png
    |-- 06.png
    |-- 07.png
    |-- 08.png
    `-- 09.png
     
    入れ子であったとしても、二分木などではなく、完全なる入れ子、マトリョーシカ状態になっていれば、一番階層の深いところから、一番上に来るだけです。

    具体例として問題のない例は、以下のように、完全なマトリョーシカ状態。

    他、二分木の状態になっていても、ファイル名が異なる状態。
    Sample
    |-- 01.png
    |-- 02.png
    |-- 03.png
    |-- 04.png
    |-- 05.png
    |-- 06.png
    |-- 07.png
    |-- 08.png
    |-- 09.png
    `-- Inside01
        |-- INSIDE_01.png
        |-- INSIDE_02.png
        |-- INSIDE_03.png
        |-- INSIDE_04.png
        |-- INSIDE_05.png
        |-- INSIDE_06.png
        |-- INSIDE_07.png
        |-- INSIDE_08.png
        `-- INSIDE_09.png
     
    上記の2つ所状態に値するものは問題ありません。
    しかし、以下のように、二分木状態であり、なおかつ、ファイル名が同じ場合、ファイルの上書きがされ、Inside03の中身のみが残ります。
        
    Sample
    |-- 01.png
    |-- 02.png
    |-- 03.png
    |-- 04.png
    |-- 05.png
    |-- 06.png
    |-- 07.png
    |-- 08.png
    |-- 09.png
    |-- Inside01
    |   |-- 01.png
    |   |-- 02.png
    |   |-- 03.png
    |   |-- 04.png
    |   |-- 05.png
    |   |-- 06.png
    |   |-- 07.png
    |   |-- 08.png
    |   `-- 09.png
    |-- Inside02
    |   |-- 01.png
    |   |-- 02.png
    |   |-- 03.png
    |   |-- 04.png
    |   |-- 05.png
    |   |-- 06.png
    |   |-- 07.png
    |   |-- 08.png
    |   `-- 09.png
    `-- Inside03
        |-- 01.png
        |-- 02.png
        |-- 03.png
        |-- 04.png
        |-- 05.png
        |-- 06.png
        |-- 07.png
        |-- 08.png
        `-- 09.png
    
    
  5.  

以上が利用するにあたっての利用条件です。

 

今回の記事は以上となります。

皆さんのお役に立つスクリプトとなれば幸いです。

また、改善点がございましたら、githubのREADME.mdにも記載している通り、Twitterにまでご連絡ください。

2018年10月26日金曜日

「Ray Tracing in One Weekend」をやってみて

最近レイトレやc++、OpenGLなどを触り始めました。
今回はPeter Shirley氏のRay Tracing in One Weekendについて書いていこうかと思います。
日本語訳はここ。
githubはここ。
pdfをココ最近配布されたのですが、url忘れました。
*2019/3/10追記
pdfは ここ。

技術的な解説は他の方がたくさんされていらっしゃって、非常にわかりやすいので、
レイトレ自体の解説は省き、環境構築、注意事項についてのお話です。

 

環境構築について

私はDebianで開発しています。
理由は以下のとおりです。
1.Linuxは開発環境としてぶっ壊しと再生が楽
2.VisualStudioが重すぎてヤダ
3.他の開発を考えるとクソ楽
の3つです。

1と3は似たような感じなのでまとめますが、私はEmacsをプログラミングをする際に使っています。また、freeglutやglfwを触ったりもしています。そして、gitを頻繁に使っています。
Windows環境下ですとソフトウェアのダウンロードがめんどくさいからです。
今回では特別なライブラリが必要ではないのですが、最低必要なエディタにコンパイラ、gitをインストールするはめになります。

2ですが、私の環境におけるEmacs、g++、gdbなどなどその他諸々を制覇した素晴らしいIDEです。ですが、その分重い。後、Windowsでしか起動できないはず。
叩いて3sくらいで開かないとやる気なくしてしまうところがあるからです。
*2019/3/10追記
ウィンドウにツリーとか表示して邪魔。
自動で{}を縮めてくれるのはいいんですけど。
コード一気にみたい。

注意事項

私自身あるあるでググったら出てくるオチなのですが、 Chapter8でsphere.hのclassにmaterial *mat_ptrを入れなければなりません。
後、MAXFLOATでダメならば、FLT_MAXにすると走ります。

感想

多分ほぼ初めてc++とレイトレを触ったのに近い感じの私ですが、レイトレはどのように実装されて、c++でどのように書かれているのか少しわかりました。
この一冊では球体しか出すことができませんが、レイトレの基礎を触りだけ簡単に理解できる気がします。
CGの基礎をきちんと実装も含めて書いてあるので気になるなぁというお方はエディタとコンパイラさえあればできるのでされてみるのはいかがかなぁと思います。
macOSやLinuxをお使いの方は何もせずできると言っても過言ではないくらい依存ライブラリがありません。
今現在、私は床井教授が出されているOpenGLのをしているので先になると思うのですが、この次のものもチャレンジしてみようかと思うところです。