OmniAICreator/Qiita-1.07M huggingface dataset:
自分が関わったコードの中で最凶のクソコード

# 最凶コード

論より証拠、そのコードを見てみよう。そのコードとは、JavaScriptで書かれたコードである。

```Original.js
t = 1234.56
   :
if(n==0){
    var a, b, c, d, e, f = t,
        w = self._iFirst,
        x = self._iSecond,
        y = self._iThird,
        z = self._iFourth;
    z.innerHTML = "0",
        f > 100 ? (a = f, b = self._getRound(a),
        d = "",
        y.style.width = "234px",
        w.innerHTML = "120",
        x.innerHTML = "240"
        )
        : (c = self._getRound(f), e = self._getRound(f / 2),
        y.style.width = (mmpix * 2 * Math.pow(2,4)) + "px",
        w.innerHTML = "120",
        x.innerHTML = "240"
        )
}
else if(n==1){
  // if(n==0)と似たようなことをしているため省略
   :  
    z.innerHTML = "0",
    y.style.width = "234px",
    w.innerHTML = "240",
    x.innerHTML = "480"
   :
}
else{
  // if(n==0)と似たようなことをしているため省略
   :
    z.innerHTML = "0",
    y.style.width = "234px",
    w.innerHTML = "480",
    x.innerHTML = "960"
   :
}
```
* (注1) 題材とした最凶コードは、約130行ある
* (注2) 変数名、関数名、メンバ名や、定数は適宜変えている
* (注3) 変数名a~f,t,w~zは、元々違うアルファベットではあるものの1文字の英小文字が振られていた
* (注4) tの導出もいろいろ計算をしているが結局定数になるため割愛している

お分かりだろうか。ツッコミどころしかない。というか、何から突っ込めばいいか辟易するレベルである。

# リファクタリング後のコード

結論から言うとこのコードは以下のことしかやっていない。

```AfterRefactoring.js
if(n==0){
    self._iFirst.innerHTML = "120";
    self._iSecond.innerHTML = "240";
}
else if(n==1){
    self._iFirst.innerHTML = "240";
    self._iSecond.innerHTML = "480";
}
else{
    self._iFirst.innerHTML = "480";
    self._iSecond.innerHTML = "960";
}
self._iThird.style.width = "234px";
self._iFourth.innerHTML = "0";
```

# ツッコミどころ

では、箇条書きであげつらうこととしよう

1. 変数名が英小文字1文字のみで多用している
1. ~~そもそも `var a, b, c, d, e` は定義してあろうがなかろうが、`undefined`だから無意味~~
    * （訂正）グローバルの同名変数に影響を与えないというメリットがある
1. 使わない変数が定義されている
1. 使わない変数のための処理（例：`c = self._getRound(f)`）をしている
1. __三項演算子（`? :`） の2項目、3項目に複数の文を処理している__
1. `f = t` と同値で置き換えるため、`f > 100` が `t` との比較だと気づきにくい
1. 結局 `t` が定数で `f` も定数なので、三項演算子の2項目の処理しかしない
1. 使ってはいないけど、`a = t` もあり、`a`、`f`、`t` を使い分ける理由が不明確 
1. カンマ(`,`) を文の区切りに多用している
1. `self._iThird` と `self._iFourth` は`if`-`else`節の中で処理する必要がない
1. `Math.pow()`を 2 の累乗計算で使っているのに、別で2をかけている
1. `var`は変数なら`let`、定数なら`const`が好ましい

きっと、まだまだ言えるし、省略した部分にも不可思議なコードであふれている。

## 三項演算子の速度（歴史的経緯）

で、1つよくわからないことがあるのだが、三項演算子の方が `if`節より早いとかあるのだろうか? 

検索で実験した事例を見たが、それほど変わらないという記事がほとんど。ただ、IE全盛期のJavaScriptでは三項演算子が重宝されたとかあるのかな? いずれにしても無駄な処理をしているから、速度が出ないコードには変わりない。

# これ以下のコードには出会えないだろう

およそ、職業プログラマとは思えないコード。先に変数を定義するC言語の作法が顔を見せたかと思えば、JavaScriptのようなカンマ区切りの文も現れる。

言語仕様の理解も、このシステムの外部仕様の理解も何もかもが不十分、いや理解していないコードである。

レビューの体制がないというか、立ち上げにど素人が1人で進めたようなコードは、なぜか執筆現在でも運用されている。

いかがだっただろうか。これ以上のコードがあったら是非教えてほしい。
Rails – Rspec の request のテストでファイルをアップロードする例

# コード例

```rb
require 'rails_helper'

describe 'post /example/', type: :request do
  subject { post '/example/', params: }

  let(:params) do
    {
      file: fixture_file_upload('path/to/file')
    }
  end

  it do
    subject
    expect(response).to have_http_status(:ok)
  end
end

```

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
【React】100本ノックやってみた #03 Todo

# はじめに
最近フロントエンドのフレームワークを勉強しようと思い、Udemyで一通り勉強しました。
しかしどうも身についた気がしないのと、もう少し実践的なことをやりたいと思ったため、
@Sicut_study(Watanabe Jin)さんが公開しているReact100本ノックをやってみました。

https://qiita.com/Sicut_study/items/5dec3c42c8f3c90f0487

# 前の記事

https://qiita.com/kmmch/items/c370a5227a0f5bd0fc1b

# ルール
* React, TypeScriptを使う
* その他ツールやライブラリの使用は自由

# 作成するもの
TODOリストアプリを作成する

# 目的(抜粋)
>TODOリストは複数のタスクを管理する必要があるため、状態管理の初歩を学ぶのに適しています。Reactを使用する場合、useStateやuseReducerなどのHooksを使って状態管理の方法を学ぶことができます

# 成功条件（抜粋）
>1 1.入力フィールド: ユーザーがタスクを入力するためのテキストフィールドが存在する。タスク名が1文字以上でない場合はバリデーションする
> 2. 追加ボタン: 入力されたタスクをTODOリストに追加するためのボタン。
> 3. タスクリスト表示: 追加されたタスクがリストとして表示される。
> 4. 削除ボタン: 各タスクの隣には削除ボタンがあり、それをクリックすることで該当のタスクをリストから削除する

# 成果物
## 使用技術
* React 18.2.0
* TypeScript 4.9.5
* Chakra-UI 2.8.5

## URL

https://resplendent-sopapillas-6c8bf4.netlify.app/

## キャプチャ
### 初期レイアウト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/047c7a73-7a0e-1736-30ac-892b49252650.png)
Closeボタンクリックでモーダルは閉じられます。

### +ボタンクリック（タスク登録モーダルが表示される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/46db2301-6027-b244-47d1-62c2d59f2789.png)

### 未入力でSaveをクリック（バリデーションエラーが表示される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/498f08c0-0b8f-f76e-2281-c052e91fbf25.png)
1文字以上入力されるとメッセージは消えます。

### TODO追加後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/b700362f-8af5-49c8-687b-948f5ab71521.png)
チェックを入れて完了したタスクであることを示します。
×ボタンをクリックすると一覧から削除されます。



# 実装手順
## プロジェクトのセットアップ
```bash
# React×TypeScriptのプロジェクト作成
npx create-react-app todo --template typescript

# ディレクトリ変更
cd todo
```

```bash
# Chakra-UIのインストール
npm i @chakra-ui/react @emotion/react @emotion/styled framer-motion
```

```bash
# react-helmetのインストール
npm i react-helmet
```

## コンポーネントの作成
リポジトリのsrcフォルダ配下をご確認ください。

https://github.com/kmmch/Counter


## デプロイ
NetlifyにGitHubを連携してデプロイ

# さいごに
React100本ノックの第3弾であるTodoリストアプリを作成してみました。

以前学習教材でTodoリストを作成したことがあるため、表示機能、追加機能、削除機能はそちらから踏襲しました。

レイアウトについては前回に続いてChakra UIを使用し、特にモーダルの使い方については理解できたかなと思います。

Atomic Componentを意識してコンポーネント分割をしましたが、
モーダルで入力した内容はTODOリストを表示するコンポーネントに渡さなければならず、
その辺りの分割をどうしようか考えることに時間がかかりました。
問題の作成者は2時間で解答したとのことですが私は大体5~6時間かかったと思います。
Linux の date コマンドのデフォルトフォーマットを変更する


# デフォルトのフォーマットを指定する方法

次のように `date` コマンドの引数を調整する関数 `date_with_default_format` を定義し、`date` のエイリアスとします。`date_with_default_format` は引数でフォーマットが指定されなかった場合、引数にデフォルトのフォーマットを追加します。その後、`date` コマンドを呼び出します。

```bash:.bashrc
function date_with_default_format
{
    # フォーマットが指定されなかった場合のデフォルト.
    declare -r default_format='+%F %T %Z'

    # フォーマットが指定された場合に true.
    declare format_specified=false

    declare option

    # 引数でフォーマットが指定されているかどうか判定する.
    for option in "$@"
    do  
        if [[ "${option}" == +* ]]; then
            format_specified=true
        fi
    done

    # フォーマットが指定されなかった場合は, 引数にデフォルトのフォーマットを追加する.
    if ! ${format_specified}; then
        set -- "$@" "${default_format}"
    fi

    date "$@"
}
alias date=date_with_default_format
```

# ロケールに依存したデフォルトフォーマットにする場合

Linux の `date` コマンドは環境変数 `LC_TIME` ロケールカテゴリに応じたフォーマットで出力します。ロケールに依存したデフォルトフォーマットにしたい場合は、それらの環境変数を設定します。

```
$ LC_TIME=en_US.UTF-8 date
Tue Nov 21 12:45:20 JST 2023

$ LC_TIME=ja_JP.UTF-8 date
火 11 21 12:45:20 JST 2023

$ LANG=ja_JP.UTF-8 date
火 11 21 12:45:20 JST 2023
```

# 関連情報

 * [GNU Coreutils > 21.1 date: Print or set system date and time](https://www.gnu.org/software/coreutils/manual/html_node/date-invocation.html)
[Thoughtspot]数式を使ってグラフの細かい内訳を「その他」にまとめる

## はじめに
Thoughtspot利用歴約2年。
日々Thoughtspotの関数わかんねぇと格闘しております。

## 実現したいこと
商品別の計上金額を、取引先名で色分けします。
X軸が「商品名」でY軸が「計上金額」になります。
これを取引先ごとに色分けしたときに、金額が低い取引先はマルっと「その他」にまとめたい。そんなときの関数の書き方です。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/422e035b-56fb-b2db-7592-0ece94421fa9.png)

## 方法
if関数とgroup_sum関数を組み合わせます。
”金額が低い”判定は今回適当に1,000万としました。この数式を色付きスライスに配置すれば完成です。

```
if ( group_sum ( Y軸の項目名,X軸の項目名,色分けする項目名 ) >= 10000000 ) then 取引先名 else 'その他' 
```

今回の例だとこう書いています。
```
if ( group_sum ( 計上金額,商品名,取引先名 ) >= 10000000 ) then 取引先名 else 'その他' 
```

商品ごとに1,000万以下の計上金額の取引先は「その他」と表示するような数式です。
良かったらここからいろいろ変化形も作ってみてください。

## 終わりに
みなさんはどのThoughtspotの数式が苦手？？
私はmoving_sumと一生分かり合えない気がしています。
Next.js + Stripe + Webhook + API Route (App Route)でsignature を検証するときにハマった

## 概要

題名の通りです。
ハマりました。


## 解決策

https://gist.github.com/sojinsamuel/988617fb95d7a26075b6056db6fc2534

この通り。

ミニマムなコードはこちら

```route.ts

import Stripe from "stripe";
import { headers } from "next/headers";
import { NextResponse } from "next/server";

export async function POST(req: Request) {
    const body = await req.text();
    const signature = headers().get("Stripe-Signature") as string;
    const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);

    let event: Stripe.Event;

    try {
        event = stripe.webhooks.constructEvent(
            body,
            signature,
            process.env.STRIPE_WEBHOOK_SECRET!
        );
    } catch (error: any) {
        console.error(error);
        return new NextResponse(`Webhook Error: ${error.message}`, { status: 400 });
    }

    const session = event.data.object as Stripe.Checkout.Session;


    return new NextResponse(null, { status: 200 });
}
```


なんでApi route のExample が公式にないんですかねえ、、、、

https://github.com/stripe/stripe-node/tree/master/examples/webhook-signing


まあ解決できたのでよかった、

以上。
今日の気付き① Linux

## Ping-t Linuxエッセンシャル より　

ディレクトリ 「dir」 に対してスティッキービットを設定する
① chmod o+t dir
② chmod 1777 dir
「1777」 は固定の数字ではなく、通常のパーミッション
(この場合777)に1000を加えたものを意味する。
スティッキービットが設定されている場合、その他のユーザーの実行権が「ｘ」ではなく「t」と表示されます。

#### ※スティッキービットとは、ファイルシステムで設定される特殊なアクセス権の一つで、ファイルやディレクトリの所有者とスーパーユーザー（rootユーザー）以外、ファイルの改名や削除をできないようにするもの。多くのシステムではディレクトリのみ設定できる。

#### ※パーミッション（アクセス許諾）ファイルシステム上でファイルやディレクトリなどのに設定されるユーザーやユーザーグループごとのアクセス許諾(アクセス権）を指す。
文字列の配列 (paizaランク C 相当)

https://paiza.jp/works/mondai/data_structure/data_structure__string_boss

>縦 H マス、横 W マスの H × W マスからなる迷路 S があります。上から i 行目、左から j 列目のマス は S_ij とあらわされ、 S_ij が「#」のとき壁であり、「.」のとき道です。整数 r、c が与えられるので、S_rc が壁かどうか判定してください。

一風変わった問題。

おそらくループで縦ヨコのマスを作ればいいんだとは思うが、
とりあえず1行目の各変数を格納しておいて、次の2行目がどうなるのか見てみた。

```py
H,W,r,c = map(int,input().split())
print(input())

```

```
..#.
```
なんとー。半スペで区切られていないやつだった。なるほど。
ほんなら、1文字ずつスライスして配列にいれればいいんかな？
やってみましょう。
ちなみにやり方は知らんが、phpで同じことをやったことがあるので
pythonでも同じことができるのか調べてみた。

ありました。`list()`

```py
for i in range(H):
    for j in range(W):
        S = input()
        print (S)
```
としたら、Errorが出てきた。

```
Traceback (most recent call last):
  File "Main.py", line 4, in <module>
    print(input())
EOFError: EOF when reading a line
```
調べてみると、どうやらfor文の中でinput()するとエラーになるそうだ。
で、エラー文を回避すればちゃんと取得される。。。らしい。

なので。私もPythonじゃ初めてだけどエラー処理をしてみた。

```py
H,W,r,c = map(int,input().split())
try:

    for i in range(H):
        for j in range(W):
            S = list(input())

except EOFError:
    pass

print(S)
```
```
['.', '.', '.', '.']
```

とりあえずエラーが出なくなったので、これで開発？解答？を進める。
二次元配列で、A[i,j]のような感じのやつに、スライスできた
やつをいれていけば、　AのMAX値が答えになって判断が可能になるはず。
1次元配列はやったことあるけど二次元配列ってどうやっていれるんだっけ、
とまた調べる。とりあえず、2つ配列が必要だ。

```py
H,W,r,c = map(int,input().split())
try:
    mainArr =[]
    for i in range(H):
        subArr =[]
        S = list(input())
        for j in range(W):
            subArr.append(S[j])
        mainArr.append(subArr)

except EOFError:
    pass

print(mainArr)
```
とりあえず作ってみたのでいったんprint.
でました〜。
```
[['.', '.', '#', '.'], ['#', '.', '#', '#'], ['.', '.', '.', '.']]
```
はいこれでよいですね。

で、mainArr[r, c]の値がいくつかでYesかNoがでると。
あれ、でも待てよ。0から始まるのだから、−１か。

```py
H,W,r,c = map(int,input().split())
try:
    mainArr =[]
    for i in range(H):
        subArr =[]
        S = list(input())
        for j in range(W):
            subArr.append(S[j])
        mainArr.append(subArr)
    if mainArr[r-1][c-1] =='#':
        print("Yes")
    else:
        print("No")

except EOFError:
    pass

```

これにてできました。

答えを見てみると。

```py
H, W, r, c = map(int, input().split())
maze = [input() for _ in range(H)]

if maze[r-1][c-1] == "#":
    print("Yes")
else:
    print("No")

```

まじか。
もっと簡単じゃん。
ああそうか、行だけまとめて出力されてるから、
ループは縦だけで良かったんや。。。なるほど。
ほんなら内包表記でできるなぁ。。。

あれ？文字列を配列に入れたら分割して入るのかな？


ちょっと実験

```py
H, W, r, c = map(int, input().split())
maze=[]
for _ in range(H):
    maze.append(input())
    print(maze)

```
```
['..#.']
['..#.', '#.##']
['..#.', '#.##', '....']
```
あれ、文字列のままだ。
となると、
```py
maze = ['..#.', '#.##', '....']
```
となっているはずなのに、なぜ`maze[r-1][c-1]`で取得ができるんだろう？

ひとまず、
```py
print(maze[1])
```
とすると、
```
#.##
```
がでて、
```py
print(maze[1][0])
```
だと1番目（コード上だと0番目）の`#`が出てきた。
該当する要素の●番目の数を抽出できるようだ。
色々調べてみたけどもっともらしい説明は見つからず。
そういうものかなと一応理解した。

ひとまず今日は終了
【ChatGPTのお膝元、OpenAIその後】


　どうも、カーブミラーです。

　今回は、昨日のニュースの続きです。ニュースを追っていたら、お腹いっぱい。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　昨日は、MSナディラ氏がOpenAIの取締役会との折衝をしている、というところで、話を終えました。

　その後、協議は物別れに終わり、サムとグレッグはOpenAIに戻らず、そのままMicrosoftへと移籍。

4時間前に、サム・アルトマンがつぶやく。
https://twitter.com/sama/status/1726668687577665572?t=v93nN48c0T11DceuNzsmag&s=19
DeepL翻訳
「これまで以上に団結し、コミットし、集中している。 

私たち全員が何らかの形で協力することになる。」
　――――
その1時間後
https://twitter.com/sama/status/1726686611260494238?t=yNapaxYhSM83uj8L_CZlWg&s=19
DeepL翻訳
「サティアと私の最優先事項は、openaiが引き続き繁栄し続けることです。

私たちは、パートナーや顧客に事業の継続性を完全に提供することを約束します。

openaiとマイクロソフトのパートナーシップにより、これは非常に可能なことです。」
　――――
　ほぼ同時刻。
　OpenAIの開発担当のひとり、
　　Logan.GPTがつぶやく。
https://twitter.com/OfficialLoganK/status/1726631481403941107?t=XNY-mIdEwtFjxa1C9kKwNg&s=19
DeepL翻訳
「私が受け取った、そしてコミュニティ全体に投稿された、温かく、思慮深く、応援してくれるメッセージすべてに感謝の意を表したいと思います。

一瞬の不安にもかかわらず、私たちの開発者に対するコミットメントは揺るぎないものでした。 

その間も、私たちはシステムの安定性とセキュリティを優先していることをご理解ください。 当社のエンジニアリング・チームは引き続きオンコール体制で、当社のサービスを積極的に監視しています。

どのような場合でも、私たちの顧客と使命に対するコミットメントは変わりません。 引き続きご信頼くださいますようお願い申し上げます。」

　つまり、OpenAIのChatGPTは、安全に運用されている、と顧客にメッセージを送ったようだ。
　――――
2023/11/21【Forbes】
95% Of OpenAI Employees Threatened To Resign. Visa Holders Face A Higher Risk.
https://www.forbes.com/sites/alexkonrad/2023/11/20/90-of-openai-employees-threatened-to-resign-visa-holders-face-a-higher-risk/?sh=753f978a50f2
　簡単に言うと、505人の名前が書かれた宣言書にさらに追加して、総勢743人となった。
　また、ここには移民の人もおり、彼らはアメリカ滞在ができなくなる可能性よりも、闘うことを選んだ。
***
木内翔大 @SHIFT AI代表 がポスト。
【速報】どんな状況でもサム・アルトマンと連携を望む、MicrosoftのCEOが発言
https://twitter.com/shota7180/status/1726772993597341981?t=FNfYahdKtdWHH2G5Uz1ZmA&s=19
（MSナディラ氏とのインタビュー付）

　そのあと。
【速報】OpenAIは競合のAnthropicに合併を提案していた
https://x.com/shota7180/status/1726781448911569387?t=iEZNHtgw3_vRKuJBVw8Zbw&s=03
　サム解任後に、オファーしたらしい。
　Anthropic CEOであるDario Amodei氏は、オファーを断った。

　そのあと、
　GitHubの元CEOフリードマン氏とScale AICEOのワン氏にもオファーしていたらしい。もちろん、断った。
***
　もうお腹いっぱいなので、
　　今日は、ここまで。

　ふつうに、
　　ChatGPTさんとのやり取りは、
　　　いつできるようになるのかな？
eclipseの日本語版がDLできない件

# OSDN接続不調でeclipseの日本語版が入れられない！
eclipseの日本語版は下に示すサイトで投稿されているのですが...
`https://mergedoc.osdn.jp/`
urlにもあるosdnというサイトで接続不調が起きているようです。

# 新しいダウンロードURLは...
コメントによりますと、サイトが移ったようです！
(コメントくださった@cypher256様、ありがとうございました)

https://willbrains.jp

## osdnって何？
私も詳しくなかったので調べてみました...
> Open Source Development Networkは、OSDN（オーエスディーエヌ）と略し、中国企業の开源中国（OSCHINA）が運営する、日本向けのオープンソースソフトウェアプロジェクト向けのホスティングサイト。かつてはSourceForge.netの姉妹サイトで[1]、2015年5月11日にサイト名称がSourceForge.JPからOSDNに変更された[2][3]。
[引用: wikipedia](https://ja.wikipedia.org/wiki/OSDN)

要するに、オープンソースのソフトウェアを取り扱うサイトのようです。
eclipseの日本語化もオープンソースプロジェクトなので、このサイトを使用していたようです。

## (おまけ)手動で日本語化する方法
日本語化プラグイン「Pleiades」のみダウンロードする方法です。このプラグイン **「バージョン非依存」** です。（加えてIDEAを含む多くのソフトに対応)

> 追記： IDEAの日本語化は[この記事を参考](https://qiita.com/hirotann618/items/68484f9e10c33944a758)にしてくださいまし

### Pleiadesを落としてくる
eclipse日本語化プロジェクトホームページから、下にスクロールすると「 Pleiades プラグイン・ダウンロード 」と書かれていますから、OSを選んでDLしましょう！

### eclipseをダウンロード

https://www.eclipse.org/downloads/

eclipseは公式サイトからDLします。 「Install your favorite desktop IDE packages」と書かれているので、そこにある「Download x86_64」からDLします。

ダウンロードした`eclipse-inst-jre-win64.exe`を開くと、リストが出てきますので、一番上の「Eclipse IDE for Java Developers」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893008/3035cac1-89e9-6d9d-ddee-ed404820d088.png)

eclipse本体もjavaアプリケーションの為、java17が必要です。　事前にダウンロードしている場合はフォルダーアイコンから追加してください。(Browse...から追加)
なければ勝手にDLしてくれます。
Start menu entry(スタートメニューに追加する）やdesktop shortcut(デスクトップにショートカット作成)など
はお好きにどうぞ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893008/b08f1efc-458f-4ba1-bb37-b4ab1540b87c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893008/424da135-4ca1-04d5-7a83-2cd5dbff704f.png)


**Installation Folderをメモっておいてください**

### いざ！日本語化
`pleiades-win.zip`を解凍し、中にある「setup.exe」を起動します。

「日本語化するアプリケーション」を選択し、アドレスバーにメモしておいたパスをペースト、その中から「eclipse.exe」を選択し、「日本語化する」から日本語化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893008/256dc87b-7b29-be06-8a80-5c5a3638ade2.png)
QRadar WinCollectのインストール

# 前知識
- QRadarSIEMにwindowsサーバ（AD等）のログを取り込む場合には、WinCollectを利用する。
- WinCollectはアプリケーションでWindowsマシンにインストールを行う
### 2種類の動作モード
- WinCollectは、2種類ある（Managed,StandAlone)
- Managed:管理される（ソフトウェアの自動アップデートとされる）
- StandAlone: 管理されない（ソフトウェアの自動アップデートされない)

### 2種類のログ取得方式
- イベントを取得したいWIndowsサーバ（AD等）に直接WinCollectをインストールする方式
- WinCollect専用にホストを割り当てて、そのホストからWindowsサーバ（AD等）に対してポーリングしてログを収集する方式

WinCollectのアプリケーションを対象のWindowsに配置する

<img width="200" alt="wincollect_installer" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/76fbf068-480a-eaac-9b75-dc846e2e6406.png">

コマンドプロンプトをAdministratorとして起動して以下のコマンドを実行する
msiexec.exe /qn /i WinCollect-10.1.7-11.x64.msi QUICK_INSTALL="yes" WC_DEST="QRadarやEvent Processor等のIPアドレス" ADMIN_GROUP="true"

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/9a51bba0-6b26-07d6-c7a9-606974c53f94.png)

メニューにIBM WinCollect 10 Consoleが表示される

<img width="300" alt="wincollect_menur" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/c2fb8681-d4c4-9ec8-685c-72b6fcd8dae9.png">__

<img width="300" alt="wincollect_popup" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/eadd74e1-0f80-aa96-ca31-e1ecd7dbe2e4.png">

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/63e89a2a-80a1-f207-ba4b-856b4d8f6809.png)
左側の3本線のマークをクリックして追加設定に進む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/14290be0-a13e-857a-6810-c0bda424a263.png)
メニューは以下の通り
- Agent Configuration
Agent Settings -- WinCollect自体の設定
Credentials -- リモートサーバからログ取得するときに利用する認証情報を設定する項目
Local Sources -- WinCollectのアプリケーションをインストールしたWindowsマシンのログ取得に係る設定
Remote Sources --リモートサーバの情報（ログ種類、リモートサーバIP、ログ送信先）
Destinations -- WinCollectが収集したログの送信先設定（通常はQRadar、EventCollector,Event Processor)
Log Viewer -- システムログや取り込まれたログがリアルタイムに表示される
Source Wizard -- ウィザード（対話型）でLocalもしくはRemoteのログソースを設定できる


<img width="400" alt="wincollect_menur1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/c137f636-5faa-4044-f3b4-872e4ffbd1bc.png">
歯車マークをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/8fd885c4-32a4-5e46-82ef-c3c06971f75b.png)
サポート問い合わせ等に必要なデバック情報を収集するためのメニュー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/78b956fb-b290-9911-d56e-409d5cd68c7a.png)
# リモートwindowsからのログ収集接続　（Remote Sources ）
必須　（ユーザをadminグループにいれたとしてもこちらは必須）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/45af3eed-bb13-ad1e-8e20-4a5eec562f1f.png)

いらないかもしれないけれどもマニュアルに有効化するようにコメントがある。（サービス開始していなくても動く）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/90173a8d-7f50-b26a-ccdb-5a27ecb9a40f.png)
ポートは、135,137-139,445はwindowsにより任意としてデフォルトで許可されている場合がある。49152-65535は必須
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/7f40e172-46f4-3540-71a4-35964705782b.png)

## 参照したドキュメント

https://www.ibm.com/docs/ja/qradar-on-cloud?topic=7-wincollect-overview
【Python】同じディレクトリの__init__を使うとcircular importになる

## 事象
同じディレクトリDに
```
D
┠ __init__.py
┠ M1.py
┗ M2.py
```
の3ファイルがあるとしましょう。
それぞれが以下のスクリプト記述がされているとします。

```python:__init__.py
from D.M1 import f1
from D.M2 import f2
```

```python:M1.py
from D import f2

def f1():
    print("f1")
    f2()
```

```python:M2.py
def f2():
    print("f2")
```

ここで、外から`D.M1`を`import`すると`circular import`エラーが発生します。

## 原因
`M1`と`M2`モジュールは、`M1→M2`の一方通行依存関係なので、機能的には循環参照にはなっていません。

しかし、
```python:M1.py
from D import f2
```
の部分で、`M1`は`__init__.py`を`import`しています。
そして、`__init__.py`が`M1.py`を`import`しているため、綺麗に`circular import`になるわけです。

## 対策
同じディレクトリのモジュールを参照するときは、丁寧に**そのファイルを指定して**モジュールを呼びましょう

このように修正します。
```diff_python:M1.py
-from D import f2
+from D.M2 import f2

def f1():
    print("f1")
    f2()
```

また、モジュールに依存関係があるときは、同じディレクトリに配置するのではなく、ディレクトリを作って下位モジュールであると明示するのがモジュール設計的には綺麗だと思います。
社内LTに参加したお話

# はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます

# 社内LTに参加したお話

昨年に続いて二回目の開催となる社内LTに参加したお話です。

## LTとは

LT (Lightning Talks)とは"稲妻トーク"の名の通り、
LTはいわば「短いプレゼンテーション」のことです
勉強会やイベント、カンファレンスなどで行われる5分程度の短いプレゼンテーションを指します


## LT概要
- 会場：メタバース空間
- 発表時間：5分/人
- 画面共有：ZOOM
- コメント：Commentable(https://tetsuakibaba.github.io/commentable/)
- 発表内容：なんでもOK
- 質問時間：なし。素人質問がこない安心設計

私が発表したテーマはこちらになります

第一回

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/cab2acdf-b53c-71de-d502-14fae1fb830f.png)

第二回

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/20f54ecf-d542-c4fd-7bb3-90655df7452a.png)

LT参加人数はともに30名ほどでした。
メタバース空間で2会場に分かれての発表でしたので、当日は事前準備含めて4時間ほどでした。

メタバース空間上での発表だと対面と比べて敷居が低いなと感じたので、発表が苦手な人にはおすすめしたいです。
Commentableを使っていたので参加者と双方向のコミュニケーションができるのですが、時間内に参加者のコメントを拾いながら発表するのは難しかったです。自分が話していてコメントがくると嬉しかったです。

他の参加者の発表内容も一部紹介します！

- データベースの正規化ってな～に？
- rails7での大きな変更点
- しくじり先生
- 他チームに留学したお話
- リポジトリはいつも1つ！
- 社内AWS環境を統一したお話
- スーパーでお買い物間違えるお話
- DynamoDB使ってみた

# おわりに
制限時間5分にちょうど収まるような作りだとコメントを拾うのは厳しいので、次は軽めの発表内容にしてコメント拾えるように挑戦したいと思います。
記事のように書いてアウトプットするのも良いのですが、話してアウトプットできるようになるとより理解が深まりますし、何よりリアルタイムでフィードバックもらえることに価値を感じました。
ChatGPT、GPTsのTips集

# はじめに
GPT Storeが公開になるということで今まで作成したチャットボットを公開することにしました。
それに合わせて知見も増えてきたのでTipsを更新します。

# 作成したGPTsの紹介

[悩み相談窓口さん](https://chat.openai.com/g/g-dWnproy5G-nao-mixiang-tan-chuang-kou-san)
あなたが悩んでいることを一緒に考えて解決策を考えます。

[占い師 マリアーヌ純](https://chat.openai.com/g/g-JiRt1W9dX-zhan-ishi-marianuchun)
占星術であなたを占います。

[似顔絵職人](https://chat.openai.com/g/g-Jz4aE88h3-si-yan-hui-zhi-ren)
自分の画像を送信するとその画像をイラストにします。

[文字起こし君](https://chat.openai.com/g/g-kwTuuoo4B-wen-zi-qi-kosijun)
画像を送信すると文字起こししてくれます。

[Python先生](https://chat.openai.com/g/g-K3S2w1sPq-pythonxian-sheng)
Pythonコードを渡すと一行ずつ説明してくれます

[３人の賢者](https://chat.openai.com/g/g-Oxzuua2SX-3ren-noxian-zhe)
このチャットボットにアイデアや提案が欲しいことを書くと、ChatGPTが3人の賢い専門家を呼んで、それぞれの専門家が違う考え方でアイデアや提案をしてくれます。

# Teamプラン
## Chatgpt Plusとの違い
　・GPT4の利用制限数が増える
　・プライベートまたは社外秘内容などのチャットデータは学習の対象外となる（チャットトレーニング機能）
 　※Plusでも可能だがこれを有効にすると会話履歴やGPTsが使えなくなる
 
## 料金
　30$とあるが2アカウント以上契約しないといけないのでPlusの2倍となる（60$）
  ※年間契約割引などがある

## Plus契約している状態からTeamの契約をした場合
　・Plusとチームの重複契約となるもよう（３アカウントとなる）
 　AアカウントでPlusを契約→AアカウントでPlusとTeamの両方が使用できるようになる
  さらにTeamではBアカウントも追加しないといけない（いけなくはないが勿体ない）

## Plusで作成したデータをTeamのアカウントに移行する
　・Teamの設定でマージさせる機能があり、それをするとPlusの個人データがTeam側に移行される
  　※移行後に個人のアカウントは削除されるので注意
  ・GPTs達は問題なく引き継がれるがサイドバーからのピン留めがなくなるので再度設定が必要
  ・インストールしていたPluginがなくなるので再インストールが必要
  ・会話履歴は移行されていた

# GPT STOREに公開するには？
　右上にある保存ボタンで公開先を「公開」にして保存するだけで自動的にGPT STORE上で公開されるます。

# 結果の精度を高めるには？

やはり、英語圏のサービスなので英語で書くのがいいです。
日本語でプロンプトを書いてDeepLで翻訳したものをプロンプトにするのがいいです。

# GPTチャットボットを以前の状態に戻すには？

プロンプトが動かなくなった時などに使えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/bc4745de-8a55-839f-a6f4-9fd0e7ab7fa6.png)

# チャットボットの説明を改行するには？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/bcabc449-d839-7796-c320-ff6bc92b0f1d.png)
あまり、良い策ではないですが全角のスペースを入れると改行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/3f949486-01eb-e75a-0cca-bd9cbf8fb6d3.png)

# GPTのテストをしているとGPT-4の使用上限に達してしまう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/a4029929-a4e0-5b93-0eae-65aae9e6aa57.png)

「詳しくはこちら」をクリックするとフォームが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/9845df8a-a0d1-bcdc-6dd3-dbf36a70fa2f.png)

ここで上限に達してしまう理由を書いておくと制限の時間が短くなる。。。かも。。。
私の場合は少しは短くなったように思います。

# 写真をイラストにすると向きが反転する

写真を撮って、それを似顔絵にするチャットボットを作成したのですが、鏡像というようなのですが鏡に映ったように人物の向きが反転してしまいます。
たまにうまくいくのですが、どのような指示をしてもうまくいかず諦めました。
GPTの解析処理が向上するのを待つことにします。

# Pythonコードを使ってOCR解析（文字起こし）させるには？

Code Interpreterを有効にする。ただし、結構頻繁にOCR解析はエラーになるので使用するのをやめました。

# Knowledgeを使用する時のテクニック

## ・KnowledgeでCSVファイルを登録したが使用されない
　・Code Interpreterをチェックする

## ・データ抽出時のAnalyzingでエラーになる
　・１行目が表題か否かをプロンプトで説明する
　・表題の場合は列名をプロンプトで説明する
　・なぜエラーになったのかをChatgptに聞くｗ（素直に教えてくれます）
 
## ・データ抽出時のAnalyzingが遅い
　・CSVファイルの場合、Pythonでファイルが読み込まれるので「Pandasライブラリを使って」というように指示する
Databricks共有クラスターにおけるMLflowの活用

Databricksクラスターでアクセスモードを**共有**にすることで、複数人で一つのクラスターを共有することができますが、いくつかの制限を意識する必要があります。その中でも大きなものは**機械学習ランタイム**を使えないというものです。

https://docs.databricks.com/ja/compute/access-mode-limitations.html#shared-access-mode-limitations-on-unity-catalog

これは、そのままではMLflowでモデルの記録ができないことを意味します。機械学習ランタイムにはMLflowがプレインストールされています。

しかし、Databricksランタイム13.0以降ではシングルノードで動作する機械学習ライブラリ(scikit-learnなど)が動作するようになりました。

この記事では、実際に共有クラスターでMLflowを活用してみます。ここでは、Databricksランタイム13.3LTSを使っています。
![Screenshot 2023-11-21 at 10.10.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0350a0e5-9512-6432-9515-9c0916cf59cd.png)

まず、手動でMLflowをインストールします。`dbutils.library.restartPython()`でPythonカーネルを再起動してください。これを行わないと後のステップでエラーになります。

```py
%pip install mlflow
dbutils.library.restartPython()
```

ライブラリをインポートします。

```py
import mlflow
import numpy as np
import pandas as pd
import sklearn.datasets
import sklearn.metrics
import sklearn.model_selection
import sklearn.ensemble
```

データをロードして準備します。

```py
# データのロードと前処理
white_wine = pd.read_csv("/dbfs/databricks-datasets/wine-quality/winequality-white.csv", sep=';')
red_wine = pd.read_csv("/dbfs/databricks-datasets/wine-quality/winequality-red.csv", sep=';')
white_wine['is_red'] = 0.0
red_wine['is_red'] = 1.0
data_df = pd.concat([white_wine, red_wine], axis=0)

# ワイン品質に基づいた分類ラベルの定義
data_labels = data_df['quality'] >= 7
data_df = data_df.drop(['quality'], axis=1)

# 80/20でトレーニング/テストデータセットを分割
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(
  data_df,
  data_labels,
  test_size=0.2,
  random_state=1
)
```

MLflowのオートロギングを有効化します。

```py
# このノートブックでのMLflow autologgingを有効化
mlflow.autolog()
```

モデルのトレーニングとMLflowによるトラッキングを行います。

```py
with mlflow.start_run(run_name='gradient_boost') as run:
  model = sklearn.ensemble.GradientBoostingClassifier(random_state=0)
  
  # モデル、パラメータ、トレーニングメトリクスが自動でトラッキングされます
  model.fit(X_train, y_train)

  predicted_probs = model.predict_proba(X_test)
  roc_auc = sklearn.metrics.roc_auc_score(y_test, predicted_probs[:,1])
  
  # テストデータに対するAUCスコアは自動で記録されないので、手動で記録します
  mlflow.log_metric("test_auc", roc_auc)
  print("Test AUC of: {}".format(roc_auc))
```
```
2023/11/21 00:32:38 WARNING mlflow.utils.autologging_utils: MLflow autologging encountered a warning: "/databricks/python/lib/python3.10/site-packages/_distutils_hack/__init__.py:33: UserWarning: Setuptools is replacing distutils."
Test AUC of: 0.8834365701533531
```

トラッキングされました！
![Screenshot 2023-11-21 at 10.12.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c75cdf52-de5d-da90-085f-d067c4b03396.png)
![Screenshot 2023-11-21 at 10.12.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/12079513-de82-e506-52ba-57cee62f8989.png)

こちらの記事にありますように、共有クラスター自身、今後も改善してまいりますので、是非ご活用ください！

https://qiita.com/taka_yayoi/items/c33644f3f1cf23aeb65d

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
JavaScript　documentオブジェクト　徹底網羅　これで全部わかる


# documentオブジェクトとは

htmlファイルのページ全体を言う。

## documentオブジェクトの使い方

```
.プロパティ
```

```
.メソッド
```

のように指定して、呼び出す



## 個々のテクニック

1. getElementById
1. getElementsByName
1. createElement
1. document.write
1. document.forms
1. queryselector


えーと、無数にあるのでござる
[ES6] 関数のデフォルト引数

Reactのjsxやtsxでは多用されるが、本来の使いどころどういうパターンなのか調べた。
```demo.js
function fn(options) {
  console.log(options);
}

fn();
```

↑この場合、optionsが定義されていないのでconsoleはundefinedになってしまう。
```demo.js
function fn(options  = {}) {
  console.log(options);
}

fn();
```

↑こうすることでoptionsが何も設定されなくても空のオブジェクトが定義される。


これの何がよいのか。

今まで関数の引数を設定した場合、引数が入力されなかったときのためにこう書いていた。

```demo.js
function fn(options) {
  options = options || {};
  ...
}
```

この  options = options || {};　が必要なくなる。

このnullがきたときの対策は、TypeScriptやESLintを入れているとリアルタイムで解析してwarningやエラーを出してくれるので、そもそも最近は問題になることが少ない。

しかしJSでなんのLinterも入れていないが、昔だれかの書いたコードを修正しなければならないという状況では理解しておくべき点である。
wslでnerves その28

# 概要
wsl(wsl2じゃない)でnervesやってみる。
qemu(x86_64エミュレータ、ラズパイじゃない)でやってみた。
生成したnerves_livebook.imgを、quemで起動してテストしてみた。
練習問題、やってみた。

# 練習問題
fileを使え。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/98c3e427-993d-62ba-a658-a3cdc5f3d967.png)

# サンプルコード

```
File.write!("/data/livebook/hello.txt", "Hello, World")
content = File.read!("/data/livebook/hello.txt")
```

# 実行結果

```
Hello, World
```

以上。
wslでnerves その27

# 概要
wsl(wsl2じゃない)でnervesやってみる。
qemu(x86_64エミュレータ、ラズパイじゃない)でやってみた。
生成したnerves_livebook.imgを、quemで起動してテストしてみた。
練習問題、やってみた。

# 練習問題
nxを使え。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1f41fdab-6517-1851-30f7-c558dcba22ad.png)


# セットアップ

```
Mix.install([
  {:nx, "~> 0.6"}
])
```

# サンプルコード

xorを学習して、推定する。

```
defmodule Xor do
  import Nx.Defn

  defn init_random_params do
    key = Nx.Random.key(42)
    {w1, new_key} = Nx.Random.normal(key, 0.0, 0.1, shape: {2, 8}, names: [:input, :layer])
    {b1, new_key} = Nx.Random.normal(new_key, 0.0, 0.1, shape: {8}, names: [:layer])
    {w2, new_key} = Nx.Random.normal(new_key, 0.0, 0.1, shape: {8, 1}, names: [:layer, :output])
    {b2, _new_key} = Nx.Random.normal(new_key, 0.0, 0.1, shape: {1}, names: [:output])
    {w1, b1, w2, b2}
  end

  defn predict({w1, b1, w2, b2}, x) do
    x
    |> Nx.dot(w1)
    |> Nx.add(b1)
    |> Nx.tanh()
    |> Nx.dot(w2)
    |> Nx.add(b2)
    |> Nx.sigmoid()
  end

  defn loss({w1, b1, w2, b2}, x, y) do
    preds = predict({w1, b1, w2, b2}, x)
    Nx.mean(Nx.power(y - preds, 2))
  end

  defn update({w1, b1, w2, b2} = params, x, y, step) do
    {grad_w1, grad_b1, grad_w2, grad_b2} = grad(params, &loss(&1, x, y))
    {w1 - grad_w1 * step, b1 - grad_b1 * step, w2 - grad_w2 * step, b2 - grad_b2 * step}
  end

  def train(params, x, y) do
    for i <- 0..31, reduce: params do
      acc ->
        update(acc, x[i], y[i], 0.1)
    end
  end
end

z0 = for _ <- 0..31, do: Enum.random(0..1)
z1 = for _ <- 0..31, do: Enum.random(0..1)
x0 = Nx.tensor(z0)
x1 = Nx.tensor(z1)
y = Nx.logical_xor(x0, x1)
x = Nx.concatenate([Nx.reshape(x0, {32, 1}), Nx.reshape(x1, {32, 1})], axis: 1)

params = Xor.init_random_params()

Xor.loss(params, x[0], y[0])
|> IO.inspect()

params =
  for i <- 0..310, reduce: params do
    acc ->
      for i <- 0..31, reduce: acc do
        bcc ->
          Xor.update(bcc, x[i], y[i], 0.1)
      end
  end

Xor.loss(params, x[0], y[0])
|> IO.inspect()

IO.puts("0 1")

Xor.predict(params, Nx.tensor([0, 1]))
|> IO.inspect()

IO.puts("0 0")

Xor.predict(params, Nx.tensor([0, 0]))
|> IO.inspect()

IO.puts("1 1")

Xor.predict(params, Nx.tensor([1, 1]))
|> IO.inspect()

IO.puts("1 0")

Xor.predict(params, Nx.tensor([1, 0]))
|> IO.inspect()
```

# 実行結果

```
warning: variable "i" is unused (if the variable is not meant to be used, prefix it with an underscore)
  /data/livebook/xor.livemd#cell:zc3vabsfd6ftw2ineimecdebjxd3whxt:54

#Nx.Tensor<
  f32
  0.2594543695449829
>
#Nx.Tensor<
  f32
  9.000560385175049e-4
>
0 1
#Nx.Tensor<
  f32[output: 1]
  [0.9725738763809204]
>
0 0
#Nx.Tensor<
  f32[output: 1]
  [0.03000093437731266]
>
1 1
#Nx.Tensor<
  f32[output: 1]
  [0.02718157321214676]
>
1 0
#Nx.Tensor<
  f32[output: 1]
  [0.9590940475463867]
>
warning: Nx.power/2 is deprecated. Use pow/2 instead
  /data/livebook/xor.livemd#cell:zc3vabsfd6ftw2ineimecdebjxd3whxt:25: Xor."__defn:loss__"/3


```

以上。
ルーティングは設定順も重要！！

## 設定順を意識しないとどうなったか？
「id」を含むルーティングを指定した後、「id」を含まないルーティングに合わせてURLを入力しアクセスしたが、本来と違うアクションが動いてしまい、違うViewページを表示してしまった。


## ルーティングの設定順ミスによる事例
今回はProgateのRailsコースを例に、ルーティングの設定順を意識せずに指定するとどうなるかの事例を挙げてみました。

```routes.rb
Rails.application.routes.draw do
  get "signup" => "users#new"
  get "login" => "users#login_form"
  post "login" => "users#login"
  post "logout" => "users#logout"
  
  get "users/:id" => "users#show" ## idを含むルーティング
  get "users/:id/edit" => "users#edit" ## idを含むルーティング
  post "users/:id/update" => "users#update" ## idを含むルーティング
  get "users/index" => "users#index"
  post "users/create" => "users#create"

  get "posts/index" => "posts#index"
  get "posts/new" => "posts#new"
  post "posts/create" => "posts#create"
  
  get "posts/:id" => "posts#show"
  get "posts/:id/edit" => "posts#edit"
  post "posts/:id/update" => "posts#update"
  post "posts/:id/destroy" => "posts#destroy"
  
  get "/" => "home#top"
  get "about" => "home#about"
end
```
上記のルーティングで「users/index」にアクセスした後、こうなりました。
![スクリーンショット 2023-11-20 22.01.08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/718dfed2-7cea-c694-a300-2f7a3a08aad8.jpeg)

なぜエラーが起きたかを追求すると、
①「users/show」のViewを表示したということは、「users/:id」のルーティングにアクセスしてしまった
![スクリーンショット 2023-11-21 8.28.46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/f2667a13-ee6b-97a9-80f7-c7dcb628f486.jpeg)

②URLに「id」を指定していないから、Userモデルのレコードを取得できず、「〇〇のメソッドが定義されていない」というエラーが起きた

そこで「id」を含むルーティングを、「user」を含むルーティングの後ろに設定しました。
```routes.rb
Rails.application.routes.draw do
  get "signup" => "users#new"
  get "login" => "users#login_form"
  post "login" => "users#login"
  post "logout" => "users#logout"
  
  get "users/index" => "users#index"
  post "users/create" => "users#create"
  get "users/:id" => "users#show"
  get "users/:id/edit" => "users#edit"
  post "users/:id/update" => "users#update"

  get "posts/index" => "posts#index"
  get "posts/new" => "posts#new"
  post "posts/create" => "posts#create"
  
  get "posts/:id" => "posts#show"
  get "posts/:id/edit" => "posts#edit"
  post "posts/:id/update" => "posts#update"
  post "posts/:id/destroy" => "posts#destroy"
  
  get "/" => "home#top"
  get "about" => "home#about"
end
```
すると「users/index」にアクセス出来ました！！

![スクリーンショット 2023-11-21 8.13.16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/5d73a99f-5c80-f07b-fc93-9333b5f6e5e8.jpeg)


## 調べてみて分かったこと
最初はモデルからテーブルへの参照の仕方が間違っていると思い、Active Recordを見直したけど正しく指定されていました。
エラー解消に2時間も掛かってしまい、ルーティングの設定順を意識することの重要さを知りました(>_<)
「id」を含むルーティングと含まないルーティングが混同する状態で、URL指定時にルーティングがどう呼び出されるかを意識したいですね。
【Homebrew】絶対にエラーなく最速で R と Rstudio を Mac にインストールする方法

「日本の統計の授業のうち，全然統計の内容と関係ないのにとんでもない時間を奪っている」でお馴染みの R と RStudio のインストール．

そのような不毛な時間をなくすため，前回は Windows ユーザー向けに[【scoop】絶対にエラーなく最速で R と Rstudio を Windows にインストールする方法 #R - Qiita](https://qiita.com/ryu-takahashi2718/items/04702ac364821fc0e92d) という記事を書きました．

これで私の役目は終わった... と思いきや，Mac ユーザーって思ったよりも多いんですよね．

ということで，このたび Mac 編も作ることになりました．[この戦争を終わらせに来た](https://dic.pixiv.net/a/%E3%81%93%E3%81%AE%E6%88%A6%E4%BA%89%E3%82%92%E7%B5%82%E3%82%8F%E3%82%89%E3%81%9B%E3%81%AB%E6%9D%A5%E3%81%9F) というわけです．

では，茶番はこれくらいにして，内容に入りましょう！



## Mac に R と RStudio をインストールする方法

（今回は，僕が Mac ユーザーでないため画面のキャプションはなしです... すみません）

### ターミナルって言われてピンとくる人向け

1. ターミナルを起動する
1. 下にある「コピペコード 1」をターミナルに入力して，Enter二回，パスワード入力，インストール完了まで待つ（Homebrew のインストール）
1. Homebrew のインストール後，「コピペコード 2」をターミナルに入力する（Path の追加 & R と Rstudio をインストール）

コピペコード 1（出典：[Homebrew — The Missing Package Manager for macOS (or Linux)](https://brew.sh/)）
```bat
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

コピペコード 2
```
export PATH="/opt/homebrew/bin:$PATH"
brew install r
brew install --cask rstudio

```

これで終わりです．めっちゃ簡単だね！

### パソコンに自信ない人向け


1. 「Command」キーを押しながら 「Space」キーを押してください
1. 「terminal」と入力し，「Enter」キーを押してください（黒か白の画面が起動します）
1. Homebrew をインストールします（手順：[Homebrewのインストール #homebrew - Qiita](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)）
    1. 下にある「コピペコード 1」を，起動した黒か白の画面にコピペしてください．
    1. 黒か白の画面にコピペしたら，黒か白の画面をクリックした後，「Enter」キーを 2 回押してください
    1. パスワードの入力を求められるので，自分の Mac にログインする時に使うパスワードを入力してください
    1. しばらくお待ちください
    1. 「Installation Successful!」とか，「Next Step」とかが表示されたらインストール完了です．
1.  R と RStuio をインストールします
    1. 下にある「コピペコード 2」を，先ほど使った黒か白の画面にコピペして，「Enter」を押してください．
    1. しばらくお待ちください．
    1. 「あ，ダウンロード終わったかも」って感じの画面になったらインストール完了です．
1. アプリ一覧にある（はずの） Rstudio を起動してください．
    1. アプリ一覧がわからない人は，「Command」キーを押しながら「Space」キーを押して，「RStudio」と入力し，「Enter」キーを押してください．これで RStudio が起動できます．


コピペコード 1（出典：[Homebrew — The Missing Package Manager for macOS (or Linux)](https://brew.sh/)）
```bat
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

コピペコード 2
```
export PATH="/opt/homebrew/bin:$PATH"
brew install r
brew install --cask rstudio

```

 最後のステップで無事に起動ができていたら，インストール成功です！おめでとうございます！


## 参考

- [Homebrew と R と R Studio｜コアラさばお](https://note.com/mackerelman/n/nfbf8054e90d5)
- [Fix “brew command not found” on Mac with zsh](https://osxdaily.com/2023/04/19/fix-brew-command-not-found-on-mac-with-zsh/)
- [Homebrewのインストール #homebrew - Qiita](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)
- [Homebrew — The Missing Package Manager for macOS (or Linux)](https://brew.sh/)
各言語のplaygroundまとめ

直近、golangの現場で2年近くやらせていただいてるのですが、Go Playgroundめっちゃ便利ですよね！
バージョンも選べて、なおかつコードもシェアできて、ちょっと書いて実行して確認して、結果や内容を共有できるの最高です

いくら実行環境を簡単に用意できるような時代になったとはいえ、「ちょっと試したい」みたいなときってあるじゃないですか。
ということで、今回はいろんな言語のPlayground事情の調査も込めて、まとめていこうと思います

# go
https://go.dev/play/

# javascript
vueやreactまで？！これはすごい！！

https://playcode.io/

![スクリーンショット 2023-11-21 8.30.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323088/afccef1f-da3c-649b-7afa-ed6b4118869f.png)

# TypeScript
@takubii 様情報提供ありがとうございます！

https://www.typescriptlang.org/play

# node.js

https://stackblitz.com/edit/node-99aw1w

# HTML/CSS/javascript
そういえば 一時期流行りましたよね、まだ全然現役ですか？
この界隈は専門外でありますが、ちょっと修正いれたりみたいなことは全然あるので、最新事情知りたい

https://codepen.io/

# java
javaはいちいちコンパイル入れるの面倒でしたよね・・
結構前にjshellみたいなのも登場してるみたいですが、ブラウザで試せるのであれば簡単なものはブラウザでサクッと試したいですね

https://dev.java/playground/

# python
これは公式が提供してるものではなさそうだけど大丈夫かな・・

https://www.online-python.com/KXmLvup8J6

# PHP
これも公式ではないので利用注意ですね

https://php-play.dev/

こちらもよく使われるとのことで記載します（@takaram 様情報提供ありがとうございます！）

https://3v4l.org/

# kotlin

https://play.kotlinlang.org/

# swift
swiftはブラウザ版なしでアプリダウンロードしなきゃいけないんですね。Appleっぽいw

https://www.apple.com/jp/swift/playgrounds/

# Rust
@takubii 様情報提供ありがとうございます！

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021

# 最後に
本当にちょっとみないうちにdeveloper向けの便利ツールがどんどん出てきますね・・
すっごい助かる一方で、常に常識を疑い続けないと調べることすらしないし、せっかくの効率化手法を見逃して慣れた手法にこだわり老害化していってしまいそうで・・（ｺﾜｲ

「常に未熟者」の精神で驕ることなく、アンテナ貼って学び続けたいです
ncnnでReal-ESRGANを動かしてみる

ncnnでReal-ESRGANを動かしてみる


## 概要

Real ESRGANは画像を高精度に拡大する超解像モデルです。画像を高品質に拡大する際に、元画像のノイズを強く除去するため、従来よりも鮮明な画像を取得することが可能です。
ncnnで、画像を高解像への変換をしてみます。


## 環境構築
まず、M5UnitV2のクロスコンパイル環境を構築する手順で、ncnnやOpenCVをUbuntuにインストールします。

[M5UnitV2のクロスコンパイル環境を構築する手順](https://qiita.com/nnn112358/pbulic/9e15450265b689300216)

```
Ubuntu 22.04.3 LTS(x64)
OpenCV ver 0.4.4
ncnn ver 231027
```

## Stable-Diffusionのダウンロード

GitHubからQengineering氏のReal-ESRGAN-ncnn-Raspberry-Pi-4のコードをダウンロードします。

```
$ git clone https://github.com/Qengineering/Real-ESRGAN-ncnn-Raspberry-Pi-4
$ cd Real-ESRGAN-ncnn-Raspberry-Pi-4
```

## CMakeLists.txt ファイルの作成

cmakeでコンパイルするために、CMakeLists.txtを編集します。

```
gedit CMakeLists.txt
```

```CMakeLists.txt

SET(CMAKE_BUILD_TYPE "Release")

SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} --O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

#SET(TARGET_COMPILER "arm")
if(TARGET_COMPILER STREQUAL "arm")
    message(STATUS "TARGET_COMPILE STREQUAL arm")
    SET(CMAKE_CXX_COMPILER arm-none-linux-gnueabihf-g++)
    SET(CMAKE_C_COMPILER arm-none-linux-gnueabihf-gcc)
    SET(NCNN_INSTALL_DIR /opt/external/ncnn/install/arm/)
    SET(ZBAR_INSTALL_DIR /opt/external/zbar-0.10/build/arm)
    SET(OpenCV_DIR /opt/external/opencv/build/arm)
else()
    message(STATUS "TARGET_COMPILE STREQUAL X64")
    SET(NCNN_INSTALL_DIR /opt/external/ncnn/install/x64/)
    SET(ZBAR_INSTALL_DIR /opt/external/zbar-0.10/build/x64/)
    SET(OpenCV_DIR /opt/external/opencv/build/x64) 
endif()

set(Target "real_esrgan_ncnn")

PROJECT(${Target})
cmake_minimum_required(VERSION 3.5)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)

find_package(OpenCV REQUIRED)

if(OpenCV_FOUND)
 message(OPENCV_VERSION)
 message(STATUS "OpenCV_LIBS: ${OpenCV_LIBS}")
 message(STATUS "OpenCV_INCLUDE_DIRS: ${OpenCV_INCLUDE_DIRS}")
endif(OpenCV_FOUND)

include_directories(${OpenCV_INCLUDE_DIRS} )
include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${NCNN_INSTALL_DIR}/include)
include_directories(${NCNN_INSTALL_DIR}/include/ncnn)

add_executable(${Target} main.cpp realesrgan.cpp)

target_link_libraries(${Target} ${OpenCV_LIBRARIES})
target_link_libraries(${Target} ${NCNN_INSTALL_DIR}/lib/libncnn.a -fopenmp)


```


## ビルド
Ubuntu用のバイナリをcmakeでコンパイルして、生成されたバイナリを実行します。


```shell
$ cmake .
$ make
$  ./bin/real_esrgan_ncnn
```


## 注記
Stable Diffusionは大容量のメモリを消費するため、M5UnitV2で動作させることは困難です。


## 参考資料
この記事を作成するにあたり、以下のウェブサイトを参考にしました。
[Q-engineering/Real-ESRGAN-ncnn-Raspberry-Pi-4](https://github.com/Qengineering/Real-ESRGAN-ncnn-Raspberry-Pi-4)
AI-102試験対策のまとめ「Custom Visionプロジェクトの移動」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
### Custom Visionプロジェクトの移動
#### **プロジェクトIDの取得**
1. ソースアカウントのトレーニングキーとエンドポイントを使用して、「GetProjects」を呼び出す
    ```curl
    curl -v -X GET "{endpoint}/customvision/v3.3/Training/projects" -H "Training-key: {training key}"
    ```
1. 移動したいCustom VisionプロジェクトとそのID一覧を確認

#### **プロジェクトをエクスポート**
1. 下記を使用して「ExportProject」を呼び出す
    * プロジェクトID(以前の手順で確認)
    * ソーストレーニングキー
    * エンドポイント
    ```curl
    curl -v -X GET "{endpoint}/customvision/v3.3/Training/projects/{projectId}/export" -H "Training-key: {training key}"
    ```
1. 表示されたトークン文字列をコピー

#### **プロジェクトをインポート**
1. 下記を使用して「ImportProject」を呼び出す
    * トークン文字列(以前の手順でコピー)
    * ターゲットトレーニングキー
    * エンドポイント
    ```
    curl -v -G -X POST "{endpoint}/customvision/v3.3/Training/projects/import" --data-urlencode "token={token}" --data-urlencode "name={name}" -H "Training-key: {training key}" -H "Content-Length: 0"
    ```

* 参照
    - https://learn.microsoft.com/ja-jp/azure/ai-services/custom-vision-service/copy-move-projects

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「ビデオ内の人物認識のカスタマイズ」**

https://qiita.com/fsd-jume/items/7925e15ea72fdbd137d8

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
サーバーレスコンピューティングについて

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)


# サーバーレスコンピューティングとは
`サーバーレスコンピューティングとは、サーバーの管理や保守をすることなく、サーバー上でプログラムを実行する仕組み`です。
とは言っても、サーバーが存在しない訳ではありません。サーバーをサービスとして提供してくれる企業に対して、利用料を支払うことで、サーバーの運用や保守をすることなく、サーバーの機能のみを使用することができます。

# サーバーレスの特徴
サーバーレスは、イベントが発生したときにのみコードが実行される、__イベント駆動__ のアーキテクチャを特徴としています。これにより、無駄なリソース使用を最小限に抑え、コストの最適化が可能です。

# メリット/デメリット
### ■メリット
サーバーレスのメリットには、柔軟性、スケーラビリティ、費用対効果の向上が挙げられます。`必要なときにのみリソースが確保され、実行時間に応じて課金されるため、従来のインフラストラクチャと比べて非常に効率的`です。
### ■デメリット
逆にデメリットとしては、前述した通りイベント駆動であるため、プログラムが動作するまでに遅延が生じる可能性があることが挙げられます。


# 事例紹介
### ■Netflix
Netflixは、サーバーレスコンピューティングを使用して、動画のエンコード、ストリーミング、およびパーソナライズされたコンテンツ推薦などのタスクを効果的に処理しています。これにより、トラフィックの急増にも柔軟に対応できます。
### ■Airbnb
Airbnbは、サーバーレスコンピューティングを利用して、ユーザーのオンライン体験を向上させています。特定のイベントが発生したときに特定の処理を行うことで、シームレスかつ迅速なサービス提供が可能です。

# 終わりに
少し前から、大半のビジネスモデルはストック型からフロー型に移行しつつあります。クラウドサービスの一種であるサーバーレスコンピューティングも、例に漏れずフロー型のビジネスモデルです。
フロー型のビジネスモデルであるサーバーレスコンピューティングは、ますます主流のサービスへとなっていくでしょう。


最後までお付き合いくださりありがとうございました。
Streamlitで画像を読み込んで表示させたい

# はじめに
今回は、Pythonの代表的な画像処理ライブラリであるPillowとOpenCVを用いて、Streamlitで画像を読み込んで表示する方法についてまとめたいと思います。
普段Pillowを用いて読み込んでいましたが、OpenCVを用いて表示させようとしたところうまくいかなかったため、それの対処法を併せてまとめます。

# Pillowで読み込む場合
まずはPillowで読み込んだ場合について紹介します。

```python
import streamlit as st
from PIL import Image

file_path = st.file_uploader('', type=['png', 'jpg', 'jpeg'])
img = Image.open(file_path)
st.image(img)
```
簡単ですね。
必要最低限しか書いておりません。

# OpenCVで読み込む場合
一方、OpenCVで画像ファイルを読み込もうとした場合、OpenCVを使用している人からすると
```python
import streamlit as st
import cv2

file_path = st.file_uploader('', type=['png', 'jpg', 'jpeg'])
img = cv2.imread(file_path)
st.image(img)
```
となると思うじゃないですか？？？？？
これを実行したとき、

:::note alert
TypeError: Can't convert object to 'str' for 'filename'
:::

というエラーが生じます。

**なんでやねん！！！**
ファイル読み込んで、そのファイルをそのまま渡してるやんけ！
Pillowではうまくいったのに、なんでOpenCVだとできないんや！
とブチ切れているときに、暇～？って声かけてきた上司は未来永劫孫子の代まで恨みます。

このエラーについて調べてみると、
`st.file_uploader`から返されるオブジェクトは、ファイルのバイナリデータを含むものであり、直接 `cv2.imread`に渡すことはできず、`cv2.imread`はファイルパス (str) を受け取る関数であり、バイナリデータを直接渡すことはできない。とのこと。
よくわからんけど、strで渡せばええんやろと。

そして、以下が読み込むための対策
```python
import streamlit as st
import cv2
import tempfile

file_path = st.file_uploader('', type=['png', 'jpeg', 'jpg'])

if img_file:
    temp_file = tempfile.NamedTemporaryFile(delete=False)
    temp_file.write(file_path.read())

    img = cv2.imread(temp_file.name)

    temp_file.close()

    st.image(img)
```
このように、一時ファイルに一旦読み込んだファイルを保存し、その保存名を`temp_file.name`で引っ張ってきてます。
リソースの無駄遣いになるので、一時ファイルは不要になったら消しときましょうね（`temp_file.close()`）。
これでOpenCVで画像を読み込み、表示することができました。

# 追記
`imdecode`を用いることで直接データを渡すことができるようです。

```python
import streamlit as st
import cv2
import numpy as np

file_path = st.file_uploader('', type=['png', 'jpg', 'jpeg'])
# img = cv2.imdecode(file_path)
# st.image(img)

if file_path :
    # ファイルをバイト列として読み込む
    image_bytes = file_path.read()
    
    # バイト列から画像をデコードする
    img = cv2.imdecode(np.frombuffer(image_bytes, np.uint8), cv2.IMREAD_COLOR)

    # 画像を表示する
    # BGR チャンネルで表示（一般的な画像フォーマットはRGBであるため）
    st.image(img, channels="BGR")  
```

一時ファイルに保存する方法と画像をデコードして読み込む方法、どちらのコードが良いコードなのかはさっぱりです(;'∀')

# まとめ
今回はStreamlitアプリで画像を読み込み、表示させる方法を紹介しました。
基本的なことですが、StreamlitとOpenCVの仕様であったり、同じように困っている人のお役に立てば幸いです。
今後画像解析のライブラリはメインで勉強しようと思っておりますので、また備忘録として残していこうと思います。
それでは！！！
MacでApacheを立ち上げてみる

# Mabook Air上でApache を動かす

macbook上でapacheを試したいなーと思い
Bardとチャットしながら、apacheをインストール

## Apacheインストール
brewコマンドで
`brew install apache`

スタート
`sudo apachectl start`

## 動作確認
アクセスしてみた
`http://localhost`

**It works** とりあえず見れた！

## 設定ファイルの場所
しかし、
httpdの在処を探したものの見つからない・・・
Findコマンドでも見つからない
Finderでも見つからない・・・

`/usr/local/etc/apache2/httpd.conf`
Bardさんはここですよと言ってくれるけど、
見つかりません…。

色々彷徨った挙句、
`/etc/apache2`
発見！なんで見つかったのかはよくわからない
/usr/じゃなかったら、/etc？
みたいな安直な感覚で…。

`/private/etc`
というところにあったらし
privateはMacの隠しディレクトリらしい。

'/private/etc' でgoogle検索すると発見。

[Macで開発環境(Apache)の設定する方法]
https://qiita.com/yamaking/items/43e5ee7550dd078de222

## まとめ
まだAIには頼らずにちゃんとgoogle検索でやりたいことを
検索するのが速いのだと思いました。
そしたら他にも同じようなことをしている人たくさん。
いつも思っているけど、検索能力がいちばん大事なスキルだと思う。

初めての投稿でした。
内容も初心者な投稿でしたがお読みいただきありがとうございました。
インストールしたapacheを使って、
色々試したいことがあるので、
それは追って投稿したいと思います。

Qiitaも勉強しながらしながら書いてゆきます。
至らないこともあると思いますが…
よろしくお願いいたします。
windows 11 と　fedora　との　dual boot

実は　windows 11導入後　manjaro　linuxをいれてました
しかし　あまりにもmanjaroが順調なので　
退屈し　fedoraにかえました

https://www.youtube.com/watch?v=hLqe9v7GDfI

ただ　
初めての試みなので　
**間違った点**　があるとおもいますので
ご指摘ください




1
![IMG_20231121_052737.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/4de37efb-0d1d-90b8-c02b-6dabc22b2c36.jpeg)

と　
ラベル　　　　　　EFI
マウントポイント　/boot/efi
に注意

（疑問）
EFIをFEDORAでは　無理かな？


-----------
-----------
-----------

2
![IMG_20231121_052901.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/1dcf18b4-4d38-f48e-ad8e-8a58fb0eb1b2.jpeg)

btrfsにすると　ラベルは要求されない
しかし　
マウントポイントを　/root
にしないといけない



-----------
-----------
-----------



## インスト後　fedoraでみました

![IMG_20231121_060133.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/d5a9ad18-7665-fcd0-8f63-c1769d6acf56.jpeg)