Gitlab第1歩

福岡拠点の宮里です。
社内用にGitlab環境を構築しました。

当初は、必要なミドルウェアをひとつひとつソースからインストールして、Gitlab環境を作ろうとしていたのですがこれが大変。今回はまっさらな環境に構築するというのと、ソースからインストールした場合は導入後の管理の手間もかかるという理由もあり、おとなしく公式パッケージからインストールすることにしました。

公式パッケージを使用すると、当たり前ですが本当に楽ちん。1時間ぐらいで初期設定まで完了します。

Gitlabの公式ドキュメントでも、わざわざ一番最初に”パッケージからインストールすることをおすすめするよ”と書いてあるのですが、ちゃんと言うこと聞いておけば良かったと今回本当に身に染みました。

Omnibusパッケージのインストールを検討する
ソースからのインストールは多くの作業とエラーが発生しやすいので、高速で信頼性の高いOmnibusパッケージのインストール(deb / rpm)を強くお勧めします。

(公式ドキュメントより引用)

あと、最低限の使用でもハードウェアリソースの要件が意外と高く、まず最初に導入するサーバーのスペックが要件を満たしているか確認することをおすすめします。スペックが足りてないと、インストールしたあとに500エラーが頻発します(/д\)

公式ドキュメントのインストール要件ページ

公式パッケージを使用するのであれば、やることは簡単です。

設定ファイルを修正後、Gitlabの再構成コマンドを実行します。

サーバーのIPへアクセスして、Gitlab管理ユーザーのパスワードを変更したらインストールは完了です。

公式ドキュメントをちゃんと読んで確認することはしっかり確認しよう、というお話でした。

Jmeterログを攻略する

福岡拠点の野田です。
最近ひさしぶりにJmeterを使って負荷テストをしました。

Jmeterから実行結果をログに出力することができますが、XMLかCSVかjmeter.propertiesで選ぶことができます。

XMLは、ページアクセスに起因する問合せをすべて記録することができます。一方、CSVにおいては、画像、CSS、JSなど付随情報は、明示してシナリオを作成していない限りログに記録することができません。そのため、出力はXMLで出力していたほうが広くログを残すことができます。ここは迷わずXMLを指定してください。

付随する関連ログをすべて残すためには、以下のsubresultsをtrueで指定します。

実行コマンドの例を提示します。

HTMLのみのログに残すためには以下のような処理で加工することができます。

※個別ログのtestResult+必要なXMLタグで含まれる範囲で絞り込み。その後、css/jpg/png/js/svg/gif/icoを排除。

ここまでは、XML最高!なのですが、実は大きな欠点があります。実は、XMLログからはHTMLレポートが作成できません。

そんなときどうしたらいいか。

XMLからCSVを作ればオッケーです。そこで使えるのが、XSLT。

jmeter_xml2csv.xslt

XMLからCSVを変換するコマンド例は以下。

XMLからCSVに変換したファイルを使って、以下のコマンドで晴れてレポートを作れるようになりました。

他にもコマンドラインからプラグインを呼び出すことも簡単にできます。
元のログから集計結果を得たいときは以下。

※利用にあたって、標準プラグインと呼ばれるjarライブラリをlib/ext 以下に配置する必要があります。
https://jmeter-plugins.org/downloads/old/

こちらもご参考まで。

すてきなLaradock

福岡拠点の宮里です。
Dockerを勉強し始めました!
DockerでLaravel開発環境を構築する場合に便利なLaradockというパッケージがあり、併せて勉強中です。

Laradockとは

PHP開発環境を構築できるDockerイメージのパッケージです。
DockerでLaravelプロジェクトを実行することに焦点を当てて開発されています。
Laravel以外にもSymfony、CodeIgniter、WordPress、Drupalなどの他のPHPプロジェクトもサポートしています。
officialのDockerイメージをベースに拡張したパッケージなので信頼性があるとのことです。

Laradockが魅力的なのは、なんといってもその豊富なソフトウェア群です。
build→upで必要なライブラリを都度追加・更新が行えます。

備忘録としてそのパッケージをリストアップしました。(2018年11月時点)

サポートしているソフトウェア(一部)

Portainer

Docker管理WebGUIツール
公式サイト: https://portainer.io/

Docker Registry

Dockerプライベートレジストリサーバ
Dockerドキュメント: https://docs.docker.com/registry/

Docker Web UI

DockerプライベートレジストリWebUI管理ツール
Github: https://github.com/kwk/docker-registry-frontend

MySQL

データベースサーバ
公式サイト: https://www.mysql.com/jp/

MariaDB

MySQL派生のオープンソースデータベースサーバ。
公式サイト: https://mariadb.org/

phpMyAdmin

MySQLサーバー管理ツール
公式サイト: https://www.phpmyadmin.net/

PostgreSQL

オープンソースデータベースサーバ。
公式サイト: https://www.postgresql.org/

pgAdmin

PostgreSQLサーバー管理ツール
公式サイト: https://www.pgadmin.org/

Microsoft SQL Server

データベースサーバ
公式サイト: https://www.microsoft.com/en-us/sql-server/sql-server-2017

Redis

オープンソースのメモリ内データ構造ストアで、データベース、キャッシュ、メッセージブローカーとして使用。NoSQLデータベースサーバ。
公式サイト: https://redis.io/

Aerospike

KVS。フラッシュ(SSD)に最適化したNoSQLデータベースサーバ。
公式サイト: https://www.aerospike.com/

Minio

Go言語製Amazon S3クラウドストレージサービスと互換性を持ったオブジェクトストレージサーバ。
公式サイト: https://docs.minio.io/

Apache2

世界中でもっとも多く使われているWebサーバ
公式サイト: https://httpd.apache.org/

Nginx

Webサーバ
公式サイト: https://nginx.org/en/

Caddy

Go言語で実装されたwebサーバ
公式サイト: https://caddyserver.com/

Varnish

HTTPアクセラレータ
公式サイト: https://varnish-cache.org/

Certbot

Let’s Encryptのクライアント
公式サイト: https://certbot.eff.org/

Laravel Echo Server

LaravelのSocket.IOサーバライブラリ
Laravel公式ドキュメント: https://laravel.com/docs/5.7/broadcasting
GitHub: https://github.com/tlaverdure/laravel-echo-server

Swoole

PHPネットワークフレームワーク。
公式サイト: https://www.swoole.co.uk/

Solr

オープンソースの全文検索エンジン
公式サイト: http://lucene.apache.org/solr/

Elasticsearch

Lucene基盤の分散処理マルチテナント対応オープンソースの検索エンジン。分散型RESTful検索/分析エンジン。
公式サイト: https://www.elastic.co/jp/products/elasticsearch

Kibana

Elasticsearch用ビジュアライズ/データ可視化ツール
公式サイト: https://www.elastic.co/jp/products/kibana

Grafana

データ可視化ツール。
対応ツール:Graphite、Prometheus、Elasticsearch、InfluxDB、OpenTSDB、MySQL、AWS Cloudwatch
公式サイト: https://grafana.com/

Metabase

オープンソースのデータ可視化ツール
対応:MySQL, Postgres, Mongo, SQL Server, AWS Redshift, Google BigQuery, Druid, H2, SQLite, Oracle, Crate, Google Analytics, Vertica
公式サイト: https://www.metabase.com/

NetData

サーバのリアルタイムパフォーマンスと健全性モニタリングツール
Github: https://github.com/netdata/netdata

Thumbor

画像のクロッピング、リサイズ、フィルタリング等の画像変換サーバー
公式サイト: http://thumbor.org/

Beanstalkd

オープンソースのメッセージキューイング。Laravelがサポート。
公式サイト: https://beanstalkd.github.io/

Beanstalk Console

PHP製Beanstalkd管理ツール
Github: https://github.com/ptrofimov/beanstalk_console

RabbitMQ

メッセージキューイング
公式サイト: https://www.rabbitmq.com/

HHVM

PHP実行環境
公式サイト: https://hhvm.com/

PHP-FPM

PHP FastCGI実装
公式サイト: https://php-fpm.org/
PHPドキュメント: http://php.net/manual/ja/install.fpm.php

JupyterHub

Jupyter Notebook用のマルチユーザーサーバ
公式サイト: https://jupyterhub.readthedocs.io/en/stable/

ICEcoder

PHP製のWebブラウザIDE。
公式サイト: https://icecoder.net/

Coding WebIDE

クラウドベースのWebIDE
公式サイト: https://ide.coding.net/

Codiad

PHP製のWebブラウザIDE。
公式サイト: http://codiad.com/

Theia

クラウド版Visual Studio Code
公式サイト: https://www.theia-ide.org/

Mailu

DockerベースのWebUI付きメールサーバ
公式サイト: https://mailu.io/

MailDev

Eメールテストツール。
SMTP Server + Web Interface for viewing and testing emails during development.
Github: https://github.com/djfarrelly/MailDev

MailHog

Go言語製Eメールテストツール。
Web and API based SMTP testing
Github: https://github.com/mailhog/MailHog

Selenium

ブラウザ自動化ツール
公式サイト: https://www.seleniumhq.org/

Blackfire

PHPプロファイリングツール。パフォーマンステストツール。結果をWebUIで確認できる。
公式サイト: https://blackfire.io/

Jenkins

Java製オープンソース継続的インテグレーションツール
公式サイト: https://jenkins.io/

GitLab

Gitリポジトリ管理
公式サイト: https://about.gitlab.com/

積極的に活用していきたいですね。

AWSでインスタンスを停止し、再起動した時にパブリックIPが割り振られない場合

AWS特訓中の宮里です。

AWSでインスタンスを作成したときに、少し困った現象があったため情報共有したいと思います。

AWSで作成したインスタンスを一旦停止後、ネットワークインターフェイスを追加し、再起動した後にパブリックIPが割り振られない現象が発生しました。

?????となりながら、再起動を何度か試すもパブリックIPは復活せず。
作成したばかりのインスタンスだったので、インスタンスを一から作成し直し、特に問題は起こりませんでした。
その後、気になったので原因を調べてみると、AWS公式のドキュメントに今回の現象の解答がありました。

下記、公式のドキュメントから一部引用します。

手動でパブリック IP アドレスをインスタンスに関連付けること、また、手動でインスタンスから割り当て解除することはできません。場合によって、パブリック IP アドレスはインスタンスから解放されたり、新しいインスタンスに割り当てられたりします。
インスタンスが停止または終了されると、インスタンスのパブリック IP アドレスは解放されます。停止していたインスタンスが再起動されると、そのインスタンスには新しいパブリック IP アドレスが送信されます。
VPC 内のインスタンスのパブリック IP アドレスが既に解放されている場合には、複数のネットワークインターフェイスがインスタンスにアタッチされていると、インスタンスに新しいパブリック IP アドレスは送信されません。

出典:
AWS ドキュメント「パブリック IPv4 アドレスと外部 DNS ホスト名」

インスタンスを再起動するときは、プライマリENI以外はインスタンスにアタッチしてはいけないということでした。。。

少しづつ身につけていきたいと思います。

プログラミング教育のテキスト yes!作りかけ。

だいぶん前から プログラミング教育を学校で開始するという話があり、2020年から義務教育で取り入れられるという事になりました。

そんな話もあり、Scratch+A4S+Arduinoを利用した教育用のテキスト(小学校高学年向け)を作ってみました。(ええ!もちろん作りかけです)

ScratchとA4s ( https://github.com/damellis/A4S )を組み合わせてArduino UNOを操作する環境を作り、その環境でのプログラミングを勉強するという内容にしています。

子供にプログラミングを教える、一緒にプログラミングを学ぶ時につかっていただければと思います。

#だれか資料を完成させてください!

テキスト

A4S-master2

 

 

[Go] Go言語はじめました (#1):インストール

福岡拠点野田です。
気が付けば涼しい季節になりましたが、いかがお過ごしでしょうか。

Go 言語について動けていなかったため、重い腰を上げて取り組みたいと思います。Go言語でよく使われているのは、WebAPIやメール送信・集計などのバッチ処理だと思います。javaも高速に処理ができますが重量級なイメージがあります。起動もすばやく、軽量で高速に並列処理ができるのは大きな魅力があります。

第1回目となる今回はインストールを行います。

インストール

https://golang.org/dl/

インストールは至って簡単。ダウンロードしたファイルを解凍して配置するだけ。

.bash_profileなどにパスを追加してもらえればOKです。

GOROOT というのがダウンロードして配置したGo自体のインストール先になります。

GOPATH というのが各プロジェクトフォルダに相当します。ここで開発モジュールの配置先となり、コンパイルしてできた実行ファイルが $GOPATH/bin 以下に配置されます。

Go言語初心者に向けてどのように開発を進めていくのがよいかについて深堀していこうと思います。

ちなみに go get してエラーがでるときは OS のモジュールバージョンが古い可能性が高いです。yum upgrade してすべてのモジュールを更新しておきましょう。

[Laravel]モデルとマイグレーション

福岡拠点の香月です。

前回はLaravelのプロジェクトを作成しました。
今回はこれにDBへのアクセス設定と、モデルの追加及びDBのマイグレーションを行います。

DBへのアクセス設定はアプリケーションのルートフォルダにある.envファイルで行います。この.envファイルは.env.exampleを元に作成されます。
開発環境、検証環境、本番環境でそれぞれ異なる設定なのでその環境ごとのファイル.env.develop、.env.staging、.env.productionを作成することになるでしょう。リリース時にはリリース環境にあったファイルを.envにリネームします。
※Laravelでは.envはソース管理に含めないことがガイドラインに書いてあります。これはプロジェクトのルートフォルダにある.gitignoreを見ても明らかです。

さて .env を編集する前に、アプリケーションで使用する mysql のユーザーを作成します。また、使用するDBを作成します。

1行目でmysqlにrootユーザーでログインします。
3行目でアプリケーションで使用するデータベースを「scoresheet」という名前で作成します。
4行目ではデータベース使用するユーザーとして「ss_user@localhost」を作成しつつ、必要な権限設定を行います。
5行目では山椒の実のユーザーを作成します。
6行目で権限を反映します。

これでDBの準備が整いました。
.env を開くと、DBに関する設定を行う場所があるのでここに情報を記載します。

※本当の設定箇所は config/database.php です。しかし環境ごとに異なるなので.envに記載し、database.phpからは.envを参照するようになっています。

DBへのアクセス設定ができたので、ここからはモデルの作成とテーブルを追加する作業、マイグレーションです。アプリケーションのルートフォルダで

を実行すると モデルクラス用のファイルが作成されます。-mオプションでマイグレーションファイルも一緒に作成されるので、モデルを作成するときは指定しましょう。

app\Score.php
database/migrations/<日付_時間>_create_scores_table.php

モデル名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。「Score」は「scores」になります。Laravelは内部に辞書をもっており、英単語を適切に複数形にしてくれます。ネイティブじゃない私にはありがたい機能です。
あとはこれを編集して必要なフィールドを追加します。

これとは別にLaravelではプロジェクト作成時にusers、password_resetsテーブル用のマイグレーションファイルが作成されています。認証用ですね。
これと今作成したマイグレーションファイルのすべてが次のコマンドでまとめて
DBに登録されます。

「php artisan migrate:status」でマイグレーション結果を確認できます。

※一度もマイグレーションを実行していない状態で実行するとエラーが出てしまいます。

「migrations」というテーブルが無い!と怒られるのですが、このテーブルは最初にマイグレーションを実行したときに作成されます。これを知らずにちょっとはまりました。

モデル及びテーブルがもっと必要な場合は「php artisan make:model xxx -m」を必要なだけ繰り返しましょう。最後に「php aritisan migrate」を忘れずに。

プログラムはこのモデルを使ってデータにアクセスしていきますよー。

4K放送・8K放送仕様確認

前置き

現行ハイビジョンを超える超高画質を実現する、次世代の映像規格4K・8K。2018年12月1日から、4K放送・8K放送である「新4K8K衛星放送」が始まる。
参考(総務省)
番組表関連アプリ実装に伴い、番組表関連の仕様についての確認を実施。

確認

仕様は一般社団法人電波産業会(ARIB)にて規定されているが、無償公開はされていない。関連情報として、総務省が情報通信審議会の資料を公開している。
総務省 情報通信審議会情報通信技術分科会 放送システム委員会(第41回)
以下、TLVストリームを入手しておらず実環境未検証。考察レベルであり、認識違い誤記等あれば随時更新予定。

既存2K放送 4K放送・8K放送
方式 MPEG-2 TS MMT・TLV
ストリーム TSストリーム
TLVストリーム
放送局ロゴ HDラージ
HDスモール
SD4:3ラージ
SD4:3スモール
SD16:9ラージ
SD16:9スモール
2K
スモール
ラージ

※MH-EIT(MPEG-H Event Information Table)はEIT(Event Information Table)に規定されるテーブル、記述子と同機能を持つ。

結論

放送局ロゴの扱いは考慮する必要があるが、その他についてはMPEG-2 TS方式と同機能を持つ規定となっている。
ミドルウェアの対応指針にも依存するが、アプリで違いを意識する必要はない模様。

[Laravel] 値検査(バリデーション)について

福岡拠点の野田です。
秋雨や台風が気になりますが、過ごしやすい日々が増えてきたと思います。
今日は、Laravel の値検査の仕組みについて取り上げようと思います。

Laravel には値検査を行う設計の方向性として大きく3つの選択肢があります。
・FormRequest を継承してリクエストフォームオブジェクトを作る
・ValidatesRequestsトレイトを使う
・Validator ファサードを使う

FormRequestを作る場合

Controller に対して Illuminate\Foundation\Http\FormRequest 型のメソッドインジェクションを指定しておくとそのメソッドに対応するURLが呼び出された際に値検査がかかるという仕組みになります。バリデーションの結果が false の場合、リクエスト値をセッションに保存して、リクエストを投げた前のページに戻ります。

とても便利な仕組みですが、都度、FormRequestを実装することになります。毎回似たようなコードを書くのは煩わしいですよね。そこで以下のような基底クラスを作成して継承して使いまわすことにします。この基底クラスは、自分のクラス名からバリデーションの設定を読み込んで動作する仕組みで動いています。

以下は、config/validation.php の記述例です。FormRequest実装クラス名をキーに設定を記述するとそれを読み込んでくれる仕掛けになっています。クラスの型を利用しつつ、リクエスト値の検査は設定ファイルを利用してカスタマイズしやすくします。

さらにテンプレート側に目を向けてみましょう。入力フォームのテンプレートは、エラー表示と「戻る」ボタンで遷移の両方を共通で実現している場合がほとんどだと思います。Laravel で用意されている old ヘルパーメソッドで取得できるのは、エラー時のセッションしかありませんので、以下のような記述をすることでエラー時のセッション値があれば、セッション値、なければリクエスト値をとる実装が可能です(old メソッドのデフォルト値にリクエスト値を設定する実装になります)。

エラーを表示する場合は以下で対応できます。

$errors->has(’email’)や$errors->count()などもよく使うメソッドだと思います。エラーは MessageBag というクラスで定義されていますので、以下を参考にしていただければ幸いです。

https://laravel.com/api/5.6/Illuminate/Support/MessageBag.html

ValidatesRequestsトレイトを使う場合

FormRequest の処理のうち Controller 側の処理を切り出したものが ValidatesRequest になります。
Controller で use ValidatesRequest をすることで Controller 中で $this->validate() メソッドなどが使えるようになります。

以下 Laravel マニュアルページより

値検査に失敗すると Illuminate\Contracts\Validation\ValidationException が発生し、FormRequest 同様、前のページに戻ります。validateをかけるタイミングを調整できるため、リクエスト値の前処理が必要な場面や FormRequest の作成をしたくない場合に使われると思いますが、Validator ファサードの選択肢もあるため、相対的に利用する場面は少ないと思われます。

Validatorファサードを使う場合

Validator ファサードを使えば値検査部分だけを部品化して値検査をすることが可能です。バッチ系で値検査を行うときは直に呼び出して使うことが多いと思います。例えばCSVインポートバッチの入力値チェックなどはこの Validatorファサードの出番です。

上記は、config/validation.php で設定を外だししている例です。個別実装することももちろん可能ですが、ある程度共通化できるところは共通化しておくと良いでしょう。

まとめ

なんだかんだいいましたが、場面場面に応じて最適な値検査の方法を選択して実装していくとよいでしょう。その中で特に伝えたかったことが「設定ファイル化」という部分になります。値検査(バリデーション)というプログラムの課題の中でconfig/validation.php にまとめておく、HTML部品という課題の中で config/form.php にまとめておく、アプリケーション設定として、config/const.php にまとめておく、などなどです。後で入力チェックをまとめるときに個別の実装をみなくてよいのは、大きな助けになると思います。まだの方は、実装時の良い習慣としてプログラムの課題の設定ファイル化を是非やってみてください。

補足

以下補足になります。入力、確認、完了のような遷移がある場合のルーティングのTIPSです。通常、入力画面は、GETリクエスト、それ以外はPOSTリクエストとしていると思います。つい忘れがちですが、保存ページについては、GETも受け付けて入力画面に逃がすとよいと思います。戻すときの遷移でリロードして、MethodNotAllowedのエラーが見えてしまうとちょっとカッコ悪いですよね。