Interact 2018 に参加した(1)

Interact 2018に参加した。その際のメモ。

Azureの契約直前・直後に意識しておくこと10箇条 – 足利 惟 氏

Azureそのものの管理の話。

自己紹介

・株式会社pnop所属。
・JAZUG運営メンバー。

Azureの契約プランを一度確認するべし

・サブスクリプションにはさまざまな契約プランがある。
・Visual Studio サブスクリプション(旧MSDNサブスクリプション)には月1万7000円利用できる特典がついている。

従量課金制

・使った分だけお支払い。基本はクレジットカードを利用し、Microsoftへ直接支払い。
・デメリット
 ・会社のクレジットカードを作成する必要がある。(意外と敷居が高い)
 ・請求書払いの場合、SendGridなどサードパーティと外部サービスは購入も支払いもできない。

Azure CSP(Cloud Solution Provider)

・Microsoftがオススメしている。
・サブスクリプション + パートナーが提供する付加価値。
・購入方法はパートナーの仕様に依存し、パートナー経由で購入する。法人のみ。
・デメリット
 ・ASM(旧型式)のリソースは作成できない。移行の際にボトルネックになる可能性がある。
 ・Azure Marketplaceの従量課金製品のほとんどは購入できない。(BarracudaのFW製品など)
 ・Microsoftのサポートは購入できない。(パートナー提供のみ)

EA(Enterprise Agreement)

・大企業向けの一括購入プラン。基本的に1社1アカウント。
・年間160万円以上(?)利用する場合に利用可能。
・LPA(ライセンスプロバイダー)経由で購入。
・デメリット
 ・年間使用分を事前に購入するため、年間金額を予測して購入しないといけない。
  (余ったものは返ってこない。これはクラウド?)
 ・Azure Marketplaceの購入はできるがほとんどの場合は別請求となる。
  (足利さんはオラクルの製品を利用していて、別請求で100万円ほどかかったことがある。)
 ・StorSimpleを利用したいのであれば現状EA一択。

MSA(MicroSoftAccount)と組織アカウントの違いを理解すべし

・MSA:個人で作成できるアカウントで、Microsoftが管理する。
・組織アカウント:企業が組織レベルで作成するアカウント。Azure ADに情報が格納される。
・MSAにリスクがあるため、Azureのアカウントは、すべて組織アカウントで管理することがオススメ。
・MSAのリスク
 ・セキュリティポリシーが強制できない。
  パスワードポリシー、多要素認証、監査など。
 ・5年ログインしないとアカウントが無効になる。
  Azureサブスクリプションの管理者の場合は、サブスクリプションが無効になる可能性がある。

Azure ADは最初に作っておくべし

・MSAを起点としてサブスクリプションを作成すると、メールアドレスに応じたAzure ADテナントが勝手に作成される。
・CSPはこのリスクはない。
・EAの場合は注意が必要。以下URLから先にAzure ADを用意可能。
 https://account.azure.com/organization/

Azure ADの管理者を理解するべし

・Azure ADの管理者はあくまでAzure AD内部を管理する。
 そのためユーザを作成しても、そのユーザはリソースにアクセスできない。
 (サブスクリプションの入力を求められる。もしくはサブスクリプション内で適切なロールを割り当てる必要がある。)

AzureADとサブスクリプションの関係を理解するべし

・Azure AD テナントに複数サブスクリプションを紐づけることが可能。
・Azure AD テナント間でサブスクリプションを譲渡可能。
・MSAはAzure ADではゲストユーザーとなる。
・ディレクトリを一緒にしておくとVNET Peeringを使うことが可能になる。

むやみに管理者ロールを渡すべからず

・RBAC(Role-Based Access Control)を利用して細かくリソース管理すること。
・管理者ロールはサブスクリプションを削除もできるし、所有者を無尽蔵に増やしていくことも可能。
・作業時のリスクを減らすために、適切な役割を割り振るべし。

リソース管理の便利機能を抑える

・リソースロック
 すべてのユーザに削除禁止、読み取り専用どちらかの状態にリソースをロックする機能。
・Azure Resource Policy
 リソースに関する規則を決める。RBACと違いデプロイ中のリソースプロパティに焦点。
 Dシリーズしか作成できない、東京リージョンにしか作成できないなどの制限を付与できる。
・Management Group(Preview)
 複数のサブスクリプションを管理するためのグループ。

サポートは必ず契約するべし

・Standardが値下げされてきている
・テクニカルサポートは有償サポート契約が必要
・パートナーになっている場合は、プログラム特典のサポートが利用できるかも
 (Microsoft Partner Network・MSDN・Signature Cloud Support)

感想、というよりも疑問

・AzureはAzure ADを1つ作成して、そこにユーザを作り、AD周りの権限を与える。
 サブスクリプションをAzure ADに複数割り当てて、ユーザにサブスクリプションごとにリソース権限を与える。
 という使い方であっているのかどうか?
・アカウント管理者(サブスクリプション管理者)とサービス管理者はわけたほうがよいのか?

参考 – わからなくて調べたこと

Azure サブスクリプションから CSP への移行【10/16更新】
Azure の購入方法

Team Geek ―Googleのギークたちはいかにしてチームを作るのか を読んだ

Team Geek ―Googleのギークたちはいかにしてチームを作るのかを読んだときのメモ。

0章 – まえがき

・エンジニアリングの重要な要素であるが、忘れがちな存在の「人間」に焦点を当てている。
・技術集団を率いる人間は、技術への深い愛と造詣が必要。

1章 – 天才プログラマの神話

・リーナスもビル・ゲイツもチームとうまくやる才能があった。
・人は作業途中のコードは見せたがらず、完璧にしてから見せようとする。
 しかし、作業を隠すことで失敗のリスクが高くなる。すでに誰かが対応していたり、簡単なミスに気が付かなかったり、不要なものを作成している可能性がある。
 何度もコンパイルしながらプログラムするように、フィードバックされながら作業したほうがよい。
・チームで働くときのポイントはHRT。謙虚(Humility)・尊敬(Respect)・信頼(Trust)。尊敬は思いやり、その人を高く評価すること。信頼は正しいと信じ、仕事を任せること。
・世の中の関心は常に動く。専門家として新しいことを学ばないと置いていかれる。謙虚に常に学んでいかなければならない。
・弱さ(わからないこと)を見せることは信用を失うことではない。謙虚を見せて、他人の意見を信頼することで、その正直さと強さによって周りが尊敬してくれるようになる。

2章 – 素晴らしいチーム文化を作る

・文化はリーダーではなくチームメンバが作る。そのため強烈な個性をもった新人が現れると、彼の文化がチームに根付くことになる。それが健全な文化になることはとても少ない。
・エンジニアはコミュニケーションをできるだけ排除してコードを書こうとするが、コミュニケーションがないと自分が正しいコードを書いているという保証はない。
(チームと違う方向に進んでいるかもしれない)
・ミッションコミットメントは方向性と、制限されたスコープが必須。
・バグ管理ツールは優先度をつける必要がある。そうしないと、どうでもよいバグを修正して、重大なバグは放置される。
・コードコメントには「なに」は記載せず、「なぜ」を記載する。
・ソースコードは完成してからもさまざまな人によって変化を続けるため、作成者の名前を記載するべきではない。

3章 – 船にはキャプテンが必要

・伝統的なマネージャーはどうやって仕事を完了させるかを考える。リーダーは何ができるかを考える。(どうやって仕事を完了させるかはチームが考える)
・部下を子供として扱えば、部下は子供のように振る舞う。エンジニアを大人として扱うべし。
・マネジメントの仕事はチームの幸せと生産性を高めること。
・マネージャーとしていちばん大事なのは、執事や召使のようにチームに奉仕すること。HRTの雰囲気を出す必要がある。
・パフォーマンスが低い人は高い人の時間を奪う。結果としてパフォーマンスが高い人は流出し、どこにも行けない人たちチームに残る。
・パフォーマンスの低い人は早めに対策する必要がある。そのチームで仕事できなくても、違うチームだと役に立つ能力を持っているかもしれない。
 また向き合う場合は、目標と期日を設定して、毎週進捗確認をする必要がある。
・チームをマイクロマネジメントしなくなれば、メンバのほうがリーダーよりも仕事に詳しくなる。つまり、リーダーは合意形成や方向性の決定を支援することになり
 目標の達成方法はメンバが決定すべきこととなっていく。
・リーダーとしてチームを長期に渡って生産的にするには、チームの幸せを計測したほうがよい。
 1対1のミーティングの後に「何か必要なものある?」という質問をすると、そのメンバが生産的で幸せになるために必要なものを簡単に把握できる。

4章 – 有害な人に対処する

・相手にする価値のない人は無視がオススメ。リソースを食われてしまうため、言葉で言いくるめるよりも無視がよい。
・善人と悪人で分類して悪人を追い出すのではなく、問題ある振る舞いを追い出す必要がある。
・有害な振る舞いに対応する前に、短期的にチームの注意や集中を無駄にしても長期的にプロジェクトにメリットがあるか、衝突は有益な方法で解決できるかを考える。
・無能で十分説明されることに悪意を見出すな。よくわからない人を追放するのではなく、破壊的な振る舞いを受け入れず、HRTに対しての期待を明確にすることが仕事。
 (例えば、ある製品に欠陥が見つかった場合、製造した企業が無能であるか愚かであるということを示しているのであって
 消費者を困らせるために企業が悪意を持って欠陥を忍ばせたわけではない、という考え方のこと。)

6章 – ユーザも人間

・成功しているプロダクトは問題を限定して、それをうまく解決したもの。
 トースター(多くの食材を調理でき、ほぼすべての人が利用できる。ただしラジオ機能(余計な機能)はついていない。)のようなプロダクトを目指すこと。
・プロダクトのユーザが増えると、機能が増えることで複雑性が増す。しかしユーザの平均的な技術能力は低下するため、ユーザの不満が増えていく。
 開発者がユーザの声を聞けるような環境を用意しておくこと。またユーザはシンジられないかもしれないが、開発チームと関係を築きたいと考えている。

[AWS Black Belt Online Seminar] AWS Cloud9 入門 の閲覧メモ

[AWS Black Belt Online Seminar] AWS Cloud9 入門を閲覧した。その時のメモ。

内容


特徴

・セットアップが手間、チーム開発の上でより容易なコラボレーションが必要、既存IDEはサーバレスに追いついていないといった課題解決のためのソリューション
・AWSサービスに直接アクセスできるため、シームレスな開発が可能。
・日本リージョンにはまだ来ていない。
・コスト節約のために、デフォルトでは30分利用しないとインスタンスを停止する。

利用パターンによって、3種類のセットアップ方法がある

・Team Setupでは、開発者チームや開発者チームなどのグループ分けが可能。(IAMグループを利用する)
・AdvanceTeamSetupでは、特別なポリシーを設定するで、TeamSetupより細かく権限制御することが可能。

一部拡張子についてはプレビューを利用可能


言語サポート状況について

・コード補完について ▲:実験的(ベータ版) △:localfunctionのみ ×●:パスを指定すれば利用可能

参考-リリースに関するAWSサービス図-

プログラムはなぜ動くのか 知っておきたいプログラムの基礎知識を読んだ

プログラムはなぜ動くのか 知っておきたいプログラムの基礎知識を読んだ。
あまりPGしないので深くまでは理解できなかったが、良かった。知らなかったことをメモ。

・プログラムが実行される仕組みは、プログラムがコンパイルされてマシン語(レジスタを利用した演算処理)になり、マシン語がCPUによって実行される。
・アセンブリとマシン語は1対1で対応している。(マシン語にエイリアスとして英字を割り当てたものがアセンブリ)
・8桁の2進数をバイト(byte)と呼び、メモリやディスクはバイト単位で処理される。
・ICのもつピンは直流電流0Vか5Vのいずれかの状態になっている。
・マイナスは補数で表される。補数は反転して1を足した数。マイナスは同じ絶対値の正の数を足すと0になるという考え方。
・0.1という2進数は10進数だと0.5となる。10進数の0.1は2進数では表せない。
・プログラムでは小数点数を浮動小数点数として処理する。
・メモリはメモリICにアドレス信号、データ信号、制御信号を意味する足が複数あり、アドレスを指定してデータを読み書きする。
・スタックは干し草を積んだ山という意味で、つまりLIFO(LastIn FirstOut)形式。
・単なる配列を利用するよりも、リストを使ったほうがメモリの使い方がよいため、実行速度が高速になる。
・ランレングス法(Run Length Encoding)は、データと繰り返し数で圧縮する。(AABBBBCCCC→A2B4C4)
 画像ファイルなど同じデータが続く場合に高い圧縮率となる。
・ハフマン法は圧縮対象のファイルごとに符号体系を構築して、それをもとにして圧縮する。
・画像ファイルは非可逆圧縮であることが多い。
・動作環境に影響するのはOSとマイクロプロセッサの種類。OSごとに命令を受けるAPIが異なり、マイクロプロセッサごとに処理できるマシン語は異なるため。
・ソースコードをネイティブコードへ翻訳するのがコンパイラの仕事。
・インタプリタは実行時にソースコードを1行ずつネイティブコードへ翻訳する。
・コンパイルしただけではプログラムとしては利用できない。ソースコードで利用しているオブジェクトをまとめる作業(リンク)を実施する必要がある。
 (Windowsはこの作業をすることでEXEファイルとなる)
・EXEが実行されると、変数領域、関数領域、スタック領域、ヒープ領域(プログラム実行時に動的に作成される配列やオブジェクトを格納)がメモリに割り当てられる。
・1人前のプログラマとして、ハードを理解して、OSがハードを抽象化していることを理解するべき。
・OSがなかったころは、ディスプレイの表示や印刷のプログラムも自分で書く必要があった。
・C言語はコンパイルだけでなく、アセンブリに変換することもできる。
・アセンブリはネイティブコードに変換される命令と、_TEXTなどのプログラムの構造やアセンブル方法を表す疑似命令の2種類がある。
・アセンブリ言語の構文はオペコード(命令の動作)とオペランド(命令の対象)の組み合わせ。
・例えばキーボードは割込要求の01、マウスは02といった識別番号が割り振られており、割込が発生するとまずは割込コントローラーが処理を受け付け、順番にCPUに伝える。
・VRAMというメモリ領域にデータをINすると、ディスプレイに表示される。現在はVRMA用メモリと専用マイクロチップが載っているグラフィックカードがよく利用されている。

マスタリングTCP/IP 入門編 メモ

マスタリングTCP/IP 入門編を読んだ。
とても良かった。知らなかったことをメモ。

・1970年代、各メーカーが独自規格でネットワーク機器を作成していたため、ISO(国際標準化機構)はOSIと呼ばれる通信体系を標準化した。
 OSIの定めるプロトコルは普及していないが、OSIプロトコルの設計指針であるOSI参照モデルはとても有名。
・TCP/IPはIETF(Internet Engineering Task Force)にて提案されたプロトコルで、現在のデファクトスタンダード。
・探索MTUは10分しかキャッシュされない。
・IPパケットを利用した、ECN(Explicit Congestion Notification)という輻輳通知機能がある
・Mobile IPという移動時にネットワークが変わっても、IPアドレスが変えなくする技術がある
 内部的には変えたくないIPアドレスのネットワークに仲介エージェントを配置し、リバースプロキシするようなイメージ。
 IPv4だと仲介エージェントが必要だが、IPv6 Mobile IPだと不要になる。
・TCPとUDPは同じポート番号を別の目的で利用することが可能。
・ACKは肯定確認応答、NACK(Negative Acknowledgement)は否定確認応答。
・Nagleアルゴリズムのように、送信処理を遅らせることでネットワークの利用効率をあげる方法もある。ただし遅延につながることも。
・UDPパケットはチェックサムエラーがあるとパケットすべてを破棄する。UDP-Liteでは一部エラーでは破棄しないようにできる。
・TCPに追加してマルチホーミングに対応したSCTP(Stream Control Transmission Protocol)なるものがある。
・TCPのシーケンス番号の初期値は乱数値で決定される。
・経路制御アルゴリズムにはDistance-Vector(距離をが近いネットワーク情報を各ルーターがもつ)とLink-State(同じ経路制御表をすべてのルーターが保持する)の2種類が存在する。
・OSPFにはエリアという概念があり、管理する範囲をエリア内のみとすることで、経路制御情報や処理負荷をさげる。
・ISPや地域ネットワークなど組織を束ねるネットワーク集団を自律システム(Autonomous System)と呼ぶ。
 ASには16ビットのAS番号が割り当てられ、AS番号を使って経路制御される。
・インターネットは当初ARPANETがhostsファイルを一括管理していた。
・URIはあらゆるスキームに対応した識別子。
・POPは既読情報をメールクライアントで管理し、IMAPはサーバで管理する。
・SSHを利用してポートフォワード機能を利用可能。サーバAのポート1000へ接続すると、サーバBのポート110に接続するといったことが可能。
・MRTG(Multi Router Traffic GRAPHER)はネットワークトラフィックを収集して、グラフ化するツール。
・H.323やSIPは、呼制御(相手を呼び出し、どのような形式でデータのやり取りをするか)のプロトコル。
・広域イーサネットは通信業者が提供するVLANを利用者が専用で利用する。(データリンク層を利用するため、TCP/IP以外のプロトコルも利用可能)
・ITIL(Information Technology Infrastructure Library)はイギリス政府が策定したITシステムの運用や管理業務に関する階層・体系的なガイドライン。
・インターネットの最大の利点は「エンドツーエンド通信」。IPv4では枯渇によりこれを実現できない(NAPTなどで補っている状態)。

Harekaze Talk #1 に参加した

Harekaze Talk #1 @日本マイクロソフト株式会社に参加した。その際のメモ。

Office365等のお金セキュリティや色々話す – @hiww氏

・Office 365 を利用するのであれば、Office 365 Advanced Threat Protection サービスを利用すべし。
 簡単にメールのセキュリティを向上させることが可能。

EMACについて – @chouett0氏

EMACとは

・Extreme Malware Analyzing Challenge(造語、今後変わるかも)
・マルウェア解析の敷居を低くしたい
・まずはコミュニティ形成から、最終的には大会ができればよいと考えている

解析例

fileコマンドでファイルを判別
→HTMLファイルだった
→http,httpsでURLを検索
→whoisやaguse.jpを利用して中身を調べる
→アクセス先が2箇所あり、中国とロサンゼルス
→ロサンゼルスのサーバにアクセスするとマルウェアをダウンロード
→Ollydbgでマルウェアの動きを解析(バイナリであれば、stringsコマンドが有益かも)
 Wiresharkで通信状況、Process Explorerなどでプロセス状況を監視する
→Firefoxと連携して、他のマルウェアをダウンロードしている模様
 電源設定やディスプレイサイズでサンドボックスかどうか確認しているらしい

SCAP on Windows – @hogehuga氏

・Security Content Automation Protocol
 情報セキュリティ対策の自動化と標準化のための規格で、製品についてのID (CPE)、 脆弱性についてのID (CVE)、
 設定についてのID (CCE), 脆弱性の深刻さのスコアづけ (CVSS)、自動チェックのための言語 (OVAL)、
 チェックリストのフォーマット (XCCDF) などが標準化されている。
 https://qiita.com/bezeklik/items/8bf7d0ccf5cf916d778c
・CVSSについて、スコアだけでなくVectorを見なければならない(どの程度、攻撃しやすく危険なのかがより詳細にわかる)
・OpenSCAPをWindowsで動作させようとしたが、コンパイルがうまくいっていない状況。(バイナリ配布されていないためコンパイル)
・SCAPツールの大半はLinux用でWindows用はない。
 WSUSやグループポリシーがあるから不要?ただしセキュリティアップデートすることと、脆弱性がなくなることは別問題。
・SCAP実現時のメリットは、Linuxと同じように管理できるようになること。(CVSSなどで比較できるため、見通しがよくなる)
・SCAP実現時のデメリットとして、CVSSがわかっても、どのKBの更新プログラムが適用されていないのかはわからない。
 OVALdiが2014年以降、更新されていなさそう。

Windowsのセキュリティ機構について – @megumish氏

※Linuxと比較したときの話がメイン。

・Exploitする人がいるため、セキュアに保たなければならない。
・Exploitはメモリを書き換えることやあるいはメモリ上の資源を利用することで行われる。
・攻撃手法の種類について
 ・XSS
 ・SQL injection
 ・Binary Exploitation
  ・Shell Code Injection
  ・Buffer Over Flow
  ・Return Oriented Programming
  ・Heap Exploitation
・VMMap(sysinternals)というツールでWindowsメモリの状況を確認すると、Linux(cat /proc/self/maps)と以下の点が異なることがわかる。
 ・実行プロセスが最初にあるか、最後か。
 ・heapメモリが散らばっている。(Linuxは一箇所に集まっている)
 ・メモリ確保が少しづつ処理される。(Linuxは一気に確保する)

セキュリティ機構

・Full Relro(おそらくLinuxの話)
 外部バイナリを実行するときに、テーブルを利用する。
 Exploitはテーブル関数の書き換えることで予期せぬコードを実行させる。
 つまりテーブルを読み取り専用にすることで、セキュリティレベルを向上させる。
・DEP(Data Execution Prevention)
 実行可能領域にする必要のないメモリ領域に実行権限を与えないことで、Exploitを防ぐ。
・ASLR(Address Space Layout Randomization)
 OS起動時にバイナリの配置位置をランダムに変更する。
・CFG
 不正な関数が実行されていないか調べ、ROPなどの攻撃を防ぐ

まとめ

・そもそもLinuxとWindowsだとメモリ管理方法が違いすぎるため、攻撃の仕方や守り方も違ってくる。
・アップデートはしっかりしよう!

TechTrend #1:DevOpsにつながるソフトウェア開発プロセス再考 に参加した

TechTrend #1:DevOpsにつながるソフトウェア開発プロセス再考に参加した。その時のメモ。
とても有益だった。

Countir

ファイナンスの未来に、答えを。
ブロックチェーンに取り組んでいるらしい。

DevOpsにつながるソフトウェア開発プロセス再考 – 長沢智治氏

・DevOpsの定義はないため、スコープは人によってさまざま
・「現場の解は現場にしかない」
 今日学んだことを実践するというよりは、自分たちのビジネスの立ち位置を考えて
 どう動くかチームでコンセンサスしていくことが重要

時代の流れとIT

・確立したビジネスがあり便利な道具としてITを使うモデルから、ITありきのビジネスモデルに変化してきた
 時代は変わる、つまりソフトウェア開発手法も変えるべきなのかもしれない
・ユーザがダイレクトに伝えられる時代になってきている
 そのため意思決定はユーザや競合他社の状況も含めて判断しなければならないため
 CMO(Chief Marketing Officer)の重要性が上がっている
・つまり意思決定権は市場が主導となっている
・より顧客にリーチするにはどうすればよいか?といった攻めるプロダクトも必要
・品質について、コード品質からシステム品質に重要性が移り
 現在はビジネスとして品質が担保されているかどうか?がポイントに
 コードの品質が悪くとも、ビジネスの品質が高いということもある
・ステイシーマトリックスでいうと90年代は単純であったが、現在は無秩序

アイアントライアングルと開発手法

・Quality(品質)はある程度守るという前提で
 Scope(要件)、Cost(費用)、Delivery(納期)の全ては固定できない
 どれを守るか?が重要
・ウォーターフォールとアジャイルで固定するものは違う
 ウォーターフォール:要件(S)を固定して、工夫してコスト(C)と納期(D)を検討する
 アジャイル:一定の期間(D)で、一定のチーム(C)で、できる範囲(S)を実施していく
・アジャイルではその時々で優先順位の高いもの、できるものから処理していく
 つまりスプリントごとに価値を見直すため、結果として従来型よりも価値を高めやすい
・アジャイルでは、このチームでこの期間で、どれくらいのことができるか?が明確となり、予測できるようになる

チームと集団

・集団でなく、チームであるべき
 ・共通の目的と成果
 ・やり方を共有
 ・フォロー関係
・ビジネスする場合は集団も必ずある(開発班と企画班)が、DevOpsのためにはチームになる必要がある
 そのためには共通の目的を持つこと

知らなかったサービス

質問を匿名で受け付けるツール
https://www.menti.com/

AWS Black Belt – Amazon GuardDuty を閲覧した

AWS Black Belt – Amazon GuardDutyを閲覧した時のメモ。

セキュリティサービス整理


ID・アクセス管理:IAM,SSO
発見的統制:CloudWatch,CloudTrail(APIのロギング),GuardDuty
インフラストラクチャー保護:WAF,Shield(DDoSプロテクション)
データ保護:KMS,Macie
インシデントレスポンス:Lambda
リスク・コンプライアンス:Config,Trusticadvisor

Amazon GuardDuty について

特徴


・AWS re:Invent 2017でリリースされたサービス
・利用するとAWSServiceRoleForAmazonGuardDutyというロールが自動的に作成される
・IAMなどの監視もすることができることが強み

価格

脅威の検知方法



注意点

・検知のみでインシデントレスポンスは、CloudWatchEventとLambdaと連携する必要がある
・リージョンごとに設定する必要がある(CloudFormationを利用すると便利)
・VPC Flow LogsやCloudTrailを有効にしていなくても、AmazonGuardDutyが自動的に有効にして検知してくれる
・90日以上保管したい場合はS3に保存しておく必要がある
・他のアカウントに結果を共有することが可能

gulp で hello world!

概要

gulp入門を見たため、メモ。
gulpはフロントエンドのタスクを自動化するタスクランナーと呼ばれるもの。

インストール

dockerでcentosを用意して、gulpをインストールした。

PS C:\WINDOWS\system32> docker run -it centos:centos6
# yum -y install epel-release
# yum -y install nodejs npm
# node -v
v0.10.48
# npm -v
1.3.6
# npm install gulp -g
npm http GET https://registry.npmjs.org/gulp
npm http GET https://registry.npmjs.org/gulp
npm http GET https://registry.npmjs.org/gulp
npm ERR! Error: CERT_UNTRUSTED
npm ERR!     at SecurePair.<anonymous> (tls.js:1430:32)
npm ERR!     at SecurePair.emit (events.js:92:17)
npm ERR!     at SecurePair.maybeInitFinished (tls.js:1029:10)
npm ERR!     at CleartextStream.read [as _read] (tls.js:521:13)
npm ERR!     at CleartextStream.Readable.read (_stream_readable.js:341:10)
npm ERR!     at EncryptedStream.write [as _write] (tls.js:418:25)
npm ERR!     at doWrite (_stream_writable.js:226:10)
npm ERR!     at writeOrBuffer (_stream_writable.js:216:5)
npm ERR!     at EncryptedStream.Writable.write (_stream_writable.js:183:11)
npm ERR!     at write (_stream_readable.js:602:24)
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>

npm ERR! System Linux 4.9.87-linuxkit-aufs
npm ERR! command "node" "/usr/bin/npm" "install" "gulp" "-g"
npm ERR! cwd /
npm ERR! node -v v0.10.48
npm ERR! npm -v 1.3.6
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /npm-debug.log
npm ERR! not ok code 0

# npm config set strict-ssl false
# npm install gulp -g
# mkdir mysite
# cd mysite/
# npm init
# npm install --save-dev gulp # フォルダにgulpをインストールする
# npm config set strict-ssl true

hello world!

gulpfile.jsをgulpをインストールしたフォルダに用意する。

var gulp = require('gulp');

gulp.task('hello', function() {
    console.log('hello world!');
});

gulp.task('default',['hello']);

gulpを実行する。

# gulp
[13:06:58] Using gulpfile ~/mysite/gulpfile.js
[13:06:58] Starting 'hello'...
hello world!
[13:06:58] Finished 'hello' after 289 μs
[13:06:58] Starting 'default'...
[13:06:58] Finished 'default' after 12 μs
# gulp hello
[13:07:01] Using gulpfile ~/mysite/gulpfile.js
[13:07:01] Starting 'hello'...
hello world!
[13:07:01] Finished 'hello' after

その他、プラグインをインストールしてwebserverを立ち上げたり、watch(更新を監視)などが可能。

参考

npm install で SSL Error になった時の対処法。

chart.js で折れ線グラフ、棒グラフ、複合グラフを描いてみた

フロントエンド素人がおしゃれなグラフを描きたくchart.jsを使ってみた。
ソースコード一部だけのサイトが多かったため、グラフとソースコード全てを記載する。

グラフとソースコード

折れ線グラフ

Chart.js 入門より

<!DOCTYPE html>
<html lang=“ja”>
 <head>
  <meta http-equiv="content-language" content="ja">
  <meta name="robots" content="noindex,nofollow">
  <meta charset="UTF-8">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>

  <title>HTML Sample</title>
 </head>

 <body>
 <canvas id="myChart"></canvas>
 <script>
 var ctx = document.getElementById('myChart').getContext('2d');
 var chart = new Chart(ctx, {
    // 作成したいチャートのタイプ
    type: 'line',

    // データセットのデータ
    data: {
        labels: ["1月", "2月", "3月", "4月", "5月", "6月", "7月"],
        datasets: [{
            label: "初めてのデータセット",
            backgroundColor: 'rgb(255, 99, 132)',
            borderColor: 'rgb(255, 99, 132)',
            data: [0, 10, 5, 2, 20, 30, 45],
        }]
    },

    // ここに設定オプションを書きます
    options: {}
});
 </script>
 </body>
 
</html>

折れ線グラフ-その2

線グラフを参考に試してみた。

<!DOCTYPE html>
<html lang=“ja”>
 <head>
  <meta http-equiv="content-language" content="ja">
  <meta name="robots" content="noindex,nofollow">
  <meta charset="UTF-8">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>

  <title>HTML Sample</title>
 </head>

 <body>
 <canvas id="myChart"></canvas>
 <script>
 var ctx = document.getElementById('myChart').getContext('2d');
 var chart = new Chart(ctx, {
    // 作成したいチャートのタイプ
    type: 'line',

    // データセットのデータ
    data: {
        labels: ["1月", "2月", "3月", "4月", "5月", "6月", "7月"],
        datasets: [{
            label: "データ-1",
            borderColor: 'rgb(255, 99, 132)',
            // 線の幅(ピクセル単位)
            borderWidth: 2,
            // 線のベジェ曲線の張力。直線を描くには0に設定する。
            lineTension: 0.5,
            // 点の形状の半径。0に設定すると、点はレンダリングされない。
            pointRadius: 3,
            // マウスオーバー検出のために点半径に追加される半径(ピクセル単位)
            pointHitRadius: 3,
            // 線の下を埋めるかどうか
            fill: false,
            data: [0, 10, 5, 2, 20, 30, 45]
        },
        {
            label: "データ-2",
            borderColor: 'rgb(99, 255, 132)',
            // 線の幅(ピクセル単位)
            borderWidth: 2,
            // 線のベジェ曲線の張力。直線を描くには0に設定する。
            lineTension: 0.5,
            // 点の形状の半径。0に設定すると、点はレンダリングされない。
            pointRadius: 3,
            // マウスオーバー検出のために点半径に追加される半径(ピクセル単位)
            pointHitRadius: 3,
            // 線の下を埋めるかどうか
            fill: false,
            data: [10, 11, 7, 9, 21, 3],
        }]
    },

    // ここに設定オプションを書きます
    options: {}
});
 </script>
 </body>
 
</html>

棒グラフ

Chart.js – 使用方法より

<!DOCTYPE html>
<html lang=“ja”>
 <head>
  <meta http-equiv="content-language" content="ja">
  <meta name="robots" content="noindex,nofollow">
  <meta charset="UTF-8">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>

  <title>HTML Sample</title>
 </head>

 <body>
    <canvas id="myChart" width="400" height="300"></canvas>

<script>
    var ctx = document.getElementById("myChart");
    var myChart = new Chart(ctx, {
        type: 'bar',
        data: {
            labels: ["赤", "青", "黄", "緑", "紫", "橙"],
            datasets: [{
                label: '得票数',
                data: [8, 9, 3, 5, 2, 3],
                backgroundColor: [
                    'rgba(255, 99, 132, 0.2)',
                    'rgba(54, 162, 235, 0.2)',
                    'rgba(255, 206, 86, 0.2)',
                    'rgba(75, 192, 192, 0.2)',
                    'rgba(153, 102, 255, 0.2)',
                    'rgba(255, 159, 64, 0.2)'
                ],
                borderColor: [
                    'rgba(255,99,132,1)',
                    'rgba(54, 162, 235, 1)',
                    'rgba(255, 206, 86, 1)',
                    'rgba(75, 192, 192, 1)',
                    'rgba(153, 102, 255, 1)',
                    'rgba(255, 159, 64, 1)'
                ],
                borderWidth: 1
            }]
        },
        options: {
            scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero:true
                    }
                }]
            }
        }
    });
    </script> 
</body>

</html>

棒グラフ-その2

棒グラフを参考に試してみた。

<!DOCTYPE html>
<html lang=“ja”>
 <head>
  <meta http-equiv="content-language" content="ja">
  <meta name="robots" content="noindex,nofollow">
  <meta charset="UTF-8">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>

  <title>HTML Sample</title>
 </head>

 <body>
    <canvas id="myChart" width="400" height="300"></canvas>

<script>
    var ctx = document.getElementById("myChart");
    var myChart = new Chart(ctx, {
        type: 'bar',
        data: {
            labels: ["1月", "2月", "3月", "4月", "5月", "6月"],
            datasets: [{
                label: 'データ1',
                data: [8, 9, 3, 5, 2, 3],
                backgroundColor: [
                    'rgba(54, 162, 235, 0.2)',
                    'rgba(54, 162, 235, 0.2)',
                    'rgba(54, 162, 235, 0.2)',
                    'rgba(54, 162, 235, 0.2)',
                    'rgba(54, 162, 235, 0.2)',
                    'rgba(54, 162, 235, 0.2)'
                ],
                borderColor: [
                    'rgba(54, 162, 235, 1)',
                    'rgba(54, 162, 235, 1)',
                    'rgba(54, 162, 235, 1)',
                    'rgba(54, 162, 235, 1)',
                    'rgba(54, 162, 235, 1)',
                    'rgba(54, 162, 235, 1)'
                ],
                // バーの境界線の太さ(ピクセル単位)
                borderWidth: 1,
                // データセットが属するグループのID
                stack: 1
            },
            {
                label: 'データ2',
                data: [1, 2, 4, 2, 1, 5],
                backgroundColor: [
                    'rgba(255, 99, 132, 0.2)',
                    'rgba(255, 99, 132, 0.2)',
                    'rgba(255, 99, 132, 0.2)',
                    'rgba(255, 99, 132, 0.2)',
                    'rgba(255, 99, 132, 0.2)',
                    'rgba(255, 99, 132, 0.2)'
                ],
                borderColor: [
                    'rgba(255,99,132,1)',
                    'rgba(255,99,132,1)',
                    'rgba(255,99,132,1)',
                    'rgba(255,99,132,1)',
                    'rgba(255,99,132,1)',
                    'rgba(255,99,132,1)'
                ],
                // バーの境界線の太さ(ピクセル単位)
                borderWidth: 1,
                // データセットが属するグループのID
                stack: 1
            }]
        },
        options: {
            scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero:true
                    },
                    stacked: true
                }],
                yAxes: [{
                    stacked: true
                }]
            }
        }
    });
    </script> 
</body>

</html>

複合グラフ

折れ線グラフと棒グラフを合わせてみた。

<!DOCTYPE html>
<html lang=“ja”>

<head>
    <meta http-equiv="content-language" content="ja">
    <meta name="robots" content="noindex,nofollow">
    <meta charset="UTF-8">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>

    <title>HTML Sample</title>
</head>

<body>
    <canvas id="myChart" width="400" height="300"></canvas>

    <script>
        var ctx = document.getElementById("myChart");
        var myChart = new Chart(ctx, {
            type: 'bar',
            data: {
                labels: ["1月", "2月", "3月", "4月", "5月", "6月"],
                datasets: [{
                    type: 'bar',
                    label: 'データ1',
                    data: [8, 9, 3, 5, 2, 3],
                    backgroundColor: [
                        'rgba(54, 162, 235, 0.2)',
                        'rgba(54, 162, 235, 0.2)',
                        'rgba(54, 162, 235, 0.2)',
                        'rgba(54, 162, 235, 0.2)',
                        'rgba(54, 162, 235, 0.2)',
                        'rgba(54, 162, 235, 0.2)'
                    ],
                    borderColor: [
                        'rgba(54, 162, 235, 1)',
                        'rgba(54, 162, 235, 1)',
                        'rgba(54, 162, 235, 1)',
                        'rgba(54, 162, 235, 1)',
                        'rgba(54, 162, 235, 1)',
                        'rgba(54, 162, 235, 1)'
                    ],
                    // バーの境界線の太さ(ピクセル単位)
                    borderWidth: 1,
                    // データセットが属するグループのID
                    stack: 1
                },
                {
                    type: 'bar',
                    label: 'データ2',
                    data: [1, 2, 4, 2, 1, 5],
                    backgroundColor: [
                        'rgba(255, 99, 132, 0.2)',
                        'rgba(255, 99, 132, 0.2)',
                        'rgba(255, 99, 132, 0.2)',
                        'rgba(255, 99, 132, 0.2)',
                        'rgba(255, 99, 132, 0.2)',
                        'rgba(255, 99, 132, 0.2)'
                    ],
                    borderColor: [
                        'rgba(255,99,132,1)',
                        'rgba(255,99,132,1)',
                        'rgba(255,99,132,1)',
                        'rgba(255,99,132,1)',
                        'rgba(255,99,132,1)',
                        'rgba(255,99,132,1)'
                    ],
                    // バーの境界線の太さ(ピクセル単位)
                    borderWidth: 1,
                    // データセットが属するグループのID
                    stack: 1
                },
                {
                    type: 'line',
                    label: "データ3",
                    backgroundColor: 'rgb(255, 99, 132)',
                    borderColor: 'rgb(255, 99, 132)',
                    // 線の幅(ピクセル単位)
                    borderWidth: 2,
                    // 線のベジェ曲線の張力。直線を描くには0に設定する。
                    lineTension: 0.5,
                    // 点の形状の半径。0に設定すると、点はレンダリングされない。
                    pointRadius: 3,
                    // マウスオーバー検出のために点半径に追加される半径(ピクセル単位)
                    pointHitRadius: 3,
                    // 線の下を埋めるかどうか
                    fill: false,
                    data: [5, 10, 5, 9, 20, 30],
                }]
            },
            options: {
                scales: {
                    yAxes: [{
                        ticks: {
                            beginAtZero: true
                        },
                        stacked: true
                    }],
                    yAxes: [{
                        stacked: true
                    }]
                }
            }
        });
    </script>
</body>

</html>

補足-開発環境

いちいちタグを書くのが辛かったため、エディタを探した。
Visual Studio Codeなるものをインストール。
Visual Studio Codeの使い方、基本の「キ」によると
・Microsoftが提供するクロスプラットフォームな高機能で軽量なエディタ(いろいろできるがIDEではない)
・デバッグ機能あり、多数の言語をサポート、Git連携、IntelliSense(自動補完システム)
・コマンドプロンプトで「code」で起動
らしい。

参考

chart.js入門 – サーバサイドについても記載されている
chart.js で複数軸の複合グラフを描く