OmniAICreator/Qiita-1.07M huggingface dataset:
Google Cloud Next 19のKubernetes Bootcamp に参加した

https://cloud.withgoogle.com/next/tokyo/sessions?session=D0-1-B11

に参加しました。メモとスピーカーの方への質問とその回答です。

### メモ

- Node: コンピューティングするやつ
- MasterノードにPodを配置する
- クラスタ: MasterとNodes
- コンテナ:コンテナ
- Pod:コンテナを束ねたもの
- ReplicaSet: Podの数をコントロールする
- Deployment: 複数のPodとその数を管理
  - ローリングデプロイ
  - カナリヤデプロイ
  - Blue Greenデプロイ
- Service: k8sで提供されている機能LBとか
  - LB podにアクセス割り振る IPをノードと別に持つ
  - Nodeport Nodeのポートを開ける FWをOPENする必要あり

- kubelet: 監視とかするやつ
- Volume: mount可能なにか
- ConfigMap: NginxのコンフィグとかおくVolume
- Secret: Passwordとか秘匿したいものを管理するVolume

- プリエンティブをONにすると安価に検証可能
  - 1/24 Hの頻度で削除される
  - GKEだと勝手に再起動されるので、使い方次第でとても安くなるよ

- auto upgrade
  - 自動的にクラスタ更新

- Helm: kubenetes Appのパケ―ジャー
- spinnaker: 継続的デプロイの管理画面。GKEつかうなら必要そう


### FAQ
監視メトリクスはどこで閲覧できる？

  - kubenetes monitoringをONにするといいよ
  - アラートに遅延があるよ
  - Datadogおすすめ

ログ集約は？
    
  - Logging はStackdriverがいいよ

Cloud SQLとはどうやって統合する？

  - Cloud SQL Proxy Container / IPでも通信可能

リージョンまたいだ管理は可能？

  - GKEではできない
  - kubeフェデレーションでできるかも

サービスによって公開されたIPをDNSに登録するには? 
 
 - GKEから払い出された IPを付与する
  - IP自体を先に取得すべし

LB自体の冗長化考えなくていい？

  - 考えなくていい
  - RTPみたいな長いセッションの通信に対してAutoscaleさせるには？
    - セッションの長通信には向いていない-> スケールを諦めればできるよ

LetsEncryptで証明書取得したいけどどう対処すべき?

  - GKE上のCronjobでできるはずだよ
  - Secretに入れるのがいいよ

Blue Green デプロイではリソース使用量が一時的に大きくなりそうだけど？

  - NodeのAutoScaleで対応可能
  - Scaleinは時間時間かかるよ

argsはdocker runの引数と同じ？

  - そう

kubenetes.yamlに環境変数埋め込める？

  - ENVでしらべるとわかるよ

CLIを自動化する方法はある

  - Terraform

カナリヤデプロイの割合を変更できる？

  - istioつかうらしい

ヘルスチェックを利用するならばアプリケーションにエンドポイントを作成する必要がある？

  - ある

アプリケーションの性能が低下した場合k8sではどう対応するべき？

- HorizontalPodAutoscaler

クラスタのインスタンスサイズは自動的に変更される？

  - 最初に決定されるらしい
  - auto provisioningで最適化されるよ

マスターとノードのインスタンスサイズはどう決定される？

- 最初に設定されるらしい -> auto provisioning

開発とステージングとと本番はどう分けるべきか？

  - ラベルで制御するのが良いよ
    - env: production, staging

##### 思いつき

- docker コマンドとkubectlコマンドの比較表作ったらおもしろいか
Typescriptの配列は横着せずに型を明記しよう

Javascript感覚でTypescriptのコードを書いてたら？？？となったので覚書き

# 結論

`Variable '****' implicitly has type 'any[]' in some locations where its type cannot be determined`

と言われたら


ちゃんと型を指定しよう

```diff
- const array = [];
+ const array: number[] = [];
```

# Typescriptの配列操作でエラーが出た

```typescript
const array = [];
// Variable 'array' implicitly has type 'any[]' in some locations where its type cannot be determined. と怒られます
array.entries(); // メソッドは任意
```

`Variable 'array' implicitly has type 'any[]' in some locations where its type cannot be determined` でググっても、コレというのものが引っかかりませんでした。(というより、エラーメッセージを真面目に読むべきでした)
同じことでハマる誰かのお役に立てば



# 対処法

配列の型を明記しましょう、というだけのお話でした

```typescript
const array: number[] = [];
array.entries();
```

こんな感じで型を指定しないといけないですよということでした。

tsconfig.json の `noImplicitAny` を有効化した場合はこの警告が出るようですね

```tsconfig.json
{
    "noImplicitAny": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */
}
```

# もやもやしたが納得したところ

```typescript
const array: any[] = [];
array.entries();
```

も

```typescript
const array: any = [];
array.entries();
```

もエラーは出ない

`any` は型の恩恵を放棄しているので、まあそうか
`any[]` でもいいの？とは思いましたが、配列への暗黙的な決定がダメだっただけなので問題ないというわけですね

# ちなみに

これはエラーでません。

```typescript
const array = [];
array.push(0);
array.entries();
```

`push` した変数の型で定義されるので、`const array:number[] = []` と同じような扱いにしてくれます。これで逆に？？？になりましたが
(それならやっぱり`any[]`もダメなんじゃないの？）

# おわりに

`const array = []` の時点で配列としてわかるし補完も効くから問題ないじゃん、と思ったのですが。
その思い込みのせいで少しハマりました。
横着せずに型は明記しましょう。
awkのコマンド例

# 目的
業務でawkをよく書くので、コピペするためにここに保存しておく。ある意味、「生きた」コマンド達です笑

# バイブル
[なるべく書かないawkの使い方](https://zariganitosh.hatenablog.jp/entry/20131209/minimum_awk)
[awkコマンドの基本](https://qiita.com/yamazon/items/563af1b485ff413d381f)

# 具体例

## 空白を無くしつつ、カンマで区切る
` cat /tmp/hoge | awk -F' ,' '{{sum = ""} {for(i=1; i <= NF; i++) {sub(" ", "",$i); sum = sum "'\''" $i "'\''" ","}} {print sum} }'`

## 置換しつつ、テキストファイルに出力
`cat hoge.csv | awk '{gsub(/([".]|E9)/, "", $0); print $0}' > fuga.csv`

## 最初の行に文字列を挿入して、置換して、テキストファイルに出力
`cat hoge.csv | awk 'BEGIN{print("ITEM_ID,LABEL")} {sub(/.$/, "", $0); print $0}' > fuga.csv`

## 全行をカンマをつけつつ、結合して出力
`cat /tmp/hoge | awk 'BEGIN{reduced_text = ""} {reduced_text = reduced_text  $0  ",";} END{print(reduced_text)}'`

### 改行文字がcrlfだった時
`tr -d '\r' < ~/Downloads/hoge.csv | awk 'BEGIN{reduced_text = ""} { reduced_text = reduced_text $0 ",";} END{print(reduced_text)}'`

別解
`cat ~/Downloads/hoge.csv | awk 'BEGIN{RS="\r\n"; ORS=","} /../ {print $1}'`

## ""をEMPTYという文字列に置換しながら、ダブルクオテーションと最後の方にある|、スペースを空文字にする
`cat hoge.csv | awk -F',' '{if($2 == "\"\"") {$2 = ",EMPTY"} {gsub(/(\|.$|"| )/, "", $0); print $0}}'`

## .とE9と"を空文字に置換
`cat hoge.csv |  awk '{gsub(/([".]|E9)/, "", $0); print $0}'`

## 1行目に文字列を挿入
`cat hoge.csv | awk 'BEGIN{print("USER_ID,ITEM_ID,TIMESTAMP")} {print $0}'`

## 全ての値に対して""をEMPTYという文字列に置換しながら、ダブルクオテーションと最後の方にある|、スペースを空文字にする
`cat hoge.csv | awk -F',' -v 'OFS=,' '{for(i = 1; i <=NF; i++){if($i == "\"\"") {$i = "EMPTY";}  gsub(/("| |\|.$)/, "", $i)} {print $0}}'`

## 一行目は無視して、ダブルクオテーションを取り除きつつ、文字列連結する。
`cat hoge.csv | awk 'BEGIN{reduced_text=""} {gsub(/(")/, "", $0);} NR!=1{reduced_text= reduced_text $0 ","} END{print reduced_text}'`

## .とE9と"を空文字に置換しつつ、3つめのカラムを10文字になるように0埋めする
`cat hoge.csv | awk -F',' '{gsub(/([".]|E9)/, "", $0); str_length = length($3); if(NR!=1 && str_length < 10){ for(i = 0; i < (10 - str_length); i++){$3 = $3 "0"; } } {gsub(/ /, ",", $0); print $0}}'
`while(i++)`はiの値が実行時に行を渡って保持される。そちらの方がいい時はwhileを使おう。

## 各行を'(シングルクオート)で囲いながら、,(カンマ)をつけていく
`cat /tmp/hoge | awk 'BEGIN{reduced_text = ""} {reduced_text = reduced_text "," "'\''" $0 "'\''"} END{print(reduced_text)}'`

## 改行文字をから文字に置換

`cat /tmp/fuga | awk '{gsub(/(\\n)/, "", $0); print $0}'`

# つまづくポイント
+ $1 = $1 "hoge"のような演算を行うと$0の値が変わる

```
Earth:Development tomitakazuya$ echo 1,2,3 | awk -F',' '{print $0}'
1,2,3
Earth:Development tomitakazuya$ echo 1,2,3 | awk -F',' '{$1 = $1 "hoge"; print $0}'
1hoge 2 3
```
最後の結果は`1hoge,2,3`という風になると思い込んでいたので、ちょっと気づけなかったです。なぜなんだろう？内部的な実装によるものなのかなぁ。
2行でwebpack.config.jsで補完を効かせる方法

[![Image from Gyazo](https://i.gyazo.com/a89693c9ae68dfd3d6f4a889b970b910.gif)](https://gyazo.com/a89693c9ae68dfd3d6f4a889b970b910)

まず前提として、`webpack.config.js`そのものを`TypeScript`で書くことができる。公式ドキュメントにも記載があり、ts化自体は数分で終わる。しかし、この`webpack.config.js`をStoryBookの設定から参照するなど他のツールから読まれるときにTypeScriptだと不都合な場合がある。そのようなときに、この方法を使うと1分もかからず補完の効く環境を用意できる。便利なので是非導入してほしい。

[Configuration Languages | webpack](https://webpack.js.org/configuration/configuration-languages/)

## How
方法は簡単で、`@types/webpack`をインストールし、上の動画のようにコメントを書くだけ。

```
yarn add --dev @types/webpack
```

`webpack.config.js`の`module.exports`の上にコメントで以下を追記。

```js
/** @type import('webpack').Configuration */
```

これで補完が効くようになりました。

## Why
TypeScriptは`allowJs`でTypeScriptだけでなくjsをサポートしているのは知られてる通りだが、JSDoc形式で型を書くこともできる。
[Type Checking JavaScript Files · TypeScript](https://www.typescriptlang.org/docs/handbook/type-checking-javascript-files.html)

```js
/** @type {number} */
var x;
```

これが素晴らしいのは、TypeScriptからJavaScriptへimport可能であるということだ。

```js
/**
 * @typedef { import("./a").Pet } Pet
 */

/**
 * @type {Pet}
 */
var myPet;
myPet.name;
```

はい、それを`webpack`の設定の補完に活用しようというわけだ。
これは`webpack.config.js`に限らず使える技なので、他にもこんな部分で便利だよなどあればコメント欄等で教えてほしい。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">webpackのts化、configが4つ程度なら数分あれば終わるがStoryBookから読まれるwebpackで足をすくわれた</p>&mdash; あかめ@ラインの悪魔.js (@akameco) <a href="https://twitter.com/akameco/status/1136906616698097665?ref_src=twsrc%5Etfw">June 7, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">Tips: @types/webpack をimportするだけでjsのままwebpackの設定を補完の効く環境で書くことができる 🚀 <a href="https://t.co/0aXXZ5Q8UI">pic.twitter.com/0aXXZ5Q8UI</a></p>&mdash; あかめ@ラインの悪魔.js (@akameco) <a href="https://twitter.com/akameco/status/1158185006700744704?ref_src=twsrc%5Etfw">August 5, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
フルJavascriptで開発する上で参考にしたサイト

こんにちは、
普段はPHP or Pythonでサーバーサイド開発をしているのですが、
案件でフルJavascript+AWSを用いたWebアプリケーションを作成することになったので、
参考になるサイトを分野別でまとめました。
箇条書きになるので、ほぼ自分のためです。
日々追加していきます。

【Nuxt.js】

- [Nuxt.js公式](https://ja.nuxtjs.org/guide/)
- [Nuxt.js使ってみた](https://qiita.com/_takeshi_24/items/224d00e5a026dbb76716)

【Vue.js】

- [Vue.js 公式](https://jp.vuejs.org/index.html)
- [jQuery から Vue.js へのステップアップ](https://qiita.com/mio3io/items/e7b2596d06b8005e8e6f)

【node.js】

- [importとrequireどちらを使おう…。](http://sakamock.hatenablog.com/entry/2016/02/03/091623)

【AWS】
【amplify】

- [AWS AppSync + Amplify JavaScript + CustomResourcesで、既存のDynamoDBなどをDatasourceとしたリゾルバーを作成する](https://thinkami.hatenablog.com/entry/2019/07/15/201356)
- [AWS AppSync + RDS を試してみた](https://qiita.com/tasuwo/items/984e6f594cde94e4224e)

【AppSync】

- [AWS Lambda から AppSync の API を ぶん殴る](https://blog.r3it.com/aws-lambda-to-appsync-1aa0c2f1da04)
- [AWS AppSyncで作るサーバレスWebアプリ – (2) App Syncの設定](https://www.pressmantech.com/tech/serverless/4691)
- [チュートリアル : AWS Lambda リゾルバー](https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/tutorial-lambda-resolvers.html)
- オブジェクトを全部取る
  - [allPost リゾルバー (DynamoDB Scan) のセットアップ](https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/tutorial-dynamodb-resolvers.html#setting-up-the-allpost-resolver-dynamodb-scan) 
- オブジェクトを絞り込んで取る
  - [allPostsByAuthor リゾルバー (DynamoDB Query) のセットアップ](https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/tutorial-dynamodb-resolvers.html#setting-up-the-allpostsbyauthor-resolver-ddb-query)
- [API Gateway マッピングテンプレートとアクセスのログ記録の変数リファレンス](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
- リゾルバーの文法
  - [リゾルバーのマッピングテンプレートプログラミングガイド](https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/resolver-mapping-template-reference-programming-guide.html#arrays)
- [ソートキーを使用して、Amazon DynamoDB でデータを編成する
](https://aws.amazon.com/jp/blogs/news/using-sort-keys-to-organize-data-in-amazon-dynamodb/)

【Lambda】

- [AWS Lambda超入門](https://qiita.com/s_s_k/items/b584435120e99d63975b)
- [初めてのサーバーレスアプリケーション開発 ～LambdaでDynamoDBの値を取得する～](https://dev.classmethod.jp/cloud/aws/serverless-first-lambda/)
- Transactionを貼る
  - [transactWrite(params, callback)](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#transactWrite-property) 
- [新機能 – DynamoDB Transactions
](https://aws.amazon.com/jp/blogs/news/new-amazon-dynamodb-transactions/)

【DynamoDB】

- [DynamoDBの設計力をあげたい](https://www.ketancho.net/entry/2018/01/30/075500)
- [LambdaでDynamoDBのトランザクション処理を行う](https://qiita.com/taruyar/items/949fdcb020e6596e48e3)
- [パーティションキーとは](https://aws.typepad.com/sajp/2017/02/choosing-the-right-dynamodb-partition-key.html)

【APIドキュメント】

- [AWS SDK for JavaScript](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/)
Arduino工作を見据えて

「この記事は[リンク情報システム](https://qiita.com/organizations/link_information_systems)（Facebookは[こちら](https://ja-jp.facebook.com/lis.co.jp/)）が主催する
真夏のアドベントカレンダー[「2019 Tech Connect Summer」](https://qiita.com/dgkz/items/2862d5e6b77203a126b3)のリレー記事です。
[「2019 Tech Connect Summer」](https://qiita.com/dgkz/items/2862d5e6b77203a126b3)は engineer.hanzomon のグループメンバによってリレーされます。
　　↑↑[check!!](https://qiita.com/dgkz/items/2862d5e6b77203a126b3)

#はじめに
過去にArduinoを用いて高度計を作ったことを思い出して、また何か作る足掛かりとして
まとめてみました。
深いことは書いていませんがお付き合いください。

#ArduinoとI2C通信
前回作成した高度計、温度計はArduino間の通信を行いました。
この時の通信方法がI2C通信です。
I2Cとは、シリアル通信の方式でMaster側とSlave側に分かれ
双方向での通信を行います。

前回作成時は地上側1つ計測側３つで行ったのですが
Master側１つから複数のSlave側と通信することができます。

#セットアップ
まずは、setup()関数を呼び出します。
使い方は以下の通り。

```.ino
void setup()
{
  Serial.begin(9600);
  Wire.begin();
　/*省略*/
}
```
このsetup()関数はArduinoの電源を入れた時、リセットをした時に
1度だけ呼び出され実行します。
ここでは2つの処理をしています。
###Serial.begin(speed)
シリアル通信のデータ転送レート(speedはint型[bps])
を指定。

###Wire.begin(address)
Wireライブラリを用いるとArduino間でMaster側とSlave側としての通信ができるようになります。
Master側に設定する時はパラメーターを省略できます。

#実行
setup()で設定をしたら、実行させたいことをloop()関数の中に書きます。
loop関数の中でも処理ごとに関数化すると見やすくなります。

実行したいことはこの3つを用います。
###・beginTransmission(address)
addressには送信するSlave側のアドレスを指定します。
ここで指定したSlaveに対して送信を開始します。

###・Wire.write()
Master側が送信するデータをキューに入れる時と
Slave側がリクエストを受けてデータを送信する時に使用します。
###・endTransmission()
beginTransmission で開始をした送信を完了する。
この戻り値が０の時は送信成功。

#最後に
次の機会には何か新しく作ったものを
紹介したいと思います！
↓↓たくさんの興味深い記事がたくさんあります！ご覧ください！↓↓
[「2019 Tech Connect Summer」](https://qiita.com/dgkz/items/2862d5e6b77203a126b3)
初めてのkotlinを触る - Sealed Classes(2)

# 目的
* Sealed Classの定義と状態管理を紹介した
 * https://qiita.com/alingogo/items/cd5ee4bc917c9064bf8a
 * 特にjavaと違う使い方を説明した
* 本文はSealed Classのその他の使い方を紹介する

# 内容

## 例外処理の苦労点

* kotlin言語には、チェック済み例外がない
* ドキュメントにに明文化されず、発生しても誰にも気付かれない恐れがある


## sealed classで解決できる
* 例外を投げることを代わりに、違う結果インストールを返す(例：success, error...)
 * もし処理結果ケースが足りない場合は、コンパイラーは自動的に何か結果ケースが足りないことを通知できる
* 結果ケースが同じファイルに定義されるので、読みやすくになる
* javaぽいexceptionの定義




### exceptionでの処理方法

```
fun requestWeatherIcon(id: String): WeatherIcon = try {
    API.getWeatherIcon(id)!!
} catch (ex: IOException) {
    throw IconClientException(
        message = "Io request failed",
        cause = ex
    )
} catch (ex: RestClientException) {
    throw IconClientException(
        message = "Server request failed. Id: $id.",
        cause = ex
    )
}

class IconClientException(message: String, cause: Exception? = null) : RuntimeException(message, cause)
```

### sealedで結果ケースを定義

```
sealed class IconResult {
	data class Success(val icon: WeatherIcon) : IconResult()
	data class Error(val message: String, val cause: Exception? = null) : IconResult()
}


```

### sealedで処理

```
fun requestWeatherIcon(id: String): IconResult = try {
	val iconProfile = API.getWeatherIcon(id)
	IconResult.Success(icon = iconProfile)
} catch (ex: IOException) {
	IconResult.Error(
		message = "Server request failed. Id: $id.",
		cause = ex
	)
} catch (ex: RestClientException) {
	IconResult.Error(
		message = "Server request failed. Id: $id.",
		cause = ex
	)
}

val icon = when (val result = requestWeatherIcon("3")) {
    is IconResult.Success -> result.icon
    is IconResult.Error -> "http://domain.com/defaulIcon.png"
}
```

### 足りない場合はcompile error

```
val icon = when (val result = requestWeatherIcon("3")) {
    is IconResult.Success -> result.icon
}
```

```
'when' expression must be exhaustive, add necessary 'is Error' branch or 'else' branch instead
```

# 参照
* [checked例外とunchecked例外 \- 文系seの備忘録](http://samooooon.hatenablog.com/entry/2015/02/25/161938)
* [Kotlin does not have checked exceptions\.](https://kotlinlang.org/docs/reference/exceptions.html)
Photon(PUN 2)のインスタンス化を Resources から Prefab に変更する

# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しています、今回は[この記事](https://www.fast-system.jp/unity-photon-resources-to-prefablist/)の転載になります。*


Unityのネットワークライブラリの Photon を使う場合に、Photonのインスタンス化を Resources から 自分で指定したプレファブリストに変更する方法をご紹介したいと思います。

# Photon とは？

[PUN 2 – FREE](https://assetstore.unity.com/packages/tools/network/pun-2-free-119922?aid=1101l7pnr) （無料版）
[Photon PUN 2+](https://assetstore.unity.com/packages/tools/network/photon-pun-2-120838?aid=1101l7pnr) （有料版）

Photon とは***マルチプレイヤーゲーム***を作る場合にネットワーク部分を担当してくれる***ネットワークライブラリ***になります。

例えば、モンストなどのゲームを作る場合には同時プレイしている***４人の画面の情報を同期***しないといけないですよね？そんな時に Photon を使うとネットワーク部分のめんどくさい部分を一括して担当してくれます。

# 使い方

## Photon の使い方

Photon の使い方は今回のテーマではないので他の記事に譲ります。

今回は、Photon を使う時に困る事の１つとしてインスタンス化する際に Resources に Prefab を格納しないといけないのですが、これを自分で定義したリストから生成するように変更します。

## Resources から Prefab への変更方法

通常 Photon では、文字列の名前から Resources を検索してヒットしたオブジェクトをインスタンス化の対象とします。

上記のソースコードは Photon内で、「DefaultPool」で定義されているソースコードになります、中身簡単に読んでみると ***Resources で定義された Prefab をキャッシュしなから要求があれば、インスタンス化***してくれる実装になっています。

今回はこの実装を、***自分で作った Prefabリスト からインスタンス化してくれる実装***に差し替えたいと思います。

## ソースコード

以下のソースコードを追加します。

```C#:MyPhotonPool.cs
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;

public class MyPhotonPool : MonoBehaviourPunCallbacks, IPunPrefabPool
{
    public List<GameObject> PrefabList;

    public void Start()
    {
        // Poolの生成イベントを書き換える
        PhotonNetwork.PrefabPool = this;
    }

    public GameObject Instantiate(string prefabId, Vector3 position, Quaternion rotation)
    {
        foreach (var s in PrefabList)
        {
            if (s.name == prefabId)
            {
                var go = Instantiate(s, position, rotation);
                go.SetActive(false);
                return go;
            }
        }

        return null;
    }

    public void Destroy(GameObject go)
    {
        GameObject.Destroy(go);
    }
}
```

## 使い方

### プールの定義

MyPhotonPoolスクリプトを適当なオブジェクトに追加して、PrefabList に Photon の生成対象となる Prefab を指定します。


![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/c2fab7e6-aeb3-5f92-48e6-da9f89d62b25.png)

### 呼び出し側

呼び出し側は***通常通り***のインスタンス化の方法で使ってください。

```C#
// 文字列で指定
PhotonNetwork.Instantiate("BigAsteroid", Vector3.zero, Quaternion.identity, 0);

// Prefabの名前で指定
PhotonNetwork.Instantiate(prefab.name, Vector3.zero, Quaternion.identity, 0);
```

# 終わりに

*よければ ブログ「[Unity+AssetStoreおすすめ情報](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
Unity：Componetの有効・無効を動的に切り替える

# はじめに

よく使う事があるのでメモ程度に残しておきます。

# ソースコード

１つのモデルのColliderのON/OFFを切り替えた使った場合に、コンポーネンツの追加・削除を行うより、有効・無効を切り替えるほうがスマートかなと思ったのでその方法。

Monobehaviourを継承しているComponentにはenabledのプロパティがあるのでそれの切替。

```C#
GetComponent<BoxCollider>().enabled = false;
```

# 終わりに

*よければ ブログ「[Unity+AssetStoreおすすめ情報](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
Unity：HoloLensで利用できる入力イベント（MRTKを使わない標準機能のみ）

# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

最近、HoloLensをまた触り始めたのでその情報を粛々と追加していってみたいと思います。

# Unity標準で利用できる入力イベント

MRTKを使ってHoloLensの入力イベントなどを実装できる仕組みはよくご存じかと思いますが、MRTKを使うまでもないなどの場合には、Unity標準で使えるもので間に合わせるのがよいですよね。

HoloLensとImmersiveデバイスで同様の挙動をする場合もありますが、違う場合もあるので Immersiveデバイス を使う場合は注意ですね。

Detect : 手が認識範囲になった。
Lost：手が認識範囲から出た。
Update：手の位置が変わるたびに呼び出される。
Press：エアタップしたら呼び出される。
Release：エアタップの指が離されたら呼び出される。

```C#
void Start()
{
    InteractionManager.InteractionSourceDetected += SourceDetected;
    InteractionManager.InteractionSourceUpdated += SourceUpdated;
    InteractionManager.InteractionSourceLost += SourceLost;
    InteractionManager.InteractionSourcePressed += SourcePressed;
    InteractionManager.InteractionSourceReleased += SourceReleased;
}

void SourceDetected(InteractionSourceDetectedEventArgs state)
{
  // Detect
}

void SourceUpdated(InteractionSourceUpdatedEventArgs state)
{
  // Update
}

void SourceLost(InteractionSourceLostEventArgs state)
{
  // Lost
}

void SourcePressed(InteractionSourcePressedEventArgs state)
{
  // Press
}

void SourceReleased(InteractionSourceReleasedEventArgs state)
{
  // Release
}
```

# 終わりに

*よければ ブログ「[Unity+AssetStoreおすすめ情報](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
多次元配列のメモリレイアウト方式について

# はじめに
多次元配列のメモリレイアウト方式について調べた内容を記事にしました。

# 多次元配列要素のメモリレイアウト方式
1次元配列は各要素がメモリ上の連続したアドレスに格納されますが、多次元配列の場合実装方式は主に3つの種類があり、言語によって異なります。
以下では、2次元配列Aを例に実装方式の違いを説明しています。

```math
A[i][j] \quad (i = 0, 1 \quad j = 0, 1, 2)
```

### Row-major order
Row-major order方式では配列Aの各要素とメモリ上の値の対応は以下の表のようになります。
簡単のため、配列Aの最初の要素のメモリアドレスを0としています。
この方式では配列を各行ごとに順にアクセスすることでメモリ上でのシーケンシャルアクセスなアクセスが可能となります。

| アドレス | 値 |
|:---:|:---:|
| 0 | A[0][0] |
| 1 | A[0][1] |
| 2 | A[0][2] |
| 3 | A[1][0] |
| 4 | A[1][1] |
| 5 | A[1][2] |

### Column-major order
Column-major order方式ではRow-major order方式とは反対に各列ごとに順にアクセスすることでメモリ上でのシーケンシャルアクセスなアクセスが可能となります。
配列Aの各要素とメモリ上の値の対応は以下です。

| アドレス | 値 |
|:---:|:---:|
| 0 | A[0][0] |
| 1 | A[1][0] |
| 2 | A[0][1] |
| 3 | A[1][1] |
| 4 | A[0][2] |
| 5 | A[1][2] |

### Iliffe vectorを用いた方式
Iliffe vectorとは多次元配列を実装する際に用いられるデータ構造の１種で、N次元配列に対し、(N-1)次元配列のポインタで構成された1次元配列です。
この方式は上の２方式とは若干異なっており、2次元配列の各行のポインタからなる配列と各行データの配列からなります。

| アドレス | 値 |
|:---:|:---:|
| 0 | $p_0$ |
| 1 | $p_1$ |

| アドレス | 値 |
|:---:|:---:|
| $p_0$ | A[0][0] |
| $p_0 + 1$ | A[0][1] |
| $p_0 + 2$ | A[0][2] |

| アドレス | 値 |
|:---:|:---:|
| $p_1$ | A[1][0] |
| $p_1 + 1$ | A[1][1] |
| $p_1 + 2$ | A[1][2] |

# メモリレイアウトを意識したコーディング
メモリ上のデータにアクセスする場合はシーケンシャルにアクセスしたほうが処理時間が短くなります。その理由は以下の２つです。

- メモリ(DRAM)上のデータの読み出しはランダムアクセスよりシーケンシャルアクセスの方が速い[^1]
- 連続したデータの方がCPUのキャッシュやSIMD[^2]などの処理高速化の仕組みの恩恵を受けやすい。

したがって

- Row-major order方式、Iliffe vector を用いた方式  
  ⇒ 行ごとにアクセスする (A[0][0], A[0][1], A[0][2], A[1][0], ...)
- Column-major order方式  
  ⇒ 列ごとにアクセスする (A[0][0], A[1][0], A[0][1], A[1][1], ...)  

のようにアクセスすることで、処理時間を最小限に抑えることができます。

# 言語ごとの実装方式
いくつかの言語について実装方式の違いを表にまとめました。

| 実装方式 | 言語 |
|:---:|:---:|
| Row major | C, C++, Go, Python(Numpy) |
| Column major | Fortran, MATLAB, R |
| Iliffe vector | Java, C#, Scala, Swift |

# 参考
- 本記事全般についての参考  
  https://en.wikipedia.org/wiki/Row-_and_column-major_order
- Iliffe vectorについて  
  https://en.wikipedia.org/wiki/Iliffe_vector
- Go言語の配列メモリレイアウト  
  https://stackoverflow.com/questions/39561140/how-is-two-dimensional-arrays-memory-representation
- DRAMアクセス速度について  
  https://www.quora.com/Is-sequential-access-to-RAM-faster-than-random
- SIMD, キャッシュ  
  プロセッサを支える技術 (Hisa Ando) https://www.amazon.co.jp/dp/4774145211/

[^1]: DRAMは2次元的に並んだコンデンサとトランジスタからなっており、メモリの読み出し時は目的アドレスのコンデンサを含むコンデンサ列全体を放電させて電圧値を読み取るのでシーケンシャルアクセスのほうが速く読み取れる。
[^2]: SIMD(Single Instruction Multiple Data) 1つのCPU命令を複数のデータに対して同時に実行する仕組み。通常よりもサイズの大きいレジスタに複数のデータをロードし、それらに対し同一の演算を実行する。データのアドレスが連続している場合、1回のSIMDロード命令でレジスタ1個分のデータをロードできるが、アドレスが不連続の場合、複数回のロード命令が必要となる。
Golangで未使用の変数エラーを消す方法

`stringconv.Atoi`などのerrを二つ目の返り値として返してくれる関数を利用する際、errに代入した後使用しないと実行時にエラーが発生します。

```go
func main() {
  var stdin = bufio.NewScanner(os.Stdin)
  stdin.Scan()
  var n, err = strconv.Atoi(stdin.Text())
  fmt.Println(n)
}
```

```terminal
$ go run hoge.go
# command-line-arguments
./x_cubic.go:13:7: assignment mismatch: 1 variable but strconv.Atoi returns 2 values
```

しかしだからといって二つの返り値を変数に格納しないと、割り当てが間違っているという別のエラーが返却されることになります。

```terminal
$ go run x_cubic.go
# command-line-arguments
./x_cubic.go:13:7: assignment mismatch: 1 variable but strconv.Atoi returns 2 values
```

そのため必ず返り値を変数に代入する必要があるのですが、未使用エラーを発生させない必要があります。

このような状況の場合、`_`(アンダースコア)を利用するとエラーが発生しなくなります。

```go

func main() {
  var stdin = bufio.NewScanner(os.Stdin)
  stdin.Scan()
  var n, _ = strconv.Atoi(stdin.Text())
  fmt.Println(n)
}
```

これはGo公式では[Blank identifier](https://golang.org/doc/effective_go.html#blank)という名称になっているようです。

## 参考

https://stackoverflow.com/questions/21743841/how-to-avoid-annoying-error-declared-and-not-used
フロントエンドとバックエンドとブロガー

ブロガーはエンジニア？HTMLはテキストだけであればメールが打てれば合格。タグはクリックだけでできるから、いわば小学生からでもできることになります。UI、UXという分野では一般の意見も求められるもので、つまりは専門のSEやプログラマーだけではユーザーの意見が反映されにくいことを意味しています。

そもそもフロントエンドエンジニアはHTMLやCSSなどの言語を使ってプログラミング作業をすることです。技能職ですが、ブログや簡易なホームページ制作ではCMSなどもあり、経験や知識のハードルが下がってきてます。<a href="https://kegawa-kaitori.net/kawasaki-shop-list/" >川崎でファーコート売りたい</a>というニーズ。ウォンツという潜在的な欲求に気づけないと、永遠にユーザー体験は良くならないのです。

ブロガーってそもそもなに？彼らはエッセイを書くように自分の出版物＝WEBサイトを作ってます。ウェブログで、日記のログデータを作っている人も。それに価値があるならログにもお金を払うだけの価値があるのでしょう。タレントの自伝小説が数千円で売れるのですから、人気者に与えられた特権なのです。

ブログはフロントエンドと言えます。それもUXに優れているから、再訪問されてリンクもシェアもされる。ユーザー体験の一端としてブログがお手本でもあることに気付かされるわけです。
【CakePHP3】Composerでは管理できない外部ライブラリを読み込む方法

PHPは歴が浅いので間違ってたらごめんなさい。

基本外部ライブラリはComposer管理なのはわかってるんですが、Composerで管理されていないくて、かつ、Composerの規約に沿っていない外部ライブラリはどう記述すればいいか分散していてたのでまとめ。

# やり方

## 1. ファイルを配置する
vendor フォルダの下に `vendor/$author/$package` の形式でファイル一式を置く。
vendor/web_client/src/com/hogehoge/・・・
みたいな感じ

## 2. composer.jsonにファイルにfileを配置した場所を追記する

[ベンダーファイルの読込](https://book.cakephp.org/3.0/ja/core-libraries/app.html#id5)
ここに書いている通り。

```
"autoload": {
    "psr-4": {
        "App\\": "src/",
        "App\\Test\\": "tests/"
    },
    "classmap": [
        "vendor/utilites/src"
    ]
}
```
## 3. 実際にインポートして使うには

参考 [How to import vendor files in CakePHP 3x](https://stackoverflow.com/questions/26562930/how-to-import-vendor-files-in-cakephp-3x)

例えば、vendor/web_client/src/com/hogehoge/input/Request.php みたいなクラスを使いたいときはこんな感じで、require_onceで読み込んで、use で使うクラスを宣言？すれば良いっぽい。

```FindById.php
require_once ROOT . DS . 'vendor' . DS . 'web_client' . DS . 'src' . DS . 'com' . DS . 'hogehoge' . DS . 'input' . DS . 'Request.php';

use Request;

    function search($id)
    {
        //Requestクラスをインスタンス化します
        $request = new Request();
```

毎回絶対パスで記述するのは辛いので、ある程度のパスをpaths.phpにdefineしちゃって使ってます。

ようやく仕組みがわかってきたなー。それでは。
「量子理論の副産物に過ぎなかった」

参照[「量子理論の副産物に過ぎなかった」──東芝の「量子コンピュータより速いアルゴリズム」誕生秘話 (1/5)](https://www.itmedia.co.jp/news/articles/1907/30/news030.html)

　私個人の備忘録です。
　脳内の客観性認識を、そのまま、研題化したコンピュータの出現。
　第三者観部分を高速化すると、コンピュータ演算が早くなる仕組みを原理化できると言う話であろうか？
WindowsでPython3とNumPy, SciPy, Matplotlib, pandas, scikit-learn, OpenCVをインストールした

# はじめに
Python3をインストールします。
それに併せて、パッケージ(NumPy, SciPy, Matplotlib, pandas, scikit-learn, OpenCV)のインストールも行います。

# 環境
Windows10

# 実装
### Pythonをインストールする
下記よりPython3をダウンロードしました。
https://www.python.org/downloads/windows/

```
Stable Releases
L Python 3.7.4 - July 8, 2019
  L Download Windows x86-64 web-based installer
```
PowerShellを開き、以下のコマンドでPythonがインストールされていることを確認します。

```
python
```
正常にインストールされている場合、コマンドラインからPythonを実行できるようになっています。
終了したい場合は以下のコマンド。

```
exit()
```
### 必要なパッケージをインストールする
OpenCVはインストールしてからPythonに関連付けるのは手間らしいので、非公式ビルド済みパッケージをインストールしました。
参考([pip で OpenCV のインストール](https://qiita.com/fiftystorm36/items/1a285b5fbf99f8ac82eb))
下記のようにインストールしていく。

```
python -m pip install numpy
python -m pip install scipy
python -m pip install matplotlib
python -m pip install pandas
python -m pip install scikit-learn
python -m pip install opencv-contrib-python
```
次に、正常にインストールされたかを確認する。

```
python -m pip list

Package               Version
--------------------- --------
cycler                0.10.0
joblib                0.13.2
kiwisolver            1.1.0
matplotlib            3.1.1
numpy                 1.17.0
opencv-contrib-python 4.1.0.25
pandas                0.25.0
pip                   19.0.3
pyparsing             2.4.2
python-dateutil       2.8.0
pytz                  2019.2
scikit-learn          0.21.3
scipy                 1.3.0
setuptools            40.8.0
six                   1.12.0
```
以上です。
SVNのAuthzSVNAccessFileについて

SVNリポジトリでアクセス権限を設定することがあり、
リポジトリごとのアクセス権限設定の書式、優先順位等の設定で苦労したので
まとめることにしました。
間違った内容があれば教えていただけると助かります。

## AuthzSVNAccessFileを用いるための設定

### Apacheの設定

#### LoadModule

Apacheが読み込むModuleを設定ファイルの上部に記述します。
特に今回必要となるのは最後の`authz_svn_module modules/mod_authz_svn.so`です。

```subversion.conf
LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
```

#### Location or Directory

SVNリポジトリ用のディレクティブを設定ファイルに記述します。
AuthzSVNAccessFile自体を書かない場合、特にリポジトリごとのアクセス制限はかかりません。

```subversion.conf
<Location /home>
  DAV svn
  <~省略~>
  AuthzSVNAccessFile /var/lib/subversion/conf/accessfile
  <~省略~>
</Location>
```

上記以外のSVNの設定に関しては以下が参考になります。
[【SVN】サーバにSVNを導入しよう](https://qiita.com/ohuron/items/d902ee3b8037abe8f09b)


## AuthzSVNAccessFileファイルについて

ファイル例です。

```accessfile
[group]
developers = suzuki, tanaka

[/]
* = r

[dev_repo:/]
@developers = rw

[dev_repo:/secret]
* = 
@developers = r
suzuki = rw
```

### 1. [group]について

グループ定義です。
権限設定の際にグループ名を指定することで、グループに登録されたユーザー全体に権限設定がされます。
ここで使用するユーザー名は`htpasswd`や`LDAP`で設定しているものと同じにしてください。


左辺に任意のグループ名、
右辺にグループに設定するユーザー名をカンマ区切りで羅列します。

```
[group]
<group1> = <user1>, <user2>, <user3>
<group2> = <user4>, <user5>, <user6>
```

### 2. 権限設定の書式について

| 設定例     | 設定内容 |
|------------|----------|
|hoge = |hogeに**参照・書き込み権限を付与しない**|
|hoge = r | hogeに**参照権限**のみ付与する|
|hoge = w | hogeに**書き込み権限**のみ付与する|
|hoge = rw| hogeに**参照・書き込み権限**を付与する|
|<span>@</span>var = <上記設定>|グループvarに設定した権限を付与する|
|* = <上記設定>|ユーザー全体に設定した権限を付与する|
|※無記載|ユーザー全体に**参照・書き込み権限を付与しない**|

※無記載： [/]や[svb_repo2:/work/asset]以下で無記載にした場合です。

#### 設定の優先順位

- アクセス階層により近い設定が優先される
- アクセス階層に設定がない場合は、アクセス階層の上の階層の設定が使用される
- アクセス階層の設定でuser1しか権限設定しておらず、上の階層（`[/]`など）にて`* = <権限設定>`を設定している場合は、user1以外は`<権限設定`が設定される
- `* = `と`user1 = rw`を同一階層に設定した場合、user1はrwを持ち、user1以外は権限を持たない


#### 優先順位の簡単なまとめ
- \*の設定　＜　groupの設定　＜　user1の設定　※\*とgroup/user権限はORで設定、groupとuserはuser優先で上書きされる
- [/]　＜　上の階層の設定　＜　アクセス階層の設定　※権限は上書きされていく

例えば以下の設定における`suzuki`の`/svn_repo1/file.pdf`への権限は**rw**になります。

```
[/]
* = rw
suzuki = 
```

以下の設定における`suzuki`の`/svn_repo1/file.pdf`への権限は**r**になります。

```
[/]
* = rw

[svn_repo1:/]
* = 
suzuki = r
```

なので、一部のユーザーのみ権限を付与したくない場合は、
Bad Case: *でrw権限を付与
Good Case: 権限を付与したいユーザーが所属するグループを定義して、グループに対してrw権限を付与
になります。

規模が大きいとGood Caseはgroupの管理が膨大になることがデメリットでしょうか。

### 3. リポジトリ指定の書式について

基本的には以下の2つで設定します。

```
[/]                  //すべてのリポジトリに対して権限設定（デフォルトルール）
[<reponame>:/<path>] //あるリポジトリreponameのpath(file or directory)に対して権限設定
```

<path>について、ディレクトリを指定する場合に2パターンがあります。

|書式|設定内容|
|----|-------|
|/dir_path|ディレクトリ以下にも再帰的に権限設定を行う|
|/dir_path/|ディレクトリ単体に権限設定を行う|

## まとめ

細かにアクセス権限を設定できるのはSVNならではのメリットじゃないでしょうか。
が、書式を理解していないと想定外の挙動が起きます。
書式の設定ミスでいうと、<span>@</span>の付け忘れや
権限を付与しない場合に`=`と改行の間にスペースを入れ忘れなどでしょうか。

想定外の挙動を防ぐためにも書式を理解しようと思いました。

## 参考サイト

[【SVN】サーバにSVNを導入しよう](https://qiita.com/ohuron/items/d902ee3b8037abe8f09b)
[リポジトリごとにアクセス許可を設定する](http://marupeke296.com/IKDADV_SVN_Permission.html)
[AuthzSVNAccessFileでのsvnauthzファイルについて](http://izuming.hatenablog.com/entry/2013/03/02/044840)
【2019年版】macのターミナルにFishとFishermanを導入する

# 何ができるのか
#### ターミナルの`画面が綺麗に` なる , コマンドがとっても `使いやすく` なる。
*補完機能がすごかったり、コマンドに色が付いてわかりやすくなったり*

<img width="682" alt="スクリーンショット_2019-08-05_3_36_18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468787/8b2a72bc-778b-1960-af79-6fd4b7169ab1.png">

>なんだか嬉しい気持ちになれル

# 目的
fishやfisherを導入する為のコマンドの情報が新しいのや古いのが混在していて知らないとハマる。

**しっかりその罠に引っかかった**ので備忘録として

あと自分的には知りたい情報が散ってて困ったので、ここでは`画面を綺麗にすること`と`使いやすくすること`を目的に、シンプルにFishとFishermanを導入してテーマを変えるところまでをまとめました

# 環境条件
・Macのターミナル
・Homebrew 2.1.9

# `Fish`をインストール

```
$ brew install fish
```

一応できてるか確認もしてみる

```
$ fish -v
//fish, version 3.0.2
```

#shellをFishにする
まずはfishのパスを確認

```
$ which fish
/usr/local/bin/fish
```
次にfishを使えるshell一覧に追加します。

```
$ sudo -e /etc/shells
```
を実行すると下のような画面に移るので、
<img width="682" alt="スクリーンショット_2019-08-05_3_01_29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468787/96c73532-3fd0-903c-cf87-59181c097b70.png">
まずは`a`を押して編集モードにして、
さっき確認したfishのパス`/usr/local/bin/fish`を一番下に追加します。

そしたら`Esc` → `:wq`の順でキーボードを打てば編集と保存の完了です


```
$ chsh -s /usr/local/bin/fish
```
最後にこれを実行して再度ターミナルを立ち上げてみると`fish`になっています
<img width="682" alt="スクリーンショット_2019-08-05_2_51_41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468787/96fa9aa2-28c7-87d1-0314-76c6f79edc70.png">


# `Fisherman`を導入する
```
$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher
```

# テーマを選ぶ

いよいよ画面を自分好みにするステップにさしかかります(´ｰ｀)嬉

テーマはここから好きなのを選べます
https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/Themes.md

ちなみに私は`bobthefish`にしました

# テーマを導入する

`fisher add oh-my-fish/theme-テーマ名` でテーマを導入できる

```
$ fisher add oh-my-fish/theme-bobthefish
```
上のコマンドの実行が終わった時点で新しくターミナルを立ち上げてみるとテーマが適用されていることが確認できます

# 文字化け解消の為`powerline`をインストール
テーマが変わって綺麗〜ってなるはずが、記号が文字化けを起こしてしまっています
<img width="682" alt="スクリーンショット_2019-08-05_3_05_21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468787/42592d6f-8ddb-e118-fee0-973f87bc5424.png">

これを解消させるために`Powerline Font`をインストールします

```
$ git clone https://github.com/powerline/fonts.git
$ cd fonts
$ ./install.sh
```
上記の３つを順に実行して`Powerline Font`のインストールは完了です。

# フォントを変更する
macのターミナルではここからフォントの変更をします。
![スクリーンショット_2019-08-05_1_18_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468787/178bb91d-0e5f-22b7-8df2-1fbf03e52770.png)

語尾に`for Powerline`と書いてあるフォントを選びましょう
![スクリーンショット_2019-08-05_1_20_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468787/b5bde62f-be0b-34c2-b191-0119670a7717.png)

そうすると無事このように文字化けが解決しテーマの導入が完了しました＼(^^)／
<img width="682" alt="スクリーンショット_2019-08-05_3_06_00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468787/6805659a-e6c1-87da-8aa6-b48581477129.png">
<img width="682" alt="スクリーンショット_2019-08-05_3_06_24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468787/96f48454-e4dd-4727-a03d-8bf1fb1c7917.png">
ちなみに私は`Roboto Mono Lght for Powerline`を使っています


# 結果
**先輩のターミナルに近づいて嬉しかった**
*ターミナル苦手克服の第一歩が踏み出せそう*
Content Hugging PriorityとContent Compression Resistance Priorityまとめ(StackView)

# 概要
`Content Hugging Priority`と`Content Compression Resistance Priority`は主に`UIStackView`で使うもので、
制約と組み合わせると(こいつ自身も制約といえば制約だけど)
`UIStackView`内で**大きさが可変する可能性のあるUI**をうまく管理できる

詳しい内容は後で追記
・親Viewやデバイスの大きさが中のコンテンツ(=子View)(`priority`を適用するView)
**より大きい**
`Content Compression Resistance Priority`→**低い方が縮む**
**より小さい**
`Content Hugging Priority`→**低い方が余白で広がって埋める**



# 参考記事
**・[Auto Layoutで固有サイズを使いこなそう | Money Forward Engineers' Blog](https://moneyforward.com/engineers_blog/2016/04/05/auto-layout/)**
**・[StackViewの優先度 Content Hugging PriorityとContent Compression Resistance Priority](https://blog.officekoma.co.jp/2019/02/stackview-content-hugging.html)**
**・[今更だけど正しく身につけよう『Content Hugging Priority』と『Content Compression Resistance Priority』 - Takahiro Octopress Blog](http://grandbig.github.io/blog/2018/08/04/content-hugging-priority/)**
**・[【Swift】Compression Registance PriorityとContent Hugging Priorityをコードから考える - Qiita](https://qiita.com/shiz/items/523e3741899e9607c26f)**
PRESTOで必要なテーブルをワイルドカード指定で検索する方法



##テーブルを名称から検索する
```sql
SELECT  
  CONCAT(table_schema, '.', table_name) AS DB_TABLE_NAME
FROM
(
  SELECT 
    DISTINCT table_schema, table_name
  FROM
    information_schema.tables
  WHERE
    table_schema LIKE '%scheme%'  -- ここに検索対象のschemeを指定する
  AND
    table_name LIKE '%table%'  -- ここに検索したいテーブル名称を指定する
)
;
```
###出力結果例
| DB_TABLE_NAME|
|:-------------|
| scheme.table1|
| scheme.table2|


## カラム名が存在するテーブルをすべて検索する
```sql
SELECT 
  CONCAT(table_schema, '.', table_name) AS DB_TABLE_NAME
  , column_name
  , comment
FROM
(
  SELECT
    DISTINCT table_schema, table_name, column_name, comment
  FROM 
    information_schema.columns
  WHERE
    table_schema LIKE '%scheme%'  -- ここに検索対象のschemeを指定する
  AND
    column_name LIKE '%column%'  -- ここに検索対象のcolumnを指定する
)
; 
```
###出力結果例
| DB_TABLE_NAME | column_name | comment |
|:-----------|------------:|:------------:|
| scheme.table1|　X_column  | hello|
| scheme.table2|　column_name| hi!   |
| scheme.table3|　column_id| good morning|
地味だけど重要なカーソル位置の表示

## カーソル位置を明確にする

### デフォルトではとにかくわかりづらい検索時のカーソル位置

結構わかりづらいvimのデフォルトカーソル位置。コマンドライン版のvimはバックが暗く、特定言語のハイライト色がポップなので、カーソルがとにかく目立たない。特に検索したとき、今どの位置の結果にカーソルが当たっているか、カーソル動かさないとまじ分からん。。

以下、setCookie関数を検索した結果なのだが、一発で分からん。よーく見るとうっすらと縦棒が見える。間違い探し状態w

<img width="555" alt="201908050213.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/59159dbd-c4d3-44c1-8ff5-426e7e9e584c.png">

### 検索キーワードのハイライト

まずはどこが検索したキーワードなのか一発で分かるようにしたい。そこでvimのコマンドで検索キーワードをハイライト。

```
set hlsearch
```

検索キーワードがどこにあるのかは一発で分かるようになったが、、、カーソルはどこにあるのか不明というのは解消されていない。
以下では、setCookieキーワードがどこにあるのかは分かるようになったが、肝心のカーソルがどこのキーワードに位置しているのか全く分からなくなった。

<img width="554" alt="201908050211.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/f1a6a5cd-f899-65b7-f285-440e70414191.png">

### カーソル形状の変更

取り急ぎカーソル位置を一発で知りたい。コマンドモード時のカーソル形状をブロック型にする。

```
let &t_ti.="\e[1 q"
let &t_SI.="\e[5 q"
let &t_EI.="\e[1 q"
let &t_te.="\e[0 q"
```

検索キーワードをdataにして検索結果を１画面に多く表示するようにしてみた。ブリンクしてるからなんとなくわかると思うけど、まだよーく見ないと分からん状態。

<img width="554" alt="201908050230.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/67b47ebe-2414-7eaa-ff5f-03d43a0be8d7.png">

### 検索キーワードの配色を変更

検索キーワードの色を変えてみる。

```
hi Search ctermbg=Blue
hi Search ctermfg=White
```

これでようやく検索後にカーソルがどこになるのか1秒以下で判断できるようになった。

<img width="556" alt="201908050235.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/90036e77-5a2e-e0b1-d8c6-b951088f8a38.png">

でも、このままだと検索キーワードが強調されたまま。検索キーワードが不要になった後も、気になって編集しづらい。:nohコマンドで解消するが、いちいち面倒。

### 不要になった検索キーワードの強調表示を簡単に消す

escｘ２で検索キーワードをoffにするようにキーバインドを変更

```
nnoremap <ESC><ESC> :noh<CR>
```

いいねー！

<img width="559" alt="201908050244.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466853/ba612c8d-7c4f-b972-e5f3-9579b0a7c32f.png">
tkinterを使う

pythonでtkinter使う。
tkinterは癖があるので、手間取ったときに書き足していく記事。

#画像表示の関数化ができない
```
# 見本
# labelもしくはcanvas widgetのどちらか好きなほうで。
import tkinter as tk
import pyautogui
from PIL import ImageTk
root = tk.Tk()
img = pyautogui.screenshot(region = (12,34,56,78))
img = ImageTk.PhotoImage(img)
label = tk.Label(image=img)
label.pack()
root.mainloop()
```

```
# 関数化できない
import tkinter as tk
import pyautogui
from PIL import ImageTk

root = tk.Tk()
def test():
    img = pyautogui.screenshot(region = (12,34,56,78))
    img = ImageTk.PhotoImage(img)
    label = tk.Label(image=img)
    label.image = img # keep a reference!
    label.pack()
test()
root.mainloop()
```

pythonのガベージコレクションという機能でimg変数が破棄されている可能性があるとのこと。img.image = imgのようにimgインスタンス・オブジェクトの中にimageアトリビュートなどを作ってがっちりと保持する必要がある。
実行中のタイムライン全体にわたって存在する変数（グローバル変数的なもの）を作る必要がある。
PhotoImageで作ったものは破棄されるとの[情報(stackoverflow)](https://stackoverflow.com/questions/15433771/python-tkinter-why-is-this-jpeg-not-showing)あり。

```
# 解決
# 行1を追加
import tkinter as tk
import pyautogui
from PIL import ImageTk

root = tk.Tk()
def test():
    img = pyautogui.screenshot(region = (12,34,56,78))
    img = ImageTk.PhotoImage(img)
    img.image = img #1
    label = tk.Label(image=img)
    label.pack()
test()
root.mainloop()
```

[（参考文献）tkinterで画像が表示できない？](http://lrcgf.hatenablog.com/entry/2013/06/30/222918)

#画像関係のエラーメッセージ

```
TclError: image "<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=●●x●● at 0x00000000>" doesn't exist
```
```
canvas object.canvas_image(0, 0, image = ここ)
```
画像の指定がうまくいっていない

続く
flutterで"Could not get cmap table size!"というエラーが発生した時の対処法

# 現象
flutterでandroidアプリを開発していたら、突然、`Could not get cmap table size!`というエラーが発生し、以下のように表示されるはずのマテリアルアイコンが、
<img width="26" alt="nomal.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279908/2d906315-06bd-a18a-1ab8-a9e56ebf09cc.png">
以下のように表示された。
<img width="44" alt="error.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279908/cf80acca-e128-e34d-f3b1-6cda3052b942.png">

コードは以下の通り。

```
  IconButton(
    icon: Icon(Icons.refresh),
    onPressed: updateArticles,
  )
```


# 環境
- Dart 2.4.0
- Flutter 1.7.8
- Android Studio 3.4.1

# 原因
不明。issueがあるが、原因特定できていないとのこと。
https://github.com/flutter/flutter/issues/23645

# 対応
以下コマンドを実行した後、エミュレータを再起動で、アイコンが正しく表示された。
`flutter clean`

# 参考
https://github.com/flutter/flutter/issues/25319
【Programming News】Qiitaまとめ記事 August 3, 2019 Vol.20

遅くなりましたが、筆者が2019/8/3(土)に気になったQiitaの記事をまとめました。昨日のまとめ記事は[こちら](https://qiita.com/promari/items/467733cb3118401465fe)。

2019/7/21(日)～2019/7/27(土)のWeeklyのまとめのまとめ記事も[こちら](https://qiita.com/promari/items/77e4696d5e0849d4ffdf)で公開しております。

#### Python
- Tips
  - [QGIS3.x系向けプラグイン作成手順や各種処理の実装方法について](https://qiita.com/kigchi999/items/205d1128dcdaf3ad9506)
  - [QGIS3.x系向けプラグイン「MagicWand」を作成しました](https://qiita.com/kigchi999/items/709bb9951fac1c951056)

#### Swift
- Tips
  - [【Swift】SwiftUIのViewからUIWindowへアクセスする方法](https://qiita.com/shiz/items/3b829b1521f9723aa875)
  - [【Swift】FirebaseUIを使ってログイン機能を実装しよう](https://qiita.com/misakiagata/items/0f8d73ff6263767c72bc)
  - [iOSアプリにおけるUserDefaultsとはそもそも何なのか](https://qiita.com/eg_19_/items/d26bba0d92df303e98d8)

#### JavaScript
- Tips
  - [モダンなJavaScript「ECMAScript」でよく使う文法の備忘録](https://qiita.com/goemp/items/1a125ce86deeef0ee846)

#### Vue.js
- Tips
  - [VuePressで作ったblogに配布されているテーマを設定する](https://qiita.com/tomopict/items/9da7cf28c9bcd5f933cb)

#### Angular
- Tips
  - [Electron + AngularでEXEランチャー作りました。](https://qiita.com/san_you/items/2643008173a53dc6f7a4)

#### Rust
- Tips
  - [Rustのasync/awaitをスムーズに使うためのテクニック](https://qiita.com/qnighy/items/59133e69a0ba0c6a7fef)

#### Go言語
- Tips
  - [Go言語で遺伝的アルゴリズム](https://qiita.com/ken_sumi1019/items/2e594b3213fe6723cb85)

#### AWS
- EC2
  - [AWS EC2(Amazon Linux 2)サーバー に Apache2.4, Python3, wsgiの実行環境を構築する](https://qiita.com/uneri/items/84856312c8e94a6748bf)
- Tips
  - [AWS Githubからソースを取得し、ESC(Fargate or EC2)にデプロイするパイプラインを作成する①（ALBの作成まで）](https://qiita.com/sugimotosyo/items/86b660e531d9d2dd7628)
  - [AWS Githubからソースを取得し、ECS(Fargate or EC2)にデプロイするパイプラインを作成する②（デプロイまで）](https://qiita.com/sugimotosyo/items/dc49c1f1c5a54233cb9f)

#### Docker
- Beginner
  - [【Nuxt.js】Docker開発環境を導入する](https://qiita.com/M_S_0525/items/f4229c59f044748ad271)

#### セキュリティ
- Tips
  - [今度こそopensslコマンドを理解して使いたい (1) ルートCAをスクリプトで作成する](https://qiita.com/3244/items/780469306a3c3051c9fe)

#### Develop
- Apps
  - [【個人開発／SEO成果報告】「ツイッターで話題の情報をまとめられる」キュレーションサービスをリリースしました](https://qiita.com/2zn01/items/5a770196e8a2158b3000)
- Tips
  - [エンジニアでも出来る！Figmaを使って自作アプリをリニューアル](https://qiita.com/wheatandcat/items/a1a8122b3a7edadfe477)

#### Raspberry
- Tips
  - [有線LANを使わず無線LANからRaspberry Pi3の初期設定](https://qiita.com/watari_eng/items/d996bf4617b0a3bee700)

## 更新情報

- Kotlin
  - Kotlin入門
     - [第1章 はじめてのKotlinアプリケーション](https://qiita.com/promari/items/4d802f3419bdeb46ab61)
     - [第2章 Kotlinの文法](https://qiita.com/promari/items/e1c88aa8c02b82358a9d) 

- Android
  - Library
      - [「Before After animation」というアニメーションライブラリを使ってみました。](https://qiita.com/promari/items/ec085e576c031cd16228)
- Java
  - Java 10
      - [【Java】Java 10で拡張された型推論について注意すべきこと](https://qiita.com/promari/items/a5bb8d1174b3ca8c9426) 

- IDE
  - IntelliJ IDEA
      - [【開発環境】ローカル環境への統合開発環境(IDE): IntelliJ IDEAのインストール手順](https://qiita.com/promari/items/fee4599ec3a02a77aeac)
      - [【開発環境】統合開発環境(IDE) IntelliJ IDEAの日本語化とカスタマイズ](https://qiita.com/promari/items/b6df8db4fb24c5e0b586)
      - [【開発環境】【IntelliJ IDEA】LiveEditを使ってHTML/CSSを動的に反映させる。](https://qiita.com/drafts/ea1c127cca85cc62f4d0)
GitHub Organizationに属しているレポジトリで Netlify CMS の admin にログインできない時

忙しい人のためのSummary
-----

- GitHub Organization に属しているレポジトリで Netlify CMS を使おうとした時に Admin にログインできない。
- 解決策: GitHub の `Authorized OAuth App` で `Netlify Auth` を許可する。

事象
-----

こんな感じで Netlify CMS の `admin` を開くと `Not Found` という意味不明なエラーメッセージが出ます。

![スクリーンショット 2019-08-03 16.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150569/18b7f7dc-bef3-c703-b54b-caf19c0e950d.png)

コンソールを開いて何が起きているのかを確認すると次のようなエラーが出ていました。
deploy している レポジトリのブランチの情報を取ろうとして 404 が返って来ているっぽいです。

```
auth.js:94 API_ERROR: Not Found
    at new t (https://unpkg.com/netlify-cms@%5E2.0.0/dist/netlify-cms.js:168:86255)
    at new t.default (https://unpkg.com/netlify-cms@%5E2.0.0/dist/netlify-cms.js:168:86621)
    at https://unpkg.com/netlify-cms@%5E2.0.0/dist/netlify-cms.js:234:52235
    at async https://unpkg.com/netlify-cms@%5E2.0.0/dist/netlify-cms.js:234:25032
```

```
documentation_url: "https://developer.github.com/v3/repos/branches/#get-branch"
message: "Not Found"
```

解決策
-----

解決策としては GitHub の Authorized OAuth App で `Netlify Auth` を許可します。詳しくはキャプチャ取ってみたので、もし詰まったら参考にしてみてください。

<img width="1405" alt="netlify-cms-auth1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150569/c51603f1-6cf9-8aeb-59a4-667fbe677461.png">

<img width="1048" alt="Authorized_OAuth_Apps.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150569/27b93906-d585-2963-c5ce-a5f945534fe4.png">

<img width="1050" alt="Connection_with_Netlify_Auth.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150569/d6fc5183-9614-c33a-f901-5b6784fa916b.png">

参考にしたIssue
-----
https://github.com/netlify/netlify-cms/issues/1816

https://community.netlify.com/t/branch-not-found-error-on-netlify-cms-login/2015
Elm 0.19でExtensible Recordの使い方によってはコンパイラが壊れる

コンパイラのバグだが、こんな感じのエラーがでることがある

```bash
Dependencies loaded from local cache.
Dependencies ready!                
[==================================                ] - 18 / 26elm: Used toAnnotation on a type that is not well-formed
CallStack (from HasCallStack):
  error, called at compiler/src/Type/Type.hs:414:21 in main:Type.Type
[==============================================    ] - 24 / 26elm: thread blocked indefinitely in an MVar operation
```
これはelm-stuffを消しても治らない。

発現条件は、以下のようなExtensible Recordの使い方

```elm
type alias Hogeable a =
    { hoge : String }


hogehoge : Hogeable () -> String
hogehoge { hoge } =
    hoge
```
つまり、上のコードは下のように書き直せばよい

```diff
 type alias Hogeable a =
     { hoge : String }


+hogehoge : Hogeable a -> String
 hogehoge { hoge } =
     hoge
```

参考: https://github.com/elm/compiler/issues/1785
リモートを追加､編集､削除する

リモートの変更がしたくて調べたのでメモ｡

####普段よく使うコマンド

リモートの一覧 `$git remote -v`
リモートの追加 `$git remote add <リポジトリ名> <URL>`

(`$git help remote `で詳細が見れます｡`:q`で抜けれます)

####リモートの変更
`#git remote set-url <名前> URL `
`$git remote set-url origin URL`

####リモート名を変更
`# git remote rm <名前>`
`$ git remote rm origin`

####リモートの削除
`#git remote rm <削除したリポジトリ名>`
![githubrm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333998/e13fc5aa-df16-90c2-e6d7-d5fce1d83127.png)



参考
https://help.github.com/ja/enterprise/2.14/user/articles/removing-a-remote
https://www.sejuku.net/blog/71492
php-master-changes 2019-08-04

今日は FFI で Windows での呼び出し規約による name mangling に対応する修正があった！

# 2019-08-04
## cmb69: Support calling convention specific function name mangling
- https://github.com/php/php-src/commit/1ed9ebdea558a7ae265dcc460cedd2cbbaa48efc
- [7.4~]
- ext/ffi で、Windows での呼び出し規約による name mangling への対応
RM Mini3とAlexaで家電を操作

RM Mini3とAlexaで家電を操作する方法に関して様々な記事や情報が存在しています。
少し手間取ってしまったので、試行錯誤した中で自分が成功した方法が記載された記事を参照できるようにしました。

# 環境
- 2.4GHz Wi-Fi環境
- raspberry pi zero + 2.4GHz帯用Wi-Fiアダプタ
(もしくはraspberry pi zero w(h))
- [RM Mini3](https://www.amazon.co.jp/Broadlink-%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%A7%E5%AE%B6%E9%9B%BB%E3%82%92%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB-RM-Mini-IR%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9/dp/B01FK2SDOC/ref=sr_1_7?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=rm+mini&qid=1564932729&s=gateway&sr=8-7)
- Amazon Echo

# 手順
## raspberry pi zeroのセットアップ

https://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573

## RM Mini3のセットアップ

https://qiita.com/yb3/items/2a534da33f0d739fd560

## raspberry piからRM Mini3を操作できるようにする

https://qiita.com/canadie/items/7de3092df9b5c549536c

ここまで行うと、raspberry pi zeroで

```
python2 BlackBeanControl.py -c hogehoge
```

というコマンドを実行することでRM Mini3から赤外線が送出され、家電を操作できる状態になります。

## raspberry pi zeroにNode-REDをセットアップ

https://qiita.com/HeRo/items/432e4d28055571f1acfb

## Node-REDでフローを作成
ここでAlexaのトリガーと実行コマンドを紐付けます。

https://qiita.com/spiderx_jp/items/20b5cb9418296dd0c5cd

この記事を参考にして、
`http://raspberrypi.local:1880/ `でコンソールにアクセスし、
`BlackBeanControl.py`を実行するフローを作成します。
自分はこのように設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189802/226e27f0-e19e-6fec-974e-e6b3b7ccdad8.png)

# まとめ
簡単に処理の流れを記しておきます。

```
Alexaに「テレビをトリガー」などと入力
↓
node-redを経由してraspberry piに情報を送信
↓
raspberry piでコマンド実行
↓
RM Mini3から赤外線送出
```
なるはや Vue SPA入門：API コール

Vue CLI3 で作成した SPA（Single Page Application）プロジェクト上で、段階的に Vue.js を学んで行きましょう。

[目次はこちら](https://qiita.com/tsubo/items/24df49ef2f1ba87984d1)

今回は API コール編です。

## 前提事項

[ライフサイクル編](https://qiita.com/tsubo/items/a0c9ded90bba1370131c) が完了していること。 

## json ファイルの追加

public/todos.json ファイルを追加します。

```json:public/todos.json
{
  "todos": [
    { "id": 1, "text": "Learn Vue" },
    { "id": 2, "text": "Learn about single file components" },
    { "id": 3, "text": "Learn about conponents" }
  ]
}
```

## TodoList.vue の修正

`created()` ライフサイクルフックで `fetch()` を使い Todo リスト（json）を取得します。
※ ここでは、直接 json ファイルを読み込んでいますが、REST API 等で json を取得するのと全く同じ処理になります。

```js:src/views/TodoList.vue
// ...
export default {
  // ...
  data() {
    return {
      todos: []
    };
  },
  created() {
    fetch("http://localhost:8080/todos.json")
      .then(response => response.json())
      .then(json => {
        console.log(json);
        this.todos = json.todos;
      })
      .catch(error => console.error("Error:", error));
  },
  // ...
};
```

## 動作確認

http://localhost:8080/todolist にアクセスして、Todo リストが表示されれば OK です。API 経由で取得した json の内容がデベロッパーツールのコンソールログに表示されているはずです。

![api.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14476/52b05b4f-4220-dcec-e083-9cbee5836a8c.png)

## 次回

[Vuex モジュール](https://qiita.com/tsubo/items/be12451533db74428d95)
コミットメッセージ書き方

####コミットメッセージ
誰が見ても意味が分かるように､書き方を統一するのが良いとされています｡

####コミットメッセージの書き方

よく聞くのは､
`1行目 概要`
`2行目 空白`
`3行目 詳細`

3行にわたってコミットメッセージを記述しますが､VScode上でも可能です｡

コマンドでは､`-m`オプションで改行可能です｡
`git commit -m "概要" -m "空白" -m "詳細"`


add ：新しい機能追加､ファイルの追加
update ：機能修正（バグではない）
fix ：バグ修正
remove ：ファイルの削除

初学者の方は少ない方が扱いやすいと思います｡
私はとりあえず4パターンで進めていきます:D

参考
https://www.tam-tam.co.jp/tipsnote/program/post16686.html
https://qiita.com/itosho/items/9565c6ad2ffc24c09364
http://neos21.hatenablog.com/entry/2016/02/18/081236