技術者・SE・プログラマ面接時の技術的な質問事項

 http://68user.blog27.fc2.com/blog-entry-41.html
 
 なんか、面白いものがあった。
 自分の技術力チェックに使ってみる。弱かった部分は補強しようかな。
 あくまで分かってるかどうかのチェックなので、厳密さは省略してます。

UNIX
 ・使用 OS は何か (FreeBSD/Linux/Solaris/UNIX)
  →LinuxSolarisはたまに触るけど、殆ど使わない。

 ・grep/tar/find の使用経験★
  →
   grep……正規表現を使って書ける。
   tar……圧縮・解凍が出来る。(でもgzip使えるのはGNU tarのみなのよね……)
   find……ファイル名を探すときにぐらいしか使わない。
   
  ・cron 設定経験★
  →plaggerの定期実行とか。

 ・パーミッション (chmod 777, chmod rwx など) の意味★
  ・ディレクトリに対する r/w/x はそれぞれどういう意味を持つか★
   →read/write/execute

  ・1755・2755・4755 それぞれの意味は何か★
   →sticky bitだっけ?

 ・パッケージ管理には何を使っているか
   →rpm+yum(specファイルもある程度なら書ける。)   

 ・configure からアプリケーションをコンパイルしたことがあるか
   →ある。元々Plamo Linux使いなので……w

 ・共有ライブラリとは何か
   →プログラムから呼ばれる共通の関数を外部ファイルとして別にしたもの。

 ・シェルの役割を示せ
  →ユーザと対話するための地盤。

  ・第一段階: コマンドラインにて ls とタイプしたとき
   →現在のカレントディレクトリのファイル名の一覧を表示する。

  ・第二段階: コマンドラインにて ls | sort とタイプしたとき
   →現在のカレントディレクトリのファイル名の一覧をソートして昇順で表示する。(こんなのでいいのかな?)

 ・fork/exec する簡単なシェルを書けるか
  ・子プロセスが親プロセスから引き継ぐもの、引き継がないものを、それぞれ数点あげよ★
   →分からんw 親のプロセスIDは引き継いだと思う。

・言語
 ・Perl
  ・どのようなモジュールを使ってきたか
   →CGI.pm、Template-Toolkit、Web::Scriper、DBIC/CDBI……数えればキリがない。

  ・Web フレームワークには何を使っているか
   →Catalystで、簡単なMVCは作れる。(それしか知らない。)
 ・Java
  ・Web フレームワークには何を使っているか
   →Struts
  ・「クラス変数/インスタンス変数/ローカル変数のうち、スレッド
    セーフなのはローカル変数だけである」とはどういう意味か
   →他のスレッドからアクセス可能な変数は、値が不慮に書き込まれることがあって危険ですよ。の意。

 ・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
  →使ったこともあるし、一時期はちょっと本格的にやろうかと思ったが、
   残念ながらあまり熱い思いは無い。

 ・C
  ・システムコールとライブラリルーチンの違い
  →システムコール……カーネルの機能を使う。
   ライブラリルーチン……いくつかの処理の複合。時にシステムコールを呼び出すこともある。

  ・リンクリストを書けるか
  →テストしている最中に何度かsegment error出すかもしれないけど、最終的には書ける。

  ・可変長引数な関数を記述したことがあるか
  →あー・・・これは無い。書き方は分かる。

  ・malloc(3)/realloc(3) にて、動的メモリ管理ができるか
  →リンクリストを書くってことは、動的メモリ管理を行うという認識なのだが……。

  ・Makefile を書けるか
  →簡単なものなら書ける。

  ・コンパイル・アセンブル・リンクとは何か
  →コンパイル……高級言語機械語に翻訳する
   アセンブル……アセンブリ言語機械語に変換する。
   リンク……依存関係のあるライブラリ等と結合し、実行ファイルに変換する。

  ・二乗を返すマクロ #define MY_POW(x) *1 の問題点は何か★
  →MY_POW(a++)で、a=1のとき、答えは2となる。


・コンピュータ基本素養
 ・エンコーディングとは。文字集合とは (ISO-2022-JPJIS X 0208
  説明できるか)
  →あまり定義について詳しく考えたことは無いなぁ……。
   文字コード規則に従って、バイト配列を文字に置き換える程度の解凍しかできない。

 ・RFC を読んだことはあるか。
  →HTTP程度なら。SOCKSも読んだかなぁ?
   最近仕事でSSLv3、TLS1.0、TLS1.1、TLS1.2を読んだ。他にも読んだことがあるかもしれないけど、印象に残ってない。

 ・printf(3) と write(2) の違いは何か
  →ライブラリ関数とシステムコールの違い?

 ・テキスト領域とは何か。スタックとは何か。ヒープとは何か。
  →テキスト領域はちょっと分からない。
   データ構造のスタックなら、後入れ先出し方式のあれ。プログラムの実行アーキテクチャーの話をしているのなら別だがw
   ヒープは動的に確保できるメモリ空間……という解釈でいいのかな?

 ・ブラウザに URL を入力してから、ページが表示されるまでのステップを示せ
  →URLをパースして、プロトコル・ドメイン名・パス・GETパラメータに分解する。
   プロトコルから、接続方式を判別する。
   ドメイン名をDNSを用いてIPアドレスに変換して、対象ホストに接続する。
   GET パス名で、対象のサーバからファイルを要求する。
   レスポンス結果をブラウザに返し、ブラウザが解釈する。

 ・BNF (拡張BNF) とは何か。簡単な例をあげよ★
  →ジェイコム男……ではなく、文法を記述する言語。バッカス・ナウア・フォーム。
   簡単な例は……ちょっと思いつかない。

・アルゴリズム★
 ・クィックソートの概要を述べよ
  →中央付近にある値を基点にして、左端と右端から基点より小さい値と大きい値を探して入れ替えていく方式。
   起点にたどり着いたら、基点を中心に分割して左側の列と右側の列に同じ処理を繰り返す。
   ……図を書かないと分からんな。これ。

 ・O(n) とはどういう意味か
  →最悪n回の繰り返しが発生する。

 ・スパム判定に使用されいているベイズの定理とは何か
  →事象Aが発生した状態で事象Bが発生する頻度を求める確率計算法。

 ・将棋やチェスなどの思考ルーチンで使用されるミニマックス法とは何か
  →自分の指し手に対する評価関数から相手の指し手に対する評価関数の差分が最大値になるように指し手を取捨選択するアルゴリズム。

 ・遺伝的アルゴリズムとは何か
  →解候補となるパラメータをランダムに生成して、評価にかける。
   評価結果が優れていたものを残し、それらを組み合わせて解答のパターンを新たに生成する。また、一部の解を無作為に書き換える。
   何回か繰り返した結果、最良の結果が得られたものを最適解とするアルゴリズム。

 ・有限の在庫と、それを買いたいお客様がいます。ただし 1人のお客様には必ず
  2個の在庫を引き当てる必要があります (1個は NG。3個以上も NG。0個はアリ)
  お客様は各在庫について欲しい順に順位を付けています。在庫引き当て数と
  顧客満足を最大にする引き当てを求めるための方法を示せ。顧客満足の定義など
  不明点はおのおの考えること。

  →問題の意味がよく分からない……のは自分の理解が足りないからか。
   理解だけで時間がかかりそうなので、後で考える。

・データベース
 ・SQL経験
  ・WHERE 句と HAVING 句と GROUP BY 句の意味と、評価順位★
   →WHERE句  選択した列からWHERE句以下の条件に一致する列のみを残す。
    HAVING句  GROUP BYした結果から、HAVING句以下の条件に一致する列のみを残す。
    GROUP BY句 GROUP BY句以下に書いた列で値が同じものを集約する。
    優先順位は WHERE > GROUP BY > HAVINGの順番

  ・CASE・UNION・EXISTS の使用経験★
   →あるけど、パフォーマンス劣化の原因となるので、なるべく使わない。

 ・データベース利用経験 (Oracle/MySQL/PostgreSQL/その他)
  ・Oracle であれば、テーブルスペース (表領域) とは何か。エクステントとは何か。
  →テーブルが配置されるファイル。BIGFILE句を使うと、ファイルは1つ。SMALLFILE句を使うと、ファイルは1024個まで……かな。
   エクステントはディスク装置のブロックのようなもの。

  ・MySQL であれば、MyISAMInnoDB の違い。
  →MySQLはそこまで詳しくない。

 ・ER図とは何か
  →データベースの論理設計を表現する図。

 ・正規化とは何か
  ・第一正規形とは何か
   →1つの表内に部分関数従属を持ち、1つの行に繰り返しグループを持たないもの。

  ・第二正規形とは何か
   →第一正規系の状態から1つの表内に推移関数従属を持ち、部分関数従属を持たないもの。

  ・第三正規形とは何か
   →第二正規系の状態から1つの表内に推移関数従属を持たないもの。

 ・ACID 属性とは何か
  ・ヒントとして
   ・Atomicity(原子性)
   ・Consistency(一貫性)
   ・Isolation(独立性)
   ・Durability(永続性)
   →原子性……トランザクションが完了したとき、コミットされているか、ロールバックされた状態である。
    一貫性……トランザクション実行中に他のトランザクションにデータを途中で書き換えられたりしないこと。
    独立性……同時実行したトランザクションの実行結果は、別々にトランザクションを実行した結果とそれぞれ一緒であること。
    永続性……障害などでデータの内容が変わらないこと。

 ・バックアップ/リストア経験
   論理バックアップ・リストア、物理バックアップ・リストア、どっちも出来る。(Oracleで、だけど。)

 ・レプリケーション経験
   マルチマスタ・レプリケーションOracle DataGuard程度なら。

 ・トランザクションログとは何か (ロールフォワードとは何か)
   トランザクションによって挿入・削除・更新された結果を保持しておくログ。
   ロールフォワードは、障害で一定箇所までロールバックした後、障害発生直前までトランザクションを読み込む前進処理。

 ・トリガ・ビュー・ファンクション・プロシージャ・NOT NULL 以外の制約・外部参照制約の利用経験★
   一通りあるかな?トリガはOracleの研修でしか作ったことが無いかも。

  ・上記のものを使うべきか使わざるべきか (DB でやるかアプリでやるか)。また、それはなぜか。
   →時と場合によるが、基本的にアプリでやるべき。
    理由は移植性の問題。時と場合は、パフォーマンス問題でそれしか方法が無いとき。

 ・ORマッパ利用経験
  →HibernateCDBI、DBIx。
   iBATISはドキュメントを読んだレベル。

・バッチ系
 ・CSV/固定長ファイル取込経験
  →あり。

 ・メール配信経験
  →ちょっと思い出せない。もしかしたら無いかも。

 ・EDI連携の経験
  →無い。

 ・バッチにて途中でエラー終了した場合、トランザクションはどうすべきか
  →基本ロールバックする。

・セキュリティ
 ・外部のセキュリティ診断を受けたことがあるか
  →セキュリティ診断を実施したことなら。

 ・SQL インジェクションとは何か。その対策は
  →可変のパラメータに文字列を挿入して、任意のSQLを実行させる攻撃手法。
   対策は、バインド変数を使う、O/Rマッピングソフトを利用する、エスケープを行う等。

 ・XSS 脆弱性とは何か。その対策は
  →任意の文字列を書き込むことが出来るフォームなどから、JavaScript等のスクリプトタグを挿入して、不正なコードを実行させる攻撃手法。
  対策はサーバサイドでサニタイジングを行い、タグを無効化する。

 ・CSRF (クロスサイト・リクエスト・フォージュリ) とは何か。その対策は
  →XSS脆弱性などを用いて、他のサイトにリクエストを投げるようにスクリプトを書き換える攻撃手法。(だったかな?)
   対策は忘れた。

 ・暗号化知識
  ・ブロック暗号とは何か
  →特定のバイト列単位の文字列で暗号化していく暗号化手法。共通鍵方式。

  ・公開鍵暗号とは何か
  →2対の非対称鍵で、片方で暗号化、片方で復号化を行う暗号化手法。

  ・MD5・SHA とは何か。暗号化と一方向ハッシュの違いは何か
  →MD5・SHAはハッシュアルゴリズム。暗号化は鍵を用いて復号可能だが、ハッシュは復号不能。

 ・日々のセキュリティ情報をどこから入手しているか★
  →IPASlashdotはてなブックマーク

 ・高木浩光を知っているか★
  →知ってるw

・HTML/Javascript/CSS
 ・HTML
  ・HTML を書けるか
   →かける。

   ・XML を書けるか
    →かける。

   ・XHTML を書けるか
    ・DTD とは何か
     →XHTMLのタグ・属性の値について制約を定義したもの。

    ・DOCTYPE 宣言とは何か
     →ドキュメントがどの規格に準じているかを宣言するタグ

  ・「HTML 4.0 Transitional では IE は quirk モードになる」の意味がわかるか
    →分からない。

  ・実体参照とは何か
    >とか<とか。

  ・META タグとは、「何の」META 情報か。
    該当ドキュメントのじゃないの……?

 ・Javascript を書けるか
  ・AjaxJavascript を書けるか
   →書ける。

  ・Ajax ライブラリを使ったことはあるか (jQuery/prototype.js/script.aculo.us)
   →jQueryは使える。その他は殆ど触ったことがない。prototype.jsぐらいは使えるようになりたいな。

  ・DOM (Document Object Model) とは何か
   ・getElementById を使ったことはあるか
    →ある。

   ・appendChild でまっさらな HTML から任意の HTML を動的に生成できるか
    →出来る(と思う)

 ・CSS
  ・CSS を書けるか
   →書ける。

  ・padding と margin の違いは何か
   →セルごとの間隔とセル内の間隔……かな?

  ・CSS Sprite とは何か
   →分からない。

 ・その他
  ・favicon とは何か
   →Webページに接続したときに表示されるアイコン

  ・URLエンコードとは何か
   →URLをUnicode表現にしたもの。

  ・BASE64 とは何か
   →8bit区切りの文字列を6bit区切りに変えて、ASCII表現にしたもの。末尾は=でパティングされる。


 ……ここまで!疲れた。
 続きはまた後でやる。



・Web アプリケーション
 ・CSVファイルをアップロードし、DB に格納するアプリケーションを作成できるか★
  ・CSVファイルをダウンロードするアプリケーションを作成できるか★
  ・動的画像生成経験★
  ・PDF生成経験★
 ・セッション管理
 ・デザイナとの協業経験
 ・SEO
 ・リスティング広告組み込み経験
 ・Google Sitemap
 ・全文検索エンジン利用経験 (Namazu/Hyper Estraier/Senna/Lucine など)
  ・n-gram形態素解析の違いは何か
 ・負荷計測経験
  ・どのような負荷計測ツールを使ったか
 ・クロスブラウザな Web を作成したことがあるか (IE 以外のブラウザ)

・モバイル
 ・モバイルサイト構築経験
 ・公式サイト構築経験
 ・(いわゆる) 携帯 UID とは
 ・画像表示に関する機種ごとの差異を述べよ
 ・HTML に関する機種ごとの差異を述べよ

・ネットワーク管理
 ・Windows または UNIX マシンを、LAN に接続できるか
 ・DHCP サーバがないとして、PC に何を設定すれば LAN 経由で
  インターネットに出られるか
 ・ルータ設定経験
 ・DNSサーバ管理経
 ・DNS サーバの役割は
  ・DNS の正引きとは何か、逆引きとは何か
   ・A レコードとは何か、CNAME レコードとは何か、AAAA レコードとは何か
   ・SPF レコードとは何か
 ・FTP における active/passive とは何か
 ・telnet を起動し、HTTP/SMTP/POP3/FTP サーバとしゃべることができるか
 ・メールサーバ管理経験(sendmail/Postfix/qmail/その他)
  ・携帯宛のメール送信経験
  ・大量メール配信経験
  ・マルチパート送信経験
  ・bounce メール処理
  ・foo.@exmaple.co.jp というメールアドレスが不正であることを説明せよ。
   どうしてもこのメールアドレスにメールを送信したい場合の方法は。
 ・traceroute の動作原理
  ・UNIX 系の traceroute と、Windows の tracert コマンドの大きな違いは何か
   (ヒント: ICMP)
 ・NAT (NAPT) とは何か

・プロジェクト管理/構成管理
 ・バージョン管理ツールの使用経験 (CVS/Subversion/Git など)
 ・過去のプロジェクトでは、システムは何環境あったか (開発/テスト/本番など)
 ・複数の環境で整合性を取るため、どのような工夫をしたか
 ・Wiki の利用経験

・インフラ管理
 ・Webサーバ(Apache)
  ・どのようなモジュールを使ったことがあるか
  ・バーチャルホストを設定できるか
  ・SSL
   ・SSL 対応ページを準備するまでの手順を示せ (ヒント: 秘密鍵・CSR)
  ・負荷分散の経験
 ・静的 Web ページを高速化する方法を示せ
  ・Apache における ETag とは何か
 ・Web サイトが重い場合、どのような手順で解決するか (できるだけ定量的な分析を)

*1:x)*(x