プログラマー面接時の質問に答えてみる(1)

以下のものを見つけてしまったので質問事項に答えてみる。といってもプログラマーではないしなる予定もない、自分の知識の確認のために答えてみる。
無精で短気で傲慢なプログラマ 技術者・SE・プログラマ面接時の技術的な質問事項
長いので2回に分けます。
ではいきます。

UNIX

使用 OS は何か (FreeBSD/Linux/Solaris/UNIX)

触ってみた経験ということなら、FreeBSDLinuxSolarisHP-UXです。
現在使っているものということならLinuxです。

grep/tar/find の使用経験★
cron 設定経験★

すべて有りです。

パーミッション (chmod 777, chmod rwx など) の意味★

r:読み取り
w:書き込み
x:実行
777はそれぞれ左から順に1桁目が自分自身の、2桁目が同じグループのユーザーの、3桁目がそれ以外のユーザーの権限を表します。
各権限は実行が1(001b)、書き込みが2(010b)、読み込みが4(100b)であり、これらを足し合わせる(ORをとる)ことで表現しています。

ディレクトリに対する r/w/x はそれぞれどういう意味を持つか★

r:分かりません
w:そのディレクトリ直下にファイルを作成できるかどうか
x:そのディレクトリ以下を探索できるかどうか

1755・2755・4755 それぞれの意味は何か★

sticky bitの違いということは分かりますが、それ以上は分かりません。

パッケージ管理には何を使っているか

yumないしRPMです。

configure からアプリケーションをコンパイルしたことがあるか

有ります。

共有ライブラリとは何か

静的ないしは動的にリンクされるオブジェクトファイルで他のオブジェクトで使用されることを目的とした関数を含んでいます。

"ls"とだけタイプしたときはlsを探索し見つかった場合はforkします。"ls|sort"とするとlsの標準出力をsortの標準入力につないだ上でforkします。

fork/exec する簡単なシェルを書けるか

与えられた入力からオブジェクトを探索しfork/execするだけなら書けますが、パイプおよびジョブ管理といった機構はかける自信がありません。

子プロセスが親プロセスから引き継ぐもの、引き継がないものを、それぞれ数点あげよ★

  • 引き継ぐもの
  • 引き継がれないもの
    • プロセスid
    • 親プロセスid
    • 処理待ちのシグナル

言語

どの言語が好きか。使用している言語のバージョンは(言語共通)★

Pythonです。と答えてしまうと以下の問いに該当がないのでCにしておきます。

  • Perl
    • どのモジュールが好きか
    • print と syswrite の違いは何か★
    • Web フレームワークには何を使っているか
  • Java
    • Web フレームワークには何を使っているか
    • 「クラス変数/インスタンス変数/ローカル変数のうち、スレッドセーフなのはローカル変数だけである」とはどういう意味か
  • PHP
    • Web フレームワークには何を使っているか
    • PEAR で利用しているパッケージは何か
    • php.ini で定義できる以下のディレクティブの違いを述べよ。★
      • default_charset
      • mbstring.language
      • mbstring.internal_encoding
      • mbstring.http_input
      • mbstring.http_output 
      • mbstring.encoding_translation
      • mbstring.detect_order
  • Ruby
    • Ruby に対する熱い思いのたけを述べよ
  • C
    • リンクリストを書けるか
    • 可変長引数な関数を記述したことがあるか
    • malloc(3)/realloc(3) にて、動的メモリ管理ができるか
    • printf(3) と write(2) の違いは何か
    • Makefile を書けるか
    • コンパイルアセンブル・リンクとは何か
    • 二乗を返すマクロ #define MY_POW(x) ( (x)*(x) ) の問題点は何か★

リンクリストはかけます。
可変長引数の関数は書いたことがないです。
malloc/reallocは使えます。
printfは書式付出力でwriteは書式なしの出力です。
Makefileは書けます。
コンパイルはソースを機械語ないしアセンブラにする行為でアセンブルアセンブラ機械語にする行為でリンクは複数のオブジェクトコードを一つにまとめる行為です。
そのマクロだと"MY_POW(i++)"とすると"i++"が二回評価されることになります。"i=1"で呼び出された場合、評価の結果1が返り"i=2"となっているのが望まれる動作ですがそのマクロでは評価の結果は2であり"i=3"となります。

コンピュータ基本素養

エンコーディングとは。文字集合とは (ISO-2022-JPJIS X 0208 を説明できるか)
RFC を読んだことはあるか。
テキスト領域とは何か。スタックとは何か。ヒープとは何か。
ブラウザに URL を入力してから、ページが表示されるまでのステップを示せ
BNF (拡張BNF) とは何か。簡単な例をあげよ★

エンコーディング文字集合をどういった符号を割り当てるかを決めるもので、文字集合は符号化すべき文字の集合です。
RFCの日本語訳は読んだことがあります。
テキスト領域とは実行されるコードが収められているメモリ領域のことです。またスタックはFIFOな記憶域でありヒープはプログラム側で自由に使える記憶域です。
URLが入力されるとまずURLをプロトコル、ホスト名、そしてパスに分割します。次にプロトコルに応じた処理がされるわけですが、一例としてhttpの場合はホスト名が示す先の特に指定がなければ80番のポートに接続します。そして、HTTPの規約に従いGETおよびPOSTメソッドを用いて要求を送信し相手側からの応答を待ち、データを得ます。ここで正常な応答が得られたならMIMEコードから適切な動作を選択します。ここでMIMEコードがtext/html等であった場合そのデータをハイパーテキストとして表示します。
BNFとは構文を定義するもので例えば以下のようなものです。

 ::= 0|1|2|3|4|5|6|7|8|9
 ::= ||.