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

後半です。

アルゴリズム

  • クィックソートの概要を述べよ
  • O(n) とはどういう意味か
  • スパム判定に利用されているベイズの定理とは何か
  • 将棋やチェスなどの思考ルーチンで使用されるミニマックス法とは何か
  • 遺伝的アルゴリズムとは何か
  • "2+4*(8-1)" などの計算式の答えを出すプログラムを書けるか (字句解析/構文解析)★
  • 有限の在庫と、それを買いたいお客様がいます。ただし 1人のお客様には必ず2個の在庫を引き当てる必要があります (1個は NG。3個以上も NG。0個はアリ)お客様は各在庫について欲しい順に順位を付けています。在庫引き当て数と顧客満足を最大にする引き当てを求めるための方法を示せ。顧客満足の定義など不明点はおのおの考えること。

代表値に対してそれより大きいか小さいかで二つの集団に分けることを繰り返しソートを行う方法です。
データ量nに対して処理量が線形に増加することを意味しています。
ベイズの定理とはAが起こった時Bが起こる確率とBが起こった時Aが起きる確率と単純にAが起こる確率と単純にBが起こる確率との間の関係を示した定理です。
常に評価関数が最良となるものを選んでいく手法です。
因子が複数ある場合因子を遺伝子に見立てさらに評価関数を生存確率に見立て交配を繰り返すことで最良の組み合わせを見つけ出す手法です。
書けます。以前中置記法からポーランド記法および逆ポーランド記法に変換するプログラムを書きました。
まず顧客満足度の定義は各顧客ごとに要求したものが得られた場合を1得られなかった場合を0としそれの総和を顧客数で割ったものとします。とすると在庫の引き当て数と顧客の満足度は正比例します。よってどちらかを評価関数とすれば解決法としては線形計画法が使えます。

データベース

  • SQL経験
    • WHERE 句と HAVING 句と GROUP BY 句の意味と、評価順位★
    • CASE・UNION・EXISTS の使用経験★

SQL一応あります。
WHERE句はどの行を対象とするかを示すためのもので、それ以外はわかりません。

  • データベース利用経験 (Oracle/MySQL/PostgreSQL/その他)
    • Oracle であれば、テーブルスペース (表領域) とは何か。エクステントとは何か。
    • MySQL であれば、MyISAMInnoDB の違い。

MySQLSQLiteを使ったことがあります。
大きな違いはMyISAMはテーブル単位のロック、InnoDBは行単位のロックです。

ER図とは何か

知りません。

  • 正規化とは何か
    • 第一正規形/第二正規形/第三正規形とは何か

重複項目がなるべくなくなるようテーブル設計をやり直すことだと認識しています。深くは知りません。

  • ACID 属性とは何か
    • ヒントとしてAtomicity(原子性)/Consistency(一貫性)/Isolation(独立性)/Durability(永続性)

ある操作が複数のテーブルないしは行に影響を与える場合、それが複数の作業に分解されるものだとしてもその操作が分断されないことを保証することです。

バックアップ/リストア経験
レプリケーション経験

両方ともありません。

トランザクションログとは何か (ロールフォワードとは何か)

分かりません。

  • トリガ・ビュー・ファンクション・プロシージャ・NOT NULL 以外の制約・外部参照制約の利用経験★
    • 上記のものを使うべきか使わざるべきか (DB でやるかアプリでやるか)。また、それはなぜか。

外部参照制約を定義したことはありますがデータベースエンジンの制約でSQL文中には存在しても使われたことは在りません。
トリガーおよびファンクションはDB側が非常に高性能でクライアント側が非常に非力なら使用すべきですが、それ以外の場合ではクライアント側で処理すべきです。それらは他のSQL文に比べ処理量が大きくなりがちでその処理量がDBの性能の律速となる可能性があるからです。

ORマッパ利用経験

Python上でならあります。さらに今スクラッチから書いています。

バッチ系

CSV/固定長ファイル取込経験
メール配信経験
EDI連携の経験

どれもありません。

  • バッチにて途中でエラー終了した場合、
    • DB を更新するバッチの場合、後始末として何をすべきか
    • 1000人にメールを送るバッチの場合、後始末として何をすべきか
    • CSV ファイルを出力するバッチの場合、後始末として何をすべきか

DBの場合はロールバックを、メールの場合は送信キューの取り消しを、ファイル出力の場合は出力ファイルのクローズをすべきです。

セキュリティ

外部のセキュリティ診断を受けたことがあるか

ありません。

SQL インジェクションとは何か。その対策は

SQL文中に不正なSQL文をまぎれさせることによりDBに誤作動を起こさせることです。対策法としてはユーザーからの入力をSQL文に取り込む際すべてエスケープするまたはプレースホルダを使うといったことがあげられます。

XSS 脆弱性とは何か。その対策は
CSRF (クロスサイト・リクエスト・フォージュリ) とは何か。その対策は

分かりません。

  • 暗号化知識
    • ブロック暗号とは何か
    • 公開鍵暗号とは何か
    • MD5・SHA とは何か。暗号化と一方向ハッシュの違いは何か

ブロック暗号とは対象をブロックという単位に分解しブロックごとに暗号化処理を行うものです。
公開鍵暗号とは公開鍵と秘密鍵のペアがまずあり、公開鍵で暗号化されたものは秘密鍵を用いて復号化し、秘密鍵で暗号化させたものは公開鍵で復号化します。利用の際には公開鍵のみを相手と交換します。
MD5およびSHAはハッシュを求める際の手法です。暗号化と一方向ハッシュの違いは復号できるか否かです。

日々のセキュリティ情報をどこから入手しているか★
高木浩光を知っているか★

高木浩光氏のサイトです。

HTML/Javascript/CSS

  • HTML
    • HTML を書けるか
    • XML を書けるか
    • XHTML を書けるか
    • DTD とは何か
    • DOCTYPE 宣言とは何か
    • 「HTML 4.0 Transitional では IE は quirk モードになる」の意味がわかるか
    • 実体参照とは何か
    • META タグとは、「何の」META 情報か。

3種とも一応手書きできます。
DTDとは要素および要素構造を定義するものです。
DOCTYPE宣言とは文書型を宣言するものです。
TransitionalではIEは標準互換ではないモードになります。
実体参照とは表示する文字を数値で参照する方法です。
METAタグではその文章のメタ情報を記述します。

一応書けます。
Ajaxなものは書いたことがありません。
DOMとはHTMLやXML木構造を持った文章を木構造としてメモリに保持する手法です。
getElementByIdを使ったことはあります。
appndChildでゼロからHTMLを生成することは出来ます。

  • CSS
    • CSS を書けるか
    • padding と margin の違いは何か
    • CSS Sprite とは何か

書けます。
違いはボックス内の空白かボックス外の空白かです。
CSS Spriteは知りません。

そのページまたはサイトを表す際に用いられるのが望ましいとサイトが用意するアイコンです。
URLに英数字および一部の記号以外が含まれる場合その範囲に収まるべく変換することです。
任意のバイナリを7bit符号であるASCII文字列で表現する手法の一つです。

Web アプリケーション

  • CSVファイルをアップロードし、DB に格納するアプリケーションを作成できるか★
  • CSVファイルをダウンロードするアプリケーションを作成できるか★

両方とも出来ます。

  • 動的画像生成経験★
  • PDF生成経験★

両方ともありません。

  • セッション管理
  • デザイナとの協業経験

両方ともありません。

ありません。

namazuを使ったことがあります。
n-gramは適当な単位で文を区切り、形態素解析は単語で文を区切ろうとします。

  • 負荷計測経験
    • どのような負荷計測ツールを使ったか
  • クロスブラウザな Web を作成したことがあるか (IE 以外のブラウザ)

両方ありません。
クロスブラウザについてはそもそもIEを意識したことがありません。常にW3Cの標準に従うことを念頭においています。

モバイル

モバイルサイト構築経験
公式サイト構築経験

両方ともありません。

(いわゆる) 携帯 UID とは

携帯の回線契約に固有のIDです。

画像表示に関する機種ごとの差異を述べよ
HTML に関する機種ごとの差異を述べよ

分かりません。

ネットワーク管理

Windows または UNIX マシンを、LAN に接続できるか

バイス認識が正常に行われておりNICのドライバが正常に動作している環境でなら接続できます。

DHCP サーバがないとして、PC に何を設定すれば LAN 経由でインターネットに出られるか

NICIPアドレスDNSサーバーのアドレスそしてゲートウェイのアドレスです。

ルータ設定経験

プライベート用のものなら。

DNSサーバ管理経

プライベート用のものなら。

  • DNS サーバの役割は
    • DNS の正引きとは何か、逆引きとは何か
    • A レコードとは何か、CNAME レコードとは何か、AAAA レコードとは何か
    • SPF レコードとは何か

DNSは名前解決を行う機構です。
正引きは名前からIPアドレス取得しを逆引きはその逆を行います。
AレコードはIPアドレスを表すレコードで、CNAMEは別名を表すレコードで、AAAAはIPv6版のAレコードです。
SPFレコードはスパム防止用にドメインを認証するための情報です。

FTP における active/passive とは何か

データ送受信用のポートをどちらが開くかです。

telnet を起動し、HTTP/SMTP/POP3/FTP サーバとしゃべることができるか

できます。

  • メールサーバ管理経験(sendmail/Postfix/qmail/その他)
    • 携帯宛のメール送信経験
    • 大量メール配信経験
    • マルチパートメール送信経験
    • bounce メール処理
    • foo.@exmaple.co.jp というメールアドレスが不正であることを説明せよ。
      • (送信できない環境の場合) どうしてもこのメールアドレスにメールを送信したい場合の方法は。

Postfixの経験があります。
携帯宛はプロバイダのMTAに丸投げすることで実現していました。
MUAが生成するMIMEを使ったメールを送信したことはありますが、MUAを使用せず手で生成したことはありません。
デコメールについてはMIMEを使っているのではないかと思っていますが確認していないので分かりません。
bounceが分かりません。
"foo.@example.co.jp"は"."でユーザー名が終わっているのでRFCに違反することとなり不正です。
送信できるMTAに丸投げします。

  • traceroute の動作原理
    • UNIX 系の traceroute と、Windows の tracert コマンドの大きな違いは何か(ヒント: ICMP)
    • NAT (NAPT) とは何か

わかりません。
NATは一つのIPアドレスを複数のマシンで共有するための手法です。

プロジェクト管理/構成管理

バージョン管理ツールの使用経験 (CVS/Subversion/Git など)

CVSsubversionMercurialの使用経験があります。

過去のプロジェクトでは、システムは何環境あったか (開発/テスト/本番など)

基本的に個人なので単独かlinuxwindowsの2環境です。

複数の環境で整合性を取るため、どのような工夫をしたか

特に工夫なく、文字コードの統一のみで問題なく動きました。

Wiki の利用経験

あります。

インフラ管理

  • Webサーバ(Apache)
    • どのようなモジュールを使ったことがあるか
    • バーチャルホストを設定できるか

意識的に使ったことがあるのはmod_dav、mod_encoding、mod_cgiです。
名前ベースのものなら出来ます。

    • SSL
      • SSL 対応ページを準備するまでの手順を示せ (ヒント: 秘密鍵CSR)
    • 負荷分散の経験
  • 静的 Web ページを高速化する方法を示せ
    • Apache における ETag とは何か
  • Web サイトが重い場合、どのような手順で解決するか (できるだけ定量的な分析を)

鍵を作って認証機関にその鍵を認証してもらい、認証された鍵を使ってSSLを設定します。
負荷分散の経験はないです。
静的なページでしたら十分なメモリを積んでそのページがファイルキャッシュに乗るようにすることと待機プロセス数等を見直して応答をあげることを考えます。
ETagはファイル固有のIDです。ファイルが更新された場合は異なるETagになります。
Webサイトが重い場合は、まずどの部分がボトルネックなのか調べます。動的なページの生成部分なのか、単にファイルサイズが大きいのか、サーバープロセスの応答に遅延があるのかです。これはApacheですとページの生成時間がログに記録できるのでこれとクライアント側での応答時間の記録を見て判断します。