OmniAICreator/Qiita-1.07M huggingface dataset:
pyenvで「BUILD FAILED (OS X 14.2.1 using python-build 20180424)」でOpenSSLモジュールが見つからない時の対処法



## 環境
OS:macOS 14.2.1
pyenv 2.3.35
shell: zsh

## 起こっていた問題

pyenvで python 3.11.4をインストールしようとしたら下記のようなエラーが発生
```
❯ pyenv install 3.11.4                                                                                                               ─╯
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.11.4.tar.xz...
-> https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tar.xz
Installing Python-3.11.4...
python-build: use tcl-tk from homebrew
python-build: use readline from homebrew
python-build: use zlib from homebrew
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/toyama/.pyenv/versions/3.11.4/lib/python3.11/ssl.py", line 100, in <module>
    import _ssl             # if we can't import it, let the error propagate
    ^^^^^^^^^^^
ModuleNotFoundError: No module named '_ssl'
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (OS X 14.2.1 using python-build 20180424)

```

どうやらopensslのモジュールが見つけられない模様


## 解決法

インストールはされているので環境変数を設定する

```sh:zshrc
export LDFLAGS="-L/opt/homebrew/opt/openssl@3/lib $LDFLAGS"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@3/include $CPPFLAGS"
export PKG_CONFIG_PATH="/opt/homebrew/opt/openssl@3/lib/pkgconfig"
```

これでいけると思われたがまた同じエラーが発生
色々調べた結果OpenSSLの1.1を指定する必要がある模様

https://qiita.com/y-vectorfield/items/d1dfce67cf111c3bfc5a


```sh:zshrc
export LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib $LDFLAGS"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include $CPPFLAGS"
export PKG_CONFIG_PATH="/opt/homebrew/opt/openssl@1.1/lib/pkgconfig"
```

成功しました
```
❯ pyenv install 3.11.4                                                                                                               ─╯
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.11.4.tar.xz...
-> https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tar.xz
Installing Python-3.11.4...
python-build: use tcl-tk from homebrew
python-build: use readline from homebrew
python-build: use ncurses from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.11.4 to /Users/toyama/.pyenv/versions/3.11.4
```
Dell Inspiron がログインできなくなった状態から回復

知人のDell製Inspironがログインできなくなったということで、対処してみました。

現象は、下記のようでした。
- 起動は問題なし
- ログイン画面が出ない(Dellのロゴマークが出たあと黒い画面になったらそれきりになる)
- 一度だけセーフモードでログイン画面が出るも、パスワード入力してログイン実行したあと黒い画面になりそれきりになった
- 以降セーフモード起動を試みてもログイン画面が出なくなった(黒い画面でそれきりになる)

復元ポイントは作成していなかったということで、使えず、
データがなくなるのは困るということで、初期状態に戻すこともできず。

セーフモードが起動しないというのは初めてだったので、ちょっと焦りました💦
が、
◎最終的には、バッテリーを外してPC内の回路を放電(5分程度何もせず放置)してみたら、無事直りました。

ただ一点だけ、気になったことがありました。
下の画像のように、FFCコネクタがしっかり入っていない(？)ようだったので、挿しなおしました。ただ、あんまりカチッと入るわけではなかったので、ここが原因かはよく分からなかったです。

これくらいで接触不良ということはあるのでしょうか？ここが今回の現象の原因になり得るのでしょうか。

もし分かる方いらっしゃいましたら、コメントで教えていただけると嬉しいです。

![IMG_5120_20240114_ノートPC内部.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677811/fd7d9e87-468e-b1a2-67f7-e36051bb1e4e.jpeg)


![IMG_5120_20240114_ノートPC内部_拡大.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677811/5b574576-9630-efd7-872c-b19d798e094e.jpeg)
npm packageのバージョンアップデート範囲を指定したい（semver、^、~）

# 1. 問題
よく使うnpm package「notrealmodule 10.0.0」に新機能が追加されたので早速アップデートしたい。
でもアプリに不具合が起きるかもしれないので怖い。
package.jsonにどう書けばいいんだろ？そもそも10.0.0とは何？

# 2. 環境
npm packageを使用する環境すべて。

# 3. 解決
`^`をつけて、minor visionまでのみアップデートされるようにする。
````package.json
  "dependencies": {
    "notrealmodule": "^10.0.0",
  }
````
10.0.0は`semver`方式と言って、順番にmajor、minor、patchを意味する。

# 4. 詳細
### 4.1 semverとは
Sementic versioningの略。
Javascriptエコシステムで推奨されているnpm package version 管理方式。

`major`：変更点が多い場合。APIの互換性を持たない変更。
`minor`：些細な機能追加。APIの互換性を保ちつつ機能性をAPIに追加した場合。
`patch`：バグ修正。APIに影響なし。

しかしすべてのnpm packageがsemverを守っているわけではない。
例：typescript


### 4.2 version範囲の指定方法
package.jsonにpackageのversion更新範囲を指定することができる。
version範囲の表記方法には代表的に以下のようなものがある。

> `version`：正確に一致。
`>verison`：versionより大きい。
`^version`：patchとminorアップデート。
`~version`：patchアップデート。


# 5. 関連知識
[npm packageを一括更新してみましょう（npm outdated、npm update）](https://qiita.com/Mihamakun/items/c0ad9f1e60124776ca4f)

# 6. まとめ
npm packageは`semver`でversion管理をする。
package.jsonで`^`や`~`などでpackageのアップデート範囲の指定ができる。

# 7. 参考
[About semantic versioning](https://docs.npmjs.com/about-semantic-versioning)
[Semantic Versioning 2.0.0](https://semver.org/lang/ko/)
[package.json](https://docs.npmjs.com/cli/v10/configuring-npm/package-json)
[Downloading and installing Node.js and npm](https://docs.npmjs.com/creating-a-package-json-file)
[About semantic versioning](https://docs.npmjs.com/creating-a-package-json-file)
[node-semver](https://github.com/npm/node-semver?tab=readme-ov-file#versions)

# 8. 感じたこと
昔は`^`と`~`の違いが分からなかったけど、今は一気にわかる。よかったね。
tableのCSSについて

　　　　　　　　　　　　　
以下はSCSS
.table{
    border-collapse: collapse;/*ボーダーをまとめて、１つの線にする*/
    border: 1px solid #707070;/*table全体の線（外郭長方形の線のみ）*/
    background: #fff;
    font-weight: 700;
    width: 100%;/*このwidthをつける前、tableが小さいです*/
    table-layout: fixed;/*今は3列があるが、これを入れると、列が3等分になる*/
    /*「table-layout: fixed;」を反映させるためには、テーブル全体の幅を指定する必要があります。*/
    
    th,
    td{
        border: 1px solid #707070;
        padding: 0 24px;
        height: 58px;/*これがないと、高さが小さい*/
        vertical-align: middle;/*上下中央揃い. vertical-alignは、display:blockの要素には指定することができません。*/
    }                          /*inline、または、table-cellにのみ指定することができます。*/

    th{
        background: #999999;
        color: #fff;
        text-align: center;
        font-family: $font-en;
        &:nth-child(1){
            width: 172px;/*第1列は3等分ではなく、width:172px*/
        
        @include mq("sp"){
            width: 112px;/*スマホ時、見出し列の横幅が大きい*/
        }
        
        }
    }

    td{
        text-align: right;
    }

    strong{
        color: #E81919;
        line-height: 1.2;/*?これがないとずれると言われたが*/
    }

    span{
        font-size: 13px;
        display: block;
        margin-top: 1px;
        line-height: 1.2;/*?これがないとずれると言われたが*/
    }
}

以下は説明
table-layoutで利用できる値
table-layoutでは以下の値を使うことができます。

値	　　説明
auto	幅と中身は要素のに合うよう自動的に調整されます。（初期値）
fixed	widthによって指定された値が列の幅となる。
　　　　　指定のない場合は均等に調整される。
     

border-collapseで利用できる値
border-collapseでは以下の値を使うことができます。

値	説明
collapse	隣接するセルで境界線を共有します (collapsed-border 表レンダリングモデル)。
separate	隣接するセルが個別に境界線を持ちます (separated-border 表レンダリングモデル)。
対応ブラウザ
コマンドでファイルを作成するジェネレーターの作成

## はじめに
本記事は[Rails ジェネレータとテンプレート入門](https://railsguides.jp/generators.html)を参考にしています。
勉強中のため、誤りやもっといいやり方があるかも知れません。
その場合は、ご指摘いただけますと幸いです。

また、可能な限りわかりやすく記載するつもりですが、不明瞭な点、追記した方がいい点などがございましたら、合わせてご教授ください。

## この記事の目的
ジェネレーターの作成方法を備忘録を兼ねて残しておきます。
今回のジェネレーターでは、コマンドを叩いてテンプレートファイルからファイルを作成することを目標とします。
具体的には、下記のコマンドを叩いて、`controllers/hoge_hoge_controller.rb` を作成しようと思います。
```console
bin/rails generate hoge hoge_hoge
```

## ジェネレーターとは
データやプログラムコードを自動的に生成するプログラムのことです。

## テンプレートを作成
コピーするための雛形を下記のように作成しておきます。

`lib/generators/hoge/templates/hoge.rb.erb`
```erb
class <%= file_name.camelize %>Controller < ApplicationController
  def create
    # ここに処理を書く
  end

  def edit
    # ここに処理を書く
  end
end
```

## ジェネレーターを作成
file_name を引数と取るようにし、ファイル作成の処理を記載します。

`lib/generators/hoge/hoge_generator.rb`
```ruby
require 'rails/generators'

class DataMigrationGenerator < Rails::Generators::Base
  argument :file_name, type: :string, default: 'default_file_name', banner: 'file_name'
  source_root File.expand_path('templates', __dir__)

  def create_initializer_file
    template 'hoge.rb.erb', "controllers/#{file_name}_controller.rb"
  end
end

```

## 実行結果
`controllers/hoge_hoge_controller.rb`
```erb
class HogeHogeController < ApplicationController
  def create
    # ここに処理を書く
  end

  def edit
    # ここに処理を書く
  end
end
mac の csv を開いたら文字化けするから改善したい

# 目的
Mac環境下において、csv を開くと文字化けしており、日本語で表示させるようにしたい

# 実施内容
1. ターミナルを立ち上げる
1. downloadフォルダまで移動する
    ```s
    $ cd ~/Downloads # ダウンロードフォルダへ移動
    ```
1. 対象ファイルを変換
    ```s
    $ iconv -c -f utf-8 -t shift-JIS <既存のファイル>.csv > <変換後のファイル>.csv
    
    # 以下はコマンド例
    $ iconv -c -f utf-8 -t shift-JIS Export-20240117-171826.csv > after.csv
    ```
# 変換コマンドの意味
<font color="Orange">iconv : </font>これは「International CONVerter」の略で、文字エンコーディングを変換するためのプログラムです。

<font color="Orange">-c : </font>このオプションは、変換不能な文字を無視するように iconv に指示します。
つまり、入力ファイル内でUTF-8には存在するが、Shift-JISに対応しない文字がある場合、それらの文字は変換後のファイルには含まれません。

<font color="Orange">-f utf-8 : </font>このオプションは、入力ファイルのエンコーディングがUTF-8であることを指定します。
-f は「from」の略で、どのエンコーディングから変換するかを示します。

<font color="Orange">-t shift-JIS : </font>このオプションは、出力ファイルのエンコーディングをShift-JISにすることを指定します。
-t は「to」の略で、どのエンコーディングに変換するかを示します。

<font color="Orange"><既存のファイル>.csv : </font>これは変換する元のファイル名を表します。
この部分は、実際のファイル名に置き換える必要があります。

<font color="Orange">> : </font>この記号は、UNIXやLinuxシステムの標準出力のリダイレクトを表します。これにより、iconv によって生成された出力が画面に表示されるのではなく、指定されたファイルに書き込まれます。

<font color="Orange"><変換後のファイル>.csv : </font>これは変換後のデータを保存する新しいファイル名を表します。
この部分も、実際のファイル名に置き換える必要があります。

要約すると、このコマンドは「UTF-8エンコーディングのCSVファイルをShift-JISエンコーディングに変換し、変換不能な文字は無視して新しいファイルに保存する」という操作を行います。
InsightFaceによる顔検出とランドマーク検出の為のサンプルコード

# 世間話
　アイトラッキングを作ろうとしていたところ、とりあえず顔検出の速度が最も早いのはどれだろうか、、、という事でいろいろと試していました。

 　結論から言ってしまうと、`Dlib`の方が様々な面で優れているように思います。情報量や使いやすさはあちらが優れています。
　しかし、この`InsightFace`の大きなメリットとしては、追加で学習データなどをインストールする必要がないところ。
　定量的評価はしていませんが、こちらの方が検出精度が高いかもしれないところなどが挙げられます。

　そしてなにより、このライブラリは顔の特徴量などの検出とマッチングなどがメインのようで、それらが簡単に行えるそうです。
 ↓参考資料
https://nuco.co.jp/blog/article/TbUHF1lK#index_CwYeU8Jc

　とりあえず、ランドマーク検出という「`InsightFace`と`OpenCV`を使う場合のほぼ最小単位での実行の為のサンプルコード」としてお使いください。


# インストール
　今回の`InsightFace`を動かすための前提パッケージなどは以下の通り。
```batch:install
pip install cmake
pip install cython
pip install onnxruntime

pip install insightface
```
　なお`cython`は`onnxruntime`の前にインストールしてください。

  
　また、[公式サイトに示されるバージョン要求](https://github.com/deepinsight/insightface/blob/master/requirements.txt)などは以下の通り。
`Cython>=0.29.28`
`cmake>=3.22.3   ` 
`numpy>=1.22.3`
動かなそうであればこのバージョンに指定してインストールしなおしてください。

　また、`cmake`はVisual StudioやC言語のコンパイラがなければ動かない（インストールできない）場合があります。
　`cmake`にはめちゃくちゃ気を付けてください。

# サンプルコード
　コードは以下の通りです。
　なおこのInsightFaceは一回目の実行時は以降に比べて非常に時間がかかります。
　そもそもで実行に非常に時間がかかるため、不便でした。
 
```python:InsightFace_sample.py
import cv2
import numpy as np
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image


#モデルの読み込み
app = FaceAnalysis()
app.prepare(ctx_id=1, det_size=(640, 640))#ctx_id=0だとCPUを使用。1だとGPUを使用して処理。

capture = cv2.VideoCapture(0)


while True:
    ret, flame = capture.read()

    if(ret == False):
        break

    faces = app.get(flame)

    # 顔の境界ボックスとランドマークを描画
    for face in faces:

        # 顔の境界ボックスを描画
        if face.bbox is not None:
            bbox = face.bbox.astype(int)
            cv2.rectangle(flame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2)

        # ランドマークを描画
        if face.landmark_2d_106 is not None:
            for landmark in face.landmark_2d_106.astype(int):
                cv2.circle(flame, tuple(landmark), 1, (0, 0, 255), -1)
    cv2.imshow('Face Detection', flame)
    if cv2.waitKey(1) & 0xFF == ord('q'):#qキーを押すと終了
        break
```
LPIC-3(300,303)までの　合格体験記

## 取得目的
インフラエンジニアとして内定しており、Linuxについての知識を体系的に学習したいと考えたから.

## 筆者のスペック
大学4年生（24卒）
情報系の学部
応用情報処理技術者試験（2022秋）
LPIC-3(300,303)
LinuC-1（LinuCも何故か受けてしまった）

## 使用した教材
### LPIC-1~3共通
LinuC、LPIのyoutube動画
oracle virtualbox（ubuntu22.04LTS、alumalinux、OPENSUSE）

### LPIC-1
小豆本
スピマス（星３と模試を重点的に）
udemyのuzuzuの動画

### LPIC-2
小豆本
スピマス（星３と模試を重点的に）
学易

### LPIC-3(300,303)
学易のみ
303に関しては学易さんに問い合わせを行うとよいかも

## 学習方法

### スピマス
星３と模試を重点的にやる
答えに載っているコマンド例を打ち込んでみる

### 小豆本
章末問題は気分が乗ったらやる
コマンド例を打ち込んでみる

### 動画教材
LPIやLinuCは構築の例があるのでそれに沿って
ハンズオンしてみると力が着くと思う。
結構充実しているので楽しい

uzuzuは初学者にオススメ

## 学習期間
### LPIC-1
2~3ヶ月
学習方法が確立していなかったので大変なのとそもそもLPIC-1が暗記項目が一番多く、正直つまらないし、大変だった
### LPIC-2
2~3ヶ月
スピマスや学易の的中率が高く割と楽である。
また、ここからサーバのお仕事っぽくなるのでハンズオンも楽しい
### LPIC-3
1ヶ月未満
学易の的中率が高いのとLPIC-2と範囲が被っている部分が多いので学習コストが低い。だからlevel2まで取得できたなら一気にとってもいいかもしれない。
HTML 見だしのデザイン　自分メモ

# デザイン
![スクリーンショット 2024-01-17 17.38.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556584/88a29c51-9593-bedc-027c-7d203db41088.png)


文字を横に並べて見だしを表現するのに次のことを行うことで実装することができる。
H3タグ：横並び,余白の設定,テキストの上下中央揃え
span(numberクラス)タグ:フォントサイズの設定,文字色の設定

# HTML,CSS
```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h3>
        <span class="number">1</span>
        <span>今日もフロントエンド学習！<br/>5時間/日は集中</span>
    </h3>
    <h3>
        <span class="number">2</span>
        <span>明日も元気に継続するぞ</span>
    </h3>
</body>
</html>
```

```style.css
h3 {
    display: flex;
    align-items: center;
    gap: 10px;
}

.number {
    color: #4bed6e;
    font-size: 40px;
    line-height: 1;
}
```
文字の変換

paiza問題集の下記の課題を解きました

>文字列 S と整数 i と文字 c が与えられるので、S の i 文字目を c に書き換えたものを出力してください。

実装しました。コードを公開します。

```python3
str1 = input()
num = len(str1)
array1 = []
for i in range(num):
    c =  str1[i]
    array1.append(c)
data = input()
array2 = data.split(' ')
j = int(array2[0])
char1 = array2[1]
array1[j-1] = char1
ans = ""
for k in array1:
    ans = ans + k

print(ans)     
```
【IBM Security Verify】IBM Security Verify Privilege Vault で複数のSAML IDPを登録する。

# はじめに
以前の記事で、IBM Security Verify Privilege Vaultと、IBM Security VerifyをSAML連携してみました。

[【IBM Security Verify】IBM Security Verify Privilege Vault と SAML連携する](https://qiita.com/fitz/items/953d0e63987d78b55262) で、IDPを１つ登録したときの動作について確認していました。

今回は、IDPを複数登録可能か確認した結果をご紹介させて頂きます。


# SAML IDPを複数登録する

今回は、2つのIDPとして、IBM Security Verifyの環境を2つ使っています。
IBM Security Verify側の設定、および、IBM Security Verify Privilege Vault の設定は以前の記事と同じです。IDPのmetadata.xmlファイルをそれぞれインポートしました。

インポートすると、表示名がIDPのURLになったので見直しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/f707bc5d-13a1-03fa-aea4-9b8ffacb04e7.png)


# Verify Privilege Vaultのログイン画面にアクセスする

ログイン画面にアクセスすると、IDPを選択する画面が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/f2b25210-ad4f-8074-4e11-4f6e63ee22fe.png)


リンクをクリックすると、それぞれのIDPのログイン画面に遷移します。

# 最後に
今回は、IBM Security Verify Privilege Vaultに複数IDPを登録したときの挙動についてご紹介しました。
DockerからLaravelのテストを実行したい

## ■経緯

　自分のメモとして、残します。
　似たようなことで困っている方のためにも！



## ■文法

ターミナル、プロンプト等で以下を実行します。

```bash
docker exec -it コンテナ名 テストコマンド階層 テストファイル名
```



## ■サンプル

/app/vendor/bin/phpunit はデフォルトのphpunitの階層です。
適宜読み替えてください。

```bash
docker exec -it container-name /app/vendor/bin/phpunit /app/tests/Unit/SampleTest.php
　　　　　　　　　　 コンテナ名　　　　　　テストコマンド階層　　　　         テスト名
```
【Laravel, InterventionImage】アップロードする画像の解像度(dpi)を設定する方法

あまり情報がないのでメモ。

画像を高画質印刷するようなアプリケーションを作成したい場合には、アップロード時に画質を高めておきたい。
phpでは画像のアップロード時にデフォルトで解像度(dpi)が96に設定されるため、仮に元画像のdpiが350でも96までダウンしてしまう。

### imageresolutionが便利

imageresolution()
(PHP 7 >= 7.2.0, PHP 8)
https://www.php.net/manual/en/function.imageresolution.php

↓dpiを350に設定したい場合

```php

    $image_data = request()->file('image');
    $image = Image::make($image_data->getRealPath());

    //GDオブジェクトを引数に指定、第二引数には設定したいDPI値
    imageresolution($image->getCore(), 350);
    
    $image->save($image_path, 100);

```
【Kotlin】リストの要素を結合して１つの文字列に

リストの要素を、指定した区切り文字で結合させる方法を以下に記載する。


```kotlin:Kotlinの実装
val freewordList = mutableListOf("a","b","c")
val separator = " "
val freeword = freewordList.joinToString(separator)
println(freeword)
```

```:出力結果
a b c
```

※要素の数が１つの場合でも使用は可能
```kotlin:要素の数が１つの場合
val freewordList = mutableListOf("a")
val separator = " "
val freeword = freewordList.joinToString(separator)
println(freeword)
```

```:出力結果
a
```
Kubernetes Pythonクライアントに触れてみる

# 1.はじめに
pythonにてコマンドプロンプトでコマンドを入力し，kubernetesに関する情報取得することを目的としてKubernetes Pythonクライアントに触れてみました．
# 2.Kubernetesとは
Kubernetes（通常 "k8s" と略される）は、コンテナ化されたアプリケーションのデプロイメント、スケーリング、および管理を自動化するためのオープンソースのシステムです。Googleによって開発され、Cloud Native Computing Foundation (CNCF) に寄贈されたこのプラットフォームは、現在最も人気のあるコンテナオーケストレーションツールの一つです。
# 3.準備
実際に触るにあたってインストールが必要となるのでpipを使用して以下のコマンドを実行します．そうするとkubernetesのAPIの使用が可能になります．
```ruby
pip install kubernetes
```
# 4.実際に触ってみる．
自分が実際に実装したプログラムを応用例として表示します．
```ruby:get_pod_information.py
from kubernetes import client, config, stream

# Kubernetesクラスタへの接続
config.load_kube_config()

# Kubernetes APIの初期化
v1 = client.CoreV1Api()

# 全てのネームスペースのPodのリストを取得
pods = v1.list_pod_for_all_namespaces(watch=False)

storage_info = None

for pod in pods.items:
    if pod.metadata.namespace != "kube-system":
        try:
            # コンテナ内で df コマンドを実行し、ストレージ使用量を取得
            command = ['df', '-h']
            resp = stream.stream(v1.connect_get_namespaced_pod_exec, pod.metadata.name, 
                                 pod.metadata.namespace, command=command, 
                                 stderr=True, stdin=False, stdout=True, tty=False)
            
            # '/var'を含む行からストレージ情報を取得
            for line in resp.split('\n'):
                if '/var' in line:
                    parts = line.split()
                    if len(parts) >= 6 and not storage_info:
                        # 最初に見つかったストレージ情報を保存
                        storage_info = f"{parts[1]}  {parts[2]}  {parts[3]}  {parts[4]}"
                        nfs_size = parts[1]
                        break
        except Exception as e:
            print(f"Error executing command in pod {pod.metadata.name}: {e}")
        if storage_info:
            # 最初に見つかったストレージ情報があればループを終了
            break

# NFS-Storage情報を出力
if storage_info:
    print("NFS-Storage")
    print("Size  Used Avail Use%")
    print(storage_info)
else:
    print("NFS-Storage情報が見つかりませんでした。")
```
実行すると
```ruby:実行結果
$ python3 get_pod_information.py
Pod: c0a21115-sql-b-548559cb6-6fglv
 Size: 0.4G
 CAPACITY: 4.0Gi
Pod: c0a21115-wp-a-794d76c58b-fgqbk
 Size: 1.8G
 CAPACITY: 4.0Gi
Pod: c0a21115-wp-b-5ccd59dd47-kg88x
 Size: 1.8G
 CAPACITY: 4.0Gi
Pod: c0a21115-sql-a-5444567d48-92zjk
 Size: 0.4G
 CAPACITY: 4.0Gi
```
get_pod_information.pyでは取得したPodのストレージ使用量とそのPodに紐づくPVCを表示しています．このように値を取得することでストレージの使用状況の把握が容易になりました．
今回はclient, config, streamを使用したが他にもあるのでいろいろと試してみると面白いかもしれません．
Next.jsをVercelにデプロイするとType error: Module '"@prisma/client"' has no exported member '***'.エラーが出る

# はじめに
Next.jsをVercelにデプロイしたらエラーが出たので解決方法を書きます。

# 問題
Next.jsのプロジェクトをVercelにデプロイした際に下記のようなエラーが発生しました。
```:VercelのDeploymentタブのログ
Type error: Module '"@prisma/client"' has no exported member 'Todo'.
> 1 | import { PrismaClient, Todo } from '@prisma/client'
    |                        ^
  2 | import { NextResponse } from 'next/server'
  3 |
  4 | const prisma = new PrismaClient()
Error: Command "npm run build" exited with 1
```

# 解決方法
Prismaの型である`Todoが`見つけられないのが原因みたいです。

`package.json`のbuildコマンドを下記のように修正したらエラーがなくなりました。

```diff_json:package.json
"scripts": {
"dev": "next dev",
- "build": "next build",
+ "build": "prisma generate && prisma migrate deploy && next build",
"start": "next start",
"lint": "next lint"
},
```

# おわりに
また一歩前進
# 参考にしたサイト

https://github.com/orgs/vercel/discussions/3494
L2SWとL3SWの違いは？

# L2SWとL3SWの違いは？

ネットワーク技術において、L2SW（レイヤー2スイッチ）とL3SW（レイヤー3スイッチ）の違いを理解することは重要である。ここでは、これらの違いを定量的に分かりやすく説明する。

## L2SW（レイヤー2スイッチ）

L2SWは、データリンク層で機能するデバイスで、以下の特徴を持つ。

- **データ転送**: MACアドレスに基づく。
- **通信範囲**: 同じネットワークセグメント内。
- **主な機能**: フレームの転送とフィルタリング。
- **適用場所**: ローカルエリアネットワーク（LAN）など。

### 定量的な特徴

- **処理能力**: 平均的なパケットサイズが256バイトの場合、約10Gbpsの処理能力を持つ。
- **MACアドレステーブル数**: 最大で16,000～32,000程度のMACアドレスを保持可能。
- **遅延時間**: 遅延時間は非常に短く、10μ秒未満が一般的。

L2スイッチは、簡単な構造と低コストで、小規模ネットワークに適している。

## L3SW（レイヤー3スイッチ）

L3SWは、ネットワーク層で動作するデバイスで、以下の特徴を持つ。

- **データ転送**: IPアドレスに基づく。
- **通信範囲**: 異なるネットワークセグメント間。
- **主な機能**: ルーティングと高度な管理機能。
- **適用場所**: ローカルエリアネットワーク（LAN）など。: 大規模な企業ネットワークや複雑な環境。

### 定量的な特徴
- **処理能力**: パケット転送に追加の処理が必要なため、一般的には約1Gbpsの処理能力。
- **MACアドレステーブル数**: ルーティングテーブルを使用し、大量のエントリ（10万～100万程度）を管理可能。
- **遅延時間**: ルーティング処理を行うため、遅延時間が長くなり、数十～100μ秒程度が一般的。

L3スイッチは、ルーティング機能とセキュリティオプションを提供し、大規模ネットワークに適している。

### 予算コスト
- **L2SW**: 基本的な機能のため、コストは比較的低く、1ポート当たり約$100から。
- **L3SW**: 高機能のため、コストは高く、$500以上が一般的。冗長化構成の場合、さらにコストが高くなる。

### 結論
L2SWはネットワーク内の高速データ転送に特化し、L3SWは異なるネットワークセグメント間の通信と高度なネットワーク管理を実現する。選択はネットワークの規模、構造、および特定のニーズに基づいて行うべきである。小規模または単純なネットワークではL2スイッチが適しているが、大規模かつ複雑なネットワークではL3スイッチの利点が生かされる。これにより、効率的かつコスト効果の高いネットワーク環境の構築が可能になる。
Databricksのデータを用いたLlamaIndexの活用

こちらの続きです。前回は動かしただけですが、今回はDatabricksのUnity Catalogに格納されているドキュメントデータを使ってRAGを動かしてみます。

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

ドキュメントを見ていたらデータベースからのローダーがあることを知りました。SQLAlchemyが背後で動いているとのこと。

[Database Loader](https://llamahub.ai/l/database)

そして、SQLAlchemy経由でDatabricksにアクセスできます。

https://docs.databricks.com/ja/dev-tools/sqlalchemy.html

これらを組み合わせてUnity Catalogのデータを使ってRAGを動かしてみます。

今回使うデータは、こちらで分析した[自分のQiitaの記事](https://qiita.com/taka_yayoi/items/a7aafb8585bd3922c947)です。
![Screenshot 2024-01-17 at 16.02.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7cde521a-6231-50d1-c682-84f52be2adfa.png)
![Screenshot 2024-01-17 at 16.02.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1d1f5a35-ad73-c1c9-75aa-7b19123d451c.png)

`takaakiyayoi_catalog.qiita_2023.taka_qiita_2023`というテーブルの`body`の列にテキストが入っています。

テーブルにアクセスするクラスターの以下の情報をメモしておきます。

- サーバーのホスト名
- HTTPパス

ノートブックでロジックを実装していきます。

ライブラリのインストール。

```py
%pip install -U llama-index
%pip install "databricks-sql-connector[sqlalchemy]"
dbutils.library.restartPython()
```

```py
from llama_index import download_loader
from llama_index.utilities.sql_wrapper import SQLDatabase

DatabaseReader = download_loader('DatabaseReader')

access_token    = dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiToken().getOrElse(None)
server_hostname = "<サーバーのホスト名>"
http_path       = "<HTTPパス>"
catalog         = "takaakiyayoi_catalog"
schema          = "qiita_2023"

reader = DatabaseReader(
    sql_database = SQLDatabase.from_uri(f"databricks://token:{access_token}@{server_hostname}?" +
        f"http_path={http_path}&catalog={catalog}&schema={schema}")
)
```

テーブルからドキュメントを読み込みます。

```py
query = f"""
SELECT
    body
FROM takaakiyayoi_catalog.qiita_2023.taka_qiita_2023
"""

documents = reader.load_data(query=query)
```

インデックスを作成します。

```py
import os
os.environ["OPENAI_API_KEY"] = dbutils.secrets.get("demo-token-takaaki.yayoi", "openai_api_key")

from llama_index import VectorStoreIndex, SimpleDirectoryReader

index = VectorStoreIndex.from_documents(documents)
```

問い合わせます。

```py
query_engine = index.as_query_engine()
response = query_engine.query("どのような記事が書かれていますか？")
print(response)
```

> 記事は、Apache Sparkに関する機能説明やチュートリアル、Koalasの紹介、データフレームの操作方法、機械学習のチュートリアルなど、さまざまなトピックに関するものがあります。また、Apache Sparkの新機能やアプリケーション開発、データ処理、可視化、ストリーミングなどについても取り上げられています。

おおー！

```py
response = query_engine.query("Databricksにおける大規模言語モデルに関してはどのようなことが書かれていますか？")
print(response)
```

> Databricksにおける大規模言語モデルに関しては、セマンティック検索という機能が紹介されています。セマンティック検索は、自然言語および言語の意味を加味した検索を行うものであり、Unity Catalogのテーブルのメタデータを対象としています。現時点では、テーブル内のデータは検索されません。また、Databricksでは日本語でも自然言語による検索がサポートされており、列数の多いテーブルなどの検索も可能です。

自分で記事を書いているので分かるのですが合ってます。面白い。もっといじってみます。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Gitにプッシュしたら、サーバー側で自動プルされるようにした

# サーバーへのデプロイ
### 現状
GithubへPush -> サーバー側でPull -> 自動リコンパイル

の流れで開発中のアプリケーションを実行していましたが、毎回毎回サーバーに繋いで`Pull`するのはめんどくさいです。

### 目標
GithubへPush -> サーバー側で自動Pull -> 自動リコンパイル
の流れにし、手動の作業はGithubへの`Push`だけにしたいと思います。


# 使うもの
## Github
プロキシサーバーの443に向けてGithubからWebhookを送信するように設定し、プロキシサーバーからデプロイサーバーに向けてリバースプロキシでWebhookを転送します。

## プロキシサーバー
### Nginx
いつものごとく、Githubから`https://webhook.example.com`に飛んでくるWebhookを`http://192.168.1.x:5000`にプロキシします。

## デプロイサーバー
### Flask
Nginxから飛んできたWebhookでイベントを発火させ、サブプロセスで`git pull`をするのに使います。

# 設定
## Github
リポジトリ -> Settings -> Webhooksの`Add Webhook`でトリガーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/21d62568-68de-ede2-b347-f8a9d5d05f0c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532025/dde01884-cf8d-7fcd-8427-b581bb354d5d.png)

 `Payload URL`にプロキシサーバーのアドレスを設定し、イベントトリガーを`Just the push event`にします。

 ## Nginx (リバースプロキシ)
デプロイサーバーへのプロキシ設定と、GithubのIPアドレスからのアクセスのみ受け付ける設定をします。
 
 ``` nginx.conf
#~~~~~~~~~~~~~~~~~~~~~~
server {
   listen 443 ssl;
   listen [::]:443 ssl;
   server_name webhook.example.com;
   add_header Strict-Transport-Security 'max-age=15552000';

   ssl_certificate /etc/letsencrypt/live/webhook.example.com/cert.pem;
   ssl_certificate_key /etc/letsencrypt/live/webhook.example.com/privkey.pem;

   include /etc/nginx/allowed-address.conf;
   deny  all;

   location / {
      proxy_set_header Host $host:$server_port;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-Host $server_name;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto https;
      proxy_redirect  http://  $scheme://;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_pass http://YOUR_DEPLOY_SERVER:5000/;
   }
}
 
#~~~~~~~~~~~~~~~~~~~~~~
 ```

 `/etc/nginx/allowed-address.conf`にGithubのアドレスを追加します。
 GithubからのWebhookで使用されるIPアドレスは、Github APIの[/metaエンドポイント](https://api.github.com/meta)の`hooks`にあります。

``` allowed-address.conf
allow 192.30.252.0/22;
allow 185.199.108.0/22;
allow 140.82.112.0/20;
allow 143.55.64.0/20;
allow 2a0a:a440::/29;
allow 2606:50c0::/32;                      
```

## Flask (デプロイサーバー)
Webhookを受け取ったら、`subprocess`で`git pull`を実行するだけのスクリプトです。

``` main.py
from flask import Flask, request, abort
import subprocess
app = Flask(__name__)

@app.route("/", methods=["POST"])
def webhook():
    if request.method == "POST":
        subprocess.run("git pull", shell=True, cwd=r"EXECUTION_DIR")
        print("ok")
        return "success",200
    else:
        abort(400)
if __name__ == "__main__":
    app.run(host="0.0.0.0")
```
wget on mac

wgetを使う必要がありそうだったのでメモ

## 使う前に注意事項

インストール方法と、サーバーに負荷をかけたりしないよう必要最低限のオプションをつけておく方法

* [Wgetを使った自動ダウンロード法](https://www.dh.ku-orcas.kansai-u.ac.jp/?p=502)

## たくさんあるオプション

* [wgetのオプション情報（日本語訳）](https://www.youfit.co.jp/archives/2208)

## 例

```
wget -np -r -p -l 1 -w 10 -limit-rate=20k -m -tries 10 URL
```

## IDとパスワードいる場合

```
wget -np -r -p -l 1 -w 10 -limit-rate=20k -m -tries 10 http://id:pass@host/path
```
## nofollowがついてたり、画像のみとりたい場合

```
wget -np -r -p -l 1 -w 10 -limit-rate=20k -m -tries 10 -e robots=off -A jpg,png,gif URL
```
Gitコマンド打つのをちょっとでも楽にしたい[Git エイリアス]

# はじめに

ブランチを変えようとした時にコマンドを打ちました。

```$ git chekcout hoge_branch```

Enterをクリック。

```
git: 'chekcout' is not a git command. See 'git --help'.

The most similar command is
        checkout
```

・・・タイポしてた😩

みたいな経験ありませんか？？

僕はよくありましたし、checkoutなんて割と使うのに打つのめんどくさいなと思ってます。

こんな時におすすめなのが、***エイリアス***というものです。

この記事を読んで「checkout」は「co」って打てば動くようにしちゃいましょ！

# Gitエイリアスとは

Gitコマンドの短縮形またはカスタマイズされたコマンドを定義する機能です。

これにより、長いコマンドや頻繁に使用するコマンドを短いキーワードで実行することができます。

Gitエイリアスは、Gitの設定ファイル（通常はユーザーのホームディレクトリにある.gitconfigファイル）に設定されます。

# 設定方法

```
$ git config --global alias.co checkout
```

上記コマンドをターミナルにコピペしてください。

これだけで今までcheckoutと打っていたのがcoで済みます☺️

簡単ですよね✌️

推奨しませんが、coの部分は自由に設定出来るのでcだけにも出来たりします。

他にも自分は

```
$ git config --global alias.b branch
$ git config --global alias.cm commit
$ git config --global alias.st status
```
と他のコマンドも設定しています。

もう少し複雑なので言うと、特定のコミット名でコミットを作ることが自分はあるので、

```
$ git config --global alias.cmrc 'commit -m 'rubocop修正''
```

と設定して```git cmrb```でコミットを作成したりしてます。

# 最後に

コマンド以外にも設定ファイルに直接書き込む方法もありますが、[こちらの記事](https://qiita.com/chihiro/items/04813c707cc665de67c5)を見つけたので今回は自分が書くのは省略しました。

今回の記事の内容に関して、詳しくは[Gitドキュメント](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9)を見てもらえればと思います。

皆様が快適なGitコマンド操作が出来る事を願っています😀
拡大縮小

```
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Zoomable Scrollable Div with Buttons</title>
  <style>
    #zoomableDiv {
      width: 300px;
      height: 300px;
      border: 1px solid #ccc;
      overflow: auto;
    }

    #content {
      width: 1000px; /* 大きなコンテンツ */
      height: 1000px;
      transition: transform 0.3s ease-in-out;
    }

    .zoomButton {
      cursor: pointer;
      margin: 5px;
    }
  </style>
  <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
</head>
<body>
  <div id="zoomableDiv">
    <div id="content">
      <!-- ここに拡大縮小したいコンテンツを配置 -->
      <p>This is zoomable and scrollable content.</p>
    </div>
  </div>

  <button class="zoomButton" onclick="zoomIn()">Zoom In</button>
  <button class="zoomButton" onclick="zoomOut()">Zoom Out</button>

  <script>
    var scale = 1;

    function zoomIn() {
      scale += 0.1;
      updateTransform();
    }

    function zoomOut() {
      scale -= 0.1;
      updateTransform();
    }

    function updateTransform() {
      // 最小と最大の拡大率を制限（お好みで変更可能）
      scale = Math.max(0.5, Math.min(2, scale));

      // transformプロパティを使用して拡大縮小
      $('#content').css('transform', 'scale(' + scale + ')');
    }
  </script>
</body>
</html>
```
【Rails】rubyXLを使って別途用意したエクセルファイルを出力する機能を作成

### railsで別途用意したエクセルファイルを出力する機能を作成したので、備忘録用に簡単にまとめる。
rubyXLは初めて使い、エンジニア歴も浅いため至らないコードもあるかと思いますが、参考程度になればと思います。

## 環境
rubyのバージョン
`ruby 2.7.2p137`
railsのバージョン
`Rails 6.0.3.4`
rubyXLのバージョン
`rubyXL (3.4.25)`

## Gemfileのインストール
まずはrubyXLをインストールします。
```ruby:Gemfile
gem 'rubyXL'
```
```
$ bundle install
```

## MIMEタイプの登録
下記設定を追記しないとエクセル出力した際にエラーが発生する。
`To respond to a custom format, register it as a MIME type first: https://guides.rubyonrails.org/action_controller_overview.html#restful-downloads. If you meant to respond to a variant like :tablet or :phone, not a custom format, be sure to nest your variant response within a format response: format.html { |html| html.tablet { ... } }`
というエラーが発生する。
「カスタムフォーマットに対応するために、まずそれをMIMEタイプとして登録してください」という内容
```ruby:config/initializers/mime_types.rb
Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx ## この行を追記する
```

## serviceクラスを作成していきます。
わざわざクラスをわけるほどではないかもしれませんが、ここからソースコードが複雑になることを想定しています。
``` ruby:app/services/excel_generator.rb
class ExcelGenerator
  def generate_excel
    template_path = Rails.root.join('public', 'files', 'template.xlsx') # 別途用意したエクセルファイルを配置し、そのパスを記述します。
    workbook = RubyXL::Parser.parse(template_path) # ここで配置してあるエクセルファイルを元にWorkbookオブジェクトを作成

    workbook # 呼び出し元へworkbookを返す
  end
end
```

## Controller
コントローラーを作成します。
```
$ rails g controller excel_controller
```
``` ruby:excel_controller.rb
class ExcelController < ApplicationController
  require 'rubyXL'
  
  def generate
    excel_generator = ExcelGenerator.new # 一つ前で作成したクラスからオブジェクトを作成
    workbook = excel_generator.generate_excel # generate_excelでworkbookを作成

    respond_to do |format|
      format.xlsx do
        send_data workbook.stream.string, filename: 'example.xlsx', type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', disposition: 'attachment' # エクセルファイルを出力
      end
    end
  end
end
```

## ルーティング設定。
```ruby:routes.rb
get 'excel/generate', to: 'excel#generate', as: 'generate_excel', defaults: { format: :xlsx }
```

## viewに出力ボタンを作成。
```ruby:test.html.erb
<%= link_to 'クリックするとエクセルファイルを出力します', generate_excel_path, class: 'XXXXX' %>
```

## 
これで別途用意したエクセルファイルを出力することができます。
今回はただ単に出力するだけですが、ここからエクセルにデータを書きこんでいくことも可能です。
また、改善点などありましたらアドバイスを頂けますと幸いです。
記事も随時更新したいと思います。
画像表示

```
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Display Selected Image</title>
  <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
</head>
<body>
  <input type="file" id="imageInput" accept="image/*">
  <img id="selectedImage" alt="Selected Image">

  <script>
    $(document).ready(function() {
      $('#imageInput').on('change', function(e) {
        var file = e.target.files[0];
        
        // 新しい Image オブジェクトを作成
        var img = new Image();

        // ファイルを読み込み、読み込み完了時に画面に表示
        img.onload = function() {
          $('#selectedImage').attr('src', img.src);
        };

        // 選択されたファイルを読み込む
        img.src = URL.createObjectURL(file);
      });
    });
  </script>
</body>
</html>
```
Gemini pro visionで画像読み込もうとしてエラーTypeError: Could not create `Blob`, expected `Blob`, `dict` or an `Image` type(`PIL.Image.Image` or `IPython.display.Image`).

## 問題

Gemini　Pro Visionで画像を読み込もうとしたら
下記エラーが表示された
```
TypeError: Could not create `Blob`, expected `Blob`, `dict` or an `Image` type(`PIL.Image.Image` or `IPython.display.Image`).
```


## 解決方法

```
from IPython.display import Image
img = Image(image_path)
```

## 原因というかもともとのコード

```
img = PIL.Image.open(image_path)
img
```

## メモ

PILで画像を読み込んでいた
PILというかpillowというかよくわかってない顔

IPython.display を利用するとうまく読み込めた
Teamsの最近のチャット一覧をcsvにまとめる

# 背景
Teamsチャットが盛んに活用されてるもののよく「どのチャットだっけ？」って迷子になる。チャットへの直リンク取得してメモしたりしたいがブラウザ版Teamsを起動しないといけなかったりで面倒。ということでワンタッチで最近のチャット一覧（各チャットへのリンク含む）を取得するフローを作成してみました。

# 方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/5f56ad44-87ff-67ce-4fab-c9a47a03fbb3.png)
からの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/dccecb5e-a9b1-370e-ceeb-5efc9af1af22.png)
で、Create_CSV_tableの出力をコンテンツに指定してメールで送るなりOneDriveに保存するなりでOKですが、日本語が文字化するので[こちら](https://zenn.dev/karamem0/articles/2020_09_30_120000)で説明されている通り、
```
concat(decodeUriComponent('%EF%BBEBF'),body('Create_CSV_table'))
```
にする必要有り。

また、チャットへのリンクは[こちら](https://learn.microsoft.com/ja-jp/microsoftteams/platform/concepts/build-and-test/deep-link-teams#deep-links-to-navigate-to-chat-messages)記載の通りだが、`{messageID}`を省略した下記の形でOK。
```
https://teams.microsoft.com/l/message/{chatId}/?tenantId=<tenantId>?context={"contextType":"chat"}
```

# 所感
最初はExcelとかSharepointのコネクタでApply to eachで1行ずつ書き込んで、みたいなことしようとしてましたがテストしたらめちゃくちゃ遅く、最終的にこの方法に落ち着きました。２秒以内くらいで処理完了してくれて快適です。
(リンクだけです)「Methods of computing square roots,extraction of cubic root）(開平法,開立法)」を調べた。√13

・web 英語版を探しています。
・web 開立法を探しています。

# 実行例　√13
音と色と数の散歩道 様より

http://k-ichikawa.blog.enjoy.jp/etc/HP/js/SqrtExt/sqr.html

```
-------------------------------
[3] 13 -->  0.13 x 10^2
-------------------------------
        . 3 6 0 5 5
   3    .13
1: 3      9
   66     400
2:  6     396
   720      400
3:   0      000
   7205     40000
4:    5     36025
   72105     397500
5:     5     360525

  : 3.6055
-------------------------------
[2] 13 -->  0.13 x 10^2
-------------------------------

  : 3.6055
```

√13
3.60555127546

https://www.google.com/search?q=%E2%88%9A13&oq=%E2%88%9A13&gs_lcrp=EgZjaHJvbWUyDggAEEUYJxg5GIAEGIoFMgYIARAGGEAyBggCEEUYPDIGCAMQRRhBMgYIBBBFGEEyBggFEEUYQTIICAYQRRgnGDsyBwgHEAAYgAQyBwgIEAAYgAQyBwgJEAAYgATSAQg0NDI0ajBqN6gCALACAA&client=ms-android-huawei&sourceid=chrome-mobile&ie=UTF-8

√13
3.6055512754639892931192212674704959462512965738452462127104530562...

https://www.wolframalpha.com/input?i=%E2%88%9A13


# 参考



https://mltanaka.com/%e7%ad%86%e7%ae%97%e3%81%ab%e3%82%88%e3%82%8b%e9%96%8b%e5%b9%b3%e8%a8%88%e7%ae%97%e3%81%ae%e8%87%aa%e5%8b%95%e5%8c%96/

開平法を考えた人は誰ですか？
百川治兵衛こそが日本で始めて開平法・開立法を理解した和算家なのである(平山[1, p. 62]，鈴木武雄[2, pp. 15-16])．

[百川治兵衛 wikipedia](https://www.google.com/search?q=%E7%99%BE%E5%B7%9D%E6%B2%BB%E5%85%B5%E8%A1%9B+wikipedia+&sca_esv=599042207&rlz=1CAUHAM_enJP1089&sxsrf=ACQVn0-ffyKhlfzSTskpy65tvUroaQcomw%3A1705471725511&ei=7W6nZf_mHtPM2roPkaGMwAE&ved=0ahUKEwi_kf6i4eODAxVTplYBHZEQAxgQ4dUDCBA&uact=5&oq=%E7%99%BE%E5%B7%9D%E6%B2%BB%E5%85%B5%E8%A1%9B+wikipedia+&gs_lp=Egxnd3Mtd2l6LXNlcnAiGueZvuW3neayu-WFteihmyB3aWtpcGVkaWEgMgUQIRigATIFECEYoAFIizlQQ1iyNnADeACQAQCYAZECoAGtEKoBBjEuMTQuMbgBA8gBAPgBAcICCBAAGIAEGLADwgIIEAAYgAQYogTCAggQABiJBRiiBMICBhAhGAoYKuIDBBgBIEGIBgGQBgE&sclient=gws-wiz-serp#ip=1)

[Methods of computing square roots python](https://www.google.com/search?q=Methods+of+computing+square+roots+python&rlz=1CAUHAM_enJP1089&oq=Methods+of+computing+square+roots%E3%80%80python+&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIKCAEQABiABBiiBDIKCAIQABiABBiiBDIKCAMQABiABBiiBNIBCDgwOTlqMGo3qAIAsAIA&sourceid=chrome&ie=UTF-8#ip=1) google検索

# wikipedia 

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

開立法
他言語版はまだありません。追加しますか？

#### 日本語で

https://ja.wikipedia.org/wiki/%E9%96%8B%E5%B9%B3%E6%B3%95

https://ja.wikipedia.org/wiki/%E9%96%8B%E7%AB%8B%E6%B3%95

# 過去問内部検索　(開平法)
・2024/01/17 現在

「大学入試数学問題集成」様 サイト内
一致する結果はありません

site://kamelink.com 開平法 に一致する情報は見つかりませんでした。

site://mathmathmass.exblog.jp 開平法 に一致する情報は見つかりませんでした。

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)
一般人のパートナーがTwitter(X)のパスワードリセットを用いて鍵アカウントへ不正アクセスできるか検証してみた


## 結論

Twitter(X)に2段階認証をかけて、スマホのロックを固めておけば大丈夫。

個人情報が奪われて困る状況の場合は、顔認証や指紋認証はオススメできない。

共有パソコンのGmailなどはログアウトしておく。

2段階認証アプリを起動時にパスワード入力を求めるものにすることもオススメ。

※FBIやスーパーハッカー等に狙われる可能性は今回考慮していません。

※筆者家族は幸せです。危ないパートナーはいません。

### 何を検証するか？

専門的なITの知識がない一般人が、主にTwitter(X)のパスワードリセットを用いてパートナーのアカウントを無理やりのぞき見ることは可能かを検証します。

### ユースケース

様々な人生の節目で、パートナーに自分の個人情報をあさられてしまい嫌な思いをしている時の対策

### 攻撃の流れ

①ログアウトした状態でTwitter（X）のログインを押す
![スクリーンショット 2024-01-17 140420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636207/4f9e608a-51a5-b0f8-8b8d-f00c1185a356.png)

②パスワードを忘れた場合はこちらを押す
![スクリーンショット 2024-01-17 140430.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636207/7feef219-8b74-157c-0a72-cf5ef8dd5b65.png)

③不正アクセスしたいアカウントを入力する
![スクリーンショット 2024-01-17 140444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636207/5ced0622-c706-b905-6fe0-92699dc6af40.png)

④アカウント作成時に登録したメールアドレスに確認コードが送信される
![スクリーンショット 2024-01-17 140501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636207/e4197b78-0752-e51b-bb86-4899c24eaecd.png)

⑤パスワードリセットメールに書かれている確認コードを入力する
![スクリーンショット 2024-01-17 142707.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636207/70557954-1887-9c8d-49e2-fd4c3a5f6275.png)

※ここでパートナーのメールがのぞけなければ攻撃失敗

⑥（スクショ忘れ）パスワードを更新する。

⑦2段階認証のコード入力を求められる
![スクリーンショット 2024-01-17 142756.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636207/86f58c80-81e1-a4c1-3c05-5090b2178f01.png)

※ここでパートナーの2段階認証コードにアクセスできなければ攻撃失敗

### 防御方法

効果の高い順に紹介します。

対策1：スマホの顔認証、指紋認証をオフにして難しいパスコードを設定する。離席時には画面ロックを徹底する。

効果：根本的な対策を行うことができます。画面ロックが解除されているスマホをパートナーが手にすれば、パスワードリセットに関係なく鍵アカウントへのアクセスが可能です。また、パスワードリセットメールや2段階認証コードへアクセスされる可能性が高まります。パートナーに不正アクセスされる恐れがある場合は、絶対に強力なロックをかけることを推奨します。

対策2：普段使いする端末以外ではGmail等のメールアプリからログアウトする。

効果：例えば共用パソコンにはパスワードでロックをかけていなかったり、パートナーも知っているパスワードをかけているケースがあるはずです。その場合共用パソコンからメールをのぞき見られることで、パスワードリセットのための確認コードにアクセスされる可能性があります。必ずログアウトしましょう。その後は対策1を徹底することで、普段使いの端末からメールにアクセスされることを防ぎます。

対策3：2段階認証アプリを導入する（起動時パスワード確認されるものを推奨）

効果：パスワードリセットのための確認コードが書かれたメールを見られたとしても、2段階認証コードが漏洩しなければ鍵アカウントへ不正アクセスすることはできません。対策1を徹底し、スマホのロックは絶対に外した状態にしないようにしましょう。2段階認証アプリにも、起動時にパスワード入力を求めるものがありますので、併用することをオススメします。

例えばMicrosoft社のAuthenticatorならアプリ起動時にパスワードや顔認証を求めることができます。

### 最後に

不正アクセス、ダメ、絶対！！

犯罪です！！
YouTube動画をダウンロード保存する環境の構築

# 概要

YouTube動画をダウンロード保存したくなった場合に、自前でそれを行える環境を用意できるよう、手順をまとめました。ダウンロードには yt-dlp を使っています。特に珍しくはないと思います。

## Python 3 環境を構築します
Linuxベースが無難と思います。当方 Ubuntu 20.04.5 LTS を使いました。Windows等では試していません。

既存の Python 環境を汚さないで Python 3 環境を構築するため、pyenv をインストールします。
```
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```
pyenv をシェルで使えるようにするため、次の設定3行を ~/.bashrc に追記します。
```bash:~/.bashrc 末尾に追記
export PYENV_ROOT="${HOME}/.pyenv"
export PATH="${PYENV_ROOT}/bin:${PATH}"
eval "$(pyenv init --path)"
```
再ログインするとシェルで pyenv が使えるようになります。
```
$ pyenv versions
* system
```
pyenv を用いて Python 3 環境をダウンロード構築します。
```
$ pyenv install 3.12.1
$ pyenv global 3.12.1
$ pyenv versions
  system
* 3.12.1 (set by /home/myname/.pyenv/version)
```
これで Python 3 環境をホームディレクトリ以下へ構築できました。

## Python の yt-dlp モジュールを pip でインストールします

次の1行を実行するだけです。
```
$ pip install yt-dlp
```

## ダウンロード保存プログラムを作成します

次のコードを download_youtube_movie.py として保存します。このプログラムは、引数で与えられた YouTube 動画URL に対して yt-dlp を使ってダウンロードし .mp4 として保存します。例として、YouTube 動画URLが「 https://www.youtube.com/watch?v=AbCdEfGh123 」である場合、保存先ファイル名は AbCdEfGh123.mp4 になります。

```python:download_youtube_movie.py
import sys
from yt_dlp import YoutubeDL

def movie_get(urls):
    options = {
            'outtmpl': '%(id)s' + '.mp4',
            'format': 'best'
            }
    with YoutubeDL(options) as ydl:
        ydl.download([urls])

if len(sys.argv) < 2:
    print("Usage: python download_youtube_movie.py <youtube_url>")
    sys.exit(1)

youtube_url = sys.argv[1]
movie_get(youtube_url)
```

## ダウンロード一括実行スクリプトを作成します

次のスクリプトを run_download.sh として保存します。このスクリプトは、引数で与えられたURL一覧ファイルから1行ずつURLを読み込んで、それぞれについて前述の download_youtube_movie.py を実行します。YouTube 負荷を軽減するため sleep 5 を入れています。

```bash:run_download.sh
#! /bin/bash

URLFILE=$1
if [ ! -r ${URLFILE} ] ; then
        echo "Usage: $0 <URL file>"
        exit 1
fi

for ELINE in `cat ${URLFILE}` ; do
        echo -n "${ELINE} ... "
        ~/.pyenv/shims/python ./download_youtube_movie.py ${ELINE}
        if [ $? = 0 ] ; then
                echo "[OK]"
        else
                echo "[ERROR]"
        fi
        sleep 5
done
```
実行権限を与えておくと起動しやすいです。
```
$ chmod +x run_download.sh
```

## ダウンロードURL一覧ファイルを作成します

ダウンロードしたい YouTube 動画のURLを1行に1つずつ書いたファイルを用意します。次は単なる例です。
```text:myurls.txt
https://www.youtube.com/watch?v=AbCdEfGh123
https://www.youtube.com/watch?v=IjKlMnOp456
https://www.youtube.com/watch?v=QrStUvWx789
```

## ダウンロード一括実行スクリプトを実行します

```
$ ./run_download.sh ./myurls.txt
```

以上です。

_Have a happy YouTube life!_
Amazon RDS for Db2がGA


# Db2がAWSのマネージド・サービスとして提供開始

([日本IBM 2023/12/5 ニュース](https://jp.newsroom.ibm.com/2023-12-05-IBM-Collaborates-with-AWS-to-Launch-a-New-Cloud-Database-Offering)より引用）

2023年11月27日のAWS re:Invent 2023 (USで開催されたAWS最大級のイベント)で、Amazon Relational Database Service (Amazon RDS) for Db2のリリース（GA）が発表されました。

RDS for Db2はフルマネージドのクラウド・サービスで、AIワークロードを含めたハイブリッドクラウド環境のデータ管理・活用を容易にします。加えて、GA時点から**AWSの東京・大阪のリージョン**で稼働します。


これまでAWS上では分析ワークロードに特化したDb2 Warehouseが提供されていましたが、基幹系・トランザクション系のミッション・クリティカルなワークロードの場合にはIDb2のソフトウェア・ライセンスをAWSに持ち込んでEC2などの上に構築する方式しか取れませんでした。

今回の発表により、現在オンプレなどで基幹系・トランザクション系のワークロードでDb2をご利用いただいているお客様に対して、モダナイズやクラウド移行の際に新しい有力な選択肢を提供できます。

RDS for Db2を利用すれば、お客様は数クリックで、スケール可能なコンピュートやストレージ、バックアップ/リストア、高可用性、高度なセキュリティなどを兼ね備えたDb2をすぐに簡単に使用開始できます。



# AWSにおけるDb2の選択

AWS上で稼働するDb2 for Linux, Unix and WIndowsは、複数のデプロイメント方式で利用可能であり、今回のRDS for Db2リリースによりさらに選択肢が拡がりました。

- 今回発表された、AWS RDS for Db2(2023年11月よりGA)
  https://aws.amazon.com/rds/db2/

- EC2上でIaaSで動く、Db2マルチプラットフォーム版 (ソフトウェア版のDb2 LUW版)
   [システム要件の確認はこちら](https://www.ibm.com/support/pages/system-requirements-ibm-db2-linux-unix-and-windows)
- SaaS: Db2 on Warehouse on Cloud (on AWS)
  [Db2 Warehouse on Cloud 無償トライアル](https://cloud.ibm.com/registration/premium1?target=/catalog/services/db2-warehouse&cm_mmca1=000030YW&cm_mmca2=DAFWW&S_PKG=ov34433&uucid=0040c3e10b80999b&cm_sp=cloud-product---onpagenav-ibmcloudplatform_db2-warehouse-on-cloud---bm_nsl_customize_leadspace)

その他、
- Db2U（コンテナ版）等



参考）
![Db2 on AWS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272878/7d475754-7274-9dfe-1d90-2ce56f9ceb41.jpeg)



# RDS for Db2のソフトウェアライセンス

RDS for Db2のDb2ソフトウェアライセンスは、BYOSL(Bring Your Own Software License)によるライセンス持ち込みが可能であり、既存資産の有効活用も可能です



Db2 on AWSでは、それぞれデプロイメントの方式により、ライセンスのカウントも変わります。

参考）[Eligible Public Cloud BYOSL Policy](https://www.ibm.com/software/passportadvantage/eligible_public_cloud_BYOSL_policy.html)



今回リリースされたRDS for Db2の場合、
上記サイトの注9、
「1 VPC = 1 physical core = 2vCPUs」
※Hyperthreading = ONのインスタンスの場合

という、使い勝手のよい設定となっています

# 参考情報

[Amazon RDS for Db2 の利用を開始する](https://aws.amazon.com/jp/blogs/news/getting-started-with-new-amazon-rds-for-db2/) （Amazon Web Services ブログ）
UnityアプリのApple Store登録

# UnityからXcodeプロジェクトを作成

Unityから直接ビルドすることはできません。プラットフォームをiOSにしてビルドして出力されるのはXcodeプロジェクトです。ここで生成されたXcodeプロジェクトをXcodeで開いてビルドします。

WindowsでUnityを使っている場合は、USB等でMacにXcodeプロジェクトをコピーしてビルドすることになるのでとても面倒です。

`Project Settings`の`Bundle identifier`に設定した値がSKUになるので入力しておいてください。

入力していないと`Company Name`の値が使われるので、日本語が入って文字化けする可能性があるので注意してください。

## アプリの署名

プロジェクトを開けたら、まずはアプリの署名を設定します。これはアプリを配布するための証明書です。`Targets `で`Unity-iPhone`を選択し、`Signing & Capabilities`タブを開きます。`All`で全てのリリースに署名を適用します。

ここで`Automatically manage signing`を選択すると、Apple IDで署名を自動で行ってくれます。ログインしているApple IDが開発者登録されていれば、クラウド上に保存されている証明書が下のリストに表示されます。

![スクリーンショット 2024-02-02 12.53.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268835/87b71e6c-a769-0027-72d6-1d5c313b41d8.png)

## ビルド
署名が設定できたら、`Product > Archive`でアーカイブを作成します。これで後述のApp Store Connectにアップロードできるようになります。

## The bundle at ... contains disallowed file 'Frameworks

`Unity Ads`を使っている場合には、`The bundle at ... contains disallowed file 'Frameworks'`のようなビルドエラーが発生することがあります。
![disallowed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268835/12fff1bf-ce9e-ceca-659e-30f88ce04b57.png)

Xcodeのサイドメニューの`Target`から`Unity-Framework`を選択し、`Build Options`のセクションで`Always Embed Swift Standard Libraries`を`No`に変更すると解決することがあります。

![スクリーンショット 2024-02-02 12.54.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268835/45ae60d7-6395-4594-e30b-b59bc4a0f911.png)


# App Store Connect
iOSアプリの配布にはApp Store Connectを使います。これはGoogle Play ConsoleのiOS版のようなものです。

[マイアプリ](https://appstoreconnect.apple.com/apps)から新規アプリを作成することもできますが、Xcodeのアーカイブ機能を使って登録することもできます。

## アプリのアップデート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268835/a7bd5ff7-02cb-774f-da5c-cfde76dfeb83.png)

# Apple Store

## ストアでの表示名
Apple Storeでは、Google Play Storeとは違って制作者の名前が大きく表示されます。

もし、組織で開発するアプリを個人で作ってしまった場合は、後述の`アプリの譲渡`で組織に受け渡すことができます。

## アプリの譲渡

App Store Connectで対象のアプリを選択し、`一般 > アプリ情報 > 追加情報 > アプリの譲渡`から手順に従って組織のApple Idに譲渡することができます。

もしここに`アプリの譲渡`が表示されない場合は、所有権を持っていない可能性があります。
Windows環境で.NETの開発を行う際にGitリポジトリに追加する設定

# 概要

WindowsでVisual Studioを利用した開発を行う際の最初の設定。

これらのファイルはGitリポジトリ準備時、およびソリューション追加時に配置する。

まずは作業1と作業2をGitリポジトリ準備時に実施し、ソリューション追加時に作業3をソリューションごとに行う。

# 作業1. デフォルトの改行コードをCRLFにする

:::note
既定の文字コードが`CRLF`であるWindows専用の環境で開発し利用するプログラム（基本的には.NET Framework）のリポジトリで検討が必要な設定となる。
:::

## 手順

リポジトリ直下に次のファイルを配置する

```ini:.gitattributes
# https://docs.github.com/ja/get-started/getting-started-with-git/configuring-git-to-handle-line-endings
# デフォルトの改行コードをCRLFにする。
* text=auto eol=crlf
# Linuxシェル
*.sh text eol=lf
# Windowsシェル
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf
```

:::note
Editor Configに対応したエディタ（Visual Studio 2017以降）で編集する想定であれば、`.gitattributes`ではなくEditor Configでの指定が望ましい
https://learn.microsoft.com/ja-jp/visualstudio/ide/create-portable-custom-editor-options?view=vs-2022
> Visual Studio のエディターは、EditorConfig プロパティの次のコア セットをサポートします。
> 
> indent_style
> indent_size
> tab_width
> end_of_line
> 文字セット
> trim_trailing_whitespace
> insert_final_newline
> root
:::

## 目的

Gitの既定の改行コードは`LF`となっている。
Windows環境で作成されるファイルの改行コードは`CRLF`となっている。

基本的に問題は発生しないが、まれに発生することがあるためこのファイルの追加、もしくはEditor Configでの指定を行う（Editor Configに対応したエディタでの編集となる場合）。

後から調整は可能だが手間がかかるため、Gitリポジトリ準備時に行っておいた方が望ましい。

# 作業2. gitignoreのファイルを追加する

# 手順

次のURLから`VisualStudio.gitignore`をダウンロードし、リポジトリ直下に`.gitignore`として配置する

https://github.com/github/gitignore

## 目的

.NET Framework、.NET関連で管理不要のファイルをGit管理から除外するため。

一度追加した後に除外は可能だが手間がかかるため、Gitリポジトリ準備時に行っておいた方が望ましい。

# 作業3. 同一ソースコードから生成されるビルド成果物のバイナリ同一性の可能な限りの担保

## 手順

ソリューションファイルと同じ場所に次のファイルを配置する。

```xml:Directory.Build.props
<Project>
	<PropertyGroup>
		<Deterministic>true</Deterministic>
		<RepoRoot>$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\'))</RepoRoot>
		<PathMap>$(RepoRoot)=.</PathMap>
	</PropertyGroup>
</Project>
```

## 説明

可能な限り、同一ソースコードから生成されるビルド成果物のバイナリ同一性を担保するため。

CIでの成果物が異なる場合、納品物準備時などに問題なとなることがある。

:::note
ただし、次にあるようにこの設定を行っても様々な条件でビルド成果物にも相違が生じる可能性がある。

https://jpdscore.github.io/blog/vs/identity-of-build-artifacts-from-identical-source/
:::
Udemyで一画面で学習を進める時に便利なChormeの拡張機能「Udemy Picture -in- Picture」について

# はじめに
　私はよくUdemyを使ってプログラミングの学習をすることがあるのですが、図書館など外出先で学習を進めると一つの画面で動画を見ながら、エディタで作業をしないといけないので画面の切り替えがとても大変です。
　「Udemy Picture -in- Picture」を使うとエディタ上で動画を見ることが可能なので外出先でも効率よく学習を進めることができると思います。
# Udemy Picture -in- Picture
Chromeの拡張機能です。

https://chromewebstore.google.com/detail/udemy-picture-in-picture/ajibjgkclejanlffognhfjojjedflhpp

Chromeで開いてダウンロードするとUdemyで使用することができます。

# 使い方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554505/edfea9d4-8613-ce86-1bc2-6d1afb713675.png)
Udemy上の動画を視聴している時に上の写真の右端のアイコンをクリックするとエディタを開きながらでも動画を視聴することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554505/48a6193b-7428-55d5-1d35-08d2156813aa.png)

# まとめ
今回はUdemyの学習に便利な拡張機能を紹介しました。