OmniAICreator/Qiita-1.07M huggingface dataset:
sshfsを使ったユーザー個別でのファイル管理

## 背景：こんな用途に便利
- 見たいデータがいくつかの計算機に散らばっている
- NFSを立ち上げるのは面倒(root権限が要るしUIDまわりとかも面倒)

こんな時に、手元の計算機に**sshfs**で所望のフォルダ/ディレクトリをマウントすると便利。

まず、ファイルは分散させたくない。計算は通常ローカルネットワークにあるワークステーション、クラスター計算機や使っているスーパーコンピューター(以降リモート計算機)上にあって、手元の計算機(以降ローカル計算機)は専らこうした計算機への端末になっていたり、簡単な解析用になっていたりする。
解析をローカル計算機でやる場合、リモート計算機からファイルを持ってこようとすると、同じ内容のデータが複数の計算機に置かれて、管理の面から不適当。あと、逐一sftpで所望のディレクトリまでアクセスして取ってくるのは面倒だし、rsyncで一括でコピーすると、余分な容量を占有する。
リモート計算機で解析を行おうとすると、いちいちリモート計算機に色々なアプリを入れないといけないし、ルートユーザーにいちいち頼むのも億劫。、場合によってはアプリのインストールが強く環境に依存していて困難(例えば、paraviewとか)だったり大変な手間になる事がある。

というようなケースでは、ローカル計算機にリモート計算機のフォルダ/ディレクトリをマウントすれば、多くの問題が解決する。データはリモートから動かさなくて良いし、アプリはローカル計算機にのみ頑張って入れればよい。ローカル計算機のルート権限があればビルドが面倒なアプリ(例えば、paraviewとか)も、`yum`なり`apt`なり`zypper`なりで容易にインストールできることも多い。
これをNFSで実行しようとすると、先ずリモート計算機上でNFSサーバーを立ち上げなければならないし、あとUIDとローカル計算機のユーザーをどう対応させるのか みたいな面倒が発生する。そこで**sshfs**を使うと、良い。基本的にsshのプロトコルを使っているので、sshサーバーが立ち上がっていれば良いはず。ユーザーとの紐づけもsshでのアクセスと同じ。

## sshfsでのマウント

```bash
# マウント
sshfs user@192.168.x.y:/remote/directory/you/want/to/mount /local/directory/to/access
# アンマウント
fusermount -u /local/directory/to/access
# Read onlyのマウント
sshfs user@hoge:/hoge /hoge -o ro
```
ファイルを書き換えてしまうのが怖い場合はread-onlyでマウントできる。
ポート番号も指定できるし、鍵も使える。
`/etc/fstab`に書いておけば、起動時に自動マウントもできるみたいだけれど、鍵認証かつパスワード無しにしておく必要があるので、ローカル計算機を起動した後に手動でマウントしている。

マウントポイントよりも深い方向のディレクトリしかみれないせいか、シンボリックリンク等でより浅いディレクトリ(例えばwork/data用にマウントしてある違う物理ディスクとか)にはアクセスできない。ここは同じくsshベースのsftpを使った時と挙動が異なる。
xdebug コマンドライン　バッチ　でデバッグする方法

![SH3G0183.jpg](https://qiita-image-store.s3.amazonaws.com/0/346137/a8b026e8-6849-f311-4255-0c672b081866.jpeg)

# コマンド

```
XDEBUG_CONFIG="idekey=PHPSTORM" XDEBUG_SESSION_START=DBGP php cmdtest.php
```

# 概要

ブラウザを使わずにphpスクリプトを実行したときにでもphpstormによるステップ実行を行う方法
RPA導入を現場ユーザが実施する場合に必要となるポイント

##RPAによる効果を持続させるために
RPA導入後にそのロボの維持管理をしたり、引き継いだり、他の部署のロボ化をスムーズに推進するために筆者が必要だと思う要素を上げる。
SEであれば基本かもしれないが、現場で業務をしている方々がRPA化する場合には意図的にやっていく必要があるものである。

#課題・QA管理
ロボ化にあたっては、ロボ実施前後の人間が行う業務の変更になる可能性が高い。
業務そのものを変えることや、それに伴う関係各所との打ち合わせなどが想定される。
後から見て「なぜそうしたのか」が分かるようにどのような議論が交わされたか、は残しておくことが望ましい。

#ノウハウの蓄積と共有
細やかなRPAツールの挙動や、例えば「データを絞りたい場合は〇〇すればよい。」や「〇〇の処理を使っていたらロボが途中で止まった。〇〇をしたら回避できた」など。
新しい技術についてはこのようにノウハウを貯めていく活動が欠かせない。同じ社内なのに同じようなところで躓いているのは非常にもったいないとも言える。
まずは困ったらここを見よう、という場所を作ることで新しくロボを導入していく人たちがスムーズにＲＰＡ化を進められるようになる。

#バージョン管理
バージョン管理とは、ファイルの作成日時、変更日時、変更点などの履歴を保管することである。
どこまで開発が進んでいるバージョンなのかが分かるようにしてあげることである。
バックアップして、XXXXX2019014.xaml みたいにどの日付のものかを管理してあげる必要がある。
これがないと、開発者本人も他の人もどれが最新なのか分からなくなったりどれが動かすべきロボなのかが分からなくなることになる。


#ロボの共通部品化
同じシステムへのログイン処理や、起動処理、挙動がおかしいときのエラーハンドリングなど、よく使う機能については
共通部品として再利用してあげることで、ロボの品質担保がしやくなり、開発スピードも上がることになる。


#ロボ仕様書（設計書）の作成
こういったものを作らないからこそ、野良ロボが増えるのではないか？筆者は思う。
ロボ作成者がいなくても、ロボ化前にその業務を実施していた人がいなくても業務が回るように
どういう業務をロボ化したのかや、どのシステムに何を入力しているのか程度は残しておくべきである。
ドキュメントが残らないと、EUCと同じようにブラックボックス化を助長してしまうことになる。

#メンテナンスしやすいロボを作るために
ロボを見るだけで、ざっくり「何をしているのか？」が分かるようにするといい。
例えば、クリック動作だけでも「〇〇をクリック」の「〇〇」があるとないとでは分かりやすさが大きく違う。
RPAツールが行っている各処理に日本語でコメントを入れて分かりやすくすること。
また変数（値を格納する箱）の利用についてのルールを設けること、などロボの作り方自体を標準化できるとよい。


筆者は特に課題・ＱＡ管理については、社会人1年目～3年目の期間で先輩方にビシバシと鍛えていただいた記憶がある。
当時は苦しい思いをしたが今ではその大事さがよく分かる。彼らに感謝したい。
Mac OS XでWindowsのように快適にウィンドウをリサイズする方法

# 対象読者
MacでWindowsのようにウィンドウを半分にしたいけれど
BetterTouchTool(https://folivora.ai/) は有料だし...と悩んでいる方に向けて。

ショートカットコマンドでウィンドウ操作を可能にする[Slate](https://qiita-image-store.s3.amazonaws.com/0/32950/6ad2b374-0510-261a-629d-55aea981b6a3.gif)をインストールしてみましょう！

# デモ
![slate_demo.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/32950/6ad2b374-0510-261a-629d-55aea981b6a3.gif)


# 導入方法
## Slateをインストールする
https://github.com/jigish/slate
Installing Slateから `.dmg` のリンクをクリックし、ファイルをダウンロード。
dmgファイルを開き、インストールする。

※Mac起動時に自動起動する設定をすることをおすすめします。

### 自動起動設定方法
<img width="266" alt="スクリーンショット 2019-01-19 23.40.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/32950/ef229943-cd9d-f51a-9e4b-84f1d2e1389f.png">

Slateを起動すると右上にSlateのアイコンが表示されますので、「Launch Slate on Login」を選択しましょう。

## Slateを設定する
Slateは ホームディレクトリにある、`.slate.js` という設定ファイルを読み込んで動作します。
`.slate.js` ファイルにソースコードを記述し、ウィンドウの動作とショートカットキーを紐づけます。
（JavaScriptって聞いたことあるけど書いたことないぞ！という方は、以下のソースコードをコピペするだけでOKです)。

ソースコードがとても長いため下記のリンクからコピーしてください。
https://gist.githubusercontent.com/harhogefoo/105e0d8555e342ee105a4d855e6efc99/raw/ade2e0f6611ce428dfaf023733bd3643dfa648ea/.slate.js

上記リンクからソースコードをコピーした後、ターミナルを起動し以下を実行してください。

```
$ cd ~
$ vi .slate.js
```
↑を実行後、エディタが立ち上がります。
1. `Command + v` キーを押下し、上記からコピーしたソースコードをペースト
2. `ESC`キーを押下
3. `:wq` （コロン、w、qの順番にキーを押下）
4. `Enter`キーを押下。(.slate.jsファイルが保存されエディタを終了します。)

右上のアイコンから「Relaunch and Load Config」をクリックし、Slateを再起動して設定を適用してください。
<img width="262" alt="スクリーンショット 2019-01-19 23.49.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/32950/e0494d85-dca5-9f36-e63a-0ca6c6eb76e1.png">


# Slateに設定したショートカットコマンド集

| コマンド     | 動作 |
|:------------:|:---------------|
| shift + option + m  | ウィンドウサイズをフルスクリーンにする|
| shift + option + u  | ウィンドウサイズを半分にする |
| shift + option + o  | ウィンドウサイズを1/4にする |

快適なウィンドウをリサイズするショートカットコマンドを手に入れることができました！おめでとうございます！
Happy Mac Life :)

# 参考文献
https://www.infiniteloop.co.jp/blog/2013/08/osx_slate/
AWS Single Sign-on で ログインの際に E-Mailベースの検証ができるようになりました。

#概要

(2019-10-25 Update)
AWS Single Sign-on 単体でMFAアプリを使用した多要素認証に対応ました。
https://aws.amazon.com/jp/about-aws/whats-new/2019/10/increase-aws-single-sign-on-security-with-multi-factor-authentication-using-authenticator-apps/

---

AWS SSO でのログインの際に、E-Mailを利用した OTP(One Time Password) での検証が可能になったようです。


**Add a layer of security for AWS SSO user portal sign-in with context-aware email-based verification**
https://aws.amazon.com/blogs/security/add-a-layer-of-security-for-aws-sso-user-portal-sign-in-with-context-aware-email-based-verification/

[以前の記事](https://qiita.com/daimatsu/items/75b5924e06a4394b83d2)でも書いたように、従来 AWS Single Sign-on にて MFA（多要素認証）を利用とした場合、別途 RADIUS サーバーや Microsoft AD のような認証基盤を用意する必要がありました。

今回のアップデートで、**AWS SSO ディレクトリサービス**を利用した場合でもよりセキュアな環境で利用できるようになりました。



#設定項目

「**AWS MFA の設定**」という項目が増えていました。

いくつかのオプションが選択可能なようです。
MFAメソッド、今現在は一つしかないようですが、チェックボックになっていること考えると、E-Mail 以外のオプションが増える可能性がありそうです。

<img width="1149" alt="スクリーンショット 2019-01-19 23.02.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/323706/24cfd360-0bc3-ed1e-90e9-65b696528800.png">




#ログイン画面
![スクリーンショット 2019-01-19 23.12.40.png](https://qiita-image-store.s3.amazonaws.com/0/323706/b1abfab1-862a-98ec-ad44-a19fa0650449.png)

#検証コードメール
 ![スクリーンショット 2019-01-19 23.35.07.png](https://qiita-image-store.s3.amazonaws.com/0/323706/7e282f4d-6b39-a532-b603-f63c6bc5c238.png)

#まとめ
まだ E-Mail だけでしか検証できないようですが、従来RADIUSや別途認証基盤を用意しなけらばならなかったことを考えると、AWS SSOディレクトリサービスでも利用可能なため、ぜひ活用したい機能の一つだと思います。
スマートフォンアプリの対応も期待したいところです。
digdag の .dig ファイル向け vim 設定

# TL; DR

```viml
autocmd BufNewFile,BufRead *.dig set filetype=yaml
autocmd Syntax yaml setl indentkeys-=<:> indentkeys-=0#
```

## .dig ファイルを yaml ファイルとして読み込む

digdag の .dig ファイルは基本的には yaml なので yaml ファイルとして認識するように設定する

```vimscript
autocmd BufNewFile,BufRead *.dig set filetype=yaml
```

## : で自動インデントが走るのを止める

YAML フォーマッタのインデントがおかしいのと、: を打つと自動でインデントされてしまいおかしくされてしまうので、止める。

```vimscript
autocmd Syntax yaml setl indentkeys-=<:>
```

## # で自動インデントが走るのを止める

YAML フォーマッタのインデントがおかしいのと、先頭に # を打ってコメントにしようとすると、自動でインデントされてしまいおかしくされてしまうので、止める。

```vimscript
autocmd Syntax yaml setl indentkeys-=0#
```

## 困りごと: YAML フォーマッタがおかしいような

```yaml
_export:
  docker:
    image: ubuntu

  my_param:
```

これをインデントさせると

```yaml
_export:
  docker:
    image: ubuntu

    my_param:
```

のように意味が変わるインデントをされるのだが、これは yaml フォーマッタ壊れていないか？

情報求む。
オブジェクト指向でなぜつくるのか 第7章

## 本について

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186009/7bf8dcaf-d077-9b43-805e-7f6bcad83dc9.png)

Amazon: https://www.amazon.co.jp/dp/4822284654

題材として選択したのは、「オブジェクト指向でなぜつくるのか-第2版-」という本です。13章で構成されており、今回は第7章について、まとめました。

## ゴール
- 「オブジェクト指向が現実世界をそのままソフトウェアに表現する技術」とは限らないことを理解する
- 上流工程におけるオブジェクト指向の仕組みを簡潔に説明できる

## ソフトウェアは現実世界の仕事の一部を肩代わりする
しばしばオブジェクト指向は「現実世界をそのままソフトウェアに表現する技術」と説明されることが多いそうですが、これが混乱を招いてしまうことがあるようです。

例えば、病院のシステムが現実の病院をそのまま表現しているかと言えば、そうではないはずです。病院のシステムは、患者のカルテを記録したり、医療費を計算したりするかもしれません。しかし、患者を診察したり、面倒を見たりするのはシステムではなく人間です。

つまり **ソフトウェアはあくまで人間が楽をするために現実世界の「仕事の一部を肩代わり」だけ** です。よって、オブジェクト指向は「現実世界をそのままソフトウェアに表現する技術」という説明では混乱を招いてしまいます。

## 上流工程におけるオブジェクト指向の仕組み
オブジェクト指向が下流工程の分野で生産性や品質、再利用性などを高める効果があると認められたため、この技術を上流工程である業務分析や要件定義に適用して、システム開発全体の生産性や品質を上げようとする動きが起きました。

しかし、下流工程のオブジェクト指向プログラミングの仕組みをそのまま上流工程の業務分析や要件定義に適用しようとしても、必ずしもうまく当てはまらなかったようです。

このため上流工程にオブジェクト指向を適用する際には、オブジェクト指向プログラミングの仕組みを応用した形、すなわちオブジェクト指向プログラミングの仕組みを「使える部分だけ使う」形で適用しました。

その結果、上流工程におけるオブジェクト指向は2つの基本的な仕組みを提供することになりました。 **集合論** と **役割分担** という考え方です。

### 集合論
オブジェクト指向プログラミングにおいて、クラスはサブルーチンと変数をまとめるもので、クラスからインスタンスをたくさん作れる仕組みでした。これは集合論における集合と要素に似ていたため、クラスとインスタンスは上流工程で集合論に応用されることになりました。

例えば、現実世界で「ヤマモトさんとタナカさんが従業員」だとしたら、「ヤマモトさんとタナカさんがインスタンスで、従業員がクラス」、つまり「ヤマモトさんとタナカさんが要素、従業員が集合」のように整理することができます。

![oop-集合論.png](https://qiita-image-store.s3.amazonaws.com/0/186009/17077df3-718c-a650-cf33-133780bb0a83.png)

またオブジェクト指向プログラミングでは、クラス定義の共通部分をまとめて別クラスに切り出す仕組みだった継承も、全体集合と部分集合の考え方に応用されました。

例えるなら、「人間を男と女に分類すること」に使用できる考え方です。

![oop-集合論 (1).png](https://qiita-image-store.s3.amazonaws.com/0/186009/89e17c38-f274-73ee-57f7-5f83cbe9ad74.png)

### 役割分担
オブジェクト指向プログラミングにおいて「メッセージパッシング」は、インスタンスを指定して、クラスにまとめられたメソッドを呼び出す仕組みでした。この仕組みは上流工程で「ある特定の役割を待つもの同士が、決められた方法で連絡し合う様子」を表現する、役割分担のモデルに応用されました。

例えば、「レストランでウエイトレスに料理を注文する」「ウエイトレスがコックに注文を伝えて料理を作らせる」というような一連の流れから役割分担を表現できます。

![oop-役割分担.png](https://qiita-image-store.s3.amazonaws.com/0/186009/30dedf9f-9a0c-bdbd-aa2f-2e71f05f49ea.png)

※ 「客」は注文する役割を担っていて、「ウエイトレス」は注文を受けてコックに伝える役割を担っている。

## まとめ
- オブジェクト指向は「現実世界をそのままソフトウェアに表現する技術」ではなく、現実世界の仕事の一部を肩代わりするものである。（そもそもコンピュータ・ソフトウェアがそういった側面を持っているため）

- 上流工程におけるオブジェクト指向は、 **集合論を用いて物事を分類し整理する仕組み** と **役割分担を表現する仕組み** を備えた **汎用の整理術** である。

## 所感
私は以前に社内システムを実装したことがあるのですが、そのときにメンバーの作業を全て自動化しようとしてうまくいかなかったことがありました。

なぜなら、コンピュータやソフトウェアが得意とする分野（計算・記録）を意識しないまま、現実世界で行われている全ての作業をシステムとして実装しようとしたからです。

この章を読んで改めて実感したのですが、現実世界を全てプログラミングで実現しようとするのではなく、現実世界で行われている作業のどの部分をシステムとして実装できるか、コンピュータやソフトウェアの特徴を考慮しつつ設計することが大切だなと思いました。
Juliaをjupyter notebookで使えるように1から導入してみた(Mac)

#はじめに
普段Pythonを使っているのですが、
Juliaが気になったので、1から環境構築しました。
その時、実行したコマンドを全て載せています。

#手順

Juliaをインストール

```console
$ brew cask install julia
```

Juliaを起動

```console
$ julia
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.0.3 (2018-12-18)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |
```

Pkgパッケージの利用を宣言し、
jupyter notebook用のパッケージ(IJulia)を追加

```console
julia> using Pkg
julia> Pkg.add("IJulia")
```

パッケージの追加が完了したら、IJuliaの利用を宣言

```console
julia> using IJulia
```

Juliaを終了して、jupyter notebookを立ち上げる

```console
julia> exit()
$ jupyter notebook
```

Jupyter notebookでJuliaが使えるようになりました！！
(2019/1/19時点：バージョン 1.0.3)

![スクリーンショット 2019-01-19 23.31.42.png](https://qiita-image-store.s3.amazonaws.com/0/205221/4e45f0e0-e96f-d087-da78-f34584cebe3c.png)
Azure Functions でアンマネージドコードをPInvokeを使って呼ぶ

# これはなに？
Azure Functions 上で PInvok 経由で呼び出されたアンマネージドコードが動作するかを確認しました。

環境
- Windows 10
- Visual Studio Community 2017 

参考
- https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-develop-vs

# プロジェクト作成

Visual Studio の [ツール] メニューの [拡張機能と更新プログラム]から「Azure Functions」を検索して「Azure Functions と Web ジョブ ツール」をダウンロードします。自分は英語版を使っているので英語ですが ...
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93800/162befa8-3274-d0b3-7a67-a814943c1370.png)

次に新しいプロジェクトを作成します。メニューの「ファイル」から新しいプロジェクト作成を選び、Azure Functions を選び、Azure Functions のプロジェクトを作ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93800/c832f1ad-b324-a121-b787-f1ca9883ca41.png)
トリガーはとりあえず http trigger を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93800/84867646-24b7-3fb5-a27c-f620016650a3.png)

# コード

mymath.dll には half という引数を半分にするだけの dll があります。これがアンマネージドコードで、マネージドコードの C# から Azure Functions 上で動作するかを確認します。

```c#
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;

using System.Runtime.InteropServices;

namespace AzureFuncMyMath
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
        {
            int ret = half(10);
            return req.CreateResponse(HttpStatusCode.OK, "Ans: " + $"{ret}") ;
        }
        [DllImport("nymath.dll", CallingConvention = CallingConvention.StdCall)]
        static extern int half(int n);
    }
}
```

コンパイルしてとりえずローカルのシミュレータ上で動作確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/93800/731d9384-dc98-c0a5-14ec-3ea4480eced5.png)

とりえず動きそうです。
【JavaScript 】クラスの継承

# クラスの継承

```javascript:
'use strict';

// 親クラス
class Player {    
    constructor(name, score) {
        this.name = name;
        this.score = score;
    }

    showScore() {
        console.log(`score = ${this.score}`);
    }
}

// 子クラス
class GamePlayer extends Player {
    constructor(name, score, high_score) {
        super(name, score); // 親のコンストラクターを呼び出す
        this.high_score = high_score;
    }

    showHighScore() {
        console.log(`high_score = ${this.high_score}`);
    }
}

// インスタンス
const game_player1 = new GamePlayer("GamePlayer1", 10, 100);

// プロパティ
console.log(game_player1.high_score); // 100

// プロパティ（親）
console.log(game_player1.name); // GamePlayer1

// メソッド
game_player1.showHighScore(); // high_score = 100

// メソッド（親）
game_player1.showScore(); // score = 10
```
※Google Chrome で確認
※ES8
Electronのアプリケーションバージョンにgitのハッシュ値を付ける

## 概要

https://github.com/teknocat/electron-version-test/blob/master/version.js

Electron アプリケーションやパッケージのバージョンとして git のハッシュ値を利用するための、簡単なスクリプト。

## バージョン取得

`package.json` の `version` に値を記載した状態で、`version.js`を実行すると、
git ハッシュ値（先頭８桁）を付け加えたバージョンを返す。

```bash
$ node version.js
0.0.1+bf1894c3
```

## パッケージへのバージョン指定

`electron-builder` の `build` 実行時に、以下のようなオプションを渡して、`version.js`が返すバージョンを指定する。

```
    "package-linux": "yarn build && electron-builder build --linux -c.extraMetadata.version=`node ./version.js`",
```

## Electron renderer process からのバージョン取得

`app.getVersion()` で取得。

`app/components/Home.js`

```javascript
// @flow
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { remote } from 'electron';
import routes from '../constants/routes';
import styles from './Home.css';

const { app } = remote;

type Props = {};

export default class Home extends Component<Props> {
  props: Props;

  render() {
    return (
      <div className={styles.container} data-tid="container">
        <h2>Home</h2>
        <Link to={routes.COUNTER}>to Counter</Link>
        <p>version {app.getVersion()}</p>
      </div>
    );
  }
}
```
VuetifyのIconsを使おうとしたら、Module parse failed: Unexpected characterと出た

VueでVuetifyを採用しようと思い、`node-module`でライブラリをインストール後使おうとしたら、エラーが出たので備忘録として。

## 事象
Vuetifyで[Icons](https://vuetifyjs.com/en/framework/icons)を使おうとしたら、以下エラーに至った。

```shell
ERROR in ./node_modules/material-design-icons-iconfont/dist/fonts/MaterialIcons-Regular.ttf
Module parse failed: Unexpected character '' (1:0)
You may need an appropriate loader to handle this file type.
(Source code omitted for this binary file)
```

## 解決策
以下のように書き換える。

```javascript:webpack.config.js
{
  test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
  loader: 'file-loader?name=assets/[name].[hash].[ext]'
}
```

無事アイコンも表示された。
![スクリーンショット 2019-01-19 23.31.07.png](https://qiita-image-store.s3.amazonaws.com/0/185846/111a5eda-693b-166e-16c1-dc0e85214de2.png)


## 経緯
Vuetifyをインストール後、公式に従い以下を実行。

```shell
npm install material-design-icons-iconfont -D
npm install @mdi/font -D
```

私の環境では、style.scssにまとめているので、`main.js`はこれだけ。

```main.js
import './scss/style.scss';
import Vue from 'vue'
~~

Vue.use(Vuetify, {
	iconfont: 'mdi'
});
```

```css:./scss/style.scss
@import "../../node_modules/vuetify/dist/vuetify.min.css";
@import "../../node_modules/material-design-icons-iconfont/dist/material-design-icons.css";
@import "../../node_modules/@mdi/font/css/materialdesignicons.css";
```

これで、`npm run dev`をしたら先ほどのエラーが発生した。

```shell
ERROR in ./node_modules/material-design-icons-iconfont/dist/fonts/MaterialIcons-Regular.ttf
Module parse failed: Unexpected character '' (1:0)
You may need an appropriate loader to handle this file type.
(Source code omitted for this binary file)
```

## 参考
[Vuetify公式](https://vuetifyjs.com/en/framework/icons)
[Why does module parse failed: /xxx/MyFont.ttf Unexpected character '' - StackOverFlow](https://stackoverflow.com/questions/47303407/why-does-module-parse-failed-xxx-myfont-ttf-unexpected-character)
ksnctf 31 KanGacha 130pt

#問題

https://ksnctf.sweetduet.info/problem/31

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/559253d8-3ae3-7a5e-d47a-ab6077205a53.png)

#解いてみた

リンクが2つあるので上の「http://ctfq.sweetduet.info:10080/~q31/kangacha.php 」にアクセスしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f1c4f697-b61d-61d5-9890-1e52c365c013.png)

Gachaボタンを押すと下に名前が出てきました。
1回押すたびに一つずつ。

2個目のリンク押してみます。
PHPのソースが出てきました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/e461e3ae-da6c-10f4-3a7e-68d8026401ae.png)

このソースがさっきのwebページのソースということでしょう。
何らかの条件でGachaボタンを押すとFLAGが出るという流れだと思います。

ソースの意味を長々と書いてもしょうがないので、要約すると

- ランダムで0～9の値をだす。
- ランダム値をCookieの値shipに保存する
- （FLAG_XXXXXXX + ランダム値）をSHA512した値をCookieの値signatureに保存する
- FLAGを出すにはCookieの値shipが10のとき かつ Cookieの値signatureが（FLAG_XXXXXXX + 10）をSHA512した値であること

ということです。

cookieの値はブラウザで編集できるので肝となるのは（flag_XXXX + 10）をSHA512した値を算出することということです。

ハッシュする前の値が不明（flagが不明なため）なのに、ハッシュ後の値が分かるもんなんですかね。
調べてみます。

HashPumpというのを使うと予測できるそうです。
[CTF/Toolkit/HashPump - 電気通信大学MMA](https://wiki.mma.club.uec.ac.jp/CTF/Toolkit/HashPump)

すごいですね。
ハッシュ値って予測不能と言われていますが、意外ともろかったりするのかもしれません。。。

既知のハッシュ前の文字列とハッシュ後の文字列が必要らしいので、一度Gachaボタンを押して、5が出てきたのでこれを使って必要な値をまとめると

|項目|値|
|-----------------|------------------|
|既知のハッシュ前の値|5|
|sha512(FLAG_XXX + 5)|b5ff24ed3b12bcd01169c1920365397d7568adf25bfb21dd6dcae82c7de93bd00b732e3f0cc5f17370982bd09ff97d255c65c12b459bd443a68b738179a44a19|
|FLAGの文字数|ここは勘ですが、21が多いので21|
|追加文字列|,10（区切り文字の,が必要）|

これでやってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/1bdc152f-4e0c-6d3f-ea33-c1c9bc57e0e0.png)

というような結果になりました。

Cookieを編集してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/c5ed1e60-a2d8-66c3-0776-45a180fe3955.png)

これでGachaボタンを押す。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/44352eac-7f97-20f3-1c2e-4bc728cbfdd2.png)

んーダメです。
通信をWiresharkで見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/7ab9f703-5f61-16c0-4572-4397cdaac25a.png)

まさかの2回通信していることが分かりました。
さっき編集したのは1回目の通信だと思うので、そのときに初期化？されてしまって2回目は数値が1個のやつに戻るみたいです。

Burp Suite使って2回目の通信を編集します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/6b84c096-ea16-c9df-ae38-b9e37ab43860.png)

これでFoward

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/8421d3fd-e070-0810-aa7d-c77ec6ed1449.png)

なかったことにされてしまいます。。。
よくわからなくなってきたのでXAMPPをインストールしてPHPをローカルで実行できる環境を作りました。
ソースをコピーしていろいろ試したところ、URLエンコードをしないといけないことが分かりました。
ただここら辺はなんでかよくわからないんですが、

- 10の前の「,」はそのままでいい。
- 大量にある\x00とかの「\x」を「%」に変換する。

という編集が必要でした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ead1b6fc-22f8-21fe-3f19-de5dcbcdb3b9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/7959150b-0d5a-335d-8da1-5ca5e373d805.png)

答えは出たもののエンコードの意味がよく分からなくて不完全燃焼です。。。
SphereをCubeに当てたら100が表示。

##はじめに
UnityVersion2018.2.14f1を使用。
関数・設定は基本的なものだと思うので、バージョンが相当古くない限り使えると思います。
表題の通りSphereがCubeに当たったらCubeが消滅して100が表示されます。
100はGameObject 3DTextを使用。

##用意するもの
- GameObject
    - Cube
    - Sphere
    - 3DText

#Cubeの配置・設定
- 配置

メニューバーのGameObject 
↓
3DObject
↓
Cubeを選択

Cubeがフィールド上に配置されます。


InspectorタブにあるBox Colider欄のIs Triggerにチェックを入れる。
Position.yをCubeより上に設定する（Cubeが原点(0,0,0)の場合）。

![trigger設定.png](https://qiita-image-store.s3.amazonaws.com/0/307841/7cc3d12b-0350-3da2-cfcf-1b12cfcc9660.png)



##Sphereの配置・設定

- 配置

Cubeの配置と同様の方法でSphereを選択する。
↓
InspectorからTransform Position YをCubeより上の設定値にする。

-  設定

HierachyのSphereを選択
↓
Inspectorを表示させAdd Componentボタンを押す
↓
検索からRigidbodyを探して選ぶ

![Qiita20190109.png](https://qiita-image-store.s3.amazonaws.com/0/307841/72188c0a-a51d-2fc1-4bf1-f5dc83c09de1.png)


##100の作成・プレハブ化

Cubeの配置と同様の方法で3D Textを選択する
↓
NewTextが表示され選択し、TextMeshのTextに100と入力する。
↓
Projectに生成されているフォルダー（どこでも良い）にInspectorのNewtextを挿入する（プレハブ化）

![プレハブ化.png](https://qiita-image-store.s3.amazonaws.com/0/307841/256a728d-89ee-25f6-76bd-128373055c06.png)




##スクリプトを組む
HierachyのCubeを選択
↓
Inspectorを表示させAdd Coonentボタンを押す
↓
検査からNew Scriptを探して選ぶ
↓
Nameは何でもよい(ここではCubeにしておく）。
↓
編集作業

~~~C#
public class Cube : MonoBehaviour {
    //GameObjectの設定
    [SerializeField] GameObject newtext;
    //CubeRendererの設定
    [SerializeField] Renderer RendererCube;
    //Cubeが消えたところにTextを表示させる。
    Vector3 pos = new Vector3(-1.0f, 1.0f, 0);

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}

    //Sphereが当たった時の設定
    void OnTriggerEnter(Collider other)
    {
        //Rendererを偽（オフ）にする。
        RendererCube.enabled = false;
        //new Textクローンの生成
        Instantiate(newtext, transform.position +pos, Quaternion.identity);
        //4f後にCubeが消える
        Destroy(gameObject, 4f);
    }
}

~~~


##[SerializeField]にGameObjectを挿入する
Cube(Hierachy)を選択する
↓
Cube(Script）のRenderer CubeにCube(Hierachy)を挿入する
↓
プレハブ化したNew textをCube(Script)のTextに挿入する。

![挿入.png](https://qiita-image-store.s3.amazonaws.com/0/307841/2b327899-fb14-331f-bfb8-a275a6e73915.png)


##再生ボタンで結果
わかりやすくCubeと100を赤にしてあります。
![movie.gif](https://qiita-image-store.s3.amazonaws.com/0/307841/c3b56349-8105-a727-9722-03df54730e3a.gif)


##補足
3Dのオブジェクトと3DTextの中心座標（0,0,0)は設定上同じでも実際に配置すると、違う場所に表示される。
いくつかサイトを検索して調べてみたが、設定で改善する方法が見つからず、Vertex値をいじくることで解決。

##感想
今回は画像と文字を使ったが、画像を使う場合文字を減らすことができるかつ理解がしやすいと感じた。
やっていることはたいしたことがないが、今後も自分の勉強の為にアップデートしていきたい。
MacでSVNコマンドにおけるSSH接続時のデフォルトユーザを指定する

MacでSVNコマンドを利用する場合、サーバとのSSH接続に利用されるユーザは、通常Macのログインユーザとなる

```shell:チェックアウト
svn checkout svn+ssh://host/hoge
```

以下のようにユーザを指定することはできるが、SVNコマンドを打つたびに指定する必要があり、手間である

```shell:ユーザを指定したチェックアウト
svn checkout svn+ssh://username@host/hoge
```

SVNコマンドでユーザを指定しない場合のデフォルトユーザを、Macのログインユーザとは別に設定する方法を以下に示す

# 方法

## SVNのグローバル設定
Macで開発者ツールを導入しSVNコマンドを利用すると、`~/.subversion/`以下にグローバル設定ファイルが生成される

その中の`~/.subversion/config`ファイルに、SSHによりサーバ接続する際のコマンドを変更する行が用意されているため、その行をアンコメントアウトする

```config:config
[tunnels]
...
ssh = $SVN_SSH ssh -q --
```

上記により、`svn+ssh://`スキームでサーバに接続する際、環境変数`$SVN_SSH`が利用されることになる

## 環境変数の設定
`~/.bash_profile`に`$SVN_SSH`を設定する

```bash:.bash_profile
export SVN_SSH='ssh -l username'
```

上記により、Terminalを起動した際に環境変数`$SVN_SSH`が設定され、SNVコマンドでSSHによりサーバ接続する際のデフォルトユーザを変更することができる
C++のアンマネージドコードのDLLをPInvokeで呼び出す方法


# これは何？
マネージドコードからアンマネージドコードのdllを呼ぶ、つまり .net framework を挟んだコードから挟まないコードのdllを呼ぶ方法の一つとして、P Invokeという方法があります。
ここでは、C++ で書かれた dll を、C# で PInvokeで呼ぶサンプルをしめします。
環境は以下の通りです。
- .NET Framework 4.7
- Visual Studio 2017
- Windows 10

# 呼び出される側の DLL 
言語はC++です。

```c++
#include <Windows.h>
#include "BasicMath.h"

extern "C"

_declspec(dllexport) int half(int n){
    return n / 2;
}
```
このコードで mymath.dll  を作ります。

# 呼び出す実行ファイル側

マネージドコード側の C# です。できた mymath.dll 内の half 関数を呼び出します。

```c#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;


namespace PInvok_caller
{
    class Program
    {
        static void Main(string[] args)
        {
            int ret = half(10);

            Console.WriteLine($"{ret}");
            Console.ReadKey();
        }

        [DllImport("myath.dll", CallingConvention = CallingConvention.StdCall )]
        static extern int half(int n);
    }
    
}
```

コンソールに 5 と表示されると思います。

# 躓いたところ

```c#
[DllImport("mymath.dll")]
static extern int half(int n);
```
としたところ以下のようなエラーが出た。


```
PInvoke 関数 'PInvok_caller!PInvok_caller.Program::half' がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメーターがターゲットのアンマネージ シグネチャに一致していることを確認してください。
```


アンマネージドコードの実行が厳格化されたようだ。以下のように変更。

```c#
[DllImport("mymath.dll", CallingConvention = CallingConvention.StdCall )]
static extern int half(int n);
```
Webアプリでファイルのアップロードからダウンロードまでを一度の非同期通信で行う


「クライアントからファイルを受け取り、サーバからもファイルを返す」という処理を１回のユーザ操作で実現したく調べた結果、fetch api、blobを使って実装したのでサンプルを記載しておきます。
サーバ側はDjangoです。

## HTML側

```html:sample.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <title>fetch sample</title>
    </head>
    <body>
        <form name="upload_form" onsubmit="myFetch()" method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            <input id="upload_file" type="file" name="file">
            <input type="submit" value="送信">
        </form>

        <script type="text/javascript">
            function myFetch(event) {
                // HTMLでの送信をキャンセル　これをしないとページがリフレッシュされる
                event.preventDefault();

                let fd = new FormData( document.getElementById('upload_form') );

                fetch("/hogeURL", {
                    // ファイルを送信
                    method: "POST",
                    body: fd
                }).then(response => response.blob())
                .then(myBlob => {
                    // サーバからのレスポンスが完了
                    // サーバ処理でエラーが起きてもここに来る
                    console.log('完了');
      
                    // 内部的にBlobオブジェクトに対するリンクを生成＆クリックしてダウンロード
                    let a = document.createElement("a");
                    a.style = "display: none";
                    a.href = URL.createObjectURL(myBlob);
                    a.download = 'ダウンロード用ファイル名';
                    document.body.appendChild(a);
                    a.click();
                }).catch(function(error) {
                    console.log('エラー:', error.message);

                });
            }
        </script>

    </body>
</html>
```

## サーバ側

```python:views.py
def upload(request):

    # サーバ内での処理の例 アップロードされたファイルを保存
    req_file = request.FILES['file']
    destination = open('ファイルを保存するパス', 'wb')
    for chunk in req_file.chunks():
        destination.write(chunk)

    # ファイルを返却
    response = HttpResponse(open('返却するファイルのパス', 'rb').read(), content_type='ファイルのMIME type')
    response['Content-Disposition'] = 'attachment; filename="返却時のファイルの名称"'

    return response
```


# 参考
[Fetch API](https://developer.mozilla.org/ja/docs/Web/API/Fetch_API)
【JavaScript 】クラス

# クラス

```javascript:
'use strict';

class Player { // クラス名は慣習的に大文字から始める
    
    constructor(name, score) { // コンストラクター
        // プロパティ
        this.name = name;
        this.score = score;
    }

    // メソッド
    showScore() {
        console.log(` score = ${this.score}`);
    }

    // 静的メソッド
    static showVersion() {
        const version = '1.0';
        console.log(`Player class ver. ${version}`);
    }
}

// インスタンス
const player1 = new Player("player1", 10);

// プロパティ
console.log(player1.name); // player1

// メソッド
player1.showScore(); // score = 10

// 静的メソッド
Player.showVersion(); // Player class ver. 1.0
```
※Google Chrome で確認
※ES8
JetbrainsのToolboxからAndroid Studioが管理できるようになった話

みなさん、Jetbrains製のIDEは好きですか？
私は大好きです。
C#の開発でも、[Visual Studio](https://visualstudio.microsoft.com/ja/downloads/)より[Rider](https://www.jetbrains.com/rider/?fromMenu)使うぐらいには好きです。

みなさんの中にも、[Intellij Idea](https://www.jetbrains.com/idea/?fromMenu)や[Pycharm](https://www.jetbrains.com/pycharm/?fromMenu)のコミュニティー版を使っている人がいるのではないでしょうか。
そして、[Toolbox](https://www.jetbrains.com/toolbox/app/?fromMenu)を使用してプロジェクトの管理やIDEのバージョン管理を行っている人も多いと思います。

プロジェクトが一括管理できて、IDEのバージョン管理も行えてかなり便利なツールですが、[Android Studio](https://developer.android.com/studio/?hl=ja)を使っている時に「なんでIntellij IdeaベースのAndroid StudioがToolboxに対応していないんだ？」と不満に思うこともありました。

しかし、ついにToolboxがAndroid Studioに対応したのです！
<img width="451" alt="スクリーンショット.png" src="https://qiita-image-store.s3.amazonaws.com/0/222887/5fca97ef-c161-aeda-4399-26368a7052cb.png">

これでAndroid StudioのプロジェクトもPycharmやIntellij Ideaのものと一緒にToolbox上で一括管理できますし、自動アップデートもできます。
とても嬉しいです。というだけの話でした。
Xcode:「install additional required components」で躓いた時のメモ。

Xcodeをアップデートした際に、「install additional required components」を求められましたが、
「install」を押下しても進まないため、備忘録を含め解決方法を記述いたします。


#ターミナルで「sudo xcodebuild -runFirstLaunch」をすることで解決。
```Swift:ターミナル
$ sudo xcodebuild -runFirstLaunch
```

念の為に参照元を記述いたします。
https://stackoverflow.com/questions/19668537/xcode-install-additional-required-components-using-command-line


ご参考になれば幸いです。
LaTeX 簡單科學文章輕鬆寫

## 開始之前
####你看過「[從零開始的 LaTeX 急速入門](http://qiita.com/TomSnake12/items/30616ee4907dc2aad9a2)」嗎？
沒有？
####那你知道如何編譯一個LaTeX檔案嗎？
知道。

**OK** ， 本文將提及關於如何使用LaTeX編輯出一篇簡單的文章，不涉及複雜的排版，以及LaTeX基本使用方法。
讓我開始吧~~

## 編輯文章
一般來說，你應該在寫「結構性文章」時才使用LaTeX。LaTeX不適合用來編寫非常靈活的雜誌、新聞類文章。

### 段落與空行
LaTeX有一個很大特性就是會無視空白。會是多個空白為一個。舉例來說：

```
This is a book.
This   is   a   book.
```

是完全相同的，他們會輸出一模一樣的 "This is a book." 如下圖：
![tisbook.png](https://qiita-image-store.s3.amazonaws.com/0/112105/c495aff0-44e2-a426-06ea-1edc1eb278d0.png)
沒有錯，他還會無視換行。

這讓編輯文章，變得比較輕鬆，因為你可以比較靈活的在筆記本軟體當中編輯文章。
舉例來說：

超級長句子：

```
A wiki (Listeni/ˈwɪki/ wik-ee) is a website that provides collaborative modification of its content and structure directly from the web browser. In a typical wiki, a text is written using a simplified markup language (known as "wiki markup") and often edited with the help of a rich-text editor.
```

排版的容易閱讀

```
A wiki (Listeni/ˈwɪki/ wik-ee) is a website that provides collaborative modification of its content and structure directly from the web browser. 
In a typical wiki, text is written using a simplified markup language (known as "wiki markup")
and often edited with the help of a rich-text editor.
```

我們將這樣連續的區塊稱為「段落」
而我們用一行的「空行」表示段落與段落的區隔，參考這段代碼：

``` LaTeX
Hello, this is an article about \LaTeX.
It will help you to make a high-quality printable document.
When writing, you use plain text as opposed to formatted text,  like Word.

\LaTeX is a programming language, too.
so you can writ a program in \LaTeX
```

一般來說$\LaTeX$會有預設的段落縮排。所以上面這段代碼就可以獲得以下的成果。

那麼，如果說要在特定的位置換行，而且不縮排呢？一般來說，使用的是強迫換行`\\`
如果不希望有首行縮進則可以用`\noindent`或是設定縮進為0`\setlength{\parindent}{0pt}`
看一下一個複雜的段落控制：

| 指令 | 功能 |
|:-:|:-:|
|`\\`   | 強迫換行  |
|`\\[5pt]`   |  強迫換行與下一行相距5pt |
|`\noindent`   | 不要縮進   |
| `\setlength{\parindent}{2em}`  | 設置段落縮進長度  |


### 文章結構
在討論文章結構之前，我必須解釋$\LaTeX$的基本結構。也就是：

``` latex
\documentclass[12pt,a4papaer]{article}
%set format of document
\begin{document}
%write something
\end{document}
```
一般來說：學習電腦程式軟體，這些基本結構都不是非常重要，也不太需要特別去改變。所以，重點請參看下表：

|  | 功能 | 解釋 |
|:-:|:-:|:-:|
|\documentclass|樣式設定指令|永遠都在第一行|
| [12pt,  | 設定本文字級 | 預設11pt or 12pt不會錯  |
| ,a4paper]  | 設定本文尺寸  | BJ4 還有 b5paper可以選  |
| {article}  | 設定本文樣式  | 套用現成範本的概念  |
|\begin{document}   | 本文開始  | 從這裡開始的內容才會顯示  |
|\end{document}   | 文章結束  | 後面不能有任何文字  |

樣式設定的部分預設可以選的有以下幾種：

| 樣式 | 說明 |
|:-:|:-:|
| article  | 一般文章，分小節(section)與子小節(subsection)  |
| IEEEtran   | IEEE用的可以裝一下逼  |
| report  | 跟article類似，但是可以有章節(Chapter)  |
| book  |  寫書的範本 |
| beamer  |  用LaTeX做簡報的範本 |

接下來，就是「章節指令」。將文章邏輯性的分割對於科學文章頗為重要。
因此，章節的稱為為$\LaTeX$最核心的指令也不為過。原則上，就是`\section` `\subsection` `\subsubsection`
這些章節指令，會將文章的斷若切割，然而實際上，這些指令都只是生成一個適當樣式的標題而已歐，所以適當的縮進，可以讓你看得更清楚。

```latex
\documentclass[12pt,a4paper][article]
\begin{document}
    \section{title 1}
        Hello this is a book.
        \subsection{subtitle 1}
            Hello, here is a subsection.
        \subsection{subtitle 2}
            Hello, here is a subsection 2.
\end{document}
```
pandasqlでpandasでもSQLを使ってみる。。。？

# はじめに
pandasでもテーブル操作ができますが、SQLに慣れている人だと操作に戸惑うと思います。
pandasでもSQLを使用できるpandasqlを使ってSQLでデータ操作してみましょう。

# 参考
- [pandasql · PyPI](https://pypi.org/project/pandasql/)

# 環境
- Google Colab
- pandas==0.22.0
- pandasql==0.7.3
- seaborn==0.7.1

# 手順
`pandasql`のインストールは`pip`で出来ます。Google Colabでは元々入っていました。

```bash
$ pip install -U pandasql
```

デモンストレーションにはタイタニックデータを使用します。`seaborn`からデータをダウンロードします。
また、`pandasql`から`sqldf`を読み込みます。

```python
import pandas as pd
import seaborn as sns
from pandasql import sqldf

df = sns.load_dataset("titanic") # タイタニック号の生死者データ
```
データを見てみましょう。

```python
df.head()
```
<img width="970" alt="スクリーンショット 2019-01-19 21.31.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/2d12e5ff-6a2f-9b18-ddeb-bf45b8c87f82.png">

このデータに対してSQLを発行します。まず、SQL文を変数に格納します。
トリプルクォーテーションで囲むと改行も含めてそのままの文字列とできます。見やすさのために改行を積極的に使ったほうがよいでしょう。
FROM句にはデータフレームを記載します。
また、SQL文法は[SQLite syntax](https://www.sqlite.org/lang.html)に準拠します。

```python
q = """
    SELECT *
    FROM df
    WHERE embarked=='S';
    """

# 下記でもOK
# q = "SELECT * FROM df WHERE embarked=='S';"
```
下記でSQLを実行します。

```python
sqldf(q, locals())
```
<img width="1019" alt="スクリーンショット 2019-01-19 21.39.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/42752056-09c0-db2f-8b38-e3f83de73cf4.png">

bool値は数値になっていますね。。。`dg = sqldf(q, locals())`で`dg`にデータフレームを代入できます。

二つ目の引数には`locals()`または`globals()`で名前空間を指定します。

```python
def execute_sql():

    q = """
        SELECT *
        FROM df
        WHERE embarked=='S';
        """
    
    return sqldf(q, locals())

execute_sql()
```
`OperationalError`となり、`PandaSQLException`がレイズします。`locals()`を`globals()`にすると期待通りに動きます。

### その他の文もやってみよう！
UPDATE文からやってみましょう。

```python
q = """
    UPDATE df
    SET survived = 1
    WHERE embarked=='S';
    """

sqldf(q, locals())
```
`OperationalError`となり、`PandaSQLException`がレイズします。。。
その後調べてみましたが、どうもSELECT文しか使えないようです。joinやgroupbyはできるようですが。

また、pandasqlはリリース日が`Last released: Apr 21, 2016`となっており、開発が止まっているようです。。。

# おわりに
諦めてpandasに慣れましょう。
Laravel+PHPStormでデバッグ（ブレーク）する設定方法 ※Win対応、Homestead、Vagrant不要

## 注意
ブラウザからデバッグ用のクッキーを生成するのが前提となっているため、画面がついている機能でないと厳しいかも。
（細かいことはよくわからん）

デバッグ用のクッキーがあればいいだけっぽいので、

* APIをブラウザで一回開く
* ブラウザでデバッグON
* ブラウザからAPI叩く
* クライアントアプリでヘッダに↓を自分で付ける

とか、何かしらの方法でデバッグ用クッキー渡せればいい。
※リクエストのヘッダに↓つければクライアントは何でも止まる。（VSCodeのREST Clientを使って実験済み）

```
Cookie: XDEBUG_SESSION=PHPSTORM;
```

## 手順

[ここ参照](https://www.jetbrains.com/help/phpstorm/zero-configuration-debugging.html)

要は、

* xdebugを入れる
* php.iniにxdebugの設定をいれる ※[ここのURLの "Integrating Xdebug with the PHP interpreter"](https://www.jetbrains.com/help/phpstorm/configuring-xdebug.html)
* chromeの拡張機能に [Browser Debugging Extensions](https://www.jetbrains.com/help/phpstorm/browser-debugging-extensions.html) 入れる
* chromeの拡張機能のオプションを開いて、使用しているIDE（ここではPhpStorm）にIDEKeyを変える
* `PhpStorm > settings > Languages&Frameworks > PHP > Debug > xdebug` で指定してあるポート番号と、`php.ini内 > xdebugセクション` のport番号を合わせる  
※デフォルトだと9000同士になっていると思うけどdocker for windows？が9000を使っていて9000が取れない時がある
* デバッグしたいページ開いて、chromeの拡張機能を `Debug` にする（ブラウザにデバッグ用のクッキーが生成される）
* PHPStormでブレークポイントを入れる
* PHPStormの↓をONにする  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/299475/6bf5301c-31a2-c615-503d-4cd61d4ac330.png)
* 処理を実行すると、ブレークする

## 関連リンク

* [Dockerコンテナ内でLarvelを起動（php artisan serve）して、ローカルのPhpStormでデバッグする](https://qiita.com/k_hoso/items/10d61f7241e1b8af7faa)

## 参考

* [WindowsでPhpStormとXdebugを動かす](http://tezu.hatenablog.com/entry/2013/05/31/143541)
* [[PHP] Xdebug のリモートデバッグ、理解していますか？](https://qiita.com/castaneai/items/d5fdf577a348012ed8af)
あると便利なWindows向けのファイルコピーバッチ

あるファイルを所定のフォルダにYYYYMMDD_hhmmを付与して保存するバッチです。

まぁGit使えよとか言う声もあるとは思いますが、
非エンジニアの方もいますし、Git管理するレベルでないファイルもありますので、
なんだかんだであると便利です。

```` コピーバッチ.bat
@echo off
REM ファイル名、拡張子名、保存先フォルダ(相対パス)を設定する
set copytgtfilename=filename
set copytgtfileextensionname=xlsx
set copyfolder=backup

REM YYYY,MMを設定
set YYYYMMDD=%date:~-10%
set YYYYMM=%YYYY%%MM%
set YYYY=%YYYYMMDD:~0,4%
set MM=%YYYYMMDD:~5,2%
set DD=%YYYYMMDD:~8,2%
set YYYYMMDD=%YYYY%%MM%%DD%
REM HHMMを設定
For /F "eol=;tokens=1,2,3*delims=:, " %%i in ('time /t') DO SET HHMM=%%i%%j

set copytgtfilefullpath=%copytgtfilename%.%copytgtfileextensionname%


copy %copytgtfilefullpath% %copyfolder%\%copytgtfilename%_%YYYYMMDD%_%HHMM%.%copytgtfileextensionname%
````
EC-CUBE ４ インストール方法

# composerのインストール

```
$ brew install composer
```

# eccube4.0のインストール
```
$ composer create-project ec-cube/ec-cube ec-cube "4.0.x-dev" --keep-vcs
```

# サーバーの起動
```
$ cd ec-cube
$ bin/console server:run
```

# 参考ページ

- EC-CUBE 4.0 開発ドキュメント
http://doc4.ec-cube.net/quickstart_install
ワイルドカードで署名しているとcertbot renewが失敗するんだけど！！

# 更新ではなく、再取得が手っ取り早いよ

ワイルドカードでの`certbot renew`はなんか特殊みたいなので、一度既存の証明書を削除してから再取得しましょう。

ドメイン名: **kiwi-bird.xyz**の場合

```bash
# !/bin/sh

# 既存の証明書の削除
## /etc/letsencrypt/live/
## /etc/letsencrypt/archive/
sudo certbot delete -d kiwi-bird.xyz

# 証明書の取得
sudo certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --manual --preferred-challenges dns -d *.kiwi-bird.x
yz -d kiwi-bird.xyz
```

ワイルドカードでの取得には、ご利用のDNS`TXT`レコードを利用して確認をします。

```dns
TXT    _acme-challenge    3600    *******************************************
```
CognitoIDプールを使った独自認証、認証後STSを使った一時クレデンシャルの返却まで

## 概要


[AWS公式のID プール (フェデレーティッドアイデンティティ) の認証フロー](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/authentication-flow.html) の `開発者が認証した ID の認証フロー` の `基本的な認証フロー` をやります。

`拡張認証フロー` の方がほとんどのお客様にとって、正しい選択だと書いてありますが、何か上手くいかなかったのでとりあえず基本の方やります。。

## 環境

* 公式フローだと、`AssumeRoleWithWebIdentity` はクライアントからやることになっていますが、面倒くさいので、Lambdaの中で完結させます。
* 独自認証の認証自体はやりません。  
※認証できているという前提で、`GetOpenIdTokenForDeveloperIdentity` からやります。  
　実際には `GetOpenIdTokenForDeveloperIdentity` の前に独自認証の処理が必要です。
* Lambdaのロールには `FullAccess` をつけます。  
※`GetOpenIdTokenForDeveloperIdentity` を実行するためにはクレデンシャルが必要です。（当たり前っちゃー当たり前）  
なので、ローカルからいきなり `GetOpenIdTokenForDeveloperIdentity` を実行しようとしても怒られます。

## 準備

### CognitoIDプールを作成する

1. Cognitoの"フェデレーティッドアイデンティティ"のページを開く
2. "新しい ID プールの作成"ボタンを押す
3. ↓にチェックいれて（それ以外は適当でOK（認証しないので））、"プールの作成"
![image.png](https://qiita-image-store.s3.amazonaws.com/0/299475/6312bea7-e0f5-ec0a-db7a-8427689356f0.png)
4. 認証プロバイダを下記で設定 ※開発者プロバイダの名前は任意で良い
![image.png](https://qiita-image-store.s3.amazonaws.com/0/299475/4950cb2b-c04a-a006-989c-518ce215e8a9.png)
5. あとはとにかく次へ行ってCognitoIDプールが作成する。

### Lambdaの実装

下記のコードをLambdaにコピペしてください。

```python:Lambda
import json
import boto3

def lambda_handler(event, context):

    # 事前にここに独自認証の処理を行う（要件に合わせて自分で実装）

    client = boto3.client('cognito-identity')
    # reponseのTokenにはIDトークンが入る
    # ※備考
    # "iss": "https://cognito-identity.amazonaws.com" になる。
    # ユーザプールで発行した場合の"iss"は"https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_xxxxxxxx（ユーザプールID名）"になる
    response = \
        client.get_open_id_token_for_developer_identity(IdentityPoolId='ap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', # プールID の IDプールのID
        Logins={'login.mycompany.myapp': 'test_user'},
        # { 認証プロバイダ > カスタム > 開発者プロバイダーの名前 で登録した開発プロバイダーの名前: 独自認証したユーザID }
    )

    client2 = boto3.client('sts')
    ret = client2.assume_role_with_web_identity(
        RoleArn='arn:aws:iam::xxxxxxxxxxxx:role/service-role/lambda_role',
        RoleSessionName='boto',
        WebIdentityToken=response['Token'],
    )
    print(f"assumeRoleWithWebIdentity:{ret}")

    return {'statusCode': 200, 'body': json.dumps('Hello from Lambda!')}
```

## 実際にクレデンシャルを発行してみる

Lambdaを実行させるだけです。
ログに下記が表示されます。

* AccessKey
* SceretAccessKey
* SessionToken


## 注意事項

### 一時クレデンシャルを使ったリクエストの注意

[一時クレデンシャルを使ったリクエストの注意](https://qiita.com/k_hoso/private/2a975a73a77e80746867)

### STSの実行権限付与

Lambdaを実行しているロールにSTSの権限を付与する必要があるので、該当ロールの
`"信頼関係" >  "信頼関係の編集"`
で表示されるポリシーの中身に注意すること

```json-doc
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com",
        "Federated": "cognito-identity.amazonaws.com" // ここ大事
      },
      "Action": [
        "sts:AssumeRole",
        "sts:AssumeRoleWithWebIdentity" // ここ大事
      ]
    }
  ]
}
```

## 参考
* [AWS公式のID プール (フェデレーティッドアイデンティティ) の認証フロー](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/authentication-flow.html) の `開発者が認証した ID の認証フロー` の `基本的な認証フロー`

## 関連

* [CognitoIDプールを使ってゲストユーザ（未認証ユーザ）に一時クレデンシャルを発行する](https://qiita.com/k_hoso/items/b6577213e263afd8c98d)
Auto Scalling demo

Auto Scalling を設定してしてみた。

 概要は↓
[Auto Scaling](https://qiita.com/leomaro7/items/60595987a308347d4d13)

「Auto Scaling グループ」から「Auto Scaling グループの作成」
![スクリーンショット 2019-01-19 20.51.09.png](https://qiita-image-store.s3.amazonaws.com/0/280929/55c6e0b2-6bcf-1425-6132-86127f07ae04.png)

「今すぐ始める」
![スクリーンショット 2019-01-19 20.52.09.png](https://qiita-image-store.s3.amazonaws.com/0/280929/59e6939f-8751-45c7-d6f1-fc46c9093bef.png)



##1.起動設定##
以下はEC2インスタンスの作成と基本同じなので簡単に書きます。

なお、オートスケールでEC2を自動的に増やす際もAMIが元となります。

**1. AMI の選択**
今回は「Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type」を選択しました。

**2. インスタンスタイプの選択**
今回は「t2.micro」を選択しました。

**3. 詳細設定**
今回は適当な「名前」だけつければOKです。

**4. ストレージの追加**
デフォルトのままにします。

**5. セキュリティグループの設定**

**6. 確認**
「起動設定の作成」



##2.Auto Scaling グループの作成##

**1. Auto Scaling グループの詳細設定**

|項目|入力|
|----------|----------|
|グループ名 |任意の名前を入力します。|
|起動設定 |「1.起動設定」で設定されたものが使用されていることがわかります。|
|グループサイズ|グループで一度で実行されるインスタンスの数|
|ネットワーク|インスタンスのデプロイ先となるVPC |
|サブネット|インスタンスのデプロイ先となるサブネット|
![スクリーンショット 2019-01-19 21.12.30.png](https://qiita-image-store.s3.amazonaws.com/0/280929/b83b576f-81ec-2b2f-38c9-9d3b1f096b3e.png)



##3.Auto Scaling ポリシーの作成##

**2. スケーリングポリシーの設定**
「スケーリングポリシーを使用して、このグループのキャパシティを調整する」をチェックし、
「スケーリング範囲は 2 および 8 インスタンス。これらは、グループの最小サイズと最大サイズになります。」にします。
![スクリーンショット 2019-01-19 21.15.55.png](https://qiita-image-store.s3.amazonaws.com/0/280929/72f61424-7c1b-3580-ad5a-762ef6a22bf5.png)

[スケールグループサイズ]も設定して見ましょう。
以下は、平均CPU使用率60%に設定したものです。
この目標値に近くづくようにスケールイン、スケールアウトが実行されます。
![スクリーンショット 2019-01-19 21.19.55.png](https://qiita-image-store.s3.amazonaws.com/0/280929/88d4701f-556c-7e8a-679f-7ed6c62f635d.png)

**3. 通知の設定**
今回は特に設定しませんでした。

**4. タグを設定**
今回は特に設定しませんでした。

**5. 確認**
「Auto Scaling グループの作成」



##4.検証##

以下のように作成されました。
![スクリーンショット 2019-01-19 21.24.29.png](https://qiita-image-store.s3.amazonaws.com/0/280929/93e8fdc8-e8d6-8579-d5ba-48827ff1caff.png)

Auto Scalingのトリガーを検証するために
[希望するキャパシティ]と[最小]を 3 に増やして見ましょう。
![スクリーンショット 2019-01-19 21.29.32.png](https://qiita-image-store.s3.amazonaws.com/0/280929/ec33ce03-c01f-a93e-f5a3-fab783414487.png)

すると、インスタンスが 3 に増えたことがわかります。 
![スクリーンショット 2019-01-19 21.31.55.png](https://qiita-image-store.s3.amazonaws.com/0/280929/9679ec4c-93f2-8cbf-536b-ad326623a057.png)
【個人メモ】DockerでWordPress使う

# 目的
- Dockerでwordpress開発環境を作った時の個人メモ
- 公式のdocumentだと永続化されていなかったのでvolumeの記述を追加

# 手順

日本語docker公式 本家docker公式 をthemeを開発できるよう、自分なりにいい感じに混ぜました。

- docker-compose.ymlつくって
- docker-composeを起動する
- wordpressをセットアップする

## docker-compose.ymlをつくる

適当なフォルダを作って `.docker-compose.yml` をつくって下記をコピペ

```docker-compose.yml
    version: '3.3'
    
    services:
      db:
        image: mysql:5.7
        volumes:
          - "./.data/db:/var/lib/mysql" # 永続化
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: somewordpress
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wordpress
          MYSQL_PASSWORD: wordpress
    
      wordpress:
        volumes:
          - ./wordpress:/var/www/html # 永続化
        depends_on:
          - db
        image: wordpress:latest
        ports:
          - "8000:80"
        restart: always
        environment:
          WORDPRESS_DB_HOST: db:3306
          WORDPRESS_DB_USER: wordpress
          WORDPRESS_DB_PASSWORD: wordpress
```

## docker-composeを起動する


    > docker-compose up -d
    Creating network "wordpressdocker_default" with the default driver
    Pulling db (mysql:5.7)...
    5.7: Pulling from library/mysql
    Pulling wordpress (wordpress:latest)...
    latest: Pulling from library/wordpress
    Creating wordpressdocker_db_1 ... done
    Creating wordpressdocker_wordpress_1 ... done

なお、終了するときは  `docker-compose down` です。

## wordpressをセットアップする

http://localhost:8000 にアクセスして いつものwordpressのセットアップする・・だけ。なので省略。

![WordPress 言語選択](http://docs.docker.jp/_images/wordpress-lang.png)



# themeの開発

同ディレクトリに `wordpress` フォルダが作られているのでそこを編集すればOKです。

以上。
pyenvでanaconda (Python3系) をインストール

# pyenvとは？
Pythonのバージョン管理ツール。

# Anacondaとは？
データ分析、グラフ描画、画像処理の際によく利用するライブラリが含まれているPythonのディストリビューション。

# pyenvインストール
```bash
# Homebrewでpyenvをインストール.
$ brew install pyenv
$ pyenv -v
pyenv 1.2.9
```

# pyenv設定
.bash_profileに以下を記述する。

```bash:.bash_profile
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

# anaconda (Python3系) インストール
```bash
# pyenvでインストールできるpythonバージョン/ディストリビューションを表示.
$ pyenv install -l
（〜中略〜）
 anaconda3-5.3.1

# anacondaディストリビューションをインストール.
# Python3系はanaconda3-*.
$ pyenv install anaconda3-5.3.1

# インストール確認.
$ pyenv versions
  anaconda3-5.3.1
```

# mac標準のPythonと入れ替え
```bash
$ python --version
Python 2.7.10

# Pythonバージョンを変更.
$ pyenv global anaconda3-5.3.1

# 変わった！
$ python --version
Python 3.7.0
```

# 参考
https://qiita.com/Kos-Ne/items/cbfe98ea7aed6ef66ed8
【PIC】MPLAB X IDE上においてXC8(ver2.05)でビルドする際のエラー

# 環境
Windows 10
MPLAB X IDE v5.10

# エラー
XC8(ver2.05)でビルドすると以下のようなエラーが発生する。


```
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'C:/MPLAB_C/test5.X'
make  -f nbproject/Makefile-default.mk dist/default/production/test5.X.production.hex
make[2]: Entering directory 'C:/MPLAB_C/test5.X'
"C:\Program Files (x86)\Microchip\xc8\v2.05\bin\xc8-cc.exe"  -mcpu=16F628A -c  -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -I"C:/Program Files (x86)/Microchip/xc8/v2.05/pic/include/c90" -I"C:/Program Files (x86)/Microchip/xc8/v2.05/pic/include" -Wa,-a -DXPRJ_default=default  -msummary=-psect,-class,+mem,-hex,-file  -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mc90lib   -std=c99 -gdwarf-3 -mstack=compiled:auto:auto     -o build/default/production/main.p1 main.c 
make[2]: *** [build/default/production/main.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
terminate called after throwing an instance of 'std::invalid_argument'
  what():  No such file or directory
error: clang frontend command failed with exit code 3 (use -v to see invocation)
(908) exit status = 1
nbproject/Makefile-default.mk:106: recipe for target 'build/default/production/main.p1' failed
make[2]: Leaving directory 'C:/MPLAB_C/test5.X'
nbproject/Makefile-default.mk:90: recipe for target '.build-conf' failed
make[1]: Leaving directory 'C:/MPLAB_C/test5.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed

BUILD FAILED (exit value 2, total time: 20s)

```

# 解決方法
XC8(ver1.45)でビルドしたらエラーが出なくなった。

# あとがき
直接の原因はよく分からなかった。ググっても同じ問題を抱えている人を見つけられなかったのでここにメモを残しておく。

# リンク
環境構築で参考にさせて頂いたサイト:
http://www2.kaiyodai.ac.jp/~jtahar0/posts/activity19.html
AWS Fargate のイメージサイズ毎の起動時間の違い

## 概要
AWS Fargate の起動が遅くてつらいことが多く、イメージサイズを減らせば速くなるんだろうか、ということを調べてみた。

## 結果

「起動時間」には以下の構成要素が含まれていると推測する。

* ENI の Allocate (10秒程度)
* コンテナイメージの Pull (かかる時間のほとんど)
* コンテナの起動(Firecrackerの起動？)
* IAM 関連の処理

AWS のネットワークはだいたいリソースサイズによってパフォーマンスが設定されているものがほとんどなので、Fargate も同様であると考えられる。
そのため、リソースが大きければそのぶんイメージの Pull にかかる時間は短縮されると考えられる。
Fargate のネットワークの性能については、[計測された記事](https://stormforger.com/blog/2018/06/04/aws-fargate-network-performance/)があった。

今回、各10回ほど繰替えし計測を行なったが、起動時間の変化はほとんどなかったため、イメージはキャッシュされていないと思われる。

### イメージサイズによる起動時間の比較
以下の図は vCPU 0.25, 512 MB RAM のときに、各イメージサイズの起動時間をプロットしたもの。

![imageSizeTime.png](https://qiita-image-store.s3.amazonaws.com/0/9450/b8dc3b6a-7232-c5b3-8eac-35d53160ebab.png)

### vCPU による起動時間の比較
以下の図は、イメージサイズが1024MBのとき、起動時間が vCPU によって変化するのかをプロットしたもの。

![vcpu.png](https://qiita-image-store.s3.amazonaws.com/0/9450/85f69853-f63f-4374-fbff-7b00a78e3489.png)


## 計測環境

### Base Image
[busybox:latest](https://hub.docker.com/_/busybox) をベースにした。

```Dockerfile
FROM busybox
ARG PAD=0
RUN dd if=/dev/urandom of=/padding bs=1M count=$PAD
```

```shell
$ for i in 0 16 32 64 128 256 512 1024 \
do \
 docker build -t ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/fargate-test:s$i . --build-arg PAD=$i \
done
$ for i in 0 16 32 64 128 256 512 1024 \
do \
  docker push ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/fargate-test:s$i \
done
```


### Image Sizes
* 1.2 MB (Original Size)
* 16 MB
* 32 MB
* 64 MB
* 128 MB
* 512 MB
* 1024 MB

### 試行回数
各サイズ 10回

### Resource
* 0.25 vCPU, 512 MB
* 0.5 vCPU, 1024 MB
* 1 vCPU, 2048 MB
* 2 vCPU, 4096 MB

### Fargate Platform Version
1.3

## 計測方法

Fargate で RunTask を実行し、DescribeTasks API の結果の `createdAt` と `stoppedAt` の差を集計した。

### RunTask

```shell
TASK_ARN=$(aws ecs run-task --cluster fargate-test --task-definition fargate-test:2 --network-configuration 'awsvpcConfiguration={subnets=subnet-593ef401,assignPublicIp=ENABLED}' --launch-type FARGATE --query  'tasks[0].taskArn' --output text)
aws ecs wait tasks-stopped --cluster fargate-test --tasks $TASK_ARN
```

### DescribeTasks
```shell
aws ecs describe-tasks --tasks $TASK_ARN --cluster fargate-test
```