StudyCS.log

ただの日記

2021/11/12(タイマープロセスのさわりはじめ)

ただの日記。
 
アニメーションを書く
 引き続きJavaで2Dのプログラミングを学んでいる。昨日の段階で、ボード上に絵を書いたりロードした画像を表示したりというところまではできた。今日はロードした画像をボードの上で動かしてアニメーションを作る場合を考える。アニメーションを書くなら、まずはボードをきれいにして、絵の座標を計算して、計算された座標に指定の絵を描画する、という流れで作る。これを指定された時間ごとに行うということだ。
 絵を描画する作業は、昨日のボードに絵を書く作業と同様なので良いとして、新たにタイマープロセスについて考える必要が出てきた。どのように、時間を計測し、指定時間ごとの処理を達成するかだ。今日はSwing Timerというのを試した。これはシンプルだが、非効率な方法ということだ。明日は、Utility Timer とThreadを試す予定で、それが終わったら、また振り返りを行いたいと思う。
 
しきい値を決定する
 画像を二値化するためには、そのしきい値を決定する必要がある。最も単純な方法は固定のしきい値を決定し、そのしきい値をもとに画像を2つの値に変換することだが、現実の環境では照明環境が時々刻々と変化することが多い。そこで、画像に含まれる情報から動的にしきい値を決定する方法を考える必要がある。動的なしきい値を決定する方法として有名なのはモード法やP-タイル法があっる。モード法は画像から生成されたヒストグラムのなかから条件を満たすしきい値を選んでくる方法で、p−タイル法は抽出対象が画像中で占める割合を以てしきい値を決定する。さらには、パラメータを全く指定せずにしきい値を決定する方法もあって、これが判別分析法だ。判別分析法では、画像を2つのクラスに分割して、その2つのクラスの平均値の分散がもっとも離れるようなパラメータを探索する(つまり、2つのグループの平均をとったときに、その平均がもっとも離れるようなパラメータを探索する)。これは完全に計算のみで求められるもので、パラメータを考える必要や、解なしに対応する必要がない。すばらしい。感動した。
 
 Ladder Seriesのイソップ物語を読んでいる。これが原作にどれほど忠実に作っているのか謎なのだが、僕の知っている話と結構違っていたりする。例えばオオカミ少年の話の場合、僕の知っているオオカミ少年は悪意によって嘘を付き、最終的に痛い目にあった。ただ、この本では、オオカミ少年は単に臆病が故に、勘違いで人を読んだことになっている。
 どっちが本筋なのかはさておきとして、ボク個人としては校舎のほうが、読者を考えさせる効果は高いと考える。だって現実では、悪意で嘘を吹聴する人というよりは、割と真に迫った感じで(嘘を嘘と思わず)嘘をばらまく人のほうが多いからな。

2021/11/8,9(生協でスイーツ)

ただの日記。
 
スイーツ
 最近、生協でスイーツを買食いするのがマイブームになっている。ポケット菓子などと比べて高価なイメージがあったスイーツ系だが、買ってみるとそうでもないな。生協で売ってるものだと殆どが100円から200円のレンジに収まっているし、おにぎりとかと買い合わせるにも無理のない値段だ。
 演習科目のせいでストレス値がかなり高めなので、甘いものを食べるつかの間の休憩がとてもありがたい。個人的なお気に入りはロールケーキだな。切ってあるやつじゃなくて一本まるごと入ってる細いやつだな。
 
SRラッチ
 現代のコンピュータ設計で使われるのは基本的にDフリップフロップで、それ以外のフリップフロップはあまり使われないらしい。そのDフリップフロップ回路を見ていると、SRラッチが非常に重要な役割をしている。まずは値を保存しておくという用途で、閉路を組むことでお互いがお互いに入力を入れあってビットが保存されるようになっている。これはアニメーションを見るととてもわかりやすいと感じた。ネット上で探した限りでは、次のアニメーションが一番わかりやすかったので添付しておく。
 そして、Dフリップフロップはクロックの立ち上がりエッジのときだけ値を取り込まなければならないため、立ち上がりエッジ以降のクロックの入力は無視するように設計する必要がある。SRラッチはこのときにも重要な役割を果たしており、エッジトリガ型ではこれを複数用いることで、立ち上がりエッジのときの入力のみを保存するようにしている。

2021/11/7(Javaと仲直りする必要がある)

ただの日記。
 
フィルタリング
 画像のフィルタリングについて復習した。フィルタには様々な用途が存在し、その用途ごとにフィルタが考えられている。線の輪郭を抽出するようなフィルタとしては線形差分フィルタを用いる。上下左右でその差分をとって、その差分を新しい画素値として採用する。明暗差の大きな箇所の画素値が大きくなるので新しい画像は輪郭を抽出したようなものになっている。非線形なフィルタをアイデアを広げると、もっと様々なことができる。代表的なものとして画像の平滑化や鮮鋭化がある。平滑化はノイズを除去して画像をなめらかにする処理で、メディアンフィルタなどは高い性能を発揮する。鮮鋭化は画像をはっきりとさせる処理で、輪郭抽出のフィルタを応用すると作れる。画像のグラフを2回微分したような関数を考えると、それは画素値の変化のピークを表したような関数になる。これをもとの関数から引くと、輪郭においては画素値が大きく異なるようなグラフになり、画像の上では輪郭がはっきりとした画像が出来上がる。このように画像のフィルタには様々な用途がある。目的は一緒でも手法が異なるいろいろな方法が考案されており、使い分けもまた重要だと考える。(結局はどういう画像を作りたいか)
 
Javaと仲良くなろう
 これまでの日記で何度も書いているのだが、僕はJavaとあまり仲良くなれていない。僕はJavaがあんまり好きじゃないし、たぶんJavaも僕のことが嫌いだろう。とはいえ、Javaとの仲をこのまま放置しておくと色々と問題がある。特に大学の単位の問題は深刻だ。大学では強制的にJavaでの実装を求められており、かつ実装もそこそこのスピードを求められる。単位を取れるか否かは、いかにJavaと仲良くなるか、にかかっているのだ。
 ということで、日常生活でもJavaを書く時間を作っていこう。
 特に作るアイデアが浮かばないのだが、コーディングを楽しい時間にすることを考えるとゲーム開発あたりが無難なのかな。開発はgithub上でオープンにやることにした。まぁコードが外部から参照できるというのは重要ですよね。僕もその恩恵に日々預かっているわけだし。
 まぁ何を作るかはおいおい考えるよう。とにかく以上のようなことでJavaといよいよ仲良くならないといけなくなったので、今後は日記でもjavaの話題が増えるかもしれない。
 あ、そうそう、githubアカウントは昨日作りました。今まで自分自身ではオープンソースの開発をやってこなかったのでアカウント持ってなかったんですよね。アカウントはこれです -> https://github.com/HoriK816 基本的には自分がほしいと思ったものを作ろうと思います。

2021/11/6(コンパイラに守られる)

ただの日記。
 
コンパイラに守られる
 セキュリティの学習を進めている。今日はコンパイラコンパイル時に付与するセキュリティ機構について学んだ。意図しないデータの書き換えを防ぐRELRO、オーバフローを検知するSSP、不要なデータを実行できなくするためのNX bit、スタックなどの配置をランダム化するASLRなど、コンパイラは単にコードをバイナリに直して最適化するだけでなく様々なことを行っている。我々はコンパイラに守ってもらうことでセキュアなPCライフを送っているのだなぁと痛感した。
 
雑談なんてやめてしまうか
 友人と雑談ラジオ的なことやっているが、だんだんと負担になってきた。今勉強中の内容を話すことで整理するとか、そういう用途なら雑談は良いのだが、誰でもわかる内容を話せとなると特段トピックを持ち合わせないのである。きっちとしたラジオ形式に振り切ったことの副作用がここで現れている。どうせ捨てるだけの没原稿を量産する時間も無駄だし、いっそやめてしまったほうが良いかもしれんな。

2021/11/4,5(バイナリ解析入門)

ただの日記。
 
バイナリ解析入門
 バイナリ解析の本を読んでいる。僕の興味分野の問題なのか、うちには名前は違えども結局はバイナリ解析の基礎を与えている、という本が結構ある。それはときにコンピュータアーキテクチャであったり、バイナリ解析と銘打った本であったり、リバースエンジニアリングの本であったり。今回バイナリ解析の勉強にいよいよ本腰を入れているから、足並みをそろえていろいろな本を一気に進めている。こういうのは思い切りとペースが大切だ。並行していろいろなバイナリ本を進めるのには、結構恩恵がある。まずは、本当に大切な内容は何度も読まされて頭に叩き込まれる点。x86の主要なレジスタはもうだいたい覚えた。主要なトピック以外の様々なトピックについては本ごとにかなり特色があっておもしろい。
 そして、1冊に飽きたら別の本で同じような内容を学び続けられるというのも良いね。
 
日記は朝書こう
 眠い。とにかく眠い。毎回この日記は夜の寝る直前に書いており、いつもまぶたが半分落ちてきているタイミングで書いている。そのため後日読み返すと文章が大変支離滅裂で、ひどいときにはなんのことを言っているのか全く思い出せないこともある。
 そしてなによりも、眠いときの日記つけるモチベーションなんて大概低いので、日記の習慣が辛いものに変わってくる点が問題だ。
 これを朝に回せば多少はマシになるのではないだろうか。朝は頭がまだ正常だし、そもそも僕は朝が一番作業のモチベが高い人間なので。
 ということで、明日からは極力朝日記をつけることにする。
 でも、今日の分は今書いてるから明後日からになるかな。

2021/11/3(常設CTFに挑む)

ただの日記。
 
picoCTF
空き時間に取り組んでいたCpawCTFがアクセスできない状態になっている。手持ち無沙汰になってしまったので、有名な常設CTFであるpicoCTFにチャレンジしてみることにした。picoCTFには学習用の問題がまとめてある "picoGym Practice Challenges" というページがあり、面白い問題が揃っている。
試しに勉強中のリバースエンジニアリングの問題を解くなどしてみた。与えられたpythonファイルを眺めて挙動をチェックし、フラグを得る。途中、多少手間取ったが最終的にはうまく解決できたようでよかった。今後もしばらくはpicoCTFに時間を割いていこう。
 
セキュリティコンテストチェレンジブック-rev
セキュリティコンテストチャレンジブックの第1章を読み終えた。第1章ではバイナリ解析の大まかな流れと、各段階において必要な知識が紹介されている。途中アセンブリが紹介されているあたりで面食らったがなんとか読み進めた。最後には関数のプロローグとエピローグの流れが復習できて、良い勉強になった。
そして、どうも筆者はデコンパイラの利用にはやや消極的なようだ。Ghidra本などではのっけからガンガンデコンパイラを使っていくが、他のリバースエンジニアリング本を見てもアセンブラに重きが置かれている。これは、どっちが正解なのかわかりかねるが、とりあえずはデコンパイラはあまり使わない方針でやってみよう。(そもそもghidra本を読み終えていない)
 
2Aの練習を始めた
 ダブルハンドルーピングをやってみたいなとふと思いたち、2A用のヨーヨーを新たに購入した。
 初めて見るとやはり両手を同時に動かすのは難しいな。2Aは時間がかかると聞いているけど、これは本当に長い道のりになりそうだ。
 ただ、やはりヨーヨーの動きが大きくてやっていて楽しいというのはある。
 まぁ気長にやっていこう。