OmniAICreator/Qiita-1.07M huggingface dataset:
【kintone】レコード追加で「通知」を送りたいとき

kintoneの機能の「通知」機能ってややこしいですよね(゜-゜)
色々と弄ってみたりしたのですが、基本的にソロユーザーの私にとっては「通知」って分かりにくい～（＞＜）

というわけで今回は、「レコード追加時の通知」について、
**「自分宛」通知**を送りたいときに、私がハマったところと、どうやったら送れるか？について
物語っぽく記事を書いてみました。


※「自分宛」とは、私のイメージで言うところの、「名指しで通知が来る」感じです。
↓詳しくはこちらをどうぞ↓
[「自分宛」の通知と他の通知の違い](https://jp.cybozu.help/k/ja/user/notifications/notifications_to_me.html)


### 通知物語の始まり

登場人物

* 部長（経理部の部長。決算書が読める。指示したり承認したりする。）
* 太郎（経理部の手を動かす人。知識はあるし手は動かせるけど、言われないと動かない。）

最近部長はkintoneのアプリを作るのにハマっています。
今日は、To Doリストをアプリストアから追加して太郎君に指示を出そうとしています。

部長「kintoneのTo Doアプリの通知が来たら、作業してね！」

太郎「通知が来たらですね！了解です！」

部長はTo Doアプリにタスクを登録しました。

![notification02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/74b01da4-05af-b5cf-b686-cd70824e8e52.gif)

部長「よし。完璧だ！」

### 通知が来ていない！

でも、太郎君が待てど暮らせど、通知は来ないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/3b4d11ea-c92c-4831-9d96-04fba2fc79e1.png)

部長「**「担当者」**に太郎くん入れてレコード登録したんだけどなぁ。」

太郎「ちゃんと通知の設定したんですか～？」

部長「通知の設定？？**[ヘルプ](https://jp.cybozu.help/k/ja/user/notifications/notification_type.html)**にはこう書いているよ・・・」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/da524b77-7f1a-74cb-2331-25dc6450a3ad.png)

部長「**「担当者」**は**「ユーザー選択フィールド」**だし・・・。

アプリ内に**「ユーザー選択フィールド」**があれば、「レコードの追加」で通知が行くんじゃないの？」


### 「アプリの条件通知」設定してなかった！

すると太郎君が部長をdisりはじめました。

太郎「これだから部長は・・・。アソシエイトから、いや、1ヶ月お試しからやり直したほうがいいんじゃないですか？」

部長「なんだって！？」

太郎「**『アプリの条件通知』の『レコード追加』が有効な・・・・**を完全に見落としていますよ」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/9d4c377a-d23a-a91d-1519-edb4201a3c5f.png)

部長「見落としている？えっ、、どういうことなの！？」

### 「アプリの条件通知」を正しく設定しよう

太郎君は言いました。
「**「アプリの条件通知」**に**「担当者フィールド」**を追加してください。こんなふうに。」

「通知」→「アプリの条件通知」→「フォームのフィールドを追加」→「担当者」

**「担当者フィールド」**の項目の**「レコード追加」にチェック**がついてることを確認して、保存！

それから、「アプリの更新」もお忘れなく。

![notification03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/151b6e75-9e72-0e9c-67ad-7544088807f4.gif)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/be31dcbb-85a3-872f-993a-787d468d6a04.png)



部長「そうだったのか！**アプリ内に『ユーザー選択』があれば通知が行くと思っていた**よ！！」

部長はレコード追加で通知が行くかどうか、早速試しました。

![notification06.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/91efbfe1-e01f-75bc-ef45-06109ab3eb42.gif)

無事、太郎くんに通知が行きました。（想定外に映り込みましたがメール通知も届きました。）

めでたしめでたし

※ちなみに、このTo Doアプリだと作業者に設定したタイミングで通知が行きますがそれはまた別のお話ということで・・・。


### まとめ
レコード追加時に、特定のユーザーに通知を送りたいときは、

* アプリ内にユーザー選択、組織選択、グループ選択などのフィールドを置いて
* アプリの条件通知に、ユーザー選択、組織選択、グループ選択などのフィールドを追加

しましょう( ｰ`дｰ´)ｷﾘｯ
ubuntu 18.04.5  xrdpでリモートデスクトップ接続を行う

# 正しい手順のはずなのに動かない！！！
[このサイト](https://www.hiroom2.com/2018/04/28/ubuntu-1804-xrdp-gnome-ja/)を参考に行おうとするものの画面が真っ黒でうまく行かない。

# 原因
xorgxrdpがインストールされていないため。

# 解決手順
上記のサイトの手順を踏んだ上で、
[このサイト](https://note.spage.jp/archives/576)を参考にする。

```console
sudo apt install xorgxrdp
```
このようにしてxorgxrdpを入れたくなるが、

```console
sudo apt install xorgxrdp
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:
 
以下のパッケージには満たせない依存関係があります:
 xorgxrdp : 依存: xorg-video-abi-23
            依存: xserver-xorg-core (>= 2:1.18.99.901)
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
```
このようなエラーが起きるので

```console
sudo apt install xserver-xorg-core xorgxrdp xrdp
```
このようにしてコマンドを打つとインストールが成功する。

>上記でxrdpは使えるようになるが、ローカルのデスクトップがマウス/キーボードで反応しなくなる事象が起こった。
　HWEだとXに問題が発生しやすそうなので、Ubuntu18.04.2でxdpがどうしても必要な場合はServerのインストーラからGEでインストールして、後からデスクトップ環境を入れたほうが良さそう。


参考にしたサイトでは、このように書かれているが、接続される側のpcはログアウトした状態でなければそもそもリモートデスクトップで接続ができないためあまり関係ないと思われる？？
現在私の環境では特に、リモート接続をする側のマウス・キーボードに不調はない。
リモート接続されている側はログイン画面で放置しているが、特に問題はない。

# 追記(2020/10/15)
最近になってマウスとキーボードの入力ができなくなったので[このリンク](https://qiita.com/underwell111/items/c0069a4d39d3694e1d4a)を参考に解決した。
ただし、普通にubuntuを起動しても、インターフェースが死んでてターミナルが開けないので[このリンク](https://qiita.com/ikwzm/items/5514b0fe9a8728e8aecb)を参考にcuiで起動した。
私の環境では、

```console
$sudo apt-get -y install xserver-xorg-input-all 
E: Unable to locate package
```
となり、```upt-get update```、```upt-get upgrade```等しても結果が変わらなかったため、手動でdebファイルをダウンロードすることにした。

```console
$wget http://mirrors.kernel.org/ubuntu/pool/main/x/xserver-xorg-input-libinput/xserver-xorg-input-libinput_0.27.1-1_amd64.deb
$wget http://mirrors.kernel.org/ubuntu/pool/main/x/xorg/xserver-xorg-input-all_7.7+19ubuntu7_amd64.deb
$sudo dpkg -i xserver-xorg-input-libinput_0.27.1-1_amd64.deb
$sudo dpkg -i xserver-xorg-input-all_7.7+19ubuntu7_amd64.deb
$sudo reboot
```
これでキーボードとマウスが動きました。
# urlの手打ちは二度としたくない
指定した間隔でランダムに音声を発話していくPGM

<h3>指定した間隔でランダムに音声を発話していくPGM</h3>
指定した間隔でランダムにテキストボックスの候補中のテキスト
を読み上げるスクリプトを作成しました

2024.11.26 ターン枚に「えー」「びー」の頭をつけて交互にランダム音声を発話していくPGMを追加しました.

<hr>
githubURL:https://github.com/NanjoMiyako/RandomVoice

サンプルページURL:https://nanjomiyako.github.io/RandomVoice/

<hr>
ABターンの発話付きPGM

githubURL:https://github.com/NanjoMiyako2/RandomVoice2

サンプルページURL:https://nanjomiyako2.github.io/RandomVoice2/

<hr>
サンプルスクリーンショット
![screenshot1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/2aac9214-f403-a00e-a7c6-7be009828544.jpeg)

<hr>
<h3>参考にしたサイト</h3>
<a href="https://qiita.com/suin/items/99aa8641d06b5f8196560">
awaitできるsetTimeoutを1行で書く方法 - Qiita
</a>
<a href="https://qiita.com/shosho/items/3f5fe0e18d032647f22e">
javascriptで乱数を取得 - Qiita
</a>
WindowsにTensorflowを入れてみる(Tensorflow2.0)

#始めに
以前記録した、WindowsにTensorflowを入れてみるのTensorFlow2.0版です。
久々に仕事で触ることになってしまったのだけど、動かなくなってたので

#参照
ここは未編集です。

「TensorFlowのオリジナルのインストールページ」
https://www.tensorflow.org/install/install_windows

#Visual C 2015再配布のライブラリインストール
ここは未編集です。

CUDA9.0で必要なのだが、9.2の情報しか無い…
一応9.2では、2010、2012、2013、2015,
2017のいずれかがあれば行ける模様。ただし、64bit環境において32bitのCrossしてる場合は、2010、2012、2013の持とう。
駄目な理由が無ければ、Microsoft Visual C++ Redistributable一通り入れておいた方が良いんじゃ無いでしょうか？
私は、32bitと64bit共に、2005、2008、2010、2012、2013、2015-2019(共通)を入れてあります。

#CUDAインストール

「CUDA Toolkit 9.2 Download」
https://developer.nvidia.com/cuda-downloads
から
「Windows」
まで選んだ上で…「Resources」の「Archive of Previous CUDA Releases」
を叩く。

「CUDA Toolkit 9.0」に飛びます。
「Windows」「X86_64」「10」(おそらくWindows10)「exe(local)」選択。
5つ落として順に入れる。
Windows10だとセキュリティの警告が出るが構わずインストール。
また、特に1つめのファイルが1.5GBとか大きい為に時間が掛かるのと、ダウンロードに失敗している事もある。

```
cuda_9.0.176_win10.exe
cuda_9.0.176.1_windows.exe
cuda_9.0.176.2_windows.exe
cuda_9.0.176.3_windows.exe
cuda_9.0.176.4_windows.exe
```
#cuDNNインストール
ここは未編集です。

cuDNN7.0を入れる。
https://developer.nvidia.com/rdp/form/cudnn-download-survey
ログインして、「Software License Agreement」にチェックすると選択肢が現れるが、その中でも枠外に出てくる「Archived cuDNN Releases」を選択。
「Download cuDNN v7.0.5 [Dec5, 2017], for CUDA 9.0」
から
「cuDNN v7.0.5 Library for Windows10」選んで下記を落としてくる。

```
cudnn-9.0-windows10-x64-7.zip
```

展開すると「cuda」フォルダ下に、「bin」「include」「lib/x64」フォルダが現れるので、中のファイル(dll)を
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\
の該当するフォルダにコピーする。

#Python3.6.6インストール、3.7で動きました。

https://www.python.org/downloads/release/python-370/
から
「Windows x86-64 executable installer」
クリックして下記を落とします。

```
python-3.7.0-amd64.exe

```
インストールする時は、初期画面で全てのチェックボックスをチェックしないとはまります。
「Customize installation」選んで、「Optional Features」はそのままNext、「Advanced Options」で「Install for all users」にチェックしてインストールした方が良さそう。あと、一応全部チェックした。そして「Install」。
PATHに下記を追加する。

```
C:\program files\Python\Python37\Scripts
```

#ついでにpipをProxyに対応させる。
C:\ProgramData\pipに
pip.iniというファイルを作って、
[global]
proxy = http://アカウント:パスワード@ProxyサーバのURL:ポート番号

#Tensorflowご本尊。

先にpipのアップグレードでしょうな。
確認済み。

```
> python -m pip install --upgrade pip
```

では。管理者モードでコマンドプロンプト起動後。
確認済み。


```
> pip install --upgrade tensorflow-gpu
```


では、Validate your installation


```
> python
>>> import tensorflow as tf
>>> msg = tf.constant('Hello, TensorFlow!')
>>> tf.print(msg)
Hello, TensorFlow!

```
確認もOK。
Config value: 'pages'. Warning: The 'pages' configuration option has been deprecated and will be removed in a future release of MkDocs. Use 'nav' instead.となった時の対応方法

- 環境
    - Windows10 Pro バージョン1909
    - Python 3.8.5
    - mkdocs, version 1.1.2

# 事象 : MkDocsをビルドしたらなんか警告された

```bash
> mkdocs build
WARNING -  Config value: 'pages'. Warning: The 'pages' configuration option has been deprecated and will be removed in a future release of MkDocs. Use 'nav' instead.
INFO    -  Cleaning site directory
# ...省略...
```

# 原因 : `mkdocs.yml`で非推奨の`pages`を使っているから

```yml
pages:
  - 事前準備: 'index.md'
```

> Version 1.0 (2018-08-03)
> The pages configuration setting has been renamed to nav
> The pages configuration setting is deprecated and will issue a warning if set in the configuration file. The setting has been renamed nav.
> [Release Notes - MkDocs](https://www.mkdocs.org/about/release-notes/#version-10-2018-08-03)

(ざっくり訳)`pages`設定の名前を`nav`に変更したから、`pages`は非推奨になって使っていると警告を出すから変えてね。

## 対応 : `pages`を`nav`に変える
```yml
nav:
  - 事前準備: 'index.md'
```
【iOS14】App Clipを実装したアプリをAppStoreへアップロードしようとしたらハマったこと

#App Clipとは

公式ドキュメント
https://developer.apple.com/documentation/app_clips

>Create an App Clip to make some of your app’s functionality available to users who don’t have the full app installed.

アップロードしようとしたときに少し分かりにくい部分があったので記事にします。

#環境
Xcode 12.0
Swift 5.0

#アプリとバージョン番号、ビルド番号を合わせる
![スクリーンショット 2020-10-08 13.16.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/09fcd156-1e3f-5469-40f8-21345eb06bfe.png)

AppClipのTargetのバージョン番号とビルド番号を、フルアプリのTargetのバージョン番号とビルド番号と完全に一致させないとアップロード前に警告が出てしまいます。

#AppClipのアイコンを設定する
アイコンを設定しないままAppStoreにアップロードしてしまうと警告のメールが届いてアップロードに失敗します
![スクリーンショット 2020-10-08 13.22.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/250bd527-d1c6-13c7-a534-6b177ae81170.png)

普段のアプリのTargetの設定には以下のようにApp Icon Souceを設定する場所があるのですが、
![スクリーンショット 2020-10-08 13.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/8703432c-1002-4569-0876-cd995f2f3393.png)

AppClipのTargetには上記のような設定できる部分がありません

メールの内容にあるように、AppClipのTargetのInfo.plistファイルに修正を加えて、アイコンファイルを指定します。

- アイコンを追加する  
ほとんどの場合がフルアプリと同じアイコンを利用すると思いますのでフルアプリのものをコピーして持っていきます。
AppClipのフォルダ内のAssets.xcassetsに、フルアプリ版のAssets.xcasset内に設定しているAppIconをそのままコピペしするだけでOKです。
![スクリーンショット 2020-10-08 13.25.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/fd655993-15c2-ec1d-5f7e-c4b519a041a1.png)
- Info.plistに項目を追加する  
Info.plistの任意の場所にIcon Nameという項目を追加して、ValueにはAppIconと入力  
以下のようになります。  
![スクリーンショット 2020-10-08 13.28.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/a913dde6-6b61-f04b-95b8-a7371dbc455e.png)

これだけでアイコンの設定はOKです。

#App Store ConnectでApp Clip体験のURLを指定に失敗する
![スクリーンショット 2020-10-08 13.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/482e1783-cf07-35fb-467b-399ecc5ea74a.png)
全て完了しているはずなのに上記のようになってしまって何でだろうとしばらく頭を抱えてしまいました。

####解決方法
前のページに戻りビルドを選択しましょう
![スクリーンショット 2020-10-08 13.37.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/0121c8cd-5a2f-6af0-b934-f1f675f3afe9.png)


#TestFlightでテストする方法
AppStoreConnectアプリページのTestFlightタブでビルドを選択してApp Clipの呼び出しを追加します。
![スクリーンショット 2020-10-08 13.40.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/69a684db-f4c4-3c48-c7d9-6ca9b67b0969.png)

iOS14以降の端末のTestFlightアプリで以下のような項目が出現します。
![IMG_2275.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/13b30da1-9786-027b-c320-b28c6574c676.png)

テストをタップするとAppClipが起動し、AppStoreConnectで設定したURLが渡された状態をテストすることができます。

#App Clipカードを表示する、というのは調査中
Associated Domainsとかの設定やhtmlの設定等色々試しているのですが、、、
[公式ドキュメント Testing Your App Clip’s Launch Experience](https://developer.apple.com/documentation/app_clips/testing_your_app_clip_s_launch_experience)
にも詳しく記載されているのですが、この通りにやってもいまだにカードは出せていない状況です。


#終わりです
まだ実際にこの機能を使うという話は出ていないのですが、今後もっとiOS14が普及していった場合にはアプリ開発の案件では必須の機能になってきそうな予感がします。
time_fieldにバリデーションを指定する方法

# 経緯
railsでフォームを実装する際に```time_field```を使って営業時間を登録しようとしたがバリデーションがうまくいかず苦戦したため、記録として残しておく。

#  解決方法
自分がハマった順序を残しておくため３段回に分けて記述をしていく。
1.オプションなしで時間選択ボックスを生成する

```ruby
    <div class="time-field">
      <%= f.time_select :open_time %> 〜
      <%= f.time_select :close_time %>
    </div>
```

![204b83a9e02c5af89386534b8d0aeac4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700117/c7c5e257-882a-9d72-4460-ff0ca79f8524.png)
現在の時刻がそのまま表示されるため、設定を忘れていたとしてもバリデーションは通過してしまう。

２. オプションとして```prompt: true```を加える

```ruby
    <div class="time-field">
      <%= f.time_select :open_time, prompt: true %> 〜
      <%= f.time_select :close_time, prompt: true %>
    </div>
```

![be7a44a3360206f251ae9e27117a9c94 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700117/5ef96dce-f112-dc20-2217-712a7b1f8f6c.png)
これで時刻を選択をしていなければバリデーションで弾かれてエラーが表示されるはず！と思ったが、エラー表示はされない。

３. ```ignore_date: true``` を加える<br>
時間を指定していないはずなのにバリデーションでなぜ弾かれないのかというと年月日の情報も送られているためである。createアクションを実行した時のパラメーターを確認すると以下のようになっている

```ruby:コンソール
"open_time(1i)"=>"1", "open_time(2i)"=>"1", "open_time(3i)"=>"1", "open_time(4i)"=>"", "open_time(5i)"=>""
```
前半の```"open_time(1i)"=>"1", "open_time(2i)"=>"1", "open_time(3i)"=>"1"```が年、月、日のデータで、入力していない場合は"1"という値が入って送られてしまうため、バリデーションは通過できてしまう<br>
この事態を回避するために```ignore_date```オプションをつける
```ignore_date: true```とすることで未入力の場合は送信されず、時刻のみで判定をしてくれる。

```ruby:コンソール
"open_time(4i)"=>"", "open_time(5i)"=>"", "close_time(4i)"=>"", "close_time(5i)"=>""
```

年月日の部分はパラメータに含まれずに無事エラーメッセージを表示することができた。

## 参考
- https://hellhellmymy.hatenablog.com/entry/2019/09/29/223203
- https://railsdoc.com/page/time_select
eclipse 絶対に使ってほしい 超絶おすすめ ショートカットキー (Windows)

中でも個人的に利用頻度高いものには★マークつけた。

# 探す

### 型を開く★

クラスを探したいときにこの機能を使ってクラス名から探せる。
ワイルドカードで前方一致・後方一致・部分一致とかで探せるから便利。

`Ctrl + Shift + T`

### リソースを開く★

ファイルを探したいときにこの機能を使ってファイル名から探せる。
ワイルドカードで前方一致・後方一致・部分一致とかで探せる。

`Ctrl + Shift + R`

### 検索ウィンドウを開く

検索するためのウィンドウを開く。「ファイル検索」でワークスペース内のファイル探すときによく使う。

`Ctrl + H`

# コーディング

### コメントアウト・コメントアウト解除★

対象の行をコメントアウトしたりコメントアウトからもとに戻したりできる。
当たり前のように使うけど、初心者は意外と知らない。
複数行を一つ一つ `//` つけてる初心者の姿を見てるとたまらなくなるのでぜひ最初に覚えてほしい。

`Ctrl + /`

### 行削除★

1行さくって消せる。

`Ctrl + D`

### 行を上または下にコピー★

`Ctrl + Alt + ↑` 上にコピー
`Ctrl + Alt + ↓` 下にコピー

### カレント行を移動

`Alt + ↑` 上に移動
`Alt + ↓` 上に移動

### コード補完★

クラス・インスタンスのメソッドやフィールドの候補が出る。
通常は`.`をつけると候補が自然に出るがうっかり候補選択しなかった場合や候補決定後に他の候補見たいときに使える。
「syso」もしくは「sysout」まで書いてCtrl + SpaceするとSysout.out.println()が生成される。

`Ctrl + Space`

### 宣言を開く★

対象のクラスやメソッドのソースコードを開く。

`F3` or `Ctrl + 左クリック`

※`Ctrl + 左クリック`が結構便利

### import文自動整理★

importが足りないとき、不要なimportが残っているとき、これ一発で綺麗に整理してくれる優れもの！

`Ctrl + Shift + O`

### 呼び出し階層を開く

対象メソッドを呼び出している処理をリストアップしてくれる。

`Ctrl + Alt + H`

### リファクタリング・名前変更

クラス名、インスタンス名、変数名、メソッド名を変更するときに使う。
リファクタリング機能によって影響する箇所を自動的にまとめて変更してくれるのでかなり便利。

`Alt + Shift + R`

# エディタタブ

### エディタのタブ移動★

クラスごとのエディタのタブを移動するときに使う。

`Ctrl + PageUp` ←に移動
`Ctrl + PageDown` →に移動

### エディタの切り替え★

クラスごとのエディタを選択したいときに使う。

`Ctrl + Shift + E`

### エディタのタブ閉じる★

見終わったクラスのタブはこれで閉じる。

`Ctrl + W`

### エディタのタブ全部閉じる★

いろんなクラスを開きすぎたらコレ。

`Ctrl + Shift + W`

# 実行

### 再実行★

コンソールアプリで一度実行したものを再実行できる。
一度も実行したものがない場合は「実行構成」ウィンドウが出てくるので実行対象を選択したり設定したりするといい。

`Ctrl + F11`

### デバッグ再実行

前回のデバッグを再度実行できる。

`F11`

### デバッグ時の操作

|ショートカットキー|用途|説明|
|---|---|---|
|F5|ステップイン|止まっている該当の処理のメソッド内にもぐりたいとき使う。|
|F6★|ステップオーバー|ブレークポイントで止めた場所から1ステップずつ進むときに使う。|
|F7|ステップリターン|ステップ実行中の場所から呼び出し元の処理に戻りたいときに使う。|
|F8★|再開|デバッグで止めている状態を解除して進める場合に使う。次に到達するブレークポイントの位置で止まる。|

### ブレークポイントの設定・解除

該当の行にブレークポイントを設定したり解除したりできる。

`Ctrl + Shift + B`
外部キー・親テーブル・子テーブルとは

#はじめに
本記事では親テーブル・子テーブルとは？について、簡単に説明していきます。
文字だけではわかりにくいかもしれませんがご了承お願いします。

#外部キーとは
「外部キー」とは、関連したテーブル間を結ぶために設定するカラムのことで、データの整合性をデータベースに保証させるために利用するものです。

#親テーブル・子テーブルとは
関連付けられた各データは参照される側と参照する側で親子関係が成り立っています。
そして、外部キーを設定してデータを参照する側が「子テーブル」、参照される側が「親テーブル」となっています。
【Unity】自作のAndroidManifestの設定方法

# はじめに

Androidでバイブレーション機能を有効にしようとしたのですが、上手く動作しなかったので、Manifestファイルにパーミッションを自分で設定して、解決する事にしました。

# パーミッションの設定方法

今回の方法を試したのは、下記のUnityバージョンです。

`Version 2019.4.8 f1`

## 内容を作成する

デフォルトで読み込まれるファイルを参考に設定していきます。
Unityのデフォルトで利用されるファイルは下記のパスに存在しています。
`{Unity本体をインストールした場所}\2019.4.8f1\Editor\Data\PlaybackEngines\AndroidPlayer\Apk`
内の`UnityManifest.xml`の内容を確認します。

`<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->`は不要なので削除します。

下記の☆の部分にパーミッションを設定します。

```
<?xml version="1.0" encoding="utf-8"?>
- <!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN--> ここは削除
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools">

    ☆追加したい権限などをここに追加する。

    <application>
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:theme="@style/UnityThemeSelector">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
</manifest>
```

## 所定の場所に配置
プロジェクトフォルダ配下のAndroidフォルダに`AndroidManifest.xml`を作成します。

`｛プロジェクトのフォルダ｝\Assets\Plugins\Android\AndroidManifest.xml`

# 出力内容の確認
プロジェクト配下の下記のパスに作成された`AndroidManifest.xml`を確認します。

`｛プロジェクトのフォルダ｝\Temp\gradleOut\launcher\src\main\AndroidManifest.xml`

内容を確認し、設定した権限が正常に含まれていれば、問題ありません。
[Splunk]ロールの違いによるコマンド実行の可否の検証

# [Splunk]ロールの違いによるコマンド実行の可否の検証

## 目的・背景

adminロールとuserロールにユーザを登録しました。
この2つのユーザを使用し、Adminロールで実行可能な「user add」コマンドがuserロールで実行できるのかを確認します。

## 参考サイト

[よく使うSplunkのCLIまとめ](https://qiita.com/kikeyama/items/ea920551d734446caa3e)

## 手順

* user roleの場合

```
userロールのユーザでログインします
$ sudo ./splunk login
Splunk username: user2
Password: xxxxx

add userコマンドを実行してみましたが、エラーとなってしまいました。
$ sudo ./splunk add user user3 -role user -password xxxxx
You (user=user2) do not have permission to perform this operation (requires capability: edit_user).
```

* admin roleの場合

```
adminロールのユーザでログインします
$ sudo ./splunk login
Splunk username: user1
Password: xxxxx

add userコマンドを実行してみましたが、こちらは正常に動作します。
$ sudo ./splunk add user user3 -role user -password xxxxx
User added.
```

## おわりに

ロールの違いにより実行できるコマンドに差があることが検証できました。
アタリマエのことですが、adminロールのアカウントは安易に利用させるべきではなく、userロールのアカウントを作成し、Splunk利用者にアカウントを配布すべきです。
nodemonのcrossOS設定

# nodemonとは

**他力本願**

- [nodemonとは?](https://qiita.com/mitsuhiro_K/items/429ca479b4e191bfea4d)
- [nodemon で Node.js サーバの再起動を自動化する](https://maku77.github.io/nodejs/env/nodemon.html)

# 問題

nodemonを利用してexpressを立ち上げようとしていました。

私のPCはmacOSでしたが、チームメンバーのWindows端末で同じように立ち上げようとしたところ、以下のようにJSONのSyntaxErrorが出てしまいました。  
`SyntaxError: Unexpected token ' in JSON at position 0`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205002/95d2775c-b86d-7415-4b0f-8a8aeca72036.png)

nodemon.jsonの以下の部分が正常に読み込まれないようです。

```json:nodemon.json
{
  "watch": ["server"],
  "ext": "ts",
  "exec": "exec": "ts-node -O '{\"module\": \"commonjs\"}' server/server.ts"" //ここがうまく読み込めない。
}
```

Windowsはシングルクォーテーション、ダブルクォーテーションの扱いが難しい気がする。

# 解決策

ぐぐって見つける。
https://github.com/TypeStrong/ts-node/issues/606

[cross-env](https://www.npmjs.com/package/cross-env)を利用します。こちらの内容についても他力本願


[Nuxtでcross-envを使い環境ごとに環境変数を分ける](https://qiita.com/TakahiRoyte/items/c152ad8baa191ed1f8ae)

## corss-envの導入

```shell
npm install --save-dev cross-env
```

## nodemon.jsonの編集

issueに記載されている通り、execスクリプトを編集します。

```json:nodemon.json
{
  "watch": ["server"],
  "ext": "ts",
  "exec": "cross-env TS_NODE_COMPILER_OPTIONS={\\\"module\\\":\\\"commonjs\\\"} ts-node server/server.ts" 
}
```

## 結果

mac・Windows共に動作確認できました。

引用元の皆様ありがとうございました。
TextFieldの左に余白を作る

TextFieldにはleftView, rightViewというプロパティがあるのでそこに透明のViewを配置して余白を作ろうと思います。
以下のコードでTextFieldを生成すると、

```Swift
textField.borderStyle = .line
self.view.addSubview(textField)
//オートレイアウト
textField.translatesAutoresizingMaskIntoConstraints = false
textField.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.8).isActive = true
textField.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
textField.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
```

![スクリーンショット 2020-10-08 13.49.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253564/dd97e1b4-d4fb-f9e5-e662-f236a4dc631b.png)

最初の文字が左のborderに近すぎますね。
そこで以下のコードを追加してみます。

``` 
textField.leftViewMode = .always
textField.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 30))
```

![スクリーンショット 2020-10-08 13.52.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253564/353c862f-1a14-0d10-ef41-9ca470bd83db.png)

余白を追加することができました！
右側も同じようにして余白を作ることができます。
ボタンを配置したりもできるので色々な使い方ができそうですね！
[Splunk]Splunkユーザの登録

# [Splunk]Splunkユーザの登録

## 目的・背景

構築したSplunkの環境に、検証用ユーザを登録する

## 参考サイト

[よく使うSplunkのCLIまとめ](https://qiita.com/kikeyama/items/ea920551d734446caa3e)

## 手順

```
$ export SPLUNK_HOME=/usr/local/splunk
$ cd $SPLUNK_HOME

登録されているロールを確認してみる
$ sudo ./splunk list role | grep role:
role:		admin
role:		can_delete
role:		power
role:		splunk-system-role
role:		user

adminロールにユーザを登録
$ sudo ./splunk add user user1 -role admin -password xxxxx
User added.

userロールにユーザを登録
$ sudo ./splunk add user user2 -role user -password xxxxx
User added.

登録されているユーザを確認(指定したロールに登録されている)
$ sudo ./splunk list user
username:		admin
full-name:		Administrator
role:			admin

username:		user2
full-name:
role:			user

username:		user1
full-name:
role:			admin
```

## おわりに

簡単にユーザの登録ができました。
このあと、ロールの違いによるコマンド実行の可否を確認する予定があります。
今回登録したユーザで検証を行います。
UnicodeDecodeError: 'shift_jis' codec can't decode byteとなった時の対応方法

- 環境
    - Windows10 Pro バージョン1909
    - Python 3.8.5
    - Pandas 1.0.5

# 事象 : CSVファイルをPandasで読み込んだら怒られた
```bash
Traceback (most recent call last):
  File "C:/path/to/my_code.py", line 258, in <module>
    csv = read_files(target_dir)
  File "C:/path/to/my_code.py", line 74, in read_files
    data = pd.read_csv(file, encoding="shift_jis")
  File "C:\path\to\venv\lib\site-packages\pandas\io\parsers.py", line 676, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\path\to\venv\lib\site-packages\pandas\io\parsers.py", line 448, in _read
    parser = TextFileReader(fp_or_buf, **kwds)
  File "C:\path\to\venv\lib\site-packages\pandas\io\parsers.py", line 880, in __init__
    self._make_engine(self.engine)
  File "C:\path\to\venv\lib\site-packages\pandas\io\parsers.py", line 1114, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "C:\path\to\venv\lib\site-packages\pandas\io\parsers.py", line 1891, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas\_libs\parsers.pyx", line 529, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas\_libs\parsers.pyx", line 720, in pandas._libs.parsers.TextReader._get_header
  File "pandas\_libs\parsers.pyx", line 916, in pandas._libs.parsers.TextReader._tokenize_rows
  File "pandas\_libs\parsers.pyx", line 2063, in pandas._libs.parsers.raise_parser_error
UnicodeDecodeError: 'shift_jis' codec can't decode byte 0xee in position 4225: illegal multibyte sequence
```

```py:my_code.py
data = pd.read_csv(file, encoding="shift_jis")
```

## 原因 : ファイルにSJISにはなくてCP932にはある拡張文字があるから。

> これは、test2.csvに、
> ・ハシゴダカ "髙"
> ・タチサキ "崎"
> 等の、windows拡張文字列が混ざっている事に起因します。
> [pandasにexcel出力のcsvを読ませる時に注意する点 - Qiita](https://qiita.com/recomemos/items/1032199c5c47f1ce5417)

頭悪いので組み合わせを試してみた。
※. 拡張文字には「髙﨑」をつかってみた。

|read_csvの<br/>文字コード|ファイルの<br/>文字コード|ファイルの<br/>拡張文字あり|ファイルの<br/>拡張文字なし|
|:-:|:-:|:-:|:-:|
|shift_jis|shift_jis|エラー|OK|
|shift_jis|cp392|エラー|OK|
|cp932|shift_jis|エラー<br/>エディタ(Sublime Text)で<br/>拡張文字を入れて保存すると<br/>保存はできるけど警告が出る。<br/>からおかしいと気が付くはず・・・|OK|
|cp932|cp932|OK|OK|


```bash:cp932でshift_jisで拡張文字ありのファイルを読み込んだ時のエラー
# ...省略...
UnicodeDecodeError: 'cp932' codec can't decode byte 0x86 in position 5: illegal multibyte sequence
```

Windowsで日本語のあるファイルを使うなら`cp932`にしておくのがよさげだ。
[CP932とSJISについても勉強してみた。](https://ponsuke-tarou.hatenablog.com/entry/2020/10/08/002458)

### 対応 : CP932でファイルを読み込む

```py:my_code.py
data = pd.read_csv(file, encoding="cp932")
```
[Git]Android Studioでの操作とGitコマンドの対応

# 概要
これまでの実務経験上、gitコマンドはターミナルで打つ方に慣れていて、Android Studioでコード書いた後に
別途開いてるターミナル(iterm)でgitコマンド打っていたのだが・・・

- **MacでMission Controllいじってターミナル探してるときにやろうとしてたこと忘れる**
- **やりたいことはどのコマンドだっけ？と一瞬考える**
- **コマンドをうちまちがえることがある**  
　　(commit と checkoutを取り違えるとかchekout と branch を取り違えることがよくある。  
　　左、右言われた時に即座に区別がつかん人みたいになってる・・・)

などなど、色々と効率が悪いなと思い、
**Android Studioでソースいじくった後にそのままAndroid StudioからGUIで操作した方が
いろいろ面倒ごとがなくなって捗るんじゃね？**
ということで自分がよく使うgit操作についてやり方調べた。


# 前提
- Android Studioバージョン4系
- メニューのVCS > Gitで開かれるメニュー(以下)からの操作についてまとめる

![スクリーンショット 2020-10-08 13.31.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/3de0a97e-3161-caa4-9018-d526a18092d4.png)


# gitコマンドとAndroid Studio上での操作の対応

やりたいgitコマンド | Android Studio上での操作
---|---
git checkout <ブランチ名>  | 1. Branches押下<br>2. 移動したいブランチ選択してCheckoutを選択
git checkout -b <ブランチ名> | 1. Branches押下<br>2. +New Branch押下<br>3. Checkout branchにチェックが入っている状態でNew branch nameにカレントブランチから新しく切るブランチ名を入力してCreate押下
git checkout HEAD .| 1. Reset HEAD...押下<br>2. Reset押下
git add <ファイル指定>; <br>git commit -m "<コメント>" | 1. Commit File押下<br>2. コミットしたいファイルにチェック(※ステージング状態にも同時にしてくれる)<br>3. コミット時のメッセージをCommit Massageに入力して「Commit」を押下
git push origin| 1. Push押下
git branch | 1. Branches...押下
git branch -D <ローカルブランチ名>| 1. Branches...押下<br>2. Local Branches から削除したいブランチ選択<br>3. Delete押下
git stash save <コメント> | 1. Stash Changes押下<br>2. Messageにコメント入力<br>3. Create Stash押下
git stash apply <コメント配列要素> | 1. UnStash Changes<br>2. Stashesから適用したいのものを選択<br>3. Apply Stash押下
git fetch | 1. Fetch押下
git pull origin <リモートブランチ名> | 1. Pull...押下<br>2. Branches to mergeでマージしたいリモートブランチを選択<br>3. Pull押下

※対応する操作がなければ、Android Studioの下部にあるTerminalタブ選択することで、
Android Studio付属のターミナルを使うことも可能。
[Python]   1秒で基数変換するメソッドつくった

最初にいいます。
1秒はもりました。
でも、4秒くらいでできます。

#使い方
使い方は簡単！

``radix_conversion(変換したい数値,その数値は何進数か,何進数に変換したいか)``
を入力するだけ！


例えば、

```.py
radix_conversion(0b11111111,2,16)
```
を実行すると

```.py
0xff
```

と出力されます。
2進数である``0b11111111``を16進数``0xff``に変換できました。

#詳細

めっちゃ簡単です笑

参考資料:[Pythonで2進数、8進数、16進数の数値・文字列を相互に変換](https://note.nkmk.me/python-bin-oct-hex-int-format/)

```radix_conversion.py

def radix_conversion(value,a,b):
    #10→~
    if a == 10:
        if b == 2:
            num = print(bin(value))
        if b == 8:
            num = print(oct(value))
        if b == 16:
            num = print(hex(value))
    #2→~
    if a == 2:
        a_string = str(value)
        if b == 10:
            num = print(int(a_string,0))
        if b == 8:
            num = print(format(int(a_string,0),'#o'))
        if b == 16:
            num = print(format(int(a_string,0),'#x'))
    #8→~
    if a == 8:
        a_string = str(value)
        if b == 10:
            num = print(int(a_string,0))
        if b == 2:
            num = print(format(int(a_string,0),'#b'))
        if b == 16:
            num = print(format(int(a_string,0),'#x'))
    #16→~
    if a == 16:
        a_string = str(value)
        if b == 10:
            num = print(int(a_string,0))
        if b == 2:
            num = print(format(int(a_string,0),'#b'))
        if b == 8:
            num = print(format(int(a_string,0),'#o'))
    
    return num
```
mac osでsdカード（外付けssd,hddほか）が認識はしているがマウントされない場合の対処

# 認識はしているがマウントされない

マシンにsdカードや外付けhhdなどをつけっぱなしのままスリープしたりすると発生するので対処法を共有します。
ディスクユーティリティで確認しても認識はされているがマウントできないという状態でUI上で色々試しても、OSを再起動させてもどうにもならない。（全くどうなってるんですかね？）

例えばこういう確認事項リストを試してもどうにもならない場合
https://jp.easeus.com/mac-data-recovery/solution-for-sd-card-not-recognized-by-mac.html

# アクティビティモニタで「fsck_hfs」、もしくは「fsck_exfat」を強制終了せよ！

スポットライトで「アクティビティモニタ.app」を検索して実行。
タスクを「fsck」で検索して「fsck_hfs」、もしくは「fsck_exfat」を強制終了する。
するとエラーが表示されて、sdカードや外付けがマウントされます。
自分の場合は他のいろんなこと試しても無駄でこれが原因のことが多いのに、調べても載っていない記事が多いです。

個人的には「認識されているけどマウントされない」対処法としては優先的にこちらを実行した方がいいと思います。

ちなみにこちらには載っています。
https://itojisan.xyz/trouble/16211/
Markdownビューワを搭載している投稿型サイトでのMarkdownで画像貼り付けるときのサイズ指定

# 概要
Markdownビューワを搭載している投稿型サイトでのMarkdownで画像貼り付けるときのサイズ指定方法。

Qiitaでもできます。

**Markdown一発ではかけないけどアップロードした後には画像のURLが確定するから、
その画像を参照しつつサイズ変更することをHTMLで書く**

という形で対応する。

## 1. 画像をアップロードする

```
![保留.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/9179f39e-40b3-9576-3075-65eec3777711.png)
```
上のようなリンクが表示される。

**この時点での画像(保留.png)のサイズ**

![保留.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/9179f39e-40b3-9576-3075-65eec3777711.png)


## 2. 画像添付のMarkdown書式を以下のようにHTMLで書き換える

※横幅(width)にサイズを指定して、縦幅(hight)は自動に任せる例

```
![保留.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/9179f39e-40b3-9576-3075-65eec3777711.png)

→

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/9179f39e-40b3-9576-3075-65eec3777711.png" width="20">
```

**サイズ変更後の画像**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/9179f39e-40b3-9576-3075-65eec3777711.png" width="20">


## 参考
[Changing image size in Markdown on Gitlab](https://stackoverflow.com/questions/49074666/changing-image-size-in-markdown-on-gitlab)
Vueのライフサイクルフックを実践してみる

Vueを使っていると、createdやmountedといったプロパティをよく目にする。

これは**処理をどのタイミングで実行したいか**を設定（フック）するもの。

Vueのライフサイクルフックという概念に基づいている。



##Vueのライフサイクルフック
[vue公式ライフサイクルダイアグラム](#https://jp.vuejs.org/v2/guide/instance.html#%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%80%E3%82%A4%E3%82%A2%E3%82%B0%E3%83%A9%E3%83%A0)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/688153c9-2656-acc1-5000-aef9619d4dbc.png)


上の図で赤枠で囲まれている、beforeCreateやcreatedがフックを表している。


違いは、Vueインスタンスを作成する前に実行するのか？全てのDOMを読み込んでから実行するのか？など。


##実際に見てみる

vueの単一ファイルコンポーネントを用意し、以下を記述したファイルをブラウザで読み込む。

```vue:app.vue
<template>
  <div class="app">
    Hello {{vue}}
    {{myVar}}
  </div>
</template>

<script>
export default {
  name: "App",
  data(){
    return{   
        vue: "---This is Vue---"
    }
  },
  beforeCreate(){
    console.log('beforeCreate')  
  },
  created(){
    console.log('created')  
  },
  beforeMount(){
    console.log('beforeMount')  
  },
  mounted(){
    console.log('mounted')
  },
  beforeUpdate(){
    console.log('beforeUpdate')
  },
  Updated(){
    console.log('updated')
  },
  computed: {
    myVar() {
      console.log('computed')
      return 'This is my var'
    }
  },
}
</script>
```


##実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/2675218a-1309-3267-adde-aef9c91364ff.png)

beforeCreate > created > beforeMount > computed > mountedの順に読み込まれている。

update関連は通常読み込んだだけでは表示されない。

一番最初に実行されているHello!はwebpackを使用した際にエントリーポイントに指定したindex.jsファイルに記述されたプログラム。



<br>
##まとめ
console.logで出力してみると実感できるのでわかりやすい。
MySQLのコマンドラインからのデータベース指定方法

MySQLにおいて、コマンドラインからデータベースを指定する方法について記述する。
ここで述べるデータベース指定方法は、下記３種類である。


```
shell> mysql -h host -u user -d database -p
```
もしくは、

```
shell> mysql -h host -u user -p database
```

-D オプションでは接続先のデータベース名を指定。
database にデータベース名を入力。
その他についての説明は、[こちら](https://qiita.com/momofukuht/items/bdc2a4876b26b0f0aae9)で説明。

また、下記のようにdatabaseを指定しなかった場合は、後からuse文を使用することで、データベースを指定することが可能。

```
shell> mysql -h host -u user -p
Enter password:

︙　（途中省略）

MySQL [(none)]> use database;
```

問題なければ、最後に Database changed と表示されており、MySQL [(none)] が MySQL [データベース名] に切り替わっている。


[参考]http://mysql.javarou.com/dat/000389.html
[参考]https://dev.mysql.com/doc/refman/5.6/ja/connecting.html
[参考]https://www.dbonline.jp/mysql/database/index3.html
macOS の再インストールで「復旧サーバに接続できませんでした」

#背景
新しいMacに移行したので、古いMacは要らなくなり初期化。

古いPCはCatalinaにアップデートしていた。（元々はSierra)

shift + option + ⌘ + R にて、macOSのユーティリティを召喚。
macOSのユーティリティ　> ディスクユーティリティ　で中身を削除。
macOSを再インストール　→　「復旧サーバに接続できませんでした」:rage:


#原因は２つ
<b>
①時刻にずれがあった。
②Sierraは再インストールできなくなってるみたい。
</b>

ぐぐると、「WiFiがつながってないのが原因。簡単です。」みたいなページばかりがヒットして:sweat:となってました。


①時刻にずれがあった。
時間を確認するには、上のメニューバーからターミナルを選択

```
#現在時刻を表示
date
```
で現在の時刻を確認。

PSTやPDT時刻に合わせないと行けないので、日本時間から17時間前に設定(日付が変わることが多いので注意)
計算めんどいので<b>「PST　現在時刻」</b>で検索すればいいと思う。
dateコマンドの引数として、　月日時分年　の形式で渡す。

```
#2020年10月8日12時30分に設定する場合
date 100812302020
```


②Sierraは再インストールできなくなってるみたい。
command (⌘) + R
shift + option + ⌘ + R
で起動した場合、自分の環境では
再インストール対象としてSierraになりました。

<b>option + ⌘ + R</b>　で起動してようやくCatalinaに。

※公式サポートページ
>https://support.apple.com/ja-jp/HT204904

これで進めたら、再インストールできるようになりました。
※最初の「続ける」を押して次の画面に遷移するのに少し時間がかかる
Heroku使ってみた

とりあえずホスティングにGoogle Compute Engine使う予定だったのがなくなってHerokuを人生初導入することになった。
以前から聞いたことはあったが基本自分のマシンでビルドしてGitHub Pagesやらで公開するだけだったので特に必要性を感じなかったがどうしても必要になってきたので使うことになった。
##1. アカウント登録
この手のサイトにしては入力しないといけない情報が少なくて助かった。二要素認証はちゃんとあるようだ。
パスワードが記号入れないといけないのはちょっと嫌だが。
##2. プロジェクト作成
なんか同名プロジェクトは作れないようだ。
どうも`buildpacks`を用いて開発環境を整えてくれるらしい。
buildpackを複数導入する必要があったので導入したが、一つ設定するコマンドを連続で使うと排他的に切り替わって複数設定できない罠が存在する。
#デプロイ
`git push heroku master`でデプロイできる。
フリーのFTPソフト「FileZilla」で特定のファイルだけアップロードしないようにする

【背景】ローカル環境とサーバー環境の違いでアップロードすべきでないファイルが存在する。(.htaccessなど)
特定のファイルをアップロードしないようにしたいが、現在使用しているFFFTPではそのような設定がない

【実施したこと】下記を参考にフリーのFTPソフト「FileZilla」で実現できるか確認
[FTPで特定のファイルだけアップロードしないようにする - フリーのFTPソフト「FileZilla」を使って](https://aruo.net/arbk/blog/article/how_to_file_upload_using_filezilla_except_specific_files)

●下記サイトよりインストーラ(FileZilla_3.35.2_win32-setup.exe)をダウンロード
https://ja.osdn.net/projects/filezilla/releases/69900

●FileZillaの基本的な使い方は下記参照
[超初心者向け！FileZilla（ファイルジラ）の使い方](https://techacademy.jp/magazine/2447)
yorkieを利用してVueのプロジェクトにgit hookを導入する

#Gitのhookとは
gitにはコマンドを実行する前後にスクリプトを走らせるhookという仕組みが存在します。
詳しくは[ここ](//git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF#r_git_hooks)をご覧ください。
開発でgitを使うのはまあ当たり前なので、覚えておくべきことだと思います。
#yorkieとは
npmのパッケージの一つで、なぜかVue2.0だと勝手に入ってきます。なので改めてインストールする必要はありません。
このパッケージは`package.json`にgit hookを書けるようにするものです。

#書き方

```json
"gitHooks": {
    "post-commit": "git push origin master"
  },
```
このようにgit　hookと同じ名前のキーを設定してコマンドを書くだけです。
GitHub master廃止！Ruby2.7.2リリース GitHub脆弱性診断！！【やっすんのエンジニアニュース 10月1周目】

# はじめに
Hello World!!
Youtuber系エンジニアのやっすんです。

この記事ではやっすんの独断と偏見で、エンジニア向けニュースをピックアップして紹介していきます！

Youtubeでも3分程度の動画で公開しているので、ぜひ確認してみてください。

[【YouTube動画】GitHub が master を廃止！？ GitHub Code Scanning による自動脆弱性診断！ Ruby 2.7.2 リリース！](https://youtu.be/psg7k6gn8FU)
[![GitHub が master を廃止！？ GitHub Code Scanning による自動脆弱性診断！ Ruby 2.7.2 リリース！](https://img.youtube.com/vi/psg7k6gn8FU/0.jpg)](https://www.youtube.com/watch?v=psg7k6gn8FU)

# GitHubがmasterを廃止！？
BLMの波を受けて、ついにGitHubもmasterブランチが廃止され、mainブランチに変更されました！
既存のプロジェクトには影響ないですが、新しくプロジェクトを作成する場合はmainブランチがデフォルトになります。

ただし、現状ローカルで``git init``してプロジェクト管理すると、デフォルトでmasterブランチになります。
そのままpushすると、リモートブランチがごちゃっとしてしまうので、注意してください。


# Ruby2.7.2 リリース 警告が少なく扱いやすい！！
Ruby 2.7.2になり、文法に関する警告が少なくなりました。
これで、扱いやすくなりましたね！

# GitHub Code Scanningリリース 自動脆弱性診断！！
GitHubがCode Scannningという脆弱性診断サービスを開始しました！
使えるのは、publicリポジトリとEnterprise Cloudです。

こちらのQiita記事でどんな感じがわかると思います。
実際に試すと、ワンクリックで設定ファイルが作成されるので、すごく簡単です (ただ小さいプロジェクトでも時間がかかります...)。
https://qiita.com/Kobayashi2019/items/3ee85f61ad46178b80c7

対応言語はC/C++, C#, Java, JavaScript/TypeScript, Pythonです。

Rubyが使えない、フリー/proプランのprivateリポジトリでは使えないという残念なところはありますが、今後に期待です！

# まとめ
何か間違いや指摘、感想等ありましたら、コメントよろしくお願いします。

[twitter](https://twitter.com/yassun_youtuber)や[youtube](https://www.youtube.com/channel/UCajrdoGzHzDogrNrLYYmGsg/featured?view_as=public)でのコメントもお待ちしています！
GitOps

## GitOpsによるKubernetesのmanifest管理

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/5aae0d19-f8a9-4e5c-d6b6-07649a906c69.png)

## GitOpsによるKubernetesのContinuous Delivery

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/5dad4c7b-fdb1-587c-1537-ff8ce564f6ac.png)

## 承認フローを入れたGitOpsによるKubernetesのContinuous Delivery
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/c3eb3f96-e40d-7651-432e-007d07298f59.png)

##　参考
https://www.slideshare.net/ssuser4fddce/kubernetegitops
https://thinkit.co.jp/article/14164
https://sanposhiho.com/posts/2020-04-03-qiita-ce61334d4b2036c62f73/
Youtubeを埋め込むときのオプション

YoutubeをHtmlに埋め込むときに、

```html:sample.html
 <iframe class="embed-responsive-item" src="https://www.youtube.com/embed/XDbkYXS0m5I?start=5&end=15&autoplay=1&mute=1" allowfullscreen>
```

上記のようにすると、
レスポンシブアイテム（bootstrap適用）
動画開始場所が5秒、
終了場所が15秒、
オートプレイ、
無音、
の動画を埋め込める。

やりかたは、src属性に、`"https://www.youtube.com/embed/動画のID?パラメータ1&パラメータ2&～～"`と、
パラメーターを、動画IDの最後に?をつけて、&でつなげていく。

以上。
BigQueryでSHOW CREATE TABLE的なCREATE文を生成してみる


# Summary

- https://qiita.com/ck_fm0211/items/cff5ee8de4ef0f314085
- ^ こちらにインスパイアされて、そういえば、 `INFORMATION_SCHEMA.COLUMNS` があったので、文字列連結すればできそう、と思ってやってみました。
- MySQLのSHOW CREATE TABLE みたいなやつですね。

# SQL

v こんな感じです

- `target_table_name` と project名とdataset名は適当に変えてください。
-  `column_name != "_PARTITIONTIME"` の部分も PARTITION の有無で変わります。

```sql
DECLARE target_table_name STRING;
set target_table_name = "foo_table";
select
  CONCAT(
  CONCAT("create table `", target_table_name ,"` { \n"),
  STRING_AGG(CONCAT("  ", column_name,  " ", data_type), ",\n"),
  "\n}"
  )
 from
  `foo_project.foo_dataset`.INFORMATION_SCHEMA.COLUMNS
 where
  table_name = target_table_name
 and
   column_name != "_PARTITIONTIME"
;
```

結果はこんな感じ

```
create table `foo_table` { 
  id STRING,
  time INT64
}
```

# 余談

- UDFにするといいかもですね。
- とはいえ、多くのユースケースでは、 `bq show` & `bq mk` で事足りるかと思います

```
bq show \
--schema \
--format=prettyjson \
foo_project:foo_dataset.foo_table > foo_table_schema.json

bq mk 'foo_project:foo_dataset.foo_table'
```
MySQLのサーバーへの接続方法

MySQLのサーバーへの接続方法を記述していく。

```
shell> mysql -h host -u user -p
Enter password:
```
・host
MySQLサーバーが稼働しているホストの名前。
・user
ユーザーのMySQLアカウントのユーザー名。
・-p
パスワードを設定している時に入力。

```
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 5.5.62 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL > ;
```
パスワードを入力後、上記のような内容が表示されれば、接続完了。

また、データベースの指定方法については、[こちら](https://qiita.com/momofukuht/items/76c0bb0b21c085f60689)に記載。



[参考]https://dev.mysql.com/doc/refman/5.6/ja/connecting-disconnecting.html
Xcode12 tableViewの表示エラー

#Xcode12にアップデートしたらシミュレーター でtableViewが表示エラーを起こした。

tableViewCellに、直接addSubviewできなくなったらしい。

```
contentView.addSubview(...)
```

に変更。


```
import UIKit

 class SearchCell: UITableViewCell {
     
    let collectionImageView: CustomImageView = {
        let iv = CustomImageView()
        iv.contentMode = .scaleAspectFill
        iv.clipsToBounds = true
        return iv
    }()
    
    let titleLabel: UILabel = {
        let label = UILabel()
        label.font = .boldSystemFont(ofSize: 18)
        label.textColor = .white
        label.numberOfLines = 0
        label.sizeToFit()
        return label
    }()
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
        
        contentView.addSubview(collectionImageView)
        collectionImageView.anchor(top: nil, left: leftAnchor, bottom: nil, right: nil, paddingTop: 0, paddingLeft: 8, paddingBottom: 0, paddingRight: 0, width: 95, height: 95)
        collectionImageView.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true        
        
        contentView.addSubview(titleLabel)
        titleLabel.anchor(top: topAnchor, left: collectionImageView.rightAnchor, bottom: bottomAnchor, right: rightAnchor, paddingTop: 8, paddingLeft: 8, paddingBottom: 8, paddingRight: 8, width: 0, height: 0)
        self.selectionStyle = .none
    }
        
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
```


##参考

https://stackoverflow.com/questions/63947042/since-updating-to-xcode-12-i-am-not-able-to-place-any-uicontrol-inside-uitablevi
Ruby  5以上の整数の合計

# はじめに
これは学習のメモになりますのでご了承ください。

今回は5以上の整数の合計を求めていきます。

＊　改行区切りで整数がn個入力されるので、n個の整数のうち、5以上のものを全て足し合わせた値

```
入力例1
1
3

出力例1
0


入力例2
9
2
-3
-3
4
-1
6
4
5
8

出力例2
19

```

## ソースコード

```
loop = gets.chomp.to_i
ans = 0                    //初期値を設定

(1..loop).each do |i|
    num = gets.chomp.to_i

    if num >= 5 
        ans = ans + num
    end
end

puts ans

```

## 解説

```
loop = gets.chomp.to_i
```
`gets.chomp.to_i` は1行目（例2で言うところの 9）を取得
・getsメソッドで入力値を取得
・chompメソッド：　文字列の改行を取り除く。
・to_iメソッド：　文字列を整数に変換

```
(1..loop).each do |i|
```

`(1..loop)`でloopに代入した値の１以降の値を繰り返し取り出して変数i
に代入している（2行目以降（例2で言うところの 2 -3 -3 4 -1 6 4 5 8）を取得）

```
num = gets.chomp.to_i
```

変数iに代入した値を再度を整数に変換しnumに代入する

```
if num >= 5 
   ans = ans + num
end
```
if文でnumが５以上の場合だけansに足していく


# 最後に
each文のなかで再度また整数に変換するところがなぜ必要なのか分からなかったです。

ご教授いただいてありがとうございました！
【Unity】Androidネイティブコード呼び出し時の注意点

# 初めに
作成したゲームの動作がおかしく、調査した時に、Androidのネイティブコード周りで問題が発生していました。
バイブ処理の影響で正常に動作しなくなっていました。

# 引数の型について

ネイティブのコードを呼び出す際は、引数の型を正しい物にしないと、エラーが発生する可能性があります。

## 例）バイブの実行
Androidの`vibrate`を呼び出す例です。
引数には、long型の数字を指定する事が必要です。

```
vibrator.Call("vibrate", 100);
```
上記の場合、数字の型を指定していませんので、UnityのデフォルトのInt32になってしまい、バイブ実行時にエラーが発生してしまいます。


```
long setNum2 = 100;
vibrator.Call("vibrate", setNum2);
```
上記のように、long型の変数に格納して、呼び出すことで、正常に実行する事が出来ます。

# ネイティブコードの権限について
ネイティブコードの処理を実行するために、Androidのマニュフェストファイルに権限を追加する必要があります。

[マニュフェストファイルについて](https://developer.android.com/guide/topics/manifest/manifest-intro?hl=ja)

## 例）バイブレーションを実行する際
UnityEngineのVibrate処理`UnityEngine.Handheld.Vibrate();`を呼び出した際は、Androidマニュフェストファイルへ自動的で下記のような内容が追記されます。

```
<uses-permission android:name="android.permission.VIBRATE"/>
```
下記のコードのように、UnityEngineのVibrate処理を一切利用せずにネイティブ側のバイブ処理を呼び出す際は、自身でマニュフェストファイルへ追記する必要があります。

```
public static AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
public static AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
public static AndroidJavaObject vibrator = currentActivity.Call<AndroidJavaObject>("getSystemService", "vibrator");

void vibtrate(){
    long setNum1 = 100;
    vibrator.Call("vibrate", setNum1);
}

```

[参考にしたサイト](https://stackoverflow.com/questions/58652763/androidjavaclass-androidjavaobject-causing-built-application-to-crash)
吉野家でご飯を食べたら吉野家でご飯を食べたら吉野家でご飯を食べたら吉野家でご飯を食べたら吉野家でご飯を食べたら吉野家でご飯を食べたら吉野家でご飯を食べたら吉野家でご飯を食べたら吉野家でご飯を食べたら吉野家でご飯を食べたら吉野家でご飯を食べたら

吉野家でご飯を食べたら吉野家でご飯を食べたら吉野家でご飯を食べたら
[Splunk]Splunk Enterpriseの構築

# [Splunk]Splunk Enterpriseの構築

## 目的・背景

新たに「Splunk」に携わる機会を得ました。
無料のトレーニングコースを終えたので、実際に検証・学習用環境を構築してみます。

## 目標

Windows、Linux、MacOS用があるが、今回はAWS EC2(Ubuntu)に構築します。

## 参考サイト

[Splunk起動後にSplunkWebにアクセスできない](https://teratail.com/questions/207746)  
[Splunkルーキーの皆様へ! Splunk学習のススメ](https://www.macnica.net/splunk/blog_20190508.html/?cid=Spl180186Site)  

[チュートリアルデータ](http://docs.splunk.com/images/Tutorial/tutorialdata.zip)  

## 手順

* 事前準備

```
AWS EC2 にUbuntu 18.04のインスタンスを構築
$ sudo apt update
```

* ダウンロードURLの入手方法

[Splunk Enterprise無料ダウンロード 8.0.6](https://www.splunk.com/ja_jp/download/splunk-enterprise.html)にアクセスし、「ログイン」をクリック
※Splunkアカウントを作成していない場合は作成

「Linux」をクリックし、tar.gz形式の「Download」をクリック

画面右上にある「コマンドライン(wget)」をクリックするとコマンドラインが表示される。


* ダウンロードとインストール

```
$ cd /usr/local/src
$ sudo wget -O splunk-8.0.6-152fb4b2bb96-Linux-x86_64.tgz 'https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=8.0.6&product=splunk&filename=splunk-8.0.6-152fb4b2bb96-Linux-x86_64.tgz&wget=true'
$ sudo tar zxvf splunk-8.0.6-152fb4b2bb96-Linux-x86_64.tgz
$ sudo mv splunk ../
$ sudo chown -R ubuntu:ubuntu /usr/local/splunk
```

* 初期設定

```
$ export SPLUNK_HOME=/usr/local/splunk
$ cd $SPLUNK_HOME/etc
$ cp splunk-launch.conf.default splunk-launch.conf
$ vi splunk-launch.conf

# SPLUNK_HOME=/opt/splunk-home
SPLUNK_HOME=/usr/local/splunk
```

* 起動

```
$ cd /usr/local/splunk/bin
$ ./splunk start --accept-license

This appears to be your first time running this version of Splunk.

Splunk software must create an administrator account during startup. Otherwise, you cannot log in.
Create credentials for the administrator account.
Characters do not appear on the screen when you type in credentials.

Please enter an administrator username: admin
Please enter a new password:
Please confirm new password:

    ：

If you get stuck, we're here to help.
Look for answers here: http://docs.splunk.com

The Splunk web interface is at http://xxx.xxx.xxx.xxx:8000
```

## 動作確認
起動時に登録したアカウント「admin」でログイン
「了解です！」をクリック
「再度表示しない」「2週間後に通知」のどちらかをクリック
ダッシュボードが表示されるとログイン成功。

## おわりに

構築するだけならとてもかんたんに構築です！
（備忘録）同じ列名が復数あるエクセルの取り込み

一言日記：神エクセルは増えるよどこまでも。
#前置き
不思議なことに世の中には未だに表のようなエクセルを直打ちで作っていることが少なくない。


|	名前	|	役職	|	年齢	|		|	名前	|	役職	|	年齢	|
|	:-:	|	:-:	|	:-:	|	:-:	|	:-:	|	:-:	|	:-:	|
|	ネズミ	|	神	|	60	|		|	ウサギ	|	課長	|	24	|
|	ウシ	|	部長	|	48	|		|	タツ	|	〃	|	12	|
|	トラ	|	〃	|	36	|		|	ヘビ	|	奴隷	|	1	|
|		|		|		|		|		|		|		|
|	モグラ	|	平社員	|	20	|		|		|		|		|
|	クマ	|	〃	|	20	|		|		|		|	更新日：今日	|
表A（〃はセルの結合を表す。トラとモグラの間には空行が一行）
更新日とか要らないので下表のようにしてくれればとても助かるのだが、印刷の都合とか、神託とか世の中には色々とある。

|	名前	|	役職	|	年齢	|
|	:-:	|	:-:	|	:-:	|
|	ネズミ	|	神	|	60	|
|	ウシ	|	部長	|	48	|
|	トラ	|	部長	|	36	|
|	モグラ	|	平社員	|	20	|
|	クマ	|	平社員	|	20	|
|	ウサギ	|	課長	|	24	|
|	タツ	|	課長	|	12	|
|	ヘビ	|	奴隷	|	1	|
　　　　　表B

#主題
表Aを取り込んで、表Bの形にしてからデータとして活用することを考える。

ひとまず力技で組んだのが下記である。
私見では非常にエレファント。ぱおん。

```python:前段
dataframe_raw = pd.read_excel("表A.xlsx")

df_A=dataframe_raw.iloc[:,[*range(0,3)]].dropna(how="all").fillna(method='ffill').astype({'年齢':int})
 #ilocでrawdataから0-2列を取出し。[*range()]を使うといちいち0，1，2・・・等と書かなくて良いので便利
 #dropna()で、0-3列全てがNaNになっている行を削除
 #fillna()を使うと、NaNの真上にあるデータを引っ張ってきてくれるので、結合セルで生じた空白を埋められる
 #astypeを使って、float型で読み込まれていた年齢をint型に変更
```

この時点でdf_Aは下表の感じになる。空行と「〃」は消えているのでヨシ！

|	名前	|	役職	|	年齢	|
|	:-:	|	:-:	|	:-:	|
|	ネズミ	|	神	|	60	|
|	ウシ	|	部長	|	48	|
|	トラ	|	部長	|	36	|
|	モグラ	|	平社員	|	20	|
|	クマ	|	平社員	|	20	|


```python:後段
df_B=dataframe_raw.iloc[:,[*range(4,7)]].dropna(how="all").fillna(method='ffill')
 #基本はdf_Aと同じ。ただし、普通にpd_readで読み込むと「同じ列名には.1などの区別用記号がつく」ので注意
df_B.drop(df_B.tail(1).index,inplace=True)
 #末尾の更新日情報が不要なので、切り落とす。
df_B.astype({'年齢.1':int})
df_B.columns=("名前","役職","年齢")
 #上述の通り、df_Bのcolumnには.1が付いているので名前をつけ直しておく

dataframe_comp=pd.concat([df_A,df_B])
 #columnsを同一にしておいたので、concatで縦に結合して完成。
```

完成品が前置きに書いた表Bである。

#今後の課題
```python:気になるところ
df_B.astype({'年齢.1':int})
df_B.columns=("名前","役職","年齢")
```
この辺がすごい無駄に感じる。一列に纏めることもできないし・・・。
読み込みの時点でint型を指定したり、columnsの名前を振り直さなくて良い方法がありそうな気配。

あと、**そもそもこの作業自体を一発で処理する方法があるのでは？**と疑っている。
過去にmerge関数を教わった時以来、この手の不安が常に付きまとっているのだ。
　参考：https://qiita.com/wellwell3176/items/5e39fd44590603d13291

#参考文献
https://www.366service.com/jp/qa/ee53add5af3296037ee057e49442a821

https://www.it-swarm-ja.tech/ja/python/pandas%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%9C%80%E5%BE%8C%E3%81%AE%E8%A1%8C%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/1050572731/
データ分析案件で毎回使う細かなコピペ集


プロジェクトのたびにgoogle検索しているあれこれを追記していきます.
整理しながら追加していくすたいる(なので散らかっている)

* 順不同 / 新しいトピックを上に書いていくだけ


# SQL

Bigqueryとのアクセス

```Python

import pandas
import pandas_gbq

sql = """
    SELECT  * 
    FROM `your-gcp-project-id.dataset1.your_table` 
    LIMIT 10000
"""

project_id = 'your-gcp-project-id'

df = pandas.read_gbq(sql, project_id=project_id, dialect='standard')

```


# Jupyter notebook


## jupyter kite
コード補完のエクステンション

[Kite Integrations & Plugins - AI Autocomplete & Docs for Python](https://www.kite.com/integrations/)

```
bash -c "$(wget -q -O - https://linux.kite.com/dls/linux/current)"
pipenv install --dev jupyter-kite
pipenv run jupyter nbbextension install "@kiteco/jupyterlab-kite"
```
Swiftにおける、JSONパージ時、スネークケースで渡されて面倒な対処方法

### 1.はじめに
- 表題のとおりなんですが、忘備録として記述です。
- キャメルケース、スネークケースについては、Google先生にて確認してください。
    - 例：https://designsupply-web.com/media/developmentlab/4052/

### ２．バージョン
- Xcode12
- Swift 5.0
- GitHubなし（そのままコピペで使えるよ）

### ３．キャメルケースで受信した時
APIで受信したときに、APIフォーマットがキャメルケースであった場合。
簡単に言うと、そのまんま使えた場合。

```swift
import Foundation

struct Response: Codable {
    /// 名前
    let firstName: String
    /// 名字
    let lastName: String
}

/// 受信データ
var json = """
{
"firstName": "山田",
"lastName": "太郎"
}
"""

let data = json.data(using: .utf8)!

/// デコード処理
let model = try! JSONDecoder().decode(Response.self, from: data)

print(model)
```

### ４．`JSONDecoder`のパラメータには、スネークケースで受信する方法がある

```swift
let jsonDecoder = JSONDecoder()
jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase
```

上記でエンコードする。
ただ、これだけだと自動的に使えないので、受信する構造体に、`CodingKey`を派生させた`enum`を切っておく。以下みたいな感じ

```swift
struct Response: Codable {
    /// 名前 [first_name]
    let firstName: String
    /// 名字 [last_name]
    let lastName: String

    private enum CodingKeys: String, CodingKey {
        case firstName
        case lastName
    }
}
```

### ５．まとめると
以下にような実装で、自動的に、APIがスネークケースで返信してきても、コード側としてはキャメルケースの構造体で使用可能となる。あーら便利
（知っていれば、大した話しでないのだけれどねぇ）

```swift
import Foundation

struct Response: Codable {
    /// 名前 [first_name]
    let firstName: String
    /// 名字 [last_name]
    let lastName: String

    private enum CodingKeys: String, CodingKey {
        case firstName
        case lastName
    }
}

/// 受信データ
var json = """
{
"first_name": "山田",
"last_name": "太郎"
}
"""

let data = json.data(using: .utf8)!

/// デコード処理
let jsonDecoder = JSONDecoder()
jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase
let model = try! jsonDecoder.decode(Response.self, from: data)

print(model)
```

おしまい