OmniAICreator/Qiita-1.07M huggingface dataset:
G検定(2019/07受験)の勉強方法

2019/07/06(土)にG検定を受験しました。
感覚的には合格できてると思います。
感想・自分の勉強方法を書きます。

## 個人的な感想  
- 法規制/事例に関する問題が意外に多かった
- 法規制は最近施行の話まで触れられる
- BERTなど最近(?)の手法も触れられていた

## 私の勉強方法  
### ▼勉強スタート時点のスキル  
- プライベートで機械学習を半年程度勉強(オライリー本の写経など)
- 主要アルゴリズム・DLの基礎(バックプロパゲーション、正規化テクニック)を理解
- LSTMくらいまでは理解、Attentionはふわっと理解程度

### ▼学習時間  
10時間
(受験1週間前より集中勉強)

### ▼勉強ステップ  
#### インプット(6時間)  
- **人工知能は人間を超えるか**  
https://www.amazon.co.jp/dp/B00UAAK07S/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

上記書籍を1周。必ず読むことをおすすめします。
2015年頃の本ですが、人工知能が抱える問題と歴史、今後の展望まで完結に書かれています。
この本の内容に関わる問題もありました。

#### アウトプット(4時間)  
- **徹底攻略 ディープラーニングG検定 ジェネラリスト問題集**  
https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0G%E6%A4%9C%E5%AE%9A-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88%E5%95%8F%E9%A1%8C%E9%9B%86-%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97AI%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE-%E6%98%8E%E6%9D%BE/dp/4295005665/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=g%E6%A4%9C%E5%AE%9A&qid=1562466751&s=gateway&sr=8-2

上記書籍を1周。技術面を理解している人には少し簡単すぎる問題集かもしれません。
これだけでは足りないですが、似たような問題は検定でも見かけました。
理解の再確認という意味で役立ちました。
逆にこれくらいを速攻解けないと本試験は難しいかもしれません。

- **Study AI**  
http://study-ai.com/generalist/

上位Webサイトの問題を170問くらい解きました。
こちらのサイトはおすすめです。最近の法規制関連の問題もありました。
225問と充実してますが、時間がなければ150問以降くらいを解くことをおすすめします。
後半はAI白書より抜粋した問題が多く、本試験に役立ちます。
前半は技術面など上記問題集と似た問題が多いので、飛ばしても良いかもしれません。

#### (参考)試験勉強以前に使っていた本  
- **scikit-learnとTensorFlowによる実践機械学習**  
https://www.amazon.co.jp/scikit-learn%E3%81%A8TensorFlow%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-Aur%C3%A9lien-G%C3%A9ron/dp/4873118344/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3GIU00G7THMIL&keywords=scikit-learn%E3%81%A8tensorflow%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92&qid=1562468672&s=gateway&sprefix=scikit%2Caps%2C264&sr=8-1

機械学習の勉強はこの本から始めました。
機械学習〜DLまで幅広く解説してくれています。今でも重宝してます。
これをひたすら写経しました。

- **ゼロから作るDeep Learning ❷ ―自然言語処理編**  
https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E7%B7%A8-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873118360/ref=pd_bxgy_14_img_3/357-6996188-8716149?_encoding=UTF8&pd_rd_i=4873118360&pd_rd_r=f3d6fc96-a063-11e9-823b-c52dac23de45&pd_rd_w=ZLouX&pd_rd_wg=onhx0&pf_rd_p=2d39d87c-5ff4-47a9-a2d0-79fb936a2d97&pf_rd_r=W3CZ9HCA4HFN4QQ8Q5A9&psc=1&refRID=W3CZ9HCA4HFN4QQ8Q5A9

NLPを理解するために読みました。
ここでバックプロパゲーションをちゃんと理解しました。
丁寧な解説でとてもわかりやすいです。

## これから受験される方へ
- **基礎テクニックは確実に理解した方がいい**  
本試験は225問/120分と時間が短いです。
法規制系は問題文もわりと長いので、時間がかかります。
技術系の問題を速攻解いて、じっくり法規制系を解くのが良いと思います。
- **AI白書はたぶん読んだ方がいい**  
技術面に自信がない方はAI白書などを読んで、法規制系に対応できるようにした方がいいです。
僕は読みませんでしたが、最近の法規制/事例系の多さに焦りました。
- **技術面に自信がある人は松尾さん本を読むだけで結構解ける**  
「人工知能は人間を超えるか」で歴史・人工知能の問題を把握すれば、そこそこ解けるかと思います。

## 最後に
試験勉強を通じて、最近の動向などを知れたので受験してよかったと思います。
日本と海外の規制状況などもっと知ろうと思いました。
『django-admin startproject プロジェクト名』でエラーになりハマった

pyenv-virtualenvで作成した仮想環境を適用して、すぐ`django-admin startproject`をするとエラーになってハマった。。。。

```
$ pyenv virtualenv 3.7.2 django
$ pyenv local django
(django)$ django-admin startproject my_product
pyenv: django-admin: command not found

The `django-admin' command exists in these Python versions:
  3.6.4
  3.6.8/envs/仮想環境名1
  3.6.8/envs/仮想環境名2
  3.7.2/envs/仮想環境名3
  3.7.2/envs/仮想環境名4
  3.7.2/envs/仮想環境名5
  仮想環境名1
  仮想環境名2
  仮想環境名3
  仮想環境名4
  仮想環境名5
```
<br>
# 解決法
そりゃDjangoインストールしてないんだから使えないに決まってる。。。
かなり初歩的すぎて忘れてた・・・・

```
(django)$ pip install django
```
解決方法：passenger-dockerでログ出力が止まる

# 困っていたこと
**passenger-docker**を利用して構築したコンテナ(Railsアプリ)をAWS ECS上で動かして、CloudWatchでログを収集していたところ、翌々日の6:20~6:50頃にCloudWatchへのログ出力が止まってしまう事象が発生。

```text:ログ出力が止まるタイミングでCloudWatchに残っていたログ
tail: '/var/log/nginx/error.log' has been replaced; following new file
Feb 10 06:49:48 ip-10-0-4-174 syslog-ng[13]: Configuration reload request received, reloading configuration;
Feb 10 06:49:48 ip-10-0-4-174 syslog-ng[13]: Configuration reload finished;
```

# 原因の推測

- CloudWatchではコンテナ内の標準出力をログとして収集している
- ログファイルがローテートされたログが残っている

ことから、**「Nginxのログファイルがローテートされたことがトリガーになって、標準出力へのログ出力が止まった」**と推測。

# 解決方法

自分の環境ではCloudWatchでログ収集しており、コンテナ内にログファイルが残る必要はないので、**「passengerのログ出力先を標準出力へ切り替える」**ことで解決した。

参考資料：
[Redirect NGINX and Rails Logs to STDOUT and STDERR · Issue \#219 · phusion/passenger\-docker](https://github.com/phusion/passenger-docker/issues/219)

## コンフィグ

### Nginx
nginxでログ出力先を標準出力に設定する。

```nginx:/etc/nginx/sites-enabled/app.conf

passenger_log_file /dev/stdout;

server {
  # …
  access_log /dev/stdout;
  error_log /dev/stdout;
}
```

### 補足：Passenger上でRailsアプリを動かしてる場合

Railsでは環境変数**RAILS_LOG_TO_STDOUT**が存在していればログが標準出力されるようになる。
（値は「ON」「1」など、なんでもOK）

Passengerと連携させるRailsアプリが環境変数**RAILS_LOG_TO_STDOUT**を利用できるように、Nginxのコンフィグで環境変数を定義しておく。

```nginx:/etc/nginx/main.d/env.conf
env RAILS_LOG_TO_STDOUT;
```

コンテナの実行環境（AWS ECSの場合はタスク定義）で環境変数**RAILS_LOG_TO_STDOUT**を設定すれば、Railsアプリのログが標準出力されるようになる。

---

# 備考

`passenger_log_file` を server 以下に指定するとエラーになる。

```nginx:/etc/nginx/sites-enabled/app.conf
# OK
passenger_log_file /dev/stdout;

server {
  # NG
  passenger_log_file /dev/stdout;
}
```

```text:log
nginx: [emerg] "passenger_log_file" directive is not allowed here in /etc/nginx/sites-enabled/webapp.conf:25
2019/07/06 00:07:37 [emerg] 28#28: "passenger_log_file" directive is not allowed here in /etc/nginx/sites-enabled/webapp.conf:25
```
プログラムと工学の新規性。仮説（151）

# 拒絶
工学論文、プログラムなどで新規性がないことを理由に査読などで拒絶(reject)されることがある。

いくつかの経験に基づくと、これらの拒絶(reject)した人の行動は次のように分類できるかもしれない。

### 1
工学、プログラムの対象を知らない。制約条件が、他の論文・プログラムと違うことをよく知らないため、新規性があることに気がつかないため拒絶する。
### 2
工学、プログラムであるのに、理学・数学のように、新しい原理の仮説を立てないといけないと思っている。

# 背景
大学院の理工学研究科では、申請者が理学博士、工学博士の選択の希望を出せる場合がある。
審査基準は同じであるため、指導教官などが自分の専門分野と同じ方を勧めるか、
あるいは内容が指導教官の専門分野より、理学寄りであるか、工学寄りであるかで、理学、工学の選択を指導する場合があるかもしれない。

# 考察
工学であれば、特定の理論を、これまで適用しなかった領域を対象にして、その領域固有の制約条件を示し、結果を示していれば、どの制約条件が有効あるいは無効であったかまでを示さなくても、新規性を認めてよいと考えている。（個人的な感想です）

プログラムの枠組み(frame work)などでも、例えば、金融業、流通業で適用してきて、始めて製造業に適用すれば、新規性を認めてもよいと思う。３つの間の制約条件をできるだけ列挙することを最低条件として。製造業の中での制約条件のばらつきなどを示しているともっとよい。

金融業では、現金の輸送など以外は、物理的な移動を生じない。そこで、情報の移動は光速が上限であるため、制約条件の一つに光速がある。

流通業では、輸送する対象の大きさと重さにより、移動の速度の制約条件がさまざまである。
特に、任意の１地点から、ほかの任意の１地点への物流では、道路（高速を含む）、鉄道、飛行場、港などとの距離、位置などにより、最短輸送時間が異なる。

製造業では、製造する物と、原材料の大きさ、重さ、形状（気体、液体、固体）などにより、輸送までは流通業と同じであるが、工場内の製造過程は、さらに利用可能な機械類、設備類などにより製造工程の制約条件が異なる。
あるいは、類似のプロセス産業においても、石油と鉄では有機物と無機物であるため、反応の種類や変化の可能性が異なるかもしれない。
同じ輸送機械産業でも、自転車と航空機では、人の大きさのものと、その２桁大きいものとでは、扱う危険性ははなはだ異なる。

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Nios II メモ

良く調べることをメモします。

## ドキュメント
- Altima
 - [Nios EDS関連](https://www.altima.jp/members/p1-literature/altsoft.cfm#niossbt)
 - [Nios IP関連](https://www.altima.jp/members/p1-literature/altip.cfm#emb)
- Macnica
 - [NiosII ModelSimシミュレーションの実行方法](https://service.macnica.co.jp/article_files/95701/ELS1351_Q1400_10__1.pdf)
- Intel(Altera)
 - [Nios II Gen2 プロセッサー・リファレンス・ガイド](https://www.intel.co.jp/content/dam/altera-www/global/ja_JP/pdfs/literature/hb/nios2/n2cpu-nii5v1gen2-j.pdf)
 - [エンベデッド・デザインハンドブック](https://www.intel.co.jp/content/dam/altera-www/global/ja_JP/pdfs/literature/hb/nios2/edh_ed_handbook_j.pdf)

## Performance Counter

参考：ALTERA　28-1　パフォーマンスカウンタコア
https://www.intel.co.jp/content/dam/altera-www/global/ja_JP/pdfs/literature/hb/nios2/qts_qii55001_j.pdf

Plat formdesigner →　IP Catalog → Performance Counter Unit Intel FPGA IP を追加
「Number of ssimultaneously-measured sections」は測定する箇所の個数を、プルダウンから選択する。

コード中に以下を追記する。

```hoge.c
#include "altera_avalon_performance_counter.h"
～中略～
PERF_RESET (PERFORMANCE_COUNTER_0_BASE);
PERF_START_MEASURING(PERFORMANCE_COUNTER_0_BASE);
PERF_BEGIN (PERFORMANCE_COUNTER_0_BASE, 1); //複数個所の場合は、2、3とする。
//ここに測定したいコードを書く
PERF_END (PERFORMANCE_COUNTER_0_BASE, 1);　//複数個所の場合は、2、3とする。
PERF_STOP_MEASURING(PERFORMANCE_COUNTER_0_BASE);
perf_print_formatted_report(PERFORMANCE_COUNTER_0_BASE, ALT_CPU_CPU_FREQ,1,"test section 1");//複数個所の場合は引数を増やす。
```

## データ型



##小手先高速化
RESTとは何者なのか【備忘録】

##はじめに
本記事はWebを支える技術 HTTP,URI,HTML,そしてRESTを参考にして書いた記事です。
間違い等があればコメントいただけると助かります。
■ [Webを支える技術 HTTP、URI、HTML、そしてREST](https://www.amazon.co.jp/Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-HTTP%E3%80%81URI%E3%80%81HTML%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6REST-WEB-PRESS-plus/dp/4774142042/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B&qid=1562463848&s=gateway&sr=8-1)
##RESTとは
Webのアーキテクチャスタイルで下記の６つ特徴を組み合わせたアーキテクチャスタイル。
ネットワークシステムのアーキテクチャスタイルとなる。
######1. クライアント/サーバ
　　　クライアントとサーバで通信のやりとりをする
######2. ステートレスサーバ
　　　アプリの状態をサーバで管理しない
######3. キャッシュ
　　　サーバーとの通信回数を減らす
######4. 統一インターフェース
　　　通信のルールを統一する
######5. 階層化システム
　　　システムを階層に分離する
######6. コードオンデマンド
　　　プログラムをサーバからダウンロードして実行する

###そもそもアーキテクチャスタイルって何？
システムを作る上での作法や様式を表す。
例えば学校では校則がいくつか定められているが、その目的は
学校をより良いものにするためのルール。
アーキテクチャスタイルもそれと同じで、システムをより良くするためのルール。

##６つの特徴
####1. クライアント/サーバ
クライアントがサーバにリクエストを送り、それに対してサーバは、クライアントにレスポンスを返す。
メリットとしてマルチプラットフォーム（PCやスマホなど）で通信ができる。
理由は、単一のコンピュータで処理するのではなく、クライアントとサーバで別々にしているため。

####2. ステートレスサーバ
クライアントのアプリの状態をサーバ側で覚えさせず、クライアント側に覚えてもらう。
メリットとしてはサーバがクライアントの状態を覚えなく良いので、
サーバー処理能力を上げたい時はサーバを増設するだけでよい。

逆にサーバでアプリの状態を管理していることをステートフルと呼び、代表格としてCookieが挙げられる。
サーバを増設して処理能力を上げたい時は、クライアントのアプリの状態を他のサーバと同期しなければならないのでサーバーを増設するのには向いていない。

####3. キャッシュ
一度取得したリソースをクライアント側で使い回す。
具体的な例として、ブラウザなどで一度開いたページをもう一度開くと、最初に開いた時より開く速度が上がっている。
これは一度取得したページをキャッシュに保存してクライアント側で使いまわしたから。
このようにキャッシュを利用することでサーバへの通信を減らし、読み込み時間を短縮させることができる。

####4. 統一インターフェース
クライアントとサーバで通信をする時などのルールを統一したもの。
統一したルールとしてHTTPがありその中で良く使われているのがGETとPOST。
ルールを統一すれば、クライアントもサーバも、そのルールのプログラムを実装すれば良いのでプログラムがシンプルになる。

逆にルールがバラバラだとプログラムを実装するとき、その都度バラバラのルールに合わせて実装しなければならないので複雑になる。
サッカーのルールが３つも４つもあったらルール覚えるのが大変。
それと同じように、バラバラのルールだとその都度実装するのが大変。

####5. 階層化システム
クライアントとサーバの間に、サーバの負荷を分散させる装置（ロードバランサ）を設置したり、アクセス制限をする装置（プロキシ）を設置したりする。
このようにクライアントとサーバ間に装置を挟むと、クライアントとサーバの接続先はロードバランサ、またはプロキシなどに変わる。
そのためクライアントやサーバがリクエストやレスポンスを送る際に通信の方法が変わってくる、かと思いきや、前述した統一インターフェースでルールを統一していれば、通信の方法を気にする必要はない。

####6. コードオンデマンド
JavaScriptなどのプログラムコードをサーバからダウンロードし、それをクライアント側で実行するもの。メリットとして機能を後から拡張できることが挙げられる。
##まとめ
######RESTを適用することで以下の恩恵を授かることができる
1. マルチプラットフォームでWebにアクセスできる。
2. ステートレスにすることでサーバの処理能力をあげることが容易
3. キャッシュを利用することでページの読み込み速度が早くなる
4. 統一インターフェースにすることでプロキシなどを設置した時に互換性の問題がない
5. サーバからJavaScriptなどをダウンロードすることで機能拡張がしやすくなる
"nuxt-community/express-template"を使うとエラーが発生する（TypeError: Cannot read property 'eslint' of undefined）が、依存パッケージのバージョンアップで直った


起動時にタイトルのエラーが発生する。package.jsonにあるeslint関連のバージョンを上げるとエラーは出なくなった。

```patch
--- a/package.json
+++ b/package.json
@@ -22,7 +22,7 @@
     "babel-eslint": "^7.2.3",
     "eslint": "^4.19.1",
     "eslint-config-standard": "^10.2.1",
-    "eslint-loader": "^1.9.0",
+    "eslint-loader": "^2.1.1",
     "eslint-plugin-html": "^3.2.2",
     "eslint-plugin-import": "^2.16.0",
     "eslint-plugin-node": "^5.2.1",
```

下記を見た。
https://github.com/nuxt-community/starter-template/pull/83
Mac + Docker + Git Labインストール

Docker on Macで、GitLabを構築した時のメモです。

# 0. 追記
記事を書き終えた後に気づいたのですが、docker-composeでインストールする方法も公式ドキュメントに書かれていました・・・(；ω；)
Mac用にボリュームを書き直せば動きそうです。

　[Installing GitLab using docker-compose（公式）](https://docs.gitlab.com/omnibus/docker/README.html#install-gitlab-using-docker-compose)

Mac用にボリュームを書き直した記事もありました。

　[MACでDocker(docker-compose)を使用してローカルで使用するgitlabを起動](https://qiita.com/hiroyuki_onodera/items/95f6df9fa21813d95ddf)


# 1. はじめに

基本的には以下記事を参考にしていただければ8割型は解決します。
私もお世話になりました。ありがとうございました。

　[dockerを使ってmacOSにGitlabを構築する](https://qiita.com/eburairu/items/fc44ebc73096a800b7f1) 

上記手順でうまくいかない場合は、公式ドキュメントを見ましょう。
私はこの2つでどうにかなりました。
　
　[Install Gitlab with docker（公式）](https://docs.gitlab.com/ee/install/docker.html#install-gitlab-with-docker)

Docker使わずにMac上に直接インストールする記事もいくつかありますが、
Docker を使う方が楽だし、Macも汚れないのでオススメです。

# 2. 詰まったところ

### (1) localhostにアクセスしても、It worksと表示される。

[公式ドキュメント](https://docs.gitlab.com/ee/install/docker.html#install-gitlab-with-docker) にも書かれていますが、初回起動は、GitLabが立ち上がるまでに少し時間がかかるようです。
全然立ち上がらないので、あれ？あれ？と再起動を繰り返してしまいました。
docker logs -f gitlab　でログが見られるので、気長に起動を待ちましょう。
Python開発におけるIDEについて

Pythonの勉強を始めようとしているのですが使用するIDEについて何を使おうか迷っています。

自分はJavaの業務にしか付いたことがなくeclipseしか使用したことがありません。
androidアプリを個人的に作成したときはandroidStudioを使用したのですが、
使い勝手が違ったため、IDEの違いについて改めて考えることになりました。

PythonのIDEについて調べてみるとPycharmが良いと聞きました。
eclipseでも使用できるという記事を見つけたのですが、
実際に業務の現場でPython開発している人は何を使用しているのでしょうか？
もしくはIDEを使用せずエディタで記述して動かしているところが多かったりするのでしょうか？
Pythonで楽天APIを使った商品情報の取得


## はじめに
楽天ショップのカテゴリを取得した前回の
[Pythonで楽天APIを使ったジャンル一覧リストの作成](https://qiita.com/NRP/items/a2fcc0776a529ebdbbe9)　に引き続き、
今回は取得したカテゴリを使って商品を取得してみた。

## サイトの調査
前回取得したカテゴリをベースとした処理にしたため、特に参考にしたサイトはなし。
楽天APIの仕様で、各ジャンル同一条件での検索で最大3000件までしか取得できないらしい。
※検索結果のソート順を設定したら、もう少し取得できるかもしれない

前回ジャンルを取得した結果、階層が5つまでだったので、階層が5つである前提として
楽天ショップの各ジャンルの商品を取得する。
※階層が2つまでだったら、階層2のジャンルのアイテムを取得するようにした

■前回取得したジャンルリスト　

| GenreID：1 | GenreName：1   |・・・|GenreID：5   |  GenreName：5 |
|-----------:|:--------------:|:---:|------------:|:--------------|
| 510915     |  ビール・洋酒   |・・・|567652      | ノンアルコール  |


取得するだけだったら、わざわざ書かなくても良い気がしたけど、
エラーとかあって、数十分、数時間後に止まっていることがあったので
一応、メモとして記載

どういうことかというと、


## やったこと

APIをたたく際のパラメータにページ設定があり、これが1～100までの
範囲で設定ができ、各ページごとに30アイテムを取得することが出来る
※すべてのジャンルに3000アイテムあるわけではない為、数百件しかないジャンルも存在した。

約17000件のジャンルに対して、1ジャンル最大100回APIを実行し商品情報を取得した。


```python:test.py

# 検索用パラメータにページNoを反映
item_param["page"] = ***ページ番号***
```

処理を走らせておくと、数時間に一回APIのエラーが返ってくることがあった為、
処理失敗時に再度APIを実行するようにエラー時には以下のループ機能を実装した。

処理に失敗した場合は、『数秒空けて、再度同条件でAPIを実行する』を成功するまで
ひたすら繰り返す。

ただし、それでも、エラーになり終了していることがあった
※調べたところ、ConnectionResetError　が発生していた模様

また、商品数が3000件ないジャンルの時は、100ページ分APIをたたくのは時間の無駄になるため、
エラーではなく、取得結果0件の時は途中でアイテムの取得をやめるようにした。

## 　まとめ

時間はかかるものの、楽天APIを使って工夫することで
各ジャンル最大3000件のアイテムを取得することが出来る


以上、楽天API使ったアイテムの取得メモ
docker上でマイグレーションをかけるDBを変更するときにハマった

### 備忘録
今後また環境設定する時の備忘録として自分用にメモ。


###自分で作成したDBにマイグレーションファイルを適用させたいけどエラーで1日潰れた

laravelプロジェクト内の.envファイルの初期値

```laravelproject/.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```
自分で作ったデータベース(今回はapi_test)にマイグレーションをかけたいので編集

```laravelproject/.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=api_test #自作したデータベース名
DB_USERNAME=root　#データベースを作った時のユーザー名
DB_PASSWORD=root #laradock/.envのMYSQL_ROOT_PASSWORDの値
```

###おわりに
DB_HOST=mysqlがどこからきたのかよくわからん
Go言語とRubyの比較【入門】①

#はじめに
記念すべき初めての投稿です。初心者エンジニアです。
仕事でどちらも使用するので
Go言語とRubyの基本的なところをまとめてみようと思います。

#Hello World!
**Rubyの場合**

```ruby:helloworld.rb
puts "Hello World!"
#=> "Hello World!"
```

**Goの場合**

```Go:helloworld.go
package main

import "fmt"

func main() {
	fmt.Println("Hello World!")
}
//=> "Hello World!"
```
#変数宣言

**Rubyの場合**

```ruby:variable.rb
num = 1
name = "test"
pi = 3.14
t = true
f = false

puts num, name, pi, t, f
```
**Ruby実行結果**

```
1
test
3.14
true
false
```

**Goの場合**

```go:variable.go
package main

import "fmt"

//基本
var (
	i    int     = 1
	s    string  = "test"
	f64  float64 = 3.14
	t, f bool    = true, false
)

//省略型
func test() {
	xi := 1
	xs := "test"
	xf64 := 3.14
	xt, xf := true, false
	fmt.Println(xi, xs, xf64, xt, xf)
}

func main() {
	fmt.Println(i, s, f64, t, f)
	test()
}
```
**Go実行結果**

```
1 test 3.14 true false
1 test 3.14 true false
```

#定数

**Rubyの場合**

一度定義した定数に再代入を行うと警告は出るが値は変わる。**※要注意**
変更を防ぐためにfreezeメソッドを使う方法はまたの機会に。

```ruby:const.rb

# 定数は必ず大文字で始める必要あり
COUNTRY = "JAPAN"

# 破壊的変更
COUNTRY.downcase!

# 変更されてしまう
COUNTRY #=> "japan"

# 再代入
COUNTRY = "SPAIN"

# 警告発生するが値は変更されてしまう

warning: already initialized constant COUNTRY
warning: previous definition of COUNTRY was here

COUNTRY #=> "SPAIN"
```

**Goの場合**

Rubyと違い、定数の定義後に値を代入することはできません。

```go:const.go
package main

import "fmt"

//constキーワードを使用して定数を定義
const Pi = 3.14

//まとめて定義
const A, B, C int = 0, 1, 2

const (
	Username = "test_user"
	Password = "test_pass"
)

func main() {
	fmt.Println(Pi)
	fmt.Println(A, B, C)
	fmt.Println(Username, Password)
	fmt.Printf("%T %T %T %T %T %T", Pi, A, B, C, Username, Password) //型確認
}

```
**Go実行結果**

```
3.14
0 1 2
test_user test_pass
float64 int int int string string
```
Laravelでコントローラーからviewへの変数の受け渡しについてメモ

Laravelの勉強がてらメモ。

#viewヘルパ関数
Laravelでコントローラーからviewへ変数を渡す方法としては、

```php

$data = array(
    "name" => "Tanaka",
    "age" => 30,
);
return view('user', $data);
```

viewヘルパ関数を使用。

第１引数は、```resources/viewsディレクトリ```配下のファイル名。

ちなみに```resources/viewsディレクトリ```配下にディレクトリを作成し、その中にファイルを作成している場合は、ドットでつなぐ。


```php:resources/views/admin/user.phpの場合

$data = array(
    "name" => "Tanaka",
    "age" => 30,
);
return view('admin.user', $data);
```

第２引数に配列を設定することで、ビューに変数を渡すことが可能。

#withメソッドを使用
他のやり方としては、```with```メソッドで変数を渡すこともできる。

```php
return view('admin.user')->with('name', 'Tanaka');
```

#compact関数を使用
`compact`関数を使用すると、もっと楽に変数をビューに渡せる。

```php
$name = "Tanaka";
$age = 30;
return view('user', compact("name", "age"));
```

compact関数ってLaravel特有の関数かと思いこんでましたけど、
普通にPHPの関数でした。

https://php.net/manual/ja/function.compact.php

compact関数の結果を試しに出力。

```php
$name = "Tanaka";
$age = 30;
var_dump(compact("name", "age"));
```

```:出力結果
array(2) {
  ["name"]=>
  string(6) "Tanaka"
  ["age"]=>
  int(30)
}
```

やってることは、

```php
$data = array(
    "name" => "Tanaka",
    "age" => 30,
);
return view('user', $data);
```

と同じですね。納得。

誰かスマートな書き方をした人のコードが広まったんだろうなぁ。
AlexaのS3 adaperでgetPersistentAttributesがエラーを投げる時

s3 adapterはレコード（S3オブジェクト）が無いとエラーをthrowします。
なので初回起動時だけエラーになることがあります。

こういうヘルパー関数入れておくと、回避できます。

### Typescript
```typescript
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const getPersistentAttributes = async <Attributes = {[key: string]: any}>(handlerInput: HandlerInput, defaultAttributes: Attributes): Promise<Attributes> => {
    try {
        const data = await handlerInput.attributesManager.getPersistentAttributes()
        if (!data) return defaultAttributes
        return data as Attributes
    } catch (e) {
        return defaultAttributes
    }
}
```

### Node.js

```javascript
const getPersistentAttributes = async (handlerInput, defaultAttributes = {}) => {
    try {
        const data = await handlerInput.attributesManager.getPersistentAttributes()
        if (!data) return defaultAttributes
        return data
    } catch (e) {
        return defaultAttributes
    }
}
```

## めんどくさいという人へ
ライブラリにこのコードいれてます。
https://github.com/ask-utils/ask-utils/blob/master/libs/attributeManager.ts#L21

```bash
$ npm i -S ask-utils
```

Hosted skillならpackage.jsonにこうかけばOK

```
“ask-utils”: “2”
```

```
const { getPersistentAttributes } = require(‘ask-utils’)

const att = await getPersistentAttributes(handlerInput, {count: 0})
```
Microsoft Flow：オブジェクト(JSON）を作成し、配列に追加。オブジェクト配列をCSVファイルにエクスポート

# 仕様

## 全体の流れ

1. オブジェクト(JSON）を格納する配列変数を初期化。(アクション＞変数＞変数を初期化する）
2. 「Do Until」のループカウンタ変数を初期化。(アクション＞変数＞変数を初期化する）
3. 「Do Until」を設定。
4. 「Do Until」内で、ループの継続条件を設定。
5. 「変数の値を増やす」でカウンタの値を増加。
6. 「データ操作」の「作成」でオブジェクト（JSON)を作成
7. 「変数」の「配列変数に追加」でオブジェクトを配列に追加
8. オブジェクト配列をCSVデータに変換
9. CSVデータをOneDriveにファイルとして出力


![pr01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/20ff9381-b287-bb37-8b6e-cfd0de2b7aed.png)


## 詳細

　1. オブジェクト(JSON）を格納する配列（アレイ）を定義

　2. 「Do Until」ループで利用するカウントを定義

![pr1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/a70413c8-62ad-e863-2560-315059aca4f4.png)


　3. 「Do Until」で、カウンタが指定値になるまで処理を繰り返す。

![pr2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/78feac39-0da7-1486-a1b5-54f3ac6adcdd.png)

　4. オブジェクト(JSON）は、アクションの「データ操作」＞「作成（データ操作）」を指定。

![pr3-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/b913371b-cdeb-3bb5-ec27-43223333099c.png)


　5. 項番4で作成したアクションの「入力」にオブジェクトを記載します。
　　今回は、「name」と「age」を項目にして、以下の仕様で値を設定しました。
　　name : make_[カウンタの値]、age:[カウンタの値]

![pr3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/1a440331-78e2-9ec8-9524-0b14fc4a8dcc.png)

　6. 項番5のオブジェクトを項番1で作成した配列に追加。
　
![pr5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/fe9cc084-2551-b093-4a77-bf0918f8a7ef.png)

　7. 「Do Until」ループで作成したオブジェクトの配列をCSVに変換。アクションの「データ操作」＞「CSVテーブルの作成」を指定。

![pr6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/baec3990-e88d-4291-d070-c198b1130cf3.png)

　
　8. 項番7で指定したCSV作成アクションに、「Do Until」ループで作成したオブジェクト配列を指定。

![pr7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/70cd5903-c7dc-5deb-538c-31229eae2cd7.png)

　9. CSVの内容をOneDriveを保存先としてファイルに出力

![pr8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/3124855f-1b50-0b71-e897-167427a5d190.png)

　10. CSVファイルにオブジェクト配列が出力される。

![pr10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/e9b9bcaa-bff3-63f2-2aca-48f4e7d512c9.png)
GlobalIDでセレクトボックスのグループ化(polymorphic)

# Globalid

[rails/globalid](https://github.com/rails/globalid)

```rb
irb(main):001:0> dog_gid = Dog.find(1).to_global_id
=> #<GlobalID:0x00007fa353e34588 @uri=#<URI::GID gid://global-id/Dog/1>>

irb(main):002:0> dog_gid.uri
=> #<URI::GID gid://global-id/Dog/1

irb(main):003:0> dog_gid.to_s
=> "gid://global-id/Dog/1"

irb(main):005:0> GlobalID::Locator.locate dog_gid
=> #<Dog id: 1, name: "ハスキー", created_at: "2019-07-06 23:59:43", updated_at: "2019-07-06 23:59:43">
```

# セレクトボックスのグループ化

ポリモーフィックのデータ構造のセレクトボックスのグループ化(grouped_collection_select)に利用してみた

## アウトプット(html)

<img width="223" alt="スクリーンショット 2019-07-07 9.47.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7086/b9d6d5b3-7dcd-3d8d-905a-96c9034c59b1.png">


```html
<div class="field">
    <select name="animal[global_target_id]" id="animal_global_target_id">
        <optgroup label="Dog">
            <option value="gid://global-id/Dog/1">ハスキー</option>
            <option value="gid://global-id/Dog/2">ゴールデンレトリバー</option>
            <option value="gid://global-id/Dog/3">コーギー</option>
        </optgroup>
        <optgroup label="Cat">
            <option value="gid://global-id/Cat/1">雑種</option>
            <option value="gid://global-id/Cat/2">スコティッシュ・フォールド</option>
            <option value="gid://global-id/Cat/3">アメリカン・ショートヘア</option>
        </optgroup>
    </select>
</div>
```

## 実装

サンプル実装

+ model

```rb
class Animal < ApplicationRecord
  belongs_to :target, polymorphic: true

  def global_target_id
    self.target.to_global_id.to_s if target.present?
  end

end
```
```rb
class Dog < ApplicationRecord
  has_one :animal, as: :target

  def global_id
    self.to_global_id.to_s
  end

  class << self
    def human_model_name
      model_name.human
    end
  end

end
```
```rb
class Cat < ApplicationRecord
  has_one :animal, as: :target

  def global_id
    self.to_global_id.to_s
  end

  class << self
    def human_model_name
      model_name.human
    end
  end

end
```

+ view

```erb
<%= form_with(model: animal, local: true) do |form| %>

  <div class="field">
    <%= form.grouped_collection_select :global_target_id, [Dog, Cat], :all, :human_model_name, :global_id, :name, {}, {} %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>
```

+ controller

```rb
# POST /animals
# POST /animals.json
def create
  @animal        = Animal.new
  @animal.target = GlobalID::Locator.locate animal_params[:global_target_id]

  respond_to do |format|
    if @animal.save
      format.html { redirect_to @animal, notice: 'Animal was successfully created.' }
      format.json { render :show, status: :created, location: @animal }
    else
      format.html { render :new }
      format.json { render json: @animal.errors, status: :unprocessable_entity }
    end
  end
end
```
【2019 7/23開催】エンジニア視点で見るEC-CUBE DAYのセッションまとめ

7/23に浅草橋で開催されるイベント[「EC-CUBE DAY 2019」](https://www.ec-cube.net/events/eccube_day_2019/)のセミナーがエンジニア視点でも面白そうなものが多数あったのでまとめてみた。

# そもそも[EC-CUBE DAY2019](https://www.ec-cube.net/events/eccube_day_2019/)とは

株式会社イーシーキューブが主催するECに関するカンファレンス。
今年は「共に変えるショッピング体験」をテーマにしており、技術からマーケティングまで様々なセッションが聞けるイベント。

イベントサイトは[こちら](https://www.ec-cube.net/events/eccube_day_2019/)
イベントの申し込みは[こちら](https://eccubeday2019.peatix.com/)


# 気になるセッションまとめ

詳しくは公式ページの[タイムテーブル](https://www.ec-cube.net/events/eccube_day_2019/#timetable)を参照。

## エンジニア向け

- **【Room1】13:00 - 14:30**
  - 安心快適なショッピング体験を支えるEC-CUBEサイトのセキュリティ施策について
  - EGセキュアソリューションズ株式会社 徳丸 浩 氏
- **【Room1】16:00 - 16:30**
  - EC-CUBE4のアーキテクチャとこれから
  - 株式会社イーシーキューブ　奥 清隆
- **【MainHall】17:00 - 18:00**
  - Better, faster shopping experiences,powered by AMP
  - Google Paul Bakaus 氏

## 技術 × ショッピング

- **【Room0】13:00 - 13:30**
  - ネットショップから音声ショッピングまで～Amazon Payの導入効果・事例を一挙公開～
  - アマゾンジャパン合同会社　江 建 氏
- **【MainHall】14:00 - 14:30**
  - 最新事例に学ぶInstagramショッピング機能＆マーケティング活用法
  - フェイスブック ジャパン株式会社 丸山 祐子 氏
- **【MainHall】15:00 - 15:30**
  - 顧客体験革新を支える最新デジタルと流通業の取組
  - 日本マイクロソフト株式会社　藤井 創一 氏
- **【Room0】17:00 - 17:30**
  - 商品画像からみる未来につなぐ動画とSNSの活用方法！
  - 株式会社Refine　大塚 和男 氏
- **【Room4】13:00 - 18:30**
  - コミュニケーションスペース
  - EC-CUBEコミュニティ

# 一言セッション紹介

各セッションを一言で紹介。セッション内容は変更になることもあるので、詳しくは公式の[イベントページ](https://www.ec-cube.net/events/eccube_day_2019/#timetable)を確認してください。

## 安心快適なショッピング体験を支えるEC-CUBEサイトのセキュリティ施策について

【Room1】13:00 - 14:30
スピーカー: EGセキュアソリューションズ株式会社 徳丸 浩 氏

**セキュリティの第一人者 徳丸浩先生**による**セキュリティ**に関するセッション。
クレジットカード情報漏えいをテーマに、デモを交えた情報漏えい事件の手口の紹介や具体的な対策について学べる。

## EC-CUBE4のアーキテクチャとこれから

【Room1】16:00 - 16:30
スピーカー: 株式会社イーシーキューブ　奥 清隆

株式会社イーシーキューブのCTO kiy0taka 氏による**EC-CUBE**に関するセッション。
EC-CUBE4のフレームワークを**Symfony**ベースに一新した話や、**PurchaseFlow**や**受注ステートマシン**などEC-CUBE4で導入されたの独自実装について学べる。

## Better, faster shopping experiences,powered by AMP

【MainHall】17:00 - 18:00
スピーカー: Google Paul Bakaus 氏

Googleのリードエンジニアで、jQuery UIの開発者でもある **Paul** 氏の**AMP**に関するセッション。
国内ではなかなか聞くことができない**AMP開発の第一人者**から、AMPの活用法や導入事例について学べる。
**英語**のセッションで、**日本語通訳**も入る予定。

## ネットショップから音声ショッピングまで～Amazon Payの導入効果・事例を一挙公開～

【Room0】13:00 - 13:30
スピーカー: アマゾンジャパン合同会社　江 建 氏

**AIスピーカー × ショッピング**
**Alexa**での**音声ショッピング**に関する最新導入事例について学べる。
また、AmazonのブースでAlexaスキルを使った音声ショッピングを体験できる。

## 最新事例に学ぶInstagramショッピング機能＆マーケティング活用法

【MainHall】14:00 - 14:30
スピーカー: フェイスブック ジャパン株式会社 丸山 祐子 氏

**Instagram × ショッピング**
ますますの盛り上がりを見せる**Instagramショッピング**の最新事例と最新動向について学べる。

## 顧客体験革新を支える最新デジタルと流通業の取組

【MainHall】15:00 - 15:30
スピーカー: 日本マイクロソフト株式会社　藤井 創一 氏

**Microsoft × ショッピング**
日本マイクロソフト株式会社によるセッション。記事作成時点でセッション概要未発表。
Azureなどのマイクロソフトのプロダクトのショッピングでの活用事例について学べると予想。

## 商品画像からみる未来につなぐ動画とSNSの活用方法！

【Room0】17:00 - 17:30
スピーカー: 株式会社Refine　大塚 和男 氏

**動画 × ショッピング**
**5G**と共に訪れるであろう**動画コマース**について先取りして学べる。

## コミュニケーションスペース

【Room4】13:00 - 18:30
オーガナイザ: EC-CUBEコミュニティ

スピーカーや参加者と**コミュニケーション**が取れるスペース。
**エンジニア**や**制作会社**の方々と**情報交換**したり**相談**したりできる。
休憩時間にはミニセッションが開かれるかも？

# まとめ

どのセッションも気になる内容ばかりです。
セッションの選択は計画的に！

イベントサイトは[こちら](https://www.ec-cube.net/events/eccube_day_2019/)
イベントの申し込みは[こちら](https://eccubeday2019.peatix.com/)
再提出レポート（機械学習）

第１章：線形回帰
ボストン住宅価格
![ML-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435808/34e93994-f191-2e71-225d-6f8a9c840497.jpeg)

![ML-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435808/6c22befc-ec44-7b98-0c84-63e8df4f3df7.jpeg)
![ML-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435808/c8e0a07e-382f-6c06-b005-e9486f3b9278.jpeg)
モデルの検証
![ML-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435808/1db0332f-3b93-b3e9-02ca-95526c073e6c.jpeg)

学習用データ、検証用データとも残差が０に近い位置に分布している。


第２章：非線形回帰

![ML-5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435808/ef6b08e6-eb81-9751-4eae-bb693779cc51.jpeg)
![ML-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435808/35dd6ea5-fd37-7fbf-f2e4-819ec93d90e4.jpeg)
正則化法のRidge推定量を使用
![ML-7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435808/bc35ad98-6664-8e07-980c-425cefd76f2b.jpeg)



第３章：ロジスティック回帰
タイタニックデータ
・チケット価格からの判別
![ML-8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435808/5ff07651-8569-fd0e-d5a0-eb5858df8140.jpeg)
![ML-9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435808/647dd6fd-8d0d-84b6-072e-69f1388ce4d8.jpeg)


第４章：主成分分析
![ML-10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435808/9922096d-b28e-f143-a3f4-99a1769834a6.jpeg)
![ML-11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435808/f9c2bff6-03ce-8b7a-0ecb-7214c763cf83.jpeg)
![ML-12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435808/5effa4c7-179d-abee-abd6-4e5991b2d5f3.jpeg)
![ML-13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435808/ade0d83c-2c25-c0aa-d812-27ab54b4070f.jpeg)
連想配列の特定のキーの値が同じものを一つに絞る

自分で調べていてあまり適切なものがネットで見つからなかったので、ここに残しておきます。
言語はPythonで書いておりますが、他の言語でも応用できるので、コメントを中心に読んでいってください。

```python
# ピカチュウが被っているので
data = [
    {"species": "ピカチュウ", "color": "yellow" , "animal": "ねずみ"},
    {"species": "カイリュー", "color": "orange" , "animal": "ドラゴン"},
    {"species": "ヤドラン", "color": "pink" , "animal": "やどかり"},
    {"species": "ピカチュウ", "color": "orange" , "animal": "ねずみ"},
    {"species": "ビジョン", "color": "purple" , "animal": "とり"},
    {"species": "コダック", "color": "yellow" , "animal": "あひる"},
    {"species": "ピカチュウ", "color": "white" , "animal": "ねずみ"}
]

# こうして、ピカチュウを一つにしたい
new_data = [
    {"species": "ピカチュウ", "color": "yellow" , "animal": "ねずみ"},
    {"species": "カイリュー", "color": "orange" , "animal": "ドラゴン"},
    {"species": "ヤドラン", "color": "pink" , "animal": "やどかり"},
    {"species": "ビジョン", "color": "purple" , "animal": "とり"},
    {"species": "コダック", "color": "yellow" , "animal": "あひる"}
]
```

## コード
```python
data = [
    {"species": "ピカチュウ", "color": "yellow" , "animal": "ねずみ"},
    {"species": "カイリュー", "color": "orange" , "animal": "ドラゴン"},
    {"species": "ヤドラン", "color": "pink" , "animal": "やどかり"},
    {"species": "ピカチュウ", "color": "orange" , "animal": "ねずみ"},
    {"species": "ビジョン", "color": "purple" , "animal": "とり"},
    {"species": "コダック", "color": "yellow" , "animal": "あひる"},
    {"species": "ピカチュウ", "color": "white" , "animal": "ねずみ"}
]

# 重複を削りたいkeyの値を追加していく配列
species_array = []
# 新たにできる連想配列
new_data = []

# データ１つ１つに処理を行う
for pokemon in data:
    # 重複を削りたいkeyの値を変数に入れる
    species = pokemon["species"]
    # 重複を削りたいkeyの値を追加した配列に同じ値がなければ
    if(species not in species_array):
        # 重複を削りたいkeyの値を追加した配列に新たな値を追加して
        species_array.append(species)
        # 新たにできる連想配列にデータを追加する
        new_data.append(pokemon)
```


「他にもこんなやり方あるよ」とか、
「こういうコードの応用方程式集みたいなものあるよ」とか、
コメント残していってもらえると助かります。
Apacheの自動起動設定

# 自動起動を確認

```shell
$ sudo chkconfig --list httpd
httpd          	0:off	1:off	2:off	3:off	4:off	5:off	6:off
```

# Linuxでのランレベル

|  ランレベル  |  説明  |
| ---- | ---- |
|  0  |  インスタンス停止  |
|  1  |  シングルユーザモード(rootのみログイン可)  |
|  2  |  ネットワーク通信なしのマルチユーザモード  |
|  3  |  マルチユーザモード(通常の起動状態)  |
|  4  |  未使用  |
|  5  |  グラフィカルユーザインターフェースが起動する状態  |
|  6  |  インスタンス再起動  |


# httpdの自動起動を設定

```shell
$ sudo chkconfig httpd on
$ sudo chkconfig --list httpd
httpd          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```

# httpdの自動起動設定の解除

```shell

$ sudo chkconfig httpd off
[ec2-user@ip-172-31-89-52 ~]$ sudo chkconfig --list httpd
httpd          	0:off	1:off	2:off	3:off	4:off	5:off	6:off
```


### (補足)インストールから起動まで


```shell

$ sudo yum -y update
$ sudo yum install -y httpd
$ sudo service httpd start
```
Pythonを始めたときに知っておくと便利な小技集

# はじめに
最近、Pythonを勉強し始めて、「[退屈なことはPythonにやらせよう](https://www.amazon.co.jp/%E9%80%80%E5%B1%88%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AFPython%E3%81%AB%E3%82%84%E3%82%89%E3%81%9B%E3%82%88%E3%81%86-%E2%80%95%E3%83%8E%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AB%E3%82%82%E3%81%A7%E3%81%8D%E3%82%8B%E8%87%AA%E5%8B%95%E5%8C%96%E5%87%A6%E7%90%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Al-Sweigart/dp/487311778X/ref=cm_cr_arp_d_product_top?ie=UTF8)」という本で勉強していったときに参考になった小技集の紹介です。その他、便利な小技がありましたら、ぜひご教授の方、お願いします！

# 小技集
## 配列
### タプル型
( )を用いてリスト型のように表現する。基本的には、大かっこ[ ]で記述するリスト型とほぼ同じ。リスト型との違いは、**初期化後は再代入不可（イミュータブル）**であること。以下に例を示す。他の実装者にこの配列は、変更するつもりがないことを意図させる時に便利。

``` python
>>> li = ("a", "b")
>>> li[0] = "c"
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
```

### 要素指定
コロン（:）を用いて、要素の範囲を一括に指定することが可能。例えば、「3~5文字目がほしい」、「2文字目以降がほしい」とかいう時に便利。

例）文字列の3~5文字目が欲しい

``` python
>>> li = "abcdef"
li[2:4]
'cd'
```

例）文字列の2文字目以降が欲しい

``` python
>>> li = "abcdef"
>>> li[1:]
'bcdef'
```

### enumerate関数
for文時にindexとkey(要素)の両方が取得することができる。

``` python
>>>li = "abcdef"
>>>for idx, key in enumerate(li):
>>>    print("idx: " + str(idx) + ", key: " + key)
...
idx: 0, key: a
idx: 1, key: b
idx: 2, key: c
idx: 3, key: d
idx: 4, key: e
idx: 5, key: f
```

## 文字列操作
### join関数
引数として指定された配列を指定された文字で結合する。以下のように用いる。例えば、csvでカンマ(,)で区切った要素にしたいという時に便利。

例） str1の要素をカンマ区切りで取得

``` python
>>>str1 = "abc"
>>>",".join(str1)
'a,b,c'
```

例） str1とstr2の要素をカンマ区切りで取得

``` python
>>>str1 = "abc"
>>>str2 = "def"
>>>",".join([str1, str2])
'abc,def'
```

### raw文字列
文字列を生のまま扱うことが可能。つまりわざわざエスケープシーケンスを挿入することなく文字列を表現することができる。文字列の先頭に「r」を付与することで指定可能。正規表現の文字列に良く用いられる。

例）　改行を生のまま扱う

・raw文字列を用いない場合

``` python
>>>str = "\\n" # エスケープシーケンスを2回使う必要がある
>>>print(str)
\n
```

・raw文字列を用いる場合

``` python
>>>str = r"\n" # 生のまま表現可能（"\\n"と変換してくれる）。
>>>print(str)
\n
```

## デバッグ
### logging関数
様々なログ情報(実行時間、ログレベル、ログファイルの出力先の指定etc.)の出力ができる。説明や実装は[こちら](https://qiita.com/__init__/items/91e5841ed53d55a7895e)の方がすごく良くまとめられています。個人的には実行した行が出力できるlinenoがおすすめです。

```python
logging.basicConfig(format='%(asctime)s - %(lineno)s - %(message)s')
```

### \_\_repr__関数
クラスをprint関数にそのまま渡すと\_\_repr__を変わりに呼んでくれる。同様に\_\str__関数があり、こちらが定義されている場合には\_\_str__関数が優先して呼ばれる。ちなみアンダースコア2つで囲まれている関数を特殊メソッドと呼ぶそうです。**デバッグ時にクラスのメンバ変数まとめて出力したい**という時に便利。

```python
>>> class Foo:
...     def __init__(self, a, b):
...         self._a=a
...         self._b=b
...     def __repr__(self):
...         return "_a: " + self._a + ", _b: " + self._b

>>> foo = Foo("abc", "def")
>>> print(foo)
_a: abc, _b: def
```

# 謝辞
@shiracamus様から\_\_repr__関数について\_\_str__関数に関するご指摘を受けて訂正させていただきました。ご指摘ありがとうございますm(_ _)m
Oracle Java Silver に受かったので記録

#出題傾向
皆さん書いている通り、黒本から大量に出題されます。
私は黒本しか勉強しませんでしたが、１冊全部勉強したところ９５％くらい見覚えのある問題でした。
７７問中３問くらい見覚えがなく、異常に問題文の長い（パッと見で明らかに毛色が違う）ものが出ますが、黒本の巻末模試で１００点取れるようになっていれば３問落としても関係ないのでさっさと見直しフラグつけて適当に選んでから余った時間で見直せばいけます。

一字一句、全く同じ問題が大量に出ます。ポリモーフィズムについてとか、拡張for文について語群から２つか３つ選べ、みたいなものは誤答も含めて全く同じでした。
問題文を読まずに選択肢を見ただけで答えがわかります。

その他もクラス名か変数名が変わってるだけで中身は全く同じ問題も多数。
黒本でA extends B{}となっているのがcar extends vehicle とか cat extends Animalとかになっているだけで中のコードがそのまま。

多重配列の２重ループも選択肢見ただけで分かったりしました。

逆に黒本を勉強せずに解くのはJavaのベテランでも至難の技だと思います。
半数以上がナゾナゾじみた引っ掛け問題なので。

#気をつけるべき事
これから目指す方はとにかく体調に気をつけてください。
試験前の三日前には規則正しい生活を心がけたほうがいいです。

- トイレに行けない（時間がすぎるだけでなく、一度出たら戻れないのでその場で失格。）
- 鼻水も拭けない。汗も拭けない。　（ティッシュもハンカチも洗顔シートも禁止）
- 水分補給等禁止
- 目が乾いても目薬をさせない。
- 腰が痛くても立ち上がれない。

などなど。150分間もこれを我慢するのは大変です。

##体調対策
１週間前くらいから、ご飯を食べた後、どれくらいでお腹が痛くなったりしてトイレに行きたくなるか１時間単位くらいで把握しておく。
当日はそれを逆算して、絶対に試験中にお腹が痛くならない時間帯に軽く食べておく。
逆に抜いてしまうのも禁物。お腹が空いていると集中力が切れるからです。
同様に水分も飲んでからいつトイレに行きたくなるか把握しておく。
その少し前に飲んでおく。

試験直前には催してなくても必ず最後にトイレに行っておく。出なくてもいい。試験中に後悔しなくなるから。

試験会場は下見しておくか、最寄駅には１時間くらい前につくようにしておく、30分前くらいでも受けられるのでトイレが済んで、汗拭いたら即受ける。

試験の三日前くらいからエアコンを冷やしすぎないように注意しておく。ちょっと暑いかなってくらいになれておく。
ティッシュは使えないので、最悪風邪ひいたら鼻水拭いても平気なシャツでも着ていくしかない。

私の場合、上記の対策をやってなんとかトイレと鼻水は大丈夫でした。

それでも結構きつい頭痛に苛まれました。頭が痛くなったらヘッドフォン外した治りました。
ヘッドフォンに慣れていない人はそれも気をつけてください。
とはいえつけなかったら周りのキーボードの音とか割と気になります。
bootstrap4では最小サイズがcol-xsでなく、col-で指定することになっている

bootsrap３ではcol-xsが最小単位となっていたが、bootstrap4ではcol-が最小単位になっている。

例えば、col-mdまでは横並びで、それ以下では日付で改行したいときは

```html
<h2>ニュース</h2>
<div class="news-list">
		<div class="row d-flex align-items-center text-left">
		    <div class="col-lg-3 col-md-3">2019年5月1日</div>
		        <div class="col-lg-3 col-md-3 col-3">
		            <button class="btn btn-primary tag-green">お知らせ</button>
		        </div>
		    <div class="col-lg-6 col-md-6 col-9 pt-2">サンプルテキストです。サンプルテキストです。</div>
		</div>
</div>
```

みたいな感じになる。
constメンバ関数を知らずにC++使ってるんですか？

## const修飾子とは
`const修飾子`は、オブジェクト変更を行わない(行いたくない)型や変数宣言、メンバ関数につける修飾子です。
本記事では、その中でも特に重要な`constメンバ関数`について紹介します。

## constメンバ関数がなぜ重要か
どこでオブジェクトが書き換わるかわからないとバグを埋め込みやすくなってしまいます。
そこで`constメンバ関数`を使って、const操作、非const操作をわけて定義することで、書き換えの影響範囲を小さくする方法を説明します。

```main.cpp
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Person
{
 public:
    void print() const{cout<<name;}
    void set(string const& str){name=str;}
private:
    string name;
};

 //実行できない
void f(Person const& p)
{
  p.name="abc";
}
void g(vector<Person> const& v)
{
  v.at(0).set("aaa");
}


int main()
{
  Person p;
  Person const& p2=p;
  vector<Person>v;
  g(v);//const修飾子がついているため、変数の中身を書き換えることができない
  f(p);//ｆも同様
}

```

関数の引数にconstをつけると、オブジェクトを変更できなくなります。

``` main.cpp
#include<iostream>

class Person
{
public:
  mutable std::string name;
  void print() const{std::cout<<name;}
};

void f(Person const& p)
{
  p.name="aaa";
}

int main()
{
  Person p;

  f(p); // mutableがついていると値の変更が可能
  p.print(); //aaaと表示される
  return 0;
}
```

このように書き換える必要のある変数には`mutable修飾子`をつけることで、オブジェクトの書き換えができるようになります。

## 最後に
`constメンバ関数`を正しく定義されていないクラスは、扱いにくいクラスになってしまいます。
開発チーム全員で、`constメンバ関数`の重要性を理解し徹底していくべきでしょう。

また、この記事では紹介しませんが、 `const_cast` を使うことで強制的に非const型にキャストすることもできます。
もちろん`mutable`や`const_cast`は慎重に扱う必要があります。
【Swift】 UITextFieldに文字数制限を設ける方法

### 前置き

少し久しぶりのQiita投稿。
（自作アプリ公開に向けて日々いろいろやってたんですが、細かいトコの修正やら稼動確認してると、今までの反復に当たる部分でぶつかる壁が多くて、あまり目新しい収穫がなかったので。）

さて表題の件。
ブログ等を参考にしても、エントリ時期から時間が経ってSwiftの書き方にギャップが出たり、(日本語入力もカバーするか、という点で)実装の仕方に違いがあったりで、マネしてみても自分の想定する実装にならないコトが多い。
最終的に、いささか記事のエントリ時期としては古くて、少しSwift5に対応するために修正は必要だったけれど、下記「参考」記載のURLのブログエントリが自分なりに一番取り込みやすい内容でした。

### 開発環境

端末:MacBook Pro/MacOS 10.14.5(Mojave)
Xcode:10.2.1
Swift:5

### 実装内容

「こういうコトやりたい」だけ前置きに書いていても、
実際、下記のソースで何ができるようになったかが伝わりづらいかもしれないので、
どんなコトがどんな風にできるのか、できるだけ書くようにしようかな、と。
<font color="lightgray">（今回は画面イメージもないので）</font>

・UITextFieldに対する、入力文字数の制限。
・日本語入力（入力→変換→確定、というプロセス）でもOK。
　入力確定時に制限文字数以上であれば切り捨てる。
・あくまで制限文字数のある項目１つに対する入力制限の実装。
　（複数の項目で、それぞれ制限文字数が異なるような場合、別途カスタマイズは必要。）
・


### ソースサンプル

```swift:ViewController.swift

class ViewController: UIViewController, UITextFieldDelegate {

    // 入力チェックを行うUITextField
    @IBOutlet weak var myTextField: UITextField!
    // 入力可能な最大文字数
    let maxLength: Int = 5

    override func viewDidLoad() {
        super.viewDidLoad()

        myTextField.delegate = self        

        // myTextFieldの入力チェック(文字数チェック)をオブザーバ登録
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(textFieldDidChange(notification:)),
                                               name: UITextField.textDidChangeNotification,
                                               object: myTextField)
    }

    // オブザーバの破棄
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    
    // 入力チェック(文字数チェック)処理
    @objc func textFieldDidChange(notification: NSNotification) {
        let textField = notification.object as! UITextField
        
        if let text = textField.text {
            if textField.markedTextRange == nil && text.count > maxLength {
                textField.text = text.prefix(maxLength).description
            }
        }
    }

        ...    
}

```

### 参考
・雑食プログラミング備忘録
　[iOS] UITextFieldの最大文字数を設定する
　http://chicketen.blog.jp/archives/50002171.html

### 感想

会社での担当業務としてHTMLを触るコトが多いのもあって、UITextFieldの文字数制限くらいStoryboardでチャチャっと設定できると思っていたトコロから、気づいたら実装・稼動確認、そしてここへアウトプットするのも合わせるとフツーに２、３時間経ってました。
英語入力だけの文字数制限だけなら割とすぐにできたトコロから、日本語に対応したモノへ発展させるのにけっこう悩まされました。

Swift2,3の頃の記事が多くて、Swift4,5だと書き方が全然違って来てる(もしくは同じ挙動にならない)っていうコトに割と出くわすので、自分自身がSwift５で色々試して、そのギャップを埋めるコトにささやかながら貢献できれば嬉しいです。
Windowsデスクトップアプリケーションの種類について

# はじめに
Visual Studioで開発できるWindowsデスクトップアプリケーションの種類をまとめてみました。

# 注意
visual studioの標準機能で作成できるものに限定しています。

# アプリ種別

## Win32
かつてよくつかわれていたWindowsデスクトップアプリケーション。Win32APIに対応したWindowsでのみ動作。

## Windows Form
.NET Frameworkを利用するWindowsデスクトップアプリケーション。対応した.NET FrameworkがインストールされたWindowsで動作。

## WPF(Windows Presentation Framework)
Windows Formアプリの次世代。XAMLというhtmlに似たマークアップ言語が特徴。解像度に依存しないアプリケーション描画を実現することを目的としている。

## UWP(Universal Windows Platform)
Windows Formアプリの最新世代。PC、Mobile、XBOX、HoloLensなど様々なデバイスで動作するグラフィカルなアプリケーションを開発することができる。
<font color="red">※2017年、Windowsモバイルは実質の終了に至っているため、デバイス互換機能は大したメリットになっていない。</font>

### まとめ
||言語|世代|配布難易度|配置方法|
|:-:|:-:|:-:|:-:|:-:|
| Win32 | C++ |1| 〇 | Windowsインストーラ |
| Windows Form | C#,VB|2| ◯ | Click Once |
| WPF |C#,VB|3| ◯ | Click Once |
| UWP |C#,VB|4| △ | Microsoftストア or プライベートストア or サイトローディング |


# 参考

- Windows フォームの概要 https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/windows-forms-overview
- WPFの概要 https://docs.microsoft.com/ja-jp/visualstudio/designers/introduction-to-wpf?view=vs-2019
- Windows10モバイルの終わり https://www.itmedia.co.jp/pcuser/articles/1710/12/news040.html
JFreeChart-XYインターヴァルチャート-平面上に四角の領域を描く-DefaultIntervalXYDatasetを使用


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.data.xy.DefaultIntervalXYDataset;

/**
■ JFreeChart-XYインターヴァルチャート-平面上に四角の領域を描く-DefaultIntervalXYDatasetを使用

・XYインターヴァルチャートは平面上に複数の四角が描かれるもの.
  ・例えば地図上に建物面積に応じた四角が表示されているようなチャートである.
  ・DatasetはDefaultIntervalXYDatasetを使用する.
  ・Rendererには、XYBarRendererを使用する.
・DefaultIntervalXYDataset
  ・DefaultIntervalXYDatasetはdouble[6][N]のデータを要求する.その内容は次の通り
    ・[0][N]:x値
    ・[1][N]:xStart値
    ・[2][N]:xEnd値
    ・[3][N]:y値
    ・[4][N]:yStart値
    ・[5][N]:yEnd値
  ・"start","end"という名称に具体的な意味はない.単に名称.
  ・xStart,xEnd,yStart,yEndで四角領域が表示される.
  ・x値、y値は表示には使用されない.CrossHairValueとして使用される.
  ・注意、上記のことはAPIには書かれておらず、ソースを見て、実際に使って分かったことなので注意.

 */
public class Chart14_00 {
  // 目次-インターヴァルチャート-IntervalChart-DefaultIntervalXYDatasetを使用したもの
  A_Chart14 a_Chart14;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) {
    // DefaultIntervalXYDatasetの生成
    DefaultIntervalXYDataset ds;
    {
      ds = new DefaultIntervalXYDataset();
      double[][] values = new double[][] {
        new double[]{2.0D,3.0D,4.5D},  // x
        new double[]{1.9D,2.9D,4.4D},  // xStart
        new double[]{2.2D,3.1D,4.6D},  // xEnd

        new double[]{2.5D,3.5D,4.5D},  // y
        new double[]{2.4D,2.5D,3.5D},  // yStart
        new double[]{2.7D,4.0D,4.0D},  // yEnd
      };
      ds.addSeries("A",values);
      values = new double[][] {
        new double[]{0.8D,2.5D,5.0D},  // x
        new double[]{0.9D,2.6D,4.9D},  // xStart
        new double[]{1.2D,2.7D,5.1D},  // xEnd

        new double[]{4.5D,3.5D,3.1D},  // y
        new double[]{4.4D,3.5D,3.0D},  // yStart
        new double[]{4.7D,3.0D,3.2D},  // yEnd
      };
      ds.addSeries("B",values);
    }
    //
    XYBarRenderer  renderer = new XYBarRenderer ();
    renderer.setUseYInterval(true); // これを指定しないと単なる縦棒になってしまう⇒Xには同様の指定はない
    renderer.setShadowVisible(false); // 標準はtrue⇒影が表示される
    // Plotを作成して画面を表示する
    XYPlot plot = new XYPlot(ds,new NumberAxis(),new NumberAxis(),renderer);
    JFreeChart jfreeChart = new JFreeChart("XYインターヴァルチャート",(Plot)plot);
    ChartFrame cFrame = new ChartFrame("XYインターヴァルチャート",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }
}

```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/31c31e1e-b1f7-88bf-f289-8b02196beb58.png)
Railsで指定したディレクトリ以下のファイルを取得する時の解決方法

Railsで指定したディレクトリ以下のファイルを取得する時につまずいたので共有します。

## 環境
### バージョン
``` bash
$ rails -v
Rails 5.2.3
$ ruby -v
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-darwin18]
```

### ディレクトリ構成(該当部分のみ)
``` bash
app/commands/command.rb
app/commands/command/hoge_command.rb
app/commands/command/fuga_command.rb
app/commands/command/piyo_command.rb
```

## ソースコード
``` ruby
# app/commands/command.rb
class Command
  def initialize(command_name)
    files_abs_pass = Dir[File.expand_path("#{Rails.root}/app/commands/command/", __FILE__) << '/*.rb']

    files_abs_pass.each { |f| puts f }
    # /Users/user/work/rails/rails_app/app/commands/command/hoge_command.rb
    # /Users/user/work/rails/rails_app/app/commands/command/fuga_command.rb
    # /Users/user/work/rails/rails_app/app/commands/command/piyo_command.rb
  end
end
```

``` ruby
# app/commands/command/hoge_command.rb
class HogeCommand < Command
end
```

当初は[このページ](https://kurochan-note.hatenablog.jp/entry/2014/02/15/235706)を参考にしていたのですが、ファイル一覧を取得できなかったので変えました。

``` ruby
# 掲載元のコード
Dir[File.expand_path('../commands', __FILE__) << '/*.rb'].each do |file|
  require file
end
```

JavaのJSPでも同じような事象に悩まされていたので、解決方法はこれでいいんじゃないかって思えましたw(uriの指定)

もっとスマートに書けるはずなので、気が向いたらあとがきにでも書きます。。。（コメント頂けたらとても嬉しいです...!）

## 引用元
* [Rubyで指定ディレクトリ以下のファイルを全てrequireする方法](https://kurochan-note.hatenablog.jp/entry/2014/02/15/235706)
UnityのExceptionのStackTraceをサーバなどに送りたい

ILogHandlerで頑張るのかなと思ったら、Application.logMessageReceivedのほうで取れるらしいのですね。

```csharp:LogReporter.cs
using System;
using UniRx.Async;
using UnityEngine;

namespace Tonari.Unity.LogSystem
{
    public class LogReporter : IDisposable
    {
        public LogReporter()
        {
            Application.logMessageReceived += LogCallBackHandler;
        }

        public void Dispose()
        {
            Application.logMessageReceived -= LogCallBackHandler;
        }

        private void LogCallBackHandler(string condition, string stackTrace, LogType logType)
        {
            ReportLogAsync(condition, stackTrace, logType).Forget();
        }

        private UniTask ReportLogAsync(string condition, string stackTrace, LogType logType)
        {
            // ここでサーバに送ればいい

            return UniTask.CompletedTask;
        }
    }
}
```
validatorjs's wanna

JSバリデーションを手軽にできる `validatorjs` ですが、公式ドキュメントに記載しているルール `after:date` これにハマった。

> Available Rules
> after:date
> The field under validation must be after the given date.

一見、Laravelの `after` バリデーションルールと同じ形だが、結論から言うとここの `date` には直接日付文字列は渡せない。
例えばこんな感じ `after:2019-01-01` や `after:tomorrow` これはダメ。

このafterルールは基本的に同じフォームパラメータと比較するためのものらしい。
例えば、 `start_date` , `end_date` という２つのフォームパラメータが存在した際に、下記のように使用する。ちなみにこの after と同じ after_or_equal や before や before_or_equal なども同じ仕様。

```javascript
let data = {
  start_date: '2019-01-01',
  end_date: '2019-02-01'
};

let rules = {
    start_date: 'required|date',
    end_date: 'required|date|after:start_date',
};

let validation = new Validator(data, rules);
```
- validatorjs
  - https://github.com/skaterdav85/validatorjs
Javaで設定ファイル、クラスがロードされる順番を指定する

## 解決したい問題

- WARを実行するときに、訳あってクラスパス上に同名の設定ファイルが複数存在する場合に、ロードされる順番を指定したい
- 環境はWebSphere Liberty、Java8を想定
- 設定ファイル、クラスをクラスパスに含める方法として単純なものは以下の3種類がある。この3つの優先順位を確認したい
  - WARファイルに含める
  - JARファイルに含め、WARファイルのWEB-INF/libに配置する
  - WAR外部に配置する(Libertyのserver.xmlで`<library>`に指定する)

## 調査した結果

以下の順番となった。1と2はパッケージングの方法や環境依存ファイルの配置の都合上、自由に設定しにくいのでロード順を細かく指定したい場合は、WARの外部にJARを配置する形をとり、さらに`<library>`のなかで細かく順序を指定するのが良さそう。

1. WARファイルに含める
2. JARファイルに含め、WARファイルのWEB-INF/libに配置する
3. WAR外部に配置する(Libertyのserver.xmlで`<library>`に指定する)

具体的にはこのような形となる。`<library>`の子要素の指定順がクラスロードの順番となる。`<file>`だけでなく`<folder>`で指定する場合もXML要素の順番がクラスロードの順番となる。

```xml
<library id="mydir">
  <file name="/mydir/foo1.jar"/>
  <file name="/mydir/foo2.jar"/>
</library>

<webApplication location="/dir/bar.war">
  <classloader privateLibraryRef="mydir"/>
</webApplication>
```

## よくわからなかったこと

MANIFEST.MFの`Class-Path`指定でも同様の設定ができるのではないかと思えるのだが、WARに含めたMANIFEST.MFの`Class-Path`で指定した場合、なぜかクラスロードの対象にならないようだった。