OmniAICreator/Qiita-1.07M huggingface dataset:
イラストAIの話し

テクニカルな記事を書こうとして毎回失敗しているこっぱんです。
実は今回は紹介記事なので、多分最後まで書き切れると思います。

実はにじジャーニーについてのご紹介なのですが、今話題のイラストAIだそうです。

ミッドジャー二ーは有名ですが、その関連のサービスみたいです。二次元版に特化しているサービスです。

現在はベータ版(2022年11月28日現在)ですが、いつかサービスが開始されるかもしれません。

他のサービスだと
Stable Diffusion
Novel AI
などはTwitterで画像を見かけるのですが、なかなかアニメ絵に特化しているなと思いました。

実は自分は漫画動画を作りたいと思っており、原画の資料に使いたいと思っています。

その為にイラストAIに助けを借りたいと思っていますが、著作権とか有料サービスはまだグレーのようです。

今回はにじジャーニーというサービスですが、イラストを手掛けている方やエンタメ関連の方は、このようなサービスを利用する方が

多いのではないでしょうか。

というサービスがあるのを今回ご紹介しました。サービスの比較の記事は、また縁があればするかもしれませんのでよろしくお願いしま
す。
【SwiftUI】iOS16で追加されたTableを使ってみた

# はじめに
iOS16でTableとTableColumnという機能が追加されていました。
気になったので使ってみました。

# 完成形
![simulator_screenshot_49C9D741-D7CB-4689-A43A-09F424546461.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a8f4a4be-793e-ebfb-b724-5f3d3259a7d8.png)

# 今回使用するModel
```swift
struct SoccerPlayer: Identifiable {
    let id = UUID()
    let name: String
    let age: Int
    let position: SoccerPosition
}

enum SoccerPosition: String {
    case gk = "GK"
    case df = "DF"
    case mf = "MF"
    case fw = "FW"
}
```

# 今回使用するデータ
```swift
let players: [SoccerPlayer] = [
    .init(name: "メッシ", age: 35, position: .fw),
    .init(name: "エンバペ", age: 23, position: .fw),
    .init(name: "ネイマール", age: 30, position: .fw),
    .init(name: "ハリー・ケイン", age: 29, position: .fw),
    .init(name: "レヴァンドフスキ", age: 34, position: .fw),
    .init(name: "モドリッチ", age: 37, position: .mf),
    .init(name: "ロナウド", age: 37, position: .fw),
    .init(name: "スアレス", age: 35, position: .fw),
    .init(name: "ノイアー", age: 36, position: .gk),
    .init(name: "ペドリ", age: 20, position: .mf),
    .init(name: "エリクセン", age: 30, position: .mf)
]
```

# 実装
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        Table(players) {
            TableColumn("name") { player in
                Text(player.name)
            }
            TableColumn("age") { player in
                Text("\(player.age)")
            }
            TableColumn("position") { player in
                Text(player.position.rawValue)
            }
        }
    }
}
```

# おわり
iPhoneではListのplainスタイルっぽい表示になります。
[tableStyle](https://developer.apple.com/documentation/swiftui/view/tablestyle(_:))というメソッドがありましたが、
まだスタイルはなかったのでこれからということになりそうです。

iPadとMacで機能するみたいです。
iPhoneでは使えなさそうかな？
[Flutter]Androidのアイコンをちょうど良くするコツ

#### `flutter_launcher_icons`を使用してアイコンを作成したときに　「あれ？ iOSのアイコンはちょうどいいのに、Androidだけ変だな」と思うことがあると思います。

# 初めに

アイコン生成の方法については、以下のサイトを参考にしてください。
https://pub.dev/packages/flutter_launcher_icons


今回はFigmaを使用して画像を用意しました。

![](https://storage.googleapis.com/zenn-user-upload/25b1a542c71b-20221105.png)


ファイル構造は以下になります。

```
assets
 --icon
   --android_icon.png
   --icon.png
```

`pubspec.yaml`内の記載は以下になります。

```
dependencies:
  flutter:
    sdk: flutter
    flutter_launcher_icons: ^0.10.0
    
flutter_icons:
  android: true
  ios: true
  remove_alpha_ios: true
  image_path: "assets/icon/icon.png"
  min_sdk_android: 21
  adaptive_icon_background: '#FFF422'
  adaptive_icon_foreground: 'assets/icon/android_icon.png'

```


画像を出してみるとこんな感じです。


| iOS |  Android  | 
| ---- | ---- | 
|  ![](https://storage.googleapis.com/zenn-user-upload/88d5d7d23f37-20221105.png)  | ![](https://storage.googleapis.com/zenn-user-upload/224e63b1ee26-20221105.png) | 


iOSはうまくいったぞ！あれ？Androidはなんか大きくね？なんでだこれとなりました。
では具体的にどう対応したかを話していこうと思います。
僕は、Figmaで調整することでちょうど良くなりました。


# figma上で画像を設定してみました。

アイコンの枠が335pxに対して、キャラクターのサイズを１５０x１５０pxにしてみたところちょうどよくアイコンを生成することができました。

![](https://storage.googleapis.com/zenn-user-upload/b559b4e21fe5-20221105.png)




| iOS |  Android  | 
| ---- | ---- | 
|  ![](https://storage.googleapis.com/zenn-user-upload/88d5d7d23f37-20221105.png)  | ![](https://storage.googleapis.com/zenn-user-upload/7782ac5ccabc-20221105.png) | 




# 最後に
![Frame 9 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/87f2a488-c5cd-549d-f07f-01b44a1317b8.png)
<b>Veroo</b>は、Blockchain技術を活用した「想いの巡るグルメSNSアプリ」です。食に対する熱量、例えばラーメンがめちゃくちゃ好きで年間400杯食べているとか、変態的に具材にこだわった中華料理を作っているなどのような、今まで直接お金にはならなかった食に対する情熱や熱量、その裏側にある想いがトークンを使うことで巡る世界。自分のラーメンに費やす熱量がコミュニティに承認される。自分がほんとにいいと思って作った食べ物がコミュニティで広まる。Verooは単なるSNSアプリではなく、クリエイターたちの想いが紡がれるソーシャルグルメアプリです。

##### Homepage: https://veroo.xyz/
##### Discord URL：https://t.co/VoT0gpsflA
[Flutter] レビューに使用する星のアイテムの使い方

今回は、アプリ内で何かを評価したいときに使うPackageを紹介します。


# flutter_rating_barについて

https://pub.dev/packages/flutter_rating_bar


# 実装例

```
RatingBar.builder(
   initialRating: 3,//初期値のStar数
   minRating: 1,//最小のStar数
   direction: Axis.horizontal,//縦向きか横向きか
   allowHalfRating: true,
   itemCount: 5,//Star数
   itemPadding: EdgeInsets.symmetric(horizontal: 4.0),//星同士の感覚
   itemBuilder: (context, _) => Icon(
     Icons.star,
     color: Colors.amber,
   ),
   onRatingUpdate: (rating) {
     print(rating);
   },
);
```


# 最後に
![Frame 9 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/87f2a488-c5cd-549d-f07f-01b44a1317b8.png)
<b>Veroo</b>は、Blockchain技術を活用した「想いの巡るグルメSNSアプリ」です。食に対する熱量、例えばラーメンがめちゃくちゃ好きで年間400杯食べているとか、変態的に具材にこだわった中華料理を作っているなどのような、今まで直接お金にはならなかった食に対する情熱や熱量、その裏側にある想いがトークンを使うことで巡る世界。自分のラーメンに費やす熱量がコミュニティに承認される。自分がほんとにいいと思って作った食べ物がコミュニティで広まる。Verooは単なるSNSアプリではなく、クリエイターたちの想いが紡がれるソーシャルグルメアプリです。

##### Homepage: https://veroo.xyz/
##### Discord URL：https://t.co/VoT0gpsflA
Next.jsでAPIからデータを取得する2

# はじめに
フロントアプリとAPIの通信をするさい、フロント側の非同期処理について勉強したので、使用した技術と、自分の解釈をメモとして残します。

# 非同期処理の基礎
## Promice型とは
非同期処理の状態や結果を表すオブジェクト。
>  非同期処理はPromiseのインスタンスを返し、そのPromiseインスタンスには状態変化をした際に呼び出されるコールバック関数を登録できます。

### Promiceインスタンスの作成
Promiseはnew演算子でPromiseのインスタンスを作成して利用します。 
このときのコンストラクタにはresolveとrejectの2つの引数を取る関数を渡します。
関数の中で非同期処理を行い、非同期処理が成功した場合はresolve関数を呼び、失敗した場合はreject関数を呼び出します。

このPromiseインスタンスのthenメソッドで、
Promiseがresolve（成功）、reject（失敗）したときに呼ばれるコールバック関数を登録します。 
thenメソッドの第一引数にはresolve（成功）時に呼ばれるコールバック関数、第二引数にはreject（失敗）時に呼ばれるコールバック関数を渡します。


> // Promiseインスタンスを作成
const promise = new Promise((resolve, reject) => {
    // 非同期の処理が成功したときはresolve()を呼ぶ
    // 非同期の処理が失敗したときにはreject()を呼ぶ
});
const onFulfilled = () => {
    console.log("resolveされたときに呼ばれる");
};
const onRejected = () => {
    console.log("rejectされたときに呼ばれる");
};
// thenメソッドで成功時と失敗時に呼ばれるコールバック関数を登録
promise.then(onFulfilled, onRejected);

一般的には、thenは第二引数を省略して成功時のみの処理を登録、
reject（失敗）時の関数の登録にはcatchを使用する。

> function throwPromise() {
    return new Promise((resolve, reject) => {
        // Promiseコンストラクタの中で例外は自動的にキャッチされrejectを呼ぶ
        throw new Error("例外が発生");
        // 例外が発生すると、これ以降のコンストラクタの処理は実行されません
    });
}
function delay(timeoutMs) {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve();
        }, timeoutMs);
    });
}
// thenメソッドで成功時のコールバック関数だけを登録
delay(10).then(() => {
    console.log("10ミリ秒後に呼ばれる");
}).catch(() => 
console.log("reject時の処理");

以下自分なりの解釈メモ
```
var exsample = new Promise((resolve, reject) => {
        ここにはresolveとrejectの2つの引数を取る、実行する非同期処理を書く
    });

exsample.then(resolveの時に実行する関数).catch(rejectのとき実行する関数);
```

非同期処理が終わったら次の非同期処理というように、複数の非同期処理を順番に扱いたい場合、
promiceチェーンを利用できる。
then().then().みたいな感じに

引用･参考
[JavaScript Primer
](https://jsprimer.net/basic/async/)

## axios
axiosとは、APIに通信を投げるやつ。
axiosのレスポンスの型はAxiosResponse<T>で指定できる。
リクエストも型指定できる。
> response.dataでJSONデータを取得することができる
[【Typescript】いろいろな型の指定方法：Axios編
](https://maasaablog.com/development/typescript/3455/)

型を指定するコードが詳しく乗っているサイトが以下。
[型を明確にしながらaxiosを使う](https://qiita.com/keyakko/items/ec536545d2faa9cabc84)

>axiosのgetやpost関数の戻りは、promissで返ってくるため、awaitパターンや、thenパターンなどでレスポンスが受け取れます。
[axiosの使い方まとめ (GET/POST/例外処理)](https://www.sukerou.com/2019/05/axios.html)

## AxiosResponse\<T>の\<T>って何
\<T>はジェネリクスというもの。
> 「型も変数のように扱えるようにする」
[
サバイバルTypeScript](https://typescriptbook.jp/reference/generics)

つまり、Tに好きな型(int,stringなど)を入れて型を変えられるということ。


# 便利なライブラリ
## React Query
Reactのライブラリ。
api通信でgetメソッドをするときにデータをキャッシュすることが出来る。
fetchやaxiosと同時に利用する。
利用する利点はサーバーから取得したデータをキャッシュできて便利なこと。
dateのほか、isLoadingなどのプロパティも取得できるので、
読み込み中などの判断がフロント側で容易にできる。

[【React】React Queryの基礎知識をまとめました(Stale, Cache, Prefetchingなど)](https://qiita.com/suzuki0430/items/fbcd0ce8ee10f91e3d92)
[初めてReact Queryを使う人のため設定方法と動作の理解](https://reffect.co.jp/react/react-use-query)

## SWR
Next.jsのライブラリ。
api通信でgetメソッドをするときにデータをキャッシュすることが出来る。
react queryに似てる機能を持つ。

[SWR公式ドキュメント](https://swr.vercel.app/ja/docs/with-nextjs)
phpでclass作成時に留意することメモ

# ■phpでclass作成時に留意することメモ
さくらインターネットのVPSでphpを公開するときに苦戦したのでめも

:::note info
※11/29追記：要調査・調整事項があるため加筆修正の可能性あり。
【要調査・調整】
・VPSのPHPバージョンを再確認
・class内のプロパティなどの記載の仕方
:::

使用環境：https://vps.sakura.ad.jp/
使用OS：ubuntu 20.04.5 LTS
phpバージョン：8.1.13

参考：https://www.php.net/manual/ja/language.oop5.decon.php

## class内の記載
class内で　function __construct()　を宣言する際に、
引数をpublicで宣言すると、500エラーでphpファイルを実行できなくなる。
引数の設定には要注意。
finchをDevContainerで使えないか試してみたが利用できなかった

これは　yuriacatsアドベントカレンダー1日目の記事です。

---
AmazonからFinchというコンテナ開発のためのクライアントがオープンソースで発表されました。ということでFinchをインストールしてDevContainerで活用できないか調べてみました。

## Installのためにやったこと

1. インストーラーからインストール
    - https://github.com/runfinch/finch 
2. 以下のコマンドを実行
    この間にコーヒーを入れておくと良い。（公式のおっしゃる通り、それくらい時間がかかる）
    ```
    finch vm init
     ```


3. Hello Worldのコマンドを打ってみる
    ```
    finch run --rm public.ecr.aws/finch/hello-finch
    ```
     ![2022-11-28_20.16.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163357/7ed22e3e-2bc6-7387-4c4f-709f3bda4d46.png)
    「うおおおお」と私も思わず声を上げてしまいました。

4. 実際に手元にあるDockerFileでうまく動くか確認！
    たまたま、手元のDockerfileがDevContainerのものしかなかったためそれでお試し
    ```
    # devcontainerで開発しているリポジトリのディレクトリー上で
    finch build .devcontainer/
    ```

    ![2022-11-28_20.20.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163357/dc6784a6-9662-8f85-efe5-4ec96249b7aa.png)

## いざ、DevContainerでできるか確認

https://code.visualstudio.com/docs/devcontainers/containers
※ MSの公式ではサポートされてはいません
しかし、このように~~Devcontainerを別なDockerランタイムで動かすことを想定されているかのような~~ Dockerとdocker-composeの起動コマンドを設定できる設定項目があるので早速Docker Pathを　finchにして起動してみました。

![スクリーンショット 2022-11-28 21.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163357/d312baf3-3ea3-0747-183a-0b967e026b99.png)

## 結論：世の中はそう甘くない

![2022-11-28_20.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163357/48e4c156-bbb0-af32-b279-de7bf50d8a26.png)

案の定開始早々の最初のコマンドで起動に失敗していました。
```
(docker-path) version --format {{.Server.APIVersion}}
(docker-path) ps -q -a --filter
```
エラー落ちした原因についてなのですが、DevConteinerをビルドする際上記の2つのコマンドが叩かれます。上記のコマンドのうち　`--format`と`--filter`はfinchは持っていないコマンドオプションなのでうまく起動ができなかったようです。

### 感想

Dockerランタイムとしては少し触った範囲ですとそこまで差を感じず、これから（特にAWSとのシナジーについては）期待が持てるなということを感じております。

---
参考資料

https://aws.amazon.com/jp/blogs/opensource/introducing-finch-an-open-source-client-for-container-development/

https://github.com/runfinch/finch
picoCTF Writeup picoGym Practice Challenges Lets Warm Up (注意<spoiler>)

Description
If I told you a word started with 0x70 in hexadecimal, what would it start with in ASCII?

http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html

0x70はASCIIでp

picoCTF{p}
conftestのcombineオプションで複数のKubernetesマニフェストを跨いだテストを実行する

[conftest](https://www.conftest.dev/)は`--combine`オプションをつけると複数リソースに対するテストが書けるよというお話です。

## conftestって何？
conftestとは、yamlファイルやjsonファイルなどの構造化されたデータに対してテストをすることができるツールです。
つまり、kubernetesのマニフェストファイルに対してテストを実施することができます。
### Rego
conftestのポリシーファイルはRego言語で書かれます。

以下は[公式リポジトリ](https://github.com/open-policy-agent/conftest)のexampleです。
```policy/deployment.rego
package main

deny[msg] {
  input.kind == "Deployment"
  not input.spec.template.spec.securityContext.runAsNonRoot

  msg := "Containers must not run as root"
}

deny[msg] {
  input.kind == "Deployment"
  not input.spec.selector.matchLabels.app

  msg := "Containers must provide app label for pod selectors"
}
```
manifest.yamlに対して`conftest test manifest.yaml`を実行すると、それぞれのdenyテストの中の評価式がすべて真であればそのテストは引っかかります。
詳しい使い方は公式のページを読んでください。
## 複数リソースに対するテストも書きたい
普通に`conftest test`を実行すると、マニフェストを一つずつしかテストできません。上記の例で言えば、`input`に一つのリソースのマニフェストが代入されてテストが実行されます。

しかし、`--combine`オプションをつけて実行すると、`input`に`{path: ファイルパス, contents: マニフェスト}`から成る配列が代入されます。
```policy/combine.rego
package main

# すべてのDeoloymentを得る
deployments[deploy] {
	input[i].contents.kind == "Deployment"
	deploy := input[i].contents
}

# すべてのConfigMapのnameを得る
configMapNames[name] {
	input[i].contents.kind == "ConfigMap"
	name := input[i].contents.metadata.name
}

# DeploymentでマウントしているConfigMapが存在するかどうかをテストする
violation_mounting_configmap_exists[msg] {
	deployment := deployments[i]
	volumes := deployment.spec.template.spec.volumes
	mountingConfigMapName := volumes[j].configMap.name
			
	not configMapNames[mountingConfigMapName]

	msg := sprintf("Deployment`%v`のvolumesで`%v`という名前のConfigMapが指定されているが、その名前を持つConfigMapは存在しない", [deployment.metadata.name, mountingConfigMapName])
}
```
例えばこのようなテストファイルを書いた上で、複数マニフェストを含むmanifest.yamlに対して`conftest test manifest.yaml --combine`を実行すると、DeploymentがマウントしているConfigMapが存在しないときにテストで弾いてくれます。

## 参考
- [conftestで複数ファイルを横断してチェックする - １クール続けるブログ](https://44smkn.hatenadiary.com/entry/2021/04/25/203700)
- [Options - Conftest](https://www.conftest.dev/options/)
[WIP]FutureGateway2022に参加した感想

# 目次考える

## 何を作ったか

### タイトル：学習するBoid

![2022:11:28-boidv101.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153766/8955617f-fa83-7a12-7394-c589fc9bc7a1.gif)

### 説明
- 群体シミュレーションとして以前からあるBoidsに対して、個体の学習機能を追加したらどうなるのかという作品
- アイデアのベースは「創造する心」というプログラミング教育に向けたエッセイ集にあるあとがきから。
    - アランケイのあとがきエッセイに、学習機能をビジュアルプログラミングで作ってみるという内容があったので、Unityで実現したかった
    - [書籍はこちら](https://www.amazon.co.jp/dp/4873119006)
    - [アランケイのエッセイ直接のリンク](https://tinlizzie.org/tinkertoy/ja.html)


### Boidとは？
（あとで説明を入れる）

### 学習とは？
- Boidsに組み合わせるという意味で、機械学習や深層学習ではなくより原始的な記憶方法を採用
- 学習機能は短期記憶と長期記憶の2種類
    - 基本は、自分の近くに障害物が置かれると驚く
    - 短期記憶
        - 何度か驚きが連続すると短期記憶に驚きが蓄積されていく
        - 閾値以上の刺激になった場合、長期記憶へと驚きが移動される
    - 長期記憶
        - 長期記憶がある場合は驚かなくなる

（あとで図を入れる）

## 作ってみた感想
1. 作品を完成させちゃうと、次にやりたいことが見えてくる→完成させちゃうの大事
1. 作りたい内容は、目的と手段が分かれているとイメージがわいてくる
1. 複数のことを同時に目指さない
    1. Boid+学習機能、BoidsのECS化、ECSの学習の3つは同時には目指せなかった
    1. 最初は小さく作ることが大事
1. 表現

## 作品を展示した感想
1. 作品をリアルで見てくるのはうれしい
    1. 体験会は体験する楽しさもあるけど、自分の作品が体験されている様子を見ることが重要
        1. 見られているということを作者が感じる要素が意外と大事
    1. リアルタイムで見れない場合は、感想が残っているといい
1. フィードバックは改善できるから大事だと思っていたけど、ただ自分の作品を見てもらっているという感覚の方が大事そう
    1. 自己実現感というのかな？自分が社会に貢献できているんだと感じることができる
1. 人からもらったフィードバックを見ることもだが、セルフフィードバックでもぐるぐると思考が回る
    1. セルフフィードバック：人が体験している様子を見たり、リアルタイムでフィードバックをもらっている状況
    1. 作品に一番詳しいのはやっぱり作者なので、様子を観察していて作者としてこうしたいなぁという気持ちが出てくる
    1. もちろん、フィードバックを見返して自分にはない視点や、無意識の前提を捉え直すことも大事！

## 結論
みんなでものづくり楽しんでいこう！それを発信していこう！
[Flutter] google_placeを使って店舗の情報を取得する


# 初めに

googleMapの基礎的な使い方は以下を参考にしてください。

https://developers.google.com/maps/documentation?hl=ja

https://future-architect.github.io/articles/20211224a/

# google_placeについて
ここのpackageを使用します。
https://pub.dev/packages/google_place

# 解説コード

```dart
import 'package:google_place/google_place.dart' as google;
import 'package:google_place/google_place.dart';

  late google.GooglePlace googlePlace;
  List<google.AutocompletePrediction> predictions = [];
  
  Future<void> searchPlace() async {
    if (word != '') {
      final result = await googlePlace.search.getNearBySearch(
        Location(lat: latitude, lng: longitude),
        10000,//TODO 距離
        type: 'restaurant',
        keyword: '吉野家', //TODO ここに検索したい言葉を入れてください
      );
      print(result);//TODO 検索したレストランが出る
    }
  }
  
```

色々な使い方があると思います。是非試してください。


# 最後に
![Frame 9 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/87f2a488-c5cd-549d-f07f-01b44a1317b8.png)
<b>Veroo</b>は、Blockchain技術を活用した「想いの巡るグルメSNSアプリ」です。食に対する熱量、例えばラーメンがめちゃくちゃ好きで年間400杯食べているとか、変態的に具材にこだわった中華料理を作っているなどのような、今まで直接お金にはならなかった食に対する情熱や熱量、その裏側にある想いがトークンを使うことで巡る世界。自分のラーメンに費やす熱量がコミュニティに承認される。自分がほんとにいいと思って作った食べ物がコミュニティで広まる。Verooは単なるSNSアプリではなく、クリエイターたちの想いが紡がれるソーシャルグルメアプリです。

##### Homepage: https://veroo.xyz/
##### Discord URL：https://t.co/VoT0gpsflA
GUIの改造3 crop aabb

「instantNeRFで遊ぶ Advent Calendar 2022」の4日目です。

testbedのメニューを自分が使いやすい様に改造していきます。
今回は領域を指定するcrop aabbの入力メニューを改造してみました。

:::note
業務外の個人的な検討活動です。
:::

:::note alert
警告
環境や入力内容によっては現在使用できている状況が壊れることがあります。
あなたの責任と判断で試してください。私は責任を取りません。
:::

#### 現状
改造前はこちらのように各軸の最小最大が上下に分かれていて視点移動が増えたり、各軸がどの方向に対応しているか分かりにくかったりしました。

![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/bddd217e-8d83-a9c7-4a76-4623721aaf3d.png)

#### testbed.cuの変更
1日目と同様にVisualStudio2019でinstant-ngpのフォルダを開き、testbed.cuの内容を変更します。

コメントアウトが変更前の文です。
![3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/0b7778b1-9830-61d3-fa38-2fccb822d03e.png)

#### 追加した部分のコード
```
			float aabbx[2] = { (float)m_render_aabb.min[0], (float)m_render_aabb.max[0] };
			accum_reset |= ImGui::SliderFloat2("aabb_x", aabbx, (float)m_aabb.min.x(), (float)m_aabb.max.x()); ImGui::SameLine();
			ImGui::TextColored({ 0.95f, 0.05f, 0.05f, 1.0 }, "right");
			m_render_aabb.min[0] = aabbx[0];
			m_render_aabb.max[0] = aabbx[1];

			float aabby[2] = { (float)m_render_aabb.min[1], (float)m_render_aabb.max[1] };
			accum_reset |= ImGui::SliderFloat2("aabb_y", aabby, (float)m_aabb.min.y(), (float)m_aabb.max.y()); ImGui::SameLine();
			ImGui::TextColored({ 0.05f, 0.95f, 0.05f, 1.0 }, "up");
			m_render_aabb.min[1] = aabby[0];
			m_render_aabb.max[1] = aabby[1];

			float aabbz[2] = { (float)m_render_aabb.min[2], (float)m_render_aabb.max[2] };
			accum_reset |= ImGui::SliderFloat2("aabb_z", aabbz, (float)m_aabb.min.z(), (float)m_aabb.max.z()); ImGui::SameLine();
			ImGui::TextColored({ 0.05f, 0.05f, 0.95f, 1.0 }, "back");
			m_render_aabb.min[2] = aabbz[0];
			m_render_aabb.max[2] = aabbz[1];

			ImGui::Separator();

			Vector3f diag = m_render_aabb.diag();
			bool edit_diag = false;
			float max_diag = m_aabb.diag().maxCoeff();
```

#### 結果
その結果のメニューがこちらです。
![3-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/07035793-4a33-60da-0cd3-e0192456f63c.png)

個人の趣向に合わせてGUIを変更できるのがうれしいですね。

#### 参考　
instantNeRFの座標はこちらを参考にしました。

https://github.com/NVlabs/instant-ngp/issues/658
Azure WebAppsでPuppeteer動かしたかったけど上手くいかないメモ


Azure WebAppsでPuppeteerを動かしたかったけど動かないのでやったことメモしておきます。

## プランなど

- プラン: B1
- ロケーション: East Asia
- ランタイム: Node - 18-lts

## スタートスクリプト

> 続 puppeteer を Azure Web Apps で動かす試み
> https://uncaughtexception.hatenablog.com/entry/2020/01/05/171945

この辺りの記事を見て`/home/start.sh`を作成して

```sh
#!/bin/sh

apt update \
    && apt install -y \
      ca-certificates \
      fonts-liberation \
      gconf-service \
      libappindicator1 \
      libasound2 \
      libatk1.0-0 \
      libatk-bridge2.0-0 \
      libc6 \
      libcairo2 \
      libcups2 \
      libdbus-1-3 \
      libexpat1 \
      libfontconfig1 \
      libgcc1 \
      libgconf-2-4 \
      libgdk-pixbuf2.0-0 \
      libglib2.0-0 \
      libgtk-3-0 \
      libnspr4 \
      libnss3 \
      libpango-1.0-0 \
      libpangocairo-1.0-0 \
      libstdc++6 \
      libx11-6 \
      libx11-xcb1 \
      libxcb1 \
      libxcomposite1 \
      libxcursor1 \
      libxdamage1 \
      libxext6 \
      libxfixes3 \
      libxi6 \
      libxrandr2 \
      libxrender1 \
      libxss1 \
      libxtst6 \
      lsb-release \
      unzip \
      wget \
      xdg-utils \
    && mkdir /noto && cd /noto \
    && wget https://noto-website.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip \
    && unzip NotoSansCJKjp-hinted.zip \
    && mkdir -p /usr/share/fonts/noto \
    && cp *.otf /usr/share/fonts/noto \
    && chmod 644 -R /usr/share/fonts/noto/ \
    && fc-cache -fv \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && rm -rf /noto
```

`構成 > 全般設定`でこんな感じで指定

> ![スクリーンショット 2022-11-28 20.07.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/9afd1409-6d17-7d0f-754e-fd30034337e6.png "スクリーンショット 2022-11-28 20.07.03.png")

そして再起動。




うーん。

> ![スクリーンショット 2022-11-28 20.04.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/45aa2d65-f75d-187e-e4e8-0ef075b3f67c.png "スクリーンショット 2022-11-28 20.04.30.png")

ログには何かインストールされている様子とERRORの表示。

> ![スクリーンショット 2022-11-28 20.11.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/30ef378c-7202-d67f-ac34-b5622b191a2c.png "スクリーンショット 2022-11-28 20.11.22.png")

`az webapp log tail~~`のコマンドでログをみたところ起動時のエラーを引きずってそう

```
2022-11-28T11:00:00.159Z INFO  - Stopping site iotlt-connpass-updater2 because it failed during startup.
```
【Linux】ファイルの内容から空行を削除して出力する方法

## すべての空行を削除

### `grep`コマンド

`grep`コマンドを使用して次のように実行することですべての空行を削除して出力できます。  

```terminal
grep -v '^$' ファイルパス
```

```terminal
$ cat sample.txt
sample

sample

sample

sample

sample

$ grep -v '^$' sample.txt
sample
sample
sample
sample
sample
```

### `sed`コマンド

`sed`コマンドを使用して次のように実行しても上記同様の結果が得られます。

```terminal
sed '/^$/d' ファイルパス
```

```terminal
$ sed '/^$/d' sample.txt
sample
sample
sample
sample
sample
```

## 連続する空行を1行にする

空行が連続している場合に空行を1つにまとめるには`cat`を使用して次のように実行します。  

```terminal
cat -s ファイルパス
```

```terminal
$ cat sample.txt
sample



sample




sample
$ cat -s sample.txt
sample

sample

sample
```
CodeBuildでdocker buildして別アカウントのECRにdocker pushするまで

意外とハマりどころが多いと思ったので書いておく。

まず、アカウントAとBがあるとして、AのCodeBuildでdocker buildを実行してBのECRにdocker pushしたい状況を考える。

最初に、AのCodeBuildにBのECRを操作する権限を与える。AとBにそれぞれこういうRoleを作成する。B側のRoleには`AmazonEC2ContainerRegistryPowerUser` をつけておく。

```json:アカウントA_CodeBuildに付与するロールのポリシードキュメント
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::<Account B>:role/ECRRoleForCodeBuild"
        }
    ]
}
```

```json:アカウントB_ECRRoleForCodeBuildの信頼ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<Account A>:root",
                "Service": "codebuild.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

ここまでは簡単で、問題は次。docker loginするための認証情報を得る必要があるが、２点注意が必要。
1. プロファイルをBアカウント側に設定すること
2. `credential_source = EcsContainer` を設定すること

EcsContainerって何だよという感じだがCodeBuildがECSで実行されているということか。
configとloginコマンドはそれぞれこんな感じ

```:aws-config
[default]
region=ap-northeast-1
output=json

[profile B]
role_arn=arn:aws:iam::<Account B>:role/ECRRoleForCodeBuild
credential_source = EcsContainer
```

```:loginコマンド
aws --profile B ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${REPOSITORY_HOST}
```

### 参考
* CodeBuildのビルド内でAssumeRole(クロスアカウントアクセス)する方法とハマった話: https://dev.classmethod.jp/articles/assumerole-in-codebuild/
備忘録：PlayerInput使用時に出たMissingReferenceについて

# 状況
・シーン遷移後にエラーが出る。
・エラー内容「そのPlayerInputはもうねｪよ！」
・ActionMap「Player」「UI」に同じ名前のActionName「Point」が存在し、そこにコールバックを登録していた。
・自作クラス「InputBase」がコンストラクタでPlayerInputへの登録、Disposeで解除を担当し、その派生クラスにActionNameと押された際の処理を記述する。
# 原因
**どのActionMapからコールバックを解除するのかを指定していなかったため**
１．シーンをロード、PlayerのPointにコールバックが登録される。
２．シーンをアンロード、UIのPointからコールバックが解除される(ここが原因)。
３．以後ループ。
# 対応
InputBaseのコンストラクタに、登録先のActionMapを指定できるようにし、解除時もそのActionMapを参照するようにした。
社内のコミュニティ活動を推進していくときに助かる存在について愛を語る

こんにちは、GxPの石村です。
この記事は[グロースエクスパートナーズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/gxp)の1日目です。

弊社でアドベントカレンダーを初めて、今年で3年目になりました！続くというのはうれしいことですね。
これまでのアドベントカレンダーは以下からご覧になれますので、是非覗いてみてください。
[グロースエクスパートナーズ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/gxp)
[グロースエクスパートナーズ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/gxp)

私はこのアドベントカレンダーや社内勉強会のような、社員同士でワイワイしたり一緒に学んでいく活動が好きです。
（社員同士じゃなくても好きなので、外のコミュニティイベントも参加しています）
そのため、新しい活動を立ち上げることが比較的多いです。
こういう社内活動は一部のそういうことに向いている人が支えていると思われがちですが、助けてくれる人がいないと成り立ちません。
その支えてくれる人の筆頭である @nshimizu-gxp について今日は愛を語りたいと思います！


# 活動を始めたときに前向きな気持ちで乗ってくれる

まず一番助かるのがこれです。
所属している部署での全員参加型から、このアドベントカレンダーのような自由参加型までさまざまな活動があります。
たとえ強制参加にして人数を集めたとしても、とにかく参加しさえすればよい経験になるというものでもありません。
参加者は前向きな気持ちも、後ろ向きな気持ちも、多かれ少なかれどっちも持っています。
主催者側でさえ、めんどくさいとかうまくいくか不安だという後ろ向きな気持ちを持っていたりします。
そんなとき、前向きな気持ちで参加して、それを声や文字で表明してくれる人がいると、それにひっぱられて前向きな気持ちが勝つことは多いのではないでしょうか。

例えば今回のアドベントカレンダーも、トップバッターは手が挙がりにくいよなと思い、軽い気持ちで1,2日目で一緒になにか記事を書かないか？と誘ったらこれです！こちらのモチベーションも上げられちゃいました。

![20221201_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323160/3740107c-1a41-7065-ae00-2dffb79e2541.png)



# 活動の継続的な改善を担ってくれる

最初は私やほかのマネージャーが始めて、彼女が継続してくれている活動があります。
[Growth Us!](https://www.gxp-group.co.jp/gplus/?p=3523)です！もともとはいち部署で始めた育成活動だったのですが、今や全体での取り組みになっています。
はじめは参加者として加わり、だんだん運営側にも入り、現在では社内では @nshimizu-gxp の活動として認識されていると思います。
彼女の素敵なところは、乗ってくれるだけでなく、活動の意義を理解・共感し、自身が担うことになれば使命感さえ持って改善し続けてくれるところです。
前任者からの引継ぎが行われると、惰性で活動だけが続き、だんだん衰退することがありますよね。
Growth Us!が自由参加になっても多くの人が継続参加してくれているのは、単に惰性で活動を継続するだけでなく、チーム間で相談できる場を設けるなど前向きな気持ちで続けられるための改善を続けてくれた @nshimizu-gxp の力です。

# 勇気を出してくれる

こんなことばかり書いていると、なんだ @nshimizu-gxp は物怖じせずにガンガンいけるコミュニケーションお化けみたいな人なんじゃん、と思っているのではないでしょうか。
実際に会うとわかるのですが、彼女は自分に自信がなくて常に周りの人はスゴイなあと思っている人です。
知らない人たちの前で話す場があろうものならAppleWatchに心拍数が上がりすぎて警告されちゃうぐらいには心配性です。
それでもえいやっと勇気を出してくれるのは、彼女自身が周りの後押しで踏み出したことで成長したりうれしいことがあったという経験からなのかもしれません。
そして、勇気を出してやると決めたからには、真摯に取り組んでくれるのです。
そんな姿を見て、周囲の人も「私もちょっと頑張ってみよう」と思うのではないでしょうか。

# 感謝を忘れない褒め上手

前述の周りの人はスゴイなあと思っていることからきているのだと思うのですが、彼女はいつも周囲の人に感謝しています。
とても褒め上手で、本心から褒めてくれているのがわかるので、また頑張ろうと思わせてくれます。

語るまでもなくそのことがよくわかる記事がありますので、こちらもぜひ！
[チームワークがよくなる！私の周りにいる人たちの素敵な習慣【打ち合わせ・チームワーク編】](https://qiita.com/nshimizu-gxp/items/d29084574f06c26ba483)
[チームワークがよくなる！私の周りにいる人たちの素敵な習慣【リモートワーク編】](https://qiita.com/nshimizu-gxp/items/3bdf47de2e5ddbb6674c)

# 私とタイプが違う

居てくれてありがとう！と思う点はいろいろあるけど結局これだなと思うのが、私とタイプが違うことです。
私は社内ではフットワークが軽いほうだと思います。（体力のないインドア派なので遊びへは重いですが）
やりたいと思ったらやるし、不満があれば言うし、あんまり知らない人でも話したいと思ったら機会を見つけて声をかけるし、勇気はいるけど挑戦へのハードルが低いです。
そんな私が誰か一緒にやろうと声をあげても、ハードルが高そうだと感じてしまう人がいるのも現実です。
@nshimizu-gxp は周りに安心感を与えるタイプなので、二人が無理なくやっていける活動にすることで、多くの人が参加しやすくなっていくのではないかと感じています。
二人の時にはよく言っているのですが、まさに存在が手柄です。
そのままで最高。でも頑張る姿も最高なのです。

# さいごに

今回は、@nshimizu-gxp への愛を語りましたが、こういった社内活動に参加してくれる多くの方々にも感謝しています！
今年も最後まで走りきりますので、[グロースエクスパートナーズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/gxp)を是非最後までお楽しみください！
記事中でも書きましたが、明日は、@nshimizu-gxp が担当します！
【livewire 2.0 】一歩先を行くルートモデルバインディング

## 概要

Laravelの便利機能の１つ、ルートモデルバインディングというのがあります。

![スクリーンショット 2022-11-28 19.12.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/2a3b598d-64aa-e7b6-9518-9c9e83154292.png)

添付したドキュメントだと``/users/1``にリクエストが来た場合、
UserControllerのshowメソッドの引数で定義しているモデルと対になるテーブルから、idが1のレコードを取得し
モデルオブジェクトとして受け取れます。


## livewireだと。。。。

____もはや引数ですら受け取らない

ルートモデルバインディングを使用したルーティングを書く

```php:web.php
Route::get('/users/{user}',App\Http\Livewire\Sample1128::class);
```

``mount()``で受け取るまでもなくプロパティに指定のユーザーモデルオブジェクトが入ります。


```php
<?php

namespace App\Http\Livewire;

use App\Models\User;
use Livewire\Component;

class Sample1128 extends Component
{
    public User $user;
    
    public function render()
    {
        return view('livewire.sample1128');
    }
}

```

省略しすぎて知らない人から見たら「一体どこで受け取ってるんだ！！！！！！」って感じですよね。
因みにphp7.4~ 限定っぽいです


https://laravel-livewire.com/docs/2.x/rendering-components#route-model-binding

![スクリーンショット 2022-11-28 20.35.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/344b26f4-d639-31f2-4066-eb1fae0e8314.png)
OCI Search Service with OpenSearch を使うための最低限の環境を IaC 化した

# はじめに

こちらの記事は、[Oracle Cloud Infrastructure Advent Calendar 2022](https://qiita.com/advent-calendar/2022/oci) の Day 2 の記事として書かれています！

コスト削減の意味で OpenSearch のクラスターが必要になった都度作り直していたのですが、毎度毎度めんどくさいなと思い、OCI Search Service with OpenSearch を扱うための OCI リソース一式を IaC 化してみました。

## 作成する環境

Resource Manager(OCI が提供する Terraform のマネージド・サービス)から `terraform apply` することで以下のような環境を作ります。

![image01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560068/248fe772-b0d4-3850-cbbf-553749724e8c.png)

デフォルトでは、各ノード（Master/Dashboard/Data）が 1 台ずつ最小構成でプロビジョニングされます。具体的には以下の通りです。

- Master Node
  - OCPU: 1
  - Memory: 20GB
- Dashboard Node
  - OCPU: 1
  - Memory: 8GB
- Data Node
  - OCPU: 1
  - Memory: 20GB
  - Storage: 50GB

## 作成手順

[https://github.com/shukawam/resource-manager/tree/main/examples/opensearch](https://github.com/shukawam/resource-manager/tree/main/examples/opensearch) にアクセスします。
README に `Deploy to Oracle Cloud` というボタンがあるので、こちらをクリックします。

![image02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560068/b34487fd-c9da-ae6e-77a4-c33c8a640884.png)

クリックすると、現在使用中のリージョンで Resource Manager のスタック作成画面に遷移します。

![image03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560068/cc78bfbd-5164-57c2-4a2b-3b7e22f9fe0f.png)

変数の構成で入力必須な項目を入力します。

- compartment_id: 先の構成がプロビジョニングされる Compartment OCID を指定
- opensearch_cluster_display_name: クラスターの表示名を指定
- private_key_location: 踏み台に SSH 接続するための自身の秘密鍵のパスを指定
- ssh_public_key: 踏み台に SSH 接続するための公開鍵の本文を指定

その他は、任意項目のため好きに調整してみてください。

次に、作成されたスタックの詳細画面から適用（`terraform apply`に相当します）をクリックします。  
※ちゃんとやる方は、計画（`terraform plan`に相当）してから作成された計画を元に適用してください）

![image04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560068/fdb65e09-625b-3d23-33c6-d2665081db7a.png)

15~20 分ほど経過するとジョブが完了します。

![image05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560068/5f8b02fe-32fe-ca43-bbfd-6560a6b0cfc3.png)

完了したジョブの詳細画面からログを参照します。ログの末尾に出力変数として、手元の端末からポートフォワードするためのスクリプトを出力しているので、これを手元で実行します。

![image06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560068/8bec9b9b-dbdf-cb38-e253-b4554f757cc4.png)

実行例

```bash
ssh -C -v -t -L 127.0.0.1:5601:10.0.0.10:5601 -L 127.0.0.1:9200:10.0.0.186:9200 opc@129.146.21.98 -i <private-key-path>
# ... omit

[opc@opensearch-bastion ~]$
```

手元のブラウザで `https://localhost:5601` にアクセスし、以下の画面が参照できれば無事完了です。

![image07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560068/9b8f822c-5c25-b9e5-b975-49bc5af8177b.png)


# おわりに

何か動かない等の不備があれば、[GitHub - Issues](https://github.com/shukawam/resource-manager/issues) までよろしくお願いいたします。
snapshot

「instantNeRFで遊ぶ Advent Calendar 2022」の2日目です。

:::note
業務外の個人的な検討活動です。
:::

snapshotを使うと、学習途中の結果を保存して再開することができます。
githubはrun.pyで使う方法を説明していました。
https://github.com/NVlabs/instant-ngp#frequently-asked-questions-faq

snapshotはtestbed.exeでも使うことができます。

### snapshotについて
メニューウィンドウの下の方にあるsnapshotの中にボタンがあります。
![2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/8e77e7a2-8509-c917-38aa-faaa1870637b.png)

Saveを押すと、その時点の学習内容を保存します。ここではbase.msgpackに保存されます。

### snapshotに保存した時点から学習を再開する
testbedをいったん終了し、起動するときにオプションを追加します。
するとGUIのウィンドウが開いた時点で学習が進んだ状態で表示されます。
そこから学習が再開されます。

```
(ngp) build\testbed.exe --scene ..\..\instant-ngp\data\220823 --snapshot ..\..\instant-ngp\data\220823\base.msgpack
```

### snapshotだけ使う　学習再開しない場合
ところで本来であればNeRFが空間再生するためにはネットワークだけがあればよくて、画像ファイルは要らないはずです。

試しにmodeをnerfに指定し、snapshotを指定することで再現空間を見ることができました。

```
(ngp) build\testbed.exe --mode nerf --snapshot ..\..\instant-ngp\data\220823\base.msgpack
```

この場合は学習を再開することはできませんので、trainingはグレーアウトしています。
![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/f6324fd7-2513-d833-a987-71768f13f67b.png)

:::note
transform.json中でn_extra_learnable_dimsを指定しているときはエラーが起きましたので、何か条件がありそうです。
:::

snapshotファイルだけで再生空間を見てもらえるようになるのは使い勝手がよさそうです。
GUIの改造1　Lチカのようなもの

「instantNeRFで遊ぶ Advent Calendar 2022」の1日目です。

InstantNeRFは2022年の7月にNVIDIAが公開したNeRFのツールです。

業務外でgithubにあるコードを勉強していました。

最初の一歩として、LチカのようにGUIの表示を改造してみました。

:::note
業務外の個人的な検討活動です。
:::

:::note alert
警告
環境や入力内容によっては現在使用できている状況が壊れることがあります。
あなたの責任と判断で試してください。私は責任を取りません。
:::

VisualStudio2019でinstant-ngpのフォルダを開き、testbed.cuの内容を変更します。

今回はメインウィンドウのヘッダ部分の文字の修正と、ウィンドウサイズと拡大倍率を表示するようにしました。

![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/648fad86-b507-c435-7a72-8a4f35b5dd20.png)

#### 変更箇所
```
ImGui::Begin("instant-ngp v" NGP_VERSION "; congrats of TIMES award,Thanks to all the contributors!");
ImGui::Text("window resolution: %d, %d; %f times ", m_window_res.x(), m_window_res.y(), m_scale);
```

変更したらファイルを保存し、再度visual studioの開発者コマンドプロンプトからビルドします。
ビルドしたtestbed.exeをいつも通りに実行しました。

#### 変更前
![1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/a8356513-7816-d40e-6a9e-035e3390077b.png)

#### 変更後
![1-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/712a7cac-c713-23e9-64df-a6bfe47d1337.png)

メッセージが追加され、ウィンドウサイズと拡大率が表示されるようになりました。
ウィンドウの大きさや拡大縮小すると数字が変わることも確認できました。

使いやすい様にメニューを並べ替えたり、欲しい情報を表示できるよう、
自分用に改造できるのがうれしいですね。

最後に、TIME MagazineのBest Invention of 2022の選出、おめでとうございます。

https://time.com/collection/best-inventions-2022/6225489/nvidia-instant-nerf/
[Lens Protocol] Profile NTFの入手方法🌿

![Screen Shot 2022-11-28 at 19.03.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987391/880899f6-60ca-286c-decd-8f799e0f74f5.png)

## イントロダクション
Lens Protocolを利用するときに必要なProfile NFTは現在（2022年11月時点）一般に誰でも入手することはできません。自分の好きなハドル名（〇〇〇.lens）が付いたNFTを入手するためにはWhitelistに選ばれる必要があります。ハドル名が何でも良いからゲットしたいという人のために入手方法を紹介したいと思います。

## そもそもLens Protocolとは？
全ての投稿がそれぞれのユーザーによって保管され、プラットフォームに依存しないWeb3ソーシャルグラフを作ることができるPolygon上のプロトコルです。

# そもそもProfile NFTとは？
Lens Protocol上の自分がした投稿などの全ての情報が紐づいているNFTです。自分のコンテンツをコントロールできるのは、このNFTに対する所有権です。

# OpenSeaを用いた入手方法

## 1. OpenSeaのサイトを開きLens Protocol Profile NFTを検索します
![Screen Shot 2022-11-28 at 19.23.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987391/496d930a-d2f5-c165-ed9f-577dc554cd72.png)

## 2. 好きなProfile NFTを選択してカートに入れる
![Screen Shot 2022-11-28 at 19.26.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987391/52604db0-6175-1efd-916c-d281a703f385.png)

## 3. 自分のウォレットで承認をしてNFTを購入する
![Screen Shot 2022-11-28 at 19.27.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987391/541d4fba-fb05-c560-0b53-41b3119fd3da.png)

### 注意点！！
支払いに使われる通貨は**Polygon ETH (WETH)**。なぜならLens ProtocolはPolygon上のプロトコルのため。
既に自分のウォレットにETHがある場合は簡単に変換することができます。

**ETHからPolygon ETHへの変換方法**
1. OpenSea上でウォレットタブを開く
1. ETHのらんの右側にある「その他」を押し、「Polygonへブリッジ」を押す
 ![Screen Shot 2022-11-28 at 19.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987391/1d51e229-c2e2-670e-3038-2358e6ccc34e.png)
1. トークンの量を入力し変換
 ![Screen Shot 2022-11-28 at 19.41.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987391/7387bddd-5de0-c15e-76e9-55d2e41248e2.png)

※変換にはネットワーク状況によって時間がかかる場合があります。参考として、実際に行った時には25分反映されるのにかかりました。

是非Followお願いします🌿🌿
https://www.lensfrens.xyz/chikamayukie.lens

# 最後に
![Frame 9 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/87f2a488-c5cd-549d-f07f-01b44a1317b8.png)
<b>Veroo</b>は、Blockchain技術を活用した「想いの巡るグルメSNSアプリ」です。食に対する熱量、例えばラーメンがめちゃくちゃ好きで年間400杯食べているとか、変態的に具材にこだわった中華料理を作っているなどのような、今まで直接お金にはならなかった食に対する情熱や熱量、その裏側にある想いがトークンを使うことで巡る世界。自分のラーメンに費やす熱量がコミュニティに承認される。自分がほんとにいいと思って作った食べ物がコミュニティで広まる。Verooは単なるSNSアプリではなく、クリエイターたちの想いが紡がれるソーシャルグルメアプリです。

##### Homepage: https://veroo.xyz/
##### Discord URL：https://t.co/VoT0gpsflA
SQL、select文where句での副問い合わせ

## 副問い合わせとは
select文、update文、insert文、delete文内で、あるselect文の結果を使用すること。
サブクエリとも呼ばれる。（クエリ＝問い合わせ）

select文では、where句、from句、select句、having句で使用できる。
今回はそのうちのwhere句での副問い合わせについてまとめます。

## select文where句での副問い合わせ
今回は下記2テーブルを用意してみました。
「PERSONAL_INFO_TBL」で従業員の基本データを管理し、
「JOB_CATEGORY_TBL」でその人の業務内容を管理しているようなイメージです。

PERSONAL_INFO_TBL

|  ID  | NAME | AGE | JOB_ID |
| :-: | :-: | :-: | :-: | 
|  1  | 齋藤 | 20 | 101 |
|  2  |　佐藤　 |　25　| 102 |
|  3  | 山田 | 30 | 103 |

JOB_CATEGORY_TBL

| ID | CATEGORY | 
| :-: | :-: | 
| 101 | エンジニア |
| 102 | 営業 |
| 103 | 企画 |

では「PERSONAL_INFO_TBL」から「JOB_ID = 102」のデータを、
副問い合わせを使って取得したいと思います。

```sql
SELECT * FROM PERSONAL_INFO_TBL WHERE JOB_ID = (SELECT ID FROM JOB_CATEGORY_TBL WHERE ID = 102);
```
個人的に（）内を102と読み替えるとわかりやすかったです。
副問い合わせ文では、「JOB_CATEGORY_TBL」から102という値を取得しています。

## 副問い合わせのメリット
主に下記が挙げられます。

・複数のSQL文を1文で記載することができる
・どのテーブルのデータなのかひと目で理解できるなど、可読性が高い
・結合をする必要がなくなる

## さいごに
ここまで読んでいただきありがとうございます！
現場で副問い合わせを使用していた際に自信がなかったため、
今回は自分自身の復習と整理のために記事にまとめてみました。
自分の記録が誰かのお役に立てると嬉しいです。。
Ubuntuでbluetoothがactiveにならない

# 問題

ubuntuをいじっていて、bluetoothあたりを触りたいなと思い、いろいろためしていたところ
```
$ sudo systemctl status bluetooth
○ bluetooth.service - Bluetooth service
     Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:bluetoothd(8)

11月 28 19:16:53 ubu22 systemd[1]: Condition check resulted in Bluetooth service being skipped.
```

まあ、`systemctl start bluetooth`でもしたら動くだろうと思ったが、なぜかうまくいかない。

# 解決方法

```
$ sudo apt install net-tools
```
で解決した。

たしか、ubuntu22.04を**最小構成**でインストールしていたので、net-toolsがインストールされていなかった。
なにが原因か詳しくはわからないから、わかる人いたら教えてください。
Node.jsのCLIツール作成で個人的に開発体験が良かった手法について

## この記事について

JavaScriptの学習のために暇な時間にNode.js上で動くCLIツールを作ったりしています。
以前にもパッケージを作ってみたりしていましたが、コードの管理がうまくいかずどんどんコードを書くのが辛くなってしまいました。

これまではClassを使ってオブジェクト指向っぽく書こうとしていましたが、自分自身のオブジェクト指向への理解の浅さやパッケージの規模が大きくないことも影響して

- 一つのClassに機能が集中しすぎて分割単位が分かりずらくなってしまう
- そこまでインスタンスを作らないのでClass自体の必要性があまり感じられなかった
- Classに対してのテストの難しさ

という問題を感じていました。

そんななかで改めてCLIツールの設計手法について自分なりに考えて再度整理をしてみました。
`n=1`でかなり主観的な内容が多く、まだまだ改善点も多いですがこれからCLIツールを作ってみようという人や参考程度に見る方の一つのサンプルとして記載させていただこうと思います。

### 目指したこと

以前のパッケージ開発の反省を踏まえ

- 粒度を細かくするために非常に小さい関数を組み合わせる
- テストが書きやすいコードであることを前提として分割を行う

このように目標を立てました。

## 作っているパッケージについて

紹介が遅れましたが`picture-lint`という画像データ向けの検査ツールを作っています。
主な機能としては画像容量の上限監視や拡張子とバイナリデータの整合性チェックなどを行う予定で作成を進めています。

https://github.com/ken7253/picture-lint/tree/develop

## 実際にコードを書き始めて分かったこと

きちんと目標を決めてコードを書き始めましたがそれでも書いている途中で間違いに気づくことが多くありました。

### 分類をせずに関数を並べた失敗

とりあえず関数をたくさん作るだけではそれ自体がどのような機能を持っているのかが分かりづらく、ディレクトリが散らかってしまうだけでした。そのため機能ごとに関数をまとめて管理する方向性に修正していきました。

#### 関心ごとにオブジェクトを作って管理する

小さなパッケージですがそれでも機能は複数存在するため、まずは機能毎の分割から考え始めました。
ざっくりと考えても下記のような機能は必要だったため、まずはそれらを目的別に分割しディレクトリを分けました。

- 設定ファイルの読み込み・マージする機能
- 読み込んだデータをチェックする機能
- チェック結果を出力する機能
- コマンドを受け取って各種機能を組み合わせて実行する機能

その後それらの機能のなかで更に操作もしくは定数ごとにディレクトリを分けました。
これにより`${機能名}.${どのような処理}()`という形で各種機能を呼び出すことができ機能の呼び出しを簡潔にしつつどのような処理が行われるのかが名前と型情報からある程度推測できるようになり、わざわざ別のファイルを開いて確認するという手間がかなり減りました。

```:ディレクトリ構成例
.
┗　src
  ┣　config // configに関連した操作
  ┃　 ┣　loader // 読み込み
  ┃　 ┃　┣ index.ts
  ┃　 ┃　┗ index.test.ts
  ┃　 ┗　merge // マージ処理
  ┃　  　┣ index.ts
  ┃　  　┗ index.test.ts
  ┣　checker // 各種ルールの確認を行う操作
  ┃　 ┣　strictFormatCheack // バイナリデータと拡張子の整合性の確認
  ┃　 ┃　┣ index.ts
  ┃　 ┃　┗ index.test.ts
  ┃　 ┗　fileSizeLimit // ファイルサイズ制限を超過していないか確認
  ┃　  　┣ index.ts
  ┃　  　┗ index.test.ts
  ┗　index.ts    
```

このように、`src`下の階層には機能毎にディレクトリを作成してその下層には具体的な処理についてディレクトリを作成して管理しています。

## テストをより書きやすく分かりやすくするための工夫

以前の作成時よりかは幾分かテストは書きやすくなりましたが、それでもまだすっきりとしていなかったので以下のような改善も行いました。

### テストファイルをテスト対象の近くに置く

単体テストのテストファイルは前記のディレクトリ構成のようにテスト対象と同じディレクトリに格納するようにしました。
これについては単純に`import`を楽に書きたいというのが一番の動機でしたが結果的にどのファイルに対してのテストなのかが分かりやすかったり、VSCode上でたくさんディレクトリを開いてエクスプローラーがごちゃごちゃしてしまうことが減ったので個人的に気に入っています。

### 関数型の考えを取り入れて宣言的に書いていく

関数単位で分割を行うと決めたのですが、その関数の中で状態や副作用を持ってしまったりするとあまり意味がないと感じていました。
入力が一定であれば出力も常に一定であったほうがテストは容易になるため、一度手を止め関数型言語の考え方について（本当に表層だけですが）調べてみました。
関数型言語は自分のように数学的下地がない人間にとっては難しいですが、参照透過性であったりそもそも副作用とは何なのかなどを知ることにより、関数の分割基準や入出力値を決める際の判断材料として非常に参考になる見識が得られました。

このパッケージでは`checker`と呼んでいる、入力された値が検査項目に合格するかを確認する関数群があります。最初はこの関数内で`fs`を使ってファイルにアクセスしたりしていました。
この機能が壊れてしまうと検査結果の信頼性が下がるため、この機能に関しては純粋な関数にしてよりテストも行いやすいよう、責任範囲を考え直したりすることで結果的により適切な分割単位に近づいていったと感じています。

## まとめ

おそらくきちんと技術書を読んだり、先人の知恵を借りればそもそも悩むようなことはなかったと思います。
完全に車輪の再発明記事ですが、それでも自分なりにじっくりと設計と向き合い、思いついたことを試して失敗してという経験は自分としては非常に大切な経験になったと感じています。
技術の流行を抑えるだけでなく、その技術・手法が何を解決するためのものなのかを理解できるようになるためにも最短経路以外の道を歩いてみることの楽しさや重要性を改めて感じることができました。
2022/11/28 日記

# 日記を書いてみようと思った動機
11/21 〜 休職中のため、暇である
ので、暇つぶし

# 今日の積み上げ
オルカやGravityみたいなランダム通話機能付きSNSアプリを使ってみたいとふと思い立ち、参考記事を探してみる
Xcodeのインストールが遅すぎてスマホアプリ（eFootball）に逃げる始末、、
飽き性の自分の性格をどうにかしたい
LeetCode問題番号20

### 20. Valid Parentheses
[問題のリンク](https://leetcode.com/problems/valid-parentheses/)

解法は以下の通りになります。
Stringを順番に読み込んでいってもし開く方のカッコが来たらStackにPushする。 
閉じる方のカッコが来た場合には以下の判定を行う。
一致しない場合にはFalseを返す。
- 同じ種類の開くカッコがStackの一番上にあるか。
- Stackが空ではないか 
Stringを全探索したあとにStackが空だった場合にはTrueをそうでない場合はFalseを返す。
計算量はO(n)かな？

```C++
class Solution
{
public:
    bool isValid(string s)
    {
        stack<char> memo;
        set<char> openbrackets = {'(', '{', '['};
        for (auto i : s)
        {
            auto iter = openbrackets.find(i);

            if (iter != openbrackets.end())
            {
                memo.push(i);
            }
            else
            {
                if (memo.empty())
                {
                    return false;
                }
                if (i == ')')
                {
                    if (memo.top() == '(')
                    {
                        memo.pop();
                    }
                    else
                        return false;
                }
                else if (i == '}')
                {
                    if (memo.top() == '{')
                    {
                        memo.pop();
                    }
                    else
                        return false;
                }
                else if (i == ']')
                {
                    if (memo.top() == '[')
                    {
                        memo.pop();
                    }
                    else
                        return false;
                }
            }
        }
        if (!memo.empty())
        {
            return false;
        }
        return true;
    }
};
```
【プログラミング初心者】ITの国家資格

前の職場の先輩がこんなこと言っていた。「基本情報技術者は取っておいて損ないよね！」確かに、ITエンジニアというのは言ってしまえば「今日からITエンジニアです！」と言えば慣れてしまう、誤解を恐れないでいうと、名乗るのに特別な資格はいらない、誰でも慣れてしまう職業だ。なので第三者が自分のスキルやどこまでITの知見が深いのかという指標もない。そうならないために資格を持っておくことはとても大事だと思う。今回はITの国家資格において、どんな資格があるのかちょこっと調べてみようと思う。

# IT資格の種類

## Level1

#### ITパスポート試験

IT業界以外の社会人にもおすすめ。全体的な合格数はIT業界人よりも非業界人の方が高い傾向にある、らしいw

## Level2

#### 基本情報技術者(FE)

IT業界の登竜門的な感じ。もっとくといいよね。的な風潮がある。合格率20％程度。

## Level3

#### 応用情報技術試験(AP)

FEよりも専門的な内容になる。合格率は20％前後だが、FEの資格を通っている人たちが受けての20％前後なので合格率の質は高いと思う。

## Level4

ここからはより専門的なエンジニアを目指す人向けの資格

#### 情報セキュリティスペシャリスト試験

セキュリティエンジニア向けに情報セキュリティを深掘りする資格。合格率16％前後。

#### ネットワークスペシャリスト試験

最適なネットワーク構築に必要な設計。運用における専門的な知識が学べる。こちらも16％程度

#### エンべデットシステムスペシャリスト試験

エンべデットシステム(組み込みシステム)の開発に必要な知識、技術を問われる。こちらも16％前後の合格率。

## Level5

#### システムアーキテクト試験

合格率驚異の12％という鬼門。システムの開発に必要なアーキテクチャ設計に関する技術が問われる。

#### データベーススペシャリスト試験

データベースの扱いについて専門的な技術を問う資格。合格率14％前後。

# まとめ

私個人、転職を考える人やフリーランスで活動さえれいる方は欲しいスキルかなと思います。取得資格の欄にプラスで書けるのはめちゃくちゃでかいですよね。
人材育成のフレームワークを研究してみたらすごかった

# ■はじめに
みなさんは人材育成の際、どのように育成しどのように評価されていますか？
人材育成を課題としている企業は多く育成自体も正解が無いため、まさに永遠のテーマと言えなくはない内容ですが、今回はそんな人材育成に取り組むにあたって、今年一年自身がおこなってきた研究結果を共有ができたらと思っています。
※本取り組みはQAでの育成を前提に作成されています
# ■これまでの育成
これまでは以下のように目標に対して教育を実施してきました。

* 会社の目標基準を参照し自身の目標を設定
* 上長と定期的な振り返りを実施
* 最終的な結果は自己評価→上長と面談の順で実施

上記のように弊社では目標設定を行い、その達成を目指すことで社員の成長を促しています。

この仕組み自体に大きな課題はありませんが、**目標設定＝成果を出すこと**に本人の意識が寄ってしまうことがあり、**目標設定=自身の成長**とは必ずしもならず、実際に成長を実感できてないという実態もありました。
そこで今回は[弊社主催の研究会](https://gree.connpass.com/event/257637/)にて、人材育成をテーマに、育成する人材の育成方法に関するフレームワークの作成を検討しました。

# ■役職を定義
育成をおこなうためには、まずその人材が現状どの位置にいて、次のステップでは何をするべきなのかが不明瞭でした。
そこで、各役職で必要な能力の定義し、必要な要件を洗い出しました。

### ▼役職定義
![役職.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325577/43de6347-430e-ce54-6917-c67dedd2dd08.png)

役職の定義としては、大まかに何ができる人であるかを表し、この役職の定義をすることで、育成フレームワークに落とし込むことができました。

# ■育成フレームワークの作成
役職の定義ができたことで、次は実際に育成するために能力の可視化をすることにしました。
検討の結果、下記の育成フレームワークを作成し、フレームワークを使った育成方法を検討することにしました。

### ▼育成フレームワーク
![フレームワーク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325577/b7354b4f-2ef7-27b5-d6db-59ea815b8be6.png)

育成フレームワークは各タスクに対する必要な能力を表しています。
各役職でもそれぞれできる能力の幅があるため、今回レベル1～3までの能力別で作成しました。

このように各能力とレベルに対して、必要な能力がどれであるか確認し、不足している能力を抽出することができます。

# ■育成方法
育成方法としては今回トライアルで約3か月間で実施しました。
以下の概要で実行することにしました。

### ▼育成概要
* 教育概要を当人に説明
* 育成フレームワークから現状の立ち位置を本人に共有
* 伸ばすべき課題を共有と合意
* 2週間に1回の割合で振り返りを実施
* 育成シートに2週間の結果と振り返りとネクストアクションを記載

#### ●育成シート
![育成シート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325577/c45a7698-2639-ebcf-906d-f1286df9afe4.png)
※こちらの進捗シートは例です

該当の人材が育成シートの課題を振り返りで報告し、課題がある場合は上長からのフィードバックをおこない次のアクションをアドバイスします。
取り組む課題は明確になっているため話す内容も課題にフォーカスでき、育成されている側としては進捗していることや成長が実感できました。

# ■最後に
今回育成フレームワークを作成し、育成時の能力を明確にしたことで良かった点は、自身に不足している部分が明確になるため、育成される側としては何を頑張れば良いのかが明確になり、自身の成長が実感できる点が良い部分だと思います。

課題としては、これらのフレームワークを作成するには知識や経験が必要であり、作成者のスキルが求められる点があります。
そのため、経験豊富な人材の確保やその人材の時間確保なども検討し導入するのが良いと思います。

少しでも人材育成の参考になれば幸いです。
devise導入していれば使えるauthenticate_user!について

# はじめに
備忘録です。

## authenticate_user!とは？
主に2つ理解する必要があります。

・deviseのメソッドである
・ユーザがログインしているかどうかを確認し、ログインしていない場合はユーザをログインページにリダイレクトする。

## authenticate_user!の使い方の一例

    before_action :authenticate_user!, except: [:show, :index]
    基本的にはbefore_actionと一緒に使います。

上記のコードの意味としては、
全てのアクションの前に、ユーザーがログインしているかどうか確認する。
ただし、showアクションと、indexアクションが呼び出された場合は、除くよ。という意味になります。

基本的にindexアクションや、showアクションはログインされていなくてもみられるアプリが多いためです。
（Twitterはログインしていなくても、ツイートの一覧、ツイートの詳細は見ることができる）

##　参考記事

https://qiita.com/gogotakataka1234/items/c7d5c0b3d8953216259e
友達・恋人の気持ちを知るツール

#### 解決した問題：人間関係
友達、または恋人が気分悪い時に、自分が知らないまま、結局喧嘩しまった経験ありませんか？
（例えば：試験を合格できない時、上司から怒らされる時、大好きなアイドルのライブチケットを取れない時。。。）
最近こういう人間関係の悩みがありますので、
相手は自分の気分良くないこと口で言わなくでも、自分が適時に慰れるためなツールを作りました。
#### なぜこのサービスが必要
確かに口で言うのは一番直接ですが、気分が良くないのに言いたくないことありますじゃないですか？
自分の親友は意外と言わない人が多いです。
事件が発生後１週間、ご飯をする時やっと言われることがよくあります。
しかし、もしそのモーメントでも、友達を支えられるなら、よりいいと思います。
#### Evernoteについての紹介
引用：Evernoteの公式サイトhttps://evernote.com/intl/jp
Evernoteはあらゆる情報を書き込めるメモアプリです。
Evernoteには、テキストだけなく画像や動画、PDFファイルなども保存できます。また、作成したノートはフォルダごとに分類できるので、大切な情報が至るところに分散してしまうのを防げるのです。 
さらに、Evernoteはマルチデバイス対応なので、WebブラウザだけでなくiPhoneやAndroidのアプリでも利用できます。
#### 機能紹介
基本出来な機能は、
相手がevernoteでプライベートな記事を作成し、その記事のレベルが『sad』にれましたら、
自動で気にlineに通知を送信する機能です。
詳しくsadな理由書いたくでもokですが、簡単に今日の気分が良くないだけでもいいです。
![IMG_1209.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885175/5fe4281a-e713-5cca-e1a1-22746ad47042.png)
#### 使った技術とIFTTTのフロー
・iPaaSのIFTTT：(Evernote If This)/ Line(Then That)
![截圖 2022-11-28 下午6.58.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885175/afb7a268-77dd-e035-add1-b77c7126ae2d.png)
#### 感想
特に学生から社会人になり、友達や恋人と付き合う時間が少なくなったを感じでいます。
仕事が大変な時、相手の気持ちを聞く時間ないこともあります。
このツールを応用すれば、より人間関係を仲良くでき、長く維持できます。
railsにおけるテーブル修正の流れ

# はじめに
テーブル設計を誤り、実行する中で間違いに気がついたとき、どのようにテーブルの修正を行えば良いかわからなくなってしまったため、記録に残す。
誤っている解釈があれば、ご指摘お願いします。

## テーブルの修正で気にかけること
- マイグレショーンファイルのstatusをup→downへ変更
rails db:migrate:statusでstatus状況を確認→rails db:rollback
- モデルの削除
rails d model モデル名
（マイグレーションファイルも同時に消される）
semgrepでbelongs_toにoptional: trueを一括で追加した

Rails のバージョンを上げて `belongs_to_required_by_default` を変更したり、 `load_defaults` を指定するときに、 `belongs_to` に `optional: true` をつけるか、古いバージョンでの `required: true` 相当でも動くようになっている必要があります。

その書き換えに `semgrep` を使ってみるとうまくいったので、その紹介です。

## 動作確認バージョン

* Ruby 2.7.6
* Rails 6.0.6
* semgrep 0.122.0

## belongs_to_required_by_default の例

```ruby
# 古い挙動に戻す
# config.load_defaults 5.0以上の直後に追加
config.active_record.belongs_to_required_by_default = false

# 新しい挙動にする(config.load_defaults 5.0以上と同じ)
# https://github.com/rails/rails/blob/v7.0.4/railties/lib/rails/application/configuration.rb#L100
# config/initializers/new_framework_defaults_*.rb ならこの書き方になっている
Rails.application.config.active_record.belongs_to_required_by_default = true
```

## semgrep での置き換え

試行錯誤して以下の内容のファイルを用意しました。

```belongs_to.yaml
rules:
  - id: belongs_to_optional
    message: 'Add "optional: true" to belongs_to.'
    patterns:
    - pattern-not: 'belongs_to(..., optional: $V, ...)'
    - pattern-not: 'belongs_to(..., required: $V, ...)'
    - pattern: 'belongs_to(...)'
    fix-regex:
      regex: '^([\s\S]+)(\)?)$'
      replacement: '\1, optional: true\2'
    languages: [ruby]
    severity: WARNING
```

対象の Rails アプリのディレクトリでこのファイルを `-f` で指定して `semgrep --autofix` を実行すると `belongs_to` に `optional: true` を追加できました。

```console
$ semgrep -f .../belongs_to.yaml --autofix
```

## 苦労した点

* 最初に`synvert`を試そうとしたら、<https://synvert.net/> は javascript 用がメインになっているらしく、ruby 用は [synvert-ruby](https://github.com/xinminlabs/synvert-ruby) になっていました。
* `synvert-ruby` も試しましたが、 `belongs_to` の引数の途中に改行が入っているときに `synvert-ruby` がエラーで落ちてしまうことがあって、使いにくかったので他の方法を試しました。
* `rubocop` での auto correct も検討しましたが、検出がメインなので、 `synvert-ruby` 以上に書き換えの書き方が難しそうだったので、調査は後回しにしました。
* `semgrep`で最初は`fix-regex.regex` で `^` をつけていなかったら、なぜか `, optional: true, optional: true` と2回追加されていました。

## まとめ

`semgrep` はパターンの書き方が独特でとっつきにくいですが、パターンを重ねていけるので、 `grep` をパイプでつないでいくように簡単なパターンの組み合わせで絞り込めるので、慣れれば使いやすそうです。

文脈を意識した検索や置換が必要なときに候補のひとつとして覚えておくと良さそうです。
paiza.ioでelixir その104

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
10を与えて、[10]を、パイプラインでプリントせよ。

# サンプルコード

```
10
|> to_string
|> String.split(" ")	
|> Enum.map(fn x -> 
	{v, _} = Integer.parse(x)
	v
end)
|> IO.inspect
|> Enum.map(fn x -> 
	IO.puts x
end)

```

# 実行結果

```
'\n'
10
```

# 成果物

https://paiza.io/projects/cS6EPa_6LjLQtTxp4Id-zA?language=elixir


以上。