Docker入門

今更ですが、、Dockerの基本的なことをまとめる。

Dockerとは

Dockerが必要となった背景

・アプリケーションは作ったら終わりではなく、ユーザの要望を取り込み価値のあるアプリケーションに改善していく必要がある
・ユーザ要望が多様化し、変化のスピードも早くなっているため、迅速かつ柔軟なIT基盤が求められるようになってきた
・継続的インテグレーション時の仮想マシンでの問題を、Dockerは解決できる

特徴

・アプリケーションの実行環境をコード管理できる
 ・アプリケーション開発者も環境をすぐに用意することができる
  (サーバ管理者にサーバ構築してもらう必要がなくなる)
 ・本番環境に追加した設定がテスト環境には追加されていない、を回避しやすくなる
・ベースOSのカーネルや機能を利用するため、仮想マシンと比較してオーバーヘッドが少なくなり、リソース消費量(メモリやディスク容量)が少なくなる
 ・作業が効率化される(構築時間がとても早くなる)
 ・仮想マシンとは違って、ハードウェアやカーネルに影響するアプリケーションは利用できない場合がある

操作方法

Docker for Windows で操作する。
まずは、windows10へのdockerインストールにしたがって、Dockerをインストールした。

ubuntuにnginxをインストールして、ブラウザで閲覧できるようにする

### Dockerレジストリ(リポジトリ)から、コンテナイメージを検索する ###
### 公式で、ubuntuを含むコンテナイメージを検索している ###
> docker search --no-trunc --filter is-official=true ubuntu
NAME                 DESCRIPTION                                                                                            STARS               OFFICIAL            AUTOMATED
ubuntu               Ubuntu is a Debian-based Linux operating system based on free software.                                7991                [OK]
ubuntu-upstart       Upstart is an event-based replacement for the /sbin/init daemon which starts processes at boot         87                  [OK]
neurodebian          NeuroDebian provides neuroscience research software for Debian, Ubuntu, and other derivatives.         50                  [OK]
ubuntu-debootstrap   debootstrap --variant=minbase --components=main,universe --include=inetutils-ping,iproute2 <suite> /   39                  [OK]

### コンテナイメージをダウンロードする ###
### ubuntuの最新バージョンをダウンロードする ###
### もしDockerホストのubuntuのバージョンが古くても、Linuxカーネルは後方互換性があるため基本的には問題ない ###
> docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
6b98dfc16071: Pull complete
4001a1209541: Pull complete
6319fc68c576: Pull complete
b24603670dc3: Pull complete
97f170c87c6f: Pull complete
Digest: sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d
Status: Downloaded newer image for ubuntu:latest

### ダウンロードしたコンテナイメージを表示する ###
> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              113a43faa138        5 weeks ago         81.2MB

### Dockerコンテナを起動して、nginxをインストールする ###
### 最初にapt-get updateしないとエラーとなる ###

### docker run オプション ###
### -h hostname ホスト名を指定することが可能※デフォルトではコンテナIDと同じ名前となる ###
### --cpuset-cpus 0-3 --memory 4096m などで利用するCPUやメモリ数を指定することが可能 ###
> docker run -it --name ubuntu-container ubuntu
root@b6ec500d4fd7:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04 LTS"

root@b6ec500d4fd7:/# apt-get install nginx
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package nginx

root@b6ec500d4fd7:/# apt-get update && apt-get upgrade
...

root@b6ec500d4fd7:/# apt-get install nginx
...
root@b6ec500d4fd7:/# /etc/init.d/nginx status
 * nginx is not running

root@b6ec500d4fd7:/# /etc/init.d/nginx start
 * Starting nginx nginx                                                                                                                                                      [ OK ]

root@b6ec500d4fd7:/# ps afx
   PID TTY      STAT   TIME COMMAND
     1 pts/0    Ss     0:00 /bin/bash
   920 ?        Ss     0:00 nginx: master process /usr/sbin/nginx
   921 ?        S      0:00  \_ nginx: worker process
   922 ?        S      0:00  \_ nginx: worker process
   924 pts/0    R+     0:00 ps afx

root@b6ec500d4fd7:/# exit
exit

### コンテナイメージを作成する ###
> docker commit ubuntu-container akatuki/ubuntu-nginx
sha256:507f4bf357e5a0bcb5df74d50e51fea31778fcc6f0f17938baf977aeb6db38d0

> docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
akatuki/ubuntu-nginx   latest              507f4bf357e5        5 seconds ago       196MB
ubuntu                 latest              113a43faa138        5 weeks ago         81.2MB

### 80番ポートを利用してコンテナを起動する ###
> docker run -itd -p 80:80 --name ubuntu-nginx-container akatuki/ubuntu-nginx

> docker ps
CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS              PORTS                NAMES
76c54b34974b        akatuki/ubuntu-nginx   "/bin/bash"         29 seconds ago      Up 27 seconds       0.0.0.0:80->80/tcp   ubuntu-nginx-container

> docker attach ubuntu-nginx-container

root@76c54b34974b:/# /etc/init.d/nginx start
 * Starting nginx nginx

### [Ctl]+[P]+[Q]でコンテナを終了せずに、PowerShellに戻ることが可能 ###
### exitするとPID1の /bin/bash が終了する、つまりコンテナが終了する ###
root@76c54b34974b:/# read escape sequence

localhostにアクセスすると、nginxのページが表示される。

Dockerfileを利用した場合

# Dockerfile

FROM ubuntu
MAINTAINER akatuki

RUN apt-get update && apt-get upgrade && apt-get install nginx
CMD service nginx start && bash
> docker build -t akatuki/ubuntu-nginx-2 .\docker_ubuntu_nginx\
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM ubuntu
 ---> 113a43faa138
Step 2/4 : MAINTAINER akatuki
 ---> Running in 16fcf202048b
Removing intermediate container 16fcf202048b
 ---> 216a90a83370
Step 3/4 : RUN apt-get update && apt-get -y upgrade && apt-get install -y nginx
 ---> Running in 33c5c837b636
...
Removing intermediate container 33c5c837b636
 ---> 3e4fc279fc09
Step 4/4 : CMD service nginx start && bash
 ---> Running in f71c691629b7
Removing intermediate container f71c691629b7
 ---> 1bae7466b72c
Successfully built 1bae7466b72c
Successfully tagged akatuki/ubuntu-nginx-2:latest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

> docker images
REPOSITORY               TAG                 IMAGE ID            CREATED              SIZE
akatuki/ubuntu-nginx-2   latest              1bae7466b72c        About a minute ago   194MB

> docker run -itd -p 80:80 --name ubuntu-nginx-container-2 akatuki/ubuntu-nginx-2

その他便利なコマンド

### dockerのバージョンを確認する ###
> docker version
Client:
 Version:      18.03.1-ce
 API version:  1.37
 Go version:   go1.9.5
 Git commit:   9ee9f40
 Built:        Thu Apr 26 07:12:48 2018
 OS/Arch:      windows/amd64
 Experimental: false
 Orchestrator: swarm

Server:
 Engine:
  Version:      18.03.1-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.9.5
  Git commit:   9ee9f40
  Built:        Thu Apr 26 07:22:38 2018
  OS/Arch:      linux/amd64
  Experimental: true

### docker実行環境を確認する ###
> docker info
Containers: 2
 Running: 1
 Paused: 0
 Stopped: 1
Images: 2
Server Version: 18.03.1-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host ipvlan macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 773c489c9c1b21a6d78b5c538cd395416ec50f88
runc version: 4fc53a81fb7c994640722ac585fa9ca548971871
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.9.87-linuxkit-aufs
Operating System: Docker for Windows
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.934GiB
Name: linuxkit-00155d011c1d
ID: IHML:MLXN:VWM4:BN3Q:QYWT:QJC4:QVAO:UD5Q:ZS3M:DQC7:2NVH:EP34
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 27
 Goroutines: 48
 System Time: 2018-07-16T14:06:28.8408325Z
 EventsListeners: 1
Registry: https://index.docker.io/v1/
Labels:
Experimental: true
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

### コンテナの詳細情報を取得する ###
> docker inspect ubuntu-nginx-container
[
    {
        "Id": "76c54b34974ba7c0cba4aade1875f280517e27588796b96831290386fc12e813",
        "Created": "2018-07-16T13:58:33.5983827Z",
        "Path": "/bin/bash",
        "Args": [],
...

### コンテナ内で変更があったディレクトリとファイルを表示する ###
> docker diff ubuntu-nginx-container
C /root/.bash_history
C /run/nginx.pid
C /var/log/nginx/access.log
C /var/log/nginx/error.log

### コンテナのプロセスを確認する ###
> docker top ubuntu-nginx-container
PID                 USER                TIME                COMMAND
14521               root                0:00                /bin/bash
14671               root                0:00                nginx: master process /usr/sbin/nginx
14672               xfs                 0:00                nginx: worker process
14673               xfs                 0:00                nginx: worker process

### コンテナ内部で実行された標準出力、標準エラー出力への内容を確認する ###
> docker logs ubuntu-nginx-container
root@76c54b34974b:/# /etc/init.d/nginx start
 * Starting nginx nginx

### コンテナイメージの中間イメージの履歴を表示する ###
> docker history akatuki/ubuntu-nginx
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
507f4bf357e5        30 minutes ago      /bin/bash                                       115MB
113a43faa138        5 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           5 weeks ago         /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B
<missing>           5 weeks ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$…   2.76kB
<missing>           5 weeks ago         /bin/sh -c rm -rf /var/lib/apt/lists/*          0B
<missing>           5 weeks ago         /bin/sh -c set -xe   && echo '#!/bin/sh' > /…   745B
<missing>           5 weeks ago         /bin/sh -c #(nop) ADD file:28c0771e44ff530db…   81.1MB

### コンテナを出力する ###
> docker export ubuntu-nginx-container > ubuntu-nginx-container.img

補足1 – コンテナ管理について

複数アプリケーション利用時のコンテナ数について

・アプリケーションごとにコンテナを分割がベストプラクティス
 ・コンテナを作り直す際に、設定変更内容が明確になるため

コンテナのスナップショット

・コンテナ起動時にスナップショットを作成する
 停止時はスナップショットを保持する
 削除時にスナップショットを削除する

補足2 – すべてのコンテナイメージを削除する

> docker rmi -f  $(docker images -aq)

参考

今、なぜ「Docker」なのか
Docker実践入門――Linuxコンテナ技術の基礎から応用まで
docker コマンド チートシート
docker初心者の方が知っておいた方がよい基礎知識
docker-compose upするとコンテナが一瞬でexited with code 1する話

Visual Studio Code のデフォルト設定変更

概要

以下を参考に、Visual Studio Code の設定を変更した。
VSCodeで文字コードを自動判別する
VS Codeのミニマップが邪魔なので消す
Visual Studio Codeでhtmlのプレビューを表示する

文字コードの自動判別をONにする

[ファイル] > [基本設定] > [設定] より、以下を追加した。

"files.autoGuessEncoding": true

左側の設定を[編集]することで、設定を追加することも可能。

ミニマップをOFFにする

右側にあるミニマップなるものが不要なため無効に。

"editor.minimap.enabled": false

HTMLファイルのライブプレビューをONにする

[Live HTML Previewer]をインストールする。

[Ctrl]+[q] → [s]にて、横にプレビュー画面が表示される。

Google流資料作成術を読んだ

Google流資料作成術を読んだ。その際のメモ。

第1章 – コンテキストを理解する

・誰に、何を、どのように伝えるかを明確にする

そのために

・自信のある態度で伝えること
 ・「相手は自分より多くのことを知り、どう行動するかは相手次第」と思い込んでいる人が多いがそれは勘違い
  データを分析し、伝えるのであれば、そのテーマについて一番知っているのはあなたであり、人々を行動に導かなければならない
・必要な情報を把握する
 ・背景、意思決定者が先入観があるか、データをみたことがあるか、賛成しそうかどうか、こちらの主張にリスクがあるか、などなど
・3分ストーリーとビックアイデアを用意する
 ・ビックアイデアとは伝えたいことを1分にまとめたもの。つぎの3つの要素がある
  1.あなたの独自の視点を明確にしている
  2.何が危機にさらされているかを伝えている
  3.完全な文章である

第2章 – 相手に伝わりやすい表現を選ぶ

・データを表現する最善の方法を考える
 ・線グラフか、棒グラフか、表か、テキストが一番良い場合もある
・円グラフ、3Dグラフ、第2縦軸は正確な数値が読みとりにくいため、使うべからず

第3章 – 不必要な要素を取りのぞく

・情報を追加すればするほど、相手に認知的負荷を与える。不要な要素を取り除いていくことで、データがより目立つ
・視覚認知のゲシュタルトの法則を理解して、クラター(認知的負荷の原因)を識別する
・認知的負荷を与える記載をしない
 ・中央揃えは、2行以上ある場合は右側も左側もそろわずだらしない印象を与えるためなるべく避ける
 ・なるべく横書きに統一すること
  45度の方向に回転された文章は、傾きのない文章を比較して 52%読む速度が遅くなる
  90度の方向に回転された文章は、傾きのない文章を比較して205%読む速度が遅くなる
 ・空白を適切に利用すること。息継ぎもなしに早口での話は理解しにくい。文章も同じ

第4章 – 相手の注意をひきつける

・サイズ、色、配置など無意識的視覚情報を戦略的に利用する
・相手の注意を意図するところに集め、意図通りに読んでもらう
・スクリーンやページを読み取る際、人は左からZの形で見ていく
・どこを注目させるか考える際は、一度グラフのすべての色をグレーにしてみるとよい
・色覚障害にも配慮したほうがよい(色覚障害シミュレーターのサイトやアプリがあるため、利用するべし)

第5章 – デザイナーのように考える

・「形式は機能に従う」と同様に、データで何を伝えたいかを考えてから、表現方法を考えるべし
・「足すべきものがなくなった時ではなく、減らすものが何もなくなったとき、それが完璧になったとわかる」(サンテグジュペリ)
・人々が新しいものに抵抗を示すのは、古いものに親しんでいるから
 変化させるときはメリットを明確にする、比較できるようにする、キーマンを巻き込むといった対応が必要

第7章 – ストーリーを伝える

・よい物語は人をひきつけ、旅に連れ出し、感情に直接働きかけ、記憶に残る力を持っている。そしてその物語を友人に話して聞かせる
・理論だけでは人は行動する気にならない。ストーリーをつくることで人々の心に響き、行動につながる
・ストーリーには「始まり、中間、結末」がある。まずは物語の設定から始まる。主人公や登場人物の紹介や関係性や世界観を紹介し
 その後主人公は事件に直面する。この事件を対処しようとする中で自分を理解し、より一段高い気づきに到達する
 そして最後に、事件を解決し主人公やほかの登場人物が、新たな感覚を通じて自分が何者か理解する

Interact 2018 に参加した(2)

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

Recap: PowerShell Core – 高井 一輝氏

PowerShell Coreとは何か

Windows PowerShellとの違いについて

・Full .NET Frameworkに依存しないPowerShell
・クロスプラットフォーム
 LinuxやMACでも動作する。
・Windows PowerShellと互換性はあるが、基本的には違うもの
・WMFに(建前上は)依存しない
・SSHが使えるバージョンと使えないバージョンがある
・UTF-8(BOMなし)
・Modern Lifecycle Policy(新しいバージョンが出たら、半年の間にアップデートする必要あり)
・WindowsPowerShellと共存可能
・Windows PowerShellは、今後大幅な機能追加やエンハンスは行われない予定

Powershell Coreへ移行すべきか

No。ただし新しくコードをかく場合はPowerShell Coreを意識してもよいかも。

Powershell Coreを使うべき人

・クロスプラットフォームで利用したい人
・コンテナを利用してWindows管理したい人(開発スピードが早いプロダクトを利用している場合)
・PowerShellの動作を変えたい人(オープンソースのため、どうぞ)

注意点

・LinuxからWindowsへのWinRMの通信は失敗する
 最新のWindowsは認証されていないと受け付けないようになっており、PowerShellCoreでの認証周りの設定が難しい、らしい。

Windows Admin Center -Project Honolulu改め- – 指崎 則夫氏

※Inside Previewを利用しているため、変わってくる可能性も

Windows Admin Centerとは

・ブラウザを利用して、サーバを中央管理することが可能
・EdgeもしくはFirefox(ただし検証はされていない)が無難
・Chromeは画面遷移で認証エラーが多発する
・インストールが簡単(ただし証明書が絡むと少し手間がかかる)
・インストールファイルサイズが数10MBと軽量
・10GB以上のCSVがあれば冗長化構成をとることができる(2ノード以上のWindows Server 2016 failover Cluster)
・イベントログの確認、サービスの起動、ファイルの確認、レジストリの操作など管理できる

Admin Centerからサーバへのアクセス方法

・PowerShell or WinRMで接続するため、各サーバに許可設定をする必要がある

管理される側要件(古いOSについて)

・WinSV2012(WMF5.1以上)
・Win2008R2(WMF5.1以上)も最新のAdminCenterは管理できる
・ワークグループなWindowsはレジストリを登録することが必要

Microsoft Azure Global VNet Peering(仮) – 廣瀬一海氏

・VNet Peeringを利用すると、AzureがSDN(LVGREやSmartNIC(FPGA)を利用)であることを感じられる
・FPGAを利用してパケットチェックして機械学習を利用して、DDoS攻撃を処理している
・Azureは実質WANのようなもの。リージョン間のネットワークもMicrosoftで海底ケーブルを引き、すべて自社網を利用する唯一のパブリッククラウド
・東京リージョンから大阪リージョンへは2msレベル
・Azureは33000マイルの自社網を持ち、世界二位のグローバルネットワークを保有している(1位はペンタゴン)
・ExpressRouteは南極以外からは接続できる
・VNet PeeringはvNETのエンドポイントのBGPルーターを利用して実現している
 制限として10地点としか接続できない
・NW設計について、サブネット分離(Publicサブネット、Privateサブネット)という鉄板も世界をまたいだ設計を考えると、破綻する
 事業ネットワーク、論理ネットワークを考慮して、事業の展開に役立つような設計が大切

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だとメモリ管理方法が違いすぎるため、攻撃の仕方や守り方も違ってくる。
・アップデートはしっかりしよう!