OmniAICreator/Qiita-1.07M huggingface dataset:
chartjs-plugin-datalabels　自分用メモ

仕事でグラフ使う

```js
import { Bar, Pie } from 'react-chartjs-2';
import { Chart, registerables } from "chart.js"
import ChartDataLabels from 'chartjs-plugin-datalabels';
Chart.register(...registerables)


const data = {
  labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange', 'Black', 'White', 'Gray', 'Brown', 'Pink'],
  datasets: [
    {
      label: '# of Votes',
      data: [12, 19, 5, 5, 2, 3, 8, 7, 4, 3, 6], // 値が0以外の項目を含むデータセット
      backgroundColor: [
        'red',
        'blue',
        'yellow',
        'green',
        'purple',
        'orange',
        'black',
        'white',
        'gray',
        'brown',
        'pink'
      ],
      borderColor: [
        'rgba(255, 99, 132, 1)',
        'rgba(54, 162, 235, 1)',
        'rgba(255, 206, 86, 1)',
        'rgba(75, 192, 192, 1)',
        'rgba(153, 102, 255, 1)',
        'rgba(255, 159, 64, 1)',
        'rgba(0, 0, 0, 1)',
        'rgba(255, 255, 255, 1)',
        'rgba(128, 128, 128, 1)',
        'rgba(165, 42, 42, 1)',
        'rgba(255, 192, 203, 1)'
      ],
      borderWidth: 1,
    },
  ],
};


const options = {
  plugins: {
    legend: {
      position: 'bottom',
    },
    datalabels: {
      color: '#fff',
      anchor: 'end', // ラベルをグラフの外側に表示
      align: 'start', // ラベルの位置を調整
      offset: 10, // ラベルのオフセットを調整
      clamp: true, // ラベルをグラフの内側に制限
      font: {
        size: 12, // フォントサイズを調整
        weight: 'normal' // フォントウェイトを調整
      },
      formatter: (value, ctx) => {
        return `${ctx.chart.data.labels[ctx.dataIndex]}: ${value}`;
      }
    }
  },
  // グラフのサイズや位置を微調整するためのオプション
  layout: {
    padding: {
      top: 20,
      bottom: 20,
      left: 20,
      right: 20
    }
  }
};


export default function App() {
  return (
    <>
      <div className="w-96">
        <div>
          <h2>Pie Chart Example</h2>
          <Pie data={data} options={options} width={1000} height={300} plugins={[ChartDataLabels]} />
        </div>
      </div>
    </>
  );
}

```


```js
{/* @ts-ignore */} 
 <Pie data={data} options={options} width={1000} height={300} 
```
【初心者】TypeScript文法を理解していくvol.4

## はじめに
引き続きTypescriptを学習していく。


## ジェネリクス
似ている構造の型を何度も定義していたら、共通化できそう。再利用していきます。

T・U・V・Wが好まれて使われます。

```.ts
// 型を定義する
type User = {
    id: number
    email: string
    name: string
}

// 引数にuserオブジェクトを引数として受け取る
// 数値を返す
type GetUserId = (user: User) => number

// 文字を返す
type GetUserName = (user: User) => string

const getUserId: GetUserId = (user) => {
    return user.id
}
const getUserName: GetUserName = (user) => {
    return user.name
}

// ジェネリクスパラメータを使用してみる
type GetUserProperty<T> = (user: User) => T
// GetUserProperty を使う

const getUserIdWithGeneric: GetUserProperty<number> = (user) => {
    return user.id
}
const getUserNameWithGeneric: GetUserProperty<string> = (user) => {
    return user.name
}
```

## ジェネリクスの宣言方法とバインド
ジェネリクスで抽象化された型に具体的な方を指定すること
書き方は4種類くらいあるが、いまいち理解が難しい。
```.ts
// ジェネリックの宣言方法1（完全な記法・スコープは個々のシグネチャ）
  type FindItem1 = {
    <T>(arr: T[], predicate: (item: T) => boolean): T | undefined;
    // (arr: T[], predicate: (item: T) => boolean): T | undefined;
  }
  // ジェネリックの宣言方法2（完全な記法・スコープはシグネチャ全体）
  type FindItem2<T> = {
    (arr: T[], predicate: (item: T) => boolean): T | undefined;
    // (arr: T[], predicate: (item: T) => boolean): T | undefined;
  }
  // ジェネリックの宣言方法3（省略記法・スコープは個々のシグネチャ）
  type FindItem3 = <T>(arr: T[], predicate: (item: T) => boolean) => T | undefined
  
  // ジェネリックの宣言方法4（省略記法・スコープはシグネチャ全体）
  type FindItem4<T> = (arr: T[], predicate: (item: T) => boolean) => T | undefined
```

## 型の拡大と const アサーション

```.ts
// ネストされたデータも再帰的に readonly とする
const company = {
    name: "toraco株式会社",
    address: {
      prefecture: "東京都",
      city: "千代田区"
    }
} as const
// 上書きできない
// company.name = "株式会社toraco"
// company.address.prefecture = "埼玉県"
```

## おわりに
型の使いこなしていけるようになるまではまだ遠い道のりな感じがする。少しずつ覚えていきたいな
Python + FastAPIにおけるDAOとDTOパターン（基本ほりさげ①）

※本記事はドラフト版です。

FastAPIでDaoとDTOパターンを使用する場合はどうするのか確認しました。

# Javaの例
PythonでDAOやDTOはやっぱりHitしないです。
まずは、Javaで確認していきます。

## DAOとDTOパターンについて（javaの例）
1. DAOパターン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3743252/63267128-54a9-25d0-9b3d-5a3896bfe31c.png)


1. 単純なDAO・DTOパターン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3743252/0e30e8b0-d8fc-12ae-e887-11e74eff6707.png)

1. DAO・DTOパターン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3743252/9d7ba519-55ba-3ae7-b76c-ba197d2a9f94.png)
引用：
https://note.com/yukoro/n/na9d0c961ceb4

# Python + FastAPI + SQLAlchemyで実現する場合
## そもそもFastAPIはどういう構成を推奨しているのか
### schemaについて

リクエスト・レスポンスがschemaになる模様
SQLAlchemyではmodelになる模様
https://fastapi.tiangolo.com/ja/tutorial/sql-databases/
Railsでメモリ使用量を削減できるメソッド

先日、rake taskを実行した際に、扱うレコード数が多すぎて、サーバーに負荷をかけてしまいました。その解決策として、役立つメソッドを知ったので、まとめています。
## メモリ使用量の削減
### - find_each
##### 使用例
```ruby:find_each.rb
Model.find_each do |model|
    model.update!(hoge: hoge)
end
```
1000件ずつレコードを取り出し、1レコードずつブロック内の処理を実行していきます。
Modelの内容を一度にすべて取り出すのではなく、1000件ずつ取り出すので、メモリ使用量を抑えることができます。

##### batch_sizeオプションを指定する場合(3000件ずつ)
```ruby:find_each.rb
Model.find_each(batch_size: 3000) do |model|
    model.update!(fuga: fuga)
end
```

取り出す件数を1000件ずつではなく、任意の件数にしたい場合は、batch_sizeオプションを使用することで、変更することができます。



### - find_in_batches
##### 使用例
```ruby:find_in_batches.rb
Model.find_in_batches do |models|
    hoge(models)
end
```
1000件ずつデータを取り出し、1000件のデータの配列として、ブロック内の処理を実行します。find_batchesでも同様に、batch_sizeオプションを使うことで、1回に取り出す件数を変更することができます。
[コツコツ学習]超初心者向けPC性能でこれだけ理解しておく

# パソコンは以下を押さえておけばよい

・CPU
・メモリ
・ストレージ

# CPU
「パソコンの頭脳」と呼ばれる存在。
主に制御や演算を行いパソコンの動作の命令を出す。
つまり、CPUの性能が高ければ複雑な動作でもスムーズに処理できる。

# メモリ
「作業する机の広さ」と表現される存在。
記憶装置の1つで、一時的に作業データを保存する領域のことであり、頻繁に大量のデータを書き換えるため処理速度は高い。（一度保存したデータは電源を切ると消える）
つまり、メモリが大きければ大きいほど同時に行える作業の数が増えたり、処理の負担が大きい動作でも行えるようになります。

# ストレージ
「作業する机の引き出しの大きさ」と表現される存在。
電源を切ってもデータが保存可能な記憶装置のことであり大きければ大きいほどデータを保存できる。

上記の3つを把握できていればある程度問題なし！
「きょうのピオリ゚、おやきピオリ゚、とりなおし」はUniversal Dependenciesで書けるのか

『南島歌謡大成 Ⅲ宮古篇』(角川書店、1978年6月)を読んでいたところ、「屋根葺き祝いのおこざらぴゃーすの歌(伊良部島)」(pp.117-118)の以下の一節が気になった。

> やーのぬす　とつのぬすが　やーいきー
> とつの主と　やーぬ主とが　だんがしー
> きょうのぴおり゚　おやきぴおり゚　とりなおし

「り」に半濁点が付けられているのだが、この記法は同書の「音節分類表」(pp.461-462)には見当たらない。この歌は、大川恵良『伊良部郷土誌』(1974年8月) p.155「[オコザラピャースの歌](https://dl.ndl.go.jp/pid/9770133/1/82)」が元ネタらしいが、そこでは微妙に記述が異なっている。

> やーのぬす、とつのぬすが、やーいきー
> とつの主と、やーぬ主とが、だんがしー
> きょうのピオリ゚、おやきピオリ゚、とりなおし

[3月18日の記事](https://qiita.com/KoichiYasuoka/items/0671e0088bbe24151868)のアイデアを敷衍して、Universal Dependenciesで書いてみよう。

```
1	やー	_	NOUN	名詞-普通名詞-一般	_	3	nmod	_	SpaceAfter=No|Translit=jaː
2	の	_	ADP	助詞-格助詞	_	1	case	_	SpaceAfter=No|Translit=nu
3	ぬす	_	NOUN	名詞-普通名詞-一般	_	11	nsubj	_	SpaceAfter=No|Translit=nusɿ
4	、	_	PUNCT	補助記号-読点	_	3	punct	_	SpaceAfter=No
5	とつ	_	NOUN	名詞-普通名詞-一般	_	7	nmod	_	SpaceAfter=No|Translit=tcɿ
6	の	_	ADP	助詞-格助詞	_	5	case	_	SpaceAfter=No|Translit=nu
7	ぬす	_	NOUN	名詞-普通名詞-一般	_	3	conj	_	SpaceAfter=No|Translit=nusɿ
8	が	_	ADP	助詞-格助詞	_	7	case	_	SpaceAfter=No|Translit=ga
9	、	_	PUNCT	補助記号-読点	_	7	punct	_	SpaceAfter=No
10	やー	_	NOUN	名詞-普通名詞-一般	_	11	obl	_	SpaceAfter=No|Translit=jaː
11	いきー	_	VERB	動詞-非自立可能	_	23	advcl	_	Translit=ikiː
12	とつ	_	NOUN	接尾辞-名詞的-一般	_	14	nmod	_	SpaceAfter=No|Translit=tcɿ
13	の	_	ADP	助詞-格助詞	_	12	case	_	SpaceAfter=No|Translit=nu
14	主	_	NOUN	名詞-普通名詞-一般	_	23	nsubj	_	SpaceAfter=No|Translit=nusɿ
15	と	_	ADP	助詞-格助詞	_	14	case	_	SpaceAfter=No|Translit=tu
16	、	_	PUNCT	補助記号-読点	_	14	punct	_	SpaceAfter=No
17	やー	_	NOUN	名詞-普通名詞-一般	_	19	nmod	_	SpaceAfter=No|Translit=jaː
18	ぬ	_	ADP	助詞-格助詞	_	17	case	_	SpaceAfter=No|Translit=nu
19	主	_	NOUN	名詞-普通名詞-一般	_	14	conj	_	SpaceAfter=No|Translit=nusɿ
20	と	_	ADP	助詞-格助詞	_	19	case	_	SpaceAfter=No|Translit=tu
21	が	_	ADP	助詞-格助詞	_	19	case	_	SpaceAfter=No|Translit=ga
22	、	_	PUNCT	補助記号-読点	_	19	punct	_	SpaceAfter=No
23	だんが	_	VERB	名詞-普通名詞-サ変可能	_	32	advcl	_	SpaceAfter=No|Translit=daŋga
24	しー	_	AUX	動詞-非自立可能	_	23	aux	_	Translit=siː
25	きょう	_	NOUN	名詞-普通名詞-副詞可能	_	27	nmod	_	SpaceAfter=No|Translit=kyuː
26	の	_	ADP	助詞-格助詞	_	25	case	_	SpaceAfter=No|Translit=nu
27	ピオリ゚	_	NOUN	名詞-普通名詞-一般	_	32	obj	_	SpaceAfter=No|Translit=pjuːɿ
28	、	_	PUNCT	補助記号-読点	_	27	punct	_	SpaceAfter=No
29	おやき	_	NOUN	名詞-普通名詞-一般	_	30	nmod	_	SpaceAfter=No|Translit=ujaki
30	ピオリ゚	_	NOUN	名詞-普通名詞-一般	_	27	appos	_	SpaceAfter=No|Translit=pjuːɿ
31	、	_	PUNCT	補助記号-読点	_	30	punct	_	SpaceAfter=No
32	とり	_	VERB	動詞-一般	_	0	root	_	SpaceAfter=No|Translit=turi
33	なおし	_	AUX	動詞-非自立可能	_	32	aux	_	Translit=noːsɿ
```

![iravc.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/41a31915-c701-78e6-1f8e-983a0a4c2b9c.jpeg)

「ピオリ゚」を[pioɭ]ではなく[pjuːɿ]とみなしていいかどうか、などなど悩ましい点が残っているが、とりあえず私(安岡孝一)なりに書いてみた。ただ、LEMMA(辞書見出し形)を決めることができないのは、作業上かなり苦しい。[『南琉球・宮古語 池間方言辞典:西原地区版』](https://doi.org/10.15084/0002000172)は、近いけどやっぱり違うし、さて、どうしたらいいかなあ。
[コツコツ学習]コンパイルとは

# コンパイルとは
人間がわかる言葉で書いたものをコンピューターが分かる言語に翻訳すること


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766869/bd6aa2cf-fff7-283f-e9ca-80208e49439d.png)

基本的にプログラミング言語を機械語に翻訳する必要があります
ただこの作業のタイミングがインタプリタ言語とコンパイラ言語では異なります

# インタプリタ言語
代表的言語：pythonやJavaScript

Aを実行するタイミングで、1行ずつコンパイルを行いながら処理
Aプログラム > 1行ずつ翻訳 > 1行ずつ実行

# コンパイラ言語
代表的言語：Java

AをコンパイルしたファイルBを作成してBを実行する
Aプログラム > コンパイル > ファイルB > 実行

参考

https://www.akkodis.co.jp/candidate/insight/column_76

# コンパイラ言語とインタプリタ言語の比較

### コンパイラの特徴

実行時の処理速度が比較的に速くてCPUのかかる負荷が小さい
大量の処理や負荷が大きい処理を行う中規模以上のアプリケーションに採用される
しかし最初にすべてをコンパイルする必要があるので気軽に確認ができない

### インタプリタの特徴
ソースコードを書いたらすぐ実行して動作を確認することができる
ただ一行ずつコンパイルしていくのでコンパイラ言語よりも実行処理が遅くなる

# コンパイルと実行の方法
1.ディレクトリの移動「cd　移動先の絶対パス」
2.コンパイル「javac　ファイル名.java」
3.コンパイルが通ると、クラスファイル（拡張子が.class）が同じディレクトリ内にできる
4.クラスの実行「java class名」

https://nobuo-create.net/java-beginner-2/

# eclipseでのビルドとは
コンパイルとリンクをまとめてビルドという
- コンパイル・・・コンピューターが分かる物に変換すること
- リンク・・・コンパイルされたファイルとライブラリファイルを組み合わせて実際に実行できるファイルを作成することお

# eclipseのクリーンとは
全てのビルド成果物を削除して全てのモジュールをビルドし直すことです。


https://qiita.com/seyseyisse/items/cd67c71be4a1fe644407


そのためeclipseでクリーンすることで、修正した箇所のコンパイルしたファイルを作成かつ実行できる状態にしてくれるので変更が反映されるってことなんだな
英数字のランダム文字列をRubyで生成する

# はじめに
最近、Qiitaに投稿することに少しハマってます。
以前ははてなブログに書いていたのですが、Qiitaの方が綺麗に書けるので
それもあります。

つべこべ言わずに始めましょう

# 結論
使うのは次のコードになります。

大文字小文字含む文字数7の英数字を10個生成します。

```
10.times do |i|
    p [ *'a'..'z', *'A'..'Z', *0..9].sample(7).join
end
```
# 説明
- `*`について
アスタリスクは展開をしてくれます。
今回の場合だと'a'..'z'や'A'..'Z'、0..9を展開します。
流石に
abcdefghijklmnopqrstuvwxyzABCDEFGHYJKLMNOPQRSTUVWXYZ0123456789
を配列に書くわけには行かないですからね。

- sample(n)
配列に作用させるとnこの文字列を重複なしで抽出し、新しい配列を生成します。

- join
作用させた配列の各要素を指定した文字列で連結した文字列を返します
今回は特に指定していないのでそのまま区切り文字を使わずに連結します。

# 終わりに
以上です！

アスタリスクの理解は慣れませんが、少しづつ慣れていきたいかと思います！

私、初心者なのでこれからも頑張ります！！
Snowflakeのアカウントを作成してみた

# 背景・目的
以前、[Snowflakeの概要を整理してみた](https://qiita.com/zumax/items/994141fa0d1ca60991f3)でSnowflakeの特徴について整理しました。

今後、実際に触って試すためアカウントを作成します。


# 実践

1. Snowflakeのサインアップページで下記を指定し、「次へ進む」をクリックします
    - 氏名
    - メール
    - 会社名
    - ロール
    - 国
    <img width =300 src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c1b0e02e-8112-f079-ac34-c9cdab5e1202.png" />

1. 下記を入力し、「はじめる」をクリックします
    - Snowflake Edition：スタンダード、エンタープライズ、ビジネスクリティカルのいずれか
    - クラウドプロバイダー
    - リージョン
    - 規約の同意
    <img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/db4f72bb-a314-5d95-20cd-1fce0d5f1d41.png" />

1. 「トライアルにサインアップする理由」について、入力し、「次へ進む」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/26611d26-a5c5-4dfd-68d1-dc53ccaa080a.png" width=300 />

1. 使用目的を入力し、「次へ進む」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c2bc5ac8-adfa-484d-51fa-bc548dbb6e34.png" width=300 />

1. 使用する優先言語を入力し、「送信」します
1. サインアップされましたが表示されます。アクティベーションメールが送信されたとのこと
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/75dc38ab-f999-5eee-30fd-ee382da41b62.png" width=300 />

1. メールが送られてきますので「CLICK TO ACTIVATE」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e7a75985-d7a4-91a9-a6ad-06a36538f085.png" width=400 />

1. 下記を入力し、「はじめる」をクリックします
    - ユーザ名
    - パスワード
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ed69920d-3cce-d3fa-a46c-58b01a0604b4.png" width=300 />

1. サインインできました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5a7ebba6-96e0-c69d-a32b-b10a47a29226.png)


# 考察
今回、Snowflakeアカウントを新たに作成してみました。今後色々と試してみようと思います。

# 参考
https://qiita.com/zumax/items/994141fa0d1ca60991f3
Stripe Connect 子アカウントの残高からプラットフォームの残高に資金移動する方法のメモ

## 概要

StripeのConnectにて、Custom子アカウントの残高からプラットフォームの残高に資金を移動する方法を簡単にまとめる。

## 前提

Stripeのドキュメントでは「連結アカウント」と言われるがStripe日本語サポート窓口の皆さんは「子アカウント」と呼ぶのでこの記事では「子アカウント」を使って説明している。

## 方法は2種類

資金の移動方法は主に2種類存在する。
2種類あるがどちらをとっても最終的に資金が移動することは変わりない。（Stripe内部で生成されるオブジェクトも一緒で、子アカウント側でTransferが作成され、プラットフォームアカウント側でPaymentが作成される。）
どっちを使っても移動資金の1.5%の手数料が発生する。→[アカウントからの引き落とし手数料](https://stripe.com/jp/connect/pricing#:~:text=%E3%82%AB%E3%83%BC%E3%83%89%E3%81%AB%E9%80%81%E9%87%91-,%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%8B%E3%82%89%E3%81%AE%E5%BC%95%E3%81%8D%E8%90%BD%E3%81%A8%E3%81%97,-%E5%88%A9%E7%94%A8%E4%B8%8D%E5%8F%AF)

- [子アカウントに請求する](https://docs.stripe.com/connect/account-debits#%E9%80%A3%E7%B5%90%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AB%E8%AB%8B%E6%B1%82%E3%81%99%E3%82%8B)
- [子アカウントから送金する](https://docs.stripe.com/connect/account-debits#%E9%80%A3%E7%B5%90%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%8B%E3%82%89%E9%80%81%E9%87%91%E3%81%99%E3%82%8B)

## 子アカウントに請求する

移動時に指定する値

- 金額
- 通過種別
- 資金移動元の子アカウントのID

「どの子アカウントに資金額を請求するか」を指定するイメージである。

## 子アカウントから送金する

- 金額
- 通過種別
- プラットフォームアカウントのID
- 資金移動元の子アカウントのID

「どの子アカウントの資金から、プラットフォームアカウントに資金を転送するか」を指定するイメージである。

## 公式ドキュメントがおすすめする使い分け

- プラットフォームの製品またはサービスの対価を得る場合 → 子アカウントに請求する
- 資金の回収や他の調整する場合 → 子アカウントから送金する
PandasやPolarsのApache Arrowについて

# はじめに
皆さんは`Apache arrow`というものをご存じでしょうか。
先日、Polarsについての記事を書きましたが、調査を進める中でApache arrowに関する、良さげな情報があったので、記事にまとめたいと思います。

前回記事↓

https://qiita.com/inoshun/items/30e4e78cbf221bf11a86

# Apache arrowとは
Apache arrowは、メモリ上のデータ表現とデータ交換のための汎用的なオープンソース規格です。
特徴としては、
1. 列指向のメモリフォーマットを使用し、効率的なデータ処理を可能に
1. 異なるシステムやプログラミング言語間でのデータの相互運用性を提供
1. ゼロコピーのデータ共有により、データのシリアル化とデシリアル化のオーバーヘッドを削減
1. 高速なデータ処理とメモリ効率の良いデータ交換を実現し、ビッグデータ処理のパフォーマンスを向上

といった感じです。
データサイエンス、機械学習、ビッグデータ処理など、データ集約型のワークロードにおいて、異なるシステム間でのシームレスなデータ交換と高速な処理を可能にします。

# PolarsとpandasにおけるApache arrow
実は、PolarsがPandasと比べメモリ効率に優れている理由の一つが、このApache arrowです。
Polarsでは、Apache arrowが内部に組み込まれているため非常に高いメモリ効率性を有しています。

一方で実はPandasでもApache arrowを使用することができるそうです。
使用する際には以下のようにします。

```python
import pandas as pd
df = pd.read_csv(data_path, 
                 engine='pyarrow')
```

`read_csv()`の引数に`engine='pyarrow'`を指定してあげるだけです。
pyarrowとは、Apache arrowのPythonバインディングです。

# 速度比較
では、Pandas(Arrows未指定)、Pandas(Arrows指定)、Polarsで速度比較してみましょう。
読み込むデータは以下のコードで作成しました。
```python
import pandas as pd
import numpy as np

# ダミーデータの生成
num_rows = 1000000
num_cols = 100

data = np.random.rand(num_rows, num_cols)
columns = [f'column_{i}' for i in range(1, num_cols + 1)]

df = pd.DataFrame(data, columns=columns)

# CSVファイルに保存
output_file = 'large_data.csv'
df.to_csv(output_file, index=False)
```

実際にそれぞれ読み込んでいきましょう。

```python
# pandas(Arrows未指定) 
import pandas as pd
df = pd.read_csv(data_path)

# Pandas(Arrows指定)
df = pd.read_csv(data_path, 
                 engine='pyarrow')

# Polars
import polars as pl
df = pl.read_csv(data_path)

# Pandas(Arrow未指定)：15.2s
# Pandas(Arrow指定)：3.3s
# Polars：1.2s
```

結果として、
Polars > Pandas(Arrows指定) >> Pandas(Arrow未指定)
でした。
Pandasでも十分な速度を出すことができるようですね！
ただ、それでもPolarsには劣るようです。
Rust言語で書かれていることなんかも要因なのでしょうか？

# まとめ
今回はApache arrowについてまとめていきましたが、いかがだったでしょうか。
PandasでもApache arrowを使用することで、高速な処理が可能であることが確認できたかと思います。
ただ、前回の記事でも触れましたが、Polarsの性能の良さはすごく、やはり移行した方がいいとい感じています。
Polarsに慣れない方はApache arrowを使用してみてもいいかもしれませんね！
それでは！！！
【問題解決】"SFDX: Authorize an Org"が失敗する

# 問題発生
VSCodeで"SFDX: Authorize an Org"を実行すると失敗しました。
```
Warning: Ignoring extra certs from `null`, load failed: error:02001002:system library:fopen:No such file or directory
»   Warning: org login web is not a sf command.
»   Error: Run sf help for a list of available commands.
```
※昨日までは、問題なく動いていました。

# 解決方法
公式ドキュメントを参考に"sfdx (v7) から sf (v2) へ移行"したら成功しました。
https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_setup.meta/sfdx_setup/sfdx_setup_move_to_sf_v2.htm

# 補足
```
sfdx (v7) - 廃止
2023 年 7 月 12 日をもって、sfdx (v7) の更新は終了しました。
このような古いバージョンは、履歴管理の目的のためだけに保管されています。
```
[uncaughtException] proxyReq.appendHeader is not a function

## 参考
https://github.com/nuxt/nuxt/issues/26662

これによると、nodeのバージョンを上げればいいらしい。

```
// nvmインストール
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
$ export NVM_DIR="$HOME/.nvm"
$ [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
$ [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

// node v20.12.2インストール
$ nvm install --lts --latest-npm

$ nvm use v20
Now using node v20.12.2 (npm v10.5.2)

$ node -v
v20.12.2
```

1. v20.12.2になっていることを確認
1. `npm install`
1. `npm run dev`

これで出なくなる！！
Azure Data Scientist(DP-100)に合格後、学んだ内容を整理してみた

今年の春、Azure Data Scientist(DP-100)に合格しました。学んだ内容を忘れないように、書き留めたいと思います。

これから受験してみようと考えている方の参考になればと思います。


データセットを結合するためのアプローチには、どんなものがあり、どのように利用するのか？
--

Azure Machine Learning Designerでは、複数のデータセットを結合するためにさまざまな方法が利用できます。
https://azure.microsoft.com/ja-jp/products/machine-learning/designer/
Azure Machine Learning デザイナーは、Azure Machine Learning ワークスペースで機械学習パイプラインを構築するためのドラッグ アンド ドロップ UI インターフェイスです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/e1e43d9f-b323-6910-2886-48d669f08611.png)


1. **Merge モジュール**
 `Merge` モジュールを使用して、共通の列を指定してデータを結合できます。このアプローチは、共通の列が存在し、それをキーとして使用できる場合に有効です。

2. **Append モジュール**
`Append` モジュールを使用して、2つのデータセットを単純に結合することができます。このアプローチは、データセットが同じ構造を持ち、列の順序が一致している場合に有効です。

### 問いを考えてみる

次の入力データセット**Dataset1**　**Dataset2**を使用して、Azure Machine Learning デザイナーで、次の**出力データセット**を作成してください。これを行う際、どんなコンポーネントを使いますか？
__「Join Data」コンポーネントですか？それとも、「Add Rows」コンポーネントですか？__

**Dataset1**
```
column1, column2, column3
1, 2, 3
4, 5, 6
```

**Dataset2**
```
column4, column5, column6
7, 8, 9
10, 11, 12
```

**出力データセット**
```
column1, column2, column3, column4, column5, column6
1, 2, 3, 7, 8, 9
4, 5, 6, 10, 11, 12
```

### 答え

この問題は、Azure Machine Learning デザイナーの __「Add Rows」__ コンポーネントを使用して解決できます。

1. Azure Machine Learning デザイナーで実験を開きます。
2. キャンバスに `Add Rows` コンポーネントをドラッグアンドドロップします。
3. 「Inputs」ポートに `Dataset1` と `Dataset2` を接続します。
4. 実験を実行します。

実行すると、指定された出力データセットが作成されます。

### 解答の解説

__「Add Rows」__ コンポーネントは、同じスキーマを持つ複数のデータセットの行を単純に連結するコンポーネントです。この問題では、入力データセット `Dataset1` と `Dataset2` は同じスキーマを持つため、「Add Rows」コンポーネントを使用して、両方のデータセットのすべての行を単純に連結することができます。

他の解答として、「Join Data」コンポーネントを使用する方法も挙げられます。ただし、「Join Data」コンポーネントを使用する場合は、join type を「Inner Join」に設定する必要があります。これにより、両方のデータセットに共通する行のみが結合されます。


各モジュールの使用方法について説明します。
--

1. **Merge モジュール**
`Merge` モジュールを使用すると、特定の共通の列を指定してデータを結合できます。以下は、共通の列（キー列）を指定してデータを結合する例です。

   ```python
   import pandas as pd
   # データの読み込み
   df1 = pd.read_csv("Dataset1.csv")
   df2 = pd.read_csv("Dataset2.csv")
   # 共通の列を指定して結合
   merged_df = pd.merge(df1, df2, on="common_column")
   ```

2. **Append モジュール:**
`Append` モジュールは、2つのデータセットを単純に縦に結合します。列の順序や構造が一致している必要があります。

   ```python
   import pandas as pd
   # データの読み込み
   df1 = pd.read_csv("Dataset1.csv")
   df2 = pd.read_csv("Dataset2.csv")
   # データの縦結合
   appended_df = pd.concat([df1, df2], ignore_index=True)
   ```

`Append` モジュールを使用した例(この例では、2つのデータセットを垂直に結合しています。)
--
```plaintext
+---------------+      +---------------+
|   Dataset1    |      |   Dataset2    |
+---------------+      +---------------+
| A | B | C | D |      | A | B | C | D |
+---------------+      +---------------+
| 1 | 2 | 3 | 4 |      | 5 | 6 | 7 | 8 |
| 9 |10 |11 |12 |      |13 |14 |15 |16 |
+---------------+      +---------------+
         |                        |
         v                        v
+---------------+
|    Appended   |
+---------------+
| A | B | C | D |
+---------------+
| 1 | 2 | 3 | 4 |
| 9 |10 |11 |12 |
| 5 | 6 | 7 | 8 |
|13 |14 |15 |16 |
+---------------+
```

`Append` モジュールを使用して `Dataset1` と `Dataset2` を結合しています。
同じ列構造を持つデータセットが垂直に結合され、新しいデータセットが作成されます。
Xocdeでenumのswitch文を自動生成する方法について

## 概要
本記事では、Xcodeの自動補完機能を使って、楽にswitch文を定義する方法を解説する。

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128814/7d260370-fb06-2d12-2562-e5065c7401f4.png">

## きっかけ
enumのcaseは場合によっては肥大化しがちである。
例えば、4xx番台のエラーケースなどを想像してみると良い…
それらをswitch文のcaseで定義していくのは、面倒である。

あれ？ Xcodeの自動補完でswitch文はどうやって定義するんだっけ？

## 方法 
switch self を入力した後に補完してくれるウィンドウが表示されるので、上から2つ目を選択します。

![スクリーンショット 2024-04-18 21.49.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128814/6c6bc553-ed88-fb98-5834-81b13877680b.png)

ちなみにenumでswitch文を用意するときは、メソッドではなく以下のように変数で定義したほうが可読性は上がる気がする。

 ```swift
fileprivate enum MuseumTabMode: CaseIterable {
    case search
    case display
    case map

    var symbolName: String {
        switch self {
        case .search:
            <#code#>
        case .display:
            <#code#>
        case .map:
            <#code#>
        }
    }
}
```
ProxmoxのDNSアドレスでハマり散らかした話

どうも、始めまして、Povoです。
さっそく本題に入ろうと思います。

Proxmoxってご存知ですかね?
いろんなOSを一つの端末上で動かすための仮想化ソフトなんですけども、やりたいことの増えたPovoは、入れてみたわけですよ。

で、まぁ、適当にインストールして、わからないところはとりあえず既定値でして、
いざ使おう!となって、まぁ普通にwebGUIを色々触ってたわけですよ。
で、cephのタブがなんやらインストールしろって出てるから、インストールしたら、途中でいっぱいエラーはいて、なんやろうなぁって思ったら
DNS設定が何もなかったみたいで、DNSタブ見たらあっさり解決しました…

ミスは人一倍多いと思うので、なにか困ったことがあったらコメントで教えてくれたら一緒に考えます!
LLMChain からLCELへ

# [LLMChain](https://api.python.langchain.com/en/latest/chains/langchain.chains.llm.LLMChain.html)

```py
from langchain.chains import LLMChain
from langchain_community.llms import OpenAI
from langchain_core.prompts import PromptTemplate
prompt_template = "Tell me a {adjective} joke"
prompt = PromptTemplate(
    input_variables=["adjective"], template=prompt_template
)
llm = LLMChain(llm=OpenAI(), prompt=prompt)
```

```
llm.run("beautiful")
'\n\nWhy did the tomato turn red? Because it saw the salad dressing!'
```

:::note warn

以下の様なWarningが出るので、`llm.invoke`を使うとwarningを回避できる。[run](https://api.python.langchain.com/en/latest/_modules/langchain/chains/base.html#Chain.run)はChainに定義されているが、Deprecatedとなっている。

```
LangChainDeprecationWarning: The function `run` was deprecated in LangChain 0.1.0 and will be removed in 0.2.0. Use invoke instead.
```
:::

```
>>> llm.invoke("beautiful")
{'adjective': 'beautiful', 'text': "\n\nWhy couldn't the bicycle stand up by itself?\n\nBecause it was two-tired."}
```

[invoke](https://api.python.langchain.com/en/latest/_modules/langchain/chains/base.html#Chain.invoke)はChainに定義されている。

```
llm.predict(adjective="beautiful")
"\n\nWhy don't scientists trust atoms? \n\nBecause they make up everything."
```

# LCEL

```py
from langchain_community.llms import OpenAI
from langchain_core.prompts import PromptTemplate
prompt_template = "Tell me a {adjective} joke"
prompt = PromptTemplate(
    input_variables=["adjective"], template=prompt_template
)
llm = prompt | OpenAI()
```

```
llm.invoke({"adjective": "beautiful"})
"\n\nWhy don't scientists trust atoms? \n\nBecause they make up everything!"
```
GCP PubSub Oldest Unacked Message AgeにTerraformでアラートを設定する

## 背景

PubSubのSubscription側で問題が起きると `subscription/oldest_unacked_message_age` というメトリクスが上昇するので、これにアラートを設定する


## terraform example


```hcl
data "google_monitoring_notification_channel" "alert_channel" {
  display_name = "Alert Channel"
}

resource "google_monitoring_alert_policy" "oldest_unacked_message_age" {
  display_name = "Pubsub oldest unacked message age"
  combiner     = "AND"
  conditions {
    display_name = "Oldest unacked message age"
    condition_threshold {
      filter = "resource.type = \"pubsub_subscription\" AND metric.type = \"pubsub.googleapis.com/subscription/oldest_unacked_message_age\""
      aggregations {
        alignment_period   = "60s"
        per_series_aligner = "ALIGN_MAX"
        group_by_fields = [
          "resource.labels.subscription_id",
        ]
      }
      threshold_value = "300"
      duration        = "0s"
      comparison      = "COMPARISON_GT"
      trigger {
        count = 1
      }
    }
  }
  enabled = true
  notification_channels = [
    data.google_monitoring_notification_channel.alert_channel.name,
  ]
}
```

## Tips

意外と条件をterraformにするのが難しいので、[Cloud Monitoring - Create Alert Policy](https://console.cloud.google.com/monitoring/alerting/policies/create)![Screenshot 2024-04-18 at 21.38.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/bd3e72b4-9098-b460-f32c-746142bf9856.png)からポチポチして右上のView Codeを見てFilter条件やAggregationの中身の書き方を見る

## 詳細

`condition_threshold`に付いて


- `filter`: `"resource.type = \"pubsub_subscription\" AND metric.type = \"pubsub.googleapis.com/subscription/oldest_unacked_message_age\""` などのmetricsの場合は対象となるmetricsの条件を書く
- `aggregations`: 以下の例では60s内の最大値をsubscription_idごとに取得
    ```hcl
      aggregations {
        alignment_period   = "60s"
        per_series_aligner = "ALIGN_MAX"
        group_by_fields = [
          "resource.labels.subscription_id",
        ]
      }
    ```
- `threshold_value`: 閾値 `threshold_value = "300"`の場合5分
- `duration`: 継続時間 (例. oldest unacked message ageが5分を超えた状態がどのくらい続いているか) 0, 60, 120, ... 60の倍数の数字を入れる費強がある
- `comparison`: "COMPARISON_GT" ←より大きい場合は
- `trigger`: `count` or `ratio`で選ぶことができて、今までの条件が何回、またはどのくらいの比率で起きたらalertをトリガーするか条件がかける

すべてを合計すると結構複雑になるので、一つずつブレイクダウンして考える必要がある

## Ref

1. https://cloud.google.com/monitoring/api/metrics_gcp#pubsub/subscription/oldest_unacked_message_age
1. https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/monitoring_alert_policy
ADHDっぽい人向けツール AHKで簡単タイマー

### 目的

僕はADHDっぽいところがあって何か気になると本筋そっちのけでそこに没頭してしまい、戻ってこれない傾向がある

なので本筋をそれるときはタイマーをセットすることにしようとおもう、コマンドラインというかCraftLaunchで「Timer;15」とすると15分のタイマーをセット、ダイアログを開く、そんなツール

### 必要なもの

* AutoHotKey ver2.0
ここからとってくる [AutoHotkey Downloads](https://www.autohotkey.com/download/)
インストーラーは嫌いなのでZip版を
* メモ帳
AHKのスクリプトを書くのにつかう、Neovimでもいいけどもっとさくっと、そして拡張子の関連付けがめんどいので`.txt`で
* お好きな音
こことかおススメ → [効果音 　検索結果 『 ピンポーン 』](https://on-jin.com/sound/index.php?kensaku=%E3%83%94%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%B3)、けれどMsgBoxのOptionでIconというのから何か選ぶと適切に音を鳴らしてくれるのでいらないかも → https://www.autohotkey.com/docs/v2/lib/MsgBox.htm

### AutoHotKeyを入れる

ZIPを解凍して適当に保存する
僕はDesktopにApplicationsというフォルダを作っていてそこにアプリをいれている

### コードを書く
```ahk:timer.txt
minutes := 5
if 1 == A_Args.length
{
  minutes := A_Args[1]
}

msec := minutes * 1000
Sleep msec

;; SoundPlay "sounds\PinPon03.mp3"
Msgbox "        " minutes "(min) passed!        ", "ADHD Timer", 64 + 4096
```

### CraftLaunchの設定
`window.launcher.command_list`の中に追加する

```python:config.py
    window.launcher.command_list += [
       :
      ("Timer", window.ShellExecuteCommand(None, f"{APP_PATH}/AutoHotKey/AutoHotKey64.exe", \
      f"{SCR_PATH}/timer.txt %param%", f"{SCR_PATH}")),
       :
    ]
```
ほんとは折り返してないけど、横長で読みにくいので

### おまけ
「[AutoHotkeyのススメ #AutoHotkey - Qiita](https://qiita.com/ryoheiszk/items/092cc5d76838cb5a13f1)」というエントリがかなり面白い
ここまでこだわれるんだ、、と新たな発見です
セキュアなパスワードを追加

追加する方法は簡単で、modelにhas_secure_passwordを追加するだけ。
追加することによって次のような機能を使えるようになる。

・　セキュアにハッシュ化したパスワードを、データベース内のpassword_digest属性に保存できるようになる。
・　2つの仮想的な属性（passwordとpassword_confirmation）が使えるようになる。また、存在性と値が一致するかどうかのバリデーションも追加される。
・　authenticateメソッドが使えるようになる（引数の文字列がパスワードと一致するとUserオブジェクトを返し、一致しない場合はfalseを返すメソッド）。

# 具体的な方法
まずはモデル内にpassword_digestを含ませる必要がある。
以下のコマンドを実施。
```
$ rails generate migration add_password_digest_to_users password_digest:string
```
からのdb:migrateを実行。
```bash
$ rails db:migrate
```

has_secure_passwordを使ってハッシュ化するためには、bcryptライブラリを使う。
gemfileに追加する。

```ruby
gem "bcrypt"
```
bundle installは忘れずに。

```
$ bundle install
```

ここまできたらついにmodelにhas_secure_passwordを追加する。

```ruby
class User < ApplicationRecord
  before_save { self.email = email.downcase }
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: true
  has_secure_password
end

```

ここで何らかのテストが失敗している可能性があります。
has_secure_passwordには、仮想的なpassword属性とpassword_confirmation属性に対してバリデーションをする機能も（強制的に）追加されているので、もしsetupなどを用いて@user変数を定義している場合は、passwordとpassword_confirmationも追加してあげましょう。

```ruby
def setup
  @user = User.new(name: "Example User", email: "user@example.com",
                 password: "foobar", password_confirmation: "foobar")
end
```

また、パスワードはセキュリティの観点から最低６文字以上に設定することをおすすめします。
こちらも簡単で、モデル内にvalidateをかけるだけです。

```ruby
class User < ApplicationRecord
  before_save { self.email = email.downcase }
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: true
  has_secure_password
  validates :password, presence: true, length: { minimum: 6 }
end

```
RiderでのNuGetの復元方法

Tools → NuGet → NuGet Restore を選択するだけ。
![2023-12-30_12h52_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/1f864514-d4b6-b5de-b55b-34ff49af8ff4.png)
【CSS】ダークモード設定時でもサイト全体でライトモードの配色を維持したいとき

## 結論
下記のように設定する.

```css:
:root {
  color-scheme: light;
}
```

### ハマったところ
もともと表題のような `input[type=text]` を作りたかったが,
フォームの自動補完 （autofill） 後（手入力時とは異なる背景色になる） **だけ** css では制御できなかった.
※ Google Chrome 特有の現象っぽい.

制御できない例：
```scss:
/* 制御できない例1: 自動補完されたフォームに自動的にフォーカスが当たるので、そのスタイルを指定する */
input {
  &:-webkit-autofill:focus {
    color: #333;
    background: #fff !important;
  }
}

/* 制御できない例2:　(prefers-color-scheme: dark) を使用する */
@media (prefers-color-scheme: dark) {
  input {
    &:-webkit-autofill {
      color: #333;
      background: #fff !important;
    }
  }
}
```

どうもこのあたり, ユーザーエージェントスタイルシートによって強固に縛られているようだった.
https://developer.mozilla.org/ja/docs/Web/CSS/:autofill

> メモ: 多くのブラウザーのユーザーエージェントスタイルシートでは、 :-webkit-autofill スタイル定義に !important を使用しており、 JavaScript によるハックで解決しない限り、ウェブページから上書きすることができません。例えば、 Chrome では内部スタイルシートで次のようになっています。
> 
> ```cs
> CSS
> background-color: rgb(232, 240, 254) !important;
> background-image: none !important;
>color: -internal-light-dark(black, white) !important;
> ```
> これは、 background-color, background-image, color に独自のルールを設定できないことを意味します。
> 

JS で強制的に上書きする方法も検討したが, 最初から全体に color-scheme を設定するだけで良かった.

😭


## 参考
[CSS] ダークモードを有効化しない方法 | 
https://b.0218.jp/202202252228.html
メタタグで `color-scheme` を設定する方法が最初に紹介されているが、弊環境では再現せず

自動補完でinputの背景色が変わらないようにする方法
https://qiita.com/matcha_kinako/items/b785ccb6aabd97829581

CSS優先度のちょっと細かい話 !importantから継承まで
https://qiita.com/keyhole0/items/2c9040f7706ba5f17371
AWS 本番申請をしたSESから送るメールの宛先をインラインポリシーを使って制限した際にお世話になったリンク

## 概要

題名の内容で非常にお世話になったリンクをまとめておく。

## 内容

https://qiita.com/kumeneko/items/423bcf2d0fdefbd54334

https://docs.aws.amazon.com/ja_jp/ses/latest/dg/control-user-access.html

## 自分用メモ

Postfixなどに設定するSMTP用認証情報はSESからSMTP用のIAMユーザー作成時に発行される情報のみ有効なので注意する。あとから作ったアクセスキーは使えない。（いや、おそらくアクセスキー作成時に適切なものを作成したら使えると思う。それがぱっと分からない以上はSESからのSMTP認証情報作成時のアクセスキーを使うほうが無難）
カッシーニ曲線CASSINIAN CURVE

※この投稿はカッシーニの卵形線(Cassini Ovals)ではなく、カッシーニ曲線(CASSINIAN CURVE)について書いたものです。

カッシーニ曲線は、スーパー楕円以外で、丸い多角形を描くのに使えます。

末尾の参考サイトより、
極方程式では
```math
r^{2n}-2a^nr^n\cos{n\theta}+a^{2n}=b^{2n}
```
つまり
```math
e=\frac{b}{a}
```
のとき
```math
r=a\sqrt{\cos{n\theta}\pm\sqrt{e^{2n}-\sin^2{n\theta}}}
```
デカルト座標系では、
```math
(x^2+y^2)-2a^nRe((x+iy)^n)+a^{2n}-b^{2n}=0
```

※なお、カッシーニの卵形線の式は、
```math
r^4-2a^2r^2\cos{2\theta}=b^4-a^4
```
```math
(x^2+y^2)^2-2a^2(x^2-y^2)+a^4=b^4
```
```math
((x-a)^2+y^2)((x+a)^2+y^2)=b^4
```
n=2, a=b=1のとき同一となると思う。

```java:cassinianCurve.pde
size(800, 800);
background(255);
translate(400,400);
noFill();

float r,x,y,a=100,tmp;
float n = 3;
for(float e=1.0; e<=1.66; e+=0.06){
  beginShape();
    for(float th=0; th<=2*PI; th+=0.002){
      tmp = sqrt(pow(e,2*n)-pow(sin(n*th),2));
      r = a*sqrt(cos(n*th)+tmp);
      x = r*cos(th);
      y = r*sin(th);
      stroke(256*(2-e),0,255);
      curveVertex(x, y);
    }
  endShape();
}
```
![n1_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/ba9abe69-6420-68a8-84e8-177826fe8cbd.png)

a=bかつn=3の場合、中心で交わる三葉線となる。

a<bの場合、丸いn角形のようになる。上図。
特に、曲線に凹みがなくなるのは、e=1.66ぐらい。

a>bの場合、下図のような卵形線になる。強引に点描で描いた。青い線は式中の符号がマイナスの部分。
```java:
size(800, 800);
background(255);
fill(0);
textSize(32);
text("n=3",50,50);

translate(400,400);
noFill();

float r,x,y,a=100;
float n = 3;
for(float e=0.4; e<=1.66; e+=0.06){
  beginShape(POINTS);
    for(float th=0; th<=2*PI; th+=0.00004){
      float tmp = sqrt(pow(e,2*n)-pow(sin(n*th),2));
      r = a*sqrt(cos(n*th)+tmp);
      x = r*cos(th);
      y = r*sin(th);
      stroke(256*(2-e),0,255);
      vertex(x, y);
      r = a*sqrt(cos(n*th)-tmp);
      x = r*cos(th);
      y = r*sin(th);
      stroke(0,0,255);
      vertex(x, y);
    }
  endShape();
}
```
![a1_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/b919983a-0446-1574-8d48-9d1613c30c8b.png)

# 補足

三葉線trifoliumの式は、
```math
r=a\sin3\theta
```
```math
\begin{eqnarray}
  \left\{
    \begin{array}{l}
      x=a\sin3\theta\cos\theta \\
      y=a\sin\theta\sin3\theta
    \end{array}
  \right.
\end{eqnarray}
```

四葉線quadrifoliumの式は、
```math
r=a\cos2\theta
```
```math
\begin{eqnarray}
  \left\{
    \begin{array}{l}
      x=a\cos\theta\cos2\theta \\
      y=a\sin\theta\cos2\theta
    \end{array}
  \right.
\end{eqnarray}
```

チェビシェフ螺旋（丸い多角形が描ける）
```math
r=n+\frac{1}{k}\cos{n\theta}
```
# 参考

https://mathcurve.com/courbes2d.gb/cassinienne/cassinienne.shtml



https://en.wikipedia.org/wiki/Cassini_oval
【BigQuery】カラム同士を比較して最小値・最大値を求める（LEAST / GREATEST）

# やりたいこと

各レコードでカラム同士を比較して最小値・最大値を計算したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3341655/ec5037cd-976e-edee-f410-5ed6ae383f5e.png)

MIN関数やMAX関数のようにレコード同士の比較ではなく、同一レコード内でカラム同士の比較をしたい。

2つのカラムの比較であればCASE文で対処できるが、3つ以上のカラムの比較をラクに行いたい。

# 結論
```sql
WITH
  test_table AS (
  /*
    テスト用テーブルの作成
  */
    SELECT 1 AS column_a, 2 AS column_b, 3 AS column_c
    UNION ALL
    SELECT 4 AS column_a, 6 AS column_b, 5 AS column_c
    UNION ALL
    SELECT 9 AS column_a, 7 AS column_b, 8 AS column_c
  )

SELECT
  column_a
  ,column_b
  ,column_c
  ,LEAST(column_a, column_b, column_c) AS min_value
  ,GREATEST(column_a, column_b, column_c) AS max_value

FROM
  test_table
```
- [BigQuery公式：LEAST関数](https://cloud.google.com/bigquery/docs/reference/legacy-sql?hl=ja#least)
- [BigQuery公式：GREATEST関数](https://cloud.google.com/bigquery/docs/reference/legacy-sql?hl=ja#greatest)
Vue.jsで書かれたコードから未使用のimportを自動削除する

Vue.jsで書かれたコードから未使用のimportを自動削除する方法をまとめました。
下記の手順で実現できました。

1. ESLintをインストールする
2. ESLintのプラグインをインストールする
3. ESLintの設定を変更する
4. VSCodeでの自動修正の設定を追加する

# 1. ESLintをインストールする

```shell
npm install --save-dev eslint
```

# 2. ESLintのプラグインをインストールする

下記2つが必要です。

- eslint-plugin-vue
- eslint-plugin-unused-imports

## 2-1. eslint-plugin-vue

Vue.js用のプラグインです。

https://eslint.vuejs.org/

```shell
npm install --save-dev eslint-plugin-vue
```

## 2-2. eslint-plugin-unused-imports

未使用のimportを削除してくれるプラグインです。この記事の主人公です。

https://www.npmjs.com/package/eslint-plugin-unused-imports

```shell
npm install --save-dev eslint-plugin-unused-imports
```

# 3. ESLintの設定を変更する

先ほどインストールしたプラグインを追加します。

```json:.eslintrc.json
{
  "extends": [
    "plugin:vue/vue3-essential"
  ],
  "plugins": ["unused-imports"],
  "rules": {
    "unused-imports/no-unused-imports": "error"
  }
}
```

# 4. VSCodeでの自動修正の設定を追加する

ファイル保存時、ESLintによる修正を実行する設定を追加します。

```json:.vscode/settings.json
{
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit"
  }
}
```
20240418 nushellでgit pushできないとき

`git add`や`git commit`はできるのに`git commit`ができない、そんな状況になってしまった
こんなエラー


```:nushell
> git push origin add_hq_max
The authenticity of host 'github.com (20.27.177.113)' can't be established.
ED25519 key fingerprint is SHA256:******************************************
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

RR-automate on  add_hq_max [$] via 🐍 v3.12.2 took 1m53s
> git push origin add_hq_max
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```
<details><summary>...色がつかない、本当はこんなに美しいのです（ここをクリックすると画像が見れる）</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740499/b1f7f0f0-e4db-5eec-6a3a-e2282c5933e9.png)
</details>

だいたいsshあたりのキーが読めないとかそんな問題かなと思っていた、例えば.ssh configあたりを読みに行ってないのかも、とか、、、

で検索するとstackoverflowでそれらしいのにひっかかった
[Git under nushell not using added ssh-key - Stack Overflow](https://stackoverflow.com/questions/77856195/git-under-nushell-not-using-added-ssh-key)
ssh.exeを指定すると治るらしい、sshのキーあれこれは関係ないような書きっぷりだ

これだけで動けばラッキー、簡単だ、と思ってやってみた
```
RR-automate on  add_hq_max [$] via 🐍 v3.12.2
❯ git config --global core.sshcommand "C:/Windows/System32/OpenSSH/ssh.exe"

RR-automate on  add_hq_max [$] via 🐍 v3.12.2
❯ git push origin add_hq_max
Enumerating objects: 48, done.
Counting objects: 100% (48/48), done.
Delta compression using up to 12 threads
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 48.84 KiB | 1.63 MiB/s, done.
Total 31 (delta 17), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (17/17), completed with 13 local objects.
remote:
remote: Create a pull request for 'add_hq_max' on GitHub by visiting:
remote:      https://github.com/tontoroRR/RR-automate/pull/new/add_hq_max
remote:
To github.com:tontoroRR/RR-automate.git
 * [new branch]      add_hq_max -> add_hq_max
```
ちゃんと動いた！ラッキーだ

気を付けなくてはいけないのはパスの区切りには「￥」ではなく「/」を使うということ、「￥」だとエスケープされてしまう
それだけ押さえておけばOK
Webブラウザ自動運転 - Playwright / Kotlin / jvm

(自分メモ)
下記と同じことをKotlin/jvmで書きたい。テスト用サーバも。

https://qiita.com/shokkaa/items/b41a714574031765a2b3

# 環境
- Ubuntu 22.04 on wsl2 on Windows 11
- JDK 21

# Project初期化
```build.gradle.kts
plugins {
    kotlin("jvm") version "1.9.23"
    application
}
repositories { mavenCentral() }
dependencies {
    implementation("com.microsoft.playwright:playwright:1.43.0")  // https://mvnrepository.com/artifact/com.microsoft.playwright/playwright
    implementation("io.ktor:ktor-server-cio:2.3.10") // https://mvnrepository.com/artifact/io.ktor/ktor-server-cio
}
application {mainClass.set("MainKt")}
```

# [➜ソース](https://github.com/kyoya-p/samples/tree/4e56e4802507d8583a2f15e4d990f740f32136ce/2024/Playwright.KtJvm)
```Main.kt
fun main() {
    thread { testServer() }
    Playwright.create().use { playwright ->
        val browser = playwright.chromium().launch(BrowserType.LaunchOptions().apply { headless = false })
        val page = browser.newPage()
        page.navigate("http://localhost:8000/")
        val text = page.getByRole(AriaRole.HEADING).textContent()
        println(text)
        browser.close()
    }
}


val testPage = """
<!DOCTYPE html><html>
<head><title>Hello World</title></head><body>
<h1>Hello World!</h1>
</body></html>
"""

fun testServer() = embeddedServer(CIO, port = 8000) {
    routing {
        get("/") { call.respondText(testPage, ContentType.Text.Html) }
    }
}.start(wait = false)
```

# Build/Run
```sh
gradlew run
```

# 参考

https://playwright.dev/java
$_ENV、$_COOKIE

## はじめに

ENVやCOOKIEについて整理する

## $_ENV

サーバー側で設定されている環境変数を取得する。

## $_COOKIE

クッキーを取得する。

クッキーを保存するのはsetcookie関数の役割。

```php
setcookie(string $name, [string $value [, int $expires = =0 [, string $path 
[, string $domain [, bool $secure = false [, bool $httponly = false]]]]]]): bool
```

$name
クッキーの名前。

$value
クッキーの値。この値がクライアントのコンピュータに保存される。

$expires_or_options
クッキーの有効期限。

$oath
クッキーが有効なパス

$domain
クッキーが有効なドメイン

$secure
暗号化通信の環境でのみクッキーを送信する。

$httponly
HTTP経由でのみアクセスできるようにする設定。JS経由ではアクセスできなくなる。
XSSによるクッキー盗聴のリスクを軽減できる。
PowerShellでコマンドプロンプトのwhereをしたいとき

# PowerShellでコマンドの場所を調べたい
PowerShellでコマンド(実行ファイル)のインストール場所を一覧表示しようと
```
> where java
```
とすると何も表示されません。

コマンドプロンプトでは
```
> where java
C:\Program Files\Eclipse Adoptium\jdk-17.0.8.7-hotspot\bin\java.exe
C:\Program Files\Eclipse Adoptium\jdk-8.0.345.1-hotspot\bin\java.exe
```
のように表示してくれます。

これをPowerShellでも行うにはどうしたらいいのかを調べてみました。

# 解決策

gcm **調べたいコマンド** -all | select path
とすると一覧表示されます。

```
> gcm java -all | select path

Path
----
C:\Program Files\Eclipse Adoptium\jdk-17.0.8.7-hotspot\bin\java.exe
C:\Program Files\Eclipse Adoptium\jdk-8.0.345.1-hotspot\bin\java.exe
```
# 参考情報
ちなみにエイリアスを使わずパラメータ名も省かずに書くと
```
> Get-Command -Name java -All | Select-Object -Property Path
```
となります。

# 参考文献
- [-Allですべて取得](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/get-command?view=powershell-7.4#-all)
- [whereはWhere-Objectのエイリアス](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/where-object?view=powershell-7.4#notes)
脳障害の僕がElixirの仕事を復帰

くも膜下出血の後の社会復帰です
大体半年かかりました

経緯

https://qiita.com/t-yamanashi/items/1d563a83d2713dccf669

# 仕事復帰の為のリハビリ
脳の障害があるため工夫が必要です
健常者と比べて僕が困ること
・極端に忘れる速度は速い
　└対処方法
 　　・ソース分析はgithubにメモをとる
　　　　IO.inspectの結果すらかく
　　　　何処のソースを追ったことも書く
・MTGで上手く話せない
　└対処方法
　　・「あれ」、「それ」、「これ」を使わないように工夫する
　　　　└ネタを整理しておく
  　　　　　└話す内容をメモしておく
　　・ゆっくり話す

# 仕事の事を思い出すには
ひたすた、病院にいる時からソースや作成してた物を観察します
思いだす為にメンバーとやり取りを行います
やり取りが多いと記憶が連結し復活していきます
短期記憶がだめでも、長期記憶は覚えている可能はあります
忘れているんでなくて、記憶が分断されているだけかも

# ソースをいたずらして解析するコツを思いだす
・要件（目標）を決める
・プログラムを起動する
・目的の画面を表示する
・URLを確認
・router.exで対象のパスのモジュールを確認
・モジュールを開く
・更に調べたい箇所にIO.inspectで調べる
・コンポーネントがある場合は更にソースを開く
・更に調べたい箇所にIO.inspectで調べるの繰り返し

    
# 集中力が続かない対象方法
・諦めてジムの行って気分転換する
　└これが案外よくて、運動している時に悩んでたことの解決方法が見つかる
rails アプリで簡単なvalidationを追加する

※model名をuserと定義した前提で進めます。


# 存在性の検証

./models/user.rbに以下を記述
```
class User < ApplicationRecord
  validates :name,  presence: true
  validates :email, presence: true
end
```

# 次に文字数制限
先程のコードに追加。
```
class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 50 }
  validates :email, presence: true, length: { maximum: 255 }
end
```

# メールアドレスのフォーマットの制限
```
class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX }
end

```
VALID_EMAIL_REGEXとformatを追加する。
これをしないと、例えば"foo@bar,com"や、"bazbaz@gmail-111などの無効なメールアドレスもvalidation通過してしまう。
また、上記だと"foo@bar..comといったアドレスだと通ってしまうことになるので、より完璧にvalidationするには、VALID_EMAIL_REGEXは以下にすると良い。
```
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
```
# 一意性の検証
また、メールアドレスは重複してしまうとまずいので、一意性を検証する必要がある。
```
class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: true
end

```
uniquenessを追加。
ただこのままだと、大文字小文字の区別がされないのでデータベースに保存する直前で全て小文字に変換する処理をします。

```
class User < ApplicationRecord
  before_save { self.email = email.downcase }
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: true
end

```
before_saveによって、保存する直前にアドレスを小文字に変換することができるようになりました。

また、データベースレベルでは一意性を保証できていないので、データベース上のemailカラムにインデックスを追加します。

```
$ rails g migration add_index_to_users_email
```

このコマンドによって新たにmigrationファイルが作成される。
(db/migrate/[timestanp]_add_index_to_users_email.rb)
```
class AddIndexToUsersEmail < ActiveRecord::Migration[7.0]
  def change
    add_index :users, :email, unique: true
  end
end

```

db:migrateは忘れずに！
```
$ rails db:migrate
```
また現時点でfixtureファイルに手を加えていない場合、おかしなことになる場合があるので中身はカラにしておきましょう。
【Unity】Admobのバナーをボタンクリック等の操作で消す方法（表示非表示を切り替える）

# はじめに
本記事では、UnityでAdmobバナーを使用している人の中で、ある操作でバナーを非表示にしたいけどやり方が分からない人に向けた記事です。

# 実装したコード

```C#
using UnityEngine;
using GoogleMobileAds.Api;

public class AdmobManager : MonoBehaviour
{

    public void Start()
    {
        // Initialize the Google Mobile Ads SDK.
        MobileAds.Initialize((InitializationStatus initStatus) => { });
        LoadAd();
    }

    // These ad units are configured to always serve test ads.
#if UNITY_ANDROID
  private string _adUnitId = "ca-app-pub-3940256099942544/6300978111";
#elif UNITY_IPHONE
  private string _adUnitId = "ca-app-pub-3940256099942544/2934735716";
#else
    private string _adUnitId = "unused";
#endif

    BannerView _bannerView = null;

    /// Creates a 320x50 banner view at top of the screen.
    public void CreateBannerView()
    {
        Debug.Log("Creating banner view");

        if (_bannerView != null)
        {
            _bannerView.Destroy();
            _bannerView = null;
        }

        _bannerView = new BannerView(_adUnitId, AdSize.Banner, AdPosition.Top);
    }

    /// Creates the banner view and loads a banner ad.
    public void LoadAd()
    {
        CreateBannerView();

        var adRequest = new AdRequest();

        Debug.Log("Loading banner ad.");
        _bannerView.LoadAd(adRequest);
    }

    /// Destroys the banner view.
    public void DestroyBannerView()
    {
        if (_bannerView != null)
        {
            Debug.Log("Destroying banner view.");
            _bannerView.Destroy();
            _bannerView = null;
        }
    }
}
```

# ボタンクリックでバナーを非表示にする
ボタンのクリック動作に対して、DestroyBannerView関数を割り当てることで実装可能です。

![Movie_002.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3298615/0393ae36-16ec-f7c4-e1f1-c1b815a02537.gif)


# 非表示にしたバナーを再度表示する
ボタンのクリック動作にLoadAd関数を割り当てることで実装できます。

![Movie_003.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3298615/ab8ddca3-8906-e816-656a-3fe751de6363.gif)
シグモイド関数のオーバーフロー対策

# シグモイド関数のオーバーフロー対策
Pythonは数値型（整数型や浮動小数点型など）を扱うのが得意で、通常は大きな数値も簡単に扱えます。ただし、指数関数のように急速に増加する値を計算する際には、容易にオーバーフロー（数値が扱える範囲を超えること）が起こることがあります。

では、わざとオーバーフローを起こしてみましょう。

```ruby:ipynb
import numpy as np

np.exp(1000)

"""出力結果
/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: RuntimeWarning: overflow encountered in exp
  
inf
"""
```

このように、$e^{1000}$をPythonに計算させようとするとオーバーフローしてしまいます。この性質に大きく影響してしまうのが、**シグモイド関数**である。

シグモイド関数は
$$
σ(x) = \frac{1}{1 + e^{-x}}
$$
という風に数式で表された。もし$x$の値が大きな負の値になった時に、先ほどのオーバーフローが発生してしまい計算ができない問題が発生してしまう。シグモイド関数は、**ロジスティック回帰**や**ニューラルネットワーク**の活性化関数で用いられるため、なくてはならない関数であるため、計算できないと非常に困る問題である。

例えば、$x=-100$の場合にシグモイド関数に代入してみると、
$$
σ(-1000) = \frac{1}{1 + e^{1000}}
$$
となってしまいPythonで扱うことができなくなってしまう。

そこで、$x$の値によって関数を場合分けすることで計算できるようにする。


![スクリーンショット 2024-04-18 20.07.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687042/c4b70077-d94b-a662-6f8d-e5b60205c812.png)

このようにすると$x>=0$の時はを$e^{-x}$計算して$x<0$の場合は$e^x$を計算してくれるため，指数関数の肩の数字がマイナスの値になります。

これでは、指数が大きな負の値になってしまうと思うが、実はPythonは0を返しオーバーフローにはならず計算することができます。
```ruby:ipynb
import numpy as np
np.exp(-1000)

"""出力結果
0
"""
```

したがって、$x$の値によって関数を場合分けすることでオーバーフロー対策となり計算ができるようになる訳です。

シグモイド関数を実装するときにこの処理を`if`文で条件分岐を行なっても良いが、以下のように１行で返り値を書くことができる。

```ruby:ipynb
import numpy as np

def sigmoid(x):
    return np.exp(np.minimum(x, 0)) / (1 + np.exp(- np.abs(x)))
```

`np.minimum(x_1, x_2)`では、引数に指定した値で小さい方を用いることができるので$x$が0より小さい時だけ$x$の値が使われる状態となる。そして、0が選択されたときは内部的に`np.exp(0)`となり数式的に$e^0=1$となり、分子が1として成り立つ。
同期か非同期かを確認する方法

# 結論
ブラウザを２つ立ち上げて、ブラウザAで入力したもの(例えば「いいねボタン」とか)が、ブラウザBで反映されていれば非同期ができている。
(もちろんリロードしちゃダメ)

**以上！！！！！**