OmniAICreator/Qiita-1.07M huggingface dataset:
【Query Builder：Expression】Try using SwitchPipe statement

This time, let's use the **SwitchPipe** statement that can be used for data mapping, etc.
Start `Query Builder` from the [Sharperlight](https://sharperlight.com/) application menu.
Set the filter settings as shown below and prepare a custom dataset.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/cc239c69-cc48-a967-8e46-cd0d80eefd71.png)
```
"Account Code::String","Amount::Number",Account Name::String,"Branch::String"
"10000", 10000, "Cash", "AUS"
"10100", 230000, "Bank Account", "AUS"
"10200", 560000, "Accounts Receivable", "AUS"
"10300", 380000, "Bills Recivable", "AUS"
"50000", 10000, "現金", "JPN"
"50100", 230000, "預金", "JPN"
"50200", 560000, "売掛金", "JPN"
"50300", 380000, "受取手形", "JPN"
```
A preview returns a dataset like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/930c8954-cce9-93aa-1d8e-4ddbebcc95c5.png)
Now let's write the **SwitchPipe** statement.
In the above data, Australia and Japan have different codes to represent the same account items. Let's use the SwitchPipe statement to convert Japanese account code to Australian account code.
Right-click in the output area and select **Add Expression**.
When the Output Options dialog opens, find the **SwitchPipe** statement in the function list and double-click to transfer the template to the upper editor area.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2d309984-29cc-9e5f-f64d-b2d12562086a.png)
Edit based on this.
The first line is which field value is used as the criterion (drive value). The account code is the subject here.
On the second line, describe what to do if the account code specified in `drivervalue` is matched.
Therefore, I want to convert Japanese account codes "50000,50100,50200,50300" to Australian account codes, so it will be like this.
The third line describes the result value when it matches. Match the order of the conditional values specified in the second line. So "10000,10100,10200,10300".
Finally, if the conditional value is not specified in the second line, it should be the one for Australia so it will be displayed as it is.
```
SwitchPipe( {%AccountCode},
"50000,50100,50200,50300",
"10000,10100,10200,10300"
,{%AccountCode} )
```
Let's preview it now. Before that, set the data type to Text.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d13b82a1-5d23-83fd-e0f6-805fa503ce08.png)
The result looks like this.
Japanese account codes have been converted to Australian account codes.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/60d0101c-de69-1a25-f72e-acd232858517.png)

I hope this will help your work.
ナイスなテストケースを作成するための3つのテクニック

## はじめに

:writing_hand:[**お題は不問！Qiita Engineer Festa 2023で記事投稿！**](https://qiita.com/official-events/4f3daca63fb78f16df0b)の参加記事になります！

ソフトウェアの品質確保にはテストは欠かせません。
テストを実施する前には、テストケース（≒テストのための資料）を作成することがほとんどかと思います。
会社やプロジェクトによってテストケースの書き方は様々かと思いますが、広い範囲で取り入れることができそうなテクニックについて3つまとめました:writing_hand:

## 3つのテクニック

### 1. そのデータにする目的を明確にする

例えば、通販サイトにて「ご利用ポイント」をテストする際、テスト条件に「ご利用ポイント：1000円」としか書かれていないことがあります。  
これでは、なぜご利用ポイントを1000円とするのか読み手に伝わりません。その結果、以下のような問題が発生します:boom:  

:::note alert
- **テストケースのレビューが非常にやりにくい**
- **テスト実施者は何を目的としたテストなのかが分からない
  （テスト実施者＝テストケース作成者とは限らない）**  
:::

このような問題を防ぐため、**そのデータにする目的を明確にする**のが効果的です:muscle:  

- ご利用ポイント：900円（所有ポイントより少ない）
- ご利用ポイント：1000円（所有ポイントと等しい）
- ご利用ポイント：1100円（所有ポイントより多い）

こうすれば**読み手に意図が伝わり、手戻りや誤解を避ける**ことができます。

### 2. 期待値は具体的に書く

期待値でよく見かけるのが、「処理が正しいこと」「問題がないこと」といった表現です。
このような表現は非常に曖昧であるため、読む人によって様々な意味に捉えられてしまいます。  

例えば、「ご利用ポイントの範囲内であれば、買い物ができる」という仕様があったとします。
テストケース作成者は、期待値を以下のようにしたとします。

- ご利用ポイント：900円（所有ポイントより少ない）
  - 期待値：**処理が正しいこと**

これをテスト実施したところ、買い物が完了してしまいました。  
テストケース作成者の意図としては、買い物ができてしまったため「誤った処理（バグ）」ですが、テスト実行者は「正しい処理」と判断してしまう可能性があります:scream:

期待値で誤解を生まないためには、**期待値は具体的に書く**べきです:muscle:

- ポイントが不足している旨を通知するエラーダイアログが表示されること

こうすれば読み手に誤解を与えにくくなります。

### 3. 「～できること」が出てきたら「～できないこと」を考える

仕様でよく見かけるのが「～できること」のような表現です。
例えば、「管理者ユーザーは、管理画面にアクセスできる」という仕様があったとします。 
 
多くの人は「管理者ユーザーでログインして、管理画面が閲覧できる」といったテストケースを作ると思います。  
しかし、このケースだけでは不十分です。一般ユーザーが管理画面にログインできてしまうかもしれないからです
これでは不具合を見逃してしまう可能性があります:warning:

この場合は、「一般ユーザーでログインしたときは、管理画面にアクセスできないこと」を確認するテストケースを作るべきです。
仕様書から、**表面的な文章だけを参考にしてテストケースを作る**と、必要な検証が漏れてしまいます。  
そうならないため、**「～できること」を確認するテストケースを作ったら、セットとして「～できないこと」のテストケースが必要かどうか**を必ず考えるべきです:muscle:  

## おわりに

- テスト実施者＝テストケース作成者になるとつい記述を簡略化してしまいます:innocent:
- しかし忘れた頃にまたテストケースを使用するかもしれません:innocent:
- 「**後々皆が楽するために、今もうちょっと頑張る**」ということをできるようにしていきたいですね:innocent:
パチスロの末尾寄せ傾向を可視化できるツールを作りました

## はじめに

パチスロ好きの皆さん、お店の高設定の傾向が掴めずに苦労していませんか？

特に末尾系の傾向の場合、いかにライバルに差をつけていち早く、正解末尾の台に座れるかが重要となってきますよね。

そんな方がに向けて開発したのが、パチスロ打ちのための末尾発見ツール「Arisou」です。
![bg_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486945/93c80316-af38-7ea0-af7f-7eed7132e7c0.png)

▼アプリ名：「パチスロ末尾発見ツール Arisou」
▼サービスURL：https://arisou.herokuapp.com/
▼GitHub URL：https://github.com/ym0628/arisou

## サービス概要
<ul>
<li>パチスロで高設定を探すことに苦労している人へ</li>
<li>高設定の配分が可視化できるツールを提供し</li>
<li>お店の高設定の傾向（末尾寄せ）を素早く察知できるようにします</li>
</ul>

## 主な機能と使い方

### ツール入出力機能
| <img src="https://i.gyazo.com/a1eaab5a7601c3911145ebef12b3bddb.png"> | <img src="https://i.gyazo.com/7313862e3e0e218911203701ef1ce674.png">               |
| -------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| **ツール入力画面**<br>店舗名・パチスロ総設置台数・台番・差枚数を入力して出力します。<br>   | **ツール出力結果**<br>入力した値から、末尾ごとの勝率・総差枚数・平均差枚数が算出されます。 |


## マイページ機能
| <img src="https://i.gyazo.com/785fc152e582c1c13684b6dcb524a313.png"> | 
| -------------------------------------------------------------------- |
| **ツール出力結果一覧**<br>登録ユーザーはマイページから出力したデータの確認・編集・削除が可能です。<br>   |

<br>


## サービスを作った背景
自分自身パチスロのヘビーユーザーであるため、「こんなサービスがあれば絶対使う！」と思えるサービスを考えました。昨今のパチンコ・パチスロ業界では、勝つための立ち回りを行うのが年々難しくなってきています。


<br>

* 年々厳しくなる遊技機の規制（台スペックの低下）
* 店舗経営の悪化〜閉店・倒産ラッシュ
* 店舗による客への出禁措置ルールの強化
<br>

厳しい状況下にあるパチスロ業界においても、長く遊ぶためには、低設定台を避け、高設定台に座ることが必要です。本サービスのユーザーが高設定台が投入されるお店の傾向をいち早く察知して確保するために、このサービスを考えるに至りました。
<br>


## 工夫したところ
### 動的に追加・削除ができる入力フォーム

cocoon gemを採用し、入力フォームを非同期で追加・削除できるようにしました。



### モジュール化してFatコントローラー、Fatモデルを解消

受け取ったパラメーターを加工、計算するビジネスロジックをコントローラーに記述していたことで、Fatコントローラーの状態なっていました。

そこで、ビジネスロジックを計算の種類ごとにmoduleに切り出して定義することで、コントローラーとモデルのFat状態を回避し、見やすく、管理しやすい設計にしました。

## 使用技術

▼バックエンド
- Ruby 3.2.1
- Ruby on Rails 6.1.7.3
- Node.js 19.6.0
- Yarn 1.22.19

▼フロントエンド
- Sass/SCSS
- Bootstrap5
- font-awesome-sass

▼インフラ
- Heroku
- PostgreSQL
- SQLite3

▼主要ライブラリ (gem)
- Sorcery (ユーザー認証)
- rails-i18n（i18n 国際化対応）
- cocoon (入力フォーム生成)
- dotenv-rails (環境変数の設定)
- sitemap_generator（サイトマップの作成）
- meta-tags（OGP、メタタグの設定）
- rspec-rails（テストフレームワーク）
- rubocop（Lintツール）


## ER図
[![Image from Gyazo](https://i.gyazo.com/2f2b0d014498d2feb112872a0a62540a.png)](https://gyazo.com/2f2b0d014498d2feb112872a0a62540a)


## 制作期間
2023/03/21〜2023/06/21まで、3ヶ月間で本リリースを迎えました。



## 今後について（追加機能の予定）

- ゲストユーザー機能（未ログインでもツール入力・出力が利用できるように）
- 台番号の自動入力機能（●●番～●●番と入力すれば、複数の台番号を自動的に入力してくれるような感じを検討中）

機能の追加情報があった際は、Twitter等から告知いたします。
https://twitter.com/ArisouPachislot



## さいごに

今回、イチからWEBアプリケーションを作成したのは初めてで、つまずいた場面も多々ありましたが、何とかリリースを迎えることができてホッとしています。

完全に趣味の領域に関するサービスなので、どのくらいの方にご利用いただけるかは分かりませんが、個人的には「こんなアプリがあったら欲しい！」と思えるようなサービスを作成できたと思っています。

まだまだプログラミング学習の身ですが、今後も新しい技術を積極的に使ってみるなど、チャレンジ精神を忘れずに取り組んでいきます。

本アプリケーションについて何かご意見・ご感想等あればコメント頂けますと幸いです。
HTMLとかについて学ぶ

いつも同じ言語だけ勉強していてもつまらないので。いつか学んでみたいと思ってた。
ほとんどは、高校で学んだことの復習です。
例（html）
```
<!DOCTYPE html>
<html lang="ja">
<head>
    <title>TEST_A</title>
 <link rel="stylesheet" href="type1.css">

</head>
<body>
<blockquote>
<h1>A_1</h1>


<img src ="Test-A.png" alt="テスト" width="160" height="140">
<h2>A_2</h2>
<p>A_2の内容</p>

<h2>A_3</h2>
<p>A_3の内容
<span>色の変更</span></p>

</blockquote>
</body>
</html>
```
<>で囲むことで色々使えるようになる
<>になんか必要なものを入れるとタグと呼ばれる。
各＜＞内説明
|カッコ内に入っているもの|説明|
|---|---|
|!DOCTYPE  html|タグではない。なんかhtml 5であることを宣言しているらしい。なくても動く。|
|html lang="ja"|書かれた言語。本文などが何語で書かれているのかを、機械が認識するためのものらしい。"ja"はjapanese。enだったらenglish(英語)。|
|head|このhtmlに関する情報（例えば、タイトル）を書く。ここに書いた内容は、本文には表示されないっぽい。|
|title|タイトル。ご自由にどうぞ|
|link rel="stylesheet" href="type1.css"|linkは、このhtmlの文章以外から必要なデータを取ってくるときに使うっぽい。hrefはとってくるデータの名前。relはとってくるデータがどんなものかを書く。が、なんでもいいわけではない。|
|/head|head終わり。/が付いたら終わり。|
|body|ここに本文を書く。大事な部分。|
|blockquote|他から引用してきたことを示す。|
|h1|h1始まり。これと、次の/h1に挟まれたものはビッグになれる|
|/h1|h1終わり|
|img src ="Test-A.png" alt="テスト" width="160" height="140"|画像を読み込む。ここでは、Test-A.pngを読み込んでいる。altは「代替」。読み込めなかったときには、テストの文字が出る。。widthとheightは画像の大きさ。|
|h2|2番目に大きい。h1と使いかたが同じ。|
|p|段落。改行される。|
|span|よくわからなかったが、CSSで色を付けたりサイズを変えたりすることができる。|
|/blockquote|blockquoteおわり|
|/body|bodyおわり|
|/html|htmlおわり|


ちなみに使った画像はこちら。自作。
![Test-A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/0d28415d-bce2-fc25-f6b4-a40503aebc99.png)


# cssについて
```
<link rel="stylesheet" href="type1.css">
```
さっきこんなものを書いた。
これは、さっき書いたhtmlを美しくしてくれる洋服みたいなもの。
作ったものに色を付けたり、文字の大きさを変更しておしゃれにできる。
例(css)
```
h1{color:red;}
h2{color:green;}
p{color:blue}
span{font-size:30px;}
span{color:red;}
```
さっきh1とかh2とかを見たと思う。
cssでは、そのタグごとに色を変更できる。
例えば１行目は、h1のcolorをredに変えるとか言ってる。

そして、出来上がったものがこれ↓
![スクリーンショット (125).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/c6a614c2-e798-2206-eadc-415b48943858.png)


# 頭と体はあるのに、足はない。（腕も）
headとbodyがあるのは確認できた。しかし、legとかarmとかはない。
だるま。
# まとめ
htmlについての基本は大体わかった気がする。
知らないことは、調べよう。
頂点被覆（Vertex Cover）問題をPySATのHitmanを使って解く

[頂点被覆(Wikipedia)](https://ja.wikipedia.org/wiki/%E9%A0%82%E7%82%B9%E8%A2%AB%E8%A6%86)問題はそれだけでグラフ理論の1章になるような大きな問題ですが、ここではPySATのHitmanを使って簡単なものを解くことを目指します。

**【問題】以下のグラフのすべての辺に接する最小の頂点の集合を求めよ** 


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/ed6617f5-97c0-c105-ff42-d1eb29f52fef.png)

### PySATのHitmanの基本的な使い方

Wikipediaにもある簡単な問題を使ってHitmanの使い方を見て行きます。開発環境はGoogle Colabで、まずPySATのインストールから行います

```python 
!pip install python-sat
```

プログラムとしては辺の情報をリスト形式で入力してHitmanを呼ぶだけという超簡単なものです。期待通り[2,3,4]という結果が得られました。

```python 
import pysat
from pysat.examples.hitman import Hitman

hits = [[1,2],[1,3],[2,3],[2,4],[3,5],[4,5],[4,6]]
print(Hitman(bootstrap_with=hits).get())
# [2,3,4]
```


### 頂点の重み情報を加える

応用例として頂点に重み情報を加えてみます。**weights**パラメータとして渡すのは各々の頂点の数に対して重みを返す**DICT**形式で渡します。頂点の数字をそのまま重みとしてみます。すると[2,3,4]の代わりに[1,3,4]となりました。

```python 
w = {x:x for x in range(1,6+1)}
print(w)
hits = [[1,2],[1,3],[2,3],[2,4],[3,5],[4,5],[4,6]]
print(Hitman(bootstrap_with=hits, weights=w).get())
# {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6}
# [1, 3, 4]
```

2位以下の順位を知りたければ、以下のように**enumerate**を使って見ることが出来ます。

```python 
with Hitman(bootstrap_with=hits, htype='sorted', weights=w) as hitman:
    for hs in hitman.enumerate():
        print(f"{hs}, cost={sum([w[s] for s in hs])}")
# [1, 3, 4], cost=8
# [2, 3, 4], cost=9
# [1, 2, 4, 5], cost=12
# [1, 2, 5, 6], cost=14
# [2, 3, 5, 6], cost=16
```

（開発環境：Google Colab）

この考え方はProject Euler, Problem 838: Not Coprimeを解くのに役に立ちます。
Dockerコンテナでnginxを動かす手順 (nginx導入～SSL化まで)

# Dockerでnginxを動作させるまでの手順

Dockerではnginxを簡単に動作させることが可能です。
nginxの導入～SSL化までの手順を解説。
必要に応じてWSL上のコマンドは先頭にsudoを記述してください。

## 前提条件
環境はwindows10
WSL2とDockerはインストール済とする
SSL証明書は発行済とする

## nginxのインストール

■WSLの起動
CMDなどのターミナルでWSLを起動
```
> wsl
```

■nginxのイメージを取得
Dockerでnginxを動作させるのに使える公式イメージは、公式のレジストリサービス「Docker Hub」から取得できます。nginxイメージを取得するためのコマンドは、以下。
```
$ docker image pull nginx
```
■nginxを動作させる
nginxイメージを実行することで、Dockerコンテナを生成しnginxを動作させます。
```
$ docker run --name testnginx -d -p 8082:80 nginx
```
・「-p 8082:80」
ホスト側のポート番号（8082）と、Docker側のポート番号（80）を紐づけるオプションです。

・「-d」
Dockerコンテナをバックグラウンドで実行するためのオプションです。

・「–name testnginx」
コンテナ名を付与するオプションです。ここではtestnginxという名前をつけてます。

これでnginxの動作が開始されました。「`http://コンテナのIPアドレス:8082/`」にアクセスすると、以下のようにnginxのデフォルトページが表示されます。
「http://127.0.0.1:8082」「http://localhost:8082」など
![1a00ab9aeaec7d94c1f6d3befcae783d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314520/df5e1fa6-dab1-a6ac-e155-991f6c6cbb63.png)

## nginxでSSL化する設定

■dockerコンテナを起動させる
```
$ docker start testnginx
```

■dockerコンテナの稼働状況確認
```
$ docker ps -a
```
STATUSが`Up`となっていたらコンテナは稼働中。`Exited`となってたらコンテナは稼働してません。

■dockerコンテナ内でコマンドを実行
```
$ docker exec -it testnginx bash
```
「root@〇〇〇〇〇〇 #」みたいなユーザに切り替わればdockerコンテナに入れました。

■vimエディタのインストール
dockerコンテナ内で使用するテキストエディタをインストールします。
今回はvimエディタを使用します。好みに応じて別のエディタを使用してもOKです。
```
# apt-get update
# apt-get install vim
```
```apt-get update```でパッケージのアップデートを行います。
```apt-get install vim```でvimのインストールを行います。

■configファイルの編集
configファイルでリバースプロキシの設定を実施します。
configファイルのあるディレクトリへ移動します。デフォルトでは以下にあります。
```
# cd /etc/nginx/conf.d
```

vimでdefault.confを開きます。
```
# vi default.conf
```

以下のように編集してみます。
```
server {
    listen      80 ssl;
    listen [::]:80 ssl;
    server_name testnginx;

    ssl_certificate /etc/nginx/certs/certificate.pem;
    ssl_certificate_key /etc/nginx/certs/privatekey.pem;

    location / {
        proxy_pass http://localhost:8080;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}
```
`ssl_certificate`にはSSL証明書の場所を指定
`ssl_certificate_key`にはプライベートキーの場所を指定
`proxy_pass`にはリバースプロキシしたいサイトを指定

■SSL証明書の配置
以下にSSL証明書を保管するディレクトリを作成します。
```
# mkdir /etc/nginx/certs
```

コンテナから抜けて、WSL上へもどります。
WSL上で証明書の配置してあるフォルダへ移動します。
証明書のインストール(コピー)を実施
```
$ docker cp privatekey.pem testnginx:/etc/nginx/certs
$ docker cp certificate.pem testnginx:/etc/nginx/certs
```

■windowsのhostsの編集
windows側のhostsに以下を追記する。
hostsの場所`C:\Windows\System32\drivers\etc`
```
127.0.0.1 FQDN
```
FQDNにはSSL証明書を発行した際に紐づけしたFQDNを指定すること。

■nginxの再起動
nginxを再起動する
```
# service nginx restart
```
これでSSL化ができます。
`https://FQDN:8082/`にアクセスして指定したサイトへリバースプロキシされるか確認。
SSL化ができてたらURLの先頭が鍵マークに変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314520/3a7d3d0d-29de-7dd2-feb9-76daf75757c0.png)

以上でSSL化ができました!!
【初学者向け】初学者によるpython基礎

# はじめに
言語初学者の私がアウトプットするために始めました。
凡人なので、悩んだりわからなかった箇所を幅広い方に共有できるかなと思っています。
また、私自身言語初学者なので超基礎知識のところも細かく書いております。
メモがわりですが、これから始める方などの参考になれば幸いです
(初学者による初学者向けのメモだと思ってください。ベテランの方は、あゝこんな時期もあったなとノスタルジーに浸りながらアドバイスを頂けると幸いです)
# python(超基礎)
pythonの基本的な知識をつらつら書いていきます。(開発年月日などは省略)
## プログラミングのやり方
まず、プログラムを作成し実行する場合、あるおまじないを書かないとそれが出力されず、どのような結果が得られたかわかりません。　
自分がどんな内容を記してどのような結果が出たか知りたい場合、まずは、

```python 
print()
```
で確認してみましょう。　
例えば、挨拶をしたい！！！場合は、　
```python 
print("こんにちは!")
```
と記述し、実行することで、コンソール(結果が表示させる場所)にこんにちは!が表示されます。
このように、基本的にプログラミングは、　


1.コードを記述　
2.コードの実行 
3.結果の確認 


が必要となります。そのほかに、エラーの修正や、警告の修正、業務ではレビュー(ソースを第三者などが確認すること)やtestで確認する必要が出てきます。　
また、プログラミングを学習する上で必要だと感じたのは、意味と動作をちゃんと理解することです。
print()は、()にあるものを表示してくれるおまじないです。(実際は関数というものの一種ですがまた、関数は後日メモします,,,)
print内では、文字以外に数字なども記述し表示することが出来ます。　
```python 
print(3)
print("初めまして")
print("$&%")
```
上記のprintは、一番上が数字の出力、その下が文字の出力、その下が、記号の出力です。 
みてもらうとわかりますが、数字の3だけ””で囲まれていません。数字をprintで表示する場合、数字だけなら""が必要ありません。次に、　
```python 
print("2")
print(こんばんは)
```
を実行してみましょう。この時、必ずエラーが発生します。今度は、数字の2は表示できたと思いますが、下のこんばんはでエラーが発生します。 
実は、数字は""を使わなくても使っても大丈夫です。(処理内容は違うけど今はこの知識で平気です)
pythonでは、文字は基本的に "" で囲う必要があります。
最初は、日本語や英語は""が必要なんだあ、と思ってください。
## pythonで計算　
せっかくプログラミングをするなら、言いたいことを出力するだけではもったいないです。なので、次は計算を自動でしてもらって、その結果を出力してみましょう。　
計算をする場合、私たちが普段使う記号と、使わない記号を記述する必要があります。　

| やりたいこと | 記号 | 
|:-----------|------------:|
| 足し算       | +        | 
| 引き算     | -      | 
| 掛け算      | *        | 
| 割り算　    | /          | 
| 余り      | %   | 
| るい乗　　　　|   **   |

コードでは、表の右側の記号を用いて計算します。+や-はわかると思いますが、掛け算では、* (アスタリスク)を記述する必要があります。累乗では、** と * が二つ必要です。
また、割り算をしたときの余を求める記号もあります。それが %(パーセント) です。
これらの記号のことは、<font color="Red">演算子</font>と言います。
では、実際に記述して実行してみましょう。　
```python 
print(4 + 6)
print(9 - 4)
pirnt(10 * 5)
print(10 / 2)
print(10 % 3)
print(3 ** 3)
```
実行してみると、コンソールにそれぞれ結果が表示されたと思います。　
演算子は、めちゃくちゃ利用するのでやっていくうちに自然と身につくと思います。

## 練習問題　
プログラミングを学習する中で重要なのが、"真似" と "アウトプット" です。　
本メモは、最後に簡単な練習問題をメモしておきます。(自分で解くようでもあります)
```python 
"""
練習問題1
printを利用し、自分の名前を表示しましょう。　
-表示例-
田中太郎

練習問題2
printを利用し、こんにちは。太郎さん。を、二つに分けて表示しましょう。　
-表示例-　
こんにちは。　
太郎さん。

練習問題3
printを利用し、3+2=5を表示しましょう。このとき、演算子は使用できません。 
-表示例-
3+2=5

練習問題4
printを利用し、18-5の計算結果を表示しましょう。　
-表示例-
13

練習問題5
printを利用し、123 ÷ 17 の計算結果を表示しましょう。　
-表示例- 
7.235...

練習問題6
printを利用し、6×(3+2) の計算結果を表示しましょう。このとき、()を使用し、計算する順番を指定しましょう。 
-表示例-
30 

応用問題7
printを利用し、こんにちは。花子さん。を表示してみましょう。このとき、"こんにちは。" "花子さん。"と記述してください。　
-表示例-
こんにちは。花子さん。 
""" 
```
練習問題は、本メモを見返せば必ずわかる難易度にしています。応用問題は、私の理解度によって難易度が変わりますのであしからず,,,

応用問題答え 
```python
""" 
応用問題7答え
print("こんにちは。"+"花子さん。")

文字は、+ を利用し結合することが出来ます。実際の業務でも
メッセージの表示で利用することが多いので、覚えておきたい
考え方です!!
"""
```
# 終わりに

今回は、プログラミングの結果確認と計算についてメモしています。
初めの知識で簡単ではありますが細かく書こうと思ってます。このメモの利用法として、
1. 中のプログラムを実際に書いて実行してみる。
2. 練習問題を解いて、結果を確認する。
3. 間違っていたら、メモを見返して修正する。

1~3の動作は、プログラミングの基礎的な動作であり、"真似"と"アウトプット"が同時にできる優れものです。おすすめの勉強方法なのでぜひ、実践してみてください。
また、内容を逐一編集して足していくかもしれないのでより詳しく知識を得ることができるようアップデートしていこうと思います。(間違っている箇所があったら修正していきます。) 
最後に、次の記事もみてもらえると嬉しいです。　
ありがとうございました。 
          ----ひよこ-----
Aurora （デフォルトKMSキーで暗号化されてる）を別アカウントに共有する

別で Aurora のスナップショットを別アカウントに共有する方法を書きましたが、その方法だと手動スナップショットの取得に2時間、共有されたスナップショットを新規 Aurora で復元するのに2時間の合計4時間も掛かりました。

https://qiita.com/kazumacchi/items/384c3c7ea6350519acf6

ちょっとさすがにそれは長いよねってことで、クローンを利用する方法を試してみました。


# 移行元アカウントでの作業

## KMS キーの作成と共有

Aurora もスナップショットと同じく、デフォルト KMS キーで暗号化されていると別アカウントに共有できないようなので、デフォルトでない KMS キーを作成する。

[Aurora のスナップショット（デフォルトKMSキーで暗号化されてる）を別アカウントに共有する](https://qiita.com/kazumacchi/items/384c3c7ea6350519acf6#kms-%E3%82%AD%E3%83%BC%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E5%85%B1%E6%9C%89)に既に書いてあるので、そちらを参照します。


## 移行したい Aurora DB クラスターをクローン

上で作成した KMS キーを使って暗号化された、クローンを作成

- RDS メニューの「データベース」
- リソース共有を行いたい DB クラスターを選択し、「アクション」の「クローン作成」

### クローンの作成

「DB インスタンス識別子」を入力
追加設定の「AWS KMS キー」で、上で作成した KMS キーを利用

最低この2つを変更、クローンを作成する



## AWS Resource Access Manager

- AWS Resource Access Manager の左メニューから「リソースの共有」
- 「リソース共有の作成」

### リソース共有の作成

#### リソース共有の名前

共有したい Aurora っぽい名前を入力

#### リソースオプション

- 検索セレクトボックスで Aurora DB クラスターを選択
- 表示された DB 識別子で共有したい DB を選択

#### 選択されたリソース

上記リソースオプションで選択した DB が表示される
必要があれば触る

#### タグ・オプション

必要があれば追加

次へ


### マネージド型アクセス許可を関連付ける

必要があれば触る

次へ

### プリンシパルにアクセス権限を付与する

#### プリンシパル - オプション

すべてのユーザーとの共有を許可

#### プリンシパル

プリンシパルタイプの選択 - AWSアカウント
AWS アカウント ID を入力 - 共有先のAWSアカウントID

次へ

### 確認と作成

問題なければリソース共有を作成


# 移行先アカウントでの作業

AWS Resource Access Manager で確認
「自分と共有」メニューから、他アカウントから共有されているリソースが表示される


![resourceaccessmanager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/cdd9d85c-54cd-d838-daaf-c7a3ec3544fb.png)

<br>

問題なく共有されていれば、RDS メニューの「データベース」にて、赤枠部分に共有されたDBクラスターが表示される

![clustershare.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/e608c1d1-543e-b273-828b-6b3fd9485c29.png)

この共有DBクラスターのクローンを作成すれば、移行完了。
ここからクローン作成に2時間30分程度掛かりました。一応4時間に比べると多少短くなっている模様。


<br><br>


# 参考サイト

https://dev.classmethod.jp/articles/aurora-cross-account-clone-auto/
djangoで「TypeError: can't subtract offset-naive and offset-aware datetimes」というエラー

# 結論
`datetime.datetime`型同士の演算をするときに、日時表現が異なるもので演算を行ったために発生するエラーです。`make_naive`や`make_aware`関数を使用して表現をそろえることで解決できます。

# エラーを再現
以下のコードを実行するとエラーが発生します。
```.py
import datetime

dt1 = datetime.datetime.now()
dt2 = datetime.datetime.now(datetime.timezone.utc)

dt2 - dt1
```
```
TypeError: can't subtract offset-naive and offset-aware datetimes
```

# 原因
以下の記事が参考になります。

https://se-memorandum.com/approach-naive-aware/

どうやら、`datetime.datetime`型の変数は`aware`と`naive`という日時表現があるようです。この表現が異なるもの同士を演算することができないことから起きるエラーのようでした。

:::note
aware: タイムゾーン、サマータイムも含めた日時表現
naive: タイムゾーン、サマータイムは含めない日時表現
:::

実際にエラーが発生したコードの変数をprintしてみるとわかりやすいです。
```.py
import datetime

dt1 = datetime.datetime.now()
dt2 = datetime.datetime.now(datetime.timezone.utc)

print(dt1) # naive表現
print(dt2) # aware表現
```
```
2023-06-21 05:47:29.994050
2023-06-21 05:47:29.994103+00:00
```

# これがdjangoで起きる原因
私も全てを理解できているわけではないうえで書くことになる点、ご了承ください。djangoではモデルの日時型フィールドはaware表現のものを扱っているように思います。それゆえ、例えば`datetime.datetime.now()`などで取得した変数と演算すると、異なる表現同士を演算しようとしてエラーが発生することになります。

# 解決策
表現をそろえることで解決できます。
djangoには表現をそろえる関数である`make_naive`や`make_aware`があるので、それを使用していきます。
```.py
import datetime
from django.utils.timezone import make_naive

dt1 = datetime.datetime.now()
dt2 = datetime.datetime.now(datetime.timezone.utc)
# ともにnaive表現になる
dt1 - make_naive(dt2)
```
上記のコードだとdt2がnaive表現になるので、両方ともnaive表現で演算できるということになります。

# 補足
そもそも、`datitime.datetime`型同士を演算するとどのような結果が返ってくるのか。これについては以前の私の記事が参考になります。

https://qiita.com/76r6qo698/items/b8e2d1cdba600275202b

以上です。

# 参考
https://se-memorandum.com/approach-naive-aware/

https://sleepless-se.net/2019/10/28/django-nativedatetimeto-aware-datetime/
Elixirのコードを書いて試してみた

# 概要
Elixirのコードを書いて試してみました。復習です。以下のページを参考にしました。

https://dev.to/gumi/elixir-01--2585

# 対話モードで実行
```
$ iex
Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]

Interactive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> (1 + 2) / 3 + 4 * 5
21.0
iex(2)> "hello" <> " " <> "world"
"hello world"
iex(3)> 
```

# ファイルから実行
以下のファイルを作成しました。
``` sample.exs
IO.puts "hello" <> " " <> "world"
```
ファイルから実行してみました。
```
$ elixir sample.exs 
hello world
```

# まとめ
何かの役に立てばと。
MatBenchAbstract

# MatBenchとは
- 多様な固体材料の性質を予測する最先端の機械学習アルゴリズムのベンチマークを自動化するためのリーダーボード
- MatbenchはMaterials Projectによってホストおよび管理されている
- 材料科学のためのImageNetであり、ベンチマークおよび公平な比較のために編集された13の教師あり学習用のタスクのセット  
- 事前にクリーニングされており、すぐに使用できる状態
- 提出するためには論文（要査読）やJupyterNotebookにて裏付けが必要


# データについて

| Task name            | Task type/input       | Target column (unit)        | Samples  | Score |
|----------------------|-----------------------|-----------------------------|----------|---------------------------------------------------|
| matbench_steels      | regression/composition | yield strength (MPa)        | 312      | 229.3743|
| matbench_jdft2d      | regression/structure  | exfoliation_en (meV/atom)   | 636      | 67.2020|
| matbench_phonons     | regression/structure  | last phdos peak (cm^-1)     | 1,265    | 323.7870|
| matbench_expt_gap    | regression/composition | gap expt (eV)               | 4,604    | 1.1432|
| matbench_dielectric  | regression/structure  | n (unitless)                | 4,764    | 0.8085|
| matbench_expt_is_metal | classification/composition | is_metal                | 4,921    | 0.4981|
| matbench_glass       | classification/composition | gfa                     | 5,680    | 0.7104|
| matbench_log_gvrh    | regression/structure  | log10(G_VRH) (log10(GPa))   | 10,987   | 0.2931|
| matbench_log_kvrh    | regression/structure  | log10(K_VRH) (log10(GPa))   | 10,987   | 0.2897|
| matbench_perovskites | regression/structure  | e_form (eV/unit cell)       | 18,928   | 0.5660|
| matbench_mp_gap      | regression/structure  | gap pbe (eV)                | 106,113  | 1.3271|
| matbench_mp_is_metal | classification/structure | is_metal                 | 106,113  | 0.4349|
| matbench_mp_e_form   | regression/structure  | e_form (eV/atom)            |132,752	| 1.0059|

composition: 組成式。例）SiO2  
structure: 材料の構造。その結晶構造や分子構造など、原子や分子の配置や相互作用パターン  
Score: MAD (regression) or Fraction True (classification)  

# わからないこと
- なぜGaAsなどの代表的な物質についての情報がないのか
- なぜあまりベンチマークとして利用されていないのか
- MP番号との紐付け方
- 組成式の場合には構造異性体の処理はどのようにしているのか

# これからの進路
- わからないことの調査
- 使用例の作成

# 参考
MatBench：https://matbench.materialsproject.org/
Structureについて：https://qiita.com/ojiya/items/37b594150115531481f0
【失敗】T-DASHで出力されたxUnitファイルの中身をGitLabのパイプラインで表示したかった

# 前回の振り返り

https://qiita.com/masayakomono/items/6823c5835ce595fa2421

T-DASHのCLI版を用いてCI/CDを行う事は出来ました。ただし、テスト結果が失敗した場合もSuccessになってしまっています。
そこで、T-DASHで出力されているxUnitファイルを読み込むことでテスト結果を確認できるようにしたいと思います。

## xUnitとは
>xUnitとは、コンピュータプログラムの単体テスト（ユニットテスト）を行うためのテスティングフレームワークの総称である。これらのフレームワークでは、関数やクラスなど、ソフトウェアの様々な要素（ユニット）をテストすることができる。 Wikipediaより引用

reportsフォルダにあるxunit_output-YYYYMMDD-HHMMSS.xmlが該当します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781188/35c4a8b3-9d2b-3056-43f3-cc9aed099166.png)

中身はこちら。テスト中に失敗したものから、そもそもシステムエラーになったものまで混ざっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781188/3690e384-549d-1d78-5e05-bd5ba50c5f34.png)

## gitlab-ci.ymlを修正して実行
`artifacts:reports:junit`でxmlファイルのパスを指定してパイプラインを実行しています。
GitLabの公式によるとjUnitのレポートを表示できるようにするための設定ですが、jUnitはxUnitの一部だと言うWikipediaの内容を信じていきます。
上手くいけばこのxmlの中身がGitLab上で見れるようになるはず・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781188/8b113526-78da-8f48-30fb-98102c276c72.png)

artifactsのuploadにてAPIを投げる際にエラーが発生して失敗してしまいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781188/67a3fe72-6f5f-c00c-f435-9e1c56650f34.png)

## 可能性
- ~~あくまで`junit`なので、xUnitのxmlであってもjUnitで実行したテストのXMLではないとみなされて読み込めない~~
⇒GitLabのサンプルではjUnit以外でもxUnitのフレームワークであればよさそうだったので違いそう
- ~~サイズの問題~~
⇒サイズが大きいとこのエラーが出るという記事があったが、7KBなので今回は違いそう
- ~~GitLabのバージョンの問題~~
⇒GitLabのバージョン、GitLab-runnerのバージョンともに要件を満たしていたため違いそう
- Windows上でrunner動かしているのがよくない（GitLabはLinux、runnerはWindowsという異なる環境）
- 使っているGitLabの環境がPaaSなので、一部のAPIの利用が防がれている

xUnitやjUnitを使ったことが無いため、そもそもやっていることがイチから間違っているかもしれません。
何か進展があったら追記しようと思います。

追記１：jUnitでなければいけない可能性とバージョンによる違いの可能性について調査
WebAPIのコール方法と使い分け

　日頃の業務でWeb APIを実行する、といったシーンに出くわすことがあると思います。（Web API自体の開発や他サービスとの連携etc..）
　Web APIの呼び出しには様々な方法がありますが、目的ややりたいことによって向き不向きがあります。
このページではそれぞれのツールの概要と向き不向きについて、著者の主観も交えて説明します。

# curl
一番原始的な方法？OSのcurlコマンドでAPIを送信します。

例）
```
curl --location 'https://XXXXX.com/api/htt/v1/login' \
--header 'x-api-key: token' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer token' \
--data '{
    "loginId":"hogehoge",
    "password":"hugahuga"
}'
```

## 向いてること
* 最近のOSには標準コマンドとして搭載されているため、インストール不要で使用することが出来ます。（OSによって若干コマンドの仕様が違ったりします）
* コマンドなので、PowerShellやLinuxコマンドと組み合わせることが容易にできます。実用例としては
    * レスポンスのjsonを解析してcsvに変換して出力する
    * 特定のパラメータを抜き出して一覧にする
    * EXCELなどと組み合わせて、定型的なcurl文を量産する
    etc..

## 向いていないこと
* コマンドをおぼえられないので、毎回調べる必要がある。

# Postman
言わずと知れたWeb APIのクライアントツール。
https://www.postman.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2871216/6fbf848d-452f-8617-e960-24385a2737d4.png)

## 向いていること
* UIが分かりやすく直感的。APIのインターフェース通りに画面に入力をしていけばAPIを投げられる。とりあえずAPI投げたいときにはこれ。
* 作ったリクエストをワークスペースで管理できる。API実行前後に処理を挟み込むこともでき、簡単な自動化などもできる。

## 向いていないこと
* 定型的なリクエストを大量に送ってデータを収集したいときなどには不向き。

# プログラムでやる
APIクライアントの機能は大体の言語に標準搭載されています。
JavaだとHttpClient、PythonだったらRequestなど、、

## 向いていること
* データの加工、大量リクエストなどなんでもござれ。

## 向いていないこと
* プログラミングが大変。

# まとめ
　普段カジュアルにAPIを実行する分にはPostmanを。
　定型業務のデータ収集で、大量のデータを扱ったりある程度自動化をしたい場合はcurlやプログラムが視野に入る感じでしょうか。
DockerでUbuntu20.04を構築してns-3.32をインストールするまで

## Dockerイメージの取得
pullコマンドを使って、Ubuntuイメージをダウンロードします。
```
docker pull ubuntu:20.04
```

```
docker image
```
上記のコマンドでイメージ一覧を確認できるので、20.04があることを確認します。

## コンテナに入る
コンテナを起動させるには次のコマンドを入力します。
```
docker run -it -d --name my-ubuntu ubuntu:20.04
```
docker psを使うことで起動中のコンテナが確認できるので、コンテナが起動できているか確かめます。
起動したコンテナに入るには次のコマンドを実行します。
```
docker exec -it my-ubuntu /bin/bash
```
## ns-3.32のインストール
```
apt update
```
```
apt install build-essential autoconf automake libxmu-dev python3-pygraphviz cvs mercurial bzr git cmake p7zip-full python3-matplotlib python-tk python3-dev qt5-qmake qt5-default gnuplot-x11 wireshark
```
```
cd home
wget https://www.nsnam.org/releases/ns-allinone-3.32.tar.bz2
```
```
tar jxvf ns-allinone-3.32.tar.bz2
```
### ns-3のビルド
```
cd ns-allinone-3.32/
./build.py --enable-examples --enable-tests
```
自分の環境では10分程度で終わりました。

### サンプルの実行
```
cd ns-3.32/
./waf --run hello-simulator
```
hello-simulatorと表示されれば、インストールは成功です。
## コンテナから出る

コンテナから抜けるときには、
```
exit
```
コンテナを停止するときは、
```
docker stop my-ubuntu
```
Ubuntu22.04にns-3.32をインストール


## 環境
* Ubuntu 22.04.2 LTS
* Windows10 Pro
## プリインストール
ns3をインストールする前に必要なモジュールをインストールしておきます。

```
!#/bin/bash

sudo apt install -y gcc g++ python python3 python3-dev
sudo apt install -y python3-setuptools git mercurial
sudo apt install -y qt5-default mercurial
sudo apt install -y gir1.2-goocanvas-2.0 python-gi python-gi-cairo python-pygraphviz python3-gi python3-gi-cairo python3-pygraphviz gir1.2-gtk-3.0 ipython ipython3  
sudo apt install -y openmpi-bin openmpi-common openmpi-doc libopenmpi-dev
sudo apt install -y uncrustify
sudo apt install -y gsl-bin libgsl-dev libgsl23 libgslcblas0
sudo apt install -y sqlite sqlite3 libsqlite3-dev
sudo apt install -y libxml2 libxml2-dev
sudo apt install -y cmake libc6-dev libc6-dev-i386 libclang-6.0-dev llvm-6.0-dev automake pip
python3 -m pip install --user cxxfilt
sudo apt install -y libgtk2.0-0 libgtk2.0-dev
sudo apt install -y vtun lxc
sudo apt install -y libboost-signals-dev libboost-filesystem-dev
sudo apt install -y doxygen graphviz imagemagick
sudo apt install -y texlive texlive-extra-utils texlive-latex-extra texlive-font-utils texlive-lang-portuguese dvipng latexmk
sudo apt install -y python3-sphinx dia 
```

## ns3のインストール
ホームディレクトリを汚したくなかったので、ワーキングディレクトリを作り、そこにインストールしました。
```
 cd
 mkdir workspace
 cd workspace
 git clone https://gitlab.com/nsnam/ns-3-allinone.git
 cd ns-3-allinone
 python download.py -n ns-3.30
```

## ns3のビルド
```
 cd ns-3.30
 ./waf configure --build-profile=debug --enable-examples --enable-tests
 ./waf build
```
自分の環境ではビルドは11分程度でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468021/d2ba15ae-5cba-fe14-39e4-4aa89c533d35.png)

## ns3のテスト
ns3に同封されているテストコードを実行して正常に動くか確認します。
```
./test.py
```
自分の環境では25分程度かかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468021/970a7071-c1fe-a8fd-d72e-d3c10cafafc5.png)

## シナリオファイルの実行
```
 ./waf --run hello-simulator
```
Hello Simulator と表示されればns3のインストールは成功です。

## つまずいた所
### エラー現象
```
Command 'python' not found, did you mean:
  command 'python3' from deb python3
  command 'python' from deb python-is-python3
```

### 解決方法
```
# sudo apt install python-is-python3
```

## 参考
https://qiita.com/dorapon2000/items/5c0c0a399aeee629be63
OpenWrt USB ドングル

# はじめに
::: note
### 初心者対応構成
- スクリプトでの自動設定
- UCIとLuCi及びWinSCPにて比較しながら作業がおススメ
:::

::: note
### [PowerShell](https://learn.microsoft.com/ja-jp/powershell/scripting/what-is-windows-powershell?view=powershell-7.4)で[SSHアクセス](https://openwrt.org/docs/guide-quick-start/sshadministration)

- [PowerShellの開始](https://learn.microsoft.com/ja-jp/powershell/scripting/windows-powershell/starting-windows-powershell?view=powershell-7.4) (キー入力)：`Win`+`x` > `a` > `はい`
※Windows7以降標準搭載

```sh
ssh root@192.168.1.1
```

<details><summary>ssh root@192.168.1.1のショートカット作成（デスクトップ）</summary>

```powershell:powershell
$DESKTOP = ([Environment]::GetFolderPath("Desktop") + "\192.168.1.1.lnk")
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$DESKTOP")
$Shortcut.TargetPath = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
$Shortcut.Arguments = '-windowstyle hidden -ExecutionPolicy RemoteSigned "Start-Process ssh root@192.168.1.1"'
$Shortcut.IconLocation = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe,0"
$Shortcut.WorkingDirectory = "."
$Shortcut.Save()

```

- `強制的に貼り付け`
- `yes`

---

</details>

<details><summary>SSHログイン出来ない場合:exclamation:</summary>

known_hostsクリア
- `C:\Users\yourusername\.ssh\known_hosts` ※Windows隠しファイル
```powershell:powershell
Clear-Content .ssh\known_hosts -Force

```
---
OpenSSHのインストール
※Windows 10 Fall Creators Update(1709)以降標準搭載
- 機能の確認
```powershell:powershell
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

```
- 機能のインストール
```powershell:powershell
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

```
---

</details>

:::

# [RNDIS](https://openwrt.org/docs/guide-user/network/wan/wwan/ethernetoverusb_rndis)
:::note note

### [FUJISOFT +F FS040U](https://fsi-plusf.jp/products/FS040U/index.html)

```bash
opkg update
opkg install kmod-usb-net-rndis usb-modeswitch
opkg install kmod-usb-ledtrig-usbport
opkg install luci-app-ledtrig-usbport

```
- ドングルをUSBポートに挿入
```bash
uci set network.wwan=interface
uci set network.wwan.proto='dhcp'
uci set network.wwan.device='usb0'
uci commit 
/etc/init.d/network restart

```
:::

# 覚書
::: note
### [luci-app-3ginfo](https://github.com/4IceG/luci-app-3ginfo)

### [luci-app-3ginfo-lite](https://github.com/4IceG/luci-app-3ginfo-lite)

### [luci-app-modemband](https://github.com/4IceG/luci-app-modemband)


### [パーソナルサーバー](https://github.com/lrdrdn/my-opkg-repo)

```bash
sed -i 's/option check_signature/# option check_signature/g' /etc/opkg.conf
echo "src/gz custom_generic https://raw.githubusercontent.com/lrdrdn/my-opkg-repo/main/generic" >> /etc/opkg/customfeeds.conf
echo "src/gz custom_arch https://raw.githubusercontent.com/lrdrdn/my-opkg-repo/main/$(grep "OPENWRT_ARCH" /etc/os-release | awk -F '"' '{print $2}')" >> /etc/opkg/customfeeds.conf

```
:::
【Xcode/swift】自作のLoggerクラスを使って簡単便利なトレースログを実装してみる。【ロギング】

# トレースログとは
トレースログとは、アプリで操作した際の情報をXcodeのコンソールに出力するログのことです。OSLogというログ用出力用の仕組みは標準で用意されているようなのですが、今回は**print**を用いて自作ログを準備したいと思います。

以下のように、該当の行数やclass名、関数名まで表示してくれるので、どの場所でエラーが発生しているのかがわかりやすいというメリットがあります。
    
    Trace: /Users/anonymous/AppProject/sampleProject/sampleProject/pokemonCardAR/ARView.swift makeUIView(context:) Line:24

さくっと導入したい方や、カスタマイズして使いたい方におすすめなので是非試してみてください！

# 準備
### 1.以下のようなLoggerクラスを作成
Loggerクラスを作成します。traceとinfoの二つを作成しましたが、例えばwarningなどログレベルに応じて別途作成しても良いと思います。

私の場合はあくまでも個人開発プロジェクトで使用するログなので、最低限traceさえ出来ればOKでした。

    import Foundation

    /// Loggerクラス
    class Logger {
        /// トレースログ
        static func trace(file: String = #file, line: Int = #line, function: String = #function) {
            let logMessage = "Trace: \(file) \(function) Line:\(line)"
            print(logMessage)
        }

        /// インフォログ
        static func info(_ message: String, file: String = #file, line: Int = #line, function: String = #function) {
            let logMessage = "Info : \(message)(\(file) \(function) Line:\(line))"
            print(logMessage)
        }
    }


## 2.Logger.trace()を呼び出す
必要な箇所でtrace()やinfo()を呼び出すだけです。
以下のようにすれば、Xcodeのコンソール上にログが出力されることを確認できるはずです。

    func makeUIViewController(context: UIViewControllerRepresentableContext<SafariView>) -> SFSafariViewController {
        Logger.trace()
        return SFSafariViewController(url: url)
    }

## 3. 出力されたログを確認
アプリを実行して該当の動作を行います。そのタイミングでコンソールに以下のような形式のログが出力されたら無事完了です。

    Trace: /Users/anonymous/AppProject/sampleProject/sampleProject/pokemonCardAR/ARView.swift makeUIView(context:) Line:24


### おまけ
最近アプリを通じてたくさんの方と知り合えて、日々が楽しく思えるようになりました。

コーディングが楽しい、アイディアを形にするのが嬉しいというのももちろんですが、生活がより豊かになるという側面が開発にはあると思います。色々なモノの見方、視点が変わって面白いです。

Qiitaの投稿、いかがでしたでしょうか？

評判良さそうであれば、今後も開発したアプリについてや開発技術の情報を発信したいと思っています。
皆さんのリアクションが命なので、ぜひコメント等してもらえると嬉しいです！


https://pont.co/u/taminari
AWS CLIでGitHub ActionsのIAMロールを作成しよう

# はじめに
AWS CLIを利用して、GitHub ActionsのOIDCプロバイダとIAMロールを構築する。

# スクリプト
1. OIDCプロバイダを作成する

    ```sh:
    # OIDC Provider 作成
    OIDC_NAME=token.actions.githubusercontent.com
    THUMBPRINT=6938fd4d98bab03faadb97b34396831e3780aea1

    aws iam create-open-id-connect-provider \
      --url https://${OIDC_NAME} \
      --client-id-list sts.amazonaws.com \
      --thumbprint-list ${THUMBPRINT}
    ```

1. IAMロールを作成する

    ```sh:
    # GitHub Actions Role 作成
    REPOGITORY_NAME=${リポジトリ名}
    ROLE_NAME=role-github-actions-infra

    OIDC_ARN=$(aws iam list-open-id-connect-providers \
        --query "OpenIDConnectProviderList[*].Arn" \
        --output text | grep ${OIDC_NAME}
    )

    ROLE_POLICY=$(echo -n '{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Federated": "'; echo -n "${OIDC_ARN}"; echo -n '"
                },
                "Action": "sts:AssumeRoleWithWebIdentity",
                "Condition": {
                    "StringEquals": {
                        "'; echo -n "${OIDC_NAME}"; echo -n ':aud": "sts.amazonaws.com"
                    },
                    "StringLike": {
                        "'; echo -n "${OIDC_NAME}"; echo -n ':sub": "repo:'; echo -n "${REPOGITORY_NAME}"; echo -n '*"
                    }
                }
            }
        ]
    }')

    aws iam create-role \
      --role-name ${ROLE_NAME} \
      --assume-role-policy-document "${ROLE_POLICY}"

    aws iam attach-role-policy \
      --role-name ${ROLE_NAME} \
      --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
    ```


# クリーンアップ
1.  ポリシーをロールからデタッチする

    ```sh
    ROLE_NAME=role-github-actions-infra

    aws iam detach-role-policy \
      --role-name ${ROLE_NAME} \
      --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
    ```

1. IAMロールを削除する

    ```sh:
    ROLE_NAME=role-github-actions-infra

    aws iam delete-role \
      --role-name ${ROLE_NAME}
    ```

1. OIDCプロバイダを削除する

    ```sh:
    OIDC_ARN=$(aws iam list-open-id-connect-providers \
        --query "OpenIDConnectProviderList[*].Arn" \
        --output text | grep ${OIDC_NAME}
    )

    aws iam delete-open-id-connect-provider \
      --open-id-connect-provider-arne ${OIDC_ARN}
    ```
[faster-whisper]ローカル環境でのリアルタイム文字起こしがいい感じに動作するようになった

## はじめに

ようやくローカル環境でのリアルタイム文字起こしがいい感じに動作するようになりましたのでまとめました。

情報漏洩のリスクを排除するために、サーバーへの音声送信を必要としない文字起こしを行います。
また、リアルタイムでの文字起こしが可能ですので、生配信の字幕作成や同時翻訳などの機能も実現できる可能性を秘めています。

### 注意事項

権利で守られている動画・音声を文字起こしを行い公開することは、権利の侵害に繋がる可能性がありますので十分にご注意ください。

2023年06月21日
2023年06月26日 更新
2023年06月29日 更新

## 処理概要

1. マイクから繰り返しオーディオストリームを取得
1. 音声区間検出(VAD)を行い音声と判断できたものを音声バッファに格納
1. 設定した閾値を超える無音区間までを一つの音声バッファとする
1. 音声バッファを文字起こしする

![architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553528/418c7830-9857-d76e-80cd-e21b1dfd713e.png)

### [faster-whisper](https://github.com/guillaumekln/faster-whisper)とは

> faster-whisper は、トランスフォーマーモデルの高速推論エンジンである CTranslate2 を使用した OpenAI の Whisper モデルの再実装です。
> この実装は、openai / whisper よりも最大 4 倍高速で、同じ精度で、より少ないメモリを使用します。CPU と GPU の両方で 8 ビット量子化することで、効率をさらに向上させることができます。

## 実行環境

- Windows11
- Core i7 12700KF
- GeForce RTX 3060 12GB
- VB-CABLE Virtual Audio Device
- Python 3.11.4
- CUDA 11.7
- cuDNN 8.5

## 文字起こし速度

GPU利用ではあるが、話す時間に対して1/3ぐらいの時間で文字起こしができている。
長文にならなければ1文約1秒前後ですので、処理が間に合わなくなるようなこともないと思われます。

![transcription_speed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553528/e0bcf52f-2ca9-2c45-2fe3-898573af6208.png)

[効果音ラボ様](https://soundeffect-lab.info/)の音声を利用しています。

## 誤変換

完璧ということは難しいですが、[サンプルアプリ](https://qiita.com/reriiasu/items/920227cf604dfb8b7949)から誤変換が大幅に減少しました。
Youtubeの動画等のBGMが流れるような場面であっても音声のみを文字起こしできるようになった。

### 改善要因

1. 音声バッファサイズが一定以下の場合をノイズとして文字起こしに利用しないようにした。
2. 音声のDatatypeをint16からfloat32に変更したことにより繊細な表現が可能となり、音声認識しやすくなった。

## リアルタイム文字起こしおすすめ設定

1. languageを固定する
2. beam_sizeを小さくする
3. best_ofを小さくする
4. temperatureは0にする

参考： [faster-whisperのパラメータを調べてみました](https://qiita.com/reriiasu/items/5ad8e1a7dbc425de7bb0)
パラメータの設定次第ではもっと誤変換を減らして速く変換できる可能性はありそうです。

## 追記関連

### 音声とテキスト連動(2023/06/26 追記)

文字起こし終了後に入力した音声と文字起こしテキストを連動させる機能を追加しました。
入力音声と突き合わせができるようになり、文字起こし結果が確認しやすくなりました。
また、一括で文字起こしすることにより文脈が繋がるようになったと思います。

### 音声ファイル対応(2023/06/29 追記)

先の音声とテキスト連動を利用する形でブラウザ側から音声ファイルを送信できるようにしました。
faster-whisper/Whisperで本来利用できる機能が使えない状態なのは良くないと思っていました。
後付け機能はどうしてもUI調整が難しかったりや処理が複雑化してしまう。

## Demo

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553528/533da307-213c-1553-1883-9d75193c4846.gif)


## ソースコード

下記にソースコードを置いています。(MIT)
https://github.com/reriiasu/speech-to-text

## 関連URL

- [faster-whisper](https://github.com/guillaumekln/faster-whisper)
- [Whisper](https://github.com/openai/whisper)
- [効果音ラボ](https://soundeffect-lab.info/)

## 関連記事
- [[ローカル環境] faster-whisper を利用してリアルタイム文字起こしに挑戦](https://qiita.com/reriiasu/items/920227cf604dfb8b7949)
- [[ローカル環境] faster-whisper を利用してリアルタイム文字起こしに挑戦2](https://qiita.com/reriiasu/items/36b992b9d74b700728af)
- [[Windows] 文字起こしにデスクトップ音を利用する試み](https://qiita.com/reriiasu/items/1b4cae7205458cf78ade)
- [faster-whisperのパラメータを調べてみました](https://qiita.com/reriiasu/items/5ad8e1a7dbc425de7bb0)
VSCode: エンコーディングの誤判定対策（ショートカットキー一発で開き直す。Karabiner-Elements利用）

# 問題

VSCodeでCP932 (Shift_JIS)のファイルを開くとWindows 1252などと誤判定されてしまうことがある。
コマンドパレットから `Change File Encoding` でエンコーディングを指定して開き直せるが、エンコーディングを選択するのが面倒だ。

# 対策

Karabiner-Elements（Mac用アプリ）を援用し、ショートカットキー一発でShift_JIS指定で開き直せるようにする。
Windowsの人もAutoHotkeyなどのキーボードマクロツールを使えば同じことができると思う。

# 設定手順

VSCodeで `Change File Encoding` にキーバインドを定義しておく。
ここでは `Cmd+g Cmd+e` にしたが、なんでも良い。

```json
  { "key": "cmd+g cmd+e", "command": "workbench.action.editor.changeEncoding", "when": "editorFocus" },
```

`~/.config/karabiner/karabiner.json` に下記のComplex Modificationを定義:

```json
{
  "description": "VSCode: Ctrl+Cmd+Shift+sでShift_JISで開き直す",
  "manipulators": [
    {
      "from": {
        "key_code": "s",
        "modifiers": {"mandatory": ["control", "command", "shift"]}
      },
      "to": [
          { "key_code": "g", "modifiers": ["command"], "hold_down_milliseconds": 100 },
          { "key_code": "e", "modifiers": ["command"], "hold_down_milliseconds": 100 },
          { "key_code": "return_or_enter", "hold_down_milliseconds": 100 },
          { "key_code": "s" },
          { "key_code": "h" },
          { "key_code": "i" },
          { "key_code": "f" },
          { "key_code": "t" },
          { "key_code": "return_or_enter" }
      ],
      "type": "basic"
    }
  ]
}
```

見ての通り、`Cmd+g Cmd+e` を押し、`Return`で`Reopen with Encoding`を選択、`shift`と入力して絞り込み、としている。

これで`Ctrl+Cmd+Shift+s`を押せばShift_JISで開き直されるようになった。

# 余談
この問題には多くの人が悩まされているようで、「vscode エンコーディング 誤判定」でググると色々出てくる。ソースファイルを書き換えるという方法もあるようだ。
[VSCodeの文字コード自動判定を改善する - 7cc@はてなブログ](https://7cc.hatenadiary.jp/entry/modify_vscode_autoguessencoding_)

VSCodeのソースを見ると`Change File Encoding`の実装は下記になっていて、これを真似てエンコーディング変更する拡張を作れないかと考えたが、`IEncodingSupport`を得る方法が分からなかった。APIが提供されていないということなのかもしれない。
https://github.com/microsoft/vscode/blob/1eabca550153e1502de582d1d6aa44ecc636f1c8/src/vs/workbench/browser/parts/editor/editorStatus.ts#L1437

そもそも自動判定の候補リストをユーザーが定義できるようにしておけば誤判定確率を下げられるはず。VSCode本体で改善してもらいたいところだ。
Google Chrome で低速度の通信環境での Web ページの挙動を確認する方法

Web アプリケーション開発を行っていると、「**不安定な低速度の通信環境**からアクセスした場合の Web ページの挙動」を確認したい場面に出くわすことがあるかと思います。

このために低速度の通信環境を用意するのはお金も手間もかかって大変だと思うのですが、Google Chrome の**デベロッパーツール**を使えば、簡単に低速度での通信環境をシミュレートすることができるので紹介したいと思います。

## Google Chrome のバージョン

本記事執筆の際に使用した Google Chrome のバージョンは次の通りです。

- 114.0.5735.134（Official Build） （64 ビット）

## シミュレート 方法

Google Chrome でシミュレートを行いたい Web ページにアクセスしてデベロッパーツールを開きます。
開いたら「**Network**」タブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759747/e1d28110-a8d6-7640-bab7-c51917137738.png)

Network タブをクリックしたら、「**No throttling**」という箇所をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759747/1a649dd5-f0cb-8ee9-8032-a798e47f3c12.png)

予め Presets がいくつか登録されているので、任意の通信環境を選択します。
今回は **Fast 3G** を選択してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759747/6077c8e0-a7ff-b4f8-00c8-ac405dfd1fb2.png)

選択後、**デベロッパーツールは開いたまま**にして Web ページをリロードすると、選択した通信環境で Web ページの挙動をシミュレートできます。
筆者は使用したことがありませんが、Custom で自分好みの Presets を作成することもできるようです。

## さいごに

Web アプリケーションで、外部 API を叩いて取得したデータを表示する際に "Now Loading..." などロード中だと分かるような表示（プログレス表示）を実装することがあるかと思いますが、
開発時は安定した高速度な環境で通信することが多く、あっという間に外部 API からデータが取得でき、プログレス表示が上手く実装できたかどうかが分かりづらい場合があるかと思います。

そういう場合には、今回の方法が役に立つのではないかと思います。
DatabricksでPlotlyを使う

[Plotly \| Databricks on AWS](https://docs.databricks.com/visualizations/plotly.html) [2023/1/31時点]の翻訳と追記です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

[Plotly](https://pypi.org/project/plotly/)は、インタラクティブなグラフのライブラリです。DatabricksではPlotly 2.0.7をサポートしています。Plotlyを使うには、[Plotly PyPIパッケージをインストール](https://docs.databricks.com/libraries/index.html)し、クラスターにアタッチします。

:::note
**注意**
Databricksノートブックでは、[Plotly Offline](https://plot.ly/python/offline/#)を使用することをお勧めします。大規模なデータセットを取り扱う際に、Plotly Offlineがうまく動作しないことがあります。パフォーマンス問題に気づいた際には、データセットのサイズを削減する必要があります。
:::

Plotlyのプロットを表示するには:

1. Plotlyの`plot()`関数の引数として`output_type='div'`を指定します。
1. `plot()`関数の出力をDatabricksの`displayHTML()`関数に渡します。

サンプルのノートブックをご覧ください。

# Plotly Pythonノートブック

https://docs.databricks.com/_extras/notebooks/source/plotly.html

```py
from plotly.offline import plot
from plotly.graph_objs import *
import numpy as np
 
x = np.random.randn(2000)
y = np.random.randn(2000)
 
# Instead of simply calling plot(...), store your plot as a variable and pass it to displayHTML().
# Make sure to specify output_type='div' as a keyword argument.
# (Note that if you call displayHTML() multiple times in the same cell, only the last will take effect.)
 
p = plot(
  [
    Histogram2dContour(x=x, y=y, contours=Contours(coloring='heatmap')),
    Scatter(x=x, y=y, mode='markers', marker=Marker(color='white', size=3, opacity=0.3))
  ],
  output_type='div'
)
 
displayHTML(p)
```
![Screenshot 2023-06-21 at 13.02.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/36c1061e-6cec-eaf8-b857-42c2d58290e3.png)

よりシンプルなサンプルはこちらです。

```py
from plotly.offline import plot

# x軸とy軸のデータ
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

# 散布図の作成
p = plot(
  [Scatter(x=x, y=y, mode='markers')], output_type='div'
)

displayHTML(p)
```
![Screenshot 2023-06-21 at 12.18.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/775ad456-ac1f-bf63-2a85-9b133ae9154d.png)


### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
デフォルトのテキストエディタをXCodeから変更する方法



普段VScodeを使っているのですが、ファイルを開くときにデフォルトでXcodeが立ち上がるようになっていたので困っていました。Xcode重いですし(私が悪いかもですが、、)。そこで、VScodeにテキストエディタを変更する設定方法を調べたので備忘録として投稿します。

1.Finderで任意の拡張子のファイルを選んで右クリック
2.「情報を見る」をクリック
3.「このアプリケーションで開く」でVScode(とか他のエディタ)を選択
4.そのすぐ下の「すべてを変更」にチェック

以上です。
【GitHub】コードのタブの幅を変更する方法

## URL

URLに`?ts=4`などを追記することでタブ幅を変更できます。  

デフォルトは`8`です。  

- デフォルトのタブ幅
  
![スクリーンショット 2022-11-25 21.56.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/d0cde3bc-70fb-e8f5-a99c-044fe4c6d8e3.png)


- URLに`?ts=2`を追加
![スクリーンショット 2022-11-25 21.56.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/800f4248-f912-da24-eb44-4e9d01e950cf.png)


## ユーザー設定

ユーザー設定からも変更できます。  

以下のページの「Tab size preference」を任意の数字に変更します。  

https://github.com/settings/appearance

![スクリーンショット 2022-11-25 22.02.05のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/fe712323-0c71-0ae8-9389-10e4bdd9e452.png)


## EditorConfig

EditorConfigを使用することでも変更できます。  
プロジェクトルートに`.editorconfig`を作成します。  

```.editorconfig
root = true

[*]
charset = utf-8
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2

[*.md]
trim_trailing_whitespace = false

[*.sh]
indent_style = tab

```

すると`*.sh`のタブ幅が`2`になります。  

ただし隠しファイルには反映されないようです。
HTML とCSSのまとめ(1)　R5／6／20

<h2>表示に関して気をつけること</h2>
・画面中央より３５px下に文字を表示させたい時は

```
top: calc(50% - 35px);
```
と記す。
半角で-を％と３５から離して表記しないと、反映されないから注意する。
<BR>

・　；をつけ忘れると、表示されない。

<h2>object-fitについて</h2>
object-fit: cover;は、CSSのプロパティであり、画像やビデオなどのインライン要素をコンテナにフィットさせる方法を指定します。

object-fitプロパティにcoverを指定すると、以下のような動作が行われます。
コンテナのサイズに合わせて、対象の要素（画像やビデオなど）が拡大・縮小されます。
アスペクト比は保持されますが、コンテナの範囲内に完全に収まるようにリサイズされます。
もし対象の要素がコンテナよりも小さい場合、元のサイズを保持したままで中央に配置されます。

```object-fit: contain; ```これは、対象の要素をコンテナ内に完全に収めるために拡大または縮小しますが、アスペクト比を保持します。要素がコンテナよりも小さい場合は、空白が発生します。

```object-fit: fill; ```これは、対象の要素をコンテナにピッタリとフィットさせますが、アスペクト比は保持されません。要素がコンテナよりも大きい場合は、切り取られます。

```object-fit: none;```これは、対象の要素をコンテナ内にそのまま表示します。要素のサイズやアスペクト比は変更されません。コンテナよりも大きい場合は、はみ出します。

```object-fit: scale-down; ```これは、containとnoneの中でより適切な方を選択します。要素がコンテナよりも小さい場合はcontainと同じように動作し、要素がコンテナよりも大きい場合はnoneと同じように動作します。