OmniAICreator/Qiita-1.07M huggingface dataset:
Go to python REPLボタン

instantNerFのメニューにある"Go to python REPL"のボタンについて調べました。

![230108_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/d2dd2179-ba0f-1dc3-5d2f-beeff952304b.png)

#### testbed.exe 
これを実行した場合、このボタンは機能しませんでした。
testbed.cuの中でこのボタンが変更するm_want_replから探っても実際に動作させている部分が見つかりませんでした。

#### run.py
ここから呼び出されていました。
run.pyを動かすときコマンドライン引数に--guiを与えて開くメニューから"Go to python REPL"のボタンを押すと、コマンドプロンプト上にreplが開きました。

![230108_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/2ebe4c38-d22e-045d-cfdd-6db313139058.png)


common.pyの中で標準ライブラリでインタプリタを起動する関数を呼び出していました。

![230108_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/0512313a-7b9e-5cf2-eaad-bc77a69c9d87.png)

https://qiita.com/Alice1017/items/74ec054f357f4f292cd9

#### 参考

https://zenn.dev/ynakashi/articles/15b2b7c0a3cd89
ブラウザでCORSを無効化する方法


開発などでブラウザのCORSを無効化したい時がある。
何度も調べるのは面倒なのでメモ。

:::note alert
警告

本記事に記載している内容はCORSだけでなく、ブラウザの様々なセキュリティ機能を無効化する危険な行為です。
今すぐにセキュリティを無効化しないといけない事情がある場合を除いて安易に実施しないでください。セキュリティを無効化した状態でのインターネット接続など言語道断です。
上記内容、そして本記事に記載している行為を理解している方のみ自己責任でお願いします。
:::

# Google Chrome

以下のコマンドでChromeを起動する。`--user-data-dir`を指定しないと既存の設定でChromeが起動し、セキュリティは有効のままだった。
不要になったらここで作成したデータディレクトリは消せばよい。

`<Chrome実行ファイル> --disable-web-security --user-data-dir=<データディレクトリ>`

```powershell:CORSを無効化したChromeの起動コマンド例
"C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir=D:\tmp
```

正しく無効化された場合、下のようなメッセージが表示される。

![chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705474/369b529d-1fa9-f741-d458-d4f4a6387683.png)

# Edge

Chromeと同じく以下のコマンドでEdgeを実行する。`--user-data-dir`を指定しないと既存の構成でEdgeが起動し、セキュリティは有効のままだった。
不要になったらここで作成したデータディレクトリは消せばよい。

`<Edge実行ファイル> --disable-web-security --user-data-dir=<データディレクトリ>`

```powershell:CORSを無効化したEdgeの起動コマンド例
"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"  --disable-web-security --user-data-dir=D:\tmp
```

正しく無効化された場合、以下のような表示となる。

![Edge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705474/18604ac3-081e-b22d-8ee9-10a44a47ae21.png)

# Firefox

アドレスバーに`about:config`と打ち込み、設定画面を表示する。警告画面が表示されるが、「危険を承知の上で使用する」というボタンを押下して続行。
画面から以下2つの項目を設定する。2つ目はローカルのHTMLファイルなどを直接開くときに必要となる。

- `content.cors.disable`：`true`
- `security.fileuri.strict_origin_policy`：`false`
GoogleスライドやGASで設定できないこと

GASでスライドを触っていて、できること・できないこと・回避策が分かったものがあったので書き残します。

# 現時点でGoogleスライドで設定できないこと
以下のことは、スライドの機能にありませんが、無理やり他の手段でそれらしく見せることはできます。

## 文字を縦書きにする
現状そのようなオプションはありません。
等幅フォントにする＆テキストボックスの幅を1文字分にすることで、疑似的に縦書きのように見せることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/2bb153a8-6118-179a-368e-c4f759fe7ce1.png)

Googleドックでも縦書きはできません :cry: 
https://support.google.com/docs/thread/12054700/how-do-write-vertically-from-top-to-bottom-not-just-one-letter-per-row-but-as-a-word?hl=en

## 文字を均等割り付けする
現状そのようなオプションはありません。
等幅フォントにする＆スペースなどで文字間隔を調整するか、1文字ずつ図形を分けて左右に整列するかで、無理やり均等割り付けのような状態にすることはできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/6284f5c8-2a26-c954-3a8b-ee8a008dc05e.png)

# 現時点でGASで操作できないこと
以下のことは、スライドを人手で操作すれば変更できますが、GASからの操作ができません。
## スライドに挿入したシェイプのパティング
スライド上では上下左右を細かく設定できますが、GASでは設定用メソッドが用意されておらずデフォルト値の0.25cm固定となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/1e5e36af-9139-83f3-5802-084fe1cb314f.png)

手で設定した図形をGASでコピーすればパディングを変更した状態にできます。

## スライドのページ設定のサイズ
メニュー「ファイル > ページ設定」からスライドのサイズを指定できますが、GASからは変更できずデフォルト値の「ワイドスクリーン（16:9）」固定となります。
これもあらかじめ設定しておけばそのファイルではページ設定が有効となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/2ac1e7a3-4793-88a4-15a8-25cea00968ac.png)

## スライドの印刷設定で「スキップしたスライドを含める」をオフにする
メニュー「ファイル > 印刷プレビュー」を開くと「スキップしたスライドを含める」が有効(薄黄色)になっています。
これを無効にすることで、スキップスライドは印刷もされなくなります。
これもあらかじめ設定しておけばそのファイルではスキップスライドは印刷やPDF出力には含まれなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/0a4b6c30-9f66-22ed-7062-7d9ce31d00f2.png)

# 公式ドキュメント
### GAS Googleスライド
https://developers.google.com/apps-script/reference/slides

### GAS Googleドライブ
https://developers.google.com/apps-script/reference/drive
処理のDRYと意味のDRY



- DDDやってるようなプロジェクトでも自覚的にならないとやらかしがちなんで言語化してみました
- DRY原則の適用範囲はコード、ドキュメント、DB設計...と多岐にわたるが、ここではコード上のDRYについて言及する。

# DRYの弁別

[DRY原則](https://ja.wikipedia.org/wiki/Don't_repeat_yours)言うものがある。要するに、同じ内容を複数場所で表現すると後でお前が死ぬぞ、ということである。
プログラマなら箸の持ち方より先に学ぶ大原則であるが、脳死で適応し続けるとプロダクトが死ぬパターンも存在する。
記述をまとめすぎた事によって、可読性が下がったり変更に弱くなったり経験がある人も多いと思う。
そういったリスクを防ぐために __「処理のDRY」__ と __「意味のDRY」__ を分けて考えることを提案したい。

例えば以下のようなコードがあるとしよう

```:python
applePrice = 100
grapePrice = 200

# 休日料金
appleHolidayFee = applePrice * 1.1
grapeHolidayFee = grapePrice * 1.1

# 税込み料金
appleTaxIncludedAmount = applePrice * 1.1
grapeTaxIncludedAmount = grapePrice * 1.1
```

DRY原則を愚直にやるなら以下のような形式にまとめたくなるかもしれない


```:python
applePrice = 100
grapePrice = 200

# 休日料金
appleHolidayFee = calcTenthsIncrease(applePrice)
grapeHolidayFee = calcTenthsIncrease(grapePrice)

# 税込み料金
appleTaxIncludedAmount = calcTenthsIncrease(applePrice)
grapeTaxIncludedAmount = calcTenthsIncrease(grapePrice)

def calcTenthsIncrease(basePrice):
  return basePrice * 1.1
```

しかし、休日料金と税込み料金は本質的に異なるものである。
客足が減って休日での割増率を減らしたらどうだろう？あるいは法改正で消費税率が75%になったら？　しんどい作業が迫りくるのは想像に難くない。
処理の具体的な内容だけに注目したDRY原則の適用は、将来の変更に対してコストとリスクを上げる場合があるのだ。

各々の処理の意味に注目に注目すれば以下のような形式にできる。

```:python
applePrice = 100
grapePrice = 200

# 休日料金
appleHolidayFee = calcHolidayFee(applePrice)
grapeHolidayFee = calcHolidayFee(grapePrice)

# 税込み料金
appleTaxIncludedAmount = calcTaxIncludedAmount(applePrice)
grapeTaxIncludedAmount = calcTaxIncludedAmount(grapePrice)

def calcHolidayFee(basePrice):
  return basePrice * 1.1

def calcTaxIncludedAmount(basePrice):
  return basePrice * 1.1
```

コード行は増えるがこちらのほうが変更への耐性はずっと上がることだろう

# 総括

処理のDRYは当然重要。例えば Generics のない言語は実務上やっぱしんどい。
しかしながら、とにかくDRYだ！ひたすらDRYだ！！死んでもDRYだ！！！ってテンションだと後々つらいことになるパターンも存在する。
処理のDRYと意味のDRYの区別を頭の片隅に入れておくと、未来のあたなが助かることもあるかもね🫵
Nuxt2 / Nuxt3 (Vue ) - ボタンをクリックしたら Fetch で GETリクエストする

# コード例

```vue
<template>
  <div>
    <div>
      <button @click="getTodos">getTodos</button>
    </div>
    <ul>
      <li v-for="item in items">
        {{ item.id }} {{ item.title }}
      </li>
    </ul>
  </div>
</template>

<script>

export default {
  data: () => {
    return {
      items: [],
    };
  },
  methods: {
    async getTodos() {
      const data = await fetch('https://jsonplaceholder.typicode.com/todos/')
      const json = await data.json()
      this.items = json
    }
  },
};
</script>
```

# 表示例

<img width="867" alt="image" src="https://user-images.githubusercontent.com/13635059/211199744-0c4a2d95-4cce-4ece-b000-7fd1fdeef6d6.png">


# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
VirtualBoxでフォルダ共有（Windows10+Ubntu20.04）

# 環境
VirtualBox6.1
ホストOS: Windows10 Home 20H2
ゲストOS: Ubuntu20.04

# VirtualBoxの設定の共有フォルダー

フォルダーのパス：Windows10側のフォルダパス（フルパス）
フォルダー名：share
自動マウント：チェックあり
マウントポイント：Ubuntu側のフォルダパス（フルパス）
永続化する：チェックあり

# 共有フォルダの権限を変更する（ユーザーをvboxsfグループに追加）
自動マウントすると　共有フォルダの権限が root/vboxsf 770　となってしまうため、一般ユーザーからアクセスできない。
そこでユーザーをvboxsfグループに追加してあげる
sudo usermod -aG vboxsf ${USER}

設定変更を反映するためにUbuntuをいったん電源オフして、立ち上げなおす。

# 参考にしたサイト
【virtualbox】WindowsとUbuntuでファイルを共有する方法

https://medium-company.com/virtualbox-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%85%B1%E6%9C%89/

VirtualBoxで共有フォルダのパーミッションをvboxsfから変更する方法

https://turningp.jp/virtualization/virtual_box/vboxsf
Secure Agentを自動起動する

Informatica Intelligent Cloud ServicesのSecure AgentをSystemdで自動起動するユニットファイルのサンプルです。
WindowsではSecure AgentをインストールするとWindowsサービスに自動登録されますが、Linuxでは手動で設定する必要があります。


:::note info
本記事では以下の環境にSecure Agentをインストールしています。
OS: Ubuntu 20.04
User/Group: ubuntu/ubuntu
Install Path: /home/ubuntu/infaagent
:::

1. ユニットファイルを作成する
    1. `/etc/systemd/system/`に`SecureAgent.service`をというファイルを新規作成します。
    1. `SecureAgent.service`にSecure Agentの起動のための情報を定義します。ユーザー名やパスなどはご利用の環境に合わせて変更してください。
        ```SecureAgent.service
        [Unit]
        Description=Secure Agent Startup Service
        After=syslog.target network.target
        
        [Service]
        Type=forking
        User=ubuntu
        Group=ubuntu
        StandardOutput=console
        WorkingDirectory=/home/ubuntu/infaagent/apps/agentcore
        ExecStart=/home/ubuntu/infaagent/apps/agentcore/infaagent startup
        ExecStop=/home/ubuntu/infaagent/apps/agentcore/infaagent shutdown
        SyslogIdentifier=SecureAgent.service
        TimeoutStopSec=300
        
        [Install]
        WantedBy=default.target
        ```
    
2. サービスを起動する
    1. 次のコマンドでサービスを有効化し、起動します。
        ```bash
        $ sudo systemctl enable SecureAgent
        $ sudo systemctl start SecureAgent
        ```

***
ユニットファイルの内容で過不足や変更したほうがよい記述があればコメントいただけますと幸いです。
初めてのマクロ：クリック1回でグラフを作成!!

# マクロって聞いたことあるけど何??
- クリック1つでエクセル内の作業を自動でやってくれるメチャ便利な機能

# 僕とマクロとの出会い
- 日々、色々な数値をエクセル内でポチポチやっていた
- 地味に時間かかる……自動化できるんじゃないの?
- ググってみると「【マクロ】というので出来るらしいぞ!」と判明
- ちょっと勉強してみた（←今ココ）

# この記事で説明する事
- 王将の売上前年同月比のグラフを自動で出す（参照した数字は[コチラ](https://contents.xj-storage.jp/xcontents/AS00845/8a45a0a8/5bde/4bfb/a853/e687a6fb7017/20220615130904002s.pdf)）

    - 完成形の図
        - 「グラフ化」のボタンを押すとグラフが完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/3e601119-e376-2771-b1fe-f64a5c71dbd3.png)

# 上記が完成するまで実際にやってみる

## 1,マクロの始め方
- マクロを使う準備をしよう
    - ①Excelを開く
    - ②開発タブを追加（設定しないと下記画像の **「開発」** が無いはず）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/de4c1ac3-119a-85db-02fa-0068390f3f8b.png)
        - 「開発」の追加方法
            - Excelの左上にある「ファイル」→「オプション」→「リボンのユーザー設定」→「開発」を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/7c3a9f60-9ad4-db38-f621-606823c43705.png)
## 2,マクロの記録をしてみよう
- ①「開発」を選択
- ②「マクロの記録」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/ab2bfbbd-aefa-7c06-11b3-ceb5650b65d4.png)
    - 今からマクロに覚えさせる作業名を決める。今回は「グラフ作成」と命名!!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/c82c32ad-9280-4a85-e34c-e536683b4b56.png)
- ③実行させたい事を実際に行う
    - グラフを作る為に該当部分を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/c36c8dce-30d5-d814-1e30-1b6abc97a57e.png)
    - 「挿入」→「折れ線グラフ」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/1e10519e-6c81-97bd-874f-ea38a8d6c918.png)
    - 折れ線グラフが完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/50aab094-6727-db67-f09c-7417400a84c2.png)
- ④「記録終了」をクリック
    - 【③実行させたい事を実際に行う】をマクロに記憶させる事が完了!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/8bf36e79-a016-139b-7896-8160efccd36b.png)
- ⑤マクロに記録が残る
    - 【マクロ】を選択すると記録させた物が出てくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/5e0616f1-8e28-bac3-3950-3d06989bf41e.png)



## 3,マクロを実行するボタンを作ろう
- ①「挿入」→「ボタン（フォームコントロール）」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/7a52c2d7-828c-8f18-b5f0-5986bb0851c2.png)
- ②先ほど作った「グラフ作成」を選択してOKをクリック
- ③ボタンが出てくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/cc9a1638-974c-fdb3-131a-fb75a07cba7b.png)
- ④ボタンの名前を「グラフ化」に変更
- ⑤「グラフ化のボタン」を押して、グラフが出てくるか試してみる
- ⑥完成!

# マクロの保存
- 保存する際、「Excelマクロ有効ブック」を選択
    - これしないと、次回マクロが使える状態にならない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578844/bdcf84cb-494e-726e-0fe3-4695abeb73de.png)
MySQL起動時のコマンド


mysql起動時には以下のコマンドを使う。

```
mysql -h ホスト名 -u ユーザー名 -p データベース名
```


オプションでそれぞれを指定しない場合はそれぞれ以下のデフォルト値が使われる。

```
ホスト名   localhost
ユーザー名 ログイン名(Unixの場合)
パスワード（パスワードなし）
```



パスワードが設定されている場合はパスワードを入力しないとログインできないようになります。



# 参考

https://26gram.com/connect-to-mysql

https://blog.codecamp.jp/root-password

https://qiita.com/nanakenashi/items/180941699dc7ba9d0922
【GitHub】リリース管理方法の手順

# 初めに

GitHub で下図のようなリリース管理方法を記載します。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/1ea53b4f-ea5b-4ced-3614-0eaf296868bf.png)


# 手順

１. 「Releases」 を押下する。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/c6f47a61-a99c-35c6-8ce9-9e57b37ff07e.png)

２. 「Draft a new release」を押下する。（リリース物がない場合は「Create a new release」を押下する。）

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/1f79f5d1-baae-c09a-ab3b-ae85a7b02570.png)

３. タグ、ブランチ、リリースタイトル、詳細を記載して「Publish release」を押下する。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/59393add-d4a2-3b01-1f45-3d222261d760.png)

# 参考資料

https://docs.github.com/ja/repositories/releasing-projects-on-github/managing-releases-in-a-repository
【備忘録】OpenBrush上でスクリプトからウィンドウをポップアップする方法

- AdminPanelプレハブのAdminPanelスクリプトのPanelPopUpMapインスペクタにコマンドとポップアップしたいウィンドウをセットにして追加する
    - コマンドはSketchControlScriptスクリプトに記述
- BasePanelスクリプトのCreatePopUpを使用
    - CreatePopUpの引数のコマンドを上のAdminPanelプレハブのインスペクタに追加したコマンドにする
    - 他の引数は基本いじらなくてOK(オーバライドもある)
    - 任意の箇所で呼び出す(実体化したAdminPanelプレハブから呼び出すのを忘れないように)
- できた！
geometry_msgs/PoseWithCovarianceStamped をrosbag_to_csvした時、covarianceの行が括弧でくくられてしまっている件

## 経緯
rosbagのなかのgeometry_msgs/PoseWithCovarianceStamped型のトピックをrosbag_to_csvでcsv化すると、covarianceのすべての成分が()でくくられて扱いづらい。![Screenshot from 2023-01-08 19-34-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1294864/96e0c098-7d2a-ed15-5b9a-d99b4d8933f5.png)
応急処置的ではあるが、pythonでcovarianceの成分を一つづつ列に保存するようにする。

## 環境
- Ubuntu18.04
- ROS1
- python2.7

## スクリプト
```php:covariance_to_csv.py
import rosbag
import sys
import os
import pandas as pd

# get path
argv = sys.argv
filename=os.path.normpath(os.path.join(os.getcwd(),argv[1]))

# read from bag file
bag = rosbag.Bag(filename)

# select topic
print '---- topic list ----'
topics = bag.get_type_and_topic_info()[1].keys()
k = 0
for val in bag.get_type_and_topic_info()[1].values():
    if val[0] == "geometry_msgs/PoseWithCovarianceStamped":
        print k, '  topic  ', topics[k]
        print '    msg    ', val[0]
        print ''
    k += 1
number = input("input topic number : ")
topic_name = topics[number]

# initialized dict
col_name = ["sec", "nsec", "x", "y", "z", "q_x", "q_y", "q_z", "q_w"]
cov_comp = []
cov_size = 36
for i in range(cov_size):
    cov_name = "cov"+str(i)
    col_name.append(cov_name)
    cov_comp.append(cov_name)

pose_data_dict = {}
for i in range(len(col_name)):
    pose_data_dict[col_name[i]] = []

# msg
for topic, msg, t in bag.read_messages():
    if topic == topic_name:
        pose_data_dict["sec"].append(msg.header.stamp.secs)
        pose_data_dict["nsec"].append(msg.header.stamp.nsecs)
        pose_data_dict["x"].append(msg.pose.pose.position.x)
        pose_data_dict["y"].append(msg.pose.pose.position.y)
        pose_data_dict["z"].append(msg.pose.pose.position.z)
        pose_data_dict["q_x"].append(msg.pose.pose.orientation.x)
        pose_data_dict["q_y"].append(msg.pose.pose.orientation.y)
        pose_data_dict["q_z"].append(msg.pose.pose.orientation.z)
        pose_data_dict["q_w"].append(msg.pose.pose.orientation.w)

        for i in range(cov_size):
            pose_data_dict[cov_comp[i]].append(msg.pose.covariance[i])
bag.close()

# to csv
df = pd.DataFrame.from_dict(pose_data_dict)
df = df[col_name]
df.to_csv("pose_with_covariance.csv")
print "Saved csv file"
```

## 動作
command入力
```
python covariance_to_csv.py [input_csv_path]
```

```
---- topic list ----
1   topic   /localization/pose_twist_fusion_filter/pose_with_covariance_without_yawbias
    msg     geometry_msgs/PoseWithCovarianceStamped

2   topic   /localization/pose_estimator/pose_with_covariance
    msg     geometry_msgs/PoseWithCovarianceStamped

input topic number : 2
Saved csv file
```

pythonスクリプトと同じディレクトリにcsvが保存されます。
草莽Erlang ── 15. case

口で言うより行うことがErlang習得への近道と信じています。

https://qiita.com/mnishiguchi/items/9237780e849d80a85e11

## case式の書き方

```
case 式 of
  パターン1 [when ガードシーケンス1] ->
    本文1;
  パターンN [when ガードシーケンスN] ->
    本文N
end
```

1. `case`と`of`の間にある式が評価される
2. その結果に対してパターンが順次マッチングされる
3. マッチングが成功し、ガードシーケンスが真であれば、対応する本文が評価される
4. 本文の戻り値が`case`式の戻り値となる
5. 真のガードシーケンスを持つパターンがない場合、`case_clause`ランタイムエラーが発生する

試しに練習目的で`case`式を使った簡単な無名関数を書いてみます。受け取った引数のパターンに応じて真偽を判定するだけの関数です。無名関数なので、Erlangシェルに貼り付けて使えます。

```erlang
IsValidResult = fun (Result) ->
  case Result of
    {ok, _Value} ->
      true;
    error ->
      true;
    _Else ->
      false
  end
end.
```

```erlang
> IsValidResult({ok, 123}).
true

> IsValidResult(error).
true

> IsValidResult([1, 2, 3]).
false
```

https://www.erlang.org/docs/22/reference_manual/expressions.html#case

https://learnyousomeerlang.com/syntax-in-functions#in-case-of

https://www.ymotongpoo.com/works/lyse-ja/ja/05_syntax_in_functions.html#in-case-of

## Elixirにも挑戦したい

闘魂ElixirシリーズとElixir Schoolがオススメです。

https://qiita.com/torifukukaiou/items/3b65e5c04fa8c55f526e

https://elixirschool.com/ja

https://qiita.com/piacerex/items/09876caa1e17169ec5e1
kube-apiserverが上がってこなくなった時の対処方法

# はじめに
`/etc/kubernetes/manifests/kube-apiserver.yaml`ファイルをいじって、kube-apiserverが上がってこなくなった時の対処

# プロセスを確認する

```
# ps aux | grep api
root       14078  0.0  0.0   8168   720 pts/0    S+   13:06   0:00 grep --color=auto api
```

# ログを確認する
プロセスが上がってなかったら、ログを確認する。

```
# cd /var/log/pods/
# ls
kube-system_calico-node-brz7q_d8abf832-5f13-478a-8f0e-26cf6796ff3b  kube-system_kube-apiserver-master20221221_af2ba9f27df306e3e862e54b346e935c           kube-system_kube-proxy-x8k7z_bc58af86-9579-46eb-93ef-a2ae76e16104
kube-system_etcd-master20221221_a87fe260401d9bad7e142301cabb6254    kube-system_kube-controller-manager-master20221221_6c2645203467fdf0eed56711a95c0efb  kube-system_kube-scheduler-master20221221_9593663ce0dd3f05a7929eafd2fa3b67
```

```
# tail kube-system_kube-apiserver-master20221221_af2ba9f27df306e3e862e54b346e935c/kube-apiserver/6.log
2023-01-08T13:06:40.765262964Z stderr F I0108 13:06:40.765094       1 server.go:563] external host was not specified, using 10.0.0.4
2023-01-08T13:06:40.765894308Z stderr F I0108 13:06:40.765839       1 server.go:161] Version: v1.25.5
2023-01-08T13:06:40.765903897Z stderr F I0108 13:06:40.765860       1 server.go:163] "Golang settings" GOGC="" GOMAXPROCS="" GOTRACEBACK=""
2023-01-08T13:06:41.133390544Z stderr F E0108 13:06:41.133277       1 run.go:74] "command failed" err="error while parsing encryption provider configuration file \"/etc/kubernetes/etcd/ec.yaml\": error while parsing file: resources[0].providers[0].aescbc.keys[0].secret: Invalid value: \"REDACTED\": secret is not of the expected length, got 8, expected one of [16 24 32]"
```
【Android】jetpack Composeでのアーキテクチャについて【Kotlin】

# はじめに
今回はjetpack Composeを構成するためのアーキテクチャについて
Developersの内容を自分なりにまとめたものや補足したもの記事にしました

# 主なレイヤーの種類
**Runtime**
remember、mutableStateOf、@Composebleアノテーション　などのComposeを使用した際に使われる要素を使えるようにします

**UI**
ui-text、ui-gtaphica、ui-toolingなどの複数のモジュールで構成されていて、ModifierやPreview、AligmentなどのUIに必要なツールキットを実装するときに使われます

**Foundation**
Row、Column、LazyColumnなどを使用するときに使われます

**Material**
マテリアルデザインシステムの実装、テーマ・スタイル・アイコン等を使用するときに使われます
アプリでマテリアルデザインを使用する際はビルドが必要です

# remember　remeberSaveable について
ここでは使用したRuntimeモジュール内で使われるrememberとremeberSaveableについて気になったので調べた内容を一緒に残していきます

**remember**と**remeberSaveable**はComposeble関数で特定の値を保持でき、
Composeble関数が再コンポーズされたときに　また取得することができます

違いはActivityが破棄されたときに保持した値が破棄されるかどうかです
rememberSaveableならActivityが破棄された際も値を保持したままにできます
[Unity]ディクショナリーを使って定数のアイテム管理してみる

<h2>ディクショナリーを使ったらアイテム管理が楽になる</h2>
ゲームのアイテム管理を楽にする方の一つとして

<b>ディクショナリー型を使ってみるといいのではないか</b>と思ったので紹介させて貰います

この前2Dのゾンビゲームを開発してみたのですが

銃を購入する→プレイヤーの弾数を変更するという流れを実装するのに

かなり有用な方法でした

<h3>☆ディクショナリーを使う前☆</h3>

*変数GunNameには取得した銃の名前が入る

if(GunName == "HandGun")
{
    ammo = 30;
}
else if(GunName == "LMG")
{
    ammo = 50;
}
..........銃の数だけ増える

と記述すると冗長になってしまい初心者感丸出しになってしまいました

<h3>☆ディクショナリーを使った後☆</h3>

 Dictionary<string, int> AmmoDic = new Dictionary<string, int>()
{
    {"handgun",30},{"Assault", 30},{"LMG", 50},{"Rocket", 7}
};

と宣言して

AmmoDic.TryGetValue(WeaponName, out int value);

Ammo = Value;

と書くだけで
ハンドガンを購入した時Ammmoは30発になるし、LMGを購入した時Ammoは50発になる

さらに銃の種類を追加したい時も、ディクショナリーに銃の名前と球数を追加すればいいだけに!!

アイテム数が少ないときはこの管理方法が自分はイイと想いましたが、他にもあったらコメント等で教えていただけると幸いです

それでは。
VSCodeの便利機能あれこれ

# 拡張機能
#### Material Icon Theme
* かわいいファイルアイコンにできる。

#### Prettier - Code formatter
* 高機能なフォーマッター。
#### （以下はVSCode自体のフォーマット設定含む）
* VSCodeの設定で default formatter でデフォルトに設定する事で、ソース上右クリックのフォーマットで使用される。
* また、同じく設定の Prettier: Single Quote でダブルクォートをシングルクォートにフォーマットしてくれる。
* 同じく設定の Editor: Format On Save で保存時にフォーマットしてくれる。
* 設定の prettier semi でセミコロン有り無し設定ができる。

# エディタ機能
#### 拡大・縮小
* 表示の外観内　または、シフト⌘-（拡大）、⌘-（縮小）

#### スペースの「・」表示
* 設定の whitespace でallにする。
crontabの編集と動作確認の方法

・編集を始めるコマンド
```
~$ crontab -e
```


・crontabそのものの動作確認
~/crontab_config_test.logの内容が1分おきに更新されます。
```
* * * * * echo 'Crontab is working.' > ~/crontab_config_test.log 2>&1
```


crontabに記述したコマンドの動作確認
~/crontab_command_test.logの内容が1分おきに更新されます。
```
* * * * * ここにコマンド > ~/crontab_command_test.log 2>&1
```

上記でログを確認し、問題なさそうであれば、日時を必要なものに変更する。
【Unity】役立つリンク集

# パッケージ類

パッケージ化されていないものはリンクを貼っています。

Unity OpenUPM のパッケージを導入する際は下記を参考にしてください。

https://zenn.dev/shiena/articles/unity-openupm

## 便利系

```Scene,Tag,Layer,SortingLayer の定数を生成.giturl
https://github.com/doyasu24/UnityNamesCodeGenerator.git?path=Assets/Plugins/NamesCode#3.1.0
```

[const-generator](https://github.com/jwellone/const-generator/tree/main) : Scene,Tag,Layer,SortingLayerの定数を自動生成
1つ上の UnityNamesCodeGenerator に比べて、自動生成なので更新を忘れずに済む。

``` ファイルの利用箇所を高速検索.giturl
https://github.com/ina-amagami/unity-reference-viewer.git
```

``` 利用頻度の高いアセットに即アクセス.giturl
https://github.com/MasyoLab/UnityTools-FavoritesAsset.git?path=Assets/MasyoLab/FavoritesAsset
```

``` フォルダにプリセットを設定して、インポートの際に自動適応.giturl
https://github.com/nomnomab/Folder-Importer-Presets.git
```

``` Addressableの設定を自動化.giturl
https://github.com/CyberAgentGameEntertainment/SmartAddresser.git?path=/Assets/SmartAddresser
```

``` TMPro の Dynamic なテクスチャから差分を出さない.giturl
https://github.com/STARasGAMES/tmpro-dynamic-data-cleaner.git#upm
```

``` Missing な参照を探す.giturl
https://github.com/gigacreation/UnityMissingFinder.git?path=Assets/MissingFinder
```

``` プロジェクト内の色を一元管理.giturl
https://github.com/Haruma-K/uPalette.git?path=/Assets/uPalette
```

``` タイムラインでuGUIを制御.giturl
https://github.com/Haruma-K/UnityUIPlayables
```

``` 自動で SerializeField を埋める属性.giturl
https://gitlab.com/zoodinger/autoreference.git
```

``` 様々なインスペクタ拡張.giturl
https://github.com/AnnulusGames/Alchemy.git?path=/Alchemy/Assets/Alchemy
```

## ライブラリ系

[DOTween](https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676?locale=ja-JP)：挙動や処理の遷移を簡潔に実装するライブラリ

``` UniRx.giturl
https://github.com/neuecc/UniRx.git?path=Assets/Plugins/UniRx/Scripts
```

https://zenn.dev/tkada/articles/a96258e080056a

``` UniTask.giturl
https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask
```

``` Unity Screen Navigator.giturl
https://github.com/Haruma-K/UnityScreenNavigator.git?path=/Assets/UnityScreenNavigator
```

``` VContainer.giturl
https://github.com/hadashiA/VContainer.git?path=VContainer/Assets/VContainer
```

# 素材系

[VFXTextureMaker](https://github.com/haw2fregel/VFXTextureMaker?tab=readme-ov-file)：VFXに使えるテクスチャを生成

# 教養

https://qiita.com/Yamara/items/ea07874d2c410877db61

https://qiita.com/riekure/items/48b24e84cc8850621176

https://light11.hatenadiary.com/entry/2020/07/29/202755

https://light11.hatenadiary.com/entry/2021/12/02/200205

# 記事

https://shibuya24.info/entry/sumzap_adventcal20191211

https://shibuya24.info/entry/sumzap_adventcal20191224

https://blog.kyubuns.dev/entry/2021/02/06/001609

https://qiita.com/yoship1639/items/7339a6201b44a24fbdfe

# WebGL

https://tech.framesynthesis.co.jp/unity/webgl/

https://tech.mirrativ.stream/entry/2023/08/14/105252
vscode でリモートサーバ側で Jupyter とかの Python の REPL 環境整備するメモ

## 背景

つよつよ GPU サーバー上で Python 機械学習コードとか REPL で動かしたい.
torch とかで 10 GB とかモデルサイズあるようなのだと起動だけで 10 秒くらい時間かかってしまうので, .py 単体実行してデバッグとかが向かないようなケース.

Jupyterlab 的に matplotlib でプロットとかもしたい.

Jupyterlab をサーバで動かして, vscode で繋ぐというのが検索するとよく出てきますが,
token とかのセットアップめんどいし, Python 環境自体はローカル環境側しか使ってくれないっぽいようでうまくいかないことがわかりました.

リモート側で vscode 建てると, 今度は X11 画面転送遅いし...

## 方法

一旦 ssh でリモート側に繋いで, リモート側で一式やるのが良いことがわかりました!

ローカル側で, Remote ssh とか, Jupyterlab とか, Python とかの Extension を一式いれておきます.
(Windows 使っている方は, WSL 接続でこの当たり十分経験しているかと思います)

リモート側も Jupyterlab とか conda or pip で入れておきます.

### サーバに ssh 接続

![Screenshot from 2023-01-08 21-14-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/9844dd89-4fb1-8724-e8b9-f291fe5e2514.png)

`Ctrl + Shift + P` などで Remote-SSH でリモートに接続します.

画面左下のマークでリモートに接続しているのを確認します.

![Screenshot from 2023-01-08 21-14-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/71ffcfbc-0e7c-6931-f863-84400cc2d048.png)

あとは .ipynb 形式のファイルを作り, 画面右下で Jupyter や Python 環境(Conda 環境)がリモートのを選べるのでよろしくやるだけです!

![Screenshot from 2023-01-08 21-15-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/816364ee-6393-553e-f4f4-547b352131b9.png)

![Screenshot from 2023-01-08 21-25-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/f67017e9-0c4a-3f02-efb7-55bde7a09b48.png)


ローカルで Python lsp 入れていると, コード補完などもよろしくやってくれるようです :eye: 

## 問題?: vim の settings.json が反映されない

esc 対応で

VSCodeでのjupyterとvimの共用
https://qiita.com/SoseSose/items/b1db862cffbc0c6afdf6

の設定をリモート側の settings.json に記載しても,

![Screenshot from 2023-01-11 18-04-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/c5f35784-056a-1400-b744-2b85bd01d805.png)

とグレーアウトされ

This setting has an application scope and can be set only in the user settings file

というよくわからない warning が出て反映されません.
vim 拡張は global 反映なので, ローカルの settings.json に記載する必要があるようです.

また, keybindingds.json 指定もあるようですが, こちらはどうもいろいろいじらないとダメな感じでした

https://github.com/microsoft/vscode/issues/121129

ただ, settings.json 設定しても, コマンドモードで esc すると cell からフォーカスははずれてイマイチつかいづらいです.



## TODO

* [ ] ipython 環境で REPL できるか試す.
* [ ] jupyter mode で esc をそもそも無効にする方法を探す.  https://qiita.com/yudwig/items/8f0b3661dac8dce5c0c5 jupyterlab 設定を vscode 側へ反映させる方法をみつける.
Googleプロジェクト管理：クロスファンクショナルなチームと仕事をする

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/579e805c-6045-9c1c-543d-f9519b57d50c.png" width="800">

# クロスファンクショナルなチームと仕事をする意味

プロジェクトマネージャーとして、あなたはおそらくクロスファンクショナルなチームと仕事をすることになるでしょう。クロスファンクショナルなチームとは、異なる経歴、専門性、職務を持つメンバーで構成されるチームのことです。

これらのメンバーは、異なるスキルセットを持ち、異なる役割を担い、異なる部署で働くこともありますが、全員が「プロジェクトの成功」という共通の目標に向かって働いています。

今回、クロスファンクショナルなチームを効果的に管理するためのポイントを紹介します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/0741f0fb-11e4-63ae-e333-90041ed8689e.png" width="700">


## Clarify goals

クロスファンクショナルなチームで仕事をする場合、各メンバーが自分の役割、お互いのサポート方法、プロジェクトの共通目標などを確実に理解することが重要である。チームに対して明確な目標を設定し、チームがその目標を理解していることを確認することが重要です。

- 余計な詳細や説明は避け、直接的で簡潔な表現にする。
- タスクやプロジェクトの目標を伝える際には、予算、納期、品質要件、重要なリソースなど、重要な項目を明確にすること。
- チームメンバーがタスクやプロジェクトの目標を理解できるように、質問を促し、情報を明確にする。
- チームメンバーが目標に向かって前進しているか、計画通りに進んでいるか、質の高い仕事をこなしているか、常に確認するのはあなたです。

クロスファンクショナルなチームは、異なる部署、異なる場所、異なるリーダーを持つかもしれませんが、すべてのチームメンバーがプロジェクトマネージャーと協力して、現在のプロジェクトをサポートします。

プロジェクトは、他の優先事項と競合している可能性があります。そのため、チームと明確かつ頻繁にコミュニケーションを取ることで、潜在的な問題や懸念が発生する前に、それを特定することができます。

## Get team members with the right skills

プロジェクトの各機能に適したスキルセットを持つチームメンバーを確保することは、非常に重要です。もし、飛行機を作るのに、エンジニアが5人いて、整備士がいないとしたら、クロスファンクショナルなチームの重要な要素が欠けていることになります。

プロジェクトマネージャーとして、プロジェクトが成功するために必要なスキルセットを持った適切な人材をチームに確保する手助けをしなければなりません。

## Measure progress

チームの達成度を示すことで、モチベーションを維持することができます。プロジェクトの進捗を測定し、部門を超えたチーム全体に伝える時間をとりましょう。こうすることで、全員が全体像を把握し、プロジェクトに対する自分の影響力を認識することができます。

進捗の測定方法は、

- 重要なマイルストーンの達成
- プロジェクトタスクの完了
- 期限内・予算内のプロジェクト目標達成

など、さまざまな方法があります。

チームメンバーと定期的に連絡を取り、進捗状況を確認しましょう。時間通りに終了する見込みがあるかどうかを尋ねます。もし、そうでなければ、どうすれば成功するか尋ねる。

タスクや目標が完了したら、それを記録し、プロジェクトが順調に進んでいるかどうかをメンバーに知らせることで、プロジェクト全体を通してチームの進捗を把握する。成功、遅れ、問題点などをチームに伝え、プロジェクトの進行状況を把握するようにしましょう。

## Recognize efforts

部門横断的なチームで仕事をしていると、ある特定のスキルが他のものより高く評価されることがあります。例えば、あるメカニックがプロジェクトの問題解決に貢献すれば賞賛されますが、資金を調達した財務担当者は忘れ去られてしまうかもしれません。

プロジェクトマネージャーは、部門を超えたチームの各メンバーが、各ステップで自分の努力の価値を認識できるようにすることが仕事です。

チームメンバーとの関係構築は、ステークホルダーとの関係構築の重要ですが、クロスファンクショナルなチームメンバーとの関係構築も同様に重要です。
background-size > 100% だと background-position: n% が逆向きになる

※ 解決しました
詳しくはコメント欄をご覧ください。
@degudegu2510 さま、ありがとうございました！！

# 確認環境
Firefox 108.0.2
Google Chrome 108.0.5359.125

# 目的
`background-image` を設定したうえで `background-position-x: 30%` というように `%` 指定でずらしたい。
https://developer.mozilla.org/ja/docs/Web/CSS/background-image
https://developer.mozilla.org/ja/docs/Web/CSS/background-position-x

親要素が例えば `300px` だった場合、`30%` 指定は `90px` を指定したのと同じことになるはず。
https://developer.mozilla.org/ja/docs/Web/CSS/percentage

# しかし…
なぜか、指定した `background-image` の大きさが親要素の大きさを超えると、`background-position-x: 30%` の指定が右側ではなく、左側にずれてしまします。
また、 `background-image` の大きさがちょうど親要素と同じくらいのサイズの場合、全くずれなくなります。

## 例：％指定だと意図した通りにpositionがずれない
- ％指定の場合、`backfround-image` が…
  - 親要素と同じ大きさ：全くずれない
  - 親要素より大きい：逆側にずれる
  - 親要素より小さい：想定した挙動

`background-position-x: 30%` のはずの `div.big.right` が左にずれ、
`background-position-x: -30%` の `div.big.left` が左にずれています。

<p class="codepen" data-height="400" data-default-tab="html,result" data-slug-hash="YzjNVxd" data-user="manjuu-eater" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/manjuu-eater/pen/YzjNVxd">
  background-%</a> by manjuu-eater (<a href="https://codepen.io/manjuu-eater">@manjuu-eater</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

おかしい…。
MDNの `background` 関連をあちこち見ましたが、なぜこうなったのかはわかりませんでした。

## 例2：px指定だと意図した通りになる
ちゃんと `right` が右にずれてくれています。
<p class="codepen" data-height="400" data-default-tab="html,result" data-slug-hash="JjBEWqr" data-user="manjuu-eater" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/manjuu-eater/pen/JjBEWqr">
  background-px</a> by manjuu-eater (<a href="https://codepen.io/manjuu-eater">@manjuu-eater</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 解決策
~~わかりません（絶望）~~
⇒ 超絶親切な方がコメント欄に情報をくださいました。
（後で追記します）

手計算で親要素の`px`を計算して、そこから`calc`でもして`px`で指定するしかないんでしょうか…。

なにかわかり次第追記します。
PuTTYでProxyJumpする

# はじめに
踏み台経由してsshする際にはOpenSSHの[ProxyJump](https://man.openbsd.org/ssh_config#ProxyJump)を使うと便利です。

で、WindowsのGUI sshクライアントである[PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/index.html)でもやりたいので調べたらできたのでまとめておく。

# やりかた

PuTTY [0.77](https://www.chiark.greenend.org.uk/~sgtatham/putty/releases/0.77.html)以降を使い、プロキシ設定で「SSH to proxy and use port forwarding」を選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117513/55251298-c2b1-e891-f767-6c32d780b562.png)
[ranvisさん](https://www.ranvis.com/putty)の日本語化バージョンだと「プロキシにSSH接続してポート転送」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117513/2efe5c3c-360e-a39a-635c-42e5d5604fc4.png)

ドキュメントだと以下のようにに書かれてる。

> ‘SSH to proxy and use port forwarding’ causes PuTTY to use the secondary SSH connection to open a port-forwarding channel to the final destination host (similar to OpenSSH's -J option).
>
> [4.16.1 Setting the proxy type](https://the.earth.li/~sgtatham/putty/0.78/htmldoc/Chapter4.html#config-proxy-type)

プロキシホスト名についてもOpenSSHのProxyJumpと同様に、PuTTYの保存済みセッション名を参照できます。

> The ‘Proxy hostname’ field will be interpreted as the name of a PuTTY saved session if one exists, or a hostname if not. 
>
> [4.16.1 Setting the proxy type](https://the.earth.li/~sgtatham/putty/0.78/htmldoc/Chapter4.html#config-proxy-type)

## Jump先(踏み台ホスト)でlocalhostに繋ぐ場合

大抵の場合は踏み台hostから別のホストへ接続しますが、踏み台ホストでlistenされてるポートへ接続する場合もあります[^reverse-tunnel]。このとき、「Consider proxying local host connections(ローカルホストからもプロキシ接続を行う)」をCheckしないとプロキシ設定を使わず直接繋ぎに行こうとします。

[^reverse-tunnel]: NAPT配下ネットワークにいるRasPiからインターネット上に存在するVPSへssh reverse tunnel掘ると、VPS上のlocalhostでRasPiに繋がるトンネル入り口がlistenすることになります。

> Connections to the local host (the host name localhost, and any loopback IP address) are never proxied, even if the proxy exclude list does not explicitly contain them. It is very unlikely that this behaviour would ever cause problems, but if it does you can change it by enabling ‘Consider proxying local host connections’.
>
> [4.16.2 Excluding parts of the network from proxying](https://the.earth.li/~sgtatham/putty/0.78/htmldoc/Chapter4.html#config-proxy-exclude)

踏み台先で接続するホスト名がプロキシ設定に関係するんかいな、と思ってソースを見ると割りと処理の頭で`localhost`かどうかを見てる実装になってた。

https://git.tartarus.org/?p=simon/putty.git;a=blob;f=proxy/proxy.c;h=801c28f942bc01ea4a292b20d68605ad4047efd2;hb=61ab33efe48cfd1cea77e249e5598a89f3387fa3#l310

# Reference 

https://superuser.com/questions/1448180/how-to-setup-proxy-jump-with-putty

# Appendix: OpenSSHのProxyJumpについて

- [ProxyJumpでhostnameを解決しながら踏み台サーバーをジャンプ - Qiita](https://qiita.com/mochisuna/items/375b621b3281825d8a97)
- [多段SSHはProxyJumpと-Jオプションで - karakaram-blog](https://www.karakaram.com/ssh-to-remote-hosts-through-a-bastion-with-proxyjump/)
- [多段SSHならProxyJump！さよならProxyCommand | にっしーラボ](https://nissy-lab.com/blogs/multiple-ssh-proxyjump/)
- [多段 ssh するなら ProxyCommand じゃなくて ProxyJump を使おう](https://zenn.dev/kariya_mitsuru/articles/ed76b4b27ac0fc)
- [OpenSSH 7.3 の ProxyJump 機能の使い方 | Webシステム開発／教育ソリューションのタイムインターメディア](https://www.timedia.co.jp/tech/openssh-73-proxyjump/)
Rails7+Bootstrap環境の構築について

## ■Bootstrap5を使ってみたいと思ったきっかけ

Railsチュートリアルで使っていたBootstrapをポートフォリオのフロントでも使いたい…でもチュートリアルだとBootstrap3だからいかにも…感が否めない。どうやらBootstrap5だと割とモダンなnavbarなどのコンポーネントが提供されていそう、、、と感じたため。先に断っておきますが初学者のため間違っている箇所がありましたら、ご指摘いただけますと幸いです。

## ■導入方法

Rails newコマンドのオプションを指定するだけです。

```jsx
rails new [アプリ名]　-j esbuild --css bootstrap
```

## ■確認

 Bootstrap5のサンプルコード（下記画像ではNavbar）をとりあえずRailsのビューに記載してみて確認する。


![スクリーンショット 2023-01-08 21.06.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092884/07c4b017-e446-4ebf-46b1-5d164b1282d2.png)

![スクリーンショット 2023-01-08 21.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092884/f1fa272b-c2d8-1f78-5960-19817b6d54db.png)




私はとりあえずapp/views/application/new.html.erbを作成してサンプルコードをコピペして確認しました。

![スクリーンショット 2023-01-08 20.57.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092884/81a9a36a-6295-f467-1933-cc3d6b4adaae.png)

絶対Bootstrap3よりモダンなナビゲーションバーにできました…笑

## ■引用

Youtubeで下記動画を視聴いたしました！動画内ではRails newの時だけでなく、おそらくRails環境構築後、Bootstrapに移行する方法もおっしゃっているようですが私が英語よわよわなため理解できませんでした…よろしければ教えていただけると幸いでございます….
https://www.youtube.com/watch?v=jyqjecyCv3A&list=WL&index=1
【Swift】macOSアプリ開発で通信できない時に確認すべき設定

# はじめに
現在、個人開発でMacのメニューバーアプリを開発しています。
URLSessionを使用して通信を行おうとしてたのですが、
データ取得できずに苦戦していました。

意外と見落としがちな設定があったので記録しておきます。

# 原因
![スクリーンショット 2023-01-07 21.26.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/cf3038f1-1dcd-2ac6-4751-b12b5cb16bd3.png)

この設定をしていないと外部との通信ができないっぽい？です

|||
|-|-|
|Outgoing Network Connections|YES|

# おわり
久しぶりのMacアプリなので初歩的なところで何時間も無駄にしてしまいました。。。。
【ISUCON11予選】ISUCON に入門してみる（①セットアップ）


|関連記事|
|:---|
|[【ISUCON11予選】ISUCON に入門してみる（①セットアップ）](https://qiita.com/zisui-sukitarou/items/81ccde650e5515787a60)|
|[【ISUCON11予選】ISUCON に入門してみる（②計測ツールの導入）](https://qiita.com/zisui-sukitarou/items/4514e0b6e7a3b481f9e5)|
|[【ISUCON11予選】ISUCON に入門してみる（③1296→15434）](https://qiita.com/zisui-sukitarou/items/22c78ec83366f388ab5f)|
|【ISUCON11予選】ISUCON に入門してみる（④15434→???）|

# これは何？
「ISUCONに入門してみる」シリーズでは、筆者が [ISUCON11](https://github.com/isucon/isucon11-qualify/blob/main/docs/manual.md) を解く際にやったことを備忘録的に時系列順に書き並べていきます。本記事（①セットアップ）では、アプリケーションを AWS の EC2 インスタンスに構築し、初期状態でベンチマーカーを実行するところまでやります。以下の順で説明していきます。
* ami からインスタンスを起動する
* 初期状態でベンチマーカーを実行

https://github.com/zisui-sukitarou/isucon11-qualify

# ami からインスタンスを起動する
ami (Amazon Machine Image) から EC2 インスタンスを起動します。「ami から EC2 インスタンスを起動する」の意味がわからない場合は、以下の記事を読むかググっていただきたいのですが、ざっくり説明すると「EC2 インスタンス起動時のベースを決めるもの」みたいな感じだと認識しています。

https://dev.classmethod.jp/articles/create-ami/

 isucon 関連の ami は以下に用意されているので、この中の [ami-0796be4f4814fc3d5](https://console.aws.amazon.com/ec2/home?region=ap-northeast-1#ImageDetails:imageId=ami-0796be4f4814fc3d5) を利用して EC2 インスタンスを起動するだけで構築完了です。

https://github.com/matsuu/aws-isucon

## 設定等
必要な設定は主に以下の項目です。
* インスタンスタイプ：c5.large
* AMI：ami-0796be4f4814fc3d5
* インバウンドルールの設定

インスタンスタイプについてですが、安く済ませようと t2.micro にしてしまうと、スペックが低すぎて少しパフォーマンスを改善しても全く点数が変化しなかったりしたので、本番同様c5.large にすることをお勧めします。

この時点で、すでにアプリケーションは動いています。ブラウザから`http://{パブリックIPアドレス}:3000`にアクセスすると、「ISU CONDITION」というアプリが確認できると思います。

# 初期状態でベンチマーカーを実行
 作成したインスタンスにsshログインします。以降の流れは下のリンク先に従ってください。

https://github.com/matsuu/aws-isucon/tree/main/isucon11-qualify#bench

自分の場合は、初期スコアは1513点でした。
```bash
18:54:26.391504 score: 1513(1546 - 33) : pass
18:54:26.391984 deduction: 0 / timeout: 339
```

# 参考
[1] https://isucon.net/archives/56082639.html
SQLチューニングでの確認事項

チューニングの際の確認用と、無自覚にボトルネックを生み出さないよう、自戒のため記録しておく。

## 検索の効率はどうか
同じ結果が得られるのに、効率の悪い検索をしている箇所を撲滅する。
無駄にテーブルを見る回数を減らすこと。

### サブクエリ用いるとき、`IN`,`EXISTS`（もしくは`JOIN`）を適切に使えているか
ただし最近のDBでは処理時間が改善されあまり差がなくなっているので、あまり変わらないことが多い。
また、`IN`の方がコードのわかりやすさは勝るので、速度が変わらなければ`IN`でもOK。

#### `IN`を使う場合
絞り込むテーブルの行数が、サブクエリで絞り込まれるレコード数より多い場合
```
/* table1 > table2 */
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2;)
# table2からレコードを取得してループを回して、table1と紐付ける
# table1はインデックスが効くので、データが多くても良い
```

#### `EXISTS`を使う場合
絞り込むテーブルの行数が、サブクエリで絞り込まれるレコード数より小さい場合
```
/* table1 < table2 */
SELECT * FROM table1 WHERE EXISTS (SELECT id FROM table2 WHERE table2.id = table1.id);
# table1からレコードを取得してループを回して、table2と紐付ける
```

※ もし結合キー（上記例ではid）にインデックスがはられていれば、tableBの中身を見にいかず、インデックスだけ見るので、`JOIN`の方が速いこともある。

## ソートを回避できているか
ソートがメモリ上で行われるならまだいいが、ストレージが使われるようになると急激に遅くなる。
実行前にWHEREとかで絞り込み、早い段階でデータ量を減らすこと。
もしくは表示件数を減らすとかするのもあり。

### `DISTINCT`を`EXISTS`で代用できないか
`DISTINCT`もソートを行うため、`EXISTS`に書き換えることでソートを回避できる。
```
/* 遅い */
SELECT DISTINCT customer_id
FROM customer
INNER JOIN company
ON company_id = company_id

/* 速い */
SELECT customer_id
FROM customer
WHERE  EXIATS (SELECT * FROM company WHERE company_id = company_d);
```

### `HAVING`を`WHERE`で代用できないか
`HAVING`は絞り込んだ結果に対して実行されるので、そうではなく`WHERE`で絞り込んでからソートするべき。

## 中間テーブルを無駄に作っていないか
1. 集約した結果に対する条件は、中間テーブルを作らずHAVING句を活用する
2. 集約と結合を同時に行う場合は、結合を先に行う

## SQLの実行回数を減らせないか
実行ごとにサーバー間で通信が発生してしまうので、一回で実行した方が速いことが多い
ループの中で回してるSQLがたまにあるので、ループの外に出してあげる

## インデックスを活用できているか
[MySQLのインデックスによるチューニング(備忘録)](https://qiita.com/drafts/f774d08676366d95fe6c/edit "MySQLのインデックスによるチューニング(備忘録)")

## どうしようもなければ
1. あえてカラムを増やし（非正規化し）、結合が発生しないようにする。（テーブルのデータ量が増えるのでケースバイケース）
2. リアルタイムで実行計画が必要ない場合、夜間に実行計画を格納し、集計結果を別テーブルに格納する。
3. 重いSQLはユーザーが使用しない時間に実行する。
4. `LIMIT`をつけて実行する。表示する件数を絞る。
CentOS 7にgcc 11をインストール（SCL）

# はじめに

Software Collection(SCL)を利用してCentOS7にgcc11をインストール
参考：[Quick Start — Software Collections] (https://www.softwarecollections.org/en/docs/) (2023-01-08現在掲載なし)

## サポート

本手法で導入した場合、[Red Hat Software Collections Product Life Cycle - Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhscl)より、2023-12がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# yum install -y centos-release-scl
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

# yum install -y devtoolset-11
... 略
# scl enable devtoolset-11 bash
```

### 各種確認

```shell-session
# which gcc
/opt/rh/devtoolset-11/root/usr/bin/gcc

# gcc --version
gcc (GCC) 11.2.1 20220127 (Red Hat 11.2.1-9)
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.

# yum info devtoolset-11
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * centos-sclo-rh: ftp.iij.ad.jp
 * centos-sclo-sclo: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : devtoolset-11
Arch        : x86_64
Version     : 11.1
Release     : 2.el7
Size        : 2.2 k
Repo        : installed
From repo   : centos-sclo-rh
Summary     : Package that installs devtoolset-11
License     : GPLv2+
Description : This is the main package for devtoolset-11 Software Collection.

# yum info devtoolset-11-gcc
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * centos-sclo-rh: ftp.iij.ad.jp
 * centos-sclo-sclo: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : devtoolset-11-gcc
Arch        : x86_64
Version     : 11.2.1
Release     : 9.1.el7
Size        : 76 M
Repo        : installed
From repo   : centos-sclo-rh
Summary     : GCC version 11
URL         : http://gcc.gnu.org
License     : GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD
Description : The devtoolset-11-gcc package contains the GNU Compiler Collection version 10.

# yum info devtoolset-11-gcc-c++
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * centos-sclo-rh: ftp.iij.ad.jp
 * centos-sclo-sclo: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : devtoolset-11-gcc-c++
Arch        : x86_64
Version     : 11.2.1
Release     : 9.1.el7
Size        : 31 M
Repo        : installed
From repo   : centos-sclo-rh
Summary     : C++ support for GCC  version 11
URL         : http://gcc.gnu.org
License     : GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD
Description : This package adds C++ support to the GNU Compiler Collection
            : version 11.  It includes support for most of the current C++ specification
            : and a lot of support for the upcoming C++ specification.
```
AUTOSAR Requirement and Specification Document Merge



# 課題　

Requirement文書の目次に、Draft, Obsolateの表示がないものがある。　


Main Requirements, AUTOSAR R22-11, FO, No.54(2)

https://qiita.com/kaizen_nagoya/items/0a4324ba2da1c84d5b99


# １対多対応　

一つの要求が、複数のモジュールの仕様になっているかもしれない。　

それぞれの仕様のRequirementに分解するかどうかの方針は、具体的な作業を進めながら考えると良い。
JavaScript Dateメモ

# JavaScript Dateメモ

## 全般

* 時刻値 ([time value](https://tc39.es/ecma262/#sec-time-values-and-time-range)) は、epoch(1970-01-01T00:00:00.000Z)からの経過ミリ秒を示す整数値として保持される。
    ```JavaScript
    > new Date(0)
    1970-01-01T00:00:00.000Z
    > new Date(1)
    1970-01-01T00:00:00.001Z
    ```

* epochより過去は負の時刻値として表現される。
    ```JavaScript
    > new Date(-1000)
    1969-12-31T23:59:59.000Z
    ```

* 時刻値にうるう秒は表現されない。例えば[2016-12-31T23:59:60Z](https://www.nist.gov/pml/time-and-frequency-division/time-realization/leap-seconds)を示す時刻値は存在しない。
    ```JavaScript
    > new Date(1483228799999)
    2016-12-31T23:59:59.999Z
    > new Date(1483228800000)
    2017-01-01T00:00:00.000Z
    > new Date('2016-12-31T23:59:60Z').getTime()
    NaN
    ```

* 既存Dateオブジェクトの時刻値は、`getTime()` または `valueOf()` で取得できる。`getTime()` と `valueOf()` は同じ結果を返す。
    ```JavaScript
    > new Date('2023-01-01T00:00:00.000Z').valueOf()
    1672531200000
    > new Date('2023-01-01T00:00:00.000Z').getTime()
    1672531200000
    ```

* 標準の日時文字列書式は [`YYYY-MM-DDTHH:mm:ss.sssZ`](https://tc39.es/ecma262/#sec-date-time-string-format)

## タイムゾーン

* オブジェクトの持つタイムゾーン情報は、ローカルシステムのタイムゾーンとなる。オブジェクト生成時に指定したタイムゾーンは保持されない。
    ```JavaScript
    > const dateFromUtc = new Date('2023-01-02T03:04:05.678Z')
    undefined
    > const dateFromJst = new Date('2023-01-02T12:04:05.678+09:00')
    undefined
    > dateFromUtc.getHours()
    12
    > dateFromJst.getHours()
    12
    > dateFromUtc.toISOString()
    '2023-01-02T03:04:05.678Z'
    > dateFromJst.toISOString()
    '2023-01-02T03:04:05.678Z'
    > dateFromUtc.getTimezoneOffset()
    -540
    > dateFromJst.getTimezoneOffset()
    -540
    > dateFromUtc.getTime() === dateFromJst.getTime()
    true
    ```

* `Date` オブジェクト生成時にタイムゾーン無しの日時文字列を渡すと、ローカルタイムの時刻とみなされる。混乱をなくすためには必ずタイムゾーンを明示すべき。
    ```JavaScript
    > new Date('2023-01-01T00:00:00').toISOString()  // タイムゾーン指定なし
    '2022-12-31T15:00:00.000Z'
    > new Date('2023-01-01T00:00:00Z').toISOString()  // UTC指定
    '2023-01-01T00:00:00.000Z'
    > new Date('2023-01-01T00:00:00+09:00').toISOString() // +09:00指定
    '2022-12-31T15:00:00.000Z'
    ```

* `getTimezoneOffset()` が返すUTCオフセット(分単位の整数)は、ISO 8601のUTCオフセット表記とは正負が逆になる。例えば日本標準時(+09:00)の場合 `-540` となる。

    ```JavaScript
    > new Date().getTimezoneOffset()
    -540
    ```

* Dateオブジェクトの時刻情報アクセスメソッドには、UTCベースの `getUTCXxx()`, `setUTCXxx()` と、タイムゾーンを考慮したローカルタイムベースの `getXxx()`, `setXxx()` がある。

* `getDate()` は day of month (0 - 31) を返す。 `getDay()` は曜日(0=Sun - 6=Sat)を返す。

## 型変換

* Date -> number 変換: `Date.prototype.valueOf()` または、`Date.prototype.getTime()`
    ```JavaScript
    > new Date('2023-01-01T00:00:00.000Z').valueOf()
    1672531200000
    ```

* number -> Date 変換: `new Date(number)`
    ```JavaScript
    > new Date(1672531200000)
    2023-01-01T00:00:00.000Z
    ```

* Date -> string 変換: `Date.prototype.toISOString()`
    ```JavaScript
    > new Date(1672531200000).toISOString()
    '2023-01-01T00:00:00.000Z'
    ```

* string -> Date 変換: `new Date(string)`
    ```JavaScript
    > new Date('2023-01-01T00:00:00.000Z')
    2023-01-01T00:00:00.000Z
    ```
今日M2 MacbookAirが届いた。

M2 Macbookを購入するかどうか悩んだ。　

M1 Mactook Airを購入したが、家屋に持って行かれて泣いていた。　

M2 Macbookを購入するかどうか悩みはいろいろ。　

Macbook 何を購入するか。

https://qiita.com/kaizen_nagoya/items/6c88a67088fca43c3cd7


Apple M1 and M2

https://qiita.com/kaizen_nagoya/items/96cfd621fd6dcc748c9f


# M2 
M1は一台あるのだから、M2と比較しないと面白くない。　

#  ２４GB 
これまで１６GBだった。Dockerで機械学習で足りないことがあった。それなら２４GBしか選択肢がない。　

# GPU
上記２つの選択肢から、GPUの種類は決まった。


# 規則装置５１２GB  
前回が２５６GB、その前が５１２GB。　５１２GBじゃないと不便きわまりなかった。　

# 色　

色。選び忘れていた。結果としてデフォルトのはず。　
黒が届いた。

# 配送　

注文時には、１月１５日から１９日との表示だった。　
発注を受け付けたら１月１１日配送予定になった。　
実際には、１月９日に届いた。　

ちょうど、注文の谷間だったのだろうか。
今日、作業できた。ありがとうございました。

# ソフトウェア、データ

古いMacBookProから移行した。　

いつまでたっても作業が始まらず、　
MacBookProのアプリケーションのユーティリティフォルダの移行アシスタントを起動した。　

# エラー等　

Apple IDでエラーがでた。　
Icloudでエラーがでた。　

移行できないファイルで２つエラーがでた。　

ID、パスワード類でうまく移行できないものは、すでにいくつかある。詳細は対策が建ってから記述する。　


# 参考資料(reference)

Apple M1 and M2
https://qiita.com/kaizen_nagoya/items/96cfd621fd6dcc748c9f

今日M2 MacbookAirが届いた。
https://qiita.com/kaizen_nagoya/items/4366e7a1ed2a3bd6fce2

dockerで機械学習書籍・ソースM2:macOS確認中。
https://qiita.com/kaizen_nagoya/items/887fa4a2ce9a7f90ca0f

# 文書履歴(document history)

ver. 0.10 初稿 20230105
ver. 0.11 購入 20230109

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

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
IBM Video Streaming(旧Ustream)配信時の視聴者人数取得方法

# 概要
配信時に視聴者が何人だったかを自動取得できるようにしてほしいというリクエストがあったので
それを作ったときのメモ

# 使うもの
IBM Video StreamingがAPIを公開しているのでそれを使います。
https://developers.video.ibm.com/channel-api-basic-channel-management

チャンネルの基本情報の中に視聴者数があります。
`stats.viewer_total`

# PHPでのサンプルプログラム
```sample.php
$data = file_get_contents("https://api.video.ibm.com/channels/【配信チャンネルのID】.json");
if ($data == null) {
    return;
}
$json = json_decode($data);
$stats = $json->channel->stats;
if ($stats == null) {
    return;
}

$viewer = @$stats->viewer;
if ($viewer == null) {
    return;
}

echo $viewer;
```
これで配信時は視聴者数を取ることができます。
実際には配信時間中にcronで1分間に1回実行して、そのデータをDBに突っ込んで
配信期間の最大視聴者数を取得してメールなどで通知しています。

# 注意点
## データが少し遅れてやってくる
視聴者数はビデオ画面に表示されているものとAPIで取得したものとで差があります。
APIで取得すると２~３分前の情報が戻ってきている雰囲気（体感
## APIのlimit rate
多分APIごとに違いますかね。
レスポンスのhttpヘッダで確認することができます。
https://developers.video.ibm.com/api-basics-rate-limits

実際にたたいてみたところこんな感じ
```
X-RateLimit-Limit	120
X-RateLimit-Remaining	119
X-RateLimit-Reset	1673176740
```
私の環境だと1分間に120回叩いても大丈夫そうです。

# おまけ
APIのエンドポイントは`api.ustream.tv`もまだ使うことができました。

nslookupで確認してみると
```
> api.ustream.tv
サーバー:  dns.google
Address:  8.8.8.8

権限のない回答:
名前:    api.ustream.tv
Addresses:  169.44.146.91
          169.44.146.92
          169.45.159.77
          169.45.159.76

> api.video.ibm.com
サーバー:  dns.google
Address:  8.8.8.8

権限のない回答:
名前:    api.video.ibm.com
Addresses:  169.44.146.91
          169.45.159.77
          169.45.159.76
          169.44.146.92
```
となっていたので、同じサーバを見に行ってますね。
まあドメイン的には`api.video.ibm.com`にしておいた方がいいんでしょうけど
過去の資産がそのまま使えるのが好印象でした。



# 参考
https://www.ibm.com/jp-ja/products/video-streaming

https://developers.video.ibm.com/channel-api-basic-channel-management