OmniAICreator/Qiita-1.07M huggingface dataset:
高速逆平方根のProcessingでの検証

# はじめに

高速逆平方根のマジックナンバー(0x5f3759df)に関するアルゴリズムが気になったので、Processingで試したメモです。

（アルゴリズムの登場は1990年代後半で、SSEの登場が1999年。自分がGame Programing Gemsで近いものを見かけたのが、2001年ぐらい。2001年の当時は、まだ、この手の計算テクニックがやや、速かったと記憶しているが、SSEの環境で実行していたのか、はたまた、SSE最適化のコンパイルをしていたのか、覚えていないし、理解できていたのかも怪しい。）

# 環境
Processing 4
Apple M1 pro

# コード
```java:inv_sqrt.pde
void setup() {
  int msec = millis();
  for (float n=0; n<10000000; n++) {
    float r = Q_rsqrt(n)*n;
    //println(r);
  }
  println(millis()-msec);
  
  msec = millis();
  for (float n=0; n<10000000; n++) {
    float r = sqrt(n);
    //println(r);
  }  
  println(millis()-msec);
}

float Q_rsqrt(float n){
  int i = Float.floatToRawIntBits(n);
  float y = Float.intBitsToFloat(0x5f3759df - (i >> 1));
  return y * (1.5F - 0.5F * n * y * y);
}
```

# 結果
高速逆平方根が12msec
平方根が10msec
というわけで、processingでは遅くなりました。

# メモ
下記サイトでも言及があるように「rsqrtss命令が最強」だとおもうので、この検証はあまり意味がない。javaのsqrt命令が内部でrsqrtss等を使っていることを願う。shaderを使ったりするなら、GPUで計算できるので、並列処理ならさらに速くできるはず。

# 参考サイト

Cのコードが掲載されています。

https://en.wikipedia.org/wiki/Fast_inverse_square_root

C言語ではポインタでfloatとlongの行き来をしているが、javaにはないので、
このサイトを参考にした。このサイトすごいな。

https://itchyny.hatenablog.com/entry/2016/07/25/100000

よくわかるアルゴリズムの解説

https://lipoyang.hatenablog.com/entry/2021/02/06/194619
Windows で NFKD の半濁音のフォルダで JetBrains IDE が異常表記にならないか

# tl;dr

おちない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80584/c383d996-ca5a-cdb9-a2c6-a7a00526e178.png)

##　なんのこと

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">macOS 上の JetBrains IDE 2024.2.1、2024.2.2 においてプロジェクトのパスに濁音（ガ、ギ、グ等）や半濁音（パ、ピ、プ等）が含まれる場合、プロジェクトフォルダーが表示されない問題が発生しています。本問題は2024.2.3で修正される予定です。詳細は以下をご確認ください。<a href="https://t.co/arrsAqNTIP">https://t.co/arrsAqNTIP</a></p>&mdash; 株式会社サムライズム (@Samuraism) <a href="https://twitter.com/Samuraism/status/1839113971804287201?ref_src=twsrc%5Etfw">September 26, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">macで濁音・半濁音が結合文字U+3099とU+309Aで表現されてしまう問題はしばしば話題になるんだけども、ちょっと待って欲しい。Windowsでも結合文字のプ(U+30D5, U+309A)を用いたフォルダを作ったら同じような現象が再現するのではないだろうか？🤔 <a href="https://t.co/Yl65zmddgN">https://t.co/Yl65zmddgN</a></p>&mdash; なぎせ ゆうき (@nagise) <a href="https://twitter.com/nagise/status/1839189519024939409?ref_src=twsrc%5Etfw">September 26, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

##　やったこと

```powershell
mkdir ~/test
cd test
$pu = $pu = Byte2String(@([Byte]0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A))
mkdir $pu
ls | select-object {$_.Name}
# String2Byte($_.Name)
# --------------------
# {227, 131, 149, 227…}
```

Byte[] で指定したかたちのまま、フォルダは作成されていることを確認して、冒頭のとおり IDEA で開いた。
さらに他のアプリをアクティブにしたり最小化したりしても、親フォルダを見失う事象は再現しなかった。

- Byte[] と String の変換関数はこちらを利用させていただきました
    - [文字列/Base64/Byte配列を PowerShell で相互変換する](https://www.vwnet.jp/windows/PowerShell/2017110301/ConvertStringBase64Byte.htm)
C#でPDFをJPG/ PNG画像に変換する

PDFを画像に変換することで、ドキュメントの内容をソーシャルメディアプラットフォームにアップロードして共有することが容易になります。さらに、画像に変換した後、さらに画像をトリミングしたり、サイズを変更したり、画像にマークアップを追加したりすることができます。プロジェクトによっては、開発者はC#を使用してPDFファイルをJPG/PNG画像に変換する必要があるかもしれません、以下は、このタスクを達成するためにサードパーティライブラリSpire.PDF for .NETを使用する方法を紹介します。
* [C#で指定されたPDFページを画像に変換する](#cで指定されたpdfページを画像に変換する)
* [C#でPDFファイルを画像に変換](#cでpdfファイルを画像に変換)


## .NET PDFライブラリのインストール
この記事で使用しているライブラリ[**Spire.PDF for .NET**](https://www.e-iceblue.com/Introduce/pdf-for-net-introduce.html)は、.NETプログラム（C#、VB.NET、ASP.NET、.NET Core）でPDF文書の作成、読み取り、編集、変換、保存など、幅広いPDF文書処理機能をサポートしています。
Nugetから直接ライブラリをダウンロードするか、以下のリンクから製品パッケージをダウンロードし、手動でインポートしてください。

https://www.e-iceblue.com/Download/download-pdf-for-net-now.html



## C#で指定されたPDFページを画像に変換する
PDFファイルを読み込んだ後、**`PdfDocument.SaveAsImage(int pageIndex, PdfImageType type, int dpiX, int dpiY)`** メソッドを使用して、指定されたPDFページを画像に変換し、画像のdpiを設定することができます。そしてその画像は、**`Image.Save(string filename, ImageFormat format)`** メソッドを通して JPG や PNG や BMP のような希望のフォーマットに保存することができます。

>**サンプルC#コード：**
```csharp
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System.Drawing.Imaging;

namespace PDFtoImage
{
    class Program
    {
        static void Main(string[] args)
        {
            //サンプルPDF文書を読み込む
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("日記.pdf");

            //最初のページを画像に変換し、画像のDpiを設定する。
            Image image = pdf.SaveAsImage(0, PdfImageType.Bitmap, 500, 500);

            //画像をJPGファイルとして保存する
            image.Save("ToJPG.jpg", ImageFormat.Jpeg);

            //画像をPNGファイルとして保存する
            image.Save("ToPNG.png", ImageFormat.Png);

            //画像をBMPファイルとして保存する
            image.Save("ToBMP.bmp", ImageFormat.Bmp);
        }
    }
}
```
> **結果：**

![PdfPageToImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/b52bd68e-5347-35a2-7ee3-5b481a21080d.png)


## C#でPDFファイルを画像に変換
PDF文書全体を複数の画像に変換するには、文書内のすべてのページをループして、各ページを個別の画像として保存します。

>**サンプルC#コード：**
```csharp
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System.Drawing.Imaging;

namespace PDFtoImage
{
    class Program
    {
        static void Main(string[] args)
        {
            //サンプルPDF文書を読み込む
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("日記.pdf");

            //PDFの各ページをループする
            for (int i = 0; i < pdf.Pages.Count; i++)
            {
                //各ページを画像に変換し、画像のDpiを設定する。
                Image image = pdf.SaveAsImage(i, PdfImageType.Bitmap, 500, 500);

                //画像をPNG形式で保存
                string file = string.Format("Image\\ToImage-{0}.png", i);
                image.Save(file, ImageFormat.Png);
            }
        }
    }
}
```
>**結果：**

![PdfToImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/7c0f44ff-8e08-613b-8bae-80c21f7c2b46.png)

* * *

:pushpin: Spire.PDF for .NET を使用することで、PDF から画像への変換が数行のコードで簡単に実現できます。その機能の詳細については、クリックしてください：
https://www.e-iceblue.com/Tutorials/Spire.PDF/Spire.PDF-Program-Guide/Spire.PDF-Program-Guide-Content.html

:pushpin: 赤い透かしを消すには、[こちらから1ヶ月の無料トライアルライセンスをお申し込みください](https://www.e-iceblue.com/TemLicense.html)。
LaravelのFormRequestで条件付きバリデーションを行う

# 前置き
アンケートで問1で1〜5を選択する設問があり、問2は問1の回答が3〜5の時必須の自由入力の場合を想定しています。

# FormRequest
まずは、FormRequestを継承したMyRequestを作成します。
```php
php artisan make:request MyRequest
```
Controller内のRequestをMyRequestとすれば、バリデーションをRequest内ですることができます。今回はファイル名を`MyRequest`としていますが、自由に変更していいです。

# バリデーション
次にMyRequest内でバリデーションの定義をする場合、`rules`に追加していきます。
```php
public function rules()
{
    return [
        'question_1' => 'required|numeric|min:1|max|5,'
    ];
}
```
とりあえず、`question_1`がバリデーションの対象、`required|numeric|min:1|max|5`が必須かつ1〜5の数字というバリデーションの定義にしています。

# 条件付きバリデーション
条件付きバリデーションを追加する場合は、MyRequest内で`withValidator`を追加します。
```php
public function withValidator(Validator $validator)
{
    $validator->sometimes('question_2', 'required|string|min:1|max:200', function ($input) {
        return $input->question_1 > 2;
    });
}
```
`sometimes`を使って条件付きバリデーションを行なっています。`question2`がバリデーションの対象、`required|string|min:1|max:200`が必須かつ1〜200文字というバリデーションの定義、`$input->question_1 >= 3`が問1の回答が3以上というバリデーションの条件となっています。今回は簡単な条件ですが、function内で複雑な条件を記載することができます。

ではでは。
Dockerインストール手順 ver. windows

## インストール手順
2024年9月時点
以下の画像のDownload for Windowsボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850581/086f0016-c1fe-bd67-a92d-35424c44dffd.png)

インストーラーを起動する
ダウンロードが始まる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850581/63400581-a2e8-b014-db3e-af380de351ac.png)

ダウンロード完了後、再サインインが行われる

Dockerのサービス規約に同意する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850581/70e684c1-76a3-553a-da53-417281a58322.png)

Create an accountを押下し、アカウントを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850581/2d524f10-7e98-6d95-cc81-e43d9e9c7b79.png)

Docker Desktopが起動する
Widows版はDesktopしか存在しないため、コマンド版を使いたい人はLinux環境を作る必要がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850581/8b2797a7-c87b-8d1a-f51b-8a69c1e0f6b3.png)

## Docker起動
### Dockerfileの作成
Dockerコンテナを作るには、Dockerイメージを元にコンテナを作成するため、Dockerイメージを先に作っておく必要がある
```
FROM ubuntu

RUN apt-get update -y
RUN apt-get install -y net-tools
RUN apt-get install -y iputils-ping
RUN apt-get install -y vim
RUN apt-get install -y tcpdump
RUN apt-get install -y cmake
RUN apt-get install -y g++

WORKDIR /root
```

Dockerイメージはdocker buildコマンドで作成する
※イメージがDocker hubにある場合はdocker pullでダウンロードできる
```
docker build -t image_ubuntu:latest -f Dockerfile .
```

Dockerイメージを確認するには以下のコマンドを実行する
```
docker images
```

### コンテナの作成
Dockerコンテナを作成するにはdocker runコマンドを使う
```
docker run -it -d --name container_name image_ubuntu
```
DockerイメージはDockerfileにて作成したDockerイメージ名を指定し、--nameの箇所にコンテナ名を入力する。

コンテナへアクセスするにはdocker execコマンドを使う
```
docker exec -it container_name bash
```

### コンテナのネットワーク設定
Dockerコンテナ作成時にIPアドレス、ネットワーク名を指定することができる

まず以下のコマンドを実行して、DockerネットワークにIPアドレスにネットワーク名を作成する
```
docker network create --subnet ip_address network_name
```

Dockerコンテナ作成時にIPアドレス、ネットワーク名を指定する
```
docker run -it -d --network network_name --ip ip_address --name container_name image_ubuntu
```

※docker run実行時に以下のエラーメッセージが表示される
```
docker: Error response from daemon: Address already in use.
```
IP：192.168.20.10なら解決された
何故...
【ダッシュボードページ】メニュー連動型レポートをデザインする

# はじめに #
今回は、SAP Business Oneデータモデルを利用して、メニュー連動型のダッシュボードページを作成してみようと思います。会社一覧から特定の会社を選択すると、選択された会社に関するデータでダッシュボードページが更新されるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8214bc0e-9d96-0507-afd0-59aee89d54eb.png)

# ページの構成 #
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/81e074e6-6390-898f-7ca0-7f25d858bb3c.png)
このページは複数のSharperlightオブジェクトの入れ子で構成されています。その内訳は；
+ 2つのメニュレポート（パブリッシュドレポート）
+ 1つのダッシュボードページ
+ 4つの通常レポート（パブリッシュドレポート）


## 2つのメニュレポート（パブリッシュドレポート） ##
上図の赤枠と濃い赤枠で表した部分です。
### Menu Horizontal (親) ###
一番外殻のメニューレポート（赤枠）です。これが親レポートとなります。上部に表示されるメニューと梱包する子レポートで構成されます。
子レポートとして、次に説明するメニューレポート（濃い赤枠）を内包しています。

### Menu Panel （子） ###
上記親レポートの子供になります。左側に表示されるツリーメニューと梱包する子（孫）レポートで構成されます。
子（孫）レポートとして、次に説明するダッシュボードページを内包しています。

## 1つのダッシュボードページ （孫） ##
Sharperlightで設計するダッシュボードページ（青枠）です。4つのパネルを持つダッシュボードページとして作成されており、各パネルはそれぞれ独自のパブリッシュドレポートを表示するように設計されています。

## 4つの通常レポート（パブリッシュドレポート）（ひ孫） ##
上記ダッシュボードページの4つのパネル（緑枠）にひとつずつ割り当てられています。上部２つは表形式、そして下部2つはグラフ形式となっています。

# 連動の仕組み #
会社名ツリーメニューをクリックした場合、孫とひ孫レポートが連動する仕組みを見ていきます。
ここでは**Company** というワードがキーとなります。
では早速みていきましょう。

ツリーメニューレポート、つまり上記の**Menu Panel （子）** です。ここが連動の起点となります。
ここでは会社名一覧が、このレポートに定義されたクエリによりツリー形式で表示されています。
会社名が出力アイテムとして設定されています。
さらに拡張表現でジャンプ先URLが定義されています。ジャンプ先、つまり子レポートであるダッシュボードページのURLです。会社名がパラメータとして渡されています。**&fltCompany=** の部分。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7b9859d9-0de5-7881-05a5-df93fa0e72c4.png)
クエリ結果は、このようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/59e429ae-0ee1-2577-23f3-2c3259705258.png)
ここで大事なのは、ツリーメニューで選択された会社名が、子レポートがもつ &flt**Company**=という名のフィルターに送られていくということです。**flt**はフィルターを表す接頭辞です。

次に、選択された会社名を受け取る子レポート達を見ていきます。
ツリーメニューレポートの子であるダッシュボードページは、&flt**Company**=というパラメータで選択された会社名を受け取ります。
しかし、このダッシュボードページは、4つのレポートをひとまとめにするためのコンテナなので、さらにその子である４つのレポートにその会社名が渡されます。
各レポートには、それぞれクエリが定義されており、その抽出結果が表形式やグラフ形式で表示されるということです。
そのレポート群の親であるダッシュボードページが受け取った会社名は、各レポートクエリの同名のフィルターに渡されます。
つまり、各クエリのフィルター部に**Company**という名のフィルターが定義されており、ツリーメニューで選択された会社名は、ダッシュボードページを経由して、そのクエリのフィルターに渡されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d882225d-4a22-8470-ff85-6e6429f0d892.png)

つまり送り側と受け側が同じ名でリンクしているといった状態ですね。
これが連動の仕組みです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8f6995a2-416c-8558-68d3-1a169f505012.png)


# あとがき #
この記事では会社名でしたが、年月やその他のキーとなる値で、ダッシュボードページ上の全ての表やグラフを同時に更新することができます。この機能を使って、KPIスタイルのダッシュボードを楽しんでデザインしてください。
WIP【日本通運がアクセンチュアを提訴】過去の裁判から学ぶプロジェクトマネジメント

## これは何?

2024年9月26日現在日本通運がアクセンチュアをシステム開発の失敗を巡って提訴しています。

これをきっかけに過去に同様の裁判はあったのか気になったので調べてみました。

勉強になるので訂正や追加事例がありましたらドシドシお待ちしております。

---

## NTT東日本 VS 旭川医大

### 経緯

- 2008年に8月に電子カルテや病院システムの刷新を行うため，NTT東日本が日本IBMと共同開発したパッケージソフトをカスタマイズしてシステム開発を提案した
- 現場の意思からの800件近い要望をNTT東日本が受けいれ，開発が延長
- 旭川位医大が期日通りに納品されなかったことを理由に契約解除を通告
- NTT東日本が損害賠償を求めて旭川医大を提訴
- 旭川医大も逸失利益を求めて反訴

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/f0c6f9c4-ad6a-3888-68d3-bc4f72db6c1a.png)


### 裁判の争点

- プロジェクトマネジメント義務: NTT東日本がプロジェクトを適切に管理する義務の範囲がどこまでか
- 協力義務: 旭川医大がNTT東日本に協力の仕方に違反がなかったか
    - 仕様凍結合意後に追加要求があったか

### 裁判結果

- 一審: 旭川医大の協力義務違反(仕様凍結合意の大量の追加要望が原因でプロジェクトが遅延した)としつつ，NTT東日本に対してはPM義務に8割責任があるとした。
- 控訴審: NTT東日本に納期を守るためにはさらなる追加開発を要望をしないように説得したり，不当な追加開発要望を毅然と拒否しなくてもPM義務違反でないとして，契約解除に伴う損害約14億1500万円を賠償する判決。

### 参考資料

https://www.m3.com/news/open/iryoishin/585767

https://storialaw.jp/blog/4019

---

## 野村證券 VS IBM

### 経緯

- 野村ホールディングスが日本IBMに対し，投資一任口座サービスに関するシステムの開発を委託して契約を締結
    - 日本IBMが権利を有する気温システムをカスタマイズして開発することになった
- 2010年11月開発開始
- 2012年8月にスケジュール達成が困難であり，品質上もリスクがあることを通知
- 2012年10月見直し計画を提案
- 野村ホールディングス見直し計画が有効な解決でないとして，個別契約を解除する旨を通知，36億1500万円の損害賠償請求
- 日本IBMは5億6300万円の報酬及び損害賠償請求を反訴

---

### 裁判の争点

### 裁判の結果

- 一審: 


### 参考資料

https://www.mclaw.jp/column/tomonari/column7.html

https://xtech.nikkei.com/atcl/nxt/column/18/00138/060700813/

---

## 三菱食品 VS インテック

https://xtech.nikkei.com/atcl/nxt/column/18/00693/040900004/

---

## スルガ銀行 VS IBM

https://xtech.nikkei.com/it/atcl/ncd/14/122200042/

---

## 文化シヤッター VS IBM

https://xtech.nikkei.com/atcl/nxt/column/18/00001/09645/

---


## TODO

- まだまだありそうなので事例をもっと調べる
- 事例ごとに
    - 裁判になった理由
    - 判決の理由
    - 教訓

をまとめる。

---

## 感想

IBM多いな...
Qlik AI Reality Tour Tokyo  参加に向けて Qlik 製品を学習するために無償で実施したこと

## 概要

2024年10月2日に開催予定である Qlik AI Reality Tour Tokyo 参加の事前学習として無償で実施したことを整理します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a3477c20-3200-13f8-7cec-50889ac33e05.png)

引用元：[Qlik AI reality Tour - Tokyo](https://pages.qlik.com/AIRealityTour_Tokyo.html?utm_campaign=701J50000008wucIAA&utm_medium=qlik-internal&utm_source=QlikWeb&utm_team=WEB)

無償で実施できそうなことである下記を実施しました。詳細を後述します。

1. Qlik Learning の Free コンテンツの視聴
2. Qlik Free Trials and Tours の実施
3. Qlik 無料トライアルの申し込み
4. Qlik Sense 入門 ハンズオン Web セミナー


## Qlik 無償学習コンテンツ

### 1. Qlik Learning の Free コンテンツの視聴

Qlik Learning という学習サービスが提供されています。一部のコンテンツでは有償のサブスクリプション契約が必要となりますが、 Free で参照できるコンテンツもありました。言語設定で日本語にすると、Goole 翻訳が実施されるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/064f69ca-5e8d-a768-9d22-8c5470a6e471.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3f7a4ee2-97d9-5ea6-decb-0c015a520d52.png)

引用元：[Qlik Learning Portal](https://learning.qlik.com/)

言語設定を日本語にすると動画のキャプションが日本語で表示されるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3ad1b6b2-7cb8-3afa-f7d9-9f013f84826d.png)

引用元：[Qlik Learning Portal](https://learning.qlik.com/)

コンテンツの検索画面にて`Price`を`Free`にすることにより無償で参照できるコンテンツを検索できます。私は製品概要の動画を視聴しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d3ee2a70-7c72-da61-76e8-3b010edebf57.png)

引用元：[Qlik Learning: 検索](https://learning.qlik.com/mod/page/view.php?id=24708&Category=How do I Videos)

### 2. Qlik Free Trials and Tours の実施

下記のページから、4 つの分野である Qlik Free Trials and Tours を申し込むことができます。Qlik Free Trials and Tours とは、実際のモック画面にて指示された箇所をクリックして操作感を知ることができます。私は4 つのテーマを申し込み、 どういった製品なのかを知ることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b148118d-d347-d3b2-c54b-a6474bbd4051.png)

引用元：[Qlik | Talend Free Trials and Tours](https://www.qlik.com/us/trial/qlik-talend-free-trials?ga-link=price-di-prefooter)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/52e46396-b6ba-6175-6796-e726c8d1122e.png)

引用元：[Take a Self-Guided Tour of Data Movement with Qlik for Free | Qlik](https://www.qlik.com/us/trial/data-movement?ga-link=intpg)

### 3. Qlik 無料トライアルの申し込み

下記のページに記載されている 4 製品の無料トライアルに申し込みました。Qlik Cloud と Qlik Replicate については、アカウント作成が完了した旨のメールがすぐに来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d7b873d6-35f9-be41-de6f-1a404952863c.png)

引用元：[Qlik | Talend 無料トライアルツアー](https://www.qlik.com/ja-jp/trial/qlik-talend-free-trials?ga-link=gblhdr)

#### 4. Qlik Sense 入門 ハンズオン Web セミナー

オンデマンドで視聴できる下記のセミナーを申し込みました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8e081502-1230-1296-00b0-b37639b84b14.png

引用元：[Qlik Sense Business 入門 ハンズオン Web セミナー](https://pages.qlik.com/JPN_QSBeginner_Webinar.html?utm_campaign=7013z0000023KpUAAU&utm_content=QSBTrial&utm_medium=qlikinternal&utm_source=QlikWeb&utm_team=WEB&utm_mpt_id=CUPA58)
langchainのazure openai embeddingsでopenai_api_baseを設定するなと言われる件

langchainでazure openai embeddingsを使おうとしたけどドハマりした件。
公式リファレンスのソース貼り付けてもエラーになって困ってました。

```python
import os
from dotenv import load_dotenv
from langchain_openai import AzureOpenAIEmbeddings

load_dotenv()

os.environ["AZURE_OPENAI_API_KEY"] = os.getenv("AZURE_OPENAI_API_KEY")
os.environ["AZURE_OPENAI_ENDPOINT"] = os.getenv("AZURE_OPENAI_ENDPOINT")
os.environ["AZURE_OPENAI_API_VERSION"] = os.getenv("AZURE_OPENAI_API_VERSION")

embeddings = AzureOpenAIEmbeddings(model="text-embedding-3-large")
```

エラー：

```
pydantic_core._pydantic_core.ValidationError: 1 validation error for AzureOpenAIEmbeddings
  Value error, As of openai>=1.0.0, Azure endpoints should be specified via the `azure_endpoint` param not `openai_api_base` (or alias `base_url`).  [type=value_error, input_value={'model': 'text-embedding...ge', 'model_kwargs': {}}, input_type=dict]
```

要するにopenaiが1.0以上ならopenai_api_baseが廃止されましたよーってメッセージ。
でもどこにも定義してないが？？？

と思ってもう色々調べまくったら答えは環境変数にありました。

```
(.venv) C:\Users\user\Python\langchain>set
ALLUSERSPROFILE=C:\ProgramData
(中略)
OPENAI_API_BASE=https://<your-endpoint>.openai.azure.com/
OPENAI_API_KEY=apikey
OPENAI_API_VERSION=2024-02-01
OPENAI_EMBEDDINGS_DEPLOYMENT_NAME=text-embedding-ada-002
```

はい、残骸が残ってましたね…。
削除したら治りました。
チベット語モデルTibetan-BERT-wwmは「དཔོན་དམག་དང་གཟིགས་སྐྱོང་བྱེད་ཡུལ་གྱི་ཁྲིམས་མཐུན་ཁེ་དབང་ལ་སྲང་སྐྱོབ་བྱེད་པ།」をどうトークナイズするのか

Yatao Liang, Hui Lv, Yan Li, La Duo, Chuanyi Liu, and Qingguo Zhou『[Tibetan-BERT-wwm: A Tibetan Pretrained Model With Whole Word Masking for Text Classification](https://doi.org/10.1109/TCSS.2024.3374633)』を横目に、[Tibetan-BERT-wwm](https://huggingface.co/Pagewood/Tibetan-BERT-wwm)のトークナイザが「དཔོན་དམག་དང་གཟིགས་སྐྱོང་བྱེད་ཡུལ་གྱི་ཁྲིམས་མཐུན་ཁེ་དབང་ལ་སྲང་སྐྱོབ་བྱེད་པ།」をどうトークナイズするのか、調べてみた。Google Colaboratoryだと、こんな感じ。

```
!pip install transformers
from transformers import BertTokenizer
tkz=BertTokenizer.from_pretrained("Pagewood/Tibetan-BERT-wwm",do_lower_case=False,strip_accents=False)
tkz.convert_ids_to_tokens(tkz("དཔོན་དམག་དང་གཟིགས་སྐྱོང་བྱེད་ཡུལ་གྱི་ཁྲིམས་མཐུན་ཁེ་དབང་ལ་སྲང་སྐྱོབ་བྱེད་པ།")["input_ids"])
```

私(安岡孝一)の手元では、以下の結果が出力された。

> ['[CLS]', 'དཔོན', '་', 'དམག', '་', 'དང', '་', 'གཟིགས', '་', 'སྐྱོང', '་', 'བྱེད', '་', 'ཡུལ', '་', 'གྱི', '་', 'ཁྲིམས', '་', 'མཐུན', '་', 'ཁེ', '་', 'དབང', '་', 'ལ', '་', 'སྲང', '་', 'སྐྱོབ', '་', 'བྱེད', '་', 'པ', '།', '[SEP]']

各音節ごとに1トークン、区切り記号にも1トークンという、非常にわかりやすいトークナイズだ。「དཔོན་དམག་[MASK]་གཟིགས་སྐྱོང་བྱེད་ཡུལ་གྱི་ཁྲིམས་མཐུན་ཁེ་དབང་ལ་སྲང་སྐྱོབ་བྱེད་པ།」の[MASK]に何を埋めてくるのか、ちょっと試してみよう。

```
!pip install transformers tensorflow
!test -d Tibetan-BERT-wwm || git clone --depth=1 https://huggingface.co/Pagewood/Tibetan-BERT-wwm
from transformers import BertForPreTraining,BertConfig,BertTokenizer
cfg=BertConfig.from_pretrained("Tibetan-BERT-wwm/bert_config.json")
tkz=BertTokenizer.from_pretrained("Tibetan-BERT-wwm",do_lower_case=False,strip_accents=False,model_max_length=cfg.max_position_embeddings)
mdl=BertForPreTraining.from_pretrained("Tibetan-BERT-wwm/model.ckpt-1000000.index",config=cfg,from_tf=True)
mdl.resize_token_embeddings(len(tkz))
mdl.save_pretrained("bert-base-tibetan",safe_serialization=False)
tkz.save_pretrained("bert-base-tibetan")
from transformers import pipeline
fmp=pipeline("fill-mask","bert-base-tibetan")
print(fmp("དཔོན་དམག་[MASK]་གཟིགས་སྐྱོང་བྱེད་ཡུལ་གྱི་ཁྲིམས་མཐུན་ཁེ་དབང་ལ་སྲང་སྐྱོབ་བྱེད་པ།"))
```

私の手元では、以下の結果が出力された。

> [{'score': 0.46087247133255005, 'token': 1426, 'token_str': 'གིས', 'sequence': 'དཔོན ་ དམག ་ གིས ་ གཟིགས ་ སྐྱོང ་ བྱེད ་ ཡུལ ་ གྱི ་ ཁྲིམས ་ མཐུན ་ ཁེ ་ དབང ་ ལ ་ སྲང ་ སྐྱོབ ་ བྱེད ་ པ །'}, {'score': 0.21413499116897583, 'token': 1344, 'token_str': 'གི', 'sequence': 'དཔོན ་ དམག ་ གི ་ གཟིགས ་ སྐྱོང ་ བྱེད ་ ཡུལ ་ གྱི ་ ཁྲིམས ་ མཐུན ་ ཁེ ་ དབང ་ ལ ་ སྲང ་ སྐྱོབ ་ བྱེད ་ པ །'}, {'score': 0.10292402654886246, 'token': 1894, 'token_str': 'ཚོས', 'sequence': 'དཔོན ་ དམག ་ ཚོས ་ གཟིགས ་ སྐྱོང ་ བྱེད ་ ཡུལ ་ གྱི ་ ཁྲིམས ་ མཐུན ་ ཁེ ་ དབང ་ ལ ་ སྲང ་ སྐྱོབ ་ བྱེད ་ པ །'}, {'score': 0.08873054385185242, 'token': 1315, 'token_str': 'དང', 'sequence': 'དཔོན ་ དམག ་ དང ་ གཟིགས ་ སྐྱོང ་ བྱེད ་ ཡུལ ་ གྱི ་ ཁྲིམས ་ མཐུན ་ ཁེ ་ དབང ་ ལ ་ སྲང ་ སྐྱོབ ་ བྱེད ་ པ །'}, {'score': 0.08872207999229431, 'token': 366, 'token_str': 'ལ', 'sequence': 'དཔོན ་ དམག ་ ལ ་ གཟིགས ་ སྐྱོང ་ བྱེད ་ ཡུལ ་ གྱི ་ ཁྲིམས ་ མཐུན ་ ཁེ ་ དབང ་ ལ ་ སྲང ་ སྐྱོབ ་ བྱེད ་ པ །'}]

順に「གིས」「གི」「ཚོས」「དང」「ལ」となっていて、一応、4番目に「དང」を埋めてきている。チベット語モデルとしては、まずまずの出来だけど、さて、品詞付与とかに使えるかなあ。
タスク スケジューラでのエラー「選択されたタスク が存在しません」

バックアップのソフトの、[BunBackup](http://nagatsuki.la.coocan.jp/bunbackup/)を利用しています。

Windows タスク スケジューラーで、

![20240926 111553 Anonymous.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/59f57394-4531-711e-d683-05cd102f5ea2.png)

`タスク （・・・）でエラーが発生しました。エラーメッセージ:選択されたタスク"{0}"が存在しません。`

というエラーになる場合があります。

その時は、

`最上位の特権で実行する`

にチェックを入れれば、解決しました。

![20240926 111604 Anonymous.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/f406ded0-aeaa-c699-ea89-8837ed73ef11.png)

### 留意点
エラーダイアログは、スケジューラで、「実行する」を行わないと表示されないかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/9e3c3456-06a8-66bb-97e7-5397575ffc52.png)


### 環境
- Windows 11 Pro 22631.4169　64ビット

### 参考

- [タスクスケジューラで「エラー メッセージ：選択されたタスク {0} が存在しません。」](https://blog.treedown.net/entry/2022/11/17/010000)
JBossEAP上のアプリケーションでlog4jからlog4j2にバージョンアップ

# はじめに

JBoss EAP 7.4上のWebアプリケーションをlog4jからlog4j2にバージョンアップした。

# 環境
* java11
* Windows 11
* JBoss EAP 7.4.0
* TERASOLUNA Server Framework for Java 5.7.3.RELEASE （5.5からバージョンアップ)
* log4j 2.20.0 (1.2.17からのバージョンアップ)

mavenでビルドしている。

# やったこと
## loggerの変更
log4j2を使用するにあたり、loggerをLogManagerから取得するよう変更しました。

importするライブラリの変更
```java
// import org.apache.log4j.Logger;
// ↓
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
```
コード変更
```java
//private static Logger logger = Logger.getLogger
// ↓
private static Logger logger = LogManager.getLogger
```

## NDC(Nested Diagnostic Context)からThreadContextへの変更
log4j2にはNDCではなくThreadContextを使用するとのこと。

importするライブラリの変更
```java
// import org.apache.log4j.NDC;
// ↓
import org.apache.logging.log4j.ThreadContext;
```
コード変更
```java
//		NDC.remove();
//		NDC.push(xx);
// ↓
		ThreadContext.clearAll();
		ThreadContext.push(xx);
```

## 問題
JBoss起動時に"java.lang.NoSuchFieldError: EMPTY_BYTE_ARRAY"のエラーが発生。(ログ抜粋)

```bash
$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
	at org.jboss.threads@2.4.0.Final-redhat-00001//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
	at java.base/java.lang.Thread.run(Thread.java:834)
	at org.jboss.threads@2.4.0.Final-redhat-00001//org.jboss.threads.JBossThread.run(JBossThread.java:513)
Caused by: java.lang.NoSuchFieldError: EMPTY_BYTE_ARRAY

```
## 対応
log4j2のコアライブラリ(アプリ側)とAPIライブラリ（JBoss側）のバージョンが一致していないとのことで、jboss-deployment-structure.xmlを作成してJBossのlog4jAPIをアプリケーションから使用できないようにした。
```xml
<jboss-deployment-structure>
  <deployment>
    <exclusions>
      <module name="org.apache.logging.log4j.api"/>
    </exclusions>
  </deployment>
</jboss-deployment-structure>
```
rex0220 計算式プラグイン ボタンクリックでテーブル行追加

計算式プラグインを使って、ボタンクリックでテーブル行を追加する例です。
※FSET_TADD 関数（Ver.82以降）で、テーブル行追加を簡潔に記述できるようになりました。
[rex0220 計算式プラグイン ボタンクリックでテーブル行追加（FSET_TADD版）](https://qiita.com/rex0220/items/3e36de44361a9e72ffb4)

# 概要

「共通タスク追加」で、テーブルを初期設定。
「Xタスク追加」、「Yタスク追加」で、テーブル行を追加します。

![2024-09-26_14h46_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/6b3f8bdf-7cef-654e-347a-aa5eab5f0772.png)

# 操作例

![2024-09-26_15h02_26.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/87c02a60-aafa-f69e-49c1-bb6dfc5338f5.gif)


# アプリ設定

スペース項目と計算用項目を追加します。

- ボタン用にスペース項目を要素IDをつけて設定
- 計算用項目追加
    - テーブルデータ設定用（文字列）
    - テーブル制御（数値）
    - テーブル行数（数値）

![2024-09-26_14h53_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/5d35ade1-779e-682f-915c-911238f31d37.png)


# 計算式プラグイン設定

テーブル行追加ボタンクリックで、「テーブルデータ設定用」に追加データ、「テーブル制御」に１を設定します。

- テーブル: 「テーブルデータ設定用」の行数に合わせて行数分追加
- テーブル内項目： 追加行なら、「テーブルデータ設定用」のデータをセット


![2024-09-26_14h49_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/cbab9761-0381-3d58-0184-9d84c6b22159.png)

```.js
OPTION: 循環参照を許可

// SP1:(SP1) SPACER
BUTTON("共通タスク追加",
  FSET(タスク,
    ARRAY("",
            "[
            {'作業ステータス':'未着手','タスク名':'タスク1','期日':'"&TODAY()&"'},
            {'作業ステータス':'未着手','タスク名':'タスク2','期日':'"&TODAY()&"'},
            {'作業ステータス':'未着手','タスク名':'タスク3','期日':'"&TODAY()&"'}
            ]"
    )
  )
)

// SP2:(SP2) SPACER
BUTTON("Xタスク追加",
  FSET(テーブル制御,1),
  FSET(テーブルデータ設定用,
    "[
       {'作業ステータス':'未着手','タスク名':'Xタスク1','期日':'"&TODAY()&"'},
       {'作業ステータス':'未着手','タスク名':'Xタスク2','期日':'"&TODAY()&"'},
       {'作業ステータス':'未着手','タスク名':'Xタスク3','期日':'"&TODAY()&"'}
    ]"
  )
)

// SP3:(SP3) SPACER
BUTTON("Yタスク追加",
  FSET(テーブル制御,1),
  FSET(テーブルデータ設定用,
    "[
       {'作業ステータス':'未着手','タスク名':'Yタスク1','期日':'"&TODAY()&"'},
       {'作業ステータス':'未着手','タスク名':'Yタスク2','期日':'"&TODAY()&"'},
       {'作業ステータス':'未着手','タスク名':'Yタスク3','期日':'"&TODAY()&"'}
    ]"
  )
)

// テーブルデータ設定用 SINGLE_LINE_TEXT (hide)
IF(テーブル制御=1,テーブルデータ設定用,"")

// テーブル制御 NUMBER (hide)
IF(テーブル制御=1,2)

// テーブル行数 NUMBER (hide)
COUNTROW(タスク)

// タスク SUBTABLE
LET(add_cnt,ARRAY_COUNT(JSON_P(NVL(テーブルデータ設定用,"[]"))),
  IF(add_cnt>0,COUNTROW(タスク)+add_cnt)
)

// タスク.作業ステータス DROP_DOWN (editable)
IF(OR(テーブル行数>ROWNO(タスク),テーブル制御!=2),
  作業ステータス,
  LET(arr,JSON_P(テーブルデータ設定用),
    pos,ROWNO(タスク)-テーブル行数,
    DIC_ITEM(ARRAY_GET(arr,pos),"作業ステータス")
  )
)

// タスク.タスク名 SINGLE_LINE_TEXT (editable)
IF(OR(テーブル行数>ROWNO(タスク),テーブル制御!=2),
  タスク名,
  LET(arr,JSON_P(テーブルデータ設定用),
    pos,ROWNO(タスク)-テーブル行数,
    DIC_ITEM(ARRAY_GET(arr,pos),"タスク名")
  )
)

// タスク.期日 DATE (editable)
IF(OR(テーブル行数>ROWNO(タスク),テーブル制御!=2),
  期日,
  LET(arr,JSON_P(テーブルデータ設定用),
    pos,ROWNO(タスク)-テーブル行数,
    DIC_ITEM(ARRAY_GET(arr,pos),"期日")
  )
)
```
ubuntu20.04のブートにて'minimal bash~'がでてしまう問題の対策法

## 問題
ROG FLOW X13(GV301QE)にて，Ubunutu20.04の日本語リミックス版のisoイメージを書き込んだUEFIからUSBでブートしようとすると，
```
minimal bash like line editing is supported~~~~~

grub>
```
が表示されて，困惑してしまう．

調べてみて，`configfile`を使った方法を実行してもうまくいかなかったが，以下の方法でUbuntuを起動することができた．

## 対策
1. UEFIからSecure Bootをdisabledにしておく.
2. 以下のコマンドで，`grub`というディレクトリを探す．
   注）日本語配列のキーボードに対応していないため，記号とかは英語配列のキーボードなどから探す.
   
    ```
    grub> ls
    ```
3. `/boot`や`/grub`などのディレクトリがあるパーティションを見つけたら以下のコマンドを打つ．
    ```
    grub> set root=(hdX, Y)
    grub> set prefix=(hdX, Y)/boot/grub
    ```
4. linuxカーネルをロードするようにするために以下を実行する．
    ```
    grub> insmod normal
    grub> normal
    ```
## 参考
[How to Fix Minimal BASH Like Line Editing is Supported GRUB Error In Linux? - GeeksforGeeks](https://www.geeksforgeeks.org/how-to-fix-minimal-bash-like-line-editing-is-supported-grub-error-in-linux/)
[はじめてのLinuxデスクトップ環境 - Linux Mint, Ubuntu](https://zenn.dev/grafumo/scraps/3fda5a4b18afe0)
react360について


# React360
React 360は、Facebookが開発したReactを用いた仮想現実（VR）や拡張現実（AR）向けのWebアプリケーションを構築するためのフレームワーク。
Web技術を活用しながら、360度のビューを持つインタラクティブなVRやARアプリケーションを開発することができる。
React 360は、Reactコンポーネントと同様の構文やコンセプトを使用して、直感的にVRアプリケーションを構築することができる特徴がある。

https://github.com/facebookarchive/react-360

# 開発終了
現在、React 360の開発は終了。
現在はメンテナンスモードに移行しており、新しい機能やアップデートは提供されていない。
代わりに、他の技術やフレームワークがVRやAR開発に使用されることが増えているらしい。
【学習メモ】Renderでのデプロイ時エラーになったら

Railsチュートリアル第3章終了時のデプロイで
502エラーが出てしまいました

### 結論
対処としては…

１
Render＞Dashboard＞Logs
でログの内容を確認
２
ログ中の「Error」や「Aborted」を検索
３
ワードの周辺に書いてある内容を確認

で解決できました

ちなみにabortedは「アボート」という形でも使われる用語のようでした
https://eow.alc.co.jp/search?q=aborted

三角の中に「！」が入っているマークは警告マークのため、エラーとは直接関係しない内容も書かれているようです


対応としてやったことを以下メモします。
※次回同じエラーが出た場合には、「進め方２」の対処法で進めてみたいと思います

### 進め方１
今回の場合、abortedで検索すると周辺に
ActiveSupport::MessageEncryptor::InvalidMessage: 
という記載がありました

```
>Bundle complete! 23 Gemfile dependencies, 59 gems now installed.
>Gems in the groups 'development' and 'test' were not installed.
>Bundled gems are installed into `/opt/render/project/.gems`
>rake aborted!
>ActiveSupport::MessageEncryptor::InvalidMessage: ActiveSupport::MessageEncryptor::InvalidMessage
```

こちらの記事を参考に進めました。

https://qiita.com/suzy1031/items/64598d44b428ccd7abc5

https://qiita.com/pa8p1pupepa8/items/f0aed09e3dbc0c5d1090


Railsチュートリアルに戻り…

config/master.keyファイルを削除後、再度作成
https://railstutorial.jp/chapters/static_pages?version=7.0#code-root_test:~:text=Codespaces%E3%81%AE%E5%A0%B4%E5%90%88%E3%81%AF%E5%BF%98%E3%82%8C%E3%81%9A%E3%81%ABconfig/master.key%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82
↓
master.keyファイルを確認
↓
master.keyにあるキーをコピー
↓
Render＞Dashbord＞Environmentにある
Key「RAILS_MASTER_KEY」にペースト

これでエラーを解消できました。

一方で、元のマスターキーとRenderに入力しているキーがマッチしていないことが原因のため、
次回は一度進め方２で対応したいと思います。


### 進め方２

master.keyファイルを確認
↓
master.keyにあるキーをコピー
↓
Render＞Dashbord＞Environmentにある
Key「RAILS_MASTER_KEY」にペースト

※ファイルの削除・作成を省きました
[paiza]レベルアップ問題集解答案(C#)【配列の検索】何個ある? Boss

# 問題
https://paiza.jp/works/mondai/array_primer/array_primer__search_count_boss

# C#解答案
```c#
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        // 1行目: 整数N, Mを取得
        int[] num = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);

        // 2行目: M個の整数を取得し、配列に格納
        int[] list = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);

        // リストからNの数を数える
        IEnumerable<int> li = list.Where(o => o == num[0]);
        //var li = list.Where(o => o == num[0]);

        // Nがいくつあったかを出力
        Console.WriteLine(li.Count());
    }
}
```
package.jsonでコマンドをつくる


「npm run hoge」すると実行されるコマンドはpackage.jsonのscriptsで追加できる。

npm run hogeでビルドとファイルを削除したい場合は下記のようにする！
```
  "scripts": {
    "dev": "astro dev",
    "start": "astro dev",
    "build": "astro build",
    "hoge": "npm run build && rm dist/index.html",
    ~~~
```
pandas の to_excelで「OSError: Cannot save file into a non-existent directory: 」と言われたら

データ解析や処理結果をExcelファイルに保存する際、`pandas`の`to_excel`メソッドを使うことがよくあります。しかし、保存先ディレクトリが存在しない場合に次のようなエラーが発生することがあります。僕は今日これに初めて会いました。

```
OSError: Cannot save file into a non-existent directory: 'your_directory'
```

このエラーは、ファイルの保存先に指定したディレクトリが存在しないことが原因です。ないときに作るくらいよしなにやっておいて欲しいものですが、仕方ありません。

この記事では、このエラーを具体的に解消する方法について説明します。

## エラーの発生例

例えば、次のようなコードでデータをExcelに保存しようとするとします。

```python
import pandas as pd

# サンプルデータフレーム
df = pd.DataFrame({'Name': ['Alice', 'Bob'], 'Age': [25, 30]})

# ファイルを保存（存在しないディレクトリに）
df.to_excel('output_dir/results.xlsx', index=False)
```

このコードを実行すると、`output_dir`というディレクトリが存在しないため、次のようなエラーが発生します。

```
OSError: Cannot save file into a non-existent directory: 'output_dir'
```

このエラーメッセージは、ファイルを書き込もうとしているディレクトリが存在しないことを示しており、pandasはそのディレクトリがない状態ではファイルを保存できません。

## 解決方法：ディレクトリの存在を確認して作成する

このエラーを解決するためには、保存先のディレクトリが存在しない場合に自動的に作成する処理を追加する必要があります。`os`モジュールの`os.makedirs`関数を使って、ディレクトリを作成します。

### 修正版コード

次のようにコードを修正することで、ディレクトリが存在しない場合に自動で作成し、ファイルを保存できるようにします。

```python
import os
import pandas as pd

def save_dataframe_to_excel(df, file_name):
    # ファイルのディレクトリを取得
    directory = os.path.dirname(file_name)
    
    # ディレクトリが存在しない場合は作成
    if directory and not os.path.exists(directory):
        os.makedirs(directory)
    
    # データフレームをExcelに保存
    df.to_excel(file_name, index=False)

# サンプルデータフレーム
df = pd.DataFrame({'Name': ['Alice', 'Bob'], 'Age': [25, 30]})

save_dataframe_to_excel(df, 'output_dir/results.xlsx')
```

### 実行結果

修正版コードを実行すると、`output_dir`ディレクトリが存在しなくても自動的に作成され、次のようにExcelファイルが正常に保存されます。

```
output_dir/results.xlsx
```

エラーは発生せず、指定したパスにファイルが無事に作成されます。

## 応用例：他のファイル形式でも同様の対処法

このアプローチはExcelファイルに限らず、他の形式のファイル（例えば、`to_csv`でCSVファイルを保存する場合）にも応用できます。例えば、CSVファイルの保存でも同様にディレクトリの存在を確認し、自動で作成できます。

```python
def save_dataframe_to_csv(df, file_name):
    directory = os.path.dirname(file_name)
    if directory and not os.path.exists(directory):
        os.makedirs(directory)
    df.to_csv(file_name, index=False)
```

## まとめ

pandasの`to_excel`メソッドを使用している際に、「`Cannot save file into a non-existent directory`」というエラーが発生した場合、指定したディレクトリが存在しないことが原因です。`os.makedirs`を使って作成することで、この問題を簡単に解決できます。

初歩的なエラー解決だと思いますが、質より量だと思って記事を書きました。
Ubuntuで日本語入力ができなくなったときにやること

# Ubuntuで日本語入力ができなくなったときにやること

僕の環境ではたまにmozcが使えなくなります　そのときにやっている解決方法を紹介します。

## 結論
Mozcを再インストールして再起動すれば直る。
手順⬇

## 1.Mozcを再インストール
まずubuntuの設定を開いてキーボードタブを開きます。
![Screenshot from 2024-09-26 14-01-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889080/fb72b1a4-4a84-aaa1-80a7-4aa9da5fab76.png)
mozcの選択メニューを開いて削除を押します。

## 2.再起動
普通に再起動します

# 解決しない場合
上の手順を繰り返しても直らない場合は

~~Google先生に聞いてみてください。~~
やったほうがいい⬆

# 最後に
解決したら幸いです
Spring Boot備忘録

# Spring Boot主要アノテーション
・@RestController API作成
・@Configuration 色々設定する。外部APIもここで設定
・@Service 処理を作る
・@Dataを使い、データ型指定するだけでsetterとgetterを自動生成
・@Errorhandler エラー処理を渡すことができる
・@RequierdArgsConstructor インターフェースを引数付きコンストラクタで持ってくる
・@BeanでDI 自動管理させる
・@PostMapping データ追加
・@Transactional 別クラス呼ばれる時にDBトランザクション処理を行う
・@Qualifier Beanに登録する名前



Mybatisを使った場合
・@Mapperを使いデータベース接続
・@Select,@Update,@Insert,@Deleteを使ってデータベース操作出来る
恐らく2つ以上のコネクションを排他制御しないで使っているのが原因。


JPA使った場合
・@Entityでデータを持ってくる
・@Tableでテーブルを指定
・@IdでPrimaryKey指定
watchコマンドを使って新しく接続した機器のipアドレスや名前を探しやすくする

ネットワーク機器を抜き差ししてifconfigなどの結果とにらめっこしたことはありませんか？（私はやってました）


## 結論

watchコマンドを使ってip addrを定期実行すると良いです。

```
watch -d  "ip addr show"
```

ifconfigでも良いですが画面の専有面積が広くなるので名前を知りたいだけならipコマンドの方が使い勝手良かったです。

https://atmarkit.itmedia.co.jp/ait/articles/1806/29/news037.html#:~:text=watch%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8%E3%81%AF%EF%BC%9F,%E3%80%8Cwatch%E3%80%8D%E3%81%AF%E3%80%81%E5%BC%95%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E4%B8%80%E5%AE%9A%E9%96%93%E9%9A%94%E3%81%94%E3%81%A8%E3%81%AB%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%81%99%E3%80%82%20%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C%E3%82%92%E3%83%95%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%97%E3%80%81%EF%BC%BBCTRL%EF%BC%BD%EF%BC%8B%EF%BC%BBC%EF%BC%BD%E3%81%A7%E7%B5%82%E4%BA%86%E3%81%97%E3%81%BE%E3%81%99%E3%80%82



## 解説


watchコマンドは渡したコマンドを定期実行（defaultで2秒ごと）してくれます。-`d` optionを加えると変化がある場所をハイライトしてくれるので目が悪くなったおじさんでも大丈夫ですね。

`-n` optionで秒数を指定できたりもするので場合によっていろいろ挙動を調節できるのも良いです。


lsusbなどを使えばusb機器を探す時に役に立つと思います。
最短10秒でWindowsにWebサーバーを建てる

久々の投稿です。

Webサーバー構築RTAです。

# 静的ファイルサーバー
```sh
curl -L https://frippery.org/files/busybox/busybox64u.exe > .\busybox.exe
.\busybox.exe sh
httpd -fv -p 127.0.0.1:9999 -h ./
```

`http://127.0.0.1:9999` からローカルファイルが公開されます。

# 動的CGIサーバー
```sh
curl -L https://frippery.org/files/busybox/busybox64u.exe > .\busybox.exe
.\busybox.exe sh
mkdir -p ./www/cgi-bin
echo -ne '<div>hello! <a href="./cgi-bin/random">random</a></div>' > ./www/index.html
echo -ne '#!/bin/sh\nset -eu\necho "Content-Type: text/plain"\necho\necho ${RANDOM}' > ./www/cgi-bin/random
httpd -fv -p 127.0.0.1:9999 -h ./www
```

`http://127.0.0.1:9999` から `index.html` が公開されます。
`http://127.0.0.1:9999/cgi-bin/random` からアクセス毎にランダムな整数を取得できます。

# 解説
[busybox-w32](https://frippery.org/busybox) をダウンロードして `sh` から `httpd` を実行するだけ。

以前は静的サーバーのみでしたが、最近のアップデートでCGIに対応しました。
公開ルートディレクトリ (`-h`) に `httpd.conf` を置くと認証やアクセス制御が可能です。

本番運用には向きませんが、作業や社内公開であれば充分すぎる機能です。

**CMD君はBusyBoxをダウンロードする為だけの存在です。Edge君と同じだね。**

# busybox-w32
偉大なるbusybox-w32をざっくりおさらい。

- 本家BusyBox(Linux)のWindows移植版
- 本家機能をほぼカバー
- 依存関係無
- シングルバイナリ
- 省ファイルサイズ (v5467で658kB)
- bash(ash)内蔵でShellScript実行可能

とりあえずbusybox-w32を `C:\Windows` あたりに突っ込んでおけば、巨大で煩雑なCigwinやWSL2を導入せずに、シンプルで強力なUnixLike環境を簡単に用意できます。
僕はもうbusybox-w32を無くしてWindowsで作業できない身体になってしまいました。
GitHubに突然つながらなくなったときの対処方

## これは何?

GitHubに突然つながらなくなった際に試したことを防備録として記載する

2024/12/05追記
Automatically unlock this key whenever I'm logged inにチェックを入れたせいだと思われる

前までは，Enter password to unlock the private keyというポップアップが出ていた。

```
sign_and_send_pubkey: signing failed for RSA "/home/acer/.ssh/id_rsa" from agent: agent refused operation
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.
```

### 前提

ssh接続でgithubにアクセスしている

---

## やったこと

### sshにつながるか

```shell
ssh -T git@github.com
Hi sigma! You've successfully authenticated, but GitHub does not provide shell access.
```
これが返ってくるはずだが，返ってこないならssh接続が失敗している。

### `gnome-keyring`は動作しているか

```shell
ps -ef | grep gnome-keyring
/usr/bin/gnome-keyring-daemon --daemonize --login
```
動作してそう

### `~/.ssh/id_rsa`の権限チェック

AWSのEC2インスタンスに接続する際には鍵の権限が600になっていないと怒られるので一応確認。

```shell
ls -l ~/.ssh/id_rsa
```
600になってそうなので問題なし

### sshの秘密鍵の設定を確認する

`seahorse`で鍵の管理をしてそうなので起動してみる。

```shell
seahorse
```
sshの秘密鍵のパスワードを変更してみたが解決せず
他の項目も関係なさそう。

---

## 暫定対応

1. 秘密鍵と公開鍵の再生成
    
    ```shell
    ssh-keygen -t rsa -C 鍵名
    ```
2. GitHubに秘密鍵を再登録
3. [stack overflow](https://stackoverflow.com/a/71335885/55505449)にあるようにsshエージェントに秘密鍵を登録する

    ```shell
    ssh-add ~/.ssh/id_rsa
    ```
接続チェックしたら接続できました。

```shell
ssh -T git@github.com
Hi sigma! You've successfully authenticated, but GitHub does not provide shell access.
```

---

## 暫定対応時の問題点 2024/12/05追記

PCの電源を落としたりするとssh-addが切れてしまい，定期的に`ssh-add`しないと同様のエラーが出るようになってしまった。

### 解決した方法

逆に`ssh-add -d`してみたらEnter password to unlock the private keyのポップアップが出てくるようになった気がする。

```shell
ssh-add -d ~/.ssh/id_rsa
```
Qiita templete

# はじめに
<!-- 発端や概要を記載 -->
Qiitaの記事書き始める時に使ってるテンプレート

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Chapter1](#Chapter1)
1. [Chapter2](#Chapter2)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Chapter1

<a id="#Chapter2"></a>
# Chapter2

<a id="#reference"></a>
# 参考文献
- [リンクテキスト](URL)
- [リンクテキスト](URL)

|a  |b  |c  |
|---|---|---|
|1  |2  |3  |
|4  |5  |6  |
ソフトウェア受託開発プロジェクトにおけるリスク管理の重要性


ソフトウェア受託開発プロジェクトは、複雑な要件をもとに進められることが多く、その過程でさまざまなリスクに直面します。リスクを適切に管理することは、プロジェクトの成功を左右する重要な要素です。ここでは、ソフトウェア受託開発プロジェクトにおけるリスク管理項目を15個紹介します。

#### 1. 要求の不確定性
クライアントの要求が不明確な場合や、途中で要件が変更される可能性は常に存在します。要求の曖昧さや頻繁な変更は、プロジェクトの進行に大きな影響を及ぼします。

#### 2. スコープの拡大（スコープクリープ）
プロジェクト進行中にクライアントから追加の機能や変更が要求されることはよくありますが、これに対応することでプロジェクトのスコープが拡大し、リソースやスケジュールに負担がかかるリスクがあります。

#### 3. スケジュールの遅延
プロジェクトの進行が予定通りに進まず、納期が遅れるリスクです。スケジュールの見積もりが甘い場合や、予期せぬ問題が発生することで遅延が生じることがあります。

#### 4. 予算超過
プロジェクトに必要なコストが当初の予算を超過するリスクです。要件の追加や開発に時間がかかる場合、コストが増加し、プロジェクト全体に影響を与えます。

#### 5. 技術的課題の発生
使用する技術やツールに関する予期せぬ問題が発生する可能性があります。新しい技術を導入する際に、想定外のトラブルが生じるリスクもあります。

#### 6. リソースの不足
必要な人材や設備が不足するリスクです。プロジェクト開始時には十分なリソースが確保されていたとしても、途中で予期せぬ問題が発生し、リソースが不足することがあります。

#### 7. チームメンバーの離脱
プロジェクトのキーとなるメンバーが途中で離脱する可能性は、特に重要なリスクです。特定の技術スキルを持つメンバーが離脱した場合、プロジェクト進行に大きな影響を与えます。

#### 8. 品質の問題
テスト不足やバグの発見が遅れ、納品物の品質が低下するリスクです。品質の低いソフトウェアを納品すると、クライアントからの信頼を失うだけでなく、後々のサポートコストが増加することもあります。

#### 9. 外部依存
外部パートナーやサードパーティのツールに依存するリスクです。これにより、サードパーティのサービスが提供停止された場合や、期待通りのパフォーマンスを発揮しない場合にプロジェクトに影響が出ます。

#### 10. コミュニケーション不足
クライアントやチーム内でのコミュニケーション不足により、情報が伝わらず、誤解や遅延が生じるリスクがあります。プロジェクトの成功には、適切な情報共有が欠かせません。

#### 11. 法的・規制上の変更
契約や規制が変更され、プロジェクトの進行に影響を与えるリスクです。特に、法的な要求や規制の変更がプロジェクトに与える影響は大きいものです。

#### 12. クライアント側のリスク
クライアント側の方針変更や組織変更が発生するリスクです。これにより、プロジェクトの要求が急に変わったり、プロジェクトが停止する可能性も考えられます。

#### 13. ドキュメンテーション不足
プロジェクトの重要な情報が十分に文書化されず、後々トラブルが発生するリスクです。特に、ドキュメント不足はメンバーが交代する際や、保守フェーズで大きな問題を引き起こすことがあります。

#### 14. インフラストラクチャの問題
サーバーやネットワークなどのインフラに問題が発生するリスクです。インフラの障害により、開発や運用が停止する可能性があります。

#### 15. セキュリティリスク
開発中、または納品後にセキュリティ上の脆弱性が見つかるリスクです。これにより、クライアントやそのユーザーに大きな被害が及ぶ可能性があります。

### リスク管理の重要性
これらのリスクは、プロジェクトを進行する上で避けられないものですが、事前にリスクを認識し、適切な対応策を講じることで、プロジェクト全体の成功率を大幅に向上させることができます。特に、定期的なリスクアセスメントやコミュニケーションの強化は、リスクを早期に発見し、迅速に対応するための重要なステップです。

ソフトウェア受託開発プロジェクトにおいては、リスク管理を徹底し、プロジェクトの成功を確実にするために、継続的なリスクの監視と改善が必要不可欠です。
zshで、deleteキーに期待通りの働きをさせる。

シェルをzshに替えたので、色々設定が大変になった。
この問題は、案外copilotやgeminiに訊いても的はずれな回答が返ってくるので。
まずは、deleteキーをカーソルの上の文字を消して次の文字からを左へシフトさせるという動作をするようにする。

```
vi ~/.zshrc 

bindkey "^[[3~" delete-char
```

これで、Deleteキーが生成するエスケープシーケンスが、delete-charに置き換えられる。

なので、ターミナルエミュレータなどの設定は、deleteキーが発生するのはエスケープシーケンスに設定をしておく。

そして、

```sh
source ~/.zshrc
```

これで、Delete キーを押すとカーソルの上の文字が消えるようになります。
以上。
基礎統計学Ⅰ 統計学入門 第3章 3.1, 第12章 12.10（1984年自民党得票率と持ち家比率データ）

# この記事について
東京大学出版会 統計学入門 (基礎統計学Ⅰ)
https://www.utp.or.jp/book/b300857.html
の練習問題、第3章 3.1と第12章 12.10についての記事です。

# データ
自分自身ネット上にデータが見つからず苦労したので、以下からぜひダウンロードしてください。
**1984年自民党得票率と持ち家比率データ :**
https://github.com/shokubohcm/Introduction_to_Statistics/tree/main/Chapter3/3.1
（LDP=Liberal Democratic Party of Japan, 自民党）

# 解答例（3.1）
おまけに3.1の回答例を載せます。自分はJupyter環境で行いました。
このipynbファイルも上記URLにありますのでよければご利用ください。
## ライブラリ
```
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
```
## データ読み込み
```
df = pd.read_csv(r"...任意のパス\1983_LDP_Homeownership.csv")
df.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563908/ae98ffb6-7e42-192a-b20a-46d197145082.png)
## データ成形
```
d = df.iloc[0:47,[1,2]]
d.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563908/b3b849bd-91da-1d74-1c6c-a163ecd237ea.png)
## 散布図作成
```
plt.xlabel(d.columns[0])
plt.ylabel(d.columns[1])
plt.scatter(d.iloc[:, 0], d.iloc[:, 1])
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563908/73179e78-07d5-b7d8-6685-09339b7b8290.png)
## 各項目に都道府県名を付け加える
```
fig, ax = plt.subplots(figsize=(15,15))
df.plot(df.columns[1], df.columns[2], kind='scatter', ax=ax)
for k, v in df.iterrows():
    ax.annotate(v.iloc[0], xy=(v.iloc[1], v.iloc[2]), size=12)
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563908/4a1a6254-a7ec-c7fb-ae3e-466f9300c5fb.png)
## 相関係数を求める
```
d.corr()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563908/33c8e4a4-1b7b-7097-b4f8-b8252a748dec.png)

ご清覧いただきありがとうございました！
統計の勉強引き続き頑張ります！💪
X: https://x.com/shokubohcm
<br>

参考にさせていただいた記事：https://qiita.com/koplec78/items/9f76cf6a803a1b590049
【Dockerfile】【PostgreSQL】ロケール環境変数の設定をした際に発生したエラーと解決策

## 前提
### 実現したいこと
DockerでPostgresを使用する際、文字列のカラムを日本語基準でソートしたい。
ただし、ログなどは英語のままにしたい。

### やってみたこと
カスタムのDockerfileを作成し、PostgresのDockerイメージに`ja_JP.utf8`ロケールを追加する。
また、以下のロケール環境変数のみ`ja_JP.utf8`を設定する。
- `LC_CTYPE`
- `LC_COLLATE`

```docker: Dockerfile
FROM postgres:15.3
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
    && localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8

ENV LC_CTYPE=ja_JP.UTF-8
ENV LC_COLLATE=ja_JP.UTF-8
```

```yml: docker-compose.yml
db:
  build:
    context: .
    dockerfile: Dockerfile
  container_name: postgres
```

## 発生した問題
Dockerを起動したところ、以下のエラーが発生した。

```
initdb: error: invalid locale settings; check LANG and LC_* environment variables
```

## 解決策
すでに設定していた`LC_CTYPE`と`LC_COLLATE`の他に、 **全ての主要なロケール環境変数について明示的に設定した** 。
この方法で、Docker起動時にエラーが発生しなくなった。

```diff_docker: Dockerfile
FROM postgres:15.3
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
    && localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8

ENV LC_CTYPE=ja_JP.UTF-8
ENV LC_COLLATE=ja_JP.UTF-8
+ ENV LC_MESSAGES=C.UTF-8
+ ENV LC_NUMERIC=C.UTF-8
+ ENV LC_TIME=C.UTF-8
+ ENV LC_MONETARY=C.UTF-8
```

## （補足）エラーが発生しないロケール環境変数の設定方法
`Dockerfile`にて、ロケール環境変数の設定を正しく行わないとエラーが発生する。
正しい（エラーが発生しない）設定方法は以下の通り。

### `LANG`を設定する
```diff_docker: Dockerfile
FROM postgres:15.3
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
    && localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8

ENV LANG=ja_JP.UTF-8
```

この方法だと、環境変数によってロケールの設定を分けることはできない。
→ [実現したいこと](#実現したいこと)が達成できないため、不採用。

### `LC_ALL`を設定する
```diff_docker: Dockerfile
FROM postgres:15.3
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
    && localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8

ENV LC_ALL=ja_JP.UTF-8
```

この方法だと、環境変数によってロケールの設定を分けることはできない。
→ [実現したいこと](#実現したいこと)が達成できないため、不採用。

### 全ての主要なロケール環境変数を1つずつ個別に設定する
[解決策](#解決策)にて記述した内容。

最低でも以下を設定すれば良い。
- `LC_CTYPE`
- `LC_COLLATE`
- `LC_MESSAGES`
- `LC_NUMERIC`
- `LC_TIME`
- `LC_MONETARY`

この方法だと、 **環境変数によってロケールの設定を分けることができる** 。
【SQL】スキーマを飛び越えて横グシでみたいよ～

# 投稿サボってるわけじゃない
ちょっと真面目に仕事しなきゃならない状況になったため、
投稿頻度が爆下がりになってます。どうも　え～すけです。

仕事はいつも真面目にやってますが、
真面目過ぎてスケジュールとか前倒しで終わってたりするので、
ちょっと息抜き・暇つぶしに投稿してます。

# 前提
- ポスグレ
- public以外の特定のスキーマ間で同じ構造のテーブルを持ってる

# やりたいこと
publicスキーマに各スキーマの対象テーブルをunion allしたviewを作って、データを横グシで眺めたいよ～

# 普通に書く
```sql
create or replace view  public.v_test AS 
   select * from "スキーマ0001".t_test
union all 
   select * from "スキーマ0002".t_test
union all 
   select * from "スキーマ0003".t_test
```

# 問題点
スキーマが新しく増えたりとか、テーブルが新しく増えたりした時に、
毎回SQL組み直して実行し直すとか面倒くささの極み。

# それプロシージャでやればよくね？
- とりあえずテーブル名の定義はベタ書き（管理テーブルとか作ってもいいかも）
- スキーマ情報はpg_catalog.pg_namespace に入ってる

```sql:プロシージャジャーン
create or replace procedure create_view() as $$ declare
 sc_name text;
 tb_name text;
 tb_arr text[] := array['t_table1', 't_table2', 't_table3'];
 sql_template text := '';
begin
  foreach tb_name in array tb_arr loop
    for sc_name in 
      select
          nspname
      from
          pg_catalog.pg_namespace 
      where
          nspname like 'スキーマ%'
    loop 
      if length(sql_template) > 0 then
        sql_template = concat(sql_template, ' union all ');
      end if;
      sql_template = concat(sql_template, format('select * from "%s"."%s"', sc_name, tb_name));
    end loop; 
    sql_template = concat(format('create or replace view  public."%s" AS ', tb_name), sql_template);
    raise info '%', sql_template; 
    execute sql_template;
    sql_template = '';
  end loop;
end; 

$$ language plpgsql;
```

スキーマ名の命名がきちんとしてれば、like検索部分を変えるだけでええんやで。
executeまでしてるからこのプロシージャ呼ぶだけでViewの再作成が出来るんやで。
テーブルが増えたとしても、このプロシージャの頭の方で定義してる配列に入れれば終わりやで。
でもテーブル名とView名がおなじになるのが気に食わないのであれば、管理テーブルとか作ったほうがええんやで。
ペアプロ・チェックリスト7箇条（開発前に読み合わせよう！）

## 🏁 この記事の目的

この記事は、チーム開発を行う前にチェックしておきたい共同作業における約束事をまとめました。
ペアプログラミングやチームビルディング、ワーキングアグリーメントで認識を合わせましょう！

参考：Googleのソフトウェアエンジニアリング

https://www.oreilly.co.jp/books/9784873119656/


## チームで働く人のための、マインドセット

簡単に言えば、信頼、尊敬、謙虚さが大事になるわけですが、具体的な行動レベルに落とすと次のようになります。

- [ ] **自分を疑う**
    - 👎 「オブジェクト指向は当たり前の内容だ」
    - 👍 状況に応じてベストな解は異なることを理解しましょう。
- [ ] **スタイルの相互尊重**
    - 👎 自分のやり方を押し付ける
    - 👍 チームや大規模な組織で効果的に働きたい場合は、自分の好みの作業スタイルと他の人の好みの作業スタイルに注意してください。自分の常識は相手にとっての非常識かもしれません。
- [ ] **相手を理解するための、コミュニケーションコストを払う**
    - 👎 会話をめんどくさがる。
    - 👍 あなたとあなたのチームがコミュニケーションや対人対立に費やす時間を認めてください。
    自分自身や他の人の性格や働き方を理解するための小さな投資は、生産性の向上に大いに役立ちます。
    (ただし、あまりにも理解が及ばない場合は理解タスクを流すのも選択肢の一つです。)
- [ ] **完璧ではなく80%で満足しましょう**
    - 👎 完璧を求める（完璧を求めすぎる環境は、相手の欠陥を粗探しする文化に繋がります。）
    - 👍 あらかじめ80%ラインを設定し、達成したらポジティブフィードバックを行い次のタスクに進みましょう！
- [ ] **プラスのフィードバックもする**
    - 👎 ネガティブフィードバック中心。
    - 👍 レビューを受ける人は成果物に対して謙虚にフィードバックを受け取りましょう。送り手は適切にフィードバックし、フィードバックが個人 (およびチーム) の開発にとってどれほど価値があるかを伝えましょう。
- [ ] **現状維持に争う**
    - 👎 「めんどくさいからいつもの技術スタックで(惰性)」
    - 👍 野心的な目標を設定し、他人からの抵抗や惰性があってもそれを追求することができます。
- [ ] **チームを大事にする**
    - 👎 個人プレーだけに走る。
    - 👍 同僚への共感と敬意を持ち、彼らを助けるために積極的に働き、チームの結束を高めます。
- [ ] **パワーバランスを考慮する**
    - 👎 メンバーは同じだけ価値があるはずだ。だから自分と同じことが相手にもできる。
    - 👍 人には得意不得意がありますし、プロジェクトが始まった時点で全員が同じスタートラインにいるとは限りません。
    また、役職や立ち位置含めメンバー間のパワーバランスは同一でなく、そのことを頭に入れなければ発言力は平等にはなりません。


## 最後に

**追加意見募集しております！**

また、「これは違うだろ」は