OmniAICreator/Qiita-1.07M huggingface dataset:
ServiceNowでスクリプト書いてイベント発生させたい

自分用メモ、理解足りなすぎるので随時修正予定

## イベントとは
ServiceNow上で何か起きたよ！ということをお知らせしてくれる。
例えば、特定の条件に合致するレコードができたよ！とか。
ログイン失敗もログイン失敗するごとにlogin.failedのイベントが生み出されている。
イベントが発生したことをきっかけとしてメール通知を作成したりなんかもできてしまう。

ざっくり流れ↓
①	イベントレジストリに任意のイベントを登録（既存のものを使う場合は新規作成不要）
②	スクリプト内でイベントを生み出してあげる（発生させる）
③	生み出されたイベントを受け取る処理を作る。（例えばNotificationの設定）
④	イベントが生み出されるごとにメール通知なりをServiceNowから出せる！

①	②だけ書く。

## ①	イベントレジストリに任意のイベントを登録

１．ServiceManagementのフィルターナビゲーターにて「sysevent_register_list.do」と入力してEnterクリック
（開きたいテーブル名＋_list.doでEnter押すと一発で開きたいリストが開けちゃう、開きたいテーブル名＋.listでもOK）
２．「イベント登録」リストが表示されたら「新規」を押す
アプリケーションピッカーでイベントを発生させたいアプリケーションを選択してから「イベント登録」リストの「新規」ボタンからレコードを登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2256239/2f690f17-de2e-eb6d-663b-c373013bf7f8.png)
イベント名：スペースや特殊文字は使わないこと。わかりやすいのにする。
イベント名のみ必須なのでイベント名だけ入力でもOKだけど、説明くらいは書いたほうが自分のためになります。（トラブルシューティング的な意味で）（戒め）
日本語化プラグインをいれた状態の画像で、「解雇者」ってなんだよという感じがするけど、英語だと「Fired by」となっていて、「こういうスクリプト実行時～」とか「俺！俺！」みたいなことを書けばいいと思います別にイベント処理に影響ないので。
キューのところにはこのイベントを管理するイベント処理キューを入力するらしいけど、空白のままでもOK、そしたらデフォルトのキューが何とかしてくれる。

## ②	スクリプト内でイベントを生み出してあげる
スクリプトのざっくりした書き方は[前回記事](https://qiita.com/kii_rpa/items/660e420bbf803a1b9b51)参照
もりもり書いたスクリプト内に下記スクリプトを足してあげる
```JavaScript
gs.eventQueue(‘<イベント名>’,current,parm1,parm2);
```

parm？油？と思っていましたがパラメーターのことでした（パーム油はpalm）
イベント発生させるきっかけとなったユーザーとユーザーIDをイベント発生時に取得したいときは、
```JavaScript
gs.eventQueue(‘<イベント名>’,current, gs.getUserName(),gs.getUserID());
```
Flutterのassetsの管理を幾分か楽にする

## 何
Android Studioを利用してFlutterアプリを開発する場合に、assetsフォルダの定義を、pubspec.yamlに
手動反映するのがメンドイ、さらに定数クラス的なものを作ってconstにするのがメンドイ。という場合がある。
それを若干楽にする方法を記載する。

## やり方
1. pubspec.yamlのflutter:タグにassets:タグだけ書いておく
1. Android Studioプラグインの「FlutterAssetsGenerator」と「FlutterAssetSync」をインストールする。
1. assetsフォルダになんらかのファイルをぶちこむ
1. ツールメニューから「FlutterAssetSync」を実行すると、pubspec.yamlのassets:タグの中が書き換わってブチこんだファイルパスが書き込まれる。
1. Alt + Gを押下する。(FlutterAssetsGeneratorの機能)
1. /libにgeneratedフォルダが生成され、assets.dartが生成されている。

## 課題
自分の意図しないフォルダに配置されるので、Assets_generatorを利用するか、flutter_gen_runnerの設定をオーバーライドするようなリソースを作成したほうがよい？
SpringBootでHerokuからアドオン使わずにGmail送信する

# Heroku に公開してるサービスにメール送信機能を実装したい。
## 前回、ローカルで動作確認に成功済
とりま、ローカルで実装しよう。。。
ということで、 Spring Mail と、 FakeSMTP を使って前回ローカル環境で動作させることができました。
↓前回の記事

https://qiita.com/tamuten310/items/07ab89ac1f2a5f0758e2

## Heroku で動作させたいけど…どうすれば…？
で、もともと Heroku に公開してるサービスなので、 Heroku でどのように動作させよう？？

「Heroku gmail送信」とかで調べると、 SendGrid とか、アドオン使った実装の情報ばかり。。。
一応やってみたけど、アドオンが一瞬で凍結されたり、セキュリティが厳しそう。。。
それに、 SendGrid の API を使うために、専用のメール送信の書き方をしなければならない。

う～ん、前回 JavaMail で書いたソースをそのまま使いたいんだよね。。。

## ローカルで Gmail 送信
application.propertiesを以下のように書き換えればローカルでGmail送信できます。
アプリパスワードの部分だけ、Gmail側で設定が必要です。たくさんネットに記事があるのでググれば大丈夫です。
```application.properties
spring.mail.host=smtp.gmail.com
spring.mail.port=587

　# 以下2つは、各々の設定に書き換える
spring.mail.username=***hogehoge***@gmail.com
spring.mail.password=******Gmailのアプリパスワード*****

spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.ssl.trust=smtp.gmail.com
```

## でも、これを GitHub にコミットできない…

Herokuで使うにはGitHubにコミットしなければなりません。
でも、Gmailのアプリパスワードが書かれた application.properties をコミットするわけにはいかない。。。
（ちなみに、コミットするとGitHubから警告が来ます。ありがたいですね。。。苦笑）

## そういえば、前に AWS にデプロイしたときに .properties じゃなくて、.bash_profile にDBとかの設定書いたな…

このサービスを以前AWSにデプロイしたのですが、ローカルでビルドしたJarをサーバーにコピーしたので、DBの接続設定は.bash_profileに書きました。
その経験で、何となくの感覚で、SpringBootがapplication.propertiesだけじゃなくて、OSの環境変数を読み込むことは知っていました。

## まてよ、application.propertiesに設定する値をHerokuのサーバーの環境変数に設定すればいいんじゃね？
ビンゴでした。
プロジェクトルートから
```
heroku config:set 環境変数名=設定値
```
で設定します。
もしくは、Herokuのダッシュボードからの設定でもOK。

以下のように、「.」を「_」に変えて、大文字にします。
```
heroku config:set SPRING_MAIL_HOST=smtp.gmail.com
heroku config:set SPRING_MAIL_PORT=587
heroku config:set SPRING_MAIL_USERNAME=***hogehoge***@gmail.com
heroku config:set SPRING_MAIL_PASSWORD=******Gmailのアプリパスワード*****
heroku config:set SPRING_MAIL_PROPERTIES_MAIL_SMTP_AUTH=true
heroku config:set SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_ENABLE=true
heroku config:set SPRING_MAIL_PROPERTIES_MAIL_SMTP_SSL_TRUST=smtp.gmail.com
```
## SpringBootが環境設定を読み込むルール
SpringBootが環境設定を読み込むルールがあるようです。

参考：

https://spring.pleiades.io/spring-boot/docs/2.1.1.RELEASE/reference/html/boot-features-external-config.html


# まとめ

## application.propertiesに書く内容をHerokuの環境変数に設定すればOK！
これを、、、
```application.properties
spring.mail.host=smtp.gmail.com
spring.mail.port=587

　# 以下2つは、各々の設定に書き換える
spring.mail.username=***hogehoge***@gmail.com
spring.mail.password=******Gmailのアプリパスワード*****

spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.ssl.trust=smtp.gmail.com
```
こうする！
```
heroku config:set SPRING_MAIL_HOST=smtp.gmail.com
heroku config:set SPRING_MAIL_PORT=587
heroku config:set SPRING_MAIL_USERNAME=***hogehoge***@gmail.com
heroku config:set SPRING_MAIL_PASSWORD=******Gmailのアプリパスワード*****
heroku config:set SPRING_MAIL_PROPERTIES_MAIL_SMTP_AUTH=true
heroku config:set SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_ENABLE=true
heroku config:set SPRING_MAIL_PROPERTIES_MAIL_SMTP_SSL_TRUST=smtp.gmail.com
```

## 感想

環境変数って何だろう？「パスが通っている」とはどういうこと？
application.properties に設定する値ってどういう意味があるんだろう？
今回の経験で、さらに知識を深めたくなりました。
いつかまとめたいと思います。
【Vue3】Vue3-carouselで迅速にそれっぽいUIを作る

![スクリーンショット 2022-05-15 22.32.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/c1c5d8a1-4064-100a-fa4a-0613e7ad76bc.png)


Vue3にはVue3-carouselとうコンポーネントがあります。
これを使えば誰でも手軽にそれっぽいカルーセルを作ることができます。

## インストール
```npm
npm install vue3-carousel
```

テンプレート
```vuejs
<template>
  <carousel :items-to-show="1.5">
    <slide v-for="slide in 10" :key="slide">
      {{ slide }}
    </slide>

    <template #addons>
      <navigation />
      <pagination />
    </template>
  </carousel>
</template>

<script>
// If you are using PurgeCSS, make sure to whitelist the carousel CSS classes
import 'vue3-carousel/dist/carousel.css';
import { Carousel, Slide, Pagination, Navigation } from 'vue3-carousel';

export default {
  name: 'App',
  components: {
    Carousel,
    Slide,
    Pagination,
    Navigation,
  },
};
</script>
```

## 様々なカルーセル
### Wrap Around
![スクリーンショット 2022-05-15 22.34.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/d198b874-a39a-7796-93ba-737e39f80434.png)


### Breakpoints
![スクリーンショット 2022-05-15 22.34.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/8973fb24-0ee6-309c-b4c5-3c820c8e512e.png)

### HiddenArrows
![スクリーンショット 2022-05-15 22.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/d44a31ea-dde2-f278-f6b5-3c14ec1fdfee.png)

### Active Classes
![スクリーンショット 2022-05-15 22.35.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/49a3a9bc-625f-a82a-315a-77a5cf0db2e6.png)

##参考
https://ismail9k.github.io/vue3-carousel/
ディスク容量アラート発生時使用コマンド

サーバのディスク使用量がしきい値を超えるとアラートが来るようになっている。
アラートが発生したときに使用するコマンドのメモ。

## dfコマンドで概要確認
環境はサンプル。
```bash
$ df -h --total
Filesystem      Size  Used Avail Use% Mounted on
udev            448M     0  448M   0% /dev
tmpfs            99M  760K   98M   1% /run
/dev/vda3        46G   37G  6.8G  85% /
tmpfs           491M     0  491M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           491M     0  491M   0% /sys/fs/cgroup
tmpfs            99M     0   99M   0% /run/user/1001
tmpfs            99M     0   99M   0% /run/user/1000
total            47G   37G  8.5G  81% -
```

## duコマンドで問題となっているディレクトリを特定
- sortで大きい順に表示。
- max-depthやheadの値は適宜調整。
- 実際には特定のディレクトリにアクセスできない旨のエラーメッセージも表示されましたが省略しています。
```bash
$ du --max-depth=3 -h | sort -hr | head -n 10
36G     .
29G     ./var
21G     ./var/spool/test
21G     ./var/spool
4.4G    ./var/log
4.2G    ./var/lib
4.1G    ./var/log/journal
3.8G    ./usr
3.5G    ./var/lib/docker
3.1G    ./home/testuser
```

## 原因になっているディレクトリの内容を確認
```bash
$ cd /var/spool/test/
$ ls -lh
total 21G
-rw-r--r-- 1 root root 20G May 15 22:09 dummy
```

## (参考)容量が大きいファイルを作成したコマンド
```bash
dd if=/dev/zero of=dummy bs=1M count=20480
```
ブラウザlocalStorageの簡易バックアップ



# バックアップ
開発者ツールのコンソールで実行。
```js
copy(JSON.stringify(localStorage))
```
クリップボードにJSONテキストがコピーされる。
これを適当な場所に保管しておく。

# 復元
JSONテキストを、貼り付け箇所に上書きして、コードを実行。
必要なら事前に`localStorage.clear()`をする。
```js
Object.assign(localStorage, JSON.parse('ココに貼り付け'))
```
# localStorage

![パズルチャンネル - ライトアップ(美術館) 問題集 - 5サイズ 2022-05-15 22-30-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204406/60937d97-da81-4fd2-aab1-fe9b9ddf0506.png)


# 自分用の雑記
* ブラウザのパズルゲームのデータが頻繁に消える
* cookie系を無闇に削除したのが原因。
* 触らぬ神に祟り無し。納得。
    * ん？ "触らぬ"て、"触る"の完了形？打ち消し？
    * 触った神に祟り無し→ありがたい仏像に触ると、祟が来ないよ（新訳）
* 開発者ツールで確認すると、cookieじゃなくlocalStorageだった。
* 右クリックから保存とか出来そう・・・。無理だった。
* なのでやってみた。
* スプレッドシートとかに送れば履歴とか楽そう。
* 試しに画像を載せてみた。
Githubアカウントを登録する

# はじめに

自分が作ったロボットとかお試しプロジェクトGitに公開しておこうかな…
と思ったのですが、アカウントを持っていなかったのでアカウント作成方法からメモに残します。

※こちらは投稿時点（2022.05)での情報になります※

## 以下リンクにアクセスする

https://github.com/

## 「Githubに登録する」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/69b6777f-3e3f-564e-f64f-a51af8060c90.png)

## User名、登録するアドレス、パスワードを決める

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/741444f4-9024-6146-d850-2ef9b9f1199c.png)

## ロボットでない証明後、CreateAccountが有効化するのでクリック

私はこの手の質問が苦手です（２敗）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/74911135-5624-cbd3-6bab-68b8c87ef43c.png)

クリック後に、登録に使用したメールアドレス宛に認証番号が送られてくるので、入力画面に認証番号を入力し、アカウント作成完了です。

# おわりに
アカウント作成。もっといろいろと煩雑化と思っていたのですが、
意外とあっさりアカウント作れてびっくりしました。
使い方についてはこれから勉強して改めてまとめたいと思っています。
PixiJSでSVGのサイズ変更が上手く出来なかった

# はじめに
[PixiJS](https://pixijs.com/)でSVGファイルのscaleを変更しようとすると、見切れてしまった。

# コード
```js
const svgr = new PIXI.SVGResource(svg, { scale: 2 })
const svg_tex = PIXI.Texture.from(svgr)
const tex = new PIXI.Texture(new PIXI.BaseTexture(svg_tex))
const spr = new PIXI.Sprite(tex)
stage.addChild(spr)
```

# 結果
scale: 1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234613/68817e54-ea38-ed0f-1f24-e93899f2798a.png)
scale:2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234613/f901fa63-f912-1dc1-71a0-60b7404605f5.png)
わぁ！切れてる！

# 理由
SVGファイルにwidthとheightが設定されていなかったから。

# 感想
issuesにもあった
https://github.com/pixijs/pixijs/issues/7686

下の記事にもwidthとheightをつけろって書いてある
https://qiita.com/manabuyasuda/items/01a76204f97cd73ffc4e

でもなんで見切れるぐらい大きくなるんだ???
ローカルからDocker内に入るコマンド

Dockerでの開発環境が終わり、Railsの基本であるモデルやコントローラー、ビューを作成するコマンドを入力しようとしたが、ターミナルで

homesというコントローラ作成のコマンドを入力すると
```言語:ターミナル
rails g controller homes
```

このようなエラーが出た。
Rails is not currently installed on this system. To get the latest version, simply type:
sudo gem install rails
You can then rerun your "rails" command.

ローカルでこのコマンドしてもダメだと気づき、ドッカー内に入らないといけないと認識した。

そこで調べたところ、下記サイトに行きついた。
https://qiita.com/Keitaroooo/items/a30bf4eb9310d7b3f7cd

このサイトにある通りに進めた。

ドッカー内に入る方法は２つ

一つ目は
# dockerコマンド

```言語:ターミナル
docker container exec -it コンテナ名 bash
```

コンテナ名を調べるコマンド↓
```言語:ターミナル
docker-compose ps
```



二つ目は
# docker-composeコマンド
```言語:ターミナル
docker-compose exec サービス名 bash
```
docker-compose.ymlで入力したサービス名


一つ目の方法を使った結果
```言語:ターミナル
root@7fw5c38d46af:/myapp# 
```
このようなものがターミナル上にでた。
Pythonで大数の法則と中心極限定理を実装する

# 目次
- はじめに
- 大数の法則の実装
- 中心極限定理の実装
- 終わりに
- 参考文献・記事

# はじめに
（※2022/5/22：内容を修正しました）
以前Qiitaに投稿した記事[「Rで大数の法則と中心極限定理の違いを直感的に理解する」](https://qiita.com/ch-nd/items/7dd89ec4fb4a229d06fc)では、大数の法則と中心極限定理の違いを初学者にもわかりやすく直感的に理解することを目指した記事でした。実装はRで行いました。
本記事では、Pythonで大数の法則と中心極限定理を実装してみます。
実行環境については、Google Colaboratory上で実装と実行を行いました。

# 大数の法則の実装
```Python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import random

def loln (num1):
  dice = [random.randint(1, 6) for p in range(0, num1)]
  result = []
  for i in range(1, 7):
    result.append(dice.count(i))
  return result

#figure()でグラフを表示する領域をつくり，figというオブジェクトにする．
fig = plt.figure(figsize=[10,7])

#add_subplot()でグラフを描画する領域を追加する．引数は行，列，場所
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
ax4 = fig.add_subplot(2, 2, 4)

#ラベルの設定
l1, l2, l3, l4 = 'n=10', 'n=100', '1000', 'n=10000'
labels = ['1', '2', '3', '4', '5', '6']
left = [1, 2, 3, 4, 5, 6]

#描画
ax1.bar(left, height = loln(10),  width=0.5, label=l1, alpha=0.5, ec='black')
ax2.bar(left, height = loln(100),  width=0.5, label=l2, alpha=0.5,  ec='black')
ax3.bar(left, height = loln(1000),  width=0.5, label=l3, alpha=0.5, ec='black')
ax4.bar(left, height = loln(10000),  width=0.5, label=l4, alpha=0.5,  ec='black')

#レイアウトの設定
ax1.legend(loc = 'upper right')
ax2.legend(loc = 'upper right')
ax3.legend(loc = 'upper right')
ax4.legend(loc = 'upper right')
fig.tight_layout
plt.show()
```
実装結果は以下のようになりました。
![low_of_learge_number.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2378829/b863eb5b-0a61-a157-07a4-b503b1b83c36.png)


# 中心極限定理の実装
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import random

def clt (num1, num2):
  result = []
  for i in range(0, num1):
    dice = [random.randint(1, 6) for p in range(0, num2)]
    total = sum(dice)
    result.append(total)
  return result

#figure()でグラフを表示する領域をつくり，figというオブジェクトにする．
fig = plt.figure(figsize=[10,7])

#add_subplot()でグラフを描画する領域を追加する．引数は行，列，場所
ax1 = fig.add_subplot(3, 1, 1)
ax2 = fig.add_subplot(3, 1, 2)
ax3 = fig.add_subplot(3, 1, 3)
#ax4 = fig.add_subplot(2, 2, 4)

#ラベルの設定
l1, l2, l3, l4 = 'n=2', 'n=5', 'n=10'

#ヒストグラムの描画
ax1.hist(clt(100000, 2), bins='auto', density=True, histtype='barstacked', ec='black', label=l1)
ax2.hist(clt(100000, 5), bins='auto', density=True, histtype='barstacked', ec='black', label=l2)
ax3.hist(clt(100000, 10), bins='auto', density=True, histtype='barstacked', ec='black', label=l3)

#レイアウトの設定
ax1.legend(loc = 'upper right')
ax2.legend(loc = 'upper right')
ax3.legend(loc = 'upper right')
fig.tight_layout
plt.show()
```
実装結果は以下のようになりました。
![CLT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2378829/250fd124-33bc-76ea-670e-ec5ea6cc173e.png)

# 終わりに
以上のように、大数の法則と中心極限定理について、Pythonでの実装を行ってみました。拙いコードであったかもしれませんが、最後までお読みいただきありがとうございました。
本記事が皆様の理解の一助になれば幸いです。

# 参考文献・記事

[1]「Pythonでリスト（配列）に要素を追加するappend, extend, insert」https://note.nkmk.me/python-list-append-extend-insert/
[2]「【matplotlib基礎】複数のグラフを並べて表示する」https://qiita.com/trami/items/bd54f22ee4449421f2bc
Mathematicaでとにかく画像として出力したいとき

Mathematicaでは作ったグラフの画像などは通常、右クリックで「画像として出力」の項目から保存できますが、`Overlay`や`Grid`などを使った出力など、右クリックしても「画像として出力」の項目が出てこない場合があります。

こういうときは`Rasterize`を使いましょう。画像化したい出力に`Rasterize`を作用させるだけでいいです。`out`が出力とすれば、`Rasterize@out`,`out//Rasterize`,`Rasterize[out]`などとしましょう。これで右クリックで画像として出力できるようになります。
AWSのLarave環境構築（Laraveアップロードの土台作りまで）

## Laravel開発環境構築
### VPC設定
* vpc作成
* パブリックサブネットとプライベートサブネットを作成

## EC2設定
* EC2インスタンス作成
* EC2へSSH接続　[接続方法はこちらの記事](https://qiita.com/H-Toshi/items/d81ee20603d0b0420934)
* ```sudo yum update -y```でyumを最新状態にする
* ```sudo yum -y install httpd```でアパッチをインストール
* ```sudo systemctl start httpd.service```でアパッチ起動
* ```sudo systemctl status httpd.service```で起動しているかの確認
* ```ps -axu```でも確認可能。この時は```/usr/sbin/httpd```が表示されているかも確認。
上記で確認すると大量に結果が表示される。
こういった時は絞り込みをする。
```ps - axu | grep <検索文字>```
例）```ps -axu | grep httpd```
* ```sudo systemctl enable httpd.service```これで、サーバーを起動した時に自動的にアパッチも起動する様に設定（これをしないと、サーバーが停止すると再度起動しても、アパッチは停止したままで、都度起動が必要な状態のままになる。
自動起動設定が機能したか確認するためには```sudo systemctl is-enabled httpd.service```を入力。これで```enabled```が表示されればOK


## ファイアーウォール設定
上記でアパッチをインストールしてもこれだけではwebページへアクセス出来ない。それはアパッチをインストールしただけでは通信がファイアーウォールによって遮断される為。
その為、現状はEC2の「パブリック IPv4 アドレス」を開いても一向に開かれず、読み込み画面がぐるぐるするだけ。
これを解除するために、EC2インスタンスの該当「セキュリティグループ」を確認する。
インバウンドのルールにタイプSSH、ポート範囲22などと記載されている場合、ssh接続以外では接続できない。その為、httpアクセスが出来る様に設定を変える。
インバウンドのルールにHTTPを追加し、ソースの部分は「Anywhere-IPv4」にすると接続可能に。
#### 手順
* EC2のセキュリティグループで作成したEC2インスタンスを選択し、インバウンドルールの編集を行う。
タイプ : HTTP, ソース : myAnywher-IPv4を選択する。
これで設定OK

### Elastic IPアドレスを固定する。
これを設定しないとインスタンスを停止するたびにアドレスが変わっていない。
**但し、ElasticIPアドレスを設定したインスタンスを停止すると課金される！
使っている間はインスタンスは起動しておき、インスタンスを停止する場合、ElasticIPアドレスは開放し、さらに関連付けの解除をする必要あり！！**


### RDSの設定
* RDS設定の前に推奨されているプライベートサブネットを2つ作成する。
既にVPCの設定で1つプライベートサブネットの作成をしているので、追加で1つ作成する。
* DB用のEC2のセキュリティグループを1つ作る
* RDSでサブネットグループを作成する
* RDSでパラメーターグループを作成する
* RDSでオプショングループを設定する。
* RDSデータベースを作成する。
* EC2にssh接続する。
* ```sudo yum -y install mysql```でmysqlをインストールする
* RDSを作成したらEC2のElasticIPアドレスを使用してssh接続をターミナルから行う。
*RDSのデータベースから作成したDBのエンドポイントを確認する。
ターミナルに戻ってmysql -h ＜エンドポイント＞ -u root -pを実行し、RDSを作成した際のパスワードを入力するとmysqlにログイン出来る。

-h : エンドポイントを指定している
-u : ログインするユーザーを指定している（rootはマスターユーザーの事RDS作成時に自分でここは設定している）
-p : これをする事でこの後にパスワード入力が求められる。これをしないと画面上にパスワードが表示される形でログインする事になる

### Laravel構築
上記までのAWS設定完了後、LaravelのソースをAWSへアップロードしていく。

[公式ドキュメント](https://laravel.com/)
[公式ドキュメント:日本語](https://readouble.com/laravel/)

### 詰まったところ
公式のコマンドでLaravelのプロジェクトが作成されない
> ```curl -s "https://laravel.build/example-app" | bash```
実行すると
```terminal
Unable to find image 'laravelsail/php81-composer:latest' locally
docker: Error response from daemon: Get https://registry-1.docker.io/v2/laravelsail/php81-composer/manifests/latest: unauthorized: incorrect username or password.
See 'docker run --help'.
bash: line 16: cd: example-app: No such file or directory
```
### 解決
上記はDockerにログインしていないというエラーだった
[Docker公式](https://www.docker.com/)
こちらからログインして、再度実行でOK
SSH接続と公開鍵認証について

## SSH接続

### 公開鍵認証とは
* ユーザー名とパスワードでの認証と比べセキュリティが高い
* 公開鍵暗号を用いて行う
秘密鍵と公開鍵を用いた暗号方式
公開鍵はサーバーが保有する。そして、秘密鍵を保有しているユーザーだけがログイン出来る。

### 仕組み
大きく3つの概念がある
* 公開鍵 : 誰でも取得できるもの
* 暗号文 : 公開鍵認証の際に認証に使用する暗号化されたデータ
* 秘密鍵 : 公開鍵認証時に認証に使用する暗号文を複合化出来るもの
1. 上記を使用し、認証（ログイン）したいユーザーは公開鍵にアクセスする。
2. 暗号文が送られるのでそれを秘密鍵で複合化する
これが公開鍵認証の流れである。

#### 手順
* EC2作成時に```.pem```ファイルを作成する。これが秘密鍵に該当する。
* この秘密鍵を使用して認証を行う。

```
// 秘密鍵の権限変更
chmod 600 ~/〇〇/himitsu_key.pem


// ssh接続
ssh -i /Users/yourname/〇〇/himitsu_key.pem ec2-user@EC2のパブリックIPv4アドレス
Splunk: Splunk入門(SPL編 6/6) - SPL結果の表示形式


###### 実施環境： Splunk Cloud 8.2.2104.1

### 0. 前置き

 SPL の実行結果は、以下の通りタブを選択することによりいくつかの形式で表示できます。
今回はその表示形式について紹介していきます。

![スクリーンショット 2022-02-27 22.23.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8001dab5-690a-b763-9e1c-dd29c2eaf824.png "タブ")

### 1. 検索結果

 stats 等で統計化していない単純な検索結果では、以下の2つの表示形式が使用できます。

* イベント : 元ログと各フィールドを表示する。個々のログの細かい内容を見たい場合に有用。

* パターン : 元ログのパターンを抽出して表示する。ログ全体の大まかな傾向を見たい場合に有用。

例として以下の SPL 文を使用します。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log"
```

###### 1.1. イベント

検索でヒットしたログの元ログとフィールドに関する情報を表示する形式です。
上側に時間別のログ件数が棒グラフで表示され、左下には抽出されたフィールド情報、右下には元ログとその出力時間が表示されます。
どのような項目が含まれているかといった、ログの細かい内容を知りたい場合に有用です。

![スクリーンショット 2022-02-27 22.21.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e0afa787-76bc-a5d0-d815-09d50dbd5c1a.png "イベント")

:::note info
求めるフィールドが見つからない場合は、検索モードを「スマートモード」や「詳細モード」にすると表示されることがあります。

![スクリーンショット 2022-03-20 22.02.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/d57ddb27-c1d0-90a3-0d55-253b4192c35d.png "検索モード")
:::

###### 1.2. パターン

元ログから似たパターンのログをまとめ、抽出したパターンを表示する形式です。
大量のログについて、出力内容の大まかな傾向を見るのに有用です。

![スクリーンショット 2022-02-27 22.22.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/2554d510-e556-111a-9bf9-22647b8942e0.png "パターン")

### 2. 集計結果

 stats 等で統計化した結果に対しては、以下の2つの表示形式が使用できます。

* 統計情報 : 表形式で表示する。細かい値が必要な場合に有用。

* 視覚エフェクト : グラフ形式で表示する。全体の傾向が必要な場合に有用。

例として以下の SPL 文を使用します。

```Splunk:Splunk
index="_internal" sourcetype="splunkd" source="*/splunkd.log"
| timechart count BY log_level
```

###### 2.1. 統計情報

集計結果を表形式で表示する形式です。
個々の項目について細かい値が見たい場合に有用です。

![スクリーンショット 2022-02-27 22.25.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/bdd3c0cb-d28f-0d18-c3c4-4e15f592b210.png "統計情報")

###### 2.2. 視覚エフェクト

集計結果をグラフ形式で表示する形式です。
集計結果全体の大まかな傾向が見たい場合に有用です。

![スクリーンショット 2022-02-27 22.26.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/3fceecbe-d8b2-de60-3ffe-58841fb1de4f.png "視覚エフェクト")

最後に紹介した視覚エフェクトですが、ここで使用できるグラフには様々な種類があります。
デフォルトで Splunk に入っているグラフもそこそこの個数がありますし、アドオンを追加すればさらにその種類は増えます。
次回以降はその Splunk において使用できるグラフのうち、デフォルトで使用できる代表的なものについて基本的な内容を紹介していこうと思います。

[戻る](https://qiita.com/frozencatpisces/items/fb8dcaf0094abe9e5bd3)
【AWS】DVA合格体験記 - 2022年5月15日

# AWS DVAについて
AWS認定デベロッパー アソシエイトはAWSの資格だと中レベルの資格になります。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512673/b92e754d-59fa-cea7-4e9f-099d5f64d2f2.png)

# 結果
2022年5月15日に受験し、無事「合格(784点)」でした。

# 勉強方法
[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)の有料会員になって
#01-#51を2周しました。
また、[ポケットスタディ AWS認定 デベロッパーアソシエイト](https://www.amazon.co.jp/gp/product/4798063401/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1)を購入して1周しました。
こちらは中の問題集は解かず、各サービスの概要から詳細までを確認。

# 総評
65問の選択問題が出ました。
もともと設計と運用しかしたことがないので、AWSのサーバレスアーキテクチャで
LambdaやAPI Gatewayを利用することはわかっても、中身をどう設定するのか、何を気を付けるのかといったところを理解するのに時間がかかりました……
合格体験記を見ると、DVAは簡単・難易度が低い等の意見が散見されますが、
開発をやっていない人間からすると難易度高めに感じました。

現状、SAA/SOA/DVA/SAPを取得している状態になったので、
次回はDevOpsかAdvanced Networkingに挑戦しようと思っています。
ワードプレスとは？htmlを習う初心者にはまずやるべき事か？

WordPress（ワードプレス）はPHPというプログラミング言語で作られているCMS（コンテンツマネジメントシステム）の一種。


ブログやWebサイトを作る事ができます。 

世界中で利用されているのがこのWordPressです。
私もワードプレスでサイト作成をしています。
興味ある人は以下参考に。
https://beer-beer.net/
https://kininarune-un.com/
https://taro-column.com/
https://nadesico-magazine.jp/
https://mame-labo.com/







日本でも人気が高いです。
うちわけでは2020年で利用されたCMSのうちWordPressが8割を占めるほどです。

これからもワードプレスメインの時代になると予測しています。

まだ、知らないって人はワードプレスをやることでhtmlをかじる事が出来て、さらにhtmlの知識を深められるのです。


つまり、html初心者ならワードプレスをやれって事です。
楽しみながらhtmlが分かるようになる可能性大。
JavaScript で table 要素を CSV ファイルに変換する

# やりたいこと

JavaScript で table 要素を CSV ファイルに変換したい。このとき、クライアント側のみで完結させたい。

# 方法

```js
// table 要素を 2 次元配列に変換する。
const convertTableToRows = (selector) => {
  const table = document.querySelector(selector);
  const rows = Array.from(table.querySelectorAll('tr')).map(tr => {
    const row = [];
    
    tr.querySelectorAll('th, td').forEach(td => {
      row.push(td.innerText);
      // colspan 属性が設定されている場合は空欄で埋める。
      // なお rowspan 属性は考慮できていない。
      if (td.colSpan && td.colSpan > 1) {
        row.push(...new Array(td.colSpan - 1).fill(''));
      }
    });

    return row;
  });

  return rows;
};

// 2 次元配列を CSV 文字列に変換する。
const convertRowsToCSV = rows => {
  return rows.map(row => row.map(value => `"${value}"`)).join("\n");
};

// CSV ファイルをダウンロードする。
const downloadCSV = (csv, filename) => {
  const csvFile = new Blob([csv], { type: 'text/csv' });

  // ダミーの a 要素を作成してクリックすることでファイルのダウンロードを実現する。
  const tempLink = document.createElement('a');
  tempLink.style.display = 'none';
  tempLink.download = filename;
  tempLink.href = URL.createObjectURL(csvFile);

  document.body.appendChild(tempLink);
  tempLink.click();
  document.body.removeChild(tempLink);
  
  return filename;
};

const rows = convertTableToRows('table');
const csv = convertRowsToCSV(rows);

downloadCSV(csv, 'order.csv');
```

# 例

Google Chrome を使用します。以下[^1]の赤枠の table 要素を CSV ファイルに変換します。

![www_mtgmintcard_com_account-history-info_order_id_537939.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6697/568f33ee-b816-1d6d-e9cc-c2488c754be9.png)

サイト上で Chrome の開発者ツールを開き、Console タブで前述の JavaScript コードを実行します。そうすると order.csv という CSV ファイルがダウンロードされます。

![スクリーンショット 2022-05-15 20.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6697/876906af-85c6-63cf-97c5-c18503b1b7d6.png)

# 参考

- MDN
  - [Blob - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Blob)
  - [URL.createObjectURL() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/URL/createObjectURL)
  - [\<a\>: アンカー要素 - HTML: HyperText Markup Language | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/a)

[^1]:(どうでもいいかもですが) [Magic: The Gathering](https://mtg-jp.com/) というトレーディングカードゲームのカードを、[MTG Mint Card](http://www.mtgmintcard.com/) という香港のショップで注文した際の注文履歴です。海外なのに爆速で届きます。スクリーンショットは数ヶ月前のものですが、まだ今ほど円安が進んでいませんでした……。
[Swift] 何気なく書いているviewDidLoad()について理解が深まったこと

## 概要
実務のペアプロの際に教えていただいた、viewのライフサイクルについて自分が理解できてなかったことについて、viewDidLoadに焦点を当てて記載しておきます

## viewDidLoad()内の構造について
ViewControllerにコードを書く際に何気なく書いているviewDidLoad()は、

```
override func viewDidLoad() {
    super.viewDidLoad()
    //ここにやりたい処理を書く
}
```
という形をしています
まず、
```
override func viewDidLoad()
```
の部分についてですが、overrideをつけて宣言することで、親クラスが持っているメソッドにアクセスを行なっています。
次に、

```
super.viewDidLoad()
```
ここで書かれているsuperとは、スーパークラス(親クラス)のことです
ということは、この部分は結局何をしているのかというと、
親クラスの中のviewDidLoad()を呼び出しているという意味になります
全体をまとめると、
overrideで親クラスのメソッドにアクセスしてから、
superでアクセスした親クラスのメソッドの呼び出しを行っています

## SOLID原則との関連性
さらに、このコードにはSOLID原則の中のリスコフの原則の考え方も適用されています
リスコフの原則とは、子クラスが親クラスの機能を引き継いで実現することができるというものです
継承とは、親クラスを基につくる。親クラスのプロパティやメソッドを引き継ぐと言った意味です
リスコフの置換原則を守るには、継承関係にあるクラスは振る舞いが変わらないようにする必要があります
親クラスが本来持っている振る舞いを変更してはいけないので、親クラスのメソッドであるviewDidload()にアクセスし、呼び出しを行なって、それに対して肉付けを行なっていると言ったイメージです
そうすることで、親クラス自体のメソッドを変更ぜずに、やりたい処理の実行を同じタイミングで実行できるようにしています。

## 補足
viewDidLoad()メソッドをはじめとするviewのライフサイクルメソッドは、
UIViewControllerを継承させている時点で持っていることになるので、特に同じタイミングでやりたいメソッドがない場合は書かなくても良いです
streamlitを用いて開発したアプリをデプロイするまでの手順

私が今勉強しているStreamlitで開発したアプリが簡単にデプロイすることができるようなのでここに記録としてやり方を残しておきます。

# 前準備
①作成したアプリのフォルダの中にrequirements.txtファイルを作成し、その中に使用している外部ライブラリを記入(streamlitなど)
※この際、外部ライブラリのバージョンを指定してあげる必要がある
例：`streamlit==1.3.5`
そのため、ターミナルで`pip freeze`と入力して使用している外部ライブラリのバージョンを確認する

②Githubでリポジトリを作成する
GithubのホームからNewボタンを押して新しいリポジトリを作成する

③ターミナルを開いて以下のコマンドを入力していく
```
git init //gitの初期化
git remote add origin Githubで作成したリポジトリのURL.git//リモートリポジトリとローカルを紐づける
git add .
git commit -m "first commmit"
git push origin master //アプリがGithubにプッシュされる
```

# アプリのデプロイ
①[streamlitのHP](https://streamlit.io/)を開く
②下にスクロールすると出てくる「Deploy instantly」のAll for free!をクリック→そのまま次のページで出てくるGet Startedボタンをクリック
![スクリーンショット (85).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532884/8339c7a1-9fd6-7eb4-84c5-bb113bc681ec.png)
③NewAppボタンをクリックして、
![スクリーンショット 2022-05-15 203927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532884/39bfb799-c86c-23e4-d88d-dbbad2a17ced.png)
Repository：Githubで作成したリポジトリ
Branch：Master
Main file path：アプリを実行するときに使うファイル名
これらを選択。

④デプロイボタンを押して終了！
HEIC画像をコマンドで一括JPEG変換

# 内容
iPhoneで撮影したHEIC形式の画像を、Windows環境でWebサービスやフリーソフトを極力使わずに、
コマンドラインで一括JPEG変換する方法です。

## 試した環境
Windows10
iPhopne11 Pro

# 手順
## 変換ツール
フリーソフトは極力使わないと書きましたが、流石に何かしらのエンコーダーは必要なので、
Microsoftが提供している"HEIF 画像拡張機能"を利用します。

◆HEIF 画像拡張機能
[https://apps.microsoft.com/store/detail/9PMMSR1CGPWG?hl=ja-jp](https://apps.microsoft.com/store/detail/9PMMSR1CGPWG?hl=ja-jp)

ストアアプリとして配布されています。
有料版もあるようですが、今回は無料版で事足ります。
これをインストールするだけで、HEIC画像のコンテキストメニューに
"JPEGに変換"という項目が追加されるので、1ファイルずつであれば変換可能です。


## コマンドラインでの変換
残念ながらコンテキストメニューからの変換は、複数ファイルの一括処理に対応していませんが
以下のコマンドでバッチ変換が可能です。

`rundll32.exe "C:\Program Files\CopyTrans HEIC for Windows\CopyTransHEICforWindows.dll", HeicToJPEG 【変換対象】`

```Powershell:C:\test\IMG_test.HEICの変換コマンド例
rundll32.exe "C:\Program Files\CopyTrans HEIC for Windows\CopyTransHEICforWindows.dll", HeicToJPEG "C:\test\IMG_test.HEIC"
```

変換後のファイルは、元ファイルと同じフォルダ/ファイル名(拡張子jpg)で作成されます。
Exifの情報も維持してくれるのが、ありがたいです。
【Solidity】Error: invalid argument 0: json: cannot unmarshal hex string without 0x~の対処法

こちらは、表題エラーに対する汎用的な対処法ではなく、
以下の状況にて発生したエラーに対する原因と対応です。

# 事象
https://book.ethereum-jp.net/first_use/contract
こちらの「Ethereum入門」に沿ってコントラクトコードを作成していた時に、
ソースコードをコンパイル後、
```
var myContract = contract.new({ from: eth.accounts[0], data: bin})
```
を実行した時に以下のエラーが発生。
```
Error: invalid argument 0: json: cannot unmarshal hex string without 0x prefix into Go struct field TransactionArgs.data of type hexutil.Bytes
	at web3.js:6365:37(47)
	at send (web3.js:5099:62(35))
	at web3.js:3021:48(124)
	at <eval>:1:30(13)
```

# 原因

コンパイル実行後に生成されるバイナリをvarで宣言する際にPrefixに0xをつける必要があった。

```
var bin = "608060405234801561001057600080fd5b50610 ~(省略)"
↓ 
var bin = "0x608060405234801561001057600080fd5b50610 ~(省略)"
```

簡単な話でした。無事コントラクトを作成することができました。
エラー `E: Unable to locate package docker-compose-plugin` の対処法


## 環境
- Windows 11 Home
- WSL2 (Debian)

## エラー
公式「Docker Engine インストール（Debian 向け）」の中にある **リポジトリのセットアップ** のsudo apt-get installコマンドのところで、なぜかエラーが出る。

```
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
~~ 省略 ~~
E: Unable to locate package docker-compose-plugin
```

> [(公式) Docker Engine インストール（Debian 向け）](https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/debian/#install-using-the-repository)


## 解決策
コマンドの最後の `-plugin` を消す

```
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose
```
Macでnpm install時にエラー`dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.64.dylib`

`npm install`時にエラー

```
$ npm install -g atcoder-cli
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.64.dylib
  Referenced from: /usr/local/bin/node
  Reason: image not found
Abort trap: 6
```

色々なサイトを見て、以下から`nodejs`の`macOS Installer`を取得して再インストールして解決。。（なぜか分かっていないけど上記エラーは出なくなった）

> https://qiita.com/taiponrock/items/9001ae194571feb63a5e
> 1.インストーラーのダウンロード
> 下記サイトからインストーラーをダウンロードします。
> http://nodejs.org/
Download-->Current-->macOS Installer

# 参考

https://hirooooo-lab.com/development/install-node/
https://qiita.com/taiponrock/items/9001ae194571feb63a5e
http://tatamo.81.la/blog/2018/12/07/atcoder-cli/
Requirements on Time Synchronization, No.906, AUTOSAR 21-11 (77) FO

Requirements on Time Synchronization, No.906,2021-11

https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_RS_TimeSync.pdf


AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 42文書読んだ。2022年5月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/648b32867635993410c8

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|CRC |Cyclic Redundancy Checksum
|OFS |Offset synchronization
|Pdelay| Propagation / path delay as given in IEEE 802.1AS
|Pdelay_Req| Propagation / path delay request message
|Pdelay_Resp |Propagation / path delay response message
|Pdelay_Resp_Follow_Up |Propagation / path delay Follow-Up message
|PDU| Protocol Data Unit
|Timesync |Time Synchronization
|Sync |Time synchronization message (Sync)
|TS |Time Syncronisation
|TSP |Time Synchronization Provider

## 英日
日本語は仮訳
|no.|count|word|日本語|
|:----|:----|:----|:----|
|1|729|time|時間|
|2|521|the|その|
|3|334|of|の|
|4|237|synchronization|同期|
|5|204|a|一つの|
|6|197|base|基づく|
|7|254|to|に|
|8|156|rs_ts_|rs_ts_|
|9|144|shall|しなければならない|
|10|121|and|と|
|11|120|sync|同期|
|12|92|is|です|
|13|92|rs_main_|rs_main_|
|14|88|implementation|実装|
|15|77|module|部品|
|16|77|over|以上|
|17|76|use|使用する|
|18|73|on|の上|
|19|71|for|にとって|
|20|71|in|中に|
|21|70|c|c|
|22|70|case|場合|
|23|69|description|説明|
|24|69|material|材料|
|25|67|supporting|対応|
|26|66|applies|適用する|
|27|66|d|d|
|28|66|dependencies|依存関係|
|29|66|rationale|理論的根拠|
|30|65|cp|classic platform(短縮名)|
|31|62|can|できる|
|32|61|autosar|autosar|
|33|60|protocol|規約|
|34|59|requirements|要件|
|35|56|local|局所|
|36|55|as|なので|
|37|54|offset|補正|
|38|53|document|文書|
|39|52|support|対応|
|40|47|value|値|
|41|46|correction|修正|
|42|46|master|主人|
|43|45|by|に|
|44|45|synchronized|同期|
|45|44|r|r|
|46|43|an|一つの|
|47|42|rate|比|
|48|40|ap|adaptive platform(短縮名)|
|49|40|autosar_rs_time|autosar_rs_time|
|50|40|fo|foundation(短縮名)|
|51|40|global|大局|
|52|40|id|identifier(短縮名)|
|53|39|or|また|
|54|36|which|どの|
|55|34|allow|許可する|
|56|34|ethernet|イーサネット|
|57|34|specific|明確|
|58|33|with|と|
|59|32|e|e|
|60|32|it|それ|
|61|31|bases|基地|
|62|31|be|です|
|63|31|provide|提供|
|64|30|data|与件|
|65|30|if|もし|
|66|30|information|情報|
|67|29|customers|顧客|
|68|28|this|これ|
|69|28|tsp|tsp|
|70|27|are|それは|
|71|27|clock|時計|
|72|27|slave|奴隷|
|73|25|modules|部品|
|74|24|flexray|flexray|
|75|23|definition|意味|
|76|22|communication|通信|
|77|22|domain|領域|
|78|22|measurement|計測|
|79|22|one|1|
|80|21|bus|乗合自動車|
|81|21|configuration|構成|
|82|21|different|違う|
|83|21|from|から|
|84|21|g|g|
|85|20|configured|構成済み|
|86|20|user|利用者|
|87|19|its|これは|
|88|18|not|いいえ|
|89|17|transmission|転送|
|90|16|hardware|ハードウェア|
|91|15|allows|許す|
|92|15|counter|計数器|
|93|15|customer|顧客|
|94|14|access|接続|
|95|14|message|伝言|
|96|14|that|それ|
|97|14|via|経由|
|98|13|gateway|玄関|
|99|13|given|所与の|
|100|13|other|他の|
|101|13|reception|受信|
|102|13|role|役割|
|103|13|sequence|順序|
|104|13|status|状態|
# 参考(reference)
[1] Standardization Template, AUTOSAR_TPS_StandardizationTemplate
[2] Glossary, AUTOSAR_TR_Glossary
[3] Main Requirements, AUTOSAR_RS_Main
【Tailwind CSS】basis-1/2が反映されない場合の対処方法

# はじめに
プログラミング学習中の[@kat_log](https://twitter.com/kat__log "Twitter")と申します。

Tailwind CSSにて、`basis-1/2`等、`flex`が反映されない問題に直面したのですが、解決したため共有です。

![image.png](https://soco-st.com/wp-content/themes/socost/upload/11813_color.svg)

# 結論
それぞれの子要素を`div`で囲むと解決しました。

# 具体的なコード

## 変更前

```erb
<div class="flex justify-center">
    <%= image_tag "man.png", class: "basis-1/2" %>
    <%= image_tag "woman.png", class: "basis-1/2" %>
</div>
```

![Screen Shot 2022-05-15 at 19.00.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/094f6587-dde5-0482-d5cf-b97aefe2c6ff.png)

`basis-1/2`が反映されず、画像が途切れています…

## 変更後

```erb
<div class="flex justify-center">
  <div>
    <%= image_tag "man.png", class: "basis-1/2" %>
  </div>
  <div>
    <%= image_tag "woman.png", class: "basis-1/2" %>
  </div>
</div>
```

![Screen Shot 2022-05-15 at 19.02.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/c6ce5ffd-b7c1-87b6-87e0-1a7e569bf545.png)

`basis-1/2`が反映され、きれいに表示されるようになりました！

# おわりに
お読みいただきありがとうございました！
どなたかの参考になれば嬉しいです。

# 素材
https://loosedrawing.com/
Android13写真選択ツールの実装方法

今回はAndroid13にて追加予定となっている写真選択ツールを使ってみました。

#  リファレンス

https://developer.android.com/about/versions/13/features/photopicker?hl=ja


# 実装方法

```MainActivity.kt
binding.button.setOnClickListener {
  val intent = Intent(MediaStore.ACTION_PICK_IMAGES).apply {
    type = "image/*"
  }
  startForResult.launch(intent)
}

private val startForResult =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult? ->
            if (result?.resultCode == Activity.RESULT_OK) {
                result.data?.data?.also { uri: Uri ->
                    val inputStream = contentResolver?.openInputStream(uri)
                    val image = BitmapFactory.decodeStream(inputStream)
                    binding.imageView.setImageBitmap(image)
                }
            }
        }
```

画像を１つ選択するパターンです。

![Screenshot_20220515_190336.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/3d8da5e8-972a-82bb-43f9-e5e1a4525ef4.png)

このようにアプリの画面の上に写真選択する画面が出てきました。

複数選択する場合はIntenteに追加こちらを追加します。
```
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos)
```
maxNumPhotosAndVideosは最大の選択する枚数です。

簡単に実装できました。


こちらはパーミッションの許可を求めなくて良いので、良さそうですね。

注意点として、Android 11（API レベル 30）以上（Android Go デバイスを除く）をターゲットとするアプリのサポートが追加されます。との事なので、API レベル 30以下も対象としてあるアプリが多いと思うので、全てこれに変更してOKというわけには行かなそうですね。
ffmpegで動画をn倍速に一括変換するバッチ処理

# はじめに
片道2時間ほどのお出かけをしました。
ドライブレコーダーで撮影した映像を手間をかけずに編集したいのですが、
厄介なことに1分毎に1ファイルになっていて非常に扱いづらいです。

私たちの味方、ffmpegちゃんをこき使ってなんとかしましょう。

# やりたい事
* 動画は5倍速に変換したい
* 動画は1つのファイルに結合したい
* 100ファイル以上なのでバッチ処理したい

# 条件の整理
| 必要なファイル | Path |
|:--|:--|
|ffmpeg.exe|C:\Program Files (Freesoft)\ffmpeg\bin|
|inputファイル|F:\temp\input\\*.mp4|
|outputフォルダ|F:\temp\output|

# 2倍速に変換する
変換したい動画ファイル（*.mp4）をinputフォルダに入れて、下記バッチ処理を conv.bat に保存して起動します。
```dosbatch:conv.bat
@echo off
cd /d "F:\temp\input\"
for %%a in (*.mp4) do (
  "C:\Program Files (Freesoft)\ffmpeg\bin\ffmpeg.exe" -i F:\temp\input\%%a -vf setpts=PTS/2.0 -af atempo=2.0 F:\temp\output\%%a_x2.mp4
)
```
:::note info
cdでカレントディレクトリを変更し、そのディレクトリ内の *.mp4 というファイル全てに対してループ処理
:::
:::note info
setpts=PTS/2.0　映像を2倍速に変換
atempo=2.0　　音声を2倍速に変換
:::

# 5倍速に変換する
```dosbatch:conv.bat
@echo off
cd /d "F:\temp\input\"
for %%a in (*.mp4) do (
  "C:\Program Files (Freesoft)\ffmpeg\bin\ffmpeg.exe" -i F:\temp\input\%%a -vf setpts=PTS/5.0 -af atempo=2.0, atempo=2.0, atempo=1.25 F:\temp\output\%%a_x2.mp4
)
```
:::note warn
atempoは2.0までしか処理できないので、複数重ねて5倍速に変換します（2.0×2.0×1.25＝5倍）
3倍：atempo=2.0, atempo=1.5
4倍：atempo=2.0, atempo=2.0
5倍：atempo=2.0, atempo=2.0, atempo=1.25
6倍：atempo=2.0, atempo=2.0, atempo=1.5
7倍：atempo=2.0, atempo=2.0, atempo=1.75
8倍：atempo=2.0, atempo=2.0, atempo=2.0
:::
* ffmpegのコマンドは下記を参考にしました。
[ffmpegを使って動画の再生速度を変えてみる](http://fftest33.blog.fc2.com/blog-entry-36.html "ffmpegを使って動画の再生速度を変えてみる / fc2 blog")

# 動画を1つに結合する
* こちらに関しては素晴らしい記事がありました。
[ffmpegでmp4ファイルを結合するバッチファイル](https://qiita.com/r6820/items/a058b33d56a0294b7dfd "ffmpegを使って動画の再生速度を変えてみる / Qiita")

# さいごに
やったー！これで5倍速の1ファイルになったぞー！・・・と思って再生してたらキッチリ12秒毎にカクツク事に気付く。
つまり動画と動画を結合した所で何かが起きていると思い調べた結果がこちらです。

:::note alert
事実：n倍速に変換した際に、動画の末尾数フレームが欠落している
推測：変換時の剰余フレームは削除される為、動画の末尾で余りフレームを削除して調整されている
　　　（フレーム数は整数になる為）
:::

なんということでしょう・・・
対策として先に結合してから5倍速に変換しました・・・
これ何とか出来るんでしょうか。力尽きたのでここまでにします。
esp32のserial1を使う



![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) mac版でのファイルの場所は...

## やること
ESP32のSerial1を使うためにPlatformIOのファイルを変更します。
要点のみメモ。特にmac版。

## 動作環境
- ESP32devkitC
- PlatformIO(ESPのボードバージョン設定は3.3.2)

## ESP32のシリアルの問題点
- ESP32にはシリアルが3系統ある
- Serial0はPCデバッグ用として残りのSerial1,Serial2が使えそうだが
- Serial1がデフォルトでは使えない
- Serial1はピンを指定すれば使えるようになる
- しかしシリアルを使うライブラリでピンが指定できないことがある
- その場合Serial1用のデフォルトピンを変更しておく必要がある

参考）

https://qiita.com/T-YOSH/items/0ce41136c535c723affb

## 解決方法

こちらの記事が大変参考になります。

https://sasapon.hatenablog.com/entry/2020/08/16/esp32%E3%81%A7KONDO%E3%82%B5%E3%83%BC%E3%83%9C%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99

## 方法１：未検証ですがぜひやってみてほしい方法(2025.01.25追記)

過去に記載した方法の場合、クリーンビルド時に毎回消えるだろうというご指摘がありました。
PlatformIO.iniの"build_flags "でdefine宣言すると解決できるとのことです。未検証ですがこれからの方はぜひ試してみてください。

```
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
build_flags =
    -D CORE_DEBUG_LEVEL=0
    -D TX1=27
    -D RX1=32
```
これでピン設定が変更できたら便利ですね！

参考）

https://docs.platformio.org/en/latest/projectconf/sections/env/options/build/build_flags.html


## 方法２：HardwareSerial.hの書き換え（2024.05.08改定）
macでターミナルに入り
```
cd ~/
ls -a
```
としてホームディレクトリに入り隠しファイルを確認する。
「.platformio」があることを確かめる。
```
open .platformio/
```
とすると隠しフォルダを開くことができる。

## 2024年ごろの場合のやり方
「C:\Users\ユーザー名\.platformio\packages\framework-arduinoespressif32\cores\esp32\HardwareSerial.h」を開く。

![SS 2063.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/e2ec272f-85be-9a8b-55f0-4a67e5e496c9.png)

図のように、#define RX1 (gpio_num_t) 9 → 32 //9と改め、
同様に、#define TX1 (gpio_num_t) 10 となっているところを 27 //10とする。
9,10というのはピン番号で、それを新しい番号に置き換え、古い番号についてはコメントアウトで残すという作業です。
この状態で保存すれば、次回の書き込み時に新しいピン番号が反映されます。

## 2021年ごろの場合のやり方
参考記事の通り「C:\Users\ユーザー名\.platformio\packages\framework-arduinoespressif32\cores\esp32\HardwareSerial.cpp」を探す。

記事の通り下記の様に修正する。
下記のRX用32番ピン、TX用27番ピンの設定はUSB書き込み時の干渉がないことを手元で確認。
(2番や12番はUSB書き込み時に干渉しました。)

```
(前略)

#ifndef RX1
#if CONFIG_IDF_TARGET_ESP32
#define RX1 32 //9
#elif CONFIG_IDF_TARGET_ESP32S2
#define RX1 18
#elif CONFIG_IDF_TARGET_ESP32C3
#define RX1 18
#endif
#endif

#ifndef TX1
#if CONFIG_IDF_TARGET_ESP32
#define TX1 27 //10
#elif CONFIG_IDF_TARGET_ESP32S2
#define TX1 17
#elif CONFIG_IDF_TARGET_ESP32C3
#define TX1 19
#endif
#endif

(後略)
```

「framework-arduinoespressif32@x.xxxxxx.xxxxxx」
というファイル（バージョン違い）が複数ある場合には、そちらの中身も同様に修正します。

以上。
RP2040をArduino IDEで開発したい（まだ未完）

# RP2040
Raspberry piの開発したMCU。Raspberry pi picoに使われている。
昨今のマイコン不足にも関わらず安定供給されている。
性能の割に驚くほど安いが、代わりにFlashを内蔵していないというつらみがある。

今回はこいつを「普通のマイコンとして」使う方法を模索している内容を書いていく。
ちなみにまだ動いていない。つらい。
# USB使いたくないマン
通常だとUSBを使え、USBを使え、USBで書き込め、BOOTSELボタンが、とか
そんなにUSB経由で書き込ませたいのかというくらいラズピコ（Raspberry pi picoのこと）的な
やり方ばかり目につくのでまだ普通に基板開発している人は少ない模様。
でも普通に自作基板作るのにいちいちUSBコネクタつけて書き込むの嫌なので
SWDというデバッグとかに使うナニカを使って書き込むのにチャレンジ。
# 使うもの
・Raspberry pi4
Arduino IDEを...というかopenocdとかいうものを動かすのに
Macでやって構築できず、Winでもできず、Linuxだと楽にできるらしいのだが
適当なマシンがなかったのでどのご家庭にも転がっているRaspberry pi4を
Arduino IDEのホストにしてMacからVNC経由で使うことにする。
Real VNCのVNC ViewerだとMacからPRi4にコピペもできるのでかなり便利。
多分3とかでも良いと思う。

・書き込み機（デバッガ）にするラズピコ
picoprobeというものを書き込むとこいつでRP2040に直接書き込めるらしい

・書き込まれる方のラズピコ（テスト用）
上のページにある通りラズピコの片方をpicoprobeにして、もう片方を書き込み対象にして
テストできるので、何もわからんになった時に最初に立ち戻るためにラズピコはもう1台あると良いと思う。

配線とかその辺は各自適当に

# Arduino IDEまわりの環境構築
https://mickey-happygolucky.hatenablog.com/entry/2021/02/18/235625
書き込み環境はこちらがとても参考になりました。
picoprobeの書き込みのところまでこの通りにやる。
udevのルールとかよくわからなかったけどコピペで行けた。

https://beta-notes.way-nifty.com/blog/2021/04/post-700a49.html
こちらのPico Arduino Installを参考にボード情報を追加する。

# 回路
https://www.raspberrypi.com/documentation/microcontrollers/rp2040.html#rp2040-device
こちらが参考になるというか、KiCadのサンプルプロジェクトもあるのでそこから作り替えるとかなり楽。

# 手を加えたところ（別名：死亡フラグ）
・USB関係を削除
これは問題なかった。

・外部クリスタル周りの回路を削除
データシートに外部クロックなくても動くと書いてあったので。
しかしこれが罠で、Arduino IDEが使うPico C/C++ SDKでは
外部クロックが必須なのであった...
https://twitter.com/ciniml/status/1525750935946809344

# 未完
というわけで、多分外部クロックを追加すれば動くんじゃないかな、というのがイマココなわけです。
つまり、それ以外にもなにかダメなところがある可能性も捨て切れない。
まて、追記。
【Android】覚えておくと便利なExtension：Part2

# はじめに
何かしらの機能で必ず使用するExtensionですが、毎度実装している便利なExtensionを備忘録的に残しておこうと思います。

# その１
```
fun Context.showToast(message: String) {
  mainThread { Toast.makeText(this, message, Toast.LENGTH_SHORT).show()}}

```
トーストを表示する拡張関数です。
上記はシンプルなデフォルトのトーストを表示する処理ですが、SHORTとLONGで拡張関数分けても良いですね

# その２
```
fun Int.dpToPx(context: Context): Float {
    return this * context.resources.displayMetrics.density
}

fun Int.pxToDp(context: Context): Float {
    return this / context.resources.displayMetrics.density
}
```
dp、pxをそれぞれ変換するための拡張関数です。
アニメーションさせる際や、画面サイズから何かしたい場合などに使用するケースが多いですよね。

# その3
```
fun String?.isNotNullOrEmpty() = this.isNullOrEmpty().not()
```
たまにisNullOrEmptyを反転させて条件に当てているのを目にすることがありますが、そんなことをせず拡張関数にすると少しだけスマートです。
反転させた条件は見落としやすいことに対して、こちらは明確なので人為的なミスを防ぐことにもつながりそうです。

# さいごに
第二弾でしたが、こういった形でまとめておくと記憶にも残りやすく、微々たるものかもしれませんが探す手間を省くことができそうです。
無駄な時間を減らしてなるべく効率よく業務を進めていく必要があるので、どんどんまとめていこうと思います。
Pythonを使ってミュージックアプリを操作する

やりたいこと(要件)
Pythonを使ってミュージックアプリの”再生・停止・次の曲にスキップ・音量”を操作したい。

動作に必要な環境
(1)MacOS（Windowsは対象外）
(2)Python3
(3)PythonからAppleScriptを利用するパッケージ
http://appscript.sourceforge.net/index.html
開発は終了しているようです。

手順
(1)実行するPC(Mac)で、以下のコマンドを実行しておく。
pip3 install appscript

(2)MusicControlクラスを準備する。
以下の内容をファイルに保存する。ファイル名は"MusicControl.py"
```python:MusicControl.py
from appscript import app


class MusicControl(object):
    """
    AppleScriptを利用して、Musicアプリをコントロールするクラス
    注意：MacOSに依存する
    """
    def __init__(self):
        super().__init__()
        self.app = app('Music')
        self.app.run()

    def pause(self):
        """
        再生を一時停止する
        :return:
        """
        self.app.pause()

    def play(self):
        """
        再生
        :return:
        """
        self.app.play()

    def stop(self):
        """
        停止
        :return:
        """
        self.app.stop()

    def next_track(self):
        """
        次の曲へ飛ぶ
        :return:
        """
        self.app.next_track()

    @property
    def sound_volume(self) -> int:
        """
        ボリュームを0〜100の範囲で返す
        :return: 
        """
        return self.app.sound_volume.get()

    @sound_volume.setter
    def sound_volume(self, volume: int):
        """
        ボリュームを0〜100の範囲で設定する
        :return: 
        """
        self.app.sound_volume.set(volume)
```
(3) MusicControlクラスを呼び出して操作する。
使いやすくUIを追加してもいいでね。また、通信機能と組み合わせれば、ミュージックアプリを遠隔操作することもできます。
```python:foo.py
from MusicControl import MusicControl


def main():
    music = MusicControl()
    # 再生
    music.play()
    # 停止
    music.stop()
    # 音量アップ
    music.sound_volume += 1
    # 音量ダウン
    music.sound_volume -= 1


if __name__ == '__main__':
    """
    実行開始ポイント
    """
    main()

```
Python 文字列から特定文字列を取り除く

# はじめに
特定文字列は英語の母音として設定し、取り除く方法を正規表現を使用する/使用しないパターンの2種を紹介します。

# 方法1　正規表現を使わない
入力文字列をforで回し、各文字が特定文字列に合致しないものをjoinで連結する

```:py
txt = 'Hello World'
print(''.join(c for c in txt if c not in 'aeiouAEIOU'))

実行結果
Hll Wrld
```
 
# 方法2　正規表現を使う
正規表現パターンで文字列を分割し、リストをjoinで1つの文字列に連結する

```:py
import re
c = 'Hello World'
print(''.join(re.split('a|e|i|o|u|A|E|I|O|U', c)))

実行結果
Hll Wrld
```
ちなみに今回は関数splitでの処理を紹介していますが、subでもほとんど同じようことができます。

正規表現の参考資料：
[Pythonの正規表現モジュールreの使い方（match、search、subなど）](https://note.nkmk.me/python-re-match-search-findall-etc/)
カスタムプロバイダを自作したらTerraformの仕組みをよく理解できた

# はじめに
個人で使うにはAWSお金かかりすぎますよね。格安VPSをお手軽に使えるようにTerraformで管理したいと思い調べたところ、ConoHA VPSとさくらのVPSが対応していると分かりました。でももっと安いVPS、WebARENA Indigoがあり、これをTerraformで何とか使いたいと思い、カスタムプロバイダを自作してみました(作ってみたものの結局、実用的かと言われると怪しい笑)。

# Terraform Custom Provider
Terraformの説明はいまさらなので省略するとして、どうやらカスタムプロバイダが作れるようなので軽く調べてみました。Qiitaにもいくつか記事がありますが、バージョンが古かったりと結局は[公式ドキュメント](https://learn.hashicorp.com/collections/terraform/providers)を参考にしました。

## Terraform plugins
ざっくりまとめると、CRUDに対応したクラウドAPIを呼び出すプラグインを[SDK](https://github.com/hashicorp/terraform-plugin-sdk)を使って作成する模様。プラグインはGoを使って実装する。

公式ドキュメントで公開されているプラグインサンプル([terraform-provider-hashicups](https://github.com/hashicorp/terraform-provider-hashicups))があります。

## WebARENA Indigo
ありがたいことにWebARENA Indigoは[API](https://indigo.arena.ne.jp/userapi/)を提供してくれている
(作り始めて分かったのですが、なかなか制約の多い、かつあまり整備されていないAPIで苦労しました)。

## Indigo Client Go
APIを直接プラグインから呼び出すことも可能ですが、チュートリアルと同様([hashicups-client-go](https://github.com/hashicorp-demoapp/hashicups-client-go))にAPIのクライアントライブラリを作成するのが良さそうなので、WebARENA IndigoのGoクライアントライブラリを実装しました。

- [indigo-client-go](https://github.com/SatoshiTsutsumi/indigo-client-go)

Goを全く書いたことがない初心者が書いたので、おかしな点があったら指摘してくれるとうれしいです。メンテするモチベはいまのところあまりないですが。。。

## Terraform Provider Indigo
Indigo Client Goを使って、チュートリアル手順にしたがって実装したのが、Terraform Provider Indigoです。後述する制限があり、実用上はちょっと厳しいかなと思うので、ずっとα版のままかと思います。

- [terraform-provider-indigo](https://github.com/SatoshiTsutsumi/terraform-provider-indigo)

### 苦労した点
- API呼び出しレート制限が厳しい
    - APIは1回/秒以上はダメと返してくるけれど、実際にはもっと厳しくてよく分からない
- 必要なAPIが揃っていない
    - "R"が不十分
- ドキュメントが不正確
    - 仕様書にないレスポンスが多数
- APIの仕様がリソースごとにマチマチ
    - 引数、レスポンス、パス、命名規則、型が揃ってない
- APIの仕様が同じリソースでもマチマチ
    - 同じフィールドが、CreateとUpdateで変わる(intだったりstringだったり、日付のタイプ、フォーマットが異なったり)

### 今の実装でできること
- SSH Keyの登録/削除
- インスタンスの作成/状態変更/削除 (一部の種類のみ)
- スナップショットの作成/削除
- Firewallの作成/更新/削除

### 備考
インスタンスタイプやプランの仕様が見つけられなかったので、推測でほんの一部の構成をテストしただけです。少しずつドキュメント化していこうかなとは思ってます(公式ドキュメントが整備されないかな〜)。

# おわりに
今回カスタムプロバイダを作ってみて、Terraformの裏側が少し見えた気がします。仕組みが分かると、Terraformでできることやトラブルの際にどうやったら解決できるかがより分かるようになる気がしました。ぜひTerraformを使いこなしたい方はチャレンジしてみてください〜(まだ使いこなせてないけれど汗)。
Ruby on Railsでアプリを作る準備をする

毎回どうだっけと忘れてしまうので、Ruby on Railsのアプリを立ち上げるところまでをまとめました。備忘録です。

## railsをインストールする
Bundlerのインストール
```
gem install bundler
```
Railsのインストール
```
gem install rails
```

## rails new コマンドでアプリケーション作成の準備

webpackerをインストールする
```
rails webpacker:install
```
rails new コマンド
cdコマンドでPC上のアプリを作成したいディレクトリに移動し
```
rails new アプリケーション名
```
成功した場合、ターミナルに以下のように表示されます。
![スクリーンショット 2022-05-15 17.37.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602010/7673abed-5b23-632f-65d3-086668ca6551.png)

※rails newがうまくいかない場合、以下を試してみる。
```
brew install yarn
```
※他にも環境や設定によって、他にもインストールしないといけない場合があります

## Railsのサーバーを立ち上げる
cdコマンドでnewコマンドで作成したフォルダへ移動し
Railsのアプリケーションサーバー（puma）を起動させる
```
rails s
```
以下のように表示されれば成功です！
![スクリーンショット 2022-05-15 17.46.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602010/37487e1b-4670-0cab-c6ce-f250c7e762fc.png)
Flutter : Wrapで横並びにしたいのに縦並びになってしまう

## 事象
**Row**を使っていて改行したいときに「**Wrap**使おう」ってなった時に、そのままRowをWrapに変更したら横並びから縦並びになってしまう。

## 原因
変更後のWrapのchildrenにRowが入っているため

## 対応
WrapのchildrenのRowを全てWrapに変更する
SwiftUIのGeometryReaderでレイアウトが崩れるときは

記事の内容はこちらを参照してください。
https://mishimay.github.io/f2de749f0a2a6591e7cf/
<!--


- `.background` 内で `GeometryReader` を使うと崩れなそう
- 値の受け渡しには`PreferenceKey` 使うとよさそう

サンプルコード
```swift
import SwiftUI

struct ContentView: View {
    @State var size: CGSize = .zero

    var body: some View {
        VStack {
            Text(size.debugDescription)
            ChildView()
        }
        .onPreferenceChange(SizePreferenceKey.self) {
            size = $0
        }
    }
}

struct ChildView: View {
    var body: some View {
        Text("Message")
            .background(GeometryReader { geometry in
                Color.clear.preference(
                    key: SizePreferenceKey.self,
                    value: geometry.size
                )
            })
    }
}

struct SizePreferenceKey: PreferenceKey {
    static var defaultValue: CGSize = .zero
    static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
        value = value.width + value.height > nextValue().width + nextValue().height ? value : nextValue()
    }
}
```
※ `reduce` の `nextValue()` について、計測したいViewの中にif文があると `nextValue()` として(0, 0)が来たりするようなので、より大きい方を返している

環境
Xcode 13.3.1

参考
https://stackoverflow.com/a/64779345/649228
https://qiita.com/maiyama18/items/a64bab2094750319ef8d


-->