OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】ラムダ式の書き方・覚え方

# 最初に
この記事は私流のラムダ式の書き方・覚え方について簡単にまとめています。
想定している読者層は、以下の通りです。
・Python始めたけどラムダ式の書き方がよくわからない
・ラムダ式の書き方をちゃんと覚えたい
・数学かじっててf(x)という関数の表記を知っている

#ラムダ式とは
ラムダ式は**関数を簡潔に宣言するための記法**です。
例えば

```python:func.py
def func(a,b):
    return a*b
```
というコードを

```python:lambda.py
lambda a,b: a*b
```
というように記述することができます。lambda（ラムダ）を使う式だから、ラムダ式というわけですね。
また、ラムダ式を用いた記法の場合、func.pyのようにdefを用いて名前を付けるといったことをせずに関数を宣言できます。
このことから、ラムダ式によって記述される関数は**無名関数**と言われます。

#ラムダ式の書き方・覚え方
それでは、簡単な無名関数をラムダ式を用いて記述してみます。
ここでは、次のような数学界の関数を考えてみます。

```math
f(x) = 2x
```
これは見ての通りxに代入した数を二倍にして返す関数です。
ラムダ式で記述すると以下のようになります。

```python:lambda.py
lambda x: 2*x
```

このラムダ式を先ほどのf(x)を用いて書かれた関数と比較してみると、次のような関係があります。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/271991/958a3421-3ddd-4208-82a3-fdc299c39061.png)

f(x) が lambda xに、＝が：に、2xが2*xに、それぞれ対応しているのがわかります。
ラムダ式に中々馴染めないときは、このように**数学の関数f(x)を定義するつもりで**いると、すんなり頭に入ってくるのではないかと思います。

ラムダ式を書く際のフローは以下のようになります。

####➀ 関数の処理内容を定める(二倍の値を返す、型変換する、など)
####② f(x) = と書く要領で、lambda x:　と書く（変数名は適宜変えてください）
####③ 定めた処理内容に従ってコードを書く(2*x、str(x)、など)

#終わりに
いかがだったでしょうか。
私はラムダ式の記法に中々なれることができず苦労したのですが、数学が好きだったのもあってこのように少しだけ見方を変えることで一気に親しみがわきました。
ラムダ式はfilterやmapといった有名どころの関数を利用する際にかなり役に立つテクニックです。
覚え方には向き不向きがあると思います。
苦手意識のある方は、一例としてこのような考え方を試してみるといいのではないでしょうか。
C# のリフレクションを使うとどれだけ遅くなるのか


遅いと言われがちなリフレクションの処理時間を調べました。
今回は比較対象は同じ処理ではありません。似たような状況があったのでそれを想定して比較しています。
リフレクションを使う場合はあるインタフェースを実装しているクラス全てを探して実体化し処理をさせます。
リフレクションでない場合は対象のクラスをあらかじめ全て記述しておくという回避策を取ります。
この両者を比較しました。

# コード
```csharp
using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;

namespace PlayGround
{
    using MyReflection;

    class Program
    {
        static void Main(string[] args)
        {
            var sw = new Stopwatch();
            var N = 1;


            sw.Restart();
            // Reflection
            for (var i = 0; i < N; i++)
            {
                var str = "";
                // MyReflection名前空間のNameGettableを実装しているクラスすべてを取る
                var instances = from type in Assembly.GetExecutingAssembly().GetTypes()
                                where type.Namespace == nameof(MyReflection) && type.IsClass && type.GetInterfaces().Contains(typeof(NameGettable))
                                select Activator.CreateInstance(type) as NameGettable;
                foreach (var instance in instances)
                {
                    str = instance.Name; // なにかさせる
                }
            }
            Console.WriteLine(sw.Elapsed);

            sw.Restart();
            // not Reflection
            for (var i = 0; i < N; i++)
            {
                var str = "";
                var instances = new NameGettable[] { new HogeA(), new HogeB() };
                foreach (var instance in instances)
                {
                    str = instance.Name; // なにかさせる
                }
            }
            Console.WriteLine(sw.Elapsed);

            Console.Read();
        }
    }
}

namespace MyReflection
{
    interface NameGettable
    {
        string Name { get; }
    }

    class HogeA : NameGettable
    {
        public string Name { get { return nameof(HogeA); } }
    }

    class HogeB : NameGettable
    {
        public string Name { get { return nameof(HogeB); } }
    }
}
```

# 結果

```
// N=1
00:00:00.0010076
00:00:00.0000184

// N=1000000
00:00:03.1758372
00:00:00.0479427
```

リフレクションは100万回回して3.1s、かたやリフレクションじゃない方はミリ秒台にも乗らず。
一回しか使わないならいいですが、ループになる場所で使うには気をつけたいです。
言っても秒のオーダーなのでそこまで処理速度がシビアでない場合は全然許容できます。
JKはSwiftで配列からランダムに要素を抽出したい

#今回作りたいもの
名前の入った配列からランダムに一つ要素を抽出して表示します。
元はといえば配列に友達の名前を入れて罰ゲームルーレットを作るつもりでちょっと不満があったので一応書いておく。

#コード


```swift:ViewContoller.swift
nameLabel.text = nameArray[Int(arc4random()) % nameArray.count]
```

UILabelに名前の入った配列から一つランダムに代入するだけです。

#補足

最初は
`arc4random() % nameArray.count`
だけで済むと思ったんですけど

`Binary operator '%' cannot be applied to operands of type 'UInt32' and 'Int'`

とかなんとか出てきた。

型が違うから`%`使えねえぞと

ということ。

なんで知らないけどこいつの戻り値はUint32で返ってくるらしい。
この別にただIntで囲めばいいんだけどなんとなーくめんどくさい。

GameplayKit内の`nextInt()`というものがあると聞いたけどちょっとよくわかんなかったので暫定的にこんな感じで。

いい感じに一発で出せるような方法あれば教えてください。
SourcetreeでBacklogのGit接続エラー

BacklogのGitを使用しているのですが、ある日とつぜんSourcetreeで接続できなくなってしまいました。

### 環境（2018年7月19日現在）
- OS: Mac OS 10.11.6 (El Capitan)
- Sourcetree: Version 2.6.3 (134)
    - Embedded Git 2.10.1
    - 内蔵 git-lfs 2.0.2
    - Bitbucket Media Adapter 1.0.6
    - 内蔵 git-flow
    - Embedded Mercurial 3.7.3.1
    - ↑はSourcetreeメニューから「About Sourcetree」を見たときの情報
- HTTPS で Git に接続（Backlog使用）

### エラー内容
```
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree fetch origin 
remote: Authorization required
fatal: Authentication failed for 'https://バックログのURL/www.git/'
remote: Authorization required
fatal: Authentication failed for 'https://バックログのURL/www.git/'
remote: Authorization required
fatal: Authentication failed for 'https://バックログのURL/www.git/'
remote: Authorization required
fatal: Authentication failed for 'https://バックログのURL/www.git/'
Completed with errors, see above
```

エラーを読み解いてみると、

　Authorization → 認証、権限
　required → 必須、必要
　fatal → 重大な、致命的な
　failed → 失敗、不成功

要するに「認証が必要だよ！」「でもバックログの認証エラーだよ！」て言われてる気がする。
ソースツリーもバックログも設定変更した記憶などないのですが、さてはて。

### 対策 1 : Sourcetreeのアップデート
Sourcetreeメニューの「アップデートを確認...」（アプデ前は英語表記だった気がするけど）より実施。
その結果、環境が以下のように変化する。

- Sourcetree: Version 2.6.3 (134) → 2.7.6 (177)
    - Embedded Git 2.10.1 → 2.17.1
    - 内蔵 git-lfs 2.0.2 → 2.4.2
    - Bitbucket Media Adapter 1.0.6 → 変化なし
    - 内蔵 git-flow → 変化なし
    - Embedded Mercurial 3.7.3.1 → 4.6.1

Sourcetree再起動するも、エラー直らず。念のためPCも再起動するが、直らず。

### 対策 2 : Gitのバージョンアップ
自分の環境でこれが必要かは謎ですが、以下を参考にしました。
[MacのHomeBrewでGitを2.7.0にアップデートしよう](https://qiita.com/suzutan/items/44bcf20df711675c525c)

なんならこの記事そのものは以下を参考に（略
[SourceTreeで remote invalid username or password となってGithubと接続できない時の対策](https://qiita.com/YKEI_mrn/items/13be547b79dcb3de71b7)

過去にいろいろあって [HomeBrew](https://brew.sh/index_ja.html#install) をインストールしていたので、
`/usr/bin/git --version` でGitのバージョンを確認すると `git version 2.10.1 (Apple Git-78)` でした。
`brew update` でHomeBrewをアップデート。
`brew upgrade git` でGitのバージョンアップ。`git version 2.18.0` でした。

Sourcetreeメニューの「環境設定...」から「Git」 > 「システムのGitを使用する」 で最新のGitを探して選択。（自分の場合はなんか /usr/local/bin/git に入っちゃってたっぽい。）
　　　↓
念のためSourcetree再起動するも、エラー　な　お　ら　ず。

やっぱりシステムのGitではなく内蔵Gitに戻してから、次の対策へ。

### 対策 3 : SourcetreeのBacklog連携見直し
過去に一度、バックログのパスワードを間違った内容でSourcetreeに入力してしまい、そのときは設定ファイル消してもSourcetreeアンインストール後の再インストールしてもどうやっても誤ったパスワードが記憶されて困ったので、アカウント周りは本当になるべく触りたくないのですが・・・そのときはテスト用の捨てバックログだったので全部諦めて、本番用バックログとの連携時ものすごく慎重にパスワード入力したら上手くいった苦い思い出があります。

というわけで震えながら、
Sourcetreeメニューの「環境設定...」 > 「高度な設定」 からバックログのホスト名・ユーザ名を削除。
その後Sourcetree再起動するといきなりバックログのユーザ名とパスワード求められたので、慎重に入力。
適当なリポジトリからプルしようとすると・・・直った！！！！！

### 結論
`fatal: Authentication failed for 'https://バックログのURL/www.git/'` のエラーにはバックログのユーザ名・パスワードを再設定すること。

「バックログの周りが怪しいよ」ってエラー出てるんだし最初に見直せば良かったのですが、ユーザ名もパスワードもずっと変えてないのになぁという釈然としない気持ちも。
以前バックログ連携失敗したときの苦い思い出も腰を重くさせましたが、恐怖を感じる対象にこそ自分から近づいていくべきですね。
なんか無駄に遠回りはしたけど、勉強になったから良し。

（2018/7/23 追記）
似たようなエラーで別な対処法を行っている方のメモ
http://desilysis.seesaa.net/article/454257588.html
unityで作ったゲームをswiftでiOSにうつしたとき画面が真っ青でなにも始まらない

タイトルの状態が起こった。

調べてもなにも出てこなかった



色々見てたら、unityでiOS用にビルドするときにシーンを選択していて、自分はsampleシーンを選んでビルドしていた


これを自分がつくったシーンに選択し直すと無事実機の方でもゲームが実行できた
激遅なLinux仮想マシンを改善する

一部のホストマシン上でVirtualBox等でLinux仮想マシンを動かすと、仮想マシン上のあらゆる処理が説明がつかないくらいに重い場合があります。その場合に仮想マシンに対して本記事にある設定をして高速化を図ることをお勧めします。特にHDDを搭載しているホストマシン上の仮想マシンが異様に遅いと悩んでいる方は、この記事に記載しているIOスケジューラの変更をすることにより劇的に改善する可能性があります。

主にVirtualBoxを前提に記載していますが、VMWare等の他のハイパーバイザにも適用できます。

> NOTE: ちなみにホストマシン自体が絶望的に遅い環境の場合は、改善する望みはほとんどないため期待しないほうが良いでしょう。

## CPUコア数、メモリを増やす

VirtualBoxでは仮想マシン毎にCPUコア数とメモリサイズを設定可能です。ホスト側のリソースに余裕がある場合は多めに割り当てましょう。

仮想マシンでIntelliJやEclipseを使ったり、ブラウザでタブをたくさん開いたり、Dockerコンテナを並列に動かしたりしているのにCPUコア1個、メモリ512MBとかでは遅いのは当たり前です。

## VirtualBox Guest Additionsを導入する

VirtualBox Guest Additionsを仮想マシンにインストールすることで、3Dアクセラレーション等が有効になります。特にGUI環境の描画がもたついている場合は必ずインストールして、仮想マシンのビデオメモリを最大(128MB)に設定しましょう。

## (重要) IOスケジューラをcfq以外にする

おそらく一般的なLinuxディストリビューションのデフォルトIOスケジューラはcfqになっています。Linux仮想マシンも同様のため、LinuxのIOスケジューラをcfqからnoop/deadlineに変更しましょう。設定方法は下記URLが参考になります。

[SSDにしたのでI/Oスケジューラを noop に変更してみた](http://d.hatena.ne.jp/yohei-a/20131005/1380980124)

下記URLに理由が記載されているので割愛しますが、要するに**ホスト側やハイパーバイザでもIOスケジューリングが行われるため、仮想マシン上でcfqのような複雑なIOスケジューリングは無駄です。**

[What is the suggested I/O scheduler to improve disk performance when using Red Hat Enterprise Linux with virtualization?](https://access.redhat.com/solutions/5427)

特に以下の条件や症状に該当する人は、何よりもIOスケジューラを変更することをお勧めします。

- ホストマシンがSSDではなくHDDを搭載している
- 仮想マシンのOS起動が異様に遅い (3分～5分以上)
- 他に何もしてないのに仮想マシンOS上のパッケージインストール(ex. apt install)、コンパイル、Dockerコンテナ操作等が異様に遅い
- topコマンドのCPU使用率でwaitが異様に高い (30%～50%以上)

ちなみに仮想マシンでなくても、SSD/ハードウェアRAID環境ではcfq以外のIOスケジューラにすることがお勧めです。下記URLにある通り、環境次第ではIO周りの性能が劇的に改善します。一部海外サイトのベンチマークでは差がないというデータも出ていますが、個人的な経験でも実運用上は明らかにIO性能に大きな改善がみられることが多いです。

[Noop I/O scheduling with SSD storage](https://www.anchor.com.au/blog/2012/09/noop-io-scheduling-with-ssd-storage/)

## ファイルシステムをチューニングする

ext4の場合、以下のファイルシステムオプションを付与することでIO周りのパフォーマンスが劇的に改善する場合があります。

- data=writeback (ただし事前にtune2fsコマンドで有効化が必須)
- barrier=0
- nobh
- noatime

ただし開発用途の仮想マシンでDBサーバー並みの高負荷IO処理が必要なことはあまりないでしょうし、ファイルシステム周りのチューニングによって意図しないマシン電源断などの時にデータが壊れやすくなるというトレードオフもあります。このためIO性能を絞りだしたい場合以外は積極的にはお勧めしません。

興味がある人はGoogle等で`ext4`と上記キーワードを一緒に検索すれば、設定例を掲載しているページを見つけることができます。
Go WSLのUbuntuにGoをインストールする

- WSLのUbuntuにGoをインストールする
  - Ubuntu 16.04.4 LTS
  - Go 1.10

# 手順

- [go/wiki/Ubuntu](https://github.com/golang/go/wiki/Ubuntu)通りでOK

- 以下だと`1.6`がインストールされる

    ```bash
    $ sudo apt-get install golang-go
    ```

- 以下を実行する

    ```bash
    $ sudo add-apt-repository ppa:gophers/archive
    $ sudo apt-get update
    $ sudo apt-get install golang-1.10-go
    ```
- 環境変数・PATH
  - ファイルに追記

    ```bash:.zprofile
    export GOPATH=$HOME/go
    export PATH=$PATH:/usr/lib/go-1.10/bin
    export PATH=$PATH:$GOPATH/bin
    ```

  - シェル再ログイン

    ```bash
    $ exec $SHELL -l
    ```
 
- 確認

    ```bash
    $ go version
    $ go env
    ```

# 動作確認

- [Test your installation](https://golang.org/doc/install#testing)を実施する

- フォルダの作成 (仮でWindowsのデスクトップに作る)

    ```bash
    $ cd /mnt/c/Users/hoge/Desktop
    $ mkdir go-test
    $ cd go-test
    $ vim hello.go
    ```

- ソース

    ```go:hello.go
    package main

    import "fmt"

    func main() {
	    fmt.Printf("hello, world\n")
    }
   ```

- ビルド & 実行

    ```bash
    $ go build hello.go
    $ ./hello
    ```


# 参考

* [go/wiki/Ubuntu](https://github.com/golang/go/wiki/Ubuntu)
* [Test your installation](https://golang.org/doc/install#testing)
* [Linuxディレクトリとwindowsディレクトリの場所関係](https://qiita.com/aegis_m/items/1bf07d4e84f5d6af3c8c#linux%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%A8windows%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E5%A0%B4%E6%89%80%E9%96%A2%E4%BF%82)
iTerm2+fish shell環境のTips

iterm2+fish shellの僕の環境のtipsなど

# key bind
|Key  | 動作 
|:--|--:|
cmd+shift+h  | クリップボード履歴
cmd+d  | ペイン分割 
cmd+shift+d  |  ペイン縦分割
cmd+[/]  | 次/前のペインに移動 
cmd+l  | clearと一緒で画面のクリア  
##Tips
 カーソルで選択してクリックするだけでクリップボードにコピーされているので便利

# config
`~/.config/fish/config.fish`にある

## 右の日付や時間を非表示にする(fish)
[参考](https://wiki.inamuu.com/?fish%E3%81%AE%E3%83%86%E3%83%BC%E3%83%9E%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA)

```sh:~/.config/fish/config.fish
set -U theme_display_date no 
set -U theme_display_cmd_duration no
```

## 作業ログを取る(iTerm2)
[参考](https://soarcode.jp/posts/230)
- 設定ファイルを開く<br>
[profile]->[Open Profiles..]->[Edit Profiles..]
- 上の行から[Session]を選択し，下の[Automatically log session input to files in:]をチェック
- 下のボックスにlogを出力するディレクトリパスを入力【左に！が出ているときはそのディレクトリに権限がない】
- 再起動して完了

テキストエディタなどで表示すると制御文が混在しているので，`cat`などで開くと良い

## aliasについて
fishでは`alias`が効かないという話があるが，config.fishに書くと使える．

```sh:~/.config/fish/config.fish
alias la='ls -la'
alias ..='cd ..'
```
などを追加しておくと便利
asp.net > swagger


## 環境
VS：VisualStudio2017
フレームワーク: .Net Framework 4.6

## Swaggerをインストール

「ツール」→「NuGetパッケージマネージャー」→「NuGetパッケージの管理」

検索にSwashbuckle

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/205bf213-c1c2-d137-250f-6bc23671fd90.png)



## 実行

F5で実行する。

URLの後ろに「/swagger」を付けてアクセスする。
例）
`http://localhost:60437/swagger/ui/index#/Values`

以下のような画面が表示されれば成功

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/2a44b199-5a39-6d90-ecea-05fd712bf4af.png)


## XMLコメントを表示する

以下のファイルを編集
App_Start > SwaggerConfig.cs

以下の文のコメントを外す
```
c.IncludeXmlComments(GetXmlCommentsPath());
```


SwaggerConfig.csの最後尾くらいに以下のメソッドを追加

```
private static string GetXmlCommentsPath()
{
        return string.Format(@"{0}\bin\SwaggerDemo.XML", System.AppDomain.CurrentDomain.BaseDirectory);
}
```

XMLの名称はアセンブリ名と一致させる。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/dcf92055-b1db-c6b8-b838-88dcb75722c8.png)

この例では以下になる。

` return string.Format(@"{0}\bin\SwaggerDemo.XML", System.AppDomain.CurrentDomain.BaseDirectory);`
 

### XMLコメント

以下のような容量でXMLコメントを付ける
```
        /// <summary>
        /// valuesをゲット
        /// </summary>
        /// <returns></returns>
        // GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
```



### 実行

XMLコメントが表示される。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/5389f9a1-8af1-38b4-df01-fc5f202f1851.png)


## Swaggerの見た目変更

以下のファイルを編集
App_Start > SwaggerConfig.cs

以下の行を外し、containingAssemblyをthisAssemblyに変更する。
（thisAssemblyは SwaggerConfig.csの先頭らへんで定義されている）


```
c.CustomAsset("index", thisAssembly, "NameSpace.SwaggerExtensions.index.html");
```

NameSpaceには以下プロジェクト・プロパティで表示される規定の名前空間に表示されている名前を設定する。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/37cf0942-08fb-8bc3-2694-8659057dd374.png)

この例では以下になる。

```
c.CustomAsset("index", thisAssembly, "ECommerceName.SwaggerExtensions.index.html");
```




### Index.htmlの配置

SwaggerExtensionsフォルダを作成し、index.htmlファイルを作成する。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/958336b1-78dc-fd65-40cf-69d4c9ad7f88.png)


index.htmlファイルは以下をベースにする。
[Swashbuckle/index.html at v5.5.3 · domaindrivendev/Swashbuckle](https://github.com/domaindrivendev/Swashbuckle/blob/v5.5.3/Swashbuckle.Core/SwaggerUi/CustomAssets/index.html)


#### ビルドアクション
index.htmlのプロパティにて、ビルドアクションを埋め込みリソースに変更する
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/16e77b54-2a86-0ec9-b950-90ec7e8a7996.png)





## 参考
[c# - swagger-ui returns 500 after deployment - Stack Overflow](https://stackoverflow.com/questions/33914842/swagger-ui-returns-500-after-deployment)


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/98b282d6-0060-40ed-a83d-129f3eddf53a.png)


[How to customize Swagger UI in ASP.NET Web API – Umamaheswaran](https://umamaheswaran.com/2017/09/18/how-to-customize-swagger-ui-in-asp-net-web-api/)



[ASP.NET Web API2.2で、Swagger(Swashbuckle 5.1.5)を使う - BEACHSIDE BLOG](https://beachside.hatenablog.com/entry/2015/05/31/202348)
kubectlをもう少し楽に使う

# 概要

`kubectl`コマンド打ち疲れる問題へのフォローと、
開発、本番環境などの環境ごとにkubernetesクラスタを使い分けるときの`kubectl config`関連のうまい使い方の例を紹介します。他にもkubectlのエイリアスを使ったり`kube-shell`のようなものを使ったりいろいろな方法がありますので、自分の好みにあったものを見つけると良いと思います。

# TL;DR;

1. Tabキーで補完してくれるAutocomplete使いましょう
2. 接続先やロールの変更が頻繁な場合は`.kubeconfig`ごと切り替えるのに、direnvで変更する方法
3. Podのログを見るのにsternを使う

# 改善したいこと・解決したい課題

先に挙げた３つのことをもう少し具体的に説明します。

## 1.タイプ数を減らすためにAutocompleteを使う

基本的な内容ですが補完を有効にする方法があります。
`get`程度なら苦にもならないですが、`describe`とか打ちにくいほうだったりで`des`+ `Tabキー`で`describe`までを補完してくれます。
エイリアスを使うほうがもっと楽だと思いますが、僕は人に教えたり話したりするときに手が覚えているものと通常のコマンドとに違いがあるのが嫌な人なので、略していないほうで記憶するのが好みです。（通じない言い方して「あーー！」ってなるし）

kubernetesを触りはじめであればk8sリソース名がすぐに出てこなかったりするので、`kubectl get` + `Tabキー`で一覧が表示されすぐにわかって便利です。
また、存在するnamespace名やdeploy名、pod名などを直接してすることがあると思いますが、こちらも補完してくれるのでかなり便利なものになっております。
つまり、具体的には`kubectl get deploy -n kube-s` + `Tabキー`で kube-systemに補完してくれますよ。

```
# zshの場合
$ source <(kubectl completion zsh)  # setup autocomplete in zsh
```

この内容は[kubectl Cheat Sheet](https://kubernetes.io/docs/reference/kubectl/cheatsheet/)に記載がありますが、このページ他にも有用な情報があるので一読しておくと良いかもしれません。
特にverbosityを指定して実行してみるとk8s apiserverへのrequest内容やらAPIリソースなどが具体的に見えるので、エラーになったときのデバッグ以外にもk8sを理解するのにとても役立ちます。

## 2. 環境の切り替えを簡単にするためにdirenvを使う

補完してくれるからといっても`kubectl config use-context [env]`で切り替える癖がまだついてないのと、k8sクラスタを作って壊してを何度もやるしクラスタ自体いくつか切り替えることがあるので、`.kubeconfig`の命名規則をしっかり考えるよりは、クラスタごとに`.kubeconfig`を分けるという選択しました。
`kubectl plugin`を使う賢い選択肢もありますが`kubectl plugin`の仕様が安定してからやるか、ディレクトリごとにクラスタ依存のファイルも置いておけますし、そもそも自分は賢くないのでシンプルにやろうという選択です。

具体的な方法は`direnv`を使う方法で、`.envrc`の内容はそのディレクトリにある`.kubeconfig`を環境変数`KUBECONFIG`にロードするという内容だけ。（direnvのインストール方法、詳しい使い方は公式などを参照してください。）
`.envrc`は下のようになります。

```
# .envrc
export KUBECONFIG=$(pwd)/.kubeconfig
```

単純に接続するだけであればこれくらいでよいと思いますが、
`.kubeconfig`の内容をどのように設定しておくか？のほうがdefautl namespaceを切り替えたり、アカウントを切り替えたりする場合はもう少し工夫のしようがありそうです。


# 3. podごとにログを見るのが辛いのでsternを使う

kubectlの話じゃないのですが、`kubectl logs [pod_id]`を使ってログを見るよりも　`stern`を使うほうがめちゃくちゃ簡単なのでご紹介します。

インストール方法は公式を参照してください。 [github.com wercker/stern](https://github.com/wercker/stern)

`kubectl logs`コマンドだとpodのIDを知る必要があり、`kubectl get pod`して`kubectl logs`を打つ必要がありますが、予めdeploy名を知っていれば`stern [deploy_name]`で参照できます。また複数Podで動作していても勝手にQuery条件に合うものを引っ張って表示してくれるので便利。

同じようにこちらもAutocompleteが効くので設定しておきましょう。

```
# zshの場合
source <(stern --completion=zsh)
```

# まとめ

どんどん開発が進んでいるのでここの情報を鵜呑みにせず、自分にあったものを見つけてください。
そもそもQiitaを書くときはautocomplete効くわけないのでkubectlが辛かったです。
シャローコピーに使えるメソッド

配列をコピーする方法に

・ディープコピー
・シャローコピー

の２つある。
今回はシャローコピーについて

> シャローコピーというのは、コピー元のオブジェクトとコピー先のオブジェクトがメモリ上の同じデータ(インスタンス変数)を参照しています。

#配列をコピーする方法

- sliceメソッド
- concatメソッド
- Array.fromメソッド

```javascript:javascript
// 元の配列も更新されてしまう例
const manga = ['スラムダンク', 'ドラゴンボール', 'ジョジョ'];
const copy = manga;
copy[0] = "ワンピース";
console.log(manga); //["ワンピース", "ドラゴンボール", "ジョジョ"]
console.log(copy); //["ワンピース", "ドラゴンボール", "ジョジョ"]
```

sliceメソッドを使った例

```javascript:javascript
// 
const manga = ['スラムダンク', 'ドラゴンボール', 'ジョジョ'];
const cp = manga.slice();
cp[0] = "ワンピース";
console.log(manga); // ["スラムダンク", "ドラゴンボール", "ジョジョ"]
console.log(cp); // ["ワンピース", "ドラゴンボール", "ジョジョ"]
```

concatメソッド、Array.fromについては後ほど追記します。
Laravelのコントローラー、モデル、ビューのディレクトリとファイル構成案

Laravelの個人的な構成案をまとめました。
どのようにしようか悩んでいる方に参考になればいいです。
バージョンは5.6を使用しています。

<pre>
app
├Http
│    └Controllers
│        ├Admin 管理画面コントローラーを作成する。
│        │   └AdminController.php BaseControllerをextendsで継承して管理画面の親コントローラーを作成する。管理画面のコントローラーはこれを継承して作成する。
│        └Main フロント画面コントローラーを作成する。
│            └MainController.php BaseControllerをextendsで継承してフロント画面の親コントローラーを作成する。フロント画面のコントローラーはこれを継承して作成する。
├Models 公式ドキュメントにモデルは開発者が適宜作成なのでここに作成する。
│       コマンド例：php artisan make:model Model/作成するモデルクラス名
└Libraries 汎用的に使用する独自クラスをライブラリとして作成する。
      ├CommonUtility.php 共通で使用する共通ユーティリティークラス。
      ├CookieUtility.php クッキーのキー名の定義や専用処理のクッキーユーティリティークラス。
      ├SessionUtility.php セッションのキー名の定義や専用処理のセッションユーティリティークラス。
      ├JsonUtility.php JSON専用処理のJSONユーティリティークラス。
      ├FlgUtility.php DBや処理で使用するフラグを定義するフラグユーティリティークラス。
      ├ImageUtility.php 画像専用処理の画像ユーティリティークラス。
      └CryptoUtility.php 暗号専用処理の暗号ユーティリティークラス。

resources
└views
    ├admin 管理画面のビューを作成する。
    │    └common 共通で使用するテンプレートを作成する。
    │         ├config.blade.php 共通で使用するfooter、header、js、layout、navのincludeや設定を行うコンフィグテンプレート。
    │         ├footer.blade.php フッターテンプレート。
    │         ├header.blade.php ヘッダーテンプレート。
    │         ├js.blade.php JavaScriptプログラムテンプレート。
    │         ├layout.blade.php footer、header、js、layout、navを統合するレイアウトテンプレート
    │         └nav.blade.php メニューなどのナビゲーションテンプレート。
    └main フロント画面のビューを作成する。
         └common 共通で使用するテンプレートを作成する。
              ├config.blade.php 共通で使用するfooter、header、js、layout、navのincludeや設定を行うコンフィグテンプレート。
              ├footer.blade.php フッターテンプレート。
              ├header.blade.php ヘッダーテンプレート。
              ├js.blade.php JavaScriptプログラムテンプレート。
              ├layout.blade.php footer、header、js、layout、navを統合するレイアウトテンプレート
              └nav.blade.php メニューなどのナビゲーションテンプレート。
</pre>
【勉強会】第17回ステアラボ人工知能セミナーレポート

忙しくて書ききれず気づいたらほぼ一ヶ月ですが上げて行きますよ〜、初投稿です。
6/28に開催された第17回ステアラボ人工知能セミナーに行ってきました
https://stair.connpass.com/event/88170/
今回の講演者は、ステアラボの主任研究員である吉川友也さんで
講演タイトルは「画像キャプションと動作認識の最前線 〜データセットに注目して〜」でした。
画像・動画に対してキャプション（説明文）を入れるモデルの紹介や、
機械学習では避けては通れないデータセットの作成の四方山話がメインになっています。

レジェメは以下の通り
https://drive.google.com/file/d/1-bQImMyGds3ZFPKkdwQuLpC8w8Usscbn/view

以下のメモはレジェメの補助程度の内容となります。

## 前半:画像キャプションのデータセット紹介
### 様々なモデルやデータセット
基本的に画像キャプションを行うモデルはNIC[Vinyals+ 2015]の
ように

```NIC
  cnnエンコード -> dence -> LSTMデコード
```

の流れでシーケンシャルに組まれたモデルが一般的である
モデルの表現力の精度はどちらかというとデータセットの構成が肝

### 各種データセットの特徴
特徴的だったもののメモ

- 30k entities
キャプション中の名詞句と画像中の範囲の紐付けができている
物体検出の要素も含んでおり物体の位置関係もキャプションする際の特徴とすることができる。
- visual Genome
リージョングラフでオブジェクト間の関係性を見る
単語同士の紐付けは非常に大事
- 一つの画像に対するキャプションの数が5個など複数である理由
複数キャプションをつける理由は人によって感じ方・表現が異なる場合があるため

### データセットの作成
クラウドソーシングする場合はガイドラインの策定が大事
それでもぼちぼちガイドラインに沿わないアノテーションがついたりする

Q. データ収集の際に怒られないようにするためには
A. クリエイティブコモンズ
　　元の画像Flickerなどクリアじゃない
　　やはり自分たちで集めた方が権利関係はクリア

### stair captions
http://captions.stair.center
日本語用！
2100人クラウドワーカー・バイトで半年間で完成
英語でキャプションをつけてから機械翻訳して和訳よりも
やっぱり日本語そのままのキャプションの方が精度が良いらしい

----------------
## 後半:動画の人物動作認識のデータセット紹介

### 動作に対してキャプションを付ける
動画が入力
ocrのようにやはりタスクの分割が重要
(動作をしている対象の検出・動作をしている時間のレンジ・動作の内容)

### データセットを使う上で
- 利用規約の確認
activity net はリサーチ目的ならok youtube は未確認
企業が作ったデーター＞営利目的で10万とか

- 精度を上げるには
youtube からとる場合様々な動画からとった方がいいため一つの動画につき１クリップなどの制約があった方がいい
AVA　精度の上げ方
流行りのデータセットの中身を深く考察されずに使われている傾向があったりする
検証大事

### データセットを作る上で
#### STAIR Actions
https://stair-lab-cit.github.io/STAIR-actions-web/
二年以上かけて作ってる

- 家庭内の動作に限定した理由
家庭用ロボットが増える将来に対して実装するため

- wikitionaryを使って動作ラベルを選定
-> ただこの辞書も丸呑みすべきではない可能がある
（台所:手を洗う->野菜を洗う可能性もあるのではないか）

- 「stair lab」 と書かれた紙を動画中に入れてもらう
すでにアップロードされたyoutubeの動画などを流用できないようにするため

- 一人のワーカーだけのアノテーションだと信用できない
複数人にキャプションつけてもらい、和集合で集約後、別のワーカーに最もらしいキャプションを選択する検証作業でカバー

- ワーカーひとり単位の信頼度
やはり穴は見つかる
のでactionsを作成時には検品作業を挟んだ
上の検証含め、画像のキャプションでも必要であると思われる

Q&A
Q.action => 誰が、は入ってない
A.フレーム単位で判定できるので、他の画像認識器で補う。

Q.データセットがよければ前処理いらない？
A.ペーパーを作るときと実用化するときでは、汎化性能の高さと提案手法の数値の高さとで目指す方向が異なる
そういう意味では目的にあった前処理がいる

### 今後の方向性
画像関連の問題（フレーム単位で判別できる問題）はあらかた解かれた感じがする
これからは動画の流れになりそう？

_____
[おまけ](https://qiita.com/crimson_peacock/items/e97365cde64d1fefc42a)に続く
webpack.config.js 最小設定

巷で webpack 難しいという声が大きいですが、個人的に初期設定でハマるものではないと思っていて(複雑なローダーを複雑に使うとハマる)、勘所掴めるような小さい例を紹介します。

## bundle only

`src/index.js => public/bundle.js` にコンパイルするだけ。babel を使わない。

```bash
npm install webpack webpack-cli --save-dev
```

```js:webpack.config.js
module.exports = {
  mode: process.env.NODE_ENV || "development",
  entry: ["./src/index.js"],
  output: {
    filename: "bundle.js",
    path: __dirname + "/public"
  }
};
```

```
## build for dev
npm run webpack

## watch for dev
npm run webpack -w

## build for prod
NODE_ENV=production npm run webpack
```

`-w` はなかなか便利で、ファイルに変更があるたびに自動ビルドします。依存ファイルの依存グラフを構成しつつオンメモリに持ってるので、再ビルドが高速です。どれぐらい高速化というと 8秒が0.2秒になったりします。

## bundle with babel

```
npm install webpack webpack-cli webpack-serve --save-dev
npm install babel-loader@^8.0.0-beta @babel/core @babel/preset-env --save-dev
echo '{ "presets": ["@babel/preset-env"] }' > .babelrc
```

```js:webpack.config.js
module.exports = {
  mode: process.env.NODE_ENV || "development",
  entry: ["./src/index.js"],
  output: {
    filename: "bundle.js",
    path: __dirname + "/public"
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: "babel-loader",
        exclude: /node_modules/
      }
    ]
  }
};
```

コマンドは同じなので略

## with html serve

webpack-serve と html-webpack-plugin を使って、 bundle した js を読み込む index.html を生成しつつ localhost にサーバーを立てます。

注意点として webpack-serve は `--watch` と同様にサーバー内のインメモリにビルドしたファイルを構成し、それを返却するのでファイルIOがなく速いのですが、public 以下にファイルを出力しません。

```
yarn add webpack webpack-cli webpack-serve html-webpack-plugin -D
yarn add babel-loader@^8.0.0-beta @babel/core @babel/preset-env -D
echo '{ "presets": ["@babel/preset-env"] }' > .babelrc
```

```js:webpack.config.js
const HtmlPlugin = require("html-webpack-plugin");
module.exports = {
  mode: process.env.NODE_ENV || "development",
  entry: ["./src/index.js"],
  output: {
    filename: "bundle.js",
    path: __dirname + "/public"
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: "babel-loader",
        exclude: /node_modules/
      }
    ]
  },
  plugins: [new HtmlPlugin()]
};
```

```
npm run webpack-serve --port 4000
```

デプロイする際は同様に `npm run webpack` して生成物を配布します。

任意な html を初期状態にしたい場合は `new HtmlPlugin({ template: 'src/index.html'})` のように自分で指定した HTML を指定します。

これがいわゆるSPAのスタートラインです。

## 未来へ向けて

最近のフロントエンドでwebpackの乱用がすぎるのはそうだと思っていて、とはいえ利用者がアレもコレもやろうとして、勝手にハマってるだけなところが大きいと思います。 

例えば代表的なのが css-modules をやろうとすると複数の loader を複雑に使って実現していて、webpack 2系から 3系に上げられなくて爆死、という例が多いですね。単体で難しいわけじゃないですが、loader 組み合わせで爆発するのもwebpackの特徴です。

webpack はES Modules が最適化される前の必要悪であって、IEが死んだ未来の時点でサッと webpack を抜いてもそのまま動くようなコードが理想です。なので require 使わず ESM の import/export だけ使うみたいな感じにがたぶん痛くない設計です。

とはいえ ES Modules の静的解析を行って読み込みを最適化するのが実装されるのはだいぶ先の未来だと思われます。たとえば nginx が JS の依存の静的解析が行ってhttp/2のストリームに最適にパケットを詰める、みたいな未来がこなくてはなりません。アセットサーバーが依存解析して先読みのグラフを作る仕様が必要です。

少なくても現時点から5年先ぐらいは 一つのファイルに bundle するのが最適解だと思われます。もしかしたら10年さきもやってるかもしれません。ないといいですね。
[SQLite3] 列の値を一括変換する

とある初心者の備忘録です。

ある列の値を一括で置き換えたい場合のクエリ。UPDATE時に `SET col = value` のvalueの部分を動的に持ってきたいケースです。

例えば、usersテーブルに部署(dept)を名前でベタ書きしてしまっているテーブルについて（そんな初歩的な設計ミスをするなよ、という話は棚上げします・・・）。

後から部署テーブル(departments)の定義を行ったので、usersテーブルにあるdept列は全てIDで置き換えたい、というケースです。
`SET` の中にサブクエリを書けるので、この要件を満たすクエリは以下の1本で書くことが可能です。

```SQL
UPDATE
    users
SET    users.dept    =    (
        SELECT
            departments.id
        FROM
            departments
        WHERE
            users.dept    =    users.dept
    )
;
```

SQL勉強中なので、ネタができたら随時書き足していく予定。
zcashd で ZCash マイニングの税計算を行う

今までは Insight や ethscan などの web サービスを使って仮想通貨の税計算を行うのにチャレンジしましたが,

BitZeny のマイニングの集計を行う
https://qiita.com/syoyo/items/5a00688f7f6bcf83aa2f

ZCash プールマイニングで得られた報酬履歴を zchain でスキャンし課税計算に使う(進捗 95%)
https://qiita.com/syoyo/items/07e6f6360eaf6db94e17

最近では ZCash の取りあつかいは日本では風当たりが強いため, zcashd を立てるようにして ZCash はローカルウォレット管理するようにしました.

ローカルウォレットですと, `zcash-cli` や JSON API で取引履歴を簡単に追うことができるので, マイニングの税計算も楽になることがわかりました.
(マイニングしたものをすぐにウォレットに移動すると仮定)

## トランザクションをリストアップする.

`listtransactions` を使います.

http://chainquery.com/bitcoin-api/listtransactions

デフォルトでは(直近の?) 10 トランザクションしか取得しないので, トランザクション数に応じて count, skip を調整しましょう.

以下のような感じで JSON が取れます.

```
[
  {
    "account": "",
    "address": "xxxxxx",
    "category": "receive",
    "amount": 0.00,
    "vout": 1,
    "confirmations": 0,
    "blockhash": "000000000",
    "blockindex": xx,
    "blocktime": xxxxxxx,
    "expiryheight": 0,
    "txid": "xxxxxxxxxxxxx",
    "walletconflicts": [
    ],
    "time": xxxx,
    "timereceived": xxxxx,
    "vjoinsplit": [
    ],
    "size": 0
  },
...
```

あとはこれを python なりで処理にかけて完成ですね!
`amount`, `time`, `category` あたりを見ればよさそうです.

## TODO

他の coind で試す.
MSX STRTMS

注意
BASICのPLAY文との共存は考慮していません。

参考
[6章 内部ルーチン - MSX Datapack wiki化計画](http://ngs.no.coocan.jp/doc/wiki.cgi/datapack?page=6%BE%CF+%C6%E2%C9%F4%A5%EB%A1%BC%A5%C1%A5%F3)
[The MSX Red Book Revised - P.P.I.](http://www.angelfire.com/art2/unicorndreams/msx/RR-RAM.html)

```play.c
/*
z88dk / WebMSX
zcc +msx -lndos -create-app -bnplay play.c
*/

#define BYTE unsigned char

void strtms(void *qcb)
{
#asm
loop:
	ld	a, ($fb3f)	; MUSICF
	or	a
	jr	nz, loop
	di
	ld	de, $f959	; QUETAB
	ld	bc, 6*3
	ldir
	ld	a, %001
	ld	($fb40), a	; PLYCNT
	call	$0099		; STRTMS
	ei
#endasm
}

typedef struct {
	BYTE putoff;
	BYTE getoff;
	BYTE backup;
	BYTE len;
	BYTE *queue;
} QCB;

void main()
{
	QCB qcb[3] = {
		{ 0x7f, 0, 0, 0x7f },
		{ 0x7f, 0, 0, 0x7f },
		{ 0x7f, 0, 0, 0x7f }
	};
	BYTE qa[128] = {
		0,
		0x60, 0x1e, 0x88, 0x01, 0xac,	// 3byte 30tick v8 tone=$1ac
		0x60, 0x1e, 0x88, 0x01, 0x7d,	// 3byte 30tick v8 tone=$17d
		0x60, 0x1e, 0x88, 0x01, 0x53,	// 3byte 30tick v8 tone=$153
		0xff };
	BYTE qb[128] = { 0, 0xff };
	BYTE qc[128] = { 0, 0xff };

	qcb[0].queue = qa;
	qcb[1].queue = qb;
	qcb[2].queue = qc;

	strtms(qcb);
}
```
MonoDevelopのコード補完のショートカット変更（Mac環境）

## 導入

<img width="794" alt="スクリーンショット 2018-07-19 20.44.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/26257/cec29a42-879a-cd84-9b0a-b4f7550aa429.png">

コード補完の(上みたいなやつ)機能名の名前がいろいろありすぎてググりにくく、なかなか見つからなかったのでメモ。
標準だとコントロール＋スペースにショートカットキーが割り当てられているが、
MacだとOSのショートカットに吸われてしまうので、ショートカットキーを変更する。

というか、いろいろありすぎないか。

- Code complete
- Suggest
- コード補完
- IntelliSense

似たような機能としてsnippetがあるが、あれとはまた違う。

## 方法
<img width="276" alt="スクリーンショット 2018-07-19 20.51.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/26257/d8c00035-7c30-98aa-b6c4-849a7a3230f2.png">
MonoDevelop-Unity→Preferenceを開く。

<img width="740" alt="スクリーンショット 2018-07-19 20.53.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/26257/b6c94dd9-e8f2-2c93-b913-7f3efb9384ec.png">
Environment→Key BindingsのShow Completion Window を変更する。
<img width="840" alt="スクリーンショット 2018-07-19 20.57.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/26257/ec8e840f-8206-5e56-24d7-23b8ad04c3a8.png">
選択して、変更したいショートカットを入力し、Apply→OKを押して、完了。
DialogFragmentをちゃんと1度だけ表示するようにする

DialogFragmentを表示する場合は以下のように `tag` を渡して `show` を呼びます。

```kotlin
dialog.show(supportFragmentManager, tag)
```

なので以下のように `supportFragmentManager` に同じ `tag` を持った DialogFragment があるかどうか確認してから `show` してあげれば1度だけの表示は実装できそうな気がします。

```kotlin
if ((supportFragmentManager.findFragmentByTag(tag) as? DialogFragment)?.dialog == null) {
    dialog.show(supportFragmentManager, tag)
}
```

ただし `show` の場合は処理が Handler に渡されるため、即座に次の `show` が呼ばれば場合に `supportFragmentManager` に `tag` があることが保証されません。つまり、同時タップや高速タップにより DialogFragment が複数表示される可能性があります。

そこで、以下のように `show` から `showNow` を使うようにしてあげます。

```kotlin
if ((supportFragmentManager.findFragmentByTag(tag) as? DialogFragment)?.dialog == null) {
    dialog.showNow(supportFragmentManager, tag)
}
```

これで1度だけの表示ができそうです。

最初のうちは DialogFragment の表示方法について調べても `show` を使っているものばかりなので `showNow` があることに気づかないことも多いので覚えておくと良さそうです。

ちなみにですが `showNow` では Fragment のトランザクションで `commitNow` がつかわれ、 `show` では `commit` が使われてします。

```java
public void show(FragmentManager manager, String tag) {
        mDismissed = false;
        mShownByMe = true;
        FragmentTransaction ft = manager.beginTransaction();
        ft.add(this, tag);
        ft.commit();
    }

public void showNow(FragmentManager manager, String tag) {
        mDismissed = false;
        mShownByMe = true;
        FragmentTransaction ft = manager.beginTransaction();
        ft.add(this, tag);
        ft.commitNow();
    }
```

これらの違いについては他の記事を参照すると良いでしょう。

- [FragmentTransactionに新たに追加されたcommitNow()について](https://qiita.com/kakajika/items/7a7e08ec9923ff478ade)
CentOS7 ローカルネットワークからのhttp/httpsアクセスを許可する

CentOS7上で動作しているhttp/httpsサービスについて、ローカルネットワーク内の他のPCからのアクセスを許可する方法。
firewalldを使う。下記に示すコマンドをRoot権限で実行すればOK。
(手早くできればいい人向け)

# firewalldを起動させる
```sh
#firewalldを起動
systemctl start firewalld.service
#firewalldを次回から自動で起動させる
systemctl enable firewalld.service
```

# http/httpsへのアクセスを許可
```sh
firewall-cmd --permanent --new-zone=ci
firewall-cmd --permanent --zone=ci --set-target=ACCEPT
#アクセス元がローカルネットワーク内のマシンなら許可。適宜変更すること
firewall-cmd --permanent --zone=ci --add-source=192.168.0.0/24
firewall-cmd --permanent --zone=ci --add-service=http
firewall-cmd --permanent --zone=ci --add-service=https
firewall-cmd --reload
```
ここでは"ci"という名前のzoneを作成し、それに対してhttp/httpsサービスへのアクセスを許可するように設定している。
("ci"という名前に特別な意味はないので変更可)
クラスにアクセス修正子を設定できるようにするRFC

2018/07/18に[Namespace Visiblity for Class, Interface and Trait](https://wiki.php.net/rfc/namespace-visibility)というRFCが提出されました。
フレームワークやライブラリなどの開発者にとってはわりかし便利そうなRFCだったので紹介してみます。

# Namespace Visiblity for Class

## Proposal

どんな内容かというと、まあ↓のとおりです。

```php
namespace HOGE{
	public    class A{}
	protected class B{}
	private   class C{}
}

namespace{
	new \HOGE\A(); // OK
	new \HOGE\B(); // 死
	new \HOGE\C(); // 死
}
```

class内のfunctionにアクセス修正子を付けられるのと同様、namespace内のclassにアクセス修正子を付けられるようにします。

### public

publicクラスはどのnamespaceからでも見ることができるクラスです。
可視性を設定していないクラスはpublic扱いとなります。
要するに今までのclassと同じものです。

### private

privateクラスは同じnamespaceからしか見ることができないクラスです。
内部でしか使用しない、外に出す必要がないクラスはここに隠蔽することになるでしょう。
まあprivateメソッド、プロパティと同じ使い方です。

### protected

protectedクラスは、同じか、それ以下のnamespaceから見ることができるクラスです。

```php
namespace HOGE\FOO{
	protected class A{}
}

namespace HOGE\FOO\BAR{
	new \HOGE\FOO\A(); // OK
}

namespace HOGE\BAZ{
	new \HOGE\A(); // NG
}
```

直接的にextendsしているわけではありませんが、protectedなメソッド・プロパティと似たような可視性ということです。

## Interface / Trait

クラスだけではなく、interfaceとtraitにもアクセス修正子を書くことができます。

```php
namespace Example {
    public interface A{}
    protected interface B{}
    private interface C{}
    
    public trait D{}
    protected trait E{}
    private trait F{}
}

namespace Example\Nested{
	class W implements \Example\A{} // OK
	class X implements \Example\B{} // OK
	class Y implements \Example\C{} // NG

	class Z{
		use \Example\D; // OK
		use \Example\E; // OK
		use \Example\F; // NG
	}
}
```

上のサンプルで`Example\Nested`は`Example`のサブnamespaceなので、`Example`のprotectedクラスを見ることができますが、無関係なnamespaceからprotectedなinterfaceやtraitを見ようとすると当然NGになります。


## privateクラスを覗く

クラスの場合は同名のクラスを作れないのでprivateを直接見ることはできませんが、namespaceは作れるので、やろうと思えば簡単にprivateクラスの中身を見ることができてしまいそうです。

```php:なんかのライブラリ
namespace Vendor\Library{
	private class DontTouch{}
}
```

```php:覗く側
namespace Vendor\Library{
	// 見れる？
	$class = new \Vendor\Library\DontTouch();
}
```

これについてはどうなるのか探してみたのですが、特に記述がないようです。
もっともPHPの場合はprivateを見る方法なんていくらでも存在するので、多少抜け道があったとしても、それを見る開発者に意味が伝わればいいという方向でかまわないと思います。


## 歴史

このRFCに関する最も古い話題は、なんと[2007年12月12日](https://externals.io/message/33981)の投稿です。
PHPでnamespaceがサポートされたのが2009年の[PHP5.3](http://php.net/manual/ja/migration53.new-features.php)なので、どれだけ早いんだよってかんじですね。
もっとも上記は正確にはnamespace自体の提案で、アクセス修正子については話のついでではありますが。

namespaceの実装後も関連の話題は断続的に出され、2015年には[プルリク](https://github.com/php/php-src/pull/947)も出されていました。
ただこのときは、仕様や実装の考慮不足など問題が色々と発生して、最終的には却下されてしまいました。

はたして今回はどうなるでしょうか。
というかRFCから現行MLやPRへのリンクが貼ってないから、何処で話がついてるのかわらかん。
[Reddit](https://www.reddit.com/r/PHP/comments/8u95lk/class_visibility_proposal_and_discussion/)でいいんじゃろか。

# 感想

あれば便利だとは思うけど、自分から使うかといったら使わなさそう。

というか前から思ってるんだけど、namespaceってだいたい二重にできるpartial classだよね。
herokuでlaravelの環境をつくる

# heroku で laravel の環境を用意する手順
herokuのアカウントの作成やheroku cliを使用できるようにしておいてください。
--app APP名はつけなくても実行可能です。
## 1. laravelのインストール
```bash

composer create-project laravel/laravel --prefer-dist app-name

cd app-name
```

## 2. git の初期化
```bash

git init
git add .
git commit -m "new laravel project"
```

## 3. profileの作成
```bash
echo web: vendor/bin/heroku-php-apache2 public/ > Procfile
git add .
git commit -m "Procfile for Heroku"
```
## 4. heroku appの作成
```bash

heroku create heroku-app-name --buildpack https://github.com/heroku/heroku-buildpack-php.git
```

## 5. APP_KEYの作成
```bash

heroku config:set --app heroku-app-name APP_KEY=$(php artisan --no-ansi key:generate --show)
```

## 6. heroku にデプロイする
```bash

git push heroku master
```

## 7. heroku app を開く
```bash

heroku open --app heroku-app-name
```

## 8. postgres の設定
### addonsの追加
<PLAN_NAME>にpostgresのプラン名にしてください。
今回は、無料のhobby-devにします。

```bash

heroku addons:create heroku-postgresql:<PLAN_NAME>
heroku addons:create heroku-postgresql:hobby-dev --app heroku-app-name
```

### postgresの設定内容の確認
```bash

heroku config:get DATABASE_URL --app heroku-app-name

#実行結果
postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_DATABASE
```

### postgresの設定内容をherokuの環境変数に登録する
```bash

heroku config:set DB_CONNECTION=pgsql DB_HOST=DB_HOST DB_PORT=DB_PORT DB_DATABASE=DB_DATABASE DB_USERNAME=DB_USERNAME DB_PASSWORD=DB_PASSWORD --app heroku-app-name
```

### heroku run をつかって php artisan migrate を実行する
```bash

heroku run 'php artisan migrate' --app heroku-app-name
```
【JavaScript】無名関数とは/即時関数とは

# 関数とは

同じ処理を定義し何度も使い回しができる形にしたもの。

```javascript:
<script>
  function 関数名(){
  処理
  }
</script>
```


# 無名関数とは

関数名なしで関数を定義できるもの。

```javascript:
<script>
  function(){
  処理
  }
</script>
```


# 何の効果の違いがあるんや

1.通常の関数の場合

```javascript:
<!DOCTYPE html>
<html lang ="ja">
  <head>
    <meta charset = "utf-8">
    <title>JavaScriptの練習</title>
  </head>
  <body>
    <script>
      function sum(a,b){
        var result = a + b;
        return result;
      }
      var answer = sum(1,2);
      alert(answer);
    </script>
  </body>
</html>
```

=>引数1,2に応じてアラート「3」が出る。


2.無名関数の場合

❇︎　script内のみ書き出します

```javascript

  <script>
    var sum = function(a,b){
      var result = a + b;
      return result;
    }
    var answer = sum(1,2);
    alert(answer);
  </script>

```

=>結果は同じく、「3」がアラートで出る。

> 通常の関数では、まず関数sumを定義し、そのsumをのちほど変数answerに代入し、引数1,2を入れて呼び出した。

>それに対し、無名関数では、変数に関数の定義そのものを = で直接入れることができるようになる。

>こうすることで、余計な関数名や変数名を考えなくても済む。逆にいえば、1回きりしか使わない関数なので、名前をつける必要がない（=無名）ということ。


# 即時関数

無名関数は、実は即時関数の一種。
即時関数はプログラムを即時実行できる点がメリット。

更にシンプルな書き方では、varで宣言して変数に格納したりせずに、functionから始まる関数定義そのものを()でくくって即実行できるようになる

```javascript

    <script>
      var sum = (function(a,b){
        var result = a + b;
        return result;
      })(1,2);
      alert(sum);
    </script>

```

=>関数sumを変数answerに代入していたものが、
変数answerすら省略できるようになった！

>一箇所しか使わない定義に関しては即時関数を使ってシンプルに書いた方が良い。
PhpStormのTerminalでいろいろ使う

# 概要

PhpStorm の Terminal で標準のコマンドプロンプト以外を使う方法です。

検証時のバージョンはこちらです。

```
PhpStorm 2018.1.6
Build #PS-181.5281.35, built on June 15, 2018
JRE: 1.8.0_152-release-1136-b39 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
```

# はじめに

どこの設定を変更するかです。

1. `Ctrl + Alt + S` で設定ダイアログを開き、
2. `Tools > Terminal` を選択
3. この画面の `Shell path` を変更します。
4. 設定後に新しくTerminalを開くと反映されます。

![111.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/26c6499d-72e7-5e92-9a99-bf0d2f757d72.png)

# デフォルト(コマンドプロンプト）

```diff
cmd.exe
```

# PowerShellを使う

```path
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
```

# Git Bashを使う

```path
C:\Program Files\Git\bin\bash.exe
```

# WSL (Windows Subsystem for Linux)を使う

```path
C:\Windows\System32\wsl.exe
```

## 起動するディストリビューションの確認と設定

起動するディストリビューションは`wslconfig /list`で規定になっているものです。

```
# wslconfig /list
Windows Subsystem for Linux ディストリビューション:
Ubuntu-18.04 (既定)
Ubuntu-16.04
```

変更するときは /setdefaultオプションを使います

```
# wslconfig /setdefault Ubuntu-16.04
```

確認

```
# wslconfig /list
Windows Subsystem for Linux ディストリビューション:
Ubuntu-16.04 (既定)
Ubuntu-18.04
```

## おまけ

exeにパラメータ渡せばPhpStorm側の設定だけで任意のディストリビューションが起動出来ると思い試してみましたが、残念ながらエラーになりました。

```
"C:\Windows\System32\wsl.exe {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"
```

![error.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/84068254-e9a3-64f8-1af1-b9b09af6e20b.png)

# WSL (任意のディストリビューション）を使う

上で出来ないと書きましたが、直接exeファイルのパスを指定することで出来ました:smile:

```
"C:\Program Files\WindowsApps\CanonicalGroupLimited.Ubuntu16.04onWindows_1604.2018.510.0_x64__79rhkp1fndgsc\ubuntu1604.exe" 
```

パスの確認方法

1. Microsoft Stroeでインストールしたディストリビューションを起動
2. タスクマネージャを開きます(`Ctrl + Shift + Esc`)
3. 起動したディストリビューションのプロセスを探して、折りたたまれているのを展開
4. exeを右クリック→プロパティ
5. プロパティ内の場所 と exeファイル名を組み合わせるとでフルパスになります。

![taskmanager.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/acbf251e-8f4a-55c4-0549-5df7ae720d5c.png)
　　↓
![property.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/03222958-6c82-1de1-5275-5d2bb0b6d6f8.png)

## 問題点（Start directoryが適用されない）

問題が一つあり、この方法ではStart directory（ログイン時の初期位置）は適用されませんでした。:confused:
（Linux形式のパスを入れると`java.io.IOException: Couldn't create PTY`になる）

これが煩わしいという人は、ひとつ前で紹介した`wsl.exe`を指定する方法のほうがよさそうです。
casperJsを使ってポップアップ画面でファイルアップロードするまで

# はじめに
casperjsを使ってログイン、ポップアップ画面、ファイルアップロード、までを実施したので、
その時のメモとハマったことをまとめておきます

casperjsインストールからログインまでは[CasperJSでブラウザ操作を自動化しよう](https://qiita.com/a-kane/items/a5d4b8345bc9c5d2c15c)を参考にさせていただきました。
それ以降、困ったことは[CasperJS documentation](http://docs.casperjs.org/en/latest/modules/index.html)を利用しました。
利用したバージョンは、casperjs: 1.1.4、phatomjs: 2.1.1です

# サイトにログインしてキャプチャをとる
参考にさせていただいたリンクにもある通り`fill`を利用する

```javascript

capser.thenOpen("${url}", function() {
  this.fill('form', {'login_id':'id', 'password': 'password'}, true);
});
casper.then(function() {
  this.capture('login.png');
});
```

login_id, passwordどちらもinputタグのnameに合わせる

# iframeを利用した画面に対するアプローチ
ログイン後の画面で`click(slector)`を利用して、リンクを押した遷移をしようとしたができず。
iframeを利用している場合、`withFrame`を利用する必要があった（もうあまりないと思うが。。。）

```javascript

casper.then(function() {
  this.withFrame(1, function(){
    this.click("a.button:nth-clild(3)");
  });
});
```

`withFrame`の引数には何個目のiframeかを入れる（1個目なら0）
`click`にはselectorを渡す、今回は同じスタイルのaタグがいっぱいあったので、`<a class="button">`の3つ目を指定

# ポップアップ画面でファイルアップロード
ポップアップ画面もiframeと同様で、`withPopup`を利用する（試してないが、おそらく別タブも可能）
ファイルアップロード（今回は画像）は、`uploadFile`を利用する


```javascript

casper.then(function() {
  this.withPopup({windowName: "target"}, function(){
    this.page.uploadFile('input[type=\"file\"][value=\"uploadFile1\"]', '/app/tool/upload_file/gazo1.jpg');
    this.page.uploadFile('input[type=\"file\"][value=\"uploadFile2\"]', '/app/tool/upload_file/gazo2.jpg');
    this.page.uploadFile('input[type=\"file\"][value=\"uploadFile3\"]', '/app/tool/upload_file/gazo3.jpg');
    this.click("img#submitButton");
  });
});
```

`withPopup`のwindowNameには、window.openで指定した画面名を指定する
`uploadFile`もselectorを渡すので、idやclassがあればシンプルにかける
アップする画像はフルパスで記載（相対パスは試してない）

# おわりに
思ったより、さくっとできた。
今回は「作業の自動化」だったけど、「画面テストの自動化」もやってみたいな、と思った。
なので、もう少し色々作ってみようと思います
ActiveRecordで普通のEnum型カラムを作成する

# はじめに
　ActiveRecordでEnumカラムを実現しようとすると、一般的にはモデルにシンボル配列を定義して、カラム自体は数値型にする場合が多いようです。しかし、このやり方では以下の問題が発生します。

- 可読性が著しく落ちる
    + ツールを利用してテーブルを閲覧しても、カラムの値が何を意味しているかわからない
- データベースを利用する為の情報が、アプリケーション(モデル)とデータベースに分離されてしまう
- データベースが、このActiveRecordを利用したアプリケーションに依存してしまう
    + 特に、rubyを使わないアプリケーションからこのデータベースを利用する際に問題が生じる

　一般に、データベースはアプリケーションより寿命が長く、また昨今では収集したデータをpythonで分析することも少なくない為、ActiveRecordにデータベースの構造を左右されたくありません。よって、意地でもEnum型のカラムを作りたいと思います。なお、データベースはMySQLを利用します。

# 環境
                          | バージョン
--------------------------|---
ruby                      | 2.5.1
ActiveRecord              | 5.1.5
MySQL                     | 5.7.20

# 手順
　といっても、やることは__ActiveRecord::ConnectionAdapters::TableDefinition#column(name, type)__を利用して、typeに部分的なSQLを渡すだけ。

```rb
# samplesテーブルの作成
create_table 'samples', id: :integer, unsigned: true, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" do |t|
    t.string 'name', limit: 100, default: '', null: false
    # こんな感じでEnum型カラムを定義できる
    t.column 'status', "ENUM ('none', 'failed', 'succeeded') DEFAULT 'none' NOT NULL"
    t.datetime 'created_at'
    t.datetime 'updated_at'
end
```

　挿入/参照する場合、通常の文字列として利用できます。定義されていない文字列を挿入した場合、__ActiveRecord::StatementInvalid__が送出されます。

```rb
# モデルを定義
class Sample < ActiveRecord::Base
end

# 挿入
Sample.transaction do
  model = Sample.create(name: 'Enoch', status: 'failed')
  model.save! if model.valid?
end

# 参照
res = Sample.where(status: 'failed').last
puts res.name # `Enoch`
```
BootStrap4でフロントエンド完結のpassword一致のバリデーションを実現する

- [Bootstrap4公式](https://getbootstrap.com/docs/4.1/components/forms/?gridRadios=option1#validation)のページでは、**未入力に対するバリデーションはあったけど、パスワード一致のバリデーションはどうしたら実現できるのかの記述がなかった**ので、自分で作って見ました。
- Bootstrap4では、以下のようなJSファイルを書くことで、バリデーションエラーが生じた場合にエラー文を出してくれます

```js
(function() {
  'use strict';
  window.addEventListener('load', function() {
    var forms = document.getElementsByClassName('needs-validation');
    var validation = Array.prototype.filter.call(forms, function(form) {
      form.addEventListener('submit', function(event) {

        // ここでバリデーションエラーがないか確認している
        if (form.checkValidity() === false) {
          event.preventDefault();
          event.stopPropagation();
        }
        form.classList.add('was-validated');
      }, false);
    });
  }, false);
})();
```

- つまり`checkValidity()`メソッドで、パスワードの不一致を判定できれば言いわけです。
- 本当は`data-match属性`とか使う方がスマートなのかもしれません。
- ですが、自分ではどうもうまく行かなかったので、今回は`pattern属性`を使うことで実現しています。
- もっとスマートな方法があったらぜひお知らせ願います。



## パスワードの一致バリデーションの書き方
- 今回は、**「パスワード（確認）のInputタグの`pattern属性`」**を使います。
- pattern属性には文字列を入れることができ、**その文字列とInputに入れられた値が異なる場合にはバリデーションエラーを発生させてくれます。**
- なので**「パスワード入力欄のInputハンドラ」**で、**「パスワード（確認）のpattern属性」**と、**「パスワード入力欄の値」**を連動させれば、パスワードの一致バリデーションを実現することができます。

```erb
<div class="form-group">
    <%= f.label :password %>
    <%= f.password_field :password, id: 'password-input', class: 'form-control', required: true, pattern: '^(?=.*?[a-zA-Z_-])(?=.*?\d)[0-9a-zA-Z_-]{8,}$' %>
    <div class="invalid-feedback" style="width: 100%">
      パスワードを正しいフォーム（数字、小か大文字を含む8文字以上）で入力してください
    </div>
</div>
<div class="form-group">
    <%= f.label :password_confirmation %>
    <%= f.password_field :password_confirmation, id: 'password-confirmation-input', class: 'form-control', required: true, pattern: '' %>
    <div class="invalid-feedback" style="width: 100%">
      空欄もしくはパスワードが不一致です
    </div>
</div>
```

```js
// password-inputの値とpattern属性を連動させる
$('#password-input').on('input', function(){
  $('#password-confirmation-input').prop('pattern', $(this).val())
});
```

- 改めてポイントを復習すると以下の通りです。

> 1. pattern属性を「パスワード（確認）のインプット欄」につける。
2. 「パスワードのインプット欄」のInputハンドラで、「パスワードのインプット欄の値」と「パスワード（確認）のインプット欄のpattern属性」を連動させる。

これで実現できるはず！
APNsのpushが飛ばなくなってしまったときの対応

# 概要
2018年7月18日に突然APNsを使用したiOSのpushが届かなくなりました。
原因の調査を行なったのでまとめます。
同じ境遇に遭遇した方のお役に立てば幸いです。

# 原因
pushが飛ばなくなった原因は、AppleのAPNsリクエストの仕様変更によるものだと思われます。
[HTTP2のRFC](https://tools.ietf.org/html/rfc7540#section-8.1.2.1)には、すべての擬似ヘッダーが通常ヘッダーよりも先に書かれていなければならない(MUST)と記載があるのですが、この制約の強制をAPNsへ適用したことにより、制約に準拠していないリクエストが通らなくなったことがpushが送信できなくなった原因でした。

HTTP2のRFCが日本語訳されたものもあるので、こちらも参考にしてみてください。
https://summerwind.jp/docs/draft-ietf-httpbis-http2-14#section8-1-2-1

# 対策
リクエストヘッダー内で、擬似ヘッダーを通常ヘッダーより先に記載するように修正すればリクエストが通るようになります。
私の場合、[apnotic](https://github.com/ostinelli/apnotic)というgemを使用していました。
apnoticを使用している場合は、apnotic内で使用している`net-http2`のバージョンを`0.18.0`以上にすれば直ります。
詳細はこの[issue](https://github.com/ostinelli/apnotic/issues/68)を見てください。

# 余談
`net-http2`gemを使用している場合、このgem内で
` end.tap { |t| t.abort_on_exception = true }`
https://github.com/ostinelli/net-http2/blob/1513fb7cb661bfcc6648ef31fbc3b66095dacc51/lib/net-http2/client.rb#L122
という記載があり、スレッドの外に例外を送った場合は、Rubyインタプリタごと落ちてしまうようになっていました。

そのためsidekiqなどの非同期ワーカーでpushを送信していると、`Socket was remotely closed`というログを残しsidekiqのワーカーごと落ちてしまいます。
Rubyインタプリタ落ちてしまうのを防ぎたい場合は、下記のようにerrorイベントを拾うコールバックを設定してください。

`client.on(:error) { |exception| puts "Exception has been raised: #{exception}" }`
詳しくは[README](https://github.com/ostinelli/net-http2#objects)を参考にしてください。


# 参考
[instance method Thread#abort_on_exception](https://docs.ruby-lang.org/ja/latest/method/Thread/i/abort_on_exception.html)
Prometheus の監視データ置き場に EFS を使ってみた

## EFS を使ってみた
弊社では、AWS を利用しているので、AWS の使った記事も書かないと(汗
Prometheus の監視データを長めに保存したくなったが、EBS を 10GB とギリギリで作っていたので、せっかくだから EFS にデータを移して問題が無いか検証をした。

## 準備
### EFS 設定
EFS は下記のように設定した。デフォルトのままですよ。

|パフォーマンスモード |スループットモード |暗号化 |
|:-:|:-:|:-:|
|General Purpose |Bursting |なし |

### クライアント設定
クライアント OS は CentOS7。
[これ](https://github.com/aws/efs-utils)を入れると、いい感じにやってくれるらしいが、今回は訳あって、別 VPC のサーバからマウントしたいので、これは使わず。

別 VPC だからマウントポイントの使えないので、IP アドレスでマウントするよ。
オプションは、[ここ](https://docs.aws.amazon.com/ja_jp/efs/latest/ug/mounting-fs-mount-cmd-ip-addr.html)のやつをそのまま使ってる。

```bash:
mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 mount-target-IP:/ ~/efs-mount-point  
```

### 自動マウント設定
fstab も設定しないと。

```bash:/etc/fstab
# 下記を追記する
mount-target-IP:/ ~/efs-mount-point nfs nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev 0 0
```

## 監視開始
Prometheus の設定は割愛。監視データを EFS に移し、監視再開。・・・まぁ、特に問題無いよね。
EFS のディスクサイズは、1h毎に更新されるっぽい。ちゃんと、node exporter で取得出来る事も確認出来た。

EFS にはディスクスナップショットが無いので、バックアップ機構を自分で作らなきゃいけないけど、監視データなら消えても困らないし、正しい使い方な気がするのは自分だけだろうか。

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html