OmniAICreator/Qiita-1.07M huggingface dataset:
LightGBM

# LightGBM

LightGBMとは
LightGBMとは決定木アルゴリズムに基づいた勾配ブースティング（Gradient Boosting）の機械学習フレームワークです。LightGBMは米マイクロソフト社がスポンサーをしています。

LightGBMの仕組み
「決定木」、「アンサンブル学習」、「勾配ブースティング」

引数の種類
．
objective（目的関数）

### regression
回帰を解く．
metric(誤差関数の測定方法)としては，
絶対値誤差関数(L1)ならばmae, 
2乗誤差関数(L2)ならばmseと指定．

### binary

二値分類．ラベルは 0 or 1．
metricとしては，
binary_logloss(クロスエントロピー)とbinary_error(正答率)の2つ．

### multiclass

多クラス分類．
metricとしては，
multi_logloss(softmax関数)とmulti_error(正答率)の2つ．
また，クラスの数をnum_classとして設定することが推奨されている．

### learning_rate

学習率．デフォルトは0.1．大きなnum_iterationsを取るときは小さなlearning_rateを取ると精度が上がる．

### num_iterations

木の数．他に num_iteration, n_iter, num_tree, num_trees, num_round, num_rounds, num_boost_round, n_estimators という名前で呼び出すことも可能．デフォルトは100．

### num_leaves

木にある分岐の個数．sklearnのmax_depth
との関係は
num_leaves=2max_depth

デフォルトは31．大きくすると精度は上がるが過学習が進む．
### max_depth

木構造の深さを限定するための変数．データが少ないときに過学習を防ぐために設定する．デフォルト値は-1で0以下の値は制限なしを意味する．
### verbosity

学習途中の中継的な情報を表示するかしないか．
デフォルトでは表示になっており，-1を指定すると表示しなくなる．
マニアックな引数

### max_bin

一つの分岐に入るデータ数の最大値を指定．小さい数を指定することで強制的なデータ間の分離を可能にして精度を上げることができるが，大きな数を指定することにより一般性を強めることができる．結果として過学習抑制につながる．
### min_data_in_bin, min_data_in_leaf

正直，違いがわからないが設定されている値のオーダーが異なるので別物．
大きくすることでデータと分岐が1対1対応することを防ぎ，結果として過学習を抑制する．
### feature_fraction

学習の高速化と過学習の抑制に使用される．データの特徴量のfeature_fraction * 100 % だけ使用する．
### weight_column

重要なデータとそうでないデータを重みによって差別化可能．
使い方はよくわかっていないので知っている方がいらっしゃったらコメントをいただきたいです．
見た限りだと，
[data0, data1, data2,..., dataN]に対して，
[1.0, 0.5, 0.7, ..., 0.4]というような重みをつけることが可能らしい．

https://lightgbm.readthedocs.io/en/latest/Parameters.html

参照Qiita

LightGBM 徹底入門 – LightGBMの使い方や仕組み、XGBoostとの違いについて
https://www.codexa.net/lightgbm-beginner/

LightGBMのパラメータ(引数)
https://qiita.com/nabenabe0928/items/6b9772131ba89da00354
TypeScriptのType Aliasについて

TypeScriptでよく使うType Aliasに関して説明します。

まずは、文字列リテラルについておさらい。
次のように、定義された値以外の値を代入しようとすると、コンパイルエラーになる。

```typescript
let person: 'tanaka';

// OK
person = 'tanaka';

// コンパイルエラーとなる
person = 'yoshida';
```

現実世界では上記のような使い方をすることはまずない。
文字列リテラル自体は、次のようにUnion Typeと組み合わせて使われることがほとんど。

```typescript
let person: 'tanaka' | 'yoshida';

// OK
person = 'tanaka';
// OK
person = 'yoshida';
// コンパイルエラーとなる
person = 'suzuki';
```

変数 `person` の方にはUnion Typeを指定しているので、tanakaもしくはyoshidaのいずれかを値に取ることができる。
それ以外の値を代入しようとすると、コンパイルエラーとなる。上記の例ではsuzuki。

次に、上で指定したUnion Typeでとり得る型に制約をかけた `person` を型として使いたい。

```typescript
let person: 'tanaka' | 'yoshida';

// OK
person = 'tanaka';
// OK
person = 'yoshida';
// コンパイルエラーとなる
person = 'suzuki';

// これはできない
// 'person' refers to a value, but is being used as a type here.ts(2749)
let newGen: person;
```

こんなときに使えるのが、今回のタイトルでもある、Type Aliasだ。
Type Aliasを使うと、上記の例でやろうとしていることが実現できる。

```typescript
type person = 'tanaka' | 'yoshida';

let newGen: person;

// OK
newGen = 'tanaka';
// OK
newGen = 'yoshida';
// コンパイルエラーとなる
newGen = 'suzuki';
```

このように、Type Aliasを使うと予め指定したUnion Typeを使いますことができる。
今回はここまで。
素人がAWSに手を出してみた様子-3

#素人がAWSに手を出してみた様子-3

どうもはじめまして。

前回
[【素人がAWSに手を出してみた様子-2】](https://qiita.com/entakar/items/a77a1448161efc90eb31)
ではEC2でインスタンス作成→とりあえずindex.htmlを表示してみよう
を行いました。

そして第3回は**lambda**

バタバタして前回から更新が大幅に遅くなった。。。だめだなぁ

##lambdaを使ってみよう
まずはサービスから【コンピューティング】→【Lambda】を選択します。

<img width="1174" alt="スクリーンショット 2019-12-01 22.56.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50979/0b0d9f88-bd1c-5138-b0a2-589a47a48e03.png">

オプションを選択しますが、今回は【一から作成】を選択します。
ランタイムは【Node.js】を選択しました。


<img width="1135" alt="スクリーンショット 2019-12-01 22.58.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50979/ea85fa29-b2a1-1bc4-0753-68103f5e43b2.png">

Lambdaが作成完了したら【API Gateway】との連携を行います。

今回はLINE BOTのためのAPIを作成したので【LINE Developers】も手を出してみました。
言語はpythonを使用されていますが参考になると思います
https://qiita.com/yoshidev523/items/4090653578b788acb540

他にもググったりすれば沢山参考にできる良いまとめがあると思うので頑張って探してください！


##ヤマビコBOTを作りました
「あああ」と打ったら「あああ」と返ってくるだけ

それでも良かったのです。
とりあえずまず動くものを作ってみたい（一からとは言っていない）

そこから色を自分なりにつけていけばいいじゃない
「勉強なんだし」と軽い感じで考えています


##Lambda＋API Gatewayは楽しい
今回はLINE BOTでしたがこれからまた触ってみたいと思う技術でした


##次回
次回はここまで駆け抜けてバタバタととりあえず記事にしてしまったので
おさらいでまとめ記事など書いてみるつもりです（復習も兼ねて）
サブディレクトリも含め、ls -lの結果を数件ずつ取りたい

サブディレクトリも含めて再帰的にファイルを取得するのは`ls -R`や`find -maxdepth`で指定すればいけますが、ディレクトリの一部だけ（直近のタイムスタンプだけ確認したい）ということがありました。
何か良いオプション無いかと見てみたけど、無さそうだったのでxargsと組み合わせてみます。


```bash

find . -type d -maxdepth 5 | xargs -I{} sh -c 'echo {} ================== ; ls -ltr {} | head -n 3 '

```

maxdepthやlsのオプションは大体適当です。
状況に応じて変えていきます。

```bash:結果
. ==================
total 0
drwxr-xr-x  4 user  staff  128 Dec  1 22:55 test
drwxr-xr-x  2 user  staff   64 Dec  1 22:55 moge
./moge ==================
./test ==================
total 0
drwxr-xr-x  3 user  staff  96 Dec  1 22:53 test2
-rw-r--r--  1 user  staff   0 Dec  1 22:53 hoge1
./test/test2 ==================
total 0
-rw-r--r--  1 user  staff  0 Dec  1 22:53 hogeFile
./moga ==================
total 0
drwxr-xr-x  6 user  staff  192 Dec  1 22:56 aaa
./moga/aaa ==================
total 0
drwxr-xr-x  4 user  staff  128 Dec  1 22:55 bbb
-rw-r--r--  1 user  staff    0 Dec  1 22:56 file1
./moga/aaa/bbb ==================
total 0
-rw-r--r--  1 user  staff  0 Dec  1 22:55 aiueo
-rw-r--r--  1 user  staff  0 Dec  1 22:55 kakiku
```

直接の処理には関係ないですが、無いとパッと見た感じ見づらかったので、見出し代わりにechoを入れています。
このあたりは出力の関係上要らないという場合もありそうなので、お好みで。
CentOS8でdnfでnkfがインストールできない

# 環境
- CentOS Linux release 8.0.1905 (Core)

# 現象
dnfでnkfがインストールできない。

```bash:shell
dnf install nkf
```
ないよって言われる。

# 原因
CentOS8は新しすぎてnkfのパッケージがないようだ。

# 対策
rpmでcentos7から借りてくる。

```bash:shell
rpm -Uvh http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/n/nkf-2.1.3-5.el7.x86_64.rpm
```
【ライフハック】社員証（Felicaカード）とゲームカードをまとめて運用してみよう

特定のFelicaカード（Edyと同タイプ）をベースとしたカードはIDと紐づけて一部まとめることができます。[^1]
[^1]: 知っている人は昔から知っている。[Twitterつぶやき](https://twitter.com/search?q=%E7%A4%BE%E5%93%A1%E8%A8%BC%20e-amusement%20pass&src=typed_query&f=live)

そして、たまたま今回社員証がFelica対応に変わったこともあって、社員証とゲーム会社が提供しているサービスを使って社員証とゲームカードを統合してみる運用をやってみました。[^2]
[^2]: ネタとして

#前提条件
- ゲームをやった記録がある[e-amusement passカード](https://p.eagate.573.jp/)
ないし携帯データが別にあること。
- KONAMI IDを持っていること

#用意するもの
1. 社員証として配布されたFelicaカード
2. [e-amusement（株式会社コナミアミューズメント）](https://p.eagate.573.jp/)

今回は新規設定に対してはただプレイするだけでできあがってしまうしつまらないので、[e-amusementサイト](https://p.eagate.573.jp/)を使ってカードデータを移動する方法を説明します。

#手順
1. カードナンバーを知る
通常のやり方では番号を知ることができないのでゲーム機を使って知ることになりますが、今回は[麻雀格闘倶楽部](https://p.eagate.573.jp/game/mfc/uv/p/index.html)の筐体を使います。
    1. 麻雀格闘倶楽部のICをかざすところに社員証を置く
    2. 画面に表示されたら「データ引き継ぎのご案内」をタップする。
    ![mfc-card-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101343/c18c4477-d914-0e5b-8422-351b434cb5d4.jpeg)
    3. 画面にある「ここをタッチしてください」の箇所をタッチする。　
    ![mfc-card-02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101343/2a7cd34d-9fd4-0ce1-0b5b-017749e6ff72.jpeg)
　　4. カードナンバーが表示されるのでこちらをメモする。
　　![mfc-password.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101343/bf50186c-503c-4c12-3f69-5b177b288a8b.jpeg)

2. e-amusementサイトからカードナンバーを登録し変更する。
    1. e-amusementサイトにログインする
    ![e-amu-pass-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101343/c3462e5e-bfd0-2568-4bf8-e27cb79ae926.png)
    2. [e-amusement passメニュー](https://p.eagate.573.jp/gate/eapass/menu.html)から、カード引き継ぎを選ぶ
    ![e-amu-pass-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101343/892d8b64-e510-64f9-6d4f-ac98bc11bfd7.png)
    3. カードナンバーを入力してカードを引き継ぐ
    ![e-amu-pass-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101343/7c344f97-4113-9f97-c6e2-806e5cdb802b.png)

#引き継いだ結果
社員証でログインしてみました。
![20191201_181523-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101343/7dc2edc2-8307-c9db-0d8c-20172e8d32b2.jpeg "ログイン")
![Read-card.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101343/aaaf2808-21e9-1be9-6f1a-16163b31da14.jpeg)
ちゃんと認識しているようです。

#おわりに
社員証を何か有効に使う方法はないかと思ったのですが、ゲームに関しては社員証に紐づけるより携帯電話（ICカード対応）にするほうが実用的です。
ただ、携帯電話を普段使うとしてもバックアップとしてカードナンバーを入れておくのは有効でしょう。
ちなみに同じやり方でEdy対応のクレジットカードをe-amusement passに紐づけることもできます。
特定の条件を満たすFelicaカードはいろいろ面白そうなことができそうです。

#参考サイト（Felicaのことを知りたい人向け？）
[e-amusement passのデータ引き継ぎをするには？](https://p.eagate.573.jp/etc/help/index.html#id_eapass)
[[PASMO] FeliCa から情報を吸い出してみる - FeliCaの仕様編 [Android][Kotlin]](https://qiita.com/YasuakiNakazawa/items/3109df682af2a7032f8d#idm-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
[Felicaネットワークス 技術情報](https://www.felicanetworks.co.jp/tech/)
元ネタ：[Twitter "社員証 e-amusement pass"](https://twitter.com/search?q=%E7%A4%BE%E5%93%A1%E8%A8%BC%20e-amusement%20pass&src=typed_query&f=live)

#おまけ
社員証をbananaにかざしたらエラーが出ました。
![banana-err.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101343/06c5ab6b-95b7-255d-24f0-72489893cac6.jpeg)
LineDevelopers 公式アカウントの作り方

ラインのDevelopersサイト前から気になっていたので今回試してみる。
本当はMessageingAPIとか使ってみたかったが、自分にはちと難しかったのでまた今度。
今回は特に難しくない公式アカウントの作り方みたいな感じになっています。


以下のサイトからアカウントの登録を行う。アカウントは自前のラインのアカウントでも可能。
https://developers.line.biz/ja/

登録をした後下のような画面が出てくるので
<img width="1438" alt="スクリーンショット 2019-12-01 21.22.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514262/2592aa22-2355-b325-2ccb-d0614c15704e.png">

ここからStart nowを押して必要事項を記入。
そして作成を行うと以下のような画面が出る。

<img width="1440" alt="スクリーンショット 2019-12-01 21.42.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514262/33c89191-e69c-0147-1a43-a5112bd4dfe9.png">

ここのMessagingAPIからラインの友達検索でQRコードを検索するとアカウントを見つけることができる。

そして、MessagingAPIの下のところにあるAuto-Reply-Messagesのところの、Editをクリックすると
また新しい画面が出てくる。

<img width="1429" alt="スクリーンショット 2019-12-01 22.33.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514262/d726cac2-ce96-ba1f-127b-ff9e56962c10.png">

これの応答メッセージ設定のところをクリックすると
<img width="1434" alt="スクリーンショット 2019-12-01 22.35.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514262/9760d3ce-c95f-fdf9-2647-56ea6b41dfaf.png">

のように出てきて、これで作成を押す。

<img width="1433" alt="スクリーンショット 2019-12-01 22.41.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514262/61d093a4-e481-8c9e-c7f4-54602e185154.png">

ここでタイトルは適当に入力する。
キーワードを入れると、メッセージが送られてきた時、そのキーワードが入っていると
このメッセージが送信されるようになる。

キーワード入りのやつとキーワードが入ってないやつで行う。
<img width="1426" alt="スクリーンショット 2019-12-01 22.45.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514262/678a6bc6-57b0-30c6-be8c-04d814871851.png">

キーワードはこんにちは、で登録。
![Screenshot_20191201-225355.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514262/15a35055-7e6d-9d48-5cba-4bc14d52135f.png)

キーワードに反応しているのが確認できた。

応答以外にも今すぐメッセージを配信することも可能。
メッセージ配信を押すと以下の画面になる。
<img width="1437" alt="スクリーンショット 2019-12-01 22.59.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514262/2649ba3d-df8f-879d-f25a-0896940d974b.png">

画像右上の作成を押して、
配信したいメッセージを書いて配信をクリック。
<img width="1439" alt="スクリーンショット 2019-12-01 23.01.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514262/31899d60-b059-f434-e169-1364be7b3153.png">


クリックすると確認画面が出るので配信をもう一回クリックすると配信される。
VSCodeでインストールしている拡張機能

今回は現在自分が使用しているVSCode環境でインストールしている主な拡張機能を紹介したいと思います。（随時アップデート予定）

# [Japanese Language Pack for VS Code](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)
UIを日本語化したかったのでインストールしました。

# [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)
リモート環境内のソースなどを編集する際には大変に便利な機能です。
注意点としては、接続するリモート環境でもモジュールがインストールされるのでその時にインターネットに接続できる状態である必要があります。

# [Excel Viewer](https://marketplace.visualstudio.com/items?itemName=GrapeCity.gc-excelviewer)
CSVファイルもExcelのようにグリッド表示してくれます。
主にCSVファイルを参照するために利用しています。

# [Markdown Preview Mermaid Support](https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid)
現在のGitLabでは標準でmermaid形式のmarkdownがサポートされているので、
VSCodeでもmermaid対応の拡張機能を利用しています。

# [Terraform](https://marketplace.visualstudio.com/items?itemName=mauve.terraform)
インフラ環境定義を行うTerraformのファイルを編集するためのものです。

# [PlatformIO IDE](https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide)
組込系の開発プラットフォームであるPlatformIO用のIDEです。
ただし、この拡張機能をインストールするとVSCodeの起動がかなり遅くなってしまうのが欠点です。
javascript　基本その3-2 タブの切替

前回の内容から続いて
書き切れなかった内容をかきます。

# タブの切り替え
結構重要な機能である
タブの切替機能について書きます。

まず例として下記の様なコードを書きます。
次にjsの詳細なコード内容についても書いて行きます。

```html:html
 <!--イベントを発火させたいクラスをまずそれぞれ定義します。-->
<div class="panel">
    <!--タブ-->
    <ul class="tab-group">
        <li class="tab tab-A is-active">タブ-1</li>　<!-- is-activeがポイント -->
        <li class="tab tab-B">タブ-2</li>
        <li class="tab tab-C">タブ-3</li>
    </ul>
　　<!--基本is-activeの時だけcssを当てる様にするのが目的です。-->
    
    <!--タブを切り替えて表示するコンテンツ-->
  <div class="panel-group">
        <div class="panel tab-A is-show">コンテンツ-1</div> <!-- is-showがポイント -->
        <div class="panel tab-B">コンテンツ-2</div>
        <div class="panel tab-C">コンテンツ-3</div>
　　　　　<!--is-showだけ表示、他は非表示という形にします。-->
    </div>
</div>
```

```css:css
.tab-group{
    display: flex;
    justify-content: center;
}
.tab{
    flex-grow: 1;
    padding:5px;
    list-style:none;
    border:solid 1px #CCC;
    text-align:center;
    cursor:pointer;
}
.panel-group{
    height:100px;
    border:solid 1px #CCC;
    border-top:none;
    background:#eee;
}
.panel{ /*非表示にさせます*/
    display:none;
}
.tab.is-active{  /*tabを上書きして発火させます*/
    background:#F00;
    color:#FFF;
    transition: all 0.2s ease-out;
}
.panel.is-show{ /*panelを上書きしてこれだけ表示させます*/
    display:block;
}
```

```js:js
document.addEventListener('DOMContentLoaded', function(){
    // タブに対してクリックイベントを適用
    const tabs = document.getElementsByClassName('tab'); //ノードを取得
    for(let i = 0; i < tabs.length; i++) { //繰返し構文で全てに適用
        tabs[i].addEventListener('click', tabSwitch);
    }

    // タブをクリックすると実行する関数
    function tabSwitch(){
        // タブのclassの値を変更
        document.getElementsByClassName('is-active')[0].classList.remove('is-active'); //is-activeの追加
        this.classList.add('is-active'); //is-activeの削除
        // コンテンツのclassの値を変更
        document.getElementsByClassName('is-show')[0].classList.remove('is-show');
        const arrayTabs = Array.prototype.slice.call(tabs); //引数にとったオブジェクトを配列に変換してくれます。
        const index = arrayTabs.indexOf(this); //配列に対してだけ使い、DOMを引数にとって一致した要素番号を戻します。
        document.getElementsByClassName('panel')[index].classList.add('is-show');
    };
});
```

## DOMContentLoadedイベント
最初の HTML 文書の読み込みと解析が完了したとき、スタイルシート、画像、サブフレームの読み込みが完了するのを待たずに発生します。

##  this
関数（tabSwitch）の中でthisを使うと、イベントの発生元となった要素を取得することができます。

## Array.prototype.slice.call()
引数にとったオブジェクトを配列に変換してくれます。

## indexOf()
inexOf()は配列に対してだけ使い、DOMを引数にとって一致した要素番号を戻します。

## forEach()
配列に対してよく使われる繰り返し処理です。

```js:foreach1
配列.forEach( コールバック関数 )
```

```js:foreach2
配列.forEach( function(value, index) {
  // 配列のデータに対しての処理、valueは値、indexは要素番号
} )
```
lambdaを勉強した①

今更ながらlambdaについて勉強しました。
今回は概要についてです。

#lambdaとは
- サーバーの管理を気にすることなくコードを実行できるサービス
- ほかのAWSのサービスをトリガーにコードを実行できる
- APIのように使うことができる
- 課金されるのはコードを実行した時間と、回数によって課金(月に100万リクエストまで無料)
- デフォルトで使える言語はJava、Node.js、C#、Python、Go、PowerShell、Ruby
- Javaは実行時にコンパイルが行われる関係で速度が遅い
- lambda layerを利用することでほかの言語も使用可能

下記はlambdaのイメージ
API GateWay
![lambda(api).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369848/3ce8676f-aff0-3c14-c536-f38dd544bc97.png)

S3
![lambda(s3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369848/cf40cde1-5626-2642-3cc9-56383b6a0170.png)

#lambda functionとは
- 実際に実行されるコード
- それぞれが隔離されたコンテナ内で実行される
- lambdaの実行環境はAmazonLinux

#lambda functionのコールドスタートとウォームスタート
##コールドスタート
ライフサイクルの1～6までをすべて実行するのがコールドスタート
##ウォームスタート
作成したコンテナを再利用して1～6の処理を省略することで効率化

###lambda functionのライフサイクル
1. ENIの作成(VPC利用時のみ)※
2. コンテナの作成
3. デプロイパッケージのロード
4. デプロイパッケージの実行
5. ランタイムの起動・初期化
6. 関数/メソッドの実行
7. コンテナの破棄

※ENI・・・VPCで利用できる仮想NIC


#lambda layerとは
- 複数のlambda functionで共通する処理や、使用するライブラリを一つにまとめたもの
- ひとつのlambda functionに使用できるレイヤーは最大5つまで、ただし、容量制限もある[(公式サイト)](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html "AWS lambda レイヤー")

下記はイメージ
![lambdalayer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369848/a8ef6cd3-5db9-d2c3-9aea-813d9e5506ee.png)

今回、lambdaについて概要をまとめてみました。

次回は実際にlambda functionを実際に使ってみたいと思います。

参考
https://www.slideshare.net/AmazonWebServicesJapan/20190402-aws-black-belt-online-seminar-lets-dive-deep-into-aws-lambda-part1-part2/
AWS認定の模擬試験を受けてみる流れ

zennに移行しました: https://zenn.dev/cumet04/articles/aws-certificate-practice
qiita側の記事を消す予定は特にありませんが、更新することはありません。

---

[AWS認定](https://www.aws.training/Certification)の模擬試験を受けてみたのですが、思い立ってから実際に受けるところまでの事務的なところがわかりにくかったため記録に残そうと思います。

事務的なところではなく、勉強という意味での準備や事前の心構えなどにであれば調べればいくらでもブログ記事があるので、本記事では特に触れません。[^1]

[^1]: というか自分はまだ本試験受けてないので何も言えません...


## アカウントを用意する
AWS認定には、模擬試験でも本試験でも同様にアカウント登録が必要になります。

前提としてAWSアカウント（amazon.comのアカウント）が必要になる[^2]のですが、そのAWSアカウントにて進めるのではなく**そのAmazonアカウントからシングルサインオンで認定用アカウント登録をする**という流れとなります。

その認定アカウントにログインし、そこから試験の申し込み・支払い・実施などを行うかたちです。

https://www.aws.training/Certification にアクセスし、サインインより進むとアカウント作成ができます。

[^2]: サインインページにはAWSでなくAmazon.comのアカウントであることが強調されています。

## 本試験と模擬試験の構造関係
試験には本試験と模擬試験がありますが、とくに構造上分離しているわけではなく、試験一覧の中に本試験があったり模擬試験があったりします。
試験リストにアソシエイトレベル、プロフェッショナルレベル、とグルーピングされている中に模擬試験（Practice）が並んでいます。

そのため、模擬試験のみを受けたい場合であってもアカウント作成～試験申し込みまでのかなり長いパートが本試験と共通になっており、途中から「模擬試験はこちらから」のようになっていたりはしません。


## PSI / ピアソンVUEについて
認定用アカウントでログインし申し込みに進もうとすると「PSIで申し込み」「ピアソンVUEで申し込み」などと選択肢があります。

これらは何かというと、試験を実施（開催）するベンダーの名前です。
イメージとしては、試験の作問はAWSが行い、試験費用の支払い受付や試験場所・環境の提供など実施の部分をベンダーが行うという構造です。

会場にいって行う場合でも（模擬試験のように）ブラウザ上で行う場合でも差はないので、模擬試験の場合はどちらを選んでも良いと思います。


## 申し込み・受験の流れ
どのタイプの試験を受けるかを決めたとして、実際に申し込み・支払い・受験するまでの流れです。

まず認定アカウントにログインし、申し込み画面まで遷移します。
ページ下部の一覧の**AWS Practice Examsのグループから**目的のものを選び、PSI / Piasonの受験リンクを押します。

![screenshot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286162/974eaedb-b59a-e8e7-97e9-72f019f8848c.png)

その後選んだほうのベンダーの手続きページに遷移するため、言われるまま言語や支払い情報（クレジットカード情報）を入力します。
住所入力欄がとてもアメリカ式で分かりづらいのですが、そこは適当に調べて入力します。

なおここで試験言語として日本語を選んだ場合でも、（少なくともPSIでは）試験中に英語の文章を出すことが可能でした。[^3][^4]

[^3]: 自分はピアソンで受験していないので知りませんが、おそらくできると思います。
[^4]: たまに問題文・選択肢の翻訳がちょっと微妙なところがあり、英語を読んだほうがわかりやすい場合がありました。

支払いが完了すると「試験に進むか？」となるので、OKすると試験画面になります。
試験自体は（操作的な意味で）特にわかりにくい部分は無くサクサク進めていきます。

UIとしてはWEBで4択アンケートをするよくあるフォームのようなイメージです。
縦に全問並んでるタイプではなく、1問ごとにページ遷移するタイプ。

なお問題文・回答は試験後に確認することはできないので注意しましょう。

## 結果確認
試験が完了すると、1~2分程度で結果がメールで送られてきます。結果部分だけ抜粋すると以下のようになります:

```
総合スコア: 80%

トピックレベルスコア:
1.0  Design Resilient Architectures: 88%
2.0  Define Performant Architectures: 57%
3.0  Specify Secure Applications and Architectures: 100%
4.0  Design Cost-Optimized Architectures: 50%
5.0  Define Operationally-Excellent Architectures: 100%
```

ちなみにどの問題がどのトピックかは推測する他無く、かなり目安的な情報になります。
パーセンテージの数値からそのトピックが何問あったかは推測できなくもないですが...

## まとめ
必要なアカウント登録はAWSアカウントがあればポチポチすればすぐ終わるし、申し込み・実施も手順さえ迷わなければサクッと完了します。

試験自体も最大30分しかなく（実際には時間余るので20分もかからなかった）結果も即時確認できるため、割と思い立ったらすぐできます。
試験費用2,000円+税が気にならないのであれば、寝る前に1時間あれば余裕でできてしまうので気になる方はやってみるといいと思います。
Angular　連動するコンボボックス


```javascript:app.component.ts
import { Component } from '@angular/core';

@Component({
  selector: "my-app",
  templateUrl: "./app.component.html"
})
export class AppComponent {
  selected = 'hamster';
  selectedid = "";
  data = [
    { label: '大型犬', value: 'bigdog', disabled: false , id: '01'},
    { label: '小型犬', value: 'smalldog', disabled: false , id: '01'},
    { label: 'ハムスター', value: 'hamster', disabled: false, id: '02'},
    { label: '金魚', value: 'fish', disabled: true , id: '03'},
    { label: '超大型犬', value: 'largedog', disabled: false , id: '01'}
  ];

  lines = { label: '', value: '', disabled: false , id: ''};

  show() {
    for (var keys in this.data) {
       if(this.selected === this.data[keys]["value"]){
        this.selectedid = this.data[keys]["id"];
        break;
      }
    }
    this.lines = {};
    this.datasp = [];

    for (var keys in this.data) {
      if(this.selectedid === this.data[keys]["id"]){
        this.lines.label = "ゴールデン - " + this.data[keys]["label"];
        this.lines.value = this.data[keys]["id"] + "-10";
        this.lines.disabled = false;
        this.datasp.push(this.lines);
        this.lines= {};
      }
    }
  }

  selectedsp;
  datasp;

  showsp() {
    // for (var keyssp in this.datasp) {
    //   console.log('keyssp:' + keyssp + ' value:' + this.datasp[keyssp]["label"]);
    // }
  }
}
```

```html:app.component.html
<form #myForm="ngForm">
    <select name="animal" [(ngModel)]="selected"  (change)="show()">
     
      <option value="">ペットを選択してください</option>
      <option *ngFor="let item of data"
        [value]="item.value" [disabled]="item.disabled"
        [selected]="item.value === selected">{{item.label}}</option>
    </select>
    <br>
    <br>
    <br>
    <select name="spieces" [(ngModel)]="selectedsp"  (change)="showsp()">

      <!--リストボックスの生成-->  
        <option value="">種類を選択してください</option>
        <option *ngFor="let item of datasp"
          [value]="item.value" [disabled]="item.disabled"
          [selected]="item.value === selected">{{item.label}}</option>
      </select>

  </form>
```

画面表示
最初のコンボを選択すると選択された行のidが一致するもののみで
次のコンボも作成している。

最初のコンボにひもづくJSONへ連動するコンボの情報も持っておけば
連動した動作が可能と考えている。
みんな大好きOpenNI2でAzure Kinectを動かしてみる

3D Sensor Advent Calendar 2019の4日目の記事です。

この記事ではOpenNI2でAzure Kinectを動かすためのOpenNI2 Driverを作ったので紹介します。

OpenNI2とは
-----------
OpenNI2とはKinectなどの3Dセンサーを利用するためのオープンソースのソフトウェア開発キットです。
OpenNI2はKinect v1のセンサーを作っていたPrimeSenseなどが中心となり開発していましたが、PrimeSenseがAppleに買収され現在は開発がストップしています。しかしながら、クロスプラットフォームで動作して様々な3Dセンサーで使用できることから今なお広く利用されています。

![OpenNI_Logo4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34834/b65dc792-4383-c7e2-9025-53529a85bd61.png)

OpenNI2 Driverとは
------------------
OpenNI2はDriverと呼ばれる規定の入力処理をセンサーごとに実装することで、デフォルトではサポートしていないセンサーであってもOpenNI2で扱うことができます。最近ではIntel RealSenseやASUS Xtion 2、Orbbec Astraのような最新のデバイスでもOpenNI2 Driverが提供されています。

OpenNI2 Driver for Azure Kinect
-------------------------------
OpenNI2でAzure Kinectを扱うためのOpenNI2 Driverを実装しました。
以下のリポジトリからダウンロードして利用することができます。
ライセンスはMIT Licenseなので商用・非商用を問わず自由に利用できます。

* **UnaNancyOwen/K4ADriver | GitHub**  
  https://github.com/UnaNancyOwen/K4ADriver

How to use K4ADriver?
---------------------
1. 以下のファイルをOpenNI2のインストールディレクトリの<code>Redist/OpenNI2/Drivers</code>、および<code>Tools/OpenNI2/Dirvers</code>にコピーする。
    * **k4adriver.dll** ... OpenNI2 Driver for Azure Kinect

2. 以下のファイルをパスの通っている場所にコピーする。（Azure Kinect Sensor SDKにパスが通っていれば不要？） 
    * **k4a.dll** ... Azure Kinect SDK Runtime
    * **depthengine_2_0.dll** ... Depth Engine for Azure Kinect SDK

3. NiViewerを起動して動作を確認する。Azure Kinectから取得したデータが表示さます。
   ![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34834/f698feb2-fe52-2c22-22b0-676d154e90e2.jpeg)

OpenNI2 Sample
--------------
このOpenNI2 Driverは以下のサンプルプログラムで動作することが確認されています。

* **UnaNancyOwen/OpenNI2Sample | GitHub**  
  https://github.com/UnaNancyOwen/OpenNI2Sample

Need Help
---------
まだすべての機能を完全に実装できていません。いくつかの課題があります。
もし実装できたらプルリクエストを送っていただけると嬉しいです。（上から優先順）

* **ImageRegistrationMode**
  ColorとDepthの位置を合わせるImageRegistrationModeの実装が不完全です。
  現状では、Streamを作成する前にImageRegistrationModeを設定しなければ正しく動作しません。
  本来、このモードはいつでも切り替えることができないといけません。<sup>*1</sup>

* **Video Mode (Resolution, FPS, Pixel Format)**
  ColorやDepthなどの解像度、フレームレート、フォーマットの設定ができません。
  現状では、これらの設定は固定になっています。

* **Multi Device**
  現状では、このOpenNI2 Driverで複数のデバイスをサポートすることができていません。

* **NiTE2 Support**
  これはおまけですが、NiTE2をサポートすることができていません。
  RealSenseのOpenNI2 Driverではサポートできているため、実装できないわけではなさそうです。
  しかし、NiTE2はクローズドソースのため不明な点が多く難しいです。

まとめ
-----
OpenNI2でAzure Kinectを動かすためのOpeNI2 Driverを実装して公開しました。
新規開発に利用するには勧めませんが、様々な過去の資産を動かす用途には適していると思います。

明日12/5(木)は…誰が書くか決まってません(´・ω・｀)

---
<sup>*1 そのため、PCLの[OpenNI2Grabber](http://docs.pointclouds.org/trunk/namespacepcl_1_1io_1_1openni2.html)はImageRegistrationModeが正しく動作しない。</sup>
【1日目】一人でRDBMSを実装 -まえがき-

# まえがき
ふと思い立ち、1人でRDBMSを実装することにしました。RDBMS(Relational DataBase Management System)、つまりOracleとかPostgreSQLとかそういったのを1人で作ってみましょうという企画です。
やりたいことは2つ
1. 誰でもRDBMSを実装できるように、実装部分を細かく説明すること
2. マイRDBMSに何か特別な機能を盛り込むこと

### 誰でもRDBMSを実装できるように
みなさんは「OS自作入門」、「CPUの創りかた」など、難しそうでとっつきにくいものを簡単な機能に分解し、しかも自分で作れるようにしてくれるとても親切な本を読んだことがありますか。しかし残念なことに、RDBMSの作り方を教えてくれる本はなさそうです。無いものは作りましょう。
ここでは、PostgreSQLのソースをひとつひとつ見せながら、ここはこういうことをしている、、、という解説をするつもりはありません。
0からRDBMSと言えるものを作り上げる、その道筋を見せたいのです。初めは小さいシステムを作り、少しずつ拡張していく、そしたらそれっぽいものができあがった。それが理想です。

### マイRDBMSに何か特別な機能を盛り込むこと
せっかくRDBMSを自作するならなにか特別な機能を盛り込みたいですね。ここはまだ決定したわけでは無いですが、クエリ実行を途中で停止、途中から再開できる機能。もしくは、トランザクションのタイムアウトを設定できる機能など。実装できるかはわかりませんが、そんな機能を作ってみようと思っています。

## 実装したいRDBMSの機能
さて、私が作るRDBMSに実装しようと思っている機能のイメージです。フル機能のRDBではなく、RDBと言えるギリギリのところまでとことん機能を削ぎ落とそうと思っています。初めの実装段階では投入できるデータは整数のみ、など。

* 単純なSQLクエリ
  * INSERT
  * SELECT
  * UPDATE
  * DELETE
  * CREATE TABLE
  * TRUNCATE TABLE
  * DROP TABLE
* テーブルの結合操作
  * LEFT JOIN
  * INNER JOIN
* トランザクション
  * ACID特性
  * 障害耐性
* テーブルのビュー
* ユーザーの概念
* 認証・認可

## Erlang
何を思ったか、Erlangで実装しようと思っています。今まで一回も触ったことありません。RDBを実装できて、Erlangも書けるようになったら一石二鳥だなと思ったのです。。Erlangの書き方がわからない時は誰か助けてください笑
こう書いた方がいいよーなど、随時ご指摘ください。お願いします。
連載の中ではErlangの文法などについてはあまり触れない方針ですが、意味不明すぎるところは解説するかもです。

### まとめ
「正直、RDBMS実装するなんてそんな大変じゃないんじゃね」っていう気分で始めてます。途中で頓挫する可能性もありますし、バグだらけのゴミプログラムになるかもしれません。それでも、小さいプログラムから少しずつ機能を付け足していけばそれっぽいものができると思っています。こうした取り組みは自分や誰かのRDBの理解にも繋がるし、NoSQLなど新しい世界への理解も広がる気がしています。
しばしの間、お付き合いください！
LoLチャンピオン言えるかな？を作った結果

[シンデレラガールズ言えるかな？](http://marsa746079.github.io/ierukana/)に触発されリーグオブレジェンドのチャンピオン(9.23)言えるかな？を作成してみた

LoLチャンピオン言えるかな？
https://masajiro999.github.io/ierukana/

jsonデータが全然違うので少し戸惑ったけど配列か連想配列かの違いくらい

Macで作成、環境を紹介

Githubデスクトップ（gitコマンドなんて知らねーよ奴向け）
https://desktop.github.com

Atom（github製で揃えたい）
https://atom.io

最新ヴァージョンチェックURL
https://ddragon.leagueoflegends.com/realms/na.json

そうそうチャンピオンのjsonはダウンロードしてアップロードするんだぞ
https://riot-api-libraries.readthedocs.io/en/latest/ddragon.html

バージョンアップの都度ここからゲットしてくるぞい

```
$ curl -L -O http://ddragon.leagueoflegends.com/cdn/9.23.1/data/ja_JP/champion.json
```

そうそう、あと画像データとかはドラゴンテイル（バージョン指定）にあっぞ
https://ddragon.leagueoflegends.com/cdn/dragontail-10.1.1.tgz.


以上

あとで気づいたけどAtomにGithub機能備わってるからAtomのみでもいけるぞい

#合わせて読みたい

[lolのチャンピオンデータやアートがあるデータドラゴンをまとめた]
(http://firstbloodstats.com/archives/1070)

[RIOT　APIで無料チャンプ表示とゲーム情報取得など]
https://qiita.com/caim/items/e5449f4728325ccdc93a
自分用

####練習用にHTMLでプロフィール作成

<html>

<head>
  <meta charset="UTF-8">

  <title>私のプロフィール</title>
</head>

<body>
<table>
<tr>
  <td><img src="index.jpeg" alt="my profile"></td>
  <td><h1>k.harada</h1>
<p><em>広島県在住<strong>プログラミング初学者</strong>.</em></p></td>
</tr>
</table>
  <hr>
  
<h3>Udemy 購入コンテンツ</h3>
  <nl>
    <li><a href="https://www.udemy.com/course/the-complete-web-development-bootcamp/learn/lecture/12287446?start=345#content">The Complete 2020 Web Development Bootcamp</a></li>
    
<li><a href="https://www.udemy.com/course/html-css-js/learn/lecture/8262956#content">[HTML/CSS/JavaScript] フロントエンドエンジニアになりたい人の Webプログラミング入門</a></li>
  </nl>
  <hr>
<h3>私の趣味</h3>
  <ol>
    <li>ゴルフ</li>
    <li>野球</li>
    <li>programming</li>
  </ol>
<hr>
<h3>私のskill</h3>
  <table cellspacing="10">
    <tr>
      <td>HTML</td>
      <td>⭐️</td>
      <td>CSS</td>
      <td>⭐️</td>
      </td>
    </tr>
    <tr>
      <td>JavaScript</td>
      <td>⭐️</td>
      <td>PHP</td>
      <td>⭐️</td>
      </td>
    </tr>
  </table>
  <hr>
  <a href="連絡用.html">連絡はこちらから</a>
</body>

</html>
CentOS8でロケールをja_JP.utf8にできない

# 環境
- CentOS Linux release 8.0.1905 (Core)

# 現象
入れたてのCentOS8でlocalectl set-locale LANG=ja_JP.utf8したらdnfするたびにLANG=Cがどうのとエラーがでる。

# 原因
localeにja_JP.utf8がない。

```bash:shell
localectl list-locales
 C.utf8
 en_AG
 en_AU
 en_AU.utf8
 ...
```

# 対策
localeにja_JP.utf8を追加する。

```bash:shell
 localedef -i /usr/share/i18n/locales/ja_JP -f UTF-8 /usr/lib/locale/ja_JP.UTF-8
 localectl set-locale LANG=ja_JP.utf8
```
【Rails】Rails側で定義した変数をJavaScriptに簡単に渡せるgem 「gon」を使ってみた

## はじめに
Railsアプリケーションを作成中、JavaScriptにRails側で定義した変数を渡したくなり、調べたところ`gon`というかなり使い勝手のいいgemがあったので導入してみました。

## この記事が役に立つ方
- Rails側で定義した変数をJavaScript側でも使いたい方

## この記事のメリット
- `gon`を使ってRailsで定義した変数をJavascriptに渡せるようになる

## 環境
- macOS Catalina 10.15.1
- zsh: 5.7.1
- Ruby: 2.6.5
- Rails: 5.2.3
- Docker: 19.03.5
- docker-compose: 1.24.1
- gon: 6.3.2

## gem`gon`とは？
シンプルにRailsアプリ内でJavaScriptに変数を渡すことが出来るgemです。
RSpecにも変数を渡せたりと、便利。


![スクリーンショット 2019-12-01 22.05.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/c35ad22d-d8ae-7893-7421-753054df3556.png)
[GitHub - gazay/gon: Your Rails variables in your JS](https://github.com/gazay/gon)

> If you need to send some data to your js files and you don't want to do this with long way through views and parsing - use this force!

（ざっくり）JavaScriptに何かデータを送る必要があるなら、**面倒くさいビューとかパースとかやめて**これを使っちゃいなよ！
と紹介されています。

## インストール

```ruby:Gemfile
gem 'gon'
```
↓

```zsh
bundle install
```

## 使用方法
[Usage example · gazay/gon Wiki · GitHub](https://github.com/gazay/gon/wiki/Usage-example)

### 1. Viewで読み込み
```erb:app/views/layouts/application.html.erb
<head>
  <title>some title</title>
  <%= include_gon %>
  <!-- include your action js code -->
```

`title`タグの下で、`javascript_include_tag`よりは上。

※公式Wikiであった、以下方法ではうまくいきませんでした。

```erb:app/views/layouts/application.html.erb
<head>
  <title>some title</title>
  <%= Gon::Base.render_data %> 
  <!-- include your action js code -->
```

---
### 2. Controllerで使っている変数をgonにセット。

```ruby:any_controller.rb
@your_int = 123
@your_array = [1,2]
@your_hash = {'a' => 1, 'b' => 2}

# 上記の変数をJavaScriptで呼び出したいなら
# 以下のように頭に`gon`をつけて変数定義する
gon.your_int = @your_int
gon.your_array = @your_array
gon.your_hash = @your_hash

# `gon`をつけた後に別の変数定義に活用することも可能。
gon.your_other_int = 345 + gon.your_int

# `gon`をつけたもの同士で配列に追加も可能。
gon.your_array << gon.your_int
gon.your_array # > [1, 2, 123]

# `all_variables`で`gon`をつけた全ての変数がハッシュで取り出せる
gon.all_variables # > {:your_int => 123, :your_other_int => 468, :your_array => [1, 2, 123], :your_hash => {'a' => 1, 'b' => 2}}

# `clear`で全変数をクリアできる
gon.clear # gon.all_variables now is {}
```

`gon`をつけるだけでいいのでシンプルですね。

---
### 3. JavaScriptで呼び出し

```javascript:any.js
alert(gon.your_int)
alert(gon.your_other_int)
alert(gon.your_array)
alert(gon.your_hash)
```
先程コントローラー側で定義したものがそのまま使えます。
※`aleat`はテキトーです。

当然ですが、例えば`current_user`を渡していた場合は、

```javascript:current_user.js
alert(gon.current_user.name)
alert(gon.current_user.email)
alert(gon.current_user.id)
```
のようにすると名前やメールアドレスなど、欲しいキーを指定すれば値が取り出せます。

非常に分かりやすくて便利です。

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

他にも`input`タグ経由で変数を渡したり、JSONを使ったりして変数を渡している記事を見つけましたが、`gon`の方がシンプルに変数を渡せるので楽ですね:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
- [GitHub - gazay/gon: Your Rails variables in your JS](https://github.com/gazay/gon)
- [RailsC3.js × gonでチャートを表示する - Qiita](https://qiita.com/akkie/items/cbcdf44b19b7db067694)
- [gonを使ったRailsとJavascriptの連携について - Qiita](https://qiita.com/s_nakamura/items/5d153f7d9db1b1190296)
gulpのタスクを分割する

`gulpfile.js`にすべてのタスクを書くこともできますが、タスク毎にファイルを分割することもできます。
## ディレクトリ構成
```
root/
  ├ gulpfile.js/
  │  ├ tasks/
  │  │  ├ task_a.js
  │  │  └ task_b.js
  │  └ index.js
  ├ node_modules
  └ package.json
```
## タスクを書く
```js:index.js
const { series } = require('gulp')
const { taskA } = require('./tasks/task_a')
const { taskB } = require('./tasks/task_b')

exports.default = series(taskA, taskB)
```
```js:task_a.js
const taskA = done => {
  console.log('taskA')
  done()
}

exports.taskA = taskA
```
```js:task_b.js
const taskB = done => {
  console.log('taskB')
  done()
}

exports.taskB = taskB
```
`npm run gulp`のコマンドでdefaultタスクを実行できるように`package.json`にスクリプトを登録しておきます。

```json:package.json
{
  ...
  "scripts": {
    "gulp": "gulp"
  }
  ...
}
```

## 実行
```
$ npm run gulp
```
```
[22:30:58] Starting 'default'...
[22:30:58] Starting 'taskA'...
taskA
[22:30:58] Finished 'taskA' after 32 ms
[22:30:58] Starting 'taskB'...
taskB
[22:30:58] Finished 'taskB' after 34 ms
[22:30:58] Finished 'default' after 88 ms
```
このように出力されれば成功です。
[暫定版]富士通FARQ30WRJ/WBJ (Arrows Tab QH30/W)にPeppermint 10を入れてみた

#初めに
これは完全に個人的なメモですが、「特定機種向け情報」として公開します。
Peppermint 10はUbuntu 18.04系の派生ディストリビューションで、インストールそのものは一般的なディストリビューションと大差ない筈・・・いくつかの問題点を除けば。
なおこの問題はFedora30 LXDEでも発生していました。

#問題点
(32bit UEFI なマシンに amd64向けUbuntuをUSBメモリから起動してインストールする方法は沢山出回ってるので割愛)
- とりあえず画面が左に90度回転してて、タッチパッドの向きと画面表示の向きとが合ってない
    - とりあえず画面表示の向きはxrandr, もしくはarandrで修正できます。
    - xrandr, arandr で修正したらタッチパッドの向きは合ったけど、今度はタッチスクリーンが何かおかしい
        - 別途 xinput で修正しなければならない

#画面表示の向きとタッチスクリーンの向き、それからタッチパッドの向きを整理する
![FARQ30WRJ_X11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204095/8db96f94-52d1-bfea-8142-e4a64f070dd9.png)

#解決策
とりあえず、[rotate_screen.sh](https://gist.github.com/mildmojo/48e9025070a2ba40795c)の[FARQ30WRJ向け修正版](https://gist.github.com/sambar-fgfs/a34c3dd993f2c8b50ec5af0de979377d)を$PATHが通った場所に置いて、ログイン時に自動実行するように設定し、画面向きとタッチスクリーンのタッチ位置を合わせた。

#推測される原因
おそらくハードウェア側がこういう仕様になってる。UEFIの設定画面ですら画面向きとキーボードの上下左右キーの向きが合ってない。
なのでWayland + libinputでも発生すると思う。
本来ならxorg.confで修正すべき事なので、タイトルには[暫定版]と入れている。


#最後に
ぶっちゃけ画面の自動回転って要らないよね？と思うので、他環境を使用する時の為に、自動回転の止め方を書いておく。
>$ sudo systemctl stop iio-sensor-proxy.service
>$ sudo systemctl disable iio-sensor-proxy.service
Tang nanoのJTAGを調査

#Tang nanoを入手したぞ
Tang nanoを手に入れたので、JTAGを調査します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/8d5e36e9-9bea-736f-0377-85f5567b07ff.png)

#JTAGの端子
基板の裏側にTCK、TDI、TMS、TDOと書かれた端子があるので、ここにピンヘッダをはんだ付けし、フライリードケーブルを接続します。

JTAGの電源は何Vかわかりませんが、5Vではないと思われるので、Vbank0/3と書かれたところから電源を取ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/0e217d12-de1f-3977-ea86-8283deb9680a.png)

#SVFプレイヤーによる推測
[MITOUJTAG](http://www.tokudenkairo.co.jp/jtag/)で普通に自動認識させてみても見つからないので、SVFプレイヤーを使ってTDOから何か出てくるかを調査しました。

```
TRST OFF;
ENDIR IDLE;
ENDDR IDLE;
STATE RESET IDLE;
TIR 0 ;
HIR 0 ;
TDR 0 ;
HDR 0 ;
SIR 32 TDI (55555555) TDO (F5FFFFFF) ;
```
結果

```
2019/12/01 22:28:18  Error:Line 9 Operation error.TDO(expected) ='F5FFFFFF' TDO(mask)='FFFFFFFF' TDO(captured)='FFFFFFFF'
```
つまり、TDIから入った信号がTDOから出てこない。

#基板の改造
おそらくオンボードのUSB-JTAGとぶつかっているのだろうと思い、回路図を見ながらRY1を外す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/08afd1b6-2732-e02f-0094-7fae16489655.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/ce8e7daa-d2df-9472-bb58-abe167db8fb5.png)

これで再びSVFプレイヤーを実行してみると、

```
2019/12/01 22:30:36  Error:Line 9 Operation error.TDO(expected) ='F5FFFFFF' TDO(mask)='FFFFFFFF' TDO(captured)='55555519'
```
TDOから何か出てきた。

SVFでIRに送るコードを適当に変えて

```
SIR 32 TDI (ffff0fff) TDO (F5FFFFFF) ;
```
にしてみると、結果は

```
2019/12/01 22:47:53  Error:Line 9 Operation error.TDO(expected) ='F5FFFFFF' TDO(mask)='FFFFFFFF' TDO(captured)='FF0FFF19'
```
19という値はStatus Registerの規格に合致している。IRの長さは8bitと推測される。

#MITOUJTAGでの自動認識　再び
再び[MITOUJTAG](http://www.tokudenkairo.co.jp/jtag/)に戻って、GUIから自動認識させてみると、genericデバイスとして認識された。IDCODEは0900281Bであるようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/b6e3cc37-3f2f-9184-6060-4abdd4faca45.png)

BSDLファイルがあれば、バウンダリスキャンできるでしょう。

#わかったこと
- 基板上のTCK、TDI、TMS、TDOの端子はJTAGの端子として使える
- オンボードのUSB-JTAGと信号がぶつかるので、外部JTAGを使う場合はYR1を外す
- IR長は8。IDCODEは0900281BのJTAGデバイスとして正しく認識される
vimのインサートモードをemacsぽく使う

# はじめに
Vimが好きなのですが、mac標準の入力やブラウザの入力でEmacsコマンドが使えるということに気づき、最近はそちらを使うようにしています。
Vimのインサートモードでは、コマンドを使っていないので、Emacsライクに使おうかなーと思って設定してみました。

# 設定したVimrc

```vim:~/.vimrc
" use insert mode like emacs
inoremap <C-d> <Del>
inoremap <C-h> <BS>
inoremap <C-a> <home>
inoremap <C-e> <End>
inoremap <C-p> <Up>
inoremap <C-n> <Down>
inoremap <C-f> <right>
inoremap <C-b> <left>
```

# できること
インサートモードでは基本的に移動しませんが、Emacsライクに移動・BackSpace・Deleteできるようになりました。
emacs使いではないため、最低限ですが、[こちら](https://qiita.com/ysuzuki19/items/f2ea65b73ed5e3090fa0)に記載したコマンドの一部が使用できます。

|操作|コマンド|
|---|---|
|上移動|C-p|
|下移動|C-n|
|左移動|C-b|
|右移動|C-f|
|左削除|C-h|
|右削除|C-d|
|行頭移動|C-a|
|行末移動|C-e|

# おわりに
<C-p>と<C-n>を設定してしまうと、補完機能を潰してしまうことにご注意ください。
【Unity】Shaderで画像の移動・回転・拡縮(アフィン変換)

この記事は「ちゅらっぷす Advent Calendar 2019」の1日目です。
https://qiita.com/advent-calendar/2019/churapps

### 環境
- Unity2018.3.6

### やること
- アフィン変換の行列を使ってShaderで画像を移動・回転・拡縮できるようにする

Unityでエフェクトとか作っているとShaderだけで画像を動かしたくなる場面が結構あったので、これをアフィン変換というなんか凄い変換で解決する

### アフィン変換の行列
アフィン変換で移動・回転・拡縮するための行列はそれぞれ以下の通り

##### 移動

```math
\begin{bmatrix}
x \\
y \\
1
\end{bmatrix}
=
\begin{bmatrix}
x' \\
y' \\
1
\end{bmatrix}
\times
\begin{bmatrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
PosX & PosY & 1
\end{bmatrix}
```

##### 回転
```math
\begin{bmatrix}
x \\
y \\
1
\end{bmatrix}
=
\begin{bmatrix}
x' \\
y' \\
1
\end{bmatrix}
\times
\begin{bmatrix}
cos\theta & sin\theta & 0 \\
-sin\theta & cos\theta & 0 \\
0 & 0 & 1
\end{bmatrix}
```

##### 拡縮
```math
\begin{bmatrix}
x \\
y \\
1
\end{bmatrix}
=
\begin{bmatrix}
x' \\
y' \\
1
\end{bmatrix}
\times
\begin{bmatrix}
1/ScaleX & 0 & 0 \\
0 & 1/ScaleY & 0 \\
0 & 0 & 1
\end{bmatrix}
```

これをShader内で書くと以下のようになる

```glsl
// 移動
float3x3 posisionMatrix = {
  1, 0, 0,
  0, 1, 0,
  _PosX, _PosY, 1
};

// 回転
float3x3 rotateMatrix = {
  cos (_Rotate), sin (_Rotate), 0,
  -sin (_Rotate), cos (_Rotate), 0,
  0, 0, 1
};

// 拡縮
float3x3 scaleMatrix = {
  1/_ScaleX, 0, 0,
  0, 1/_ScaleY, 0,
  0, 0, 1
};

// UVに乗算
float3 mulUV = mul (uv, positionMatrix);
mulUV = mul (uv, rotateMatrix)
mulUV = mul (uv, scaleMatrix);

uv = mulUV;
```

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156809/80ee8a4f-9287-459c-9ef5-dfd95297bfd9.gif)

画像の左下が中心になっているので、ピボットの計算も加える

```glsl
fixed3 pivot = fixed3 (0.5, 0.5, 0.0);

// UVに乗算
float3 mulUV = mul (uv, positionMatrix) - pivot;
mulUV = mul (uv, rotateMatrix)
mulUV = mul (uv, scaleMatrix);

uv = mulUV + pivot;
```

![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156809/87fab5f9-0fd6-cd53-1570-1a071f5a69a8.gif)

### いろいろ加工してみる

#### 移動量に応じてアルファ値を変えてみる
```glsl
color.a = color.a * (1 - saturate (abs (_PosX)));
```

![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156809/c22bd296-1b87-8689-aa03-5364c074d3cf.gif)


#### ピボットからの距離によって回転量を変えてみる

```glsl
_Rotate = _Rotate * ((sqrt(2) * 0.5) - pow (distance (pivot, uv), 8))
```

![4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156809/77e84074-7ac5-6afc-4bd8-3706aed63603.gif)


#### てきとうに拡縮

```glsl
_ScaleY = _ScaleY + (1 - _ScaleY) * (sin (i.uv.x * 180) * 0.5 + 0.5) * _ScaleY;
```

![5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156809/978b4525-593a-cb54-df60-787596008a0e.gif)
conda コマンドの使い方メモ

conda コマンドの使い方のメモです。

# 1. 仮想環境を作成

仮想環境を新規に作成する。

```
conda create -n <仮想環境名> python=x.x.x <パッケージ名>
```

仮想環境をコピーして作成する。

```
conda create -n <コピー先仮想環境名> --clone <コピー元仮想環境名>
```

# 2. パッケージのインストール

パッケージをインストールする。

```
conda install <パッケージ名>
```

仮想環境を指定してパッケージをインストールする。

```
conda install -n <仮想環境名> <パッケージ名>
```

バージョンを指定してパッケージをインストールする。

```
conda install <パッケージ名>==x.x.x
```

チャンネルを指定してパッケージをインストールする。

```
conda install -c <チャンネル> <パッケージ名>
```

# 3. パッケージの更新

パッケージを最新のバージョンにアップデートする。

```
conda update <パッケージ名>
```

すべてのパッケージを最新のバージョンに更新する。

```
conda update --all
```


指定された仮想環境のパッケージを最新のバージョンにアップデートする。

```
conda update -n <仮想環境名> <パッケージ名>
```

condaコマンドを最新のバージョンに更新する。

```
conda update conda
```

# 4. パッケージの削除

パッケージを削除する。

```
conda remove <パッケージ名>
```

指定された仮想環境のパッケージを削除する。

```
conda remove -n <仮想環境名> <パッケージ名>
```

指定された仮想環境を削除する。

```
conda remove -n <仮想環境名> --all
```

# 5. 仮想環境の有効化・無効化

仮想環境を有効化する。

```
conda activate <仮想環境名>
```

仮想環境を無効化する。

```
conda deactivate
```

# 6. パッケージの検索

パッケージを検索する。

```
conda search <検索文字列>
```

# 7. 一覧表示

パッケージ一覧を表示する。

```
conda list
```

指定された仮想環境のパッケージ一覧を表示する。

```
conda list -n <仮想環境名>
```

仮想環境の一覧を表示する。

```
conda info -e
```

# 参考
>  [Command reference](https://docs.conda.io/projects/conda/en/latest/commands.html "Command reference")
【React】はじめてReact触ってみた！~create-react-app編~

## 概要
JavaScriptを勉強しているときにReactなるものの存在を耳にした。同期にもReactを使って活躍している人もいるので、この機会に少しお勉強したいということでその備忘録。
Twitterで「Reactおちえて」って呟いたら、同期でProgateよりもSEOの高いReactの記事書いている子がいたので、その子の記事を参考にしました。この場を借りてお礼申し上げます。
その子のサイトはこちら→[どらごんテック](https://dragon-taro.com/)

## Reactとは
Facebookが作ったJavaScriptのビュー・ライブラリのこと。
SPA(Single Page Application)への変化とともに需要が高まっている。
ReactがjQueryという麻薬から我々を解放してくれる、そんなお話。([抜粋](https://www.slideshare.net/hoto17296/dom-49068642?ref=https://uxmilk.jp/43555))
堅苦しい定義は、優秀な先人の方々に任せたいなって...

[これからReactを勉強する人が最初に見るべきスライド７選](https://uxmilk.jp/43555)
[出来る限り短く説明するReact.js入門](https://qiita.com/rgbkids/items/8ec309d1bf5e203d2b19)
[今から始めるReact入門 〜 React の基本](https://qiita.com/TsutomuNakamura/items/72d8cf9f07a5a30be048)

## 開発環境
Windows 10
npm(ver6.9.0)

## とりあえず動かしてみる
優秀な同期の一人の[@atsuo1023](https://github.com/atsuo1203)に、Reactはとりあえず
`create-react-app <プロジェクト名>`
しとけば、難しい環境構築なしにできると聞いたのでやってみました。
まずは、`create-react-app`のコマンドが打てるように、npm(Node Package Manager)を使って
`npm install -g create-react-app`
をして早速`create-react-app test`でGO!!!
![create-react-app-error.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453529/59924488-943e-2afb-4eb5-0a8b22319110.jpeg)
・・・嘘やん...

`create-react-app test`打つだけでいいって言うたやん。こんなんあんまりや...なんでコマンド動かないん？
...私気になりますっ！

色々調べて、試してみました。
・同じディレクトリ下に以前友達が`create-react-app`で作ったフォルダがあったので、ディレクトリを変更 → 意味なし
・`npm -v`でローカルにもnpmがあるか確認 → 6.9.0 あった
・`create-react-app --version`で確認 → 3.2.0 あった
・`npm update -g npm`でバージョン確認 → 反応なし(最新？)

結果...
`npm cache clean --force`で直った！！
キャッシュをクリアするってことらしい！！よかった～！([参考記事](https://github.com/facebook/create-react-app/issues/7261))
![create-react-app-success.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453529/dd790f64-72ab-07d0-c50b-aa6c97df2581.jpeg)

ベースとなるプロジェクトが作成できたので、ディレクトリを移動(`cd <プロジェクト名>`)して`npm start`をたたきます！
すると、
![execution_cm.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453529/bd9d962e-2474-0838-3c2c-283a69ab0d46.jpeg)
となり、自動でブラウザが開きます。
![execution-result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453529/29425049-8bc4-8a03-92fa-8954c91407dd.jpeg)

時間はかかりましたがなんとかReactなるものを動かすことができました！
次回以降、Clickの動作を加えたり、いろいろ試してアウトプットしていきます！！

## 補足(npmをインストールしていない方へ)
[しっかり版](https://qiita.com/maitake9116/items/7825d90c09f3e2f87dea)
[簡易版](https://qiita.com/kumapeta/items/0069536644b626b61ecc)
npmはNode.jsに付随するものっぽいので、必要なのはNode.jsのインストールかと！
入ってるかわからないときは、とりあえずコマンドプロンプトで
`node --version` or `npm --version`をたたいてみましょう！

## 参考リンク
・[新しい React アプリを作る](https://ja.reactjs.org/docs/create-a-new-react-app.html)
・[Create React Appで環境構築 – React入門](https://www.to-r.net/media/react-tutorial12/)
・[create-react-appを使ってReactコンポーネントの素振り、GitHub Pagesへのデプロイまで](https://blog.wadackel.me/2016/create-react-app/)
・[Github issue](https://github.com/facebook/create-react-app/issues/7261)
・[知っていると捗るcreate-react-appの設定](https://qiita.com/geek_duck/items/6f99a3da15dd39658fff)

## おわりに
環境構築ってとても難しい気がしていて、そこで挫折しかけることなんてざらにあると思います。
今回扱った`create-react-app`は環境構築がほとんどいらないので、とりあえず触ってみたい初学者にとっては最高のものだと思います！
是非皆さんも試してみてください！
また、この記事で間違っているところがありましたら、教えていただけると大変助かります！
最後まで見ていただきありがとうございました。
VS codeのvim extensionにおけるWaiting for second key of chordについて

# 問題
vscodeのvim extensionを導入した際、インサートモードにもかかわらず、"["を押すとコマンドにWaiting for second key of chordというメッセージが出て,"["が出力されないという致命的な挙動が起きた。

# 対処法
単にkeyboardshortcutの項目から、extension.vimを検索。
"["が割り当てられたcommandをDefaultに切り替えればうまくいった。(なぜかSourceの欄がUserになっていた.)  

コミュニティで調べても、同様の問題はよく起きてるようで、原因はよくわかっていない模様。
時間があったら調べたい。
golangにおける継承

# 導入

golangのオブジェクト指向言語ぽい機能を調べてみました。

# エイリアス

```go
type myInt int
```

こういうやつですね。これはもともとの型のエイリアスです。
元の型とは別の型ですが、以下のように相互に変換することができます。

```go
var i int = 1
var j myInt = myInt(i)
var k int = int(j)
```
エイリアス化すれば、自由に機能（メソッド）を追加することができます。
JavaなどではBuilt-in(java.lang類)型は継承も機能追加もできないのと比較すると、Goらしい自由さを感じるところです。

```go
var myInt int
func (i myInt) String() string {
   return fmt.Sprintf("myInt --- %d", i)
}
```
この機能、enumでよく使われますね。

```go
type MyType int
const (
   A MyType = iota
   B MyType
   C MyType
)
```

ちなみに、superが欲しければ、

```go
func (i MyType) String() string {
   j := OrigType(i)
   return "MyType" + j.String()
}
```
のような感じで取得できます。少し面倒ですが。

# 埋め込み型


```go
type MyInt struct {
   int
}
```

MyIntはintを要素に持ちながら、intの機能を持ちます。
エイリアスとの違いとしては、

* 多重継承できる
* superにアクセスするのが簡単
* 継承元以外の要素を含める

といったところかと思います。
多重継承によってメソッドが衝突した場合、衝突を解消しない限りコンパイルエラーになります。

```go
type A struct {}
type B struct {}
func (*A) Hoge() string { return "A" }
func (*B) Hoge() string { return "B" }
// CはAとBを継承（埋め込み）
type C struct {
   A
   B
}
func (c *C) Hoge() string { return c.A.Hoge() + c.B.Hoge() }
```
例えばこんな風に衝突を解消することができるでしょう。
こんなコードが推奨されるか？というと疑問ですが。

# どう使うか

個人的には以下の順序で考えます。

1. structの要素か？（内部ロジックで使うのみなら）
2. エイリアスか？（単純な型のコピーもしくは拡張であれば）
3. 埋め込み型？（型を拡張しつつかつ、superや他の要素が必要な場合）

まずはhas_aでいいのではないかと考えます。
型の拡張の場合はまずエイリアスを検討します。
埋め込み型は上記を超える要件の場合のみとしたい所です。

aliasはわりとカジュアルに使えると思っていますが、埋め込み型はオブジェクト指向での継承の是非の議論と同じように使用に慎重であるべきかと思います。
さくらインターネットのvps カスタムOSでCentOS8を入れる際、パッケージを選ぶと失敗する

# 環境
- さくらインターネット
- さくらのVPS
- カスタムOS CentOS 8 x86_64

# 現象
Software SelectionでMinimal Installを選択すると、エラーでうまくインストールできない。

#原因
わからず。
エラーにはchrony関連のエラーをはいていた。

# 対策
Minimal Installを選ばない。
パッケージを選ばずにInstallation Destinationだけ指定して進める。
数列の４項間漸化式を解く

# はじめに
高校数学では数列の漸化式を変形して解く方法を学習します。質問も多いところですよね。



#３項間漸化式

３項間漸化式の漸化式については教科書では『発展』『応用』などとして取り上げられています。

今回は結果だけですが，

$$a_{n+2}-(\alpha+\beta)a_{n+1}+\alpha\beta a_n=0$$

の形の漸化式を解くと，

$\alpha\neq\beta$のときは
$$a_n=p \alpha^{n-1}+q \beta^{n-1}\quad(p,\,q は定数)$$

$\alpha=\beta$のときは
$$a_n=(pn+q) \alpha^{n-1}\quad(p,\,q は定数)$$

という形になります。

#４項間漸化式

$$a_{n+3}-(\alpha+\beta+\gamma)a_{n+2}+(\alpha\beta+\beta\gamma+\gamma\alpha) a_{n+1}-\alpha\beta\gamma a_n=0$$

の漸化式は

1. $\alpha$，$\beta$，$\gamma$が全て異なれば，
$$a_n=p \alpha^{n-1}+q \beta^{n-1}+r\gamma^{n-1}\quad(p,\,q,\,r は定数)$$

2. $\alpha=\beta=\gamma$であれば，
$$a_n=(pn^2+qn+r) \alpha^{n-1}\quad(p,\,q,\,r は定数)$$

3. $\alpha=\beta\neq\gamma$であれば，
$$a_n=(pn+q)\alpha^{n-1}+r \gamma^{n-1}\quad(p,\,q,\,r は定数)$$

という形で表すことができます。

## 漸化式の変形

漸化式をどう変形するかが分かれば，求めることができます。

$a_{n+3}-(\beta+\gamma)a_{n+2}+\beta\gamma a_{n+1}=\alpha\left(a_{n+2}-(\beta+\gamma)a_{n+1}-\beta\gamma a_n\right)$

$a_{n+3}-(\gamma+\alpha)a_{n+2}+\gamma\alpha a_{n+1}=\beta\left(a_{n+2}-(\gamma+\alpha)a_{n+1}-\gamma\alpha a_n\right)$

$a_{n+3}-(\alpha+\beta)a_{n+2}+\alpha\beta a_{n+1}=\gamma\left(a_{n+2}-(\alpha+\beta)a_{n+1}-\alpha\beta a_n\right)$

## k項間の漸化式

ここまで来れば，いろんな漸化式の形が予想できます。

例えば，特性方程式が6次方程式で，その解が

$x=\alpha（3重解）,\beta（2重解），\gamma（単解）$

とすると，

$a_n=(an^2+bn+c)\alpha^{n-1}+(dn+e)\beta^{n-1}+f\gamma^{n-1}$

と考えられる！
SwiftUIの.lineLimit()が効かない場合はfixedSize()

２行以上にわたって表示させたいテキストがあったのですが、省略されてしまったので、改めてLineLimitを指定しました。

しかし、`.lineLimit(nil)` でも `.lineLimit(100)` でも効果がありませんでした。

```swift
Text(exchangeItem.name)
    .lineLimit(nil)
    .fixedSize(horizontal: false, vertical: true)
```

結論としては、上記のように`.fixedSize(horizontal:vertical:)`
を使用すれば良いみたいです。

今回は縦方向にテキストを行が増えるようにテキストを表示させたかったのでverticalをtrueにすると期待通り改行されて、省略されることなく表示されました😊

参考
https://stackoverflow.com/questions/56482955/adding-unlimited-lines-in-a-text-swiftui
Haskellのカインドについて調べてみた

# はじめに
この記事ではHaskellのカインドについて、説明させていただきます。
(カインドについて理解に苦しんだので共有させて頂きます。)

# カインドとは
カインドとは「型の型」のようなものです。
値が何らかの型に属するように、型は何らかのカインドに属します。
例えば、 "Hello"という値はString型に属しますが、String型は `*`というカインドに属します。

カインドは型を組み合わせる際のルールを規定することができます。例えば、Maybe型はInt型と組み合わせて `Maybe Int`という型を生成することができますが、`Maybe Maybe`のような型は作成できません。

# カインドの例
## 型引数を取らないカインド
GHCiでさまざまな型のカインドを調べると `*`と表示されます。String型やBool型、Int型はすべて `*`というカインドになっています。 `*`という表記は、型引数をとらない型コンストラクタを表しています。

```haskell
Prelude> :k String
String :: *
Prelude> :k Bool
Bool :: *
Prelude> :k Int
Int :: *
```

一方で、型引数を取らない型に対して無理やり型引数を与えてあると、エラーが発生します。

```haskell
Prelude> :k String String
<interactive>:1:1: error:
    • Expected kind ‘* -> k0’, but ‘String’ has kind ‘*’
    • In the type ‘String String’
```

カインドで規定されていない型同士を組み合わせるとエラーとして検知できるということですね！

## 型引数をとるカインド
次に型引数をとる型のカインドを調べてみましょう。

```haskell
Prelude> :k Maybe
Maybe :: * -> *
Prelude> :k []
[] :: * -> *
Prelude> :k IO
IO :: * -> *
```

StringやBoolなどの型と異なり、 `* -> *`と表示されています。この `* -> *`という表記は型引数を１つとる型コンストラクタのカインドを表しています。

ここで、Maybe型に様々な型引数を渡してみましょう。

```haskell
Prelude> :k Maybe String
Maybe String :: *
Prelude> :k Maybe Bool
Maybe Bool :: *
Prelude> :k Maybe IO

<interactive>:1:7: error:
    • Expecting one more argument to ‘IO’
      Expected a type, but ‘IO’ has kind ‘* -> *’
    • In the first argument of ‘Maybe’, namely ‘IO’
      In the type ‘Maybe IO’
```

`Maybe String`と `Maybe Bool`は、`*`というカインドであり、もうこれ以上型引数を取らないことがわかります。
一方で、 `Maybe IO`に関しては、 `Expecting one more argument to ‘IO’`というエラーメッセージが出ており、IO型にもう１つ型引数を渡す旨が伝えられています。

Maybe型は型引数を一つとるようなカインドであるのに対して、IO型も型引数を１つとるようなカインドです。ですので、 `Maybe IO`は型引数が間違ったものであり、`Maybe IO`には、カインドが `*`の型を渡す必要があるということです。以下は、`Maybe IO`に String型を加えた結果です。

```haskell
Prelude> :k Maybe (IO String)
Maybe (IO String) :: *
```

型引数が正常に適用されて、その結果、Maybe(IO String)という型が生成されたことが確認できます。

# まとめ
カインドは、型を組み合わせる際のルールを規定するもので、Haskellなどの言語では不正な型の組み合わせをコンパイルエラーとして検知できます。静的型付け言語の場合、コンパイル時に静的に、型引数の整合性をチェックできるという利点があります。

# 終わりに
乱文失礼しました！カインドについて理解が不十分な状態で無理やり記事を書いたため、全体的に日本語がフワフワしてて、読みづらかったと思います。
もし記事に関する内容でご指摘等あればお願いします。
閲覧ありがとうございました！！