KAROUSHI -Japanese Engineer Blog-

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

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

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

Atomでphpmd+Atom-beautify(php-cs-fixer)の静的解析とコード整形を簡単実行

ソース開発の最後に必ずあるソースレビュー。ソースレビューの時はできる限り処理が正しいか、性能はでるかなど本質的なレビューをしたい。使用していない変数とか、ネスト深すぎるとか、インデントが、、、とかどうでもいいコメントはできる限りしたくない!レビュー項目に残すのも嫌だし、直ったら確認するもの嫌!
そういう方にオススメしたいプラグインが、phpmdAtom-beautify(php-cs-fixer)です。
というわけでAtomで簡単にPHPの静的解析とコード整形を実行できるパッケージのインストール手順を紹介します。

目次

Atomにphpmd+php-cs-fixer+Atom-beautifyをインストールする

前提条件

コマンドプロンプトよりパッケージをインストールする

コマンドプロンプトよりphpmdをインストールをする。

C:\Users\user>composer global require phpmd/phpmd=*
Changed current directory to C:/Users/<ユーザ名>/AppData/Roaming/Composer
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing symfony/filesystem (v3.1.2)
    Downloading: 100%

  - Installing symfony/dependency-injection (v3.1.2)
    Downloading: 100%

  - Installing symfony/config (v3.1.2)
    Downloading: 100%

  - Installing pdepend/pdepend (2.2.4)
    Downloading: 100%

  - Installing phpmd/phpmd (2.4.3)
    Downloading: 100%


コマンドプロンプトよりphp-cs-fixerをインストールをする。

C:\Users\user>>composer global require friendsofphp/php-cs-fixer
Changed current directory to C:/Users/morik/AppData/Roaming/Composer
Using version ^1.11 for friendsofphp/php-cs-fixer
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing sebastian/diff (1.4.1)
    Loading from cache

  - Installing symfony/stopwatch (v3.1.3)
    Loading from cache

  - Installing symfony/process (v3.1.3)
    Loading from cache

  - Installing symfony/finder (v3.1.3)
    Loading from cache

  - Installing symfony/event-dispatcher (v3.1.3)
    Loading from cache

  - Installing symfony/polyfill-mbstring (v1.2.0)
    Loading from cache

  - Installing symfony/console (v3.1.3)
    Loading from cache

  - Installing friendsofphp/php-cs-fixer (v1.11.6)
    Downloading: 100%

symfony/event-dispatcher suggests installing symfony/http-kernel ()
symfony/console suggests installing psr/log (For using the console logger)
Writing lock file
Generating autoload files


・phpmd,php-cs-fixerのバージョンを確認する。

C:\Users\user>phpmd --version
PHPMD 2.4.3

C:\Users\user>php-cs-fixer --version
PHP CS Fixer version 1.11.6 by Fabien Potencier


atomにlinter、linter-phpmdなどをインストールする。
パッケージ名が分かっているのでコマンドプロンプトからインストールするのが楽です。

C:\Users\user>apm install linter
Installing linter to C:\Users\<ユーザ名>\.atom\packages done

C:\Users\user>apm install linter-phpmd
Installing linter-phpmd to C:\Users\<ユーザ名>\.atom\packages done

C:\Users\user>apm install php-cs-fixer
Installing php-cs-fixer to C:\Users\<ユーザ名>\.atom\packages done

C:\Users\user>apm install atom-beautify
Installing atom-beautify to C:\Users\<ユーザ名>\.atom\packages done

ATOMから直接インストールする場合はファイル⇒環境設定⇒インストール⇒search packagesの入力欄に以下を入力して以下4つをインストールする。
linter
linter-phpmd
php-cs-fixer
atom-beautify

パッケージの設定

上部メニューファイル⇒環境設定⇒パッケージのコミュニティパッケージにインストールしたパッケージ名が表示される。それぞれの設定より設定を行う。
・linter-phpmdの設定
PHPMD Executable Path:C:\Users\<ユーザ名>\AppData\Roaming\Composer\vendor\bin\phpmd
PHPMD Rulesets:cleancode,codesize,controversial,design,unusedcode

php-cs-fixerの設定
PHP-CS-fixer executable path:C:\Users\<ユーザ名>\AppData\Roaming\Composer\vendor\bin\php-cs-fixer

Ctrl+Sで保存するとPHP-CSPHP-MDがソースを解析してくれます。
以下画像のように該当箇所にフォーカスさせると原因が表示されます。
f:id:jainders:20160802224317j:plain

またCtrl+Alt+Bか、ソース上で右クリック「Beautify editor contents」を実行することでソースの自動整形が実施されます。

boto3でS3に接続しようとして"The bucket you are attempting to access must be addressed using the specified endpoint."エラー

目次

概要

boto3でS3に接続しようとして"The bucket you are attempting to access must be addressed using the specified endpoint."のエラーが発生。

環境情報

OS:Linux ip-172-31-28-146 4.4.11-23.53.amzn1.x86_64 #1 SMP Wed Jun 1 22:22:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

pythonPython 2.7.10

ライブラリ:boto3

事象

$ python getObjectFromS3.py

test.test.test.3
Traceback (most recent call last):
File "getObjectFromS3.py", line 13, in <module>
ContentType='text/plane'
File "/usr/local/lib/python2.7/site-packages/boto3/resources/factory.py", line 518, in do_action
response = action(self, *args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/boto3/resources/action.py", line 83, in __call__
response = getattr(parent.meta.client, operation_name)(**params)
File "/usr/lib/python2.7/dist-packages/botocore/client.py", line 258, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/usr/lib/python2.7/dist-packages/botocore/client.py", line 548, in _make_api_call
raise ClientError(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (PermanentRedirect) when calling the PutObject operation: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.

原因

エンドポイントのデフォルトがUSリージョンのため、東京リージョンのバケットにアクセスしようとしてエラー。

対処方法

API gatewayのエンドポイントを指定する。

・ソースを修正する。
s3 = boto3.resource('s3')

s3 = boto3.resource('s3', endpoint_url='<エンドポイント>')