OmniAICreator/Qiita-1.07M huggingface dataset:
SFTP 非同期

```
using Renci.SshNet;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

public class SftpManager : IDisposable
{
    private SftpClient sftpClient;

    public SftpManager(string host, int port, string username, string privateKeyFilePath, string passphrase = null)
    {
        var privateKeyFile = new PrivateKeyFile(privateKeyFilePath, passphrase);
        var keyFiles = new[] { privateKeyFile };

        var connectionInfo = new ConnectionInfo(host, port, username, keyFiles);

        sftpClient = new SftpClient(connectionInfo);
    }

    public async Task ConnectAsync()
    {
        if (!sftpClient.IsConnected)
            await Task.Run(() => sftpClient.ConnectAsync());
    }

    public async Task DisconnectAsync()
    {
        if (sftpClient.IsConnected)
            await Task.Run(() => sftpClient.Disconnect());
    }

    public async Task UploadFileAsync(string localFilePath, string remoteFilePath)
    {
        try
        {
            using (var fileStream = new FileStream(localFilePath, FileMode.Open))
            {
                await Task.Run(() => sftpClient.UploadFile(fileStream, remoteFilePath));
            }
        }
        catch (Exception ex)
        {
            HandleSftpException(ex);
        }
    }

    public async Task DownloadFileAsync(string remoteFilePath, string localFilePath)
    {
        try
        {
            using (var fileStream = File.OpenWrite(localFilePath))
            {
                await Task.Run(() => sftpClient.DownloadFile(remoteFilePath, fileStream));
            }
        }
        catch (Exception ex)
        {
            HandleSftpException(ex);
        }
    }

    public async Task DeleteFileAsync(string remoteFilePath)
    {
        try
        {
            await Task.Run(() => sftpClient.DeleteFile(remoteFilePath));
        }
        catch (Exception ex)
        {
            HandleSftpException(ex);
        }
    }

    // 他のメソッドも同様に非同期メソッドに変更

    public async Task<bool> IsConnectedAsync()
    {
        return await Task.Run(() => sftpClient.IsConnected);
    }

    private void HandleSftpException(Exception ex)
    {
        Console.WriteLine($"SFTP Error: {ex.Message}");
    }

    public void Dispose()
    {
        if (sftpClient != null)
        {
            sftpClient.Dispose();
            sftpClient = null;
        }
    }
}
```
Cusor エディタのAIチャットで現在ファイルからではなく Global Context で質問する

# 問題

プロジェクト全体 ( CodeBase  ) に関して質問したいのに、現在開いているファイルに対しての質問モードになってしまう

# 解決

`@CodeBase 質問文` と入力すれば良いようだ 

<img width="480" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/07194bc2-8f4a-4635-9005-29932f995ebd">



# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
WordPressがわからないので、環境構築を調べたら、他にもどんどんわからないことが出てきた

## 前提
筆者は職業訓練校でWordPressを学んだ人間です。
その程度のスキル感で記事をご笑覧いただければ幸いです。
また、HTML構築→WordPressへのオリジナルテーマ作成までは学んでおります。
その際は、Localで構築しました。


もちろんWordPressの環境構築の種類ってひとつじゃないことくらいは存じ上げております。
でも説明できるかといえば、できないのです。
つまるところ、やっぱり知識がない。

ということで、初心者なりにまとめていきたいと思います。

## ローカル環境構築比較

①Local
②XAMPP
③MAMP

聞き覚えはあるんですが、わかっていませんでした。
下記サイトを参考の上、まとめていきます。

https://www.conoha.jp/lets-wp/wp-local/

①Local
・初心者向け
・Webサーバー知識：不要
・本番環境との同期：△
・ユーザーインターフェイス：GUI
・データベース管理システム：MySQL
・Webサーバーソフトウェア：Apache（アパッチ）／Nginx（エンジンエックス）

②XAMPP
・中級者向け
・Webサーバー知識：必要
・本番環境との同期：△
・ユーザーインターフェイス：GUI
・データベース管理システム：MariaDB
・Webサーバーソフトウェア：Apache（アパッチ）

②MAMP
・中~上級者向け
・Webサーバー知識：必要
・本番環境との同期：△
・ユーザーインターフェイス：GUI
・データベース管理システム：MySQL
・Webサーバーソフトウェア：Apache（アパッチ）／Nginx（エンジンエックス）

## ざっとまとめたところで
わからない言葉が増えました！！！！！

というわけで、自分用にわからない単語をどんどん調べていきます。

・GUI（Graphical　User Interface)
    グラフィカルな表示システム
    直感的な操作が可能

・MySQL／MariaDB
    MariaDBはMySQLプロジェクトで比較的最近派生したDB
    MySQLはOracleが所有し、配布。MariaDBはオープンソース。
    MariaDBはMySQLより高速であることが多い

・Apache（アパッチ）／Nginx（エンジンエックス）
    Webサーバーソフト。
    Apacheは動的コンテンツ処理を得意とする小中規模向きのWebサーバーソフト
    NGINXは静的コンテンツをメインに大規模な処理や並列処理を得意とするWebサーバーソフト


## 最後に
PHPやWordPressを引き続き触る中で、わからないことはどんどん出てくると思うので、Qiitaでアウトプットできればと思います。
【ChatGPT有＋DALL-E3】与えた画像から特徴を解析して、描画指示プロンプトを作成するやり方（人物編）


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

　昨日はキャラ弁でした。今回は、人物編となります。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。

あしからず。
:::

　キャラ弁は
　　いかがでしたでしょうか？

　あのあと
　　キャラ弁画像制作に
　　　ハマってしまいましたw

　さて、今回は、
　　人物編です。

　しかし、
　　人物の特徴を
　　　抽出すると、
　　　　それだけになり、
　　　　　描画しても
　　　　　　つまりません。

　やっぱり、
　　背景やポーズなんかが
　　　欲しくなります。

　今回のものは
　　それを加味したものになります。

　では、どうぞ。
***
***user***
（元画像をアップ）
これは男性の画像です。
下記について、詳細な特徴を解析してください。
背景や男性の髪型、服装、どういう状況なのか、できるだけ詳細な情報を箇条書きでお願いします。

***ChatGPT***
画像の詳細な特徴は以下の通りです：

- 男性は中年で、銀髪と髭を持ち、目は緑色です。
- 髪型は短く、後ろに流れるように整えられています。
- 彼は洗練された紫色のジャケットに緑色のネクタイと白いシャツを着用しています。
- 右手には腕時計と指輪をしており、左手には赤ワインのような飲み物が入ったグラスを持っています。
- 背景はバーのような場所で、棚には様々なボトルが並べられています。
- 照明は暖色系で、全体的な雰囲気は落ち着いており、高級感があります。
- 彼はリラックスして座っているように見え、自信に満ちた表情をしています。

この画像は、都会の高級バーで一休みしている洗練された紳士を描いていると考えられます。

***user***
上記をDALL-E3に渡せるように、まとめ直して、プロンプトにしてください。描画はなし。

***ChatGPT***
以下はDALL-Eに渡すための詳細なプロンプトです：

A sophisticated middle-aged man with silver hair slicked back and a neatly trimmed beard, featuring piercing green eyes. He is dressed in a refined purple suit jacket, complementing a crisp white shirt and an elegant green tie. On his right wrist is a gold watch, and his left hand holds a glass of red wine. He is seated in a high-end urban bar, surrounded by shelves stocked with various bottles. The ambiance of the setting is warm and upscale, with dim lighting enhancing the luxurious feel. The man exudes confidence and relaxation, with a posture that suggests he is enjoying a break in his affluent lifestyle.

***user***
日本語で

***ChatGPT***
こちらはDALL-Eに渡すためのプロンプトを日本語でまとめたものです：

銀髪を後ろに流し、手入れの行き届いた髭を持つ中年の洗練された男性。彼の目は鋭い緑色で、洗練された紫色のスーツジャケット、クリスプな白いシャツ、エレガントな緑のネクタイを着用しています。彼の右手首には金の腕時計があり、左手には赤ワインのグラスを持っています。彼は都会の高級バーに座っており、様々なボトルが並んだ棚に囲まれています。環境は暖かく高級感があり、暗い照明が豪華な雰囲気を高めています。この男性は自信とリラックスした態度を漂わせ、裕福なライフスタイルの中で休憩を楽しんでいるように見えます。

***user***
まとめてもらった英文プロンプトをDALL-E3に渡して描画してください。

***ChatGPT***
（画像が描画される）
描画が完了しました。画像は上に表示されています。
***
　出力された画像は
　　いろいろとダメ出ししたい
　　　ところはありますが、
　　　　概ねOKです。

　ダメ出し
　・アニメイラストが、写実的に
　・男性の撮影位置が、真正面に
　・グラスを持つ手が、左右違う

　でもまぁ、
　　シブオジが
　　　できたので
　　　　おけまるです。

　こんな感じですが、
　　みなさんの
　　　作品制作の糧に
　　　　なれば、幸いです。

　今回は、ここまで。
Volumeを用いて、Kubernetesクラスタに作成したPodの中身を保持する

# 目的
[前回の記事](https://qiita.com/pqrst1987/items/aa51e82b3e75d06541f2)の通りにPodを作成すると、クラスタを再起動したときに作成したDjangoプロジェクトが消えると思います。今回はVolumeを用いてPodの中身を保持できるようにしたいと思います。

# 手順
#### 1. クラスタを作成する
```powershell
minikube start
```

#### 2. マニフェストファイルを作成する
次のようなファイルを作成し、保存します。resources:のフィールドは(Visual Studio Codeでは警告が表示されますが)省略可能です。
```yaml:django.yaml
apiVersion: v1
kind: Pod
metadata:
  name: django-pod
  labels:
    name: django-label
spec:
  containers:
  - name: django-container
    image: python
    command: ["sleep", "infinity"]
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
    volumeMounts:
      - mountPath: /app
        name: django-volume
  volumes:
  - name: django-volume
```

　次のコマンドを実行すると、Podが作成されます。django.yamlの部分はファイルを作成した場所やファイル名に応じて適宜相対パスで記述してください。
```powershell
kubectl apply -f django.yaml
```
　しばらく待ってから`kubectl get pods`を実行すると次のような結果が出力されると思います。
```
NAME         READY   STATUS    RESTARTS   AGE
django-pod   1/1     Running   0          16m
```
#### 3. Pod内部にDjangoプロジェクトを作成する
　次のコマンドを実行してPodにアクセスします。django-podの部分は、Podのメタデータとして設定した名前を入力します。
```powershell
kubectl exec -ti django-pod -- bash
```
　上のyamlファイルによってマウント先を/appに設定したので、/appディレクトリは保持されることになります。よってこの内部にDjangoプロジェクトを作成します。IPアドレスなどに留意してサーバーを起動するところまで行ってください。

#### 4. Podを外部に公開する（前回とほぼ同じ）
　別の端末で次のコマンドを実行します。ポート番号はDjangoのサーバーを起動させたときのポート番号と合わせてください。（nameオプションは任意）
```powershell
kubectl expose pod django-pod --name=django-service --port=8000
```
　`kubectl get services`を実行すると、次のような結果が出力されます。
```
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
django-service   ClusterIP   10.99.145.184   <none>        8000/TCP   8s
kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP    3h5m
```
　`minikube service django-service`と入力すると、ブラウザに"Congratulations!"ページが表示されると思います（`django-service`の部分は上で取得したサービス名を適宜入力）。Podを消去しない限りはクラスタを再起動してもDjangoプロジェクトの中身は保持されます。
Brainfuckを簡単に書けるサイトを作った

[Brainfuck Compiler](https://shinoshike005.github.io/brainfuck/compiler/)

打つコード量は増えますが、圧倒的に見やすくなります


# サンプル
```text:足し算
def x 1
def y 2

goto x
change = 4

goto y
change = 7

[
goto x
change + 1

goto y
change - 1
]
```
↓
```brainfuck:足し算
>++++>+++++++[<+>-]
# メモリ1に4+7で11が入る
```
```text:かけ算


def res 1

def a 2
def b 3
def copy1 4
def copy2 5
def copy3 6

def zero 48

goto a
input 0
change - zero
goto b
input 0
change - zero

# copy1へaを移動する
goto a
[
goto copy1
change + 1
goto a
change - 1
]

goto b
[

# copy1からcopy2とcopy3にコピーする

goto copy1
[
goto copy2
change + 1
goto copy3
change + 1
goto copy1
change - 1
]

# resにcopy3足す
goto copy3
[
goto res
change + 1
goto copy3
change - 1
]

# copy2をcopy1へ移動
goto copy2
[
goto copy1
change + 1
goto copy2
change - 1
]

goto b
change - 1
]

# 最後にキャッシュクリア
goto copy1
[
change - 1
]

# resへ移動
goto res
```
↓
```brainfuck:かけ算
>>,<<++++[->>----------<<]>>-------->,<<<++++[->>>----------<<<]>>>--------<[>>+<<-]>[>[>+>+<<-]>>[<<<<<+>>>>>-]<[<+>-]<<-]>[-]<<<
# 「3」を入力した後「7」を入力すると、「21」のようにかけ算ができます！(入力は0~9まで)
```
# 使い方
コードを入れて、Compileボタンを押すだけ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727822/92dd4c3c-a4ed-1dfa-eee5-59b8637c0f65.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727822/b9ad2ed2-a563-ca41-cfc6-0e96d2af0deb.png)

# コード
## 変数定義
Brainfuck Compiler内でのみ有効です。
```brainfuckcompiler:変数定義サンプル
def a 5
change = a
# ↓
# >+++++
# メモリ1に「5」が入る
```
## ポインター移動
```brainfuckcompiler:ポインター移動サンプル
goto 3   #メモリ3へ移動
goto + 2 #2つ次のメモリへ移動
goto - 1 #1つ前のメモリへ移動
```
## 文字表示
```brainfuckcompiler:文字表示サンプル
string A #メモリ1に65(Aの文字コード)を入れる
print    #メモリの内容を表示する -> A

def c C      #「C」を「c」に入れる
string var c #「C」の文字コード67をメモリに入れる
print        # -> C
```

## メモリ操作
```brainfuckcompiler:メモリ操作サンプル
change = 5 # メモリに5を入れる
change + 3 # メモリの値を3足す
change - 2 # メモリの値を2減らす

def three 3    # 「3」を「three」に入れる
change = three # メモリに変数「three」の値(3)を入れる
```

## ループ
```brainfuckcompiler:ループサンプル
# 3回繰り返す
change = 3
[
change - 1
]
```

## 文字列を出力する
```brainfuckcompiler:文字列出力サンプル
prints hoge #hogeを出力 ※変数には対応していません
```

## ユーザーに尋ねる
```brainfuckcompiler:inputサンプル
input 0 #ユーザーが入力する
print   #ユーザーが入力した最初の1文字を出力
```


Brainfuckが分かりにくくて困っている人はぜひ [Brainfuck Compiler](https://shinoshike005.github.io/brainfuck/compiler/) を利用してくださいね！
【奥が深い】エンジニアのお仕事

# はじめに

この記事はエンジニアという仕事そのものを知りたい方向けとなっています。

# エンジニアという仕事は奥が深い。
新卒でIT企業に入社した私は、大学でITの勉強をしていたわけでもなく
知識0の状態でこの業界に飛び込みました。

私と同じように「ITエンジニアって？」という基礎の部分から知りたい方に
是非ご覧になっていただきたいです。

ということで今回は、【エンジニアのお仕事】について紹介していきます。



# まずエンジニアとは・・
みなさん「エンジニア」という言葉から連想するお仕事は
どのようなものでしょうか。

そもそもエンジニアとは、機械・電気などの工学に関する、
専門知識や技術を持った技術者のことを指します。

しかし、これだけ聞いても具体的なイメージはつかないと思いますし、
まさかこの「エンジニア」という言葉の裏に沢山のお仕事があることも
なかなか想像がつかないかと思いますので、
この記事でエンジニアの仕事についてマルっとご説明していきます！


# エンジニアの種類
- **プログラマー**
プログラミング言語を使用してシステムなどを作っていく仕事です。
正しくシステムが作動するようにコンピュータに言語を用いて命令文を書き、不備のないシステムを作ります。
また、バグを発見したり対処も行います。
-主に使用する言語：Java,Python,PHPなど
<br>

- **システムエンジニア**
顧客と相談しながら、顧客にとって
1番良いシステム設計を行うことがメインのお仕事です。
工程として、「要件定義」「基本設計」「詳細設計」
「テスト」「運用保守」に分かれていますが、
「要件定義」「基本設計」「詳細設計」は上流工程と呼ばれています。
それに対して「テスト」「運用保守」は下流工程と呼ばれており、
プログラマーが主に担当しています。
<br>

- **インフラエンジニア**
IT業界における基盤や土台の部分（サーバーやネットワーク）
を整えることがメインのお仕事。
こちらも上流工程と下流工程に分かれており、
これからエンジニアになる方は下流工程のお仕事から行うことが
比較的多くなっています。
また、インフラエンジニアはさらに細分化されており、
「サーバーエンジニア」「ネットワークエンジニア」
「セキュリティエンジニア」と大きく3つに分けられています。
<br>

- **フロントエンドエンジニア**
　WEBサイトなどにおいて、利用者が実際に操作する画面などを
　設計・構築するエンジニアです。
　例）文字を入力する部分やクリックする部分
　<br>
 
- **バックエンドエンジニア**
WEBサイトなどにおいて、利用者からは直接見えない領域を幅広く担当するエンジニアです。
 業務領域は、サーバー構築・データベース構築・プログラム開発・運用など多岐に渡ります。
例）ユーザーが入力した内容のデータ処理、保存、情報出力など
<br>

- **フルスタックエンジニア**
フルスタックエンジニアとは、システムなどの開発～運用まで
様々な技術を持つエンジニアのことを指します。
つまりすべての仕事を網羅しているということです。
1人で上記で説明した部分を対応する為、大変な仕事ですが
その分やりがいも大きくなります。

# 最後に
いかがでしたでしょうか。
一括りにエンジニアといっても、その内容は多種多様。
私たちが普段使っているサービスは、色々なエンジニアの方によって支えられています。
記事を読んだみなさんが、ご自身が挑戦してみたいエンジニアはどこなのかを
少しでもイメージしていただくことができたら嬉しいです。
<br>

参考文献
LHH転職エージェントby The Adecco Group.
❝エンジニアとは? 主な種類や仕事内容をわかりやすく紹介❞.
https://jp.lhh.com/knowhow/smart/phase1/engineer-3(2024-1-26)
WinMergeでExcel、Word、PowerPointの差分を確認する

# はじめに

WinMerge：ファイル、フォルダ、画像などの比較、差分を確認する時に便利なツール

基本操作はこちらのページがわかりやすいです。

https://qiita.com/frozencatpisces/items/8f998720de8f2aaa7e37

# プラグインの設定

デフォルトではExcelファイルの比較が出来なかったので
プラグインの設定を以下のように変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/b32f299d-8f9c-83ee-c4a1-0d4c6996d913.png)



## WinMergeで比較した結果
てきとうなファイルを作成して、WinMergeで比較します。

### Excel

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/aed2c936-53b1-c3d0-394c-64af421550c6.png)

### Word

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/fb75a598-da4b-d4fb-e7af-4011046d4abb.png)

### PowerPoint

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/9834a80d-5ffd-fc12-e7a0-a98805974edb.png)


# 上手くいかない場合はこちらも参考にしてください。

https://tech.robotpayment.co.jp/entry/2023/03/23/070000

https://bashalog.c-brains.jp/18/04/03-180000.php
構造体の検索 - <__main__.Member object at 0x14d495bb28e0>というのが出る

https://paiza.jp/works/mondai/class_primer/class_primer__find

```py
class Member():
    def __init__(self, name, old, birth, state):
        self.name = name
        self.old = old
        self.birth = birth
        self.state = state
        
# main
N = int(input())
members =[]
for _ in range(N):
    member = Member(*input().split())
    members.append(member)

q = int(input())
for member in members:
    if member.old == q:
        print(member.name)
        break


```

クラスにmemberデータを突っ込んでそれを配列に入れて
そこから調べようと思ったんですが。出力がでませんでした。

そこでprint()をいれて結果を確認しようとしたのですが
```py
class Member():
    def __init__(self, name, old, birth, state):
        self.name = name
        self.old = old
        self.birth = birth
        self.state = state
        
# main
N = int(input())
members =[]
for _ in range(N):
    member = Member(*input().split())
    #memberの中身を確認する
    print(member)
    members.append(member)

q = int(input())
for member in members:
    if member.old == q:
        print(member.name)
        break


```
するとよくわからない出力が。

```
<__main__.Member object at 0x14d495bb28e0>
```
なんだろうこれ。
よくわからないので、一旦コードをじっくり見ていると
原因がわかりました。
クラスのoldって数字っぽいですけど、文字列として登録してるんですね。
ですが、その後、いつもの習慣で、q = int(input())と、数字型で出してしまったので
文字列型と数字型ではFalseになるので空白という結果になったのでしょう。
そこで、下記のようにint()を抜きます。

```py
class Member():
    def __init__(self, name, old, birth, state):
        self.name = name
        self.old = old
        self.birth = birth
        self.state = state
        
# main
N = int(input())
members =[]
for _ in range(N):
    member = Member(*input().split())
    print(member)
    members.append(member)

#下記のint()を抜く
q = input()
for member in members:
    if member.old == q:
        print(member.name)
        break


```
今度は正しく出力されました。

で、タイトルの通り、<__main...>ってのは何者か。
Google検索もしましたがわかったようなわからないような結果に
なったので、GPTを使う練習も兼ねて今日始めてGPT3.5で聞いてみました。

すると答えが。
```
Q. クラスの構造体を変数に入れて、printすると、 下記の出力が出ました。これは何ですか？
<__main__.Member object at 0x14d495bb28e0>

***
ChatGPTの答え:

この出力は、Pythonにおいてオブジェクトのデフォルトの文字列表現です。<__main__.Member object at 0x14d495bb28e0> のような表記は、そのオブジェクトが __main__ モジュールに属する Member クラスのインスタンスであり、メモリ上のアドレスが 0x14d495bb28e0 であることを示しています。

このデフォルトの文字列表現は、__str__ メソッドを定義していない場合や、__str__ メソッドがオブジェクトの適切な文字列表現を提供していない場合に表示されます。

以前のコードでは __str__ メソッドを追加していますが、もしまだこの出力が表示されている場合は、__str__ メソッドが正しく実装されていない可能性があります。__str__ メソッドを以下のように修正してみてください：
```

```py
class Member():
    def __init__(self, name, age, birth, state):
        self.name = name
        self.age = int(age)
        self.birth = birth
        self.state = state

    def __str__(self):
        return f"Name: {self.name}, Age: {self.age}, Birth: {self.birth}, State: {self.state}"

# main
N = int(input())
members = []
for _ in range(N):
    member = Member(*input().split())
    print(member)
    members.append(member)

q = int(input())
for member in members:
    if member.age == q:
        print(member.name)
        break
```
```
このように __str__ メソッドが正しく実装されていれば、
print(member) で上記のような出力ではなく、
オブジェクトの属性がわかりやすく表示されるはずです
```
実際に実装してみたところ、リアルに出力されました。
JuliaのPlotsで、フォントのサイズなどを設定する

# 目的
これをこうしたい。
| 変更前 | 変更後 |
| - | - |
| ![sin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/5e596644-5474-536d-55a7-04bac09c3c76.png) | ![sin2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/3d206de1-a782-ea9c-6f81-02f1797c60f1.png) |

# 方法
`default`を最初に定義することで、`Plots`の全体に設定を反映させます。

```julia
using Plots
default(
  fontfamily="serif-roman",
  guidefontsize=25,
  tickfontsize=15,
  legendfontsize=15,
  margin=5Plots.mm,
)

Θ = range(-π,π,100)

fig = plot(
    xlabel = "Θ",
    ylabel = "sinθ",
)
plot!(fig,
    Θ,
    sin.(Θ),
    label = :none,
)
```

# まとめ
自分なりの`default`を作成しておくことで、使いまわせてとても便利です。
それでは、私はどのようにChatGPTを使用しているのか？


<aside>
💡 この記事は別に見ました。主な内容は作者が1年間にわたってGPTを使用し、さまざまなコンテンツを作成した経験は、非常に啓発的です。作者の経験と私自身の理解を組み合わせ、それを日本語で表現することで、GPTの使用方法や遭遇する可能性のある問題を理解するのに役立ちます。記事で触れられている、GPTとの効果的なコミュニケーション、要求の表現、問題の解析能力などは、GPTを使用する際に考慮すべき重要な要素です。
</aside>


# 初め、インターンのようなもの

ChatGPTは、現在世界で最も優れた大型モデルであることに疑いの余地はありません。しかし、万能ではありません。

数学は得意ではありません。時には無関係なことを話すこともあります。

ほとんどの場合、下品な話題には付き合いません。

多くの友人とChatGPTの使用体験を共有する際、私はこんな比喩を用いることがあります：

> ChatGPTは、非常に真面目で学習能力が高く、まさに良い大学を卒業したばかりのインターンのようなものです。
> 

一方で、インターンとして、非常に柔軟であり、時間をかけて指導すれば、望むことを学び、指定された仕事を遂行することができます。しかし、インターンに過度な期待をするべきではありません。なぜなら、あるタスクにおいて最も精通しているのはあなた自身であり、インターンではありません。

現在の文脈では、その能力を過大評価しやすい一方で、将来的な潜在能力を過小評価してしまいがちです。市場に投入されてからわずか1年しか経っていないため、まだ誰もが簡単に扱える製品ではありません。したがって、未熟なインターンとして見ることは、現状において適切なアプローチかもしれません。

# まず、自分自身作れる

私の上司であるAさんはこんな言葉を残しました：

> リーダーとして、部下に任せる仕事は、自分もできなければならない。
> 

この言葉の裏にはこんな意味があります：自分が部下の仕事を理解しているからこそ、驚くことなく、適切に命令や指示を出すことができる。

この言葉は、ChatGPTにも非常に当てはまります。

大型モデルは容易に逸脱する可能性があり、万能ではないため、私たちが大型モデルを使用する際には、繰り返し性の高い作業を代行させることが多いです -- まさに自分の部下に仕事を任せるように。私たちが望むタスクについて、私たち自身が何の手がかりも持っていなければ、ChatGPTは確かにいくつかのヒントを提供できますが、完全な指示がなければ、望む結果をもたらすことはできません。

# 次、表せる能力

なぜ他の方がChatGPTを上手に使えるのに、私はただChatGPTと雑談することしかできず、何かを頼むと期待通りの結果が得られないのかと。

これは、表現力の問題かもしれません。

私たちが、ChatGPTに任せたい仕事が自分でできるものであることを確信しているなら、次のステップはその仕事の要求と手順をChatGPTに伝えることです。多くの人がこの点でつまずいています。

例えば、あるウェブページを作成していて、その右下に小さな球を配置し、マウスでクリックすると画面の周りを跳ねて、各跳ねるごとに減衰値を設定し、最終的に球が停止するようにしたいとしましょう。

この要求を新しいインターンに伝えたところ、彼は賢く、すぐに`JavaScript`でコードを書いてくれました。

しかし、コードを実行してみると：

- 球の跳ねる速度が正しくなく、自然に見えなかった
- 球が減衰する際、摩擦力だけを考慮しており、重力は考慮されていなかった

しかしながら、インターンは反論します：でも、上司、これらの要求は私に伝えられませんでしたよ。

この例は、中大型企業で働いたことのある人には馴染み深いものでしょう。チームが大きくなると、コミュニケーションは最大の障壁となります。この障壁は双方から生じます：

- 私はちゃんと説明したか
- あなたはちゃんと理解したか

私たちがインターンであれ、従業員であれ、ChatGPTであれ、何かをさせる際、その仕事の完全な説明は非常に長くなりがちですが、私たちは同僚との默契度を過大評価し、最も重要な部分だけを伝え、インターンが未経験者であることを見逃しがちです。

したがって、ChatGPTに要求をする際は、インターンとして扱うべきです：

- 頭の中で考えていることをすべて文字で表現する
- 必要であれば、正面から言い、逆からも言う
- フェイマン理論に従って、ChatGPTに自分の要求を自分の言葉で表現させ、要求が正しく理解されていることを確認する

ここで疑問に思うかもしれません。もし私がピクセルレベルで要求を説明するなら、自分でやるのと何が違うのかと。

違いはありません。前のセクションで強調した「繰り返し性が高い」という言葉に注目してください。もし、あなたが行う作業が将来的に繰り返す必要がないものであれば、一度自分で行うほうが、多くのコミュニケーション時間を節約できます。

すべての仕事が他人やChatGPTに任せるには適しているわけではありません。

# そして、問題を**解体する**

> 「Aさん、私はあなたの上司のBさんです。XXXプログラムを書いてください。要求はピクセルレベルでしっかり書いてありますから、それを参考にコードを書いてください。明日の朝5時までにコードを見せてください」
> 

うん、Bさんはすでに、インターンのAさんに要求をピクセルレベルで提示する方法を知っているようです。

しかし、翌日、BさんがAさんが提出したコードを見たとき、実装結果が完全に逸脱していた。

なぜでしょうか？

ここでは、2つの非科学的な概念を紹介したいと思います：

- 対話の長さ
- 実装の偏差

やはりインターンを例に取りましょう。10年の経験があるあなたは考えるかもしれません：

あなたがAさんと2時間にわたり一気に話し、その2時間の指示に従って仕事をするように言ったとして、彼が全部覚えていると思いますか？

あなたがAさんに一気に80個の仕事をさせ、各仕事が上下関係で繋がっているとして、彼が全ての仕事を正確に実行し、80個目の仕事であなたが望む完璧な結果を出すと思いますか？

物理的な現実において、これらの答えはおそらく否定的です。

なぜなら、対話が長くなるほど、インターンの理解能力は低下するでしょうし、実際には、あなたの表現の精密さも低下するでしょう。このようなマイナス同士の状況では、最終的な実装の偏差は大きくなるでしょう。そして、もしあなたがインターンに行わせたいことが複数の小さなタスクの連鎖で、各タスクが小さな実装偏差を生じる場合、最終的には大きな実装偏差が必然です。

だから、長文に対する大型モデルの理解能力を過大評価せず、また、長文での自分の論理的な表現力を過大評価せず、さらに、大型モデルが要求を正確に実現する能力を過大評価しないでください。
Power Apps で自動生成されたアプリで既定値の設定をする


# はじめに

以下の記事でも紹介した通り、現在、Power Apps では、以前より更に簡単に作成できるようになっております。

https://qiita.com/Takashi_Masumori/items/ae8b5c2d748ef45dfacf

例えば、以下のように SharePoint のリストを選択しただけで、新規登録、一覧表示、詳細表示、編集、削除等の機能が実装されているアプリの作成が出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/26a7a39b-9c28-407b-50e9-b7e8a3385059.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/35bb466c-72b5-c5f8-eeae-f28a861313ff.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/baea6c1f-87f2-5fff-4bc8-1844779eb4ee.png)

また、こちらのアプリ、ユーザーが使用するデバイスの画面サイズに応じて表示を最適化してくれるレスポンシブ (デザイン) なアプリとなり、モバイルでも利用可能です。

https://qiita.com/Takashi_Masumori/items/5332c415cf6ab1732fb4

そのため、Power Apps を新しく始める方の多くは、まずはこちらの方法でアプリを作ることになると思います。

また、Power Apps でアプリを作成する際、入力項目に既定値を設定し、出来るだけ利用者の負担を減らしたいというケースがございます。

しかし、こちらのアプリを利用する際、こちらのアプリの作りを踏まえ、少し工夫がいります。そのため、今回は、こちらのアプローチについて簡単に紹介します。

# アプローチ

まず、通常、SharePoint リストの選択肢列を利用する場合、以下のようにして既定値を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/69d6fb14-e2da-2dfe-b3b3-ec32e0e68441.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/9b9cbbd9-bf42-9a89-5c69-6a34be454026.png)

しかし、以下のデータを見ると、SharePoint リストに登録されているデータと矛盾しているようです。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/dd34997a-ed64-21b2-908f-044836d9e908.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a342fa3b-d092-552d-7071-9f2cbe7a7d22.png)

理由としては、こちらのアプリのフォームでは、以下のように、変数を利用してフォームのモードを切り替えており、上記のように既定値を設定すると、編集やビューモードの際にも、データソース上の値ではなく、既定値に設定した値を表示してしまうことになるためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/cb19970a-326b-5546-a759-fd7b77ebf4f5.png)

:::note
`Parent.Default` とは、特定のコントロール（ボタン、テキストボックスなど）が属する「親」コントロールのデフォルト値を参照するために使用されます。フォームが「編集」 「ビュー」モードの場合、`Parent.Default` はデータソース上の該当する行の値を表示します。フォームが「新規作成」モードの場合、Parent.Default は通常空白です。これは、新しいレコードにはまだデータがないためです。
:::

上記を踏まえ、以下のように修正します。端的に言うと、フォームのモードが新規の場合にのみ既定値を設定するということです。それ以外の際は、`Parent.Default`、つまり、選択したデータをそのまま表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/bd431bb4-3df4-df31-7031-37c952f1b538.png)

```
If(
    newMode,
    {Value: "新規"},
    Parent.Default
)
```

こちらにより、正しくデータが表示できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/99a5a366-48e2-08b9-745b-8a1aa7e631e9.png)

# まとめ

今回は、Power Apps で自動生成されたアプリで既定値の設定をする方法を紹介しました。自動生成されるアプリを利用するケース増えているという認識ですし、既定値を設定したいというニーズ高いという認識ですし、少しでも参考になれば幸いです。
タスクスケジューラーに新規作成したタスクが0xC000013Aのまま実行されない件の対応

# 現象

* タスクスケジューラーに新規作成したタスク。
* タスク上で右クリック → 『実行する』をやると、想定通りに実行できる。
* でも指定した時間になっても全く実行されない。
* 『前回の実行結果』は0xC000013A。
* タスクの履歴を見ると、成功or失敗の履歴すら残っていない。

# 対応

トリガーの『有効』のチェックボックスがOFFになっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9e8b6308-db73-f2db-9c57-1768f250037c.png)

これをONにしたら解決。

# 蛇足

**タスク上で右クリック → 『実行する』** は問題無く実行できてしまうのでマジで盲点でした…。

**初回実行がちゃんとできたか** の確認は大事です。

# バージョン

Microsoft Windows [Version 10.0.19045.3930]
JuliaのPlotsで、軸の桁や任意の文字列を設定する

# 目的
これをこうしたい。
| 変更前 | 変更後 |
| - | - |
| ![sin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/c922cdf8-5462-09bc-b62c-d15e4948f21d.png) | ![sin2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/73e77237-e478-ce7f-7b24-d7635a20f06b.png) |

# 方法
`@sprintf` と `plot`のオプションである`formatter`を用いる。
```julia
using Plots
using Printf: @sprintf

θ = range(-π,π,100)

fig = plot(
    xlabel = "θ",
    ylabel = "sinθ",
    xformatter = x -> @sprintf("%.1fπ",x/π),
    yformatter = y -> @sprintf("%.2f",y),
)

plot!(fig,
    θ,
    sin.(θ),
    label = :none,
)

```

# まとめ
`xticks`などで指定する方法もありますが、`formatter`も便利そうなので、ぜひいろいろ情報提供いただきたいです。
あと、`plot`の引数は縦書きで、Matplotlibのように`fig`を作成してから追記していく派です。
CSVファイルアップロードが上手くいかない時の解決策

## 起こったこと
PHP(laravel)でCSVアップロード機能を作成していたところ起こった事象。
CSVファイルのn行目のヘッダーの内容を確認しデータをDBに保存するという機能を作成していたのだが、ヘッダーの1列目を認識してくれないエラーが発生。
しかし、該当のCSVファイルはExcelから「名前を付けて保存」すると発生せず、正常にアップロードされるため困り果てていた。
CSVファイルの権限によるものではないかと考え調査していたが、めぼしい調査結果は得られずにいた。

## 原因
WinMergeで、元のファイルと「名前を付けて保存」し直したファイルを比較したところ、原因が発覚。
原因は「空行」だった。
実はCSVファイルデータのn-1行目には空行が入っており、それがSplFileObject::SKIP_EMPTYによって読み飛ばされていたことで、n行目のデータではなくn+1行目をヘッダーとして認識してしまい、それによりヘッダーが認識されずエラーが発生していたのだ。

```php:修正前データ
$file->setFlags(
          \SplFileObject::READ_CSV |      // CSVとして行を読み込み
          \SplFileObject::READ_AHEAD |    // 先読み／巻き戻しで読み込み
          \SplFileObject::SKIP_EMPTY |    // 空行を読み飛ばす
          \SplFileObject::DROP_NEW_LINE   // 行末の改行を読み飛ばす
        );        

$header = $file->fgetcsv();
for ($i = 1; $i < (n-1); $i++) {
                $header = $file->fgetcsv();
            }
```
ちなみに「名前を付けて保存」し直したファイルでは、空行部分に「,(カンマ)」が自動で入れられていたため、空行扱いされず正常にアップロードが完了してしまっていた。
## 解決策
ヘッダーの読み込みを1回減らしてあげることで解決した。
```php:修正後データ
$file->setFlags(
          \SplFileObject::READ_CSV |      // CSVとして行を読み込み
          \SplFileObject::READ_AHEAD |    // 先読み／巻き戻しで読み込み
          \SplFileObject::SKIP_EMPTY |    // 空行を読み飛ばす
          \SplFileObject::DROP_NEW_LINE   // 行末の改行を読み飛ばす
        );        

$header = $file->fgetcsv();
for ($i = 0; $i < (n-2); $i++) {
                $header = $file->fgetcsv();
            }
```
## 終わりに
SplFileObjectの存在を完全に見落としており、解決に2週間費やしました…。
大体のエラーはファイルのせいじゃなく自分が書いたコードのせいだという自分への戒めです。
【GO】Gormを使って子テーブルのデータを取得したい

# はじめに
GORMを使って親と子テーブルのデータを両方取得するのに苦労したので、備忘録として残しておきます。
GORMは[公式ドキュメント](https://gorm.io/ja_JP/docs/index.html)が丁寧に書かれているので、そちらも合わせてご覧いただくと良いかと思います。

# 結論
`preload`を使って子テーブルのデータを取得しました。
`preload`とは、Eager Loading（イーガーローディング）の一種で、メインのクエリと一緒に関連するデータを予め読み込む機能です。これにより、N+1問題を避けて子テーブルのデータを取得できます。
`JOIN`と`SELECT`を使うことでも子テーブルのデータを取得できたのですが、今回はより簡単に使える`preload`を採用しました。
以下の構造体を例に`Preload`の使い方を簡単に説明します。
```go
// UserがOrderをhas manyで持つ
type User struct {
	Name   string
	Email  string
	Orders []Order
}

// OrderがOrderDetailsをhas manyで持つ
type Order struct {
	UserID       uint
	Total        float64
	State        string
	OrderDetails []OrderDetails
}

type OrderDetails struct {
	ID          uint
	OrderID     uint
	Price       float64
	Quantity    int
}
```
## UserとそのOrdersを取得する
例えば、全てのUserとそれに紐づくOrdersを取得したい場合、以下のように記述します。
```go
var users []User
db.Preload("Orders").Find(&users)
```
クエリは以下のようになります。
```sql
SELECT * FROM `users`;
SELECT * FROM `orders` WHERE `user_id` IN (ユーザーのIDリスト);
```

## Ordersとそれに紐づくOrderDetailsを取得する
さらに、それぞれのOrderに紐づくOrderDetailsも取得したい場合は、以下のように記述します。
```go
db.Preload("Orders.OrderDetails").Find(&users)
```
クエリは以下のようになります。
```sql
SELECT * FROM `users`;
SELECT * FROM `orders` WHERE `user_id` IN (ユーザーのIDリスト);
SELECT * FROM `order_details` WHERE `order_id` IN (注文のIDリスト);
```
## Preloadするデータに条件指定を入れる
仮に`Order`テーブルから`state`が`shipped`であるレコードのみを取得し、それに紐づく`OrderDetails`も同時に取得したい場合は、以下のように記述します。

```go
var users []User
db.Preload("Orders", "state = ?", "shipped").
   Preload("Orders.OrderDetails").Find(&users)
```
クエリは以下のようになります。
```sql
SELECT * FROM `users`;
SELECT * FROM `orders` WHERE `state` = 'shipped' AND `user_id` IN (ユーザーのIDリスト);
SELECT * FROM `order_details` WHERE `order_id` IN (注文のIDリスト);
```

# 終わりに
上記のように`preload`を使うことで、簡単に子テーブルのデータを取得することができました。簡単に使えるのは大きなメリットなのですが、`SELCT`と併用できずテーブルのすべてのカラムを持ってしまうためデータが重くなるというデメリットもあります。必要とするデータに応じて`JOIN``SELECT`と柔軟に使い分けるのがいいと思います。
機会があれば、`JOIN``SELECT`を使ったデータの取得方法についても書いてみます。
win16 apiを叩きたい。

# 概要
win16 apiを叩きたい。
pc98エミュレーターに、ms-dos入れて、windows3.1入れて、turbo pascal入れて、窓を表示する。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/683a6846-1418-3416-bc6c-0ed47a9ea7e6.png)

# 手順

- anex86で、80mbのhdi作る。
- anex86で、hdiに、ms-dos3.3dをインストール。
- anex86で、hdiに、windows3.1をインストール。
- t98-nextで、hdiに、turbo　pascalをインストール。
- turbo pascalで、ソース書いて、run

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/140fd1dd-07c8-9d87-7e8f-74133579d418.png)

# サンプルコード

```
Program hello;
uses wincrt;
Begin
  Writeln('hello');
  Readln;
end.


```

以上。
UbuntuでphpとApacheを連携させる

# 概要
UbuntuでphpとApacheを連携させるのメモ。

# 現象
index.phpでechoしてもブラウザ上になにも表示されなかったので調べたところ、phpとApacheを必要があるらしい。

# 環境
Ubuntu 
```
$ cat /etc/issue
Ubuntu 22.04.3 LTS \n \l
```
php
```
$ php -v
PHP 8.3.2 (cli) (built: Jan 25 2024 15:18:05) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.2, Copyright (c) Zend Technologies
```
Apache
```
$ apachectl -v
Server version: Apache/2.4.52 (Ubuntu)
Server built:   2023-10-26T13:44:44
```
# 試したこと
1. 下記コマンドでphpモジュールを有効化する
``sudo a2enmod php``
下記エラーが出る
``ERROR: Module php does not exist! ``
2. Chat-GPTに聞いたところlibapache2-mod-phpをインストールする必要があるらしいが、libapache2-mod-phpはapt listしたらインストール済みだった。
3. またGPTくんに聞いてみる。解決策として下記二行をApacheの設定ファイルapache2.conf(/etc/apache2/apache2.conf)に追記することを提案していたのでやってみると解決。
この二行を追記することで、モジュールが読み込まれるらしい。※Apache2.4よりバージョンが低いとこの書き方とは違うみたいです。
```
   IncludeOptional mods-enabled/*.load
   IncludeOptional mods-enabled/*.conf
```

よくわからなかったのでGPTくんに聞いてみる。
```
Apacheでは、モジュールは.loadファイルと.confファイルの組み合わせとして提供されます。.loadファイルは、関連するモジュールを読み込むためのロードディレクティブ（例: LoadModule）を含みます。一方、.confファイルは、モジュールの設定やその他の関連設定を含んでいます。
```
途方に暮れていたところGPTくんに助けられました。あと、各ツールのバージョンを確認するのは大事ですね（泣）
以上、メモ書きですが誰かの参考になれば幸いです。

# 参考
- Chat-GPT4くん
- [【Ubuntu 20.04 LTS Server】Apache2とPHPを動かす](https://www.yokoweb.net/2020/08/14/ubuntu-20_04-apache-php/)
TCP/IPとは？

## TCP/IPとは？
世界で標準的に使用されている通信プロトコル
複数のプロトコルから構成されていますが、中心的な役割がTCPとIPなので、TCPとIPと呼ばれるようになった

## 階層とプロトコル

| 層 | 名称 | プロトコル | 説明 |
|:-:|:-:|:-:|:-:|
| 4  | アプリケーション層 | HTTP,HTTPS,SMTP,POP3,IMAP4,DHCP,DNS...  | 通信アプリケーションの機能  |
| 3 | トランスポート層  | TCP,UDP...| 　主にノード間のデータ転送の信頼性を確保する  |
| 2  | インターネット層  | IP,ARP,RARP,ICMP...  |  主にネットワーク間のエンドツーエンドの通信 |
| 1  | ネットワークインターフェース層  | Ethernet,PPP...  | ノード間の通信のための規定  |

## カプセル化と非カプセル化
### カプセル化
上の階層から順番にデータが渡され、渡される度にデータの送信に必要な情報がヘッダとしてデータの先頭に付与されます。

### 非カプセル化
カプセル化した情報が電気信号としてケーブルで通信相手のPCに送信されます。
送信された情報を受け取ったPCが電気信号を元のビット列に変換し、下の階層からヘッダを取り外して上の階層にデータが渡されます。
Google font をReactで使う(簡易版) @yukilulu0229

## 簡易版

[Google Fonts + 日本語](https://googlefonts.github.io/japanese/)

- 使いたいフォントを選択
- linkを書き込む
- cssに書き込む   
```index.html
<link href="https://fonts.googleapis.com/css?family=Noto+Sans+JP" rel="stylesheet">
```

```index.css
* {
  font-family: "Noto Sans JP", sans-serif;
}
```
メモ：POWER10 内蔵NVMeとLTO7テープ装置でバックアップ速度を比較してみた

IBM i のお客様でNVMe + POWER10サーバーでバックアップ時間を短縮できないか？というご相談があり、主題のテストを実施しました。

## テスト環境
    H/W POWER S1014 (POWER10) 1コア　100GBメモリ　NVMe 6.4TB x 2
    IBM i 7.4 
    LTO7はSAS接続
    仮想テープ装置の保管先ディレクトリはASP1のNVMe上に作成
    テストに使用した*ALLUSRのデータボリュームは約3TB程度です。

## テスト内容
基本的にはお客様環境の*ALLUSRを占有テストLPARに復元して、バックアップ時間を計測しました。
バックアップの方法はSAVLIBコマンドを記述したCLPを実行して開始・終了時間を計測しました。

## テスト結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/f3916b33-aa9a-f25b-d16b-630b2e371187.png)

### 考察
    ・LTO7比では内蔵NVMe上の仮想テープ装置メディア＊への保管では1/3未満の時間で保管できた
    ＊実態はIFS上のバイナリーファイルに保管されます
    
    ・LPARへの割当コアを1->4に増強すると、処理時間がさらに短縮された。（50分->37分）
    
    ・表には記載しませんでしたが、別テストでZLIB圧縮を指定してテストも実施しましたが総じてバックアップ時間は有意に長くなってしまいました。
Python：割り算の答えが浮動小数点数で返る理由


本日は ｢割り算の答え｣ が, 浮動小数点数で返る理由を書いてみます (o'(ェ)')_🐍

## 【 CPU の中身について】

　CPU という ｢計算処理を行う部分｣ において, その中身は, おおまかに ALU (整数を処理) と FPU (小数を処理) に, わかれています 🖥
<br>


## 【 ALU の特徴について】

　ALU は ｢小数の計算｣ が, できません。

　Python においては // (ダブル・スラッシュ) を使用しますと ALU により ｢割り算｣ が, 行われますが ｢整数｣ しか返せないので ｢商と余り｣ という ｢かたち｣ で計算し ｢商｣ のみが ｢答え｣ として, 返る仕組みに成っています。また ｢余り｣ を計算したいときは % (パーセント記号) を, 別途使用して計算します。このように ｢単純な割り算｣ に使用されます。
<br>

```python
#ALU：商の求め方
quotient = 10 // 3
print(quotient)  # 計算結果 3

#ALU：余りの求め方
remainder = 10 % 3
print(remainder)  # 計算結果 1
```
<br>

## 【 FPU の特徴について】

　FPU は ｢整数の計算｣ が, できません。

　　Python においては / (スラッシュ) を使用しますと FPU (または, 除算専用の装置) により ｢割り算｣ が, 行われますが ｢小数｣ しか返せないので ｢小数｣ で ｢答え｣ が, 返る仕組みに成っています。また FPU は ｢複雑な割り算｣ に使用されます。更なる高度な割り算の場合は, 別途, 除算専用の装置(除算器)が処理しています。
<br>

```python
#FPU：商の求め方
result = 10 / 3
print(result)  # 計算結果 3.333...
```
<br>


## 【整数と小数(浮動小数点数)の計算について】

　｢整数と小数の計算｣ においては ｢整数が小数に変換｣ されてから FPU で, 計算されます。ですので, その ｢答え｣ も ｢小数｣ で, 返ります。
<br>

```python
#整数と小数の計算
result = 1 + 1.0
print(result)  # 計算結果 2.0
```

<br>

## 【補足】
　以前は amazon のコメントにおいて ｢お返事｣ が, できたのですが, その ｢お返事機能｣ が, なくなってしまったため, よくある ｢疑問/質問｣ などについても Qiita 様々において, 書いていこうと思っております ✨
 
　また, この内容については, ぼくが書いている本で恐縮ですが, ４歩めのテキストの ｢コラム - ALU と FPU について｣ にて ｢図入りでもう少し詳しく解説｣ しております。もし, ご興味ありましたら, 何卒, よろしくお願いいたします (o'(ェ)')_🍵✨
<br>

### ＊ はじめてのプログラミング Python 入門者になるための４歩


https://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Python-%E5%85%A5%E9%96%80%E8%80%85%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%EF%BC%94%E6%AD%A9-toKoinX-ebook/dp/B0CBMFP53C?ref_=ast_author_mpb

<br>
<br>
VBAでExcelのシートを並べ替え

VBAでExcelのシートを並べ替え

ChatGPTにて生成したものを調整、
文章だけでソートプログラムの生成を指定すると
生成されたソートのロジックでエラーが発生し使えなかったので
ある程度ソースをChatGPTに指定しながら生成しました。

```vb
Sub MoveSheetsToTheEnd()
    Dim sheetOrder() As Variant
    Dim i As Integer

    ' シートの順番を指定
    sheetOrder = Array("Sheet1", "Sheet2", "Sheet3")

    ' シートを指定された順番に末尾に移動させる
    For i = LBound(sheetOrder) To UBound(sheetOrder)
        Sheets(sheetOrder(i)).Move After:=Sheets(Sheets.Count)
    Next i
End Sub
```
Windowsで作成したLambdaレイヤーで"Unable to import module"エラーが発生した場合の対処（の一つ）

LambdaでAPI等を作っていると外部ライブラリをLambdaレイヤーに追加するシーンが多々発生しますが、ローカルのWindows環境で外部ライブラリの動作確認をした後に、`pip install -t`してLambdaレイヤーを作成したらLambdaで以下のエラーが発生した際の調査メモ。
※他の原因（循環参照）でも同じエラーが発生するようなのでどちらが原因かは適宜判断

`[ERROR] Runtime.ImportModuleError: Unable to import module'lambda_function': cannot import name 'xxx' from partially initialized module 'xxx' (most likely due to a circular import)
`

# 環境
- ローカル環境：Windows
- Lambda：Python

# 原因
そのまま書いてありました。
要はライブラリにバイナリを含む場合は、インストール時の環境（Windows）とLambda実行環境（Amazon Linux）の差異でエラーになるようです。

> NumPy や pandas などのコンパイル済みコードを含む Python パッケージは、デフォルトでは必ずしも Lambda ランタイムと互換性があるとは限りません。pip を使用して、こうしたパッケージをインストールすると、そのパッケージでは、ローカルマシンのアーキテクチャ向けにモジュール名パッケージをダウンロードしてコンパイルします。Linux オペレーティングシステム (OS) を使用していない場合にそうすると、デプロイパッケージには Lambda Python ランタイムとの互換性がなくなります。

https://repost.aws/ja/knowledge-center/lambda-python-package-compatible

# 対処

「インストール時と実行時の環境が異なる」のが原因なので、環境の合わせ方で対処方法が何案かあります。

## 対処方法1：Windowsでpip installする際に、Lambda実行環境と同じ環境を指定する

上のリンクに記載がある対処です。一番お手軽な方法かなと思います。
以下の2行目以降をいつものコマンドに追加します。後は流れで。
※Lambda実行環境がPython3.9のアーキテクチャx86_64の場合
```
pip install hogehoge -t ./python \
    --platform manylinux2014_x86_64 \
    --implementation cp \
    --python-version 3.9 \
    --only-binary=:all: --upgrade \
```

## 対処方法2：Lambda実行環境とバージョンを揃えた環境でpip installする

こちらも動作を確認しました。
Python3.9であればデフォルトのCloud9環境で`pip install -t`するだけです。Python3.9ならこれはこれで楽です。

## 対処方法3: pypiからWheelファイルを直接ダウンロード

これは自分では試していないのですが、以下のブログにドストレートに書いてあったのでいけそうな気がします。

https://designare.jp/blog/noda/lambda%E3%81%AE%E5%A4%96%E9%83%A8%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AEimport%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E8%A7%A3.html

# 締め
re:Post以外に対処方法1に言及しているページが見当たらなかったので後世の方の為に残しておきました。以上です。

https://qiita.com/cyberBOSE/items/fe66c2049aaa04568d61
【UiPath】Orchestrator ユーザーのメールアドレス変更方法

# 概要
この記事では、オンプレ版Orchestrator にて、ユーザーのメールアドレスを変更する方法を記載します。
今回利用したOrchestratorはv22.10です。

以下の流れで実施します。

テナント側の情報を削除　⇒　管理ポータルでメールアドレスを変更　⇒　テナントに再割り当て

# 実施手順
１）対象ユーザーが割り当てられているロールを確認し、スクリーンショットを撮るかメモ帳等に記録をしておきます。
　テナント > アクセス権を管理画面 > ロールと権限を確認　にて、
・対象ユーザーに割り当てられているテナントロール
・対象ユーザーが割り当てられているフォルダー
・その時のフォルダーロール
を確認します。
![ロールと権限を確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532647/01683b7b-1435-d2cf-ff3a-b0521a149180.png)


２）Orchestratorテナントの「アクセス権を管理」画面にて、対象ユーザーをOrchestrator上から削除します。
　※Orchestrator上から削除しても、管理ポータル上には残ります。
　※「Administrator」ロールの付与されたユーザーの場合、削除前に「Administrator」ロールの割当てを解除しておきます。
![ユーザー削除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532647/8b94fee0-67c2-8128-1e3d-1d900616a754.png)

３）Orchestratorテナント > アクセス権を管理画面にて、「アカウントおよびグループを管理」をクリックします。
　管理ポータル（https://<;利用しているOrchestrator URL>/identity/management）に遷移します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532647/4df12d67-760c-1a40-5ef0-52f3fa1cad76.png)

 ４）管理ポータルで、対象ユーザーを編集してメールアドレスを編集します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532647/e86016ac-e6ce-7819-9fd8-c0ae69fd55fe.png)

５）Orchestratorテナントの「アクセス権を管理」画面にて、先ほど削除したユーザーを再度追加します。
　Orchestrator上でもメールアドレスが反映されていることを確認後、削除前と同じようにテナントロール、フォルダー割り当てをします。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532647/350536ed-2bf7-e74e-afe0-5e4afd563d8f.png)
CSSとは

# CSSとは
CSSとは「Cascading Style Sheets、カスケーディング・スタイル・シート」の略称になります。
主に文字の大きさや色を変える、背景の全体または一部の色を変えたりアニメーションを作ることができます。

HTMLファイルでCSSファイルを読み込むために基本的には以下のように記述します。
linkタグ内のhref=がCSSファイルの名前になります。
```html:CSSファイルの読み込み
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="sample.css">
<title></title>
</head>
<body>
</body>
</html>
```
HTMLファイルに直接書き込むことも可能ですが、どうしてもコードが長くなったり複雑になってしまうので訂正があった場合に対象の箇所を探すのに時間がかかってしまいます。
それを防ぐためにもCSSファイルを別に作成しCSSのみを記載すればコードもすっきりし見やすくなります。

## CSSファイル内の記述
```css:css
h1 {
    color : blue 
}
```
CSSの定義は基本的に3つの要素で構成されています。
* h1 = セレクタ　(HTML内の要素）
* color = プロパティ　(colorなら文字の色、font-sizeなら文字サイズなどたくさんあります。)
* blue = 値　(プロパティをどう変更するのかをしています。)

### 最後に
セレクタの指定方法、プロパティの種類、値の種類たくさんあります。
CSSを使いこなせばWEB製作の幅が広がり見た人に様々な印象を与えることが可能になります。
色んなプロパティと値を試してみましょう！
【Go言語】for文の奇妙な動作

# 奇妙な動作をするfor文

まず、最初に奇妙な動作をするコードの例を出します。
以下のコードでは、for文の中でgoroutineを実行している。 **main** のgoroutineが終了するのを防ぐために `sync.WaitGroup` を使用している。 (`sync.WaitGroup`を知らない人は[GoのWaitGroupを理解する](https://zenn.dev/yamato0211/articles/e3da679fd8dd6f)を参考)

```go
func main() {
	var wg = &sync.WaitGroup{}
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			fmt.Println(i)
			wg.Done()
		}()
	}
	wg.Wait()
}
```

[Go Playground](https://go.dev/play/p/x7rCyVdyO3j)

これを実行すると、

```:実行結果
10
10
10
10
・・・・
10
10
```

`i < 9` と設定しているので、出力されるのは9以下であるはずである。にもかかわらず、`10`が出力されて、ループは続行する。

ちなみに、**JavaScript** でも似たような事象を確認できる。以下コードでは、 [setTimeout()](https://developer.mozilla.org/ja/docs/Web/API/setTimeout)という非同期メソッドを使っている。

```javascript
for (var i = 0; i < 10; i++) {
  setTimeout(() => console.log(i))
}
```

```:実行結果
10
10
10
10
・・・・
10
10
```

# 解説

`for`文は、以下 3 つの主要なコンポーネントで構成される。

* キーワード`for`
* たとえば`i := 0; i < foo; i++`のようなステートメント
* ループする処理`{}`の中身

goroutineが生成されると、各ループでのスケジューリングのためにキューに入れられる。
一方、for文はgoroutineがスケジュールされて、実行される前に終了する。
for文の最後の実行では、forのステートメント自身はいつ停止する必かが分からない。したがって、i=9 のときでも、インクリメントされる。そして、i=10になると、for文のi < 10の結果が *false* になり、ループによる本体の実行が停止される。(下図参照)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156096/da5110db-b02e-2473-3030-8ba1c44dfa1a.png)

この奇妙な動作は、Go言語だけではなく、C言語から派生したすべてのプログラミング言語に当てはまる。

Golang では、インデックス変数はポインタとして渡される。

先ほどの、JavaScriptの例では、古い`var`宣言を使用していた。これは、Golang の `var` と同様にインデックス変数はポインタとして扱われる。
それに対して、`let`はループするごとに変数に更新された値をコピーする。(これをシャドーイングと呼ぶ)

以下は`let`で直した例である。

```diff_javascript
- for (var i = 0; i < 10; i++) {
+ for (let i = 0; i < 10; i++) {
  setTimeout(() => console.log(i))
}
```

`setTimeout()`は非同期であるが、マルチスレッドでは動かないので、0から順番に出力される。

```:実行結果
0
1
2
3
4
5
6
7
8
9
```

Golangでは、以下のようにインデックス変数を goroutine の引数に渡すと解決できる。

```go
var wg = &sync.WaitGroup{}
for i := 0; i < 10; i++ {
	wg.Add(1)
	go func(i int) {
		fmt.Print(i)
		wg.Done()
	}(i)
}
wg.Wait()
```

[Go Playground](https://go.dev/play/p/QEb-oQwYWKV)

並行処理なので、順番は不順だが、0 ~ 9 までの数値が以下のように出力される。

```:実行結果
9
4
0
1
2
3
7
5
8
6
```

また、シャドーイングを使用しても、同じことができる。(mattnさんから[コメント](https://qiita.com/twrcd1227/items/e7541a196d6bc1422dac#comment-8a28349b729aa3ab716d)いただきました。ありがとうございます。)


```diff_go
func main() {
	var wg = &sync.WaitGroup{}
	for i := 0; i < 10; i++ {
+		i := i  // 外側のiをシャドーイング
		wg.Add(1)
		go func() {
			fmt.Println(i)
			wg.Done()
		}()
	}
	wg.Wait()
}
```

[Go Playground](https://go.dev/play/p/HSF241rpDMY)

# 終わりに

Goの **v1.22** でこのGolangの振る舞いについて、改善しつつあるらしいです。

v1.22で最初と同じ以下のコードを実行すると

```go
package main

import (
	"fmt"
	"sync"
)

func main() {
	var wg = &sync.WaitGroup{}
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			fmt.Println(i)
			wg.Done()
		}()
	}
	wg.Wait()
}
```

```
9
5
6
4
2
3
7
8
0
1
```

となる
eqメソッドとは

# eqメソッドとは
eqメソッドとは、複数のHTML要素の中からインデックス番号を指定することで特定の要素だけを取得できるメソッドです。
基本的な記述方法は以下のようになります。
```js
$('セレクタ').eq(インデックス番号);
```
# 使用方法
実際にeqメソッドを使用する際は以下のように記述します。
```html
<ul>
    <li>りんご</li>
    <li>バナナ</li>
    <li>いちご</li>
    <li>メロン</li>
</ul>
```
```js
// li要素のいちごを赤色に変更
$('li').eq(2).css('color', 'red');

// li要素のりんごを取得
var apple = $('li').eq(0).text();
```
CSSメソッドとは

# CSSメソッドとは
CSSメソッドとは、jQueryからCSSを追加・取得・変更できるメソッドです。引数の1つ目にCSSのプロパティを入れ、引数の2つ目にプロパティの値を入れます。
記述方法は以下のようになります。
```js
$('セレクタ').css('プロパティ名', '値');
```
# 使用方法
実際に使用する場合は以下のように記述します。
```html
<h1 id="title">タイトル</h1>

<ul>
    <li>リスト1</li>
    <li>リスト2</li>
    <li>リスト3</li>
</ul>
```
```css
h1 {
    font-size: 28px;
}
```
```js
// li要素を赤色に変える
$('li').css('color','red');

//　h1要素のHTMLを取得する
var html = $('#title').html();

// h1要素のフォントサイズを取得する
var fontSize = $('h1').css('font-size');
```
indexメソッドとは

# indexメソッドとは
`index()`メソッドは、jQueryで使用されるメソッドの一つで、要素が兄弟要素の中で何番目に位置しているかを取得するために使用されます。
# 使用方法
以下の例では、li要素の中の`.active`クラスのインデックス番号を取得できます。`.active`クラスが複数ある場合は最初の要素のインデックス番号を取得します。
また、一致する要素が見つからない場合は、`-1`が返されます。
```html
<ul>
    <li>インデックス0</li>
    <li class="active">インデックス1</li>
    <li>インデックス2</li>
</ul>
```
```js
// activeクラスを持った要素はli要素の2つ目なのでインデックス番号の1が返る
$('li').index($('.active'));
// => 1

// sampleクラスを持ったli要素は存在しないため-1が返る
$('li').index($('.sample'));
// => -1
```
M3DBに引き寄せられたテレグラフ

<font color="Grey">*[Telegraf drawn to M3DB](https://aiven.io/blog/telegraf-drawn-to-m3db)の翻訳です。*</font>

2021年11月15日

# テレグラフがM3DBに引き寄せられる

Telegrafとその200以上のプラグインはメトリクスの収集には最適です。しかし、何万ものTelegrafエージェントからの入力を下流で処理できるシステムがあるでしょうか？

ここ数年で、Telegrafは、様々なスタック、センサー、システムのメトリクスを収集するためのオープンソースの標準となりました。それは、様々なシステムイベントを収集するための200以上の利用可能なプラグインを誇っています。これらのイベントは、保存と可視化のためにInfluxDBかPrometheusサーバーに送られる。


しかし、すべてのシステムが同じように作られているわけではない。メトリクスのフローがInfluxDBやPrometheusサーバーの計算能力を超えたらどうなるでしょうか？


垂直スケーリングは、あるポイントまでは機能します。InfluxDBの水平スケーリングにはエンタープライズ・ライセンスが必要だが、Prometheusには実行可能なオプションすらない。


数百、数千、場合によっては数万のTelegrafエージェントがメトリクスを生成している場合、あなたはどうしますか？恐れることはありません！


## M3とは？


M3はオープンソースの時系列データベースです。元々Uberによって開発されたM3のゴールは、簡単な水平スケーラビリティ、全てのメトリクスのためのセントラルストレージ、メトリクスの生成と消費のためのいくつかの標準的な業界インターフェースとの互換性を提供することです。特に、M3は100%Prometheus Query Language (PromQL)とInfluxDB Line Protocolフォーマットとの互換性があります。


数百億の時系列を保存するという既に実証済みの実績により、M3はInfluxDBやPrometheusバックエンドの完璧な代替となり、現在のTelegrafエージェントを維持することができます。


どうすればいいのか？クラウドでM3を提供しているのは？


## M3のためのAiven


Aivenは[M3をサービスとして](https://aiven.io/m3)提供する最初のクラウドプロバイダーの1つです。M3をサービスとして顧客に提供するだけでなく、[社内でも使用しています](https://aiven.io/case-studies/open-source-tools-provide-observability-for-aiven)。顧客の全てのVMとサービス(Aiven for Apache Kafka、Aiven for PostgreSQLなど)を1つのセントラルM3サービスで監視しています。


私たちは、CPU使用率、RAM使用率、ネットワークIO、ディスク使用率を含む数十のサーバーとプロセスメトリクスを監視するために、管理している全てのVMにTelegrafエージェントを配備しています。


素敵に聞こえますか？[詳細は開発者ポータルへ](https://developer.aiven.io/docs/products/m3db/howto/telegraf_local_example.html), しかし、一般論として、あなたができることは以下の通りです：


1.1.AivenコンソールまたはCLIで新しいAiven for M3サービスを作成し、メトリクスを収集します。
2.メトリクスのエンドポイントとしてTelegraf Agentをインストールします。
3.TelegrafをM3と統合し、実際にメトリクスを取得できるようにする。
4.メトリクスを可視化するために、Aiven for Grafanaサービスを作成する。
5.労働の成果を楽しむ！


はい、以上です。数回のクリックとキープレスでできることだが、決してロケット科学ではない。


## まとめ


Aivenのサービスをまだご利用でない方は<https://console.aiven.io/signup>から無料トライアルにお申し込みください！


また、[changelog](https://aiven.io/changelog)や[blog](https://aiven.io/blog)のRSSフィード、または[LinkedIn](https://www.linkedin.com/company/aiven/)や[Twitter](https://twitter.com/aiven_io)のアカウントをフォローして、製品や機能関連の最新情報をご確認ください。
Lasso回帰・Ridge回帰・ElasticNet回帰のまとめ

1 理論
線形重回帰(OLS)における損失関数を最小にする回帰モデルの自由度は一般的に(特にデータが少ない時に)高く、過学習を起こしてしまう可能性がある。これを対処するために、正則化と呼ばれる処理をした手法がLasso回帰・Ridge回帰・ElasticNet回帰である。
(正則化法における損失関数) = (OLSにおける損失関数)＋α×(ペナルティ)^n
ただし、α: ハイパーパラメータ、n: 1(Lasso)もしくは2(Ridge)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562476/ce69069a-7ce9-d50d-5518-8dda9950bd1c.png)
図1. (a)Lasso回帰、(b)Ridge回帰の損失関数の最小化[1]

図1(a)では楕円が(OLSにおける損失関数)、中心の四角形がL1ノルムを示している。Lasso回帰における損失関数はそれぞれの線形結合であるため、図上の接している箇所におけるパラメータを用いる時、損失関数は最小となる。接する箇所はL1ノルムの頂点であるため、特徴量の重みが0になりやすい。同様に図1(b)では楕円が(OLSにおける損失関数)、中心の円がL2ノルムを示している。接点におけるパラメータを用いる時、損失関数は最小となる。
ElasticNet回帰はL1とL2ノルムを加えた損失関数を用いており、αの他にノルムの混合割合をハイパーパラメータとして考慮する必要がある。

[1] J. R. Statist. Soc. B (1996) 58, No. 1, pp. 267-288

2 コード
Lasso、Ridge、ElasticNet回帰をクロスバリデーション、グリッドサーチを用いて行うpythonコードを示す。パッケージはscikit-learnを用いた。

```python3
from sklearn.datasets import make_regression
from sklearn.linear_model import Lasso, Ridge, ElasticNet
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt

# 仮想データセットの生成
X, y = make_regression(n_samples=1000, n_features=100, noise=0.1, random_state=42)

# データセットをトレーニングセットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# ハイパーパラメータのグリッドを定義
param_grid = {'alpha': [0.001, 0.01, 0.1, 1, 10, 100]}

# モデルとグリッドサーチの設定
models = {
    'Lasso': Lasso(),
    'Ridge': Ridge(),
    'ElasticNet': ElasticNet(param_grid_elastic_net={'alpha': [0.001, 0.01, 0.1, 1, 10, 100], 'l1_ratio': [0.1, 0.5, 0.9]})
}

for name, model in models.items():
    if name == 'ElasticNet':
        grid_search = GridSearchCV(model, param_grid_elastic_net, cv=5, scoring='neg_mean_squared_error')
    else:
        grid_search = GridSearchCV(model, param_grid, cv=5, scoring='neg_mean_squared_error')
    grid_search.fit(X_train, y_train)
    best_model = grid_search.best_estimator_
    y_pred = best_model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)

    # プロット
    plt.scatter(y_test, y_pred, alpha=0.3, label=name)
    plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2)
    plt.xlabel('実測値')
    plt.ylabel('予測値')
    plt.title(f'{name}回帰：予測値 vs 実測値')
    plt.legend()
    plt.show()

    print(f'{name}回帰の最適なパラメータ: {grid_search.best_params_}')
    print(f'{name}回帰のテストMSE: {mse}')
    print(f'{name}回帰のR^2値: {r2}\n')



```

3 Q&A
Q1. Lasso回帰とRidge回帰の特徴は？
A1. Lasso回帰：相関の小さい特徴量の重みを0にすることができ、スパースなモデルが得られることで、推定と変数選択を同時に実行できる。ただし特徴量を削りすぎて、真陽性の低下が起こる可能性がある。
Ridge回帰：相関の小さい特徴量の重みを0に近づけることができるが、特徴量は残したままにできる。ただし説明変数を多く選択してしまい偽陽性の増加に繋がる可能性がある。

Q2. 3つの手法のうち、どれを使ったらいいの？
A2. 単に精度の良いモデルを作るという目的であれば、計算コストが基本的に小さいので3つともモデルを作って評価して良いと思う。強いて選ぶなら、ElasticNet回帰はOLS、Lasso、Ridgeが含まれているため、ハイパーパラメータをグリッドサーチ・クロスバリデーションなどでチューニングしてElasticNetを用いれば良いのではないだろうか。ただし過学習により汎化性が落ちる可能性があり万能とは言えないため、LassoやRidgeも検討したら良いと思う。
特徴量選択により解釈性を高めたいのであればLasso回帰、EDAやVIFの計算などを通じて多重共線性が高いと分かればLassoもしくはRidge回帰を選ぶという選択肢もあると思う。
【DeviseTokenAuth】UnsafeRedirectError解消法

## はじめに

DeviseTokenAuthを使用している際に`redirect_to`が実行されると`UnsafeRedirectError`が発生します。

エラーに関する詳細は以下のページをご参照ください。

https://api.rubyonrails.org/v7.1/classes/ActionController/Redirecting.html#method-i-redirect_to

## 解消法

外部リダイレクトしているコントローラーに以下を追加します。

```rb
  def redirect_options
    { allow_other_host: true }
  end
```

## 参考

https://github.com/lynndylanhurley/devise_token_auth/pull/1599

https://github.com/lynndylanhurley/devise_token_auth/issues/1536