OmniAICreator/Qiita-1.07M huggingface dataset:
PhpDocumentorの使い方

# 目的
　業務でphpDocumentorを使用する必要があったため忘れないように。
　したいことは対象のディレクトリをドキュメント化すること。（今回はLaravelプロジェクト）

　公式サイト
　https://docs.phpdoc.org/3.0/guide/getting-started/installing.html#installation

# 開発環境  
　GithubCodespaces
　PHP 8.0.28 

# 結論
```
  wget https://phpdoc.org/phpDocumentor.phar
  php phpDocumentor.phar -d /workspace/Laravel/ --ignore vendor -t docs/Laravel 
  zip -r /workspace/Laravel.zip  docs/Laravel
```
結論としてこの３行のコマンドをターミナルにて実行した。
(commit、pushしない限りはメインのブランチに影響はないと思うが一応事前にcheckoutする)

このコマンドはphpDocumentorをダウンロードした後、/workspace/Laravel/ディレクトリ内のPHPコードを解析し、生成されたドキュメントをdocs/Laravelディレクトリに出力。
最後に、docs/Laravelディレクトリ全体を/workspace/Laravel.zipというZIPファイルに圧縮。
なお実行後はworkspace直下にzipファイルが出来上がっているのでそれをダウンロード。

# コマンドごとの解説<br />
**phpDocumentorのダウンロード**
```
wget https://phpdoc.org/phpDocumentor.phar
```
　wgetは指定されたURLからファイルをダウンロードするためのコマンド。
　このコマンドでは、以下のURLからダウンロードしている。

　https://phpdoc.org/phpDocumentor.phar
***
**phpDocumentor.pharファイルの実行**
```    
php phpDocumentor.phar
```
***
**-d オプション**
```
-d /workspace/Laravel/
```
　解析するPHPのコードが含まれているディレクトリを指定。
　自分の場合はworkspace配下のLaravelプロジェクトをドキュメントしたいので /workspace/Laravel/ を指定。
***
**--ignore オプション**
```
--ignore vendor
```
　無視したいディレクトリの指定。今回はvendorディレクトリを無視。
　vendorディレクトリはライブラリや依存関係が格納されている場所なのでそれまでドキュメントする意味はない。
***
**-t オプション**
```
-t docs/Laravel
```
　生成されるドキュメントの出力先ディレクトリを指定。
　今回はworkspace外のdocディレクトリに出力先を指定した。     
***
**生成されたドキュメントをzipとしてダウンロード**
```
zip -r /workspace/Laravel.zip docs/Laravel
```  
　zipコマンドを使用して、docs/Laravelディレクトリを再帰的に圧縮。
　-rオプションは、ディレクトリを再帰的に圧縮する。
　/workspace/Laravel.zipは、生成されるZIPファイルのパスとファイル名を指定。
　自分の場合は他のメンバーに共有する必要があるので対象のディレクトリをzip化する。

# 感想
　コードが読める人には必要ないかもだが、エンジニア以外の人に現状把握するために説明するときには使えるのかもしれない。また全体のコードをざっくりと把握するのにも使えるかも。（これはどちらかといえばマネージャー視点）
[自分用]Next.jsのState

## とりあえずやってみよう！
とりあえずクリックしたら`foo`が１ずつ増える関数を書いてみる。
```jsx
export default function Home() {
  let foo = 1;

  const handleClick = () => {
    foo = foo + 1;
    console.log(foo);
  };

  return (
    <>
      <h1>{foo}</h1>
      <button
        onClick={handleClick}>
        ボタン
      </button>
    </>
  )
}
```
しかしこのコードだけではブラウザの数字がずっと「１」のままになってしまう。
コンソールはしっかりと1ずつ増えているのに、、、

**その原因は再レンダリング！！！**
Reactにおいて画面の表示を変えるには「再レンダリング」がされなくてはならない。
しかしそれにはいくつか条件がある。
①ページ遷移したとき
②データの変更（カウンターのように、単にクライアントサイドだけで変更されたときはダメ）
③コンテキストの変更
④getStaticPropsまたはgetServerSidePropsの呼び出し
など。


条件に当てはまればブラウザの数字も変わる！

### もっと詳しくいうと
ボタンを何回もクリックすると`foo`の**値はもちろん変わっている**。
しかしReactは変数の変化だけだと、変わったことを認識しない！
そのため**Homeコンポーネントが2回目以降のレンダリングがされない**ので、一番初めの「１」になったままということ。

「Homeコンポーネントがもう一回呼び出される = 再レンダリング」ということなので、再レンダリングがされる条件に当てはめなければならない。

## ここで登場 useState！
```jsx
import { useState } from 'react';

export default function Home() {
  const [foo, setFoo] = useState(1);

  const handleClick = () => {
    setFoo(foo => foo + 1);
  };

  return (
    <>
      <h1>{foo}</h1>
      <button
        onClick={handleClick}>
        ボタン
      </button>
    </>
  )
}
```
まず`[foo, setFoo] = useState(1)`について解説。
言葉にすると次のようになる。`[状態を持った変数, 関数] = useState(初期値)`
fooが状態を持った変数なので、fooが変わったら再レンダリングされる。**←ここ大事だよ！**

よって初期値を0にすると状態が変更されないので、`console.log`は一度しか表示されない。
つまり再レンダリングされていないのだ。
```jsx
export default function Home() {
  const [foo, setFoo] = useState(1);

  const handleClick = () => {
    //初期値に注目！
    setFoo(foo => foo + 0);
  };

  //ここに注目！これはHomeコンポーネントが呼び出されないと実行されないよ！
  //だから再レンダリングされないと「ボタン」をいくら押しても一度しか表示されないよ！
  console.log(foo);

  return (
    <>
      <h1>{foo}</h1>
      <button
        onClick={handleClick}>
        ボタン
      </button>
    </>
  )
}
```
※ちなみに、
`foo + 1`ではなく`foo => foo + 1`の理由は、引数fooを用意することにより、
**前回の状態をしっかり反映させることができるため**。
仮に２ずつ増やしたくて`foo + 1`を2行書いても、fooに入る数値は一緒なので１ずつしか増やせない。

### 分割配列について
`[foo, setFoo]`の部分は分割配列。

useState()には2つの返り値が存在しているため、
通常であれば返り値を別の変数に入れて`変数[0]`、`変数[1]`と指定して取り出す。
それがめんどくさいので`[foo, setFoo]`を用意してそれぞれに突っ込んじゃおうという策略。
【忘却録】Xcodeからipaファイルを作成し、実機にインストールする方法

## 概要
Xcodeでipaファイルをサックと作って、実機（iPhone）にぱぱっとインストールする際の手順をまとめる

## 環境
- Xcode(Version 13.4.1)
- iPhone 12 mini(iOS 16.4.1)

## 発端
- Xcodeのバージョンを変えたくない
- けど、最新のiOSが入った実機で開発アプリを確認したい…となったので
※Xcodeの`⌘ + R (Run)`で実機にインストールする方法もあるが、Xcodeのiosサポートバージョンが対応していないと実行できないため

## 前提
- アプリ署名、証明書の対応が済んでいること

## 手順
### ipaファイル生成
- Xcodeで開発ディレクトリを開く
- Xcodeの上部メニューより`Product -> Archive`でアーカイブ実行
※作成までに多少時間がかかる
- 画面が開いたら、画面右の「Distribute App」をクリック
【過って画面を閉じでしまった場合】
`Window -> Organizer` or `⌥option + Shift + ⌘ + O`
- 画面の下部「Development」を選択して次へ
- 「App Thinning」は`None`、「Include manifest...」は`チェックなし`で次へ
- 作成結果が表示されるので「Export」をクリック
- 保存する場所を選んで名前をつけて「Export」をクリック
- 完了！

### ipaファイルを実機（iPhone）にインストールする方法
- 実機iPhoneとPCをケーブルで接続
- メニューバーより`Window -> Devices and Simulators`を開く
- `INSTALLED APPS`の下にある`+`をクリック
- 先程作成したipaファイルを選択して「open」をクリック
- インストールされるのを待つ
- 完了！

## 参考にさせていただいた記事
https://qiita.com/gomadare882/items/3bc2f6032868bd969d1c
https://qiita.com/0ba/items/f0c52b73d40f0ac33d25
[SwiftUI]Thread 1: "Invalid parameter not satisfying: [name length] > 0”でアプリがアプリが落ちる

# 概要

Previewなら適切に動作してるのに、シミュレーターを動かそうとすると以下のエラーでクラッシュする場合の対処法です。

```swift
Thread 1: "Invalid parameter not satisfying: [name length] > 0”
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3352230/c3021e04-1421-9152-edbd-8223a490e906.png)

こういう **＠main** に赤線入るエラー心臓に悪いですよね。


# **環境**

Xcode : 14.3

Swift : 5.8

SwiftUIを使用、Storyboardを使用してない

# 原因

SwiftUIで構築しているのにStoryBoardを参照しようとしたが、StoryBoardが存在しないためクラッシュした。

# 解決策

検索機能を使ってStoryで検索

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3352230/086eb76b-2903-05cd-277d-b656bef63fba.png)


そしたらStoryを指定しているKeyが発見できます。Valueがなかったせいでエラーになってたんですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3352230/ab950902-991c-8988-448a-2cee1c33f409.png)


Storyboard Nameの横にある”-”ボタンを押して削除

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3352230/6c3af1cd-ccfa-6814-5861-ad905ae1e64a.png)


この状態になったら大丈夫です。再度実行ボタンを押してみてください。

## 追伸

参考になればいいねやブックマークしていただけると、励みになります。

Twitterで日々の学習風景を投稿してます。

[@Ren_yello](https://twitter.com/Ren_yello)
Kusto の contains 演算子 と has 演算子


# TL;DR

Alias 的な感じで同じだと思っていたが別物だった。

`contains` は文字列を検索し、`has` は用語(`term`)を検索する。
雑な検索をするときは、`| * has "keyword"` より `| * contains "keyword"` のほうが良さそう。


https://learn.microsoft.com/ja-jp/azure/data-explorer/kusto/query/contains-operator

> 大文字と小文字を区別しない文字列を含む、データのレコード セットをフィルター処理します。 contains は、用語ではなく任意のサブ文字列を検索します。

> Filters a record set for data containing a case-insensitive string. contains searches for arbitrary sub-strings rather than terms.

https://learn.microsoft.com/ja-jp/azure/data-explorer/kusto/query/has-operator

> 大文字と小文字を区別しない文字列を使用して、データのレコード セットをフィルター処理します。 has は、インデックス付き用語を検索します。インデックス付き 用語 は 3 つ以上の文字です。 用語が 3 文字未満の場合、クエリは列内の値をスキャンします。これは、用語インデックスで用語を検索するよりも低速です。

> Filters a record set for data with a case-insensitive string. has searches for indexed terms, where an indexed term is three or more characters. If your term is fewer than three characters, the query scans the values in the column, which is slower than looking up the term in the term index.


# 例

```
StormEvents
| summarize has_Thunder = countif(EpisodeNarrative has "Thunder"),
            has_ThunderStom = countif(EpisodeNarrative has "ThunderStom"),
            has_ThunderStorms = countif(EpisodeNarrative has "ThunderStorms"),
            has_ThunderStroms = countif(EpisodeNarrative has "ThunderStroms"),
            contains_Thunder =  countif(EpisodeNarrative contains "Thunder"),
            contains_ThunderStorm =  countif(EpisodeNarrative contains "ThunderStorm")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/91bb324c-2aef-105f-5f60-64f6800b87e1.png)

`EpisordNarrative` フィールドには、`Thunder` というキーワード以外にも `Thunderstorms` といった単語を含むレコードや、 `Thunderstroms` などの typo を含むレコードがあるので、それぞれ `has`では検索結果がことなる。
（備忘録）UbuntuのCドライブからDドライブへお引越し

# 概要
Cドライブがだいぶ圧迫されてきたので容量の大きいUbuntuを今まで使ってこなかったDドライブに引っ越します。とりあえずwslを普段使用するコマンドプロンプトで起動できるところまでできればいいなと思います。
[こちら](https://zenn.dev/shittoku_xxx/articles/066cfd072d87a1)の記事を参考にしました。

# 環境
Windows11
Ubuntu20.0

# Linuxディストリビューションの確認
まずPowerShellの起動し、`wsl -l -v`でLinuxディストリビューションを確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2441810/dcee5461-eb24-28e6-927c-c13f7b7a3655.png)
するとUbuntuの他にdockerの記述が！大学の授業で入れたのですが、後でこれもDに移動しなければならないかもしれないです。dockerのドライブの移動の記事もあったのでとりあえずほっといて先に進みます。

# 保存先へ移動
```
cd 保存先
mkdir wsl
cd wsl
```
で保存先にwslフォルダを作り、その中で作業を進めていきます。

# Ubuntuを.tarファイルとしてエクスポート
```
wsl --export <Distribution Name> <FileName>
```
を実行してUbuntu環境を.tarファイル化しました。
たまーに授業でも.tarでファイルが渡されることがあるのですが、自分で作るのは初めてです。.tarは.zipの仲間で圧縮しているのかと思ってましたが、どうやらアーカイブだけなんですね～。

# 引っ越し元のUbuntuのWSLからの登録解除、アンインストール
もとの場所にある環境を以下のコマンドで完全に削除します。多分大事なファイルとかはないのでバックアップは取らないで大丈夫でしょう。
```
wsl --unregister <Distribution Name>
```
`wsl -l -v`してdocker関連のファイルのみが残り、Ubuntuは消えていることを確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2441810/1f71d2bc-2f21-c622-a628-75d9b377dcc9.png)

# .tarファイルを復元する
以下のコマンドを実行して.tarファイルを復元します。
```
wsl --import <Distribution Name> <InstallLocation> <FileName>
```
もう一度`wsl -l -v`で確認するとUbuntuが存在していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2441810/26faa450-6a4c-f793-253a-747683c47627.png)

# ログインユーザの変更
Ubuntuを起動するとログインユーザがrootになっているので変更します。
```
cat << EOF > /etc/wsl.conf
[user]
default=user-name
EOF
```
をのuser-nameを登録してある名前（`cd/home`内のフォルダ名）に変更し、実行しました。
何度かUbuntuを起動しなおしたら一般ユーザでログインできていることが確認できました。最初はrootのままになっていて焦りました。

# コマンドプロンプトでの起動
ここまで来たら起動するだけ！と思いきや`wsl`を入力すると以下のエラーが
```
ファイル システムの 1 つをマウント中にエラーが発生しました。詳細については、「dmesg」を実行してくださ い。
```
一瞬焦りましたが、よく見返したところ規定に使うディストリビューションがdockerになっていることに気づきました。このメモ書いといてよかった…。以下のコマンドで規定のディストリビューションを変更したところwslの起動に成功しました！
```
wsl -s Ubuntu-20.04
```
以上でお引越し完了です！お疲れ様でした～。
GFortranでHelloWorldプログラムを実装してみた

# 概要
今日はGFortranでHelloWorldプログラムを実装してみました。
以下のページを参考にしました。
https://www.nag-j.co.jp/fortran/FI_2.html

# プログラム作成
以下の通りソースコードを記述しました。
```hello2.f
      program hello
      print *, 'Hello World!'
      end program hello
```
# コンパイル
以下のコマンドを実行しました。
```
$ gfortran hello2.f
```

# プログラム実行
```
$ ./a.out 
 Hello World!
```

# まとめ
今日はFortranで遊んでみました。何かの役に立てばと。
ElixirのリストとPythonのリストは違います

# はじめに

AtCoderで[この問題](https://atcoder.jp/contests/abc160/tasks/abc160_c)をPythonと同じ感覚で記述したら、処理時間オーバ(TLE)になってしまいました。

対処方法をまとめてみます

# TLEになったコード

```Elixir:main.ex
defmodule Main do
    def input(), do: IO.read(:line) |> String.trim()
    def ii(), do: input() |> String.to_integer()
    def li(), do: input() |> String.split(" ") |> Enum.map(&String.to_integer/1)
 
    def pos(i,a), do: Enum.at(a,i)
 
    def d(0,k,n,a), do:  pos(0,a) + k - pos(n-1,a)
    def d(i,_k,_n,a), do:  pos(i,a) - pos(i - 1, a)
 
    def solve(k, n, a) do
        d = for i <- 0..n-1, do: d(i,k,n,a)
        max_d = Enum.max(d)
        ans = Enum.sum(d) - max_d
        IO.puts(ans)
    end
 
    def main() do
        [k, n] = li()
        a = li()  # type: "List[int]"
        solve(k, n, a)
    end
 
end
```

入力例１，２では、正しい結果を出力して、処理内容としては問題がないコードでした。
しかし、処理時間が、制限時間を超えで不正解となってしまいました。

TLEのエラーになった時の入力データは、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/ef0c7c9b-edc3-75dd-ef20-88b05b458db4.png)

nが200000と大きく、リストaが大きい事がわかります。

Pythonのコードの場合、これと同等の内容でも時間内に処理できます。

# ElixirとPythonの違いはなにか？

Pythonの場合は、どうしてTLEにならず、Elixirの場合TLEなんでしょうか。

計算量を表す指標にO() （オーダー）があります。

TLEになったプログラムでは、Enum.at()を使っています。
i番目のデータを見つける為に、使用していますが、先頭からi番目まで辿っていく処理をしています。
処理時間はiの値比例した時間がかかります。iが10倍になれば処理時間は10倍かかります。
このような処理はO(n)と呼ばれています。Nが200000だとEnum.at(200000)は、Enum.at(0)にくらべて、200000倍の時間がかかることになります。これは遅い。

Pythonのリストの要素へのアクセスするa[i]はiの値によらず一定の値です。オーダーはO(1)。つまりNが大きくなっても速度の低下はしません。

Nが大きくなるとこの違いは歴然です

# elem()を使おう

elem()はO(1)の処理時間です。
`List.to_tuple(a)`でタプルに変換して要素の参照は、elem()にしてみました。

```Elixir:main.ex
defmodule Main do
    def input(), do: IO.read(:line) |> String.trim()
    def ii(), do: input() |> String.to_integer()
    def li(), do: input() |> String.split(" ") |> Enum.map(&String.to_integer/1)

    def pos(i,a), do: elem(a,i)

    def d(0,k,n,a), do:  pos(0,a) + k - pos(n-1,a)
    def d(i,_k,_n,a), do:  pos(i,a) - pos(i - 1, a)

    def solve(k, n, a) do
        d1 = List.to_tuple(a)
        d = for i <- 0..n-1, do: d(i,k,n, d1)
        max_d = Enum.max(d)
        ans = Enum.sum(d) - max_d
        IO.puts(ans)
    end

    def main() do
        [k, n] = li()
        a = li()  # type: "List[int]"
        solve(k, n, a)
    end

end
```

# まとめ

Tupleは要素のアクセスは速いですが、Enumが使えません。
Tuple/Listには一長一短があるので区別して使いましょう。

|特徴|List|Tuple|List(Python)|
|---|----|-----|------------|
|要素の参照|O(n)|O(1)|O(1)|
|イテレーション|〇|×|〇

PythonのようにListでどっちもできるわけではないので、必要に応じて
Tuple.tolist(), List.to_tuple()で変換して使いましょう。

参考
Pythonの計算量
https://wiki.python.org/moin/TimeComplexity
Unityシーン容量削減勉強会 第1回 ～容量順でソートする編～

# Unityシーン容量削減勉強会 第1回 ～容量順でソートする編～

社内のUnityクリエイター向けに、シーン容量削減勉強会というものを実施しています。
せっかくなので、資料を公開します！

シリーズになっているので、気になるところだけでも読んでみてください！

##### Unityシーン容量削減勉強会シリーズ

- Unityシーン容量削減勉強会 第1回 ～容量順でソートする編～ ← 本記事
- [Unityシーン容量削減勉強会 第2回 ～テクスチャ編～](https://qiita.com/segur/items/4559edc2e0d4353204d9)
- [Unityシーン容量削減勉強会 第3回 ～モデル編～](https://qiita.com/segur/items/550af881e7e8d5470b92)
- [Unityシーン容量削減勉強会 第4回 ～アニメーション編～](https://qiita.com/segur/items/071e228258806f3e0113)


# 本記事の対象

以下の方を対象としています。

- Unityでなにか制作・開発する人
- 黒い画面（コマンドライン）は触りたくない人

# シーン容量が大きいと何が問題なの？

シーン容量は、視聴時のパフォーマンスに直接影響します。

シーン容量が大きいと、視聴者の端末で以下のようなリスクが高まります。

- Unityシーンが開けない
- Unityシーンがクラッシュする
- 描画がカクカクする
- シーンのダウンロード時間が長くなる

多くの視聴者に快適に体験していただくためにも、シーン容量は削減しましょう！

# 容量でソートしよう！

どんなファイルの容量が大きいのか、現状を把握しましょう！

そのためにはちょっと面倒ですが、Unityシーンをビルドする必要があります。

`File > Build Settings` をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/38fed962-cd89-f1c3-5414-c98751427735.png)

`Build Settings` というウィンドウが表示されるので、右下の `Build` をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/88e01f4c-f499-4a62-4520-9ec4c8f69deb.png)

`Build Windows` というウィンドウが表示されるので、 `Assets` フォルダーの隣に空のフォルダーを作成し、 `フォルダーの選択` をクリックします。
※空のフォルダーの名前は何でもいいですが、以下の図では `Build` としています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/6c41e21c-bfe6-f660-ca81-c681071834fd.png)

そうするとビルドが始まるので、終わるまで待ちます。
ビルドには数分かかることがありますが、気長に待ちましょう！

ビルドが終わったら `Console` ウィンドウを開き、 `右上の︙ > Open Editor Log` をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/f2044c20-a711-7087-634c-c02313a277d1.png)

以下のような警告が表示されることがありますが、気にせず `継続する` をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/762da76f-a71e-f306-72c0-a0957c66553d.png)

すると `Editor.log` が開きます。

`Build Report` で検索すると、以下のような情報が見つかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/6515f846-011b-1924-94a6-6f6de33ccb08.png)

上記画像の場合、カテゴリ別だと `Textures` が1位で43.1%を占めています。
ファイル別だと `OTF` というファイルが1位～5位を占めています。これはフォントファイルですが、もし使っていないフォントなのであれば削除した方が良さそうです！

こんなふうに **なにが** **どれくらい** 容量を占めているのか把握できると、削減の方針も立てやすいのでオススメです！

# カテゴリ別にファイルを検索する

たとえば、「フォントファイルを一覧で確認したい」と思ったときに便利な方法を紹介します！

`Project` ウィンドウの右側にある `Search by Type` ボタン（■●▲ みたいなやつ）をクリックすると、ファイルタイプの一覧が表示されるので、 `Font` をクリックします。
すると、以下のようにUnityプロジェクト内で使用されているフォントファイルの一覧が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/b8061463-b3a2-325b-afa0-79012de3f88e.png)

もし、使っていないフォントがあるのであれば、削除しちゃいましょう！

こんな風にカテゴリ別にファイルを検索すると、容量削減作業がはかどりますので、ぜひご活用ください！

# さいごに

今回はここまでです！おつかれさまでした！

次回はテクスチャ編です！引き続きこちらも実践していただけると嬉しいです！

https://qiita.com/segur/items/4559edc2e0d4353204d9

本記事作成にあたり、以下の記事を参考にさせていただきました。ありがとうございました！

- [UNITY アプリのビルドサイズ容量削減する方法 総まとめ](https://techblog.unitedcube.com/unity/unity_build_size_down/)
キャプチャグループにマッチした文字列を取得したい

VBAでキャプチャグループにマッチした文字列を取得したい場合、MatchオブジェクトのSubMatchesを利用します。

例) YYYY/MM/DDにマッチする文字列、およびYYYY、MM、DDそれぞれにマッチする文字列をキャプチャグループを含む正規表現で取得し、コンソールに表示する。

```vb
' 変数宣言
Dim line As String
Dim re As RegExp
Dim mc As MatchCollection
Dim m As Match
Dim i As Long
Dim j As Long

' 検索対象の文字列を設定する
line = "わたしの誕生日は2000/01/02、彼女の誕生日は2001/03/04です"

' 正規表現オブジェクトを作成する
Set re = New RegExp
re.Global = True
re.Pattern = "([0-9]{4})/([0-9]{2})/([0-9]{2})"

' 正規表現による検索を実行する
Set mc = re.Execute(line)

' 検索結果を表示する
For i = 0 To mc.Count - 1
    Set m = mc(i)
    
    ' マッチした文字列全体を表示する
    Debug.Print m
    
    ' キャプチャグループにマッチした文字列を表示する
    For j = 0 To m.SubMatches.Count - 1
        Debug.Print m.SubMatches(j)
    Next j
Next i
```

これを実行すると、コンソールは次の通りに表示されるはずです。

```
2000/01/02
2000
01
02
2001/03/04
2001
03
04
```

**環境情報**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/4c6d5272-5ec7-c10e-e553-604065284f76.png)
【解決！】モバイルSuicaの反応が突然遅くなったときにすべきこと

# 概要
* モバイルSuicaを使っているのですが、ある日から突然反応が遅くなりました。
* 解決した方法を記載します。

# 症状
* AppleでモバイルSuicaをWalletに登録して利用しています。
* ある日から、改札でタッチすると2-3秒くらい遅れて反応するようになりました。
* 「スマホケースを外してみる」「スマホ上部をあてる」などを試してみましたが、変わらず。というより、以前とまったく同じやり方でタッチしているので、これらの原因は考えづらい...
* 「メモリ不足」という原因の可能性もあるというネット記事を見つけたので、いらないアプリを消したり、写真を移動したりしましたが、変わらず...。
* 「Apple OSのアップデート」も実施していますが、やっぱり直りません。

# 解決方法
* Walletになにか原因があるのかなと思い、一度Suicaを消してみることにしました。
    * 「設定」→「ウォレットとApple Pay」から該当のSuicaを選択→「カードを削除」をタップ
    * 「ウォレット」→右上の「＋」マーク→「交通系ICカード」を押すと、以前登録したSuicaを再び戻すことができる表示があると思うので、それをタップします。少し待つと、再登録が完了します。
* すると、、、反応が通常に戻りました！

# 原因は...？
* 明確な原因は分かりませんが、Walletでなんらかのバグか不具合が起きていたっぽいです。
* ググっても全然同じような症状が見つからなかったので、もし同じような症状の方がいたらぜひ一度Suicaを消してみてください。
SQL チートシート

## MOD: - 余剰を求める

引数２を引数１で割った余りを戻す。
modulo[^1]の略。

[^1]: 〜法。モジュロ演算。


## ROWNUM: - 行番号を求める

選択した行の番号を戻す。
ROWNUM=1 だと１行目。

参考：
https://docs.oracle.com/cd/E82638_01/sqlrf/MOD.html#GUID-E12A3928-2C50-45B0-B8C3-82432C751B8C
https://docs.oracle.com/cd/E16338_01/server.112/b56299/pseudocolumns009.htm
自己紹介


リクルートのHR領域のIT投資責任者・プロダクトマネジャーを経て、現在、株式会社Sparcle・株式会社root Aの2社の代表をしております。

色々な方面の方と情報交換できたらと思っております。
特に、PM人材の採用にお困りの経営者・現場責任者・人事の方、PM人材として活躍されている方とは、是非情報交換させていただけますと幸いです。


●Sparcleについて
https://www.sparcle.co.jp
『ひとりひとりがありたい自分に』をミッションに、もっと自分の人生に熱中できる世の中を情熱とテクノロジーのちからで作ることを目指して、
元リクルートのプロダクト責任者・PdMが中心に立ち上げた企業です。

◆事業内容
Webプロダクト/IT投資/システム化構想などの超上流フェーズを強みとしたプロダクト開発支援事業をしております。

~サービスメニュ~
・CPO/CIOレイヤーの課題に対する顧問サービスの提供
・新規事業/新規プロダクト検討および開発計画立案支援
・PdM / PjM / PMOのプロフェッショナル人材の業務委託としてのご紹介
・副業PdMの紹介およびシームレスな採用アトラクト支援
https://www.mately.jp/
など

現在、上場大手企業様・シリーズB~Dのベンチャー企業様を中心にご支持いただいております。

外部人材として様々な企業での経験があるからこそ、IT投資戦略立案から組織化、開発実行まで一気通貫で支援をさせていただいております。人の紹介も含めて支援しておりますので、PM人材・DX人材のニーズがある方がいらっしゃいましたら、お声かけください。


●略歴
1991年3月生まれ、早稲田大学大学院先進理工学研究科修了。2015年に株式会社リクルートキャリア（現リクルート）に新卒入社。HRアセスメント領域・中途HR領域横断のPdM兼PjMに従事し、2020年にマネジャー任用。リクルートエージェントのIT投資責任者としてIT投資戦略策定、プロダクト開発統括、投資適正化と開発組織作りを通じてIT投資全体の推進スピード・費用対効果の向上に従事。
2021年11月、株式会社Sparcleを創業。
2022年10月、株式会社root Aを創業。
https://www.root-a.jp/

●趣味
ゴルフ,サウナ
【React】useStateとuseRefの簡単な違い

## **useState**
これはReactの機能の一つで、画面上に表示する値（例えば、ユーザーが入力したテキストや選択したオプション）を管理する。
- メリット：値が変わると自動で画面が更新される。なので、ユーザーが何か操作をしたときに画面を更新するためには非常に便利！
（これにより、ステートに基づくUIの変更を簡単に実装することが可能。）
- デメリット：値がよく変わると画面が頻繁に更新され、それがパソコンの負担になることがある。

## **useRef**
これもReactの機能の一つだが、useStateとは違って、useRefが管理する値が変わっても画面は自動で更新されない。つまり、値を覚えておくだけの役割を果たす。
主に、画面上の特定の場所（例えば、ボタンやテキストボックス）を探すために使われる。
（頻繁に変更されるがそれによってUIが更新されない値を扱うのに便利！）

- メリット：値が変わっても画面は更新されないので、頻繁に値が変わるがそれにより画面を更新する必要がない場合に便利！
- デメリット：値が変わっても画面は自動で更新されないので、その値の変化に応じて何かをするためには別の方法を考える必要がある。

### それぞれ適切な場面で使うことで、効率的にプログラムを作ることができる。
状態の変化に基づいてUIを動的に更新する必要がある場合にはuseStateを、再レンダリングに関係なく保持したい値を管理する場合にはuseRefを使用するなど使い分ける。
NGINXのローカル環境の作成 仕上げ

# var以下のディレクトリに自由な権限を与える
```javascript
cd /var
sudo chmod -R 777 www
```

# winSCPに接続
||パラメータ|
|---|---|
|**ホスト**|**127.0.0.1**|
|**ポート**|**2222**|
|**ユーザー名**|**vagrant**|

|SSH⇨認証|パラメータ|
|---|---|
|**秘密鍵**|**private_key**|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/0112d97b-85ab-c807-640a-2e72a39ff0a6.png)

```javascript
C:\Users\3333\aaaaa_local_5\.vagrant\machines\default\virtualbox
```

# 接続できたら次へ
```javascript
```
# ディレクトリを作成
```javascript
sudo mkdir /var/www/aaaaa
sudo mkdir /var/www/aaaaa/application
```
# /var/www/aaaaa/の配下に必要なディレクトリをぶっこむ
```javascript
```
# データベースの接続設定
### コードイグナイターなら/var/www/aaa/application/config/database.php
```javascript
$db['aaa'] = array(
    'password' => '19991023Reo!',
);

if (ENVIRONMENT !== 'production' || ($_SERVER['CI_DEVELOP'] ?? 0)) {
    foreach ($db as $key => $val) {

        $db[$key]['hostname'] = 'localhost';
       // ↓をコメントアウト
       // $db[$key]['username'] = 'aaaaa';
       // ↓を追加
        $db[$key]['username'] = 'root';
        $db[$key]['password'] = '19991023Reo!';
       // ↑を追加
        if (isset($db[$key]['port'])) {
            unset($db[$key]['port']);
        }
    }
}

```
# コマンド  database.phpを編集
```javascript
sudo sed -i 's/bt%NqyK79ea(/19991111Rao!/g' /var/www/aaaaaa/application/config/database.php

sed -i "/\$db\[\$key\]\['hostname'\] = 'localhost';/a \
        \$db[\$key]['username'] = 'root';\n\
        \$db[\$key]['password'] = '19991111Rao!';" /var/www/aaaaaa/application/config/database.php

sed -i "s/\(\$db\[\$key\]\['username'\] = 'altema';\)/\/\/\1/" /var/www/aaaaaa/application/config/database.php
```

### ワードプレスなら/var/www/aaa/wp-config.php
```javascript
/** MySQL データベースのパスワード */
define('DB_USER', 'root');
/** MySQL データベースのパスワード */
define('DB_PASSWORD', '19991023Reo!');

define ('WP_SITEURL', 'http://192.168.77.22');
define ('WP_HOME', 'http://192.168.77.22');

```

### ワードプレスなら/var/www/aaa/wp-login.php
```javascript
#↓以下の記述を削除

if ( force_ssl_admin() && ! is_ssl() ) {
	if ( 0 === strpos( $_SERVER['REQUEST_URI'], 'http' ) ) {
		wp_safe_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );
		exit;
	} else {
		wp_safe_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
		exit;
	}
}

```



# ドキュメルートの編集
# sudo vi /etc/nginx/conf.d/default.conf
### :%d
```javascript
ドキュメルートの編集

server {
  root /var/www/aaa/www;
  listen 80;
  server_name localhost;

  location /{
      index index.php;
      try_files $uri $uri/ /index.php$is_args$args;
   }

  location ~ \.php$ {
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}
```

# ファイル編集
**/var/www/xxxxx/application/html/xxxxx/add_allowip.txt**
**/var/www/xxxxx/application/views/header.php**
**/var/www/xxxxx/application\views\title\header.php**
**/var/www/xxxxx/application/models/Xxxxxx_model.php**
**/var/www/xxxxx/application/config/constants.php**

# sudo systemctl reload nginx
```javascript
nginxを更新してページ確認
```

⇦前のページ
https://qiita.com/panda-chibi/items/01b0ed087658f1e5624f
WSL2(Ubuntu 22.04)環境を可能な限りコマンドラインでインストールする

WSL2の手順が毎回手間に感じたので、可能な限りコマンドラインでインストールしたいです
ダイアログは数回でますが、基本ポチポチするだけです

# Microsoft-Windows-Subsystem-LinuxとVirtualMachinePlatformを有効化
PowerShell　管理者実行
```
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all
```
再起動要求されるのでYで再起動

# 再起動後の続き　wslのアップデート〜Ubuntu22.04インストールまで
PowerShell　管理者実行
```
wsl --set-default-version 2
wget https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi -OutFile wsl_update_x64.msi
msiexec /i wsl_update_x64.msi /passive
del wsl_update_x64.msi
wsl --update
wsl --install Ubuntu-22.04
```

成功するとUserとPasswordを聞いてくるので適切にいれてください
【Tailwind CSS】親要素と子要素（または同じ階層の要素）間のスタイル相互作用【groupとpeer】

### `group`と`peer`の主な違いは、スタイルを適用する対象がどの要素との相互作用に基づいているか。

## `group`
親要素に適用され、親要素に対する操作（ホバーやクリックなど）により子要素のスタイルが変化する。
例えば：
```html
<div class="group">
  <p class="text-gray-500 group-hover:text-orange-500">テキスト</p>
</div>
```
上記の例では、親要素（`div`）がホバーされたとき、子要素（`p`）のテキスト色がオレンジに変わる。

## `peer`
同じ階層の要素に対する操作に反応する。`peer`は操作を受ける要素に適用され、その後ろに続く要素のスタイルが変化する。
例えば：
```html
<input type="checkbox" class="peer" />
<p class="text-gray-500 peer-checked:text-orange-500">テキスト</p>
```
上記の例では、チェックボックス（`input`）がチェックされたとき、同じ階層の要素（`p`）のテキスト色がオレンジに変わる。

### つまり、`group`は「親要素の操作で子要素のスタイルを変える」ために、`peer`は「同じ階層の要素の操作でその後ろに続く要素のスタイルを変える」ために使用する。
話題のrinna-3.6bをColab無料枠で動かしたい！(Hugging Face load_in_8bitを使ったサンプルコード)

# 最近話題のLLMってやつを触ってみたい
最近めちゃくちゃ大規模言語モデルって人気ですよね。でも触ってみようとするとColabとかKaggleだとかの無料のやつだとRAMが足りないとかVRAMが足りないとかでとっても苦労します。でもどうにかして触りたい・・・
# 対策
対策としてはシンプルにサブスクとか自分でマシン買うとか「課金する」というのが考えられます。でも課金するほどのモチベはないなあって人多いと思います、自分もそうです。
そこで無料枠で頑張って動かす方法を考えます。
# 手法
結論から言うとモデルを量子化して読み込めばいけ(る場合があり)ます。以下コードです。

```python:rinna-instruction-3.6b-8bit.ipynb
# 必要なライブラリのインストール
!pip install accelerate
!pip install  -i https://test.pypi.org/simple/ bitsandbytes
!pip install transformers[sentencepiece]
import gc
import torch
from accelerate import init_empty_weights, infer_auto_device_map, load_checkpoint_and_dispatch
from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer, logging
torch.cuda.empty_cache()
#モデルの定義
model_name = "rinna/japanese-gpt-neox-3.6b-instruction-sft"
#重みなしで読み込む(modelを定義するため)
with init_empty_weights():
    model = AutoModelForCausalLM.from_pretrained(model_name)
gc.collect()
#メモリの制限をかける(Out of memoryの対策)
device_map = infer_auto_device_map(
                                  model, max_memory={0: "11GiB", "cpu": "7GiB"}, 
                                   no_split_module_classes=["GPTNeoXLayer"]
                                   ,dtype=torch.int8
                              )
#load_in_8bitをTrueにして量子化する
model = AutoModelForCausalLM.from_pretrained(model_name,
                                          device_map = device_map, load_in_8bit=True,
                                          low_cpu_mem_usage=True,
                                          )
tokenizer = AutoTokenizer.from_pretrained(model_name)

prompt = [
    {
        "speaker": "ユーザー",
        "text": "りんなは人間ですか？それともAIですか？。"
    }
]
prompt = [
    f"{uttr['speaker']}: {uttr['text']}"
    for uttr in prompt
]
prompt = "<NL>".join(prompt)
prompt = (
    prompt
    + "<NL>"
    + "システム: "
)

token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")

with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        do_sample=True,
        max_new_tokens=128,
        temperature=0.7,
        pad_token_id=tokenizer.pad_token_id,
        bos_token_id=tokenizer.bos_token_id,
        eos_token_id=tokenizer.eos_token_id
    )

output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1):])
output = output.replace("<NL>", "\n")
print(output)
```
これで動きます。りんなちゃんは人間なのか？AIなのか？
# 出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628108/40a711ed-b2e2-bb04-b5c8-c62b1562e62e.png)

。。。IBM製のAIだった:rolling_eyes:

# まとめ

- 大規模言語モデルはでっかいメモリがいる
- でっかいメモリを使おうとすると金がかかる
- 金をかけたくない-> 量子化すればワンチャン読み込めるかも？


最後にColabのリンクを共有します！prompt部分いじったら色々遊べます。
他のモデルでも3.6b程度までなら省メモリで動かせると思われます！

https://colab.research.google.com/drive/1VC4vaGdQU6eiPcFx85DFV3RUHH2xqYvr?usp=sharing#scrollTo=MR9hZI0ML16Y
Railsのコールバックが走るタイミング

# 呼ばれる順番
順番は以下の通り

`before_validation`
`after_validation`
`before_save`
`around_save`
`before_create` / `before_update`
`around_create` / `around_update`
`after_create` / `after_update`
`after_save`
`after_commit` / `after_rollback`

# それぞれのコールバックが呼ばれるタイミング
### before_validation
タイミング：**バリデーションが行われる直前**
用途：バリデーション前に属性値を微調整したい場合など

### after_validation
タイミング：**バリデーションが行われた直後**
用途：バリデーションが成功したか否かにかかわらず実行したい処理がある場合

### before_save
タイミング：**バリデーションに成功し、オブジェクトがDBに保存される直前**
用途：INSERTとUPDATEのどちらでも実行したい処理がある場合

### around_save
タイミング：**DBが更新されている最中**

### before_create/before_update
タイミング：**before_saveの後**
用途：INSERTの場合のみ、あるいはUPDATEの場合のみ実行したい処理がある場合

### around_create/around_update
タイミング：**DBが更新されている最中**
用途：INSERTとUPDATEのどちらでも実行したい処理がある場合

### after_create/after_update
タイミング：**オブジェクトが保存された直後**
用途：INSERTの場合のみ、あるいはUPDATEの場合のみ実行したい処理がある場合

### after_save
タイミング：**after_create/after_updateの直後**
用途：保存されたオブジェクトの関連オブジェクトを操作したい場合など

### after_commit
タイミング：**after_saveの後（DBにCOMMITされた後）**

### after_rollback
タイミング：**バリデーションエラーやSQL実行時にエラーが発生した後**
用途：トランザクションが失敗した理由をログ出力したい時など

# 参考
- [Ruby on Rails API](https://api.rubyonrails.org/v7.0/classes/ActiveRecord/Callbacks/ClassMethods.html#method-i-around_save "Ruby on Rails API")
【バグ？】Chromeでcolor: transparent & text-strokeの要素を選択すると消える

color: transparent & text-strokeの要素を選択すると、
選択の薄グレーは表示されるものの、文字が消えてしまいました・・・
これを解消したい

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13242/bb80b0c1-d3b4-3c57-e057-fc52b0f0c513.png" width="300">

## SCSS

```scss
color: transparent;
-webkit-text-stroke: 1px black;
↓
color: transparent;
-webkit-text-stroke: 1px black;

&::selection {
　　　color: black;
　　　background: #aad2ff;
}
```

## デモ
https://codepen.io/ituki_b/pen/qBJQbpP

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="qBJQbpP" data-user="ituki_b" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ituki_b/pen/qBJQbpP">
  color: transparent &amp; text-stroke ::selection Chrome bug</a> by ituki_b (<a href="https://codepen.io/ituki_b">@ituki_b</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
MSTRにおける倍率による罫線の太さの問題

# はじめに
本記事ではMicroStrategyにおける
倍率の設定によっておこる罫線の挙動についてご紹介します。

使用しているMicrosoftStrategyのバージョンは、バージョン2021 update4.1、
ブラウザはMicrosoft Edgeを使用していますが、chromeでも同じ現象が起きることは確認済みです。

## 本記事の概要
・問題が発覚した経緯
・実際の画面
・MSTRサポートに問い合わせした結果
・再発防止のために

## 問題が発覚した経緯
まずは、問題が発覚した経緯についてご説明します。

1\. 経緯
①MSTR Webでドキュメントを作成していた際、レイアウトが複雑だったため、開発がしやすいように **倍率を50%** に変更して作業を行っていた
②作成したドキュメントを、プレゼンテーションモードにしたところ、テキストボックスの罫線の太さが変わり、かなり太くなっていた


2\. 判明したこと
①プレゼンテーションモードにした際だけ罫線が太くなる
　※編集可モードやデザインモードでは太さが変わらない
②書式設定で罫線の太さを変更しても、プレゼンテーションモードだと太いまま


## 実際の画面
下記が実際の画面です。
①プレゼンテーションモードで表示（ズーム50%で設定）
　⇒各テキストボックスの**罫線が太くなっている（罫線の書式は「細い」で設定）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/27ca7596-4492-207f-cd9b-5b7b4cdd82ce.png)

②編集可モードで表示（ズーム50%で設定）
　⇒各テキストボックスの罫線は、**設定どおり「細い」で表示されている**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/f3498607-1dd8-24da-e09f-83c8823cd915.png)




## MSTRサポートに問い合わせした結果
MSTR community等で調査を行いましたが、解決策が不明なため、最終的にMSTRサポートに問い合わせを行ったところ、下記の内容をご返信いただきました。

①事象について問題の所在は確認したものの、修正範囲が非常に広く、リスクも多い
**⇒そのため現時点では潜在的な問題として修正を行わない**
②今後の対処の方法として、ドキュメントのレイアウトデザインを行う際にZoomサイズを100%として1画面に収まるようにレイアウトすることで事象の回避をする。
（2022年9月時点）



## 再発防止のために
MSTRサポートからのご返信内容からもわかる通り、原因は倍率の設定でした。
**Zoom倍率を100%で作成**することで再発防止が出来るため、新規でドキュメントを作成する際は、倍率設定にご注意ください。

:::note warn 
補足
問題が起きた際は倍率50%だったので少し気になる程度でしたが、倍率が25%の場合は下記画像のような形になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/2311364b-6f26-2483-1583-d2bf9ff48215.png)
:::


## 終わりに
今回はMSTRにおける倍率による罫線の太さの問題と、解決策についてをご紹介いたしました。
ドキュメント作成時は倍率にご注意いただければと思います。


余談ですが、線のオブジェクトを使用した際は太さが変わらなかったので、同じ状況になっている方はそちらも検討してみるのも良いかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/098aaa2d-5c8c-acda-8c84-b0316925410d.png)


---------------------------------------------------
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
GCPのSAの種類について

# GCPのSAの種類
SAには大きく分けて以下の2種類あります。
1. Service Account
2. Service Agent

それぞれ簡単に説明します。

## Service Acount
ユーザ管理のサービスアカウント。
コンソールやgcloudコマンド(CLI)を利用して、最大100個まで作成できます。
```
hogehoge@{project-id}.iam.gserviceaccount.com
```
サービスアカウントを削除すると、同じ名前で作成し直したとしても
ついていたロールは剥がれてしまうので削除する際は注意が必要です。

## Service Agent
Google管理のサービスエージェント。
Google Cloudのサービス間で用いられます。
サービスエージェントの一覧は以下にまとめてあります。

https://cloud.google.com/iam/docs/service-agents

サービスのAPIを有効化した際に該当のサービスエージェントがGoogle側で自動で作成されます。
その際、上記のドキュメントの右の列に記載されているロールが自動で付与されます。
（IAMのコンソールで「Google 提供のロール付与を含める」にチェックを入れると出てきます。）
ロールの記載がないサービスエージェントはコンソールのIAMの一覧には出てきませんが
こっそり作成されています。
（IAMのコンソールはロールが付与されているものしか表示されない仕様みたいです。）
また、サービスエージェントにも任意のロールを付与することができます。
サービスエージェントも自由に編集、削除ができますが、取り扱いには注意が必要です。
誤って消してしまった場合、APIを無効化して有効化することで再度作成されます。
【TypeScript・JavaScript】filterメソッドとmapメソッドの違い（配列の操作）

###  `filter`メソッドと`map`メソッドの違いは、配列の要素に対する操作と結果の形式!

## `filter`メソッド
配列の各要素に対してテストを行い、そのテストを通過（trueを返す）した要素だけからなる新しい配列を作る。
これは「ある条件を満たす要素だけを集めたい」場合に使用する。
```javascript
const numbers = [1, 2, 3];
const filteredNumbers = numbers.filter(num => num !== 2);
console.log(filteredNumbers); // 出力：[1, 3]
```
この例では、`filter`メソッドを使用して、配列`numbers`から2を除いた新しい配列`filteredNumbers`を作成している。

## `map`メソッド
配列の各要素に対して関数を適用し、その結果からなる新しい配列を作る。
これは「すべての要素に何らかの処理を施したい」場合に使用する。
```javascript
const numbers = [1, 2, 3];
const doubledNumbers = numbers.map(num => num * 2);
console.log(doubledNumbers); // 出力：[2, 4, 6]
```
この例では、`map`メソッドを使用して、配列`numbers`の各要素を2倍した新しい配列`doubledNumbers`を作成しています。

### つまり、`filter`は「選択」、`map`は「変換」のためのメソッドといえる!!
なぜマネージャーは失敗するのか。アジャイル開発という現代の無間地獄

この記事は、ウォーターフォール的な規模感の開発が陳腐化し、アジャイル開発へのシフトが進んだ現代では、行動モデルそのものが変容してるため、従来の経験則で人を動かすマネージャは、マネージャーとして失敗してる可能性がある。という適当な勢いのポエムです。

# 過去の開発の特徴

過去の開発の特徴をいくつかあげます。

* 大規模

過去の開発では、比較的大きなプロジェクトが一般的でした。複数のチームや部門が関与して、開発が行われました。開発サイクルも比較的長く、開発者はプロジェクトに集中し、1年近い未来の成果を目指して取り組んでいました。

* 明確なゴール

プロジェクトの成功は、対外的にも大きく認知されることが多かったです。開発者にとって大きな達成感が得られる瞬間です。開発者は成長を感じ、自身のスキルや能力を向上させることができました。誰かが与えることをしなくても、外から目に見える成果という形で、達成感が明確に得られました。

## みんなが頑張ると「つらい」のが仕事

少し話を変えましょう。なぜ仕事はつらいのでしょうか？現場に悪意や士気の問題がある場合もありますが、それを抜いたとしても、みんなが真面目に頑張っているにも関わらず、仕事がつらいことがあります。

その一つの要因は、高い品質や成果の追求です。

品質の良いものは、品質が悪いものを改善して生まれる結果です。しかし、品質の悪いものにも人々の労力が関わっています。仕事をするということは、本質的には、人々の労力を犠牲にしながら、優れたものを選り抜く作業です。

良いものを作るという行為は、本質的につらいものです。


## 外発的に与えられる達成感によって「つらい」をチャラにしていた。

過去の開発では、ゴールは明確にされ、外発的な達成感が発生します。実感はシンプルに得られます。だからこそ、つらさにも耐えられるわけです。栄光に満ちた未来という希望があるから走れた。そして、このような経験則を獲得して育ったマネージャは勘違いします。辛い先には栄光の未来が勝手に訪れると。

# 現代の開発の特徴

では、この流れで現代開発の特徴を見て見ましょう。

* 小規模

アジャイル開発では、短いイテレーションを繰り返しながら製品を開発していきます。中期のマイルストーンもだいたいありますが、ほとんどの開発者は、目の前の小さなイテレーションの繰り返しに追われ、それをこなすことに集中させられます。

* 漸進的成長

機能拡張は小さく何度も行われます。プロダクトは日々小さな進化をします。逆に言えば、短い時間で見れば、プロダクトの進化は非常に小さくなります。

* 自律的な品質や成果の追及

もう言わずもがなですね。口癖のように「Value Value」と唱えながら、プロダクトの品質向上にオーナシップを持ちます。彼らは良いものを作るために努力し続けます。しかし「良いものを作るという行為は、本質的につらいものです」なのです。つまり、彼らは自らの手で自らの首を絞め続けているのです。


## もたらされたのは、絶望的な達成感の不足と、無限に続く「つらい」

アジャイル開発の経験者は、絶対にこう言います。「すごく忙しくなくなったけど、ずーっと忙しい。」

小さな目標に向かって、毎日走り続けるような感覚です。しかし、外発的な達成感は得られず、成長実感も感じられません。それでも、彼らは品質や成果を追求し続け、ますます「つらさ」を増していくのです。

# 「なぜマネージャーは失敗するのか。」

もう説明する必要もありませんね。この現代の開発の無限地獄において、過去の開発経験に基づいて人々を動かせばどうなるのでしょうか。無間地獄の中で「もっと苦しめ！もっと苦しめ！」と叫ぶ悪魔そのものになってしまうのです。

そして、どんなに苦しめても、あなたが過去に実感した栄光は、そこにはないのです。

# 何をするべきか

仕事の本質は変わってないのです。そして人の行動モデルは比較的シンプルです。

頑張る->褒める->嬉しい->頑張る

そして、アジャイル開発は「頑張る」無間地獄になり、外からは褒めるに繋がる「達成感」はふってこないのです。ならば答えは自明でしょう。

「達成感」に繋がる「褒める」を、あなたが与えてあげればよいのです。この現代の無間地獄で苦しんでいる開発者たちに「よく頑張っている。ありがとう。」と、一言かけてあげるのが始まりじゃないでしょうか。彼らは日々の努力を惜しまず、品質や成果を追求しています。その努力を認め、励ましの言葉を掛けましょう。

え？照れくさくて言えない？だったら「頑張っている」を可視化出来る仕組みを作りましょう。「頑張っている」と見えれば、あなたでなくても、誰かが彼を賞賛するでしょう。ぶっちゃけ、上手くいったらみんなで賞賛する。そういう環境を作ればよいのです。

内発的な達成感を作り出しましょう。外発的な達成感が難しいなら、彼ら自身の中で達成感が生まれるようにあなたがサポートするべきです。目標を設定してあげましょう。

でも、ビビらないで、やることはおんなじおんなじ、古今東西昔から「理解して認めて励ます。」で良いんです。え？やってこなかった？。。

なんか、内発と外発の言葉の使い方が違う気もするけどまあまあ。
【Rails】findとWhereの違い

# findとWhere
Ruby on Railsのfindとwhereは、Active Recordを使ってデータベースからデータを検索する際に使用されるメソッドだが、それぞれに違いがある。

## find
1. findメソッドは主に主キー（通常はid）を使って検索する。
2. findメソッドは一致するレコードが見つかると、そのレコードのインスタンスを返す。
3. 一致するレコードが見つからない場合、ActiveRecord::RecordNotFoundエラーが発生。
このエラーは通常、404エラーページを表示するために使用される。
例:
```ruby
user = User.find(1) # idが1のUserを検索
```

## where
1. whereメソッドは、検索条件を指定してデータを検索する。
この条件はハッシュ、配列、または文字列で指定できる。
2. whereメソッドは、一致するすべてのレコードのコレクションを返す。
このコレクションは、ActiveRecord::Relationオブジェクトとして返される。
これにより、チェーン可能なクエリが可能になる。
3. 一致するレコードが見つからなくても、whereメソッドは空のコレクションを返し、エラーは発生しない。

```ruby
users = User.where(name: 'John') # nameが'John'のすべてのUserを検索
```

# まとめ
findは主キーを使った検索で一意のレコードを返し、見つからない場合にはエラーが発生する。
一方、whereは検索条件を指定して複数のレコードを返し、見つからなくてもエラーは発生しない。
また、whereはクエリをチェーンして、より複雑な検索を行うことができる。
tmuxの便利さを昔話風に伝えたい（入門じゃないので、使い方に関してはよその記事へ）


## 第一話: tmuxとの出会い

その昔、一人の開発者がおった。

仕事中はずっとターミナル操作をしていて、
あるタブでは `docker-compose up`
別のタブでは `npm run dev` 
また別のタブでは `vim xxx/xxx.rb`
みたいな作業をしておったそうだ。

そのうちdocker-compose upで流れてくるログを見つつ、
同時にvimで修正したい願望が出てきた。

彼はタブ移動が面倒になったのだ。

何か策はないかと探していると、彼はtmuxというツールと出会った。

なんと、ターミナルのタブ一つの中で画面を分割できるではないか。 -> **ペイン分割**
彼はタブ移動することなく、ログを見つつコード修正できるようになったそう。
めでたしめでたし。

![Tmux.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3404615/8649f801-ba53-4e23-db6e-ade0e43c7e79.png)

## 第二話: ssh

彼はインフラエンジニア。
いつも通りサーバにsshで接続してターミナル操作を行なっていると、
とあるコマンドを実行中に別のコマンドを実行したいと思うようになった。
彼はもう一つタブを開こうとした時、tmuxを思い出した。

同じタブの中で操作できるぞ！

そう思うとtmuxを起動し、ペイン分割をして二つのペインから
「ssh xxx@xxx」と入力しようとしたとき彼は思った。

サーバの中でtmux使ったらいいんじゃね？

そう。
彼はサーバ上でtmuxをインストールし、その中でtmuxを起動、ペイン分割を行った。
ペインごとに「ssh xxx@xxx」というコマンドを打つ必要がなくなったのだ。

業務終了のチャイムが鳴ったので、サーバ上にtmuxのセッションを残し、作業を終えた。
翌朝、彼は再度サーバに接続して「tmux attach」と打つと、昨日と全く同じ光景が再現されていた。
彼はまるで昨日の作業終了時からワープしてきたかのように、スムーズに続きの作業に取り掛かった。

## 第三話: 開発環境 as Code

tmuxで作業が便利になったものの、PCを落とすときはtmuxのセッションが切れてしまう。
彼はそのたびにtmux起動からペイン分割し、自分好みの構成にするセットアップすることが面倒になっていた。
以前より便利になっているはずなのに。

怠惰はプログラマの美徳。
こんな面倒なことはしたくないという欲求こそが文明を発展させる礎だ。

怠けたいがためにtmuxの仕様を読みまくった。
その結果、ペイン分割や構成のセットアップを自動化できる方法に辿り着いた。

```
#!/bin/sh

tmux new-session -d

# apiサーバを起動しつつ、別のペインで同じディレクトリまで移動
tmux split-window -v
tmux send-keys -t 0 "cd ~/サーバサイドのディレクトリ/ && docker-compose up" C-m
tmux send-keys -t 1 "cd ~/サーバサイドのディレクトリ/" C-m

# フロントエンドでの作業用に新しくウインドウを作成
tmux new-window

# nodejsを起動しつつ、別のペインで同じディレクトリまで移動
tmux split-window -v
tmux send-keys -t 0 "cd ~/フロントエンドの作業ディレクトリ/front/ && npm run dev" C-m
tmux send-keys -t 1 "cd ~/フロントエンドの作業ディレクトリ/" C-m

# myql接続用に新しくウインドウを作成
tmux new-window

# dockerのmysqlコンテナが立ち上がるまで10秒くらい待機してからmysql接続
tmux send-keys -t 0 "sleep 10 && mysql -u root -h 127.0.0.1" C-m

tmux select-window -t 0
tmux select-pane -t 1

tmux attach
```

彼は、このスクリプトを叩くだけで
サーバサイドとフロントエンドのコードベース上でターミナル操作をすること、
そしてmysqlコマンドをいつでも打てる状態を再現できたのだ。

「開発環境 as Code」の完成だ

## 第四話：複数プロジェクト

開発環境 as Codeでいつでも開発環境を再現できるようになった。
しかし、プロジェクトが違えばペインの構成等も変わるだろう。

とある日、彼は快適に仕事しようとtmuxを起動したら
別プロジェクトのメンバーから緊急事態が告げられた。

「不具合です！」

まじかよと思いつつ、
せっかくdocker-compose upとかして構築した開発環境を全て破棄していった。

こんな状況下でさえ彼は思った。

「面倒くせえ」

別プロジェクトのtmuxを起動し、原因調査しようとしたその時、

「不具合じゃなかったです！」

と告げられた。

彼は激怒した。

その怒りはtmuxの仕様をさらに理解する方向へ向けられ、解消することができた。

そう。tmuxは世界を独立できるのだ。 -> **tmuxセッション**

プロジェクトAのセッションとプロジェクトBのセッションは、同時に存在可能なのだ。
`セッションを切り替えるだけで作業のコンテキストスイッチ`が可能となる。

## 最終話: 複数プロジェクト同時開発の限界

いくらtmuxセッションで複数のプロジェクトを同時に起動できるといっても被ってしまうものがある。
ポートだ。

80番だったり3000番だったり、mysqlなら3306だったり。

こればっかりは、プロジェクトごとに調整するしかない。

docker-compose.ymlでポート指定を

```
ports:
      - "3001:3000"
```

などして、微妙に番号が被らないようにするという対処をするしかなさそうだ。
~/.ssh/configを使わずワンラインで多段sshをする方法

github actionsで多段sshの処理を下記のような内容でテストしていました
### secrets.CONFIG
```config
Host hoge
  Hostname IPアドレス
  User ユーザー名
  IdentityFile ~/.ssh/hoge_private_key
  IdentitiesOnly yes

Host hogehoge
  Hostname IPアドレス
  User ユーザー名
  IdentityFile ~/.ssh/hogehoge_private_key
  IdentitiesOnly yes
  ProxyCommand ssh -CW %h:%p hoge
```

### hostname.yml
```yaml
# hostname.yml

name: hogehoge_hostname

on:
  push:

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 10

     - name: exec
       run: |
         
         mkdir ~/.ssh
         cd ~/.ssh
         echo "${{ secrets.HOGE_PRIVATE_KEY }}" > hoge_private_key
         chmod 600 hoge_private_key
         echo "${{ secrets.HOGEHOGE_PRIVATE_KEY }}" > hogehoge_private_key
         chmod 600 hogehoge_private_key
         echo "${{secrets.CONFIG}}" > config

         ssh -o StrictHostKeyChecking=no hogehoge "hostname"
```

以上を実施していたところ、下記のようなエラーが出てうまくかない、、、
`kex_exchange_identification: Connection closed by remote host`

よくわからんので~/.ssh/configを使わず、ワンラインで多段sshしちゃいましょう

# 実際に~/.ssh/configを使わずに多段sshをする処理に変える
参考
- https://til.swfz.io/entries/multi_ssh_command/
- https://man.openbsd.org/ssh_config.5#ProxyCommand

```yaml
name: hogehoge_hostname

on:
  push:

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 10

     - name: exec
       run: |
         
         echo "${{ secrets.HOGE_PRIVATE_KEY }}" > hoge_private_key
         chmod 600 hoge_private_key
         echo "${{ secrets.HOGEHOGE_PRIVATE_KEY }}" > hogehoge_private_key
         chmod 600 hogehoge_private_key

         ssh -o StrictHostKeyChecking=no -o ProxyCommand='ssh -o StrictHostKeyChecking=no -i hoge_private_key -W %h:%p ユーザー名@IPアドレス' ユーザー名@IPアドレス -i hogehoge_private_key "hostname"
```

上記の内容でyamlを修正したところ、接続したいホストの`hostname`が取得できました。

# まとめ
本件はgithub actionsを使用した例でしたが、基本的には多少環境変わっても使えると思いますので、なにかの役に立てれば幸いです。

# ちなみに
下記のジョブを追加すれば普通にgithub actionsで`~/.ssh/config`使えるようでした、、、
```yaml
- name: SSH
  uses: appleboy/ssh-action@master
  with:
    host: IPアドレス
    username: ユーザー名
    key: ${{ secrets.SSH_PRIVATE_KEY }}
    passphrase: ${{ secrets.SSH_PASSPHRASE }}
    port: 22
```
【Linux】Grepコマンドまとめ

# パワーシェル系コマンド
|用途|コマンド|
|---|---|
|**1階層上に移動**|**cd  ..**|
|**2階層上に移動**|**cd  ../..**|
|**コマンドの履歴**|**history**|
|**コンソールクリア**|**clear**|

```javascript
grep '<time' -rl /var/www/*
```

```javascript
grep "example" --include="*func.php" ~/
fgrep "<script>" --include="*func.php" -rl /var/www/*
```

```javascript
grep '\<time\>.*\</time\>' -rl /var/www/*
```

```javascript
grep '<time.*</time>' -rl /var/www/*
```

```javascript
grep 'wp_enqueue_script(' -rl ./*
```


# 正規表現検索

```javascript
 grep '\->data\[' -rl /var/www/aaaaaa/*


 grep -Er '<div id="gNavi_button">'  /var/www/aaaaaa/application
```






# ファイル名検索

```javascript
find -name "functions_inc.php"


find /var/www/* -name "functions_inc.php"

```


# ファイル名部分一致検索

```javascript
find /var/www/* -iname "*ini"

```
【Paiza問題集】標準入力メニュー/組になったデータの入力

# Paiza問題集
Pythonで回答

## 標準入力メニュー/組になったデータの入力

### STEP1 1つの整数の組の入力
```Python
"""
1の整数の組の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__pair_data_step1
"""

# 整数を受け取る
num1, num2 = map(int, input().split(' '))

# 表示する
print(num1, num2)
``` 


### STEP2 N組の整数の入力
```Python
"""
N組の整数の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__pair_data_step2
"""

# 整数を受け取る
count = int(input())

# 配列を作成する
num1 = []
num2 = []

# 配列に整数の組を格納する
for i in range(count):
    num1_i, num2_i = map(int, input().split(' '))
    num1.append(num1_i)
    num2.append(num2_i)

# 配列の整数を表示する
for i in range(count):
    print(num1[i], num2[i])
```


### STEP3 整数の組からの選択
```Python
"""
整数の組からの選択
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__pair_data_step3
"""

# 整数を受け取る
count = int(input())

# 配列を作成する
num1 = []
num2 = []

# 配列に整数を格納する
for i in range(count):
    num1_i, num2_i = map(int, input().split())
    num1.append(num1_i)
    num2.append(num2_i)

# 8番目の整数の組を表示
print(num1[7], num2[7])
```


### STEP4 文字列と整数の組の入力
```Python
"""
文字列と整数の組の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__pair_data_step4
"""

# 整数を受け取る
count = int(input())

# 配列を作成する
string = []
num = []

# 配列に組を格納する
for i in range(count):
    string_i, num_i = input().split(' ')
    string.append(string_i)
    num.append(int(num_i))

# 配列を表示
for i in range(count):
    print(string[i], num[i])
```


### FINAL問題
```Python
"""
【組になったデータの入力】文字列と整数の組からの選択
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__pair_data_boss
"""

# 整数を受け取る
count = int(input())

# 配列を作成する
string = []
num = []

# 配列にデータを格納する
for i in range(count):
    string_i, num_i = input().split(' ')
    string.append(string_i)
    num.append(int(num_i))

# 8番目のデータを表示する
print(string[7], num[7])
```
初めてのIBM i Merlin：index

これはコンテナプラットフォームであるRedHat OpenShift上で稼働する最新のIBM i 開発環境であるIBM i Merlinを扱う方の方向けの概要・検証資料です。

# 導入編
- [IBM i MerlinをOpenShift 3ノードクラスターに導入してみる](https://qiita.com/mmitsugiw/items/3f401baca6e031ee5fd8)

# セットアップ編
- [(1) Merlin初期設定：管理者(Administrator)作業編](https://qiita.com/meo_kawa/items/0c8e376912b7920f48b8)
- [(2) Merlin初期設定：開発者(Developer)作業編](https://qiita.com/koga39chan/items/6544eb39b7b168a07dfa)

各手順で各ユーザー(Admin,Developer)が行うことは以下の通りです
|手順|管理者(Administorator)|開発者(Developer)/<br>ビルド管理者|
|---|---|---|
|① Merlin初期設定|Vaultサーバーの初期化 <br> ユーザーの作成 <br> 権限の付与 <br> プロジェクトの作成 <br> IBM i CI/CDのインストール <br> インベントリ情報の登録 <br> テンプレートの設定|-<br>-<br>-<br>プロジェクトの作成 <br> IBM i Developerのインストール<br> - <br> -|
|② IBM i Developer<br>セットアップと初期設定|- <br> - <br> -|ワークスペースの作成 <br> Gitの連携 <br> IBM iとの連携|- <br> - <br> -
|③ IBM i CI/CD<br>セットアップと初期設定|Jenkinsサーバーの構成 <br> -|- <br> タスクの作成と実行 | - <br> タスクの作成<br>(ビルド管理者)|



# 実践編
## IBM i Developer編
- コードを編集/ビルド/デバッグをしてみよう
    - mypgm.pgm.rpgleをコンパイルして動かしてみよう
    - depts.pgm.sqlrpgleをコンパイルして動かしてみよう
    - depts.pgm.sqlrpgleのコンパイルエラーがある部分を修正してみよう
    - depts.pgm.sqlrpgleでemployeeのリストを正しく表示されない部分を修正してみよう
    - mypgmで表示されるメッセージを変更してみよう
- GitHubにコードを追加してみよう
- GitHubでのブランチを使った開発をしてみよう
## IBM i CI/CD編
- [ビルドタスクを作成してみよう](https://qiita.com/koga39chan/items/984a94f894882d5d7e7d)
- デプロイを作成してみよう
- GitHubと連携させてみよう
米国債イールドカーブのアニメーション

# はじめに
FREDからデータを取得して米国財務省証券のイールドカーブを描くことにした。

# データ
例えば、10年債利回りの場合は、Market Yield on U.S. Treasury Securities at 10-Year Constant Maturity, Quoted on an Investment Basisの月次データを利用する。
同様のデータがあるのが、1･3･6ヶ月、1･2･3･5･7･10･20･30年。
もっともデータが古くからいるのが1･3･5･10･20年で、1953年4月からのデータがある。

# コード
まずは、データの再利用の可能性も考えて、いったんGoogleドライブに'treasury_yield.csv'という名前で保存。
```Python
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import requests
from google.colab import drive
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
import pandas_datareader as pdr
from datetime import datetime

# Googleドライブをマウント
drive.mount('/content/gdrive')

# FREDからデータを取得
series = ['GS1M', 'GS3M', 'GS6M', 'GS1', 'GS2', 'GS3', 'GS5', 'GS7', 'GS10', 'GS20', 'GS30']
start_date = '1950-01-01'  # 実際のデータは1，3，5，10，20年は1953年4月より開始
end_date = datetime.now().strftime('%Y-%m-%d')  # 終了日を現在の日付に設定
df = pdr.get_data_fred(series, start_date, end_date)  # データ取得

# データを整形
df = df.rename(columns={'GS1M': '1M', 'GS3M': '3M', 'GS6M': '6M', 'GS1': '1Y', 'GS2': '2Y', 'GS3': '3Y', 'GS5': '5Y', 'GS7': '7Y', 'GS10': '10Y', 'GS20': '20Y', 'GS30': '30Y'})

# ここでデータをCSVとしてGoogle Driveに保存
df.to_csv('/content/gdrive/MyDrive/treasury_yield.csv')
```
そのまま使うのだから必要はないが、やはり再利用のときを考えて読み込み直して、イールドカーブのアニメーションを作成し、'us_treasury_yield.mp4'という名前でGoogle Driveに保存する。

```Python
# CSVを読み込み直し、列名を数値に変更
df = pd.read_csv('/content/gdrive/MyDrive/treasury_yield.csv', index_col=0)
df.index = pd.to_datetime(df.index)  # <- インデックスを日付型に変換
new_columns = {col: float(col[:-1])/12 if 'M' in col else float(col[:-1]) for col in df.columns}
df = df.rename(columns=new_columns)

x_ticks_labels = {v: k for k, v in new_columns.items()}

# 短期のラベルを削減
reduced_labels = {k: v for k, v in x_ticks_labels.items() if v in ['6M', '1Y', '2Y', '3Y', '5Y', '7Y', '10Y', '20Y', '30Y']}

# イールドカーブのアニメーションを作成
fig, ax = plt.subplots()

def update(num):
    ax.clear()
    df.iloc[num].dropna().plot(style='-', ax=ax)  # Original data with solid line
    ax.set_xticks(list(reduced_labels.keys()))  # set x-axis ticks
    ax.set_xticklabels(list(reduced_labels.values()), rotation=90)  # set x-axis tick labels with 90 degree rotation
    ax.set_title('U.S. Treasury yield curve ' + df.index[num].strftime('%Y-%m'))
    ax.set_ylim([df.min().min(), df.max().max()])  # Set y-axis range to include all data
    ax.set_xlim([min(new_columns.values()), max(new_columns.values())])  # Set x-axis range to include all data
    ax.set_xlabel('Maturity')  # set x-axis label
    ax.set_ylabel('Yield (%)')  # set y-axis label

ani = FuncAnimation(fig, update, frames=range(len(df)), repeat=False)

# アニメーションをHTMLにして表示
HTML(ani.to_jshtml())

# GoogleドライブのMyDriveにアニメーションをmp4にして保存
ani.save('/content/gdrive/MyDrive/us_treasury_yield.mp4', writer='ffmpeg', fps=30)
```

# おわりに
描いてみると、JGBイールドカーブの場合と違って逆イールドも結構登場する。まあ、それだけ市場が健全なのだろう。
could not connect to server: Cannot assign requested address api Is the server running on host "localhost" (::1) and accepting api TCP/IP connections on port 5432?のエラーを解消した

Dockerとpostgresqlを使っているときに以下のエラーが出た。

```
could not connect to server: Cannot assign requested address api Is the server running on host "localhost" (::1) and accepting api TCP/IP connections on port 5432?
```

host = `データベースのサービス名`
とすることで解決した。