OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub と GitLab で Git config を切り替えたい

## 設定方法

ディレクトリごとに読み込む設定ファイルを分岐させます。

```
/Users/iris/Documents/repos/
├── github.com
└── gitlab.com
```

`github.com` 以下には GitHub のリポジトリ、`gitlab.com` 以下には GitLab のリポジトリが配置されている状態です。

`gitlab.com` 以下にいる時だけ `~/.dotfiles/git/gitconfig.gitlab` を読み込むようにして `user.email` を GitLab に登録した Email で上書きします。

```text:.gitconfig
[user]
    name = peaceiris
    email = 30958501+peaceiris@users.noreply.github.com

[includeIf "gitdir:~/Documents/repos/gitlab.com/"]
    path = ~/.dotfiles/git/gitconfig.gitlab
```

```text:~/.dotfiles/git/gitconfig.gitlab
[user]
    email = my-gitlab-email@gmail.com
```



## `includeIf` について

以下を参照した。

- [Git - git-config Documentation](https://git-scm.com/docs/git-config)
.Net Core2.2におけるWebAPIのログ出力について

.NET Coreを始めたのですが、理解が浅かったのでこまめにまとめたいと思います。
ここではWebAPIによるプロジェクトのログ出力についてまとめます。

# 環境
| Tools         | Version |
| ------------- | ------- |
| .NET Core SDK | 2.2.401 |

# 初めに

.NET CoreにおけるLoggerの基本的な使い方はDIによる利用になります。

```SampleController.cs
    [Route("api/[action]")]
    [ApiController]
    public class SamplesController : ControllerBase
    {
        private readonly ILogger<SamplesController> _logger;
        public SamplesController(ILogger<SamplesController> logger)
        {
            _logger = logger;
        }
        [HttpGet]
        public async Task<ActionResult<IEnumerable<Sample>>> GetSamples()
        {
            _logger.LogTrace("trace");
            _logger.LogDebug("debug");
            _logger.LogInformation("info");
            _logger.LogWarning("warning");
            _logger.LogError("error");
            _logger.LogCritical("critical");
            return new List<Sample> { new Sample() };
        }
    }
```

# TraceIdの扱いをどうするか

例えば、`GET: api/samples/{id}`のようなエンドポイントを考えます。
以下のようなコードを用意します。

```SampleController.cs
    [Route("api/[action]")]
    [ApiController]
    public class SamplesController : ControllerBase
    {
        private readonly ISampleService _sampleService;
        private readonly ILogger<SamplesController> _logger;
        public SamplesController(ISampleService sampleService, ILogger<SamplesController> logger)
        {
            _sampleService = sampleService;
            _logger = logger;
        }
        [HttpGet("{id}")]
        public async Task<ActionResult<Sample>> GetSample(int id)
        {
          var sample = await _sampleService.FindById(id);
          if (sample == null) {
            return NotFound();
          }
          return  sample;
        }
    }
```

指定したIdが存在しない場合、NotFoundResultを返します。

この時のレスポンスは以下のようになります。

```json

    {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4",
        "title": "Not Found",
        "status": 404,
        "traceId": "0HLOJ3836502B:00000001"
    }
```

ここで気になるのはtraceIdの存在です。ログの出力をDebugレベルで確認すると、リクエストの開始とレスポンスの完了のタイミングでtraceIdの出力があります。しかし、Debugレベルでの出力になるので、不要なのでは？と思ってしまいます。

悩んだ結果、TraceIdをログに出すことにしました。

```SampleController.cs
        [HttpGet("{id}")]
        public async Task<ActionResult<Sample>> GetSample(int id)
        {
          var sample = await _sampleService.FindById(id);
          if (sample == null) {
            _logger.LogError($"traceId: {HttpContext.TraceIdentifier}. Sample is not found.");
            return NotFound();
          }
          return  sample;
        }
```

Controllerからであれば、HttpContextプロパティのTraceIdentifierをログ出力すれば良いです。

# 最後に

そもそもレスポンスをtraceIdを返さないようにすることもできるんですが、どちらがいいんでしょうか 🤔 


# 参考
- [How is HttpContext TraceIdentifier generated in .net core?](https://stackoverflow.com/questions/50689315/how-is-httpcontext-traceidentifier-generated-in-net-core)
- [ASP.NET Core を使って Web API を作成する](https://docs.microsoft.com/ja-jp/aspnet/core/web-api/?view=aspnetcore-2.2)
- [ASP.NET Core でのログ記録](https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/logging/?view=aspnetcore-2.2)
Dockerを使ってAmazonLinux2にXdebugを導入した 

#背景
docker環境でAmazonLinux2にXdebugを入れるのに手間取ってしまったため、備忘録として残しておきます。

#環境
- Nginx + PHP-FPM

コンテナOSは両方ともAmazonLinux2になります。

#原因と解決
すべての元凶はAmazonLinux2なのですが、インフラに詳しくない自分にとって思いのほか辛い作業になってしまいました。
AmazonLinux2のyumにはパッケージが色々入っていなかったり、参考サイトもそこまで多くないので試行錯誤してどうにかインストールしました。ただ、インストールできてしまうとなんてことはないのかと思いますが。。。
Xdebugのインストール自体は色々なサイトに乗っていますが、基本`pecl install xdebug`でインストールになるかと思います。ただ、AmazonLinux2にはデフォルトでpeclがないので動かない。

peclのインストールが必要らしい、、、

この時点でめんどくさくなって来ましたが頑張ってpeclを使えるようにしました。

以下を実行することでpeclを使用してxdebugをインストールできました。

```Dockerfile
RUN yum install php-pear php-devel gcc make -y
RUN pecl install xdebug
```

peclとか、pearをインストールしている理由を知りたい方は下記を確認していただければと思います。
http://dqn.sakusakutto.jp/2015/07/php_extension_pecl_phpize.html
【Ruby】eachとmapの違い

Rubyで再帰的な処理をしたいときによく使われるeachとmapですが、初心者の方はつまづきやすいので、これらの使い分け方について簡単にまとめます。

# each

eachは繰り返し処理をしたい時に使用します。
下の例では配列arrayの各要素の数字を2倍した結果を出力しています。

```ruby
array = [1, 2, 3]
array.each do |item|
  p item * 2
end
2
4
6
=> [1, 2, 3]
```

mapとの違いを理解するうえで、戻り値がもとの配列[1, 2, 3]のままである点がポイントとなりますので覚えておいてください。

# map

mapは繰り返し処理をした**結果を配列として保持する**ときに使います。
下の例では配列arrayの各要素の数字を2倍した結果を配列resultに詰めています。

```ruby
array = [1, 2, 3]
result = array.map do |item|
  item * 2
end
=>[2, 4, 6]
```

eachと違ってブロックの戻り値の結果が配列として返ってきていることがわかります。
もし同じ処理をeachで実装したい場合は下のようになりますが、mapで書くよりも記述量が増えてしまいますね。

```ruby
array = [1, 2, 3]
result = []
array.each do |item|
  result << item * 2
end
=> [1, 2, 3]
```

# まとめ

eachとmapの使い分けは、処理結果を使うか使わないかによって変わってきます。
処理結果を使いたい場合はeachではなくmapを積極的に使っていけると良いですね！

```ruby
# 良い例
array.map do |item|
  item * 2
end

# 悪い例
result = []
array.each do |item|
  result << item * 2
end
```

- eachは繰り返し処理に使う
- mapは繰り返し処理の結果を配列にしたいときに使う
Android端末にインストールされた認証局でサーバ証明書を検証する

# 目的
タイトル通りだが、方法を見つけるのに苦労したので記載しておく。
これを実装すると、自前のRoot認証局が署名したサーバ証明書でも検証してくれる。
自前のRoot認証局のインストール方法は、「設定」>「セキュリティ」>「SDカードからインストール」をタップし、証明書(PEM形式でよい)を選択する。インストールに成功すると、「設定」>「セキュリティ」>「信頼できる認証情報」の「ユーザー」タブに選択した証明書が表示される。

# 実装
```kotlin:
fun connect() {
    // 端末にインストールされている「信頼できる認証情報」ストレージを取得する
    val caStore = KeyStore.getInstance("AndroidCAStore").apply {
        load(null)
    }
    // デバッグ用: 「信頼できる認証情報」をログ出力する
    caStore.aliases().toList().forEach { alias ->
        Log.d("----", "alias=${alias}, certificate=${caStore.getCertificate(alias)}")
    }
    // SSLハンドシェイク時に受信したサーバ証明書の署名者を、検証してくれるTrustManagerを生成するオブジェクトを作成する
    val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).apply {
        init(caStore)
    }
    // 上で作成したTrustManagerを使う SSLContext を作成する
    val context: SSLContext = SSLContext.getInstance("TLS").apply {
        init(null, trustManagerFactory.trustManagers, null)
    }
    // HTTPS 通信を行う
    val url = URL("https://example.com/index.html")
    val urlConnection = (url.openConnection() as HttpsURLConnection).apply {
        sslSocketFactory = context.socketFactory
    }
    // デバッグ用: 通信結果をログ出力する
    val inputStream = urlConnection.inputStream
    Log.d("----", InputStreamReader(inputStream).readText())
}
```

# 注意点
端末にRoot認証局をインストールし、サーバ証明書を中間認証局(Root認証局で署名)で署名しているにもかかわらず、検証に失敗する場合がある。その時は、下記のように自前のX509TrustManagerを実装し、サーバから受信する証明書チェーンを確認する。

```kotlin:
fun connect() {
    val context: SSLContext = SSLContext.getInstance("TLS").apply {
        //        init(null, trustManagerFactory.trustManagers, null)
        init(
            null,
            arrayOf(object : X509TrustManager {
                override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {
                }

                override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {
                    // デバッグ用: サーバから受信した証明書チェーンをログ出力する
                    Log.d("----", "chain=${Arrays.toString(chain)}")
                }

                override fun getAcceptedIssuers(): Array<X509Certificate> {
                    return emptyArray()
                }
            }),
            null
        )
    }
    // HTTPS 通信を行う
    val url = URL("https://example.com/index.html")
    val urlConnection = (url.openConnection() as HttpsURLConnection).apply {
        sslSocketFactory = context.socketFactory
    }
    // デバッグ用: 通信結果をログ出力する
    val inputStream = urlConnection.inputStream
    Log.d("----", InputStreamReader(inputStream).readText())
}
```
AndroidのWebViewでAutofillを無効化する

## はじめに
自前のWebViewを実装するときにHTMLのフォーム入力でAutofill表示しないようにしたかったときのメモ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68671/111f37e4-8f69-2bdc-cf43-4dfff984a138.png)

検証環境
* Pixel3
* Android 9

## 解決策
WebViewの `importantForAutofill`に `IMPORTANT_FOR_AUTOFILL_NO`を指定する(Android O / API 26以上の場合のみ)。

```kotlin
        webView.apply {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                importantForAutofill = View.IMPORTANT_FOR_AUTOFILL_NO
            }
        }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68671/db643795-196b-1ddf-199f-bea9d69be07a.png)
バイナリー型ギャンブルで、マーチンゲール法を採択した時の期待値

バイナリー型のギャンブルには、バカラやバイナリーオプションなどがある。

選択できるのは、２択で、当たれば約２倍、外れれば０になる、勝率約０.５の賭けである。


試しに、マーチンゲール法（負けたら２倍賭ける）を使った時の期待値を計算してみる。


ペイアウト率が1.88倍だった場合。

<img width="699" alt="スクリーンショット 2019-07-28 14.18.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439275/b88b0d5e-47ac-aea6-c98d-dad49f4f540e.png">
<img width="575" alt="スクリーンショット 2019-07-28 14.19.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439275/e0a181cf-10f7-2ca6-48a0-e2d02b169715.png">
<img width="575" alt="スクリーンショット 2019-07-28 14.19.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439275/050eb4c9-24a5-fe4c-944b-4ee7f7cfd0df.png">
<img width="575" alt="スクリーンショット 2019-07-28 14.20.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439275/a49bd547-3851-8949-4746-2a5eff6dbb14.png">

１０回目で破産する場合のデータのみ抽出すると、以下のグラフになる。
<img width="1163" alt="スクリーンショット 2019-07-28 14.20.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439275/70ffb2a7-ef88-66cb-facc-eb37a7e78e1e.png">

勝率約0.53を越えると、正の期待値を取ることが分かる。
Storyboardから追加したNavigationBarをコードで編集する(NavigationControllerを使わない)

# 概要
仕事での仕様がStoryboardで`NavigationController`ではなく`NavigationBar`が乗っかっているViewControllerばかりだったのでハマった
→`NavigationController`を扱う場合の記事は多く見つかるが
このパターンはほとんど見つからず苦労したのでメモ(そもそもどうググって絞ればいいのかわからん、、、、)
#### NavigationBarのパラメータ参照の差異
**・NavigationControllerを追加した場合**

```swift
self.navigationController?.navigationBar.hogehoge = hugahuga
```

**・NavigationBarを追加した場合**
`navBar`として`Outlet`接続

```swift
self.navBar.hogehoge = hugahuga
```

# titleを設定する
追記

# 背景色を編集する
追記

# 下にUI(TableViewなど)を追加する
#### NavigationBarの下に置く場合
**・[ナビゲーションバーを透明にする transparent UINavigationBar - ObjecTips](http://koze.hatenablog.jp/entry/2015/10/08/093000)**
#### NavigationBarを透過させる場合
**・[NavigationBarの背景をスクロールの位置によって変える - Qiita](https://qiita.com/daigou26/items/2f02f5acf2e3137be10e)**

# StatusBarとの兼ね合い

# 使い分けどうする？
#### NavigationBarで追加するメリット
以下の記事で`NavigationController`に別UIを追加する際の`contentInset`周りでの下のようなゴタゴタがあるようですが、`NavigationBar`の場合は制約をちゃんと設定できてれば位置ズレなどでつまづくはないかなと

**参考記事**
**・[iOS11 で UIScrollView の contentInsetがずれる問題 - Qiita](https://qiita.com/peka2/items/b6301a0c06cc13286296)**
**・[TableViewがNavigationBarに潜りこんだ時の対処法 - Qiita](https://qiita.com/shotarohorai/items/ac54f5c0e7145efa6abc)**
**・[UINavigationControllerと領域拡張に潜む罠 - Qiita](https://qiita.com/glayash/items/b759bd1da0aedf8adc82)**
**・[やはりお前らのiOS7対応は間違っている(解説編) - Qiita](https://qiita.com/yimajo/items/254c7cebab7864678246)**
**・[ios - UITableView goes under translucent Navigation Bar - Stack Overflow](https://stackoverflow.com/questions/24468831/uitableview-goes-under-translucent-navigation-bar)**
**・[UITableViewを配置すると隙間ができちゃう時の対処法 | 株式会社ブリッツゲート](https://blitzgate.co.jp/blog/425/)**
**・[iOS - ScrollViewのスクロール位置を調整したい｜teratail](https://teratail.com/questions/109088)**

#### NavigationBarで追加するデメリット
`Navigation`での遷移回数が多い場合はVCごとに追加しなければいけないのでめんどくさい

# 参考記事
**・[Storyboard上のNavigationBarのTitleを変更する【Swift】 | うるおいらんど](https://uruly.xyz/storyboard%E4%B8%8A%E3%81%AEnavigationbar%E3%81%AEtitle%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E3%80%90swift%E3%80%91/)**
**・[【Swift/iOS】ナビゲーションバーのカスタマイズ | カピ通信](https://capibara1969.com/wp-content/uploads/2019/03/933-07.png)**
TypeError: Class constructor  cannot be invoked without 'new'

# const class

```javascript:エラーの出たJavaScript

const A = class {
  constructor(_a) {
    this.a = _a;
  }
}

const B = class extends A {
  constructor(_b) {
    super(_b);
  }
}

(() => {
  var b = new B("test");
  console.log(b);
})();

```

とあるJavaScriptを試したところ「TypeError: Class constructor  cannot be invoked without 'new'」が出た。

エラーの原因は何？ :thinking:


# 普通のclass

```javascript:エラーの出ないJavaScript

class A {
  constructor(_a) {
    this.a = _a;
  }
}

class B extends A {
  constructor(_b) {
    super(_b);
  }
}

(() => {
  var b = new B("test");
  console.log(b);
})();

```

普通によく見るclassならエラーが出ない。


# 判明した原因とは


<details><summary>原因</summary>
<div>

`const B = class extends A {}()`

後ろの無名関数の即時関数とくっついて`new A()`し損ねたと判定された。

constの後ろに「;」をつけてやれば解決。

</div>
</details>

# 提案

`const class`を使わないようにしよう。
知らないだけかもだがあまり見ないと思う :unamused:

「;」を省略しないようにしよう。
ブックマークレットが動かなくなるし今回のようなこともある。

自戒と反省を込めて :relaxed:
【小ネタ】amChartsのDemo sourceをVScodeなどのエディタにコピペせず、ブラウザ上でプロパティを変更し表示を確認する方法

# 概要
amChartsでグラフを作成した際に、初期値やzoomの比率などのプロパティを変更して
自分のイメージにあうか検討した際に便利な機能を見つけたので共有します。

# Open in...
[![Image from Gyazo](https://i.gyazo.com/a73ac022ca94f5fed9de289e72ffc4ab.png)](https://gyazo.com/a73ac022ca94f5fed9de289e72ffc4ab)

の・・・・
これ！！
[![Image from Gyazo](https://i.gyazo.com/8c622572ee8305c52228faa928336557.png)](https://gyazo.com/8c622572ee8305c52228faa928336557)

[![Image from Gyazo](https://i.gyazo.com/c1b9331d9deb34c290a2d7f276c6d62e.gif)](https://gyazo.com/c1b9331d9deb34c290a2d7f276c6d62e)
[![Image from Gyazo](https://i.gyazo.com/343bd08d8cac13c9a9c3f2d2189ea04d.gif)](https://gyazo.com/343bd08d8cac13c9a9c3f2d2189ea04d)
Jupyter Notebookを始める

# はじめに
Pythonの勉強でJupyter Notebookを使い始めたので、基本的な導入部分のメモ。

# Jupyter Notebookとは
Jupyter Notebookとは、

* プログラムを実行しながら結果を残せるデータ分析用ツール。
* Notebookのいう形式でブラウザを使ってコードの入力、実行が行える。
* さらに、その実行結果を残すことが可能。
* 一度書いたコードを直すのも簡単。
* 書いたコードをスクリプトファイルとして保存できる。
* 書いたコードは数分ごとに自動保存してくれる。
* 保存したファイルの共有が簡単。

という便利なデータ分析用ツール。
Jupyter Notebookのカーネルとブラウザが通信することで動くようになっている。

# インストールとカーネル起動
今回、macOSにインストール。
以下コマンドでインストールできる。

```
pip install jupyter
```

カーネルを起動。

```
jupyter notebook
```
ブラウザが立ち上がりこんな画面が表示される。<img width="1161" alt="スクリーンショット 2019-07-28 14.23.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429159/c5618bce-cfab-5b8c-d51a-ca511e86e3c4.png">

<img width="1171" alt="スクリーンショット 2019-07-28 13.37.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429159/28ff52e5-ca41-5092-15e1-e3c4162667fd.png">


# Notebookを作成する
Notebookの実体は、拡張子「.ipynb」 のファイル。
ブラウザのダッシュボードでは本のアイコンで表示されている。
<img width="1161" alt="スクリーンショット 2019-07-28 14.13.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429159/19ae75ec-fdc1-7754-112c-5b50ec58fcaf.png">

新規Notebookを作成する。
ブラウザ「New」メニューから[Python3]（環境によって表示が異なるらしい)を選択。
<img width="1161" alt="スクリーンショット 2019-07-28 14.14.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429159/5583e6c7-08eb-3310-ce1e-4b16756a9ce4.png">

新規タブに作成されたNotebookが表示される。
「セル」という入力フォームにコードを書いて実行する。
<img width="1161" alt="スクリーンショット 2019-07-28 14.16.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429159/c1477dae-8e07-f5aa-b9e8-5583f3329ac1.png">

# Notebookを終了する
[File]メニューから[Close and Halt]を選択して終了する。
<img width="1161" alt="スクリーンショット 2019-07-28 14.23.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429159/7fd04665-9f33-f42e-953a-3701c29ab33e.png">


Notebookのブラウザウィンドウを強制的に閉じて終了すると、ゾンビプロセスが残ってしまうためこの方法は避ける。
もしウィンドウを閉じた場合、ダッシュボードの[Running]タブに表示されている、実行プロセスのうち終了したいプロセスの[Shutdown]を押すことで終了できる。
<img width="1161" alt="スクリーンショット 2019-07-28 14.29.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429159/35c93449-5155-94d6-9bfa-1a193af2a644.png">
githubで共同開発 招待方法 

github共同開発したい時､
共同開発者を招待する方法｡

登場人物 Aさん､Bさん｡

####
Aさん↓
>プロジェクトのディレクトリを作成し､
>github画面からリポジトリ作成
>githubのリポジトリの画面から､招待の操作
>Settingタブ､collaborators
>collaboratorsに追加したいユーザー名（githubの）を入力し､
>Add Collaboratorsを押す｡
>(メールアドレスでも追加できます｡)
>Bさんに招待メールが届きます｡

↓
Bさん
>招待メールが届くので､メールから招待をacceptする｡

※githubに登録しているメールアドレスが分からない場合は､
ターミナルで```$git config --list```をすると､アカウント名や登録のメールアドレスなど確認できます｡
※ちなみに2019年1月からgithubのPrivateリポジトリ（鍵付きリポジトリ）の作成は無料で出来るようになっていますが､1プロジェクトあたりのコラボレーターの数は無料だと3人までです｡

参考
https://code-schools.com/github-invite/
PlayFabのUnitySDKのコールバック地獄の対応

PlayFabのUnitySDKは古いUnityにも対応するため、async/awaitではなくコールバックで結果を受け取ります。
C#SDKはasync/awaitなのですが、こちらはAndroid実機などでHttpClientを使おうとしてアプリがクラッシュします。
手っ取り早く解決するために、PlayFabClientAPIを解析して内部でUniTaskCompletionSourceを使ってUniTaskを返すWrapperメソッドの集まりを作りました。

```.cs
// こんな感じでメソッド名を洗い出す
var validMethods = new List<(string methodName, string requestType, string resultType)>();
using (var stream = File.OpenText("PlayFabClientAPI.cs")))
{
    while (!stream.EndOfStream)
    {
        var row = stream.ReadLine();
        // public static void ***(***Request...)を探す
        if (row.Contains("public static void") && row.Contains("request") && row.Contains("resultCallback"))
        {
            var temp = row.Split(new[] { "void ", "(" }, StringSplitOptions.RemoveEmptyEntries);
            var methodName = temp[1];
            temp = temp[2].Split("request", StringSplitOptions.RemoveEmptyEntries);
            var requestType = temp[0];
            temp = temp[1].Split(new[] { " Action<", ">" }, StringSplitOptions.RemoveEmptyEntries);
            var resultType = temp[1];
            validMethods.Add((methodName, requestType, resultType));
        }
    }
}
```

```.cs
// こんな感じでラッピングしたメソッドを書き出す
foreach (var (methodName, requestType, resultType) in validMethods)
{
    if (methodName.Contains("<"))
    {
        var temp = methodName.Split(new[] { "<", ">" }, StringSplitOptions.RemoveEmptyEntries);
        stringBuilder.AppendLine($"\t\tpublic static UniTask<{resultType}> {temp[0]}Async<{temp[1]}>({requestType} request, object customData = null, Dictionary<string, string> extraHeaders = null)");
    }
    else
    {
        stringBuilder.AppendLine($"\t\tpublic static UniTask<{resultType}> {methodName}Async({requestType} request, object customData = null, Dictionary<string, string> extraHeaders = null)");
    }
    stringBuilder.AppendLine("\t\t{");
    stringBuilder.AppendLine($"\t\t\treturn ToUniTask<{requestType}, {resultType}>({methodName}, request, customData, extraHeaders);");
    stringBuilder.AppendLine("\t\t}");
}
```

完成品

https://gist.github.com/yKimisaki/5a3d331a0c1db909d8e10c9ce079b25d

これで

```.cs
var result = await PlayFabClientAPIAsync.LoginWithCustomIDAsync(new LoginWithCustomIDRequest()
{
    CustomId = "0",
    CreateAccount = true,
});
```

のような感じで結果を受け取ることができます。
ジェネリクスの練習がてらEnumの逆引きをScalaで実装する

# ジェネリクスの練習がてらEnumの逆引きをScalaで実装する
[Enumの逆引きが冗長なので共通化する](https://qiita.com/dkurata38/items/830bbeb8208f5ee29cf2)でJavaによるEnumの逆引きを共通化しました。
しかし、まだまだ困難が立ちはだかるのでした。
MyBatisのTypeHandlerやSpring FrameworkのPropertyEditorSupportでcode値とEnum定数を変換するのが面倒臭すぎる。
もっとええ感じにできんかと思って挫折したのでScalaと戯れることにしました。

# 前提のコード
```RegistrationStatus.scala
sealed class RegistrationStatus(code: String)

object RegistrationStatus {
  case object Temporary extends RegistrationStatus("0")
  case object Regular extends RegistrationStatus("1")

  def values: Seq[RegistrationStatus] = Seq(Temporary, Regular)
  def searchByCode(code: String): Option[RegistrationStatus] = values.find(e => e.code == code)
}
```

## ジェネリクスを使った改良コード
### Enumを表す抽象型

```Enum.scala
/**
  * Enum定数の集合を表すトレイト
  * @tparam E
  */
trait Enum[E <:EnumConstant] {
  def values: Seq[E]
}

/**
  * Enum定数を表すトレイト
  */
trait EnumConstant
```

### code値で検索可能なEnumを表す抽象型

```EnumSearchableByCode.scala
/**
  * code値で検索可能なEnum定数の集合を表すトレイト
  * @tparam E
  */
trait EnumSearchableByCode[E <: ConstantSearchableByCode[E]] extends Enum[E] {
  def searchByCode(code: String): Option[E] = values.find(e => e.code == code)
}

/**
  * code値で検索可能なEnum定数を表す抽象クラス
  * @param code
  * @tparam E
  */
abstract class ConstantSearchableByCode[E <: EnumConstant](val code: String) extends EnumConstant

```

### 具象クラス
`RegistrationStatus#searchByCode`メソッドは親のトレイトに定義されているので、ここのEnum具象クラスに定義する必要はありません。

```RegistrationStatus.scala
sealed abstract class RegistrationStatus(code: String) extends ConstantSearchableByCode[RegistrationStatus](code)

object RegistrationStatus extends EnumSearchableByCode[RegistrationStatus] {
  case object Temporary extends RegistrationStatus("0")
  case object Regular extends RegistrationStatus("1")

  override def values: Seq[RegistrationStatus] = Seq(Temporary, Regular)
}
```

## ジェネリクスを使わなくてもできた
### Enumを表す抽象型

```Enum.scala
/**
  * Enum定数の集合を表すトレイト
  */
trait Enum {
  type EnumType <: EnumConstant
  val values: Seq[EnumType]
}

/**
  * Enum定数を表すトレイト
  */
trait EnumConstant
```

### code値で検索可能なEnumを表す抽象型

```EnumSearchableByCode.scala
/**
  * code値で検索可能なEnum定数の集合を表すトレイト
  */
trait EnumSearchableByCode extends Enum {
  type EnumType <: ConstantSearchableByCode
  def searchByCode(code: String): Option[EnumType] = values.find(e => e.code == code)
}

/**
  * code値で検索可能なEnum定数を表すトレイト
  */
trait ConstantSearchableByCode extends EnumConstant {
  type CodeType
  val code: CodeType
}
```

### 具象クラス

```RegistrationStatus.scala
sealed abstract class RegistrationStatus(val code: String) extends ConstantSearchableByCode {
  override type CodeType = String
}

object RegistrationStatus extends EnumSearchableByCode {
  case object Temporary extends RegistrationStatus("0")
  case object Regular extends RegistrationStatus("1")

  override type EnumType = RegistrationStatus

  override val values: Seq[RegistrationStatus] = Seq(Temporary, Regular)
}
```

## 余談
Dottyではenumキーワードが使えるんですね。
[Dotty Documentation -Enumerations-](https://dotty.epfl.ch/docs/reference/enums/enums.html)
Windowsでプロセッサの周波数を固定にする

# はじめに
プロセッサの周波数は処理負荷や電源状態に応じて動的に変化します。

ここではプロセッサの周波数を固定にする方法を紹介します。
固定できる周波数はProcessor Base FrequencyとCore Speedです。

プロセッサとOSは次の通りです。
Intel Core i5-5200U Processor
　Processor Base Frequency = 2200 MHz
　Core Speed = 800 MHz
Windows 10 Home 10.0.18362

# "プロセッサの最大周波数"を表示する
プロセッサの周波数を固定にするには"プロセッサの最大周波数"の設定が必要です。
しかし初期設定では表示されていない可能性があります。表示する手順を説明します。

- コマンドプロンプトを起動します。以下を入力します。

```
powercfg -attributes SUB_PROCESSOR 75b0ae3f-bce0-45a7-8c89-c9611c25e100 -ATTRIB_HIDE
```

- 設定 - システム - 電源とスリープ - 電源の追加設定 - プラン設定の変更 - 詳細な電源設定の変更

"プロセッサの最大周波数"の項目が追加されています。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84205/00e46138-b87f-9e18-b7df-12348c52bb1d.jpeg)

次の手順で非表示に戻せます。
**"プロセッサの最大周波数"に"0"を入力し、適用します。**

- コマンドプロンプトを起動します。以下を入力します。

```
powercfg -attributes SUB_PROCESSOR 75b0ae3f-bce0-45a7-8c89-c9611c25e100 +ATTRIB_HIDE
```

# Core Speedに固定化する
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84205/9223be81-590b-4113-ab15-5c6dd99efbc8.jpeg)

"プロセッサの最大周波数"に Core Speed "800"を入力します。
"最小のプロセッサの状態"に"5"を入力します。
"最大のプロセッサの状態"に"100"を入力します。
適用します。

# Processor Base Frequencyに固定化する

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84205/db219354-9fff-32ca-da0b-4fe59b40c3b9.jpeg)

"プロセッサの最大周波数"に Processor Base Frequency "2200"を入力します。
"最小のプロセッサの状態"に"100"を入力します。
"最大のプロセッサの状態"に"100"を入力します。
適用します。
VyOS 1.2.x のisoイメージをビルドしてみる

#サクッと使いたい人は
めんどくせーな人はこちらから Rolling Release がダウンロードできます。いわゆる開発版。
https://downloads.vyos.io/?dir=rolling/current/amd64

#VyOS 1.2.x
VyOS1.2.x は、vyos-buildリポジトリから構築することができますが、
iso イメージは誰でもダウンロードできるといった状況ではない模様。
※Rolling Release 除く

今回はRolling Releaseではなく、バージョンを決めてビルドを行います。
VyOS、1.2.2 がリリースされていました。
https://blog.vyos.io/vyos-1.2.2-maintenance-release?__hstc=29142691.437895315dbbf04166ea2a98a8ffece3.1564280140735.1564280140735.1564280140735.1&__hssc=29142691.1.1564280140736&__hsfp=377273393

#ビルド
ビルド方法はこちらに記載されているので参考に。
https://github.com/vyos/vyos-build/

手順を簡単にするためDockerを使います。
ビルド環境にCentOS7 + Dockerを使いました。

```
準備
# git clone https://github.com/vyos/vyos-build.git

構築環境コンテナを作成
# cd vyos-build
# docker build -t vyos-builder docker

コンテナを起動させ、ログイン
# docker run --rm -it --privileged -v $(pwd):/vyos -w /vyos vyos-builder bash
```

ここからは docker コンテナ内で行う作業です。
iso イメージは vyos-build/build 内に作成されます。

```
build-type をリリース版に、バージョンを 1.2.2 に指定
$ ./configure --build-type release --version 1.2.2 

iso イメージをビルド開始
$ sudo make iso

完了したらコンテナから抜けます
$ exit

vyos-1.2.2-amd64.iso が作成されていることを確認
# ls -l build/
合計 419900
drwxr-xr-x  2 root root         6  7月 24 20:32 auto
drwxr-xr-x  7 root root       103  7月 24 21:34 binary
-rw-r--r--  1 root root       906  7月 24 20:29 build-config.json
-rw-r--r--  1 root root    384551  7月 24 21:37 build.log
drwxr-xr-x  6 root root        95  7月 24 20:32 cache
drwxr-xr-x 21 root root       224  7月 24 21:36 chroot
-rw-r--r--  1 root root   4307491  7月 24 21:06 chroot.files
-rw-r--r--  1 root root     21745  7月 24 20:51 chroot.packages.install
-rw-r--r--  1 root root     21821  7月 24 21:05 chroot.packages.live
drwxr-xr-x 19 root root      4096  7月 24 20:32 config
-rw-r--r--  1 root root     16967  7月 24 21:34 live-image-amd64.contents
-rw-r--r--  1 root root   4307491  7月 24 21:31 live-image-amd64.files
-rw-r--r--  1 root root 419430400  7月 24 21:35 live-image-amd64.hybrid.iso　★
-rw-r--r--  1 root root   1433826  7月 24 21:36 live-image-amd64.hybrid.iso.zsync
-rw-r--r--  1 root root     21821  7月 24 21:31 live-image-amd64.packages
drwxr-xr-x  3 root root        17  7月 24 20:32 local
-rw-r--r--  1 root root         6  7月 24 20:32 version
lrwxrwxrwx  1 root root        27  7月 24 21:37 vyos-1.2.2-amd64.iso -> live-image-amd64.hybrid.iso　★
# 

```

これでビルド完了です。なおうちの環境だと3時間30分ほどかかりました。
NUC(DN2820FYK) / Mem 8GB

```
# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
#
# docker -v
Docker version 18.09.7, build 2d0083d
#
# cat /proc/cpuinfo  | grep proc | wc -l
2

```

#おまけ
```
QEMU版イメージ。ISOを作成した後に実行します。
$ make qemu

VMware版イメージ。QEMU版作成後に実行します。
$ make vmware

```
無料で　アジャイルツールが使える　Azure DevOpsはいいぞ

チームビルディングに使えるアジャイルツールがかなり一般的になってきました。

個人的にはJiraを使ってみたいのですが、
うちのチームでは使わないのと
私の会社ではBacklogが使われていますので、今回は無料で使えるものを紹介しようと思います。

https://azure.microsoft.com/ja-jp/services/devops/

こういったツールはエンタープライズものが多く、個人から簡単に使えそうなものは
実はなくて困ってました。

ただ多少（我慢すれば）使いづらさもありますが、AzureDevOpsの能力が最近向上してきたので
おすすめできるレベルになりました


昔は英語表記だけだったのですが、ようやくＨＰも日本語表記になりました。
オープンソースｐｒｏｊｅｃｔなら実質無料で使えるという素晴らしさです。

GitHubアカウントからとれるようになったのも大きいです。

早速ログインすると、プロジェクトを作れます

例）私の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46608/97e013c1-c4d7-8910-bbcc-bc49e1708523.png)


さらにプロジェクトの中に入ると以下の表示が出てきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46608/b79701bb-d117-0d54-eded-99b44f30ef11.png)

+ 概要
+ ダッシュボード
+ backlog
+ かんばん

恐らくこの機能を（無料～五名まで）を使えるのはここしかないかなと思います

さらにCICD機能の
AzurePipelinesも少ないプロダクトなら無料で使えます。

azurepilelinesについてはこちら
https://qiita.com/yamuuuuuun/items/8ceaae59bea3837c57e1


### 難点
そんなAzurePilelinesにも難点はあります。
使えれば機能は申し分ありませんが以下２つが残念過ぎます

+ UIが貧弱
+ 日本語化がほとんどされていない

私は　カンバンとバックログ機能が付いたproject管理を無料で使いたかったので
これを使いました。かつ想定人数～３人だったので

これがJiraやbacklogぐらい綺麗だったらなー・・・
Microsoftさんお願いします

といいつつJira使ってみたいので　Jira使っている人の感想お待ちしてます
【メモ】Rootless Docker



# Rootless Mode

Docker 19.03 ではまだ**実験的**扱いであるが、良い感じ。

https://github.com/moby/moby/blob/ca5aab19b482f27629374cdde4df26b5676e39cb/docs/rootless.md

**Security が高まります。**

Katacodaで試すとよろしい。
https://www.katacoda.com/courses/docker/rootless


# 使い方
ざっくりすべて一般ユーザ（rootless）で行う

* 一般ユーザで入れて（```curl -sSL https://get.docker.com/rootless |sh ```）
* 環境変数セットして
* rootlessのシェル実行（Daemon起動）して
* run する
JSの参照渡しのような、値渡し。PHPの参照渡し、値渡し。

JSの配列やobjectは参照渡しのような値渡し。
stirngやintegerは値渡し。

@shiracamus さんにコメントで教えていただきました。
>正確には、JSには値渡ししかなくて、参照渡しはできないです。オブジェクトを代入した変数にはオブジェクトの参照値が保持されていて、保持している値＝オブジェクトの参照値 を渡すので、あくまで値渡しなのです。

PHPは通常、値渡し。
&をつけて&$hogeとすると参照渡し。

JSが参照渡しになることを知らなくて、なんでだー、Vueのせいかとかいろいろやった挙げ句、バグの原因がこれだったので、あーとなった。


参考
JavaScript の配列やオブジェクトは参照渡しになる…バグを生む落とし穴
http://neos21.hatenablog.com/entry/2018/05/20/080000
アプリ画面に流れる文字列(ティッカー、マーキー)を表示する

本記事は「[デジタルサイネージアプリ「Sign!」(iOS版)とその実装機能の紹介](https://qiita.com/imj164/items/b7c585652a42350914e9)」の子記事です。

##目的
WKWebViewに流れる文字列(ティッカー、マーキーなどと呼ばれます)を表示するための、WKWebViewに読み込ませるHTML文字列を紹介します。
手順としては、まず、流れる文字列を実現するHTML文字列(String)を紹介し、その後、WKWebViewでその文字列を読み込む方法を紹介します。

##開発・実行環境
- 開発環境：macOS、Xcode(9~10)、Swift(4~5)
- 実行環境：iOS 11以上

##コード
まずはHTML文字列を定義するコードを紹介します。ほとんどがCSSの定義です。コード中に、ポイントを解説しています。

```swift:ViewController.swift
let TICKER_HTML = """
<html lang="ja">
  <head>
    <style>
      /* フォント種類、サイズ、色、背景色などはお好きに設定してください */
      * {
        /* すべてのHTMタグの余白を除きます */
        margin: 0;
        padding: 0;
      }
 
      html {
        /* Safariには、画面の向き(縦横)が変化したときに、文字サイズを適度に調整する機能がありますが、それを抑制します */
        -webkit-text-size-adjust: 100%;
      }
 
      .box {
        /* 流れる文字列を表示する範囲を画面いっぱいに設定します */
        width: 100vw;
        height: 100vh;
        /* 流れる文字列を画面の縦方向中央に表示するための設定です */
        display: flex;
        align-items: center;
      }
 
      /* 流れる文字列を収めるpタグです */
      p {
        /* 文字列が画面幅より長くても途中で途切れないように、インラインボックスとして表示します */
        display: inline-block;
        /* 文字列が途中で改行しないようにします */
        white-space: nowrap;
        /* 画面の横幅分の余白を文字列の前に取ります。これにより、画面右端から文字列が流れ始めます */
        padding-left: 100vw;
        /* 実際に文字列を流すためのアニメーション設定です。「%d」には、後ほど、流れる速さ(秒数)が入ります */
        animation: marquee %ds linear infinite;
      }
 
      /* 実際に文字列を流すための設定です */
      @keyframes marquee {
        from {
          /* 文字列の左端が画面の左端に揃っているところから流れ始めますが、先の設定で文字列の左端に100%のpaddingが入っていますので、あたかも画面の右端から文字列が現れるように見えます。なお「%%」は「%」のことです(Stringの中で%を表現するには%%と書きます) */
          transform: translate(0%%);
        }
        to {
          /* 文字列の右端が画面の左端に来るまで流します */
          transform: translate(-100%%);
        }
      }
 
    </style>
  </head>
  <body>
    <div class="box">
      %@ /* この「%@」に、後ほど、流したい文字列が入ります */
    </div>
  </body>
</html>
"""
```

以上のHTML文字列には、2箇所、値を入れるべき箇所があります。文字列が流れる秒数を指定するところ(%d)と、実際に流す文字列を指定するところ(%@)です。これらの値をString(format:)で指定しながら、WKWebViewで文字列をHTMLとして読み込むメソッド loadHTMLString() で読み込みます。

```swift:ViewController.swift
@IBOutlet weak var webview: WKWebView!

override func viewDidLoad() {
  super.viewDidLoad()
  self.webview.loadHTMLString(
    String(format: TICKER_HTML, 10, "この文字列が流れます") // 任意の秒数(ここでは10)と文字列を指定しています
    , baseURL: nil)
}
```

以上です。
#ruby #rails の #FactoryBot で association を使わずに無理やり BuildStrategy ( create / build / attributes_for ) などを反転して条件分けする例

Example of forcing condition inversion of BuildStrategy (create / build / attributes_for) forcibly without using association in #FactoryBot of #ruby #rails


```rb
FactoryBot.define do
  factory :company do
    user do
      build_stragy = self.instance_variable_get(:@build_strategy).class

      if build_stragy == FactoryBot::Strategy::Create
        create :user
      else
        build :user
      end
    end
  end
end
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2269








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【メモ】VFS Storage Driver


# VFS Storage Driver

https://docs.docker.com/storage/storagedriver/vfs-driver/

* union FSではない
* 容量とパフォーマンスにデメリットがある
* CoWは未対応
* 新しいレイヤーを作るときは「deep copy（オブジェクトとメモリの両方がコピーされる）」である
* /var/lib/docker/vfs/dir/ に配置されるが、イメージレイヤIDsとの関連性はない
* **どんな backing filesystemでも使える**
 * https://docs.docker.com/storage/storagedriver/select-storage-driver/
サービスコンテナとは

#サービスコンテナとは

・各クラスのインスタンスの生成方法を保持し,インスタンスの管理を行っている
・ビジネスロジックから要求されると、手順にしたがってインスタンスを生成し、返却する。(この返却することをresolveという)
・ビジネスロジックはサービスコンテナに対してインスタンスを要求するだけ
(newをしてインスタンスを生成する必要はない)

(通常は)

```php:sample.php
  $app_user = new AppUser;
  $app_user->hoge()
```
のようにしなくてはいけないが、サービスコンテナを使うことで、

###=>インスタンス管理を気にせずビジネスロジックだけに専念できる

流れとしては以下のようになる
1,サービスコンテナにbind
(=この名前で要求されたら、このクラスのインスタンスを返すという決まりを登録すること)
2,サービスコンテナに対して、要求
3,resolve
(要求した名前がサービスコンテナにbindされてれば、それを返却される)

#bind（登録)方法
新たにprovider内にクラスを作成してもいいが、
すでに用意されているapp/Providers/AppServiceProvider.phpに書いていく.
ここには、boot()とregister()がある。
### アプリ起動処理=>ビジネスロジック
という流れでアプリケーションは動くが、
このメソッドはアプリ起動処理時に呼ばれるため、基本的にこのboot()かregister()に書いていくことになるが、
バインド処理は基本的にregister()にかく。

```php:app/Providers/AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        app()->bind(Hoge::class,function(){
           return new Hoge();
        })
    }
}
```
上記はHoge::classという名前で、Hogeクラスのインスタンスを取得する例である。
このようにbindすることで、laravelアプリのどこからでも、以下のようにして、インスタンスを取得できるようになる

#resolve方法

bindされたclassをresolveするには、makeメソッドか、appヘルパを使用する

```php:resolve.php
<?php
$hoge = app()->make(Hoge::class)
$hoge = app(Hoge::class)

```
JSで文字列（数値、アルファベット混在を）並び替えたい

JSで文字列（数値、アルファベット混在を）並び替える方法のメモです。

配列ならソートは簡単にできそうですが、文字列だと一発でできなくて、こうやるとできます。
もっとスマートな方法がありそうですが、見つかりませんでした。

```javascript

let string = "1ab234";

string.split('').sort(function (a, b) {
	if (a > b) {
		return 1;
	}

	if (a < b) {
		return -1;
	}

	return 0;
}).join(',').replace(/,/g, '');

console.log(string) => "1234ab"

```

参考サイト
[goma
JS：配列の正しいソート方法]
(https://goma.pw/article/2015-11-18-0/)
ScrollViewについて個人的メモ

# スクロール幅取得

```swift
override func scrollViewDidScroll(scrollView: UIScrollView) {
        contentOffset = scrollView.contentOffset
}
```

#### RxSwift
```Rx-1.swift
         tableView.rx.contentOffset //contentOffsetが変化したとき実行 
             //$0がスクロール幅
            .map { hogehogeTransition($0.y) } //スクロール幅を何かしらに変換したいときはここ
            .subscribe(onNext: {
                hugahugaFunction($0.y) //スクロール幅を用いた何かしらの処理
            })
            .disposed(by: disposeBag)

```

このパターンもあるらしい
違いはあとで追記

```Rx-2.swift
         tableView.rx.didScroll
            .withLatestFrom(tableView.rx.contentOffset)
            .map { hogehogeTransition($0.y) }
            .subscribe(onNext: {
                hugahugaFunction($0.y)
            })
            .disposed(by: disposeBag)

```

# Scrollのパラメータ
こんがらがりがちな3つが図でまとまっている
**contentSize , contentOffset , frame.size**
**・[UIScrollView(UITableView)のスクロール量を計算するときに確認する図 - Qiita](https://qiita.com/darquro/items/2dae1a55d8695a400b97)**
【Vuex】firebaseでtwitterログインし、Vueインスタンス生成時に認証状態をストアに格納することでログイン維持する

## Vuexでログイン認証の状態管理をしたい
vue.jsとfirebaseでwebサービス開発をしています。
ログイン認証機能を実装するにあたって状態管理にハマりまくりました。

大筋は、下記のチュートリアルを参考に行なっております。
[Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう (6) 認証機能とVuex](https://www.hypertextcandy.com/vue-laravel-tutorial-authentication-part-3/)

[twitter](https://twitter.com/MuggyTeaa)では何度紹介したかわかりませんがめちゃくちゃわかりやすいです。。本当に感謝
こちらのチュートリアルに沿って実装つつ、**認証機能を、firebaseを使ったtwitterログインに置き換えて実装**しています。

## 環境
MacOS HighSierra
vue.js 2.9.6
firebase 6.11.0

## 前提
* vue.js・Vuex・firebase・firestoreをインストール
* firebaseを使ってtwitterログイン認証を行う
* ユーザー情報をVuexのステートに格納する方法でログイン状態を管理する

## やりたいこと
* ページをリロードしてもログイン状態を維持したい
    - ページをリロードするとVueインスタンスが再生成されるため、ステートが初期値のnullに戻ってしまうことが問題でした。

## 処理の流れ
* ページリロード・ログイン後などVueインスタンスを生成する時に毎回ログイン状態を確認する
* ユーザーが存在していたらステート更新

## 問題点
* Vueインスタンス生成時に毎回ログイン状態を確認し、ユーザーがいたらステート更新、いなかったらnullとする
    - 挙動自体はうまくいったのですが、下記のエラーが無限ループしていました。

```
[Vue warn]: Error in callback for watcher "function () { return this._data.$$state }": 
"Error: [vuex] do not mutate vuex store state outside mutation handlers."
```

## ソースコード
```index.js
// Vueインスタンスを生成する関数
const createApp = () => {
  // 認証状態を確認する
  firebase.auth().onAuthStateChanged(user => {
    if (user) {
     // ユーザーが存在していたら、ストアにuser情報を渡す
      store.dispatch('auth/currentUser', user)
    } else {
     // いなかったらnull
      store.dispatch('auth/currentUser', null)
    }
  })

  new Vue({
    el: '#app',
    'router': router,
    'store': store,
    components: { App },
    template: '<App/>'
  })
}
// 最後に関数実行
createApp()
```

```auth.js
const actions = {
  currentUser (context, user) {
    if (!user) {
      context.commit('setUser', null)
    } else {
        // ステート更新
        context.commit('setUser', user)
      })
    }
  }
}

const mutations = {
  setUser (state, user) {
    // ユーザー情報を更新
    state.user = user
  }
}
```

## 原因と解決方法
「ミューテーションハンドラの外で変更するな」って怒られてる・・なんだこれってなってたんですが、違いました。

**`firebase.auth().onAuthStateChanged` の戻り値 `user` をそのままセットしていたのが原因** でした。
`user`に含まれている情報を改めて連想配列にセットし直すことで解決。

```auth.js
const actions = {
  currentUser (context, user) {
    if (!user) {
      context.commit('setUser', null)
    } else {
      // userで得られた値でストアに入れたい情報をセットする
      const currentUser = {
          'displayName': user.displayName,
          'photoURL': user.photoURL,
          'uid': user.uid,
      }
      // ステート更新
      context.commit('setUser', currentUser)
      })
    }
  }
}
```

こちらを読んで思い至りました。
[Vuex.store.stateの値をmutationsで変更しようとしたら、mutationsを使わずに値を変えるなと怒られた](https://qiita.com/TaskKAWAHARA/items/2394d72ba7051e80e7fd)

```
// エラーメッセージ
[Vue warn]: Error in callback for watcher "function () { return this._data.$$state }": 
"Error: [vuex] do not mutate vuex store state outside mutation handlers."
```
コールバック関数の戻り値でエラーを吐いているみたいなことが一文目に書いてありますね・・。

## まとめ
Vueインスタンス生成時に認証状態を確認し、ステート更新処理を入れることで、ログイン状態を維持することができるようになりました。
firebaseを使うことによってOauth認証部分が楽チンに実装できるので嬉しいですね。
その分、firebaseの特性を知らないと思わぬところでハマるなあと思う日々であります。
同時に、今回初めてSPA書いているのですが、SPAの特性もよく理解する必要があるなぁと思うことしきりです。

勉強になりました。

おかしなところがあったら、コメント欄か、[twitter](https://twitter.com/MuggyTeaa)でお教え頂けたら幸いですm(__)m
git submodule を削除する方法

`git submodule add`で追加したリポジトリを削除する方法のメモ。
間違っているかもしれません。

1. `git submodule deinit -f <path>`
2. `.gitmodules` `.git/config`から対応する行を削除する。
3. `.git/modules/<path>`を削除する。
4. `<path>`を削除する。
5. 変更をコミットする。

なお、既にあるsubmoduleのURLを変更したい場合も、一度削除してから追加すればよいのではないかと思います。
iPadでアクションシートが開かない問題に対処する

本記事は「[デジタルサイネージアプリ「Sign!」(iOS版)とその実装機能の紹介](https://qiita.com/imj164/items/b7c585652a42350914e9)」の子記事です。

##目的
iPadでアクションシート(.actionSheet)タイプのダイアログ(UIAlertController)が開かない場合の対処方法を説明します。

##開発・実行環境
- 開発環境：macOS、Xcode(9~10)、Swift(4~5)
- 実行環境：iOS 11以上

##コード
別の記事「[ダイアログを表示する](https://qiita.com/imj164/items/de6595bae05b3ecb0cbc)」で、ダイアログ(UIAlertController)を生成する際、「preferredStyle」に「.actionSheet」を選択できることを書きましたが、iPadでアクションシート(.actionSheet)を開くには、present()を実行する前に、1行加える必要があります。

```swift:ViewController.swift
override func viewDidAppear(_ animated: Bool) {
  super.viewDidAppear(animated)
  let dialog = UIAlertController(title: "Dialog Title", message: "Message is here", preferredStyle: .actionSheet)
  dialog.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
  dialog.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
  dialog.popoverPresentationController?.sourceView = self.view  // この行を追加
  self.present(dialog, animated: true, completion: nil)
}
```

iPadの場合、アクションシートはポップアップメニュー的に扱われますが、ポップアップする対象のビュー(.sourceView)を指定する必要があり、上記「この行」が、それに該当します。この例では、ViewControllerのviewを指定しています。
ちなみに、ダイアログは以下のようになります。
![1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162131/75101892-3815-2f6e-f714-68a6381e7a10.png)

iPad画面の左上に表示されます。ステータスバーに食い込んでいるのはご愛嬌(サンプルプログラムのViewのレイアウト指定をサボりました)。
ちなみに、「Cancel」は表示されません。ダイアログの外をタップすると、「Cancel」が選択されたものとして処理されます。

以上です。
ダイアログを表示する

本記事は「[デジタルサイネージアプリ「Sign!」(iOS版)とその実装機能の紹介](https://qiita.com/imj164/items/b7c585652a42350914e9)」の子記事です。

##目的
複数の選択肢を持つダイアログ(UIAlertController)を開き、特定の選択肢を選んだときに、何らかの処理を行うためのコードを紹介します。

##開発・実行環境
- 開発環境：macOS、Xcode(9~10)、Swift(4~5)
- 実行環境：iOS 11以上

##コード
まず、コード例と、実際に表示されるダイアログのイメージを紹介します。
便宜上、ViewControllerのviewDidAppeared()でダイアログを生成し、表示させます(アプリを起動するといきなりダイアログが開きます)。

```swift:ViewController.swift
override func viewDidAppear(_ animated: Bool) {
  super.viewDidAppear(animated)
  // ダイアログ(AlertControllerのインスタンス)を生成します
  //   titleには、ダイアログの表題として表示される文字列を指定します
  //   messageには、ダイアログの説明として表示される文字列を指定します
  let dialog = UIAlertController(title: "Dialog Title", message: "Message is here", preferredStyle: .alert)
  // 選択肢(ボタン)を2つ(OKとCancel)追加します
  //   titleには、選択肢として表示される文字列を指定します
  //   styleには、通常は「.default」、キャンセルなど操作を無効にするものは「.cancel」、削除など注意して選択すべきものは「.destructive」を指定します
  dialog.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
  dialog.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
  // 生成したダイアログを実際に表示します
  self.present(dialog, animated: true, completion: nil)
}
```

実行するとこのようなダイアログが表示されます。
![1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162131/42bd2d4d-4bbf-05f5-0d16-fdce2d867eda.png)

なお、ダイアログを生成する行の「preferredStyle」に「.actionSheet」を指定すると、iPhoneの場合は、以下のようなメニューが画面下からせり上がるように表示されます。用途に合わせて使い分けてください。
![2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162131/b91f7ac1-e678-c362-10c5-7ffe1daa094f.png)

ところで、このコードのままでは、「OK」や「Cancel」を選んでも、単にダイアログが閉じるだけで、何の処理もされません。選択肢をタップすると何らかの処理をする場合は、addAction()のhandlerをnilにせず、コードを書く必要があります。
ここでは、「OK」をタップすると、画面の色がランダムに変わるようにしてみます(実用性はありませんが)。
※「OK」に該当するaddAction()のみ記述しています。

```swift:ViewController.swift
dialog.addAction(UIAlertAction(title: "OK", style: .default,
  handler: { action in
    self.view.backgroundColor = UIColor(
      red: CGFloat(Float.random(in: 0.0 ... 1.0)),
      green: CGFloat(Float.random(in: 0.0 ... 1.0)),
      blue: CGFloat(Float.random(in: 0.0 ... 1.0)),
      alpha: 1.0)
  }))
```

以上です。
Image Literal, Color Literalの活用法

# うまく補完してくれないとき
`Color Literal`の場合は特に`color...`と途中までタイプした時点で補完機能によって
`Color Literal`が候補に上がってくれないと非常に使いにくいが
参照が入れ子になっていて、候補に上がってくれない時

```before.swift
//imageFromColorは自作関数 //color litral...とタイプしていっても補完してくれないときある
let hogehogeBackImage = UIImage.imageFromColor(color: #colorLiteral(hogehuga))
```

```after.swift
//参照が入れ子でなければうまく補完してくれる
let backColor = #colorLiteral(hugahuga)
//参照するか、右辺だけコピペする
let hogehogeBackImage = UIImage.imageFromColor(color: backColor)
```

# alphaを動的にいじりたいとき
一回Literalにするとパネル表示になるので、パラメータを動的に変化させたいときどうすんの？となる
(そもそもLiteralは見た目をVC側で見ながらやりたいものなので、rgbも変化させたいものには入れたくなくなりがちでは？)
→でも`alpha`ぐらいはいじりたいときある、、、

```swift
let backAlpha = hugahuga //ここ計算式にすれば動的に変化させられる
let backColor = #colorLiteral(hugahuga).withAlphaComponent(backAlpha)
```


# 参考記事
**・[Xcode 8 の新機能！画像と色のリテラル、画像のコード補完 ｜ DevelopersIO](https://dev.classmethod.jp/smartphone/iphone/xcode-8-image-and-color-literals/)**

あとで追記
HTTP Webページを読み込めるようにする

本記事は「[デジタルサイネージアプリ「Sign!」(iOS版)とその実装機能の紹介](https://qiita.com/imj164/items/b7c585652a42350914e9)」の子記事です。

##目的
WKWebViewで「HTTP」でアクセスするWebページを読み込むための設定を紹介します。

##開発・実行環境
- 開発環境：macOS、Xcode(9~10)、Swift(4~5)
- 実行環境：iOS 11以上

##設定
Xcodeのナビゲータエリア上部のフォルダアイコン(一番左)をクリックし、表示されるツリーの中のプロジェクトルート(一番上)をクリックします。さらに、エディタエリア上部の「Info」をクリックし、「Custom iOS Target Properties」のうちのいずれかの項目にマウスカーソルを合わせると表示される「+」マークをクリックします。
![1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162131/9f068a21-c1f3-3add-513f-c2f6f6724712.png)

開いたプルダウンから「App Transport Security Settings」を選びます。
![2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162131/b88b042b-14ca-b5ee-c4d2-87900c5642ca.png)

さらに、追加された「App Transport Security Settings」にマウスカーソルを合わせると表示される「+」マークをクリックします。
![3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162131/237e9130-f918-230a-506f-4ff7da4d0ab4.png)

開いたプルダウンから「Allow Arbitrary Loads in Web Content」を選びます。
![4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162131/cccc01cd-8a14-ce86-36d6-972592c81de9.png)

さらに、その値(Value)を「Yes」にします。
![5](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162131/12eeb1f2-dba2-248e-8526-09d72b8ad97a.png)

以上です。
v-forで回している選択肢に、動的に色をつけたいときに簡単に書く

v-forで回している選択肢に、動的に色をつけたいときに簡単に書く。


```javascript

v-for="(hoge, key) in hoges"
:class="{'hoge-color': key === current_key}"

<script>

	data() {
		return {
			current_key: 0, // 初期表示のとき
		}
	}
```

```'hoge-color': key === current_key```ここのロジックをメソッド化してもいいけど、めんどいのでこう書いた。
Oculus Questで「アップデート中」が出た場合の対処法

## はじめに
Questのアプリ起動した時にこの画面が出たら・・・
![IMG_4575.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436651/d2788414-7d60-8b79-4581-5df58a909c15.jpeg)

##※お持ちのQuestは正常です！　とりあえず待ちましょう！！
[過去にOclus公式にてバージョンについての記事がありました](https://forums.oculusvr.com/community/discussion/76922/quest-download-queue-issue#latest)
Oclus公式曰く、正常なこと<br>（Questは、Wifi接続で自動アップデートされるらしい）です。
##待つ時の注意点
####**①Oculus本体の電源はONに。**<br>
####**②アップデート中は常時Wifi接続をする。**<br>
####**③OculusQuestを被らない。**
（額センサーが触れているときはアップデートを一時中断してるみたい）<br>
####**④念の為、Oclus公式ページにてアップデート情報を確認する。**

<br>以上のことに注意し、約4、5時間待ちましょう！！


私はこの方法でアップデートが終わってました(^ ^)
##おわりに
私はQuestからVRデビューしたので、
「え、Questおかしくなったの？」と思いつつ、<br>Twitterでサーチしまくりましたが正誤判断できず...(T ^ T)ｶﾅｼｲ
<br>同じ体験をされた方の力になれればと思い、本記事を書きました。
それでは、良いQuestライフを！！

##参考にさせていただいたURL
・[Oculus Quest のソフトが「ダウンロード待ち」状態のままでインストールできない現象の解決策](https://bright-b.com/oculus-quest-download-queue-10932/)
・[Oculusサポートページ「クエストダウンロードキューの問題」]
(https://forums.oculusvr.com/community/discussion/76922/quest-download-queue-issue#latest)
・[Oculusコミュニティフォーラム](https://forums.oculusvr.com/community/)
文系学生のプログラミング学習ー7日目ーPython初心者


前回の更新からだいぶ空いてしまいましたが、さぼっていたわけではありません。
諸事情により更新出来ませんでした。
今まで、JavaScriptやjQueryなどフロントエンドの言語を勉強していましたが、Pythonを勉強することにしました。
Qiitaをメモ代わりに使って良いのか分かりませんが、学習したことを復習するために書きたいと思います。

#初めてのPython

基礎的な部分はscratchと呼ばれるブロックを組み立ててコードを動かすものでやったので、それをPythonに応用する形でいろいろつくりましたので、いくつか紹介したいと思います。

#1~nまでの数字を表示する

```
def count_up(num):
    for i in range(1, num+1):
        print(i)
```

ポイントはforループのrangeの部分です。Scratchでは１～１０まで表示したかったら、range(1, 10)としたのですが、pythonではnum+1をカウントしないのでnum+1としなければなりません。

#言葉の順番を逆さにする

```
def reverse_string(string):
    index = len(string) - 1
    reversestring = ''
    while index >= 0:
      reversestring += string[index]
      index -= 1
    return(reversestring)
```

関数indexに最後の文字の順番を入れ、それが０になるまで、低くしていきます。Appleであれば、e→l→p→p→Aという順番に格納されていくので、elppAとなります。


すべて紹介しきれなかったので、また次回に投稿します。
おわり
can not set reatcive property on undefined,Vueで複数選択可のチェックボックスを実装するときのエラー

Vueで次のエラーを解消するための一つの方法。
ノートのメモなので動かしてないので、違ってたらすみません。

Vueで複数選択可のチェックボックスを実装するときのエラーです。

結論を言うと、dataにあらかじめ定義してないよというエラーみたい。
dataにあらかじめ定義してなくてもよい場合と、定義してないといけない場合があるみたい。

```
can not set reatcive property on undefined, null, or primitive.value
```


```vue

<label
	v-for="(hoge, key) in hoges"
	:key = "key"
	:for = "key"
>
<input
	type="checkbox"
	v-model="hoges.hoge_id"
	:value="hoge.id"
	id="index"
>
{{ hoge.names }}

<script>

data: ~ 中略
// 定義しておく
	hoges: {
		hoge_id: []
	}


```
#Ruby / #Rails の #FactoryBot で association 記法を使わずに create と attributes_for の挙動を使い分ける例

#Ruby / # Rails #FactoryBot example of using create and attributes_for behavior without using association notation


```rb
FactoryBot.define do
  factory :user do
    book do |factory_bot|
      if factory_bot.attribute_lists?
        nil
      else
        create :book
      end
    end
  end
end
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2268








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Coursera Machine Learning Stanford Univ. Week7

5週目と同様こんなん出ました
![week7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160145/e0caa2ab-329b-7e93-60fe-6e7433d1799f.png)
ここは重要ってことですね。

今週のテーマはSupport Verctor Machine SVMです
Logistic regressionで使ったCost functionからSVMで使われるCost functionへの変形する形で説明してくれています。そしてGaussian Kernelの説明に進みます。
Week6でふれたHigh Bias, High Varianceの関係がこのSVMのCost functionのCとσを変えるとどのような関係になるかがテストにも出てきます。プログラミング課題でも最適なCとσの組を選びなさいという問題になっています。

今週のexcerciseの提出物は2つのパートに分かれていて下記の4つです

1. ガウシアンカーネル
    2. [?] gaussianKernel.m - Gaussian kernel for SVM
    3. [?] dataset3Params.m - Parameters to use for Dataset 3
4. スパムの検出
    5. [?] processEmail.m - Email preprocessing
    6. [?] emailFeatures.m - Feature extraction from emails

##ガウシアンカーネル
特にはまるところはありませんでした。dataset3Paramsの方はpdfに書いてあるパラメータで一番良い組み合わせを選べばいいんだなということでfor文で8x8回繰り返して
mean(double(predictions ~= yval));
が最小になる組み合わせを選択。
8x8のerrorsというマトリクスに上のmeanを保存して置いて最小の組み合わせのインデックスを求め、それに対応するC,sigmaを返せばよい。
マトリクスの要素の最小値を探してそのインデックスを探す方法はfor文回すのは無しとするとoctaveでどうやるやるのかわからずgoogleさんで探して下記のようにしました。
マトリクスをシリアライズして最小となるindexを探して元のマトリクスの行、列の値に変換という方法です。
[e_min, ind] = min(errors(:));
[i, j] = ind2sub(size(errors), ind);

##スパムの検出
メールの本文を加工してスパムに特徴的なものをvocabulary listにあるものがメールに含まれていれば1、含まれていんなければ0のword_indiciesリストを作ってSVMにくわせるというもの、主要な部分は作られているので自分で書かなければならないコードはほとんどありません。
課題のコードを書くことよりどういうことをやっているのか実際のコードをみて覚えるということですね。