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 で複数軸の複合グラフを描く

エンジニア必見★ITネットワーク・セキュリティ技術基礎講座に参加した

エンジニア必見★ITネットワーク・セキュリティ技術基礎講座に参加したときのメモ。

開催企業

・株式会社セラクさん。
・農業向けIoTのみどりクラウドやサーバ構築業務などが得意。
・インフラが売上の7割を占める。
・社内ではNW講習が5日間あるらしい。

NWを勉強する上でオススメの資格

CCNA Routing & Switching

・Cisco Systems社の認定試験。(入門資格)
・上位資格にCCNP、CCIEがある。CCIEはすべて英語で、英語で会話してNW設定をするという項目があり、非常に難しく、かつ高額。

CompTIA Network+

・ベンダーニュートラル。体系的に学ぶ上で有用な資格。
・海外ではメジャーであるが、国内ではそこまでメジャーではない。

学習サイトやツール

・3分間Networking
・ネットワークエンジニアとして
・ラボ用サイト-CCStudy
・Packet Tracer
 Cisco社が提供しているネットワークシミュレータ。
 無料でCisco Networking Academiyに会員登録すると利用可能。
・Virus Total
・Digital Attack Map
 ネタとして。
・Fiddler
 プロキシ。Webアプリケーションとブラウザ間の通信をキャプチャしてデバック可能。

ルーティング

スタティックルーティング

・手動で各ルーターに経路情報を設定する必要があり、手間がかかる。
・ダイナミックルーティングのように不要な通信が発生しない。
・経路にトラブルが発生したら手動で対応する必要がある

ダイナミックルーティング

・初期設定すればルーター間で自動的に経路情報を交換してくれる
・宛先までの経路が複数ある場合、メインの経路にトラブルが発生したら自動的に経路を切り替える。
・経路ごとにCPU状況などを確認して最適なルートを検出することも可能。

サイバー攻撃

目的

・愉快犯
・金銭目的(個人情報搾取など)
⇒最近は金銭目的が増加傾向にある

DDoS対策

FWで防いだとしても、回線は混雑する可能性が高い。
通信業者やプロバイダのDDoS対策は月額20万円ほど

OS、SQLインジェクション、XSS

WAFが有効。

その他セキュリティ対策

・ワンタイムパスワード
 トークン方式とトークンレス方式があり、セキュアな環境を構築可能。
・二要素認証
・人の教育
 社員のセキュリティ意識が低ければ、いくら導入しても無駄になる。