helloworlds

not a noun, it's a verb

【Windows】Dokcer + WSL + VSCodeが楽!

昨日に引き続いて、Windowsの開発環境がテーマです!

今回はそんなに内容がありませんが、Windowsでの開発がそんなになかったので

自分のデフォルト的な設定を残しがてら記事を書きます。

WSLからWindows for Dockerを操作

前回の記事で少し詳しい内容を書きました!

o21o21.hatenablog.jp

Linux操作に慣れてる人にとっては、だいぶ良い環境になると思います!

ただ、ヴァージョンアップなど、ある程度自由にできない環境だとちょっと環境設定のときに試行錯誤が必要かもしれません。

↑上記の設定が済んだあと、エディタはどうすればいいのかと思いました。

エディタ

わたしの場合、vimも好きなので、そのままWSLの方でvimの設定を少しすれば使用できるので、

すごく困るわけではないのです。

が、

エディタを使用したデバッグなど、エディタのプラグイン的なので便利に利用できるものも多いはずです。

ここでは、VSCodeを紹介しておきます!

code.visualstudio.com

まだWSL+VSCodeを駆使してがっつり開発している段階ではないですが、すごく楽な拡張機能を見つけたので、残しておきます。

WSLのプロジェクトに接続

WSLからWindowsのDockerを操作できることはよかったので、

今度は、git cloneなどでプロジェクトをクローンしてきたプロジェクトフォルダを簡単に開けないものか。。。

ということで、VSCodeのこのプラグイン

Remote Development !!

拡張機能の検索から、↑で調べます。

インストールしたら、左のメニューの "リモート エクスプローラー" を選択します。

そうすると、"WSL TARGETS" という項目が自動的に表示されています。

接続したので、そのままフォルダを開けば大丈夫です!

いやーーーーー、ほんとに便利です!

ものの1分もかからずにWSLのプロジェクトを開くことができました!!

以上.

marketplace.visualstudio.com

【Windows】WSLからDocker for Windowsを操作する設定メモ

今回は、仮想環境のちょっとした記事です。

Windows10で、Dockerをインストールしたのはいいけど、

Windowsコマンドプロンプトの操作から脱出したかったのがきっかけでした。(別にWindowsが嫌いとかではもちろんなく、ただ使い慣れた環境操作が良かった!笑)

なので、Windows標準で使用できるWindows Subsystem for Linux (WSL)で、

WindowsにインストールしたDockerを操作できるようにしたメモ記事です!

細かい個々のツールに関しては解説はしません。 不具合があった際は、適宜ヴァージョンなどを確認してみてください!

では、さっそく。

環境

  • Windows10 : version 1903
  • Docker (Windows側: 19.03.5, WSL側: 18.09.7)
  • docker-compose (Windows側: 1.25.2, WSL側: 1.25.3)
  • WSL(Ubuntu) : 18.04
  • apt: 1.6.10

Windows

Dockerをインストールしていく

まずは、公式からDockerをインストールします。

※インストールには、Dockerのアカウントが必要かもしれません。

手順通りインストールすれば問題ないでしょう。

docs.docker.com

インストールが完了したら、コマンドプロンプトを立ち上げて、以下を実行してみます。

> docker -v
Docker version 19.03.5, build 633a0ea

> docker-compose -v
docker-compose version 1.25.2, build 698e2846

ヴァージョンが表示されればおkです。

試しにhello-world(docker run hello-world)もやってみたくなりますが、わたしは敢えてスキップしました。

別に今やってもいいのですが、あとでWSLからdocker ps -a でコンテナがあるか確認します。 特に意味はないのですが、WSLにもWindowsにもコンテナが今はないほうがスッキリするだけです笑

プロキシの設定をする

社内環境などで使用する場合、プロキシの設定をしないとDockerが外へ出ることができません。

なので、もし必要な場合が設定をしましょう。

  1. タスクバーにあるDockerをクリック
  2. Settings
  3. Resources-> PROXIES
  4. 環境に合わせてプロキシサーバーのURLを入力 (ex.. hoge.proxy.co.jp:8080)
  5. 入力したら、"Apply&Restart"

Cドライブをマウント

こちらもDockerのSettingsから確認できます。

  1. タスクバーにあるDockerをクリック
  2. Settings
  3. Resources-> FIRE SHARING
  4. "C" にチェック
  5. 入力したら、"Apply&Restart"

WSLからDocker for Windowsのデーモンを呼び出す設定

こちらもDockerのSettingsから確認できます。

  1. タスクバーにあるDockerをクリック
  2. Settings
  3. General
  4. "Expose daemon on tcp://localhost:2375 without TLS" にチェック
  5. 入力したら、"Apply&Restart"

WSL側

WSLを立ち上げて設定やらインストールやらしていきます。

.bashrc

.bashrcに以下を追記します。

DOCKER_HOST=tcp://localhost:2375

もし、.bashrcを今回新規作成していたら、.bash_profileに以下を追記します。

if [[ -f ~/.bashrc ]] ; then
    . ~/.bashrc
fi

プロキシ

もしプロキシサーバーがあれば、以下を設定していきます。

aptの設定

もしapt.confというファイルがなければ作成します。

$ sudo vim /etc/apt/apt.conf

# 以下を追記 (ドメインのところはご自身のものに編集)
Acquire::http::Proxy "http://hoge.foo.com:8080";
Acquire::http::Proxy "https://hoge.foo.com:8080";

curlの設定

ホームディレクトリに.curlrcファイルを作成し、編集する。

$ vim .curlrc

# 以下を追記 (ドメインのところはご自身のものに編集)
proxy = http://hoge.proxy.co.jp:8080

Dockerのインストール

今回のわたしの環境は、Ubuntuです。

公式にUbuntuへのDockerのインストールがあるので、参考にします。

Get Docker Engine - Community for Ubuntu | Docker Documentation

公式に手順があるので、ここではざっくりとした手順のみ記述します。

# アップデート
$ sudo apt-get update

# aptがHTTPS経由でリポジトリを使用できるようにする
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# Dockerの公式GPGキーを追加
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# フィンガープリントを確認
$ sudo apt-key fingerprint 0EBFCD88

# リポジトリの設定
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# 再度アップデート
$ sudo apt-get update
  • GPGキーとは?

GPG(GNU Privacy Gard)とは、暗号化・復号化のツールのキー。Dockerのパッケージを復号化するために使用します。

  • add-apt-repository

aptのリポジトリというものがあります。リポジトリは複数あり、リポジトリを設定することでそのリポジトリからパッケージをインストールすることができます。 今回の設定では、Dockerをインストールするために、stableを選択しました。

続いて、Dockerをインストールしていきますが、

わたしがインストールしていくとき、公式のコマンドでエラーが出てしまいました。

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

docker-ceがどうしてもインストールできませんでした。docker-ceは、コミュニティヴァージョン(無償)です。

まだ、きちんと確認できてはいないのですが、エラーをみるとdocker.ioをインストールしろとのこと。

ここで疑問が浮かび上がりました。

docker-ceとdocker.ioの違いとは?

先程も書いたとおり、docker-ceは世間一般で言うDockerのことらしい。

docker-eeは有償版らしい。

docker.ioUbuntuがメンテナンスしているパッケージのことらしい。

What is the difference between docker-engine and docker.io packages? - Quora

インストール(docker.io)

つまり、エラーのとおり、UbuntuでDockerをインストールしたい場合は、パッケージ名としてdocker.ioを指定するといいのかもしれない。

$ sudo apt-get install docker.io

docker-composeをインストール

docker-composeをインストールする。

docs.docker.com

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

# 確認
$ docker-compose -v

WSLの再起動

WSLを再起動をします。

これをしないとうまく設定が反映されないと思うので、実行します。

このコマンドは、PC自体を再起動しなくとも、WSLのみ再起動させることができるので、便利です!

WSLのウィンドウを閉じるだけでは、再起動していることにならないので、注意してください!

> net stop LxssManager
> net start LxssManager

確認

確認の方法はどうでもいいと思うのですが、この記事の冒頭で書いたとおり、

Windows側のコマンドプロンプト> docker run hello-world をして、hello-worldのイメージとコンテナが作成されるはずです。

Dockerの簡単なコマンドです。

# コンテナを全て表示
$ docker ps -a

# 稼働中のコンテナを表示
$ docker ps

# イメージを表示
$ docker images

runさせたら、Windowsコマンドプロンプトでコンテナを確認します。

次は、WSLの方で、Windows側で作成されたコンテナとイメージが確認できるかdocker ps -a を叩いて確認してみましょう。

無事、コンテナが確認できたらおkです!!

以上.

【Linux】Windows + VirtualBox(Vagrant) + CentOS (+ Proxy)

だいぶ期間が空いてしまいた。。。

アルゴリズムシリーズもまた更新したいのですが、

今回がWindowsでの仮想環境構築についてメモがてら記事を書きました。

まえおき

いつもはMac(MacOS)メインで使用していますが、Windowsを使用する機会があったので、

今回はWindowsが前提になります。

仮想環境構築ということで、VirtualBoxVagrantをインストールし、CentOSのイメージを対象にしました。

また、あるある?なのかわかりませんが、

転職やらで新しい会社に入社したときとかに、よく社内のネットワークの都合でプロキシサーバー(Proxy)が配置されているかと思います。

私自身、あまりWindowsでプロキシサーバーを経由した仮想環境の構築する機会がなかったので、 記事にして残しておこうと思います。

各ツールの解説がこの記事では割愛させて頂きます!(過去記事に説明している記事もありますので!)

では、さっそく!!

※ 前提: Windows10

VirtualBox

まず、VirtualBoxをインストールします。

公式ページからダウンロードします。

Downloads – Oracle VM VirtualBox

公式ページでは、最新のヴァージョンがダウンロードできます。

が、後でインストールするVagrantとのヴァージョンの関係でうまく機能しない場合があります。

No usable default provider could be found for your system.

Vagrant relies on interactions with 3rd party systems, known as
"providers", to provide Vagrant with resources to run development
environments. Examples are VirtualBox, VMware, Hyper-V.

・・・・・略

あとでダウングレードするのも手間なので、ヴァージョンの確認or少し前のヴァージョンをインストールしてもいいかもしれません。

過去のヴァージョンは以下から。

Download_Old_Builds – Oracle VM VirtualBox

手順に沿ってダウンロードすればOK。

Vagrant

続いて、Vagarantをインストールします。

Vagrantも公式から

Download - Vagrant by HashiCorp

手順に沿ってインストールすれば問題ありません。

CentOS

続いては、仮想環境となるOSのイメージになるファイルを選択します。

Vagrantをインストールしているので、直接サイトにいってダウンロードする必要はありませんが、 VirtualBoxでポチポチして進めたい場合は、以下を参考にしてください!

ポチポチしない場合は、この項目↓は読み飛ばして大丈夫です。

この記事では、CentOS 7系を選択します。

今回はboxファイルをダウンロードしてみます。

なので、拡張子が .box のものをダウンロードしてください。

A list of base boxes for Vagrant - Vagrantbox.es

また、他の拡張子だと以下から確認できます。

virtualbox centos インストール などでググればたくさん出てきますので、CentOSの細かいヴァージョンなど指定がある場合は調査してみてください。

CentOSの公式ページは以下です。 ( CentOS Linux DVD ISO の方を選択して、ダウンロードへ )

Download CentOS

ここでは、以下のURLから過去のヴァージョンを確認&ダウンロードできます。

http://archive.kernel.org/centos-vault/

# パスの例
http://archive.kernel.org/centos-vault/7.6.1810/isos/x86_64/

コマンドプロンプトで作業

Boxの追加

コマンドプロンプトを開きます。

以下を実行して、boxを登録します。 <name> は任意の名前で大丈夫です。わかりやすい名前をつけると後で楽です笑

# 基本
> vagrant box add <name> <box_file_url>

# 例
> vagrant box add centos7.0 https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box

以下から対象ヴァージョンのURLを確認。 A list of base boxes for Vagrant - Vagrantbox.es

少し時間がかかるかもしれません。

できるだけネットワーク環境の良いところで実行することをオススメします!

Boxの確認

正常にインストールできれば、以下のコマンドで確認できます。

> vagrant box list

centos7.0 (virtualbox, 0)

Vagrantfileの作成

Vagrantfileというファイルを作成します。

仮想環境の設定を記述するために必要なので、必ず以下を実行します。

# 基本
> vagrant init <name>

# 例
> vagrant init centos7.0

Vagrantfileの編集

ここでは必要最低限の編集のみです。

# Create a private network, which allows host-only access to the machine
# using a specific IP.
config.vm.network "private_network", ip: "192.168.XX.XX"        ## ← ここをアンコメント

・・・・略

# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
config.vm.provider "virtualbox" do |vb|                                 ## ← ここをアンコメント
#   # Display the VirtualBox GUI when booting the machine
#   vb.gui = true
#
#   # Customize the amount of memory on the VM:
#   vb.memory = "1024"
     vb.customize ["modifyvm", :id, "--memory", "2048"]         ## ← ここを追記
end                                                                                          ## ← ここをアンコメント
#
# View the documentation for the provider you are using for more
# information on available options.

config.vm.network "private_network" のIPですが、ホスト(Windows)から確認できるIPを指定します。

このIPはWindowsコマンドプロンプトで、確認することができます。

> ipconfig

イーサネット アダプター VirtualBox Host-Only Network #3:

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: fe80::xxxx:f1ed:xxxx:4bxx%53
   IPv4 アドレス . . . . . . . . . . . .: 192.168.25.1                    ## ← これに値する
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .:

仮想環境の立ち上げ

ここでもvagrantのコマンドで仮想環境をたちあげます。

> vagrant up

このとき、ERRORなどの単語に注意してください。 ここではエラー対処の方法は説明しません。

RLoginで接続

使い慣れたエミュレータがいいと思いますが、なんとなくRLoginを使ってみたいと思います。笑

WindowsにはコマンドプロンプトやWSLなどありますが、あまり詳しくないのでここでは無視させてください笑

rlogin/telnet/ssh(クライアント)ターミナルソフト

詳しい使い方はググってみてください!

ファイル→ サーバーに接続→

ログイン名 / パスワードorパスフレーズは、vagrantを指定。

ホスト名は、Vagrantfileで指定したprivate_networkのIPを入力。

上記を入力して、SSHで接続します。(vagrant upしたあとで)

色々確認

無事にCentOSに接続できたら、外に(インターネット)接続できるか確認したりします。

冒頭で述べたように、会社のプロキシサーバーなどで、かんたんにインターネットに接続できない場合があります。

そうなると何かツールをダウンロードしたり、yumがアップデートできなかったりして、そもそも仮想環境の意味がなくなってしまいます。。。笑

ここでは、非常に最低限なプロキシサーバーを経由した設定をちょっと紹介できたらと思います。

イメージ的にはこんな↓

f:id:o21o21:20200117153900p:plain

適当な図で申し訳ないですが、、

では、CentOSないでの確認です。

CentOS6系と7系でコマンドなどに違いがあります!ご注意ください!

言語設定

# 言語設定確認
$ localectl 

# 日本語に設定
$ localectl set-locale LANG=ja_JP.utf8

# 英語に設定
$ localectl set-locale LANG=en_US.UTF-8

ログイン後、反映されます。

ping / curl

pingcurlで外に出られるのか確認してみます。

$ ping www.yahoo.co.jp
$ ping www.google.co.jp

$ curl <your_proxy>

意外と重要です!笑

なにか設定を変更してしまう前に、単純な方法でどこまで到達できるのか確認してみるのもありです!

NetworkManagerとNetwork Initscript

CentOSでは、nmtuinmcliというコマンドを使用して、NetworkManagerを操ります。

nmtuiはメニュー方式で簡易で操作、nmcliはコマンド形式で ネットワーク設定ができるようになっているようです。

NetworkManagerとは、ネットワークを動的に設定できるサービスです。

RHEL6とRHEL7でネットワークの管理方法が変わってきているようでした。(知るの今更感…)

ここではnmtuiコマンドを詳しく説明はしませんが、CentOS6と7系とで、大きく変わったコマンドがあります。

service(CentOS6)systemctl(CentOS7)です。

主になにかのサービス(ツール)を起動させたり、停止させたりするのに多様されています。

# 6系: 例
$ service httpd start

# 7系: 例
$ systemctl start httpd

これは覚えておくといいでしょう!

ググっていて、あれ?このコマンド使えないじゃん!とか、 この人の環境は6系か!など環境の記載がない場合などに気づきます笑

ちょっとNetworkManagerからそれてしまいましたが、CentOSでは6からNetworkManagerがネットワークの設定サービスとして採用されています。

ググってみると、NetworkManagerの停止 などが多く記事でありますが、まず無用に停止させないで状態を確認してみましょう。

$ systemctl status network

network.service - LSB: Bring up/down networking
   Loaded: loaded (/etc/rc.d/init.d/network)
   Active: active (exited) since 月 20XX-01-01 12:12:45 JST; 4h 47min ago

$ systemctl status NetworkManager

NetworkManager.service - Network Manager
   Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled)
   Active: active (running) since 月 20XX-01-01 1212:45 JST; 4h 47min ago
 Main PID: 4245 (NetworkManager)
   CGroup: /system.slice/NetworkManager.service
           ├─4245 /usr/sbin/NetworkManager --no-daemon
           └─4262 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-enp0s3.pid -lf /var/lib/NetworkManager/d...

以下を参考にして、まずどのようなネットワークを構成させればいいのか考慮します。

access.redhat.com

yum.conf

わたしの場合、デフォルトではyumコマンドが機能しませんでした。

なので、/etc/yum.confに以下を追記します。

[main]
proxy=http://<your_proxy:port>

こうすることで、yumが機能するかもしれません。

その他

VirtualBoxの設定にも、あらかじめプロキシー設定のメニューが用意されています。

ファイル→ 環境設定→ プロキシー→ 手動プロキシー設定

また、上記のメニューで、ホストのプロキシー設定を自動検出というものもあります。

ホストはここでいうWindowsになるので、Windows環境変数に設定しておくのもありかもしれません。(ちょっとこの自動検出がどこまでなのか調べていないので、なんとも言えません、、、)

コマンドプロンプト環境変数を確認してみましょう。

> set
略・・・
HTTPS_PROXY=http://<your_proxy>
HTTP_PROXY=http://<your_proxy>
略・・・

まとめ

かなりざっくりしたかんじになりましたが、とりあえず状態を先に確認してみることが重要です。

むやみに調べたコマンドを実行し、なにが変更されたのかわからない状態は避けていきたいですね。ネットワークなので、そもそもインターネットに接続できなければ、仮想環境を構築した意味もなくなってしまいます。

ヴァージョンやコマンド、ファイルの情報を調べて少しずつ進めていけたらOKです^ ^

以上.

#2 【アルゴリズム】頭の体操! 0やロジカルシンキングについて再入門

#2 のテーマは、頭の体操です笑

と、いっても数学の領域全体ですと、扱いきれないほど覚えることがあるので、

ここでは、エンジニアとして重要な考え方などを取り扱っていきます。

実用的な数学を解説するというよりか、考え方寄りのお話になってくると思います。

実践的な数学は、各アルゴリズムをみていくときに一緒に解説できたらと思っています。

なので、それまでに頭を柔らかくするためのものか〜くらいに思って頂けると嬉しいです!

※数学得意!って方向けではありませんのでご了承のほど。 

参考にするのは、こちらの本。

プログラマの数学第2版

また、このブログのシリーズの目次は以下。

o21o21.hatenablog.jp

前提

この記事でいう数学の体操とは、

プログラマ、エンジニアには数学が必要か?」とか

加減乗除は前提で、線形代数微分積分などが必要」とか

そういったことではありません。

どちらかというと、こういう見方で数字をみてみよう!みたいなノリです。

説明に不足してしまう部分もありますが、ご了承のほどよろしくお願い致します!

ロジカルシンキング

嫌というほど見聞きするであろう、ロジカルシンキング(論理的思考/論理思考)

「筋道が立っている、筋が通っている考え方」

主にこういうふうに理解されているはずです。

わたしは、小さい頃から「なんで?なんで?」と両親に言い過ぎて叱られた記憶しかないですw

疑問を持って、ある問題から分岐した問題をさらに深堀りしていき、道筋を追い、適切な根拠付けを行うことは重要です。

また、数学的/エンジニア的な側面でどのように活かすのか考えてみます。

MECE

数学の問題(数学でなくともなにかの問題でも可)、出題された問題では、まず問題を理解することが重要です。

すなわち、述べられている事実を正確に読み解くことが重要だと思います。

問題を考えているうちに、余計なことを考えてしまうと、解決に至るまでの時間が長くなってしまったりします。

なので、正確に問題を表現する手法として、MECE(Mutually Exclusive and Collectively Exhaustive)という考え方が存在します。(ミースと読むらしい)

難しい単語が出てきましが、まったく難しくありません。むしろ日頃からやっているかもしれません。

要は、"重複なく・漏れなく" という意味です。

言葉だとイメージがわかないので、コードで例をみてみます。

age = 20

if age >= 20:
    print('OK, U can drink!!')
else:
    print('Sorry, U can not drink...')

これを実行すると、"OK, U can drink!!'"と出力されます。

なんてことないですね!20歳以上になれば、お酒飲めますよーって単純なことです。

こんな単純な例ですが、ここで考えたいのでは、重複漏れになります。

人間の年齢というのは、19歳と20歳同時になっている瞬間というのはありません(= 1人の人間は年齢の重複はない)。

これは年齢単位でグルーピングしていることになります。

しかし、この例は日本に限る話であり、世界の国々では飲酒できる年齢は様々です。

例えば、アメリカでは飲酒できる年齢は、州ごとに違います。また、ブラジルでは18歳からの飲酒がOKです。

一旦、表にしてみます。

country 飲酒できる年齢
日本 20歳以上
アメリ 州によって異なる
ブラジル 18歳以上

2つ国が増えたことで、先程のコードは適用できなくなりますね。

集合を使う?

例えば、先程のコードで、修正するとしたらifand 条件をたす方法もあるかもしれませんね。

こんなかんじに。

if age >= 20 and country == 'Japan': 

あるときはこれでいいかもしれません。

でも、あるときはこれではバグを生む原因になりかねません。

ここで推したいのは、何回もいいますが、重複と漏れです。

例えば仕様の変更で、扱う国が増えたら大幅なコードの修正になるかもしれません。

また、条件が足された場合も、考慮する点が増えてきます。

なので、まず落ち着いて関係性を表現してみます。

どういう風に表現するかというと、集合(ベン図)です。

学生のときに散々みた、これです。(この図は、例を表してはいません。)

f:id:o21o21:20190918165929p:plain:w400

ちょっと手間かもしれませんが、このベン図を利用して考え方を固めていきます。

ちょっと例を参考に問題っぽいのを。

とあるエンジニア100人に飲酒・喫煙アンケートをとりました。
日本人のエンジニアで喫煙は10人、飲酒は20人。
アメリカ人のエンジニアで喫煙は7人、飲酒は30人。
また、両方と答えたのは、日本人は4人、アメリカ人は2人。
両方しないのは、何人でしょうか?

色々と数字が出てきましが、ベン図にしてみればシンプルに。

ちょっとみにくいですが、、

f:id:o21o21:20190918174322p:plain:w400

ここで以下のような式がたてられますね!

日本人: (10 + 20) - 4

アメリカ人: (7 + 30) - 2

26 + 35 + x = 100
26 + 35 -100  = x
61 = x
x = 61

一気に集合の話になってしましましたが、

個々の関係を(排他的(Exclusive)に)確認するということが大事です。

進法

ちょっとテーマを変えます。

コンピュータでは、基本的に2進数が使われています。

2進数は、01で表現されています。

人間が主に使用しているのは、10進数ですね。

進数(進法)について詳しく知りたい方は、以下の過去記事にて参考にしてみてください!

o21o21.hatenablog.jp

どうして進数について記述するのかというと、0(ゼロ)の認識について簡単に説明したいからです。

0とは?

私自身、改めて0に対しての気づきがありましたので、是非ここでその気付きを記述したいと思います。

※ この本(プログラマの数学第2版)を参考にしています。

エンジニアとして0は特に馴染みのある数字だと思います。

0からはじまるのが当たり前ですよね。

また、日常的に0は何もないことを表現するのに使いますね。

間違ってはいませんし、これからもそうだと思います。

ですが、少し見方を変えてみようと思います。

102

これは10の2乗ですね。(累乗an)

102 = 100 ですね。

では、これはどうでしょう?

100

101は、10です。

指数が0の場合は?

学校で累乗を習う場合、10をn回掛けたのが答えという風に考えるかもしれません。

間違ってはいませんが、指数が0や-1となった場合、少々シンプルに物事が考えられないかもしれません。

先に答えを。

100 = 1 となります。

どういう風に考えるかというと、

1/10(10分の1)ずつ増減する」ということです。

指数が-1でも、10-1 = 1/10と即答えを見つけ出すことが可能です。

場所を確保する

さて、0の話をしているのに累乗や進法の話になりました。

意味のない話ではありません。

10進数で、1051という数字があったとします。

百の位は0です。百に位はないと表現していますが、実はこれ

「千の位が落ちてこないように支えている」という認識にしてみましょう。

0が"ない"という意味であれば、1051ではなく、151と表してもいいことになってしまいます。

つまり、「0は、場所を確保している」という見方をしてみてください。

もう少しイメージをエンジニアらしく掘り下げていきます。

(例えが下手で申し訳ないです、、、笑)

お酒を飲むのが大好きな人がいたとします。

でも、毎日飲んでいては健康に悪いので、5日に1回は休肝日を設けるようにお医者さんに言われてしまいました。

5日に1回のサイクルを繰り返しているのは、お酒好きには大変です。

なので、奥さんがノンアルビールを用意したのです。

これで、5日1回を気にせず、毎日飲むというシンプルなルールになりました。

(ノンアルビールはビールと違う!というのはさておきw)

つまりは、パターンのシンプル化を行えるということに着目して下さい!笑

0は、ノンアルビール同様、あるパターンをシンプル化する要素を持ち合わせているんだって頭の片隅に覚えておけばいいでしょう。

まとめ

簡単にはなってしまいますが、少し頭の体操になれば幸いです。

まだ、定性的なお話が多いですが、次回は #1 であげたアルゴリズムの中から1つだけ例にとってコード化してみたいと思います。

わたし自身もまだまだ勉強不足、、勉強しながらということで、シリーズに前後あるかもしれませんが、ご了承願いますm( )m

以上

o21o21.hatenablog.jp

前回の記事

o21o21.hatenablog.jp

#1【アルゴリズム】入門 モチベーションを上げていく!

さて、さっそく初回の記事になります。

この記事は、#1として、具体的なアルゴリズムを見る前の心構えなんかを記述していきます。

普段の開発からアルゴリズムを意識できるようにしたい。。。

そして、プレッシャーがかかった時に(最近ちょっと悔しい思いをしまして...)、

できるだけ頭を整理しながらコードを組み立てられるような思考なんかも合わせて勉強したいと思います。

なにごとも基礎を大事にということで笑

ちょっと今回は定性的なことが多い初回の記事かもしれませんが、よろしくお願い致します!

アルゴリズム (algorithm) とは?

いきなり引用ですが、アルゴリズムとは、

数学、コンピューティング、言語学、あるいは関連する分野において、問題を解くための手順を定式化した形で表現したものを言う。算法と訳されることもある。引用: アルゴリズム - Wikipedia

当たり前ですが、アルゴリズムはプログラミングの領域のみではなく、いろんな領域で用いられてるようです。

アルゴリズムは、問題を効率的根拠を持って解決をするための手段といえるでしょう。

ちなみに、アルゴリズム(algorithm)という語は、9世紀イラクの数学者アル=フワーリズミーからきていると言われています。

フワーリズミー - Wikipedia

人の名前が由来だったんだ...!!!!

アルゴリズムを活かす

私としては、とくに効率的というところに着目したいです。

エンジニアとしては、効率性が重視されると思います。

コードの高速化や何かの構成のシンプル化(= 効率的且つ冗長化されたときも効率的になるのか)など、活かせる場面は多々あります。

(ほとんどの)アルゴリズムは、コンピュータプログラムとして実装されることを意図しているそうです。

たしかにそれは納得できます。いろんな機器にせよ、専門的な分野のツールにせよ、プログラムが動いていますよね。そこで、アルゴリズムが使用され、より効率的に処理したりするわけです。

DVDの再生にせよ、ストリーミング再生にせよ、電車乗り換えアプリにせよ、ありとあらゆるところにアルゴリズムは存在しています。

多くの記事で、「アルゴリズムは、計算法!」みたいに記述されていますが、現代におけるアルゴリズムの厳密な定義としては、

【計算可能なもの】を計算する手続き

と、されている。

なんだか、こっちのほうがしっくりきます。仮に一時的に計算不可能?なものがあるとして、これを解こうとして、アルゴリズムを駆使する。って考えるとなんだか計算方法というよりか、手段であると納得します。

と、まあここらへんにして、アルゴリズムは一体どれだけの種類があるのでしょうか?

アルゴリズムの種類

パッと調べてみると、Wikipediaのこんなページを見つけました。

List of algorithms - Wikipedia

ものすごい沢山ありますねw

でも、安心してください。全部覚える必要はありません笑

ググって出てくる主要なアルゴリズムがあるので、それを優先して勉強していけば良さそうです。

ですが、もう少し調べてみることにします。

米メディア、mediumのTop algorithmの記事がありました。

medium.com

ちょっと英語なので、アルゴリズムの名前が日本語とで呼び方が違うかもしれませんが、見慣れているアルゴリズムが多いでしょう。

主要なアルゴリズムは、次回以降の記事でおっていけたらと思います!

この記事をみると、Top Data Structures(データ構造)という項目もあります。

データ構造とはなんでしょうか?

Data Structure (データ構造)

データ構造は、データを効率よく扱うため、システマナイズ(あるパターンを持たせた)し格納する形式のことです。

配列やリストもこの1種になります。

わたしの経験から、このデータ構造は非常に重要だと思います。笑

大規模なシステムになると、長期的にみて、バグや冗長化困難なリスクを抱えたりします。

運用からジョインした人は、構造が悪ければ修正するべきですし、新規開発ではよく考慮して開発すべきだと思います。

データ構造の決定は、使用するアルゴリズムを決めたり、

または、アルゴリズムが決まれば、データ構造を定めることもできますね。

データ構造はアルゴリズムにも密接に関係してきますので、こちらも基本的なデータ構造もこのシリーズでおっていけたらと思います。

  • 配列
  • スタック - LIFO(Last In First Out)
  • キュー - FIFO(First In First Out)
  • 連想配列
  • ハッシュテーブル
  • ルックアップテーブル
  • 線形リスト
  • 木構造
  • グラフ

引用: データ構造 - Wikipedia

アルゴリズムを勉強するモチベーション

これに関しては、アルゴリズムを学ぶのが好き!って人は読み飛ばしてください笑

アルゴリズムを学ぶにあたり、いろんな書籍や記事がありますが、

外部ライブラリを使用していたりして肝心な根本のロジックがわからない!とかよくあると思います。

また、○○やりたいのに前提となる数学の知識がけっこう必要...、そもそも数学が苦手…などなど、少し抵抗感がある人もいるかもしれません。

ですが、まずアルゴリズムを学ぶ上で、学ぶことによって得られるスキルを思い浮かべてみます。

1点目、日頃のタスクの改善に繋がるかも!

日頃、四苦八苦していたコードがあったとして、改善する策が増えることでタスクをこなす時間短縮できるかもしれません。

空いた時間で、さらに違う技術を勉強できるかも!

2点目、自作ライブラリ?笑

今まで普通に使用していた便利なライブラリがあるとして、そのライブラリを理解し、

拡張、または、自分で自作できるようになるかもしれません。

3点目、○○の視点がかわるかも?笑

いつもなんとなーく見ていた何かに気づきがあるかもしれません。笑

実はこれ、こういうパターンで成り立っているんだ!とかとか。

わたしは勉強をはじめて、数時間ほどでに関しての考え方が少し変わりました!

アルゴリズムを学ぶことでってわけでもないですが、上記のようなことを想像して少しずつ勉強できたらいいと思います。

では、最後に少し準備していくことを簡単に!

準備&参考にしていくもの

o21o21.hatenablog.jp

こちらの過去記事から、進数の項目を参考にします。

書籍

プログラマの数学第2版

珠玉のプログラミング 本質を見抜いたアルゴリズムとデータ構造

サイト

docs.python.org

pep8-ja.readthedocs.io

Github

GitHub - TheAlgorithms/Python: All Algorithms implemented in Python

では、初回はこれくらいにして、次回の記事のテーマは数学の体操にしようかと思います!笑

以上.

【アルゴリズム】 〜目次〜 のんびり学ぶ!!

※ この記事は、シリーズものとして扱いたいため、目次記事になります。

随時更新していく予定ですので、こちらをブクマして頂けるようであれば、便利に観覧できかと思います。

アルゴリズム 入門!(のんびり)

エンジニアとして、無視できないアルゴリズム。 

このシリーズでは、#1〜順に、

アルゴリズムとは?」「どうして学んだほうがいい?」「難しいから勉強が続かない...」などなど

勉強していく上でのモチベーションの持ち方や具体的なアルゴリズムについてものんびり勉強していこうと思います。

せっかく勉強していくので、続かないと意味がありません。

また、実際にコードが書けないと意味がありません 。

最近では、Pythonのnumpyなど便利なライブラリがありますが、ここではできるだけ外部ライブラリは使用せず、標準で用意されているライブラリを使用して、できるだけ生の状態でコードを記述できたらいいと思います。

なので、のんびりをテーマに、少し時間がかかっても学べるように(というか私が楽しさを見出しながら笑)できるだけ理解しやすいようにかければいいと思っています。

私も勉強しながらなので、記事投稿後も部分的に修正が入ってしまうことや、シリーズの前後があるかもしれませんが、ご了承くださいm( )m

また、プログラミング言語は、Pythonを選択します。

目次

以上.

【AWS】2019年8月23日の障害についてメモ

今回AWSの障害についてです。

ついこの前、AWSの東京リージョン(AP-NORTHEAST-1)で大きな障害が発生しました。

なので、

さくっと、メモ程度にAWSの障害が起こった際の対応やチェックしたいサイトなどを残していきます。

今回の障害について

今回は、東京リージョン(AP-NORTHEAST-1)で大規模な障害が発生しました。

(マネージャーさん曰く1年に1回あるかないかくらいの規模だったらしい)

私は仕事中で、ちょうどお昼くらいだったでしょうか。

12:30頃

たぶん12時半ころに、1台のインスタンスのアラートが発生しました。

そして、5分以内くらいに2、3台のインスタンスが次々とアラートを起こし、監視ツールはお祭り騒ぎ。笑

13:30〜15時頃

13時を過ぎても、次々とインスタンスがおちていき、AWSコンソールのEC2一覧のステータスチェックは合格しない状況。

インスタンスの状態は、runningだったのですが、ほとんどのインスタンスがステータスが安定しない時間が数時間に渡って続きました。

また、SSH接続は可能なのですが、インスタンスにのっているアプリが安定せず、コマンドが通らない状況でした。

すべてのインスタンスが不安定だったわけでなく、発生から2時間くらい経った時に、あるAZの障害なのではないか?とパターンがだんだん推測できるようになりました。

〜17時頃

色々と不安定なインスタンスをみてみると、AZ ID: apne1-az4の領域にあるインスタンスが不安定なようでした。

以下、サーバーワークスさんもお知らせ欄でほぼリアルタイムで障害について調査しているようでした。

さすが、障害発生中のときでも随時情報が追記されていってました。

AWSの公式からは、ほぼ報告がなかったので、非常に有益な情報といえるでしょう!(また、今は障害時のまとまったスライドも展開されているので、資料になります。)

www.serverworks.co.jp

不安定なインスタンスを停止-> 開始のフローで強制的に再起動させてみても、なかにはステータスチェックに何回も合格せず放浪しているインスタンスが多かったです。

なんやかんやで、AWSに依存しすぎていてほぼ手を動かすことがなくってしまった時間もありました。

また、サーバーの監視ツールももちろんインスタンスにのっています。

これはマルチAZで対応しなければならないと学びました。

AWS公式からの報告は、以下の2つをサイトでチェックすることが可能です。

障害発生時、非常に更新が遅いので、Twitterなどで少し情報を取得することをオススメします!笑

もちろんあくまで参考程度にしかできませんが、どんなサービスが影響を受けているのか、知る手段の1つだと思います。

また、障害発生中にAWSのサポートに復旧時間(見込み)を質問しました。

ものの15〜30分くらいで回答は返ってきましたが、回答内容はほぼステータスサイトと同様でした。

で、結局原因は?

原因は、公式からの以下がまとまっているので参考にしてみてください。

aws.amazon.com

簡単にいうと、単一のアベイラビリティゾーンで、オーバーヒート ですね。

冷却装置がこわれて温度が上昇し、サーバーのパフォーマンスが一気に低下したようです。

なんというか、しょうがないとしか言えないよな事象...

EC2も影響を受けましたが、EBSも影響をうけました。

23日の夜(24日の朝方)にスナップショットを取得する処理も、なんか不安定で、取得に失敗したスナップショットがありました。

かるくまとめ

AWSといえど、こういった障害はつきものですね。笑

いつも便利で使用させもらっているので、わたしはまあ、AWSの人も大変だろうに、くらいしか思いませんでした。笑

今回はマルチAZなどで対策したり、リージョン単位での対策も一部必要なのだと実感できた障害となりました。

以上.