OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonのvenvを使用時に遭遇した証明書の問題とその解決方法

# はじめに
Windowsにて、Pythonで仮想環境（venv）を作成し、それを有効化（activate）しようとした時、「信頼されていない発行元からのソフトウェアを実行しますか？」という警告が表示されるでしょう。この警告は、システムがPython Software Foundation発行のスクリプトを信頼していないために起こります。この記事では、この際に「常に実行しない」を選択してしまった場合の解決方法を紹介します。
確認したのはWindows10のみです。ただ、Windows11でも同様の操作で同じUIのcertmgrが開かれたので、おそらく解決すると思われます。

# 問題発生までの流れ
仮想環境を有効化しようとすると、以下のようなメッセージが表示されます。
```
PS C:〇〇> .\venv\Scripts\activate

この信頼されていない発行元からのソフトウェアを実行しますか?
ファイル C:〇〇\venv\Scripts\Activate.ps1 の発行元は CN=Python Software Foundation, O=Python Software Foundation, L=Beaverton, S=Oregon, C=US
であり、このシステムで信頼されていません。信頼された発行元からのスクリプトのみを実行してください。
[V] 常に実行しない(V)  [D] 実行しない(D)  [R] 一度だけ実行する(R)  [A] 常に実行する(A)  [?] ヘルプ (既定値は "D"):
```
ここで、誤って[V] 常に実行しないを選択してしまった場合、問題が発生します。
以降、このようなメッセージが表示されるでしょう。
```
PS C:〇〇> .\venv\Scripts\activate
.\venv\Scripts\activate : ソフトウェアの制限のポリシー (グループ ポリシーを使用して作成されたポリシーなど) によって操作がブロックされているため、ファイル 
C:〇〇 は読み込めません。      
発生場所 行:1 文字:1
+ .\venv\Scripts\activate
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
```
# 解決方法
解決策は、システムにPython Software Foundationを信頼された発行元として追加することです。
1. Windowsボタンから「証明書」と入力し、表示される「ユーザー証明書の管理」を選択します
1. certmgrウィンドウが開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3696203/466017c4-9678-5f0f-1df3-da5a2373eb95.png)
1. 「信頼されていない証明書」> 「証明書」にある証明書リストの中から「Python Software Foundation」を見つけます
1. この証明書をドラッグ＆ドロップで「信頼されたルート証明機関」> 「証明書」に移動させます



証明書を移動させた後、ウィンドウを閉じて、再度activateスクリプトを実行します。先ほどと同様の選択肢が表示された場合は、今度は[A] 常に実行するを選択してください。
```
PS C:〇〇> .\venv\Scripts\activate

この信頼されていない発行元からのソフトウェアを実行しますか?
ファイル C:〇〇\venv\Scripts\Activate.ps1 の発行元は CN=Python Software Foundation, O=Python Software Foundation, L=Beaverton, S=Oregon, C=US
であり、このシステムで信頼されていません。信頼された発行元からのスクリプトのみを実行してください。
[V] 常に実行しない(V)  [D] 実行しない(D)  [R] 一度だけ実行する(R)  [A] 常に実行する(A)  [?] ヘルプ (既定値は "D"): A
(venv) PS C:〇〇>
```
これで、信頼されていない発行元からの警告を解決し、問題なく仮想環境を有効化できるようになります。
IBM iのロードソースを含むディスク拡張がサポートされるようになりました

IBM iのロードソースを含むディスク拡張がサポートされるようになりました。
こちらのリンクをご参照ください。
Dynamically increasing the size of a SAN LUN
https://www.ibm.com/support/pages/dynamically-increasing-size-san-lun

 This can be utilized on all disks, including the the load source.
 ↑のように記載しています。

 条件を整理しました。
 IBM i側:
 IBM i V7R3 TR7以降、V7R4 TR1以降、V7R5
 
 ストレージ側：
 Spectrum Virtualize based storage products(SVC,V7000など)、DS8900

 Cloudサポートに問い合わせたところ、クラウドで提供するストレージはFlash Storage from IBM FS9000 series devices、V7000 SSD (no new VMs) (WDC04 only)で、ディスク拡張はサポートされます。
 エビデンスは↓のリンクです。
Hardware specifications
 https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-about-virtual-server#hardware-specifications

 早速、PowerVSのIBM i V7R5でロードソースを含むディスク拡張を試してみました。
 以下が手順です。

 1.該当区画の電源をシャットダウン
 
 2.Cloudから拡張（例では150GBに拡張)
 
 ![diskenlarge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/ee351adc-a084-ca83-e6e3-ba69922e4317.png)
 
3.該当区画の電源をオン

4.STRSSTから拡張マクロGETDILSSTATUSを確認。
オペレーション:
Option 1. Start a service tool
Option 4. Display/Alter/Dump
Option 1. Display/Alter storage
Option 2. Licensed Internal Code (LIC) data
Option 14. Advanced analysis
Enter the following data:
    1      GETDILSSTATUS
   Press Enter
Leave the Options as [blank] and press enter

5.以下の画面が表示されています。
![get.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/4d2e8614-3c9f-7946-c8d9-c864b0b869bc.png)

6.5.で'IPL needed to complete'と表示されているので、'PWRDWNSYS OPTION(*IMMED) RESTART(*YES)'で再起動

7.IPL後、STRSSTからもう一度GETDILSSTATUSを確認
![afteripl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/0059b495-4ba2-4db0-397b-4afb1d2e6481.png)

8.WRKDSKSTSからUNIT 1が143GBになっていることを確認できます
![wrkdsksts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633718/7bd26822-2221-e744-1c01-e709e5afcfc8.png)

参考:IBM iから認識されるタイプ2145(Storwize系の外部ストレージ)のストレージは実際のサイズ定義より若干少なく認識されます。
RedBook:IBM i and IBM Storwize Family A Practical Guide to Usage Scenarios
https://www.redbooks.ibm.com/redbooks/pdfs/sg248197.pdf
には以下の記述があります。
抜粋：2.5.11 Translation from 520-byte blocks to 512-byte blocks
Conversely, the usable capacity in IBM i is 8/9 of the allocated capacity in Storwize V7000.
入社して1年が過ぎようとしているのでエンジニアという仕事が教えてくれた自分について考えてみた。

新卒で現在の会社に入社し早1年が過ぎようとしています。
最近はヨシタケシンスケさんの新作が出たので、さっそく購入して読みました。

https://lp.shueisha.co.jp/oshigoto_soudan_center/

:::note info
あらすじ

「しごと」ってなんだろう?
地球に不時着した宇宙人がやってきたのは、ちょっと風変わりな職業相談所。
宇宙人は相談所のスタッフと一緒に、この星で生きていくこと、働くことの意味について考えはじめる。
誰もが避けて通れない「仕事」の意味を問い直し、明日をちょっと明るくする、
すべての子どもと大人のためのヨシタケシンスケ版“ハローワーク”ストーリー!
:::
この本を読んでいて、
"どんなおしごとでも、そのおしごとが「あなたがどんな人なのか」をおしえてくれる"
という言葉が心に残ったので、この記事を執筆することにしました。

エンジニアというおしごとが教えてくれた"自分"という人間について述べていきたいと思います。

# 1.人の表情や声色から感情を推測している
この仕事はコミュニケーションをとることの多い仕事だと思います。
質問や業務の確認などコミュニケーションが必要になってきます。
その際に直接、ハドル、チャットなど様々な方法を使いながら意思疎通を図ります。

こうした際にチャットであっても無意識に相手の感情を推測するという癖があります。
この推測というのは感情を推測するだけでなく、その感情になった原因まで数パターン推測しています。
推測してもその情報を使うことはほぼ無いに等しいです。

# 2.新しい情報をキャッチするのが好き
様々な案件に関わり、いろいろな種類のフレームワークを使っています。
rails、laravelなど日々新たなツールやフレームワークに四苦八苦しています。
その四苦八苦している過程は大変なこともありますが、
できるようになってくるとすごく達成感を感じます。

新しいことができるとわかった時、不安もありますがワクワクすることが多いです。
書籍もジャンルを問わず以前に比べて買うようになりました。

# 3.忘れっぽい
新しい情報をキャッチするのは好きですが、新しいことにいろいろ手を出すのでそれぞれやっていて「あれ？どうだったっけ？」ということは多々あります。

そこでnotionでメモを取り、情報が必要な時には確認するようにしています。

久しぶりにさわるツールだと、サーバー起動の方法を忘れることもあるのでそういった初歩的なことからメモするようにしています。


# 参考
https://www.bungei.shueisha.co.jp/interview/oshigotosoudan/
Pythonでmp4の動画から音声のみを抽出したmp3ファイルを作成する

# 前提
- mp4の動画から音声のみを抽出したmp3ファイルを作成したい
- 今回はffmpeg-pythonライブラリを使います
  - [Github: ffmpeg-python](https://github.com/kkroening/ffmpeg-python)
- mp4ファイルはBytesIOの形式で渡されるものとします

# 実装

```py
import tempfile
import ffmpeg
from io imoprt BytesIO

def convert_to_mp3_from_mp4(file: BytesIO)

    # ffmpegのinputはファイル形式しか受け付けないためtempfileで一時ファイルを作成します
    with tempfile.NamedTemporaryFile() as temp_file:
        temp_file.write(file.getvalue())
        # mp3に変換します
        (
            ffmpeg
            .input(temp_file.name)
            .output("output.mp3")
            .run()
        )

```
Google Sheetsとkintoneを連携した。

Google Apps Scriptを使用してGoogle Sheetsの「行」追加時に自動でkintoneにレコード追加できるようにしました。

```javascript
function addRecordToKintone() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var lastRow = sheet.getLastRow();
  var data = sheet.getRange(lastRow, 1, 1, sheet.getLastColumn()).getValues();
  
  // Kintone の設定
  var appUrl = 'https://ドメイン.cybozu.com/k/v1/record.json'; // アプリのURL
  var apiToken = 'APIトークン'; // APIトークン
  var appId = 'アプリID'; // アプリID
  var record = {
    'app': appId,
    'record': {
      'name': {
        'value': data[0][0] // スプレッドシートのデータ
      }
      // 他のフィールドも同様に追加
    }
  };
  
  // API コール
  var options = {
    'method' : 'post',
    'contentType': 'application/json',
    'headers': {'X-Cybozu-API-Token': apiToken},
    'payload' : JSON.stringify(record)
  };
  
  UrlFetchApp.fetch(appUrl, options);
}

```
Docker超入門 - ホストのフォルダにアクセスできるubuntu仮想環境構築からDocker hubで共有まで

# 概要
Dockerで仮想環境を構築して他人（他のPC）と共有したいという人が対象です。また、今回の仮想環境ではホストのディレクトリをマウントする方法でコンテナを作製します。
Dockerの詳しい話は他の記事に譲って、本記事では実装方法にフォーカスして紹介していきます。
私はDockerを勉強し始めて1週間程度しか経っていないため、間違いやご指摘があればよろしくお願いします。
私の環境はMacですが、windowsでも他記事を参考にしながらであれば読めると思います。（ターミナルに入力するコードは同じのはず、windows環境を所有しているので後日記載）
また、ここで作製した環境をVScode中で起動させてPythonを実行する方法は@katakakuさんの記事 https://qiita.com/katakaku/items/b8dcac4aa14d585e4038
を参考にしてください。

# 1.Docker Desktopの導入とDocker Hubアカウント作成
まず初めに以下のサイトで自分の環境に適したDocker Desktopをダウンロードしてインストールしてください。
https://www.docker.com/ja-jp/products/docker-desktop/
また、ダウンロードの隣にある"アカウント作成する"でアカウントを作成しましょう。

# 2.Imageのpull (docker pull)
今回はubuntuの仮想環境を構築するので以下のコードをターミナルに入力してubuntuのImageを取得しましょう。
```
docker pull ubuntu  
```
これでubuntuのImageの取得に成功です。
以下のコマンドをターミナルで入力して成功を確認しましょう。
```
docker images
```
この後に以下のような出力が得られれば成功です。
```
REPOSITORY           TAG       IMAGE ID       CREATED        SIZE
ubuntu               latest    ca2b0f26964c   13 days ago    77.9MB
```

# 3.Containerの作製 (docker run)
今回はローカルのフォルダにアクセスできる仮想環境構築を行います。
```
docker run --name 任意の名前 -v 使用したいホストのディレクトリ:左のディレクトリの仮想環境中のディレクトリ -it ubuntu
```
docker run　はコンテナを作成するためのコマンドです。
--name 任意の名前 はコンテナの名前を決定する部分です。
-v 使用したいホストのディレクトリ:左のディレクトリの仮想環境中のディレクトリ はホストのフォルダにアクセスするためのコマンドです。例えばホストのデスクトップ上のtestフォルダを仮想環境中の/usr/local/testで読み込むには以下のように読み替えてください。
使用したいホストのディレクトリ = デスクトップ上のtestフォルダの場所
左のディレクトリの仮想環境中のディレクトリ　= /usr/local/test
私の環境では以下のようなコードで実行しました。
```
docker run --name test -v /Users/username/Desktop/test:/usr/local/test -it ubuntu
```
これでコンテナが作製されました。このときコマンド中:の前後にスペースをいれるとエラーがでます。
ターミナルが仮想環境のものになりますが
```
exit
```
で閉じることが可能です。

以下のコマンドを実行してコンテナが作製されたことを確認しましょう。
```
docker ps -a
```

コンテナを再起動したい場合は
```
docker start test
```
コンテナの操作をターミナルで行いたい場合はdocker startを実行してから
```
docker attach test
```
を実行してください。

# 4.Repositoryの作製
Docker Hubでリポジトリを作成しましょう。
https://hub.docker.com/ にアクセスして一番上のRepositoryをクリックしてRepository画面に入る。
Create repository をクリックしてリポジトリ作成画面に入る。
Repository nameの欄に任意の名前を入力する。今回はtest_ripository とする。
Createをクリックする。
この操作でtest_ripository という名前のリポジトリが作成できた。

# 5.Repositoryに作製したContainerをpush(docker push)
作成したtest_ripository にtest コンテナをpushする手順を紹介する。
まずはじめに以下をターミナルで実行してcommitする。
```
docker commit test Docker_user_name/test_ripository
```
ここでDocker_user_nameはDocker Hubに登録したときに決定した名前です。
次に以下をターミナルで実行してリポジトリにpushする。
```
docker push Docker_user_name/test_ripository
```
これでpushが成功するはずです。

# 7.おわりに
ここまでの流れでタイトル通りに仮想環境を構築できたと思います。
私も初学者なので勉強して誤りに気付けば随時変更していきます。
プロジェクト横断でリソースの一覧を取得する

コスト削減等でリソースの一覧が欲しくなりました。
例えば、GCEのN1インスタンスがどこに何台あるのか？

たくさんプロジェクトがあるので、一個一個見ていくのはツラい・・・。
組織に属していれば`Cloud Asset Inventory`で出力できます。

# やりかた
公式ドキュメントはこちら。
https://cloud.google.com/asset-inventory/docs/searching-resources?hl=ja

1. アセットインベントリのリソースタブをコンソールで開く
1. 抽出したい条件を指定
    * 組織全体で検索したいなら画面上部のプロジェクトを組織に変更する
1. `CSV形式でダウンロード`ボタンを押してダウンロード
1. 細かいフィルタは SpreadSheet 等でどうぞ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472216/6b904c59-a735-9460-c6a3-a527dbc1b900.png)

# 出力項目
2023年12月時点での出力項目は以下のような内容でした。
* 名前
* リソースの種類
* プロジェクト ID
* 表示名
* ステータス
* フォルダ
* 組織
* 親のアセットタイプ
* 親の完全なリソース名
* KMS 鍵
* 直接タグ
* 説明
* ロケーション
* ラベル
* ネットワーク タグ
* その他の属性

## その他の属性の内容
JSONっぽい形で情報が入ってます。
GCEの一覧取得した際の`その他の属性`は、以下のような内容でした。

```
{
    deletionProtection:FALSE,
    externalIPs:[あいぴーあどれす],
    id:いんすたんすあいでぃー,
    internalIPs:[あいぴーあどれす],
    machineType:e2-standard-4,
    networkInterfaceNames:[nic0],
    networkInterfaceNetworks:[https://www.googleapis.com/compute/v1/projects/ぷろじぇくと/global/networks/ねっとわーく],
    networkInterfaceStackTypes:[IPV4_ONLY]
}
```
（上記は整形済みです）

SpreadSheet等でごにょごにょすれば、マシンファミリーで一覧出力もできますね。
東京「生成型AIアプリケーション開発」イベントまとめ

3月10日、東京のMCT JAPAN 株式会社で「生成型AIアプリケーション開発」に関するイベントが開かれ、これはGlobal AI Bootcamp 2024の日本における地域コミュニティイベントでもありました。イベントには、対面で20人以上、オンラインで約40人が参加しました。
Global AI Bootcampのイベントページ：
https://globalai.community/bootcamp/japan-tokyo-hybrid/
![alt 画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRB7PmfPHsJeibospibF6oHSzCkribOPamTo9KXZpg1HBrEgibLs5zxQ1VBpgwlicFdgzjCgYic0kQWax3dw/640?wx_fmt=png&from=appmsg)
イベントは午前9:30から始まり、午後15:30に終了しました。全体で6時間、途中正午に1時間の昼食休憩がありました。主に以下の4つの側面から、生成型AI開発についての基本的な情報を共有しました：
生成型AIの紹介
生成型AIの概念、現状、GPTの原理とアルゴリズム、生成型AIのアプリケーションレベル
プロンプトエンジニアリング
プロンプトエンジニアリングガイド、プロンプト構造、プロンプトの構造化
GPTを使用した開発
ChatGPTによる製品支援、ChatGPTによるアーキテクチャの支援、Copilotによる開発支援、GPTによるテスト支援
Semantic Kernelのケーススタディ
Chat、DallE、GPTVision、Agents、LaMA2
イベントの現場写真：
![alt 画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRB7PmfPHsJeibospibF6oHSzCoIWk3v6CDD8RvI9IrTcXQz8wZUygQVicpRqLibFPcia51VJOhq5ytTHlg/640?wx_fmt=png&from=appmsg)
（図1：開幕）
![alt 画像](https://mmbiz.qpic.cn/sz_mmbiz_jpg/4CAA63nvHRB7PmfPHsJeibospibF6oHSzCwNFCpLWIFPuHwOSnIhKoU4s4sbuuyibsWcDBiaJgKTKJYbS5xiaFSjxEQ/640?wx_fmt=jpeg&from=appmsg)
（図2：オンライン生放送）
![alt 画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRB7PmfPHsJeibospibF6oHSzC7OYkMVaK80IcHOibpSuavWcnyytibvjRHxeF6j4Fib5PicJE3wIhXuicibZQ/640?wx_fmt=png&from=appmsg)
（図3：Transformerアルゴリズムの共有）
![alt 画像](https://mmbiz.qpic.cn/sz_mmbiz_jpg/4CAA63nvHRB7PmfPHsJeibospibF6oHSzCFsgUMNBxGj9rwU7iaKtysgWKhVbqflznwN0BzkDsXbgLvgTXNLgLzFQ/640?wx_fmt=jpeg&from=appmsg)
（図4：プロジェクト内の構造化プロンプトの紹介）
このイベントにおいて、私は講師として全体的に非常に成功したと言えます。参加者は熱心に聞いており、現場には多くの質問がありました。さらにいくつかの質問には、後でオフラインで回答し、さらに幾人かの参加者とは別の時間を設けて討論することになりました。これは、今回の共有が皆のAIに関する情熱を掻き立てたことを意味しています。
このイベントの内容とデモについては、順次記事を書いて共有する予定ですので、ぜひフォローしてください。
現在、生成型AIは上昇段階にあり、AI技術やアプリケーションが日々進化していると言っても過言ではありません。そのため、コミュニティでのタイムリーな交流・学習は、情報と知識を迅速に得る有効な手段です。また、日本におけるさらなる友人たちが「東京生成型AIコミュニティ」に加わり、愛好と共にAI分野で前進していくことを願っています。

(Translated by GPT)

元のリンク：https://mp.weixin.qq.com/s?__biz=MzA3NDM1MzIyMQ==&mid=2247487911&idx=1&sn=458be54e18319094aa6edfacda837b98&chksm=9f004e8da877c79b48aadd3b87e944a4831f413110805b4ff1e444269172cfa4fdd0efda4b05&token=531574821&lang=zh_CN#rd
シバンには #!/usr/bin/bash と #!/usr/bin/env bash のどっちを書くべきか

## 環境
Ubuntu20.4

## はじめに

色々なシェルスクリプトの中身を見ていると、シバンには、**#!/usr/bin/bash**  と記述しているものもあれば、**#!/usr/bin/env bash** と記述しているものもあります。

はたして、どちらが正しいのでしょうか？

## #!/usr/bin/bash

こちらの記述はbashの絶対パスを指定しています。確認のためにつぎのコマンドを実行すると、確かにbashの絶対パスが表示されます。

```
$which bash
/usr/bin/bash
```

シバンにこちらの記述を指定すると、シェルスクリプトを別のディストリビューションに移植したとき、ディストリビューションによってシェルが入っているディレクトリ環境が異なるため、そのままでは動かない場合が出てきます。

他の環境に移植することがない場合は、この書き方でも問題ありませんが、シェルスクリプトを一般に公開して、色々な環境でマルチに利用してもらうような場合は、このような、いち環境でしか動作しないような記述の仕方は避けるべきです。

## #!/usr/bin/env bash

こちらの記述は、bashの絶対パスを指定しているのではなく、envの絶対パスを指定しています。そして、envの引数にbashを指定しています。envは実行してみると分かりますが、環境変数を一覧表示するコマンドです。こちらの記述は、汎用性が高く、bashがどこのディレクトリに入っていても、正しくbashが起動できるようになっています。

こちらの記述では、環境変数の$PATHを参照して、bashが入っているディレクトリを調べた上で、bashを正しいディレクトリから起動してくれます。つまり、bashがどこのディレクトリに入っていても、bashがちゃんと起動してくれるようになります。もちろん、PATHが切れていなければ起動できないということにはなりますが、bashのバスが切れていないといったことはまずないはずです。

bashはどこのディレクトリに入っていてもいいのですが、envだけは/usr/binに入っていないといけないことになります。しかし、この辺は心配する必要はありません。bashはディストリビューションによって、入っているディレクトリが微妙に異なる場合がありますが、envはどのディストリビューションでも、共通して同じディレクトリに入っているものです。

## 比較

**#!/usr/bin/bash**と、**#!/usr/bin/env bash**は、どちらも、それぞれ、長所と短所を持ち合わせています。

**#!/usr/bin/bash**では、bashにオプション（引数）を渡すことができますが、**#!/usr/bin/env bash**にはオプションを渡すことができません。例えば、文法チェックをしたい場合、このようにオプションを指定して実行させることができます。

```
#!/usr/bin/bash -n
```

しかし、envを指定した場合は、このような使い方はできません。

```
#!/usr/bin/env bash -r
```

bashでオプションを指定して実行するようなケースは、個人的にはほぼほぼないため、あまり気にすることはないかと思います。

また、**#!/usr/bin/env bash**の場合は、**#!/usr/bin/bash**の記述よりも、セキュリティは弱いといわれています。マルウェアが仕込まれて、スクリプトが実行されることができるようになるからです。しかし、滅多に起こりうる話ではないと思われます。

結論としては、**#!/usr/bin/env bash**の書き方が推奨されているため、こちらで書くことにしましょうということになります。

## 補足

デフォルトでインストールされているシェルの一覧を表示します。

```
$cat /etc/shells
```

bashは下記の２つのディレクトリにそれぞれ入っていることがわかります。

```
/usr/bin/bash
/bin/bash
```

上記の２つのbashはどう違うのでしょうか？。結論からいうと、どちらを使っても同じということになります。

/binに入っているコマンドは、OSをシングルユーザモードで起動させても動作できるコマンドが入っており、/usr/binに入っているコマンドは、シングルユーザモードで起動させた場合は、利用できないコマンドが入っています。シングルモードで動作させる場合は、緊急のときにしか利用されません。普段利用する分には、/usr/bin/bashの方を利用しておいていいかと思います。
JavaScriptでの型判別まとめ(typeof, Object.prototype.toString.call)

自分用メモ

|型|値|typeof|toString.call|
|-|-|-|-|
|string|"", "abc", 'a', String(1)|string|[object String]|
|String|new String("")|object|[object String]|
|number|0, NaN, Infinity, Number('1')|number|[object Number]|
|Number|new Number(0)|object|[object Number]|
|bigint|1n, BigInt(1)|bigint|[object BigInt]|
|Bigint|Object(1n)|object|[object BigInt]|
|boolean|true, Boolean(0)|boolean|[object Boolean]|
|Boolean|new Boolean(true)|object|[object Boolean]|
|symbol|Symbol(1)|symbol|[object Symbol]|
|Symbol|Object(Symbol(1))|object|[object Symbol]|
|null|null|object|[object Null]|
|undefined|undefined|undefined|[object Undefined]|
|array|[]|object|[object Array]|
|object|{}|object|[object Object]|
|function|() => {}|function|[object Function]|
|Map|new Map()|object|[object Map]|
|Set|new Set()|object|[object Set]|
|Date|new Date()|object|[object Date]|
|Error|new Error()|object|[object Error]|

<details><summary>開発者ツールのコンソールで試せるコード</summary>

```javascript
console.log('string: ', typeof 'a', Object.prototype.toString.call('a'))
console.log('String: ', typeof new String(""), Object.prototype.toString.call(new String("")))
console.log('number: ', typeof 0, Object.prototype.toString.call(0))
console.log('Number: ', typeof new Number(0), Object.prototype.toString.call(new Number(0)))
console.log('boolean: ', typeof true, Object.prototype.toString.call(true))
console.log('Boolean: ', typeof new Boolean(true), Object.prototype.toString.call(new Boolean(true)))
console.log('bigint: ', typeof 1n, Object.prototype.toString.call(1n))
console.log('BigInt: ', typeof Object(1n), Object.prototype.toString.call(Object(1n)))
console.log('symbol: ', typeof Symbol(1), Object.prototype.toString.call(Symbol(1)))
console.log('Symbol: ', typeof Object(Symbol(1)), Object.prototype.toString.call(Object(Symbol(1))))
console.log('null: ', typeof null, Object.prototype.toString.call(null))
console.log('undefined: ', typeof undefined, Object.prototype.toString.call(undefined))
console.log('array: ', typeof [], Object.prototype.toString.call([]))
console.log('object: ', typeof {}, Object.prototype.toString.call({}))
console.log('function: ', typeof (() => {}), Object.prototype.toString.call((() => {})))
console.log('Map: ', typeof new Map(), Object.prototype.toString.call(new Map()))
console.log('Set: ', typeof new Set(), Object.prototype.toString.call(new Set()))
console.log('Date: ', typeof new Date(), Object.prototype.toString.call(new Date()))
console.log('Error: ', typeof new Error(), Object.prototype.toString.call(new Error()))
```

</details>

`toString.call`を使うなら、以下のような感じで判別に使える
```typescript
const getType = (a: any): string =>
  Object.prototype.toString.call(a).replace('[object ', '').replace(']', '')

if (getType('hoge') === 'String') console.log('string')
// -> string
```

<hr>
参考

https://mebee.info/2022/10/13/post-82090/
Excel ダイアログのプロパティの入力初歩。

備忘録的に書いておきます。写真を追って説明とします。

![スクリーンショット 2024-03-05 145159.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/4bf61587-8aed-6b0d-afcb-594c61c8cbea.png)
まず、applicationを動かします。

![スクリーンショット 2024-03-05 145246.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/ecf152f2-2a25-d168-b389-a5a0ef4c8448.png)
*.ods のファイルを指定して動かします。

![スクリーンショット 2024-03-05 145344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/c0128265-f60a-ecf1-9398-42101667910d.png)
「ツール」「マクロ」「ダイアログの管理」と進みクリックします。

![スクリーンショット 2024-03-05 145520.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/ce01a094-06ac-d0e6-651c-24362be6cc71.png)
「新規作成」で"Dialog1"を作成します。「編集」をクリックします。

![スクリーンショット 2024-03-05 145559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/92f69824-48b1-bef0-e4d8-f4dc1a6eca77.png)
下の「アイコンリスト」から「label」選び「テキスト」に入れて「buttun」を選択して配置します。

![スクリーンショット 2024-03-05 145659.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/e077a9dc-a5d5-5239-8a4e-c5e95f65b39e.png)
button１を選択して、下の列の「プロパティ」をクリックします。「イベント」タブをクリックして**propertyの境界線をグリップドラックして広げ**プロパティを見られるようにします。

![スクリーンショット 2024-03-05 145749.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/3fb54406-6a6a-b8a3-81e9-df6b466343c1.png)
「マウスボタンを押した時」の右の「…」buttonをクリックして動作の割り当てを指定します。

![スクリーンショット 2024-03-05 145924.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/716bb2eb-a5b1-1f20-f034-53bb076a1aaa.png)
ダイアログの指定をして「実行」を押すと出てきますが、動作はしません。

![スクリーンショット 2024-03-05 150058.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/a0137331-db36-d0c8-314c-7e19d8e984f6.png)
メインシートに戻って、呼び出し用にイメージのbuttonを設置します。イメージ上で**右**クリックをします。

![スクリーンショット 2024-03-05 150135.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/e3f94b9c-ce7a-8cc9-cd74-12440f1a3e19.png)
割り当てが出ています。マクロを動かすには、指定します。

![スクリーンショット 2024-03-05 150135_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/7473d758-7793-37c2-fcd3-020fd709afec.png)
赤の四角の中に「ダイアログの割り当て」があれば、先ほどの実行ボックスがでるはずなのですが・・・。

![スクリーンショット 2024-03-05 150452.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/4b3f389d-8eee-44c7-1539-296e376260f1.png)
マクロmoduleの中にメッセージボックス表示を書いて動けば出る様にしてあります。実行で試せます。

![スクリーンショット 2024-03-05 150621.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/77228250-a98f-e1c1-fcf3-0125bb931661.png)
マクロは問題なく実行できます。

では。この辺で。。。
画像形式を一括で変更する方法【cwebp】

## 画像形式を一括で変更する方法
&nbsp;

Squoosh CLIを利用していましたが、動かなくなってきました。
Squoosh CLIのメンテナンスは2023年時点で終了してしまいました。

以降の代替手段として、cwebpを利用して「jpgや「jpeg」などの画像形式をwebpにCLIコマンドで一括変換する方法をまとめます。


https://www.npmjs.com/package/@squoosh/cli


&nbsp;
&nbsp;


## CWebPを使った画像形式の一括変換方法
&nbsp;
筆者の環境は以下の通り
- macOS Sonoma 14.4
- M1チップ

&nbsp;

:::note info
MacのターミナルでCWebPを使用して、DownloadフォルダのJPGファイルをWebP形式に一括変換することができます。
:::

&nbsp;

Homebrewを使ってCWebPをインストール。ターミナルを開いて、以下のコマンドを実行。
```
brew install webp
```

&nbsp;
&nbsp;

画像を保管しているフォルダーに移動。
自分の場合はChromeの拡張機能「Image Downloader」を使って、一括でダウンロードした画像の形式を一括変換したいのでDownloadフォルダに移動。
```
cd ~/Downloads
```

&nbsp;
&nbsp;

すべてのJPGファイルをWebP形式に変換。フォルダー内にWebPのファイルが保存される。
```
for file in *.jpg; do cwebp -q 80 "$file" -o "${file%.*}.webp"; done
```

&nbsp;
&nbsp;

すべてのJPEGファイルをWebP形式に変換。フォルダー内にWebPのファイルが保存される。
```
for file in *.jpeg; do cwebp -q 80 "$file" -o "${file%.*}.webp"; done
```
&nbsp;
&nbsp;

コマンドの詳細は以下通り

- `for file in *.jpg;`：Downloadフォルダ内のすべてのJPGファイルに対してループを実行します。
- `cwebp -q 80`：CWebPを使用して、画質を80に設定してファイルを変換します。
- `"$file"`：現在処理中のJPGファイルを表します。
- `-o "${file%.*}.webp"`：変換後のファイル名を指定します。`"${file%.*}"`は、拡張子を除いたファイル名を表します。

&nbsp;

詳細なオプション

https://developers.google.com/speed/webp/docs/cwebp?hl=ja

&nbsp;
&nbsp;

## Squoosh CLIの確認・削除
&nbsp;
@squoosh/cliパッケージがグローバルにインストールされているか確認

```
npm list -g --depth=0 | grep "@squoosh/cli"
```

&nbsp;
&nbsp;

@squoosh/cliパッケージをアンインストールする
```
npm uninstall -g @squoosh/cli
```

&nbsp;
&nbsp;

@squoosh/cliパッケージが削除されていることを確認

```
npm list -g --depth=0 | grep "@squoosh/cli"
```

&nbsp;

以上！
堀田量子MEMO

## 2章
密度演算子の固有値は各状態ベクトルがどれくらい混ざっているかを表す確率。固有値なのでN準位の密度演算子が定まれば固有値もN個ユニークに定まる。
固有ベクトルは状態ベクトルと呼ばれ縮退がなければ固有値の数だけ定まるが、状態ベクトルの相対位相が同じであればいくらでも組み合わせを選んでくることができる。

## 3章
物理量空間の基底行列がパウリ行列に対応する
## 4章
### テンソル積について
- 内積との以下のような関係性が成り立つ（合成系の確率算出のときに便利）
$$(A \otimes B)(C \otimes D)= (AC) \otimes (BD)$$
- **部分トレース**の計算
```math
    \displaylines{
        \text{Tr}_{A} [A \otimes B] = \text{Tr}[A] \times B \\ 
        \text{Tr}_{B} [A \otimes B] = A \times \text{Tr}[B]
    }
```
- 全体のトレースとの関係
```math
    \displaylines{
        \text{Tr}[\hat{T}]=\text{Tr}_{AB}[\hat{T}]=\text{Tr}_{A}[\text{Tr}_{B}[\hat{T}]]=\text{Tr}_{B}[\text{Tr}_{A}[\hat{T}]]
    }
```
- テンソル積のトレース
```math
    \displaylines{
        \text{Tr}[A \otimes B]=\text{Tr}[A] \times \text{Tr}[B]
    }
```
## 7章
密度行列は主観的なもので、同じ系に対しても観測者ごとに異なる密度行列になる。
観測をする（系の状態を知る）ということは観測される系についての「観測者の密度行列」が変化するということ。
密度演算子のスペクトル分解

### 密度演算子の定義と純粋状態への分解の非一意性
https://physicalcosmos.hatenablog.com/entry/density-operator

### 固有値は一意、固有ベクトルはそうじゃない（固有ベクトルの方向は一意、長さは任意）
https://trtmfile.com/2018/01/18/post-237/

### エルミート行列の固有ベクトル同士は直交する
https://rikunora.hatenablog.com/entry/20090307/p1

### 行列Aの対角和と、Aの固有値の和は等しい
https://oguemon.com/study/linear-algebra/trace/

#### おまけ：行列式と行列
>行列の数学は、歴史的には「どうやって効率よく連立方程式を解くか」という要求の中で生まれたそうです。b = ax といった一次方程式を解くことから始まる代数学。それはやがて連立する方程式を解く方法へ発展しました。17世紀に入り、方程式の解を座標の値と結びつけた解析幾何学というものになりました。直線や平面を一次方程式で表し、それらが交差したり、交差しなかったりすることが、方程式の解と考えることを発見したのです。中学校でグラフ用紙に線を引いて、方程式の交点を見つけ、それが解になることを学習しましたが、それはこの頃発見された方法だったのですね。
>
>更に複雑な多元方程式を解くために、18世紀に入ってから行列式が編み出され、19世紀にはベクトルや行列の考え方が完成したそうです[1]⁠。
出典：https://gihyo.jp/dev/serial/01/java-calculation/0037

https://gihyo.jp/dev/serial/01/java-calculation/0037

http://fnorio.com/0194determinant_matrix/determinant_matrix.html

https://www.youtube.com/watch?v=4DF91kU1or4
メモリに関するメモ

# 内容
メモリに関する知識をメモ書きしています。
今までメモリに関して雑な理解しかしていなかったので、理解を深める意図で纏めます。

## 静的なメモリ管理
コンパイル時にメモリの割り当てや解放が決定され、実行時には変化しないメモリ管理のことを指す。

## スタック領域
静的なメモリ管理によって割り当てられるメモリ領域。
関数の呼び出しやローカル変数の保存などに使用される。

関数が呼び出されるたびにその関数のためのスタックフレームがスタックにプッシュされる。
関数が終了すると、そのスタックフレームがポップされてスタックが縮小される。
スタック領域は比較的小さなサイズであり、スタックオーバーフローが発生する可能性がある。

## スタックオーバーフロー
スタック領域が限界に達すると発生するエラー。
スタックオーバーフローは、再帰関数の深さが深すぎる場合や、無限ループが発生した場合に起こる事がある。
大きなデータ構造をスタックに確保しようとする場合なども、スタックオーバーフローの原因となる。

## 動的なメモリ管理
プログラム実行中に必要なメモリを動的に割り当てたり、解放する方法。

## ヒープ領域
動的なメモリ管理によって割り当てられるメモリ領域。
ヒープ領域はソフトウェア側が自由に確保、解放することができる。

プログラムの実行時には、OSからソフトウェアに対して一定量のヒープ領域が与えられる。

ヒープ領域はメモリフラグメンテーション（空き領域が分断されること）が起こりやすく、不適切な使用方法によりメモリリークが発生する可能性がある。

## メモリリーク
参照型の変数がヒープ上のオブジェクトを指すが、そのオブジェクトへの参照がなくなった場合に、適切に解放されずにメモリリークが発生する。

## メモリ枯渇
ヒープ領域で使いたいメモリが枯渇してプログラムが異常終了する状態。

## ガベージコレクション
どの変数からも参照されていないオブジェクトやメモリリークなどを検出し、それらを解放してメモリを効率的に管理する仕組み。
ヒープ領域で行われる。

## 値型と参照型のメモリの使い方の違い
### 値型
値型のローカル変数は、スタック上に割り当てられる。
値型のローカル変数は、その値そのものが格納される。
ローカル変数がスコープを抜けると自動的にメモリが解放される。

値型のフィールド(クラスのメンバ変数)はヒープ上に格納される場合もある。

### 参照型
参照型の変数は、スタック上に割り当てられる。
スタック上の変数は、ヒープ上のオブジェクトへのアドレスを持つ。
実際の値はヒープ領域に格納される。

つまり、参照型の変数自体はスタック上にあるが、実際のデータはヒープ上にある。

オブジェクトが削除されるまでメモリを占有し続ける。

# 参考URL
[ヒープ領域とは？スタック領域との違いや具体的な管理方法を解説！](https://it-trend.jp/development_tools/article/32-0041)
【WSL2 + Docker】WSL2 dockerがよく落ちるので.wslconfigを設定してみた

## はじめに
社用やプライベートPCでもdockerを最近は多用している。
が、めちゃくちゃ重くてPCを1日に何度も再起動しているので色々調べてみたら
「.wslconfg」を設定したらほぼほぼ落ちなくなったので備忘録として書き留めておく。

## .wslconfgのファイル設置場所
基本的にはユーザーディレクトリの直下に設置する。
```:例
C¥User¥user¥.wslconfig
```

## .wslconfigの中身
```:.wslconfig
[wsl2]
memory=6GB
processors=4
```

## 終わりに
まじで落ちなくなった。。。
YouTubeタイムスタンプ機能の使い方説明【視聴者向け】動画の特定の時間に直接ジャンプできるようにする機能です【編集者向け】半角数字と半角コロンを組み合わせて書きます【動画 5分45秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル YouTubeタイムスタンプ機能の使い方説明【視聴者向け】動画の特定の時間に直接ジャンプできるようにする機能です【編集者向け】半角数字と半角コロンを組み合わ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/649b10f4-f521-6f08-eaff-8eb06d15aaa9.png)



* # 動画URL
    * https://youtu.be/TnWyYm5u_Aw

<br>

* # 動画タイトル
    * YouTubeタイムスタンプ機能の使い方説明【視聴者向け】動画の特定の時間に直接ジャンプできるようにする機能です【編集者向け】半角数字と半角コロンを組み合わせて書きます【動画 5分45秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-02-28(水)

YouTube Summary with ChatGPT & Claude( Chrome拡張機能 )で、目次と概要を自動生成しました。
https://bit.ly/yt-sum-Chatgpt-Claude


動画の目次( タイムスタンプ ):

00:00 - オープニング

00:24 - YouTubeタイムスタンプ機能の紹介

00:30 - タイムスタンプの使い方【YouTube視聴者向けの説明】

03:55 - タイムスタンプの設定方法【YouTube編集者向けの説明】
　└YouTube Studioをつかいます。
　└説明欄を編集します。
　└半角数字と半角コロンを組み合わせて書きます。

05:10 - 動画のまとめ


動画の概要:

この動画では、YouTubeのタイムスタンプ機能の使い方について、視聴者と動画編集者の双方向けに説明しています。
タイムスタンプとは、動画の特定の箇所にマークをつけ、その部分に簡単にアクセスできるようにする機能のことです。

視聴者にとっては、興味のある部分に素早くアクセスしたり、動画が進んでからもう一度特定の箇所を見たいときに役立ちます。
動画では、パソコンやスマートフォンでのタイムスタンプの使い方、説明欄の「もっと見る」をタップすることでタイムスタンプがどのように表示されるか、そしてタイムスタンプをクリックすることで動画がその時間にジャンプする様子を実際に見せています。

また、動画編集者向けには、説明欄にタイムスタンプをどのように設定するか、半角数字と半角コロンの使い方、そしてタイムスタンプの後に半角スペースを入れることの重要性についても説明しています。

動画の最後では、タイムスタンプ機能を使って視聴者にとっても編集者にとっても優しいコンテンツ作りに役立ててほしいというメッセージを伝えています。


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“YouTubeを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPzh3sGuxJqEKcTT8aq5V1E


　・“効果的にYouTubeを編集するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghO5t91iXLtF4_ZTV9502VjX


　・“デモ・マニュアル動画”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMJJv4wKFZDT03S2qmL2pkR


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/3P5iuOT
平均二乗誤差(MSE)がロジスティック回帰に使えない理由

# 概要
- 直感的にはロジスティック回帰の損失関数としてMSEが使えそうだが、クロスエントロピーが使われてるのはなぜなのか
- 損失関数の凸性を考えたら分かりやすい
- 結局、ロジスティック回帰ではクロスエントピーがよい


# 損失関数の凸性
機械学習において、目的関数のが凸性(convexity)を持つことは極めて重要である。なぜなら局所最適解$\implies$大域最適解を満たし、安定した学習を保証するためである。
## 凸性とは
**直感的理解** : 下側に綺麗にもっこりしている様
こんな感じ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3286804/5d660d46-9560-3fa6-2ead-9252c0aad0c7.png)

**ちゃんとした定義** : 
関数$f : X \to R$に対して
$$f(\lambda x_1 + (1 - \lambda) x_2) \leq \lambda f(x_1) + (1 - \lambda) f(x_2), \ \\\ \forall x_1,x_2 \in X, \ \forall \lambda \in [0,1]$$


# 凸性とヘッシアン
ある関数が上記の定義を満たすかどうかを評価するのにヘッシアンを用いる
おさらいするとヘッシアンとは関数の二階偏微分を持つ行列で$(i,j)$成分に$\frac{\partial f}{\partial x_i \partial x_j}$を持つため対称行列となる。

一般に
**ある関数のヘッシアンが半正定値($positive \ semidefinite$)行列であることとその関数が凸関数であることは同値**

:::note info
"行列の(半)正定値性"
行列$M$が任意のベクトル$x \in X^d$に対して$$x^*Mx >(\geq)\ 0$$となる時、Mは(半)正定値行列
ここで言っているのは$x$と$Mx$の内積が正もしくは0以上になることであり、直感的にこれは$M$が$x$の向きを大きく変えずに保持していることを意味する。
:::

単一変数関数の場合は2階微分が正(0以上)であることに単純化できる

# ロジスティック回帰におけるMSEのヘッシアン

パラメータ$w$を持つ予測器$f : X \to R$に対して損失関数$l(x)$は

$$l(x) = (y - \widehat{y})^2$$

$$where \ \ \ \widehat{y} = \sigma(w^Tx) = \frac{1}{1 + e^{w^Tx}}$$
その微分
$$\frac{\partial l(x)}{\partial w} = -2(y - \widehat{y})\frac{\partial \widehat{y}}{\partial w}$$

$$=  -2(y - \widehat{y})(1 - \widehat{y})\widehat{y}x \ \ \because \frac{\partial \widehat{y}}{\partial w} = (1 - \widehat{y})\widehat{y}x$$

$$ = -2(y\widehat{y} - y\widehat{y}^2 - \widehat{y}^2 + \widehat{y}^3)x$$

ヘッシアンは
$$\frac{\partial^2 l(x)}{\partial w^2} = \frac{\partial l(x)}{\partial \widehat{y}} \frac{\partial \widehat{y}}{\partial w}$$

$$=  -2(y - 2y\widehat{y} - 2\widehat{y} + 3\widehat{y}^2)x(1 - \widehat{y})\widehat{y}x$$


$$\therefore H(\widehat{y}) =  -2(3\widehat{y}^2 - 2\widehat{y}(1 + y) - y)x^2$$

$y=0$のとき

$$H(\widehat{y}) =  -2(3\widehat{y}(\widehat{y} - \frac{2}{3}))x^2$$

$y=1$のとき

$$H(\widehat{y}) =  -2(3(\widehat{y} - \frac{1}{3})(\widehat{y} - 1))x^2$$

両場合において、$0\leq\widehat{y}\leq1$より、ヘッシアンは必ずしも常に0以上ではないことは明らか。つまり、$l(x)$は凸関数ではない

# ロジスティック回帰におけるクロスエントロピー損失のヘッシアン
損失関数
$$l(x) = -y \log(\widehat{y}) - (1 - y) \log((1 - \widehat{y}))$$

変形(詳細省略)

$$-l(x) = \log(1 + e^{wx}) - xyw$$

微分

$$\frac{\partial l(x)}{\partial w} = \frac{1}{1 + e^{wx}} x e^{wx} - xy$$
$$= \frac{x}{1 + e^{-wx}} - xy$$

ヘッシアン

$$H(x) = x \frac{-1}{(1 + e^{-wx})^2} e^{-wx} (-x)$$

$$= \frac{e^{-wx}}{(1 + e^{-wx})^2} x^2 \geq 0$$

上記よりクロスエントロピーの場合はヘッシアンは常に0以上となり損失関数が凸になる。

# まとめ
- ロジスティック回帰において直感的にはMSEが使えそうな気がするが関数の凸性を考えてあげると使えない理由がわかる。
- ロジスティック回帰においてMSEは凸ではない。
- ロジスティック回帰においてクロスエントロピー損失はいかなる入力に対しても常にヘッシアンが0以上になり、凸性が保証されている。

取り急ぎまとめたので、誤りなどあればお気軽にコメントください。早急に修正いたします。

# reference
https://towardsdatascience.com/why-not-mse-as-a-loss-function-for-logistic-regression-589816b5e03c
Git – 新しいブランチを切ってから Github に PR 作成するのが面倒すぎるのでワンライナーのコマンドにする

# 概要

- main の最新状態を pull する
- main からてきとうなブランチ名でブランチを切る ( ブランチ名を考えてられないので、名前はランダム )
- 変更差分が空のままコミットする 
- コミットメッセージ入力が終わるとそのまま git push する

ということをワンライナーで実現する

ブランチを切ってPRを上げて修正というサイクルが速い人にはおすすめ

# コマンド例

```
git switch main; git pull && git checkout -b update-$(date +%s) && git commit --allow-empty && git push
```

# PR作成

git pull で以下のような標準出力がされるので、そのURLにアクセスしてそのままPR作成する

```
remote:      https://github.com/owner/repo/pull/new/update-1710221955
```

# チャットメンバー募集


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

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


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
ASA構築時にpingを使った疎通確認が失敗するケースについて

# はじめに
CISCOのASA(またはFirepower)の設定で少しつまづいたことがあったので
備忘録を兼ねて記事にしておきます。
ping失敗時の一例として本記事が誰かの助けになれば幸いです。

# 状況
・NW環境を構築しASAを使ってアクセス制御をしている
・アクセスリストは設定済み(プロトコルはipで許可)
・送信元から宛先に対してTCPの通信はできるが、pingを使った疎通確認ができない
　(リーチャビリティはある)

TCPでの通信ができていることから、アクセスリスト・ルーティング設定はできている事が分かりましたが、なぜかpingは失敗してしまうという状況で詰まってしまいました。

# 原因
ASAで「inspect icmp」を設定し忘れていたことが原因でした。
※ASAは基本的にはステートフルインスペクションが機能していますが
 inspect icmp はデフォルトで無効になっています。
※ステートフルインスペクション
送信元から宛先への通信を許可した場合、その宛先から送信元に戻ってくる通信を動的に許可するもの。

# 対処方法
基本的にはconfigのclass inspection_defaultの個所に
inspect icmpを追加してあげれば完了です。

CISCOのコミュニティサイトに、ASAでのinspect icmpの設定方法や
ICMPの挙動について詳しい情報が載っています。

https://community.cisco.com/t5/tkb-%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3-%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/asa%E5%AE%9B-icmp%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3%81%AE%E5%87%A6%E7%90%86-%E5%88%B6%E5%BE%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/ta-p/4007929

# まとめ
inspect icmpを設定しなくても、ASAのinsideとoutsideにicmp許可のポリシーを設定してやればpingを通すことは可能ですが、通信要件毎にin/outのicmpポリシーを設定するより、inspect icmpを入れてやる方が手間は少なくて済むと思います。

分かれば単純な原因ですが、切り分けには結構時間が掛かかりました。
amplifyでQUBOの定式化を行う

イジング計算機用のqubo(Ising)モデル定式化には,sympyやpyqubo,amplifyが存在する。実行速度やライブラリの更新頻度からamplifyが一番よさそう。

備忘録としてまとめておく。
(公式ドキュメント　https://amplify.fixstars.com/ja/docs/amplify/v0/index.html)
v0とv1があり異なる部分があるようだが、v1は執筆途中なのか未記載の部分が多い為v0を参考にしている。


ここではTSPの定式化を例に。

# 0. amplifyのインストール
condaにはなさそうなのでpipでインストール。python3.8~3.12まで対応しているらしい。
```python
pip install amplify
```

# 1. 変数を作成
SymbolGeneratorで変数を作成。配列の次元数は自由に選べる。
```python
gen = SymbolGenerator(BinaryPoly)  # 変数変数ジェネレータを定義
qubo_symbols = gen.array(city_num,city_num)  # 長さが都市数の2乗である Binary 配列を生成
```
qubo_symbolsの各要素にはqubo変数が格納されている。
# 2. 目的関数を作成

1.で作成したqubo_symbolsを使用して目的関数を記述する。

```python
H_obj = 0
for t in range(city_num-1):
    for j in range(city_num):
        for i in range(city_num):
            if i == j:
                continue
            H_obj += Intercity_Distances[i][j] * qubo_symbols[t][i] * qubo_symbols[t+1][j]
for j in range(city_num):
    for i in range(city_num):
        if i == j:
            continue
        H_obj += Intercity_Distances[i][j] * qubo_symbols[city_num-1][i] * qubo_symbols[0][j]
```
式として記述するため0で初期化

# 3. 制約条件を作成
```python
H_const = 0
for i in range(city_num):
    temp = -1
    for j in range(city_num):
        temp += qubo_symbols[i][j] 
    H_const += temp**2

for i in range(city_num):
    temp = -1
    for j in range(city_num):
        temp += qubo_symbols[j][i]
    H_const += temp**2

```

# 4. 二次多項式模型を作成
quboを用いるので、BinaryQuadraticModelを選択。


```python
model = BinaryQuadraticModel(H_obj + H_const)
```

これをnumpy形式で表示したりファイル出力したい場合、
```python
model.logical_matrix
```
を使用する。
tuple形式で[0]にJhが、[1]にCが格納されている。
amplify標準の出力形式は
```python
amplify.save_qplib
```
で利用できる。


# 5. 余談：lpファイル出力

目的関数や制約条件を多項式で出力できる。
その場合、制約条件はconstraintsクラスで記述する必要がある。
lpファイルを作成しておくことで、制約条件のチェック用プログラムを問題ごとに作成しなくてよいという嬉しさがある。
```python

```
時間があるときに追記します
Railsのscopeの良くない書き方

## はじめに

Railsのモデルでよく`scope`を使用した記述をします。
`scope`の使い方が悪く、予期せぬクエリが呼ばれていたので備忘録として残します。

## 良くなかった書き方

モデル名やscope名は仮で入れています。

```rb
class Model
  scope :prev_staff_id, ->(customer_id) {
    where(customer_id: customer_id)
      .order(updated_at: :desc)
      .limit(1)
      .pick(:staff_id)
  }
end
```
`Model.prev_staff_id`とすれば、以前のスタッフIDを返すことを期待しています。
`limit(1)`を指定して、`staff_id`を指定しているので一見クエリに問題はなさそうです。

## 問題点

### ①メソッドチェーンできるようにしておく

メソッドチェーンは今回の`prev_staff_id`に加えて、`active`のような別のスコープが合ったときに以下のように常ゲテ使用することを言います。
```rb
Model.prev_staff_id.active
```
ですが、`prev_staff_id`の返り値は`staff_id`のため、そもそもscopeの使い方として適しておりませんでした。

### ②思わぬクエリが呼ばれていた

今回の失態に気づくきっかけにもなったのですが、アプリの読み込みに想定以上の時間がかかっておりました。
よくログを見てみると、ある状態で操作するとあるモデルの全件取得クエリが確認できました。

デバッグすると例示しているscopeに問題があるとわかり、scopeを誤った使い方をするとlimitされずに全件取得のクエリが走っていたのでした。

## 対処法

いくつか対応の方法はありますがクラスソッドに変更するのが無難なのではないでしょうか。

```rb
class Model
  def self.prev_record(customer_id)
    where(customer_id: customer_id)
      .order(updated_at: :desc)
      .first
  end
end
```

```rb
prev_staff_id = Mode.prev_record.staff_id
```

## まとめ

- クラスソッド、scopeの使い分けを考えて実装する必要がある
- 誤った使い方をすると想定しないクエリが発生してしまうので注意が必要である
- 問題が起きたときはログを確認して確実に対処していく
TypeScript – ファイルから import した定数をそのまま export する

# コード例

importは書かずに export だけ書けば成り立つようだ

```ts
export {
  FOO_CONSTANT,
  BAR_CONSTANT,
} from 'foo_file'
```

# 解説

次のように import した定数をそのままexportしたかった
(以下は文法エラー)

```ts
import {
  FOO_CONSTANT,
  BAR_CONSTANT,
} from 'foo_file'

export const FOO_CONSTANT = FOO_CONSTANT
export const BAR_CONSTANT = BAR_CONSTANT
```


# チャットメンバー募集


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

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


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
FORTRAN77対応(Ubuntu 22.04)

そろそろ半世紀、流石にレガシーのはずなのですが移行できない人達はいる様で…

# 本題

Ubuntu 22.04ではFORTRANコンパイラ(GCCの一部)は以下のコマンドでインストールできます。

```
$ sudo apt update
$ sudo apt install gfortran
```

gfortranは77仕様も後方互換性のために残してあるそうですが、77仕様でのコンパイルを要求する-std=f77は廃止されています。/usr/bin/f77(gfortranへのシンボリックリンク)は存在するのですが後述の通り77仕様を反映する様な実装にはなっていない様です。

::: note
古すぎてほとんどWebに情報が残っていないですが、95仕様をサポートするFORTRANコンパイラの開発時にGNUがG95(別のオープンソース実装)をフォークする等ひと悶着あった様で、恐らくその時に廃止されたと思われます。
https://ja.wikipedia.org/wiki/GFortran
https://developers.srad.jp/story/04/08/02/0927228/
:::

77仕様相当はgfortran 11.4.0では-std=legacyであり、後に廃止された機能も警告なくコンパイルできます。オプションなしでは警告付きでコンパイルできるものの、95仕様に準拠する-std=f95ではコンパイルがエラー終了します。なお/usr/bin/f77で実行しても警告付きでコンパイルされます。

このことは95仕様で廃止されたPAUSEを使用した以下テストコードで確認しました。

```fortran
      PROGRAM HELLO
      PAUSE
      PRINT *, "hello, world"
      END PROGRAM HELLO
```

```
$ lsb_release -sd
Ubuntu 22.04.4 LTS
$ uname -r
6.5.0-25-generic
$ gfortran --version
GNU Fortran (Ubuntu 11.4.0-1ubuntu1~22.04) 11.04.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gfortran hello.f -o hello
hello.f:3:72:

       PAUSE
                                                                        1
Warning: Deleted feature: PAUSE statement at (1)
$ ./hello
PAUSE 
To resume execution, type go.  Other input will terminate the job.
go
RESUMED
 hello, world
$ gfortran -std=f95 hello.f -o hello
hello.f:3:72:

       PAUSE
                                                                        1
Error: Deleted feature: PAUSE statement at (1)
$ gfortran -std=legacy hello.f -o hello
$ ./hello
PAUSE 
To resume execution, type go.  Other input will terminate the job.
go
RESUMED
 hello, world
```
ビルドできないエラーについて

## はじめに
私は最近プログラミングスクールにて学習をスタートした初学者で、学習していく中で疑問に思ったことや苦労したことなどについて記事を書いております。


知識が浅はかですので、間違っている部分があるかもしれません。
あらかじめご了承ください。

## Realmをインストールしたらビルドができなくなった
cocoapodsにてRealmをインストールしてから急に下記のエラーがでて、ビルドができなくなりました。

![スクリーンショット 2024-02-29 20.48.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715605/20815650-ea48-1ed5-f9e5-a96b330c4d99.png)

**Command PhaseScriptExecution failed with a nonzero exit code**をググってみたところ、同じようなエラーが出ている人の記事を見つけることができましたが、エラー解消につながりませんでした。

## 試したけどダメだったこと

①Clean Build Folderをやってみる

![スクリーンショット 2024-02-29 1.27.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715605/71d950b5-da9e-d0c6-274d-d91edb020552.png)


②Xcodeを再起動する

③podfileのライブラリを消してpod install→ライブラリを戻してpod installする

この上記三つをやってみましたが解消できませんでした。

## エラー解決方法

xcodeにて、BuildSettingsで、ENABLE_USER_SCRIPT_SANDBOXINGを検索してNoにする。



![スクリーンショット 2024-03-02 0.31.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715605/97951587-9170-91e7-7fa1-18ff9a60072b.png)

バージョン指定を消して、pod installする。

![スクリーンショット 2024-03-12 13.08.33（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715605/d3367b4d-2cb4-3f4d-8fa1-38d4222f6762.png)

また、iosバージョンのところも確認しておく。(私の場合9.0→14.0にしました。)

## 終わりに

私の場合はこのやり方でエラーを解消することができました。

Realmのインストールでも苦戦したのに…

すごく大変な思いをしましたが、経験になったので良かったです。

こちらの記事が誰かの参考になれば幸いです。
Supports architecture aarch64 but the system is x86_64 が表示される

# D4T のサブスクリプションをアタッチするとエラー 'Supports architecture aarch64 but the system is x86_64' が表示される
とある件で、連絡をもらい確認したら出てきた情報で、
事象としては、数年前から確認されていたのですが、日本語化されていなかったようなので、翻訳リクエストを出して、早々に翻訳いただけたので、ご紹介します。
https://access.redhat.com/ja/solutions/7058385

## 事象
《 Issue 》に記載のあるとおりですが、
D4Tのサブスクリプションを登録・有効としたのち、"Supports architecture aarch64 but the system is x86_64"が表示される事象が起こるケースがあります。(100%発生はしないです)
### 発生環境
Intel/AMDのいわゆるIA環境で構築したRHELにD4Tのサブスクリプションを登録・有効すると表示されます。
※ aarch64 とは、ARMアーキテクチャの64ビット命令セットです。
## 対処方法
こちらも、《 Resolution 》に記載のあるとおり、/etc/pki/consumer/ と、 /etc/pki/entitlement/ のディレクトリを削除し、
subscription-manager 情報のclean実施後、--forceオプション使って、登録の実行、のみです。
ダッシュボードを制作する上での4つの重要なTips

# はじめに
ダッシュボードは、ビジネスの意思決定をサポートする貴重なツールですが、その効果を最大限に引き出すためには、いくつかのポイントを押さえておく必要があります。

私が経験から学んだ4つの重要なTipsをご紹介いたします。

# 1. 過去の振り返りではなくて、将来の意思決定をしたい

ダッシュボードの目的は、将来のビジネス課題に対する意思決定を支援することです。
これを言い換えると、利用者が知りたいのは「**これからどうしたらいいか**」です。

そのためには、ダッシュボードは過去の分析ではなくて、将来の方向性を示す必要があります。
アドホックな分析との違いを明確にし、将来を見据えたデータ提供を心掛けています。

||ダッシュボード|アドホック分析|
|--|--|--|
|強み|- 汎用性が高い情報を常に同じフォーマットで閲覧できる|- 特定の課題に対して、柔軟に分析できる|
|弱み|- 特定の課題に対する詳細な分析が必要な場合、十分な情報を提供しきれない|- 都度の分析~レポーティングが必要|

[Tableauの公式ブログ](https://www.tableau.com/ja-jp/blog/importance-of-reporting-and-ad-hoc-analysis-cycles-92586)でも、ダッシュボードとアドホック分析のサイクルを回すことの重要性が触れられております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/846404/9ccf6630-cdfe-0755-0ef2-d2e3b73bc5f2.png)

# 2. 数値には基準が必要

ダッシュボードに表示する数値には、現状と目標の基準を設定することが重要です。
目標を明確にしておくことで、「ダッシュボードは将来の意思決定のためのもの」という認知に繋がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/846404/b418c281-af9d-209a-aeb3-2a923f29a5a9.png)

基準の有無をグラフで表現すると、このような違いがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/846404/5cd23977-3b21-ad8a-5cc9-8d6eaec29d2b.png)

基準がない場合は、１月の売上が(2月,3月の売上に比較して)少なく見えますが、基準を可視化することで、１月の売上も(ノルマに対して)十分であることがわかります。

# 3. 役職と課題の紐付けも重要
利用者の役職や担当する課題に応じて、ダッシュボードの内容を適切に調整することも重要です。

経営層は長期的な視点が必要ですが、部長や係長はより具体的な課題に焦点を当てる傾向があります。それぞれの立場に応じた情報提供を心がけています。

役職と課題の関係は、会社の規模やビジネスモデルごとに異なるかなと思いますが、下表のような状態が理想の1つかなと考えます。

|役職|課題|ダッシュボードとの親和性|
|--|--|--|
|経営層|5~10年の経営計画|×|
|部長|1~3年のKPI進捗|▲|
|係長|1~3ヶ月のKPI進捗|⚪︎|

また長期的な視点になればなるほど、「現在どうなっているか」よりも「楽観だとどうなるのか、悲観だとどうなるのかといったシナリオ分析」の親和性が高くなります。

# 4. 細かいアジャストも必要
計画と実績がずれる場合、ダッシュボードを微調整することが必要です。

1~3ヶ月のKPI進捗は、多くの場合、中期経営計画をドリルダウンしたものが目標になるかと思います。
一方で、ドリルダウンしたノルマが1000で、直近の実績が100であるような、ノルマが高すぎる状態も想定されます。そうした場合に、①現実的なノルマや②必達ノルマといった感じで複数のノルマが発生したりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/846404/9533ef6a-13cc-74d9-f5e2-1f71613e914f.png)

上図のように、（場合によっては）基準の複数化など組織運営上の都度の要望に応えられるに調整してもよいかもしれません。

# おわりに
最後までお読みいただきありがとうございました。

本記事では、私がダッシュボード制作〜保守の経験から学んだ4つの重要なTipsをご紹介いたしました！

# 参考文献
KPIマネジメントやダッシュボードに関する書籍のおすすめです。

https://www.forestpub.co.jp/author/nakao_ryuichirou/lp/kpi/

https://www.shoeisha.co.jp/book/detail/9784798177649
Ardupilotドローン制作⑥ ～細かい設定～

設定すると便利な項目について書き連ねていきます

## Acroモードの設定

### トレーナー機能の解除

デフォルトで角度上限あり、高度維持のトレーナーモードのAcroとなっており、これを解除します。  
`ACRO_TRAINER=0`

### 加速度リミットを外す

デフォルトでリミットが設けられており、飛行の挙動に違和感を感じます。  
無効化します

```shell-session
ATC_ACCEL_P_MAX=0
ATC_ACCEL_R_MAX=0
ATC_ACCEL_Y_MAX=0
```

## スロットルの遊び

高度維持モードでスティックを動かしても無視する領域を設定します  
20%としたい場合  
`THR_DZ=200`

## タートルモード

n=プロポからのチャンネル  
`RCn_OPTION=151`

## RTL発動スイッチ

n=プロポからのチャンネル  
`RCn_OPTION=4`

## フェールセーフ時のRTL発動

`FS_THR_ENABLE=1`


## ある地点へのウェイポイント飛行(RTL含む)時に機首を進行方向に向ける

`WP_YAW_BEHAVIOR=1`

以上。なにか見つければ追記していく予定。
久しぶりにGASのClaspとWebぷちアプリ環境構築 in VSCode

## GASとClasp
仕事で久しぶりにGASを触るようになり、大したコードもかかないから直接GASのエディターで記載してたけど、VSCodeから書いたほうがいいレベルの分量が想定されたのでClaspで色々やろうと思ったのでメモ

## Claspの準備
こちらは、NodeJSとNPMをいれて（今更こちらの詳細は不要と思われる）、Claspをインストール

>npm install @google/clasp -g

まあ、ここは普通。コード補完等のために追加でいれるものもあるのだけど、今回パスした（忘れてた）

## VSCodeの準備
最近はやりのAI系をいれとくと、この手の「お作法が独特だけどポピュラー」な環境では便利
自分は、
Github Copilot  
Google Cloud Code
が入ってます。

## Claspがつかえるようにする準備
作業フォルダを作成し、そのフォルダをVSCodeでひらきます。
この時点ではなにもなし、Claspでログインをしておきます
>clasp login

ブラウザが開いて認証求められるので認証してください

次にGASファイルのやりとり、ここは前と変わらず、
先にGASを作成してローカルにもってくるか、Claspで作成してアップロードするかで
>clasp clone スクリプトID

または
>clasp create

## ファイルのやりとり
一人でやってるだけなら、
>clasp pull

と
>clasp push

で取得とアップロードができるので、こちらで完了

## 開発時のデプロイ
今回は、Taskをつかってみた
tasks.jsonをプロジェクトフォルダの直下に.vscodeをつくりそこにおく

Pull、Push
```tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Clasp Pull",
      "type": "shell",
      "command": "clasp pull",
      "group": "none",
      "problemMatcher": []
    },
    {
      "label": "Clasp Push",
      "type": "shell",
      "command": "clasp push",
      "group": "none",
      "problemMatcher": []
    }
  ]
}
```

次にClaspコマンドで新しいバージョン、シェルスクリプトで現在のデプロイIDのバージョンをつくったバージョンに変更するスクリプトをつくる
```update-deployment.sh
#!/bin/bash

# 新しいバージョンを作成
version=$(clasp version "Updated via VSCode" | grep -o '[0-9]*')

# 特定のデプロイIDでデプロイを更新
deployId="DEPLOY_ID_FOR_UPDATE"
clasp deploy -i $deployId -V $version

```

シェルスクリプトには実行権限をつけておく
>chmod +x ./update-deployment.sh

新しいバージョンをつくるTaskとできたバージョンの番号をつかって特定のデプロイIDのバージョンを更新するTask
（バージョンをつくるTaskは自分では使用しない。デプロイ更新のTaskから呼ばれる)

```tasks.json
        {
            "label": "Create New Version",
            "type": "shell",
            "command": "clasp version 'New version from VSCode'",
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "Update Deployment",
            "type": "shell",
            "command": "./update-deployment.sh",
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
```

tasks.jsonやupdate-deployment.shの置き場所等に問題がなければこれでOK

## ものぐさなのでさらにアドオンにたよる

これをターミナル→タスクの実行、でやるのでいいのだけど、GUIでポチッとな、をしたいのでアドオンをいれた
私がいれたのはこれ
[Task Runner](https://marketplace.visualstudio.com/items?itemName=SanaAjani.taskrunnercode)

すると、左下のアウトライン、タイムラインの下にTASKRUNNERがあらわれ、上で作成した各種Taskが表示されるので、それぞれ必要に応じて実行する

## 雑感
正直、ここらへんのよく行われる作業については、たいていのAIは知っているので、聞くとほぼ問題なく答えてくれるし、GASのコードもやりたいことを正確にコメントでかけば、コパイロットがサジェストしてくれるのでいちいちググることもへるかもしれない
サンデーエンジニアにはいい時代になった（笑

ただし、AIたまに間違えるので注意。GASではあまり見ないけど、VBAでガンガン存在しないメソッドを提案されてこまりました
wslアンインストール→インストール→docker on wsl without docker desktop

# wsl uninstall & install
wslの挙動が何かおかしくなったことからwslの入れ直しの判断。
ちゃんとアンインストールしないとインストールされないのできっちり段階を踏む。
まずはアンインストール手順
１．WindowsにインストールされているLinuxディストリビューションをすべて削除
２．wslコンポーネントの削除
３．仮想マシン プラットフォームの有効化と無効化
Windows11の設定画面からでもいいし、以下のコマンドをcmdに打つのでも良い。
```
仮想マシンプラットフォームの機能の無効化 
dism.exe /online /disable-feature /featurename:VirtualMachinePlatform

Windows Subsystem for Linux の機能を無効化
dism.exe /online /disable-feature /featurename:Microsoft-Windows-Subsystem-Linux
```

上手くいかなかった例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/ce68ce27-8bcf-5f7d-e602-f5c658326d55.png)

WSL側で参照ができていないようなので、WSL側の登録を解除してあげれば大丈夫。
```
C:\Windows\system32> wslconfig /u Ubuntu-22.04
登録解除。
この操作を正しく終了しました。
```
この後にpowershellで
```
PS C:\Users\00220401950> wsl --install -d Ubuntu-22.04
Ubuntu 22.04 LTS は既にインストールされています
Ubuntu 22.04 LTS を起動しています...
```
とすれば
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/4ec182f1-8b1b-b47a-bac7-ead7034294c5.png)
Unixアカウント作成画面に飛べるはず。

==================================================================
# Docker engine Install

参照にしたのは以下のURLの方。
https://zenn.dev/rhene/articles/docker-on-wsl2-without-docker-desktop

スタートメニューからUbuntuを起動とあるがwslからでもいけた。同じカーネルとやり取りしてるんだからそりゃそうか。
```
# Dockerのインストール
sudo apt update
curl https://get.docker.com | sh

# docker-composeのインストール
# sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# sudo chmod +x /usr/local/bin/docker-compose
sudo apt install -y docker-compose
```
以下のコマンドを打って、インストールが無事されているかどうか確認
```
sudo docker run --rm hello-world
```
実行結果が以下のようになれば無事完了。
```
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```
## sudoなしでdockerコマンド実行したい 
```
# sudo groupadd docker
sudo usermod -aG docker $USER
exit
```

# vscode-wslのconnect to wslができなかった件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/5de6f9fd-ffbc-c7ad-fd4a-0a0241269552.png)
おそらくアンインストール前に残っていたキャッシュなどが悪さしたんでしょうか、vscodeがremoteでwslにつながらなくなってしまった。

いろいろ探ったところ、wslの更新をしていなかったことが原因っぽい。以下のコマンドを実行。
```
PowerShell 7.4.1
PS C:\Users\00220401950> wsl.exe --update
```
無事にvscode開く→F1→connect to wslで接続完了！！
JuliaでDeep Learningを理解する: 3.3 Shallow network regions

[Understanding Deep Learning](https://udlbook.github.io/udlbook/)の[ノートブック](https://github.com/udlbook/udlbook/blob/main/Notebooks/Chap03/3_3_Shallow_Network_Regions.ipynb)をJuliaで確認する。
# 3.3 Shallow network regions
[JuliaでDeep Learningを理解する: 3.2 Shallow neural networks II](https://qiita.com/dokudo9191/items/c5539cd5e97131b4f1d4)で活性化関数が領域を分割することを確認した。領域数はxの次元数Diと隠れユニットの数Dに依存する。その数はZaslavsky式で与えられる。
```math
\begin{equation}N = \sum_{j=0}^{D_{i}}\binom{D}{j}=\sum_{j=0}^{D_{i}} \frac{D!}{(D-j)!j!} \end{equation}
```
Juliaで書くと
```julia
number_regions(Di, D) = sum([binomial(big(D), j) for j in 0:Di])
```
Int64の範囲を超えるので`big(D)`でBigInt型にしている。
```julia
inputdims = [1, 5, 10, 50, 100]
hiddenunits = 1:1000
fig = Figure()
ax = Axis(
    fig[1, 1],
    xlabel="隠れユニットの数",
    ylabel="領域の数",
    ytickformat=values -> rich.("10", superscript.(string.(Int.(values))))
)
for inputdim in inputdims |> reverse
    regions = log10.(number_regions.(inputdim, hiddenunits))
    lines!(ax, hiddenunits, regions, label="Dᵢ=$inputdim")
end
axislegend()
```
![number_regions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2279125/cf02aecd-aba0-0cb6-4f1e-25448b2308d1.png)
縦軸はlogスケールなので、急激に領域数が大きくなっていることがわかる。そして隠れユニット数より入力次元に強く依存する。これは次元の呪いとも関係がある。