KAROUSHI -Japanese Engineer Blog-

コボルドからドラゴンへ -Kobold to Dragon-

システムエンジニアのブログです。サイト名は「雑魚キャラからボスキャラへレベルアップしたい!」という思いを込めて命名しました。自分はやっとリザードマンになったくらいです。

IntelliJ IDEAのインストール手順

IntelliJ IDEAが最近注目を浴びていますね。有償版UltimateのPHPStromやWebStromが使いやすいとかなんとか。あとはGrails3をサポートしているのがIntelliJだけみたいですね。使ったことないですけど。
最近はSublimeTextやATOMを使っていたのですが、毎回同じものを入れているので正直最初から入ってた方が楽だなぁって思ったり。。。
やっぱ統合環境って一発インストールするだけである程度なんでもできるから楽ですよねー。
eclipseはUIが分かりづらいし重いし。。。というわけでIntelliJ IDEAをまずは入れてみました。こいつはJavaも対応しているし軽くて使いやすいならeclipseから移動しようかなぁと思ってます。
今回はまずはインストールまで紹介します。

目次

IntelliJ IDEAのダウンロード

まずはJetBrainsのサイトからIntelliJ IDEAをダウンロードしましょう。以下からアクセスして右上の[Download]を押してください。
IntelliJ IDEA: The Java IDE for Professional Developers by JetBrains
f:id:jainders:20170101223016j:plain

無償版と有償版が選べます。今回は無償版をダウンロードします。左のCommunityの[DOWNLOAD]を押しましょう。
f:id:jainders:20170101223018j:plain

以下画面でしばらく待つと自動的にダウンロードが始まるので、保存先を選んでダウンロードしてください。
f:id:jainders:20170101223020j:plain

IntelliJ IDEAのインストール

IntelliJ IDEAをダウンロードしたらexeを実行しましょう。すると以下画面になるので[Next]を押します。
f:id:jainders:20170101223536j:plain

インストール先の設定です。そのままで[Next]を押します。
f:id:jainders:20170101223538j:plain

デスクトップにショートカットを作成するかと、紐づける拡張子を選択します。またJREをまだインストールしてない場合は、JetBrainsのJREをインストールするか選択できます。
よく分からなければ以下のようにすればよいと思います。(32bitか64bitかは気にしたほうがいいですが。。。)
f:id:jainders:20170101223540j:plain

ここはそのままで[Next]を押しましょう。
f:id:jainders:20170101223541j:plain

インストールが始まるのでそのまま待ちます。
f:id:jainders:20170101223542j:plain

インストール完了画面です。そのままIntelliJ IDEAを起動する場合はチェックを入れて[Finish]を押しましょう。
f:id:jainders:20170101223543j:plain

IntelliJ IDEAの初回起動

初回起動時に表示され鵜画面です。IntelliJ IDEAの別バージョンをインストール済みの場合、以前の設定をインポートするか聞かれますが、初めてインストールする場合は必要ないので下の方を選んで[OK]しましょう。
f:id:jainders:20170101223545j:plain

UIの色を選択します。好きな方をどうぞ。私は右の黒い色にしました。
f:id:jainders:20170101223546j:plain

インストールするツールを選択します。特に変更する必要はありません。人によってはSVNを使わないのでチェックを外したりなどはありますね。[Next Featured plugins]を押しましょう。
f:id:jainders:20170101223548j:plain

ここはそのままで[Start using IntelliJ IDEA]を押しましょう。(ぶっちゃけ何の設定か分かりません。中で使うエディタですかね。)
f:id:jainders:20170101223549j:plain

そのままで待ちましょう。

Ansibleでnginxを簡単インストール

前回Amazon LinuxにAnsibleをインストールしてpingを送信するところまでやりました。今回は続きですのでAnsibleをインストールしていない人はまずは前回のインストールから実施してください。
Amazon LinuxでAnsibleを簡単インストール~ping送信まで - KAROUSHI -Japanese Engineer Blog-

今回はAnsibleでNginxをインストールしてみようと思います。これができれば環境構築のたびにインストールコマンドを繰り返す必要がなくなります。

目次

Ansible実行ユーザの用意

実行ユーザの作成

まずはAnsibleでログインするためのユーザを作成しましょう。
ログインできれば何でもいいので、すでにログインユーザがある場合は読み替えてください。

$ sudo useradd ansible
$ sudo passwd ansible
Changing password for user ansible.
New password: <任意>(今回はpasswd)
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

BAD PASSWORDと怒られますが気にしない。

実行ユーザのsudo権限付与

sudo権限でyumなどを実行する必要があるため、権限を付与しましょう。
以下コマンドを実行して★の行を追記してください。

$ sudo visudo

----------ファイルの中身----------
# Defaults specification
Defaults:ansible !requiretty ★

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
ansible ALL=(ALL)       NOPASSWD:ALL ★

ユーザパスワードログインの許可

Amazon Linuxではデフォルトでユーザのパスワードログインができないようになっているので許可しておきましょう。
以下PasswordAuthenticationのnoをyesに変えましょう。設定を変更したらsshdを再起動するのを忘れずに。

$ sudo vim /etc/ssh/sshd_config 
PasswordAuthentication no
→PasswordAuthentication yes

$ sudo service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

ユーザログインの確認

最後にansibleでログインできることを確認しましょう。パスワードは先ほど作成した時に入力したものです。(今回はpasswd)

$ ssh ansible@localhost
ansible@localhost's password: 
$ exit

プレイブックでNginxをインストールする

インベントリファイルの作成

Ansibleでは接続先情報をインベントリファイルに記載します。
インベントリファイルに複数のサーバ情報を記述する際に便利な記載方法があるが今回は説明しません。
今回は自サーバに接続するのでlocalhostと先ほど作成したansibleユーザの情報です。

$ mkdir -p ~/samplebook
$ cd samplebook/
$ vi hosts.yml 

----------中身----------
[localhost]
localhost

[all:vars]
ansible_ssh_user=ansible
ansible_ssh_pass=passwd

プレイブックの作成

ようやくプレイブックの作成です。今回行っているのは以下です。

  1. yumでNginxのインストール
  2. Nginx起動と自動起動化(chkconfigに登録)
  3. Nginxの起動確認
$ vim main.yml 

----------中身----------
- hosts: all
  become: yes
  tasks:
  - name: Nginxインストール
    yum: name=nginx state=latest
  - name: Nginx起動
    service: name=nginx state=started enabled=yes
  - name: Nginxの起動確認
    shell: ps aux | grep nginx
    register: ps_result
    changed_when: false
  - debug: var=ps_result.stdout_lines
    when: ps_result | success

プレイブックの実行

これで準備完了です。作成したインベントリと、プレイブックを指定したAnsibleコマンドを実行し、Nginxをインストール&起動しましょう。

$ ansible-playbook -i hosts.yml main.yml 

PLAY [all] *********************************************************************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [nginxインストール] *************************************************************
ok: [localhost]

TASK [nginx起動] *****************************************************************
ok: [localhost]

TASK [nginxの起動確認] **************************************************************
ok: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "ps_result.stdout_lines": [
        "root      4374  0.0  0.0  58084  1016 ?        Ss   14:14   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf", 
        "nginx     4376  0.0  0.3  58456  3932 ?        S    14:14   0:00 nginx: worker process                   ", 
        "root      8086  0.0  0.2 113084  2776 pts/3    S+   16:21   0:00 /bin/sh -c ps aux | grep nginx", 
        "root      8088  0.0  0.1 110460  2020 pts/3    S+   16:21   0:00 grep nginx"
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=5    changed=0    unreachable=0    failed=0   

Nginxの画面確認

最後にhttp://へアクセスし、以下の画面が表示されれば正常にインストールして起動されています。
f:id:jainders:20170101012414j:plain

Amazon LinuxでAnsibleを簡単インストール~ping送信まで

今までLinux構築手順書を書いて、そこからコピー&ペーストして実行。。。というのを繰り返していました。それがChefやAnsibleなどの構成管理ツールの登場により従来のテキストエディタやエクセルで手順書を作成するというものから、構成管理ツールで手順を作成、実行。完成したらあとは配布すれば全く同じ環境ができるので楽です。
日本では多少歴史の長いChefが圧倒的シェアを誇っているようですが、使っている技術者に聞くとかなり学習コストが高いとのこと。どちらがよいか調べてみると後発のAnsibleがChefの悪いところが改善されてだいぶ使いやすくなり、学習コストも低いとこのことなので試しに使ってみました。
今回はAWS EC2のAmazon Linux上でAnsibleをインストールし、簡単なサンプルを動作させるところまで説明します。
これを読んでAnsibleに興味を持ってもったらぜひ現場で使いましょう!そして面倒で手間のかかる手順書作成やレビュー作業を止めて、作業時間を減らして少しでも早く帰りましょう!

目次

Ansibleをインストールする。

Amazon Linuxにはpipが初めから入っているのでそれでインストールします。
Amazon Linux以外の自前の環境でpipが入ってない場合は、easy_installでpipを入れてください。(え?easy_installも入ってないだって!?)

$ sudo pip install ansible

一応バージョンを確認してみると、2.2.0.0が入ってる模様。

$ ansible --version
ansible 2.2.0.0
  config file = 
  configured module search path = Default w/o overrides

ちゃんと応答が返ってきました。これでインストール完了です。
わーすっごい簡単!

localhostや他サーバへpingを打つ!

まずは初歩です。自分自身にpingを打ってみましょう。

$ ansible localhost -m ping
 [WARNING]: Host file not found: /etc/ansible/hosts

 [WARNING]: provided hosts list is empty, only localhost is available

localhost | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

WARNINGが出ていますが最初は気にしないでください。
今回はSUCCESSの文字が出ているのでlocalhost(自分自身)に対してpingが通っていることが分かります。

次はでたらめなIPに対してpingが通るか確認してみましょう。すると。。。

$ ansible 10.20.30.40 -m ping
 [WARNING]: Host file not found: /etc/ansible/hosts

 [WARNING]: provided hosts list is empty, only localhost is available

 [WARNING]: No hosts matched, nothing to do

とWARNINGが表示され、"ホスト名がマッチしなかったから何もしないよ"と表示されてしまいます。
えーじゃぁ自分以外のところにはどうやったらpingを送信できるんだ!
答えは/etc/ansible/hostsに書きます。
ですが現時点で存在しないので、まずはディレクトリとファイルを作成します。

$ sudo mkdir -p /etc/ansible/
$ sudo vim /etc/ansible/hosts
[test]
172.10.1.1

わざと存在しないサーバのIPアドレス(172.10.1.1)にしました。
ではtestに対してpingを送信してみましょう。

$ ansible test -m ping                                                                                                  172.10.1.1 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 172.10.1.1 port 22: Connection timed out\r\n", 
    "unreachable": true
}

ちゃんと172.10.1.1にpingが送信されています。ただ、存在しないサーバなので"UNREACHABLE"(未到達)と表示されました。これは想定通りの動作なので問題ありません。
もしも複数サーバにpingを送信したい場合は先ほどのhostファイルにIPアドレスを追加すればOKです。

【例1】
[test]
172.10.1.1
172.10.1.2

【例2】
[test1]
172.10.1.1
172.10.1.2

[test2]
172.10.2.1

まとめ

本日やったことのまとめです。

  1. pipでansibleをインストールする
  2. ansible <ホスト名> -m pingpingを送信する
  3. ホスト名は/etc/ansible/hostsに記載する。

Windows10でDocker Toolboxを使って15分でコンテナ(マシン)を準備する

Windowsを使っているとLinux環境が急にほしくなる時があります。そんなとき今までVirtualBoxVM環境を作ってVMマシンを立ててOSを
インストールして。。。ということを毎回やっていたのですが、すっごい時間がかかるんですよね。。。
CentOS minimumインストールでも短くて1時間くらいかかってました。
これがDockerとDocker ToolBoxの登場で一気に短くなりました。またそれだけではなく公式で公開されているコンテナを利用することで、Webサーバが既にインストール済みのコンテナで作ることができます。
つまり、CentOSのコンテナを作って起動して、ログインしてWebサーバのソフトウェアをインストールして、、、という作業が不要になり、Webサーバインストール済みのコンテナを呼び出し起動するだけで構築ができます。
他にも特徴はいろいろありますが、とにかくVMより今はコンテナが注目されているんだなーくらいに思ってください。
では早速環境を作って触ってみましょう。

目次

前提環境

OS:Windows10 64bit

Windows版Docker Toolboxのインストール

公式サイトからDocker Toolboxをダウンロードします。
今回はWindowsなので右のダウンロードボタンを押してください。
https://www.docker.com/products/docker-toolbox
f:id:jainders:20161106001518j:plain

DockerToolbox-1.12.2.exeをクリックしてダウンロードを開始します。
f:id:jainders:20161106001529j:plain

ダウンロードが完了したら落としたファイルをクリックしてインストールを開始しましょう。
以下のようなWelcome画面が表示されます。Nextを押します。
f:id:jainders:20161106001531j:plain

インストール先を指定します。デフォルトで問題ないのでNextを押します。
f:id:jainders:20161106001532j:plain

コンポーネントを選択します。デフォルトで全部選択されています。そのままでNextを押します。
f:id:jainders:20161106001533j:plain

追加オプションを指定します。これもデフォルトのままでよいです。Nextを押します。
f:id:jainders:20161106001534j:plain

インストール前の確認画面です。Installを押してインストールを開始しましょう。
f:id:jainders:20161106001535j:plain

インストール中です。少々待ちましょう。
f:id:jainders:20161106001536j:plain

インストール完了画面です。そのままFinishを押しましょう。
f:id:jainders:20161106001541j:plain

Docker Quickstart Terminalをクリックしましょう。するとデフォルトのVMを作ってDockerコンテナを1つ自動で作成する処理が開始されます。ちょっと時間がかかります。カップラーメンかコーヒーでも作って飲み食いしながら待ちましょう。
(途中なぜかWaiting for an IP...と表示されたところで止まりましたが、Enterを押したら処理が開始されました。)
f:id:jainders:20161106001603j:plain

完了するとクジラのマークが出現します。
f:id:jainders:20161106001606j:plain

以下コマンドを打つとdefaultコンテナができていることが確認できます。
hoge@DESKTOP-0LCRDL8 MINGW64 ~
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.100:2376 v1.12.3

またOracleVM VirtualBoxを起動してみましょう。デスクトップにショートカットアイコンがあればそれをクリック。なければWindowsスタートから起動しましょう。
以下のようにDefaultというVMマシンが1つ作成されていることを確認してください。ここでDockerコンテナが動いています。
f:id:jainders:20161106001608j:plain


Dockerが正常に動作するか確認しましょう。以下コマンドを打ってください。

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world

c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com

For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/


上記のように表示されればOKです。

以上です。

プログラミング初心者でこれからJavaを勉強する人におすすめの書籍

これからIT業界でIT技術者の卵として活躍していくことを決めた皆さん。
私は大学生の時にJavaからプログラム言語を学びました。その時にお世話になった書籍が何冊かあるので、今回はその書籍+αを紹介しようと思います。(ほとんど結城浩著(汗))

目次

(Java)プログラミングが初めてという方

上下巻に分かれています。上巻はif, for, printlnなどJavaの基本的な構文を学ぶことができます。Javaだけでなくプログラミング言語全体で共通的な考え方、=(イコールではなく代入)などを学べるのでオススメです。

改訂第2版 Java言語プログラミングレッスン (上)

改訂第2版 Java言語プログラミングレッスン (上)


下巻はオブジェクト指向のクラス生成、メソッド、クラス変数について記載されています。下巻はオブジェクト指向の基本を学びます。これも他のオブジェクト指向言語と共通的な技術を学べるのでオススメです。

改訂第2版 Java言語プログラミングレッスン (下)

改訂第2版 Java言語プログラミングレッスン (下)

これらだけ読んでも作れる処理はコマンドライン(黒い画面に文字だけが出てくりやつ)にランダムに数字を出すとか、文字を入力すると「〇〇さん、こんにちは」と出てくるなど世に出せるレベルにはなりません。
また本書籍ではJavaに出てくる便利な機能、応用は一切出てきません。Java言語も日々バージョンアップしています。従来バージョンでは何行もかかっていたのが、数行でかけるように簡単になったり、今までできなかったことができるようになっています。
本格的にJavaを使うようになったらJava6以降に追加された各機能について調べてみるといいと思います。

Javaプログラムをどう書けばよいのか悩んでる方

少しプログラムを書けるようになると、mainに永遠とソースを記述してしまったり、クラスはあるけど特にルールもなくいろんなクラスを作って何がどこにあるのか分からなくなる。。。なんてことありませんか。
本書はデザインパターンとしてクラス設計の基本パターンを説明しています。上流で設計する際、特にクラス図を作成することがある方はこの知識は基本として身に付けておいた方が設計時だけではなく、外部ライブラリを利用するときなど学習が早くなります。(と言いながら私もよく使うパターンしか覚えてませんが)

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

たとえ自分が書いたコードであってもソースは1か月も経つと内容を忘れてしまいます。コメントを残していたとしてもコメントとソースに乖離があったりとかして、コメントに書いたことをしたかったのか、ソースの方が正しいのか分からないことが実はよくあります。。。
そのためできるだけコードの可読性、究極的にはある程度のスキルがある方ならどんな処理か読めば分かる、そんなコードが書けたら最高ですよね。
将来の自分にとっても分かりやすい、他の人にも分かりやすいコードを書きたい!書こう!
本書は変数名、関数名など名前の付け方、改行の仕方などを具体例を挙げながら説明してくれます。
え?そんなことにまでこだわるの?と驚くこと間違いなし。
言語に関係なく読んでほしい一冊です。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

他にもJavaや初心者の方に限らなければ他言語でオススメの書籍や、開発環境関連、サーバ関連などIT業界である程度活躍するために必要な知識はいっぱいあります。
特にIT業界は日進月歩で進化、発展し続けています。毎年のトレンドに追いつくだけでも一苦労です。
これからIT業界で頑張ろうという方に一番必要なのは日々着実に技術を調査し勉強する努力であることは間違いありません。

※今回紹介した4冊以外に初心者にオススメの書籍があれば教えてください。

HLS + FFmpeg + nginx on EC2でストリーミング動画配信サービスを構築する

今回は最近動画配信技術として注目されているHLSを使ってストリーミング動画配信サービスを構築します。
EC2上にnginxを使ってWebサーバを公開し、video.jsで動画プレイヤーを作りサンプルmp4をm3u8で分割して配信します。

単語がわからない方は前回の記事にまとめているのでこちらをどうぞ。
HLS, H.264, エンコード, コーデック, ファイル形式(知識編) - KAROUSHI -Japanese Engineer Blog-

目次

HLS + FFmpeg + nginx on EC2でストリーミング動画配信サービスを構築する

EC2の作成

まずはEC2が必要です。手順はこちらを参考にして実施してください。
EC2でAmazonnLinuxを5分で作成 - KAROUSHI -Japanese Engineer Blog-

FFmpegのインストール

EC2の準備ができたらログインして早速FFmpegをインストールしていきましょう。
FFmpegを使ってmp4をm3u8形式に直してストリーミング動画配信を行います。

まずは必要なパッケージをインストールします。

$ sudo yum install -y vim git

gitからshをcloneしてきて実行します。
このshはFFmpegとそれに必要なライブラリをコンパイルする手順を実行します。
実行完了までかなりかかるので待ちましょう。エラーがでなければOKです。

$ git clone https://gist.github.com/b920763fb15e2f487ad363fbb2e61ad9.git
$ chmod +x b920763fb15e2f487ad363fbb2e61ad9/ffmpeg_install.sh
$ ./b920763fb15e2f487ad363fbb2e61ad9/ffmpeg_install.sh

nginxのインストール

nginxをインストールしてWebサーバを立てましょう。Apacheに慣れている方ならそれでもいいですが、最近は徐々にnginxに移行してきているようです。またnginxはコンフィグがjson形式なのでApacheと比べると格段に設定が容易です。処
理も速いし。

$ sudo yum install nginx -y

ドキュメントルートのディレクトリが作成されていることを確認します。

$ ll /usr/share/nginx/html

nginxを起動します。

$ sudo service nginx start
Starting nginx:                                            [  OK  ]

nginxを自動的に起動します。

$ sudo chkconfig nginx on

node.js, npmのインストール

yumでnode.jsとnpmをインストールします。

$ sudo yum install epel-release
$ sudo yum install nodejs npm --enablerepo=epel -y

バージョンを確認する。

$ npm -v
1.3.6
$ node -v
v0.10.46

※node.jsのバージョンが古いため最新のnode.jsを使いたい場合は以下を実施する。
以下サイトを参照
Amazon Linuxに Node.js と npm を入れる - Qiita

参考:
centos + node.js + npm + nvm インストール - Qiita

Video.jsのインストール

まずはnginxのドキュメントルートにcssとjsを格納するディレクトリを作成します。

$ sudo mkdir -p /usr/share/nginx/html/css/
$ sudo mkdir -p /usr/share/nginx/html/js/

npmでvideo.jsをインストールしましょう。

$ npm install --save-dev video.js

インストールが完了したらドキュメントルートにjsやcss等を移動します。

$ sudo cp node_modules/video.js/dist/video.min.js /usr/share/nginx/html/js/
$ sudo cp node_modules/video.js/dist/video-js.swf /usr/share/nginx/html/js/
$ sudo cp node_modules/video.js/dist/video-js.min.css /usr/share/nginx/html/css/
$ sudo cp -rp node_modules/video.js/dist/font/ /usr/share/nginx/html/

他にも必要なパッケージをnpmでインストールして同様にドキュメントルートへ移動させます。

$ npm i videojs-contrib-media-sources
$ cd  node_modules/videojs-contrib-media-sources
$ npm i
$ npm run build
$ sudo cp -p dist/videojs-contrib-media-sources.min.js /usr/share/nginx/html/js/

こちらも同様。

$ cd ~
$ git clone https://github.com/videojs/videojs-contrib-hls
$ cd videojs-contrib-hls
$ npm i
$ npm run build
$ sudo cp -p dist/videojs-contrib-hls.min.js /usr/share/nginx/html/js/

HTMLを/usr/share/nginx/htmlに配置します。
※[IP Addresses]の部分はEC2のパブリックIPに変更すること。

$ cd /usr/share/nginx/html
$ sudo vim video.html


gistf1fb9a79b6f1206d88d5ca9dac9a7a3a


wgetでストリーミング動画配信のテスト用としてmp4の動画をダウンロードします。

$ wget http://www.gomplayer.jp/img/sample/mp4_h264_aac.mp4

ようやく準備が整いました。mp4⇒m3u8へFFmpegコマンドで変換します。動画サイズによって変換は多少時間がかかります。

$ ffmpeg -i mp4_h264_aac.mp4 -vcodec libx264 -s 1280x720 -b:a 256k -f segment -segment_format mpegts -segment_time 10 -segment_list sample.m3u8 sample_%04d.ts

完了したらドキュメントルートに配置します。

$ sudo cp -p sample* /usr/share/nginx/html/

ブラウザでストリーミング動画の視聴

Windows10ならMicrosoftのEdgeブラウザを起動し以下のURLでアクセスしてみましょう。
ビデオ再生画面が表示され自動でバッファ読み込みを開始します。準備ができたら再生ボタンを押してみてください。
※[IP Addresses]の部分はEC2のパブリックIPに変更すること。
http://[IP Address]/video.html
f:id:jainders:20161103000358j:plain

動画は無事見れましたか?
以上で終わりです。

HLS, H.264, エンコード, コーデック, ファイル形式(知識編)

HLSで動画配信サーバの構築をした際に動画配信の基礎知識ネットで調査したものをまとめました。
ちなみに自分はHLSは初めてなので間違いがあればツッコミください!

目次

動画配信の基礎知識(基礎なのに難しい)

H.264ITUによhttp://koboldtodragon.hatenablog.com/entry/2016/11/04/005038って勧告された動画データの圧縮符号化方式の標準の1つ。
H.264は携帯電話の低速・低画質用途からハイビジョンテレビ放送などの高速・高画質まで幅広い用途に用いられる。
従来広く用いられていたH.263やMPEG-2に比べて高い圧縮効率を達成している。
またH.263、MPEG-4では、コサイン関数を用いていたため実数精度の演算が必要であったが、H.264では整数変換を採用しているため加減算とビットシフトのみでの整数精度での演算が可能になった。それによりソフトウェア、ハードウェアいずれの場合でも実装が従来に比べて非常に容易になった。
ほぼ引用

なんだか小難しいですね。。。(汗
生データの動画はサイズが大きすぎるので、そのままのサイズでネットワーク通信すると重すぎて動画が見れない。
そこで動画の画質をなるべく落とさないでサイズだけを圧縮する技術を長年技術者たちが開発して育ててきたってこと。
その1つがH.264という圧縮符号化方式というわけ。この技術のおかげで動画データのサイズが小さくなり、ネットワーク経由の動画でも遅延がなく違和感のないスムーズな動画みれるということですな。
すげー! IT技術者すげー!!!

参考:
https://ja.wikipedia.org/wiki/H.264
http://e-words.jp/w/H.264.html

HLS(HTTP Live Streaming)

次はHLSについてIT業界に多い3文字の頭文字。。。ほんと多くて何がなんやら分かりませんわ。。。こういうのを覚えるだけでもすっごい時間がかかるんですよね。
先ほどのH.264は動画データのサイズ圧縮技術でしたが、HLSはその動画をどうやって配信するかの技術です。
動画の配信方法は、

  • 動画データを一旦完全にダウンロードしてから見る方法
  • 動画データをストリーミング(データを受け取ったらすぐ再生)で見る方法

の大きく分けて2つある。
またライブ配信なのかそうでないのかもある。
HLSは生放送でストリーミング配信をHTTP通信(=Webサーバと思ってもらっていい)で提供する技術で、
主にflv(Flash Video)動画の視聴ができないiOS/Android向けに動画配信をしたい場合に用いられている。
以前はflvが主流だったけど、HTML5スマホの普及によりHLSへ移ってきているイメージ。
ただしPC版ではまだsafariしか対応していないため、他ブラウザで再生したい場合はvideo.jsなどのライブラリを使用する必要がある。

エンコード、コーデック、ファイル形式

最初に説明したH.264のように動画データ、音楽データは実は他にも様々なデータ圧縮方法がある。
動画を圧縮することをエンコードと呼び、動画圧縮技術をコーデックと呼びます。
コーデックは画質やファイル形式により異なります。ファイル形式はファイル名からどんなファイルなのか明示する仕組み。
コーデックには以下のようなものがあります。()内はファイル形式。

などなど。。。

FFmpeg

FFmpegは動画と音声を変換するためのフリーソフトウェア
スマホやカメラなどで動画を録画する際に使うコーデックはアプリ内部で勝手に決められています。
そのため、録画した時はmp4だったけどサイトに投稿するときにはflv形式じゃないとNGの場合、そのままでは載せられないため動画で使われているコーデックから別の物へ変換する必要があります。
そこで登場するのが動画音声変換ソフトウェアです。今回はFFmpegを使います。
フリーソフトウェアと聞くと無料なら何でもしてOKなのか!と思われがちですが、実はライセンスがあり
それによってはある条件下なら無料というものが多いです。
で気になるFFmpegのライセンス形態はオプション時にLGPLGPLに決定されます。
詳しくは以下。

FFmpegのライセンス
http://blog.tai2.net/mpegla_and_ffmpeg.html
https://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License
https://ja.wikipedia.org/wiki/GNU_General_Public_License