2022年12月23日金曜日

令和4年度データベーススペシャリスト合格体験記

令和4年度のデータベーススペシャリスト試験に独力で合格したので、何をやっていたのか記録に残しておきます。

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

  • 徹底攻略 データベーススペシャリスト教科書 令和4年度(紙媒体)
  • うかる! データベーススペシャリスト 2022年版(電子媒体)

ネットワークスペシャリストと同様、一通り頻出範囲に触れられる書籍があった方がいいです。2冊持ち歩くのは重いので、三好先生の本は電子版にしておきました(Amazonの半額セールでお得な時期に買ったはず)。ウォーミングアップで応用情報のデータベースの問題を用意しておくのもいいでしょう。資料不足にならないかと不安になり買って積読にした書籍もありますが、最初に挙げた2冊があれば何とかできます。試験対策以外では「楽々ERDレッスン」という書籍を読んでました。TACやiTECなどが提供する試験対策の講座や模試は受けてないです。

2. 試験対策

最初に概念設計と物理設計のどちらをメインに勝負するかを決めます。情報収集した結果、物理設計よりも概念設計の方が問題の幅が狭いらしいので、概念設計を中心に解くこととし、午後Iは概念設計とSQL、午後IIは概念設計を選択するということにしました。学習方法は徹底攻略 データベーススペシャリスト教科書を一通り読んだ後で、うかる! データベーススペシャリスト 2022年版の付録の過去問を片っ端から解いてました。三好先生のテキストは本文よりも付録の過去問解説が重要な資料です(平成16年度以降のすべての過去問に解説がついてる)。概念設計はお絵かきになるので、ダウンロードした解答用紙を印刷して練習しましょう。データベースは仕事でほとんど使っていないので、三好先生の本は概念データモデルのビジネスモデルの箇所が分かりにくかったです(なので読むにしても少し学習してからの方が良い)。

三好先生の書籍についている付録の解答用紙を使って、午後Iの平成16年度から令和3年まで1.5周ほど解きました(延べ70~80問ぐらい)。一方で午後IIは概念設計を3問程度しか解いてないです。IPAの講評で正解率が高いとされた問題を選び試験1か月前に解いて7割強とれていたので、難易度が低めの出題なら勝算はあるなという感触はありました。逆に難易度が高めの平成31年度のパン屋の問題は最後まで手が出ないような状態でした。午後Iの演習でE-R図の矢印の引き方(ex. 外部キーで自身と同じエンティティを複数参照する場合に、自身から自身へ2本以上矢印を引くことがある。その他にもH27午後1の問1設問2で工程からバグに3本矢印がひかれる設問があった)と、業務分析の文章からサブタイプとスーパータイプの関係を見抜けるようになる訓練が必要でしょう。令和4年度の問題だと午後Iの問1でFAQからeのエンティティに向かって矢印を2本引きますが、そのようなE-R図に見慣れておく必要があります。応用情報技術者試験でデータベースを選択できる程度に得意な分野にしていたのであれば、300~350時間程度の試験対策で合格に近いところまで行けると思います。

なお、基本情報や応用情報でデータベースを得意科目にしてHAVING句やGROUP BY句のような基礎を省くことができる場合は、午後1でSQLを選択すると少し学習コストが低くなります。試験の難易度が上がってもSQLはそこまで聞かれることの程度は変わらないです(基本情報ではカーソルが出題されたのは見たことがなく、少しは学ぶ必要があるのでSQLの学習コストがゼロになるわけではない)。

3. 令和4年度の試験の感想

  • 午前1:パスなのでノーコメント
  • 午前2:過去問使いまわしの試験なので簡単に落ちてはいけない。間違えたのは問9(初出?)と問20(H29の情報セキュリティマネジメントに類題あり)。
  • 午後1:最初の問題選択の数分でいつもと雰囲気が違うと直感。迷ってても時間のムダなのでとりあえず予定通りに概念設計の問1を選択。アルファベットの略語が多くて頭に入らず都度問題を読み返す必要があるのと、関係の名称をa~fで隠すので読みにくい(a~fの名称を書くと簡単になるから伏せているのだろうけど)問題でした。時間を取られやすく難易度は昨年の問1よりもやや高いのではないかと思います。問1を一通り埋めた時点で50分経過。次の問題はいつもはSQLは問3なんだけど...と思って残りの2問のタイトルを読むと、問3は実装と性能、問2は実装となっており、性能は物理設計関連なので避けた方がよいと判断し問2を確認。問題文を流し読みするとSQLの設問があるのと、ITサービスマネージャで学んだRPOなどの用語を見かけたのでそのまま解くことに決定。令和2年度午後I問2では類題としてレプリカの問題もありましたし、DBに限らず運用管理の経験が少しでもあれば6割の得点は比較的容易で、難易度は高くはないでしょう。ただし、個人的には昨年の問3は簡単な部類なので、それよりは少し難化しているように見えます。2年ほど前に受けたOSS-DB SilverのおかげでトリガーのBEFOREやAFTERが浮かんだので、簡単な資格からの積み重ねも軽視してはいけませんね。
  • 午後2:概念設計なので迷わず問2を選択したものの、関係スキーマの穴埋めがなくて困惑。10ページにわたる業務分析とE-R図で、仕様を素早く把握する読解力と思考力を試そうとしている印象を受けました。E-R図の矢印を引くのと関係スキーマの属性名を埋めるばかりの問題よりは、技術者の技能を測るのに良いと思います。問題は大きく変化していますが解答には当たり前のものも含まれており、昨年度の午後IIの概念設計からはわずかに難化の程度でしょうか。

5. 結果

午前1:パス、午前2:92点、午後1:90点台前半、午後2:70点台後半。解答例を読む限り、午後Iは少なくとも5箇所は誤答しているはずなので、午後の点数は下駄を履かされているんじゃないかなと思いましたし、あの程度の回答で合格するんだという印象です(個人的には午後Iは70点前後、午後IIはボーダーラインに届くか怪しいと予想していた)。思考量は多いですが、2時間で2000字以上書かないとまず合格にならない論述試験よりも手を動かす量が少なくかなり楽です。当初は2020年春に1回目を受けるつもりだったのですがコロナで中止となり、さらに受験は控えてというIPAからの指示に従い2021年も受けないでいたら、2022年の秋までずれ込んでしまいました。ただ、準備は何年も前から少しずつできていたので一発合格に辿り着けたのだと思います。合格は遅くなってしまいましたが、それもまた人生ですね。

6. 難易度について

これまでにIPAのスペシャリスト試験3区分に合格したのですが、体感した難易度は ネットワーク >>> データベース > セキュリティ(旧試験区分) でした。

  • ネットワークは年1回で午後IIは新技術を題材にしてくることが多い上に暗記量が他の2区分より多い。私が受験していた頃のOpenFlowなんてやってる職場は少ないでしょう。
  • データベースは年1回で文章読解力(業務分析の理解速度)と論理的思考力が求められる。暗記量がネットワークよりは少ない点はラク。午後の問題のページ数はセキュリティと同等かそれ以上です。文章をE-R図や第3正規形に落とし込むのはパズル的な要素が強い。
  • セキュリティは年2回受験可能で技術よりも国語の問題になっている割合が高く、技術知識がなくてもその場で考えて答えが出せるものがある。セキュリティ人材と言える頭数を増やすために(政府が目標に掲げている)意図的に合格率を上げているのではないかと推測してます。

2022年1月1日土曜日

2021年読書記録

  • データ集計・分析のためのSQL入門(1/8~1/21)
  • うかる!高度試験午後II論述 第2版(1/21~3/29、ITサービスマネージャの箇所のみ)
  • 達人に学ぶSQL徹底指南書 第2版(1/28~2/23)
  • さわって学ぶクラウドインフラ docker基礎からのコンテナ構築(2/26~4/7)
  • この一冊で全部わかる サーバの基本(4/26~5/20)
  • 徹底攻略 データベーススペシャリスト教科書 令和3年度(5/20~6/16)
  • SQLの苦手を克服する本(6/22~7/2)
  • 24時間365日 サーバ/インフラを支える技術(8/20~11/5)
  • Comptia Project+ テキスト PK0-004対応(9/7~10/15)
  • Comptia Project+ 問題集 PK0-004対応(1週目:10/15~10/17、復習:10/18~10/29)
  • 動かして学ぶ!Laravel開発入門(10/31~11/13)
  • この1冊で全部わかる クラウドの基本(11/4~11/30)
  • クラウド時代のネットワーク入門(12/1~12/14)
  • この1冊で全部わかる Web技術の基本(12/15~12/31)

2021年10月31日日曜日

CompTIA Project+ (PK0-004) 合格体験記

ITサービスの管理者として仮想化基盤のハードウェアやサーバのリプレースに関する業務を担当しているので、その計画の質を改善するためにプロジェクトの管理技法の基本を学びたいと考えました。そこで、PMPのように受験に実務経験を要求せず、かつIPAのプロジェクトマネージャほどの難易度ではないエントリー資格のCompTIA Project+を先日受験してみました。

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

TACの書籍を2冊購入しました。

  • 実務で役立つIT資格CompTIAシリーズ Project+テキスト PK0-004対応版
  • 実務で役立つIT資格CompTIAシリーズ Project+問題集 PK0-004対応版

2. 受験の準備

TACでWeb問題集とリテイクチケットを同時購入しました。クレジットカード決済後、チケットは10日以内には届くようです(こういう約束も試験にでてくるSLAですかね)。私の場合は4日ほどで届きました。Pearson経由で受験しましたが、新規にアカウントを作らないといけないのが面倒です。LPICなどのアカウントを使いまわししたい...

3. 学習時間

業務としては未経験のレベルでしたので、テキストを一通り読むのと問題集を2週解くことを行い、50~60時間前後かかりました。受験を思い立ってから合格まで2か月ほどかかりました。

4. 試験の難易度

本番の試験はTACの紙とWeb媒体の問題集よりも難しいと感じました。出題された問題の選択肢の文章が模擬試験よりも長いものが多く、問題を理解するのに時間がかかったためです。Web問題集は40分もかからず解けたのに、本番では試験時間を目いっぱい使う羽目になりました。本番中は時間内に回答しきれるかと焦りました...結局、(特定を避けるため少々ぼかしてかきますが)95問中80~85問程度とけて、750~800点のレンジに収めて合格(注:100~900点で合格点は710点)。情報処理技術者試験のプロジェクトマネージャの午前2を安定して合格する技能と一般的な判断力(ex.スポンサーに相談せず勝手に事を進めるようなことをしない)があれば何とかなると思います。

5. 受験後の感想や教訓

プロジェクトの終結は教訓をまとめて次のプロジェクトのノウハウに活かすようですので、まとめてみます。○○計画書という単語が大量に出てきてましたので、プロジェクト管理は計画が重要というのが分かります。試験直前は大して追い込みできませんでしたが、計画していた量を演習してから挑めたのが結果に繋がったのかなと。成果物に対してどこまでテストしたらいいのかという議論は常にありますが、不具合が出たときにそれは仕方がないよねと納得できるところまでやれば良いというのと同じでしょう。私も普段の仕事は計画が適切にできれば8割程度はできていると考えているので、計画の重要性は体感には合っています(あと2割はレビューでも見つけられなかった想定外への対応)。それとテキストでRedmineが取り上げられてましたけど、情報収集をしていけば、どこでも同じような管理の取組をすることになりますよね。

6. 今後の予定

論述試験で一番簡単な部類のITサービスマネージャに再チャレンジ?論述の添削を受けられるサービスを利用するべきか思案中...

2021年1月10日日曜日

OSS-DB Silver 合格体験記

いつかは受けたいデータベーススペシャリストの前哨戦として、1か月半ほどかけて学習して合格(80点台前半/100点満点、合格点64点以上)したので、学習記録を公開しておきます。Oracleは仕事で使わないのと、最新バージョンの試験に対応した書籍がないので、(Oracleより仕事で使う可能性が高い)PostgreSQLを選択しています。

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

  • OSS教科書 OSS-DB Silver Ver2.0対応
  • 徹底攻略OSS-DB Silver問題集
定番の緑本と黒本です。kindleのセールで安くなったときに買いました。公式マニュアルは読んでません。

2. 学習時間

どこかで合格率70%程度というのをみかけたので、そこまでやりこまなくても合格点には十分たどり着けると予想してました。学習期間は1.5か月、総学習時間は厳密に集計はしていませんが作成したノートのページ数から70時間程度と思われます。PostgreSQL未経験からのスタートなので、慣れてる方ならもう少し早く終えられるのではないかと。

3. 受験した感想

当日の出題は緑本ぐらいのレベルで、黒本レベルの内容はほぼ問われなかった印象です。ただし、どちらの書籍でも見た覚えがないものが多少は出てきてました。試験のレベルはPostgreSQLの運用や基本的なSQLが書ける程度でITSSレベル2相当とされています。同じITSSレベル2の基本情報技術者試験のデータベースよりは内容が深い(例えばVACUUMのようなPostgreSQL特有の管理運用などは基本情報では聞かれない)ですが、出題範囲は狭く、基本情報技術者試験よりは簡単だと思います。

4. 今後の予定

以前読めなかった「データ集計・分析のためのSQL入門」という書籍がPostgreSQLを主な対象にしているので、それを読む予定です。著者が提供しているデータ(CSVファイル)のインポートはCOPYコマンドでやるといったことは試験範囲にあったので、試験を通じてどうやったらいいかある程度すぐに思い浮かぶようになりました。躓く箇所が減ったので書籍の本質的な部分(SQLの書き方)に集中しやすくなったのが試験学習で得られた一番のメリットです。

2021年1月2日土曜日

2020年読書記録

  • 絵で見て分かるITインフラの仕組み(1/3~2/23)
  • Webセキュリティ担当者のための脆弱性診断スタートガイド(3/8~4/13)
  • Linux教科書 LPICレベル1 通称:あずき本(4/12~5/4)
  • マンガで分かるプロジェクトマネジメント(5/3~5/7)
  • まんがでわかるLinux シス管系女子(5/4~5/8)
  • Linux教科書 LPIC レベル1 スピードマスター問題集 Version5.0対応 通称:白本(5/9~5/17)
  • 基本がわかる安全設計のWebシステム(5/15~5/26)
  • まんがでわかるLinux シス管系女子2(5/18~5/21)
  • まんがでわかるLinux シス管系女子3(5/21~5/28)
  • Linux教科書 LPICレベル2 通称:あずき本(201部分:5/28~6/28、202部分:8/14~9/7)
  • アーキテクチャーからHTML5まで Webシステム入門(6/5~7/8)
  • Linux教科書 LPIC レベル2 スピードマスター問題集 Version4.5対応 通称:白本(201部分:6/29~7/21, 202部分:9/7~9/21)
  • 新人ガール ITIL使って業務プロセス改善します!(7/16~7/24)
  • IT Service Management教科書 ITILファンデーション シラバス2011 通称:黄本(7/26~8/31)
  • みんなが知っておくべき運用設計のノウハウ 改訂2版(9/19~10/15)
  • 徹底攻略LPIC Level3 304 教科書+問題集(9/23~10/18)
  • 先輩がやさしく教えるシステム管理者の知識と実務(10/15~11/5)
  • 「アポロ13」に学ぶITサービスマネジメント(11/7~11/20)
  • ITサービスマネジメント 事例に学ぶ実践の秘訣(11/21~延期中)
  • OSS教科書 OSS-DB Silver Ver2.0対応(11/22~12/20)
  • 徹底攻略OSS-DB Silver問題集(12/20~30)
OSS-DB Silverの公式サイトの学習期間目安が2週間~1か月とのことだったので、テキストを一通り読むだけならその通りかと。そこそこ精読する場合、仕事の時間中に学習できないor業務でPostgreSQLを使わないという条件がつくともう少し時間がかかるはず。

2020年9月20日日曜日

ITIL 2011 Foundation 満点合格体験記

ITサービスマネージャの前哨戦として、1か月半ほどかけてITIL 2011 Foundationを学習して満点合格(40/40問)したので、学習記録を公開しておきます。

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

  • IT Service Management教科書 ITIL ファンデーション シラバス2011(通称:黄本)
  • ITILの基礎 -ITILファンデーション(シラバス2011)試験対応(通称:白本)

黄本を一通りノートに写経して、章末問題は迷って正解したものについてもノートに記録してITIL的な考え方を後から反復して身に着けられるように努めました。白本は最後の演習だけ行いましたが、ping-tで無償提供されている演習で間違えた問題を繰り返して見直していれば、過剰に投資する必要はないかなと。

2. 利用したWebサイト

ping-tの無料演習を2週と、無料de模擬試験(http://tokyo.cloudapp.net/shiken/ItilV3ExamMob/)を解きました。1つの用語をさまざまな言い回しで理解するために、複数のサイトで問題を解く意味はあります。

3. 申し込み方法

Pearson VUEからの申込は43980円で消費税はかかりませんでした(IPAの国家資格と比べると高い...)。Pearsonで受験しているLPIC用のアカウントは持っていたのですが、共通のアカウントにはできないので別途作成する必要があるので注意。

4. 本番の問題や難易度、受験した感想

守秘義務があるので問題そのものについては書けませんが、平易な問題でした。黄本の章末にある模擬試験の正解率が8割程度の段階で申し込んだので、満点は予想外でした。ITSSレベル1相当ですし、IT業界の新卒~2年目でも簡単に取れると思います。運用に関する会話についていけるようにするための共通用語を把握するには丁度よい難易度かと。

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');
    ?>

2014年10月25日土曜日

PHPmemo_day14

PHPの基本に関するメモ。参考にしているのはPHPによるWebアプリケーションスーパーサンプル第2版の第13章(処理制御)です。Smartyなど素のPHPとは関係のないところは省略。

  • スクリプトを途中で終了する場合にはexit関数、die関数を使う。前者は終了時にエラーメッセージを出さないのに対し、後者は終了時にエラーメッセージが出てくるようになっている。関数の引数に文字列を与えることでエラー時のメッセージを制御することができる。また、関数を引数に与えることで異常時でも正常終了させるなどすることができる。
  • 処理を一時停止するにはsleep関数を使う。これは秒単位で停止する。マイクロ秒単位で制御する場合はusleep関数を用いる。
  • エラーメッセージの抑制は変数、関数の前に@マークをつけることでできる。例えば@num = 10/0;のようにすればnumに関するエラーメッセージは出なくなる。
  • error_reporting関数はエラーを表示させるレベルを設定できる。関数を呼出した後からレベルが変化する。
  • error_log関数はエラーメッセージを任意のファイルに送信することができる。Webサーバのログ、メールなどにも書き込める。
  • trigger_error関数を使うと、ユーザエラーを発生させることができる。このとき、引数にE_USER_ERRORを指定することになる。
  • header関数でHTTPヘッダを送信することが可能になる。例えばLocationヘッダを指定することで移動先のURLを指定できる。
  • exec関数を利用すると外部プログラムを実行する。exec関数は返り値を要求しない場合に使う。system関数は標準出力を返してくる。
  • 外部プログラムでシェルを使うときはescapeshellargでシェル引数として与える文字列をエスケープしなければならない。これはexec、system関数の両方に対して言える。

2014年10月23日木曜日

PHPmemo_day13

PHPの基本に関するメモ。参考にしているのはPHPによるWebアプリケーションスーパーサンプル第2版の第12章(セッション/クッキー)です。

セッションはデータの受け渡しに使われる、ユーザの情報を継続して管理するための仕組みである。

  • セッション情報が置かれるディレクトリはphp.iniのsession.save_pathに書かれている。
  • セッションの自動開始はphp.iniのsession.auto_startを参照する。1であれば自動で始まる。
  • セッションの開始をスクリプトで制御するにはスクリプトの最初の方で、session_start関数を呼び出せばよい。
  • セッション変数はスーパーグローバル変数で、$_SESSIONである。$_SESSION["name"]="abc";のように設定すればよい。これはPHP5以上であれば問題なく利用できる。
  • 設定されたセッション変数はunsetで削除できる。設定されているかどうかはisset関数で調べられる。
  • セッション変数の保存先はsession_save_path関数でスクリプト側から調べることができる。ディレクトリがないと保存できずエラーになるので、そのような問題が発生した場合の調査に用いる関数である。
  • session_id関数で現在のセッションIDを取得することができる。クッキーが使用できる場合はクッキーにセッションIDが保存される。クッキーが使えない環境では、ページの遷移の度にセッション変数を遷移先に渡さないとセッション情報が引き継げない。
  • セッションハイジャックを防ぐ方法としてsession_regenerare_id関数を使う方法がある。この関数はセッションIDを新しいものに置き換えることができる。最近のPHPではsession_regenerate_id(TRUE)とすることで、古いセッションデータが削除され、よりセキュアになる仕組みが提供されている。
  • クッキーはユーザ側でデータを保存するための仕組みである。ただし、悪意あるサイトなどにクッキーの情報を盗まれる危険性があるので、カード番号などの重要情報はクッキーに設定しないようにしておく必要がある。
  • クッキーにデータを設定するにはsetcookie関数を用いる。参照する場合は$_COOKIE["変数名"]とする。setcookie関数の引数には変数名、値、有効期限、パス、ドメイン、HTTPSが必要か否かを与えることができる。
  • クッキーのデータを削除するには、setcookie関数の引数に古い有効期限を与えればよい。それにより特定の変数名のデータを削除することができる。削除されたことを確認するにはisset関数の返り値がFALSEになっていることを調べればよい。

2014年10月22日水曜日

PHPmemo_day12

PHPの基本に関するメモ。参考にしているのはPHPによるWebアプリケーションスーパーサンプル第2版の第2章(フォーム)後半です。

  • SQLコマンドに入る文字列をエスケープするにはmysql_real_escape_string(MySQL)、pg_escape_string(PostgreSQL)などの関数を用いる。ただし、php.iniでmagic_quotes_gpcをOnにしている場合、一旦stripslashes関数で文字列のエスケープ処理を解除してからDB専用の関数でエスケープ処理を行うのが良い。
  • フォームから受け取った値を用いてSQLクエリを構成する場合、数値は数値に変換してから挿入する。つまりintval関数で数値に変換するか、sprintfを使って数値を受け取る場合は"%d"として受け取ることになる。
  • フォームから受け取ったデータをsystem関数、exec関数を用いてシェルに渡すことがある。そのまま渡すと意図しないコマンドを実行される可能性があるので、シェルのメタ文字をエスケープするにはescapeshellcmd関数を用いる。
  • 特殊文字をエスケープするにはhtmlspecialchars関数を用いる。ただし「'」をエスケープするには関数の引数にENT_QUOTESを指定する必要がある。また、「"」、「'」をエスケープしない場合はENT_QUOTESを引数に与えることになる。
  • htmlタグをフォームから受け取った内容から取り除くにはstrip_tags関数を用いる。悪意のあるコード対策で用いられる。
  • 一部のタグだけ置換したいという場合はstr_replaceで置き換える。置換前と置換後の文字列を配列で指定することで複数のタグを一括で置換することもできる。
  • リンクに漢字を含むものについてはurlencode関数でエンコードを行う。これにより%5Cのように%と16進数から構成される文字列に置き換えられる。これをもとに戻すにはurldecode関数を用いる。
  • textarea内で改行をしても、表示では改行が含まれないようになっている。改行して表示するためにはnl2br関数を用いる必要がある。
  • アクセスの種類を判別するにはif( $_SERVER["REQUEST_METHOD"] == "POST" ){ ... }などとする。
  • explode関数で区切り文字を指定して、1つの文字列を配列に分割・収納することができるようになる。
  • mktime関数は日付をタイムスタンプ形式に変換できる。この関数では3月32日を4月1日のように自動的に解釈するようになっている。
  • checkdate関数は指定した年月日がグレゴリオ暦と矛盾がないかを調べる関数である。
  • mb_detect_encoding関数は文字コードの検出に使われる。引数で文字コードの検出の優先順位をつけておくことになる。
  • 文字コードの変換はmb_convert_encoding関数を使う。
  • 「$$変数名」という表記法がある。
  • $a = "abc";
    $$a = "xyz";
    echo $abc; // xyzと表示される。
    

2014年10月21日火曜日

CentOS 6でホスト名を書き換える

サーバのホスト名を書き換えるということは、仮想環境を利用するとしばしば起こりうることである。たとえば、VMwareに含まれる仮想マシンをコピーするテンプレートを作成するという機能を利用すると、この作業が必要になる。それはコピーして作られたホストは名前が重複しないようにしなければならないためである。さて、実際にホスト名を書き換える作業する際には次のような手順を踏むことになる。

  1. # vi /etc/hosts (ホスト名を書き換える)
  2. # vi /etc/sysconfig/network (名前解決の優先順位を書き換える)
  3. # hostname 書き換えたホスト名
  4. ログアウトして再度ログインしなおす
  5. ホスト名が変わっていることを確認する

名前解決において、/etc/hostsとDNSサーバのどちらが優先されるかということについては/etc/nsswitch.confを参照する。order: files,dnsなどと書かれている行があるはずである。filesが/etc/hosts、dnsがDNSサーバを意味しており、この順が名前解決の順序となる。普通はfiles,dnsの順序になっているはずである。また/etc/hostsには初期設定では自身以外の記述はないので、他のサーバにアクセスしようとすると、名前解決のためにDNSサーバを見に行くということになる。この仕組みを知っておくと、DNSサーバを構築しなくても、ごく小さな名前解決ができ便利である。

2014年10月20日月曜日

PHPmemo_day11

PHPの基本に関するメモ。参考にしているのはPHPによるWebアプリケーションスーパーサンプル第2版の第11章(クラス)です。

  • クラスの中の変数にはpublic、private、protectedが用いられる。varはPHP5では使わない方が良い。
  • コンストラクタメソッドは__construct()になる。デストラクタメソッドは__destruct()になる。
  • オブジェクトの参照のコピーは$obj2 = $obj1;でできる。オブジェクトをコピーするには$obj2 = clone $obj1;とする。
  • クラス中の静的変数・静的メソッドにはstaticを使う。この辺はJavaと変わらない。
  • 抽象クラスにはabstractをつける。継承されないクラスにはfinalをつける。
  • 定義されていないクラス、メソッド、フィールドが呼び出された場合、それぞれ__autoload、__call、__getメソッドをクラス内に用意しておくと、それらが自動で呼び出されることになる。エラー処理で使える。
  • get_decleared_classes関数で定義済みのクラス名を取得できる。
  • stdClassという内部で定義されているクラスを使うのは控えること。
  • get_class_methodsでクラス内に定義されている関数一覧を取得できる。
  • class_exists関数でクラスが存在するか調べることができる。存在していればTRUE、存在していなければFALSE。
  • method_exists関数でクラスのオブジェクト内にあるメソッド名が存在するか調べることができる。存在していればTRUE、存在していなければFALSE。
  • クラスのプロパティ(変数)を取得するにはget_class_vars関数を用いる。ただし、PHP5のprivateフィールドについては取得することはできない。また、オブジェクトのプロパティを取得するにはget_object_vars関数を用いることになる。

2014年10月17日金曜日

PHPからPostgreSQLに接続してデータを取得する

今回はPHPからPostgreSQLに接続してデータを取得するコードを書いてみます。DBについては既にインストールやアカウントの設定が終わっているものと仮定します。問題を簡単にするため文字コードについては考慮しませんが、DBからページに表示する際に文字コードを変換する関数も書いてみることにします。

$server = "localhost"; // 接続先のホスト
$dbname = "db_sample"; // データベース名
$user = "i_am_an_user"; // ユーザ名
$password = "passwd"; // パスワード
$conndef = "host=".$server." dbname=".$dbname." user=".$user." password=".$password; // 接続定義
$conn = pg_connect($conndef) or die("connection error"); // 接続

// SQLの実行(適当な例です)
$query = "SELECT * FROM mytable WHERE id <= 10";
$result = pg_query($conn, $query) or die("SQL error");
// 結果から各種情報を取得する
$nrow = pg_num_rows($result); // 行数(件数)の取得
$nfield = pg_num_fields($result); // 列数の取得

// 表示
for( $i = 0 ; $i < $nfield ; $i++ ){
  echo pg_field_name($result, $i)." "; // タイトルの表示
}
echo "\n";
while ($row = pg_fetch_array($result)) { // 1要素ずつ取得する
  for( $i = 0; $i < $nfield ; $i++ ){
    // $row["id"]などとしてもデータを取得することができる。
    // その場合はpg_fetch_array($result, $i, PGSQL_ASSOC)として1要素を取得することになる。
    echo $row[$i]." "; // 順番に各内容を表示
  }
  echo "\n";
}

pg_close($conn); // DB操作が終わったら切断

// DBから取得した文字列に対して文字コードを変換するための関数
// DBの文字コード
$db_encode = "UTF-8";
// 表示の際に使う文字コード(文字コードはhtmlに指定されているはずである)
// もしかするとApacheなどWebサーバの方で強制的に指定されているかもしれないので
// そちらの設定も確認しておくこと。全部統一しておけば、とりあえず安心できるだろう。
$disp_encode = "UTF-8";
function convert_encoding($string, $from, $to){
  $detected_encode = mb_detect_encoding($string, $from.", ".$to);
  if( $detected_encode and $detected_encode != $to ){
    return mb_convert_encoding($string, $to, $detected_encode);
  }else{
    return $string;
  }
}

MySQLとPostgreSQLでは引数に与えるクエリと接続定義の順序が逆になっている点に注意。

2014年10月16日木曜日

PHPmemo_day10

PHPの基本に関するメモ。参考にしているのはPHPによるWebアプリケーションスーパーサンプル第2版の第10章(ディレクトリ)です。

  • mkdir(ディレクトリ名, パーミッション)で指定したディレクトリを作成できる。返り値はディレクトリ作成の成功(非0)、失敗(0)である。
  • is_dir(ディレクトリ名)でディレクトリの存在を確認する。
  • dirname(ファイルパス)でファイルのディレクトリが分かる。絶対パスを取得するにはrealpath関数を用いる。
  • diskfreespace(ディレクトリ名)でディレクトリが使用可能な容量を取得できる。
  • rmdir(ディレクトリ名)で指定したディレクトリを削除する。返り値はディレクトリ削除の成功(非0)、失敗(0)である。
  • dir(ディレクトリ名)でディレクトリをオブジェクトとして取得する。ディレクトリの中身はreadメソッドで順に取得できる。lsコマンドと同様に、ディレクトリが含まれる点に注意。参照が終わったらcloseメソッドを呼ぶこと。
  • PHP5ではscandir関数を用いることで、指定したディレクトリに以下にあるファイル一覧を配列で取得できる。

フォロワー

ページビューの合計