OmniAICreator/Qiita-1.07M huggingface dataset:
【用語のまとめ】ビジネスプロセス系（BPM、BPMN、BPMS、BPR）

#概要

- BPM、BPMN、BPMS、BPRという略式表記だけだと何がなんだったか忘れてしまうので、まとめました。

#BPM
- Business Process Managementの略
- ビジネスプロセスマネジメント。ビジネス工程の管理手法。
- 組織（会社、団体など）に属する構成員（社員、職員など）が日常業務を行う上での対外プロセス（仕入、発注、販売など）、社内プロセス（申請フローなど）をPDCAサイクルを回して、継続的に改善する事

#BPMN
- Business Process Model and Notationの略
- ビジネスプロセスをモデル化する表記法。
- BPMのPDCAを回す為の技術
- ISO/IEC 19510の[国際規格](https://www.iso.org/standard/62652.html)として定義されている。

#BPMS
- Business Process Management System (or Suite) 
- ビジネスプロセスマネジメントシステム（or 一式）
- BPMを実現するための実行プラットフォーム

#BPR
- Business Process Reengineering
- ビジネスプロセスリエンジニアリング
- ビジネスプロセスの抜本的な見直し、改善を行うこと。
- BPMと似ている。違いは、BPMは日常業務を日々振り返り、継続的に見直し・改善活動を行うのに対してBPRは経営課題などで上がった単発の課題に対して、見直し・改善活動を行うこと。継続的活動⇔単発的活動


#参考にさせて頂いたURL
[“経営とITの融合”を実現するBPMとBPMSの基礎知識](http://www.atmarkit.co.jp/im/cae/articles/bpms/01/01.html)
[QUESTETRA BPM SUITE](https://questetra.com/ja/?gclid=Cj0KCQjwi8fdBRCVARIsAEkDvnJb-z3BhqOCnOcVam7_0nXipJqffQFKHv8dNF09w93X20FT0I8fBsMaAmdxEALw_wcB)
[第1回 BPMって要するに何？](https://www.ibm.com/developerworks/jp/websphere/library/bpm/bpm_intro/1.html)
[BPMとは](https://www.bpm-j.org/bpm/)
[Wikipedia - ビジネスプロセス管理](https://ja.wikipedia.org/wiki/%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%AE%A1%E7%90%86)
[ISO/IEC 19510:2013](https://www.iso.org/standard/62652.html)
[BPRを成功させる７つの心構え](http://nakazine.net/Entry/299)
bitnamiのredmineインスタンスを、Lightsailで立てる

今回は、www.domainname.comで立ち上がるredmineの立て方です。

## Lightsaleでインスタンスを作成する

Lightsailの画面から、インスタンスの作成ボタンを押す
以下のような感じで選択してください。
![スクリーンショット 2019-04-06 14.16.29.png](https://qiita-image-store.s3.amazonaws.com/0/52386/46eec24b-33a6-151e-95e4-eb24b7268a40.png)

インスタンスのプランは、$3.5で動いております
![スクリーンショット 2019-04-06 14.17.38.png](https://qiita-image-store.s3.amazonaws.com/0/52386/30cc5c1d-23a2-a540-51d7-19f427337cbf.png)

## 静的IPを作成する
Lightsailのネットワークタブから、静的IPの作成ボタンを押す
![スクリーンショット 2019-04-06 14.21.14.png](https://qiita-image-store.s3.amazonaws.com/0/52386/ac770381-5e4a-3c90-1c0a-8515f2a599f4.png)

## DNSゾーンを作成をする
Lightsailのネットワークタブから、DNSゾーンの作成ボタンを押す
作成する予定のドメイン名を入れます。
![スクリーンショット 2019-04-06 14.22.56.png](https://qiita-image-store.s3.amazonaws.com/0/52386/0e761a9e-ff15-5a40-3e9e-b1ba572938ed.png)

## Route53でドメインを取得する
Route53を開き、登録済みドメインを選ぶ。
ドメインの登録ボタンを押す。
ドメインを取得する。
何分か待たされます。。

## ネームサーバの修正
登録済みドメインを選び、取得したドメインをクリックします。
右のほうのネームサーバのところに、ネームサーバの追加/編集があるのでクリック
LightsailのDNSゾーンに記述してあるネームサーバを入れます。
最初に入っているやつは、削除しました。

## ホストゾーンの修正
Route53のホストゾーンをクリックします。
作成したドメインをクリックします。
タイプがNSのものが、ネームサーバなので、LightsailのDNSゾーンに記述してあるネームサーバを入れます。
最初に入っているやつは、削除しました。

レコードセットの作成ボタンを押します。
名前のところは何も入れずに、タイプはA-IPv4 addressを選びます。
Lightsailの静的IPを入力します。
レコード設置を保存します。

## LightsailのDNSゾーンにAレコードの追加を行う
Lightsailのネットワークタブの中から、DNSゾーン
レコードの追加を押します。
サブドメインのところに、wwwを入れます。
解決先には静的IPを入れます。選択式です。
レコードの作成を押します。
私はchromeだと動かなかったので、Firefoxでやりました。

## 完成
http://www.domainname.com

## ログイン
ちなみに、ログインユーザは、「user」になります。
![スクリーンショット 2019-04-06 18.02.51.png](https://qiita-image-store.s3.amazonaws.com/0/52386/e35df420-12d3-c819-e528-66573e5b6c50.png)

パスワードは、Lightsailから、コンソールのマークを押してコンソールを起動して、

```
cat bitnami_application_password
```
で見れます。
現場にコードレビューを定着させるためにやるべきこと

# 概要

コードレビューに否定的な現場の話をYYPHPで出したところ、改善策をいただいたので残します。

## コードレビューをしない理由

- レビューは時間がかかるからコストの無駄

## 時間がかかるからコストの無駄と思われてしまう原因

- レビューに回す時のコード量が多すぎる

## 対策

- PRの粒度を小さくする
- コミットの粒度を小さくする
- 誰が何をやってるかタスクを明確化する
- PRテンプレートを決めてどういうPRなのかをなわかる状態にしておく

## そもそもコードレビューは本当に必要なのか

- やばいコード書く人は普通にいるからコードレビューなりで止めるしか無い

## やばいコードとは

- なんでもセッションにデータを突っ込むとか
- 1クラス1万行のコードとか

## オススメの書籍

[レガシーコード改善ガイド](https://www.shoeisha.co.jp/book/detail/9784798116839)
Postgresqlへのクエリ結果をCSVファイルに次々出力する一例。

# はじめに
新人さんがはじめてデータベース絡みのシェルスクリプトを書く、あるいはいろいろ忘れちまったおっさんがうろ覚えでシェルスクリプトを書く際の一助になれば。
シェル芸とかの話では全くないです。


# シチュエーション
あなたは、小萌え感ある先輩（あるいは、怖え感ありの先輩）から、
>〇〇データベースから、月に何回か売上集計をしたいの。△△なクエリとか🔳🔳なクエリをかけてね。結果は、文字コードutf8でcsvファイルで欲しいの。よろぴく。

と言われましたとさ。


# 隣の先輩からのアドバイス

- 〇〇データベース : 今回はPostgresで書かれたデータベースなのでpsqlを使う。社内のPCには.pgpassでアクセス用のID/password設定済。
- 月に何回か売上集計をしたい : スクリプトの引数で集計する年月を指定。 すなわち、(${$1}年{$2}$月)
- △△なクエリとか🔳🔳なクエリ  : 複数のクエリをかけるので関数化が必要
- 結果は、文字コードutf8で　: 文字コードの変換が必要な時は、[nkf](https://www.atmarkit.co.jp/ait/articles/1609/29/news016.html)（Network Kanji Filterの略だとか）を使おう。
- csvファイルで欲しいの : psqlのオプション指定でいけるよ（ググろう）。
- よろぴく。 : 同僚の何人かが実行するだろうから文書化しておこう（略）

#お答え

出来上がった、ちょっとやっつけ感あるスクリプト。
ファイルの扱いとかもっと華麗にできたら素敵だね。 

```answer.sh
#!/bin/bash
# 引数処理
if [ $# -ne 2 ]; then
  echo "実行には、2個の引数（年月($1)、実行日($2)）の指定が必要です。" 1>&2
  exit 1
fi

# CSV出力関数　引数 : 年月($1)、実行日($2)、実行SQL($3)、prefix($4、任意)　
makeResult(){
  psql -U postgres -h ホストファイル -p 　ポート番号 -d データベース名 -f "oursqlfolder/$3" -A -F, > ./data/$1/$4_$1_$2.csv
  # utf8化したファイルを一時ファイルとして生成
  nkf -w ./data/$1/$4_$1_$2.csv > ./data/$1/utf8_$4_$1_$2.csv 
  # psqlの出力から最終行の『行数表示』を除去して書き戻し
  head -n -1 ./data/$1/utf8_$4_$1_$2.csv > ./data/$1/$4_$1_$2.csv　
  # 生成した一時ファイルを消去
  rm ./data/$1/utf8_$4_$1_$2.csv
  # デバッグ用 => echo "引数: \$1=$1 , \$2=$2 , \$3=$3, \$4=$4"
}

# 月別にフォルダを作成する
mkdir -p ./data/$1

# 関数呼び出し
makeResult $1 $2 "our_sql_01.sql" "営業１部"
makeResult $1 $2 "our_2019.sql" "営業２部"
# .... ほんとはもっともっとあるんだろうね。....
#生成されたCSVを一覧表示
ls -la ./data/$1
exit 0

```
実行例:
> answer.sh 201904 01

Have a good day!
Mobile IP

特集：モバイルIP技術詳解
https://www.atmarkit.co.jp/fnetwork/tokusyuu/15mobileip/mip01.html

第 1 章 モバイル IP について Oracle
https://docs.oracle.com/cd/E19455-01/806-4502/6jdj0vacb/index.html

Mobile IPの概要 情報通信ネットワーク特論 名城大学
http://www.wata-lab.meijo-u.ac.jp/file/lecture/icn/mobileip.pdf

 Mobile IP 張 冰冰 渡邊研
http://www.wata-lab.meijo-u.ac.jp/file/seminar/2007/2007-Semi1-Bingbing_Zhang.pdf

1 章 Mobile IP 執筆者:阪田史郎, 電子情報通信学会, 2010 年 5 月 受領
http://www.ieice-hbkb.org/files/04/04gun_05hen_01.pdf

Mobile IP概要 東芝 研究開発センター 通信プラットホームラボラトリー 井上 淳 
https://www.nic.ad.jp/ja/materials/iw/1999/proceedings/C09-2.PDF

モバイルIP技術
https://www.bcm.co.jp/site/2004/2004Dec/04ipv6topics12folda/04ipv6topics-12-107p-109p.pdf

Mobile IP for IPv6 砂原秀樹
https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_uri&item_id=64280&file_id=1&file_no=1

Mobile IPにおける経路最適化選択の検討　小川清
https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_uri&item_id=43998&file_id=1&file_no=1

場合分けによるMobile IP 経路制御最適化における登録方式について　小川清
https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_uri&item_id=166681&file_id=1&file_no=1

プライベートアドレスを3階層利用(3LPA)による大規模アドレス空間と移動 https://ci.nii.ac.jp/naid/110003181036/

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Windows10でClassic ASP（レガシーASP）実行環境を構築する

未だに使われるところでは使われているClassic ASP（[Active Server Pages](https://ja.wikipedia.org/wiki/Active_Server_Pages)）。
VBScriptやJScriptでサーバーサイド処理を記述して、IIS上で動くWebアプリを作ることができる技術です。

2000年以降一度もアップデートされてない枯れた技術ですが、Windows10でも実行環境を整えることができるのでその手順を紹介します。

# IISの有効化

IIS（Internet Information Services）はWindowsに標準搭載されているWebサーバ。
ASPはこれじゃないと動かせないので（頑張ればApacheでも動かせるらしい）、まずはIISを有効化する。

コンパネの「プログラムと機能」から「Windows機能の有効化または無効化」を選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/9cddf97c-afcb-4a13-64a8-90afe518eafc.png)

「インターネットインフォメーションサービス」をにチェックを入れる。
下層の機能にも勝手にチェックが入るが「ASP」にはチェックが入らないので自分で入れる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/d4b32856-3418-e6ee-ca8a-230739906499.png)

OKを押す。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/e9013f26-094b-72b4-7204-3fd054b30552.png)

有効化された。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/eb3cdbe6-f816-92c6-9be4-7d053f9eb6cb.png)

IISを有効化するとデフォルトのWebサイトが構成されるので、ブラウザで「[http://localhost/](http://localhost/)」にアクセスする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/eae0c7eb-143e-b37b-59bc-200987e968d6.png)

IISが立ち上がってることが確認できた。
（他のアプリとかが80番ポート使ってるとうまくいかないかも）

# Classic ASPを動かす

デフォルトページの階層が「C:\inetpub\wwwroot\」なので、ここに適当なASPファイルを作る。

```html:index.asp
<html>
<body>
<%
Response.Write "<p>Hello Classic ASP!</p>"
%>
<p><%= Now() %></p>
</body>
</html>
```

「[http://localhost/index.asp](http://localhost/index.asp)」にアクセス

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/714ed34b-0301-a4dc-c456-a2b2310be7d2.png)

これで最低限のASPの実行環境は整う。

# IISの設定

ただし、動かしたいASP Webアプリの構成によってはいくつか追加でIISの設定をしないと動かない場合がある。

IISマネージャーを起動する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96507/1c7c2baa-9766-0e68-ee9a-bf8ad653c189.png)

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/96507/a4262382-7612-ce5a-8d32-f481c3cf15b1.png)

## 64bit環境で32bitの外部コンポーネント（DLL）を呼び出している場合

Server.CreateObject()のところで、
「Microsoft VBScript 実行時 エラー '800a01ad' ActiveX コンポーネントはオブジェクトを作成できません。」
というエラーがでる。

「アプリケーション プール」を選択しサイトに指定している「アプリケーション プール」を選択。
右クリックから「詳細設定」を開き、32ビットアプリケーションの有効化を「True」にする。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/96507/26b87c7e-b10a-2667-8248-b457498e33f2.png)

32bit環境で動かしている場合は設定の必要はない。

## ドキュメントルートより上位の階層のファイルを読み込んでいる場合

デフォルトの設定では、ドキュメントルートより上位階層のディレクトリを参照することができない。
ドキュメントルートより上位階層のインクルードファイルなどを読み込んでいるWebアプリの場合、これを許可する必要がある（セキュリティ的によろしくないので本来は仮想ディレクトリで参照したほうがよい）。

サイトを選択し「ASP」を選択する。
ASPの構成プロパティが表示されるので、その中から「親パスを有効にする」を選び「True」にする。

![.png](https://qiita-image-store.s3.amazonaws.com/0/96507/fdee8c5e-a260-b66b-b5c6-73ecd8eaff76.png)

---

ちなみに、Windows Server2016でも「役割と機能の追加」から同じ手順で実行環境を用意できます。

まだまだ、長生きしそうですね…。
言いにくい開発スケジュールを顧客に伝える時に、後ろめたさを感じてしまう人へ

この記事は、あなたがエンジニアが見積もった期間をもとにスケジュールを作り、それを顧客などのステークホルダーに伝える立場にある人だと想定しています。
開発に思ったより長い期間を要することが分かった時、あなたはそれを伝えることに後ろめたさを感じる人ですか？

# 見積りは、後ろめたさを感じる対象ではない

見積り結果が、あなたの個人的な期待より大きくても、それを顧客に見せる時に後ろめたさを感じてはいけません。
見積りは、「これぐらいの期間がほしいです」という希望やお願いではなく、「これぐらいの期間がかかると予測される」という冷静な予測です。

その見積りが、必要な作業や起こりうる出来事をシミュレーションして出したものであるならば、後ろめたさはないはずです。
あなたは顧客に対して弁解や交渉をするのではありません。あなたがすべきことは、見積りが何を想定して出したものなのかを納得がいくように説明することです。
あなたにあるのは見積りに対する説明責任です。

# 顧客の顔色を伺ってスケジュールを短縮しようとする考え方は責任放棄に等しい

顧客が難色を示すのは、彼の期待通りでない結果を見たからです。
そこに顔色を伺って、スコープの調整もせずに「短い期間でやりますよ」などと言ってはいけません。
開発における将来の予測をごまかしているという点で、開発者としての責任を果たしていません。見積りは交渉材料ではありません。

そもそも見積りを正確な時間として出すことは現実的に不可能です。
不確定な未来でいっぱいな開発プロジェクトというものを、シミュレーションではなく顧客の期待を基準にして進めてしまって本当に大丈夫ですか？

期日におさめる点で一致しているならば、顧客もまた期日におさめることに貢献していくものだと思います。
もしも見積り結果が、ビジネス上求められる期日をオーバーしているならば、期日におさめる方法を、顧客と一緒に模索していくべきでしょう。

# 他はもっと早くできるよと言われたら？

それは、そのチームのほうが能力が高かったか、そのチームが無理をしているかのどちらかだと思います。
前者であれば、あなたのチームや組織も効率的な開発手法を学ぶなどして、能力を上げていく必要があるだけの話です。

後者であれば、無理をしている他所に合わせてはいけません。それこそ無責任な行為だと思います。
動いているように見せるためのものを作り、テストも省いて、ユーザーが使えないものを作ることがあなたのチームの仕事なのでしょうか？
あるいは、設計せずに突貫工事を重ねて、少しの修正をするのにも他の多くの部分に影響が出てしまうものを作ってしまって、後々大丈夫でしょうか？
（納品すれば終わる契約を結んでいるなら、そういった部分に責任を負わなくても良くなってしまうのですが）

# とはいえ、スケジュール短縮のための提案をすることもまた責任

開発者は、スケジュールを短縮したいという顧客の望みに貢献するべきです。
その時に行うべき作業は、一つ一つの機能について、「なぜその機能を計画に盛り込みたいのか？」「その機能は誰にどんな価値を提供するためのものか？」という問いを顧客と一緒に繰り返すことだと思います。

完成した機能の64%がほとんど使われないという調査結果もあります（Standish社の2002年のレポート）。
むしろ、スケジュールの短縮を顧客から求められることは、無駄なお金と時間をかけずに価値を提供するにはどうすれば良いかを議論するいい機会とさえ思います。

「100万行のコードを書いて1円しか稼げないのは駄目なプロジェクト、1行のコードを書いて100万円稼げるのは良いプロジェクト」ということを、私はメンターにあたる人からよく言われていました。

# 信頼できるスケジュールを作ることにフォーカスする

良いスケジュールとは、早く終わる望ましいスケジュールではなく、プロジェクトを取り巻く人たちが信頼できるスケジュールです。
そのスケジュールは、プロジェクトに対する投資判断や、他のチームの意思決定に使われるでしょう。
したがって、期日から逆算して辻褄を合わせたようなスケジュールは使っていいものではありません。

あなたが後ろめたさを感じるべき時は、早く終わる望ましいスケジュールを出せなかった時ではなく、スケジュールの信頼性を上げる努力を怠った時です。
Androidアプリ・iOSアプリでBase64エンコードされた文字列をURLエンコードする

スマホアプリからBase64エンコード化した文字列をサーバに送信する場合、適切にURLエンコードする必要があるので、その方法についてのメモ

# 前提
送信する形式は、GETもしくはForm送信時と同形式のPOSTとする
この場合、

```
key1=value1&key2=value2&...
```
という形式でキー＆バリューを並べる事になる
また、`application/x-www-form-urlencoded`という規格に従ってURLエンコードを行う必要がある
例えば、`+`は半角スペースと認識されるため、`%2B`に変換しておく必要がある

# 方針
Base64エンコードで出てくる文字は`[a-zA-Z0-9+/]`の64種類であり、その中でエンコードの必要があるのは`+`・`/`の2種類のみである（厳密に言えば、パディングで利用される`=`もあるようだが、本記事では一旦置いておく）
そのため、**これら2種類の文字がエンコードされる**よう、利用するメソッドやその引数を選択すれば良い

# 各プラットフォームごとの方法
## Android
AndroidのSDKに用意されている[URLEncoder](https://developer.android.com/reference/java/net/URLEncoder)を利用すれば十分である
以下Kotlinでの実装例

```kotlin:実装例
val original = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/"
val encoded = URLEncoder.encode(original, "utf-8")
println("Encoded: $encoded")
```

```shell:実行結果
Encoded: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%2B%2F
```

## iOS
Swiftを利用する場合、URLエンコードにはStringの[addingPercentEncoding](https://developer.apple.com/documentation/foundation/nsstring/1411946-addingpercentencoding)メソッドが利用できる
エンコード例外文字列には、アルファベットと数字のみ(`alphanumerics`)を指定すれば十分である
以下Swiftでの実装例

```swift:実装例
let original = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/"
let encoded = original.addingPercentEncoding(withAllowedCharacters: .alphanumerics)!
print("Encoded: \(encoded)")
```

```shell:実行結果
Encoded: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%2B%2F
```

# 参考
- [Formデータの送信ついて](https://tools.ietf.org/html/rfc1866#section-8.2)
- [URIの予約文字について](https://triple-underscore.github.io/RFC3986-ja.html#section-2.2)
- [URI のエスケープ](https://www.ipa.go.jp/security/fy21/reports/tech1-tg/b_09.html)
- [POSTでBASE64のデータを渡すとき、+がスペースに置換される](http://d.hatena.ne.jp/nekonokataomoi/20101129/1290994747)
javascript　初心者向け配列とは

何かしら便利なので忘備録として書き記そうと思ふ。

# 配列を弄くり回す。

まず弄くり回したい配列を作ります。
こうやって作ります。

```js
var 配列 = [ "トマト" , " わかめ" ," ごぼう " ]
```
トマトをこの配列から盗みます。
こうやります。

```js
var 買い物バッグ = 配列 [ 0 ]
```
配列の順番は左から数えて 0 から始まるので,

「　配列の 0 番目　」すなわち 「 トマト 」をよこせということです。

　次はトマトを盗んだので代わりにキュウリを入れてあげます。

```js
配列.push("キュウリ")
```
トマトを盗んだと言ってもトマトが配列から無くなるわけではありません。
トマトの情報を盗んだだけです。
なので現在の配列はこんな感じ。

```js
var 配列 = [ "トマト" , " わかめ" , " ごぼう " , "　キュウリ　" ]
```
次はガチで盗みます。
盗んでゴミ箱という変数に捨てます。(代入します)

```js
var ゴミ箱 = 配列.shift( )

console.log(ゴミ箱) => "トマト"
```
一番後ろのキュウリを盗みたければこんな感じ。

```js
var ゴミ箱 = 配列.pop()

console.log(ゴミ箱) => "キュウリ"
```
deviseでのフラッシュメッセージ利用

# deviseでフラッシュメッセージを利用する

deviseを導入し、サインインやログアウトをした際に、画面上部に”ログインしました。”　”ログアウトしました。”のようなメッセージを表示できるようにする。

## 1.フラッシュメッセージのビューを作成
フラッシュメッセージ用のビューファイル_notifications.html.erbをviews/layoutsに配置し、application.html.erbのbody内でrenderで読み込む。
flashはデフォルトで"notice（動作成功時）"と"alert（失敗時）"の２つのキーを作成する。

```_notifications.html.erb
<% flash.each do |key, value| %>
  <%= content_tag(:div, value, class: #{key}) %>
<% end %>
```

```application.html.erb
<body>
  <%= render 'layouts/notifications' %>
  <%= yield %>
</body>
```

## 2.フラッシュメッセージにCSSを適用させる

flashオブジェクトでnoticeとalertキーを作成しているので、それぞれに対しCSSを適用させる。

```_flash.css
.notice {
  color: white;
  background-color: blue;
}
.alert {
  color: white;
  background-color: red;
}
```

## [番外]deviseの日本語化
deviseはデフォルトで英語設定されているので、上記で表示できるようになったフラッシュメッセージは英語。これを日本語表記に変更する。

### gemのインストール

```Gemfile
gem 'rails-i18n', '~> 5.1' #railsのバージョンにより変更させる
```

```
$bundle install
$rails s
```

### 日本語ファイルをダウンロードし、config/locales以下に配置

[devise.ja.yml](https://gist.github.com/kaorumori/7276cec9c2d15940a3d93c6fcfab19f3)

### 日本語化のためにapplications.rbを編集

```Ruby:application.rb
class Application < Rails::Application
  config.i18n.default_locale = :ja
end
```
Blenderで作成したモデルにUnityでテクスチャを貼り付ける方法

Unityでの開発で、コードで生成するには多少複雑な3Dモデルを扱う必要があったので、「BlenderでしれっとモデリングしてUnityにぶち込めばいけるだろう」と軽く考えていたところ、テクスチャの貼り付けでハマったのでメモ。

**僕自身、3DCGのエンジニアでもないし、ガチのUnityエンジニアでもないので、用語の間違いから、「そもそもこの記事言ってる事が的外れ」レベルのご指摘でも頂きたいです。**

普通にマテリアルを適応するとか、シェーダーでゴリゴリするのであればUnityのプリミティブやコードで生成したオブジェクトも、Blenderで作成してインポートしたオブジェクトでも、やることはそんなに変わらないと思いますが、テクスチャの貼り付けに関しては少しコツが必要でした。

**結論から言うと、Blenderで3Dモデルを作成する際に、きちんとUVの設定をしましょうと言う話です。**

まず、試しにBlenderで作成したplaneをそのままfbxで書き出して、Unityにインポートしてテクスチャを適応してみます。
![スクリーンショット 2019-04-06 12.48.28.png](https://qiita-image-store.s3.amazonaws.com/0/121076/f922ff56-d633-1b5e-b576-3e289f458114.png)
![スクリーンショット 2019-04-06 13.32.01.png](https://qiita-image-store.s3.amazonaws.com/0/121076/394e145f-a352-a3c8-747d-4841f4be2090.png)
うまく適応されません。

そこで、UV展開を行います。UV展開の手順については普通にBlenerの解説ページなどに詳しく載っていますが、なかなか奥深い世界が待っています。
この記事では、簡単のため、プリミティブのplaneを利用しますが、複雑な形状で行いたい場合は、普通にBlenderや他のモデリングソフトのチュートリアルを参考にしてみてください。
(形状が複雑になる程、自動処理では色々難しく、「シームを付ける（Mark Seam）」などのテクニックが必要になるのですが、それは普通にBlenderの使い方なので、この記事では割愛します)

Blenerでの具体的なUV展開の手順として、まず、対象となるオブジェクトを選択しEdit Modeに切り替えます。
![スクリーンショット 2019-04-06 13.10.20.png](https://qiita-image-store.s3.amazonaws.com/0/121076/f056f13d-d88b-240e-b9b3-e9a118c4969c.png)
その状態でキーボードの 'a' を押し、オブジェクトのメッシュを全選択します(今回はplaneなので全選択しても1つのメッシュが選択されるだけですが、cubeやcylinder等の、もう少し複雑な形状も想定して書いています)
そして'u'キーを押して、"Unwrap" を選択することで、自動展開されます。
![スクリーンショット 2019-04-06 13.13.16.png](https://qiita-image-store.s3.amazonaws.com/0/121076/85aa6b24-16ac-235d-3f6a-8734fd6171b0.png)

UV / Image Editor で見るとUVが設定されたことがわかります
![スクリーンショット 2019-04-06 13.19.39.png](https://qiita-image-store.s3.amazonaws.com/0/121076/98a30384-09f4-6ed4-e4ee-ef9aeb8e1a1f.png)

こちらのモデルをfbxで書き出して、Unityで読み込んで、先ほどのUV展開していないモデルと同じ条件で、テクスチャを貼り付けてみます。
![スクリーンショット 2019-04-06 13.27.41.png](https://qiita-image-store.s3.amazonaws.com/0/121076/04894eff-516d-36c5-2274-106dcaa261f7.png)

うまく貼れました。

このように、3Dモデルの素材側でUV展開を行っておけば、Render Texture や VideoPlayer 等も、Unityのプリミティブとの違いを、特に意識することなく貼り付けることができるようになります。


雑感 :
アプリケーション内で3Dモデルを扱う際には、コードで生成するか、案件で求められるクオリティによってはCG屋さん/チームに制作してもらったモデルを使う事が多いと思うので、エンジニアが自分で3Dモデリングツールでモデリングをするときに以外に落とし穴になるのではないかと思います。


参考 :
https://www.cgradproject.com/archives/2425/
http://cg.xyamu.net/Blender/entry201.html
AWSのlightsailのbitnamiで作成したredmineの再起動方法

redmineのプラグインを入れるときに、わからなかったので備忘録として残します

```
cd /opt/bitnami
sudo sh ctlscript.sh stop
```

```
cd /opt/bitnami
sudo sh ctlscript.sh start
```

```
cd /opt/bitnami
sudo sh ctlscript.sh restart
```
body-parserを使って入力したデータをhtml上に出力する

## 作ったもの
https://github.com/atlansien/POST-processing-at-body-parser


## なぜ作ったか

今後DBを使ったWebアプリ(Todoリストなど)を作ってみたいので、とりあえずNode.jsを使ってHTML上にデータを出力してみたかった。


## 使用したライブラリ

- [Express](https://expressjs.com/ja/):代表的なJSフレームワーク
- [body-parser](https://github.com/expressjs/body-parser):POSTメソッドをJSON形式で送信してくれる
- [EJS](https://ejs.co/):動的にHTMLを生成してくれるテンプレートエンジン
- [Moment.js](http://momentjs.com/):日付の表示を簡単に設定できる
- [nodemon](https://github.com/remy/nodemon):指定したファイルを更新するたびに自動でサーバーを再起動してくれる

## できたもの

![body-parserのポストテスト2.gif](https://qiita-image-store.s3.amazonaws.com/0/349049/41b68ce5-deda-ed23-47be-9c3a4cd91606.gif)

## コード

```js:router/route.js
router
  .get("/", (req, res) => {
    res.render("index", {
      message: "メッセージが出力されます",
      date: "入力した時刻を表示します"
    });
  })

  .post("/", (req, res) => {
    res.render("index", {
      message: req.body.message,
      date: moment().format("YYYY年MM月DD日HH時mm分ss秒")
    });
  });
```
```js:views/index.ejs
<p><%= message %></p>
<p><%= date %></p>
<form action="/" method="POST">
  <input type="text" name="message" />
  <button type="submit">送信</button>
</form>
```
`input`タグに入力した文字を`/`に`POST`送信し、`req.body`で受け取ります。そして同じタイミングで`momemt`にて入力した日付を生成、その後`get`で`message`と`date`をプロパティ値を置き換えます

今回はシンプルに入力した文字を出力するだけの簡単な機能しか作ってないので思ったよりサクッとできましたが、これをさらに登録した人ごとにデータを保存したり、本文や時刻だけではなくタグ付け等も実装できたらと思っています。

## おまけでやったこと
#### `new Date()`だと日付表示がわかりづらい

デフォルトの表示よりは西暦表示の方がパッとみてわかりやすいと思ったので、最初は[Date.prototype.toLocaleDateString()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)を使おうと思いましたが、`Moment.js`という便利なライブラリがあることを知ったのでそちらを使うことにしました。便利なものを使うのが一番！(逃)

#### コードのリファクタリング

ルーティング用のオブジェクトが`app.js`にあるよりは、別でルーティング用のファイルを作った方がわかりやすいと思ったので(メンターさんにそう教わった)専用に`route.js`を作りオブジェクトをそちらに移動、ファイルごとの仕事内容がわかりやすくなりました。

本当はレンダリングの中身も別ファイルで作りたかったのと、`index.ejs`のbodyの中身以外をパーシャルファイル化したかったけど、そこまでやると本来の目的からどんどん逸れていくので一旦やめにしました。また気が向いたらやろうかな…
dockerを使った開発環境構築

# Install docker

* https://docs.docker.com/install/

# MariaDB

```
docker run --name mysqld -e MYSQL_DATABASE=testdb -e MYSQL_USER=user -e MYSQL_PASSWORD=password -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306 mariadb 

docker exec -it mysqld /bin/sh

mysql -uroot -proot
```


cf.)

* http://dqn.sakusakutto.jp/2015/10/docker_mysqld_tutorial.html

# Redis

```
docker run --name my-redis -d -p 6379:6379 redis redis-server
```

cf.)

* https://hub.docker.com/_/redis
任意の回転から振り(Swing)と捻り(Twist)を取り出す

元々は任意の回転から特定の軸に沿った捻りだけを取り出したかったのですがコレといった文献が見つからず、色々寄せ集めて作ったコードです。

```DecomposeSwingTwist.cs
//------------------------------------------------------------
/// <summary>
/// QuaternionからTwistとSwingを取り出す
/// </summary>
/// <param name="q">与える回転(Local)</param>
/// <param name="twistAxis">捻りを取り出すための基準軸(Local)</param>
/// <param name="swing">分解したSwing回転(Local)</param>
/// <param name="twist">分解したTwist回転(Local)</param>
/// <seealso cref="http://www.euclideanspace.com/maths/geometry/rotations/for/decomposition/" />
/// <seealso cref="http://allenchou.net/2018/05/game-math-swing-twist-interpolation-sterp/" />
//------------------------------------------------------------
public static void DecomposeSwingTwist(Quaternion q, Vector3 
twistAxis, out Quaternion swing, out Quaternion twist) {
	// (rotation axis) * cos(angle / 2)
	Vector3 r = new Vector3(q.x, q.y, q.z);

	// singularity: rotation by 180 degree
	if (r.sqrMagnitude < Mathf.Epsilon) {
		Vector3 rotatedTwistAxis = q * twistAxis;
		Vector3 swingAxis = Vector3.Cross(twistAxis, rotatedTwistAxis);

		if (swingAxis.sqrMagnitude > Mathf.Epsilon) {
			float swingAngle = Vector3.Angle(twistAxis, 
rotatedTwistAxis);
			swing = Quaternion.AngleAxis(swingAngle, swingAxis);
		} else {
			// more singularity: rotation axis parallel to twist axis
			swing = Quaternion.identity;	// no swing
		}

		// always twist 180 degree on singularity
		twist = Quaternion.AngleAxis(180.0f, twistAxis);
	} else {
		// formula & proof:
		// http://www.euclideanspace.com/maths/geometry/rotations/for/decomposition/
		Vector3 p = Vector3.Project(r, twistAxis);
		twist = new Quaternion(p.x, p.y, p.z, q.w);
		twist = Quaternion.Normalize(twist);
		swing = q * Quaternion.Inverse(twist);
	}
}
```
Rake, Itamae, Rspec, Thor の DSL 評価の方式

自分で DSL 処理を描きたくなった時に、どうやるのが良いのかあまり自明じゃなかったので、DSL っぽいことができる有名な ruby のフレームワークに対して、それぞれがどのように DSL を評価しているのかを調べてみた際の、メモ。

# Rake

```ruby:rake/lib/rake/dsl_definition.rb
# self はトップレベルオブジェクト、つまり main
self.extend Rake::DSL
```

`main` オブジェクトに対する特異メソッドとして、もろもろの DSL メソッドを追加する方式。

# Itamae

```ruby:itamae/lib/itamae/recipe.rb
    def load(vars = {})
      context = EvalContext.new(self, vars)
      context.instance_eval(File.read(path), path, 1)
    end
```

File を read しながら、評価用オブジェクト上で `instance_eval` する方式。

# Rspec

```ruby:rspec-core/lib/rspec/core/dsl.rb
      # @private
      def self.expose_example_group_alias_globally(method_name)
        change_global_dsl do
          remove_method(method_name) if method_defined?(method_name)
          define_method(method_name) { |*a, &b| ::RSpec.__send__(method_name, *a, &b) }
        end
      end

      # @private
      def self.change_global_dsl(&changes)
        (class << top_level; self; end).class_exec(&changes)
        Module.class_exec(&changes)
      end
    end
  end
end

# Capture main without an eval.
::RSpec::Core::DSL.top_level = self
```

`main` オブジェクトの特異クラスに対して `define_method` などを行っている

# Thor

```ruby
class CLI < Thor
  desc 'foo', 'foooo'
  def foo
    puts :foo
  end
end
```

クラスを継承させるスタイル。
SIerに入って８年ぐらい経ったのでいろいろ棚卸しをしてみる。【vol.001 イントロダクション】

## この記事の目的

主にこれまで自分のキャリアを振り返って、今後のキャリアを検討するため。
あとは、自分のつたない文章が誰かの役にたてばと思って書いています。

最近、Qiitaだったり、noteだったり、いろんな人の文章を読ませてもらっているので、
自分も貢献しようと思いました。

今回は、イントロダクションで順次記事を追加していきたいと思います。

## 自己紹介
### 学生時代
 ・ ITとまったく関係ない文系の院生をやっていた。
 ・ 研究者で食っていける気がしなかったので、就職活動するもリーマン直撃。
 ・ 就職留年の末、２０１１年に中堅SIerに入社。フルスクラッチ開発をする部署に配属される。
### 所属部署
 ・ BtoBなので使用言語は、主にJava、たまにC#の現場が多い。
 ・ SIerにはしては、また社内でも珍しくプロパー社員でも比較的コードを書くことが多い。
 ・ なので、比較的技術に明るい人もいる。
 ・ 金融以外はなんでもやる雑食系。
 ・ クラシックなウォーターフォールから大規模アジャイル、Web系の開発支援まで多様性に富んでいる。
 ・ 最近は、IoTにも手を出そうとしており、雑食といえば聞こえがいいが、節操がないとも言う。
 ・ 比較的、要件定義から入って、設計・実装・テスト・リリースまでやることが多い。
 ・ いわゆるウォーターフォールの上流から下流までやるタイプ。
 ・ とはいえ、SIなので人月商売を最大化した大型PJが社内的には評価される。
 ・ たまに燃えるところがある。
### これまで携わってきた業界
 ・ 自動車
 ・ 人材紹介
 ・ リース
 ・ 小売
 ・ 出版
 ・ 電力
 ・ Webサービス
### 身についたスキル
 ・ 炎上案件の消火活動に放り込まれても、死なないで消化に貢献する胆力。
 ・ 引き合い段階からの見積もり。
 ・ 要件ヒアリング能力
 ・ 設計能力（クラス定義、メソッド分割、MVCモデルを前提としたWebアプリ設計など）
 ・ Java、C#でのコーディング（Webアプリ、バッチ処理）。
 ・ テスト全般（Unitテスト、単体テスト、結合テスト、シナリオテスト）
 ・ ８名前後のメンバーをマネジメントしながら、プレイングマネージャーやる能力。
 ・ お客さんと良好な関係を築くことができるビジネスコミュ力。
### これまで振り返ってみて
 ・ 平穏な日々を送ろうとしたら、炎上案件に火消しによく呼ばれた。
 ・ 結果的に部署内外に知り合いが増えたし、追い込まれた状況での仕事の仕方とか学べたので良かった。
 ・ 健康は害したし私生活も崩壊したが、逆に健康を見直すいい機会になった。

 ・ 人が良い人でもあるのでビジネス的に優秀かは別かもしれないが、基本的に優秀で良い人が多い。
 ・ 生意気な後輩社員に対して、たまにキレながらも寛容に指導してもらったし、
 ・ 仕事ぶりを見ながら、PJ内でも振る舞い方だったり、お客さんとの接し方とか学ばせてもらった。

 ・ 結構コードを書いているし、入社前の技術を重んじるイメージはその通りだった。
 ・ ただ、業務SE、PMの傾向が色濃い人もいるので技術志向の人にも寛容ぐらいかもしれない。
 ・ 部署の特徴そのまま雑食系のPJ経歴で、業務的にも技術的にも幅広い経験ができた。
 ・ 人によっては、特定PJ固定な人もいるので恵まれたほうかもしれない。
### 今後の記事追加予定
 ・ これまでのPJ経歴に比較的沿った形で、以下の技術テーマでまとめていこうと思います。
 ・ 自分の経験も織り交ぜながら、誰かのお役に立てる技術的な棚卸しをしていきたいと思います。

 ・ JDBC
 ・ MyBatis
 ・ SVN
 ・ Java
 ・ Struts
 ・ DI
 ・ Spring Boot
 ・ Linux
 ・ Hibernate
 ・ JPA
 ・ POI
 ・ JUnit
 ・ Selenium
 ・ JavaScript
 ・ jQuery
 ・ Ajax
 ・ MVC5
 ・ Dapper
 ・ Web Scraping(HTML解析)
 ・ API利用
 ・ Jenkins
 ・ AWS
 ・ オブジェクト指向
 ・ Tomcat
 ・ Redmine
 ・ Github
 ・ Jira
 ・ Confluence
 ・ Slack
Bean Validationにおいて、Error MessageにField Nameを含ませたい場合にLocalValidatorFactoryBeanからでは出力できない

# 概要
Bean Validation を使用して入力チェックを行い、エラーメッセージを出力する場合、内容にフィールド名を含ませたい場合は注意が必要だったのでメモ。

### 実行環境
- java SE - 1.8
- org.springframework - 3.1.1.RELEASE
- javax.validation - 2.0.1.Final
- org.hibernate.validator - 6.0.13.Final

:star:[SampleProjectをGitHubに置いています](https://github.com/Nao3yoyoma/SpringSample)

### 例 
以下のフォームに対して次のようなメッセージを出力させたい場合

```java:UserForm.java
import java.io.Serializable;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class UserForm implements Serializable {
	private static final long serialVersionUID = 1L;

	@NotNull(message = "{userForm.name}")
	@Size(min = 1, max = 20, message = "{userForm.name}")
	private String name;
	// getter/setterは省略
```

```
"[name] is not null."
```

# 注意点
- LocalValidatorFactoryBeanでは出力できない

```java:UserControl.java
import javax.validation.Validator;

@Resource
private Validator validator;

// 実際の処理部分 
Set<ConstraintViolation<UserForm>> violations = validator.validate(form);
if (!violations.isEmpty()) {
	for (ConstraintViolation<UserForm> v : violations) {
		log.info(v.getMessage());
	}
}
```

```xml:application-context.xml
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
```

```properties:ValidationMessage.properties
userForm.name={0} is not null.
```

{0}がフィールド名に置き換わると思っていたが、実際の出力結果は以下のように置換されず出力されてしまう

```
{0} is not null.
```

# 理由
- フィールド名の置換は、Springが提供するデータバインディングにより実現される模様

つまり、以下のように@Validatedを用いる

```java:UserControl.java
@RequestMapping(value = "create", method = RequestMethod.POST, params = "confirm")
public String createConfirm(@Validated UserForm form, BindingResult result) {
	if (result.hasErrors()) {
		return "user/createForm";
	}
	return "user/createConfirm";
}
```

もしくはSmartValidatorを使う

```java:UserControl.java
import org.springframework.validation.SmartValidator;

@Resource // SmartValidatorは<mvc:annotation-driven>の設定が行われていれば使用できるため、Bean定義不要
private SmartValidator smartValidator;

@RequestMapping(value = "create", method = RequestMethod.POST, params = "confirm")
public String createConfirm(UserForm form, BindingResult result) {
	smartValidator.validate(form, result);
	if (result.hasErrors()) {
		return "user/createForm";
	}
	return "user/createConfirm";
}
```

# まとめ
- LocalValidatorFactoryBeanでは、エラーメッセージにフィールド名を含んでの出力はできない
- Springのデータバインディングにより実現されるため
- 実現するには@ValidatedやSmartValidatorを用いる

※どうしてもLocalValidatorFactoryBeandでなくてはならないなら、個別でメッセージを定義するとかしかなさそう
是丈は心得おくべし：Python3

自分が知らなくて大変だったことを書き留めておくメモ。

# cloudpickle

標準pickleの上位互換。標準ではpickleできないものがあらかたpickleできる。`pip install cloudpickle`して`import cloudpickle as pickle`で使う。

# 演算子`//`

`int / int`が`float`になる面白言語Python3だが、`int`を返す除算演算子`//`もある。

# 組み込み関数`divmod()`

商とmodを同時にタプルで返す。

# flake8

'cmd.py'というファイル名のモジュールがあると、原因究明が途方もなく困難な落ち方をするので、この名前は使わない。

# `faulthandler`

C拡張モジュールやNumbaを使うと、ACCESS VIOLATIONでプロセスが落ちることがある。素のPythonは黙って落ちる。「プロセスが落ちた」とわかるまでに大変な目にあう。
だから、C拡張モジュールやNumbaを使うときは最初に必ず、

```Python3
import faulthandler
faulthandler.enable()
```

しておく。こうするとACCESS VIOLATIONで落ちるときにスタックトレースをstderrに出力する。

# `pprint.pformat()`

辞書とプロパティを再帰的にインデントして文字列にしてくれる。

# Pythonのスレッドは何に使うのか

~~Pythonのスレッドは一応ネイティブスレッドのはずだが、限りなくグリーンスレッドに近い。ほとんど何をしてもGILで逐次実行になる。多重I/Oにはasyncioがある。では何に使うのか？
答え：ProcessPoolExecutor管理下のワーカプロセスによるFutureをwait()すると、そのスレッドがブロックされるので、並列にwait()するために使う。
なお、loop.run_in_executor()でconcurrent.futuresのFutureをasyncioに変換してawait asyncio.gather()で待とうとすると、並列にawaitするとLinuxではデッドロックに陥る。理由は不明。しかしWindowsでは並列にawaitできる。死の罠だ。~~
Python 3.8では普通に`asyncio.gather()`で`loop.run_in_executor()`を複数awaitできる。

随時追記の予定。
VPS で、Rancher + k3s 環境での失敗談

#VPS CPU3core、Memory 2G OS CentOS7の環境

Kubernetes の試みましたが理解が出来ず挫折しました。
Rancherを利用すると簡単に構築できるので、試してみました。
しかし、Rancherで、Kubenaites環境をセットアップすると、それだけでメモリを使いすぎて、さらに、アプリを構築するのは無理そう。
しかし、k3sは、小規模環境でも動くらしい。
気になって調べると、
Rancher+k3Sで動かしている人を発見
https://qiita.com/ishida330/items/dfff18362ea16aa92f88
試してみよう

##k3sをインストール
curl -sfL https://get.k3s.io | sh
あれ、旨く動かない。

ファイルシステムがd_type=1 の必要があるようです。
CentOS7を標準でインストールしたため、XFSファイルシステムで、d_type=0 で、フォーマットされているため、対応していないらしい。
フォーマットの変換も試みましたが、失敗したので、OSから再インストール
再インストール時には、手動でパーテーションを切りなおして、フォーマットを ext4 にしなおしました。

よしよし、問題なく起動

##続いて、Rancher のインストール
永続化するためにホストのボリュームをマウントするために、
sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher:latest -v /opt/rancher:/var/lib/rancher
ここでも、失敗が
一瞬、起動しようとするのですが、再起動を繰り返す

調べる事、1週間
-v パラメータの位置が違います。（初歩的なミスですね。さすが、Docker初心者）
-v パラメータは、Dockerのパラメータなので、 rancher/rancher:latest の前に記載する必要があります。
正しくは、
sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 -v /opt/rancher:/var/lib/rancher rancher/rancher:latest
さらに、シングルノードで起動するときは、ポートを変更する必要があります。
sudo docker run -d --restart=unless-stopped -p 8080:80 -p 8443:443 -v /opt/rancher:/var/lib/rancher rancher/rancher:latest
やっと、起動しました。

ここまでで、メモリの使用は、ホストOSを含めて、1Gを少し超えたぐらい。
Rancher OSにしたら、もっとメモリが節約できるのかな？
Windows 10 1809 で Windows To Go が起動しないときの対処法

日本語の情報がなかったので、備忘録としてメモ。
特に Windows のドライバ周りで詳しいわけではないので、細かいところはご愛嬌。

# TL;DR

一番楽な対処法は、

```
C:\Windows\System32\drivers
```

配下の

```
uaspstor.sys
```

の内容を

```
USBSTOR.SYS
```

に書き換える(上書きコピー)
ただし、__管理者権限でもファイルを編集できない__ため、uaspstor.sys の [プロパティ]->[セキュリティ]->[詳細設定] からごにょごにょする必要がある（ページ下半分参照）。

# そもそも動かない原因

Windows 10 の 1809 で変更された

```
C:\Windows\System32\drivers\WppRecorder.sys
```

が悪さをしているらしい。

# 有効な対処法

下記の参考ページでは、以下の方法が紹介されている。

> * Delete WppRecorder.sys prior to boot, and replace with the corresponding file from 1803.
> * Disable UASP globally by replacing uaspstor.sys with a renamed copy of usbstor.sys prior to boot.
> * Disable UASP for the affected boot device via the registry of the ToGo install.

自分の環境では、2番目でできた & 楽 なので、そのやり方を下にまとめた。

# やり方

## Windows To Go の作成
通常通り行う。
ただし、初回ブートの前に次の作業をする。

## 書き換えるファイルの権限を取得
Windows のドライバが格納されているフォルダは、管理者権限でさえ編集できなくなっている。
なので、書き換える以下のファイル

```
C:\Windows\System32\drivers\uaspstor.sys
```

の権限を変更する。

1. [プロパティ]->[セキュリティ]->[詳細設定] を開く
2. 左上にある、所有者を__今起動しているWindows上の__自分のユーザーにする
3. 右下の [OK] をクリック、さらにもう一度 [OK] をクリックしてプロパティを閉じる
4. 再度 [プロパティ]->[セキュリティ] を開く
5. 今度は [編集...] から自分のユーザーにフルコントロールを与える
6. [OK] をまた2連打

## 書き換え

```
uaspstor.sys
```

の内容を

```
USBSTOR.SYS
```

に書き換える(上書きコピー)




# 参考ページ
https://www.tenforums.com/general-support/123835-1809-windows-go-still-broken.html
[mysqldump]defaults-extra-file を使用すると 1045: Access denied 

# 背景・課題

mysqldump(mysqlでも同じ）で、コマンドに直接パスワードを指定すると以下の警告が出力されます。
手動で実行する分には許容範囲ですが、問題はcronで実行している時です。
エラー発生時に管理者にメール送信するようにしていると実行するたびにエラーメールが送信されてしまいます。

```
Warning: Using a password on the command line interface can be insecure
```

この警告の解消方法として`MYSQL_PWD`や`--defaults-extra-file`を使った方法がありますが、`--defaults-extra-file`を使ったところ以下のエラーが出力されて失敗します。
ユーザ名は指定したものが認識されているので意図したファイル・設定が読み込まれていることは間違いありません。

```bash
mysqldump: Got error: 1045: Access denied for user 'backup_user'@'localhost' (using password: YES) when trying to connect done exporting
```

- [MySQL5.7でmysqldump時にwarning - まったりぺちばーのメモ帳](http://selay.hatenablog.com/entry/2016/12/22/231313)
- [mysql - Problem with mysqldump: "--defaults-extra-file" option is not working as expected - Stack Overflow](https://stackoverflow.com/questions/3836214/problem-with-mysqldump-defaults-extra-file-option-is-not-working-as-expecte)


# 原因

パスワードに利用している特殊文字が認識されていなかった

```conf
[mysqldump]
user=backup_user
password=xxxxxx#xxx  ← #以降が認識されない。
host=localhost
```


## TIPS:パスワードが認識されているかの確認方法
設定ファイル内の`password`を`passwd`とか不正な変数にして実行します。すると実行エラーとなり以下のようなエラーメッセージが表示されます。今回は`#`以降が出力されなかったので、パスワードが認識されていないことに気がつきました。

```
[ERROR] unknown variable 'passwd=xxxxxxx'
```

# 対策 

引用符で囲む

```
前）password=xxxxxx#xxx
後）password='xxxxxx#xxx'
```

# あとがき

- ファイルが読み込まれていないのか？
- ファイル定義方法が間違えているのか？
- defaults-extra-file利用時特有の制約があるのか？
- パスワードをエスケープしたらどうか？


とか。結局、解決まで1時間くらい要してしまいました。。。(T_T)
デュアルブート環境で grub rescue が出現して起動できなくなったときの対処方法

# トラブル現象
grub2 の起動OS選択画面が表示されず、代わりに、grub rescue のコマンドプロンプトが表示され、OS起動できなくなった。

```
grub rescue>
```

# 経緯

* Linux パーティションを削除

    次のように複数の Linux をインストールしていた環境から一つの Linux をアンインストールしようと、該当パーティションを削除した。

    > * PC
    >     * EeePC 1101HA ･･･ いわゆるネットブック, 32bit, 当然 UEFI ではなく BIOS
    > * OS
    >     * Windows7
    >     * [Raspberry Pi Desktop](https://www.raspberrypi.org/downloads/raspberry-pi-desktop/)
    >     * [Linux Mint 19](https://linuxmint.com/) ･･･ パーティションを削除

* grub2 では起動リストを手動編集できない？

    まぁ、こんなことすれば起動時に障害が発生することは最初からわかっていたが、事前に起動リストを編集するような方法が grub2 では見つけられなかった。

    試してみた限りでは、`update-grub` コマンドを実行すれば各パーティションにインストールされているOSを自動検出して、起動リストを更新してくれる。

    対象PCは壊れても構わないリモート専用PCなので、いきなり該当パーティションを gparted で削除して再起動してみたところ、grub rescue が出現した。

    だが、grub rescue はブートローダーであって、`update-grub` コマンドは Linux を起動した後でないと実行できない。さぁ、どうしたものか。

# 対処方法

結論としては、こちらのページ「[GRUB (Grand Unified Bootloader) - SE学院][grub]」に記述されていた手順で解消できた。help で grub2 のコマンドを眺めてみても、皆目見当がつかない状態だったので、とても助かった。

[grub]: http://itref.fc2web.com/unix/linux/grub.html

* grub2 の設定を一時変更して Linux を起動させる

    ```
    grub rescue> ls
    (hd0) (hd0,msdos5) (hd0,msdos4)...
    grub rescue> ls (hd0)
    error: unknown filesystem. 　つまり、該当パーティションが消失している
    grub rescue> ls (hd0,msdos5)/boot/grub/i386-pc/normal.mod
    error: not a directory　　　　復旧に必要なモジュールが別パーティションにはある
    grub rescue> set prefix=(hd0,msdos5)/boot/grub
    grub rescue> insmod (hd0,msdos5)/boot/grub/i386-pc/normal.mod
    grub rescue> normal
    ```

* grub2 を再インストールする

    無事に grub2 の起動OS選択画面が表示されたら、残してあった Linux を起動する。
    この状態では、一時的に grub2 を認識しているだけなので、次のコマンドで /dev/sda ディ スクに再インストールする。

    ```
    $ sudo grub-install /dev/sda
    ```

* 要は、grub2 を何らかの方法で再インストールすればいい

    今回の環境は、前述の通り、Linux のデュアルブート環境、正確には、Windows7 も選択できるトリプルブート環境だったので、残していた Linux(Raspberry Pi Desktop)に含まれている grub2 を使って再インストールした。

    他にも、Linux の Live CD/USB などを使って grub2 を再インストールする方法もある。

    なお、Windows と Linux 1つのデュアルブート環境から、Linux パーティションを削除したような場合は、Windows 用ブートローダに戻すために、Windows のインストールメディアや回復メディアを使って、MBR を修復するのがよいだろう。

# 注意点

* 入力キー配列が US 配列

    grub rescue での入力キー配列は US 配列なので `(`, `)`,`=` などのキーが JIS 配列と異なる。

    | US配列 | JIS配列 |
    |----|----|
    | ( | Shift + 9 |
    | ) | Shift + 0 |
    | = | ^ |

# 参考になった記事

* [GRUB (Grand Unified Bootloader) - SE学院][grub]
* [Linux 上の GRUB 2 がブートできなくなったときの対処方法](https://jp.linux.com/news/linuxcom-exclusive/418274-lco20140625)
* [... grub rescue が出力されて起動しない時の対処方法](https://qiita.com/goodboy_max/items/1ea8cb90ba5eaf49a79f)
HTTP負荷ツールについて

#HTTPのリクエストを大量に送ってEC2に負荷を掛けたい

[サーバの負荷テストのための、何百万ものHTTPリクエストを発生させる方法](https://postd.cc/how-to-generate-millions-of-http-requests/)
↑色々な負荷ツールの解説がありとても分かりやすかったです。

##httperfのインストール　Apache Benchよりは強力
（合計10万の接続が毎秒2万の固定レートで生成できるみたい）
***AmazonLinuxへのインストール***

```
$ sudo yum --enablerepo=* search httperf
No matches found
```
AmazonLinuxの標準の状態ではhttperfの含まれたリポジトリはないようです
Dagリポジトリにあるので、次のようにDagリポジトリを追加, インストール

```
$ sudo tee /etc/yum.repos.d/dag.repo <<'EOF' >/dev/null
[dag]
name=Dag
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el6/en/$basearch/dag/
enabled=0
gpgcheck=1
gpgkey=http://ftp.iij.ad.jp/pub/linux/repoforge/RPM-GPG-KEY.dag.txt
EOF
$ sudo yum --enablerepo=dag install httperf
```
#Tsung(サン?サング?)のインストール　高負荷、分散、マルチプロトコルのテストツール
(数百万のリクエストを生成できる)
[2017年版 負荷テストツールTsungをAWS EC2 AmazonLinuxでクラスタリング構築](https://msitter29.hatenablog.com/entry/2017/05/07/194559
)↑すごくわかりやすく丁寧にまとめられてますの、参考になります。

[注意]
- インスタンス起動時のストレージ設定では節約のためにインスタンスストアは削除
- stress-test.xmlの2行目 "/usr/local/share/tsung/tsung-1.0.dtd"を実際に合わせる
-Tsungサーバアップロードする公開鍵はTsungの公開鍵なのか確認できていません。
-セキュリティーグループのインバウンド設定は22だけではだめでtcp0-65535をすべて開かないとダメかも
コマンドプロンプトのコマンド
-一度テストでssh接続しておかないと負荷テストを実行できない
-pemじゃないとssh localhostできない
コマンドプロンプトの公開鍵のアップロードコマンド
limits.conf変更は10240が最大にしないと不具合が起こる
```
pscp.exe C:\Users\hage\Downloads\test.pem ec2-user@(IP):/home/ec2-user/.ssh/
```
コマンドプロンプトでレポートのダウンロード

```
pscp.exe -r ec2-user@(IP):/home/ec2-user/work/logs/log.tar.gz C:\Users\hage\Downloads
pscp.exe -r ec2-user@(IP):/home/ec2-user/work/logs/20190404-1025 C:\Users\game\Downloads
```
windowsだからかtarでダウンロードするとうまく画像が表示できないので圧縮せずにダウンロードしました。

***テスト実行とレポートの作成***

```
tsung -l logs -f stress-test.xml start　//Tsungテスト実行
cd logs/20170505-0532
/usr/local/lib/tsung/bin/tsung_stats.pl --stats tsung.log5 //グラフ作成

sudo yum -y install httpd
sudo service httpd start
cp -a /home/quaduser/.tsung/log/20190404-1026 /var/www/html/　//web公開
http://(IP)/20190404-1025/graph.html
```
#注意
pemでid_rsaにファイル名を変更してアクセス権を0400に変更して、ssh localhost
VisualStudio ユーザー向け AndroidStudio 小ネタ集

業務でずっと *Visual Studio* 使って C#/HTML/CSS/JS 書いてた人が突然 *Android Studio* を触る羽目になって、いろいろ不便したので書きます。



## *Android Studio* について
*Android Studio* とは Google が無償で提供している、Android アプリケーション開発に特化した IDE です。
全て Google が開発したものではなく、JetBrains が提供している汎用IDE *IntelliJ IDEA* をベースに、Android向けの機能を足したものになります。
そのため、Androidに依存しない機能について検索するときは `android studio` ではなく `idea` で検索すると出ることがあります。



## 日本語化
*Android Studio* に [Pleiades プラグイン](https://pleiades.io/pages/pleiades_jetbrains_manual.html)をインストールすることで日本語化が可能です。
手順についてはリンク先が詳しいのでここでは触れません。



## シンタックスハイライト
*Visual Studio* に比べるとシンタックスハイライトが違いすぎて困惑すると思います。私はしました。
*Android Studio* はシンタックスハイライトを細かくカスタマイズできるので、自分好みに設定を弄り回しましょう。

### [Color Themes](http://color-themes.com) からシンタックスハイライトの設定をダウンロード
全て自分で設定すると日が暮れてしまうので、公開されている設定をベースにカスタマイズするのがおすすめです。
[Color Themes](http://color-themes.com) では JetBrains 製 IDE で使用できるシンタックスハイライト設定をダウンロードすることができます。
*Android Studio* でも利用できるので、自分好みの設定を探してダウンロードしましょう。

![color-themes.png](https://qiita-image-store.s3.amazonaws.com/0/268673/8b7b45fa-5324-d745-a0c6-42a58a35d4f1.png)

ダウンロードした`.jar`ファイルはメニューバーの`ファイル>設定のインポート`から読み込むことができます。
読み込み後は再起動すると反映されます。

### シンタックスハイライトのカスタマイズ
メニューバーの `ファイル>設定>エディター>カラー・スキームの切り替え` からシンタックスハイライトの設定を変更することができます。
私の場合は以下の設定を行いました。

- `ベース`: [Dark Visual Studio](http://color-themes.com/?view=theme&id=563a1a7680b4acf11273ae91)
- `一般>キャレット行>バックグラウンド`: `#464646`
- `言語デフォルト>インライン・パラメーターのヒント>フォアグラウンド`: `#DCDCDC`
- `言語デフォルト>インライン・パラメーターのヒント>バックグラウンド`: `#464646`



## 選択した行のコメントアウト
*Visual Studio* だと上部のボタンにコメントアウト・コメント解除のボタンがありましたが、*Android Studio* にはありません。
ですがコメントアウトの機能が無いわけではなく、`ctrl + /` でコメントアウト・コメント解除ができます。
`ctrl + shift + /` にすると `/* */` でコメントアウトしてくれます。



## ドキュメントのフォーマット（コードの自動整形）
*Android Studio* でも `ctrl + alt + L` でドキュメントのフォーマットが可能です。
しかし *Visual Studio* と *Android Studio* ではフォーマット形式が異なるため、思った通りに整形してくれません。

### フォーマット形式のカスタマイズ
メニューバーの `ファイル>設定>エディター>コード・スタイル` から各言語ごとにフォーマット形式を変更することが可能です。
以下に Java でのコード整形を *Visual Studio* 風に変更するために必要な項目を挙げます。

- `スペース > 左波括弧の前 > 配列初期化子の左波括弧`: `ON`
- `スペース > 範囲内 > 配列初期化子の波括弧内`: `ON`
- `スペース > 範囲内 > 空配列イニシャライザーの波括弧`: `ON`
- `折り返しおよび括弧 > 波括弧の配置 > クラス宣言内`: `次の行`
- `折り返しおよび括弧 > 波括弧の配置 > メソッド宣言内`: `次の行`
- `折り返しおよび括弧 > 波括弧の配置 > ラムダ宣言内`: `次の行`
- `折り返しおよび括弧 > 波括弧の配置 > その他`: `次の行`
- `折り返しおよび括弧 > 'if()'ステートメント > 新しい行での'else'`: `ON`
- `折り返しおよび括弧 > 'try'ステートメント > 新しい行での'catch'`: `ON`
- `折り返しおよび括弧 > 'try'ステートメント > 新しい行での'finally'`: `ON`

### 保存時に自動整形
更に *Android Studio* のマクロ機能を使い、ファイルの保存時（厳密には `ctrl + S` 押下時）にフォーマットをするように設定できます。
詳しくは [IntelliJ IDEAでファイル保存時にcode formatする](https://qiita.com/sisidovski/items/bde2d844c3c73457923c) の記事を参照して下さい。

## その他
執筆中・・・
whose view is not in the window hierarchy! 初心者向け　エラー解消

## 環境
iOS 12.0
Swift 5
Xcode 10.2

# 想定していた動作
### ログイン画面を表示する時に、以前のログイン情報が残っていたら自動的に別の画面に遷移させる！
**以下のコードだと、反応がなかった。。。**
ログインしていたら、メッセージページに移動するようにしたかったです。


```swift:LoginViewController.swift
    override func viewDidLoad() {
        super.viewDidLoad()
        user.delegate = self
        if user.isLogin() {
            moveMessagePage()
        }
    }
   (省略)
   func moveMessagePage() {
        let storyboard = UIStoryboard(name: "Message", bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: "MessageStoryboard")
        self.present(viewController, animated: true, completion: nil)
    }

```
```swift:User.swift
  // ログインしているかどうか
    func isLogin () -> Bool {
        if user != nil {
            return true
        }
        return false
    }
```

# whose view is not in the window hierarchy!　のエラーがコンソールに発生していた
なんでだろう？と思ってデバックしていたらコンソールに上記のエラーが記述してあった。
直訳すると、「そのビューはウィンドウ階層にはありません。」　らしい。
なるほど。まだviewが出来上がってないのに、移動なんてできるわけないだろ！ってことか。
viewDidLoad()　だから、viewのロードだけ終わっている状態で、viewは作成されてないもんな。

わかりやすい画像＋説明がこの記事に載っていた！
[UIViewControllerのライフサイクル](https://qiita.com/motokiee/items/0ca628b4cc74c8c5599d)
以下の画像は引用です。
![スクリーンショット 2019-04-06 10.56.54.png](https://qiita-image-store.s3.amazonaws.com/0/326574/354ea62b-ca5a-1136-4524-de841e7d7b89.png)

**実行される順番**が記述されてますね。
わかりやすい！


つまり、viewDidApperにさっきのロジックを記述すると、エラーが出ずに実行されるのか！
ちなみに、viewWillApperにロジック書いてもダメです。まだviewができてないからですね。
以下が、実行したら上手くいったコードです！

無事に、ログイン画面を表示する時に、自動的にメッセージ画面に遷移することができました！

```swift:LoginViewController
    override func viewDidLoad() {
        super.viewDidLoad()
        user.delegate = self
        // Do any additional setup after loading the view.
    }
    
    override func viewDidAppear(_ animated: Bool) {
        if user.isLogin() {
            moveMessagePage()
        }
    }
   (省略)
   func moveMessagePage() {
        let storyboard = UIStoryboard(name: "Message", bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: "MessageStoryboard")
        self.present(viewController, animated: true, completion: nil)
    }

```


## 参考
以下の記事を参考にさせていただきました。ありがとうございました。
@motokiee 
[UIViewControllerのライフサイクル](https://qiita.com/motokiee/items/0ca628b4cc74c8c5599d)

@Atsushi_
[swift初心者:画面推移時の「whose view is not in the window hierarchy!」の対処方法](https://qiita.com/Atsushi_/items/604db81a87930d57d50b)

@shtnkgm 
[UIKitのView表示ライフサイクルを理解する](https://qiita.com/shtnkgm/items/f133f73baaa71172efb2)
ネコでも分かるSOLID原則(第4回)

お久しぶりです、らべねこです。
私は今「アジャイルソフトウェア開発の奥義」という本を読んでいます。
その中のSOLID原則の部分がよく分からなかったので、私なりにまとめて理解したものをQiitaに投稿しています。
今回は第4回です。
第1回はこちら https://qiita.com/labeneko/items/3033c9a0fa0772a864c2
第2回はこちら https://qiita.com/labeneko/items/92fd93ed1e4a07565869
第3回はこちら https://qiita.com/labeneko/items/6b41d717cd2a6b1d472b
間違い等ありましたらご気軽にコメントください。

# SOLID原則とは

多くの設計で用いられている考え方を原則としてまとめたものです
以下の5つの原則があります

S：SRP、単一責任の原則
O：OCP、オープン・クローズドの原則
L：LSP、リスコフの置換原則
I：ISP、インタフェース分離の原則
D：DIP、依存性逆転の原則
第4回は、インタフェース分離の原則についてまとめました

# I：インタフェース分離の原則(ISP: The Interface Segregation Principle)

### 守るべきルール

クライアントに、クライアントが利用しないメソッドへの依存を強制してはならない

### ルールを守らないとどのような問題が起きるか
- インターフェースが肥大化することになり、肥大化したインターフェースを継承したクラスは、関係のないメソッドの実装をしなければならなくなります。結果的に、継承先でメソッドを退化させてしまうことになり、リスコフの置換原則に違反することになります
- 関係のない定義をインポートしなければならないので、「不必要な複雑さ」や「不必要な繰り返し」が発生してしまいます。

### どうすべきか
- クラスは、実際に自分が利用すべきメソッドだけに依存すべきです
- そのためには、インターゲースを分離して、必要なインターフェースのみ継承すべきです
- 必要なインタフェースが複数になった場合は、それらのインターフェースを多重継承するのが良いでしょう(多重継承以外にもやり方はあります)

第5回では、依存性逆転の原則について説明します
【入門】ubuntu18.04にLaravel5.8のプロジェクト作成する手順

## やること
ubuntu環境にLaravelプロジェクトを立てるまで。
初めてLaravelを触るので、間違いやより良い方法があったら教えてください。

### 前提となるバージョン情報
ubuntu  18.04
php     7.2.15
mysql   5.7
apache  2.4
Laravel 5.8

## 手順
### Laravelに必要な要件を揃える
[こちらのサイト](https://www.ritolab.com/entry/22)にあるように以下の要件を満たしていないとLaravelは正常に動かない。
今回はLaravel5.8を使うので、以下の要件を満たす必要がある。

```
PHP >= 7.1.3
OpenSSL PHP Extension
PDO PHP Extension
Mbstring PHP Extension
Tokenizer PHP Extension
XML PHP Extension
Ctype PHP Extension
JSON PHP Extension
BCMath PHP Extension
```

確認のためには以下のコマンドを叩いて確認する

```shell:phpのバージョンを確認する
$ php -v
PHP 7.2.15-0ubuntu0.18.04.2 (cli) (built: Mar 22 2019 17:05:14) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.15-0ubuntu0.18.04.2, Copyright (c) 1999-2018, by Zend Technologies
```

```shell:PHPExtensionの確認をする
$ php -m | grep -e openssl -e PDO -e mbstring -e tokenizer -e ^xml$ -e ctype -e json -e bcmath
bcmath
ctype
json
mbstring
openssl
PDO
tokenizer
xml
```

引用 [PHPフレームワークLaravelのインストール入門編](https://www.ritolab.com/entry/22)

### composerをインストールする

以下のコマンドを叩けば完了する。

```shell
curl -sS https://getcomposer.org/installer -o composer-setup.php
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
composer
rm composer-setup.php
```

引用 [Ubuntu 18.04にComposerをインストールする](https://blog.sioyaki.com/entry/2018/12/05/174323)

composerコマンドを叩いて以下のように表記されればおk

```shell
$ composer 
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.8.4 2019-02-11 10:52:10

```

### apacheの設定をする

Laravelではフロントコントローラ設定をする必要があるが、少なくともLaravel5.8においてはフレームワークに含まれている.htaccessファイルが勝手に設定してくれる。しかし、そのままだとエラーになる場合があるため一応確認。

#### DocumentRootの変更
初期設定だとDocumentRootは/var/www/htmlになっているが、Laravelでプロジェクトを立てるとその通りにはならないため、そこに合わせて設定を変更する。

```apache:/etc/apache2/sites-available/000-default.conf

 # DocumentRoot /var/www/html ←元の記述はコメントアウトか削除してください
DocumentRoot /var/www/html/myproject/public
```

#### rewrite_moduleの有効化

index.phpへのrewriteを動かすために以下のコマンドでrewriteモジュールを有効化させる必要がある。

```shell

$ a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
  service apache2 restart
```

#### .htaccessの許可

もし上記だけでうまくいかなかった場合、.htaccessファイルによる書き換えが許可されていない可能性がある。その場合、以下の記述を/etc/apache2/apache2.confあたりに入れると許可される。

```apache

<Directory /var/www/html/>
    AllowOverride All
    Require all granted
</Directory>
```

### Laravelのインストール

Laravelコマンドとcomposerコマンドの2つのやり方があるらしいが、自分はcomposerコマンドでやった。
my_projectのところに任意のプロジェクト名を入れる。
インストールには時間がかかるので3〜5分程度待ちましょう。

```shell
$ cd /var/www/html
$ composer create-project laravel/laravel --prefer-dist my_project 5.8
```

正常にインストールが完了すると以下の記述が表示されます。

```
Application key set successfully.
```

### 画面で確認
あとは画面で表示されるかを確認してください。
ローカル環境の場合はデフォルトでlocalhostとなっているので、ブラウザのアドレスバーに入力すれば画面が見れます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/206138/b824a13f-41e2-ddd5-74cc-9e8fee70ab9c.png)
cronの設定

#cronの設定
[crontabの設定方法について](http://www.sassy-blog.com/entry/20170914/1505362180)
cronとは***スクリプト***を定期実行するデーモン

***状態確認と起動***

```
/etc/rc.d/init.d/crond status
/etc/rc.d/init.d/crond start
```

***cronの実装 ユーザのcrontabに追加***

```
crontab -e
```

***時間の書き方***
毎日7時30分に/home/hoge/homge.shを実行する
[分] [時] [日] [月] [曜日] [コマンド]

```
30 7 * * * /home/hoge/homge.sh
```

#n秒毎にスクリプトを実行する
***未実証***

```
* * * * * for i in `seq 0 5 59`;do (sleep ${i}; 【実行したいコマンド】 ) & done;
```
調子に乗ってAWS認定セキュリティ専門試験受けたら不合格だった話

先日、AWS認定セキュリティ専門試験を受けてきました。
少し前に[模試を受けてみました](https://qiita.com/ikegam1/items/38479e8beff390859d27)が、それほど準備期間無しでもいけちゃうんじゃないかという感触だったのでついカッとなって。。

## property

- サンプルもガイドも見ずに模試を受けて50%の正答率
- アソシエイト、プロは取得済
- 業務ではあまりセキュリティ、セキュリティしてない
- 業務でawsは使っている
- aws歴2年未満
- aws認定はここまでストレート合格

## 事前準備
#### 2～3日前
通勤時に[サンプル問題の日本語訳](https://dev.classmethod.jp/cloud/aws/scs-spring-2018-sample-questions/)を見ておく。(1H程度)
#### 前日夜
模試の問題を見返しつつ、awsのサービスについて調べる(1.5H程度)
#### 当日AM
模試の問題を参考にしつつ、下記のサービスについてググって調べていく(3H程度)

- KMS(CMK)
- aws Config
- iam + S3
- ssm
- inspector
- guard duty
- trusted advisor
- cloud trail

模試に出てきたあたりは調べておきます。

## 試験(14:00~)
会場には30分以上前に行き、受付をおこないます。
最近はいつも歌舞伎座のセンターにしています。
ここはチャットとかがないから気楽。
ちなみに受付の人は14:30からと勘違いしてた。曰く「勝手に変わっていた」とか。
そして14:00からと思っていたら、準備ができたらすぐ受けていいとの事。
ギリギリまでblackbeltでも眺めていようかと思ってたんだけど・・もう脳使うの疲れたし、いっちゃいますかー。
そんなわけで13:30過ぎぐらいから試験開始です。

### 難易度

サンプル問題や模試の問題と比べると一段深いです。。超焦る。これまでは模試の方が本番より難しい事が多かったし、少し舐めてたんですが。。
事前にやった事以外でのキーワードだと、

- フォレンジックインスタンスやら分析やら
- Athena
- コンテナ関連
- S3周りの複雑なやつ
- X-RayとかAWS Artifactってなんじゃい

かなぁ。すでに少し忘れてきてるな。。

そして**ニホンゴムズカシイ** 
何言ってんのこの問題。わかんねー、みたいなのが3問くらいはあったと思う。思わずフリーズしてしまうようなヤツ。英語がわかれば英語に切り替えればいいんだろうけど。

ちなみに70分を残して問題は一通り終えました。文章量が多くて読むのに時間がかかる問題は少なかった。
そしてフラグ打っといたのを見返して残り30分。考えてもわからんだろう、というような問題は深く考えないようにしたんだけど、英語に切り替えて見てみるぐらいはしておけばよかったなー。もうこれ以上は考えても変わらんか、と思い30分を余して終了しちゃいました。

## 結果

![95.png](https://qiita-image-store.s3.amazonaws.com/0/308709/e56aff30-9759-4d07-e3bb-df8af373f03d.png)

![96.png](https://qiita-image-store.s3.amazonaws.com/0/308709/ae4e3e15-9b4a-e438-1d9c-6e74a3a3bf72.png)

**711点**

でした。
65問だし、1問あたり14点くらい？
だとするとあと3問で合格か。もうちょっと準備時間を取っておいて、最後の粘りもしっかりやっておけば届いたか？ってくらいでしょうか。

## 再試験に向けて

さて、何を強化しましょうか。
また落ちたら目も当てられないし、あと3問って考え方だと厳しい。800点目指すとして、あと6~7問か。

- フォレンジック検査のあたり
- クロスアカウントやidp使う際のバケットポリシーのあたり
- Dynamodbと暗号化のあたり
- S3の暗号化のパターンのあたり
- あれ、cloudwatch logsじゃなくてkinesisだったかな？
- Amazon S3 Glacier の Vaultがどうたらってあたり
- KMS再強化
- config、trail、trusted advisorかの違いのあたりを復習
- waf、inspector、guard dutyの違いのあたりを復習

このへんをちゃんとやっとけばいけるかなぁ。近いうちにもっかい受けようと思います。
受かったら次は機械学習に進みたい。

## 追記
再試験、GW明けにスケジューリングしました。再試験だとバウチャーで半額にできるんですね。知らなかった。