OmniAICreator/Qiita-1.07M huggingface dataset:
#golang 列挙定数のコメントからNameメソッドを自動生成する

# はじめに

```
type HogeType int

const (
	HogeTypeA HogeType = 0 // A
	HogeTypeB HogeType = 1 // B
	HogeTypeC HogeType = 2 // C
)
```

みたいな列挙定数があったときに、各定数のコメントを元に

```
func (src HogeType) Name() string {
	switch src {
	case HogeTypeA:
		return "A"
	case HogeTypeB:
		return "B"
	case HogeTypeC:
		return "C"
	default:
		return fmt.Sprintf("%v", src)
	}
}
```

の様なメソッドを生成するツールを作りました。
（正確にいうとメインで書いたのは自分ではなく会社の別メンバーですが、許可を得て自分が記事にしますm(_ _)m）

定数追加時の修正漏れが防げます。

https://github.com/knightso/enameg


# インストール

`$ go get github.com/knightso/enameg/cmd/enameg`

# 使い方

type定義の前に `// +enameg` というコメントを書きます。

```
// +enameg
type HogeType int
```

そしてコマンド実行します。

`$ enameg <ファイルまたはディレクトリ名>`

<ファイル名>_ename.go というファイルにNameメソッドが出力されます。

go generate利用例↓

```
//go:generate enameg $GOFILE

// +enameg
type HogeType int

const (
	HogeTypeA HogeType = 0 // A
	HogeTypeB HogeType = 1 // B
	HogeTypeC HogeType = 2 // C
)
```

# その他

自動生成部分に gowrtr というライブラリを利用させてもらいましたm(_ _)m

https://github.com/moznion/gowrtr
https://moznion.hatenadiary.com/entry/2019/01/14/111719

import文の要不要を考えなくてよくなったり、生成部品の再利用がしやすかったりととても便利なツールでしたが、正直今回の様な小規模生成ツールだとtext/templateでもよかったかな、と思いました(^_^;
もっと大規模で複雑な生成だと威力を発揮しそう。
Reactアプリで本番環境に展開後の初回限定で正常表示できないなら原因はこれ

# 概要

Reactアプリで本番環境に展開後、初回に限って画面が真っ白くなることがありました。
コンソールでは何かのJSファイルのトークン不正の旨のメッセージだったように記憶しています。
一度リロードすると問題なくなります。
本番環境に更新したファイルを展開したときのみ発生します。
しかもIEでは発生せずという状況です。
原因はService WorkerがJSファイルをキャッシュしていないことによるものでしたが、どうしてそういうことになってしまったのかという話です。


# 読者対象

- Reactアプリで本番環境に展開後の初回限定で正常表示できずに困っている（画面は真っ白、コンソールはJSファイルのトークン不正の旨）
- Service Workerを有効化している。
- CreateReactAppでビルドしている。
- IEでは問題ないのだが・・・


# Road to 解決

## 本番環境に展開した時しか発生せず初回のみというレアパターンに難儀

本番環境に展開した時しか発生せず、初回のみというレアパターンに難儀しました。
本番環境への調査は難しいので、発生する状況を作り出すのにはしばらく時間を要した記憶があります。
Service WorkerはSSL環境でないと利用できないですが、localhostに限っては例外で利用できるため、それで調査したはずです。


## JSファイルなのに＜？？？

ネットワークの通信を見ていくとJSファイルが不正とのエラーだったと記憶しています。
JSファイルはあるし、＜って意味わからんとここでも時間を要しました。
しかし、よく見てみるとmain.jsはハッシュ値をファイル名に含みますが、どうも取りに行っているのファイルと生成したmain.jsとのハッシュ値が異なることに気が付く。
更に調べていくと、取りに行っているのは前回リリースしたmain.jsファイルであることが判明。


## Service Workerはキャッシュする＆更新されていてもすぐに反映しない

Service Workerはmain.js等をキャッシュします。故に速い。
そして、Service Workerはサーバーのファイルが更新されていると裏で取り込みますが、それを反映するのは次回（リロード含む）です。
それが理解できていると、前回リリースしたmain.jsファイルを取りに行っているのは正常な動きであることがわかります。
（よくわかっていなかったので少し時間を使いました(;^_^A）
ではファイルが存在しないのか？という問題になります。


## 本番環境展開時に前回のmain.jsは削除していた

リリース作業にはかかわっていなかったので確認したところ、リリースの際に前回のmain.jsは削除していることを確認。
つまり、サーバーに前回のmain.jsがないのだからエラーになるのは当たり前という結論に。
ではファイルがないのにトークン不正とはどうして？という疑問になりますが、Service WorkerなのかExpressが404のためHTML返していた気がします。
そりゃ解読不能ですよね( ´ー｀)y-~~


## ちょっとおかしくないか？

結論は出たのですが、もし以下の疑問が浮かんだのなら鋭いです。

『Service Workerってキャッシュするんだから、サーバーにファイルなくともmain.js持っているはず。』

だってService Workerはオフラインにも対応できるようキャッシュが当たり前。
キャッシュしていないならオフライン動作なんてできないのだから。

これは少し古いですが、issueがあります。
https://github.com/facebook/create-react-app/issues/2612
要約すると、バンドルサイズが2MB超過するとキャッシュしないよう、CreateReactAppが仕分けしています／(^o^)＼
（現在どのような動作になるのかは把握していません、あくまで当時の話です）
当時コード分割は後手に回っていて、main.jsのサイズは2MB超過していました。
そのため、この制限に引っかかっていたのです。
適切にコード分割されていればこの問題に遭遇しなくて済んだのですがorz


## おまけ　どうしてIEは問題なかったのか

IEはService Workerサポートしていないので、常にサーバーに問い合わせます。
最新のみ取りに来るなら、最新のmain.jsがサーバーにあるので、それは正常に描画しますよね、すごいぜIE＼(^o^)／


# まとめ

main.jsのサイズが大きくてService Workerにキャッシュされない悲劇の話でした。
対応策としてはコード分割してService Workerにキャッシュしてもらうのがベスト。
仮に分割できなくてどうしても無理という場合には、過去のmain.jsを置いておけば回避は可能。
ただし、クライアントはどの時点のmain.jsを要求するか不明のため、直近のmain.jsだけだと、2世代以上前のService Workerはサーバーにないファイルを取得しようとして同じことが発生するΣ(￣ロ￣lll)ガーン
奥の手としては時代に逆行覚悟でService Workerを利用しない・・・(;^_^A

どなたかの助けになれば幸いですm(__)m
【Kotlin】最近のコルーチン事情

最近始めたばかりのプロジェクトで、コルーチンをいい感じに使えるようになってきたので知見を共有しようと思います。

#バックグラウンドで処理からのViewに反映
MVVMアーキテクチャを用いたプロジェクトを想定してます。
リポジトリの準備。今回はQiitaのapiを叩いてみます。

```kotlin
// Response
data class SampleItem(
    @Json(name = "id")
    val id: String,
    @Json(name = "title")
    val title: String
)
```
```kotlin
// Request
@GET("items")
fun items(
    @Query("page") page: Int,
    @Query("par_page") perPage: Int
): Deferred<List<SampleItem>>
```
```kotlin
// コルーチン内で呼びます
suspend fun getItemList(): List<SampleItem> {
    return items(page = 1, perPage = 10).await()
}
```

バックグラウンドでのコルーチンの処理状態を、View側で検知するための状態を定義します。

```kotlin
sealed class Status<out T> {
    object Loading : Status<Nothing>()
    data class Success<T>(val data: T) : Status<T>()
    data class Failure(val throwable: Throwable) : Status<Nothing>()
}
```

コルーチンをViewModel内で実行します。

```kotlin 
class SampleViewModel() {

    // 本当はインジェクションとか使う
    private val sampleRepository = SampleRepository()

    private val _status = MutableLiveData<Status<List<SampleItem>>>()
    // View側の監視対象
    // 既存値と同じ値が設定されても通知されないようにする
    val status = _status.distinctUntilChanged()

    init {
        load()
    }

    private fun load() = viewModelScope.launch {
        // 初期状態にLoadingを設定
        _status.value = Status.Loading
        // IOスレッドで処理を実行
        runCatching { withContext(Dispatchers.IO) { sampleRepository.getItemList() } }
                // 成功（完了）したら状態をSuccessに変更
                .onSuccess { _status.value = Status.Success(it) }
                // 失敗したら状態をFailureに変更
                .onFailure { _status.value = Status.Failure(it) }
        }
}
```

あとはViewModelのstatusをView側で監視してやれば、めでたく非同期処理が完了です。

```kotlin
class SampleActivity : AppCompatActivity() {
    
    // 本当はDIとか使ってください
    private val viewModel = SampleViewModel()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.sample_activity)
        // ViewModelのstatusを監視して、変化があった場合にonStateChangedを実行します
        viewModel.status.observe(this, Observer { onStateChanged(it) })
    }

    private fun onStateChanged(it: Status<List<SampleItem>>) = when(it) {
        is Status.Loading -> {
            // 処理中の処理
        }
        is Status.Success -> {
            // 成功（完了）後の処理
            // it.dataで取得した値を参照したり
        }
        is Status.Failure -> {
            // 失敗後の処理
            // it.throwableでエラー処理とかできる
        }
    }
}
```

#まとめ
だいぶフレンドリーな感じに仕上がってきました。今後もコルーチンは使い続けていくはずなので、この機会に覚えておくといいかもです。
NuxtでGoogleアナリティクス（gtag.js）を実装する

# はじめに
Nuxtで作ったサイトにGoogleアナリティクスを入れる方法です。
いろいろ記事はありますが、Googleアナリティクスの最新のタグ形式（2019年2月13日）である
__gtag.js__を使用したものがあまりなかったのでまとめます。
（GTMを使う場合はまた別の方法で入れてください）

# gtag.jsを利用してGA計測をするための手順
プロジェクトに@nuxtjs/google-gtagをインストールします。

### モジュールのインストール
```bash
$ npm install --save @nuxtjs/google-gtag
```
これはnuxtコミュニティ公式のものです。
https://github.com/nuxt-community/google-gtag

### nuxt.config.jsの設定
```js

  modules: [
    [
      '@nuxtjs/google-gtag',
      {
        id: 'UA-XXXXXX-XX', //あなたのGoogleアナリティクスのプロパティID
        debug: true //本番環境以外でもGAを有効にしたい場合はtrueに。
      }
    ]
  ],
```

これだけで、全ページでGAのページビューが飛ぶようになります。
他に細かい設定を行いたい場合は、上のURLからオプションを確認してください。
複数GAアカウントを設定できたり、クロスドメイントラッキングの設定もできます。

### イベントやeコマースを取得したいとき
vueファイル内で、下記のように記述することで自由にイベント等を取得できます。
__this.$gtag__という関数で飛ばすことができます。

```js
this.$gtag('event', 'クリック計測', {
  'event_category': 'SNSボタンクリック',
  'event_label': 'twitter',
  'value': 1
});
```
公式のイベント取得方法はこちら↓

__Google アナリティクスのイベントをトラッキングする__
https://developers.google.com/analytics/devguides/collection/gtagjs/events?hl=ja

# おまけ（.envでのGAIDの管理方法）
これは拡張eコマースのテスト用に作ったリポジトリです。
https://github.com/tochiji/ga-ecommerce-test-nuxt

このリポジトリでは、GAのプロパティIDを「.env」ファイルで管理しています。
「.env」ファイルはローカルに存在しており、リポジトリに上がっていません。

「.env」ファイルで管理することで、重要な変数を別ファイルにまとめておくことができます。
github等にソースコードをアップロードするときにGAIDをソースコードから分離することができます。

### nuxtで.envを使用するための準備
```bash
$ npm install --save @nuxtjs/dotenv
```

### .envファイルの作成
「.env」という名前のファイルを作成し、下記内容を入力してください。

```.env
# テストしたいGAのID（プロパティID）を入力

GAID=UA-XXXXXXXXX-X
```
このファイル自体がgithub等にアップされてしまわないよう、.gitignoreに「.env」と記述しましょう。
※「create-nuxt-app」で環境構築をした場合は、初めから記述されているので安心です。

### nuxt.config.jsでの設定
```js
require('dotenv').config() //dotenvを使用するために必要

module.exports = {
...
  modules: [
    '@nuxtjs/dotenv', //この一行を追加
    [
      '@nuxtjs/google-gtag',
      {
        id: process.env.GAID, //この形式で「.env」ファイル内の変数が使える
        debug: true
      }
    ]
  ],
...
}
```

#おわりに
上記のように簡単に入れられるので、nuxtでサイト作っている人は試してみてください。
UnityBoyomichanClient  Unityから棒読みちゃんを操作するライブラリ

# UnityBoyomichanClient

Unityから棒読みちゃんを操作するライブラリを作ったので公開します。

* [UnityBoyomichanClient](https://github.com/TORISOUP/UnityBoyomichanClient)

MITライセンスです。

# できること

 * テキスト読み上げ
 * 一時停止
 * 一時停止解除
 * 読み上げスキップ
 * 残りタスク全消去
 * 一時停止状態の取得
 * 残タスク取得
 * 読み上げ状態取得

# 使い方

`Task`ベースなため、.NET 4.xモード以降が利用可能なUnityでのみ動作します。

```cs
private async Task SpeechSample()
{
    // クライアント初期化
    var _boyomiClient = new BoyomichanClient("127.0.0.1", 50001);

    await _boyomiClient.TalkAsync(
        message: "これはサンプルです",
        speed: -1, // -1で棒読みちゃん側の設定
        volume: -1,// -1で棒読みちゃん側の設定
        pitch: -1, // -1で棒読みちゃん側の設定
        voiceType: VoiceType.DefaultVoice,
        cancellationToken: default(CancellationToken));

    // 読み上げが終わるのをまつ
    while (await _boyomiClient.CheckNowPlaying())
    {
        await Task.Delay(TimeSpan.FromSeconds(0.5f)); //0.5sごとに確認
    }

    Debug.Log("Done");
}
```
Swift：while文で変数に代入した結果を条件式にする

```c:C言語とかでのやり方
int valueA = 0;
while ( (valueB = function(valueA) ) != 0 ) {
    // do something to valueA
}
```

```Swift:例
var valueA = 0
while case let valueB = function(valueA), valueB != 0 {
    // do something to valueA
}
```
caseをつけるとできるらしい．
NVMを使ってNode.jsをWindowsにインストールする

# NVMを使ってNode.jsをWindowsにインストールさせます

![node-js-736399_960_720.png](https://qiita-image-store.s3.amazonaws.com/0/102978/1a45cb54-558e-98e0-f9bd-1092d485c50e.png)

# 目的

Node.jsの実行環境を構築することです。

# 手順

1. ZIPをダウンロード
2. nvm-setup.exeを実行
3. nvmがインストールされたことを確認
4. Node.jsをNVM経由でインストールする
5. インストールしたNode.jsを有効にする

# 1. ZIPをダウンロード

下記のリンクより『nvm-setup.zip』をダウンロードします。
[Releases · coreybutler-nvm-windows](https://github.com/coreybutler/nvm-windows/releases)

# 2. nvm-setup.exeを実行

ダウンロードしたZIPを解凍します。
解凍したフォルダ内の『nvm-setup.exe』を実行します。

# 3. nvmがインストールされたことを確認

コマンド・プロンプトを開き下記のコマンドを実行します。バージョン情報が出力されると思います。
もし、バージョン情報が出力されない場合は上記のインストールに失敗しています。

```cmd
C:\Users\ymzk-jp> nvm version
1.1.7
```

# 4. Node.jsをNVM経由でインストールする

まず、コマンド・プロンプト上で下記のコマンドを実行し利用可能なNode.jsのバージョンを確認します。

```cmd
C:\Users\ymzk-jp> nvm list available
```

下記は出力の一例です。この一覧は利用可能なNode.jsのバージョン一覧です。特にこだわりがない場合、LTSの一番上のものを使用することをお勧めします。本投稿の場合ですと『10.15.1』が該当します。

```cmd

|   CURRENT    |     LTS      |  OLD STABLE  | OLD UNSTABLE |
|--------------|--------------|--------------|--------------|
|    11.9.0    |   10.15.1    |   0.12.18    |   0.11.16    |
|    11.8.0    |   10.15.0    |   0.12.17    |   0.11.15    |
|    11.7.0    |   10.14.2    |   0.12.16    |   0.11.14    |
|    11.6.0    |   10.14.1    |   0.12.15    |   0.11.13    |
|    11.5.0    |   10.14.0    |   0.12.14    |   0.11.12    |
|    11.4.0    |   10.13.0    |   0.12.13    |   0.11.11    |
|    11.3.0    |    8.15.0    |   0.12.12    |   0.11.10    |
```

次に、下記のコマンドで該当のNode.jsをローカルにインストールします。

```cmd
nvm install 10.15.1
```

# 5. インストールしたNode.jsを有効にする

インストール完了後、インストールしたNode.jsを下記のコマンドによって有効化させます。許可を求めれれるかもしれませんが、Yesで次に進んで下さい。

```cmd
nvm use 10.15.1
```

有効化実行後、下記のコマンドでインストールが成功していることを確認します。

```cmd
C:\Users\ymzk-jp> node --version
v10.15.1
```

Node.jsのバージョンが正しく出力されればインストール完了です。

---

コマンドプロンプト上で`node`と入力することで対話モードのREPL（Read eval print loop）が実行されます。
試しに簡単な操作を行ってみます。

```js
C:\Users\ymzk-jp> node
> 1+1
2
> const ary = [0, 0, 1]
undefined
> ary
[ 0, 0, 1 ]
> console.log(ary[2])
1
undefined
>
(To exit, press ^C again or type .exit)
>

C:\Users\ymzk-jp>
```

**※ 終了させる場合は `Ctrl + C`を2回連続で入力します。**

--- 

NVMがなくてもNode.js単体で扱うことは可能です。
NVMとはNode.jsのバージョンを管理するツールの一種です。Node.js本体ではありません。

NVMを使用する理由、メリットを説明しておきます。
Node.jsは上記で確認しましたように多数のバージョンがあります。また更新も他の言語と比較しても非常に早く、毎月の様に新しいバージョンがリリースされます。よって頻繁に更新する可能性があるため、NVMなどを用いてNode.jsの構成管理を行うことが一般的です。その結果手間を軽減させられます。これがNVMを利用する最大の理由です。
新しく買ったmacにanyenvでpython3.7系をインストールする

新しく買ったmacにpythonを入れようとしたらうまくいかなった。
その時のめも。

まず、Mojavaではopensslのパスがうまく取得できないらしいので以下のサイトを参考に修正
参考サイト：
https://qiita.com/smith_30/items/a275f30b040c1ea74520


次にzlibのエラーが出たので以下のサイトを参考に修正
参考サイト：
https://qiita.com/zreactor/items/c3fd04417e0d61af0afe


最後に以下のエラーが出たのでサイトを参考に修正
（「ググった結果、pyenvで3.7.0をインストールできないというpyenvのissueを発見」ってとこを参考に）

エラー内容
Installing Python-3.7.2...
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?


https://blufflog.hatenablog.com/entry/2018/09/25/224259


これでうまくインストールできた！
rubyはopensslのみの修正でよかった.

余談：
anyenvのnode管理は、ndenvからnodenvになったんですね。
打ちづらい笑
GoogleTranslate関連のChrome拡張が入っているとconsoleでエラーがでる。

状況としては、
Reactで自作のアイコンと文字列が並んだボタンコンポーネントを作ってChromeで押して確認してみたら、
アイコン部分を押したときだけエラーがでました。(firefoxはでませんでした。)
エラー内容は以下です。

```
Uncaught TypeError: e.target.className.indexOf is not a function
    at HTMLDocument.mouseup (translator.js:430)
```

エラー内容はonmouseupを使っているわけでもないのでよくわからなかったのですが、
調べてみたら以下の記事が見つかりました。
https://medium.com/@amir.harel/a-b-target-classname-indexof-is-not-a-function-at-least-not-mine-8e52f7be64ca

結論としてはGoogleTranslateのChrome拡張機能が影響しているとのことでした。
実際ぼくの環境には"ImTranslator"という拡張機能が入っていたので、削除してみたら無事エラーはでなくなりました。

上の記事の方はGoogle Translate用のGoogleChrome拡張機能をインストールしたユーザーではこの記事を無視する条件を追加したようですが、
そのやり方はわかりません！

前にも翻訳の拡張機能で何かエラーが起こった記憶があるので、そこらへん注意したほうがいいなと思いました。
Nuxt.jsのasyncDataとfetchは何が違うのか

Nuxt.jsを使用するうちに、 `asyncData` と `fetch` の違いが気になって調べてみたので、その備忘録を記事にします。

*2020/4/07追記: Nuxt 2.12 より `fetch` の動作が [変更されています](https://nuxtjs.org/blog/understanding-how-fetch-works-in-nuxt-2-12) 。以降に記載している内容はNuxt 2.11 以前のものを対象しているのでご注意ください。*

# asyncData と fetch の共通点
[asyncData](https://nuxtjs.org/api/) と [fetch](https://nuxtjs.org/api/pages-fetch) は、両者ともページコンポーネントの初期化前に実行される関数です。これはサーバーサイド、もしくはクライアントサイドでのナビゲーションが発生した際に呼び出されます。どちらも第１引数に `context` を取るため、クエリパラメータなどの値にアクセスして、それらの値に応じた処理を行うことが可能です。また、これらの処理はコンポーネントのインスタンスが生成される前に行われるため、 `this` を通してコンポーネントのインスタンスにアクセスすることはできません。

# 何が違うのか
それでは両者の違いについて確認してみましょう。

## asyncData
`asyncData` は、コンポーネントへデータをセットすることを目的として使用されます。そのため、 `asyncData` によって返された値はコンポーネントのテンプレートからアクセス可能であり、以下のように利用することができます。

```vue
<template>
  <h1>{{ title }}</h1>
</template>

<script>
export default {
  async asyncData ({ params }) {
    let { data } = await axios.get(`https://my-api/posts/${params.id}`)
    return { title: data.title }
  }
}
</script>
```

(Nuxt.js公式サイトより[引用](https://nuxtjs.org/guide/async-data))

## fetch
`fetch` は、Vuex storeにデータを格納することを目的として使用されます。そのため `asyncData` と違ってコンポーネントに値をセットすることはできません。 `fetch` は以下のように利用することができます。

```vue
<template>
  <h1>Stars: {{ $store.state.stars }}</h1>
</template>

<script>
export default {
  async fetch ({ store, params }) {
    let { data } = await axios.get('http://my-api/stars')
    store.commit('setStars', data)
  }
}
</script>
```

(Nuxt.js公式サイトより[引用](https://nuxtjs.org/api/pages-fetch))

# どう使い分けるか
以下のような方針で `fetch` と `asyncData` を使い分けるのが良さそうです。

**以下の条件に該当する場合は `fetch`**

- Vuexをセントラルレポジトリとして使用している
- アプリケーション全体において、Vuex storeを通じてデータを取得している

**以下の条件に該当する場合は `asyncData`**

- Vuexをセントラルレポジトリとして使用している
- 初期化前に非同期処理によってコンポーネントに値をセットすることがある
- 特定のルートで取り出されたデータは、1つのコンポーネントでのみ使用される
- Vuex store、コンポーネントへの値のセット、どちらも利用可能な柔軟性が必要である

([Stackoverflowの回答より引用](https://stackoverflow.com/questions/49251437/difference-between-asyncdata-vs-fetch))

# まとめ
以上が `fetch` と `asyncData` の違いです。どちらがどちらより優れているというよりは、設計方針によって使い分けるのが良さそうです。
Reactで外部scriptを読み込むコンポーネント

reactでscriptタグをrender中に書いても表示してくれない。

componentDidMountで手動でDOM操作すれば良さげ。
[Reactで外部Scriptを動的に読み込む](https://qiita.com/enu-kuro/items/1206f098dac4940d8042)
[Adding script tag to React/JSX](https://stackoverflow.com/questions/34424845/adding-script-tag-to-react-jsx)

コンポーネント作るたびにDOM操作を書くのも面倒なので、scriptタグ設置用のコンポーネントクラスを定義

```js
import {Component} from "react";
import React from "react";
import {PropTypes} from "prop-types";

const id = Math.random().toString();

class ScriptTag extends Component {
    componentDidMount() {
        const {src, async} = this.props;
        const script = document.createElement("script");

        script.src = src;
        script.async = async || false;

        document.getElementById(id).replaceWith(script)
    }

    render() {
        return <div id={id}/>
    }
}

ScriptTag.propTypes = {
    src: PropTypes.string.isRequired,
    async: PropTypes.bool
};

export default ScriptTag
```
.NETのTFM(ターゲットフレームワークの呼称)、netcore45とか紛らわしいよね

次の画像は、RiderのC#プロジェクトの設定外面、`Project Properties`の画面です。

![スクリーンショット 2019-02-13 1.22.17.png](https://qiita-image-store.s3.amazonaws.com/0/4125/b36b26b4-e4ac-1113-5f97-0833f91b9a2c.png)

次の画像は、プロジェクトのcsprojの画像です。

![スクリーンショット 2019-02-13 1.35.27.png](https://qiita-image-store.s3.amazonaws.com/0/4125/6e1d363a-c621-ec0d-2fbc-dde4af8d2331.png)

赤く囲った箇所の`netstandard2.0`は、プロジェクトのターゲットフレームワークを表す文字列、TFM（Target Framework Moniker）です。

Monikerの意味は呼称など。Target Framework Monikerを直訳すると、ターゲットフレームワークの呼称ですね。

TFMには、他にはこんなものがあります。

* .NET Core 2.2は、`netcoreapp2.2`
* .NET Framework 4.7.2は、`net472`
* Universal Windows Platformは、`uap10.0`

.NET Coreは、`netcoreapp`であり、`netcore`でないことに注意してください。`netcore`は、WindowsストアアプリのTFMです。紛らわしいですね。


* [Target frameworks(公式)](https://docs.microsoft.com/en-us/dotnet/standard/frameworks)
* [ターゲット フレームワーク(公式)](https://docs.microsoft.com/ja-jp/dotnet/standard/frameworks)
bitcoin: 编译与运行

>![](https://upload-images.jianshu.io/upload_images/47789-06f7b150cf5a949b.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

服务器中最常见的系统是ubuntu, 我们拿ubuntu来做演示.
**由于同步全部的区块链，大概需要 200G的空间**，记得挂载个大硬盘哦。

在B站上传了一个无声版的视频—— [使用ubuntu系统 编译 bitcoin](https://www.bilibili.com/video/av52929031)

#### 挂载分区
[阿里云挂载数据盘](http://www.jianshu.com/p/882654f0b0bb)

#### 更新系统

```
sudo apt-get update
sudo apt-get upgrade
```

#### 下载Bitcoin源码, 并切换版本

```shell
sudo apt-get install -y git
git clone https://github.com/bitcoin/bitcoin.git
cd bitcoin && git checkout v0.16.0
```

#### 安装依赖

```
sudo apt-get install -y  autoconf libtool pkg-config \
libboost-all-dev libssl-dev libevent-dev
```

#### 安装 berkeleyDB

[berkeleyDB](https://zh.wikipedia.org/wiki/Berkeley_DB) 是一款嵌入式数据库,  类似 Sqlite.
 BerkeleyDB 做钱包数据库, 保存私钥等. 而且需要一个老的版本 `berkeleyDB-4.8.30`.

```
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:bitcoin/bitcoin
sudo apt-get update
sudo apt-get install libdb4.8-dev libdb4.8++-dev
```

#### 编译bitcoin

```
./autogen.sh
./configure 
make
make install
```

在执行 `./configure ` 时, 出现以下提示, 表示准备工作已经完成

```
Options used to compile and link:
  with wallet   = yes
  with gui / qt = no
  with zmq      = no
  with test     = yes
  with bench    = yes
  with upnp     = auto
  debug enabled = no
  werror        = no

  target os     = linux
  build os      =

  CC            = gcc
  CFLAGS        = -g -O2
  CPPFLAGS      = -I/usr/local/BerkeleyDB.4.8/include -O2 -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS
  CXX           = g++ -std=c++11
  CXXFLAGS      = -g -O2 -Wall -Wextra -Wformat -Wvla -Wformat-security -Wno-unused-parameter
  LDFLAGS       = -L/usr/local/BerkeleyDB.4.8/lib
```

#### 运行 bitcoin

```
bitcoind -daemon -datadir=<datadir>

bitcoind -daemon -datadir=/mnt/blocks 
# datadir把同步的数据下载到/mnt/blocks  /mnt是新挂载的数据盘
```
需要一段时间等待数据全部同步完.

#### 执行rpc命令

详细的 rpc 列表 https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list

```
bitcoin-cli -datadir=/mnt/blocks getblockhash 0
# 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

bitcoin-cli -datadir=/mnt/blocks getblockcount
# 311952
```

说明节点已经在同步数据了.

#### 停止bitcoind
`bitcoin-cli stop`

本人根据官方步骤做了一些裁剪,  在服务器运行, 不需要qt客户端,
就没有安装qt依赖, 尽量保持精简.

#### 安装QT5依赖

```
sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler

sudo apt-get install libqrencode-dev
```

再执行 `make -j3`, 会生成 `bitcoin-qt`, 运行`./src/qt/bitcoin-qt`会启动图形界面.

>![mac系统qt界面](https://upload-images.jianshu.io/upload_images/47789-f2d90d8ec2c429ec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

---

参考:

https://github.com/bitcoin/bitcoin/blob/master/doc/build-unix.md
https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list
https://github.com/bitcoin/bitcoin/issues/3686
http://man.linuxde.net/ldconfig
https://en.bitcoin.it/wiki/Running_Bitcoin
Chromeのタブ上でマウスホイールを動かすとタブが切り替わる。


目的
タイトル通り ＆ 備忘録的なもの。

対象
Chrome、AutoHotKeyを使っている人。

使い方
拡張子.ahkファイルの最下部にでも貼り付ける。

引用
How can I get google chrome to switch tabs using the mouse wheel? - Super User
https://superuser.com/questions/504687/how-can-i-get-google-chrome-to-switch-tabs-using-the-mouse-wheel

```AutoHotKey:chrome_wheel.ahk
puts 'code with syntax'

;; Wheel Scroll Tabs for Google Chrome 

#IfWinActive ahk_class Chrome_WidgetWin_1 
 ~$WheelDown:: 
 ~$WheelUp:: 
    MouseGetPos,, yaxis 
    IfGreater,yaxis,23, Return 
    IfEqual,A_ThisHotkey,~$WheelDown, Send ^{PgDn} 
                                 Else Send ^{PgUp} 
Return 
#IfWinActive

```

マウスホイールの反応の幅（上下）が狭い場合は、
```    IfGreater,yaxis,23, Return ```
この行の23の数字をいじる。
とあるエンジニアの問題意識 2019-02-12


# アジャイル開発。

自分でカードを取る形式。カンバン方式。

だが、立ち止まってしまう時がある。

取れるカードが、どれもない。

あるものは難易度が高く、あるものは退屈に思える。

あらゆるパラメータが競合しており、どれも突出しない。

しばらく目を閉じて考える、何も生産しない時間。

ふと思いつく。人に意見を聞いたら良い。

# アウトプットとインプットの優先度は肉体現象で変わる。

他の人のQiitaの記事を読んで、まとめのアウトプット記事を書くということを、しばらくしていたが、今日はしない。

リードオンリー。いいねをつけるぐらい。

なんとなく手が不器用で、温まっておらず、キーボードを叩くことのコスト感が高い。

気持ちの問題ではなく、手足によって。

# 極限に速く動きたいときと、極限に遅く動きたい時がある。

今日は後者。

肉体のスピードに合わせないと、スピード違反で泣きを見る。

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
データの白色化

# 白色化
ICA(独立成分分析)を行うための前処理として、行います。データの共分散行列が単位行列になるように行列X(大きさn×p)を変形します。初投稿のため, ベクトルやスカラーの表記がごっちゃになってるのでまた直します。

$$X=(x_{ij})=[x_1,x_2,...x_j,...,x_p]$$
1. データの中心化
$$ x_j=x_j-\sum_{i=1}^nx_{ij}$$
2. 固有値分解
共分散行列 $$V=\frac{1}{n}X^TX$$ として
$$V=K\Lambda K^T$$
と固有値分解できる。ここで$K$は
$$K^TK=I$$
を満たす。つまり直行行列であり,$K^T=K^{-1}$も満たす。
3. 変形
$$Z=XK\Lambda^{-\frac{1}{2}}\\
$$
と取ると

```math 
\begin{align}
\frac{1}{n}Z^TZ &=\frac{1}{n}\Lambda^{-\frac{1}{2}}K^{T}X^{T}XK\Lambda^{-\frac{1}{2}} \\
&= \Lambda^{-\frac{1}{2}}K^{T}VK\Lambda^{-\frac{1}{2}} \\
&= \Lambda^{-\frac{1}{2}}K^{T}K\Lambda K^T K\Lambda^{-\frac{1}{2}} \\
&= \Lambda^{-\frac{1}{2}}\Lambda\Lambda^{-\frac{1}{2}} \\
&= I
\end{align}
```
となる。pythonのコードです。

```python
def white(X,epsilon=1e-5):
    n,p=X.shape
    u,v = np.linalg.eig(np.dot(X.T,X)/n)  #u固有値 vベクトル
    Z=np.dot(X,np.dot(v,np.diag(1/(np.sqrt(u)+epsilon))))
    return (Z)
```
Lambdaからkubectlを使う

## [Serverless](https://serverless.com/)を使うと簡単なので入れる

```

npm install -g serverless
```

## Serverlessのプロジェクトを作る

```
sls create \
  --template aws-python3 \
  --name hello \
  --path hello
```
(pathはどちらでもいいです。）

## kubectlをダウンロード

ここよりLinux版をcurlでダウンロード
https://kubernetes.io/docs/tasks/tools/install-kubectl/

```
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
```

## kubernetesのconfigファイルを連れてくる
```
cp ~/.kube/config .
```

## フォルダ構成

- handler.py
- config
- kubectl

## handler.pyを編集
```
def hello(event, context):
    config_filepath = '/tmp/config'
    with open(config_filepath, 'w') as f:
        f.write(config)
    shutil.copy('kubectl', '/tmp/kubectl')
    proc = subprocess.run(
        ['chmod', '+x', '/tmp/kubectl'],
        stdout = subprocess.PIPE,
        stderr = subprocess.PIPE
    )
    proc = subprocess.run(
        ['/tmp/kubectl', '--kubeconfig', config_filepath, 'get', 'po'],
        stdout = subprocess.PIPE,
        stderr = subprocess.PIPE
    )
    print(proc.stdout.decode('utf8'))
    print(proc.stderr.decode('utf8'))
```

## deploy
```
$ sls deploy
...
```

### 確認
```
$ sls invoke
...
```
CODEPREPで勉強(2019/2/12)

初めての投稿

CODEPREP「Ruby 配列・Hash・Class 操作演習」1-2

問題文が「1からnまで数値を要素に持つ配列を返す create_array メソッドを実装しましょう。」だったので
まず作ってみましたが

def create_array(n)
	
  if n <= 0
    array = []
    return array
  else
    array = Array.new(n){|a| a}
  end
end
これだと
メソッド create_array(10) の返り値は "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]" でした。期待される値は "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" です。
となってしまいました。

なので
array = Array.new(n+1){|a| a}
としましたが
それだと今度は
メソッド create_array(10) の返り値は "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" でした。期待される値は "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" です。
となり、最後の要素は10が出るが、最初の要素が0のままでした。（そもそも配列の要素数が1個増えてしまう。｝

最後に
array = Array.new(n){|a| a+1}
でうまく表示された。

CODEPREPの演習問題は答え合わせがないので、合っているのか不安になります。。。
ASKA3D × LookingGlass のためのハック

#業務連絡
本記事は古いSDK（HoloPlay-SDK-0.1.4.unitypackage）に基づいており、
新しいSDK（HoloPlaySDK-1.0.0.unitypackage）からは互換性が無くなっている。
新しいSDKに対応したハックは『[ASKA3D × LookingGlass のためのハック ver1](https://qiita.com/Limg/items/48c177b26bf75b517063)』

#概要
世の中には ASKA3Dプレートという空中に結像するデバイスがある。
ただ、2Dのディスプレイを映しても2Dの空間映像しか得られない。
- [ASKA3D / 原理と仕組み](https://aska3d.com/ja/technology.php)

近頃、Looking Glass という裸眼3Dディスプレイが現れた。
ガラス（アクリル？）の中ではあるが、3Dの像が得られる。
- [LookingGlass / How IT WORKS](https://lookingglassfactory.com/how-it-works/)
 
この2つを組み合わせれば、3Dの空間映像が得られる計算になる。
で、実際にやってみると、3Dの空間映像は得られた。
ただ、前後・左右・上下が全て反転した状態だった。

ASKA3Dプレート2枚で反転を打ち消すには、光路が謎な上に減衰が激しいために難航した。
対して、ソフトウェア側で解決策を探したら、意外に容易くハックできた。

#ハック
## ハック対象ファイル
Unity で Looking Glass 用のアプリを開発するには [HoloPlay-SDK-0.1.4.unitypackage](https://lookingglassfactory.com/downloads/holoplay-sdk-looking-glass/) を使う。
インポートで追加される Assets の HoloPlay にある HoloPlay Capture を使うことになるが、
今回は HoloPlay Capture のコンポネントである Capture.cs をハックする。
Project の Assets からのパスは 
```Assets/Holoplay/Core/Scripts/Capture.cs```

### 前後反転
```namespace HoloPlay```の```class Capture```の```void RenderView(int view, int numViews,...)```の中、AngleAtView を呼び出す前に以下の行を追加。

```diff
+   view = numViews - 1 - view;
    HandleOffset(AngleAtView(view, numViews, viewCone), verticalAngle);
```

Looking Glass は 3D 画面(?)を45枚の2D画面に分けて処理しているが、
RenderView では各 2D 画面のカメラパラメータを設定している。
```view``` には 2D 画面の前後位置を表す添え字、```numViews```には 45 という上限値が渡される。

そのため、```view```の値を入れ替えれば、2D 画面のレイヤが前後に入れ替わる。
具体に、```view``` が 0 から 44 まで変わるので、これを 44 から 0 に補正すれば良い。
これを実現するのが```view = numViews - 1 - view;```である。

ちなみに、```AngleAtView```の中で```view```を配列参照とかに使ってるわけではなく、
単に角度の計算に使っているために OutOfRange の類の例外を引き起こす心配はない。
また、```view```が1ズレても、2D 画面が 1 レイヤズレる程度で、並の人間には分からない。
そのため、単純に```view = numViews - view```としても見た目はほぼ同じである。

### 上下・左右反転

```namespace HoloPlay```の```class Capture```の```void HandleOffset(...)```の中、
```if (Cam.orthographic)```に入る前に1行追加して、分岐内でも1文字追加。

```diff
+   Cam.transform.localEulerAngles = Vector3.forward * 180;
    if (Cam.orthographic)
    {
      Cam.transform.localPosition = Vector3.zero;
-     Cam.transform.localEulerAngles  = Vector3.up * -horizontalAngle;
+     Cam.transform.localEulerAngles += Vector3.up * -horizontalAngle;
      return;
    }
```

上下・左右反転は、前後軸中心に180回転とも言う。
```Cam.transform.localEulerAngles = Vector3.forward * 180;```はそのまんまである。

orthographic モードでは上下軸中心の回転が加わるため、単純代入ではなく、加算代入に変える必要がある。
また、分岐の中で return してしまうため、分岐の後で前後軸の回転を追加する1行ハックは無理だった。

# 補足
上下左右の反転だけなら、Looking Glassを逆さにして使っても同様の効果が得られる。

また、ちゃんと実装するなら、prefab を直に書き換えないで、コピーして別に作るべし。

#まとめ
ASKA3D × LookingGlass は良いぞ！
redux-react-hook試してみる

[redux-react-hook](https://github.com/facebookincubator/redux-react-hook)を使って簡単なノートアプリを作ってみた。完成物が[こちら](https://redux-react-hook-example.netlify.com/)。コードは[これ](https://github.com/sosukesuzuki/redux-react-hook-example)。提供されるAPIは`StoreContext`、`useMappedState`、`useDispatch`、`create`の4つ。

## StoreContext

ReduxのStoreを管理するためのContext。ReactのContextオブジェクトがまんま提供されているので、下の例みたいに`StoreContext.Provider`のvalueにstoreを渡してAppを囲む。直接Contextを叩けるため、その場でしか使わないような値をぱっととってくるとかできて便利。

```jsx
ReactDOM.render(
  <StoreContext.Provider value={store}>
    <App />
  </StoreContext.Provider>,
  document.getElementById('root'),
);
```

## useMappedState(mapState)

引数にmapState関数を渡してあげる。そのmapStateは`useCallback`で必ずメモ化してあげないといけない（めっちゃレンダリングかかってとまるから）。メモ化に使う値がない場合は空の配列を渡してあげれば良い。(ちなみに、今後は`useCallback`を直接使うんじゃなくて第二引数でメモ化のための配列を渡せるようになるっぽい。そのPRが出ていた。)

```jsx
import {useMappedState} from 'redux-react-hook';

function TodoItem({index}) {
  const mapState = useCallback(state => state.todos[index], [index]);
  const todo = useMappedState(mapState);

  return <li>{todo}</li>;
}
```

## useDispatch()

超シンプル。`dispatch`をとってくる。

```jsx
import {useDispatch} from 'redux-react-hook';

function DeleteButton({index}) {
  const dispatch = useDispatch();
  const deleteTodo = useCallback(() => dispatch({type: 'delete todo', index}), [
    index,
  ]);

  return <button onClick={deleteTodo}>x</button>;
}
```

## create()

上３つのAPIを独自に作る。多分主に、TypeScriptで使うときに型情報を付与するのに使う。（自分が使ったバージョンではcreateがexportされていなかったぽくて使えなかったけど）

```ts
import {create} from 'redux-react-hook';

export const {StoreContext, useDispatch, useMappedState} = create<
  IState,
  Action,
  Store<IState, Action>
>();
```

## 感想

react-reduxのconnect正直パターン多すぎてわからなかったし、型周りもこっちの方が楽(Props使わないし)に思えたので主流になってほしいですね。
btrfs wikiに書いてないハマりどころメモ (RAID5障害・拡張)

btrfs raid5なNASを数年来運用してきて今ハマっているところをいくつかメモ。

`4.20.6-200.fc29.x86_64`で確認した挙動がベース。悲しいかな、英語力がないのでbtrfs wikiには上げていない・ML追い切れていない。


### degraded状態のマウント
障害ドライブを抜いた場合自動マウントできなくなり、fstabに`noauto,degraded`マウントオプションなどをつけてブート続行させることになる。

このとき、
* 同一パーティションのfstabエントリ（subvolとか）があり
* noautoでマウントされないfstabエントリがある

場合、mountしたパーティションはそれを即座にsystemdがアンマウントしてくれる。noautoでsystemd管理下なんだからユーザーが手動でマウントしてもumountすべし。systemdの気遣い溢れるsystemd-mount使え。


### btrfs replace

`btrfs replace`コマンドはreplace先のパーティション（ないしドライブ）がreplace元のパーティションより大きくないと弾かれる。素直に`btrfs device delete`してから`btrfs device add`すること。


### btrfs replace後のresize
`btrfs replace`はreplace先のパーティションに大きなパーティションを要求するのに、maxにリサイズしてくれない。
`btrfs resize $DEVID:max /mnt`で拡張を忘れずに。

### btrfs balanceのフィルタ

追加したドライブにraid5を伸ばす(3xData+Parityから4xData+Parityなど)ために使うフィルタは以下のようになる。

```
btrfs balance start -dstripes=1..$(($DRIVES-1)),convert=raid5 /mnt
```

stripesを変えて試したところ、btrfsはstripeとしてデータだけでなく、パリティもカウントする方式。そのためRAID5では`ドライブ数-1`を対象に取る必要がある。

`convert=raid5`は冗長に見えるが必要。これがないと元のstripe数を増やしてはくれない。
なぜドライブ増やしたのにD:P比率変わらないのか？と思ったらこれが原因だったようだ。

### subvolは削除
balanceの実行時間は現状subvol数にO(n)以上で依存しているらしい。

CPU性能が制限されているNAS環境では影響が大きいので直ぐに必要ないsubvolは`btrfs send`で固めて削除しておいたほうがいい。


### deadlineスケジューラ
HDDかつR/W並行で必要なNAS用途ではcfqにしている。が、cfqだと自環境ではbalance/scrubスループットがかなり下がるようで、deadline/noopにすることで何割かbalance速度が向上した。

noopとdeadlineは見えるほど変わらなかったためdeadlineに。


### ビット破損時は inspect logical
scrubを怠ってクラッシュ繰り返していたりするとビット腐敗している場合があり、破損データ部分でbalanceが止まってしまう。

```
BTRFS info (device sda2): relocating block group 23021619249152 flags data|raid5
BTRFS warning (device sda2): csum failed root -9 ino 2152 off 440008704 csum 0xc2427410 expected csum 0x4cb01ad5 mirror 1
```

対応するファイルパスは`btrfs inspect-internal logical`で取得できる場合がある。blockgroup + offsetで論理アドレスが得られるようだ。

対象ファイルをすべてのsubvolから削除してsyncし、同じinspect logicalでinodeエラーが返るようになれば、対象アドレスを含むextentを除去できている可能性が高い。balanceが通ればOK。

### btrfs scrubしよう
scrub時30MB/sしかでなくても泣かないで頑張る。
「PATHを通す」ってなに？

# はじめに
環境構築をしているときに「PATHを通す」とあり、何のことかさっぱりだったので、ここにまとめようと思う。

# 結論
結論から言うと「PATHを通す」とはプログラムを名前だけで呼び出せるように環境変数の一つであるPATHに設定しておくこと。

このままだとさっぱりわからないので用語理解しながら見ていく。

## PATHとは
ファイルやフォルダ（ディレクトリ）がどこに置いてあるのかを示してくれるもの。
これだけだとイメージしにくいので具体例を書きます。

```
 /usr/bin/perl
 /User/tarou/ruby-lesson/lesson1.rb

```

これがPATHです。Userフォルダの中のtarouフォルダの中のruby-lessonフォルダの中のlesson1.rbファイルという意味です。この一番外側を基準に表現するPATHをfull path(フルパス)という。

##環境変数とは
PATHは環境変数ですが、環境変数とは何でしょう？
環境変数とはOSがもつ情報を共有するための仕組み。値を環境変数という「箱」に入れて、異なるプログラム間で共有できる。PATHはファイルやフォルダの場所を「箱」に入れて、簡単に取りだすことができる環境変数。

## PATHを通す
本来プログラムを実行するにはフルパスを指定して、プログラムの場所を教えないといけない。しかしいちいちフルパスを指定するのはとても大変なことだ。ファイル一個開くのにいちいち
　/User/tarou/ruby-lesson/lesson1.rb
を記述するのは時間がかかる。そこで調べる場所をあらかじめ指定しておくことで、プログラム名だけで実行することができるようになる。
【iOS】Firebase Dynamic Linksの起動経路

Firebase Dynamic Links(FDL)でのアプリ起動について勘違いしており余計な時間を過ごしたので、「何を勘違いしたか？何が正しかったか？」ベースで知見共有させてください。

# 実現したかった要件
**WebからURLを踏んでアプリ起動をし、webの画面に応じた画面をiOSアプリでも起動したい**

# 勘違いした部分

https://firebase.google.com/docs/dynamic-links/ios/receive

> 5: 次に、application:continueUserActivity:restorationHandler: メソッドを使用して、アプリがインストールされている場合にユニバーサル リンクとして受信されるリンクを処理します（iOS 9 以降）。

> 6: 最後に、application:openURL:sourceApplication:annotation: メソッド（iOS 8 以前）と application:openURL:options: メソッド（iOS 9 以降）で、アプリのカスタム URL スキームを通して受信したリンクを処理します。これらのメソッドが呼び出されるのは、アプリが iOS 8 以前でリンクを受信したときと、iOS（バージョンを問わず）にアプリをインストールした後にアプリが初めて開かれたときです。

# どう勘違いしたか？
Firebaseが内部で色々やっていて、universal links→custom URL schemeの順番で実行されるので、**どちらも対応していないと、FDL起動しない。**(これは誤り)

# 正しくはどうなのか？
カスタムURLスキーム、**もしくは**universal linksを利用してアプリ起動される。

ドキュメントをきっちり読むと、
> (カスタムURLスキームの起動について)これらのメソッドが呼び出されるのは、アプリが iOS 8 以前でリンクを受信したときと、**iOS（バージョンを問わず）にアプリをインストールした後にアプリが初めて開かれたときです。**

と書いてあるので、
1. iOS8以前の時と**アプリインストール後の初回起動時**にカスタムURLスキーム経由でアプリ起動される。
2. それ以降の起動は、iOS9以降ならuniversal links経由で行われる。

という風になるのではないでしょうか。

[こちらの記事](https://qiita.com/affinity_robots/items/5a8425941de1f2a76a4a)で、
>「FDLならば、未インストールの時にストアに遷移してインストール→アプリ起動した場合でもDeepLinkパラメータを保持することができます」

と書いてあったので、1.は「FDL発行のリンク経由でアプリインストールを行った初回起動時には、カスタムURLスキーム経由でアプリ起動される。」というニュアンスで捉えていますが、カスタムURLスキームの技術背景のソースが見つからなかったのと、自由にいじれるリリース済みのアプリを持っていないので検証はしていないということもあり、あくまで推測としてお受け取りください。ご存知の方いらっしゃれば教えていただけると幸いです。

# 参考記事
https://logmi.jp/tech/articles/320720

https://qiita.com/noboru_i/items/abf83e068999a073d6b0

https://firebase.google.com/docs/dynamic-links/ios/receive?hl=ja

https://qiita.com/affinity_robots/items/5a8425941de1f2a76a4a
GitHubでリポジトリを作成してからpushした。

#前提条件
・GitHubアカウント登録済みであること。
・SSHKeyの登録が完了していること。

#環境
・Git version 2.20.1.windows.1

今回はリポジトリの作成から公開からコードの公開までを一通りやってみます。

#目次
1.リポジトリ作成する。
2.リポジトリの確認する。
3.作成したリポジトリをcloneする。
4.コミットする。
5.pushする。


#1.リポジトリ作成する。

1.GitHubにアクセスする。
2.右上の+から「New repository」をクリックする。
3.「Repository Name」に任意のリポジトリ名を入力する。
今回は「GitHubSample」とした。
4.「Description」に説明を入力する。(任意)
5.今回作成するリポジトリは公開型なので「Public」を選択する。(任意)
6.Initialize this repository with a READMEにチェックを入れる。
手元にあるGitリポジトリをpushする場合はチェックしない。
7.「Add.gitignore」、「Add a license」は設定しない。
8.「Create repository」をクリックする。

#2.リポジトリの確認をする。

[作成したリポジトリ]https://github.com/ryuutamaehara/GitHubSample

#3.作成したリポジトリをcloneする。

作成したリポジトリをローカルの環境にcloneします。

1.「Clone or download」をクリックし、「Use SSH」をクリックする。
2.テキストエリアのテキストをコピーする。
3.Git Bashより次のコマンドを入力し、リポジトリをcloneする。

```
git clone コピーしたテキストをペースト
```

僕の環境に合わせると次のようになる。

```
git clone git@github.com:ryuutamaehara/GitHubSample.git
```


4.ディレクトリを移動する。

```
cd GitHubSample
```

#4.コミットする。

1.登録用に適当なファイルを用意する。今回はtest.txtを用意した体で進める。
2.次のコマンドを入力して用意したファイルについてUntracked filesとなっていることを確認する。

```
git status
```

3.test.txtをステージングする。
※ファイル状態を記録するインデックスにデータ構造を記録する。


```
git add test.txt
```

4.コミットする。

```
git commit -m "Add test.txt"
```

5.コミットログを確認する。

```
git log
```

#5.pushする。

GitHubのリポジトリを更新する。


```
git push
```

今日はここまで！
YAMLで#をエスケープする

AWS IoTのトピックルールをCloudFormationで作成したときに引っかかったのでメモ。

YMLで#をエスケープするためには、全体を`"`または`'`で囲めば良い。

```yaml:test.yml
'#test'
```

###おまけ
この記事は、CloudFormationでAWS IoTのSQLを記述しようとしたときに、「あれ、#ってエスケープ必要じゃね」と思ったため、書き始めた記事だった。

だが、いずれにせよAWS IoTのSQLは、以下のように記述すればそのまま通ることがわかった。
~~調べて損した~~

```yaml:AWSIoT.yml
  IoTTopicRule:
    Type: AWS::IoT::TopicRule
    Properties:
      RuleName: !Sub "${AWS::StackName}-KinesisRule"
      TopicRulePayload: 
        Actions:
          - 
            Firehose:
              DeliveryStreamName: !Ref deliverystream
              RoleARN: !GetAtt FirehoseRole.Arn
              Separator: ','
        AwsIotSqlVersion: 2016-03-23
        RuleDisabled: True
        Sql: !Sub Select * From ''${AWS::StackName}Gatewaytopic/#''

```

*追記
そもそもシングルクォートのエスケープすらいらなかった。また、スタックネームにはハイフンが含まれているため、利用できなかった。
つまり、正しくはこう。

```yaml:AWSIoT.yml
  IoTTopicRule:
    Type: AWS::IoT::TopicRule
    Properties:
      RuleName: !Sub "${Konst}-KinesisRule"
      TopicRulePayload: 
        Actions:
          - 
            Firehose:
              DeliveryStreamName: !Ref deliverystream
              RoleARN: !GetAtt FirehoseRole.Arn
              Separator: ','
        AwsIotSqlVersion: 2016-03-23
        RuleDisabled: True
        Sql: !Sub Select * From '${Konst}Gatewaytopic/#'

```

###参考
[Write # in yaml (in the string)](https://stackoverflow.com/questions/13711444/write-in-yaml-in-the-string)
Adafruit Itsy Bitsy 32u4 - 5V 16MHzでLチカ

# 準備
・[Adafruit-Itsy-Bitsy-32u4-16MHz](https://www.amazon.co.jp/Adafruit-Itsy-Bitsy-32u4-16MHz/dp/B07BT2GLNW/ref=sr_1_2?s=diy&ie=UTF8&qid=1549085465&sr=8-2&keywords=itsy+bitsy+32u4)
・LED
・抵抗
・マイクロUSBケーブル

届きました。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/344880/bd69277a-873a-39c6-792e-8833ff8393c1.png)

# Adafruit-Itsy-Bitsy-32u4-16MHz環境設定
[公式HP](https://learn.adafruit.com/introducting-itsy-bitsy-32u4/arduino-ide-setup)からAdafruit AVR Boardsのボード設定取得を行います。

Step1.環境設定|追加のボードマネージャの URLに下記を追加
　　　https://adafruit.github.io/arduino-board-index/package_adafruit_index.json
Step2.ボードマネージャから下記をインストール
　　　Adafruit AVR Boards
Step3.ツール|ボードからAdafruit ItsyBitsy 32u4 5V 16MHzを選択
![003.png](https://qiita-image-store.s3.amazonaws.com/0/344880/e4146d57-3e7a-82cf-384c-940b67bca7fd.png)

# 回路図
PIN13とLEDを接続します。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/344880/6e8cd96c-45f9-d8e7-9b7d-98e16e3cbf50.png)

# コード
LED点灯させるサンプルコードを使います

```
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}
```

# テスト
LEDが点灯すればOK
<blockquote class="twitter-tweet" data-lang="ja"><p lang="cs" dir="ltr">play adafruit 32u4 5v 16mhz <a href="https://t.co/oVWeonK3te">pic.twitter.com/oVWeonK3te</a></p>&mdash; st (@st17890027) <a href="https://twitter.com/st17890027/status/1095336236229681153?ref_src=twsrc%5Etfw">2019年2月12日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


# 参考
・[組み込みエンジニアでなくても週末にArduinoを使って遊ぶ](https://qiita.com/seigot/items/958d3f2817a4bdac8754)
・[itsy-bitsy-32u4/arduino-ide-setup](https://learn.adafruit.com/introducting-itsy-bitsy-32u4/arduino-ide-setup)
GCコンの入力の取得

#はじめに
電子工作を最後にやったのは小学生の時のソーラーカーみたいなやつでした。そんな電子工作初心者が配線いじっておりますので、コントローラーが動かなくなった！！などなる可能性があるので注意してください。

また、僕の環境では動いてもほかの環境で試していないため、不具合が発生する可能性があるかと思いますが、ご了承ください。

#必要なもの
1. GCコン
2. Arduinoというマイコンみたいなもの(よくわかってない) [使用したもの](https://www.amazon.co.jp/Arduino-Rev3-ATmega328-%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3%E3%83%9C%E3%83%BC%E3%83%89-A000066/dp/B008GRTSV6/ref=sr_1_4_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=arudino+uno&qid=1589135706&sr=8-4-spons&psc=1&smid=A3896F3AQK7MHT&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzNEdLNEZHRzlXTEtNJmVuY3J5cHRlZElkPUEwMjIyMzcyMTc2WDc3WU5QVEFLTSZlbmNyeXB0ZWRBZElkPUEyN1UwSkpWRjczOUZGJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==)
3. ジャンプワイヤ
4. ニッパー
5. ビニールテープ
6. USBケーブル(A-Bタイプ、よくあるプリンターケーブル)
7. エレクトロタップ(なくてもいい)

Aruduino,ジャンプワイヤ,エレクトロタップに関しては聞いたことありませんでしたが、何とかなりました。

#入力取得までの流れ
1. GCコンの線を切る
2. 必要な配線のみジャンプワイヤとつなぎ、ほかは元通りに戻す
3. ジャンプワイヤをArduinoの対応した場所に刺す
4. Arduino IDEダウンロード [こちらから](https://www.arduino.cc/en/Main/Software)
5. NintendoSpyダウンロード [こちらから](https://github.com/jaburns/NintendoSpy/releases/tag/v1.10.1)
6. ArduinoとPCをつなぐ
7. Arduino IDEでfirmwareを書き込む
8. Nintendospyを起動する。


###実際にやった作業
・GCコンの線を切る
　- 切る場所はどこでもいいが邪魔にならないように差込口付近を切った
　- 切った後は外皮(銅線みたいなの)を逆にねじり、それぞれの色がわかるようにした
　
・配線する
　- GCコンの場合は赤色が残ってればいいらしいので、赤色ケーブル以外は元に戻す。
　　- 銅線の外皮を剥いて、中身同士をねじってビニールテープで止める。
　（慣れないエレクトロタップを使ったら、よくわからずに1時間くらい溶け、結局はビニールを剥いてビニールテープで止めました）
　- 赤色のケーブルも同じく中身を出し、ジャンプワイヤもそこに混ぜて止める。
　- Arduinoの5番ポートに赤色ケーブルを刺すといいらしいので、5番に刺す！
　
・各種ソフトウェアダウンロード
　- Arduino IDEのダウンロード
　　- 流れのところのURLで公式サイトに飛んだら、少し下に行き[Download the Arduino IDE]というところで自分の環境にあったものをクリック
　　- そのあとはJUST DOWLOADをクリック 
　　- ダウンロードしたexeを起動しそのまま進んでいき、IDEを開く。
　- nintendospyをダウンロード
　　- 上記、流れのところのURLをふみGithubへ行ったら、ZIPファイルをダウンロードする。
　　- その後展開する。
　
・Arduino IDEでArduinoに書き込む
　- nitendospyのフォルダ内にあるfirmware/firmware.inoをArduino IDEで開く
　- //#define MODE_GC の // を消す
　- Arduino IDEのツール→ボートで自分の使っているボードを選択。(上記のものを買ったならArduino/Genuino Uno を選択)
　- 同じくツール→シリアルポートでArduinoが接続されているポートを選択する。
　- →マークの書き込むボタンをクリックする
　　- 僕はここで　**ser_open(): can't open device**というエラーが出ました。
　　- USBを刺しなおしたら直りました。それでも直らない場合は、IDE再起動、PC再起動を行ってください。

・nintendospyの起動
　- 展開したフォルダ内にあるexeファイルを起動する
　- Controller SourceをGameCubeにする
　- COM PortはAruduinoが接続されているポートを選択する
　- 色は自由にどうぞ

・PCにArduinoを刺して、ゲーム機にGCコンを指し、nintendospyを起動したら、ボタン入力が取れるはずです！

#最後に
この記事をQiitaにアップしていいのかどうか(あまり技術的でないため)怪しので、やばそうならコメントください。
また、興味あるけどよくわかんない！！もっと詳しく知りたい！という方は[twitter](https://twitter.com/PAD_meat_ball)でリプください。

参考記事
[nintendospyのお話(コントローラーの入力表示)](https://sp.ch.nicovideo.jp/orimar/blomaga/ar1140003)
ほとんどこの記事と書いてあることは同じです・・・。
この記事は少し作業してはまったところ等を載せてある記事だと思っていただければいいです。
どのエディターを使うのが良いか迷っている君へ

今回は、エディターがどれが良いか迷っている方へアドバイスをしたいと思います。
## どのエディターを使うのが良いか迷っている君へ
各エディターの支持者間の言い争いは宗教戦争とも言われ、論理的にベストなエディターというものを決定することが出来ません。

そこで僕が伝えたいのは次の3点です。
### 気になる物は全部試してみよう
エディターをインストールして使い始めることはとても簡単です。
ブログ記事を読んで情報を集めるのも良いですが、実際に使ってみて感触を試と効率的です。
### 言語・用途によって使い分けるのもアリ
「俺はVimを極める！」と言ってVimしか使わなくても良いですが、それだと大変なこともあると思います。
言語・用途によって使い分けるのも良いです。

僕の場合はIntellij IDEAをメインで使っています。デフォルトの状態で様々な機能が入っていて満足しているのですが、その他にも次のようなエディターを使い分けています。

#### VS Code
ちょっとした編集だったり、コードを読むだけの時には軽量なVS Codeを使います。
#### Vim
ターミナルで編集したいときや、コードを読む時に。
#### PyCharm
Python開発の時にのみ使います。


### 周りの人と合わせるのは良い選択
エディターを一人で本格的にマスターするのはとても難しいです。操作方法を相談できるように、周りの人とエディターを揃えるのは良い選択と言えます。

## まとめ
いかがでしたでしょうか。エディター選びの参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
RacketをVisual Studio Codeのターミナルとして使う方法

以下の記事を参考にしました。

[Visual Studio Code 15.1の統合シェルをMSYS2のbashにする](https://qiita.com/yumetodo/items/42132a1e8435504448aa)

```settings.json
{
    "terminal.integrated.shell.windows": "C:\\Program Files\\Racket\\Racket.exe",
    "terminal.integrated.env.windows": {},
    "terminal.integrated.shellArgs.windows": [
        "-i"
    ],
    "terminal.integrated.cursorStyle": "line"
}
```

BashよりRacketのほうがVisual Studio CodeのVariableに対応しやすいと思うのでおすすめです。

[Visual Studio Code Variables Reference](https://code.visualstudio.com/docs/editor/variables-reference)
asp.net Webフォームアプリでの画面作成基本知識

#asp.net Webフォームアプリでの画面作成基本知識

##プロジェクトの作成手順
Visual Studioで、「新しいプロジェクトの作成」をクリック。
→ASP.NET Webアプリケーション（.NET Framework）を選択。
→Webフォームを選択。

ソリューションエクスプローラの任意のフォルダで右クリック。
↓
追加
↓
新しい項目
↓
Webフォーム
↓
追加　と操作する。

ソリューションエクスプローラを見ると、
.aspx
.aspx.cs
.aspx.designer.cs
の3種類のファイルが生成されている。

![スクリーンショット 2019-02-12 23.42.45.png](https://qiita-image-store.s3.amazonaws.com/0/180727/ed1c06a7-5e47-1990-bca4-64e2ed534dd8.png)

##それぞれのファイルの役割

##.aspファイル
◆.htmlに相当するファイル。
◆aspタグという独特のタグを使用して画面作成を行う。
\<asp:Button>
\<asp:Label>
\<asp:GridView>
\<asp:TextBox>
\<asp:DropDownList>等である。
◆ファイル先頭の<%@ Page>（Pageディレクティブ）内のCodeBehindもしくはCodeFileに、
対応するaspx.csファイル名を指定する。

◆デザイン（GUI）とソース（CUI）、両方から編集することができる。
※Visual Studio for Macには、「デザイン」はないようである。
※「デザイン」での見え方と実際のブラウザでの見え方は異なる（主に表示位置）ため、ブラウザでの確認が必要である。

##.aspx.csファイル

◆.aspxファイルで記述された画面の初期化やレンダリング、配置されたボタンのクリックイベント処理を書くファイル。
◆void Page_Load(object sender, EventArgs e)が初期化メソッドである。
◆aspxで\<asp:Button OnClick="Btn_Click">と記述されていれば、
クリックイベントで、void Btn_Click(Object sender, EventArgs e)  メソッド内に書かれた処理が実行される。
ただし、ボタンクリックの場合であっても、まずは必ずPage_Loadが実行され、その後にBtn_Clickが実行される点に注意。

##.aspx.designer.csファイル
◆フィールド専用のファイル。
◆.aspx.csファイルで「runat="server"」と書かれたタグのID名が、このファイルにフィールドとして自動で追加される。
※ただし、GridView内のタグは、runat="server"としても追加されない。

◆.aspx.csと.aspx.designer.csは、クラス名が同じであることからわかる通り、一つのクラスである。
しかし、後者は前者の編集に伴い自動的にIDEの方で生成・更新されるため、
プログラマが敢えて編集することはない。というより、編集するのは好ましくはない
（編集するのは、マージミスの場合など、ごく一部のレアケースである）。

partial修飾子をつけているため、1つのクラスを二つのファイルに分割し、
プログラマが不必要な箇所を編集することがないようにしている設計と思われる。

##ファイル移動用ショートカット
.aspxを開いた状態で「F7」を押すと、対応する.aspx.csが開く。
.aspx.csを開いた状態で「shift+F7」を押すと、対応する.aspxが開く。
「shift+F7」を繰り返すと、「デザイン」と「ソース」が交互に表示される。
DB無しでゲームへランキング機能を実装する方法

## 自分で作ったゲームにランキング機能を追加したい……
プレイヤーの競争心を刺激してより沢山プレイしてもらう為に、ランキング機能を追加したい。
こう思った時、データをRDBMSに保存する方法ならそれぞれのRANK関数を使えば実現できる。
しかしDBを建てるのって正直面倒……:rolling_eyes:
DB無しでランキング機能を実装する事は出来ないだろうか。

## GAS×スプレッドシート×RANK関数で実現する。
で、考えついたのがこれ。
仕組みとしてはGASで作ったWebアプリケーションへゲーム側からリクエストを送り、
GAS側でスプレッドシートを操作、スプレッドシートに組み込まれているRANK関数の結果を返す。

## 実装手順
### ①スプレッドシートを作成
ドライブからスプレッドシートを作成する。

### ②スクリプトを追加
作成したスプレッドシートの上部にある「ツール」から「スクリプトエディタ」を押下する。

### ③アプリケーション実装
```
var funcStr = "=RANK({0},A:A,0)"
function doGet(e){
  var result = {};
  //パラメータがある時だけ処理する
  if(e.parameter.score != undefined){
    //スプレッドシートを取得
    //①、②で作ったらこの取得方法じゃなくても良い。
    var spreadSheet = SpreadsheetApp.openById("[スプレッドシートID]");
    var sheet = spreadSheet.getSheetByName("[シート名]");
    
    //スコアパラメータの取得
    var score = e.parameter.score;
    //スプレッドシートに追加
    sheet.appendRow(new Array(score));
    
    //最低スコアの順位を母数ににする
    //当該セルにRANK(MIN(列),列,0)を設定しておく
    var totalRow = sheet.getRange("B2").getValue();
    
　　//RANK関数をセルに設定
    var funcCell = sheet.getRange("B1");
    funcCell.setFormula(funcStr.replace("{0}",score));
    //結果を取得
    var rank = funcCell.getValue();

    result.rank = rank + "/" + totalRow;
  }else{
    result.rank = "取得失敗...ごめん";
  }
  //jsonでレスポンス
  return ContentService.createTextOutput(JSON.stringify(result));
}
```
### ④webアプリケーションとして公開
最後にこれをWebアプリケーションとして公開する。

## ただし……
ただしこの方法では、同タイミングでランキング取得されると、RANK結果の取得がズレる可能性がある。
厳密にやるなら、追加中か否かのチェック機構が必要なので、注意。
しかし厳密にやるなら、DB使った方が安心な気が……

## まとめ
これでDB無しでゲームにランキング機能を(一応)実装する事が可能。
LabVIEWのLVOOPでアクセサのデフォルトVI名を変更する

## 概要
LabVIEWのオブジェクト指向プログラミングでアクセサを作成する際に、デフォルトで付けられるアクセサのVI名を変更する方法を紹介します。
アクセサをまとめて作成した後、手動のリネームを省ける(「すべて保存」で問題なくなる)ため、大幅な効率化が期待できます。

## 手順

LabVIEWのインストール先配下にある"CLSUIP_LocalizedStrings.vi"を開きます。

\<labviewdir\>\resource\Framework\Providers\LVClassLibrary\NewAccessors\CLSUIP_LocalizedStrings.vi

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36514/27743c46-23ea-19d5-eb52-2a44f03142e8.png)

複数VerのLabVIEWを共存させている環境では、意図しないVIのバージョンアップに注意してください。
**古いLabVIEW用のVIを、新しいLabVIEWで開いて上書きすると、古いバージョンのLabVIEWで開けなくなります。**
間違ったバージョンで開いてしまった場合は、すぐに閉じる操作をして保存をキャンセルしてください。
必要に応じて事前にファイルをバックアップするなどした上で作業してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36514/15d44534-3442-10be-507d-371dbc113176.png)

プロジェクトの命名規則に合わせて値を書き換えます。
%sはクラスのデータメンバー名で置換されます。

「編集」→「現在の値をデフォルトに設定する」でデフォルト値の設定を行い、上書き保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36514/1afe71d6-3a87-c79a-41db-dea42d059329.png)

以上で設定完了です。

----

通常どおりアクセサを作成すると、設定した名前で作成されるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/36514/2107fbbd-2524-25df-0d55-45985a938a9e.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/36514/93af99f9-57e4-ecc2-e7a1-605ac5a74ef2.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/36514/bdbacf4c-816f-37d7-60f7-5b41631d1a65.png)

----
**Note**
この設定は、VIのファイル名に適用されるものです。プロパティ定義フォルダの名前は、クラスのデータメンバ名が使用されます。
ファイル名順でソートした時に、アクセサVIがまとまるように接頭辞を付けておくことで、ファイル管理がしやすくなります。

----
MacOS Mojave 10.14.3のBootCampでWindows10を入れるのに手間取ったメモ

#はじめに
自分の所有するMacBook AirへBootCampを用いて，Windows10をインストールしようとした．
MacOS Mojave 10.14.3を**クリーンインストールした直後に**BootCampアシスタントを起動し，MacOSとWindows10のパーティションを作成する画面で次のエラーが出た．

* 「ディスクにパーティションを作成できませんでした．ディスクユーティリティでエラー個所を修正してください．」

この記事はこの悪名高きエラーと戦おうというものです．
戦った際のメモのレベルで見ていただけると幸いです．

#環境
* MacBook Air (13-inch Mid 2013)
* MacOS Mojave 10.14.3

#巷で挙げられている対処法の実施
##FireVaultのオフかどうかの確認
[このページ](https://pc-karuma.net/mac-boot-camp-cannot-partition/)にあったFireVaultがオフになっているかチェックを行った．
MacOSをクリーンインストールした直後だったため，FireVaultはオフであり，この解決方法は使えなかった．

##ディスクユーティリティのFirstAid実施
[このページ](http://the-takeo.com/?p=552)に記載のあったBootCampアシスタントがパーティション分けを行うMacOSの入ったストレージ（筆者の環境ではMacintosh HD）をスキャンした．
結果としてはOSのクリーンインストール直後なのでエラーは存在しなかった．
そのため，この解決方法も使えなかった．

#解決方法
前述のFirstAid実施の際，MacOSの入ったストレージにてエラーはなかったものの警告として，[このページ](https://discussionsjapan.apple.com/thread/110206063)にも記載のある以下の警告がスキャン中２回ほど出ていた．

* mac warning:Overallocation Detected on Main device:(アドレス番地？) bitmap

この警告を深読みしてみた結果，FirstAidで実施されるfsck_apfsコマンドに行き着いた．
（~~**なんでクリーンインストール直後にこんな警告出るんだよ．公式インストーラーにバグあるのでは．**~~）


##fsck_apfsコマンドについて
```man fsck_apfs```とやった結果が以下のものになる．
![fsck_apfsコマンド.png](https://qiita-image-store.s3.amazonaws.com/0/153113/9f0e144d-6cd1-7db6-e0ed-d63a4299750d.png)
簡単に言えば，FirstAidのコマンド版だ．APFSフォーマットのストレージを検査してくれる．
注意点としては，これから使うオプション```-o```が「古いバージョンのfsck_apfsコマンドで新しいOS？に対してこの処理を行うな」と言われている程度か．

##fsck_apfsコマンドの実施
**ここから記載する処理はMac側のバックアップをしっかりとった上で，全て自己責任で行ってください．**
1. まず，Macをシャットダウンし，commandキー+rキーでリカバリーモードに入る．
2. 左上のバーからユーティリティを選んでターミナルを開く．
3. ```diskutil list```とターミナルへ打ち，MacOSが入っているストレージを確認．
（**続きの処理では/dev/disk2がMacOSのストレージと仮定**）
4. ```fsck_apfs -n -l /dev/disk2```とターミナルへ打ち込み，前述の警告が出ているストレージか再度確認．
5.警告が出るストレージだと確認したら，以下のようにコマンドを打ち込み，該当警告部分を修復．

```sh:fix.sh
diskutil unmountDisk /dev/disk2
fsck_apfs -o /dev/disk2
```

上記の処理を終了したら，ターミナルを終了し，リカバリーモードを終了．
Macを通常通り起動させる．
あとは，BootCampアシスタントで指示されるままに操作すれば，Windows10を入れられる．

##後日談
BootCampのインストールは無事にうまくいったものの，筆者はMacOS側のApp Storeでサインインできなくなる不具合が生じた．
[このページ](https://discussions.apple.com/thread/250144053)にあるiCloudから一旦，全てサインアウトする事によってそれも解決できた．
色々あったけど，うまくいった〜！