OmniAICreator/Qiita-1.07M huggingface dataset:
Slack API の最新情報をチェックしよう 📝

時々「Slack の最新情報をチェックするには、どこを見ればよいでしょうか？」という質問を受けることがあるので、ちょっとまとめてみました。

## クライアントアプリの更新情報

クライアントアプリの変更内容であれば、こちらでリリースノートが公開されていて、日本語化もされています。

* https://slack.com/intl/ja-jp/release-notes

こんな遊び心のある記述を見つけられることもありますので、ぜひ読んでみてください :smile: 

<img height="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19163/f48507bb-a459-a1af-90e8-cd5a1bd9f9e9.png">

## Slack API の更新情報

Slack API のお知らせは以下の URL で確認できます。現状は英語のみでの提供となっています。RSS フィードもあって https://api.slack.com/changelog.rss にアクセスすると RSS の形式で受け取れます。

* https://api.slack.com/changelog
<img height="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19163/64c6cb08-e158-940e-afd1-44bac0da3067.png">

### Slack チャンネルに通知する

Slack の標準連携アプリに RSS フィードを通知してくれるものがあるのですが、活用されているでしょうか？

* https://my.slack.com/services/BGE9M2FL0
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19163/3a24c2b7-e958-4ae6-cb4b-0241f59f48ca.png">

使い方はとても簡単です。 `/feed` というコマンドを使います。
<img height="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19163/caa2f673-70af-54a0-6b9f-c65a267168fc.gif">
使えるコマンドについて日本語で説明すると以下のようになります。上記の RSS アプリ画面からも同じ操作が行えます。

|コマンド|説明|
|---|---|
|`/feed subscribe {RSS フィードの URL}`|コマンドを実行したチャンネルで RSS フィードの新着通知を受け取ります|
|`/feed list`|購読している RSS フィードの一覧を表示します|
|`/feed remove {ID}`|`/feed list` で表示した ID を指定して購読を解除します|

ですので、

```bash
/feed subscribe https://api.slack.com/changelog.rss
```

というコマンドを通知を受け取りたいチャンネルで実行しておくと、次回から以下のように通知が来るようになります。
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19163/6e9a6233-6e59-73db-9d7f-e0d4dc358f0a.png">
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19163/69c80ccc-1594-feee-fd1c-96e1cb56b5a4.png">

## Slack Platform/Engineering RSS フィード

同じチャンネルで CHANGELOG に加えて Slack Engineering と Slack Platform のブログも購読しておくとよいと思います。`subscribe` は実は省略可能なので、ここでは省略してみました。

```bash
/feed https://api.slack.com/changelog.rss
/feed https://medium.com/feed/slack-developer-blog
/feed https://slack.engineering/feed
```

このように Slack の RSS フィード通知はとても便利なので、Slack API 関連の情報に限らず、通知用のチャンネルを作って RSS フィードから情報を集めてみてください :pencil:
VirtualBoxのUbuntuで、emergency modeからの復旧メモ

# 復旧方法
/etc/fstab に追記していた、日本語・記号が入っていた行をコメントアウトして、再起動した。

# 問題発生の経緯
1. virtual box の、ホスト(win10)-ゲスト(ubuntu)間で、ファイル共有をしたかったので、virtual boxで共有フォルダの設定をした。
1. ubuntuを再起動すると、ファイル共有が維持されなかったので、維持するために/etc/fstab に設定を追記した。
追記した内容に、日本語・記号が入っていた。（これが問題の原因）
1. ホスト(win10)-ゲスト(ubuntu)間で、ドラッグ・ドロップでファイルのやりとりをしたかったので、方法を調査し、Virtualbox GuestAdditionsのCDの挿入や削除を繰り返した。
（ドラッグ・ドロップはまだうまくいっていない。）
 →sudo apt-get install virtualbox-guest-dkms　これで、できるようになった。カーネルのアップデート後にこれが必要らしい。
1. その後、Ubuntuのウィンドウの大きさの変更時の画面描画が遅くなってしまったので、直そうと思い、Virtualbox マネージャーで、システムやディスプレイの設定を変更した。
1. 変更しても画面描写の速度は改善せず、初期状態のUbuntuで再現するのかを確認しようと思い、Virtualboxに、別のubuntuをインストールした。(ver.16のイメージがあったので、それを使用し、アップデートを行った。）
1. 元々入れていたUbuntuが、emergency modeでしか起動しなくなった。（問題発生）

# 原因究明までの経緯
1. Virtualbox マネージャーで、システムやディスプレイの設定の変更を元に戻した。
1. 追加したubuntuを削除した。
1. grubでパティションの調査・kernelの指定（問題解決には関係なかった。）
1. ブート領域の復旧方法の調査
1. fstabの該当記述をコメントアウト（問題の解決（復旧））

知っている方なら1分で解決できると思うが、丸2日程度かかってしまった。

# つまづいた内容・その理由
* ブート、記憶領域、マウントなどの知識・スキル不足
* emergency modeだと、lsでなにも表示されないので、データが全て消えてしまったのか、アクセスできなくなったと思い、grubからの復旧方法の調査に時間をかけてしまった。（実際にはls -laで表示される。）
* fstabに、/bootの記述がなかったので、ブート領域が消えたか壊れたのかと思い、その復旧方法の調査に時間をかけてしまった。（なぜ/bootの記述がないのかは、今も分からない。）
* 原因となる変更点以外の変更も行った後に問題が発生したので、原因の切り分けが難しく、時間がかかった。

# 学んだ事・知った（触れた）単語/コマンド
* エラーログを順番にあたっていくのが問題解決へ最短の道。
今回で言うと、起動時のエラー、Dependency failed for Local File Systems.
* 当初、virtualbox utbuntu GUI 起動しない　などで検索していたが、
起動時のエラー表示を順番に調査していく方が解決には早かった。
（エラー表示が流れて読めない場合は、そのログの保存場所から調査する。）
* 自分の予想に基づいた試みをする場合は、時間を区切ってやるべきだった。（今回の場合は、変更点の手戻しや、ブート領域の復旧調査は、エラーログの直接的な指摘ではなく、自分の予想が入っていた。例えば、まず予想に基づいて3時間チャレンジしてみて、ダメだったら一旦忘れてエラーログを1から見ていくという手順を踏めば、もっと早く解決できたと思う。）
* grub
* /etc/fstab
* cat /etc/lsb-release ディストリビューションのバージョン確認
* cat /proc/version カーネルのバージョン確認
* dpkg --list | grep linux-image インストールされていたカーネルの確認（上との違いは不明）
* dmesg | grep sda 認識されているデバイスの確認
* blkid パーテションの確認
* fsck ファイルシステムの修復
* UEFI BIOSではないブートマネージャ
* mount -a
* init ランレベルを指定できる
* systemctl CUI/GUIを切り替えられる
* journalctl -xb | grep error errorログ全部表示？
* ext4 linuxの標準ファイルシステム
* mount -t ext4 ext4でマウントされているファイルシステムのリストを表示
* /etc/grub.conf
* /etc/inittab
* /etc/X11/xorg.conf
* /var/log/ ログの場所
* /etc/rsyslog.conf syslogの出力先設定
* lessはエンターで行送り、スペースでページ送り
* UUID ハードディスクの識別ID
* vmlinuz カーネルの実行バイナリ？
* LVM 論理ボリュームマネージャ
* VG ボリュームグループ
* attempt = 試みる（英単語）
* Live USB CD/DVD 起動すらしない時に、これらを利用してデータアクセス・マウントする方法がある。
* Ubuntu boot repair Live CD/DVDから利用し、GRUB2やカーネルの再インストールができる。
* virtual boxの設定で、ブートデバイスの優先順位を設定することができる。
WebAPIの覚え書き(WebAPI The Good Partsの3章)


# レスポンスデータの設計について
自分向けメモです。
[WebAPI The Good Parts](https://www.amazon.co.jp/Web-API-Parts-%E6%B0%B4%E9%87%8E-%E8%B2%B4%E6%98%8E/dp/4873116864)という本をよく理解するためのメモです。

## データの内部構造の考え方
なるべく少ないAPIアクセスのほうが良い。
APIがバックエンドのテーブル構成を愚直に反映させる必要はない。

返してくれるJSONはオブジェクトで包んだほうがいいよ。
JSONインジェクションを防ぐために。

返すJSONは、なるべく階層構造を持たないほうがいいけど、階層構造を持ったほうがわかりやすいのなら、持ったほうが良い。

配列に続きが存在する場合、すべての要素を見るのではなく、必要な件数+1件を見て、次の要素が存在するかどうか考えれば良い。

## 各データのフォーマット
各データの名前は、JSに準じてキャメルケースにするのが良さそう。
一覧取得するエンドポイントの場合、名詞を複数形にした方がいいよね

よっぽどのこと(データ転送量的な問題)がない限り、各データの名前に変な文字の省略形は使わないほうが良い。

日付のフォーマットに関して、日本人にはRFC3339というフォーマットが馴染みやすそう。
HTTPヘッダに日付を入れる場合は、RFC822/RFC850/ANSI C のみが対応だから注意。

IDが非常に大きくなるとき、64bit整数型を使うより文字列を扱ったほうが桁あふれによる誤差が生じずに済む。

## レスポンスデータの設計

クライアント側で利用したいデータとAPIが返すデータ構造が同じだと楽だよね。
ここで、データベースのテーブルと同じデータ構造を返す必要はない。

HTTPのステータスコードを最大限利用して、エラーを返すの大事。
しかし、HTTPのレスポンスヘッダorレスポンスボディにエラーの詳細を入れることで、具体的なエラーの原因がわかるようになる。

エラーの際、フレームワークのエラーの場合のデフォルトHTMLが表示されることを防ぐ。
どんなエラーの場合でも、適切なフォーマットでデータが帰ってくるの大事。

メンテナンスのときは、ステータスコード503で意図的にサービスを停止していることを伝える。
メンテナンスの終了予定時刻もだいたい決まっているのなら予めエラーメッセージとして伝える。
メンテナンス時間を余裕を持って伝えたほうが良い。
予定より短く済んで怒る人はいないから。
本当のJSONをぼくは知らなかった

こんにちわ。
ゴリラです。

みなさんJSONを知っていますか？
JSONはAPI通信、つまりサービス間のデータ転送によく使われるデータフォーマットの1つです。

自分もよく使っているので、完全にJSONを理解したつもりでしたが、理解していないことがわかったので、
理解するためにこの記事を書きました。

# はじめに
jsで次のコードを実行するとどうなるのでしょうか？
わかる方はこの記事を読んでもためにならないので、ブラウザバックしましょう。
分からない方は引き続き読み進めてください。

```js
JSON.parse('"gorilla"');
```

# JSONの仕様
JSONの仕様は[RFC 8259](https://tools.ietf.org/html/rfc8259#section-1)で標準化されているので、こちらの資料を読めばわかります。
英語読める方はこの記事よりもRFC読んだほうが良いかと思います。

# JSONの値の種類
JSONは次の値を使用することができます。

- 文字列
- 数値
- オブジェクト
- 配列
- リテラル（false/true/null）

一般的によく見る形は次かと思います。

```json
{
  "name": "gorilla",
  "is_human": false,
  "language": [
    "Go",
    "PHP",
    "Java",
    "JavaScript"
  ]
}
```

これはいわゆるオブジェクトと呼ばれていて、`{}` で囲うルールになっています。
オブジェクトの中にはオブジェクトや配列などを入れることもできます。

ぼくはこれをJSONの形と勘違いしていました。
しかし、先程説明したとおり、JSONで使用できる値はオブジェクトの他に、数値や文字列などがあります。
つまり、次のようなコードもちゃんとパースできるJSONです。

```js
JSON.parse('1')
JSON.parse('false')
JSON.parse('true')
JSON.parse('null')
JSON.parse('"gorilla"')
```

これを知った時、驚きました。
「JSONなめてました。すいません。」という感じでした。

値の種類ごとにいくつかルールがありますが、詳細はRFCを見たほうが良いので、本記事ではすこし抜粋して解説します。

なお、説明で使用したパーサは`node.js v12.6.0`のものになります。

## 数値
数値は次の値を使用することができます。

- 整数
- 浮動小数点
- 指数

整数と浮動小数点はもちろん、
指数も`JSON.parse('1.125e+1')`のように、
パーサに指数の数値を渡すとちゃんと`11.25` に展開されます。
指数は`E`でも`e`でも動きます。

また、`JSON.parse('1e+1000')`のように、数値が大きいすぎた場合は`Infinity`になります。

## 文字列
通常の文字(a~zなど）意外にも、Unicode、サロゲートペアを使用することもできます。
サロゲート…、うっ頭痛が…

```js
// Unicode
> JSON.parse('"\u00D2"')
'Ò'

// サロゲートペア
> JSON.parse('"\uD834\uDD1E"')
'𝄞'
```

## リテラル
リテラルは小文字でなければ行けないので、`JSON.Parse('TRUE')`などはパースエラーになります。

# 最後に
雑にまとめてみましたが、JSONは意外とルールが細かったのがわかりました。
普段なにげに使っているけど、実はよくわかっていなかったことが結構あったりするので、
JSONに関わらず、RFCちゃんと読んだほうが良いなと思いました。

みなさんも時間あるときRFCをよんでみてください。
MySQL8のDB基本クエリ　覚書

# タイトル通りです
なんだかんだでちゃんとまとめていなかったので、覚書です。使用したものを取り敢えずガンガン書いていく用の記事です。

前に書いたjoinクエリの記事はこちらです。
[Mysqlのjoinクエリを使うテーブル結合について](https://qiita.com/Nedward/items/0bf188205428851420de)
## 基本クエリ
使うにあたっての基本的なクエリをまとめています。

### 全てのデータベースを見る
mysqlにログインしたら、真っ先に打つであろうクエリ。


```
mysql> show databases;
```

### データベースを作成する

```
mysql> create database 作成したいデータベース名;
```

### 使用するデータベースをセットする
これで引数に指定したデータベースのテーブル等を見ることができるようになる。

```
mysql> use データベース名;
```

### 指定したデータベース内のテーブルを見る

```
mysql> show tables;
```

### カラムをみる

```
mysql> show columns from テーブル名;
```

### カラムのなかに実データを入れ込む
用意されているカラムに正しいデータ順に書きます。オートインクリメントされるものもしっかり書く必要があります。

```
mysql> insert into テーブル名 values (data1,data2...);
```

### テーブル内にあるカラムを取得

```
mysql> select * from テーブル名;
```

### カラム内の特定データを取得
ちなみに `\G`は出力結果を整形してくれる

```sql
> selct * from テーブル名 where カラム名="特定のデータ"\G;
```

### データの内容を書き換える
whereを忘れると、全カラムが書き換える実データに置き換わるので、注意。

```
mysql> update テーブル名 set 書き換えるカラム = 書き換える実データ where id=ID番号;
```

### likeを使った曖昧検索

```
mysql> show系のクエリの末尾に　like '%検索ワード%'
```

### データベースを使用できるユーザーを作成

```
mysql> create user 'ユーザー名@ホスト名' identified by 'パスワード';
```

### ユーザーを一覧で見る

```
mysql> select Host, User, Password from mysql.user;
```

### ユーザー一覧から取得した情報を使って特定のユーザーの権限を確認する

```
mysql> show grants for 'ユーザー名'@'ホスト名';
```

### 権限を付与
権限の種類は多く存在しますが、取り敢えずは全権を渡せるallだけにしておきます。

```
mysql> create user 'ユーザー名@ホスト名' identified by 'パスワード'
mysql> grant all privileges on データベース名.テーブル名(もしくは*) to 'ユーザー名@ホスト名';
```

### 権限反映用のクエリです

```
mysql> flush privileges;
```
### データベースを削除する

```
mysql> drop database データベース名;
```

## おまけ
サイトの移管作業でwordpress上のデータの吸い出しをする時のフロー

1.まずはMySQLの接続情報を確認

```terminal
$  wp-config.php | grep DB
define( 'DB_NAME', 'XXXXXXXXXXXX' );
define( 'DB_USER', 'XXXXXXXXXXX' );
define( 'DB_PASSWORD', 'XXXXXXXXXX' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8' );
define( 'DB_COLLATE', '' );
```

2.dumpコマンドでsqlファイルとしてデータを吸い出し

```terminal
$ mysqldump -h DB_HOSTの値 -u DB_USERの値 -p DB_NAMEの値 > 出力したいファイル.sql
```
Windows VSCode で Nuxt.js デバッグ開発環境を整える


● [node.js Windows 推奨版](https://nodejs.org/ja/)をインストールする。

● VSCode 拡張をインストールする。
ESlint
Debugger for Chrome

● 指定したフォルダに移動して Dos画面を出し nuxt.js アプリを作成する。

```console
> npx create-nuxt-app myapp

? Choose UI framework (Use arrow keys) [選択] ❯ Vuetify
? Choose rendering mode (Use arrow keys) [選択] ❯ Universal (SSR)
```
● デバッグ環境を整える
[参考：Nuxt.js を VS Code上でデバッグする方法](https://qiita.com/idani/items/ac638d5a0786aaefb8cf)

● ブレークポイントをかける
[参考：Nuxt.jsにVS Code上でブレークポイントをかける](https://qiita.com/pinalto/items/867a9268be4a188b4533)
JavaScriptのデバッグ、ずっとConsole.logだけで頑張ってました。

#はじめに
某プログラミングスクール受講生の方なら、１度はこんな指摘受けたことありませんか？

　「不要なconsole.logは削除しようね」

私もデバッグのために仕込んだのを消し忘れることが良くありました。
そもそもconsole.log仕込むって言うデバッグ方法面倒臭くないか？
と言うか、railsのbinding.pryみたいなのあるよね、きっと。と思い調べたらありました。
（当然ですよね。。。）

#前提条件

　ブラウザ：Chrome
　OS：macOS（関係ないかもしれませんが一応）

#デバッグ方法
簡単ですが以下に手順をまとめました。

　① JavaScriptを仕込んだページを開きます。

　② Chromの検証ツールを開きます。
　　・ショートカット：[Command] + [Option] + [I]
　　・[右クリックメニュー]-[検証]
　　・Chromeメニュー[その他ツール]-[デベロッパーツール]

　③ [Sources]タグからデバッグしたいJavaScriptのファイルを選択します。
　　→開発環境なら自分で作ったファイルを視認できると思います。本番環境はjsファイルが(sprocketsとかwebpackなどの功績により）１ファイルにまとまってるのでソレを選択します。
[![Image from Gyazo](https://i.gyazo.com/ed8a07e21e701cd0e4e59389a3236c55.png)](https://gyazo.com/ed8a07e21e701cd0e4e59389a3236c55)
　④ ソースコードが中央の画面に表示されるので、デバッグかけたい場所を見つけたら行数が記載されている部分をクリックします。すると背景色が青くなるので、これで準備完了。
　　※ 行数多いと探しにくいですが[command]+[F]で文字列検索も可能です
　　[![Image from Gyazo](https://i.gyazo.com/9ef2cf5f7c55d31b6a3fbc63830eb80b.png)](https://gyazo.com/9ef2cf5f7c55d31b6a3fbc63830eb80b)
　⑤　JavaScriptが発動する操作をおこないます。
　⑥　デバッグするために下図のように画面にポーズがかかります。
　　　[![Image from Gyazo](https://i.gyazo.com/7cf14db736f57e1d6a25133dbda3a002.png)](https://gyazo.com/7cf14db736f57e1d6a25133dbda3a002)
　⑦　好きにデバッグしてください。
　　初心者すぎて、デバッグツール自体は使いこなせないですが、使いこなせると楽しそうです。

　　◾️ステップ実行
　　　ステップオーバーやステップインなんかもできるようです。
　　　[![Image from Gyazo](https://i.gyazo.com/e2dac1fc5b8b13a7e92c5298231548f7.png)](https://gyazo.com/e2dac1fc5b8b13a7e92c5298231548f7)

　　◾️Watchで変数の中身確認
　　　ステップ実行で、自分がいる場所の変数が確認できます。
　　　右上の[+]から自分で見たい変数を追加することも可能です。
　　　[![Image from Gyazo](https://i.gyazo.com/4b56d2dc39705bb7db94abe03506288a.png)](https://gyazo.com/4b56d2dc39705bb7db94abe03506288a)

　　◾️コード追加してお試し
　　　その場だけですが、そこでゴニョゴニョとコードをお試しもできそうです。

詳細なデバッグ方法は色々なサイトで紹介されています。
とりあえず、参考リンク。
（今回紹介したSourceに関する所に飛びますが全体通して見ると面白い）

[参考]
　Web開発でよく使う、特に使えるChromeデベロッパー・ツールの機能
　https://www.buildinsider.net/web/chromedevtools/01#page-5

# まとめ
console.logよりも、こちらの方が楽チンでは？！
と言うか、今までChromeのデベロッパツールを使えていない自分て・・・orz

今後は思いっきり使います！
WindowsのPostgreSQLで任意のログファイルを出力する

WindowsのPostgreSQLで、ユーザ定義関数から任意のログファイルを出力したくていろいろと試してみた。PostgreSQLのバージョンは9.6。

# 標準のログ出力
PostgreSQLの標準のログ出力は`postgresql.conf`のログに関する設定を行うことで出力される。
https://www.postgresql.jp/document/9.6/html/runtime-config-logging.html

例えば、設定項目`log_statement`のコメントを外して有効にして`'all'`とかを設定すると、すべてのSQLがpg_logフォルダにログ出力されるようになる。

```conf:postgresql.conf
log_statement = 'all'			# none, ddl, mod, all
```

ただ、これはあくまでもDBサーバのサーバログ出力の仕組みなので、ユーザ定義関数から固有のログファイルを出力したいなどの場合は使えない。（そういう場合はとりあえずサーバログに出力してあとでフィルタリングして参照する、みたいなのが正しいやり方？）

# COPY TOを使う
`COPY`コマンドを使うとテーブルのデータをファイルにエクスポートしたり(`COPY TO`)、逆にファイルからインポートしたりすることができる(`COPY FROM`)。
https://www.postgresql.jp/document/9.6/html/sql-copy.html

なのでこの機能を利用して、ログ出力用の一時テーブルを用意してそこにログメッセージを書き込み、最後にファイルに出力することでログファイル出力的なことを実現してみる。

```sql
CREATE TEMP TABLE log (ts timestamp DEFAULT clock_timestamp(), msg text);
INSERT INTO log (msg) VALUES ('あいうえお');
INSERT INTO log (msg) VALUES ('かきくけこ');
COPY log TO 'c:\tmp\aiueo.log';
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/a8a8dbbf-ea88-d71c-8a22-0a7e6c8b4cb5.png)
できた。
が、この場合、ファイルは常に上書きとなり、追記はできない。

割り切ってログファイルは常に上書きという仕様にするか、あるいは工夫をするとしたら、毎回ファイル名にタイムスタンプを付けて常に別ファイルとして出力させるとか、OS側でログファイルのバックアップを取るようにするとか・・・

ただ、その場合でも、1回の処理でのログの量が多い場合は最後にまとめてファイルに出力することになりあまりいけてない。また、処理にある程度時間がかかる場合、リアルタイムなログ監視とかもできない。

なんとかログファイルを追記させる方法は無いか。

# COPY TO PROGRAMを使う
`COPY`コマンドは`PROGRAM`指定を行うことで、ファイルに対してではなくOSコマンドに対してデータを受け渡しすることができる。

OSコマンドにログデータを渡すことができれば、あとは追記型のリダイレクト(`>>`)を使えばログファイルの追記が行える。

ここで使えるOSコマンドは、パイプで入力を受け取ることができ、再度標準出力するようなものに限られる。
Windowsだと`MORE`コマンドとかが使えそう。

やってみる。

```sql
COPY log TO PROGRAM 'more >> c:\tmp\aiueo.log';
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/9ec8135e-9323-a597-8264-58f179b14e26.png)
お！？なんか微妙に文字化けする！
なぜだぁE

じゃあ、`SORT`とか`FIND`とかはどうだ？

```sql
COPY log TO PROGRAM 'sort >> c:\tmp\aiueo.log';
```

```sql
COPY log TO PROGRAM 'find " " >> c:\tmp\aiueo.log';
```

うーん、`SORT`や`FIND`でも同じように化けるなぁ・・・
他に何かないかなぁ。

お、`FINDSTR`っていうコマンドもあるのか。

```sql
COPY log TO PROGRAM 'findstr /c:" " >> c:\tmp\aiueo.log';
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/5ca61a20-b0fa-e801-a8c8-025c3e108ae5.png)
お！今度は文字化けしなくなった！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/8a51c3c5-dc20-b0ba-639d-d93ca4391d99.png)
追記もちゃんとできてる。

文字化けの原因はよくわからないが、とりあえずはやりたいことは実現できた。
HDFSのデータブロックの場所確認方法

Hadoopのクラスターを構成してデータを入れると、実際にはどこに入ってるのかな？と思うことがあります。

例えばレプリケーション3にしてて、3つのレプリカがあるノードを全部停止したらほんとに読み込めなくなるのかな？といった確認をしたいとき、どこにレプリカがあるのか知りたくなります。

そんな時下記のコマンドでこんなパラメーターをつければわかります。

```
hdfs fsck /myfile.txt -files -blocks -locations    
```

すでに似たようなことで悩んでる人がいるんですね。
https://community.cloudera.com/t5/Support-Questions/hdfs-file-actual-block-paths/m-p/121411    

こんな実行結果がでてきます。
IPなどすべて書き換えていますんで、重要なところ以外はちょっと変なところあるかもしれません。

```
$ hdfs fsck /myfile.txt -files -blocks -locations
Connecting to namenode via http://namenode01:9870/fsck?files=1&blocks=1&locations=1&path=%2Fmyfile.txt
FSCK started by hdfs (auth:SIMPLE) from /11.22.33.44 for path /myfile.txt at Fri Aug 31 12:18:04 JST 2019
/myfile.txt 1468474 bytes, replicated: replication=3, 1 block(s):  OK
0. BP-119823210215-11.22.33.81-15634343520673:blk_10737324538_402314 len=1468474 Live_repl=3  [DatanodeInfoWithStorage[11.22.33.08:9866,DS-f15a6a7a-01bd-2351-ade9-92a346adbe35,DISK], DatanodeInfoWithStorage[11.22.33.12:9866,DS-6a12346b0-74a9-4ee9-a439-f1e2b015t420f,DISK], DatanodeInfoWithStorage[11.22.33.10:9866,DS-f003dc91-8d8a-4c64-ac71-03451f69f7c0,DISK]]
 
 
Status: HEALTHY
 Number of data-nodes:  10
 Number of racks:               1
 Total dirs:                    0
 Total symlinks:                0
 
Replicated Blocks:
 Total size:    1468474 B
 Total files:   1
 Total blocks (validated):      1 (avg. block size 1468474 B)
 Minimally replicated blocks:   1 (100.0 %)
 Over-replicated blocks:        0 (0.0 %)
 Under-replicated blocks:       0 (0.0 %)
 Mis-replicated blocks:         0 (0.0 %)
 Default replication factor:    3
 Average block replication:     3.0
 Missing blocks:                0
 Corrupt blocks:                0
 Missing replicas:              0 (0.0 %)
 Blocks queued for replication: 0
 
Erasure Coded Block Groups:
 Total size:    0 B
 Total files:   0
 Total block groups (validated):        0
 Minimally erasure-coded block groups:  0
 Over-erasure-coded block groups:       0
 Under-erasure-coded block groups:      0
 Unsatisfactory placement block groups: 0
 Average block group size:      0.0
 Missing block groups:          0
 Corrupt block groups:          0
 Missing internal blocks:       0
 Blocks queued for replication: 0
FSCK ended at Fri Aug 31 12:18:04 JST 2019 in 1 milliseconds
```

実行結果の上から4行目のここ

```
[DatanodeInfoWithStorage[11.22.33.08:9866,DS-f15a6a7a-01bd-2351-ade9-92a346adbe35,DISK], DatanodeInfoWithStorage[11.22.33.12:9866,DS-6a12346b0-74a9-4ee9-a439-f1e2b015t420f,DISK], DatanodeInfoWithStorage[11.22.33.10:9866,DS-f003dc91-8d8a-4c64-ac71-03451f69f7c0,DISK]] 
```

で実際のノードがわかります。

整形してみると

```
[
DatanodeInfoWithStorage[11.22.33.08:9866,DS-f15a6a7a-01bd-2351-ade9-92a346adbe35,DISK], 
DatanodeInfoWithStorage[11.22.33.12:9866,DS-6a12346b0-74a9-4ee9-a439-f1e2b015t420f,DISK], 
DatanodeInfoWithStorage[11.22.33.10:9866,DS-f003dc91-8d8a-4c64-ac71-03451f69f7c0,DISK]
] 
```

11.22.33.08
11.22.33.12
11.22.33.10

に保管されていることがわかりますね。

以上マイナーな情報でしたー



関係ないですが上記のコマンドでErasure Codingの情報も出てくるんですね。
GitHub Actions: tagでfilter

# 概要
先日GitHub Actionsの設定ファイルの書き方が変わりました。

これまでは独自のフォーマットだったものが、YAMLで設定するようになりました。

tagでfilterする方法を調べたのでメモします。

# やりたいこと

1. リポジトリにpushされたら
2. ユニットテストの実行
3. ユニットテストをパスした かつ vで始まるtagがpushされた場合、リリースする

をやりたい。

普段はpushしたらその都度ユニットテストが実行され、tagもpushした場合のみリリースするということをやりたい

# 旧GitHub Actions設定ファイル

Node.jsのプロジェクトでnpm publishまでやる例

```
workflow "Build, Test, and Publish" {
  on = "push"
  resolves = ["Publish"]
}

action "Build" {
  uses = "actions/npm@master"
  args = "install"
}

action "Test" {
  needs = "Build"
  uses = "actions/npm@master"
  args = "test"
}

# Filter for release tag
action "RelaseTag" {
  needs = "Test"
  uses = "actions/bin/filter@master"
  args = "tag v*"
}

action "Publish" {
  needs = "RelaseTag"
  uses = "actions/npm@master"
  args = "publish --access public"
  secrets = ["NPM_AUTH_TOKEN"]
}
```

もうこの設定は使えなくなるので詳細は割愛しますが、

1. リポジトリにpushされたら
2. ユニットテストの実行
3. ユニットテストをパスした かつ vで始まるtagがpushされた場合、リリースする

という動きをします。

リポジトリにpushされてもtagがなかったらユニットテストの実行だけ動きます。

# 新GitHub Actions設定ファイル

```yaml
name: Node CI

on: [push]

jobs:
  test:
    name: Test on node ${{ matrix.node-version }} and ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        node-version: [8.x, 10.x, 12.x]
        os: [ubuntu-latest, windows-latest, macos-latest]
    steps:
    - uses: actions/checkout@v1
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}
    - name: npm install, build, and test
      run: |
        npm install
        npm run build --if-present
        npm test
      env:
        CI: true

  publish:
    name: npm publish
    runs-on: ubuntu-latest
    needs: [test]
    steps:
    - uses: actions/checkout@master
    - uses: actions/setup-node@v1
      with:
        node-version: '12.x'
        registry-url: 'https://registry.npmjs.org'
    - run: npm install
      if: contains(github.ref, 'tags/v')
    - run: npm publish
      env:
        NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
      if: contains(github.ref, 'tags/v')
```

旧と比べて 複数のNode.jsのバージョン、複数のOS でのテストが追加されていますがそれ以外はやっていることは同じです。

## 新GitHub Actions設定ファイルのポイント

### `on` での制御

特定の条件、例えば「特定のtagがpushされた時」をやりたい場合、上部の

```yaml
on: [push]
```

でも制御できます。

参考: https://help.github.com/ja/articles/workflow-syntax-for-github-actions#on

ただしその条件が全体に適用されるので、旧での

> リポジトリにpushされてもtagがなかったらユニットテストの実行だけ動きます。

この動きが実現できません。

### `if` と `needs`

ということで、`on` では実現できないので別jobを作って対応します。
jobは基本的に並列で動くので、

> 3. ユニットテストをパスした かつ vで始まるtagがpushされた場合、リリースする

の「テストをパスした後に」を実現するために `needs` を使います。

```yaml
    needs: [test]
```

この設定を入れるとjobの「publish」は「test」が終わった後に実行されます。

「vで始まるtagがpushされた場合」を実現するためには `if` を使います

```yaml
      - run: npm publish
        if: contains(github.ref, 'tags/v')
```

これでvで始まるtagがpushされたときのみ `npm publish` が動きます。

参考: https://help.github.com/ja/articles/contexts-and-expression-syntax-for-github-actions

# まとめ

「普段はpushしたらその都度ユニットテストが実行され、tagもpushした場合のみリリースする」が実現できました。

`on` がjobごとに設定できたらもう少しわかりやすくなるかも？

**もう少しいい設定方法があったら知りたい**

（全体的にまとまりのない文章ですみません）
React Nativeでmapを使おうとするとエラーが出てくる

#はじめに
reactNativeで簡易的なトイレマップを作ろうと、
map機能をimportしたが、エラーが出てしまったので、今後のために解決策を記す。


#コード

```App.js
import React from 'react';
import { StyleSheet, View } from 'react-native';
import { MapView } from 'expo';

export default class App extends React.Component {
  render(){
    
  return (
    <View style={styles.container}>
      <MapView></MapView>
    </View>
  );
}
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
  mapview:{
    ...StyleSheet.absoluteFillObject,
  },  
});

```

#出てきたエラー
```
Unable to resolve module `react-native-maps` from `/Users/tnatsume/reactNative/toilet/App.js`: Module `react-native-maps` does not exist in the Haste module map

This might be related to https://github.com/facebook/react-native/issues/4968
To resolve try the following:
  1. Clear watchman watches: `watchman watch-del-all`.
  2. Delete the `node_modules` folder: `rm -rf node_modules && npm install`.
  3. Reset Metro Bundler cache: `rm -rf /tmp/metro-bundler-cache-*` or `npm start -- --reset-cache`.
  4. Remove haste cache: `rm -rf /tmp/haste-map-react-native-packager-*`.

ABI34_0_0RCTFatal
__37-[ABI34_0_0RCTCxxBridge handleError:]_block_invoke
_dispatch_call_block_and_release
_dispatch_client_callout
_dispatch_main_queue_callback_4CF
__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
__CFRunLoopRun
CFRunLoopRunSpecific
GSEventRunModal
UIApplicationMain
main
start
```

#解決
## コード
```App.js
import React, { Component } from 'react';
import { StyleSheet } from 'react-native';
import MapView from 'react-native-maps';

export default class Main extends Component {
  render() {
    return (
      <MapView
        style={styles.map}
        initialRegion={{
          latitude: 37.78825,
          longitude: -122.4324,
          latitudeDelta: 0.0922,
          longitudeDelta: 0.0421,
        }}
      />
    );
  }
}

const styles = StyleSheet.create({
  map: { ...StyleSheet.absoluteFillObject, },
});
```

## 地図画面
地図を表示できた。
![スクリーンショット 2019-09-03 12.53.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343721/f7867b23-98aa-712e-461c-db105f5d88a1.png)

何が原因だったかはよくわからなかった（本当はよくない）が、
何はともあれ、地図を表示できた。
Macでもipコマンドが使いたい

Linux 環境になれてると `ip` コマンドをよく使うが、maxOS だとIPやルーティングの情報取るのに route や ifconfig コマンドになって慣れてないので使いづらいと思ってたんが、macOS 用の ip コマンド風ラッパーコマンドがあることを知ったので入れた。

```
brew install iproute2mac
```

よく使う基本的なサブコマンドは大体サポートされてるので今の所は何の不自由も感じてない。便利になった！
Rails6 Action Text

試してみたく ActionTextを使ってみました

こんな感じのシンプルなブログ投稿

<img width="760" alt="スクリーンショット 2019-09-03 12.19.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88038/4169706a-7e29-7c50-24f6-e49933a9f873.png">

## 環境

- Docker
- Ruby2.6.3
- Rails6.0.0
- Bootstra4

## 下準備

image_processing

``` Gemfile
gem 'image_processing'
```
これがないと画像が表示されませんでした

```bash
$ bundle install
```
action_text

```bash
$ rails action_text:install
```

以下は自動で入ってました。

```/packs/application.js
require("trix")
require("@rails/actiontext")
```
## Post modelの作成

カラムはtitleだけ

```bash
$ rails g model Post title:string
$ rails db:migrate
```
PostmodelとActionTextのtableが作成されます

``` /models/post.rb
class Post < ApplicationRecord

  validates :title, presence: true

  has_rich_text :content #こちらが必要
end
```

## controllerとview
各controllerは省略します。
ストロングパラメータにcontentを追記

``` /controllers/posts_controller.rb

def post_params
   params.require(:post).permit(:title, :content) 
end

```

``` /views/posts/new.html.erb

    <h2 class="text-center">新規投稿</h2>
    <%= form_with model: @post, local:true do |form| %>
        <div class="form-group">
          <%= form.label :title %>　<br />
          <%= form.text_field :title, class: "form-control"  %>
        </div>

        <div class="form-group">
          <%= form.label :content %><br />
          <%= form.rich_text_area :content %>
        </div>

        <hr>

        <div class="form-label-group col-md-6 mx-auto">
          <%= form.submit "登録", class: "btn btn-lg btn-primary btn-block" %>
        </div>
    <% end %>
 

```

![Screen Recording 2019-09-03 at 12.43 PM.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88038/b5d06d5f-750d-4127-4ff2-c8abded4b53f.gif)

##　雑感

ここまでの導入は簡単な印象です。
あとはActive StorageとS3の連携が必要になるかと思います。
Kotlin 初心者とにかくアウトプットシリーズ args = argument

##前書き

とにかくアウトプットなので、１時間程で調べて、書いて、投稿の流れ

##main(args :Array<String>)のargsとは？

Kotlin最初の方で出てくる。

```kotlin
fun main(args :Array<String>) {
  println("Hello World")
}
```

argsって何？という話

JavaからKotlinに入っている人なら、
わかりやすいらしいが
###args = argument(引数)　のようだ

①Kotlinのmain関数の引数はコマンドライン引数

[※コマンドライン引数](https://wa3.i-3-i.info/word11643.html)


上の例では、「args」は引数を代入する変数
実際何でも良い
以下で、例を示し動かして見ましたが、問題なく動きました。
 
```kotlin
// args = arguments に変更した例
fun main(arguments: Array<String>) {
    println("Hello World")
}
```


何でも良いという例

```kotlin
// args = a に変更した例
fun main(a: Array<String>) {
    println("Hello World")
}
```

###おまけ

その後ろのに続く「Array<String>」は型指定
Array = 配列
<String> = String型
を表している。
AZURE VMの複製(スナップショット)

# AZURE VMを複製したい!!
という要望が出てきて
本番のVMからDNS以外の情報を丸コピーしてテスト用の環境をつくりましょうって、なりました。。。＾ω＾<ﾏｼﾞｶﾙ
なぜなら、元のVM環境構築に携わっておらず、内部の機構についても、なにそれおいしいの？^q^<ｹﾞﾎﾞｰ
という状況だった。

# メリット
- VMのサイズ選択が可能  
例えば、元のVMサイズが「vCPU:4」に対して、複製したVMサイズを「vCPU:1」で複製が可能。
VMバックアップからVMを複製しようとすると元のVMサイズ丸コピーで作成されるため、VMのサイズ制限に違反して作成できない可能性があるため、VMサイズが選択できるのはうれしい。

# デメリット
- 完全な複製をするためには、元のVM設定を覚えておく必要がある。  
スナップショットから複製する際は、1からVMを作成するための細かな設定などを再度設定しなおす必要があるため。

# 本題
調べた結果、複製するにはVMディスクのスナップショットを作成して、ディスクを複製する方法が早かった。
※参考サイト：https://sys-guard.com/post-16431/

## 複製準備
### VMディスクのスナップショットの作成
1.「すべてのサービス」で「Virtual Machine」を入力して、検索
2. スナップショットを作成したいVMを選択
3. 「設定」→「ディスク」を選択
4. コピーを作成したいディスクを選択
![VMディスク選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282721/b8237b1e-a274-8a87-5e4d-887213763cf2.png)
5. 「概要」ページの上にある「スナップショットの作成」を押下
![AZURE_VM_ディスク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282721/ce117353-3c3c-bff7-9a53-89a61a3c68d9.png)
6. 任意のパラメータを入力
![AZURE_VM_スナップショットの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282721/3e40f226-397e-443f-6c83-101709afe572.png)
7.作成を押下して、スナップショットの作成
※スナップショット作成の完了まで待つ。数分～数十分。

## 複製
### VMディスクのスナップショットからVMを作成
※スナップショット作成の完了していること
1. 作成したスナップショットを選択
2. 概要ブレードの左上にある `+VMの作成`を押下
3. 作成するVMの概要や必要な初期設定を入力
4. `OK`を押下
5. 後は個人でカスタイズする項目なので、任意にVMの設定を行う
※評価期間に使用できるVCPUは1リージョン内で10VCPUまで（変動あり）なので、全体として10VCPUを超えないようにする必要がある。有償版の場合はvCPUクォータの拡張申請が可能です。

参考にしたサイトは以下の2つです。

- [Microsoft公式 - Azure サブスクリプションとサービスの制限、クォータ、制約](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/management/azure-subscription-service-limits)
- [Microsoft公式 - リソース クォータのエラーを解決する](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/error-resource-quota)
拡張子とMIMEタイプが異なる画像を一覧表示する

# 拡張子とMIMEタイプが異なる画像を一覧表示する

## 目的

InternetExplorer 11 で画像を表示する際、
画像ファイル名の拡張子とMIMEタイプが異なると表示されない、ということがわかりました。
(例) 画像ファイル名は hoge.jpg だが、実際のMIMEタイプはPNG
参考：https://qiita.com/yuji38kwmt/items/7d7f76d53a52560bb33c

そこで、拡張子とMIMEタイプが異なる画像がどれだけ存在するか調査したときに作成したPHPファイルを紹介します。

## 概要

- PHPファイルを置いてブラウザから実行できるようにする
- glob()を使用して存在する画像ファイルのパスの一覧を取得する
- mime_content_type()を使用して画像ファイルのMIMEタイプを取得する
- 画像ファイルのMIMEタイプと、あらかじめ定義しておいた正しい拡張子とMIMEタイプの配列を比較する


## 詳細

```MIMEcheck.php
<?php
// 拡張子とMIMEタイプの配列
$extension_array = array(
    'gif' => 'image/gif',
    'jpg' => 'image/jpeg',
    'jpeg' => 'image/jpeg',
    'png' => 'image/png',
    // これ以外も調査したければここに拡張子とMIMEタイプを追加する
);

// 確認ボタンが押下されたとき
if (isset($_POST['action']) && $_POST['action'] === "confirm") {
    $not_ext = [];
    $diff_ext = [];
    // glob()内のパスは調査したい画像が置かれているパスを指定
    foreach(glob('/var/www/hoge/image/*') as $file) {
        $mime = mime_content_type($file);
        $ext = substr($file, strrpos($file, '.') + 1);
        if(isset($extension_array[$ext]) === false) {
            // 「拡張子とMIMEタイプの配列」に無いもの
            $not_ext[] = $file;
        } elseif ($extension_array[$ext] !== $mime) {
            // 拡張子とMIMEタイプが異なるもの
            $diff_ext[] = $file;
        }
    }
    // メッセージを設定してリダイレクト
    $_SESSION['not_ext'] = $not_ext;
    $_SESSION['diff_ext'] = $diff_ext;
    header('Location: /MIMEcheck/');
    exit;
}
?><html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta charset="utf-8">
    <title>画像のMIMEチェック</title>
    <script type="text/javascript">
        <!--
        function send(){
            document.check.submit();
            document.getElementById("confirm").disabled = "true";
            document.getElementById("confirm").value = "処理中";
        }
        // -->
    </script>
</head>
<body>
<h1>画像のMIMEチェック</h1>
<ul>
    <li>画像の拡張子と画像のMIMEタイプが異なるものを一覧で表示します</li>
</ul>
<?php if(isset($_SESSION['not_ext']) && is_array($_SESSION['not_ext']) && count($_SESSION['not_ext']) > 0) { ?>
    拡張子がjpg,jpeg,gif,png以外のもの<br>
    <p style="color: #a94442; background-color: #f2dede; border-color: #ebccd1;">
        <?php foreach ($_SESSION['not_ext'] as $val) { ?>
            <?php echo $val; ?><br>
        <?php } ?>
    </p>
    <?php unset($_SESSION['not_ext']); ?>
<?php } ?>
<?php if(isset($_SESSION['diff_ext']) && is_array($_SESSION['diff_ext']) && count($_SESSION['diff_ext']) > 0) { ?>
    画像の拡張子と画像のMIMEタイプが異なるもの<br>
    <p style="color: #a94442; background-color: #f2dede; border-color: #ebccd1;">
    <?php foreach ($_SESSION['diff_ext'] as $val) { ?>
        <?php echo $val; ?><br>
    <?php } ?>
    </p>
    <?php unset($_SESSION['diff_ext']); ?>
<?php } ?>
<form name="check" action="" method="post" enctype="multipart/form-data">
    <p><input type="button" id="confirm" value="確認" onClick="send()" /></p>
    <input type="hidden" name="action" value="confirm"/>
</form>
</body>
</html>
```

## 補足
・画像枚数が多いときはタイムアウトに注意(検証用の環境に画像を落としてから実行するなどしましょう)
・画像の変換を行いたい場合はここでわかった画像の一覧をもとにimagejpeg()などの関数を使って変換してあげましょう（変換処理はこちら：[複数の画像のMIMEタイプを変換する](https://qiita.com/shioharu_/items/fcbafada25a680360918)）
【Android】RecyclerViewで行間の区切り線を削除する

最近Androidを勉強し始めたデザイナーの@m-akagiです。

先日、行間の区切り線を削除するのに苦戦したので記事を残しておきます。
今回は**RecyclerViewで設定した区切り線を削除する方法**をご紹介します。

#区切り線の設定は２種類ある？
区切り線を設定するには２通りのやり方があるようです。
- **ListViewで設定**
- **RecyclerViewで設定**


#目的のファイルを見つける方法
【自分にとってむずかしかったこと】
１：プロダクト内のどこに目的のファイルがあるのか見つけ方が分からない
２：メソットを理解していないのでどこを削除すればよいのか分からない

調べて分かったのは、RecyclerView はxmlで定義するのではなく
**Java側で設定する必要がある**ということ。

私：「ということは.javaの拡張子のファイルを探せばいいのか…？」

勘違いしたままいろいろファイルを見るも、正解にたどり着けないこと数時間…
最終的にはRecyclerViewのメソットがどういうものを使っているのかを探したことが解決に結びついた。

RecyclerViewをそのまま使うと、下記のような区切り線(divider)が無いリストになる。
![list01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486362/0b7e3c8d-c65c-0077-9d6b-e77d8662be2d.png)

今回はすでに設定されている区切り線を削除したいので、その設定方法が分かれば
ワード検索してファイルを見つけられるはず…！   

見つけたのは**RecyclerView.ItemDecoration**というワード。
その中に使われているものに `addItemDecoration` というキーワードがあったので
検索にかけてみたらそれっぽいファイルを発見‼   

#RecyclerViewで設定されていた行間の区切り線を削除する

**kotlinファイル内の下記コードを削除することで区切り線を削除することができた**

```ruby:.kt
addItemDecoration(DividerItemDecoration(activity, DividerItemDecoration.VERTICAL))
```


【今回の学習のポイント】
区切り線はCSSと同じように設定しているのかもという思い込みがあったので、その概念のもとファイルを探していたのが失敗だったと反省。ListViewは割とCSSに近いが、RecyclerViewは全く違う書き方になっているのが分かった。



参照サイト：
http://hachy.hatenablog.jp/entry/2016/12/26/145820
https://qiita.com/wasabeef_jp/items/6399432b899cb5613fb1


ーーー以上
一時フォルダ内で作業する

指定した動作を一時フォルダ内で実行する関数を作った。

```powershell
function RunInTemporaryFolder([scriptblock]$Process) {    
    $Current = Get-Location

    $WorkFolder =
        New-TemporaryFile |
            ForEach-Object {
                Remove-Item $_
                mkdir $_
            }

    Set-Location -Path $WorkFolder

    & $Process

    Set-Location -Path $Current

    Remove-Item -Path $WorkFolder -Recurse -Force
}
```

# 使用方法・実行例

使用方法

```powershell
RunInTemporaryFolder({
    # 実行する動作
})
```

実行例

```powershell
RunInTemporaryFolder({
    Get-Location
})
```

実行結果

```
Path
----
C:\Users\ix523\AppData\Local\Temp\tmpCA44.tmp
```

# 参考
[Powershellテンポラリフォルダとテンポラリファイルの作り方 - 迷惑堂本舗](https://maywork.net/computer/powershell-tmpfile-tmpfolder/)
Swift/Xcode：Image Assetsの@2x,@3x画像をコードでリサイズするときは注意しろよな☺️

解像度が異なる画像をプラットフォームや場面ごとにいい感じに仕分けて出力してくれるAssets Catalogめちゃ便利ですよね．この画像をそのまま使うんならなんの問題もないのですが，後からコードでリサイズする場合は気をつけてください！

# 一例
例えばRunCatのデフォルト猫ちゃんの情報を出力してみましょう．
![neko.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/9fd1a226-fd86-0ea6-469c-5e3dcbfa5c92.png)
画像サイズは56 × 36 pxで，Scaleは2xとなっていますね．

コードの方でも確認してみます．

```swift
let img = NSImage(imageLiteralResourceName: "cat_page0")
Swift.print(img.description)
```

```plaintext
<NSImage 0x60000177eb00 Name=cat_page0 Size={28, 18} Reps=(
    "NSCGImageRep 0x60000177ec40 Size={28, 18} ColorSpace=sRGB IEC61966-2.1 colorspace BPS=0 Pixels=56x36 Alpha=NO AppearanceName=NSAppearanceNameSystem"
)>
```

`Size={28, 18}`と`Pixels={56x36}`に注目してください．Scaleが2xなので当然ですが，画像のサイズとピクセルサイズが異なっていますね．

この画像を`CALayer`を用いて表示する場合，`contentsScale`を意識しないと解像度ズレがおきて大きさが正しくない画像が表示されてしまいます．
単純にリサイズせずにこのまま表示するのであれば，`contentsScale`を計算して指定してあげればOKです．

```swift
let rep = img.representations[0]
let scale = CGFloat(rep.pixelsWide) / img.alignmentRect.width

layer.contents = img
layer.contentsScale = scale
```

リサイズする場合はどの部分をリサイズするのか，全体のアスペクトを保つのかどうか，余白を付け足すのかなどを気をつける必要があります．

例えば，ピクセルのことを意識せずに，ただ単に画像のサイズを別に指定することも可能ですが，この場合は`contentsScale`をそれに合わせないとおかしなことになります．

特に余白をつける場合は`contentsGravity`も意識しないといけません．

```swift:余白つける場合
img.size = CGSize(width: img.size.width + 5.0, height: img.size.height)
//とか NSCIImageRep使ったり, CIFilter(name: "CIAffineTransform")使ったり

layer.contentsGravity = CALayerContentsGravity.left // center, rightとかで余白がつく位置が変わる．
```

リサイズや画像加工の状況によりやるべきことが変わりますが，`contentsScale`と`contentsGravity`の２つをきちんと意識すればなんとかなると思います．

#蛇足
そもそもコードで画像を後から加工するなら，Assets Catalogでの設定をIndividual ScalesではなくSingle Scaleにしろよ．という話なのかもしれませんが．メニューバー開発においては解像度2倍がとても大切でした．．．
言語処理100本ノックやってみる UNIXコマンドの使い方

join,split,[]の使い方が少しずつ分かってきた
10~14も挫折しないようにがんばりたいな

#UNIXコマンドの基礎
##UNIXとは？
Windows,Macといった**OS**のひとつ！
Windows,Macと違って、**ターミナルの画面**だけを使って操作するタイプのOS
**Unix**と**Linux**の違いは簡単に言うと、**Linux**は**Unix**をもとに開発され、**より使いやすく**したもの

詳しくは以下のリンクへ
https://wa3.i-3-i.info/word15508.html

##どんなことが出来るのか？
**Windowsでファイルを管理するための基本的なアプリケーションの1つが「Windows Explorer」(以下、Explorer)だ。**ファイルの移動、フォルダの整理、ファイル名の変更、保存されたデータの探索など、ファイルやフォルダに関するさまざまな操作を「Explorer」を使って実施できる。

写真を用いて説明する！
![2019-09-03 (1)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/71d8fdb5-ac05-ca0a-7a76-fd18c40f0c37.jpeg)
**水色で囲んだファイルをUbuntuの画面で表示させてみる**
![コメント 2019-09-03 120740.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/f220f264-d3c4-30d5-ab6b-0c66f0fc3db2.png)

**このようにマウスを使わなくとも、コマンドだけで操作できることが分かった！**
①**cd /mnt/c/**　と打つことでLocal Disk(:C)に移動できる！
②**ls**　と打つことでファイルの中身を見ることが出来る！
詳しくは以下のリンクへ
https://news.mynavi.jp/article/liunx_win-6/
Vim での Solarized 設定方法

#１ Solarized のカラースキームをダウンロードします。

```
mkdir -p ~/.vim/colors
cd ~/.vim/colors
curl -O https://raw.githubusercontent.com/altercation/solarized/master/vim-colors-solarized/colors/solarized.vim
```

#２　 ~/.vimrc に追加します。

```
nano ~/.vimrc
```

#３、Solarized を有効にします。

```
syntax enable
set background=dark
colorscheme solarized
```
Rails6でNotification "Noty"の導入

RailsでのNotificationと言えば、torstrが定番ですが、Rails6では、うまく動かなかったので、Notyを使ってみました。

https://ned.im/noty/

![Screen Recording 2019-09-03 at 12.05 PM.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88038/438ad04c-a507-602f-cda8-8f463b53293f.gif)

![Screen Recording 2019-09-03 at 12.04 PM.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88038/8ac55832-09c1-968d-ec49-11138bd5df28.gif)


yarnで導入できるし、書き方もtorstrと似ているので、簡単です。

### インストール

```bash
$ yarn add noty
```
###各記述

```app/javascript/packs/application.js
window.Noty = require('noty');
```

```app/assets/styleseets/application.css
@import "noty/lib/noty";
@import "noty/lib/themes/sunset";
```
###パーシャル

```_notification.html.erb
<% unless flash.empty?  %>
  <script>
    <% flash.each do |key, value| %>
      <% type = key.to_s.gsub('alert', 'error').gsub('notice', 'success') %>
      new Noty({
          type: '<%= type %>',
          layout: 'topRight',
          timeout: 3000,
          theme: 'sunset',
          text: '<%= value %>'
      }).show();
    <% end %>
  </script>
<% end %>
```

```_error_messsags.html.erb
<% if resource.errors.any? %>
  <script>
      <% resource.errors.full_messages.each do |message| %>
      new Noty({
          type: 'error',
          layout: 'topRight',
          timeout: 3000,
          theme: 'sunset',
          text: '<%= message %>'
      }).show();
      <% end %>
  </script>
<% end %>
```
あとは、表示させたいviewに読み込ませるだけ。
フュージョンテーパータイプ（FBT）VS平面導波路タイプ（PLC）光スプリッター、選択方法

光スプリッター（Splitter）は、光回線終端装置（OLT）と光ネットワークユニット（ONU）を接続するコア光デバイスであり、その主な機能は、1本の光ファイバーから複数の光ファイバーに光信号を分割し、 ネットワークリンク全体の安定性に直接関連しています。

光スプリッターの動作原理は、次のとおりです。光信号がシングルモード光ファイバによって送信される場合、光のエネルギーはコアに完全には集中せず、コア近くのクラッドを通して少量が伝播されます。 2本のファイバのコアが十分に近い場合、1本のファイバで伝送された光のモードフィールドが別のファイバに入り、光信号が2本のファイバに再分配されます。
![50.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/14838512-da41-b933-058a-a3f518c90652.jpeg)

分割の原理と製造プロセスにより、光スプリッターは、溶融テーパー型（FBT）と平面導波路型（PLC）の2つのタイプに分けることができます。 この2つからどのように選びますか？ アプリの違いは何ですか？

メルトテーパータイプ（FBT）光スプリッター
フュージョンテーパーテクノロジーは、コーティング層を除去する2本以上の繊維を束ねてから、テーパー上でそれらを溶融および延伸し、分割比の変化をリアルタイムで監視します。分割比が要件に達すると、溶融延伸は終了します。 入力として1本のファイバー（残りはカットされます）を保持し、もう一方のファイバーをマルチ出力として保持します。
![46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/ab0488a1-c854-5f36-0faf-35c842dd59c2.jpeg)

平面導波路型（PLC）光スプリッター
平面導波路型光スプリッターは、石英基板をベースにした集積導波路光パワー分配デバイスです。 このデバイスは、光スプリッターチップと両端の光ファイバーアレイで構成されています。チップはコアコンポーネントです。チップの品質とシャントチャネルは、スプリッター全体の価格に直接影響します。チップには1つの入力端子とN個の出力端子があります。 導波管。 ファイバーアレイはチップの上面に配置され、入力ファイバーとN個の出力ファイバーを備えた光スプリッターを形成するためにシールされています。
![48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/1c6785f4-c4d9-2fa3-60c7-ef4878266b70.jpeg)

これらの2つのデバイスの選択方法は、それぞれの特性とユーザーのニーズを考慮することが重要です。

現在、成熟したテーパープロセスは、一度に1 x 4以下しかプルできません。 1×4以上のデバイスは複数の1×2で接続されており、例えば、1×8は7×1×2で構成され、パッケージ化されます。 平面導波路型光スプリッターには、64チャンネル以上に到達できる単一のデバイスシャントチャンネルがあります。 ブランチの数が多いほど、コストの優位性は明白です。 シャントがほとんどない場合、テーパースプリッターはより手頃な価格であり、複数波長の光伝送とより多くのユーザーを必要とするFTTHなどのシーンアプリケーションでは、PLCスプリッターがこのスプリットスケールに特に適しています。 より大きなアプリケーション。 現在、生産コストは、3ウィンドウテーパスプリッタと比較して、1x8が重要なポイントであり、1x16のPLCコスト比が明らかに支配的であり、1x4未満のテーパ型スプリッタはコストパフォーマンスに優れています。
![47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/d489da0a-3808-e880-3359-e3c835ceb63c.jpeg)
同様に、マルチパス分割では、テーパースプリッターが複数の1×2接続でパッケージ化されるため、大きなパッケージサイズが発生するだけでなく、分割の均一性も低くなります。 各1×2デバイスを完全に均等に分割することは不可能であるため、直列に接続された1×Nデバイスの各チャネルの最終出力光むらは製品によって増幅され、段数が増えるほど均一性が悪化します。 均一性が必要な場合は、正確に計算してペアにする必要があります。


スプリット比の分布の違いも、2つの主要な違いの1つです。 テーパーコーンスプリッターのスペクトルの可変性は、このデバイスの最大の利点です。 PLCスプリッターの分割は均等に分割され、信号はユーザーに均等に分配されます。 たとえば、1 x 32 PLCスプリッターは、光信号を32分割に均等に分割し、32の異なるチャネルで送信できます。 ユーザー数と距離の不整合により、異なる回線の光パワーを割り当てる必要がある場合がありますが、この場合、異なる分割比のデバイスが必要であり、FBTスプリッターが使用されます。
![49.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/9ee9b31a-8e46-7d3e-1386-24b5959bcbe3.jpeg)
フュージョンテーパー型（FBT）光スプリッターと平面導波路型（PLC）光スプリッターには、パッシブ光ネットワークアプリケーションでの長所と短所があり、ユーザーは特定の用途に応じて適切な光スプリッターを選択できます。

HYC Company（HYC）は、光通信用の受動部品のR＆D、製造、販売、およびサービスを専門とする国立ハイテク企業です。 同社の主な製品は、光ファイバーコネクター（データセンターの高密度光コネクター）、波長分割マルチプレクサー、光スプリッター、その他の3コアの光パッシブ基本コンポーネントで、ファイバーツーザホーム、4Gモバイル通信、 インターネットデータセンター、防衛通信、その他の分野。
http://www.hyc-system.com
sales@hyc-system.com
【Firebase】FCMの通知メッセージとデータメッセージの違い

# 背景
業務でFCMの話題になると、毎回仕様を忘れてしまって調べ直しになるのでまとめました。
（公式ドキュメントを熟読して整理した内容です。実機での確認ができていないので、実際の動作と違っている場合はご指摘いただけると幸いです。）

# 送信するデータについて
```
{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    },
    "data" : {
      "Nick" : "Mario",
      "Room" : "PortugalVSDenmark"
    }
  }
}
```

- `notification`はコンソールから送信する場合は必須。
- `data`は任意で好きな値を入れられる。

`notification`のtitleとbodyはコンソールで言うとこの2つのフォームです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/f0d40c03-0e73-8926-2de5-092525a0c0cb.png)

`data`はコンソールで言うと下記のカスタムデータのフォームです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/3609b336-ce17-8f1d-bfc6-9512479a12d4.png)

# 通知の種類について
`通知メッセージ`と`データメッセージ`の2種類がある。

- JSONに`notification`が含まれる場合は`通知メッセージ`として扱われ、プッシュ通知はSDK側で自動表示される。
- JSONに`notification`が含まれない場合は`データメッセージ`として扱われ、アプリがプッシュ通知を自前で作って表示させる必要がある。

※ここで言うプッシュ通知とは、端末の通知領域に表示されるViewのことです。

# 通知メッセージの表示制御とデータ処理について
`通知メッセージ`はアプリがフォアグラウンド/バックグラウンドどちらにいるかによって、表示制御の仕方とデータ処理のタイミングが変わる。

- `バックグラウンド`の場合は、プッシュ通知はSDK側で自動表示される。dataに入れた任意の値はプッシュ通知をタップした後でアプリが自前で処理可能。
- `フォアグラウンド`の場合は、アプリがプッシュ通知を自前で作って表示させる。（notificationが含まれていない場合（`データメッセージ`）と同様。）

# 参考
https://firebase.google.com/docs/cloud-messaging/concept-options?hl=ja
A10 vThunderの評価版ライセンスを取得する

# はじめに
Azure上でのvThunder評価の際に必要になったので備忘録。

## 参考
機能制限なし！「Thunderシリーズ」の仮想アプライアンス版vThunder評価版ダウンロード
https://info.a10networks.com/JP_Content_vThunderTrial_GLM_TY-Page.html?aliId=58154755

# アカウントを作成する
この[ページ](https://glm.a10networks.com/wizard/glm_welcome/create_user)でアカウントを作成する。
メールが届くのでURLクリックしアクチベーション

# ライセンスを発行する
ログインしている状態で[ライセンスページ](https://glm.a10networks.com/licenses?redir_if_empty=true)にアクセスする。

- 初回の場合は所属の登録を求められるので登録する。
- 「+License」ボタンをクリックし必要情報を登録する。
  -Name:任意
  -Organization:登録した所属を選択する。
  -Platform: Trial
  -License SKU * : vThunder Trial 5Mbps

- 「Create License」ボタンをクリックする。

※3ライセンス発行できるところまでは確認したが何ライセンス発行まで許容されるのかは不明。
phpstormで配列のarray()を[]にフォーマットで統一させる設定

みなさんはPHPの配列宣言はarray()と[]とどちらを使いますか？

PHP5.4以降では配列の短縮構文が追加され、 
array() の代わりに [] を使えるようになりましたが、
古い案件や昔からあるプロジェクトの改修などはarray()と[]が混在していることもあります。

これが気持ち悪いのでphpstormのコードフォーマットで一括置換する設定です。

PhpStorm2018.3を使用

## 配列の短い宣言スタイルを強制する設定

* 「環境設定」→「エディター」→「コード・スタイル」→「PHP」

「コード変換」タブで
「短い宣言スタイルを強制する」にチェックを入れる
![スクリーンショット 2019-09-03 11.47.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/693d0364-6f3e-e36c-1f74-328918994660.png)

この設定でOKとし、該当ファイルを開いてコードの再フォーマットを適用すると、

![スクリーンショット 2019-09-03 11.46.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/5f581a99-9818-d720-9dca-d54012bd1231.png)

フィーマット実行
![スクリーンショット 2019-09-03 11.46.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/d84146a8-ef86-5f64-787e-ad6a247d5b47.png)

フォーマットが適用されます。

コードフォーマットは以下コマンドです。
```Cmd + Alt + L```（Mac）または```Ctrl + Alt + L```（Win）
※ファイル保存しただけでは再フォーマットはされません。


プロジェクト内で混在していると気持ち悪いですよね。
チームでフォーマッターの設定を合わせるといいなと思います。
データベースランキング（2019）

#はじめに
歴史あるRDBからNoSQL、NewSQLが数えないほどのものが出てきました。

NewSQL：NoSQL（データ分析）とRDB（ACID特性）を両立する

- RDBがNoSQLの融合：RDB自体もRelational　＋ Multi-model　　
- NoSQLがRDBの融合：RDBのACID特性はNoSQLも対応していく　


単にRDB、NoSQLのどちらを採用するのではなく、利用シーンに応じてハイブリッドの構成は主流のようです。

なので、DBのトレンドを随時確認したほうが良いと思われます。

#データベースランキング
https://db-engines.com/en/ranking

##TOP10
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/1bc9e58a-94cf-b828-65b1-bf16d2bf65d2.png)

NoSQLは半分ぐらいになっています。

##ランキングチャート：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/5f30340c-4282-f2ea-b9da-e38840797e06.png)

#NoSQL
NoSQLをリストしているサイト：　http://nosql-database.org/

NoSQLの誕生の背景として３Vがあります。

- 高速でのデータ受け取り（Velocity）
- 多様なデータ（Variety）
- 大量のデータ（Volume）
- 複雑なデータ格納（Complexity）

NoSQLが４種類の分け方：

- Wide Column Store / Column Familiesの代表：Cassandra
- Document Storeの代表：ElasticSearch、MongoDB、CouchDB 
- Key Value / Tuple Storeの代表：Redis、DynamoDB 
- Graph Databases：Neo4J

#NewSQL
数年前の図ではありますが、RDB、NoSQL、NewSQLのイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/8d201756-0040-b3e1-4a8b-eac087dd2d0f.png)

URL:https://blogs.the451group.com/information_management/2012/11/02/updated-database-landscape-graphic/

以上
Macで.bashrcファイルを作成する

Macのデフォルトって**.bashrc**ファイルってデフォルトで無いんすね...
普段、仮想環境に入ってばっかりだから、Macにもあるものだと思い込んでいた。

デフォルトで無ければ、作成すれば良いということで、作る作業の一連の流れのメモを取っておく。

これの何が便利かと言うとエイリアスとか設定できるので、作業時間が短縮するのです。（チリツモってやつです。）

## .bashrcファイルを探す

1. ホームディレクトリに移動（元からいれば別にOK）
2. ファイルを検索します

```bash
# ホームディレクトリに移動する
$ cd ~

# bash系のファイルを探す
$ ls -la | grep 'bash'
-rw-------   1 hoge  staff   8768  9  2 18:26 .bash_history
-rw-r--r--   1 hoge  staff    243  8 30 19:05 .bash_profile
drwx------  44 hoge  staff   1408  8 28 12:26 .bash_sessions
```

デフォルトだとMacにはやはり無いですね。

## .bashrcファイルを作成する

```bash
$ touch .bashrc
```
## .bashrcファイルを編集してエイリアスを設定
vimを使用している人はvimで。通常の人はviコマンドで編集します。

適当に自分で設定したい項目を追記します。僕はよくgitコマンドを使用するので、gitコマンドをエイリアスに設定します。

エイリアスの設定方法は以下。
`alias {設定したいコマンド名}='実際のコマンド'`
**※「=」の間にスペースを含むとエラーになるので注意**

```bash
$ vi .bashrc

###############
# エイリアス設定
###############

# git関連
alias gsl='git stash list'
alias gsa='git stash apply'
alias gss='git stash save'
alias gpld='git pull origin develop'
alias gsd='git stash drop'
alias gr='git grep'

# その他
alias la='ls -la'
```
## .bashrcファイルの変更を反映する
実際に.bashrcファイルを作成しただけでは読み込んでくれないので、.bash_profileに「.bashrc」を読み込んでくれー！！！という記述をしなければなりません。

```bash
$ vi .bashrc

# 以下を追記
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
```

そしたら、どちらのファイルもMac側に反映する必要があるのでsourceコマンドを使用して反映させます。

```bash
$ source .bashrc

$ source .bash_profile
```

終わり！！！
ユニバーサルリンク(Universal link)でアプリを開いてもAppDelegateのapplicationが呼ばれなくなった時の対処法(Swift5)

これまで普通にできていたAppDelegateでのユニバーサルリンクのハンドリングが突然できなくなり、その時参考になる記事があまりなかったためその忘備録として。


ユニバーサルリンクからアプリを開いた際にAppDelegateの以下のメソッドでハンドリング処理をしていました


```swift:AppDelegate.swift

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool　{
        guard userActivity.activityType == NSUserActivityTypeBrowsingWeb else { return false }
        guard let url = userActivity.webpageURL else { return false }
        let handle = handleUniversalLink(URL: url)
        return handle
}
```
突然上記のメソッドが呼ばれなくなった原因としてパッと思いつくものがSwift5のバージョンアップしかなかったため、色々調べましたが最終的に以下のように修正したところ再びメソッドが呼ばれ、ハンドリングできるようになりました。


```swift:AppDelegate.swift

func application(_ application: UIApplication, continue continueUserActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
		guard continueUserActivity.activityType == NSUserActivityTypeBrowsingWeb else { return false }
        guard let url = continueUserActivity.webpageURL else { return false }
		let handle = handleUniversalLink(URL: url)
		return handle
}
```

# 参考資料
こちらの記事が非常に参考になりました

 
- https://qiita.com/kogepan159/items/a1698687138bc9e33a26
【Android】細かい注意点

## 拡張forの中の処理を一度も通っていない 
list.size() == 0のとき、拡張for文の中の処理はすべてスルーしてしまう。  

```
List<hogeDto> list = new ArrayList<>();
//list.size == 0
for(hogeDto dto : list){
    Log.d("log",dto.getId());
}
```
## adapterのgetViewが一度も呼ばれていない  
getCount = 0の時はよばれない。
getCountにlist.size() == 0のlistを入れている時は注意する。

## NotFound ResourceId エラーが出てしまう  
textViewに数字をsetすると、リソースIDと勘違いしてしまう。
"3"なんてリソースIDで指定しているオブジェクトはないので、
エラーになってしまう。
→Stringに変換してからsetTextするとエラーにはならない。

```
int number = 3;
TextView view = findViewById(R.id.hoge);
view.setText(number);
```  

## APIをたたいて取得したデータをActivityでListにつめて、ListをAdapterに渡してnewするとListがNullで落ちてしまう  

①onCreate()の中で、adapterにカラのListをつめてLayoutを描画する。
②onResponse()が呼ばれると、ListにAPIから取得したデータをつめて
  再度Layoutを描画する。
※APIからデータを取ってくる速度は、
 AdapterのgetViewで描画が完了する速度よりも遅いため。

```
HogeActivity {
  onCreate(){
    ①SharedPreferencesを定義する(API取得時に使用。null対策。)
    ②List<hogeDto> list = new ArrayList<>();
    ③APIからデータを取得してListにつめるメソッドを呼ぶ
    ④adapterにListを渡す
  }
  
  //③のメソッド
  API.getInstance.getHogePoint(){
    onResponse(){
      //Listにデータをつめる処理
      //adapterのデータが変わったよ！という通知
      adapter.notifyDataSetChanged();
    }
  }
}
```
## adapter.notifyDataSetChanged();でエラーになってしまう
runnableを使えばエラーは消える。

```
/**
* adapter更新処理
*/
private Runnable adapterNotify = new Runnable() {
    @Override
    public void run() {
       adapter.notifyDataSetChanged();
   }
};
```