Code makes the world a better place

Shell の仕組みと簡単な実装

Shell 紹介

ローカルの Unix、Windows、あるいはサーバーへ接続するときでも、私たちは端末(Terminal)を開きます。ログイン直後に表示される画面が Shell で、開発者はここにコマンドを入力してプログラムを実行します。ある意味では、「端末を使う」ということは「Shell を使う」とほぼ同義に語られることもあります(厳密には元々の意味は一致しません)。Shell の詳細は英語版 Wikipedia の「C shell」も参考になります。

Continue reading

私がコンピュータサイエンスに興味を持つまで

私は現在、交大の資工(CS)修士課程で学んでいます。CS の道を選ぶまでには長い時間がかかりました。本記事ではできるだけ最初から振り返り、私の CS への興味がどのように少しずつ形作られていったかを語ります。人それぞれ物語は違いますが、私の経験が誰かのヒントや学びになれば嬉しいです。

Continue reading

赤黒木(Red-Black Tree, RBT)の紹介

赤黒木の概要

赤黒木(Red-Black Tree)は特殊なデータ構造で、AVL 木と同様に自動で平衡を保つ機能を持ちます。

赤黒木には以下の性質があります:

  • 各ノードは黒または赤のどちらか
  • 根(root)は黒
  • すべての葉(leaf)は NIL であり黒
  • あるノードが赤なら、その子はすべて黒
  • root から leaf までの各パスに含まれる黒ノード数は等しい

これらの規則に従うことで、ノードの挿入や削除を行っても木の平衡状態を保てます。赤黒木は、ノード数が n のとき木の高さが最大でも 2log(n+1) を超えないことが保証されます。

現実世界では集合(set)や辞書(dictionary)の実装に使われることが多く、C++ の std::setstd::map は内部的に赤黒木で実装されています。

Continue reading

Unix における `sigaction` を使ったシグナルの例

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 が発生します。

Continue reading

`mmap` を使って共有オブジェクトを作る

多数のプロセスがあり、共有データを扱うために 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(共有オブジェクト)を作れます。こうすると別々のプロセスが同じオブジェクトへ直接アクセスできます。

Continue reading

台大観察と所感(9):学部4年(下)&ログアウト

これは私にとって台大の第8学期であり、同時に最後の学期でもあります。学部4年(下)は多くの人にとって気楽な時期で、単位は修了していて卒業のプレッシャーもありません。けれど私は転系したうえ、他学部・他学科の授業を取り続けていたせいで、学部4年(下)になっても必要単位がまだ埋まっていませんでした。そのため今学期も12単位を履修し、ほぼ毎日学校に通うことになりました。

全体として、学部4年(下)は私にとってどこか不条理で、何もきちんとできていないような感覚がありました。誇れることはあまりなく、嬉しかった出来事がいくつか、そして強く印象に残った挫折がいくつかありました。

Continue reading

駆け出しプログラマの成長ロードマップ

『The Clean Coder』の感想・要約・補足


最近『The Clean Coder』(中訳:無瑕的程式碼 番外篇-專業程式設計師的生存之道)を読み終えました。ちょうどネットで最もよく見る質問の 1 つに答えられる内容だったので、この文章を書きます。

駆け出しエンジニアとシニアエンジニアの違いは何か?

Continue reading

台大観察と所感(8):学部4年(上)

台大での生活も4年目に入りました。気づけばキャンパスにいられる時間はあと1年しかなく、名残惜しい気持ちになります。高校から台大に入り、もうすぐ台大を卒業するまでの間に、私は大きく変わりました。物理学者になりたかった自分がソフトウェアエンジニアになり、好きな運動も水泳からテニスへ変わりました。経験してきたことは本当に多く、GIS Taiwan、綠領農学市集、複数社でのインターン、さまざまな講演など、時々自分でも「こんなこともしていたのか」と忘れてしまうほどです。

Continue reading