OmniAICreator/Qiita-1.07M huggingface dataset:
ESLintでimportの整列・追加・削除を自動化する


## 概要

ESLintのプラグインとVS Codeの設定でimportの追加・削除・整列を自動化して幸せになれる記事です。

**こんな人におすすめ**
- チーム間でimportの順番などのルールが決まっておらず。人によってフォーマットがバラバラなのが実は気になっている。
- 未使用のimportを消すのを忘れがち。
- コンポーネントやライブラリの関数を書いたら勝手にimportしてくれたら嬉しい。
- import周りを触るのがシンプルにめんどい。

## 使用するプラグインと設定

### VS Codeの設定
- `source.addMissingImports`
    - importの自動追加に使用する
    - VS Codeで設定する

### ESLintのプラグイン
- `eslint-plugin-import`
    - importの整列に使用するプラグイン
- `eslint-plugin-unused-imports`
    - 未使用のimportを削除に使用するプラグイン

ESLintのプラグインはnpmからインストールしておきましょう。

## source.addMissingImportsの設定

`setting.json`に`"source.addMissingImports"`を追記するだけでOK。

`"editor.codeActionsOnSave"`は配列で指定することにより順番で実行されるので、importの自動追加 -> ESLintの順番で実行することができます。

自動追加 -> 自動整列の順番で実行したいので以下のように設定します。

```json:.vscode/settings.json
{
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": [
    "source.addMissingImports",
    "source.fixAll.eslint",
  ],
}
```

## eslint-plugin-importの設定

`eslint-plugin-import`は設定項目が割と多めです。
そんなに難しい項目はないのでざっくり解説していきます。

### groups

整列する順番をグループ化することができます。
以下3つを押さえておけばOKです。

- `builtin` ... 組み込みモジュール
- `external` ... npmなどでインストールした外部ライブラリ
- `internal` ... 自作モジュール

### newlines-between

グループごとに改行を入れるかどうかを指定します。

### alphabetize

- `order`は昇順か降順でどちらでソートするか指定します
- `caseInsensitive`は大文字小文字を区別するか指定します

### pathGroups

特定のパスパターンの時にグループ化したいものを指定できます。

`pattern`にはグループ化したい文字列を指定します
`group`と`position`はセットになっていて、どの`group`の前か後ろに整列させるか指定します。

各オプションの詳細は公式ドキュメントを参考にしてみてください

https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/order.md

```jsonc:.eslintrc.json
{
  // ...略
  "plugins": [
    "import",
  ],
  "rules": {
    "import/order": [
      "error",
      {
        "groups": [
          "builtin",  // 組み込みモジュール
          "external", // npmでインストールした外部ライブラリ
          "internal", // 自作モジュール
          [
            "parent",
            "sibling"
          ],
          "object",
          "type",
          "index"
        ],
        "newlines-between": "always", // グループ毎にで改行を入れる
        "pathGroupsExcludedImportTypes": [
          "builtin"
        ],
        "alphabetize": {
          "order": "asc", // 昇順にソート
          "caseInsensitive": true // 小文字大文字を区別する 
        },
        "pathGroups": [ // 指定した順番にソートされる
          {
            "pattern": "@/components/common",
            "group": "internal",
            "position": "before"
          },
          {
            "pattern": "@/components/hooks",
            "group": "internal",
            "position": "before"
          },
        ]
      }
    ]
  },
}
```

## eslint-plugin-unused-importsの設定

`plugin`に追加して`rules`に追記するだけでOK

```jsonc:.eslintrc.json
{
  // ...略
  "plugins": [
    "unused-imports"
   ],
   "rules": {
     "unused-imports/no-unused-imports": "error"
   },
}
```

## おまけ

自作しているボイラープレートで使用しているESLintの設定ファイルを共有しておきます。

ESLintとprettierを併用しつつReact x TypeScriptを書く想定で設定しています。

https://github.com/ykj-rails/rts-kit/blob/main/.eslintrc.json
Golang, MySQL, nuxt.jsで動かしてみる。

## Docker環境構築
- バックエンド側のコンテナ内で`go mod init {$MODULE_NAME}`し`go.mod`ファイルを作成する
 - このファイルは直接さわらずに、コマンドを実行にて変更する 
- `go get github.com/labstack/echo/v4`でEchoをインストールする
 - [参考 / Gin Web Framework](https://github.com/gin-gonic/gin#installation)

## Go(バックエンド)
- フレームワークはEchoを使ってみる
 - RestAPIに適しているとのこと

## Nuxt3(vue3:vite)
- Vueのフレームワーク　
- tailwindを使う    [参考](https://tailwindcss.com/docs/guides/nuxtjs) 

### Error: Unknown at rule @tailwind CSS　
- vscode拡張機能の`PostCSS Language Support`をインストールする

### Error:　localhost:3000にアクセスすると無限リロードされてしまう
- docker-compose.ymlの`ports`にwebsocket用のportを追加する

``` docker-compose.yml
ports:
  - '3000:3000'
  - '24678:24678' //追加
``` 

## MySQL
- ORMは"Gorm"を使う

### 環境変数はgodotenv モジュールを使う
- `go get github.com/joho/godotenv`
 - `.env` ファイルが読み込めるようになる
Googleの検索結果から広告リンクを非表示にする

　Google検索を愛用している人は多いと思いますが、最近特に上位に表示される広告が多く、迷惑だと感じることが多くなってきました。そこで、ブラウザの拡張機能Stylusを使って、広告の項目を非表示にしました。

# Stylusのインストール

　Stylusは、Microsoft Edge, Google Chrome, Firefoxのいずれにも対応するユーザーカスタマイズ書式設定の拡張機能です。

https://chrome.google.com/webstore/detail/stylus/clngdbkpkpeebahjckkjfobafhncgmne?hl=ja

https://addons.mozilla.org/ja/firefox/addon/styl-us/

# スタイルの作成

　手順は省きますが、以下のスタイルをGoogle検索結果を表示するページに適用するよう設定します。

```css
div[aria-label="広告"] {
    display:none;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/1b13fd73-1c68-39af-f19d-f80d3b0bc3e2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/03a1ba03-86fa-cb6e-c679-fe4fba815b55.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/5624e97c-ce41-89dd-8e87-d01e8dfdc634.png)

　こんな感じで、　検索結果の中から広告が消えてくれます。
100日でSQLの達人になる@LeetCode! Day42 <WITH句で複数テーブルを使う方法>

## 1501. Countries You Can Safely Invest In （問題レベル: Medium）要課金
今日の問題はこれ。
二人の間の電話記録の表とユーザーの電話番号の表、電話番号と国の対応表の３つの表から、国別の通話時間を計算し、全体の平均通話時間よりも長い国名をリストアップするという問題。

前回でも活用したように`WITH`句を使って情報をまとめた理想的な表を作成し、その表を利用して結果を算出できた。
`WITH`句で複数テーブルを作成するところで躓いたため、最終的には`WITH`句で1テーブルだけを作成した下記のコードを提出した。

```:SQL
WITH cte AS
(
SELECT c.caller_id AS id, c.duration
FROM calls c
UNION
SELECT c2.callee_id AS id, c2.duration
FROM calls c2
)

SELECT m.name AS country
FROM (
SELECT c.name, cte.duration
FROM cte
LEFT JOIN person p
ON p.id=cte.id
LEFT JOIN country c
ON c.country_code=LEFT(p.phone_number,3)) m
GROUP BY m.name
HAVING AVG(m.duration*1.0) > (SELECT AVG(duration*1.0) FROM calls)
```

今日のポイントは`WITH`句で複数テーブルを使う場合は、
`WITH table1 AS SELECT文1, table2名 AS SELECT文2, ...`とする。

* [LeetCode](https://leetcode.com/)の問題は、`MS SQL Server`で解いています。
【チートシート】SQLのコマンド一覧（データベースの作成・編集）

## 〈データベースの編集〉
■データベースの作成（指定したデータベースを作成）
```sql:db-sample
CREATE DATABASE DB名;
```

■データベース一覧の取得（作成済みのデータベース一覧を表示）
```sql:db-sample
SHOW DATABASES;
```

■データベースの削除(指定したデータベースを削除)
```sql:db-sample
DROP DATABASE DB名
```


## 〈テーブルの編集〉
■テーブルの作成（指定したDBにテーブルを作成すると同時に複数のカラム（①②...）を作成）
```sql:db-sample
CREATE TABLE DB名.テーブル名(①カラム名 ①データ型, ②カラム名 ②データ型, ...);
```

■テーブル一覧の取得（作成済みのテーブル一覧を表示）
```sql:db-sample
SHOW TABLES FROM DB名;
```

■テーブルの削除(指定したテーブルを削除)
```sql:db-sample
DROP TABLE DB名.テーブル名;
```

## 〈データの編集〉
■レコードの追加(全てのカラム（①②...）に値を入れる場合)
```sql:db-sample
INSERT INTO DB名.テーブル名 VALUES (①値, ②値, ...)
```

■レコードの追加(指定したカラム（①③...）に値を入れる場合)
```sql:db-sample
INSERT INTO DB名.テーブル名 (①カラム名, ③カラム名, ...) VALUES (①値, ③値, ...)
```

■複数のレコードを追加(全てのカラム（①②...）に値を入れる場合)
```sql:db-sample
NSERT INTO DB名.テーブル名 VALUES (①値, ②値, ...), (①値, ②値, ...), 
```

■複数のレコードを追加(指定したカラム（①③...）に値を入れる場合)
```sql:db-sample
INSERT INTO DB名.テーブル名 (①カラム名, ②カラム名, ...) VALUES (①値, ③値, ...), (①値, ③値, ...), ...
```

■テーブル内のデータを削除(指定したテーブルのデータを全て削除する場合)
```sql:db-sample
DELETE FROM DB名.テーブル名
```

■テーブル内のデータを削除(指定したテーブルのデータの内、指定した条件式に当てはまるもののみを削除する場合)
```sql:db-sample
DELETE FROM DB名.テーブル名 WHERE 条件式;
```
[Python]enumを使って多次元配列をするときの注意点

# Background
[paizaスキルチェック](https://paiza.jp/challenges) のある問題を解いていたときに、2次元配列を使ってある区画の範囲に色を塗るといった処理が必要となりました。そこで各要素を列挙型を使ってみたのですが思った処理結果が出なかったので紹介します。

# Initialize

ここで色の列挙型と区画を初期化してみます。

```Python
class Color(Enum):
    WHITE = 0
    RED = 1
    GREEN = 2
    BLUE = 3

# width:5 height:4 の2次元配列を作る
mat = [[Color.WHITE] * 4] * 5

for r in mat:
    for c in r:
        print(c.name, end=" ")
    print("\n")
```

```shell
WHITE WHITE WHITE WHITE 

WHITE WHITE WHITE WHITE 

WHITE WHITE WHITE WHITE 

WHITE WHITE WHITE WHITE 

WHITE WHITE WHITE WHITE 
```

# Issue

上記で設定した区画から `(LEFT, TOP) = (2,2) (RIGTH, BOTTOM) = (3,4)` の部分に赤色を塗りたい場合、

```Python
for r in range(1,4):
    for c in range(1,3):
        mat[r][c] = Color.RED
```

```shell
WHITE RED RED WHITE 

WHITE RED RED WHITE 

WHITE RED RED WHITE 

WHITE RED RED WHITE 

WHITE RED RED WHITE 
```

なぜか2列目と3列目が全色赤になって1行目と5行目も塗ってしまいます。


# WHY?

てことで、各要素と各行のオブジェクトIDを出力してみます。

```Python
mat = [[Color.WHITE] * 4] * 5

for r in mat:
    for c in r:
        print(id(c))
    print("[List]:{}".format(id(r))) 
```

```shell
140539104199104
140539104199104
140539104199104
140539104199104
[List]:140539104158848
140539104199104
140539104199104
140539104199104
140539104199104
[List]:140539104158848
140539104199104
140539104199104
140539104199104
140539104199104
[List]:140539104158848
140539104199104
140539104199104
140539104199104
140539104199104
[List]:140539104158848
140539104199104
140539104199104
140539104199104
140539104199104
[List]:140539104158848
```

リストに同一のIDが振られています。 おそらくですが、`[[(obj)] * num ] * num` にすると列ごとのコピーは浅いコピーと判断されるみたいです。 浅いコピーについてですが[公式](https://docs.python.org/ja/3/library/copy.html)では `浅いコピー (shallow copy) は新たな複合オブジェクトを作成し、その後 (可能な限り) 元のオブジェクト中に見つかったオブジェクトに対する 参照 を挿入します。`となっていて要素自体を完全にコピーしておらずリンクだけが複製されています。

# Solution

## pattern 1
python標準を使う場合は下記の通り。これで各行のリストのオブジェクトIDが重複しないので上記のような色を塗っても他の行には影響しないです。

```Python
mat = []
for r in range(5):
    #各行を作成
    row = []
    for c in range(4):
        row.append(Color.WHITE)
    mat.append(row)
```

## pattern 2

numpyを使う場合です。 `np.array`にラッピングします。 
おそらくですがpaizaでスキルチェックしたい場合は使えないと思います。

```Python
import numpy as np
mat = np.array([[Color.WHITE] * 4]*5)
```

# output

pattern1とpattern2のどちらで設定しても下記の結果が出力されると思います。

```Python

for r in range(1,4):
    for c in range(1,3):
        mat[r][c] = Color.RED

for r in np_mat:
    for c in r:
        print(c.name, end=" ")
    print("\n")
```

```shell
WHITE WHITE WHITE WHITE 

WHITE RED RED WHITE 

WHITE RED RED WHITE 

WHITE RED RED WHITE 

WHITE WHITE WHITE WHITE 
```

# Reference
- [Python公式 enum](https://docs.python.org/ja/3.9/library/enum.html)
- [Pythonのcopyとdeepcopyについて](https://qiita.com/Kaz_K/items/a3d619b9e670e689b6db)
Cloud Functionsを開発する時のマスターになるようなgcloud functions deploy/delete用のバッチファイルを作ってみた

# gcloudコマンドも何だかんだ面倒くさいな。お手軽にCloud Functionsデプロイしたいな
という思いで最初に**Cloud Build**や**Github Actions**などに行ってしまって迷走した。
それが悔しかったので、Cloud Functionsを`deploy/delete`するバッチファイルでかつ、少しの編集で設定をいじれるマスターとなるようなものを俄か勉強で作ってみた。

デプロイ時
```batchfile:deploy.bat
@echo off
chcp 65001

set PROJECTID = projectID
set FUNC_NAME = function_name
set REGION=region
set MAIN_FUNC = main_func
set MAX=3000
set MIN=0

::Pub/Sub Trigger
set TOPIC_NAME = topic_name
::Bucket Trigger
set RESOURCE = resource
set STORAGE_EVENTS=finalize;delete;archive;metadataUpdate
::FireStoreTrigger
set PATH = path
set RESOURCE = projects/%PROJECTID%/databases/(default)/documents/messages/%PATH%
set FIRESTORE_EVENTS=create;update;delete;write


for /f "usebackq tokens=*" %%r in (`gcloud config list`) do echo %%r

:CONFIG_CONFIRM
echo -------------------------------------------------------
echo  Activeなconfigはこのままでよろしいですか？(Y/N)
echo  ※Project IDは変数として設定されているものがSETされます
echo -------------------------------------------------------
SET ANSWER=
SET /P ANSWER=
 
IF /I NOT "%ANSWER%"=="Y"  GOTO :END_IN_MIDDLE

GOTO :FINALLY

:END_IN_MIDDLE
echo Configを変更してから実行してください。終了します。
PAUSE
exit /b

:FINALLY
setlocal enabledelayedexpansion
set i=0 
for %%S in (%STORAGE_EVENTS:;= %) do ( 
   set s[!i!]=google.storage.object.%%S
   set /a i+=1 
  )

set i=0
for %%F in (%FIRESTORE_EVENTS:;= %) do ( 
   set fs[!i!]=providers/cloud.firestore/eventTypes/document.%%F
   set /a i+=1 
  )

REM ファイルのカレントディレクトリに移動

cd /d %~dp0

gcloud functions deploy %FUNC_NAME% ^
--project=%PROJECTID% ^
--region=%REGION% ^
--entry-point=%MAIN_FUNC% ^
--runtime=python39 ^
--trigger-resource=%RESOURCE% ^
--trigger-event %s[3]% ^
--max-instances=%MAX% ^
--min-instances=%MIN% ^
--retry ^
--timeout=540 ^
--ignore-file=.gcloudignore

:: 直近で使った設定を元にしているが、以下のような設定変更もたまにやる
@REM --set-env-vars=ENV_KEY1=ENV_VAL1,ENV_KEY2=ENV_VAL2 ^
@REM -trigger-topic=%TOPIC_NAME% ^ 
@REM --memory=1024 ^
@REM --trigger-http ^
@REM --allow-unauthenticated ^

endlocal
```

Delete時
```batchfile:delete.bat
@echo off

chcp 65001

for /f "usebackq tokens=*" %%r in (`gcloud config list`) do echo %%r

:CONFIG_CONFIRM
echo -------------------------------------------------------
echo  Activeなconfigはこのままでよろしいですか？(Y/N)
echo -------------------------------------------------------
SET ANSWER=
SET /P ANSWER=
 
IF /I NOT "%ANSWER%"=="Y"  GOTO :END_IN_MIDDLE

GOTO :FINALLY

:END_IN_MIDDLE
echo Configを変更してから実行してください。終了します。
exit /b

:FINALLY
set REGION=
echo リージョンを入力してください
set /p REGION=

set FUNCNAME=
echo Functionsの名前を入力してください
set /p FUNCNAME=

for /f "usebackq tokens=*" %%e in (`gcloud functions delete %FUNCNAME% --region=%REGION%`) do echo %%e

PAUSE

```
2022/3/14主にITとかセキュリティの記事

ユービーアイソフトが先週サイバー攻撃を受けていたことを明らかに―個人情報へのアクセスなどは確認できず(3/12)
https://www.gamebusiness.jp/article/2022/03/12/19826.html

中国へのサイバー攻撃、2月以降相次ぐ　大半は米国発＝新華社(3/11)
https://jp.reuters.com/article/china-cybersecurity-united-states-idJPKCN2L80I4

「ノア」生産のトヨタ車体2工場も一時停止、小島プレス工業のサイバー被害の影響で(3/11)
https://xtech.nikkei.com/atcl/nxt/news/18/12408/

「増加するデジタル遺品の課題」(3/11)
https://premium.toyokeizai.net/articles/-/30028

ポーランドで逮捕されたランサムウェア犯罪グループ「REvil」のメンバー1人が米国に引き渡される(3/12)
https://jp.techcrunch.com/2022/03/12/2022-03-10-revil-hacker-kaseya-arrested/

ネットバンキングを使っていないのに勝手にネット送金される詐欺に注意！(3/11)
https://internet.watch.impress.co.jp/docs/column/dlis/1394552.html

マイクロソフトも巻き込む米ロの「サイバー攻防戦」(3/11)
https://premium.toyokeizai.net/articles/-/30039

DuckDuckGOも検索結果でロシア関連虚偽情報をランクダウン(3/11)
https://www.itmedia.co.jp/news/spv/2203/11/news126.html

ロシアでテック企業が販売を停止するなか、スマホやクラウドサービスなどのビジネスへの影響は？(3/12)
https://jp.techcrunch.com/2022/03/12/2022-03-11-as-tech-companies-suspend-sales-in-russia-what-is-the-actual-business-impact-guccounter1guce_referrerahr0chm6ly93d3cuz29vz2xllmnvbs8guce_referrer_sigaqaaanswh7cz4aw6wze-gpivb_ovmt8wze/

【国際】COSO、サステナビリティ報告での内部統制の在り方を検討。2022年秋に報告書発表へ(3/10)
https://sustainablejapan.jp/2022/03/10/coso-sustainability-reporting/71165

Microsoftが月の月例更新プログラムを提供開始　初期化してもファイルが残る不具合を解消(3/11)
https://www.itmedia.co.jp/pcuser/spv/2203/11/news128.html

ずさんすぎる「水道停止」詐欺メールがネットで話題 しかし実際に被害者も…(3/11)
https://mdpr.jp/news/detail/3051032

ウクライナ支援 「NFT」使ったデジタルアート販売の動き広がる(3/12)
https://www3.nhk.or.jp/news/html/20220312/k10013527701000.html

ツイッター、ベラルーシ国営メディアの情報拡散制限へ(3/11)
https://www.epochtimes.jp/2022/03/88475.html

Googleを使わずにググりたい。プライバシーを守れる検索エンジン5選＋α(3/12)
https://www.gizmodo.jp/2022/03/privacy-search-5.html

第5回 改正個人情報保護法（2022年4月1日施行）のポイントと実務対応リスト - プラポリの改訂、外的環境の把握、仮名加工情報(3/10)
https://www.businesslawyers.jp/articles/1118

Windows 11ミニTips 第53回 フォルダーの「ライブラリに追加」を削除する(3/12)
https://news.infoseek.co.jp/article/mynavi_2380918/?tpgnr=it

ポケモンGO、ロシアとベラルーシでサービス停止。「効果のある制裁なのか？」の声も(3/12)
https://www.huffingtonpost.jp/entry/story_jp_622c54c8e4b0fe0944d63c4e

米ディスカバリー、ロシアでの番組配信を停止(3/11)
https://news.livedoor.com/lite/article_detail/21811324/

Windows 11の［検索］パネルが拡張されて「今日は何の日？」かを教えてくれるように(3/11)
https://forest.watch.impress.co.jp/docs/news/insiderpre/1394706.html

デンソーが再びランサムウエア被害、今回は設計・開発を担うドイツ法人が標的に(3/13)
https://xtech.nikkei.com/atcl/nxt/news/18/12411/
RHEL 8.5にOSS版httpd 2.4.52をインストールする(番外編-phpを利用する)

# 前回
[RHEL 8.5にOSS版httpd 2.4.52をインストールする(2)](https://qiita.com/hykwrtr/items/5581cab77871807594a5)

# 概要
インストールしたOSS版httpdでphpを動かしたいのでインストール&設定をした  
CentOS8からモジュール版phpは使われなくなったようなのでphp-fpmを利用する

# 前提  
- RHEL 8.5
- httpd 2.4.52 （ソースからインストール、前回の記事参考）
- php 7.4.28 (remi)

# インストール  

```
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

sudo dnf module reset php
sudo dnf module install php:remi-7.4
```

# 設定変更  

## php-fpmの設定
```
sudo vi /etc/php-fpm.d/www/conf
```

```diff 
- ;listen.owner = nobady
+ listen.owner = apache
- listen.group = nobady
+ listen.group = apache
- listen.mode = 0660
+ listen.mode = 0666
```

AppStreamのhttpdをインストール→削除したため、apacheユーザは存在している。
もしソースからのみインストールの場合、同様に作成する必要があり。

## httpd.confの修正
phpをインストールした段階で`/etc/httpd/conf.d/`配下に`php.conf`が配備されているので、その設定を有効化する

```
sudo vi /etc/httpd/conf/httpd.conf
```

```diff
+ Include conf.d/*.conf
```

# 起動

```
sudo systemctl start php-fpm
```

# 動作確認

```
sudo touch /var/www/html/index.php
```

中身は以下とする
適当にphpinfoを出力
```
<?php
phpinfo();
```
論文）A decision-making framework for safe operations of unmanned aerial vehicles in urban scenarios

Quiñones, Marcos, et al. "A decision-making framework for safe operations of unmanned aerial vehicles in urban scenarios." Annual Conference of the PHM Society. Vol. 12. No. 1. 2020.

### Programming point of view
A*アルゴリズムの話がちらっと出てくる程度で、全体として面白い部分はない


## Motivation
Unmanned aerial vehicle (UAV)の運行経路最適化を考えたとき、
天候や機器の劣化などの不確かさを考慮してリスク評価できるようにしたい

## Method
下記を考慮し、経路が与えられたらリスクが評価できるフレームワークを構築
 - 静物との衝突のリスク
 - バッテリー切れのリスク
    - モータ劣化、バッテリー劣化が上記に影響

シミュレーション； 通常、強風、モータ劣化の３状況に対し、３つの経路を設定、それぞれの衝突リスク、バッテリー切れリスクを算出し確認する

## Insight
(conference paperのせいか、シミュレーション結果に対する考察が全然ない）

Discussion;
異なるリスクを統合して評価できるフレームワークを作ったから、他の研究者が考案したリスク指標も追加していけるのが強み

## Contribution Summary
著者は、リスク評価を加味してUAVを安全に航行させるという課題のため、
衝突や寿命のリスク評価をモデルに組み込み、リスク評価に基づく航路決定ができるフレームワークを提案した。
pythonでテキストファイルに書き込みするならwrite使うよりprint使う方が簡単だよ。

# Pythonでテキストファイルに書き込み
今日は、Pythonを書く人なら誰でも知っていると思われる、テキストファイルの書き込みについての小ネタ。
なぜか、「python、ファイル、書き込み」とかでググると、以下のような感じの説明をしてるウェブサイトばかりが出てくる。
1. `open`関数で書き込みモード("w")のファイルオブジェクト(`_io.TextIOWrapper`)を作成して、
1. `write`か`writelines`で書き込む！！！！！！！！！

確かに、これが最も基本的な書き方であることは間違いないが、正直なところ`write`関数での書き込みは面倒くさいし意外と難しい。なんと言っても、書き込み内容を文字列(`str`)型に整形する必要がある。テーブル形式で書き出したいときなんて、区切り文字までつけないとならないし発狂ものである。(標準のcsvモジュールとかpandasとかnumpyのcsv出力の機能を使えばいいという指摘は最もである。しかし、ダメだとは分かっていても、ヘッドにコメントを付けたいみたいなときもあるわけで、標準のwrite関数を使わざる得ない時もあるわけである。)
実は、そんなときは`write`ではなくて`print`を利用すると、誰でも簡単にテキストファイルに書き込みができるようになる。

## printを用いたテキストファイルへの書き込み
例えば、以下のような2次元リストをテキストファイルにcsv形式で書き込むこと考えてみよう。

```python
sample_data = [["Name", "Sex", "Age", "Weight", "Height"], 
               ["Hoge", "M", 41, 74, 170], 
               ["Fuga", "M", 42, 68, 166],
               ["Piyo", "M", 32, 70, 155],
               ["Hogera", "M", 39, 72, 167]]
```

これを、write関数で書き出そうとすると、以下のような感じになる。

```python
with open("sample.csv","w") as o:
    for row in sample_data:
        o.write(",".join(map(str, row)) + "\n") 
```

まぁ、分かる。何やってるか分かるけど、正直、書きにくいし読みにくい。念の為`write`のところのコードを解説すると、
1. `row`の各要素が数値であることもあるため、`map`関数でrowの中身を全て文字列に変換。
1. `map`関数の返り値をjoinに渡すことで、","を区切り文字にして、各要素が連結された文字列を生成。　　

ということをやっている。しかし、`map`とか`join`とか正直、初心者には難易度が高めであんまり使い勝手が良くない。
しかし、`print`を使えば以下のように直感的なコードで書き込むことが可能だ。

```python
with open("sample.csv","w") as o:
    for row in sample_data:
        print(*row, sep=",", file=o) 
```

お分かり頂けただろうか。`map`とか`join`とか、そして`write`すら使う必要はないのである。`print`だけで全てが完結する。なにより、数値を文字列に変換する必要がない！。素晴らしい。

**以下解説** 
まず、最も重要なことは`print`には`file`という引数が用意されていて、これに`.write`をもつファイルオブジェクトを指定してあげれば、デフォルトだと標準出力に出力される内容をファイルに書き込むことができる。つまり、

```python
with open("hoge.txt", "w") as o:
    print("Hello world!", file=o)
```

という使い方ができるわけである。ただ、まぁこれだけなら`write`と差はない。しかし、以下のような場合ならどうだろうか。

```python
a = 123
with open("hoge.txt", "w") as o:
    print(a, file=o)
```

そう、数値だって文字列に変換することなく書き込むことができるのである。もう、これだけで`print`の方が使いやすい。


また、`print`には`sep`という区切り文字を指定するための引数まで用意されている。例えば、
```
>>> print( 1, 2, 3, sep="hogehoge")
1hogehoge2hogehoge3 
```

といったことができる。ただ、単にこの方法でlistの中身を書き出そうとすると、以下のように`list`の要素を一つずつ指定する必要があって、あまり実用的ではない。

```
>>> values = [1,2,3]
>>> print(values[0], values[1], values[2], sep="hogehoge")
1hogehoge2hogehoge3 
```

そんなとき活躍するのがアスタリスク、`*`を用いることで`list`の中身を展開することができる。これを使うと以下の例のように、`list`の中身を一度に`print`に渡すことができる。
```
>>> values = [1,2,3]
>>> print(*values, sep="hogehoge") #print(values[0], values[1], values[2], sep="hogehoge")と同じ意味
1hogehoge2hogehoge3
```

つまり、最初のcsvの出力の例では、`print(*row, sep=",", file=o)`で`row`の各要素を","区切りでファイルに書き出すということをやっていたのである。rowの中身は文字列と数値が混ざっていることもあるわけだが、printで書き出す場合には何も気にする必要はない。そのまま、期待通りの結果が出力される。
また、`file`を`file=None`として指定すれば、標準出力に出力されるので書き出しの結果を一度確かめたいみたいなことも手軽に行うことができる。

---

## ほぼ同じ記事が既ににありました、ごめんなさい
多くのテキストやwebの説明だと`write`による書き込みばかり紹介されていて、意外と`print`の便利さが知られてないんだよなぁと思って記事を書いてみたけど、調べてみたら同じような記事が過去にありました。ほとんど重複記事になってしまった。すいません。
https://qiita.com/pytry3g/items/aa38d8c2acf59b90aaac
Laravel foreach内でループ回数を取得する

# foreach内でループ回数を取得したい
bladeテンプレートのforeachディレクティブ内で、$loop変数にアクセスできる

```php
@foreach
    @if($loop->iteration % 2 == 0)
        // 偶数
    @else
        // 奇数
    @endif
@endforeach
```

## プロパティ
 |プロパティ|説明|
 |:---------|----|
 |$loop->index|現在の反復のインデックス（初期値０）|
 |$loop->iteration|現在の反復数（初期値１）|
 |$loop->remaining|反復の残数|
 |$loop->count|反復している配列の総アイテム数|
 |$loop->first|ループの最初の繰り返しか判定|
 |$loop->last|ループの最後の繰り返しか判定|
 |$loop->even|今回が偶数回目の繰り返しか判定|
 |$loop->odd|今回が奇数回目の繰り返しか判定|
 |$loop->depth|現在のループのネストレベル|
 |$loop->parent|ループがネストしている場合、親のループ変数|

## 参考
https://readouble.com/laravel/8.x/ja/blade.html#the-loop-variable
RHEL 8.5にOSS版httpd 2.4.52をインストールする(2)

# 前回
[RHEL 8.5にOSS版httpd 2.4.52をインストールする](https://qiita.com/yakkawa/items/d5a2870fa5a6f7684002)

# systemdで起動できるように設定ファイルを作成

```
cd /usr/lib/systemd/system
sudo touch httpd.service
sudo vi httpd.service
```

以下を追加
（redhatのものを参考にしているが要検証）

```
[Unit]
Description=The Apache HTTP Server
#Wants=httpd-init.service
# After=network.target remote-fs.target nss-lookup.target httpd-init.service
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd.service(8)

[Service]
Type=simple
Environment=LANG=C

ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
# Send SIGWINCH for graceful stop
KillSignal=SIGWINCH
KillMode=mixed
PrivateTmp=true

[Install]
WantedBy=multi-user.target
```

起動確認
```
sudo systemctl start httpd
sudo systemctl status httpd
```

#  次

php 7.4.28を利用したいのでremiリポジトリのphpを利用して設定する
[RHEL 8.5にOSS版httpd 2.4.52をインストールする(番外編-phpを利用する)](https://qiita.com/hykwrtr/items/2a6e00ca9838f39746e6)
【WordPress】Dockerでメールを確認できる環境を構築する

## はじめに
タイトルのとおりです。
WordPressでメールを確認できる環境をDocker構築します。

VSCodeでデバッグできる環境を作る記事も書いてますので、こちらも参考にしてください。
- [【WordPress】VSCodeでデバッグできる環境をDockerで構築する - Qiita](https://qiita.com/tegnike/items/7b8babb3130684d94a35)

## 各ファイルの準備
下記のディレクトリ構成でファイルを用意してください。

### ディレクトリ

```
public_html（<- プロジェクトのフォルダ名です。なんでも良いです。）
├── docker-compose.yml
└── （WordPressプロジェクトはこの階層に入ります。）
```
すでにWordPressを開設していて、自身のファイルを利用したいという方は、`public_html`の配下に`wp-admin`や`wp-content`が来るように配置していただければ大丈夫です。
下記で紹介する`docker-compose.yml`で、ホストのファイルをコンテナ側にマウントするように設定しているからです。

### docker-compose.yml
```docker
version: '3'

services:
  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    volumes:
      - db_data:/var/lib/mysql
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8000:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - .:/var/www/html
  mailcatcher:
    image: schickling/mailcatcher
    ports:
      - "1080:1080"
      - "1025:1025"

volumes:
  db_data:
```

`db`コンテナと`wordpress`コンテナに関してはほとんどデフォルトのままです。重要なのは`mailcatcher`コンテナになります。docker側の設定はこれだけなのですが、設定画面でSMTPの設定をする必要があります。

## SMTPの設定

1. コンテナ起動。public_html階層で`docker-compose up -d --build`
2. `http://localhost:8000/wp-login.php`にアクセスして、適当な情報を入力して管理者としてログインします。]
3. プラグインからSMTP情報を簡単に設定できるプラグインをインストールします。今回は`WP Mail SMTP by WPForms`を使用します（鳥のマークのやつです）。
![スクリーンショット 2022-03-13 18.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473251/bf20f371-2063-dda7-199d-808ef6905792.png)

4. このプラグインを有効化するとサイドバーの下の方に、`WP Mail SMTP`と表示されるので、こちらをクリックして設定を進めます。
![スクリーンショット 2022-03-13 18.28.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473251/99ec6a83-0440-c478-25d7-d83d41d6bc93.png)

5. 設定ウィザードを起動します。
![スクリーンショット 2022-03-13 18.31.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473251/1734fdcd-999f-e2ba-98cb-148ebfe628fd.png)

6. （ステップ1の6）その他のSMTPを選択します。
![スクリーンショット 2022-03-13 18.34.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473251/45ef26d9-b121-98bc-ddf5-55aae2ed3f83.png)

7. （ステップ2の6）下記のように設定します。
- SMTPホスト：`mailcatcher`（docker-composeで設定したコンテナ名）
- SMTPポート：`1025`（docker-composeで設定した値）
- その他：任意→説明を読んで適宜設定してください。特に必要がなければデフォルトのままで大丈夫です。
![スクリーンショット 2022-03-13 18.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473251/391119df-56f2-9813-e6a3-0a971c5a6bc9.png)

8.（ステップ3~6の6）デフォルトの内容のまま進めます。ステップ6の6でメール送信テストを行うので、ここで成功することを確認できます。


## 参考
- [WP Mail SMTP by WPForms &#8211; WordPress プラグイン &#124; WordPress.org 日本語](https://ja.wordpress.org/plugins/wp-mail-smtp/)
RHEL 8.5にOSS版httpd 2.4.52をインストールする

# 概要
RHEL8 AppStreamのhttpdに未修正の脆弱性が存在するため
今回はソースからhttpdのOSS最新版をインストールした

# 前提

- RHEL 8.5
- httpd 2.4.52

# 必要パッケージのインストール

```
sudo dnf module install perl
sudo dnf install gcc gcc-c++ wget bison flex
sudo dnf install ncurses-devel libaio libaio-devel expat-devel  pcre-devel openssl-devel
```

# aprのインストール

```
sudo mkdir /usr/src/apr
cd /usr/src/apr
sudo wget https://dlcdn.apache.org//apr/apr-1.7.0.tar.gz
sudo tar zxvf apr-1.7.0.tar.gz
```

```
sudo vi ./configure
```
以下を修正

```diff
- $RM "$cfgfile"
+ $RM -f "$cfgfile"
```

その後
```
sudo ./configure --prefix=/usr/local/lib/apr-1.7.0
make
make install
```

# apr-utilのインストール

```
sudo mkdir /usr/src/apr-util
cd /usr/src/apr-util
sudo wget https://dlcdn.apache.org//apr/apr-util-1.6.1.tar.gz
sudo tar zxvf apr-util-1.6.1.tar.gz
sudo ./configure --prefix=/usr/local/lib/apr-util-1.6.1 --with-apr=/usr/local/lib/apr-1.7.0
make
make install
```

# httpdのインストール

ソースダウンロード & 展開

```
sudo mkdir /usr/src/httpd
cd /usr/src/httpd
sudo wget https://dlcdn.apache.org//httpd/httpd-2.4.52.tar.gz
sudo tar zxvf httpd-2.4.52.tar.gz
```

AppStreamのhttpdのsrpmから取得した設定をもとにconfigure実行

```
sudo ./configure \
        --prefix=/etc/httpd \
        --exec-prefix=/usr \
        --bindir=/usr/bin \
        --sbindir=/usr/sbin \
        --mandir=/usr/share/man \
        --libdir=/usr/lib64 \
        --sysconfdir=/etc/httpd/conf \
        --includedir=/usr/include/httpd \
        --libexecdir=/usr/lib64/httpd/modules \
        --datadir=/usr/share/httpd \
        --enable-layout=Fedora \
        --with-installbuilddir=/usr/lib64/httpd/build \
        --enable-mpms-shared=all \
        --with-apr=/usr/local/lib/apr-1.7.0 --with-apr-util=/usr/local/lib/apr-util-1.6.1 \
        --enable-suexec --with-suexec \
        --enable-suexec-capabilities \
        --with-suexec-caller=apache \
        --with-suexec-docroot=/var/www \
        --without-suexec-logfile \
        --with-suexec-syslog \
        --with-suexec-bin=/usr/sbin/suexec \
        --with-suexec-uidmin=1000 --with-suexec-gidmin=1000 \
        --with-brotli \
        --enable-pie \
        --with-pcre \
        --enable-mods-shared=all \
        --enable-ssl --with-ssl --disable-distcache \
        --enable-proxy --enable-proxy-fdpass \
        --enable-cache \
        --enable-disk-cache \
        --enable-cgid --enable-cgi \
        --enable-cgid-fdpassing \
        --enable-authn-anon --enable-authn-alias \
        --disable-imagemap --disable-file-cache \
        --disable-http2 \
        --disable-md
```

（差分は以下）
この設定があるためconfigureが完了しなかった&利用しないため無効化した
```diff
- --enable-ldap --enable-authnz-ldap \
```

インストール実行

```
sudo make
sudo make install
```

# 次

[RHEL 8.5にOSS版httpd 2.4.52をインストールする(2)](https://qiita.com/yakkawa/items/5581cab77871807594a5)
ブロックチェーン開発(bitcoin core v0.14.2)のための環境構築とソースコンパイル作業メモ

## :monorail: この記事の目的

本記事は令和4年3月に執筆しています。
以下のソフトウェア・バージョンでブロックチェーンの開発環境を作ります。
　ubuntu：16.04
　bitcoin core v0.14.2

この環境は、下部に引用の書籍「ブロックチェーン・プログラミング　仮想通貨入門」に基づくものとなります。

## :monorail: OSの準備

OSとして、**Ubuntu 16.04 64bit**を使用します。

## :monorail: bitcoin coreインストール手順

本記事では詳細な解説は割愛し、実行したコマンドを順にメモとして記しておきます。

```ruby:bitcoin
# Ubuntuアップデート
sudo apt update
sudo apt upgrade

# コンパイル用ライブラリ
sudo apt install -y build-essential libtool autotools-dev automake pkg-config libevent-dev

# BerkeleyDBインストール
sudo add-apt-repository ppa:bitcoin/bitcoin
sudo apt update
sudo apt install -y libdb4.8-dev libdb4.8++-dev

# GCC(gcc,g++)バージョンを9に更新
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install -y g++-9-multilib
sudo ln -sf /usr/bin/g++-9 /usr/bin/g++
sudo ln -sf /usr/bin/gcc-9 /usr/bin/gcc

# boostインストール(ソースのダウンロードとインストールの実行)
# Download URL = https://www.boost.org/users/history/version_1_64_0.html
cd
wget https://boostorg.jfrog.io/artifactory/main/release/1.64.0/source/boost_1_64_0.tar.gz
tar -xvf boost_1_64_0.tar.gz
cd boost_1_64_0
./bootstrap.sh
./b2

# BOOST_ROOT設定(.bashrcファイルにBOOST_ROOTを追記)
cd
vi .bashrc
export BOOST_ROOT=/home/(ユーザ名)/boost_1_64_0
source .bashrc

# bitcoin coreソース取得
cd
git clone https://github.com/bitcoin/bitcoin.git
cd bitcoin
git checkout -b v0.14.2

# bitcoin coreインストール
./autogen.sh
./configure
make
sudo make install

# bitcoin coreインストール結果確認
which bitcoind
which bitcoin-cli
```

以上でインストールが完了です。

## :monorail: Rubyとその関連ソフトのインストール

本書では、Ruby2.4を使用します。
また、SQLiteやgemなどの関連ソフトもインストールするため、この手順も確認します。

```ruby:bitcoin
# ruby2.4インストール
sudo apt-add-repository ppa:brightbox/ruby-ng
sudo apt-get update
sudo apt-get install -y ruby2.4 ruby2.4-dev
# インストール結果確認
ruby2.4 -v

# rakeモジュールのインストール
sudo gem install rake

# SQLiteのインストール
sudo apt install -y libsqlite3-dev

# gemのインストール
sudo gem install openassets-ruby
```

以上でインストールが完了です。

## :monorail: 出典

■参考書
「ブロックチェーン・プログラミング　仮想通貨入門」
著：山崎重一郎,安土茂亨,田中俊太郎／講談社
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/559bcb2f-c509-b57b-8341-e0656c94db53.png)


## :monorail: ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。
Node.jsでのReact環境構築

Node.jsからReactのサンプルページの表示までの一連の環境構築のメモ。


# Node.jsインストール

下記サイトからNode.jsをインストールする。
https://nodejs.org/ja/download/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516848/ef9f8c44-2c85-223d-9a3a-dec30321967b.png)

基本デフォルトですべて「next」でインストールまで進む。

インストールされたNode.jsバージョンを確認。
```
node -v
```
※作者がインストール時では、v16.14.0 (2022/03/14時点)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516848/913009fc-d12c-b136-7f48-02f0778b85b6.png)
これより新しいバージョンだったらうれしい。

# Yarnインストール
YarnはReact用のサーバを立てる(アプリを起動する)際に使用する。
以下のコマンドを実行。
```
npm i -g yarn
```

インストールされたyarnのバージョンを確認。
これでyarnが正常にインストールされている、パスが通っているかを確認する。
```
yarn --v
```
※作者がインストール時は1.22.17

yarnのPATHが通っていない場合、以下の文言が出る。(windowsの場合)
```
'yarn'は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```
この場合、PATHを通しましょう
まずはWindowsの検索から「環境変数」と入力すると、以下の「環境変数を編集する」が候補に出るので開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516848/c82d8182-f56f-262d-a084-0670fd79057b.png)

環境変数の入力画面が表示されたら、〇〇のユーザ環境変数(U)のPATHを選択状態にする。その後、編集ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516848/60c5a145-a985-4f54-23c4-24a7e6cc687f.png)

環境変数名の編集ウィンドウが表示されたら、
①新規ボタンをクリック
②セルが編集状態になるので、C:/Users/『ユーザ名』/.npm-global/node_modules/yarn/binを指定する。
③OKボタンをクリックしたら完了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516848/6173096f-e575-2001-97b6-4668b5ea05c3.png)

ここまで来たら、再度yarnのバージョンを確認。
```
yarn --v
```


# Create React Appのインストール
任意の名称でReactプロジェクトを作成する。（ディレクトリは好きなところでやってね）
```
npx create-react-app 〇〇
```
上で作成したプロジェクト名のフォルダができるので、ディレクトリ移動
```
cd 〇〇
```

作成したアプリを起動
```
yarn start
```

以下の画面が表示されたら、とりあえず環境構築は完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516848/f7fe668c-1571-5e8d-3cd6-a3b46700169b.png)
Pandasのバージョン1.4以降でDataFrameにSeriesを追記したいときの対処法: SeriesをDataFrameにしてしまえ

# はじめに/結論

2022年1月、Pandasのバージョンが、1.3.xから1.4へと上がった。それにともない、`DataFrame.append()` が非推奨となった。使うと次のような警告が出る:

> FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.

`DataFrame.append()` は将来的に廃止されるため、代わりに`pandas.concat()`を使おう、という警告である。

DataFrame `df` の列名（columns）と同じindexを持つSeries `sr` を追記していくために、`df = df.append(sr, ignore_index=True)` みたいに書いていたのでちょっと困った。

まあでも、`df = pd.concat([df, sr])], ignore_index=True)` と書き換えれば連結されるんでしょう、と思ったら、想定とちょっと違う挙動だった。

結論を言うと、Series `sr` をDataFrameに変換することで解決した。こんな感じ: `df = pd.concat([df, pd.DataFrame([sr])], ignore_index=True)`

# `df = pd.concat([df, sr])])` だとこうなる

```Python3
import pandas as pd

df = pd.DataFrame(
    data={'名前': ['りんご', 'なし', 'ぶどう'], 
          '数量': [10, 20, 30],
          '単価': [100, 200, 300]}
)
```
`df`:
|  | 名前 | 数量 | 単価 |
|:-:|:-:|:-:|:-:|
|0|りんご|10|100|
|1|なし|20|200|
|2|ぶどう|30|300|

ここにこうしてみても、

```Python3
sr = pd.Series(data=['ライチ', 40, 400], index=["名前", "数量", "単価"])
df = pd.concat([df, sr], ignore_index=True)
```

`df`:

|  | 名前 | 数量 | 単価 | 0 |
|:-:|:-:|:-:|:-:|:-:|
|0|りんご|10|100|NaN
|1|なし|20|200|NaN
|2|ぶどう|30|300|NaN
|名前|NaN|NaN|NaN|ライチ
|数量|NaN|NaN|NaN|40
|単価|NaN|NaN|NaN|400

こうなってしまう。
Seriesのindexが、DataFrameのindex（**行**のラベル）と結びついてしまうためだ。元のDataFrameのindexは`0,1,2`であり、追加しようとしたSereisのindexは`名前・数量・単価`なので新しい行を作るしかないということだ。行き場を失った`sr`は、`df`の新たな**列**（ラベルは0）として連結される。

これはもう問答無用でSeriesをDataFrameに変換してしまってから`pd.concat()`すればいいのかなと思ったらうまく行った。しかも`DataFrame.append()`を使っていたときより高速に動くようになった。

```Python3
df = pd.concat([df, pd.DataFrame([sr])], ignore_index=True)
```

`df`:
|  | 名前 | 数量 | 単価 |
|:-:|:-:|:-:|:-:|
|0|りんご|10|100|
|1|なし|20|200|
|2|ぶどう|30|300|
|3|ライチ|40|400|

（pandasに精通しているわけではないので、もっといいやり方はあるかも知れません）
Laravel8以降でModelをjson化するときにaccessorにしてるプロパティを含めたいときの件

## はじめに

LaravelでModelといえばDBと一対一になってることが多いと思うんですが、たまにDBのテーブルのカラムにはないものを出力したいときってありますよね。
例えば住所とか顕著ですかね。

かんたんに一例としてこんな感じの `users` テーブルがあったとします。

|物理名|論理名|型|
|---|---|---|
|id|ID|bigint(auto_increment)|
|name|名前|varchar|
|zip_code|郵便番号|varchar|
|prefecture|県名|varchar|
|city|市町村名|varchar|
|address|番地|varchar|

それに対応する class はこんな感じだったりするわけじゃないですか。

```php:App/Models/User.php
namespace App\Models;

class User extends Authenticatable
{

}
```

そこで、住所を全部表示させるときにbladeなんかにこういう書き方するじゃないですか。

```php
<p>住所: 〒{{ $user->zip_code }}{{ $user->prefecture }}{{ $user->city }}{{ $user->address }}</p>
```

これが1箇所ならまあ別にいいかなって思うんですが、複数出てくると指がつったりしますよね。
そんなときに accessor という便利テクをLaravelではよく使うことがあります。
DBにはないカラムをさもあるかのように出力させるやつですね。
これはModelに `get{架空のカラム名}Attribute()` っていうメソッドを追加してやることで実現します。
今回は住所全部なので `getFullAddressAttribute()` っていうメソッドを作ることにします。

```php:App/Models/User.php
namespace App\Models;

class User extends Authenticatable
{
    public function getFullAddressAttribute(): string
    {
        return $this->zip_code . $this->prefecture . $this->city . $this->address;
    }
}
```

で、実際bladeに記述するときに

```php
<p>住所: 〒{{ $user->full_address }}</p>
```

ってやるとうまくいくってやつです。みんなよく知っていると思います。

ただこれ、vueコンポーネントのpropsに

```php
<div id="app">
    <User
        users="@json($model)"
    />
</div>
```

みたいに雑に渡したいときとかに**うまくいきません**。まあそりゃ存在しないカラムですもんね。
ただ、accessorもさも普通にあるカラムのように渡してーなーって思うのが人情ってやつですよね。

## 力技でなんとかするパターン

bladeテンプレートに渡す前にModelをループしてねじ込むという方法があります。

```php
$users = User::all();
if($users->count() > 0){
    foreach($users as $k => $u){
        $users[$key]->full_address = $u->full_address;
    }
}
```

これでできはするけど……んーーーー、もやもやしますね。

## toArrayメソッドをオーバーライドしてどうにかするパターン

いにしえのQiita記事にはこんなのありました。

https://qiita.com/hokutoasari/items/c7390c524901d5b7b2d9

こちらはModel側のtoArray()メソッドをオーバーライドする一工夫入れるやつです。

```php:App/Models/User.php
namespace App\Models;

class User extends Authenticatable
{
    public function getFullAddressAttribute(): string
    {
        return $this->zip_code . $this->prefecture . $this->city . $this->address;
    }

    public function toArray()
    {
        return array_merge(parent::toArray(), ['full_address' => $this->full_address]);
    }
}
```

なるほど……とはいえ、こんないかにも普段遣いしたいような機構をFW側で実装してないなんてないよなあ……って気持ちにもなります。

## ドキュメントをちゃんと読め

まあ、ドキュメントちゃんと読むと書いてあるんですよね。
https://readouble.com/laravel/8.x/ja/eloquent-serialization.html#appending-values-to-json

> アクセサを作成したら、モデルのappendsプロパティに属性名を追加します。

appends......!?

```php:App/Models/User.php
namespace App\Models;

class User extends Authenticatable
{
    $appends = [
        'full_address'
    ];

    public function getFullAddressAttribute(): string
    {
        return $this->zip_code . $this->prefecture . $this->city . $this->address;
    }
}
```

なんとこれだけでいいのです！
どうもこれ、ドキュメント遡るとLaravel5.1の頃からあった機能のようです。
くっそー、知らんかった！　このページ穴が空くほど呼んでたつもりだったのに！

## おわりに

まー、Laravelにはまだまだ知らない（気づいてない？）機能が色々ありそうですね！
なんかまた思いついたり見つけたりしたら投稿します！
Java インタフェースにおける変数

Oracle Certified Java Programmer, Gold SE 11の勉強をしていると、インタフェースの仕様をよく間違えるのでまとめておきます。
今回は変数編です。
## インタフェースにおける変数
どのバージョンのJavaでもインタフェースは`publi static final`な定数を宣言することができます。
`publi static final`な変数以外は許可されていない、つまり変数を定義した場合`publi static final`以外は有り得ないので、アクセス修飾子を省略しても、暗黙的に`publi static final`が付与されます。
`final`な定数なので、宣言時に初期化しなけれなりません。

```Java: 変数
public interface Calc {

    double PI = 3.14; // 暗黙的にpublic static finalが付与されます
    // private double PI = 3.14; publicでないのでコンパイルエラーです
    // double PI; 初期化されていないのでコンパイルエラーです
    default void setPi(double pi) {
        // PI = pi; 暗黙的にfinalで就職されており、値の再代入は許可されていないのでコンパイルエラーです
    }

}
```
### 継承
親インタフェースで宣言した定数と同名の定数を子インタフェースで宣言できます。
また、インタフェースで宣言した定数と同名の変数を実装クラスで宣言できます。
```Java: 親インタフェース
public interface SuperCalc {
    double PI = 3.00;
}
```
```Java: 子インタフェース
public interface Calc {
    double PI = 3.14;
}
```
```Java: 実装クラス1
public class CalcImpl1 implements Calc {
        public static void main(String... args) {
         System.out.println(PI); // 3.14 直接実現しているインタフェースのPIが出力されます
         System.out.println(SuperCalc.PI); // 3 親インタフェースの定数にアクセスするときはインタフェースのFQCN.定数名でアクセスします
    }

}
```
```Java: 実装クラス2
public class CalcImpl2 implements Calc {
    static double PI = 3.1415;

    public static void main(String... args) {
        System.out.println(PI); // 3.1415 実装クラスにstatic変数があるときは実装クラスの変数の値が出力されます
        System.out.println(PI); // 3.14 直接実現しているインタフェースの定数にアクセスするときはインタフェースのFQCN.定数名でアクセスします
        System.out.println(SuperCalc.PI); // 3 親インタフェースの定数にアクセスするときはインタフェースのFQCN.定数名でアクセスします
    }

}
```
【Docker】Docker Compose基本コマンド一覧

## はじめに
　本記事は、プログラミング初学者、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## Docker Compose基本コマンド一覧

```
コンテナを作成して起動する
$ docker-compose up
 // バックグラウンドで実行
  $ docker-compose up -d
 // 起動まえにイメージを作成
  $ docker-compose up -build


サービス起動(既にコンテナがある状態で)
$ docker-compose start


コンテナ停止（コンテナ・ネットワーク削除）
$ docker-compose down
 // イメージも削除
  $ docker-compose down –rmi all


サービス停止
$ docker-compose stop


コンテナ再起動
$ docker-compose restart


コンテナへのログイン
$ docker-compose exec [サービス名] [コマンド]
 e.g.
 $ docker-compose exec web bash


起動中コンテナ一覧表示
$ docker-compose ps

ログの表示
$ docker-compose logs

コンテナ内でコマンドを実行
docker-compose exec web /bin/bash

修正を反映させる
// buildし直して
$ docker-compose build
// 起動する
$ docker-compose up -d



```
WSL2に「ubuntu 20.04 LTS」をインストール後に更新できない場合

- sudo apt updateを実行時に
発生したエラー「Temporary failure resolving 'archive.ubuntu.com'」を回避する方法

１．下記の２行を/etc/wsl.confに追加する
```
[network]
generateResolvConf = false
```
２．/etc/resolv.confに下記の１行を追加する（DNSサーバー）
```
sudo sh -c "echo 'nameserver 8.8.8.8' > /etc/resolv.conf"
```
３．ping 8.8.8.8を通らない場合下記のコマンドをpowershellに実行する
```
Get-NetIPInterface -InterfaceAlias "vEthernet (WSL)" | Set-NetIPInterface -InterfaceMetric 1
Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000
```

追記：GUI化しましたが毎回「リモート デスクトップ接続」で接続時に黒の画面になるため下記のコマンドを実行必要です。（[参考記事](https://qiita.com/atomyah/items/887a5185ec9a8206c7c4)）
```
wsl --shutdown
sudo /etc/init.d/xrdp start
```
三菱電機　J4サーボ　シンプルモーションユニットQD77MS設定

仕方ないのかもしれんが[ユーザーズマニュアル](https://dl.mitsubishielectric.co.jp/dl/fa/members/document/manual/ssc/ib0300184/ib0300184h.pdf)が998ページはとっさに読めない。
必要そうな箇所の抜粋。
ひとつ前のシリーズなのでもう使うことはないと思うが念のため記録。
[J5はこっち。](https://qiita.com/ki_kifa/items/a317422981e9ace2fc85?utm_campaign=post_article&utm_medium=twitter&utm_source=twitter_share)

- バッファメモリのコメントを一括読み出し
グローバルデバイスコメントを開いた状態で編集→サンプルコメントの流用→インテリジェント機能ユニット
先頭XYアドレスを選択。

- サーボON許可、前進端、後退端、サーボ非常停止などの信号について
サーボアンプCN3や位置決めユニットQD77に繋ぐ方法もあるが、PLCの汎用入力をバッファメモリ経由で利用すれば専用端子台とケーブルが省略できる。
詳細パラメータ1
Pr80 外部信号選択　2:QD77MSのバッファメモリを使用
Pr82 緊急停止有効/無効　1:無効　サーボアンプCN3無効（2000で有効。
PA04 機能選択A-1　2100　シンプルモーションユニット無効。
U*￥1928+100nに各種信号のビットを入れる。マニュアル5 - 143参照

- JOG運転
U*￥1518+100nに速度設定(mm/min)　マニュアル5 - 155参照
Y08+2nで正転、Y09+2nで逆転


- 専用命令ZP.PSTRT1　マニュアル15章参照
ZP.PSTRT1 Un D0 M0
D0:システム領域で使用禁止
D1:エラーコード　正常で0　読み出しのみ可
D2:位置決めパターン番号　原点サーチはK9001
M0:完了(1スキャンのみ)
M1:異常完了

- 位置決めデータ　マニュアル5 - 76参照
2004＋6000n+10J 指令速度 BIN32
2006＋6000n+10J アドレス/移動量 BIN32
2008＋6000n+10J 円弧アドレス BIN32

- タッチパネル表示すべきバッファメモリ
G800+100n 現在値(0.1μm 符号付きBIN32
G818+100n 目標値(0.1μm 符号付きBIN32
G820+100n 速度(mm/min 符号付きBIN32
G854+100n 回転数(0.1r/min 符号付きBIN32
G856+100n 電流値(0.1% 符号付きBIN16
G880+100n ピーク負荷(0.1% 符号付きBIN16
G806+100n エラー番号 符号無しBIN16

- 基本パラメータ1の算出ウィンドウについて
自動算出するとものすごい数が入るが、ボールねじリードやピニオン径とパルス量の最小公倍数をとっているだけで比率は正しいらしい。0.1μmの精度を求めないなら1回転あたりの移動量(リード)を直接入れたほうが後から見やすい。
HG-MR/SRなどの標準モーターなら1回転あたりのパルスは4194304 pulse/r (デフォルト値)で良い。

- 制御方式について
01h ABS直線　指定した座標まで移動。一番よく使う。
02h INC直線　指定した距離分移動。定ピッチ送り。
03h 定寸送り　現在値を0にした後、指定した距離移動。タイミングベルトとか。

- サーボアンプのディップスイッチは1軸：0　2軸：1
うっかりずれる。これわかりにくいと思う。

- サーボパラメータ→リスト表示、基本設定
PA03　絶対位置検出システム　0001　切った時に現在値を覚えておく設定
PA21　機能選択A-3　1に変更。0だと原点復帰の前にZ相を通過する必要あり。インクリメンタルエンコーダーの名残だと思う。

- ハウリングしたら
サーボパラメータ→リスト表示→ゲイン・フィルタ設定のPB01アダプティブチューニングの該当軸を0001にする。
PB13機械共振抑制フィルタに値が入る。

デバイス番号は8軸までに準拠。16軸の場合はマニュアルを参照する。
［Twitter］Twitterのツイートアナリティクスについて

色々知っておくといいかなと思ってまとめておきます

# はじめに
Twitterのツイートアナリティクスについて
あまり知らないよという人にまとめておきました。

![名称未設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/96a3d78f-7f13-4b2d-f10d-df9a4e59ddd6.png)

上記の赤枠のマークを調べる

## インプレッション数
> このツイートがTwitterで表示された回数

インプレッションは、ユーザーがTwitterで､このツイートを見た回数のことです。 WEBサイトで言えばPVと同じ感じようなものです。

ユーザーがどれくらいこのツイートに対してツイートを表示してくれたかどうかに判断できますね。

## エンゲージメント
> ユーザーがツイートに反応した合計回数。ツイートのクリック（ハッシュタグ、リンク、プロフィール画像、ユーザー名、ツイートの詳細表示のクリックを含む)、リツイート、返信、フォロー、いいねを含みます。

エンゲージメントは、ユーザーがTwitterで､このツイートに反応した回数のことです。 WEBサイトならば、クリック回数に近いものです。

ユーザーがどれくらいこのツイートに対して反応したかどうかに判断できますね。

## 詳細のクリック数
> ユーザーがこのツイートを詳細表示した回数

詳細のクリック数は、ユーザーがTwitterで､このツイートに対してツイートをクリックして詳細画面を表示した回数のことです。WEBサイトならば、クリックした数です。ただ、画像や動画、リンク等ツイート内容のクリック数は関係がないようです。

ユーザーがどれくらい自分の投稿に興味を持ってくれたのかどうかに判断できますね。

## 新しいフォロワー数
> このツイートから直接獲得したフォロー数

新しいフォロワー数は、ユーザーがTwitterで､このツイートから新しいフォロワーを獲得したことです。WEBサイトならば、お気に入りに登録してくれたものです。

ユーザーがどれくらいこのツイートに対してフォローしてくれたかどうかに判断できますね。

## プロフィールへのアクセス数
> このツイートからのプロフィール閲覧回数

プロフィールへのアクセス数は、ユーザーがTwitterで､このツイートからプロフィールを表示してくれた回数のことです。WEBサイトならば、aboutなどのプロフィールの画面を表示した回数です。

ユーザーがどれくらいこのツイートに対して、プロフィールを表示してくれたかどうかに判断できますね。

# 終わりに
今更だけでも詳細を見てみてさらに言葉を整えてみました。時間帯や表示の期間によって値が変わってくると思います。広告の業界では、期間を決めて、どのくらいアクセスしたのかを効果測定（広告の目的がどの程度達成されたか測定すること）といいます。

Twitterで目的を持って投稿したりしてみるとより楽しくツイートができたりします。時間帯や時期によって変化したりするので、さまざまな効果測定をしてみて、目的達成目指してみてください。


---

## 関連記事

https://qiita.com/sunstripe2011/items/4a0cd2af126b4f1a91b6

https://qiita.com/sunstripe2011/items/dc097e4b7057fa90d8e0

---


---

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１ WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中!!)

緩募


### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/
AWSとストレージサービスS3について

はじめに
-
「AWS」という言葉を見聞きしない日はない。
エンジニアの方々は「AWSにより大きな変化がもたらされた」と言う。
これはもう、「AWSの特徴を自分の言葉で説明する力が必要だ！」と思い、今回の記事のテーマに選びました。

「今ごろAWS解説かよっ」「初学者乙」と呆れられそうですが、小さな一歩から進んでいきたい。変化を恐れちゃいけない。進み続けなければならない。エンジニアとして、自分の夢を叶えたい。・・・・つべこべ言わず始めます笑。

AWSが革命と言われる所以は？
-
　クラウドが誕生する以前、企業は自社でサーバーを購入して用意していた。（オンプレミス環境）

　しかし、このオンプレミス環境では、時期によってサーバーにかかる負荷が違うため、無駄が多い。
業界によって、企業によって、サーバーへの負担が大きくなる時期とそうでない時期が来る。
リソースを拡大したり縮小したりと、時期や環境に大きく振り回され、毎回頭を悩ませるなんて無駄が多い。

　この問題を解決できるのがクラウドサービス❗️
そして、その革命であるのがAWS。

　AWSは、`「使った分だけ支払う」という従量課金制`により、オンプレミス環境の問題を解決した。

:::note info
AWSの凄さは？
⇨
　AWSというクラウドサービスが誕生する以前は、企業は自社でサーバーを購入して用意していた（オンプレミス環境）。しかし、この環境では、リソースの拡大縮小が時期や環境により大きく振り回され、無駄が多いと言う問題を抱えた。そこでAWSは、「リソースを使った分だけ支払う」と言う従量課金制のクラウドサービスとしてリリースされ、オンプレミス環境の問題を解決した。
:::

AWSとは？
-
　AWSとは、「Amazon Web Services」の略。
　2006年から、Amazonが提供しているクラウドサービスで、サーバやストレージ、データベースなどをインターネット経由で利用することができる。

AWSをなぜ使用するのか？
-
　Facebook等のWebアプリケーションでは、毎日たくさんのユーザーが写真や動画をアップロードする。そして、画像や動画などのデータはユーザーがいつでも見返すことができるように蓄積される。

　したがって、サービス側はその大量のデータを`安全`にそして`長期的`に保存しておく必要がある。インターネットの世界で、オンライン上の倉庫のような仕組みを利用し、大量のデータを、`安全`かつ`長期的`に保管している。このようなデータを保存するサービスを「ストレージサービス」と言う。

:::note info
AWSをなぜ使用する？
⇨
AWSとは、Amazonが提供するクラウドサービスで、サーバやストレージ、データベースなどをインターネット経由で利用することができる。
例えば「ストレージサービス」としては、インターネットの世界で、大量のデータを、安全かつ長期的に保管することを可能にする。
:::

Herokuを利用した際にストレージを使う必要がある？
-
YES！
　理由は、Herokuを利用してデプロイまたは再起動をすると、その度に、ユーザがアップロードした画像データは消えてしまうから。

　ストレージサービスを使う前は、アップロードされた画像はアプリケーションのディレクトリに保存されていた。しかし、アプリがデプロイ又は再起動（24時間に1回自動で行われる）される度に、ユーザーがアップロードした画像データは、消えてしまうという問題が発生！！！
そこで、ストレージサービスを利用することで、画像を長期的に保存することができるようになる。

　ストレージサービスには様々な種類があるが、今回は「AWS」が提供している「S3」というサービスを解説する。


:::note info
Herokuを利用した際になぜAWSを使用する？
⇨
　アプリがデプロイ又は再起動（24時間に1回自動で行われる）されると、その度に、ユーザーがアップロードした画像データは、消えてしまうという問題がある。そこで、AWSのストレージサービスを利用することで、画像を長期的に保存することができるようになる。
:::

Amazon S3とは？
-
Amazon Simple Storage Service (S3)は、AWSが提供するオブジェクトストレージサービス。

　オブジェクトストレージとは、従来のファイルストレージのようなディレクトリ構造は持たず、オブジェクトキーによりデータを一意に特定してデータの出し入れをして管理を行うストレージ。テキストデータ、動画、音声ファイルといった、構造情報を持たないさまざまな種類のデータを格納できる。

Amazon S3の特徴は？
-
・オブジェクト数やデータ容量の制限なし
・高い耐久性：データセンター障害に耐えられる
・低コスト

●バケット
　オブジェクト（データ）を保存する場所のこと。ユーザは作成したバケットにオブジェクトを格納する。

●オブジェクト
　バケットに格納されるデータ本体。バケット内のオブジェクト数は無制限に保存できるが、1オブジェクトの最大サイズは5TBまでという制約がある。

:::note info
AWS S3 の特徴は？
⇨
　S3は、AWSが提供するオブジェクトストレージサービスの一つである。
オブジェクトストレージとは、オブジェクトキーによりデータを一意に特定してデータの出し入れをして管理を行うストレージで、テキストデータ、動画、音声ファイルといった、構造情報を持たないさまざまな種類のデータを格納できるのが特徴である。
:::

S3導入の流れ
-
①	S3で保存先を作成
②	ローカル環境にて、S3に保存する処理の記述
（GitHubのコード管理などで、セキュリティ対策必須）
③	本番環境に反映させる

まとめ　
-
:::note alert
AWSとは何？
⇨
AWSとは、Amazonが提供するクラウドサービスで、サーバやストレージ、データベースなどをインターネット経由で利用することを可能にする。
例えば「ストレージサービス」としては、インターネットの世界で、大量のデータを、安全かつ長期的に保管することを可能にする。ストレージサービスとして、AWSのS3がある。
　S3は、AWSが提供するオブジェクトストレージサービスの一つで、オブジェクトキーによりデータを一意に特定してデータの出し入れをして管理を行うストレージで、テキストデータ、動画、音声ファイルといった、構造情報を持たないさまざまな種類のデータを格納できるのが特徴である。
:::

参考文献
-
「Amazon S3とは何か？」：https://www.sbbit.jp/article/cont1/58205#head1
「【革命】AWSって何？」：https://meideru.com/archives/3871#i
Unityを使ってClusterワールドを作る学習過程

## この記事は何？

ClusterGameJam2022Springを見てワールド制作したくなった
学習したことを忘れないようにその学習過程を記録するための記事

## GameJamまで

https://creator.cluster.mu/2020/03/30/howto-item-create/

https://creator.cluster.mu/2020/06/11/howto_shootinggame/

- 弾が横に出るときは、弾が出る場所を指すオブジェクトのRotationを弄る

https://creator.cluster.mu/2022/03/10/warpgimmick/

https://creator.cluster.mu/2022/03/11/jump-per-player/

https://creator.cluster.mu/2022/03/08/vins-logic-main/


Cluster Game Jam in Summer2021で受賞された作品を遊んだ
- 中毒性の高い
- 明確なゴールがある
- ルールが分かりやすい
- ゴールに写真スポットがある
- ゲーム性or見た目のどちらかは特化
- 一人でも遊べるけど、協力・競争が出来る

こんな感じの傾向があった


## ClusterGAMEJAM2022inSpringのワールド完成しました！(2022/03/20)

https://cluster.mu/w/012b13de-153b-4c46-a109-b832ef13c726

### 「欠ける」×「駆ける」×「架ける」
お題の『欠けた』文字を探しに『駆けて』橋を『架ける』ゲームです！

### 感想

※書きなぐってるので読みにくいです。

GameJamが始まる前に一日Unityでのワールド制作に触っただけなので色々苦戦しました。
文字の3Dモデルを作るために軽くBlenderに触りました。(まさか触るのがこのタイミングとは)
ノーコードで制作できるのは楽な点もあれば、変数に当たるものがゴチャゴチャになるのでスクリプトが書きたくなることも…。
初めてのゲームジャムだったので、48時間の時間配分が分からなかったです。
1日目：アイデアソン&ブラッシュアップ
2日目：開発、9割完成
3日目：デバッグ、サムネ、説明文、ロゴなど
という時間配分がよさげだと思いました。
今回は相方のゴリラが説明文とサムネ撮影、デバッグしてくれたので開発に集中できました。
48時間は結構あるので無理しない、焦らないが大事だと思いました。
初めてのチーム開発だったので、アイデアの変更を口にしないと共有できない当たり前のことが出来ていないことに気づきました。
初めて3Dモデルのアセットを使用したけど、アセットの強さを感じました。配置するだけでもクオリティが上がるのを感じました。また、差し替えが出来るように開発するのも大事だと感じました。
今まで2Dばっかで3Dを触るのはほぼ初めてなのでUnityの操作に苦労しました。
でも、キャラクター制御のことを考えなくていいので、その点3Dの入門にいいと思いました。


### 使用アセット
- Low Poly Fence Pack
- RPG Poly Pack - Lite
- Skybox Series Free
Game of PODsやってみた(Bravo)

## 背景
この[記事](https://tech-blog.cloud-config.jp/2021-12-09-game-of-pods/)を読んで、単純に面白そう、k8sのスキルアップにつながるかと思ったので

## 方法
ローカルでマニフェスト記述->kuztomizeでビルド、という方法でマニフェストを作成

https://github.com/msasaki666/game-of-pods/tree/main/bravo

## 感想
やってよかったと思う
難易度は高くないながら、単純に１つのクラスターを実際に構築するので、楽しみながら経験を積めたと思う