helloworlds

not a noun, it's a verb

#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などで対策したり、リージョン単位での対策も一部必要なのだと実感できた障害となりました。

以上.

【LXD】爆速でLXD環境を構築する!!

LXDとは?

コンテナと言えばDockerが有名ですが、LXDというシステムコンテナマネージャーもあります。

イメージとしては、仮想マシンと認識していれば大丈夫でしょう。 LXDを使用すれば、多数のKinuxディストリビューションを使用し、容易に開発環境が構築できます。

無料で利用できることや、起動が高速なこと、Dockerを利用する際の1コンテナ1プロセスといったベストプラクティスはないのが特徴でしょうか。

ググってみると、"LXC"という単語もヒットしますが、これはLXDの機能強化前のものです。 なので、LXDでできることはLXCでも実現可能です。

使ってみる

ここでは、とりあえず早くローカル環境にLXDを構築し、試しにCentOSのコンテナをたててみることを目的としています。

(※ VirtualBoxなどのインストール方法は割愛していきます。)

わたしの環境は、macOSです。

用意する

VirtualBox

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

Downloads – Oracle VM VirtualBox

vagrant

vagrantもインストールしておきます。

Download - Vagrant by HashiCorp

Boxの追加

UbuntuのBoxをインストールします。

ubuntu - Vagrant Cloud

推奨されているのは、xenial64ですがお好きなメーカーのヴァージョンを選択します。

選択したらURLを控えましょう。控えたら、以下のように修正します。

https://vagrantcloud.com/ubuntu/boxes/<xenial64>/versions/<20170929.0.0>/providers/virtualbox.box
※ "<>"で囲んだ部分が任意のものに変わります。

任意のディレクトリに移動し、以下を実行します。 ボックスの追加には、時間がかかるかもしれません。

$ vagrant box add ubuntu/xenial64 https://vagrantcloud.com/ubuntu/boxes/xenial64/versions/20170929.0.0/providers/virtualbox.box
$ vagrant init ubuntu/xenia164
※ ボックスの名前など、コマンドのオプションで指定可能


# vagrantコマンドで、ubuntuを起動
$ vagrant up

VagrantFIleが作成されていて、エラーが出ていなければ順調です。

LXDのインストール

Ubuntuに入って、lxdをsnapを使用してインストールします。

$ vagrnat ssh


## 以下、Ubuntuでの実行


# 最新にアップデート
$ sudo apt update


# インストール
$ sudo su - 
$ snap install lxd


# vagrantユーザーでもlxcコマンドが使用できるようにする(任意)
$ sudo gpasswd -a vagrant lxd 
$ id                     ## 確認
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant),110(lxd) 

LXDが動くか確認

なにも起動させていないので、空の表だけでればOK。

# コンテナ&イメージ確認
$ lxc list
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |


$ lxc image list
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE |

LXDの初期設定

コンテナの起動の前に、設定をしてきます。 ここでは、細かい設定方法は省きます。

ただし、IPv6の設定のみnoを選択し、他はデフォルトを選択していきます。

# vagrantユーザーに戻っても、rootで実行しても大丈夫ですが、
# ここでは、vagrantユーザーで実行

# 途中の設定項目で、UIが変わって紫色の画面に移行しますが、表示されたIPなどをEnterで選択していきます。
$ sudo lxd init


LXD has been successfully configured.   ##  これが出たら完了

CentOSのコンテナをたてる

# リモートから取得できるイメージを確認
$ lxc image alias list images: | grep centos
| centos/6                            | 8b47ce0dd288 |                       |
| centos/6/amd64                      | 8b47ce0dd288 |               |
| centos/6/default                    | 8b47ce0dd288 |                 |
| centos/6/default/amd64              | 8b47ce0dd288 |         |
| centos/6/default/i386               | 4fc4ed167966 |             |
| centos/6/i386                       | 4fc4ed167966 |                   |
| centos/7                            | ef750fe8dd4c |                         |
| centos/7/amd64                      | ef750fe8dd4c |                 |
| centos/7/arm64                      | 2418b61d1c47 |               |
| centos/7/armhf                      | 4112b64d31c2 |                 |
| centos/7/default                    | ef750fe8dd4c |                    |
| centos/7/default/amd64              | ef750fe8dd4c |            |
| centos/7/default/arm64              | 2418b61d1c47 |          |
| centos/7/default/armhf              | 4112b64d31c2 |           |
| centos/7/default/i386               | 22f770b50316 |           |
| centos/7/default/ppc64el            | 91279dabc143 |        |
| centos/7/i386                       | 22f770b50316 |                |
| centos/7/ppc64el                    | 91279dabc143 |             |




# コンテナを起動 (今回はcentos/7を選択してみました)
$ lxc launch images:centos/7 centos7
Creating centos7
Starting centos7


# 確認 (作成されていればOK)
$ lxc list

これで完了です。

まとめ

Dockerとは違うコンテナを触ってみました。

私は業務の開発環境としても使用しています。(※ コスト面にも良いです笑 )

例えばAWSサービスを利用して、最小のインスタンスを建ててVPCにてセキュアなネットワークを構築。

LXDをインストールし、欲しい環境をインストール。

リモートからのアクセスを確立し、みんなで開発!

なんてことも、容易ですしVPCまわりをやったことない人にとっては勉強にもなりますし、みんなに喜んでもらえる環境にもなりそう!しかも、安い!

Ubuntuに依存してしまうということを除けば、扱いも共有も便利です。

作成した環境のイメージをエクスポートしたりすることも可能です。また、ホスト(自身のラップトップ)から、LXDで管理している環境に直でSSHすることも可能です。

LXDはDockerのイメージもありますので、コンテナonコンテナも可能。

Dockerよりは有名ではありませんが、この記事でやった環境を1回整えてしまえば開発も楽ちんですね!!

以上.

【AWS】かなり気になる! PartiQLを触ってみた! (入門)

今回は、2019年8月にAWS公式から発表された、

PartiQL を触ってみようと思います!

個人的にかなり気になるクエリ言語ですので、簡単にチュートリアル的な部分を見ていきます!

それでは、まずは概要からみていきましょう!

※ この記事を書いた当初の情報のみ記載しております。後ほどのアプデなどで変更されている点を考慮し、読んでください。

PartiQLとは??

一言で言うと、

データを効率的に問い合わせ可能にするSQL互換の問い合わせ言語 (引用: 下記ブログより)

らしいですな。

これはもしや.....

そう、会社でよくあるデータ移行や、先人達が勝手に(勝手ではないか!w)導入してきたDBなりファイルサーバー、またはデータをまとめたCSVファイル達を容易に操作できるものなのでは?

クエリエンジンがPartiQLをサポートしていれば、リレーショナルデータベース(トランザクションとアナリティクスのどちらも)、オープンなデータフォーマットの半構造化データや入れ子形式のデータ(Amazon S3データレイクなど)、そしてNoSQLのスキーマレスなデータや行ごとに異なる属性を持つことを許容するドキュメントデータベースなども対象となります。(引用: 下記ブログより)

やっぱり!!!これは期待できそうですね!

以下、公式の発表されたブログになります。(英語)

aws.amazon.com

f:id:o21o21:20190816105725p:plain

(図引用: 上記ブログより)

リリースの経緯

けっこう便利そうなサービス。

どうしてリリースしたのでしょうか?

これも上記ブログより引用ですが、Amazonの社内ではすでに使用されてるとのこと。

すごい。。。

ってことは、やはりEC事業として、部署間でのデータの相互性が問題だったのだろうか?

ブログの"Why we built it"に記載がありました。

Chris Suver率いるAmazonの小売事業は、SQLに似たクエリ言語を追求していた。

既存のSQLの知識を活かすようなものを開発する必要があったと書いてあります。

つまり、AWSはこれまでRDBなどたくさんのDBに関するサービスはリリースしてきたが、より互換性を保つために、

ネストされたデータや半構造化されたデータを処理するのに必要な能力を備えながら、SQLに非常に近いままで使用できるクエリ言語を開発したのでしょう。

PartiQLAWS(Amazon)社内の問題解決のために開発されたツールといってもいいでしょう。

非常に感激してしまいます。さすが世界の頭脳集団があつまっている組織です。

では、発表された特徴を見てみましょう。

特徴

  • SQL compatibility (SQLの互換性)
  • First-class nested data (ネストされたデータに特化)
  • Optional schema and query stability (オプションのスキーマとクエリの安定性)
  • Minimal extensions (最小限の拡張)
  • Format independence (フォーマットの独立)
  • Data store independence (データストアの独立)

なんとなくイメージできますかね?

とりあえず触れてみるのは良さそうです!

さわってみる

とりあえず触ってみよう!ということで、チュートリアル的なものがGithubにて公開されています。

インストールして動かしてみるところまでが、この記事のゴールです。

わたしの環境は、macOSです。 また、JVMがインストールされている環境であることが前提になります。

え!最近mac買ってまだJavaインストールしてないわ!

あ!OracleJDK有償化で手順違うやんけ!なんかめんどくさ!

って方は、以下の記事を参考にしてみてください!!

o21o21.hatenablog.jp

こちらPartQLの公式サイトです。

PartiQL

インストール

こちらより、手動でもwgetでもいいので、ローカルに展開します。

github.com

wgetをインストールしてない場合は、 $ brew install wgetwgetをインストールしましょう。

$ wget https://github.com/partiql/partiql-lang-kotlin/releases/download/v0.1.0-alpha/partiql-cli-0.1.0.tgz
$ tar -zxvf partiql-cli-0.1.0.tgz

$ ll
README  
Tutorial   # pdfおよびhtml形式のチュートリアルが含まれています。サブフォルダーコードには、3種類のファイルが含まれる
bin          # macOSおよびUnixシステム用の起動スクリプトpartiqlおよびWindowsシステム用のpartiql.batが含まれる
lib           # PartiQLの実行に必要なすべてのJavaライブラリ

起動してみる

では、PartiQLを起動してみます。

$ ./bin/partiql
Welcome to the PartiQL REPL!

PartiQL>

こんなかんじで起動できたらOKです!

OK! (0 ms) って出てくるのは、クセでEnterを連打すると出てくるようです。

これは、Enterを2回連打でクエリが実行される仕様なのだそうです。

終了は、ctr + d です。

ちょっと試してみる

チュートリアルにもあるのですが、少しクエリを実行してみます。

  • SELECTしてみる
PartiQL> SELECT * FROM [1,2,3]
   | 
===' 
<<
  {
    '_1': 1
  },
  {
    '_1': 2
  },
  {
    '_1': 3
  }
>>
--- 
OK! (114 ms)
  • ファイルを読み込む( -e )

Tutorialディレクトリにサンプルファイルをあります。

それを読み込んで、環境変数!global_envにロードされているものを参照することが可能です。

$ ./bin/partiql -e Tutorial/code/q1.env

Welcome to the PartiQL REPL!
PartiQL> !global_env
   | 
===' 
{
  'hr': {
    'employees': <<
      {
        'id': 3,
        'name': 'Bob Smith',
        'title': NULL
      },
      {
        'id': 4,
        'name': 'Susan Smith',
        'title': 'Dev Mgr'
      },
      {
        'id': 6,
        'name': 'Jane Smith',
        'title': 'Software Eng 2'
      }
    >>
  }
}
--- 
OK! (12 ms)

少しこのサンプルファイル(q1.env)の内容をみてます。

{ 
    'hr': { 
        'employees': <<
            -- a tuple is denoted by { ... } in the PartiQL data model
            { 'id': 3, 'name': 'Bob Smith',   'title': null }, 
            { 'id': 4, 'name': 'Susan Smith', 'title': 'Dev Mgr' },
            { 'id': 6, 'name': 'Jane Smith',  'title': 'Software Eng 2'}
        >>
    }
} 
  • このようなJSON形式のデータの場合、hr.employeesのようにしてテーブルとして扱いが可
  • --でコメントを記述
  • <<>>は、データが順不同のコレクション(バッグ)。コレクション=配列のようなイメージ(タブル間の順序はなし)
  • PartiQLリテラルは単一引用符で囲まれていますが、JSONリテラルは二重引用符で囲まれる
  • ↑ PartiQL( 'employees': <<..... )とJSON( "employees": [... )

では、上記のサンプルデータを元に参照してみます。

PartiQL> SELECT e.id, 
   | e.name AS employeeName, 
   | e.title AS title
   | FROM hr.employees e
   | WHERE e.title = 'Dev Mgr'
   | 
===' 
<<
  {
    'id': 4,
    'employeeName': 'Susan Smith',
    'title': 'Dev Mgr'
  }
>>
--- 
OK! (6 ms)

すごい!

  • ジョイン
PartiQL> SELECT e.id AS id, 
   | e.name AS employeeName,
   | e.title AS title,
   | p.name AS projectName
   | FROM hr.employeesNest AS e LEFT JOIN e.projects AS p
   | 
===' 
<<
  {
    'id': 3,
    'employeeName': 'Bob Smith',
    'title': NULL,
    'projectName': 'AWS Redshift Spectrum querying'
  },
  {
    'id': 3,
    'employeeName': 'Bob Smith',
    'title': NULL,
    'projectName': 'AWS Redshift security'
  },
  {
    'id': 3,
    'employeeName': 'Bob Smith',
    'title': NULL,
    'projectName': 'AWS Aurora security'
  },
  {
    'id': 4,
    'employeeName': 'Susan Smith',
    'title': 'Dev Mgr'
  },
  {
    'id': 6,
    'employeeName': 'Jane Smith',
    'title': 'Software Eng 2',
    'projectName': 'AWS Redshift security'
  }
>>
--- 
OK! (65 ms)

同様にして、サブクエリもできました!

まとめ

PartiQLのチュートリアルを元にして触ってみました。

データもサンプルデータをもとにして簡単に用意して色々触ることができそうです。

今後利用可能なAWSサービスもどんどんできてくると思うので、覚えておいて損はなさそうです。

学習コストもそんな高くないと思うので、今後の情報もキャッチアップしていくと良さそうです!

以上.

【Java】OpenJDK(無償)をmacOSにインストールする

今回は短い記事(メモ)です。

macOSJava(JVM)をインストールするといった内容になります。

どうして今頃Javaのインストールなのか

今年2019年にはいって、OracleJDKが有償化されました。(個人開発目的は無償)

なので、 macOS java インストール のように検索すると、

OracleJDKのインストール手順はけっこう出てくるのですが、OpenJDK の手順が出てこないので(別に記事自体少なくはないです!)今回メモとして残します!

個人開発(デモ目的)は無償となっていますが、なんかOracleのライセンス適用ログイン画面に遷移したり面倒なので、一気にOpenJDKに移行ということで残します。

OpenJDKをインストール

OpenJDK は無償です!

以下の公式サイトで、任意のヴァージョンを選択します。 ここでは12を選択しています。

http://jdk.java.net/12/

展開

$ tar xvzf <ダウンロードしたtarファイル>

ファイルの移動

$ sudo mv <展開したファイル> /Library/Java/JavaVirtualMachines/

環境変数の設定

$ export JAVA_HOME=`/usr/libexec/java_home -v <選択したヴァージョン 例: 12>`

確認

$ java -version

openjdk version "12.0.2" 2019-07-16
OpenJDK Runtime Environment (build 12.0.2+10)
OpenJDK 64-Bit Server VM (build 12.0.2+10, mixed mode, sharing)

このようにヴァージョンの確認で、インストールしたヴァージョンがでてくれば完了です。

以上.

【ネットワーク】VPNについて簡単におさえる!!

今回はネットワーク系の記事になります。

主に VPN についてです。

IT業界にいなくとも、会社で1回は聞いたことがあったり、なにかは知らないけど利用はしている!なんて方は多いのではないでしょうか。

社外から社内へのネットワークにアクセスする際に利用している手段かもしれませんね。

合わせて、セキュアな通信を行うための手段についても簡単に書いていければと思います! (具体的な導入は除く)

VPNとは

VPN とは、「 Virtual Private Network 」を略したものです。

だいたいイメージはつくのではないでしょうか?

なんかプライベートとあるので、セキュリティ高めの通信方式かなんか?みたいな。

単純に言うと(wikipedia引用)、

インターネットに跨って、プライベートネットワークを拡張する技術、およびそのネットワークである。

f:id:o21o21:20190726120841p:plain

わたしはここで疑問に思ったことがあります。

「インターネットを経由するってことは、けっこう危ないんじゃね?」

単純のVPNときくとセキュリティ的に高めの印象を持ちますが、結局インターネットを経由するのであれば、怖い....

そこで、VPNには主に2種類の方法があるようです。

  • インターネットVPN
  • IP-VPN

インターネットVPNは、インターネット等のネットワークを利用したVPNのことです。

IP-VPNは、通信事業者などが提供している閉じられた(クローズド)ネットワークを介したVPNのことです。

これで少し疑問が解消されました。IP-VPNは第三者(拠点間以外)が提供している閉域網を利用して、よりセキュアな通信を可能にできそうです。

では、インターネットVPNの方はどんな接続方法があるのでしょうか?みていきます。

インターネットVPN

インターネットVPNには、2つの接続の仕方があるようです。

  • サイト間VPN
  • リモートアクセスVPN

サイト間VPNは、VPNを実装したルータ同士を接続する方法。

リモートアクセスVPNは、ラップトップやスマホなどの機器にインストールVPNにクライアントソフトを利用し拠点のLANに接続する方法。

なんとなくイメージできてきました。

例えば、本社から支社間の相互接続が必要な場合など、クライアントソフトウェアをインストールしないでネットワーク間をVPNゲートウェイを経由して接続するのが、サイト間VPN

VPNゲートウェイの役割として、送信トラフィックカプセル化する。また、暗号化も担当している。

そして、インターネットに構築してある(構築する必要がある)トンネルと呼ばれる仮想回路なるものを通過し、送信先VPNゲートウェイに送られる。

受け取り手であるVPNゲートウェイは、非カプセル化を行うことで、データが受け取れることになる。

では、リモートアクセスVPNの方はどうなるかというと、ユーザーはクライアントソフトのインストールが必要となる。

例えば、営業が社外からインターネット経由で社内のLANに安全にアクセスしたいときなどが考えられるでしょうか。近年では在宅勤務(リモートワーク)ではこちらの手段を使用している方が多いのではないかと思います。

このクライアントソフトは、トラフィックを送信する際、カプセル化/暗号化を行う。その後、送信先ネットワークの末端(エッジ)にあるVPNゲートウェイに送られることになる。

その先はサイト間VPNと同様に非カプセル化されターゲットに展開される。

ここで新たな用語がいくつか出てきましたが、トンネル(トンネリング)について、少し詳しくみていきます。

トンネル(のプロトコル)

トンネルは道路のトンネルみたいなものを想像しても良いかもしれません。

が、道路のトンネルと違うのは、ただ単に車を通過させるためでなく他に役割があるという点です。

※ ここではトンネルの構築方法は説明しません。

インターネット上にこのトンネルを構築する = 仮想的な経路を作成する

この経路作成するための素材として、プロトコルがあります。

トンネリングを行えるプロトコルには、PPTP,L2F,L2TP,IPsec,GREなどがあります。

ですが、この中で暗号化が可能なのがIPsecのみです。なので、IPsecでないプロトコルを使用した場合はIPsecを組み合わせて暗号化を実現する必要があるようです。

ここでよくググって出てくるのは(IPsecと対比して)、SSL-VPNです。

IPsecSSL-VPNどちらが良いの?という話があるが、ここでは以下の説明にとどめておく。

SSL-VPNは、OSI7階層モデル(○○層とかのやつ)のセッション層で実装される技術であるということ。

また、IPsecは、ネットワーク層で実装される技術。

この階層の相違は開発/運用しているアプリに影響を与えるということです。

つまり、HTTPやSMTP,FTPなどのアプリを変更することなくIPSecVPNを使用して利用することが可能であることがわかる。 IPSecネットワーク層で実装されるため、上位のアプリケーションプロトコルに依存しないよということですね。

どういった影響があるとか、そういった説明はここでは割愛させて頂きます。

このトンネルですが、脅威がトンネル内に侵入する可能性もゼロではありません

100%の安全を保証することはインターネット上を経由するため不可能ですが、安全にやり取りする方法があるので、それを駆使するのが無難なようです。暗号化や認証をすることでVPNは安全性を高めることがきます。

さて、ここまできたら大体VPNのイメージがわかったのではないでしょうか。

技術者としての具体的なVPNの構築方法は、クライアントソフトやAWSなどのクラウドサービスによって異なります。

そのネットワークや実現したいことに合わせて、随時使いやすいツール導入したり、アーキテクチャを考える必要がありそうですね。

この記事では詳しい導入手順は記述しませんが、OpenVPNというソフトの紹介をAWSサービスを関連付けて簡単にみていきたいと思います。

OpenVPN

OpenVPNは、MacOS, WindowsLinuxで利用できるオープンソースVPNソフトです。

GPLというライセンス形態で配布されていて、もちろん無料です。

GPL(General Public License)とは、オープンソース フリーソフトウェア用のライセンスの1つで、著作権表示を保持しなければならないといことと、このソフトを使用して損害があったとしても自己責任ですよ。それさえ守れば複製・改変・頒布はOKというライセンスルールです。

以下、公式ドキュメントになります。詳しいことはここを覗いてみましょう。

OpenVPNとは | OpenVPN.JP

このソフトとAWSサービスをセットでアーキテクチャを構築している組織も多いでしょう。

構築したいアーキテクチャは、それぞれ異なると思いますので、"ほんとに"簡単な流れのみ記述していきます。w

  1. OpenVPNをEC2などにインストール
  2. 認証局など、証明書の発行/設定を行う (参考: https://qiita.com/ohechi/items/7ed8a61194eb1dcca283 )
  3. OpenVPN自動起動を設定
  4. AWS-> VPC -> ルートテーブル/Security Groupなど設定
  5. クライアント側のOpenVPNを利用するための設定(OpenVPN GUIなどダウンロード)

ほんとにざっくりですが、主にポチポチで済む作業がほとんどですね。

また、macの場合はクライアントアプリとしてTunnelblickが良いと思います。

tunnelblick.net

.crt , .key , /usr/share/doc/openvpn-2.4.3/sample/sample-config-files/client.conf -> xxxxx.ovpn

このようなファイルは大切に、導入後もきちんと管理できるディレクトリに置いておきましょう。(クライアント側)

まとめ

簡単ですが、VPNについて書きました。

利用はしたことはあるけど、構築をする機会やあんまり勉強してないや!ってかんじでも

最低限ここまで抑えることができたら、あとは構築する組織のネットワークとの相性や使い方との相談です。笑

プログラミング言語のライブラリなどと比べて、そこまでたくさんのツールが用意されているわけではなさそうなので、1度覚えたらあとは応用です!

また、今回はサイト間VPNについては詳しく記述していません。

専用のルーターや回線をひくことになるので、情シスさんやインフラ屋さんは、通信事業者と相談することになるでしょう。

AWSを利用している組織は、

AWS Direct Connectなんかも関連して、概要だけでも知っておくのはありかもしれません。

aws.amazon.com

以上.

参考