OmniAICreator/Qiita-1.07M huggingface dataset:
`method-override`はルーティングの前に読み込む

# `method-override`はルーティングの前に読み込む

ExpressでHTMLフォームからPUT, DELETEを発行したい場合、
[method-override](https://github.com/expressjs/method-override) パッケージを使用するのが一般的です。
が、一向にPUTが呼ばれなくてかなりハマったのでメモしておきます。

結論としてはタイトルの通り、`method-override`の読み込みはルーティングの前に書きましょう。
これで動作するようになりました。

```js:app.js
const methodOverride = require("method-override");
const routes = require("./presentation/routes");

app.use(methodOverride("_method")); // <= !!! ルーティングの前に書く !!!
app.use("/", routes); // ルーティングの定義
```

まあ、SPAとかになればAjax通信すると思うので、HTMLフォームから呼びたいケースは少なくなっていくと思いますが。。。

## 補足

一応気が付いたきっかけをメモっておきます。(解釈が間違ってたらすみません)
`method-override` の公式に書いてある、

```js
app.use(methodOverride((req: Request, res: Response) => {
  if (req.body && typeof req.body === "object" && "_method" in req.body) {
    // look in urlencoded POST bodies and delete it
    const method = req.body._method;
    delete req.body._method;
    return method;
  }
}));
```

にブレイクポイントを張ってステップ実行していると以下に辿り着きます。

```js:node_modules/method-override/index.js
    // replace
    if (method !== undefined && supports(method)) {
      req.method = method.toUpperCase()
      debug('override %s as %s', req.originalMethod, req.method)
    }

    next()
```

結局`method`を置き換えて`next()`を呼んでるんだから先に読み込まないとだな、と思った次第でした。

根本的にはパッケージ(というかミドルウェア)の読み込み順に気をつけようという話にもなるかと思います。
行列とは何なのか

#行列とは、数字や記号を集めてまとめて書いただけのものです

**２×２の行列の例**
$$\begin{pmatrix}1 & 3 \\\5 & 2 \
\end{pmatrix}$$
これ自体には何の意味もありません。「1」,「3」,「5」,「2」という数字が入っているだけです。

しかしいつも扱っている数字や記号もよく考えると、それ単体では何の意味も持たないものです。

数字：「1」という数字が書かれてあったとしても、それだけでは本来何の意味もないです。そこに「1」という記号があるだけです。順序があり単位をつけたり演算することによって意味がでてきて、意味があるからこそ認識しやすいわけです。日常で数字を扱うときは必ず単位がついています。だから違和感なく数字を扱えます。


　**日常に出てくる数字の例**
　１００個、１００円、１００メートル⇒必ず単位がセットになっている
　１００倍⇒対象元には単位がついているはず

行列：日常的に扱うことが無いのでイメージが湧かず分かりにくいのですが、単独の数字と同じく、行列があるだけでは何の意味もないです。ここに演算を入れることで意味がでてきます。他の行列やベクトルに対して作用させることで、元データを変換する役割があります。

#行列の積の演算

n次元のデータがあるとします。ベクトルで書くと
$$x=\begin{pmatrix}x_{1}\\\
\vdots\\\x_{n}\end{pmatrix}
$$となります。この$x$に対して、実数$a_{ij}$たちをかけて
　　$y_{1}=a_{11}x_{1}+a_{12}x_{2}+・・・+a_{1n}x_{n}$
　　$y_{2}=a_{21}x_{1}+a_{22}x_{2}+・・・+a_{2n}x_{n}$　　（１）
　　$\vdots$
　　$y_{n}=a_{n1}x_{1}+a_{n2}x_{2}+・・・+a_{nn}x_{n}$


$このように別のベクトル　y=\begin{pmatrix}y_{1}\\\
\vdots\\\y_{n}\end{pmatrix}　をつくります。$

この変換を一次変換といいます。一方で$x$に作用させた$a_{ij}$たちをそのまま行列で書いたものを$A$とおくことにします。

$$A = \left(\begin{array}{c@{}c@{}c@{}c}
a_{11} & a_{12} & \cdots & a_{1n} \\\
a_{21} & a_{22} & \cdots & a_{2n} \\\
\vdots & \vdots & \ddots & \vdots \\\
a_{n1} & a_{n1} & \cdots & a_{nn}
\end{array}
\right)$$

行列$A$をベクトル$x$に（１）の演算をしてできたのがベクトル$y$です。このとき、$y=A・x$と書き、これを行列$A$とベクトル$x$の積といいます。

#行列を使うメリット
①　式がシンプルに書けるからです。（１）のようにずらずらと書くよりも$y=A・x$の方がいいですね。また、多次元の線形回帰モデル $y=Xb+ε$ の $b$ の推定は下記のように簡単な形で書けます。$$\hat{b}=(X^TX)^{-1}X^Ty$$

②　行列自体の特徴を調べることによって、簡単に良い結論が導けるときがあります。例えば行列$A$で$a_{ij}=a_{ji}$のときに実対称行列といいますが、このとき固有値は実数で存在することが知られており、主成分分析などではこの事実が重要となります。
ROS2におけるservice/client，publish/subscribeのネスト

[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)

serviceの中で更に他のserviceを呼び出したい場合の話．
まだメモ状態

# 概要
二つのnode(node Aとnode B)があり，それぞれserviceを提供しているとする．
ここでnode Aのserviceに対して演算を行うときに，一部の処理をnode Bに任せたい場合，serviceの中でnode Bへのclientを使用してnode Bのserviceを使用する．

# ポイント

- node Aのserviceの中
    - node Bのclientのcallback groupのtypeをreentrantにする
- node Aの実行をMultiTheadedにする

# 適当コード: node Aのクラス

```c++:node_a.hpp
class NodeA : public rclcpp::Node{
private:
  rclcpp::callback_group::CallbackGroup::SharedPtr grp_;
  rclcpp::Client<[node Bへのsrvメッセージ]>::SharedPtr clnt_;
  rclcpp::Service<[node Aが提供するsrvメッセージ]>::SharedPtr srv_;
  void handleService_(
    const std::.... 普通のsrv用handler
  );
public:
  NodeA();
};
```

```c++:node_a.cpp
NodeA::NodeA()
:Node("node_a_node"){
  grp_ = this->create_callback_group(rclcpp::callback_group::CallbackGroupType::Reentrant);
  clnt_ = this->create_client<[node Bへのsrvメッセージ]>(
    "[node Bのserviceの名前]",
    rmw_qos_profile_services_default,
    grp_
  );
  srv_ = this->create_service<[node Aが提供するsrvメッセージ]>(
    "[node Aのserviceの名前]",
    std::bind(&NodeA::handleService_, this, _1, _2, _3)
  );
}

void NodeA::handleService_(
    const std::.... 普通のsrv用handler
  )
{
  using namespace std::chrono_literals;

  auto req_for_node_b = std::make_shared<[node Bへのsrvメッセージ]::Request>();
  req_for_node_b->a = ... // req_for_node_bへちゃんと値を代入
  auto res_future = clnt_->async_send_request(req_for_node_b);
  if(res_future.wait_for(15s) == std::future_status::ready){
  ...// res来た時の処理
  }else{
  ...// 15秒まってこなかった時の処理
  }
}
```

```
  if(res_future.wait_for(15s) == std::future_status::ready){
  ...// res来た時の処理
  }else{
  ...// 15秒まってこなかった時の処理
  }
```
は以下の一行でもいいかも．ただし，res来なかったらずっと止まる．

```
  res_future.wait();
```

# 適当コード: node Aを呼び出す側のターゲット

```c++:
#include <rclcpp/rclcpp.h>
#include "node_a.hpp"

int main(int argc, char* argv[]){
  rclcpp::init(argc,argv);

  rclcpp::executors::MultiThreadedExecutor exec;
  auto node = std::make_shared<NodeA>();
  exec.add_node(node);
  exec.spin();

  rclcpp::shutdown();
  return 0;
}
```
Vueのcomputedの処理について調査

## はじめに
>算出プロパティは、リアクティブな依存関係が更新されたときにだけ再評価されます。

公式のこの部分についてどのように評価されるのか検証してみました。

今回はチェックボックスの合計値を3種類の関数で実行し、関数が何度処理されるかを調べました。
![スクリーンショット 2019-06-18 18.45.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169514/c55c4a8a-b024-ef70-7327-09043841a06b.png)
## data
```
data () {
    return {
        // チェックされたチェックボックスの値を配列で保持
        checked_values: [],
        amount: {
            p01: 0
        },
        processing_time: {
            p01: 0,
            p02: 0,
            p03: 0
        }
    }
 }
```
## methods
```
methods: {
    exec_verification: function() {
        this.process01
        this.process02
        this.processing_time.p03 = this.process03
    }
}
```
## computed
###　process01
- チェックボックスの値の合計値を算出する

```
computed: {
    process01: function() {
        let sum = 0
        this.checked_values.forEach(function(num) {
            sum += Number(num)
        })
        this.amount.computed = sum
        this.processing_time.computed++
    }
}
```
###　process02
- process01で算出した合計値を別プロパティに代入する

```
computed: {
    process02: function() {
        this.amount.a02 = this.amount.a01
        this.processing_time.p02++
    }
}
```
###　process03
- process01で算出した合計値を別プロパティに代入する

```
computed: {
    process03: function() {
        let num = this.processing_time.p03
        num++
        return num
    }
}
```
##検証
#### 計算ボタンを押下
![スクリーンショット 2019-06-18 19.12.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169514/a5d9faf1-a2da-029f-2b61-788a731eff3b.png)![スクリーンショット 2019-06-18 19.13.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169514/f88107a8-0415-fd42-edac-38ed740ddc90.png)
process03は押下しただけ処理が行われます。
process03ではプロパティ`processing_time.p03`を参照しているのですが、メッソドの外でプロパティを更新している為、キャッシュされているプロパティと異なると判断され毎回処理が走ります。
#### チェック箇所は異なるが合計値は同じ
![スクリーンショット 2019-06-18 19.19.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169514/64001ef4-0586-cc6e-05ff-46e0cdd38be0.png)![スクリーンショット 2019-06-18 19.19.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169514/2cfa309b-0b92-e39b-ae22-7f57a2689aa7.png)
process01の実行回数は増えています。
process01ではプロパティ`checked_values`を参照していますが、チェックしている箇所が異なっているためキャッシュしているプロパティと異なるということで処理が走っています。
process02はプロパティ`amount.a01`を参照していますが合計値は変わっていないので処理が走っていないということになります。
Git等のプロキシを一括設定するバッチファイル[Windows]

プロキシという名の<b>『吐き気を催すほどの邪悪』</b>．

一括設定バッチファイルを組んで，少しでも作業を効率化してやろうと，模索した．

# 注意事項
 - hgについては予め，proxy有りを想定した```mercurial.ini```を```mercurial.ini.proxy.txt```として，proxy無しを想定した```mercurial.ini```を```mercurial.ini.noproxy.txt```として，ユーザーフォルダに作成しておく．
 - netsh winhttpに関してはWindows 10の「設定アプリ」（8.1以前の場合は「インターネット オプション」）を流用するので，バッチファイル実行前にあらかじめ設定しておく．
 - 管理者権限で実行すること（proxy_pip.batを除く）．

# プロキシ一括設定
```proxy_set.bat
echo off

rem プロキシ設定
set USER_PROXY_ID="username"
set USER_PROXY_PASS="password"
set USER_PROXY="proxy.example.com:8080"

rem netsh winhttp(ここだけGUI設定からのインポート)
netsh winhttp import proxy source=ie

rem git
git config --global http.proxy http://%USER_PROXY_ID%:%USER_PROXY_PASS%@%USER_PROXY%
git config --global https.proxy http://%USER_PROXY_ID%:%USER_PROXY_PASS%@%USER_PROXY%

rem hg
copy /Y %USERPROFILE%\mercurial.ini.proxy.txt %USERPROFILE%\mercurial.ini
```

# プロキシ一括解除

```proxy_unset.bat
echo off

rem netsh winhttp
netsh winhttp reset proxy

rem git
git config --global --unset http.proxy
git config --global --unset https.proxy

rem hg
copy /Y %USERPROFILE%\mercurial.ini.noproxy.txt %USERPROFILE%\mercurial.ini
```

# pipについて

 - ユーザーフォルダに，以下のバッチファイルを作っておき，コマンドプロンプトから実行する．以下の設定はコマンドプロンプトの今実行中のプロセスにのみ適用される．（なので，解除したければ一回コマンドプロンプトを閉じればOK）
 - 実行するときのコマンドは```%USERPROFILE%\proxy_pip```

```proxy_pip.bat
set HTTP_PROXY=http://username:password@proxy.example.com:8080
set HTTPS_PROXY=http://username:password@proxy.example.com:8080
```
artisan config:cache した後にロールバックする時はキャッシュファイルを手動で消す！

テスト環境にデプロイする時、gitからソースコードをチェックアウトしキャッシュファイルを作成していた。

```
$ git pull --no-ff --no-edit origin develop/1.0
$ php artisan config:cache
```

ただロールバックする必要があったので、一度マージ前のコミットに戻ってキャッシュファイルを再生成した所、エラーが出た。


```
$ git reset --hard HEAD^
$ php artisan config:cache
In ProviderRepository.php line 208:

  Class 'App\Providers\TestServiceProvider' not found
```

最初にチェックアウトしたコードに含まれるTestSerciveProviderクラスを探しに行っているが、ロールバックしたのでクラス定義ファイルはなくエラーになっているようだ。

キャッシュファイルが悪さしているだろうと思い、 `artisan config:clear` や `composer clear-cache` を実行するが解消しなかった。

`composer dump-autoload` し直すも状況は変わらず。

```
$ composer dump-autoload
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover

In ProviderRepository.php line 208:

  Class 'App\Providers\TestServiceProvider' not found


Script @php artisan package:discover handling the post-autoload-dump event returned with error code 1

$ php artisan config:cache
In ProviderRepository.php line 208:

  Class 'App\Providers\TestServiceProvider' not found
```

色々ネットで調べてもいまいち原因が分からず10分ほど経過した頃、TestServiceProviderクラスの読み込みは確かconfig/app.php に記載してたなーと思っていたら原因に気づいた。

`php artisan config:cache` した時に生成していた bootstrap/cache 以下のキャッシュファイルに今はもう存在しないクラスが記載されていて、これを消したり再生成したりしようにも artisan コマンドが最初にこのファイルを読みに行ってエラーになっていたようなので手動で削除したところ、問題なくキャッシュし直す事ができ、無事解決！

```
$ php artisan config:cache
Configuration cache cleared!
Configuration cached successfully!
```
Windowsにnode.jsをインストールしようとして権限不足失敗するのを回避する

# はじめに
Windowsにnode.jsをインストールしようとすると，
you don't have sufficent privilege なんとかかんとか
でインストールが失敗することがあります．
アラートボックスにはAdminアカウントでログインしなおせ，と書かれていますが，コマンドプロンプト画面からインストーラを起動するとうまくいくことがあります．
# コマンドプロンプトからのMSIインストール
***ステップ1.***コマンドプロンプトを「管理者で実行」で起動します．
***ステップ2.***ダウンロードしてきたMSIファイルの置かれているフォルダに移動します．たいていDownloadsだろうと思います．
***ステップ3.***このステップはオプションです．スキップしてステップ4に進み，だめだったらここに戻ってきて
再度ステップ4を行います．
次のコマンドを実行して権限をもらいます．コマンドが正常終了していることを確認します．
C:\Users\hata\Downloads>net user Administrator /active:yes
コマンドは正常に終了しました。
***ステップ4.***MSIファイルをインストールするコマンドを起動します．
C:\Users\hata\Downloads>msiexec /i node-v10.16.0-x64.msi
このあとは，インストール用のウィンドウが新たに開きますので，
通常のインストール手順に従って作業します．
***ステップ5.***確認
インストールに使ったコマンドプロンプト画面はいったん閉じて，
新たに普通の権限で新しいコマンドプロンプト画面を立ち上げてnodeとnpmが
起動できることを確認します．
C:\Users\hata>node --version
v10.16.0
C:\Users\hata>npm --version
6.9.0
一度使ったらクセになるpandas-profiling

# はじめに
何番煎じなのかわかりませんが、自分は最近pandas-profilingというライブラリを知ったので
使ったみた結果を記事に残します。
正直、もっと早くから使っとけばよかったと思いました。

# インストール
```
pip install pandas-profiling
```

# 使ってみた
```python:
import pandas_profiling
import seaborn as sns
```
seabornのirisとtitanicに対して使用していきます。

```python:
iris_data = sns.load_dataset('iris')
titanic_data = sns.load_dataset('titanic')
```
## Iris

実装もかなり簡単。
変数に入れなくてもnotebook上に表示できるけど、
後にファイル保存する場合は変数に格納した方がいいかと思います。
最終的にはHTMLファイル形式で出力した方が見やすいため、個人的には変数に格納するのをおすすめします。

```python:
iris_profile = pandas_profiling.ProfileReport(iris_data)
iris_profile
```
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/2ef8c124-81b1-38b2-c101-6dc32777e7d1.jpeg)
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/74289ab0-c14a-dcb9-e833-9454d547ebaf.jpeg)
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/ae105a28-bf7a-76b0-f3da-b20910f297e3.jpeg)

Toggle detailsをクリックするとさらに詳細な情報を確認できます。

![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/cfc049cd-8137-b752-8243-ce9a99b57754.jpeg)
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/7130a562-7733-c97b-e2dd-e6fa04c14a0d.jpeg)
![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/5f45bb53-e260-0df2-35f4-c277d221cf35.jpeg)
![WS000006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/e9ae7778-ddbb-513c-9662-87d1e93202db.jpeg)

その他の特徴としては、今回の場合だとpetal_widthがpetal_lengthとの相関が高いという警告を出してくれています。
特徴量選択の参考にするといいと思います。

## Titanic
引き続きtitanicのデータも適応していきますが、
titanicデータほどの列数だとnotebook上はスクロールで表示されるため見辛いです。

```python:
titanic_profile = pandas_profiling.ProfileReport(titanic_data)
titanic_profile
```
![WS000007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/2b813fc0-47bf-c8f3-14c0-dff641cf94da.jpeg)

したがって、そういう場合はHTMLファイルに保存してから見ると良いかと思います。

```python:
titanic_profile.to_file(outputfile="titanic.html")
```
![WS000008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/db5507d3-90ed-e056-bc48-f5d32ccd556d.jpeg)
![WS000009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/b0d82a78-36e5-f8cf-f926-2eeb5f8fd2f4.jpeg)
![WS000010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/ae3271b3-20c7-c96a-e421-d09c1630cef1.jpeg)
![WS000011.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/38a09dcd-1908-b5da-c1f6-ba67f1f74d37.jpeg)
![WS000012.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/c4a689bd-2b6b-bca3-7315-2efb34e3cb30.jpeg)
![WS000013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/cfbb514c-d0c0-3821-8dc2-81d6a4cc2eca.jpeg)

# まとめ
kaggleではあまり使われている印象はないですが、かなり便利です。
参考：
https://nbviewer.jupyter.org/github/JosPolfliet/pandas-profiling/blob/master/examples/meteorites.ipynb

# 追記
kaggleのkernelで試しましたが、表示レイアウトがかなり崩れました。
やはりHTML出力で使うのが一番良さそうです。
定時ダッシュの為のLINE Notify

# 前置き
つい先日LINE Notifyというサービスがあることを知ったので試してみたい。
シンプルなコードで、定時5分前にスマートに通知を受け取り、スマートに定時ダッシュしたいと思う。
スマーホでは通知に気付きにくいがスマートウォッチがあれば、それこそスマートに通知を受け取れる。

### 環境
* MacOS Mojave 10.14.5
* Python 2.7.16


# 実装

leaving_work_notify.py

```py
# -*- coding: utf-8 -*-
import requests

url = "https://notify-api.line.me/api/notify"
access_token = 'ここにアクセストークン'
headers = {'Authorization': 'Bearer ' + access_token}
params = {'message': '退勤5分前だよ！'}
requests.post(url, headers = headers, params = params)
```

* アクセストークンの発行は以下を参照
* https://qiita.com/moriita/items/5b199ac6b14ceaa4f7c9

# 検証

```shell
$ python /your/path/leaving_work_notify.py
```

これで即座にスマホ or スマートウォッチに通知が来る。

# クーロン登録
crontabを使って、平日の退勤5分前に自動実行する。

```shell
$ crontab -e
```

ここで詰まった。。
上のコマンドでviが開いたのだが、クーロンを書いて保存しても
もう一度開くと全然保存されていない。

```sh
$ crontab -l
```
してみても「何も登録されてない」って言われる・・

ググってみると解決方法が見つかった！

```sh
$ export EDITOR=vim
```

環境変数にエディタを明示的に指定してあげないとダメらしい。(参考： https://dev.classmethod.jp/etc/mac_de_cron/)

気を取り直して

```shell
$ crontab -e
```

```
55 18 * * 1-6 /your/path/python /your/path/leaving_work_notify.py
```


なんとかクーロンが登録出来た。


# まとめ
これで平日の18時55分に「退勤5分前だよ!」と通知が来るようになった。
祝日判定はこのライブラリが便利そう(https://github.com/Lalcs/jpholiday)
素晴らしいサービスなのでもっと良い使い道を見つけたい。

## 参考

参考にいたしました。ありがとうございます。

Qiita
 
* https://qiita.com/machiiyusuke/items/80de903c624054b3002f
* https://qiita.com/moriita/items/5b199ac6b14ceaa4f7c9

crontab

* https://dev.classmethod.jp/etc/mac_de_cron/

Pythonのrequestsライブラリってなんぞや？

* https://note.nkmk.me/python-requests-usage/

Pythonの祝日判定ライブラリ

* https://github.com/Lalcs/jpholiday

LINE Notify APIドキュメント

* https://notify-bot.line.me/doc/ja/
Hass.io(HomeAssistant)ローカル環境の公開

トンネリングサービスを使ってローカル環境を外部公開する

## [ngrok](https://ngrok.com)

<img src="https://ngrok.com/static/img/demo.png" width=80%>

```bash
$ wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-arm.zip
$ unzip ngrok-stable-linux-arm.zip
$ ngrok authtoken «Tunnel Authtoken»
Authtoken saved to configuration file: ~/.ngrok2/ngrok.yml
$ ngrok http 8123                                                                          ...
Forwarding                    http://aaaaaa.ngrok.io -> http://localhost:8123
Forwarding                    https://aaaaaa.ngrok.io -> http://localhost:8123
...
```

`https://aaaaaa.ngrok.io`へ接続

## [serveo](https://serveo.net)

<img src="https://uploads-ssl.webflow.com/570ee6bc69f0b4976a747d2d/5aab65dbcb0fa219b47b29e7_Illustration%20(4)-p-1080.png" width=80%>

```bash
$ ssh -R aaaaaa:80:localhost:8123 serveo.net
```

`https://aaaaaa.serveo.net`へ接続
ReactでuseContextを利用してDIっぽくする

## はじめに
React Hooks と Context API を利用して Service をどうにかDIっぽく利用してテスト可用性などをあげたいと試行錯誤した結果を簡単な例で紹介します。
(クラス名が適当です)

## サービス定義

サービスはクラスの他に Context と useContext する関数を返します。
この際、Context と useContext する関数は `{サービス名}Context` `use{サービス名}` のように機械的に名前をつけます。

```tsx:UserService.tsx
export interface User {
  name: string;
  age: number;
}

export class UserService {
  public async findByName(name: string): Promise<User> {
    const json = await window.fetch(`/api/user/${name}`)
      .then(resp => resp.json());

    return json as User;
  }
}

export const UserServiceContext = createContext(new UserService());

export function useUserService() {
  return useContext(UserServiceContext);
}
```

## サービス利用

サービスを利用する際はuseContextをラップした関数を呼び出します。

```tsx:User.tsx
export function User(props: { user: string }) {
  const userService = useUserService(props.user);

  const [user, setUser] = useState<User | undefined>(undefined);

  useEffect(() => {
    userService.findByName(props.user)
      .then(u => setUser(u));
  }, [userService, props.user]);

  return (
    <div>
      {user
        ? `${user.name} is ${user.age} year's old.`
        : 'loading...'
      }
    </div>
  );
```

## インジェクション

テストやstorybookなどではServiceをProvideして上書きします。

```tsx:User.story.tsx
class MockUserService extends UserService {
  public async findByName(name: string):  {
    return { name, age: 42 };
  }
}

storiesOf('user', module)
  .add('User', () => {
    const Wrapped = () => {
      return (
        <UserServiceContext.Provider value={new MockUserService()}>
          <User name="john" />
        </UserServiceContext.Provider>
      );
    };

    return <Wrapped />;
  });
```

## サービス間の依存

多くのケースでは決まったインスタンス渡しておけばどうにかなりそうな気がします。

```tsx:UserService.tsx
- export const UserServiceContext(new UserService());
+ export const userService = new UserService();
+ export const UserServiceContext = createContext(userService);
```

```tsx:OrgService.tsx
import { userService } from '.../UserService.tsx';
:
export const OrgServiceContext = createContext(
  new OrgService(userService),
);
```

## 最後に

規模が大きな場合とか複雑なケースではきちんとContextのインターフェースを定義したほうが良いと思いますが、小規模で変更がほぼないのにわざわざ定義するのがめんどうなのです。

おしまい
【Javascript初心者向け】じゃんけんゲームを作ってみる

#はじめに
個人的に小学生向けのプログラミング教室などで、指導をしたりしているので、Javascriptの初歩的なものを作ってみる。

初心者向きなので、コードの中にメモが多めにしています。
作っているバージョンは、Node.jsのv12.4.0と、Homebrew 2.1.6を利用しています。

#作るべきものを書き出そう

初心者がやるべきことは、*やるべきことを書き出してみること*。

5回戦を行う、じゃんけんゲームを作るとしたら、何が必要でしょうか？
必要な機能をざっと考えてみましょう。
そして無くてはならない機能と、あったら良いなと思う機能を、MUST要件とWANT要件に分ける。

###じゃんけんゲームに必要な要素
- MUST要件(無くてはならない機能)
    - じゃんけんに必要なグーチョキパーなどの配列やスコア表
    - 自分の手を入力する機能
    - 相手の手をランダムに出す機能
    - 勝ち負けを判断する機能
- WANT要件(あったら良いなと思う機能)
    - 最初に自分の名前を入力する
    - 5回勝負を行う
    - 最終スコアをだす
    - 最終スコアを出す前に、少し待機時間を作り、ドキドキ感をつくる

このようになります。
実際の場では、WANT項目はこの機能が本当に必要なのかを、考えながら作っていきます。

が今回は、すべての機能を作っていきましょう。

#コードを書く前の準備

下記２つは終わらせておきましょう。

####環境構築のやりかた
https://prog-8.com/docs/es6-env

####npmの使い方
https://prog-8.com/docs/npm-package

#機能をつくる

###最初に自分の名前を入力する

readlineSyncをつかって、自分の名前を入力する。

```js
import readlineSync from "readline-sync";

//ユーザー名を設定する
const userName = readlineSync.question("あなたの名前を入力してください：");
const enemyName = "相手";
```

###じゃんけんに必要なグーチョキパーなどの配列やスコア表

```js
//じゃんけんの出すものを決定する
const jankens = ["グー","チョキ","パー"];
//自分のスコアと、相手のスコア
const allScore = [0,0];
```
###下記機能4つ分

- 5回勝負を行う
- 自分の手を入力する機能
- 相手の手をランダムに出す機能
- 勝ち負けを判断する機能

```js
for (let　step = 0; step < 5; step++) {
  //自分の手を入力して、グーチョキパーのいずれかでなければもう一度手を選択
  const userNumber = readlineSync.questionInt("何を出しますか？\n（グーは1、チョキは2、パーは3）：",{limit: '$<1-3>'})-1;
  for(let none =0 ; none < 1 ; none++){
    if((userNumber >= 0) && (userNumber <=2)) {
      console.log("勝負開始だよ！")
    }else{
      console.log('1〜3で入力してね!');
      userNumber = readlineSync.questionInt("何を出しますか？\n（グーは1、チョキは2、パーは3）：",{limit: '$<1-3>'})-1;
      none-- ;
    }
  }

  //自分の手と、相手の手を、数字から文字列に変換する。
  const userJanken = jankens[userNumber];
  const min = 0,max = 2 ;
  let enemyNumber = Math.floor( Math.random() * (max + 1 - min) ) + min ;
  const enemyJanken = jankens[enemyNumber];

  //判定を行い、あいこであればもう一度戦う。勝ち負けが決まればスコアをつける。
  const result = console.log(`\n${userName}さんは${userJanken}、${enemyName}は${enemyJanken}だ！判定は……\n`);

  if(userNumber === enemyNumber){
    result;
    console.log("あいこ！もう一回！\n");
    step --;
  }else if ((userNumber === 0 && enemyNumber === 1) ||(userNumber === 1 && enemyNumber === 2) ||(userNumber === 2 && enemyNumber === 3) ) {
    result;
    allScoreResult;
    allScore[0] ++;
    console.log(`勝ったよ！${userName}さんにスコア1点プラス\n`);
  }else {
    result;
    allScoreResult;
    allScore[1] ++;
    console.log(`負けたよT_T${enemyName}にスコア1点プラス\n`);
  }

const allScoreResult = console.log(`\n自分のスコアは${allScore[0]}点、${enemyName}のスコアは${allScore[1]}点\n`);
}
```


###最終スコアを出す前に、少し待機時間を作り、ドキドキ感をつくる

```js
//終了後に最終スコアを算出する。
console.log("終了!!\n最終スコアを算出中だよ……");

//1秒まってから文字を出力する
function sleep(waitMsec) {
  // 現時刻 + さっき指定した時刻　< 引数分まつ(単位はミリ秒)
  var startMsec = new Date();
  while (new Date() - startMsec < waitMsec);
}

sleep(1000);
```

###最終スコアをだす

```js
//最終スコアを出し、勝利した人の名前を出す。
const finalScoreResult = console.log(`\n自分のスコアは${allScore[0]}点\n\n${enemyName}のスコアは${allScore[1]}点\n`);
if(allScore[0]>allScore[1]){
  console.log(`やったね！${userName}さんの勝利！`);
}else{
  console.log(`残念、${userName}の負けだよ……。`);
}
```
rails(graphq-ruby)に向けてパスワード等をqueryに乗せて送信するとログのparamsが[FILTERED]にならなくて丸見えになってしまうのをどうにかする

# 環境
* rails (5.2.3)
* graphql-ruby (1.9.3)

## 前置き

Rails.application.config.filter_parameters += [/password/, :query]
とかにすれば隠せるのですが、queryが全て[FILTERED]になってしまうのも悲しい

これが

```
Parameters: {"query"=>"mutation { updateUserPassword(input: { id: \"1\", password: \"password\", passwordConfirmation: \"password\" }) { errors } }}"
```

こうなっちゃう

```
Parameters: {"query"=>[FILTERED]}
```

## 対処する

filter_parametersはlambdaを許容しているらしいのでqueryパラメータのときは自前で置換をすることにする

```config/initializers/filter_parameter_logging.rb
graphqlQueryFilter = lambda do |k,v|
  return unless k.to_sym == :query
  v.replace v.gsub(/(password[a-zA-Z_]*:) \"([^\"]*)\"/) {
    "#{$1} \"#{ActionDispatch::Http::ParameterFilter::FILTERED}\""
  }
end

Rails.application.config.filter_parameters += [/password/, graphqlQueryFilter]
```

これでこんなかんじになりました

```
Parameters: {"query"=>"mutation { updateUserPassword(input: { id: \"1\", password: \"[FILTERED]\", passwordConfirmation: \"[FILTERED]\" }) { errors } }}"
```

ちなみに今回はclientのクエリを自前で生成していて文字列はダブルクオーテーションで囲むようにしているのでこれでOKでした、
ご自身の環境にあわせて正規表現部分に手を加えてください
自由なテキストをJSのみでクリップボードにコピー

onclickとかで下記を発火させればOK

```javascript

const copyToClipboard = () => {
  const userAgent = window.navigator.userAgent.toLowerCase();

  const textareaElement = document.createElement('textarea');

  textareaElement.value = `
    copyいけてる？
  `;
  document.body.appendChild(textareaElement);

  // safari対応
  // [TODO]ここできてなかった。。
  // この記事見て直す必要あり
  // https://qiita.com/sakuraya/items/33f93e19438d0694a91d
  if (userAgent.indexOf('safari') > 0) {
    const range = document.createRange();
    range.selectNode(textareaElement);
    window.getSelection().addRange(range);
  } else {
    textareaElement.select();
  }


  document.execCommand('copy');
  textareaElement.parentElement.removeChild(textareaElement);
};
```
【Capybara】idもnameもlabelも存在しないセレクトボックスのオプションを選択する

## はじめに
feature specを書いている時に、以下のようなセレクトボックスのオプションを選択しなければならない機会がありました。

- idない
- nameもない
- ラベルも存在していない

流石に情報が少なすぎる……と最初は絶望を覚えましたが、なんとか選択してやろうと奮闘したので、備忘録として纏めておきます。

## 環境
- capybara 3.9.0
- Rails 5.2.1
- Ruby 2.5.1

## どうやって選択するか
以下のようなソースがあったとします。

```sample.html
<tr>
  <td class="fruits_name">
    <select>
      <option value=""></option>
      <option value="1">りんご</option>
      <option value="2">バナナ</option>
      <option value="3">メロン</option>
    </select>
  </td>
  <td class="animal_name">
    <select>
      <option value=""></option>
      <option value="1">いぬ</option>
      <option value="2">ねこ</option>
      <option value="3">カワウソ</option>
    </select>
  </td>
</tr>
```

今回は `td` の中にあるセレクトボックスのオプション `バナナ` を選択しようと思います。
結論からいくと、以下のいずれかのコードで取得出来ます。

- `all` を使ってオプションを特定するパターン

```
find('.fruits_name').all('option')[2].select_option
```
- `nth-child` を使って特定するパターン

```
find('.fruits_name').find('option:nth-child(3)').select_option
```

- `find` を使ってオプションを特定するパターン

```
find('.fruits_name').find("option[value='2']").select_option
```

上記二つのポイントは選択したいオプション要素を取得することです。
要素さえ取得することが出来れば、あとは `select_option` を使うことで選択状態にできます。

- 素直に選択するパターン（※6/19 追記）

```
within '.fruits_name' do
  select 'バナナ'
end
```
コメントにて @jnchito さんに教えていただいたパターンです。
目からウロコでした……。
 `select` を使う時は　`select 'バナナ', from: '~~'` のように `from` を付けなきゃという意識がありましたが、無くても選択できるとは……！
教えていただきありがとうございます！:bow_tone1:

## 最後に
今回のパターンに出くわした当初は「どうやって選択するんだ？」と首を傾げていましたが、オプションさえ特定できれば選択できることを知ったことにより、そう難しくないと思えるようになりました。
これでセレクトボックスはもう怖くないです:muscle:
その他にも、何かいい選択方法があればコメントにて教えていただけると嬉しいです:bow:
【Rails】AWS Elasticbeanstalk上でassets:precompileが効かない& wicked_pdf_stylesheet_link_tag がエラーになる件の対策

最近、AWS Elasticbeanstalkにssh接続して`cd /var/app/current/`し(Rails.rootに移動し)、`bundle exec rake assets:precompile `を実行しても、処理が全く反映されなくて解決に時間がかかったので、今後のために原因と対策をメモしておく。

## 原因
https://qiita.com/yuyasat/items/4d93b4ad4f86a6e13d50 を見て気づいた。

>assets:precompile実行時には多くのCPU処理能力が求められますから、CPU処理能力が低いとassets:precompileは非常に遅くなってしまいます。t2やt3系の場合バーストしてくれてCPU処理能力は上がっていきますが、少なくとも一つのコアはつねに100%を保ちながら処理を続けることになります。したがって、t2.smallなどのコア数が１のインスタンスを使っているとその状態でアクセスが来ると処理能力を超えサーバーが落ちてしまいます。（確か503 Service Temporarily Unavailableになります）
それを回避するには、バーストしない（通常からCPU処理能力が高い）EC2インスタンスタイプを利用するか、assets:precompileをEC2上で行わないようにします。

対応していたElasticbeanstalkのEC2インスタンスタイプ: t2.small になっとるやん。。。

## assets:precompileが効かない対策
上記の記事では、EC2のインスタンスタイプを上げるか、CircleCI上でassets:precompileを走らせS3に上げ、それをデプロイ時にsyncするという方式、の２通りが掲載されていた。

しかし今回は、以前保守契約していたらしい受託環境の一時対応でお金かけられない、かつ、CircleCIとか当然使ってない、との事だったので、ローカルでassets:precompileさせ、対象プロジェクトのroot上で以下コマンドをターミナルより実施するという方法にトライした。
`git archive -v -o acc.zip --format=zip HEAD`

このコマンドでできたzipファイルをAWS ElasticbeanstalkのWEBコンソール画面からアップロードしてデプロイした。デプロイ自体は上手くいったが、今度は、`undefined method 'find_asset' for nil:NilClass`というエラーが発生するようになった。。

## wicked_pdf_stylesheet_link_tag がエラーになる件の対策

wicked_pdf_stylesheet_link_tagが動作していないのが原因だったようだ。
https://github.com/mileszs/wicked_pdf/issues/476 にその対策が記載されていた。
sprockets-railsのバージョンによって対応を変えないといけないっぽかった。

以下のファイルに記載されている以下の箇所をfalseからtrueに変更するだけで良い。

~~~Rails:config/environments/production.rb
config.assets.compile
~~~

細かなバグだが、ログに出ていない原因を見つけるのが大変だった。。。
DockerCompose+nginx+spring-bootで400BadRequest

# DockerCompose+nginx+spring-bootで400BadRequest
DockerComposeでnginxとspring-bootを同時に建てて、
nginxをリバプロとして利用しようとしたら、400BadRequestを食らってしまったので備忘も兼ねてメモ。

## 原因
nginxからspring-bootに流す際にホスト名としてコンテナ名を利用していたため。
DockerComposeでコンテナを起動すると、
``{プロジェクト名}_{サービス名}_{連番}``という法則でコンテナ名が付き、
同一DockerComposeで立てられたコンテナ同士はこのコンテナ名をホストとしてお互いに通信できます。

が、このホスト名でSpringBootにSpringBootに対してリクエストを投げると、
以下のエラーが出て400が帰ってしまいます。

``java.lang.IllegalArgumentException: The character [_] is never valid in a domain name.``

Tomcat8.5以降のバージョンではhost名制限が厳格になっており、_を含むホスト名は400で弾かれてしまうようです。
なお、設定等で対応できないのでどうしても使いたかったらTomcatやSpringBootをダウングレードするしかないとのこと。
参考：
https://stackoverflow.com/questions/53504857/the-character-is-never-valid-in-a-domain-name

## 対応
DockerComposeで立てられたコンテナ間は、docker-compose.ymlで指定したサービス名でも名前解決できます。
こちらを使えば_なしのホスト名に出来るので問題なく通信ができます。
Anypoint Platformでメール通知する

Custom Application NotificationとAnypoint PlatformのAlert機能を組み合わせることで、
ある条件のエラーが発生した場合にのみ、ある特定の人にメール通知を行う
などといった、アプリケーション内で柔軟なメール通知を指定することができます。

簡単なものを作成してみます。

※ Alert機能はCloud Hubにアプリケーションをデプロイする必要があります。

## アプリケーションの作成
![フロー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/f74cebd3-9c3d-2ad2-1599-c8db94ded455.jpeg)

1. トリガーとしてHttpリスナーを配置します。

2. デバッグ用にloggerを配置します。

3. CloudHubコネクターの「Create Notification」を配置します。

  > Anypoint StudioにCloudHubコネクターを追加する必要があります。
  > Mule Palletの「Add Module」でCloudHubを追加します。
  > Mule Palletにも存在しない場合は、「Search in Exchange」から探してください。 
  > ![SearchCloudHub.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/b43697f0-d702-0094-ed27-52f4575f945c.jpeg)

「Create Notification」の設定は以下のようになります。
![notification.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/e33108d3-85ee-5572-fc0b-3b9090976c66.png)


## デプロイ
プロジェクト右クリック > Anypoint Platform > Deploy to CloudHubで、CludHubにアプリケーションをデプロイしてください。
![deploy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/22bc94bc-f272-22d1-0a8c-d4638166abe4.png)

## アラートの設定
アプリケーションのデプロイが完了したら、次にアラート設定を行います。
CloudHubにログインして、Runtime Manager > 左のメニューからAlert > 右上の「＋」ボタンを押下して「Create an Alert」画面を表示します。
![alert.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/0a3c2370-5795-45aa-b8a8-422766d21b15.jpeg)

以下の内容を設定してください。

* Name：＜任意の名前＞
* Severity level：＜任意のレベル＞
* Source：server
* Application type：Cloud Hub Applications
* Application：＜デプロイしたアプリケーション＞
* Condition：Custom application notification
* Priority：＜任意の値＞
* Contains：＜Notificationで設定したMessage。ここでは「test」＞
* Subject：＜任意のメールのタイトル＞
* Message：＜任意のメールの内容＞
* Recipients：＜メール送信するユーザ＞

「Cerate Alert」ボタンを押下して、Alertを作成してください。

## 動作確認
これで設定は完了です。デプロイしたApplicationにアクセスしてみてください。
以下のようなメールが受信できれば成功です。
![メール.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367531/0ce24a83-1390-d64b-8835-5df1725fcbe8.jpeg)


## まとめ
今回は単純にメールを飛ばすだけのアプリケーションを作成しましたが、エラーハンドリングなどと組み合わせれば、必要な状況で必要な人にのみメール送信が可能になるかと思わます。
また、今回はCustom Application Notificationのメール送信を行いましたが、Alert機能では

* CPUやMemoryの使用状況
* デプロイ結果
* Workerのレスポンス

等によってもAlertメールの送信が可能なようです。
jQueryなしでイベントデリゲートを実装する

jQueryでなら書けるけど、ネイティブのJavaScriptだと書けない・・・を克服していく記録です。

## jQueryでの実装
イベントのデリゲートは`.on()`を使用して書きます。

```javascript:jQuery
$('親セレクタ').on('イベント名', '子セレクタ', (e) => {
  イベントの処理
});
```

## jQueryなしでの実装
`Element.matches()`を利用して書くことができます。
[Element.matches() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Element/matches)

まず、以下の関数を用意します。

```javascript:javascript
const isMatches = (elm, selector) => {
  // IE11対応  
  if (!Element.prototype.matches) {
    Element.prototype.matches = Element.prototype.msMatchesSelector;
  }
  return elm.matches(selector);
}
```
`elm.matches(selector)`はtrueかfalseを返します。
`Element.matches()`が使用できないブラウザ（IE11など）では、[Polyfill](https://developer.mozilla.org/ja/docs/Web/API/Element/matches#Polyfill)を使用します。

```javascript:javascript
document.addEventListener('イベント名', (e) => {
  let el = e.target;
  while (el && el !== '親セレクタ') {
    if (isMatches(el, '子セレクタ')) {
      イベントの処理
      break;
    }
    el = el.parentNode;
  }
}, false);
```
1. documentにイベントを設定、子要素で起きた全てのイベントを受け取る。
2. 実際にイベントの起きた要素から`parentNode`を使い、親セレクタに当たるまで親要素を参照していく。
3. 実際にイベントの起きた要素が子要素にマッチしたら、イベントの処理を行い、親要素の参照を終了。

## 実装サンプル
[https://codepen.io/kzmhrd/pen/XLmVpG](https://codepen.io/kzmhrd/pen/XLmVpG)

## 参考
- [JavaScriptでCSSセレクタを使ったEvent Delegationの実装](http://webdesign-dackel.com/2015/12/19/event-delegation/)
- [Element.matches() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Element/matches)
- [.on() | jQuery API Documentation](http://api.jquery.com/on/)
コールバックとは？？？

コールバックについてよく忘れてしまうことが多いので、備忘録としてしっかり言語化しておきます！

それでは:point_up:

## コールバックとは？
必要なタイミングで呼び出せるように、あらかじめ定義しておく関数のこと！

（簡潔で分かりやすい！）:relieved:

RailsとJavaScriptの具体例を見ていきましょう！

## Ruby on Rails
例・・・Twitterのような投稿SNSで、ユーザーが投稿を行ったら、textカラムに保存されるデータの最後に「！！！」を自動で追加してみます！

```ruby:tweet.rb
before_create :change_tweet

  def change_tweet
    self.text = text + "！！！"
  end

end
```

説明していきます！
上記のコードのselfには、これから保存されるTweetクラスのインスタンスが代入されます！
そのため、self.textと記述することで、ユーザーが入力した投稿のtextカラムを取得することができます！
それに、"！！！" を付け加えてるわけですね！

#### Railsのコールバックまとめ
オブジェクトの状態が変わるとき、すなわちオブジェクトが生成、更新、削除されるときや、バリデーションを実行するときの前後に共通の処理を追加する仕組みです！

## JavaScript

JavaScriptでは、コールバックを多用します!
例えば、jQueryのon()は、第二引数にコールバックをとります!

```javascript:sample.js
$('button').on('click', function() {
  console.log(this);
});
```
*コールバック内のthisは、イベントが発火した要素を参照します。

知らず知らずのうちにコールバックを使っていたんですね！

---

以上となります！
コールバックは、コントローラ同様にモデルにもvalidationの直前に実行される、before_validationであったり、saveの直後に実行されるafter_saveなど様々なタイミングで実行されるコールバックが存在します。

まだまだ奥は深そうですね...

活用できればとても便利なので、たくさん活用していきたいです。

それでは、ご静聴ありがとうございました:relaxed:
VS Codeのインデント展開と折りたたみ

# VS Codeのインデント展開と折りたたみ
よくYAMLとかVS Codeで編集しますが、インデントの展開と折りたたみのショートカットを、いつもわすれるので自分用にメモメモ

### ファイル全部折りたたみ
```Ctrl + K → Ctrl + 0```

### ファイル全部展開
```Ctrl + K → Ctrl + J```

### カレント全部折りたたみ
```Ctrl + K → Ctrl + [```

### カレント全部展開
```Ctrl + K → Ctrl + ]```


いろいろ細かいショートカットもあるけど、主に使うのはこれだけなので、これだけ記載
【Laravel】ミドルウェア操作方法


#ミドルウェアとは
リクエストがコントローラのアクションに届く前後に配置されるレイヤー層となるプログラムのこと。リクエストを受け取るとコントローラ処理の前後に割り込み、アクションの処理が実行される前後に独自の処理を実行する。
#ミドルウェア作成方法
ターミナルで以下のコマンドを入力します。

```
php artisan make:middleware ミドルウェア名
```
app/Http/Middleware内に作成される。

```
public function handle($request, Closure $next)
{
    return $next($request);
}
```
作成したミドルウェアクラスのなかにhandleメソッドというメソッドが1つだけがある。

- 第一引数はRequestインスタンスが渡される
   - リクエストの情報を管理
- 第二引数はClosureクラスのインスタンス
   - 無名クラス(クロージャ)
- $nextはRequestのインスタンス
 
このhandleメソッドにコントローラ前後に実行したい処理、新たなデータやmergeメソッドなど追記する。

#####コントローラの前に実行したい場合
```
public function handle($request, Closure $next)
{
    -----処理-----
    return $next($request);
}
```
#####コントローラの後に実行したい場合
```
public function handle($request, Closure $next)
{
    $request = $next($request)
    -----処理-----
    return $request;
}
```

最後に利用するミドルウェアを呼び出す処理の追記が必要。
routes/web.phpにルート情報にミドルウェアの呼び出し処理を追記する。

```
Route::get(.....)->middleware(利用するミドルウェアクラス)->middleware(利用するミドルウェアクラス);
```
あとはコントローラとテンプレートの修正をすれば、ミドルウェア作成完了！

#グローバルミドルウェア
グローバルミドルウェアは全てのアクセスで自動的に実行される。
app/Http/Kernel.phpのKernelクラスの$middlewareという変数の中にグローバルミドルウェアは配列としてまとめられている。
ここにルートを追記すれば、グローバルミドルウェアとなる。

#ミドルウェアのグループ化
複数のミドルウェアを管理する。app/Http/Kernel.phpのKernelクラスの$middlewareGroupsという変数の中にミドルウェアのグループの配列がある。
この配列の中に、グループ名とルート情報を追記すれば、グループ化できる。

※ 備忘録目的の記事です
[TypeScript 3.4] 配列のconstアサーションでUnion Typeを表現する

# はじめに
例えば以下のように、[Union Type](https://www.typescriptlang.org/docs/handbook/advanced-types.html#union-types)の定義とそれを扱う配列を定義したい場合、重複した内容を記述する必要がありました。
これを、3.4から導入された[const assertion](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions)を使ってスッキリ書く方法を紹介します。

```typescript
type fruitType = 'apple' | 'orange' | 'grape';
const fruits: fruitType[] = ['apple', 'orange', 'grape'];
```

## Union Typeを配列のconst assertionで表現
この方法だとUnion Typeを書かず、配列のみの記述でよくなります。
以下がその方法です。

```typescript
const fruits = ['apple', 'orange', 'grape'] as const;
type fruitType = typeof fruits[number];
```

## おわりに
配列のconstアサーションでUnion Typeを表現することを紹介しました。
この方法のおかげで、Union Typeの種類が増えるたびに配列を編集するようなことはなくなり、配列のみの編集で済むようになります。
lsでファイル作成日時をナノ秒まで表示する

##意外と知らない
lsよく使うけど、使うオプションは限られる

##ファイル作成日時をナノ秒まで表示する
ls --full-time

または、
ls -l --time-style=full-iso

でOK

##補足
2019/06/19
ミリ秒ではなくナノ秒で表示でしたのでタイトル変更しました。
別の表示方法も追記しました。
エクセルでJAVAアプリを超簡単生成！「ワンダーロボ」RadioButton、自動文字参照、参照項目の設定方法

画面項目種類設定で、「RadioButton」、「自動文字参照」、「参照項目」について説明します。
###ステップ1.RadioButtonの設定方法
###ステップ2.自動文字参照の設定方法
###ステップ3.参照項目の設定方法
---
###ステップ1.RadioButtonの設定方法

####1-1.画面設計書で設定
まずは、画面設計書での設定です。指定したい該当セルに、「○」を入力します。(この時の「○」は[記号]で入力してください。[数字]の０（ゼロ）だとエラーが発生します。)
※図1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/d8c710ef-8e86-f29a-c2f3-66d491691017.png)



次に、画面詳細設計に「RadioButton」を設定します。RadioButtonの設定方法が2つあります。
方法①：「リスト値マスタから」（例：消費：「1:10;2:20;3:30」参照）
方法②：「テーブルから」（例：テーブル「M_社員マスタ.社員名」参照）
※図2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/fbac082f-0d48-8ae8-173f-9aab79cd86b1.png)



####1-3.ファイルをインポートして確認
SaaSForceの開発環境にログインし、設計書ファイルをインポートします。そして、利用画面で反映されているか確認して完了です。
RadioButtonが設置され、性別に「男、女」が選択出来るようになり、部門に参照するテーブルを記載します。
※図3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/71cb1f55-7ed0-8fd7-d982-47f5ef05349d.png)

---
###ステップ2.自動文字参照の設定方法
次に、自動文字参照を説明します。自動文字参照は該当項目に入力すると、他の項目も自動で入力してくれる機能です。まずは、画面詳細設計にて記載します。

#####2-1.画面設計書で設計
ここでは、「社員名」項目に入力すると「社員」テーブルから「電話番号」「EMAIL」「LINE」情報を取得・参照し、自動的に入力するように設定します。
<img width="1128" alt="11.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/acc75e74-7e97-e444-73bc-dad17a2bc405.png">
<img width="1128" alt="10.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/9a20ec53-e53f-9d26-9897-9e7b2a6a55c6.png">

####2-2.設計書ファイルをインポートし確認
SaaSForceの開発環境にログインし、設計書ファイルをインポートします。そして、利用画面で反映されているか確認して完了です。
※図4
<img width="790" alt="12.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/053bc5b6-9752-12e3-bbec-3f94585a8611.png">

---
###ステップ3.参照項目の設定方法
最後に参照項目の説明をします。
####3-1.画面設計書で設計
「参照項目」は、「自動文字参照」と似た機能を持っています。「自動文字参照」と違って、1つの該当項目を指定して自動的に入力されます。今回の場合、「部門」のドロップダウンリストから該当項目を選択すると、「電話番号」欄に自動的に入力されます。
<img width="1128" alt="13.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/0c2703dd-2cb1-b0c5-2a03-f99fcea1f3f3.png">

####3-2.設計書ファイルをインポートし確認
SaaSForceの開発環境にログインし、設計書ファイルをインポートします。そして、利用画面で反映されているか確認して完了です。この段階だと、「電話番号」欄は何も入力出来ませんが、（図5参照）
※図5
<img width="731" alt="15.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/bee673fe-e935-0f5b-ecbc-f77d59743bda.png">
「部門」欄に「管理者S級」を選択すると、「電話番号」欄に自動的に入力されました。
<img width="776" alt="17.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/bc7eff86-c797-06d5-03d3-894a5cb9967d.png">
Vue.jsのSPAで、進む/戻るのアクションに応じてページ遷移のアニメーションを切り替える

## 概要
Vue.js＋Vue RouterのSPAで、`<transition>`を使うことによって、アニメーションを伴ってページ遷移を実現することができる。本記事では、ページが戻るときのアニメーションと進むときのアニメーションを切り替える方法をまとめます。
ソースコードはポイントになる部分しか書いていないので、そのままでは動かないかもしれません。

## 全体の流れ
1. `<router-view>`要素を`<transition>`で囲む
2. watchプロパティに`$route`を追加する
3. to, fromのページ番号を比較し、大小関係に応じてアニメーションを切り替える


## ソースコード
### router
ルーターはこんな感じで設定します。
ポイントは、メタ情報としてページ番号を定義するところです（キー名はなんでも良いですが、ここではmeta.indexとしています）。この番号を比較することで「進む」アクションなのか「戻る」アクションなのかを判定します。

```javascript:index.js
import Vue from 'vue';
import Router from 'vue-router';
import First from '@/components/First';
import Second from '@/components/Second';
Vue.use(Router);

export default new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      name: 'first',
      component:First,
      meta: {
        index: 0, // ページ番号
      },
    },
    {
      path: '/second',
      name: 'second',
      component: Second,
      meta: {
        index: 1,
      },
    },
  ],
});
```

### ベースコンポーネント
アプリケーションのベースとなるコンポーネントを編集します。
vue-cliでプロジェクトを初期化した場合は`App.vue`という名前で作成されます。`<router-view>`がルーティングで設定した各ページのコンポーネントが表示される部分になります。
ポイントは`watch`プロパティ内で`$route`を監視しているところになります。ここで、`$route`の遷移前、遷移後のルーティングオブジェクトを取得し、先程設定したメタ情報のページ番号を前後で比較することによって、進む・戻るのアクションに応じてアニメーションを切り替えることができます。

```vue:App.vue
<template>
  <div id="app">
    <v-app>
      <div class="app-header">
        <!-- ヘッダー画像 -->
      </div>

        <div class="app-content">
          <transition
            name="costom-transition"
            :duration="transition.duration"
            :enter-active-class="transition.enter"
            :leave-active-class="transition.leave"
            >            
              <router-view></router-view>
          </transition>
        </div>
      </v-app>
  </div>
</template>

<script>
export default {
  name: 'app',
  watch: {
    $route(to, from) {
      // アニメーションの切り替え
      if (to.meta.index > from.meta.index) {
        this.transition.enter = '進むときのenterアニメーション';
        this.transition.leave = '進むときのleaveアニメーション';
      } else {
        this.transition.enter = '戻るときのenterアニメーション';
        this.transition.leave = '戻るときのleaveアニメーション';
      }
    },
  },
  data() {
    return {
      transition: {
        enter: '',
        leave: '',
        duration: 100,
      },
    };
  },
};
</script>

```

## アニメーション
アニメーションの実装は[Animate.css](https://daneden.github.io/animate.css/)が手軽で便利です。
Active Directoryでコンピューターを移動してから保護

#問題

原因不明でコンピューターオブジェクトが消えてしまった。マネジャーは誰が消した！と大騒ぎだが、バイトさんさえDC接続許可しておいて犯人探しは虚しい。私は孔子より老子派だ。

#ソリューション

操作ミスとみなし、再発のないよう対策はする。
コンピューターオブジェクトの[誤って削除されないようにオブジェクトを保護する]プロパティをオンにしましょう。

##既存コンピューターの一括変更

```PowerShell
Get-ADComputer -filter * -Properties ProtectedFromAccidentalDeletion 
| where {$_.ProtectedFromAccidentalDeletion -eq $false} 
| Set-ADObject -ProtectedFromAccidentalDeletion:$true
```

## 新規コンピューター

コンピューターオブジェクトを指定OUに移動後、保護オン。

```move_computer.ps1
param(
    [string]$sid
)

function Move-Computer {
    param(
        [string]$sid
    )

    $cname = "${sid}"
    $obj = Get-ADComputer -LDAPFilter "(Name=${cname})"

    $ouName = "grp-${sid}"

    $tpath = Get-ADOrganizationalUnit -LDAPFilter "(Name=${ouName})"

    #まず、指定OUに移動
    Move-ADObject -Identity $obj.ObjectGUID -TargetPath $tpath

    #保護する
    Set-ADObject -Identity $obj.ObjectGUID -ProtectedFromAccidentalDeletion:$true

    $msg = "${cname} を移動・保護完了しました。"
    Write-Host `n $msg -foregroundcolor White -backgroundcolor Blue
}

Move-Computer -sid $sid

```

## 他スクリプトから参照時

```build.ps1
$path = "\\ad-server\share\ps1\move_computer.ps1"
Invoke-Command -ComputerName ad-server -FilePath $path -ArgumentList s-123
```

# 参考
https://blogs.technet.microsoft.com/mconeill/2015/04/12/protect-ous-from-accidental-deletion/
http://adfordummiez.com/?p=431
初めてのRuby2　〜Array, Hash, シンボル〜

##自分の自分よる自分のためのRuby説明
３ヶ月前の自分へ
以前に書いた記事の続きです:raised_hands_tone1:

##配列　Array
:star:配列とは : オブジェクトの入れ物
:point_up_tone1:入れ物は[]（四角いかっこ）
:point_up_tone1:仕切りは , (カンマ）

```
foods=["じゃがりこ", "かにみそ", "するめ"]
```

↑この場合、
foodsが変数
[]の中身全体 : Arrayオブジェクト
食べ物一つ一つ : Stringオブジェクト

#####配列からの取り出し方
```
animals=["ねこ", "きりん", "すずめ"]
animals[0]　→"ねこ"
animals[1]  →"きりん"
```

:warning:最初を取り出したい時は０だよ！

#####配列へ追加
```
animals=["ねこ", "きりん", "すずめ"]
animals.push("かば")
print animals →　["ねこ", "きりん", "すずめ", "かば"]
```

#####要素数を返す

配列の入れ物の中に何個の要素が入ってるか知りたいときは
:star2:sizeメソッド
:star2:lengthメソッド
sizeメソッドとlengthメソッドは一緒

```
print animals.size →4
print animals.length　→４
```

###配列の繰り返し処理
```
配列.each do|変数|
 繰り返したい処理
end 
```

例）

```
animals = ["ねこ", "きりん", "すずめ"]
animals.each do |animal|
 puts animal
end

→"ねこ"
　"きりん"
　"すずめ"
```


##ハッシュ（Hash）
:point_up_tone1:ハッシュとは
キーと値の組を持つことができるオブジェクトの入れ物
なんでも入る

```
book = {"title" => 夢をかなえるゾウ, "author" => 水野敬也}
puts["title"] 　　→夢をかなえるゾウ
puts["author"]   →水野敬也
```

###シンボル
:point_up_tone1:シンボルとは
ラベルとして使う文字列みたいなもの。先頭に : をつける
ハッシュと組み合わせて使うことが多い

```
book = {:title => "夢をかなえるゾウ", :author => "水野敬也"}
puts book[:title]　　→"夢をかなえるゾウ"
```

:point_down_tone1:これでもOK(簡素化版）

```
book = {title: "夢をかなえるゾウ", author: "水野敬也"}
puts book[:title]　　→"夢をかなえるゾウ"
```

####ハッシュへ追加したい時
```
book = {:title => "夢をかなえるゾウ", :author => "水野敬也"}
book[:price] = 1000yen
↓
book = {:title => "夢をかなえるゾウ", :author => "水野敬也", :price => 1000yen}
```

###ArrayとHashの使い分け
:sunny:Array :　順番が決まっている入れ物
・並び順が大切なもの
・データを重複させたい場合

:sunny:Hash : キー（名札）をつけられる入れ物
・順番が保持される
・キーが重複しない場合に利用
[Djangoチュートリアルエラー]１時間"Hello world"出ず

#Djangoでチュートリアルができなかった
チュートリアルに１時間も悩んでしまったので、同じミスをしている人のために書いておきます。
(paizaでやりました)

```python
from django.urls import path
from . import views

urlpatterns = [
		path('', views.index, name = "index"),
]
```
問題のコードは `path('', view...`のところで、**`''`の間にスペースはない**らしいです。
もしも、同じミスをしている人に届いたら幸いです。
全身3Dスキャン /リアルアバター 制作用撮影システムキット - フォトグラメトリソフト編

随時更新中。
本記事執筆開始時のビジョンはこちら <a href="https://note.mu/happyocean/n/n5f322b181706">https://note.mu/happyocean/n/n5f322b181706<a> ぜひ読んでください。

フォトグラメトリソフトは、主要なものとして、RealityCapture, 3DF Zephyr, Metashape　などありますが、
RealityCaptureを書いていきたいと思います。

ワークフローは
1.写真のImport
2.Aligne
3.Reconstruction (Normalで多くの場合十分ですが、元の写真の解像度によります）
4.Smoothing   (*)
5.Texturing

カメラ位置・モデル化したい部分が決まっていれば、
一度Align した設定や、Reconstruction Region Exportしておき、Importして読み込むのが早いかと思います。

上記は、全てWindows のShell スクリプトで自動化も可能です。ヘルプの記載の通り進めれば可能ですが、
追いサンプルも記述します。

プログラミングを職業エンジニアとして日々刻々とやってない方は（筆者含む）、
時にディレクトリの設定等でハードルを感じることも多いと思いますが、やればできますのでガンバです。


(*)外部ソフトウェア等でリトポロジーを行い、戻すことも可能です。
通勤時間でJava Silverを取得しよう！

# １ヶ月半でJava Silverを取得
こんにちは。
最近は雨が多いですが、なんとも紫陽花のきれいなことですね。
そんな折、計画を立てて勉強し、2019年6月14日（金）にJava Silver(Java SE 8 ProgrammerⅠ)を取得することができました。
（計画は立てたものの、大幅に超過してしまいましたが、、、）
今後受験される方の参考になればなと思い残します。

#Results
勉強期間：約１ヶ月半（平日のみ）

勉強時間：約93時間（約31日（1日3時間））
**↑通勤時間です。塵も積もればですね。**

受ける前の私：新卒入社2年目SE、Javaでの開発経験約1年、paizaBランク
**↑正直、まだまだ取るに足らないと思っております。**

勉強方法：参考書３周（１周目全問、２・３周目は間違えたところだけ）＋最後は間違えた問題だけ見直し
**↑一貫して1周目で正解した問題はしません！**

参考書：[徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応](https://book.impress.co.jp/books/1115101068)
**↑私はこの一冊のみで十分でした。**

所感：9割程度が問題集と類似、1割程度が問題集と同じ（日本語による概念の説明系）
**↑何を問う問題なのかがわかれば解けます。**

結果：正解率80％（合格ライン65％）
2018年7月（入社後4ヶ月目）にJava Bronzeを取得しましたが、正解率66%（合格ライン60%）ととても胸を張ることができませんでした。
**↑今回は少し成長ができたかなと思いました。**

合格した今でも、現在の案件（決済代行システム開発）にはついていくのに精一杯です。
**↑多分ついていけてないです(^^;)**
他に足らないことが沢山あると思いますが、Javaの基本的なところくらいは後輩に教えられる状態に持ってこれたかなと思い一安心です。

この調子で次はGoldと行きたいところですが、AWSやAzure、Webクリエイター系、Oracle SQL、Springの技術にも興味がありますので、一旦Javaの資格から離れます。

以下、勉強の記録です。（ご参考まで）
ーーーーーーーーーーーーーーーーー
【参考書の問題数】
170問（1章～9章）
144問（模擬試験（10章、11章））

【目標】
2週間で合格を出す想定
受験日5月25日（土）←GW明けから一念発起

【やること】
①170問を3周した後
②144問（模擬試験）を2周行う。

【スケジュール】
①を1週間で
②を1週間で行う想定

【記録（間違えた問題番号のみ・時系列順）】
◆問題集1周目
一章4,5,6,7,8
二章1,2,3,4,5,6,7,8,11
三章2,4,8,9,10,12,17,18,19
四章1,2,4,5,6,7,9
五障3,4,5,7,11,12,13,15,16,17
六章3,5,6,8,9,10,12,13,14,15,17,18,19,20,21
七章3
八章3,4,5,6,7,9,10,11,12,18,19
九章3,4,6,9,10,11,13,14,21,22,23,24,25,32,33,35,36,37

◆問題集2周目
一章5,7
二章2,3,5,6,11
三章3,9,10,12,17,18,19
四章1,2,3,4,5,6,7,8
五章3,4,5,7,13,17
六章18,19
七章11,15
八章3,14,19
九章10,36

◆模試A（10章）1周目
1,2,3,4,7,10
11,18,19
21,22,23,24,25,26,27
31,33,34,38,40
43,44,45,49
51,53
67
72,73,75,76

◆問題集3周目
一章5
二章3,5,6
三章12,17
四章
五章3,13
六章19
七章
八章
九章

◆模試B（11章）1周目
4,7,9
11,13,15,16,18,19
23,25,26,27,30
31,35,38
43,45,46,49
59
63,66,70

◆模試A 2周目
3
1,8
21,23,27
31,33,38
45,49

◆模試C（Oracle公式サイトサンプル問題）1周目
4,7,8
11,14
16,19
20

◆模試B 2周目
4
11,16
25,30
31,35,38
45,46
59

◆多く間違えた箇所から見直し
ーーーーーーーーーーーーーーーーー

#勉強して良かったこと
自信が付きました。
社内を活気づけることができました。
私自身の好奇心も上がりました。
今後も、私には難しいかなと思っていたことにもどんどん挑戦していこうと思います。

勉強で不安なことや気になることなどございましたら、ご遠慮なくご質問いただければと思います。
それでは、また頑張ってきます。
都市名から IANA zone name を知る方法

プログラムでは、タイムゾーンの指定によく IANA time zone identifier というのを使う。都市名からこの IANA time zone を知る方法が意外とややこしかったのでメモする。

結論としては手で検索するには https://time.is/ が早い。例えば Osaka の場合 https://time.is/Osaka を見ると

> The IANA time zone identifier for Osaka is `Asia/Tokyo`

と出る。このサイトは IANA の公式サイト https://data.iana.org/time-zones/tz-link.html からリンクされている。

プログラム的に同じ事をするには、Stackoverflow に沢山リンクが挙げられてある。

[Time Zone Location Web Services](https://stackoverflow.com/questions/16086962/how-to-get-a-time-zone-from-a-location-using-latitude-and-longitude-coordinates/16086964#16086964) 

都市とタイムゾーンの対応付がどのように定義されているのかはよく分からなかった。[Time Zone Databas](https://www.iana.org/time-zones) とその[ソースコード](https://github.com/eggert/tz) には、タイムゾーン名と対応する時差のみが定義されている。つまり、これだけでは大阪が Asia/Tokyo に含まれているかどうかは分からない。都市名や座標からタイムゾーンを取得する方法はいくつもあるが、それらが参照する唯一の公式な定義というものは無いようだ。

公式サイトからは [Timezone Boundary Builder](https://github.com/evansiroky/timezone-boundary-builder) が紹介されている。ただこのプロジェクトは OpenStreetMap を元にタイムゾーンの境界線を作成するものなので、OpenStreetMap 自体が誰でも編集出来るものである以上、「公式」なのかどうかは微妙だ。もしかしてタイムゾーン境界の定義というのは政治的な問題を含む可能性があるので、そもそも「公式」情報というものを作れないのかも知れない。

以前調べた内容: [Linux の timezone](https://qiita.com/propella/items/428d06b97c15f0fa40c0)