OmniAICreator/Qiita-1.07M huggingface dataset:
Twitter APIが You currently have access to a subset of Twitter API v2 endpoints and limited v1.1 endpoints (e.g. media post, oauth) only. と言ってきた

私が個人で運用している[Twitter bot](https://suzuki-navi.hatenablog.com/entry/2023/02/08/233732)が気が付いたら以下のエラーメッセージで止まっていました。

> You currently have access to a subset of Twitter API v2 endpoints and limited v1.1 endpoints (e.g. media post, oauth) only. If you need access to this endpoint, you may need a different access level. You can learn more here: https://developer.twitter.com/en/portal/product

APIのv1.1ではなくv2を使えというメッセージです。

Twitter APIにアクセスしているライブラリがv2に対応しているかどうかの話になります。

いままではtwitterという名前のライブラリを使っていました。このライブラリのv2対応状況は以下に書いてあります。まだv2対応がalpha版という位置づけのようです。

https://github.com/python-twitter-tools/twitter/issues/435

tweepyというライブラリではv2に対応しているようです。

https://github.com/tweepy/tweepy/blob/master/examples/API_v2/create_tweet.py

ということで、tweepyに置き換えることにしました。


# twitterからtweepyに置き換え

`requirements.txt` 変更前
```plain
twitter
```

`requirements.txt` 変更後
```plain
tweepy
```

Pythonソースコード変更前（ツイート関連個所のみ）
```python
import twitter

def tweet(message):
    auth = twitter.OAuth(
        consumer_key    = twitter_consumer_key,
        consumer_secret = twitter_consumer_secret,
        token           = twitter_token,
        token_secret    = twitter_token_secret,
    )
    client = twitter.Twitter(auth = auth)
    client.statuses.update(status = message)
```

Pythonソースコード変更後
```python
import tweepy

 def tweet(message):
    client = tweepy.Client(
        consumer_key        = twitter_consumer_key,
        consumer_secret     = twitter_consumer_secret,
        access_token        = twitter_token,
        access_token_secret = twitter_token_secret,
    )
    client.create_tweet(text = message)
```

Twitter APIのエラーメッセージはこの変更だけで直りました。


# おまけ

ひさしぶりにこのbotの自動ツイート部分をデプロイしたので、いろいろ変わっていました。


## Serverless Frameworkのバージョン

bot開発当時Serverless Frameworkのバージョンが2だったのですが、いまは最新が3であり、私のローカル環境もいつのまにか3になっていたので、デプロイできなくなっていました。幸い serverless.yml でのバージョンの記載を変えるだけで動きました。

変更前
```serverless.yml
frameworkVersion: '2'
```

変更後
```serverless.yml
frameworkVersion: '3'
```


## Pythonのバージョン

AWS LambdaのPythonランタイムがbot開発当時3.8だったのですが、いまは3.10が最新です。なので、今回ついでにPythonのバージョンも最新にしました。

変更前
```serverless.yml
provider:
  name: aws
  runtime: python3.8
```

変更後
```serverless.yml
provider:
  name: aws
  runtime: python3.10
```


## urllib3のバージョン

ここまでの変更でAWS Lambdaで動かしたら以下のようなエラーメッセージがログに書き込まれ、動きませんでした。

> [ERROR] Runtime.ImportModuleError: Unable to import module 'tweet': cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_' (/var/task/urllib3/util/ssl_.py)

urllib3というライブラリのバージョンを2より前にしないといけないという情報がありましたので、`requirements.txt` に以下のように書いたところ、直りました。なにが原因なのかはよくわかっていないです。

```requirements.txt
tweepy
urllib3<2
```

以上。
[Proxmox] 電源を抜かれたProxmoxでログインできない問題を解決した話 ~ぽえむ~

# 概要
掃除のタイミングでなんと先輩がProxmoxの入ったサーバーの電源を消してしまいました！！
それによって、別日に立ち上げて確認してみたところ、proxmoxのGUIコンソールでログインができなくなっていて困っていたので、設定を確認してみました。

自分のアカウントでもrootアカウントでも先輩のアカウントでもログインができないため、内部がおかしいと判断しました。

# 原因予想
1. クラスターを組んだけど、相手方を直接電源ぶち切りした。
2. 本体の電源が停電対策時にぶち切りされた。
3. ようわからん。

<img width="450" style="margin: 10px;  border-radius: 20px;"   alt="unknown.png (562.4 kB)" src="https://i.imgur.com/mkYhVQc.png">


# 解決方法
[【備忘録】ProxmoxのWebGUIにログインできなかったときの対処法](https://blog.yookuriiserver.xyz/?p=74)
より、物理マシーンにモニターを繋いでコミュニケーションを取ってみました。

物理マシーンでrootパスワードでログインしたら一発で通りました。

そこからsystemctlをおこなって、実際におかしい動きをする部分を見つけて、よくわからずにネットの記事をそのまま参考にしたら動いてしまいました。
なんでなのかなぁ。また調べてみたいと思います。

# 実際の手順
```bash
//状態の確認
systemctl status pve*
//pvedaemon.serviceで ~~~ rhost=::ffff:<ログインを実行したPCのIPアドレス>という部分が赤文字でエラーを吐いていた。


//クォーラム要件を変更させる。
pvecm expected 1
```

ログインできるようになりました。

# まとめ
今回は、電源をぶち抜かれた、かわいそうなサーバーちゃんを復活させました。
原因としてはおそらく、急に電源を抜かれた関係で、ノードの順位が変わってしまったことが原因なのかもしれないと思いました。
結構情報がゆるゆるなので、備忘録程度に考えてもらえると助かります。

電源はぶち抜かない！！大事。
【解決策】「Noto Sans JP」のテキストに「-webkit-text-stroke」で縁取りしていたらある日突然表示が崩れた

# 問題

Webフォント「Noto Sans JP」のテキストに「-webkit-text-stroke」で縁取りを付けていたが、ある日突然、文字の内側にも線が付くようになるフォント崩れが起こった。

#### フォントが崩れる前
以前は、文字の外側にのみ縁取りが表示されていた。
![Noto_Sans_JP_フォント崩れ前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322404/bc869287-46a9-7d53-36fa-428910a0f4d9.png)

#### フォントが崩れた後
いつの間にか、文字の内側にも線が表示されるようになっていた。
![Noto_Sans_JP_フォント崩れ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322404/aa14eaf6-6a56-3b47-2578-29e526fe71a9.png)


# 解決策

「Noto Sans JP」の代わりに、以下のフォントを指定した。
* 英数字の部分：「Noto Sans」
* 日本語の部分：「Zen Kaku Gothic New」

:::note
日本語対応のない「Noto Sans」を日本語が含まれている要素に対して指定した場合、日本語部分はデフォルトのフォントになってしまうので注意が必要。
今回は、日本語部分がデフォルトのフォントになってしまわないように、形が似ている別のフォントを指定した。
:::

#### 修正後
縁取りが文字の外側にのみ表示されるようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322404/8bc8d7ef-a2cf-7c66-5c8a-04db2baac9a6.png)


# 原因

何も変えていないのに突然フォントが崩れたため、原因は不明。
原因を知っている方がいましたら、教えてください。


# 参考
* [Google Fonts「Noto Sans JP」](https://fonts.google.com/noto/specimen/Noto+Sans+JP)
* [Google Fonts「Noto Sans」](https://fonts.google.com/noto/specimen/Noto+Sans?noto.query=noto+sans+)
* [Google Fonts「Zen Kaku Gothic New」](https://fonts.google.com/specimen/Zen+Kaku+Gothic+New?query=zen+kaku+&noto.query=zen+kaku)
* [`-webkit-text-stroke`](https://developer.mozilla.org/ja/docs/Web/CSS/-webkit-text-stroke)
フロー： インターネット接続エラー



:::note alert
Hmm, that didn't work. Check your internet connection and try again, or refresh the page. If the problem continues, ask your Salesforce admin to contact Salesforce Customer Support.

問題が発生しました。インターネット接続を確認してもう一度お試しいただくか、ページを更新してください。問題が続く場合は、Salesforce カスタマーサポートに連絡するように Salesforce システム管理者に依頼してください。
:::

+ [Flow Issue](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PfAVD)

:::note
ah, these are tricky - there's a config error somewhere in the Flow that is not displaying on Save. Hopefully you have a previous version. I'd start with the previous version and selectively add back in each new element, saving as you go 

https://salesforce.stackexchange.com/questions/391433/error-when-trying-to-save-a-flow-something-went-wrong-hmm-that-didnt-work

https://developer.salesforce.com/forums/?id=9062I000000XoSOQA0
:::


+ [【未解決】問題が発生しました。インターネット接続を確認してもう一度お試しいただくか、ページを更新してください。問題が続く場合は、Salesforce カスタマーサポートに連絡するように Salesforce システム管理者に依頼してください。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007KX4WOSA1)

+ [L'opération a échoué. Vérifiez votre connexion Internet, puis réessayez, ou actualisez la page. Si le problème persiste, demandez à votre administrateur Salesforce de contacter le Support client de Salesforce.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T6PZxSAN)

+ [Hmm, that didn't work. Check your internet connection and try again, or refresh the page. If the problem continues, ask your Salesforce admin to contact Salesforce Customer Support.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PfAnTSAV)

:::note
For me, there were some "old" conditions" not necessary, I "cleaned" up the flow... deleting unnecessary conditions... problem solved... the error description does not help much...
:::

+ [Error Running a Flow in the Sandbox](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000078SAA5SAO)

:::note
I found out that this error was due to the test records I was using. I'm uncertain about what was missing from those records. However, the problem was resolved by creating new test records.

このエラーは、使用していたテスト レコードが原因であることがわかりました。それらの記録に何が欠けていたのかはわかりません。ただし、この問題は、新しいテスト レコードを作成することで解決されました。
:::
FastAPI + sqlalchemy + async + association_proxy を取得しようとして　sqlalchemy.exc.MissingGreenlet: greenlet_spawn has not been called となる時の対処法備忘録

## 概要

```FastAPI + sqlalchemy + async + association_proxy```

を使い、
中間テーブルを使って 多対多 のテーブル構造を作り、
クエリを打とうとした時のこと。


```bash
sqlalchemy.exc.MissingGreenlet: greenlet_spawn has not been called; can't call await_only() here. Was IO attempted in an unexpected place? (Background on this error at: https://sqlalche.me/e/14/xd2s)
```
このエラーに悩まされました。


## やろうとしたこと

例えば、```User```テーブルと、```Tenant```テーブルの
中間テーブルとして```UserTenant```テーブルを定義しているとして、

```python

from sqlalchemy import Boolean, Column, DateTime, ForeignKey, BigInteger, String
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import relationship


Class UserTenant(Base):
...
tenant_name = association_proxy(target_collection="tenant", attr="name")
```

このように ```association_proxy```を使ったとします。

これを使おうとした時、

```python
from sqlalchemy.engine import Result
from sqlalchemy import select
from sqlalchemy.orm import joinedload

result: result = await(
    db.execute(
        select(user_tenant_model.UserTenant)
        .filter((user_tenant_model.UserTenant.tenant_id == invitation.tenant_id))

    )
)

user_tenant_owner = result.scalars().first()
```

```python
user_tenant_owner.tenant_name
user_tenant_owner.user_name
user_tenant_owner.user_email
```

みたいに呼ぼうとすると、

```bash
sqlalchemy.exc.MissingGreenlet: greenlet_spawn has not been called; can't call await_only() here. Was IO attempted in an unexpected place? (Background on this error at: https://sqlalche.me/e/14/xd2s)
```

となりました。


## 解決策

```python
result: result = await(
    db.execute(
        select(user_tenant_model.UserTenant)
        .filter((user_tenant_model.UserTenant.tenant_id == invitation.tenant_id))
        .options(joinedload(user_tenant_model.UserTenant.tenant))
        .options(joinedload(user_tenant_model.UserTenant.user))
    )
)

user_tenant_owner = result.scalars().first()
```

として、joinedload をしてあげると、通ります。

備忘録まで。



@kenmaro
アウトバウンドメッセージ


+ [アウトバウンドメッセージはどのような形式で送信されるのか](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000R98zS)

:::note
メッセージの内容については以下にありそうです。

送信メッセージの WSDL
https://developer.salesforce.com/docs/atlas.ja-jp.244.0.api.meta/api/sforce_api_om_outboundmessaging_wsdl.htm

以下にリファレンスがあります。

アウトバウンドメッセージ
https://developer.salesforce.com/docs/atlas.ja-jp.244.0.api.meta/api/sforce_api_om_outboundmessaging.htm
:::
【Rust初心者】Rustの日本語ドキュメントを自分なりにまとめてみた(その1)

この記事は、2023年6月に作成したものです。

#  はじめに
以前から興味があったRustを、日本語のドキュメントをもとに、学習を始めました!
自分の考えをまとめるために、記事を書いていこうと思います。

また、全くの初心者なので、間違っている点などがありましたら、コメントでご指摘お願いします！

環境構築は[以前の記事](https://qiita.com/a-im12/items/bc571e5d48301c90980f)で行っているのでそちらを参照してください！

# この記事でできること
Rustを用いて、コンソールに`Hello, World!`と表示します。

# 環境
- macOS Monterey == 12.5
- Docker == 23.0.5
- Rust == 1.70.0
- Cargo == 1.70.0

# Rustファイルの作成
まずは、作業ディレクトリ上に新しくRustファイルを作成しましょう。ファイル名は`mian.rs`としています。
作成できたら、実際にRustを書いてみましょう！
~~~Rust
fn main() {
    println!("Hello, World!");
}
~~~

# Rustファイルのコンパイル
プログラムが書けたら、次はコンパイルを行います。
コンパイルとは、記述したプログラムを機械が理解できるように、機械語に翻訳することをいいます。

`main.rs`ファイルがあるディレクトリで、以下のコマンドを実行します。
~~~
rustc main.rs
~~~
すると同じ階層に`mian`というバイナリファイルが生成されました。
作成したプログラムを実行するには、このバイナリファイルを参照します。

# プログラムの実行
以下のコマンドを実行してみると...
~~~
./main
~~~
無事`Hello,World!`が出力されました！

# プログラムの解説
### main関数
まずは`main関数`の作り方からです。
~~~Rust
fn main() {

}
~~~
これでmain関数を作成しています。
RustはC#やJavaなどと同様に、`{}`内がスコープとなります。

### 関数とマクロ
次に`関数`と`マクロ`についてです。
他言語を習得している方には馴染みのある`関数`ですが、Rustには`マクロ`といった考え方もあるようです。
ドキュメントを読み進めていないため、違いはわかりませんが、呼び出し方に違いがあるようです。

**関数の場合**
~~~Rust
関数名()
~~~
関数の場合は、上のようにすることで呼び出すことができます。

**マクロの場合**
~~~Rust
マクロ名!()
~~~
マクロの場合は関数とほとんど変わらないものの、マクロ名の後ろに`!`をつける必要があります。

今回作成した「Hello,World!」を出力するプログラムでは、`println!()`を使用しています。
つまりマクロを使用していたということですね。

今回は、ここまでになります。
次回は、変数について書いていこうと思います。

# 参考記事
- [The Rust Programming Language 日本語版](https://doc.rust-jp.rs/book-ja/title-page.html)
スタティックメソッドとは

## スタティックメソッド
:::note
クラスや構造体に関連付けられたメソッドであり、インスタンス化せずにクラス名や構造体名を使用して直接呼び出すことができる
インスタンスの状態に依存しない処理や共通の機能を提供するために使用
:::

## スタティックメソッドの特徴

- **インスタンス化せずに直接呼び出し**
インスタンス化する必要なく、**クラス名や構造体名を使用して直接**呼び出せる
EX)
ClassName.staticMethod()のようにして呼び出す

- **インスタンス状態に依存しない**
インスタンスの状態に依存しない
→インスタンスのプロパティやメンバ変数にアクセスできない
**引数やローカル変数のみ**を使用して処理をする

- 共通の機能を提供
インスタンスごとに異なる値を持たずに共通の機能を提供するために使用

EX)実装される例
・ユーティリティメソッド
・数学関数
・データ変換メソッドなど


*****

スタティックメソッドは、**インスタンスの状態に依存しない**
→他のインスタンスメソッドや非スタティックメソッドからも呼び出せる

スタティックメソッド内では、**そのクラス内の非スタティックメンバ（変数やメソッド）に直接アクセスできない**
TeraTermマクロでCSVファイル読み込み/ファイル書き出しをする方法

## 背景
業務の中で複数機器の設定値をまとめて取得したい機会があったので、久々にTeraTermマクロを使って対応してみました。今回作成したマクロベースでTeraTermマクロでのCSVファイルの読み込み/ファイル書き出しを含め、基本的な記述方法をまとめておこうと思います。

## 利用したもの
- TeraTerm
- CSVファイル　※以下が内容のイメージ

|HOSTNAME  |HOSTADDR  |USERNAME  |PASSWORD
|---|---|---|---|
|ホスト名①  |ホストIP①  |ユーザ名①  |パスワード①  
|ホスト名②  |ホストIP②  |ユーザ名②  |パスワード②  
|・・・  |・・・  |・・・  |・・・  

### プログラム
CSVファイルに記載された複数機器の情報をもとに、各装置へログインし、コンフィグを取得するための汎用的なソースコードを以下に記載します。

- TeraTermマクロ
```
;-----------------------------------
;変数設定
;-----------------------------------
LOGDIR = 'C:\Users\...\...\config'       ;ログ保存先ディレクトリ
csvfile = 'C:\Users\...\...\target.csv'  ;対象装置情報一覧CSVファイル
timeout = 30                             ;waitタイムアウト値
separator = ','                          ;CSV区切り文字

fileopen fh csvfile 0 0                  ;CSVファイルを開く

i = 0
while 1
  i = i+1                                :何行目の処理かiで管理
  filereadln fh buf                      ;現在の行の内容をbufに格納して、行を進める

  if result then                         ;空行ならループを抜ける(1行上の処理で値が取得できたかresultに結果が自動で入る)
    break
  endif

  if i <= 1 then                         ;1行目は見出し行なのでスキップ
    continue
  endif

  ;-----------------------------------
  ;接続先情報取得
  ;-----------------------------------
  strsplit buf separator                 ;bufから各変数の値を格納
  HOSTNAME = groupmatchstr1
  HOSTADDR = groupmatchstr2
  USERNAME = groupmatchstr3
  PASSWORD = groupmatchstr4

  ;-----------------------------------
  ;SSHログイン
  ;-----------------------------------
  COMMAND = 'ssh '                       ;ログインコマンド作成
  strconcat COMMAND USERNAME
  strconcat COMMAND '@'
  strconcat COMMAND HOSTADDR

  sendln COMMAND                         ;SSHログインコマンド実行

  wait 'password:'
  
  if result=0 then                       ;waitがtimeoutなら現在のターゲットの処理をスキップ
    continue
  endif
  
  sendln PASSWORD 

  wait '$' ;プロンプトが表示されるまで待機

  ;-----------------------------------
  ;ファイル出力
  ;-----------------------------------
  ;出力ファイル作成
  getdate DATESTR '%y%m%d'               ;現在日時を取得
  LOGFILE = LOGDIR                       ;ログファイル名作成
  strconcat LOGFILE '\'
  strconcat LOGFILE HOSTNAME
  strconcat LOGFILE '_'
  strconcat LOGFILE DATESTR
  strconcat LOGFILE '.conf'

  ;ファイル出力開始
  logautoclosemode 1 
  logopen LOGFILE 0 0                    ;上書きで出力ファイルを開く

  ;-----------------------------------
  ;コマンド実行
  ;-----------------------------------
  sendln '<ホスト名を出力するコマンド>'    ;ホスト名を出力
  wait '$' 
  
  sendln '<コンフィグを出力するコマンド>'  ;コンフィグを出力　※moreなどの対策に必要に応じて"terminal length 0"のようなコマンドも設定するとよい
  wait '$' 

  ;-----------------------------------
  ;マクロ終了
  ;-----------------------------------

  logclose                               ;ログ記録終了

  pause 2

  sendln 'exit'

  pause 2                                ;待機時間を設定しておかないと、ログアウト前に次の処理が走ってしまうことがあるので注意
  
endwhile
  
fileclose fh                             ;CSVファイルを閉じる

end                                      ;マクロを終了
```

## 工夫点
:::note info
ソースコードは汎用的に作成したので別の機会にも使い回しし易い
:::
## 終わりに
多数の操作対象に対して自動的に操作することにTeraTermマクロは便利なので、汎用的なコードを用意しておいて、今後も都度利用していきたいです。
徳丸本（体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践）でつまずいた所集

# 徳丸本でつまずいた所集

## VMの画面が小さい
上のメニューバーの表示からスケールモードを押す
~~これやるとでかくなるけど戻し方はわからないのでわかったら追記します~~
ありました、[スケールモードの戻し方](https://ex1.m-yabe.com/archives/4618)

## サイト接続できなくて原因がわからないのなら
~~一度この本で使うソフトを終了してから
1.VM起動(ログインまで) 2.OWASP ZAP起動 3.サイト接続の順にやってみよう
”とりあえず再起”の精神は大事
まずは中見出し2に書いてあることやってみるといいよ~~

数カ月経ってみて原因が恐らく分かった
FoxyProxyのモードがOWASP ZAPになっているのにZAPを起動していないがためにタイムアウトしている

## 1.OWASP ZAPのインストール
本に従ってJREを入れた(P.28)
するとまさに下記リンクにあるエラーが出た
cmdでバージョンを見てもJDKは入っていそうだったし、pathを設定しても動かなかった
そこで最新のJDKをインストールするとエラー出ずに通ったので、JREとJDKのバージョンがあっていなかったのが問題だと思われる
https://zenn.dev/singularity/articles/d9a555238061e9

## 2.example.jp, trap.example.com, api.example.netに接続できない
P.25で接続を試すこれらだが、これはVMを起動してないと接続できない
また、先にVMを起動してからOWASP ZAPを起動しないとサイトにつながらない
(これは当たり前でVMの中にexample~のデータがあってそこにアクセスしてるのでVM起動してるとつながるわけがない、私はVM起動してないと接続できないネットのサイトかと思っていた)

## 3.VMをつけたときにコマンドリストが表示されてshutdownもできない
```
<---ここにいろいろなコマンドがずらっと--->
grub_
``` 
このような画面が出たときはVMの起動に失敗しているので、exitで脱出を試みる
そこでrebootみたいなボタンがあったら押そう
やってみてもだめだったらわからんから調べて

## 4.OWASP ZAPで通信が見れない
**URLで開こう(１敗)**

P.44~
これは自分自身でも馬鹿だと思うがVMを起動してIPアドレス(192.168.56.101)からサイトを見て「昨日は見れたのになんか通信見れないんだけど」と言っていた
これはexample.jpとVMの通信を見ている？（わからん、やってるうちにわかるやろ）ものなので、example.jpなどのURLでサイトを開かなければならない

## .OWASP ZAP右のレスポンスが見づらい
画面上部"オンライン"の下のボタンを押してRequest&Responseを選択するといい感じになる
![スクリーンショット (70).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348724/c1b48cec-efbd-b0d6-6d77-320d7bf7d8da.png)

## 5.OWASP ZAPのレスポンスの内容のうち、日本語が表示されない
![スクリーンショット 2023-06-16 114940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348724/f71c727c-47ee-3b1f-d96f-0d14f57246ea.png)
このように?が表示される

これは Work Panels Font が設定されていないから日本語が見えていないので下の画像のように設定してあげるといい
![スクリーンショット 2023-06-16 121239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348724/f0963441-d4ad-2b32-0b71-ec94cf98d8a9.png)
なおこれは徳丸本に書いていない
恐らくアップデートで追加されたものだろう

## 6.ブレークポイントから進まなくなる
P.55のブレークスルーポイントを設定して、hiddenパラメータの送信内容を書き換える過程で、必ずと言っていいほどそこから進めなくなると思う
これは送信内容を改ざんするためにあえて通信を止めているので進めなくなるのは正しい
この場合次のページに進んで上のほうに書いてあるようにメニューバー上の再生ボタンをクリック
別の場所でブレークポイントをオンにしてしまって進めなくなった場合も再生ボタンを押すことで進めるようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348724/258b5394-73eb-cfda-6450-b7ff6c9da183.png)
（画像上部のバー）
まあわかんなくなったらちゃんと読み直したりちょっと先読んでみてねってことで

### おまけ
正しく動いた場合こうなるよ

![スクリーンショット (60).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348724/56267dd3-ef01-f2d9-223c-a083f56553c3.png)
緑色の部分を書き換える（ここの表示形式も徳丸本と違うので注意）
![スクリーンショット (61).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348724/501c51a7-c558-7eb9-85bc-3213fd422952.png)
![スクリーンショット (62).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348724/f9c2cf4c-501e-ce45-585d-153de29e080e.png)
hato2で送ったはずのメアドが確認後にはaaaaaaになった

## 7.
ブランチとは

# ブランチとは？
ある機能を実装したくなることがある。
うまく以下なっかたら捨てたい。こんな時に便利なのが履歴の枝分かれだ。

枝を```ブランチ```という。
枝分かれした履歴の合併して一つの枝にすることを```マージ```という。

# Gitにおけるブランチ
開発の主軸となるブランチは```masterブランチ```だ。
コミットするごとにmasterブランチは伸びていく。

新しいブランチを作ってそこで別のブランチが伸びる。
しかしmasterブランチの成長は止まったままだ。

* ブランチは内部的には```一つのコミットを指すポインタ```
* HEADは```別のブランチの先端と一体化している```。

### ブランチを切り替える
別のブランチと一体化しているHEADををmasterブランチの先端に戻す。

### ブランチの二つの意味
* ```一連のコミットの履歴```
* ```その先端のコミットを指すポインタ```

文脈で判断する

# マージ
```別のブランチでの変更をmasterブランチに取り込む```

### 気づき
マージした時のコミットは```その時の別のブランチの先端```と```masterブランチのHEADの一個前のこみっと```が親となる。

# 出典
https://www.amazon.co.jp/dp/B00IAOPGDO?ref_=k4w_ss_dp_lp
LlamaIndexを試してみる(サンプルデータあり)

Qiitaのヘルプ文章をサンプルとさせていただき、LlamaIndex(llama-index)の挙動を確認するためのリポジトリを作成しました。

## リポジトリ

https://github.com/koboriakira/llama-index-sample/tree/master

## 使い方

`OPENAI_API_KEY`を環境変数に定義する。

```
export OPENAI_API_KEY={YOUR_API_KEY}
```

Qiitaヘルプをスクレイピングして、必要なテキストデータを保存。  
(負荷軽減のため、5秒ごとにサイトにアクセスするようにしています。)

```
python -m llama_index_sample.create_sample
```

llama-indexを利用して、インデックスを作成・保存

```
python -m llama_index_sample.create_index
```

インデックスを利用してクエリを実行

```
python -m llama_index_sample.main
```

次のようなレスポンスが出てきます。

> いいねとストックの違いは、いいねは記事を読んで気に入ったときに表示されるボタンで、記事を保存しておくことができません。一方、ストック機能を使うと、「あとでじっくり読みたい」「繰り返し読みたい」記事を保存しておくことができます。また、ストックを用いることで、記事の通知を受け取ることや、ストックした記事内での検索ができるなどの便利な機能があります。

## 感想

学習用のテキストさえあれば、簡単にGPTに組み込めることがよくわかりました。

さまざまな観点で社内用・商用に耐えうるものかは不明ですが、個人開発においては非常に有用だなと感じています。

## 参照

- [jerryjliu/llama_index: LlamaIndex (GPT Index) is a data framework for your LLM applications](https://github.com/jerryjliu/llama_index)
- [Qiita ヘルプ](https://help.qiita.com/)
Build a Data Model for a Recruiting App

[Build a Data Model for a Recruiting App](https://trailhead.salesforce.com/content/learn/projects/build-a-data-model-for-a-recruiting-app)


# Create a Custom Junction Object for Job Postings


これが無いときは、前のチャレンジを設定してないですね
[Create a Custom Object for Job Posting Sites](https://trailhead.salesforce.com/content/learn/projects/build-a-data-model-for-a-recruiting-app/custom-object-job-posting-sites)

+ Job Posting Site URL :URL
+ Status :PickList
+ Technical Site :Date
+ Description :Text Area


Now fill in the details for a master-detail relationship between Job Posting and Job Posting Site.

1. Select Master-Detail Relationship as the Data Type.
2. Click Next.
3. For Related to, select Job Posting Site.
4. Click Next.
5. For Field Label, enter Job Posting Site.
6. Click Next, Next, Next and Save.


+ [Position: Status- Position: Titleがない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000074otu5)
【JSTQB ALTM】シラバスまとめ（第1章）

<iframe src="https://www.slideshare.net/slideshow/embed_code/key/LtRm94Trf6fsyx?hostedIn=slideshare&page=upload" width="476" height="400" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>

:::note warn
【ご注意】
筆者（私）独自の解釈・理解をまとめた資料のため、誤りがある可能性があることにご留意ください
:::
Match Up PVC to Pod (OpenShift)

OpenShift をはじめとする Kubernetes では、Pod への Volume Mount に PersistentVolumeClaim (PVC) を使用します。Pod から見た、現在使用してる PVC の確認は `oc get pod -o yaml` 等で可能ですが、PVC から見た、どの Pod が PVC を使用しているかの確認は、思いのほか面倒ではあります。

ここでは、Red Hat OpenShift on IBM Cloud (ROKS) 4.11 を使用して、PVC と Pod の Match Up の例をご紹介します。



#### List of PVC in Project (Namespace)
PVC の一覧は、以下で取得可能です。
```shell
$ oc get pvc
NAME       STATUS   VOLUME    CAPACITY   ACCESS MODES  STORAGECLASS                AGE
my-pvc-01  Bound    my-pv-01  500Mi      RWX           ibmc-vpc-block-10iops-tier  243d
my-pvc-02  Bound    my-pv-02  500Mi      RWX           ibmc-vpc-block-10iops-tier  243d
my-pvc-03  Bound    my-pv-03  10Gi       RWX           ibmc-vpc-block-10iops-tier  135d
```
ここでは、PVC NAME のみを取得するために、以下の Syntax を使用します。
```shell
$ oc get pvc -o custom-columns=:.metadata.name --no-headers
my-pvc-01
my-pvc-02
my-pvc-03
```

#### Match Up PVC to Pod
PVC NAME と Pod Manifest の `.spec.volumes[].persistentVolumeClaim.claimName` が一致する Pod を抽出することで Match UP が可能です。
以下の例では、`my-pvc-01` と `my-pvc-02` は1つの Pod が、`my-pvc-03` は6つの Pod が使用していることが分かります。

```shell
$ for PVC in $(oc get pvc -o custom-columns=:.metadata.name --no-headers)
do
        echo "PVC :"
        echo "$PVC"
        echo "POD(s) :"
        oc get pod -o json | jq --arg PVC $PVC -rc '.items[] | select(.spec.volumes[].persistentVolumeClaim.claimName == $PVC) | .metadata.name'
        echo
done

PVC :
my-pvc-01
POD(s) :
my-pod-01-7b479865f4-wf5k9

PVC :
my-pvc-02
POD(s) :
my-pod-02-5b68586569-skzm7

PVC :
my-pvc-03
POD(s) :
my-pod-01-7b479865f4-wf5k9
my-pod-02-5b68586569-skzm7
my-pod-03-7c55c8f787-66s7v
my-pod-04-5fc5dbcdb8-vwwnv
my-pod-05-7cc8f49c6c-rr4kv
my-pod-06-7b997949b-vqsfv
```
この例を応用することで、`Secret` や `ConfigMap` 等の `Ephemeral Volume` の確認も可能です。
OmniStudio Integration Procedures > Build Simple Integration Procedures


+ [OmniStudio Integration Procedures > Build Simple Integration Procedures](https://trailhead.salesforce.com/content/learn/modules/omnistudio-integration-procedures/build-simple-integration-procedures)

障害？

+ [Build Simple Integration Procedures](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000R9KTd)
【Rust初心者】Rustの日本語ドキュメントを自分なりにまとめてみた(その0)

この記事は、2023年6月に作成したものです。

# はじめに
以前から興味があったRustを、日本語のドキュメントをもとに、学習を始めました!
自分の考えをまとめるために、記事を書いていこうと思います。

また、全くの初心者なので、間違っている点などがありましたら、コメントでご指摘お願いします！

# この記事でできること
Dockerを使ってRustの開発環境を構築します。
Rustの環境ができている方は飛ばしてください。

# 環境
- macOS Monterey == 12.5
- Docker == 23.0.5
- Rust == 1.70.0
- Cargo == 1.70.0

# Dockerfileの記述
まずは任意のディレクトリにDockerファイルを作成し、中身を書いていきます。
私は、最新バージョンのRustを使用しています。
~~~Dockerfile
FROM rust:latest

RUN mkdir -p root/workspace
WORKDIR /root/workspace
~~~

# docker-composeファイルの記述
Dockerfileが書けたら、次はcomposeファイルを書いていきます。
~~~docker-compose.yml
version: '3'
  services:
    rust:
      build:
        context: #Dockerfileのあるディレクトリ
        dockerfile: Dockerfile
      container_name: rust
      
      tty: true
      
      volumes:
        - ./src:/root/workspace
      
      environment:
        - USER=user
~~~

# docker-composeファイルのビルドと起動
下記のコマンドでcomposeファイルをビルドし起動させます。
お好みで`-d`もつけてください。
~~~
docker-compose up
~~~
これで、ついにRustの環境を構築できました！
次回からは、実際にRustのコードを書いていきましょう！
EC-CUBE）アノテーションで追加対象のフローを指定する方法

# 基本環境
EC-CUBE4系

# 追加対象
### カートページ

```
<?php

namespace root\...\hogeProcessor;

use Eccube\Annotation\CartFlow;

/**
 * カートのフローでプロセッサを有効にする
 *
 * @CartFlow
 */

以下、プロセッサーコードを記載

```

### 購入フロー

```
<?php

namespace root\...\hogeProcessor;

use Eccube\Annotation\ShoppingFlow;

/**
 * 購入フローでプロセッサを有効にする
 *
 * @ShoppingFlow
 */

以下、プロセッサーコードを記載

```

### 管理画面

```
<?php

namespace root\...\hogeProcessor;

use Eccube\Annotation\OrderFlow;

/**
 * 管理画面でプロセッサを有効にする
 *
 * @OrderFlow
 */

以下、プロセッサーコードを記載

```

# 注意点

use ~
@~Flow
以上2点が必要

アノテーション指定のあとに下記のような記述はエラーとなります

```
/**
 * 購入フローでプロセッサを有効にする
 * 
 * @ShoppingFlow
 */

/**
 * 送料明細追加.
 */
```
Cloudflare Waiting Room の挙動について整理

# 目的
Waiting Room の挙動について、図解があると助かるということで、例によって `mermeid` でフローを書いてみます。
	
こちらの全体像を頭に入れておけば、使い始める際にスムーズに設定項目を理解できるはずです。



# First In First Out (FIFO) のフロー

```mermaid:
graph LR
リクエスト(リクエスト)-->Cookie(__cfwaitingroom<br>cookie 付与)
待合室(Waiting<br>Room)-->|5分経過|4(Cookie有効期限切れ)
待合室-->|20秒ごと<br>ページ更新|判定{入場判定}
Cookie-->判定{入場判定}
判定{入場判定}-->|整理券<br>番号付与|待合室
判定{入場判定}-->|セッション<br>開始時刻<br>の記録|Webアプリ
Webアプリ("Web<br>アプリ<br>(Origin)")-->Renewal(Session<br>Renewal)
Renewal-->|最終リクエスト<br>時刻の記録 |Webアプリ
Webアプリ-->3(Session<br>Duration)
1("最大アクティブ<br>セッション数<br>(Total active users)")-->判定{入場判定}
2("1分あたりの<br>最大新規入場ユーザ数<br>(New users per minute)")-->判定{入場判定}
3-->|"1~30分<br>経過"|4(Cookie<br>期限切れ)
```

以下、解説です。

- Cloudflare Waiting Room は Cookie を活用したソリューションです。具体的には、リクエストは `__cfwaitingroom` Cookie によって、順番やセッション時間が管理されます。
    - [Cookies · Cloudflare Waiting Room docs](https://developers.cloudflare.com/waiting-room/reference/waiting-room-cookie/)
      > - Cloudflare Waiting Room requires the `__cfwaitingroom` cookie.
    - Waiting Room にいる間、Cookie の有効期限は常に 5 分に設定され、ブラウザタブを閉じない限り、20 秒ごとに自動更新されます。
      > - While a visitor stays in a waiting room, __cfwaitingroom cookie expiration is always set to five minutes, but renews every 20 seconds automatically as long as the visitor does not close the tab or leaves your application.
    - Web アプリにいる間、Cookie の有効期限は [Session Duration](https://developers.cloudflare.com/waiting-room/reference/configuration-settings/#session-duration) の値に基づき、設定されます。[Session Renewal](https://developers.cloudflare.com/waiting-room/reference/configuration-settings/) 無効時には、入場時からの絶対時間となり、[Session Renewal](https://developers.cloudflare.com/waiting-room/reference/configuration-settings/) 有効時には、最終リクエスト時刻からの相対時間となります。
      > - When the visitor accesses the application, the __cfwaitingroom cookie expires after an interval (specified by session_duration).
- 入場判定では、以下の2つの閾値がそれぞれ機能するため、どちらかが Threshold に達すれば Waiting Room に入ります
    - 最大アクティブセッション数 (Total active users)
    - 1分あたりの最大新規入場ユーザ数 (New users per minute)
困った時の逆引きGit操作

# コミットログを一行表示で見たい

```console
$ git log --oneline
```

# ブランチをコミット順に表示したい

```console
$ git for-each-ref refs/heads/ --sort='committerdate' --format='%(committerdate:short) %(refname:short)'
```

# 特定のブランチを削除したい

**ローカル**

```console
$ git branch -D ブランチ名
```

**リモート**

```console
$ git push --delete リモート名 ブランチ名
# または
$ git push リモート名 :ブランチ名
```
（リモートのブランチ削除はブラウザ操作の方が早いし確実だと思います）

# 特定のブランチ以外を削除したい

```console
$ git branch | grep -v 消したくないブランチ | xargs git branch -D
```

例えば、developとmain以外を削除したい場合は、下記のようになる。

```console
$ git branch | grep -v develop | grep -v main | xargs git branch -D
```

# コミット履歴をきれいにしたい

```console
$ git rebase -i 起点としたいコミットID
```

```console
$ git log --oneline
AAA hogehoge
BBB fugafuga
CCC foo
DDD bar
EEE develop
FFF ・・・
```

例えば、上記の状況でAAA~DDDを一つにまとめて、developから一回だけのコミットにしたい場合は、

```console
$ git rebase -i EEE
```

として、続くエディターで、`pick`を`f(fixup)`にする。

```console
pick DDD bar
f CCC foo
f BBB fugafuga
f AAA hogehoge
```

# コミットメッセージを変更したい

```console
$ git commit --amend -m "新しいコミットメッセージ"
```

# ブランチ名を変更したい

**ローカル**

```console
$ git branch -m 今のブランチ名 新しいブランチ名
```

なお、作業中のブランチ名を変更したい場合は`今のブランチ名`は省略できます。

```console:作業中のブランチ名を変える場合
$ git branch -m 新しいブランチ名
```

**リモート**

```console
$ git push リモート名 :今のブランチ名
$ git push --set-upstream リモート名 新しいブランチ名
```
（リモートブランチを削除して新しく作成しているだけです）

# 追跡対象になってない変更も退避したい

```console
$ git stash -u
```

# 管理対象にしてたけど、やっぱり.gitignoreに追加したい

`.gitognore`を編集したのちに、

```console
$ git rm -r --cached 追跡を解除したいファイルパス
```

# ディレクトリは管理したいけど、その配下のファイルは管理したくない

`log`とか`tmp`とかディレクトリ自体は管理対象にしたいけど、そこに吐き出されるファイルは管理対象にしたくない場合。

```:ディレクトリ構成
src
log
  └── .gitignore
```

追加したいディレクトリに`.gitignore`を追加して、その内容を下記にする。

```config
*
!.gitignore
```

# 別ブランチから特定のファイルだけを取得

```console
$ git checkout ブランチ名 ファイルパス
```

例えば、`featureA`というブランチから`src/sample.js`というファイルだけ引っ張ってきたい場合は、

```console
$ git checkout featureA src/sample.js
```

# addしちゃったけど取り消したい

```console
$ git reset
```

# 色々addしちゃったけど特定ファイルだけ取り消したい

```console
$ git reset ファイル名
```

# コミットは取り消したいけどファイルは残したい

```console
$ git reset コミットID --soft
```

コミットIDには、取り消したいコミットIDではなく、戻したい時点のコミットIDを指定します。

AAA 取り消したいコミット
BBB 戻りたい時点のコミット
の場合、`git reset BBB --soft`となります。

# コミットもファイルも取り消したい

```console
$ git reset コミットID --hard
```

# コミットログじゃなくて操作ログが見たい

```console
$ git reflog
```

`git log`がコミット履歴であるのに対して、`git reflog`は操作履歴。
操作自体のやり直しがここからできる。

# reset --hardしちゃったけどそれを無しにしたい

```console
$ git reflog
$ git reset --hard コミットID
```

# 削除したブランチを復元したい

```console
$ git reflog
$ git branch ブランチ名 コミットID
```
イーサリアムのアーキテクチャを図解してみた

## はじめに
パブリックブロックチェーンとして有名なイーサリアムは、Solidity 言語で書かれたスマートコントラクトをデプロイすることで様々なユースケースを実現することが可能です。
基盤としてのイーサリアムが、どのようなアーキテクチャになっているのかを理解するために、基本的な内容を図解してみました。
今回は台帳とEVM周りの解説です。


## 参考文献
イーサリアム公式サイトでもリンクされている、「**Ethereum EVM illustrated**」のPDFを参考にしています。
https://ethereum.org/uz/developers/docs/evm/

## 全体アーキテクチャ
まずは、イーサリアムの全体像からです。
ブロックチェーンは、各ノードで持つ台帳を分散して持つ「分散台帳システム」が基本になりますが、この各ノードで持つ分散台帳の内容を見ていきます。

分散台帳は、**ブロックチェーン＋ワールドステート**のセットから成り立っています。
イーサリアム＝ブロックチェーンというイメージがあると思いますが、重要な点として、あくまでブロックチェーンはトランザクション履歴を正確に保存するためのものであり、スマートコントラクトを実行したり、アカウントの状態を保存しているは、このワールドステートという仕組みが担っています。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733582/d81dfa65-2550-4688-7caf-60cd8ae70bad.png">

ブロックチェーンの各ブロックには、トランザクションとは別に、ステートルートというハッシュ値を持ち、これがワールドステートと紐づいています。
ワールドステートには、2種類のアカウント（後述）があり、Key-Value形式でアドレスとステートが１体１で保存されています。

## アカウントについて
ワールドステートには、EOA(外部所有アカウント)と、コントラクトアカウントの2種類のアカウントがあります。

<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733582/74c6000e-062b-2468-d957-792e29d049a5.png">

* EOA(外部所有アカウント)
    * アカウントのインタフェースとなるウォレット（秘密鍵を保管）の実態
    * ウォレットに紐づくアカウントで、「0x」から始まるアドレスを持つ（アドレスはハッシュから生成）
    * トークンの残高情報などを保持する

* コントラクトアカウント
    * EOAからのトランザクションにより作成されるアカウント
    * スマートコントラクトを実行するアカウントのことで、内部状態を保持するストレージ部分と実行コード（EVMコード）を持つ

※EVM ： Ethereum Virtual Machine、スマートコントラクト実行エンジンのこと

## データ構造について
ブロックチェーンのデータ構造について、もう少し噛み砕いてみていきます。
各ブロックには、トランザクションとブロックヘッダーが含まれていて、ヘッダーには前のブロックのハッシュがあることでチェーンをつないでいます。（一般的なブロックチェーンの説明）
<img width="90%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733582/7779227c-c7db-f9ee-b0ff-31da26c559c5.png">
ヘッダーにはもうひとつ、ワールドステートの要約が格納されています。（前述したステートルートのこと）
ワールドステートに全アカウントのステートが格納されているのですが、各アカウントがもつデータを「**マークルパトリシアツリー**」という仕組みで要約してハッシュで格納されています。

<img width=90%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733582/c63e9792-5388-307c-38b4-7a4dd13243af.png">
さらに、各アカウントのステートごとにも、ストレージのデータを要約したストレージルートというハッシュが格納されています。
ざっくり言うと、データの要約をさらに要約した形になっているということですね。
ハッシュなので、要約元の値が一つ変わるだけで全てが変わってしまいます。
（マークルパトリシアツリーとストレージルートの説明は長くなるので別の記事にします）

## トランザクションについて
ワールドステートに対して変更を加えるのがトランザクションです。
EOAからトランザクションを実行した場合に、ワールドステートにどうような影響を与えるかを見てみます。

<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733582/b686c142-61b5-d077-03a3-8a19155f16bf.png">

トランザクションはEOAによって作られます。
代表的なトランザクションとして、以下の３種類があります。

* Message
    * EOA間やコントラクトアドレス間で、メッセージよるステート変更を行うトランザクション
    * コントラクトアカウント内にあるEVMコードを実行することで、データ変更・読み込みを行う（（トークンの増減など）
* Create
    * コントラクトアカウントを作成するトランザクション（＝スマートコントラクトのデプロイ）
    * EOAからコードのデプロイが実行される
* Update
    * スマートコントラクトを更新するトランザクション
    * EOAからメッセージをトリガーしたり、EVMコードを実行したりすることで更新が発生


## まとめ
イーサリアムのアーキテクチャについて図解しました。
EVMでコードを実行するときに、実態としてイーサリアムの基盤がどう構成されているか、イメージで理解しておくのは重要だと思いましたので、出来るだけわかりやすい図解を作っていければと思います。
R言語ではqualified nameを使えばlibrary()は必要ない

以下の２つは同じ意味となる。

```R
library(ggplot2)
gp = ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, colour=Species)) + geom_point(size = 3, alpha = 0.7)
print(gp)
```

```R
gp = ggplot2::ggplot(iris, ggplot2::aes(x = Sepal.Length, y = Sepal.Width, colour=Species)) + ggplot2::geom_point(size = 3, alpha = 0.7)
print(gp)
```

library()はPythonで言うところのimport *に近いのだろうか。

それにしても、この機能についてはドキュメントが一切見当たらなく、 **知ったのはR言語を初めて触ってから15年後** のことである…。
Elixir プロジェクトの moduledoc を README.md からコピーする

[Elixir] プロジェクトを [Hex] パッケージとしてリリースする際には、ドキュメントを書かきますが、パッケージのうたい文句を書く部分が複数あり同じ内容を何箇所かに複写することもあると思います。

最近、便利な技を覚えたのご紹介いたします。

## やりかた

**1. README.md でうたい文句を`<!-- MODULEDOC -->`で挟む**

```html:README.md
<!-- MODULEDOC -->
Read temperature and pressure in Elixir from Bosch environmental sensors
<!-- MODULEDOC -->
```

https://raw.githubusercontent.com/elixir-sensors/bmp3xx/dbe8015873efa9a0b24fe1e5361d7ad26db8c6a2/README.md

**2. `@moduledoc` の文字列を動的に `README.md` から複写**

```elixir:my_project.ex
defmodule MyProject do
  @moduledoc File.read!("README.md")
             |> String.split("<!-- MODULEDOC -->")
             |> Enum.fetch!(1)
```

このように書くと、以下のようなコードがコンパイル時に生成されます。

```elixir:my_project.ex
defmodule MyProject do
  @moduledoc """
  Read temperature and pressure in Elixir from Bosch environmental sensors
  """
```

https://github.com/elixir-sensors/bmp3xx/blob/dbe8015873efa9a0b24fe1e5361d7ad26db8c6a2/lib/bmp3xx.ex

[Elixir]: https://elixir-lang.org/
[Hex]: https://hex.pm/

## ドキュメントの書き方

[Elixir] では言語自体にドキュメントを書きやすく、ドキュメントを効果的に使えるようにする仕組みが組み込まれているので、気持ちよく書けます。ドキュメントに書かれたサンプルコードをテストとして実行することもできます。

https://elixirschool.com/ja/lessons/basics/documentation

https://hexdocs.pm/elixir/writing-documentation.html

## ネタ元

誰が最初にはじめたのか知りませんが、確か自分はこれを参考にした気がします。

https://github.com/smartrent/delux/blob/a6c10fbaaa2545030488e526da5071d8bfef408f/lib/delux.ex

## コミュニティ

いろんなコミュニティから刺激と元氣をいただいています。ありがとうございます。

### 闘魂コミュニティ

みんなでわいわい楽しく自由に闘魂プログラミングをしています。

https://autoracex.connpass.com

https://qiita.com/torifukukaiou/items/b6361f98194f3687a13c

https://qiita.com/torifukukaiou/items/98fbc9e341da2dbc33fb

https://qiita.com/torifukukaiou/items/4481f7884a20ab4b1bea

https://note.com/awesomey/n/n4d8c355bc8f7

ぜひお気軽にお立ち寄りください。

### Nervesで組み込み開発するコミュニティ

「Elixir で IoT！？ナウでヤングで cool な Nerves フレームワーク」です。

https://twitter.com/torifukukaiou/status/1201266889990623233


https://nerves-project.org

https://nerves-jp.connpass.com

https://okazakirin-beam.connpass.com/

https://kochi-embedded-meeting.connpass.com

https://www.slideshare.net/takasehideki/elixiriotcoolnerves-236780506

https://www.slideshare.net/YutakaKikuchi1/elixir-on-elixir-and-embedded-systems

https://zacky1972.github.io/blog/2023/05/26/pelemay_backend.html

### Elixir 言語でワクワクするコミュニティ

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

https://elixir-lang.info/topics/entry_column

https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian

https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd


![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/dc1ddba7-ab4c-5e20-1331-143c842be143.jpeg)
【サクラエディタ】便利すぎるショートカット一覧


:::note info
業務でサクラエディタを使うようになり、
サクラの便利さに日々救われております。

そんなこんなでサクラで役立ちそうなショートカットキーを
ごっそりまとめてみました！
:::



# 【検索・置換】系

とにかくよく使います。


Ctrl+F　検索
一致した文字にマーカーが引かれたようにハイライト表示される。
手入力のミスを減らしたい際に大変お世話になりました。


検索の移動
F3　次を検索
Shift+F3　前を検索

Ctrl+R　置換
正規表現を用い、改行（\r\n）やタブ（\t）を置換することもできる

Ctrl+G　Grep（グレップ）
ファイルの中に含まれる文字列を検索
フォルダを指定し、対象のファイルの名前を入力し、任意の条件で検索
初期値の「*.*」は全ファイルを指している。



## 【編集系】

わりかし使うかも。


Ctrl＋F6　大文字から小文字へ変換

Ctrl＋F7　小文字から大文字へ変換


Alt+A　ソート（昇順）

Alt＋D　ソート（降順）

※ascending order（asc）のA
※descending order（desc）のD


Alt+M　重複した行のマージ(削除)
選択した行で連続して重複した行があればマージ（結合）する。
つまり、重複した行の削除
連続していないとマージされない。
※mergeのM

Shift+Delete　行を削除

Shift+F6　矩形（くけい）選択
矩形とは四角のこと。
「Shift＋F6」を押してからカーソルを移動すると、四角の範囲を選択できる


「Ctrl+→」…単語移動
「Ctrl+→」は単語単位で移動するショートカットキー。Windowsに標準で付いている機能なので、サクラエディタ以外でも使えますが、サクラエディタだと日本語も綺麗に移動してくれます。「Home」や「End」、「Page Up/Down」と合わせて使うと作業が効率的になります。


## 【ファイル系】

Ctrl+N　新規ウィンドウ（またはタブ）を開く

Ctrl+Tab　ウィンドウ・タブ切り替え

Ctrl+Shift+Tab　逆方向に切り替え

Ctrl+S　上書き保存

Shift+Ctrl+S　新規保存
※新規保存する際は誤って上書き保存しないように、マウス操作にするなど工夫しないとやらかす

Ctrl+F4　ウィンドウ・タブ閉じる
タブを使用しているとき→現在開いているウィンドウを閉じる
タブを使用していないとき→現在のウィンドウを閉じて、新規ウィンドウを開く

Alt+F4　ウィンドウを消す


## 【表示系】

Ctrl+Alt+X　折り返さず、そのまま表示

Ctrl+Alt+W　右端で折り返す



## 【その他】

キー	機能

Shift + F1	コマンド一覧表示

Alt + ;	日付挿入

Alt + :	時刻挿入






※ 随時更新していけたらと思います〜〜
「もう1年以上JavaScript書いてるのに、どっちがshiftなのか覚えられないんだけど？！」

# shift() / unshift() is 何? 

JavaScriptには、配列の末尾に要素を**追加**する`Array.prototype.push()`と、末尾から要素を**取り出す**`Array.prototype.pop()`メソッドがあります。これ自身はJavaScriptのメソッド名である以前にスタック操作の用語であり、また語の持つイメージとしてもわかりやすい気がします。

一方、配列の先頭に要素を**追加する**`Array.prototype.unshift()`と、先頭から要素を**取り出す**`Array.prototype.shift()`はどうでしょうか？

**お...覚えられない...🌋!!!せめて取り除く操作はdequeueであってくれ...🥺**
~~（ggれば一瞬だからそもそも覚える必要がないとか、そんな悲しいこと言わないでください）~~

かくいう私も一向に覚えられず、[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/shift)とエディタを往復する日々を過ごしていました。頼みの綱のChatGPTに由来を訪ねてもはっきりとしたことは分からず...そんな折にとあるページにたどり着きました。

![shiftとunshiftについてChatGPTに聞いてみた結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2304176/4b477570-0797-0020-3524-3619784e909c.png)


# シェルコマンドの`shift`が起源説

:::note info
両端キュー操作のメソッド名について
JavaScriptとPerlは同用途・同名称の`push`, `pop`, `shift`, `unshift`という名称の両端キュー操作のメソッドを持ちます。Rubyにも同名のメソッドがあり、PHPにはprefixに`array_`をつけた同名のメソッドがあるようです。
:::

https://www.perlmonks.org/?node_id=613124

上記はPerlMonksというPerl言語に関するコミュニティサイトのページであり、（Perl言語の）`push`, `pop`, `shift`, `unshift`はなぜそのように名付けられたのか？という質問に対しての回答が寄せられています。この中の回答を一部抜粋して引用します。

> Only 'push' and 'pop' come from the stack terminology....I would say 'shift' comes from shell scripting, where you 'shift' the arguments off of the list passed to the script....'unshift' is probably originates with perl and would have been named by analogy with 'shift' I think.

> 筆者訳：
'push'と'pop'だけがスタックの用語から来ています。…私は'shift'はスクリプトに渡されたリストから引数を「シフト」するシェルスクリプトから来ていると推測しています。…'unshift'はおそらくperlに由来するもので、'shift'になぞらえて名付けられたのだと思います。

...なるほど..!? 確証はないものの少し核心に迫れた気がします。Perlの`shift`メソッドの起源がシェルスクリプトのshiftコマンドにあるとするならば、そのPerlからも影響を受けたと言われているJavaScriptのshiftメソッドの起源もそこにある可能性は十分にあるのではないでしょうか...!?（本当でしょうか）

# シェルコマンドの`shift`について

最後に、シェルコマンドの`shift`について触れて本稿を閉じようと思います。

![シェルのshiftコマンドの実行サンプル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2304176/c52b0690-543d-26f6-ae27-f1ae9eafc873.png)

上記では`shift`コマンドを含む簡単なシェルスクリプトを実行していますが、コマンドライン引数が先頭から順番にシフトして（取り出されて）処理されていることが見て取れるかと思います。厳密な考証は行えていないため真偽はともかくとして、これでもうJavaScriptの`Array.prototype.shift()`が**配列の先頭から要素を取り出す**メソッドであることは忘れないかなと思います。

# まとめ
明日からは自信を持って`shift`と`unshift`を使っていけそうです。歴史的な経緯などについて知っている賢者の方がみえましたら、コメントで教えていただけると嬉しいです🧑🏻‍🎓

# 2023/06/21 追記

実は、本稿に掲載したChatGPTとのやり取りの前に似た質問を訪ねてみたところ、以下の回答が得られていました。

![shiftとunshiftについてChatGPTに聞いてみた結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2304176/b34eeac8-1cbb-3207-4476-a16fd7cb2d11.png)

しかし、[ECMAScript 1st Editionの仕様書](https://www.ecma-international.org/wp-content/uploads/ECMA-262_1st_edition_june_1997.pdf)にも[2nd Editionの仕様書](https://www.ecma-international.org/wp-content/uploads/ECMA-262_2nd_edition_august_1998.pdf)にも`dequeue`メソッドや`enqueue`メソッドの記載はなく、これは明らかな誤りだと思われます。やはり、「うそはうそであると見抜ける人でないと(対話型AIを使うのは)難しい」なあと、改めて考えさせられました。

https://www.ecma-international.org/publications-and-standards/standards/ecma-262/
(openpyxlではなく)PandasでExcelのデータを操作する時のメモ

# はじめに

以下の本はExcelの処理をPythonで色々するのにお役立ちコードがいろいろ書いているのでオススメです。

https://info.nikkeibp.co.jp/media/NPC/atcl/books/051800032/index.html

とはいえ、この本では「`openpyxl`というモジュールを使いましょう」ということでサンプルコードが書かれています。それはそれで便利なのですが、会社のeラーニングでPythonを学習すると、やはり

- numpy
- Pandas
- matplotlib
 
といった三点セットが紹介されることが多いので、今回はこのサンプルコードをPandas対応することとしました。その備忘録です。

# 気を付けたことメモ

## ファイルに書き出すときは「index=False」に気を付ける

しばしば忘れてしまうのですが、PandasのDataframeをそのままExcelに書き出すと、出力先ではindexが付記されるので、データが一列ずれることになります。「読みだしたExcelに書き出す（上書き保存する）」などという処理をしている場合 **ファイルが壊れる** などとなってしまうことになるので要注意です。

## Shift_JIS か UTF-8 か

元Excelを別人が作っている場合もあるので、その際は文字コードが何かを調べるところからが重要です。すべてAsciiなら問題ないんですが…

## ChatGPTでサンプルを書いたらまず実行テスト

ChatGPTにサンプルコードを書かせるのは便利で、私もよく使っています。

https://note.com/hideh_hash_845/n/n68863ceb89a4?

が、warningを吐くようなコードが多い気がします。とりあえず書くだけならignoreしておけばいいのですが、そうでないなら原因くらいは調べておいた方がいいかもしれません。

# sample

これ自体は特に変哲もないソースコードです。

```Python:sales_list_getter_test.py
#!/usr/bin/env python
# coding: shift_jis

# 必要なモジュールのインポート
import pandas as pd

# 不要な警告を非表示にする
import warnings
warnings.filterwarnings('ignore')

# 入力Excelのファイル名、シート名
in_file    = 'sales_list_2023.xlsx'
in_sheet_1 = '売上一覧'

# 出力Excelファイル名
out_file    = '00_OutData.xlsx'
out_sheet_a = 'new_sheet'

#----------
# Excelの読込
in_df1 = pd.read_excel(in_file, sheet_name=in_sheet_1)

# 読込み位置とindexを指定
df1 = in_df1[0:]

# 必要な列のみ抽出
df_columns = ['商品', '売上金額']
df1_work = df1.loc[:, df_columns]

# 商品のsumを作る
out_df1 = df1_work.groupby('商品', as_index=False).sum()

# 総計を追加
sum_all = df1_work['売上金額'].sum()
sum_df = pd.DataFrame([['', sum_all]], index=['SUM'], columns=df_columns)
out_df1 = pd.concat(
    [out_df1, sum_df],
    axis=0,
    ignore_index=True
)

# indexを振り直してファイル書き出し
out_df1 = out_df1.reset_index(drop=True)
with pd.ExcelWriter(out_file) as writer:
    out_df1.to_excel(writer, sheet_name=out_sheet_a, index=False)
    in_df1.to_excel(writer, sheet_name='orig_01')
```

（おわり）
2進数をASCII文字列にデコードするプログラム

2進数コードをASCIIコードにデコードするCプログラムです。
Linuxのターミナルで動きます。
FacebookのLinux Fan Groupにたまに2進数の暗号が載るので、読むために作りました。
`cc bindecode.c -o bindecode`としてコンパイルしてください。
2進数のダンプなら、`echo "string" | xxd　-b`でできます。

```bindecode.c
#include    <stdio.h>
#include    <stdlib.h>
int main(int argc,char *argv[]) {
    FILE *fp;
    int c;
    if (argc!=2) { fprintf(stderr,"Usage: bindecode <file>\n"); exit(1); }
    fp=fopen(argv[1],"r");
    if (fp==NULL) { fprintf(stderr,"File open error\n"); exit(1); }
    for(int b=0;(c=fgetc(fp))!=EOF;) {
        switch(c) {
            case ' ':
            case '\t':
            case '\n':
                printf("%c",b);
                b=0;
                break;
            case '1':
                b=(b<<1)|1;
                break;
            case '0':
                b<<=1;
                break;
            default:
            }
        }
    fclose(fp);
    exit(0);
}


```
testparmコマンドの書式とオプション

●testparmコマンド
Sambaの設定ファイルである「/etc/samba/smb.conf」ファイルの構文をチェックする。

testparmコマンドの構文チェックに成功すれば、設定が確実にロードされることが保証されます。ただし、ロード後の動作が期待通りに動くことまでは保証されないため、動作確認は別途必要。

●testparmコマンドの書式とオプション。

testparm [オプション] [設定ファイル]

・-s　構文をチェックした後、Enterキーを押さなくてもsmb.confの内容を表示
・-v　構文をチェックした後、smb.confに記述されていない(定義されていない)パラメータも表示
2023/6/20主にITとかセキュリティの記事

【カスペルスキー】仮想通貨ウォレットを狙い、マルチステージ攻撃を展開する高度なクライムウェア「DoubleFinger」を発見(6/16)
https://goodway.co.jp/fip/htdocs/jouqgbx8c-483/

復旧には1,000万円超かかることも…医療機関を狙う「サイバー攻撃」が急増中！いますぐできる「2つの対策」(6/17)
https://gentosha-go.com/articles/-/51930

中小企業向けエンドポイントセキュリティの要点は？ポイントのまとめ
https://www.ntt.com/business/services/network/internet-connect/ocn-business/bocn/knowledge/archive_28.html

ChatGPTなど生成AIがもたらす脅威とプライバシーの懸念、何が問題か？(6/18)
https://news.mynavi.jp/techplus/article/20230618-2704487/

NTTデータ先端技術ら、脆弱性診断プラットフォーム活用のWebアプリ診断サービス提供
https://news.nicovideo.jp/watch/nw12786824

ChatGPTなど生成AIがもたらす脅威とプライバシーの懸念、何が問題か？
https://news.nicovideo.jp/watch/nw12787214

フィッシング詐欺が急増中！ あらかじめ把握すべきポイントと対処法は？(6/18)
https://news.yahoo.co.jp/articles/50e8e63ca844a2f64de4ea786cc44b84f9515908?source=rss

サポート詐欺に注意！(6/18)
https://www.saga-s.co.jp/articles/-/1056622

中国関与のスパイ活動、メールセキュリティゲートウェイのゼロデイ脆弱性悪用(6/18)
https://news.mynavi.jp/techplus/article/20230618-2706433/

【サクソバンク証券】サクソバンク証券における業務改善に関するご報告について(6/16)
https://goodway.co.jp/fip/htdocs/jo5kpok7k-303/

防衛技術、無人機に重点
政府指針案、サイバーなど12分野(6/18)
https://www.nikkei.com/article/DGKKZO71990100X10C23A6EA3000/

マイナポイント誤紐付け事案に関する総務省調査への報告(6/16)
https://www.city.kobe.lg.jp/a32541/press/20230616.html

＜成人未満・第４部　少年事件記録の行方＞保存媒体　デジタル化、費用と安全性課題(6/18)
https://www.kobe-np.co.jp/news/sougou/202306/0016486971.shtml

重大事件記録の保存、電子化に難色なぜ？　費用や安全性、期間…「慎重に検討が必要」(6/18)
https://news.yahoo.co.jp/articles/be6c1154cb856fc71d566cb157071bf99be6b873

マイナンバーカード　情報漏洩が不安なら「口座連携」は解除可能、自分で拒否の意思表示を(6/18)
https://news.yahoo.co.jp/articles/b7890b81851e4821a0f04b7aed8b9f709ac61772?source=rss

人質交渉のプロに学ぶ「交渉で望んだ結果を得るためのテクニック」(6/18)
https://courrier.jp/news/archives/329188/

防衛装備品、国の工場新設を容認　輸出失敗でも経費返還求めず(6/17)
https://www.sanyonews.jp/article/1413131/
https://nordot.app/1042774744805786371

防衛装備品、国の工場新設を容認 輸出失敗でも経費返還求めず(6/17)
https://www.gifu-np.co.jp/articles/-/245841

アップルと小米はどこに差があるのか。ハイエンド市場に進出するのに足らない点とは何か
https://tamakino.hatenablog.com/entry/2023/06/18/080000

サイバーセキュリティボランティア　松浦高生に長崎県警が委嘱　小中学生にインターネットのマナーなど指導(6/18)
https://nordot.app/1043001253598167944

基幹システムの一部をAWSへ移行　マネージドサービスで運用費削減
神戸市(6/19)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/061300133/

高出力レーザー撃墜から網で空中捕獲まで、脅威増すドローン攻撃への対策技術
第2部：技術編［ドローン対策］(6/19)
https://xtech.nikkei.com/atcl/nxt/mag/ne/18/00098/00003/

CSIRTは緊急時にどう動く？1日がかりのインシデント対応講習に参加してみた(6/19)
https://xtech.nikkei.com/atcl/nxt/column/18/02501/061600001/

ミス続発のマイナカード活用事業　「バカヨケ」の欠如こそが問題だ(6/19)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/060900141/

空間ID（Spatial ID）(6/19)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/061300144/

G7デジタル相会合　AI規制で同床異夢(6/19)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/061500147/
単眼深度推定モデルのMiDaSのonnx形式ファイルのダウンロード方法のメモ

# MiDaSとは
- 大規模かつ多様なデータセットで学習しているため、より幅広いタスクや環境で効率的に実行することができる
- スケール感がないため、マッピング、プランニング、ナビゲーション、物体認識、3D再構成、画像編集など、メートル単位の深度を必要とする場面での有用性は低下する
- Stable Diffusion 2.0

以下はMiDaSのモデル一覧です。横軸は1秒あたりのフレーム数。縦軸は性能。円の大きさはパラメーター数です。
![MiDaS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661995/88eba58e-c027-8e49-f1ab-236b5be71fe7.png)
- 最高品質:dpt_beit_large_512
- 品質はやや劣るが、速度と性能を両立:dpt_swin2_tiny_256,dpt_levit_224
- 組み込み機器向け:dpt_swin2_tiny_256,dpt_levit_224]

# ダウンロード方法
**1.python3.8をセットアップする(python3.9以降はこの後のパッケージのインストールでエラーになる可能性あり)**
↓python3.8のインストール方法
https://senablog.com/python-dl-inst/
インストールが完了したら、以下のコマンドで自分のパソコンにちゃんとダウンロードされているか確認します。
```
python --version
```
このように表示されたらダウンロード成功です。(私はver3.8.10をダウンロードしました)
```
Python 3.8.10
```

**2.pytorchで読み込めるモデルの重みファイルをここからダウンロードします。**
https://github.com/isl-org/MiDaS/releases/download/v2_1/model-f6b98070.pt

**3.OpenCVをインストールします**
```
pip install --upgrade pip
pip install opencv-python
```

**4.Pytorchをインストールします。**
```
pip install -I torch==1.7.0 torchvision==0.8.0
```

**5.TensorFlowをインストールします。**
(ここのTensorFlowとPythonのバージョンの対応表から適するTensorflowをインストール)
https://github.com/tensorflow/addons#python-op-compatility
TensorFlow
```
pip install -I grpcio tensorflow==2.12.0 tensorflow-addons==0.20.0 numpy==1.23.5
```

**6.onnxパッケージをインストールします。(ここでpython3.9以降だとエラーが出る可能性あり)**
```
pip install onnx==1.7.0
```

**7.onnx-tensorflowのプロジェクトのgitをcloneします。**
```
git clone https://github.com/onnx/onnx-tensorflow.git
cd onnx-tensorflow 
git checkout 095b51b88e35c4001d70f15f80f31014b592b81e 
pip install -e .
```

**8.以下のコマンドを実行する**
```
python make_onnx_model.py
```

**9.カレントディレクトリにmodel-f6b98070.onnxのファイルが出力されたら成功です。**
Error in event handler: TypeError: Cannot read properties of undefined (reading 'speak')

## chrome拡張機能(extention)で、chrome.tts.speak()を実行してもエラーが起きる時の対処法


エラーメッセージによれば、Cannot read properties of undefined のエラーが発生しています。これは、chrome オブジェクトが未定義であるか、chrome.tts プロパティが未定義である可能性があります。

このエラーの原因を特定するためには、次の手順を試してみてください。
私は対処法５で解決しました。

#### 対処法１
Chrome拡張機能のmanifest.jsonまたはmanifest.tsが正しく設定されているか確認してください。

chrome.tts.speak()のDocument
https://developer.chrome.com/docs/extensions/reference/tts/

#### 対処法２
Chromeの拡張機能の設定画面に移動し、chrome.tts API が有効になっていることを確認してください。必要なパーミッションが正しく設定されているかを確認してください。

#### 対処法3
chrome オブジェクトや chrome.tts プロパティをデバッグするために、console.log(chrome) や console.log(chrome.tts) のようなログ文を追加してみてください。デベロッパーツールのコンソールにログが表示されるかどうか確認してください。

#### 対処法４
Chromeの拡張機能を再読み込みしてみてください。一時的な問題やキャッシュの問題が原因である可能性があります。

#### 対処法５ 
拡張機能を右クリック　→ ウェブ権限を表示　→ 安全ではないコンテンツ　→ 許可する
 
![スクリーンショット 2023-06-20 2.42.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328398/6594cbb9-7922-e737-81d3-36a2f5948c2a.png)![スクリーンショット 2023-06-20 2.42.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328398/beab6be1-c291-85f4-ce78-a700bd9431aa.png)