2Dパターンによるカメラキャリブレーション
- 2020年4月6日
- Liu, An-Chi 劉安齊
Code makes the world a better place
ローカルの Unix、Windows、あるいはサーバーへ接続するときでも、私たちは端末(Terminal)を開きます。ログイン直後に表示される画面が Shell で、開発者はここにコマンドを入力してプログラムを実行します。ある意味では、「端末を使う」ということは「Shell を使う」とほぼ同義に語られることもあります(厳密には元々の意味は一致しません)。Shell の詳細は英語版 Wikipedia の「C shell」も参考になります。
Continue reading
私は現在、交大の資工(CS)修士課程で学んでいます。CS の道を選ぶまでには長い時間がかかりました。本記事ではできるだけ最初から振り返り、私の CS への興味がどのように少しずつ形作られていったかを語ります。人それぞれ物語は違いますが、私の経験が誰かのヒントや学びになれば嬉しいです。
Continue reading
赤黒木(Red-Black Tree)は特殊なデータ構造で、AVL 木と同様に自動で平衡を保つ機能を持ちます。
赤黒木には以下の性質があります:
NIL であり黒これらの規則に従うことで、ノードの挿入や削除を行っても木の平衡状態を保てます。赤黒木は、ノード数が n のとき木の高さが最大でも 2log(n+1) を超えないことが保証されます。
現実世界では集合(set)や辞書(dictionary)の実装に使われることが多く、C++ の std::set や std::map は内部的に赤黒木で実装されています。
Unix ではプロセス間通信の方法がいくつもあります。本記事では signal(シグナル)の簡単な使い方を紹介します。まずは Beej の紹介 を読むと良いです。名前のとおり、signal はプロセスが送受信する通知です。例えばシェルを使っているときに Ctrl-C でプログラムを中断できるのは、シェルが Ctrl-C によって送られた SIGINT シグナルを捕捉し、interrupt signal(割り込み)だと判断して実行中のプログラムを停止するためです。
signal を送るには sigaction() または signal() を使えますが、より新しい sigaction の利用をおすすめします。詳細な違いは Stack Overflow の「What is the difference between sigaction and signal?」が参考になります。
signal を発生させたい場合は kill() または sigqueue() を使えます。後者は Linux 限定ですが、siginfo を通じて signal に追加情報を載せられます。また、いくつかの system call 自体が signal を発生させることもあります。例えば存在しない socket に対して send() しようとすると SIGPIPE が発生します。
多数のプロセスがあり、共有データを扱うために shared memory(共有メモリ)を実装したい場合、shared memory を使って実現できます。shared memory の作成には mmap または System V の shmget を使えますが、Stack Overflow の回答「How to use shared memory with Linux in C」によると、shmget はやや古く、mmap のほうが新しく柔軟です。
shared memory を使うと、プロセス間で共有できるメモリ領域を作れます。mmap はその領域へのポインタを返し、型は void * です。そこにデータを入れたい場合は、memcpy でオブジェクトや文字列などを共有領域へコピーできます。また、void * をそのままオブジェクトポインタへキャストすれば shared object(共有オブジェクト)を作れます。こうすると別々のプロセスが同じオブジェクトへ直接アクセスできます。
これは私にとって台大の第8学期であり、同時に最後の学期でもあります。学部4年(下)は多くの人にとって気楽な時期で、単位は修了していて卒業のプレッシャーもありません。けれど私は転系したうえ、他学部・他学科の授業を取り続けていたせいで、学部4年(下)になっても必要単位がまだ埋まっていませんでした。そのため今学期も12単位を履修し、ほぼ毎日学校に通うことになりました。
全体として、学部4年(下)は私にとってどこか不条理で、何もきちんとできていないような感覚がありました。誇れることはあまりなく、嬉しかった出来事がいくつか、そして強く印象に残った挫折がいくつかありました。
Continue reading最近『The Clean Coder』(中訳:無瑕的程式碼 番外篇-專業程式設計師的生存之道)を読み終えました。ちょうどネットで最もよく見る質問の 1 つに答えられる内容だったので、この文章を書きます。
駆け出しエンジニアとシニアエンジニアの違いは何か?
Continue reading
台大での生活も4年目に入りました。気づけばキャンパスにいられる時間はあと1年しかなく、名残惜しい気持ちになります。高校から台大に入り、もうすぐ台大を卒業するまでの間に、私は大きく変わりました。物理学者になりたかった自分がソフトウェアエンジニアになり、好きな運動も水泳からテニスへ変わりました。経験してきたことは本当に多く、GIS Taiwan、綠領農学市集、複数社でのインターン、さまざまな講演など、時々自分でも「こんなこともしていたのか」と忘れてしまうほどです。
Continue reading