2019年1月5日土曜日

ネットワークスペシャリストH30合格体験記

平成最後のネットワークスペシャリスト試験に合格したので、何をやっていたのか記録に残しておきます。

1. 購入した試験用の書籍

  • 徹底攻略 ネットワークスペシャリスト教科書 平成30年度
  • ネスペ教科書 2018年度版
  • ネスペの剣、道、礎、基礎力、魂
  • ネスペ21、22β、23

一通り試験範囲をなめるという意味でも教科書は1つあった方がよいです。徹底攻略の方で午後1に対応することができました。ネスペ教科書はさらにそれを絞ったものです(もうちょっとボリュームがあって欲しいですが、安価な薄めの本で速習という意味ならアリでしょう)。いずれも午後1までの出題内容のキーワードを基にテキストが作られているように思います。午前1、2は暗記モノなので合格点に持っていくだけなら過去問で十分なので特に対策していません。間違えた問題や用語を多少調べるぐらいはしましたが。午後1、2が本試験なので解説がしっかりしているものとして「ネスペのXX」シリーズを買いました。ネスペ21~23も同様のものですが、もう新刊では出回っていないようなので、amazon等で中古を買い漁ることになります。

左門至峰先生のテキストは読者にどういうものか実感してもらうためにスクリーンショットを多用して説明しているので、普段使わないような仕組みでも理解しやすいと思います。特にネスペの基礎力がアタリでした。サブタイトル通りのプラス20点とまではいきませんでしたが、前回から午後1は22点、午後2は10点積み上げられました(このぐらい点数が変わると、試験当日の回答が前回受験から変わるのが実感できます)。

平成21年度の解答から用意しましたが、あまり古いとネットワークの常識が変わっちゃうので、今からの受験であれば予算の節約という意味も込めて平成25年のネスペの剣以降でも十分な気がします。IPAが掲載している平成15年度の試験を解いてみると回線速度が遅すぎて驚きますし、最近のスマホが対応しているWi-FiのIEEE 802.11acなんて10年前には出回ってない規格ですものねぇ。

午後1の過去問はちゃんと解きましょう。午後2のベースになりますし、普段使わない機器に関して「こういうことができるのか!」と驚かされることもあります(例:WAN高速化装置なるものがあり、フェールオープン機能を備えている)。

逆に午後2の問題はあまり手を付けていません。実務に近くて興味のある問題や、解く時間が足りるか確認する目的で簡単そうな問題を数問解いた程度です。何が出てくるか予想できず対応しきれないので、午後1や一般的なネットワークのテキストで基礎を積み上げてました(インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門、マスタリングTCP/IP入門編など)。直近で午後2で問われたものに無線LAN、SDN、IoTプロトコル(CoAP、MQTT)などありますが、結局仕事で使っているかどうかで合否が大きく変わる気がします。しかし出題内容を仕事でやっている人は多くないので、結局基礎を積み上げた人が合格するような仕組みだと思います。午後2は採点対象者の上位40%程度に入れば合格なので、そこに滑り込むつもりで基礎を身につけようとしていました。

2. 参考にしたWebサイト

書籍にお金を出したくないということであれば、Ciscoベースでの説明ですがネスペイージスがオススメです。若手への説明にも使っています(ここ読んでおけと言えば済む上に、当人にとってはネスペ対策にもなる)。ネットワークのおべんきょしませんか?は書籍で手に入らない平成20年度より前の問題の解説を一部していたので取り上げておきます。

3. 過去問を解いて印象に残っていたもの

同じような難易度の試験にしたいのか、回答が似ているという問題があったような気がします。

  • H27午後2問1設問3(3)の答:「CoAPはヘッダ長が短いなど、データ格納効率がよい。」
  • H28午後2問2設問3(4)の答:(GREの方が)「カプセル化によるオーバヘッドがL2TPより小さく、1つのパケットで転送できるデータ量が多い。」

効率のよい伝送を行うという意味で回答がほぼ同じです(カプセル化=ヘッダをつけることですし)。こういった程度の観察力を身に着けてほしいという出題側の意図が感じられます。H30年度のMQTTもIoT用の軽量プロトコルですよね。

4. H30の試験の感想

  • 午前1:応用情報レベル。適当に回答。まずここを安定して通過できないと午前2以降の勉強が手に着かない。
  • 午前2:過去問記憶ゲー。ここで安定して8割以上とれないと午後が辛い。合格者でここが60点台の人は少ないんじゃないかなぁ。ちなみに当日間違えたのは問15と問17の2問。
  • 午後1:メインディッシュその1。ここは教科書的な問題が多い。私は実務に近い問1と問2を選択しました(OSPFとGRE over IPsecは業務的に縁がないので無理と判断して問3を捨てたとも言えます)。前日に「ネスペの基礎力」で読んだ「(プロキシサーバの)ルート証明書」を答えさせる問題が問1に出てきたのが私にとってのサービス問題でした。
  • 午後2:メインディッシュその2。あー、今年も業務に関係のない問題が出た外れ年だと思いました。まったく分からない問題の配点を少しでも下げておきたいという理由で、解答用紙を眺めて問題数が多く、用語穴埋めが多い問1を選択。過去問のCoAPの問題を解いたときに、これならもう一度出てくればボーダーラインは越えられる可能性が高いという感覚があったというのもありますが。

午後はSDN系の話がてんこもりでしたけど、多くの現場に普及するのは相当先なんじゃないですかね。

5. 結果

午前1:88点、午前2:92点、午後1:80点台半ば、午後2:60点台半ば。大した勉強もせずに挑んで午後2で敗退した過去に比べれば進歩したものです。午後1の採点は結構甘目だと思いました。厳し目につけて70点台前半ぐらいだと思っていたので。

6. 得られたもの

国のお墨付きが付いたので、するかしないかは別として転職が多少しやすくなったと思います。昇進速度アップは完全年功序列なので諦めモードです。あと説明能力と居室内での威厳が身に付きます。定期昇給をし続けて給料が高いのに何も説明できない状態になるのは恥ずかしいのでね。これでプロの入口に立てた...と良いなあ。次はアプリケーションを作るための準備の一環として10年放置し続けたデータベースやります。データサイエンス系に強い割にDB知らないでは、そろそろ済まされないので。

2018年10月21日日曜日

とあるインフラエンジニアの仕事に対する考え方

インフラエンジニア(小中規模の構築~運用)の仕事における考え方について整理してみました。使っているプロダクトや実例は書けないのですが、2016年度から4~5人を束ねる役目をしているので、思っていることをつらつらと。他にも書き漏らしたことがあれば追記します。

  • 仕組みをデザインせよ
    1. 人はミスをする生き物である。ミスをしたらなるべく繰り返されないよう仕組みから改善せよ。
    2. 事業が半永久的に継続できるよう、緩やかにでも変化に耐えられるよう、中で人が育つような仕組みを作れ。
    3. 若いうちはn年目にはn年目の業務が当たる仕組みにせよ。よほどの天才でない限り手順を踏まずに先に進むのは難しい。
    4. 若い連中には自分で走れる(=不明な点は調べものをして適切な結論を出せるようになる)だけの時間を最初に与えられるのがベストである。
    5. 予算が取れるなら全体に好影響が出るもの、サービス利用者と管理者の双方が喜べるようなことに金を突っ込んで改善していけ。
  • いかに楽にオペレーションするかを念頭におけ
    1. 業務を楽に回すために工夫をせよ。シンプルに作ることで同僚への業務の引継はスムーズになる。
    2. 総コストが下がるように工夫せよ。サービス利用者や対外折衝といったコミュニケーションに関わるコストや、運用の手間を減らすことによる人件費の削減を考慮せよ。
    3. 普段から楽になるように作ることで、次の方針を考える時間を作ることができる。楽な環境ではさほど伸びないが、楽になるように考える過程で実力は伸びる。
  • 知識をアップデートし続けよ
    1. 仕事のコミュニケーションがうまくなるためには技術的な会話について行ける必要がある。新卒同然のままで話ができる訳ではない。
    2. 学習は若いうちにやっておくと費用対効果が高い。未経験でIT業界に入るなら、まずは体系だった知識をつけるために基本情報技術者試験を受けて基礎を叩き込め。そして遅くとも20代のうちに応用情報まで受かっておけ。うっかり何も知らないまま年功序列で上司になって、指示も出せないという状態になると致命的に不味い。
    3. 知識を増やすことは、日々のオペレーション手法に幅がでること(=複数の方法を提案できる)や前任の担当者よりもベターな方法を提案できることにも繋がる。
  • 勤勉な無能は銃殺刑にせよ
    1. 真面目な(=勤勉な)奴が間違った(=無能な)判断で仕事をすすめると取り返すためのコストが高くつく。勤勉な無能と判断されてしまうと、影響範囲が小さいある程度ミスしても許される仕事しか与えられなくなる。
    2. 元ネタはゼークトの組織論による軍事ジョーク。人は{有能、無能} × {勤勉、怠惰}の4パターンに分類されるとされる。
    3. 自身が目指すところはゼークトの組織論で司令官タイプの「有能な怠惰」である。楽に回せるために頭を使う。英語では "Think hard, work lazy." といったところである。
    4. どうしても勤勉な無能を使わざるを得ないのであれば、作業の相当前から計画を立てさせて、当日の作業はオペレータとして手順書通りにやれば十分というところまで持っていく必要がある。
  • 完全年功序列と完全実力主義はどちらもダメなので混ぜるようにせよ
    1. 年功序列のメリットは、頑張っても昇給が一定なので若手を教育することで業務負担を減らそうとするインセンティブが働くことである。完全実力主義は下を教えないことで差をつけるインセンティブが働きやすい。
    2. 年功序列のデメリットは、能力不足のミスマッチや勉強無しでも周囲と同じだけ昇給するため、平均以上のパフォーマンスが出るメンバーからの納得感が得られにくいことである。
  • 採用
    1. 採用する側、される側、双方不幸にならないように歩み寄れ。
    2. 外に見える成果物や公開しているアカウントがあれば、そこで程度を明らかにせよ。極端なハッタリかまして入ると不幸になる可能性が高くなる。

2015年6月10日水曜日

SMTP-AUTHとデータベースのパスワード暗号化の関係

今回はメールサーバを構築するときの認証に関わるお話。ネットでの情報を中心にしつつも個人的な言葉でメモとしてまとめてみました。ラベルはCentOSとしておりますが、Linuxにおける一般的な話となります。理解が間違ってる可能性もゼロではないので、その辺は話半分に読んで頂きたいと思います。

メールサーバを構築する際の仕様は次の条件を仮定します。

  • メール利用者の情報(ユーザ名、パスワード)をデータベースにおく
    • バーチャルドメイン(Linuxのサーバにログインするためのアカウントとは関係ないのでバーチャルと言われるらしい)のメールサーバにおいてはよくある状況と思われます
  • メールサーバの不正利用を防ぐため465番ポートでSMTP-AUTHを利用する
    • 注意:587は使わなくてもSMTP-AUTHはできます
  • 25番ポートはSSLでの通信をせず、465番ポートでSSLでの通信を行う

ここで問題になるのは、データベースに置くユーザパスワードをどのように保存するかという点です。安全にメールクライアント(ThunderbirdとかOutlookなど)からメールサーバまで通信するのに、暗号化しない25番ポートを使うのであれば、ユーザやパスワードの対を送信する際には、CRAM-MD5のようなアルゴリズムでハッシュ化アルゴリズムを使うしかありません。しかし、CRAM-MD5は非可逆で、かつ毎回認証のたびに異なる文字列を用いてハッシュ化されたものが送られてくるため、データベースの方でMD5などで復号化できない保存をしていると、送られてきたパスワードと一致しているか調べる方法がありません。そのためデータベース側は平文で保存するということになります。よって上の条件では、25番ポートを使う限り、通信経路でパスワードを安全にするのと引き換えに、データベースのパスワードの安全性が落ちます。

データベースの問題を解決するために、DBでパスワードのハッシュ化を行う場合は、非可逆なハッシュ化されたパスワードを送られても困るので、クライアントとサーバ間は平文でパスワードをやりとりする必要があります。平文で送れば、メールサーバでハッシュ化してデータベースの中身と比較することは容易です。例えばMD5でのハッシュ化は$1$のような始まりのパスワードになっているため、どのようなアルゴリズムでハッシュ化しているかということが分かるようになっているためです(/etc/shadowも同じようなパスワード保存をしている)。この場合、平文で通信すると経路上は当然危険なので、465番ポートでSMTPsを使うことが必須となります。

いずれにせよSMTPsを使えばとりあえずは安心なのですが、どうしても25番ポートしか使えない場合があるときは、DBは平文でパスワードを保存をすることになりそうです。

2015年2月2日月曜日

絶対に描いてはいけないグラフ入りスライド24枚

Japan.R 2014で絶対に描いてはいけないグラフ入りスライド12枚と題して発表してきました。発表時間は5分という制約があったので、あえなく当日のスライドは半分に。本来発表に使いたかったものを含めてスライド数は倍にしての公開です。

2014年11月27日木曜日

Rでオブジェクトの存在を確認する方法

Rでは変数名の上書きをうっかりしないよう、プログラマは変数を意識してコードを書かなければならない。そこで、Rにおいてオブジェクトが既に存在しているか確認する方法についていくつか挙げてみる。

  1. ls()関数
    • オブジェクトの一覧を表示する関数である。search()関数を利用するとサーチパス上にある名前空間の一覧をすべて見ることができる。
      > search()
      [1] ".GlobalEnv"        "package:stats"     "package:graphics" 
      [4] "package:grDevices" "package:utils"     "package:datasets" 
      [7] "package:methods"   "Autoloads"         "package:base" 
      

      単にls()とすると、".GlobalEnv"の中にあるオブジェクト一覧が表示される。

      > a < -5
      > ls()
      [1] "a"
      
      他の名前空間にあるオブジェクト一覧を知りたいというときは、search()関数で分かった順番を基に、pos引数を使って指定すればよい。以下の例では、2番目の値にあったstatsパッケージのオブジェクト一覧を見ていることになる。
      > head(ls(pos=2))
      [1] "acf"        "acf2AR"     "add.scope"  "add1"       "addmargins"
      [6] "aggregate" 
      
  2. exists()関数
    • オブジェクトの存在をダイレクトに確認するのであれば、この関数を利用するとよい。

2014年10月31日金曜日

PHPにおける文字のエスケープ処理

magic_quotes_gpcというオプションがphp.iniにある。このオプションが有効になっていると、データを渡していくことを繰り返すうちに文字列のエスケープの回数が増えるという問題が発生するそうだ(詳しくはこちらを参照)。オプションが有効化されていることで、エスケープされてしまう文字としては5c問題に該当する文字になる。そこで、一般的な処理としてどのようにエスケープ処理のコードを書くのかということについて示しておく。今回はDB(PostgreSQL)に入れるための文字列がフォームから入ってきた場合を想定しておく。

<?php
function convert_str_for_query($string){
  if( get_magic_quotes_gpc() ){ // magic_quotes_gpcオプションの状態を取得
    $string = stripslashes($string); // 全体に対しバックスラッシュを取り除いた文字列を返す
  }
  $string = htmlspecialchars($string); // <や&のような文字列をエスケープする
  // 上のコードは一般的には表示の際に対策を立てておくためと考えられる
  $string = pg_escape_string($string); // PostgreSQLのクエリとなる文字列をエスケープする
  // ちなみにMySQLであれば、$string = mysql_real_escape_string($string); とする
  return $string;
}
?>

2014年10月28日火曜日

PHPmemo_day15

PHPの基本に関するメモ。参考にしているのはPostgreSQL徹底入門の第5章です。

  • header関数を用いることで、charsetを指定することができる。htmlのheadタグ内に書かなくてもよい。またリダイレクト先を指定することもできる。書き方は以下のコード参照。
  • <?php
    header('Content-Type: text/html; charset=UTF-8'); // 文字コードの指定
    header('Location: リダイレクト先のURL'); // リダイレクト先の指定
    ?>
  • pg_query_params関数は文字列を挿入してqueryを実行する関数であるが、自動的にエスケープ処理を行うことができる。これによりSQLインジェクションを回避することができる。
  • PHPにもCやJavaと同じく三項演算子がある。
  • $_REQUESTというスーパーグローバル変数がある。これはphp.iniのvariables_orderの項目でリクエストの内容をマージしたものが含まれている。普通は$_GET、$_POST、$_COOKIEの優先順位となる。リクエストメソッドに関係なく、$_REQUESTから参照すればパラメータの値を受け取ることができる。
  • htmlのコードとしてPHPを入れる場合はinclude関数でファイルを読み込む。同じファイルで何度も読み込む場合があるのでinclude_once関数自体はあるが一般的ではない(何度も読み込むミスを防ぐ場合に使う)。関数を読み込みたい場合はrequire_once関数を使うという棲み分けがある。
  • 最近のwebシステムにおけるユーザ登録ではメールを仮登録し、仮登録した先のメールアドレスに本登録用のURLを送ることでメールアドレスが正しいものであるか検証することが多い。メールアドレスの形式が妥当なものであるか判断するのは厳しくしすぎないようにしておく(厳密にRFCに従っているか調べるということまではしないということ)。
  • パスワードを単純にsha1関数で暗号化したものを保存しておくのは、レインボーテーブル(暗号化前の文字列と暗号化後の文字列がペアになったテーブル)により、容易にパスワードが破られる可能性があるためよくない。そこで、ソルトと呼ばれる、ランダムな文字列を適当につけてから暗号化することにより、レインボーテーブルによるパスワード対策を行うことができる。
  • require関数はリダイレクトすることになるが、このときリダイレクト先はURLではなく相対パスにしなければならない。ファイルの位置関係で指定の仕方が変わってくることに注意。
  • HTTPの仕様として、データは文字列でやりとりされるので、0という値がブラウザから渡されるとそれは数値ではなく文字列となっている。ただしPHPでは配列の添字の数字は数値として扱われる。以下の例では10は数値として、testという文字列はtestという文字列で扱われることになる。
  • <?php
    <a href="?a[]=1&a[10]=5&a[test]=10">link</a>
    ?>
  • pg_affected_rows関数はDELETEをクエリで実行した際に影響を受けた行数を返す関数である。これを利用して削除処理の成功/不成功を判定することができる。
  • ini_get関数でクッキーを使っているか確認できる。session_get_cookie_params関数でクッキーのパラメータを取得し、session_name()関数の返り値となるセッション名に空文字を設定することでセッションIDをクリアできる。サーバ上のセッションファイルはsession_destroy関数を呼び出せばOK。
  • トランザクション機能を使うと、一連の処理におけるSQLの実行が途中で失敗しても、その処理の直前までもとに戻すことができる。
  • <?php
    pg_query(コネクション名, 'BEGIN');
    (ここに書いたSQL文がトランザクションになる)
    pg_query(コネクション名, 'COMMIT');
    ?>

フォロワー

ページビューの合計