OmniAICreator/Qiita-1.07M huggingface dataset:
便利なコマンドやカスタムしたシェル(fish)について

この記事は、[Sunrise Advent Calendar 2019](https://adventar.org/calendars/4184)の3日目になります。

##  はじめに
今回は、快適なシェル操作をするために、便利なコマンドやターミナルのカスタム設定について書いていこうと思います。

## 便利なコマンド
### bass

自分は普段fishを使っているので、bashコマンドがそのまま使えなくて困ることがあります。
そんな時、`bass`コマンドを使えば、fishシェルのままbashコマンドが使用できます。

使い方は、

```sh
$ bass export X=3
```
のような感じで`bass`の後にbashコマンドを入力するだけです。

GitHubリポジトリは[こちら](https://github.com/edc/bass)
[Fisher](https://github.com/edc/bass#using-fisher)・[Fundle](https://github.com/edc/bass#using-fundle)・[Oh My Fish](https://github.com/edc/bass#using-oh-my-fish)のどれでも導入可能です。

### bat

`bat`コマンドは、多数のプログラミング・マークアップ言語の[構文強調表示](https://github.com/sharkdp/bat#syntax-highlighting)と[Git統合](https://github.com/sharkdp/bat#git-integration)を備えた`cat`コマンドのようなものになります。

GitHubリポジトリは[こちら](https://github.com/sharkdp/bat)
<img width="538" alt="bat.png" title="batコマンドの動作例" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190875/30ac7149-8da5-5b65-f54c-a4143c633af2.png">

#### 他の主な機能

- [制御文字などデフォルトでは表示出来ないものを表示する](https://github.com/sharkdp/bat#show-non-printable-characters)
  - `-A/--show-all `オプションをつけると可視化出来ます
- [自動ページング](https://github.com/sharkdp/bat#automatic-paging)
  - 1画面内では出力しきれないファイルを、オプションをつけずに実行した`cat`コマンドでは、見切れてしまうので便利です

#### Homebrewでのインストールコマンド

```sh
$ brew install bat
```

### exa

GitHubリポジトリは[こちら](https://github.com/ogham/exa)

`exa`コマンドは、ファイルの種類・メタデータを区別し色をつけ表示してくれるものになります。
<img width="706" alt="exa.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190875/33206059-94a1-aed7-297e-0a792a94f62c.png">

#### `ls`コマンドとの違い
`--git`オプションでGitのステータスも表示できる点です。

```sh
$ exa -ahl --git
```
のようにすると、以下のようにステータス表示されます。
<img width="523" alt="exa-git.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190875/795c5551-8796-ae6b-bfb3-1887ccede117.png">


#### Homebrewでのインストールコマンド

```sh
$ brew install exa
```

## カスタム設定
alias以外のところでは、`config.fish`の以下の設定が気に入っています。

### cdした後にls

```sh:config.fish
# cdした後にls
function cd
    if test (count $argv) -eq 0
        cd $HOME
        return 0
    else if test (count $argv) -gt 1
        printf "%s\n" (_ "Too many args for cd command")
        return 1
    end
    # Avoid set completions.
    set -l previous $PWD

    if test "$argv" = "-"
        if test "$__fish_cd_direction" = "next"
            nextd
        else
            prevd
        end
        return $status
    end
    builtin cd $argv
    set -l cd_status $status
    # Log history
    if test $cd_status -eq 0 -a "$PWD" != "$previous"
        set -q dirprev[$MAX_DIR_HIST]
        and set -e dirprev[1]
        set -g dirprev $dirprev $previous
        set -e dirnext
        set -g __fish_cd_direction prev
    end

    if test $cd_status -ne 0
        return 1
    end
    pwd
    ls -A
    return $status
end
```

## おわりに

生産性を更に上げるためのシェル設定は奥が深いですよね〜
このコマンド・設定便利だよ！！などなどありましたらコメントしてくれると嬉しいです😀
ピーちゃんとA3ちゃんのその後

A3「あれー？ひさしぶりだねー！なんかあったの？？？」
P「ちょっと御礼が言いたくなったの～(*'ω'*)でも勘違いされちゃったー」
A3「文章って人によって解釈が難しいから仕方ないよねー」
P「だから、今まであったいろんなことをA3ちゃんにお話ししようかな～」
A3「えー！ホント？楽しみ～」

本題はこちら………[2年越しのAIITについて](https://qiita.com/Asuka_y/items/c91ec4cac88c87a3bcd6)
【Unity】transform.positionを変更して他のGameObjectの位置に移動する

transform.positionを使用してGameObjectを移動させることはよくありますが、他のGameObjectの位置に移動させようとしたときに、躓いたので紹介していきたいと思います。



手順としては、他のGameObjectの位置を取得し、それをVector3.MoveTowardsを使用して移動させていきます。

```C#
void Update(){
  GameObject object = GameObject.Find("他のGameObjectの名前");
  Vector3 pos = object.transform.position;
  float speed = 30.0f;
  float step = speed * Time.deltaTime;
  transform.position = Vector3.MoveTowards(transform.position, pos, step);
}
```

GameObject.Find()でUnity上にある()内の名前のGameObjectを取得します。
そのGameObjectのtransform.positionをposに入れます。
そして、Vector3.MoveTowardsで現在位置であるtransform.positionからposへstepの速さで移動するようにします。

このとき、
pos.x = 1.0f
などとして位置を調整することも可能です。

以上になります。
phpMyAdminのクエリボックス操作で知っておくと便利なこと

phpMyAdminのクエリボックスの操作で、ふと気づきにくい機能をまとめたものです（随時追加）

# １：クエリボックスのフォントを大きくする(以前の記事そのまま)
centosなどを利用して、バーチャル環境でphpmyadminをインストールすると、妙にクエリボックス（SQL入力エリア）の文字が小さくて見づらいことがあります。

![before.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272191/2093629c-9571-7ddf-1885-0d2bcd90df3b.jpeg)


ブラウザの文字サイズを大きくするのもありですが、そうすると全部大きくなってしまうので、入力SQLの文字だけを大きくする方法を探していたら、[こんなページ](https://old-pine.net/content/phpmyadmin%E3%81%AEsql%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E6%96%87%E5%AD%97%E3%82%B5%E3%82%A4%E3%82%BA%E5%A4%89%E6%9B%B4)がありましたが、ここのやり方だと新しいバージョンのphpmyadminには対応していないのか、うまく行きません。

そこで、別のやり方を使うようにしました。

# 場所
xamppなら場所はすぐに分かるのですが、centosなどの場合はアプリケーションによってインストールされる場所が異なります。phpMyAdminの場合、設定ファイルとは違う場所にあります(findコマンドなどで、ディレクトリの位置を確認した方がいいです）

今回の場合はこうなっていました。探したいのはcssフォルダ直下の設定ファイルです。

```
/usr/share/phpMyAdmin/themes/pmahomme/css/...
```

すると、この中にcssを記述したPHPファイルがたくさんあるので、その中から`codeMirror.css.php`というファイルを見つけて、エディタなどで開きます。

そこにこのように書き加えれば準備完了。

```css:codeMirror.css.php
/*以下、cssを書き加える*/
.CodeMirror-Scroll{
  font-size: 18px;
}
```

この状態でphpMyAdminを再読み込みすればこのように、クエリボックスの中の命令文だけが大きくなり、とても読みやすくなります。

![after.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272191/dbe9bae0-ba2f-0dd6-c229-683086f597be.jpeg)

# ２：SQLのクエリ履歴を表示させる
クエリボックスの左下には自動保存されたクエリを取得(パッケージをダウンロードした場合は**Get auto-saved qurey**と表記)というボタンがあります。かつてはここで履歴を、指定件数だけ表示させることができました。ですが、今日だとたった1件（直近のSQLコマンド）しか表示されなくなってしまいました。なんとか、過去の履歴を表示する方法がないものかと色々と巡回していたところ、**コンソール**から履歴をひととおり表示できるという情報を入手。

コンソールは一見わかりづらいですが、このように隠れてメニュー化されていますので、クリックするとボックスが表示されます。

![console_sel2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272191/72294a62-600a-6789-8b95-c8fc1311abb3.jpeg)

このように履歴が表示されます。
![console_sel3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272191/7ac71dd6-3951-8ae1-1e7c-96b9142a6ddb.jpeg)

この履歴を選択すると、クエリの再発行、クエリの編集などができます。編集しづらい場合は再度クエリボックスにコピペするといいでしょう。
![edit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272191/4d26ec23-2a08-cd9d-e53f-63cfbf3363cf.jpeg)

なお、クエリの履歴は全部クリアしたり、右上のオプションから設定して、常に表示させたりすることもできます。


## 履歴件数の変更をしたい場合
右上にある歯車アイコンをクリックすると、クエリボックスの設定ができます。そこからクエリ履歴の長さを変更できます（最大件数25)
。![console_sel4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272191/df4653e6-2497-71a3-2d59-998cff3b1da4.jpeg)


# ３：パラメータで変数を扱う
パラメータを使えば、検索条件を随時変更したいときに重宝します。

## 手順
1. クエリボックスにパラメータとなる変数を含んだSQL構文を入力する。記述方法は:hogeのみ（?や$nは使えません)。また文字型を利用する場合はクエリ側にシングルクォートを記述する（最新のバージョンはデフォルトで型を認識してくれるので、シングルクォートの付与は不要です）。
2. クエリボックス左下のBind Parametersにチェックを入れると、その真下にパラメータ数に比例したテキストボックスが現れる。
3. テキストボックスに調べたい値を入力し、クエリを実行する。
![bind1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272191/72f8eb3b-446a-bb25-66f7-b32591248d2a.jpeg)

すると、検索結果が表示されます。

![SnapCrab_No-0003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272191/a86db2c4-ef45-f390-44a3-cc4073232cf5.jpeg)

なお、このパラメータはSQL文さえ通ればいいので、変数は検索値に限りません。下図のようにカラム名も変数扱いすることができます（テーブル名なども可能です）。

![double.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272191/59a0a2c7-f1a1-d270-1567-9a49ee2298f2.jpeg)
Galaxyサーバ（系統解析）

系統解析 ("phylogenetic analysis") のためのGalaxyサーバを調べてみましょう。
以下の通り、Galaxyのウェブサイト (https://galaxyproject.org/use) にアクセスし、[All]タブをクリックします。Searchボックスでキーワード検索すると、5件ヒットします。

<img width="1429" alt="galaxyproject_All_Search_phy.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220238/55c2932f-5569-1381-52e5-a584c6ebf531.png">

## [HyPhy HIV NGS Tools](https://galaxyproject.org/use/hyphy/)
HIV配列解析ツール。
[HyPhy - Hypothesis Testing using Phylogenies](http://www.hyphy.org/)を用いた配列比較解析ツール

![](https://galaxyproject.org/use/hyphy/galaxy-hiv.png)

## [Langille Lab](https://galaxyproject.org/use/langille-lab/)
[PICRUSt](http://picrust.github.io/picrust/)のサーバ。マーカー遺伝子（例えば、16S rRNA）と全ゲノムからメタゲノムの機能を予測する。

![](https://galaxyproject.org/use/langille-lab/picrust-workflow-450.jpg)

## [NGPhylogeny.fr](https://galaxyproject.org/use/ngphylogeny/)

- [ドキュメンテーション](https://ngphylogeny.fr/documentation)、動画あり
- 論文 [Lemoine et al. Nucleic Acids Res. 2019 Jul 2;47(W1):W260-W265. "NGPhylogeny.fr: new generation phylogenetic services for non-specialists."](https://www.ncbi.nlm.nih.gov/pubmed/31028399)
- [ノンスペシャリストのための系統解析webサービス NGPhylogeny.fr - macでインフォマティクス](http://kazumaxneo.hatenablog.com/entry/2019/11/04/073000)

![](https://galaxyproject.org/use/ngphylogeny/ngphylogeny-steps.png)

## [Osiris](https://galaxyproject.org/use/osiris/)

- 動画 [Osiris Multigene Analysis Demo](https://www.youtube.com/watch?v=mGMxwc20Yx4)
- 論文 [Oakley TH et al. BMC Bioinformatics. 2014 "Osiris: accessible and reproducible phylogenetic and phylogenomic analyses within the Galaxy workflow management system."](https://www.ncbi.nlm.nih.gov/pubmed/24990571)

![](https://galaxyproject.org/use/osiris/osiris-logo.jpg)

## [PIA](https://galaxyproject.org/use/pia/)
Phylogenetics and gene interaction

PIA (Phylogenetically Informed Annotation)は、アライメントプログラムとしてBLASTを用い、RAxMLの[read placement algorithm](https://cme.h-its.org/exelixis/web/software/epa/index.html)を用いて未知の配列を事前に計算された系統樹に入れる。

- [マニュアル (pdf)](https://bytebucket.org/osiris_phylogenetics/pia/raw/05d213dcb31e4cda9ccc68201ee7f8854161b2c9/docs/PIAwebManual_090914.pdf)
- 動画 [Getting started with PIA](https://www.youtube.com/watch?v=m23KxhxhTAE)
- 論文 [Speiser DI et al. BMC Bioinformatics. 2014 "Using phylogenetically-informed annotation (PIA) to search for light-interacting genes in transcriptomes from non-model organisms."](https://www.ncbi.nlm.nih.gov/pubmed/25407802)

![](https://galaxyproject.org/use/pia/pia-image.jpg)
JavaScriptのクラスの扱いに気をつけましょう

#最近はJavaScripterです。
##皆さんは最近のJavaScriptはClassが書けること知ってますでしょうか。
実はJavaScriptでクラスが書けます。
正直言ってc＃と同じくらい使えますね。
ですが一つだけ大変なことがバージョンによってnode.jsの罠に引っかかります。
実は最近ECMAScriptというかRiot初心者だったので大変でしたがjQueryはお手のもんだったのでよかったのですが。
一番大変なのは実は基盤の仕事をしていると一番大変なのは相手側に合わせないと行けないのが大変です。
##正直いうと最近のJavaScriptって結構楽に書ける割には…
ソースが大変なことになっていること多いです。
プロトタイプで開発していると突然訳の分からないパラメータ使って開発している場合もあります。
たまにドツボにハマりますが。
その場合は卒直に聞きましょう。
解釈できません。
簡単だからと思っていたらプロトタイプのソースコードにはまっていたということ多いです。
プロトタイプって意外と急いで作るので怖いんですわ。
#最近はECMAの方が楽です。
JavaScriptが好きでガリガリ書いてましたが。
今回仕事でガッツリECMAScriptが好きになりました。
Node.jsが逆に嫌いになりそうです。
よく自動テストにハマるんですもん。
結局ハンドでバックの方が早いやということでhtmlでjQueryガリガリということも多いです。
いい自動テストソフト探しに正月休みは放浪します。

みんなもガッツリJavaScriptもといECMAScript書きましょう。
【Kotlin】日時(Date)を安全に送信する/解釈する【JavaScript】

この記事は、[Java Advent Calendar 2019](https://qiita.com/advent-calendar/2019/java) 22日目の記事になりました。

`Java`とか言いつつ`JavaScript`や`Kotlin`の話が出てきますが、分量的には`DateTime API`の話が主なので大体`Java`です。

# 解決したい問題
以下の記事の通り、`JavaScript`の`Date`型には多くの罠があります。
日本人であれば「日時を送信したら1日巻き戻って届いた」的な状況は経験された方も多いのではないでしょうか？

- [JavaScript の Date は罠が多すぎる \- Qiita](https://qiita.com/labocho/items/5fbaa0491b67221419b4)

そんな罠だらけの`Date`型を安全に送信/解釈します。

# 解決方法
ものすごくざっくり言うと、規格に則って文字列として送信し、規格に則って文字列から解釈すれば安全に取り扱えます。
今回は例として、`ISO 8601`規格に則って処理を行います。

具体的には以下を用います。

- `Date.prototype.toISOString()`メソッド
- `DateTime API`の`Zoned`系クラス


## 補足
`Date.prototype.toISOString()`メソッドは[大体の環境で動きます](https://caniuse.com/#feat=mdn-javascript_builtins_date_toisostring)が、`DateTime API`は`Java8`以降のサポートです。

# やり方
## 送信側
以下で生成した`dateStr`を送信すればOKです

```javascript:日時文字列生成(js)
const date = Date.now();
// ISO 8601で、タイムゾーンがUTCの文字列
const dateStr = date.toISOString();
```

## 受信側
まず`ZonedDateTime`として解釈して、そこから`Local`系の内容に変換するのがオススメです。
`ZonedDateTime.parse`メソッドは`Date.prototype.toISOString()`で生成した文字列を直に解釈できます。

```kotlin:ZonedDateTime型として解釈(kt)
val dateStr = /* toISOString()した文字列 */
// タイムゾーン付き日時型
val zonedDateTime = ZonedDateTime.parse(dateStr)
```

### タイムゾーンを設定する
型としては`ZonedDateTime`に解釈した時点で安全に取り扱えますが、この方法では受け取った時点でのタイムゾーンがUTC扱いになるため、そこから更に何か扱う前にローカルのタイムゾーンに変換した方が良いでしょう。

タイムゾーンのセットは、`ZonedDateTime::withZoneSameInstant`メソッドで行えます。
このメソッドの引数は`ZoneId`型で、`ZoneId.systemDefault()`を呼び出すことでシステムのタイムゾーンの`ZoneId`を得ることができます。

```kotlin:システムのタイムゾーンを指定(kt)
val original: ZonedDateTime
val zoned = original.withZoneSameInstant(ZoneId.systemDefault())
```

この処理を終えれば、後は自由に扱うことができます。
補足として、日時を厳密に扱いたいのであれば、`JVM`内では日時全てを`ZonedDateTime`として扱い、ゲッター等で必要に応じて変換するというのがオススメです。

# 終わりに
今回は日時(Date)を安全に送信する/解釈する方法についてまとめました。
日時に限らず相対的な値は扱いがとても難しいですが、規格に則ることで安全に扱えるようになります。

この記事が相対的な値の扱いのお役に立てば幸いです。
2020 で一番期待している C# の機能

[Champion "Allow Generic Attributes" · Issue #124 · dotnet/csharplang](https://github.com/dotnet/csharplang/issues/124)

Generic な Attribute が使えるようになる、予定。 `Null check parameter` も捨てがたかったけど、これでコードを綺麗に出来る部分が増えてきそうで楽しみです。あくまで気がするだけ。それとデザイン決定の会話をあんまり見ていないので、もしかしたら違ったり、実際に使えるようになったらこれは NG みたいなのもあるかもしれません。

## どんなコードが書けるか

こういうクラスがあって、

```csharp
class GenericAttribute<T> : Attribute
{
}
```

こんな感じで使う。と、思う。

```csharp
[Generic<string>]
public string MethodA()
{
}

public string MethodB([Generic<int>]int id)
{
}

[Generic<MyClass>]
public MyClass HogeHoge { get; set; }
```

## Note

コンパイラのステータスは [roslyn/Language Feature Status.md at master · dotnet/roslyn](https://github.com/dotnet/roslyn/blob/master/docs/Language%20Feature%20Status.md) です。 C# はこっち [Language Version Planning](https://github.com/dotnet/csharplang/projects/4) だと思います。

現状は C# 9.0 に `Generic Attributes` は入っていないように見えるので、もしかしたら入るかもしれないし、その次の C# 10.0 かもしれないし、もっと先の C# なのかもしれません。
標準入力 標準出力 リダイレクト パイプってなんだ？？

###今回、当たり前で通ってきたから見逃してる４テーマを取り扱う

#標準入力 (standard input) stdin
例えば、
入力された数値の倍の数を三桁の0埋めで表示されるプログラミングを考える。
1→002
2→004
6→012
何も考えずに1を**"キーボード"**で入力していたのではないか？？
この**"キーボード"**こそがここでの標準入力となる。

特に、設定をしていない場合の入力元である。

#標準出力 (standard output) stdout
例えば、同様に
入力された数値の倍の数を三桁の0埋めで表示されるプログラミングを考える。
1→002
2→004
6→012
何も考えずに**"ディスプレイ"**に表示される002を見ていたのではないか？？
この**"ディスプレイ"**こそがここでの標準出力となる。

特に、設定をしていない場合の出力先である。

#リダイレクト (redirection) redirect
テキストファイルに結果を出力するようにプログラムを書いたこともあった。
この変更こそがリダイレクト

標準入力、標準出力の変更のこと

#パイプ pipe
何かのプログラムの出力を、ほかのプログラムの入力にしたいことがある。
この繋がりをパイプという。
【Django】Formをテストする方法 【TDD】

# ファイルのアップロードのテストってどうやんだ…
CSRFのせいでPOSTでファイル送信してもエラー返ってくるんじゃが！
と思ってたけど、formのテストすればいいと分かった。
~~本当はPOSTして帰ってくるコンテキストを確かめるテストしたかったんだけど、わからんかった。
方法はあるのかもしれないので、わかったら追記します。~~

解決したので[この記事](https://qiita.com/NomuK3/items/7cac7083bc270b141f05)にまとめています。

# Formのテスト
今回は下のようなFormのテストをするとしましょう。

```python:forms.py
from django import forms

class FormTest(forms.Form):
    table_name=forms.CharField(max_length=30)
    file_data= forms.FileField()
```

これに対するファイルアップロードのテストは下のように書きます。

```python:tests.py
from django.core.files import File
from ..forms import DocumentForm

class Test_Model_Create(TestCase):
    def setUp(self):
        self.file_data=File(open('./path/test.csv'))

    def test_step1_form(self):        
        data = {
            "table_name":"name_test"
        }
        files={                
            "file_data":self.file_data
        }
        form = DocumentForm(data,files)
        self.assertTrue(form.is_valid())
```

正しいデータを投げれば`is_valid()`はTrueを返してくれます。

# 詰まった点と対策
最初に書いたように、CSRFのせいなのか、正しくファイルをPOSTできてませんでした。
そのあと上記のように変えたのですが、なかなか通ってくれませんでした。
結論から言うと**カスタムバリデーションが悪さをしていました。**
まあ、悪さというより正しく動作していたのですが、テストで記述したデータはそれにあったものではなかったのです。
自分みたいにならないように、皆さんはformのテストをするときはぜひバリデーションエラーを表示するようにしてあげてください。

```python:tests.py
print(form.errors)
```

これでバリデーションエラーの内容が見れます。
想定通りのエラーかチェックしてあげてくださいね。
【PHP7.4新機能】弱参照(WeakReference）をキャッシュに使うってどういうことよ、を考えてみた

先日、別の記事（[【PHP7.4新機能】弱参照(WeakReference）とGCとメモリリークについて整理したよ！](https://qiita.com/miracle-FJSW/items/f35c3e90a5d14eb6eba3)）で、PHP7.4から追加されたWeakReference（弱参照）のphp.netの記載「この機能は、キャッシュのようなデータ構造を実装するのに役立ちます。」が良く分からなかったという話を書いたのですが、「どういうところが分からなかったのか」という質問を知人からもらったので、そのあたりをまとめてみたいと思います。
かなりモヤモヤしているので、**一旦世に晒すことで、このモヤっと感を成仏させたい**と思います。

## わからない理由

キャッシュとしての利用として、たとえば下記のようなコードを想定しましょう。

```php
class Cache
{
	private array $cacheObjects;
	
	public function get($id)
	{
        if (!isset($this->cacheObjects[$id])) {
            return null;
        }
		return $this->cacheObjects[$id]->get();
	}
	
	public function set($id, $object)
	{
		$this->cacheObjects[$id] = WeakReference::create($object);
	}
}
```

**これを使って嬉しいシーンが良く分からなかった。**

なぜならば、PHPのGCの仕組み上、変数に割当たったメモリ領域は、その変数がスコープから外れた時に解放されます。ということは、キャッシュを上記プログラム例のように弱参照で実現するためには、実行しているプロセス中に、強参照を持った変数が生存中である必要がある、ということになります。
そうすると、その強参照を持った変数を直接参照すればよく、別途キャッシュを作る必要などないのでは？と思ったからです。

そこで、ある制約を定義して、それが具体的にどんなシーンがありえそうかを考えました。

```
・コストのかかる処理（DBアクセスなど）によってオブジェクトを生成するクラスXがある
・このオブジェクト（強参照）は、クラスXの内部にのみ閉じており、他のクラスからアクセスすることを許可しない。
・このオブジェクト（強参照）のライフサイクルは、クラスXが支配している。
・他のクラスからこのオブジェクトを参照する場合は、クラスXから弱参照のみ得ることができる。
```

うーん…。キャッシュでの利用を前提としたDBアクセスクラスとか…？例えば、定期的にDBにアクセスして最新の情報を読み出して、負荷軽減をするとか…？
長時間動き続けるバッチ処理やデーモンとして待ち受ける系の処理くらいでしか使わなさそう、かつ、なんだかすごい無理やり感はあるが、そういうクラスの可能性はゼロではない、ということで次に進みましょう。

## おそらくこういう事らしい

色々調べたところ、「PHPにおける(※)弱参照のキャッシュへの活用」というのはどうやらこういうことを言いたいらしい。

- キャッシュの元情報（DBなど）の変更があった場合、キャッシュ側の削除を行い、再キャッシュを行う必要がある。
- キャッシュ側の削除が単純な場合は問題ないが、手続きが複雑であったり、キャッシュ側が複数存在している場合、全て削除を行う必要がある。
- キャッシュ側の持ち方を弱参照にしておくことで、キャッシュ元のオブジェクトを消滅させた時に、キャッシュ側も連動して消滅させることができる。
- これにより、よくある、キャッシュ側の更新漏れによって古い情報を使って処理してしまった、というようなバグを抑制することができる。

※PHPにおける…前述の通り、PHPの場合は参照カウンタ方式のGCのため不要になった領域は即時開放されます。しかし、他のGCアルゴリズム（マーク&スイープ方式）を採用している言語の場合は、不要になった領域でもGCが走るまで存在し続けるタイミングがあるので、この特性を使って「いつ消えてもいいんだけど、メモリ上に残っている間はキャッシュとして使える」というような弱参照の使い方があるようです。ただ、それもちょっとどうなんだろう？という疑問は残りますが。

では、実際にコードを書いて理解してみたいと思います。

```php
$user = findUserById(100); // コストのかかるSQLを実行してキャッシュ元情報を取得　例：ユーザーID:100のユーザー情報を取得

$cache = new Cache();
$cache->set(100, $user);

/*（いろんな処理） */

// キャッシュから取得
$bar = $cache->get(100);

/*（いろんな処理） */

// キャッシュ元情報を削除した
deleteUser(100);

// 本来はキャッシュの削除処理が必要なのだが、キャッシュ側は弱参照なので$userをunsetするだけでキャッシュ側も消滅する
unset($user);

$baz = $cache->get(100); // すでに開放されているのでNULLが取れる
```

上記の例は極めてシンプルな例ですが、キャッシュの削除まわりが複雑な場合は、たしかに弱参照を使う意義はありそうです。
ただ…正直なところ、こういうトリッキーとも取れる手法を使ってキャッシュ制御するよりは、少々泥臭くてもゴリゴリやるほうがいいのではないかと思いました。

## 今なお、納得できず

- 弱参照とは別に強参照を生存させる必然性があり、
- かつ、キャッシュの削除などを手軽に行いたい

という、すごく限定的なシーンで初めて、「弱参照によるキャッシュ」の実現がありそうなので、ちょっと納得感が薄いです。
弱参照の主たる目的としては、[前の記事](https://qiita.com/miracle-FJSW/items/f35c3e90a5d14eb6eba3)に書かせて頂いた通り、循環参照によるメモリ領域の圧迫回避の方がしっくり来る、という理解をしています。

※この記事をご覧になった方で、PHPにおける弱参照の具体的な活用用途（特にキャッシュについて）ご存じの方がいましたら、教えてください…。

ではでは。
【Unity】WebGLでVideoPlayerをプレイした時にちらつく現象を解消

##環境
 - Unity 2019.2.1

##はじめに
今回、初めてVideoPlayerで動画を再生することにしたのですが、
数々の困難が襲って来ました！

その困難たちの中のひとつで、
『動画プレイ時にブラウザ再生時のみ、動画の最初がちらつく（一瞬白くなる等）』
の現象が発生し、それを解決した方法を記載します

##VideoPlayerの使い方
そもそも、VideoPlayerをどうやって実装するかは[コチラ](https://xr-hub.com/archives/15798)等が参考になります。
WebGLの場合は、VideoClipでは再生できませんので、
 
- Source : URL
- URL : 動画保存先URL

を指定して実装してください。

##ちらつく現象解消方法

1. 動画プリロード
2. ロードを待つ
3. 動画再生
4. フレームを待つ （はじめのフレームを表示しない様にする）
5. 画面に表示

で解決しました。
以下が参考ソースです。


```
private VideoPlayer player;

private RawImage rawImage;

void OnEnable()
{
    player.prepareCompleted += PrepareCompleted;
}

void OnDisable()
{
    player.prepareCompleted -= PrepareCompleted;
}

// 2. ロードを待つ
private void PrepareCompleted (VideoPlayer vp)
{
    if (vp != player) { return; }
    StartCoroutine (ShowMovie (vp));
}

private IEnumerator ShowMovie (VideoPlayer vp)
{
    // 3. 動画再生
    vp.Play();

    // 4. フレームを待つ
    while (vp.frame < 1)
    {
        yield return null;
    }

    // 5. 画面に表示
    rawImage.texture = vp.texture;
    rawImage.enabled = true;
}

private void SetVideoUrl (string url)
{
    player.source = VideoSource.Url;
    player.url = url;
}

public void Play()
{
    // 1. 動画プリロード
    player.Prepare();
}
```
3ヶ月データをずらす nヶ月データをずらす


メモ用です．

[pandasで日付・時間の列を処理（文字列変換、年月日抽出など）](https://note.nkmk.me/python-pandas-datetime-timestamp/)

```python
import datetime
from dateutil.relativedelta import relativedelta

# 1期後を作る
df["period1"] = df["決算日"]
df_target = df[["ティッカー","period1","時価総額"]].copy()
df_target.columns = ["ティッカー","period1","period1ago"]
df_target["period1"] = df_target["period1"].dt.to_pydatetime()+ relativedelta(months=3)
df = pd.merge(df,df_target,how="inner",on=("ティッカー","period1"))
df
```
【Salesforce】Lightning Web Component 開発時、VS Codeでダブルクオーテーションが自動補完される件の対処法

# .prettierignoreを追加すれば、自動補完がOFFになる

中身は以下のような感じでOK


```
.prettierignore
**/lwc/**/*.css
**/lwc/**/*.html
**/lwc/**/*.svg
**/lwc/**/*.xml
.sfdx
```
Amazon RDSプロキシって？Lambdaじゃなくても効果ある？フェイルオーバー早くなるって本当？

いかがでしたかブログ風のタイトルですが、調べてみたがわかりませんでしたというオチでは無いのでご安心下さい。

# はじめに

re:Invent2019でAmazon RDSプロキシが発表されました。発表された時はLambdaからRDSへの接続パターンが主に取りざたされていて、直近でLambdaからRDSを使う予定が特に無かった私はシュッと興味リストから外してしまっていました。がしかし、ある日、[同僚のre:Invent参加レポート](https://tech.speee.jp/entry/2019/12/24/144252)を読んでいたら興味深い文言を発見しました。

> RDS Proxy を使うとフェイルオーバーが 66% くらい速くなる

まじか！これならLambda云々関係なく導入した方が幸せになりますね。実際に[RDSプロキシのページ](https://aws.amazon.com/jp/rds/proxy/)を見てみると

> With RDS Proxy, failover times for Aurora and RDS databases are reduced by up to 66%

と書いてありました。急にRDS Proxyに興味が湧いたので動かして実際にフェイルオーバ時の不通時間を計測して比較してみることにしました。

# 検証環境

以下のような環境で検証しました。検証用のために作ったDBで特にデータなどは入れていません。

## DB
- DB: AuroraMySQL
- バージョン: 5.6.mysql_aurora.1.22.1
- マルチAZ: 2ゾーン(ap-northeast-1a / ap-northeast-1c)
- DBインスタンス: db.t3.small

## RDS Proxy
- Previewリリース
- TLSやIAM認証はOFF

# 検証方法

こんな感じの素朴なshell scriptで1秒に1回mysqladminのpingコマンドを実行しました。

```bash
while true;
do
  date ;
  mysqladmin ping -h $HOST -u $USER -p$PASS ;
  sleep 1;
done
```

このスクリプトを以下の3つのエンドポイントに向かって同時に実行しました。

- Auroraの読み取りエンドポイント
- Auroraのクラスタエンドポイント
- RDS Proxyのプロキシエンドポイント

その状態でコンソールからフェイルオーバーを実行し、pingが最後に成功した時間から次に成功するまでの時間を不通時間として計測しました。

# 結果

#### フェイルオーバー実績
- 07:29:06 ~ 07:30:06
- 1分

##### 不通時間
- 読み取りエンドポイント
  - 07:29:06 ~ 07:29:11
  - 5秒
- クラスタエンドポイント
  - 07:29:10 ~ 07:29:20
  - 10秒
- プロキシエンドポイント
  - 07:29:10 ~ 07:29:12
  - 2秒

プロキシエンドポイントの不通時間はわずか2秒でした。pingの間隔が1秒なので、もしかしたらもっと短い時間で接続可能になっていた可能性もあります。読み取りエンドポイントと比較して60%、クラスタエンドポイントでは80%フェイルオーバー時の不通時間が短くなりました。

これはAuroraのエンドポイントがDNSの名前解決先を変えることによって接続先を変更するのに対し、プロキシエンドポイントはプロキシ側で接続先を直接ルーティングしているのが大きな差を要因みたいです。(そう書いてあった)

# おわりに

いかがでしたか？
あんまり厳密には検証してはおらずちょっと動かして計測してみたという感じですが、それでもフェイルオーバ時の不通時間は圧倒的に少なくなりました。

現状プレビューなのでGAまでどうなるかはわかりませんが、個人的にはAuroraのカスタムエンドポイントが使いづらいと感じているのでRDS ProxyがAuroraクラスタの接続先インスタンスをより細かく制御できるように拡張されるとより便利だよなぁと期待しています。
【超初心者向け】『メイドイン「俺」』から学ぶゲーム作り①超基本編


#はじめに
この記事は
**▶︎ゲーム作り興味あるけどよくわかってない**
**▶︎ゲーム制作始めたばかり**
**▶︎スクリプトとかObjectとか、実際何なのかよく分からない**
↑上記のような人たちが
ゲーム制作をする際に少しでも手助けできることを目指して作成した記事です。

#この記事を書いたきっかけ
皆さんは**『メイドイン「俺」』**というゲームをご存知でしょうか？
こちらは**『メイドインワリオ』**に出てくるようなゲームを自分でも作れちゃうよという子供向けのソフトです。
この前ふと、人生で初めてのプログラミング経験はこれなのでは？と思い約10年ぶりにプレイしたところ、めちゃくちゃわかりやすかったです。流石ニンテンドー、、、
今こうして私が**Unity**でゲーム制作をしているのも何かの縁だと思い、この記事を作成しました。

#ゲームの構造
###ゲームとは**『舞台』**のようなものです。
![butai_2_5jigen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550954/20e7ad06-dbb6-32ac-e1f0-e075ed90fc50.png)


舞台には**背景**があって、**役者**がいて、**音楽**と**台本**があります。これはゲームと同じだと考えてもらっって構いません。

###▶︎背景
ゲームにも舞台にもあるのが基本です。どのゲームにおいても背景がないということはありません。ゲームの雰囲気を最も表現している部分といっても過言ではないでしょう。

Unityにおける背景の付け方は[こちら](https://www.sejuku.net/blog/83708)の記事を参考にしてください。
![IMG_9322.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550954/86432eab-d660-6b28-c03f-4ed975675611.png)


###▶︎役者
舞台において、役者は欠かせません。これはゲームにおいても同じことが言えますが、ゲーム作りをする際にはプレイヤーだけでなく風船やコインなど、背景以外の**動きそうなものすべて**を役者として扱います。
ここでいう役者とはUnityでは主に**Object**を指します。
![IMG_9323.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550954/05a20154-2eec-b2c1-489c-1bcae14624de.png)

###▶︎音楽
舞台と同じでゲームにも音楽がなくてはもの寂しくなってしまいますね。BGMだけでなく効果音(ジャンプ音)をつけるともっとゲーム要素が増加します。
![IMG_9325.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550954/39121f89-1643-4944-4ff7-5f0e4dfee16d.png)

Unityにおける音楽の付け方は[こちら](https://www.sejuku.net/blog/83569 "こちら")から。


###▶︎台本
ここが一番ゲーム作りと舞台の**肝**になってきます。
舞台では演者(役者)は皆**台本**を持っています。ゲーム作りにおいてもそれは同じで、役者の一人一人が台本を持っています。この台本こそが**スクリプト**に当たります。役者に何かさせようと思ったらこの台本である**スクリプト**に、セリフにあたる**コード**を書いていきましょう。
![IMG_9324.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550954/d8253640-61ad-43e7-f502-fa9af610b968.png)

#まとめ

上記の要素全てが集まって初めてゲームが成り立ちます。少しはイメージしやすくなりましたでしょうか？
次回は[台本の書き方](https://qiita.com/khjcsm/items/d96132c4f9d3c15918f3 "台本の書き方")について書いていきます。

**『メイドイン「俺」』**についてのサイトは[こちら](https://www.nintendo.co.jp/ds/uorj/index.html "こちら")から。
機械学習を仕事に使うには？ 02_AI開発のプロジェクト全体像

## はじめに
『機械学習を仕事に使うには』をテーマに連載を書かせて頂いてます。
第２回である本記事ではAI開発のプロジェクトがどの様に進んで行くのかを整理して行こうと思います。

章立ては以下の通りです。

- AI開発と機械学習は何が違うのか？
- AI開発の全体像
- AI開発のどこで機械学習を使うのか？
- モデルを構築するための手順

機械学習とは？の理解が怪しいと感じる方は「[第１回：機械学習の目的を理解する](https://qiita.com/Saku731/items/a708ec5c7cbc54e2c1ef)」にも目を通して頂けると良いです。


## AI開発と機械学習は何が違うのか？
[第１回：機械学習の目的を理解する](https://qiita.com/Saku731/items/a708ec5c7cbc54e2c1ef) でも紹介したのですが「AI ＞ 機械学習」という包括関係があります。
具体的には **AI開発を進めて行く中で機械学習の技術を使う** といった位置づけになります。

<div style="text-align:center;">
<img width="60%" alt="image03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555158/c93945c6-93e9-b036-885c-3670a91cecee.jpeg">
</div>

（出典：https://rikei-danshi.work/entry/ai-chigai）

## AI開発の全体像
AI開発は下図でも整理しますが、『企画～PoC～開発～運用』といったプロセスで進んで行きます。


- 企画：AI を使って何をやりたいのか明確にする
- PoC：企画した AI は技術的に開発可能なのか？プロジェクトの採算が取れるのか？をチェックする
- 開発：AI の心臓部である『モデル』を構築してシステムに実装する
- 運用：開発したシステムが安定稼働するように保守・運用を行う


<img width="100%" alt="image03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555158/8cd0fa22-7c4b-138d-cbb5-f523e7bb9148.png">




## どこで機械学習を使うのか？

では、AI開発の全体プロセスが見えた所で、どこで機械学習を使うのか考えてみましょう。
答えとしては「PoC」「開発」で機械学習を使います。

図にも書いてある『モデル』が AI そのものであり、良いモデルを構築するために機械学習のスキルが必要になります。
モデルとは何なのか忘れてしまった人は「[第１回：機械学習の目的を理解する](https://qiita.com/Saku731/items/a708ec5c7cbc54e2c1ef)」を参照されてください。


## モデルを構築するための手順
機械学習を習得するには大きく分けて３つのスキルが必要です。
具体的なプログラミングは第３回の記事で整理します。まず今回は全体像だけ理解していきましょう。

- データの前処理
- モデルの学習   
- モデルの検証

### データの前処理
データの前処理では**モデルが学習できる状態にデータを整える**ことが目的です。

具体的には３つの事を実施するのですが、本質的には機械学習の**『前準備』**を兼ねた分析がメインなので
実務を経験した人が書く記事では**機械学習**ではなく**データサイエンス**の分野として書かれることが多いです。  


- EDA（探索的データ解析）：データの統計的な全体傾向を掴む
- 欠損値・外れ値の処理：ノイズになる邪魔なデータを除去などする
- 特徴抽出：**データの法則性**がどこに現れるのか分析する

### モデルの学習
ここから本格的に機械学習の技術が登場してきます。
「[第１回：機械学習の目的を理解する](https://qiita.com/Saku731/items/a708ec5c7cbc54e2c1ef)」でも紹介した通り、**用意した大量のデータから法則性を見つける**ことが最大の目的です。

<img width="100%" alt="image02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555158/2500bcb2-48be-b6ab-fd7b-4b81b591e831.png">


その為に用意されている機械学習の手法が**アルゴリズム**です。
料理に例えるのであれば **『データ＝食材』**で、**『アルゴリズム＝レシピ』** と考えるとイメージしやすくなります。


食材に応じて適切なレシピで調理すると美味しい料理が出来上がりますよね。
機械学習もそれと同じで、データに対して適切なアルゴリズムを使うと予測精度の良いモデル（＝良いAI）を作る事が出来ます。


### モデルの検証
モデルの学習を終えたら、モデルが予測する結果がどれだけ正しいのか**性能チェック**が必要です。
※たまに **AIはすべて正しく予測するんでしょ？** と勘違いする人が居るので、必ず検証の重要性を教えてあげて下さい。


このモデルの検証で実施する事は２つです。
※２つ目に関しては実務で理解すれば良いので詳細は割愛します

- 予測精度の測定：  
参考書を読むと色々と難しい説明（ホールドアウト法、交差検証 など）が紹介されているのですが、  
**ためしに使ってみて、正しく予測できているのかチェックする** だけのことです。
- モデルの継続的な保守性を考える：  
内容が深くなるので割愛しますが、興味がある方は[モデルの再学習](https://ledge.ai/microsoft-automl/)を読んで頂くと良いです。



## さいごに
次回の記事では、前処理～学習～検証の具体的な実装手順をプログラミング言語 Python をベースにして整理します。
プログラミングの一連手法や具体的な勉強方法を網羅して整理するのでご期待ください。


また、SNS でも色々な情報を発信しているので、記事を読んで良いなと感じて頂けたら
 [Twitterアカウント「Saku731」](https://twitter.com/digisaku710) もフォロー頂けると嬉しいです。

~~また、文末にはなりますが、期間限定で「**チーム開発体験プロジェクト**」をやってます。~~
~~もしご興味あれば[【応募シート】](https://forms.gle/5Jf6EaVkKt8eM4S49)で詳細確認してください。~~
（追記）
満員のため締め切らせて頂きました。
次回は2019年３月を予定しているので、ご案内を希望される方は[【予約フォーム】](https://forms.gle/62troSMPQv8wLitQ8)にご記載ください。


最後までお読みいただきありがとうございました。
Symfony4.4でログイン後にロールによって表示するページを変更する

# 課題

Symfonyでログインフォームを作りました。
ユーザは一般と管理者の2つのロールがあり、ログイン後のページを変えたいです。

# 前提

ログイン処理は、公式ドキュメントの[How to Build a Login Form](https://symfony.com/doc/4.4/security/form_login_setup.html)で実装

# ログイン後のリダイレクト先の変更を調査

キーワード「[symfony login redirect role](https://www.google.com/search?q=symfony+login+redirect+role&rlz=1C1SQJL_jaJP830JP830&oq=symfony+lo&aqs=chrome.0.69i59l3j69i57j0j69i60l3.4014j0j7&sourceid=chrome&ie=UTF-8)」でググると、<code>symfony2</code>のドキュメントばかりでてきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/49138f7e-3da6-e170-61cb-ce769d23998d.png)

検索結果から以下のようなドキュメントを拾い読みをしてみて、何やらログイン後のイベントで処理するような感じと当たりをつけます。Symfony2だからアテにしてはダメなのに、これが間違いの元でした。

* [How to redirect to different url based on roles in symfony 2](https://stackoverflow.com/questions/11506155/how-to-redirect-to-different-url-based-on-roles-in-symfony-2)
* [How redirect in onSecurityInteractiveLogin method in LoginListener - Symfony2](https://stackoverflow.com/questions/8972069/how-redirect-in-onsecurityinteractivelogin-method-in-loginlistener-symfony2)


いろいろ試行錯誤してみて、**リダイレクトのレスポンスを書き換える**ということは、フックでするような処理じゃないなっと結論。

[How to Build a Login Form](https://symfony.com/doc/4.4/security/form_login_setup.html)のステップ3に記載の<code>onAuthenticationSuccess</code>メソッドに手を入れることで終了。


こんな感じで解決ができました。

```php:src/Security/LoginFormAuthenticator.php
  public function __construct(UrlGeneratorInterface $urlGenerator, Security $security)
    {
        $this->urlGenerator = $urlGenerator;
        $this->security = $security;
    }

    public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
    {
        if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) {
            return new RedirectResponse($targetPath);
        }

        if ($this->security->isGranted('ROLE_ADMIN')) {
            return new RedirectResponse($this->urlGenerator->generate('admin_main'));
        }
        return new RedirectResponse($this->urlGenerator->generate('user_main'));    }
```

# その他にはまったこと

セッションにログイン前にアクセスに来たURLを保存しているので、ログイン後に目的のページを表示するようになっています。

正しい手続きでログアウトをすれば、このセッション情報は使われないと考えていたのですが、一般ページが記録されていたようです。

何度、管理者でログインをしても、常に一般ページが表示されて、実装方法に問題があるのかと、さらに時間がかかりました。

クッキーを削除することで、セッション情報をリセットしたら、想定どおりの動作をしました。

# まとめ

古いドキュメントやリソースは無視しないと、あらぬ方向に連れて行かれる場合がある。
IE11に新しい機能が追加されていそう、あれ開発終了してなかったっけ？

ただのメモです。
Internet Explorerの開発はてっきり終了したものと思ったらそうでもないんですかね？

ことの発端としては、Polyfillが正しく挙動しているかテストしていました。
一応PolyfillがないときにはIE11ではエラーになることを確認しようとしたら、これが問題なく動作しました。

あれ？と思い念の為、MozillaのAPIリファレンスを見てみたところ、やっぱり未対応となっていました。
たとえば、以下の機能を確認しました。

 - [Math.sign](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/sign#Browser_compatibility)
 - [Array.includes](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes#Browser_compatibility)

そういえば最近Windows Updateがあったなと思ったらそれらしき更新を発見。

2019年12月10日にIE11の[セキュリティ脆弱性の修正](https://support.microsoft.com/en-us/help/4530677/cumulative-security-update-for-internet-explorer
)が入っていました。

おそらくこの際にいくつかのAPIについては機能追加をしたのではないかと推測しています。

手持ちのWindows端末2台についてはすでに最新バージョン(11.535.18362.0)にあげてしまっていたため、前のバージョン(11.476.18362.0)ではどうだったかは確認できていません。
FXCMのヒストリカルデータを手に入れる

バックテストをするにしても、ある程度信頼できるヒストリカルデータがほしいですね。

ってことでFXCMのデータがほしいわけです。FXCMにHistorical Data Downloader Basic（無料）があるので、本記事ではそれを紹介していきます。
以下のスクショは手に入る通貨ペアとか。Bid, Ask, BidAndAskも選べます。時間足はMT4で使えるもの（1M - 1MN）から選べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/1e2636bc-8f92-ef9d-32b6-612ac6241250.png)


住所入力の画面とか出た場合、日本のだとダメっぽいです。
また、クレジットカードなどを登録する場合も、日本のだと弾かれます。
韓国のも試したんですけど、ダメでした。
※当記事は虚偽記載をして登録することを推奨することを目的としておらず、また推奨自体もしません。

# 1.FXCMのアカウントを作る
ダウンローダーを利用するにはアカウントが必要です。デモ口座でOKなので、
FXCMのMetaTrader4をダウンロード→MT4でデモアカウント作成。
https://www.fxcm.com/markets/platforms/metatrader-4/download/

# 2.FXCM Basic Historical Data Downloader を利用する
### ダウンロード
https://www.fxcmapps.com/apps/basic-historical-data-downloader/


### デモ口座のアカウントでログイン
デモ口座は１ヶ月で無効になるので、その場合はMT4から取り直してください。

### 設定をして「Start Download」
過去のものを全部一気にダウンロードしようとすると長すぎ！って文句言われます。
自分は４年ずつダウンロードしてます。
ダウンロードのボタンを押すと、左下のConnectedのところにプログレスバーが表示されます。
たまにエラーを吐いてきます。理由は不明。ただ、再起動すると直ることがほとんどです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/53f42476-b6e6-d8e6-9bf8-37eafdd39f1b.png)


以下はダウンロード中のデータ。一番下のNZDUSDから始まっているやつがそうです。1キロバイトです。
上の方のデータはダウンロード済みのもの。４年ずつダウンロードしています。
2001年は11月終盤からなので、ファイルサイズが小さいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/1f88b6c8-502c-ee7e-0416-25b0588630d1.png)

### 【重要】「OK」ボタンを押してから暫く待つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/1a371dac-4fcb-7b0e-9d3a-2190a64aabde.png)
Writing…と左下に出ている間は、ダウンロードしたファイルに何もしないでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/05fc36f2-428b-2111-2ce8-2477aae7dc01.png)

### ダウンロードしたデータの容量を確認して、終了
1KBだったりするとダメです。
ダウンローダーのボタンが「Abort」のまんまの場合も失敗です。

### 続けてダウンロードしたい場合も、再起動を推奨
挙動が安定しないので、毎回起動し直すことをおすすめします。

###ヒストリカルデータを整形したい場合
２年分くらいならエクセルで開けますので、そちらで編集しましょう。

### ヒストリカルデータをくっつけたい場合
エクセルでは大容量のデータを開くことができません。
なので複数年のものをまとめたい場合は、[VSCode](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)がおすすめです。
慣れないうちは難しいかもしれませんが。。。
C++で順列を生成する

C++で順列の一覧を作成する方法を考えた。（本当に正しいかどうかの保証はない）

```c++:junretu.cpp
#include <iostream>
#include <vector>
using namespace std;

int N, cnt = 0;

int func(vector<char>list, int len, int index) { //列を格納するvector、列の長さ、インデックス番号
// インデックス番号の文字をインデックス番号から右側の文字だけを交換してゆく

// indexが末尾から2番目になったら末尾の二つだけを交換してそれぞれを表示する 
	if (index >= len - 2){
		for (int i = 0; i < len; i++) cout << list[i]; // 交換する前の列を表示する
		cout << endl;

		swap(list[len - 1], list[len - 2]); //末尾の二つを交換する

		for (int i = 0; i < len; i++) cout << list[i]; // 交換した後の列を表示する
		cout << endl;

		cnt += 2; // cntで組み合わせ数をカウントする
		return 0;
	}

	vector<char>list2 = list;
	func(list, len, index + 1);  // index番号の文字がindex番目（つまり移動していな状態）にある列を
//次の再帰関数に渡す

	for (int i = index + 1; i < len; i++) {
		swap(list[index], list[i]); // index番目とi番目を交換する
		func(list, len, index + 1); // 交換処理した列を次の再帰関数に渡す。index値は＋１しておく
		list = list2;
	}

	return 0;
}

signed main() {
	vector<char>list;

	cout << "順列の長さを入力してください(2以上26以下)：";
	cin >> N;
	cout << endl;

	for (int i = 0; i < N; i++) list.push_back(i + 'A');

	func(list, list.size(), 0);
	cout << "組み合わせ数は" << cnt << "です" << endl;

	return 0;
}
```
> 実行結果
>
>順列の長さを入力してください：4
>
>ABCD
>ABDC
>ACBD
>ACDB
>ADCB
>ADBC
>BACD
>BADC
>BCAD
>BCDA
>BDCA
>BDAC
>CBAD
>CBDA
>CABD
>CADB
>CDAB
>CDBA
>DBCA
>DBAC
>DCBA
>DCAB
>DACB
>DABC
>組み合わせ数は24です

シンプルなモノが出来ないか考えたが数行で済むようなものは思いつかない。多少プログラム文が長くても
ロジックがシンプルで理解しやすければ、それはシンプルなプログラムだと思う。

例としてABCの順列を生成する場合を考えてみる。ABCの順列は
ABC
ACB
BAC
BCA
CBA
CAB
の6通りだ。
これを次のように整理して考える。
ABC ←元の文字列の左から1番目が左から1番目にあり、残り二つを入れ替えている
ACB ←元の文字列の左から1番目が左から1番目にあり、残り二つを入れ替えている

BAC ←元の文字列の左から2番目が左から1番目にあり、残り二つを入れ替えている
BCA ←元の文字列の左から2番目が左から1番目にあり、残り二つを入れ替えている

CBA ←元の文字列の左から3番目が左から1番目にあり、残り二つを入れ替えている
CAB ←元の文字列の左から3番目が左から1番目にあり、残り二つを入れ替えている

これをプログラム文で実装するのは特に難しくなくC++ならswap(変数1,変数2)を利用して元の配列の0番目と
0 + i 番目を交換して、i を1ずつ加算してゆくだけだ。

次にABCDの順列を考えてみる。
ABCD
ABDC
ACBD
ACDB
ADCB
ADBC
BACD
BADC
　.
　.
続く

ABCDの右側の三つBCDだけを考えると先ほどのABCと同じ考え方で6通りの順序があると考えられる。つまり
BCD
BDC
CBD
CDB
DCB
DBC
の六つである。つまりABCDの右側三つの順列を生成する処理は先ほどの簡単に実装できるプログラムに任せて、
自分は一番左にあるAを他の文字と交換する事だけを考えれば良いわけだ。そしてその交換処理を行うプログラムも
簡単に実装できる。つまり0番目のAと1番目のBを交換して次に、元の配列の0番目のAと2番目のCを交換するという
具合だ。

```c++:
for (int i = index + 1; i < len; i++) {
		swap(list[index], list[i]);   // index番目とi 番目を交換する
		func(list, len, index + 1);   // 後の処理は次の関数に渡して任せる
		list = list2;    // 変更を加えた配列を元の配列に戻す
}
```
この考え方は順列の長さが5個でも10個でも同じである。indexが末尾から2番目を指す状態になった時、末尾の二つ
を交換してそれぞれの列を表示させて、他はindexが指す文字を残りの文字列と順に交換してゆく。次の再帰関数に
渡すときにindexの値を１だけ増やしていけば最初の再帰関数では左から0番目と残りの全てを交換処理し、次の関数では
indexが+1 されてるから左から1番目と残りの全てを交換処理するといった具合に繰り返してゆくだけである。
テキストエリアに文字が入力できないって！？！？！！？

# よくわからないけど、テキストエリアに文字が入力できない・・・
この列のあのセルはobject.send_keys("hoge")で入力できるのに、隣の列のあのセルはobject.send_keys("hoge")で入力できないって！？

```
ActionChains(driver).send_keys(セットしたい文字列).perform()
```
これで入力できるようになると思います。
[備忘録] Sympy.rewrite()で指数関数⇆三角関数の表記書き換え

タイトルにもある通り個人的な備忘録としての記事です。
明らかな誤りなどありましたらご指摘頂けると大変助かります。

## Sympyについて
[SymPy 1.5 documentation] (https://docs.sympy.org/latest/index.html)

SympyはPython上で記号計算を行うことができるライブラリで、紙のノートとペンを使って式を変形して方程式の解を求めるような流れをプログラム上で行うことができます。
学術書や技術書等で解説される理論の導出過程を追って学習する際や、便宜上必要な数式を用意する必要がある際等に重宝するのではないかと思い注目しています。
## Sympy.rewrite()
[sympy.core.basic.Basic.rewrite](https://docs.sympy.org/latest/modules/core.html?highlight=rewrite%20args%20hints#sympy.core.basic.Basic.rewrite)
このメソッドは、指定した関数を別の形の関数に表現し直す際に使用します。
波動とか複素関数などの計算過程で指数関数⇆三角関数の式変形をよく行うと思いますが、式簡略化の[sympy.simplify()](https://docs.sympy.org/latest/modules/simplify/simplify.html)等と組み合わせて使うと便利そうです。

## 例題
次式の複素関数wについて実部と虚部に分ける場面を考えます。(U, αは定数)
$$
w = U e^{-i \alpha } \tag{1}
$$
式(1)に対して、
$$ u = Re[w],　　v = -Im[w] $$
とおき、式(1)を次式のように表現することにします。
$$
w = u - iv \tag{2}
$$
この式(2)のu, vを求めます。

式(1)に対して、次式のオイラーの公式（Euler's formula）を用いて、指数関数を実数項と虚数項の和として書き換えます。
$$
e^{i \theta } = \cos{\theta} + i\sin{\theta} \tag{3}
$$
式(3)を式(1)に適用して、
$$
w = U (\cos{\alpha} - i\sin{\alpha}) \tag{4}
$$
したがって、
$$
u = Re\left[w\right]=U\cos{\alpha},$$$$v = -Im\left[w\right]=U\sin{\alpha}
$$

### Sympyで記述する
```python
# ライブラリとモジュールのインポート
import sympy as sp
from sympy import * 

# 定数U, α用の記号を定義
U, alpha = symbols('U alpha')

# 関数wを定義
w = Function("w")
w = U*exp(-I*alpha)
```
### 表示
```python
print(w)  # wを文字で表示
w         # wを数式の書体で表示
```
結果
<img width="462" alt="スクリーンショット 2019-12-25 17.53.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294824/3dab384c-122a-6843-71a8-4df3e9d80952.png">
ここで三角関数(sin, cos)を用いて表現し直すために、rewrite()を用います。

```python
w.rewrite(exp, sin, cos)
```
結果
<img width="462" alt="スクリーンショット 2019-12-25 17.57.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294824/54e97622-8c08-8b83-94be-4030097bbfe0.png">
また、expand()を用いると、式を展開することができます。

```python
expand(w.rewrite(exp, sin, cos))
```
結果
<img width="462" alt="スクリーンショット 2019-12-25 17.59.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294824/e80431d5-f4fb-4d23-5b1d-0b6986a0515a.png">

更に、re()を用いると式の実部と虚部を明示してくれます。

```python
re(expand(w.rewrite(exp, sin, cos)))
```
結果
<img width="463" alt="スクリーンショット 2019-12-25 18.10.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294824/91214f81-8adc-68e1-61a2-a2c804aad257.png">

## まとめ
私は手計算による計算ミスが多いので、それをPythonに代行させられないかと思ったのがきっかけでSympyと出会いました。(執筆時点でまだ出会って３日間ほどですが...)
計算過程の各部における検算や、例題の自炊などにも使えそうなので、学生時代に出会っておけば色々と捗っただろうなと染み染み思いました。
学習ノートも嵩張る紙のノートじゃなくてJupyter使って.ipynbに書いてGithubで管理すれば学習過程も記録できますし、こうして記事の草稿にも使いまわせるので便利ですね。
手書きノートアプリのNotability等も(どちらかというと講演会とかの図入りメモ取り用)あるのですが、結局計算ミスで詰まる課題があったので、Sympyのようなライブラリの存在は助かります。
今後もっと扱いに慣れていこうと思います。
CentOS7で libgeotiff パッケージインストールのドッカーイメージビルドエラー

### 問題説明
CentOS7を使って写真処理パッケージ libgeotiff をDockerイメージでビルドします。

```Dockerfile:Dockerfile
FROM centos:7
RUN yum update -y && yum install -y \
                    curl \
                    libgeotiff \
                    which && \
    yum clean all
```

ビルドすると、「No package libgeotiff available」エラーが出ています。

### 解決方法
原因は　libgeotiff パッケージが　epel レポジトリにあり、CentOS7イメージのデフォルトはこのレポジトリが登録されていない。

この問題を解決するため、　epel レポジトリを登録するか、libgeotiff パッケージのURLを直接でインストールするかの方法となります。
レポジトリを登録する場合、yum-config-manager コマンドが必要となり、yum-utils パッケージをインストルしないといけない。
Dockerイメージのサイズを最低化するため、パッケージのURLを直接でインストールする方法とします。

パッケージのバージョンを選定して、パッケージダウンロードURLに修正します。
libgeotiff パッケージは libproj パッケージを利用するため、同時にインストールする必要です。
最終の Dockerfileはこれとなります。

```Dockerfile:Dockerfile
FROM centos:7
RUN yum update -y && yum install -y \
                    curl \
                    http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/p/proj-4.8.0-4.el7.x86_64.rpm \
                    http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libgeotiff-1.2.5-14.el7.x86_64.rpm \
                    which && \
    yum clean all
```

<br> 
記事のご覧、どうもありがとうございます！
DSS 橋本
「Leakdiagが許されるのは、XPまでよね～！」らしい、という話

#要点のみ
- Visual C++などで作ったアプリの実行時メモリリークを調べるツールとして、Leakdiagがある。また、Leakdiagによって採取されたメモリ使用量をグラフ化するツールとして、LDGrapherがある。
- これらのツールは、2000年冒頭あたりにMicrosoftのftpサイトから提供されていたものだが、現在は提供が終了しており、使用法について言及する記事もないことから、おそらく現在サポートされていない。
- Windows7上にて、このツールを利用してメモリリーク調査をしたところ、メモリリークを起こしていないにも関わらず、メモリリークを検出していた。（しないときもあった）
- Windows7からメモリの遅延解放が行われているため、Leakdiagではそれらのメモリを未開放と誤認している可能性がある（深く追う時間がなかった）。
- LeakdiagはXPまでに対応しているという未確認情報があった。（技術ＱＡサイトのコメント）
- 現在、Leakdiagと同様の機能はWindows SDKにUMDHがある。詳しくは以下の記事を参照「[HOWTO] UMDH を用いたメモリリーク調査技法」https://blogs.msdn.microsoft.com/japan_platform_sdkwindows_sdk_support_team_blog/2013/08/18/howto-umdh/
- ちなみに上記の記事は過去１回転居されて一時期見失ったので、保存は魚拓とかとっておいたほうがいいかも。

#要点じゃない
- LeakdiagがWindows7上で正しく動かないことに気づくまで、３日ほど冤罪で痛くない腹探られまくったから同じ轍を踏まないように記事化しておく。
- 「Leakdiagの結果じゃないと認めない」などとほざく元請がいるようでしたら、次善の策として、処理終了してからヒープのスナップショットを取る間に数秒間の間隔を空けるにすると、リークが０になったりします。必ずかどうかはわかりませんが。
- LeakdiagよりUMDHのほうが結果解析もはるかに楽なのでUMDH一択。
- あとVirtualAllocはUMDHでは検知できないっぽい。
- SDKにApplication Verifierというツールもあるらしいが、そちらは未検討。
- 初めての記事でした。
Terraform Cloudでディレクトリに対してworkspaceをつくる

# はじめに

Terraform CloudはStateファイルをTerraform Cloud上で管理してくれる最強のツールです。

強いところや基本的な使い方は以下の記事を参考にしてください。

* [Terraform Cloud、個人で使ってもめちゃくちゃ便利](https://qiita.com/pypypyo14/items/cc080fda91e8b5274f7a#comments)
* [5人まで無料！ Terraform Cloudを使ってみた](https://dev.classmethod.jp/cloud/aws/terraform-cloud/)

# 本題

一つのリポジトリで複数のstateを管理することがあるのですが、Terraformではそれをworkspaceという単位で分けます。

```bash:イメージ
.
└── services
    ├── common # workspace ここで一つのtfstateを管理する
    │   └── main.tf
    ├── prod # workspace ここで一つのtfstateを管理する
    │   └── main.tf
    ├── stage # workspace ここで一つのtfstateを管理する
    │   └── main.tf
    └── test # workspace ここで一つのtfstateを管理する
        └── main.tf
```

例えば、commonにはネットワーク周りの共通の構成管理を入れておき、最初に`terraform apply`しておくことで、コードを改修するたびにapplyされるのを回避することができます。

Terraform Cloudでもその設定を簡単に行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156024/b093ef17-22ef-684d-b359-d6aaec78e0de.png)

Workspaceを作る際に、リポジトリルートからのpathを**Terraform Working Directory**に指定してあげるだけです。

また、Terraform CloudはCIと連携できるのですが、そのトリガーとしてリポジトリの変更だけでなくそのpath以下の変更に絞ることもできます。（**Automatic Run Triggering**）

workspace作成後でも「Settings→General」から変更することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156024/1035f60b-232f-8898-fe54-64dd9365b9cf.png)

別のworkspaceのstateファイルからdataを取り出す際もnameを指定してあげるだけで簡単にできます。

```json
data "terraform_remote_state" "foo" {
  backend = "remote"

  config = {
    organization = "hikimochi"

    workspaces = {
      name = "hikimochi-terraform-other-workspace"
    }
  }
}
```

また、Terraform Cloud上で管理されていればbackendの指定をしなくても自動でstateファイルがそのworkspace上で保存されます。（違ってたら指摘してください）

COOLですね。

# おわりに

22日に結構頑張って書いた[やつ](https://qiita.com/mochio/items/a8bef8652dfc9d777e15)が、全然いいねつかないのでもう一本書きました。
【Mac】RubyでnattoでMeCabを使う

MeCabについての説明は公式サイトの記述を引用させて頂きます。

> MeCabは 京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース 形態素解析エンジンです。 言語, 辞書,コーパスに依存しない汎用的な設計を 基本方針としています。 パラメータの推定に Conditional Random Fields (CRF) を用 いており, ChaSenが採用している 隠れマルコフモデルに比べ性能が向上しています。また、平均的に ChaSen, Juman, KAKASIより高速に動作します。 ちなみに和布蕪(めかぶ)は, 作者の好物です。

引用：MeCab (和布蕪)とは - https://taku910.github.io/mecab/

ということで、今回の目的はRubyでMeCabを使用して形態素解析をを行うことです。
使用OSはMacです。

# MeCabインストール

MeCabのインストールにはHomebrewを使用します。
Homebrewの導入は割愛します。（参考：https://brew.sh/index_ja）


```terminal:terminal
$ brew install mecab
$ brew install mecab-ipadic
```

一つ目はMeCab本体、二つ目はMeCabで使用する辞書情報のインストールとなります。
これでMacでMeCabが使えるようになりました。

```terminal:terminal
$ mecab
(入力待ちになるので任意の文字列を入力してEnter)

例
$ mecab
おはようございます。
おはよう  感動詞,*,*,*,*,*,おはよう,オハヨウ,オハヨー
ござい　　助動詞,*,*,*,五段・ラ行特殊,連用形,ござる,ゴザイ,ゴザイ
ます　　　助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。       記号,句点,*,*,*,*,。,。,。
EOS
```

# nattoインストール

RubyでMeCabを使うためにはnatto gemを使用します。
https://github.com/buruzaemon/natto

```terminal:terminal
$ gem install natto
```

gemをインストール後、pathを設定します。

```terminal:terminal
$ export MECAB_PATH=/usr/local/Cellar/mecab/0.996/lib/libmecab.dylib
```

上記のパスが存在しない場合は、**libmecab** を部分一致で検索して正しいパスを指定してください。

# 動作確認

rubyで以下のようにファイルを作成します。

```ruby:test.rb
require 'natto'

nm = Natto::MeCab.new
puts nm.parse('ここに形態素解析したい文字列を入力してね！実行したら解析されるよ。')
```

実行するとこんな感じです。

```terminal:terminal
$ ruby test.rb
ここ     名詞,代名詞,一般,*,*,*,ここ,ココ,ココ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
形態素   名詞,一般,*,*,*,*,形態素,ケイタイソ,ケイタイソ
解析    名詞,サ変接続,*,*,*,*,解析,カイセキ,カイセキ
し      動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
たい    助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ
文字    名詞,一般,*,*,*,*,文字,モジ,モジ
列      名詞,一般,*,*,*,*,列,レツ,レツ
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
入力    名詞,サ変接続,*,*,*,*,入力,ニュウリョク,ニューリョク
し      動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て      助詞,接続助詞,*,*,*,*,て,テ,テ
ね      助詞,終助詞,*,*,*,*,ね,ネ,ネ
！       記号,一般,*,*,*,*,！,！,！
実行    名詞,サ変接続,*,*,*,*,実行,ジッコウ,ジッコー
し      動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
たら    助動詞,*,*,*,特殊・タ,仮定形,た,タラ,タラ
解析    名詞,サ変接続,*,*,*,*,解析,カイセキ,カイセキ
さ      動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れる    動詞,接尾,*,*,一段,基本形,れる,レル,レル
よ      助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
。      記号,句点,*,*,*,*,。,。,。
EOS
```

以上です。
Sourcetreeでチェリーピックをする

毎回必要になるときに限って忘れるので。

#### 環境

* macOS mojave(10.14.6)
* Sourcetree 4.0

#### シナリオ

```
master
  ├ branch1-add-file2
  ├ branch2-some (ここで作業)
```

上記のようなブランチがあったとして、
`branch2-some` 作業中に `branch1-add-file2` でコミットした file2.txt をチェリーピックしたい場合。


### 1. チェリーピックしたいコミットIDを探してコピーする

githubであれば、
対象のブランチ > コミット一覧 からチェリーピックしたい対象のコミットIDを探す等。

### 2. Sourcetree からチェリーピックしたいコミットを検索する

ワークスペース > 検索
入力フォームにコピーしてきたコミットIDをペースト
検索対象を `コミットSHA` にして検索

![スクリーンショット 2019-12-23 16.51.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168023/747b080d-0b2c-2da3-2655-141117884212.png)


### 3. チェリーピックする

右クリックして `完全な履歴表示を見る` で履歴に移動
もう一度右クリックして `チェリーピック`

* mergeした時のコミットメッセージにコミットIDを含める
* mergeが成功した直後にコミットする

![スクリーンショット 2019-12-23 16.53.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168023/15acca7a-64b5-ae96-32c9-e9e2e647f248.png)


両方チェックして `続行`
UIButtonの押下(ハイライト)時の色を設定する方法


UIButtonの押下時の色の付け方が特殊だったのでメモ。

## 方法1: UIButtonのextensionにメソッドを生やす

```swift

extension UIButton {
    
    func setHighLightedColor(color: UIColor) {
        let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
        UIGraphicsBeginImageContext(rect.size)
        if let context = UIGraphicsGetCurrentContext() {
            context.setFillColor(color.cgColor)
            context.fill(rect)
        }
        let image = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        setBackgroundImage(image, for: .highlighted)
    }
    
}
```

使う時↓


```swift

    override func viewDidLoad() {
        super.viewDidLoad()
        editButton.setHighLightedColor(color: .highLighted)
    }
```


## 方法2: カスタムクラスを作成する



```swift 

class CustomHighLightedButton: UIButton {

    // 押下(highlighted)時に統一したい色
    let hightLightedColor = UIColor(hex: 000000, alpha: 0.3)

    required init?(coder aDecoder: NSCoder) {
       super.init(coder: aDecoder)
        clipsToBounds = true
        setBackgroundImage(createImageFromUIColor(color: hightLightedColor), for: .highlighted)
    }
    
    private func createImageFromUIColor(color: UIColor) -> UIImage {
      let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
      UIGraphicsBeginImageContext(rect.size)
      if let context = UIGraphicsGetCurrentContext() {
          context.setFillColor(color.cgColor)
          context.fill(rect)
      }
      let image = UIGraphicsGetImageFromCurrentImageContext()!
      UIGraphicsEndImageContext()
      return image
    }

}
```


※ clipsToBoundsを書かないと押下時に色が変わりません

## 終わりに
細かいところですが、ボタン押下時の色も重要な項目だと思うので、これを機会に設定してみてはいかがでしょうか。

参考: https://qiita.com/akatsuki174/items/c0b8b5126b6c12f62001
gitコマンドで~/.ssh/id_rsa以外のSSHキーを使用したい

```
# ~/.ssh/id_rsa-githubをそのプロジェクトのみで使用
$ git config --local core.sshCommand "ssh -i ~/.ssh/id_rsa-github -F /dev/null"

# ~/.ssh/id_rsa-githubを全体で使用
$ git config --global core.sshCommand "ssh -i ~/.ssh/id_rsa-github -F /dev/null"
```
EKS ManagedNodegroupとEKS on Fargate

AWS re:Invent 2019で新しく発表されたたくさんのサービスの中で個人的に一番興味深く、すぐ使いたいと思ったサービスは EKS on Fargate でした。re:Inventの直前に発表されたEKS Managed Nodegroup と Fargateを併用する形で試してみました。

### まず注意点(2019.12月時点)
1. eksctl versionは1.11以上。古いバージョンではFargateが作れない。
2. Managed NodegroupはPublic Subnetに作る。Private Subnetには作れない。
3. Managed Nodegroupには以下2つのPolicyが必須。 
　　arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
　　arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
4. Managed NodegroupとFargateにデプロイする物の使い分けはKubernetesのNamespace。FargateのselectorにFargateにデプロイしたいnamespaceを書く。
5. EKS on Fargateが使えるリージョンは、現時点で米国東部 (バージニア北部)、米国東部 (オハイオ)、欧州 (アイルランド)、およびアジアパシフィック (東京) 。
6. EKS on FargateはALB/NLBが使えない。

### 作る
##### eksctl create cluster -f cluster.yaml
cluster.yamlは以下

```
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: [Cluster Name]
  region: ap-northeast-1

vpc:
  cidr: [CIDR]

managedNodeGroups:
  - name: [Nodegroup Name]
    instanceType: t3.medium
    minSize: 1
    maxSize: 3
    desiredCapacity: 1
    iam:
      attachPolicyARNs:
        - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
        - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
        - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
      withAddonPolicies:
        externalDNS: true
        certManager: true
        imageBuilder: true
        ebs: true
        fsx: true
        efs: true
        appMesh: true
        xRay: true
        autoScaler: true
        albIngress: true
        cloudWatch: true

fargateProfiles:
  - name: default
    selectors:
      - namespace: default
      - namespace: kube-system
      - namespace: demo
```

### 現時点で判明された制限事項
- EKS on FargateにClassic LBは使えない
- EKS on Fargateにデプロイ時、1分くらい時間がかかる
- Managed NodegroupにprivateNetworking: trueは使えない(Private Subnetに作れない)
- Managed NodegroupもNodegroupも、eksctlによって自動で作られたNAT GatewayのEIPは変更出来ない (追記:変更する方法はある。あとで書く。）

### 現時点のベストプラクティス
- 頻繁にアップデートがあるアプリケーションはManaged Nodegroupに作る
- defaultなnamespaceはFargateに作る。
- Classic LBを使いたい場合はManaged Nodegroupではなく普通のNodegroupを作る

### 参考
ref. [Autoscaling EKS on Fargate with custom metrics](
https://aws.amazon.com/ko/blogs/containers/autoscaling-eks-on-fargate-with-custom-metrics/)
ref. https://github.com/weaveworks/eksctl/issues/1575
ref. https://github.com/weaveworks/eksctl/issues/1576
ref. [入門 EKS on Fargate](https://qiita.com/mumoshu/items/c9dea2d82a402b4f9c31)

### 次の課題
- Managed NodegroupのithAddonPoliciesでどれが必須か調べたい。
- FargateProfilesを詳しく調べたい。