OmniAICreator/Qiita-1.07M huggingface dataset:
devise（デバイス）の使い方②テーブル作成、ビューファイル作成

前回の続きを投稿していきます！

○devise（デバイス）のテーブル作成
前回rails g devise userで作成されたマイグレーションファイルに
必要なカラム名を記述します。

     t.string :email,              null: false, default: ""
     t.string :encrypted_password, null: false, default: ""

上記の記述はemailとencrypted_passwordのカラムとなっておりこれは
勝手に作られているものなのでemailとencrypted_passwordが必要な場合は
これを使いましょう。

記述が終わったら

    rails db:migrate

と記述するとマイグレーションの実行が完了します。これでusersテーブルの完成です。

○ビューファイルの作成
次にdevise用のビューファイルを生成します。

    % rails g devise:views

と記述するとdevise（デバイス）に必要なビューファイルが完成します。

app/views/devise/sessions/new.html.erbにあるのが
ログイン画面

app/views/devise/registrations/new.html.erbにあるのが
新規登録画面

になるのでこの中にビューを記述すると使用できます。

以上がdevise（デバイス）の使い方でした。最初は難しく感じましたが慣れればとても
便利なgemですので是非活用してみてください！
ありがとう御座いました！！
pythonで現在実行中ファイルのパスを取得

## 前がき

pythonでファイルを扱うとき、一番強い且つ煩わしいものは、相対パスだと思います。相対パスを正しく使うには、「私は今、どこにいるの」ということを明確するのは重要です。

## 結論

pythonで、現在実行中ファイルのパスを取得には、`__file__`変数を参照します。`__file__`変数は、「どこで実行・誰から実行」を問わず、いつもファイル自身の絶対パスを返します。

この場合よく間違って使われるのは、`pathlib.Path('.')`です。「`.`」は「カレント・ディレクトリ」の意味で、その返り値はターミナルの作業デュレクトリによって変わります。

`os.path`系メソッドは僕はよくわかりませんが、時代遅れそうなので、`pathlib`を使った方がいいです。

## 使用例

### ファイル構成

```bash
pathpath/
├── main.py
└── pkg.py
```

```python3
# pkg.py
from pathlib import Path

def hoge():
    print('Path(.):', Path('.').resolve())
    print('__file__:', __file__)

if __name__ == '__main__':
    hoge()
```

```python3
# main.py
import pkg

pkg.hoge()
```

### 動作確認

フォルダ内で実行

```bash
$ pwd
/Users/tdzz/code/pathpath

$ python3 pkg.py 
Path(.): /Users/tdzz/code/pathpath
__file__: /Users/tdzz/code/pathpath/pkg.py

$ python3 main.py 
Path(.): /Users/tdzz/code/pathpath
__file__: /Users/tdzz/code/pathpath/pkg.py
```

フォルダ外で実行
```bash
$ pwd
/Users/tdzz/code

$ python3 pathpath/pkg.py 
Path(.): /Users/tdzz/code
__file__: /Users/tdzz/code/pathpath/pkg.py

$ python3 pathpath/main.py 
Path(.): /Users/tdzz/code
__file__: /Users/tdzz/code/pathpath/pkg.py
```

先に言った通り、`pkg.py`に置いた`__file__`変数は、フォルダ内でもフォルダ外でも、独自が実行されても`main.py`から呼び出されても、自分の絶対パスを返すことが分かりました。

## 参照リンク

https://note.nkmk.me/python-script-file-path/

https://qiita.com/tag1216/items/29bf3b9c3c4b563ff0fe
DBのテーブルをmigrationファイルで削除する方法

実務の中で、仕様が途中で変更になり開発環境で作成したDBのテーブルを削除する必要があり
その際の対応を学習のためにメモで残したものになります。

ローカル環境で、不要なテーブルを削除する場合は、以下のコマンドなどで削除することが出来る。

```php
php artisan migrate:refresh
```
しかし、このコマンドではデータが削除されてしまうため、
開発環境や本番環境にすでに上げてしまったテーブルには、使用することが出来ない。


その場合は、migrationファイルを新たに作成し、削除を行う必要がある。

以下の手順がその対応になります。

まず、以下のコマンドでmigrationファイルを作成します。

```php
php artisan make:migration drop_users_table
```

ファイル名は任意の名前で問題ありません。
(他の人が何のファイルか理解できる、またはプロジェクトの命名規則に従う)

```php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        /**
         * ここにテーブルの削除処理を記述
         * drop でも削除できるが、 dropIfExistsを使用した方が良い
         * 理由は、dropIfExistsであれば、テーブルが存在する場合に実行されるので、
         * 環境によってテーブルの有無でエラーを引き起こす可能性がなくなるため
         */
        Schema::dropIfExists('users');
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        /**
         * 処理が上手くいかない場合に備えて必ず記述する必要がある
         * ここには、テーブルの作成時と同じ処理を記述する
         */
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }
}

```

あとは、このmigrationファイルを実行することで、
開発環境や本番環境のテーブルを削除できます。
Spresense用3軸加速度センサーLIS2DW12がライブラリでも動きました

少し前に
[LIS2DW12を使ったSpresense用3軸加速度センサーボードを作ってみた](https://qiita.com/kaz19610303/items/77b1ce32859e947da137)
という記事を書きました。
この時に**Arduino用のライブラリ**が無いか調べて
[arraym/LIS2DW12-Arduino-Lib](https://github.com/arraym/LIS2DW12-Arduino-Lib)
を見つけたのですが、残念ながら**Spresense**で動きませんでした。
それでライブラリ化されていないプログラムを使ってテストをして、記事を書きましたが、
Spresense関係のプログラムをGitHubで公開されているTomonobuHayakawaさんが**LIS2DW12-Arduino-Lib**のバグを修正してSpreseneでも使えるようにしてくださいました。
こちらで公開されています。
[TomonobuHayakawa/LIS2DW12-Arduino-Lib](https://github.com/TomonobuHayakawa/LIS2DW12-Arduino-Lib)

**Arduino IDE**へのライブラリ追加は **zip形式のライブラリ**として追加します。
examplesの中の SimpleRead を動かしてみました。

![LIS2DW12_prg.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/7a7c6f48-cd0a-877e-79ae-ea7d08799bba.png)

どこも変更せずにコンパイルと書き込みができました。

コチラがターミナルへの表示です。
![LIS2DW12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/d5435f28-9cd4-4d8e-3bab-5eebf17580ff.png)

あっさりと動かすことが出来ました。
TomonobuHayakawaさん、ありがとうございました。
[今日のトリビア]Microsoft Power Automateの文字列型変数の改行コードはvbCrLFではない


# Power Automateの正体はVBS
しかも難読化されている。
# さらにノーコードでもローコードでもない
解説にSQLとか
https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/how-to/sql-queries-microsoft-access

> デスクトップ用 Power Automate は 64 ビットのアプリケーションであり、64 ビットでインストールされたドライバーのみを SQL 接続を開く アクションで選択できます。

こんな解説とか。

https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/how-to/autofit-excel-columns-vbscript

確かにSQLやVBS、Powershellは低級ですらないゴミ。ええ確かにノーコード。詐欺だとは思いますが。
どおりで使う人がいないはずである。

しかし、簡単なものなら実現するだろう。
だがそんな甘い予感はあっさり打ち砕かれた。

# 改行コード
## 現象
 1. Webフォームに入力するというRPA
 2. 記入内容をメモ帳で作成
 3. Wordだと<b>を特殊記号の`^p`で置換されたもの。置換の枠はエスケープを使い`\<b\>`
 4. できあがったものをPower Automateの`変数の設定`に張り付ける
 4. これが流し込まれると改行が2行以上になってしまう。

## 対策
String変数に改行を含むテキストを設定したら
テキストを置換を起動
次のように設定する。
文字を設定した変数`%strbody%`として、
 - 検索するテキスト<b>`\r\n`</b>(MPA上でもバックスラッシュで表示）
 - 検索と置換に正規表現を使う ON
 - 大文字と小文字を区別しない ON
 - 置き換え後のテキスト `\r`
 - エスケープシーケンスをアクティブ化　ON

このようにしないと、改行が設定した以上に増えてしまう。。
もちろん、Webフォームにもよるだろう。OutlookならHTMLの`<b>`が有効な場合もあるという。

面白いのは、当該webフォームではメモ帳にテキストを入力し、それをそのままコピーすると、そのままコピーされ、改行は増えない。つまり、改行コードは`vbCrLf`から自動的に`vbCr`に変更されていることになる。ただ、変更されないからと言ってMicrosoft Power Automateで稼働させた場合でも同じになるというわけではない。変数で設定できない場合は、タグ`<b>`を使った場合など、自分でReplaceで変換しなければならない。特にWebフォームの場合、文字コードの設定で変わるのだと思われる。

[Power Automate 改行の指定方法 | 誰でもできる業務改善講座](https://blog-tips.sekenkodqx.jp/2020/07/02/power-automate-new-line/)
さらに改行を一つだけ設定する方法はエラーになったことから、Power AutomateもvbCrLfではないのかもしれない。
[Power Automate で 複数行テキストを操作する](https://qiita.com/h-nagao/items/af18eb357bc7c8bec3a2)

これはMicrosoft Power Automateが様々なOSで稼働することを想定して基本的に改行を設定していないと思われる。
そして出力先の改行コードはvbCrLf vbCr vbLfがあることからReplaceが必要だということになる。

# これはコードじゃないのか？
正規表現というのはコードではないのか。
そしてReplace、Replacedは関数。関数はコードではないのか。
改行は見えないのに、`\r\n`や`0x0D0A`と記す必要があるのはコードとは言わないのか。
もしかするとVBA Powershell VBScipt Regular Expressionは簡単すぎてコードではないということなのだろう。
mlbrの使用に際して注意すべきこと

#  事の顛末

久しぶりにMLBのデータ分析をしようと思いまして、Baseballrを開こうと思ったのですが、以前作ったデータをまとめてダウンロードする用のスクリプトをなくしてしまいまして、また書くのも面倒だなと思っていました。

ついでにいろいろ調べていると改良版のmlbrというのが出ていると。

https://billpetti.github.io/baseballr/

https://github.com/pontsuyu/mlbr

　そこでものは試しと使ってみようとしたのですが、エラーを吐いてインストールが止まってしまったため5分ほどドタバタしていました。RでMLBのデータ分析をしてみようと思い立つ方にはプログラミング初心者もおられますし、もしかしたらそう言った方の助けになることをほんの少しだけ期待します。

#  今回のエラー内容

###
### 


```　　:エラー詳細
> devtools::install_github("pontsuyu/mlbr")
Downloading GitHub repo pontsuyu/mlbr@HEAD

　(中略)

Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]) : 
  there is no package called ‘highcharter’
Calls: <Anonymous> ... loadNamespace -> withRestarts -> withOneRestart -> doWithOneRestart
Execution halted
ERROR: lazy loading failed for package ‘mlbr’
* removing ‘/Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/library/mlbr’
Warning message:
In i.p(...) :
  installation of package ‘/var/folders/4g/0578s8d927b547r_8vqry51r0000gn/T//RtmpQYeyAA/file20402b90f1ae/mlbr_0.1.0.tar.gz’ had non-zero exit status
```

上から順に見ていくと、

~~~
Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]) : 
  there is no package called ‘highcharter’
~~~

という記述があります。これは __「highcharter」というパッケージがないぞ__、ということのようです。

したがって、言うことを聞いてあげて

```R:
 install.packages("highcharter")
```
としてあげればOK。このあとも似たようなエラーが続くかもしれませんが、言う通りにパッケージをインストールしていくことで解決します。


#   その他mlbr/baseballrを初心者がつまずきそうなこと

これについてはすでに他の方が書かれていると思いますので、簡単に触れるのみとします。

###  Rtoolsをインストールしてあるか

baseballrやmlbrを使用する際にはRtools（Windowsの場合）のダウンロードが求められることがあります。
これについては以下からバージョンの合うものをダウンロードすればOK。

https://cran.r-project.org/bin/windows/Rtools/


###  devtoolsをインストールしてあるか

baseballr や mlbrといった、Github上に公開されたパッケージをインストールする時に必要なのが「Devtools」というパッケージです。こちらがない場合にはそもそもパッケージのインストールができませんので、先にインストールしておく必要があります。

~~~R:
install.packages("devtools")
~~~


以上です。何か気がついたらまた更新します。
firestoreで特定のドキュメントを1つだけ取り出す

firestoreのコレクションから特定のドキュメントを取り出すことに取り組んだが、少々手こずったのでメモする。

こちらのYouTubeが非常にわかりやすかったのでこちらを参考にするといい。
少々古いのでコードの書き方が異なる部分がある。それは、公式のドキュメントやこのブログを参考にして欲しい。

https://www.youtube.com/watch?v=lCeTnsVW6Vo&t=596

手こずった原因としてはドキュメントに書かれていたコードの中の非同期処理のための記述"await"の記述を無視してしまったためである。

コレクションごとデータを取得するやり方はYouTubeの動画を参考にしたためawaitを無視してpromiseを使用したため非同期処理は必要ないものだと思っていたためである。

awaitを無視してdocumentのマネをすると当然ながら動かない。なのでpromiseの方で実装した。

then()の書き方を調べているとこれがpromiseという方法だということに気づいた。


```
import { doc, getDoc } from "firebase/firestore";

const docRef = doc(db, "cities", "SF");
const docSnap = await getDoc(docRef);

if (docSnap.exists()) {
  console.log("Document data:", docSnap.data());
} else {
  // doc.data() will be undefined in this case
  console.log("No such document!");
}
```

```
  const handleClickFetchButton = () => {
    const docRef = doc(db, "posts", "Bq1D0EFoFTNBtcYg1sTm");
    getDoc(docRef).then((doc) => {
      console.log('Document data:', doc.data());
    });

```

すなわち、上2つは同じことを示している。

ということで参考したサイトは

Firestoreの公式ドキュメントサイト

https://firebase.google.com/docs/firestore/query-data/get-data?hl=ja

Promiseとasync.awaitを解説した以下のサイトである。

https://qiita.com/sotszk/items/f23199e864cba47455ce

また、非同期処理で手こずったらこれらを参考にすること！

そして、async/awaitを用いてデータの取得をする場合、以下のようなコードになる

```
 const handleClickFetchButton = async () => {
    const docRef = doc(db, "posts", "G3FgjxEUvGySsLHDjuRu");
    const docSnap = await getDoc(docRef);
    
    if (docSnap.exists()) {
        console.log(docSnap.data());
    }else{
      console.log("No such document!");
    };
  };
```

結局、取得したデータを処理するためには非同期処理を学ぶ必要があった。
それの練習としてPromiseからasync/awaitに書き換えた。

ということでこれから非同期処理についてまとめてAPIなどで取得したデータの処理方法を書いた記事を書く。
python maya remove all except joints

```python
import maya.cmds as cmds

# Get a list of all objects in the scene
all_objs = cmds.ls()

# Create an empty list to store non-joint objects
non_joints = []

# Check each object and append it to the non_joints list if it is not a joint
for obj in all_objs:
    if cmds.nodeType(obj) != 'joint':
        non_joints.append(obj)

# Delete all objects in the non_joints list
cmds.delete(non_joints)
```
もう面倒なWebhook URL更新は不要！「linegrok」でngrokでのLINE Bot開発を超快適に！

:::note info
* 2024/5/11 ngrok仕様変更に伴うlinegrok v2へのバージョンアップにより内容更新しました
:::

# ngrokって便利ですよね

LINE Bot開発ではローカル実行したBotサーバーへパブリックにアクセスする手段としてngrokがとても便利ですよね😊
ただngrokって毎回ランダムなサブドメインのURLが発行されるので、起動のたびにLINE DevelopersコンソールからWebhook URLを変更しなきゃいけないのがなかなかつらいとこだと思います。

さらに、先日LINE DCハッカソンに参加した際に久しぶりにngrok使ったのですが、前は8時間ぐらいURLが有効だったはずが2時間で無効になるようになっていました。
ただでさえ大忙しなハッカソン中に何度もWebhook URLを更新しなければならず、つらみの極みでした😢

このつらみを解決するべく「linegrok」というライブラリを作ってみました。



# linegrok

[**miso-develop/linegrok (GitHub)**](https://github.com/miso-develop/linegrok)

どんなものかというとngrokの起動およびURL取得と、LINE DevelopersコンソールへのWebhook URL更新を同時に行う関数を提供するライブラリです。

~~さらにngrokを認証していない場合は2時間でURLが無効となりますが、1時間半おきにngrok URLの再発行とWebhook URLの更新を自動で行い続けてくれます。~~
→ ngrokの仕様変更によりngrok未認証では使えなくなったようなので上記取り消し線の機能は無効化しました

**Botのコードで`linegrok`関数を実行しておくだけで、Webhook URLに関することをまったく意識せずBot開発を行うことができます🤩**



# 使い方

## インストール

```sh
$ npm install linegrok
```



## `linegrok`関数

LINE BotのClientと、portを引数にわたして実行します。
あとは自動的にngrokプロセスが立ち上がり、発行されたngrok URLをClientに紐づくチャネルのWebhook URLに設定します。

```js
const { linegrok } = require("linegrok")

const channelAccessToken = process.env.CHANNEL_ACCESS_TOKEN
const port = process.env.PORT

// LINE BotのchannelAccessTokenとportを引数にわたして実行
linegrok({ channelAccessToken, port })

...

```

## オプション

`channelAccessToken`、`port`が必須となります。
それ以外にもいくつか任意オプションがあります。

|オプション|必須|既定値|内容|
|:--|:-:|:-:|:--|
|channelAccessToken|✔|-|LINE BotのChannel Access Tokenを指定します。<br>このChannel Access Tokenに紐づくチャネルのWebhook URLが自動更新されます。|
|port|✔|-|Botサーバーのポート番号を指定します。|
|path||"/"|Webhook URLのpathを指定します。|
|authtoken||undefined|ngrokのAuth Tokenを指定します。|
|region||"ja"|ngrokのリージョンを指定します。|



# 使用例

例としてオウム返しBotのコードは以下のようになります。
環境変数にて`CHANNEL_ACCESS_TOKEN`、`CHANNEL_SECRET`を設定して実行してみてください。

```js
const express = require("express")
const { messagingApi, middleware } = require("@line/bot-sdk")
const { linegrok } = require("linegrok")

const channelAccessToken = process.env.CHANNEL_ACCESS_TOKEN
const channelSecret = process.env.CHANNEL_SECRET
const port = process.env.PORT

linegrok({ channelAccessToken, port })

const client = new messagingApi.MessagingApiClient({ channelAccessToken })



const app = express()
app.post("/", middleware({ channelSecret }), (req, res) => {
    handleEvents(req.body.events)
    res.send({ status: 200 })
})
app.listen(port, () => console.log(`Start server!`))



const handleEvents = events => {
    events.forEach(event => {
        switch (event.type) {
            case "message": client.replyMessage({
                replyToken: event.replyToken,
                messages: [{
                    type: "text",
                    text: event.message.text,
                }]
            }); break
        }
    })
}
```
SymPyことはじめ

# SymPyの概要
変数を代数的に処理できる(数値計算ではない)pythonにおけるライブラリ  
[SymPy](https://www.sympy.org/en/index.html)

例えば与えた文字式を展開したり、因数分解したり、微分、積分を行うことができる。

# インストール
書きかけ(多分`pip`等で出来る。google colaboratoryだとデフォルトで入っている。)

# インポート
```python
import sympy
```
# よく使う関数

```python
eps = sympy.Symbol('ε') #文字 ε をコード上での変数epsに代入
display(x) #人間が書く式風に表示
```

# 例

## 例1 方程式を解く
変数`eq`を`x`について解く

```python
x = sympy.Symbol('x')
y = sympy.Symbol('y')

eq = x + y**2 - 4
print(sympy.solve(eq, x))
```

## 例2 複素数

```python
sympy.var('z', complex=True)
display(z)
display(sympy.expand_complex(z))
display(sympy.conjugate(z))
display(sympy.expand_complex(sympy.conjugate(z)))
```

複素数にするときは`var`の引数で`complex=True`にする。

## 例3 二次方程式

```python
sympy.var('a')
sympy.var('b')
sympy.var('c')
display(a)
display(b)
display(c)
eq = a*x**2 - 2*b*x + c
display(sympy.solve(eq, x))
sol_list = sympy.solve(eq, x)
for sol in sol_list:
    display(sol)
```

`sympy.solve`は複数解があるときはlistで解を帰り値にする。その帰り値を`display`の引数に入れても適切には表示されない。解の要素を取得して`display`の引数に入れれば、数式で表示される。

## 例4 積分

```python
import sympy
a = sympy.Symbol('a', real=True)
b = sympy.Symbol('b', real=True)
x = sympy.Symbol('x', real=True)
display(a, b, x)
display(sympy.integrate(sympy.exp(-(a+b*sympy.I)*x),x))
display(sympy.integrate(sympy.exp(-a*x**2),(x, -sympy.oo, sympy.oo)))
display(sympy.integrate(sympy.exp(-(a+sympy.I*b)*x**2),(x, -sympy.oo, sympy.oo)))
```

## 例5 式を整理する
`sympy.simplify`を使うと、ある程度式を整理した形にしてくれる。

```python
import sympy
a = sympy.Symbol('a', real=True)
b = sympy.Symbol('b', real=True)
x = sympy.Symbol('x', real=True)
display(sympy.integrate(x * sympy.besselj(2,b*x) * sympy.exp(-a*x**2),(x, 0, sympy.oo)))
display(sympy.simplify(sympy.integrate(x * sympy.besselj(2,b*x) * sympy.exp(-a*x**2),(x, 0, sympy.oo))))
```

`simplify`以外に、`separatevars`、`collect`、`ratsimp`、`radsimp`、`rad_rationalize`があるらしい。

Ref: [【SymPy】simplifyで数式を簡略化する](https://python.atelierkobato.com/simplify/)
【Unity】NReal Light (Dev Kit) で録画しようと、アプリが落ちる

# はじめに
こんにちは、ユーゴです。今回は、UnityでNRealを開発しているときに直面した問題を紹介します。
取り扱う内容は入門レベルです。

# 環境
・Unity 2021.3.4f1
・URP
・Nreal Light
・Dev Kit (Androidバージョン8.1.0)

~~誰だUnity2021かつURPなんてチャレンジングなことした人は~~

# 問題
録画開始ボタン(赤い丸)を押す → ボタンが緑になる → ボタンをもう一度押す → アプリが落ちる
![スクリーンショット 2023-03-09 18.13.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/ca2b198b-72b5-92a5-e74b-6e00b00377a2.png)

# 原因
外部のフォルダに動画ファイルを書き込もうとしている。

# 解決
以下の文言に見覚えがあるのではないでしょうか。

```cs:VideoCapture2LocalExample
public string VideoSavePath
{
    get
    {
        string timeStamp = Time.time.ToString().Replace(".", "").Replace(":", "");
        string filename = string.Format("Nreal_Record_{0}.mp4", timeStamp);
        return Path.Combine("/sdcard/Movies", filename);
    }
}
```

これを書くまでは合ってます。ただ、適切なフォルダのアクセス権限が指定されていません。
「Player Settings > Player > Other Settings > Write Permission」を「External (SDCard)」に設定します。(Other Settingsの真ん中より少し下くらい)
![スクリーンショット 2023-03-09 18.18.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/b4580304-503a-5a88-3d64-d9a5d11db513.png)

# 関連
[【Unity】NRealで録画しようとすると「Permission Deny」と出る](https://qiita.com/mu5dvlp/items/c7a771a8ad5337fce79b)


# まとめ
NRealは価格・重量感・開発難易度的にとても素晴らしいARグラスですが、開発記事が少ないです。やはりHololensなどに注目を取られてしまい、NRealの開発者は少ないように思われます。しかし、2023/03/09現在の情報から、もう数年でAppleやMetaのARグラスが出そうな雰囲気を醸し出しています。HololensやMagicLeapも決して悪いわけではありませんが、ARグラスがたくさん登場して既存のブランドを崩し、NRealなど廉価版ARグラスが日の目を見て、普及することを願っています。
いかがだったでしょうか。ということで今回は、NRealで録画するときにアプリが落ちる問題と解決策を紹介しました。このように、少しニッチで初歩的な内容から、Unityの上級者向け記事も書いていきます。
お役に立てましたら、いいね・LGTM・フォロー等よろしくお願いします！
【Nuxt3】APIコール時にエラーとなった事例と対応策

# はじめに
Nuxt3で新規開発をしていた際、ローカル環境では問題ないが、STG環境でのAPIコール時にエラーとなる問題が発生しました。備忘録として対応内容を残しておきます。
# エラーの内容
開発者ツールで通信周りを確認したところ、以下のようなリクエストで403エラーが発生していることがわかりました。
`http://host名/api/create`
本番環境・STG環境では、特定のパス（例として/hoge）配下のみアクセスを許可しており、上記のようなリクエストの場合、アクセスが拒否されます。
# 対策
コールされるAPIが`http://host名/hoge/api/create`のように、アクセス許可されているパスである必要があるため、`nuxt.config.ts`を見直し、以下のように`baseURL`を指定することで解決することができました。
```JavaScript
export default defineNuxtConfig({
  app: {
    baseURL: '/hoge/', // baseURLを指定
    buildAssetsDir: '/_nuxt/', // 生成物は/hoge/_nuxt/に配置される
  },
})
```
※ baseURLを追加すると、画面や画像ファイルなど、全体のディレクトリ構成も変更が必要なので注意してください。
eccube-4.2.1 を symfony/cli でインストール (sqlite3)

こちらを参考にしました。
[【2020年度版】EC-CUBE の開発環境の作り方](https://qiita.com/nanasess/items/de9f5450717cc8ede51a)

Arch Linux を使いました。
データベースは、sqlite3 です。

## 準備

symfony/cli　のインストール

```bash
yay symfony-cli
```

バージョンの確認

```text
$ symfony -V
Symfony CLI version 5.5.1 (c) 2021-2023 Fabien Potencier #StandWithUkraine Support Ukraine (2023-03-09T08:48:16Z - stable)
```

sqlite3 のドライバーのインストール

```bash
sudo pacman -S php-sqlite
```

/etc/php/php.ini の設定

```text:/etc/php/php.ini
（省略）
extension=intl
（省略）
extension=pdo_sqlite
（省略）
```

## ソースコードのダウンロード

```bash
git clone https://github.com/EC-CUBE/ec-cube.git
```

## インストール

```bash
cd ec-cube
symfony composer install
```

```bash
symfony console eccube:install -n
```

## サーバーの起動

```bash
symfony server:start --daemon
```

## フロント画面
http://localhost:8000/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/061846ec-90eb-0ada-b19e-3cf5709b6e08.png)

## 管理画面
http://localhost:8000/admin/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/32f94151-b047-c40a-39c1-8f03fc576442.png)

ユーザー　admin
パスワード　password
でログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/be38d96e-1e23-44a5-d302-4f371ddfb8a3.png)

システム情報

```text
EC-CUBE 4.2.1

サーバーOS Linux shimizu 6.2.2-arch1-1 #1 SMP PREEMPT_DYNAMIC Fri, 03 Mar 2023 15:58:31 +0000 x86_64

DBサーバー SQLite version 3.41.0

WEBサーバー Symfony Local Server 5.5.1

PHP 8.2.3 (Core, date, libxml, openssl, pcre, zlib, ctype, dom, fileinfo, filter, hash, json, mbstring, pcntl, SPL, session, PDO, standard, posix, random, readline, Reflection, Phar, SimpleXML, tokenizer, xml, xmlreader, xmlwriter, mysqlnd, cgi-fcgi, mysqli, curl, intl, pdo_mysql, pdo_pgsql, pdo_sqlite, pgsql, sqlite3, zip)
```
github.io に reactアプリを好きなrepository名でデプロイ

# 概要
* [公式ドキュメント](https://docs.github.com/ja/pages/getting-started-with-github-pages/creating-a-github-pages-site)をみたが名前を固定にしないといけない感じだったので。
* あと、毎回ググってるので備忘録

# 1. githubでリポジトリ作成
* 好きな名前でリポジトリ名を作成
* readmeを自動で作る設定を押す
* publicで作るか有料版で作らないとgithubPagesは使えないので注意

# 2. localでcreate-react-app
* `$ git clone リポジトリのURL`
* `$ create-react-app リポジトリ名と同じapp名`
* `$ cd app名`
* `$ mv -f ./* ../`
* `$ mv .gitignore ../`
    * 階層が一つネストされてしまうので、中のファイルを全部うつす
    * `$ ls -a` をして残っているファイルがないか確認
    * 大体 `.gitignore` などの隠しファイル系が残っているので、それも上に移動
* `$ cd ../`
* `$ rm -rf app名`

# 3. gh-pagesを入れる
* `$ npm install --save-dev gh-pages`

# 4. package.jsonを編集
```json
{
  "homepage": "https://<組織 or ユーザ名>.github.io/<リポジトリ名>/",
  // 省略
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "predeploy": "npm run build",
    "deploy": "gh-pages -d build"
  },
  // 省略
}
```

# 5. 画像がpublicにあるとgithubPagesでは読んでくれないので移動
* `$ cd ./src`
* `$ mkdir images`
* `$ mv ../public/* images/`
* `$ mv ./images/index.html ../public/`
    * この時、index.htmlだけはpublicに残しておく

# 6. App.js側ではimgをimportして使う
```jsx
import hogeImg from './images/hoge.jpg'

function App() {
  return (
    <div>
        <img src={hogeImg} alt="hogeの画像" />
    </div>
  )
}
```

# 7. デプロイ
* `$ npm run deploy`

# 8. github側でpagesの設定
* `https://github.com/<組織名 or ユーザ名>/<リポジトリ名>/settings/pages`
* ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153964/11f49292-e8da-9f60-20d4-004dea79e875.png)
* gh-pagesのrootを指定

# 9. アクションで確認
* `https://github.com/<組織名 or ユーザ名>/<リポジトリ名>/actions`
* buildが走っていて緑になっていればok

# 10. github.ioで確認
* `https://<組織名 or ユーザ名>.github.io/<リポジトリ名>/`
Spring-BootでjOOQを使ってDB操作する際にトランザクション制御がうまくいかない場合

# 構成
- Spring-Boot 3.0.x
- Spring-JDBC (not Spring Data JDBC)
- jOOQ
- HikariCP

# 結論
jOOQのConfigurationオブジェクトの設定において、DataSourceをTransactionAwareDataSourceProxyでラップする。
```
var config = new DefaultConfiguration();
config.setDataSource( new TransactionAwareDataSourceProxy(dataSource) );
```

# 事例
@Transactionalアノテーションによるトランザクション制御をやりたい。
ログではinsert文が発行されているが、その後にDBに反映されていない。
publicメソッドに@Transactionalを設定、サービス起動時にそのアノテーションに関する処理が走ってることを確認。

HikariCP側ではAutoCommit=falseを設定。

結論の記述を行うことで解決。
ConfigurationにはConnectionProviderやら何やら他のDataSource設定方法もあるので、そちらを使う場合はそっちでDataSourceをラップしてやればいい。

# 雑記
[TransactionAwareDataSourceProxy](https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy.html)の説明を見ると分かるが、jOOQ以外でも他のフレームワーク入れた際にトランザクションがうまく機能しない時にとりあえず試すのがよさそう。参考に先人の記事も追加。

jOOQのトランザクション制御とSpringのトランザクション制御を混ぜるのはNGらしい。
かつSpring配下でjOOQのトランザクション制御を使うのも微妙っぽい。SpringTransactionProviderというのがそれを扱うものだが、githubのissueでいろいろ議論されていていまだにcloseされていないので、やりたい場合は最新の状況の確認が必要。

jOOQを使う時にはTransactionManagerでrollbackOnCommitFailure=falseにしたほうがいいらしい。（トランザクション内での例外が全てSQLExceptionなら不要かも。そうでない場合は例外時でもCommitされる）

# 参考
[Craftsmen - jOOQ and Spring Transactions, without blockage](https://craftsmen.nl/jooq-and-spring-transactions-without-blockage/)
[3rdパーティ製のDBアクセスライブラリをSpringのトランザクション管理下に参加させる方法](https://qiita.com/kazuki43zoo/items/d9182c8ddb2b754f150f)
Azure Reposの今昔

# Azure Reposとは
Azure Reposはマイクロソフトが提供するAzure DevOpsのサービスの1つです。
ソースコード管理の機能があり、具体的にはGit等のサーバーとして利用できます。
"等"というのは、あまり知られていないような気がしますがGit以外のソース管理としてTFVC(Team Foundation Version Control)もサポートしているからです。
(私も使ったことがないのでよくわかりません)
  
会社でAzure DevOpsを利用したチーム開発を始めたのですが、あまり意識せずに実は個人的にも前から利用していたので、歴史を少し調べてみました。

# Visual Studio Online
私がAzure DevOpsの前身となるこのサービスを使い始めたのは、2015年でした。
個人的にフリーソフト/シェアウェアの開発をしていて、バージョン管理にSubversionからGitへの移行を考えていました。
当時最も有名なサービスにはGitHubがありましたが、私の開発していたソフトウェアはオープンソースではなかったため
非公開とする必要があり、GitHubでは公開しない場合は有料プランを利用しなければなりませんでした。
当然フリーソフトなので収益がある訳ではなく、GitHubの利用は見送りました。

一方でマイクロソフトではVisual Studio Onlineというサービスを提供していました。
ややこしいですが同名のサービスにVisual Studio CodeをWeb上で利用できるというサービス(後にVisual Studio Codespaces→[GitHub Codespaces](https://docs.github.com/ja/codespaces)に変更)がありましたが、それとは別のものです。

マイクロソフトの製品としては
- **Team Foundation Services**
- **Visual Studio Online**
- **Visual Studio Team Services**
- **Azure DevOps Services**

と変遷しており、クラウド版のServicesの他にオンプレミス向けサーバー製品のServerが用意されています。

私はVisual Studio Onlineの頃に利用を開始しましたが、\*\*\*\*\*.visualstudio.comというドメイン名でサービスが提供されました。
Azure Reposに変わった今でも無料で使っています。

又、無償で利用できるパッケージとしてVisual Studio Dev Essentialsと呼ばれており、
Visual Studio CommunityやVisual Studio Team Servicesはその中に含まれていました。
2000年代初め頃からVisual Studio Expressが登場していましたが、
この頃からマイクロソフトの無償サービスも充実してきた印象があります。

私個人としてはGitの環境が利用できればよかったので(VS Onlineは5人までは無料)、たいへん満足していました。
(DevOpsのサービスなので、ソースコード管理以外の機能もある程度無料で使えます)

ReposはVisual Studio Online当時は"CODE"が相当するようです。
@<wbr>ITにちょっと懐かしい記事が残っていました。

https://atmarkit.itmedia.co.jp/ait/articles/1504/17/news023.html

# GitHub
2018年6月、マイクロソフトがGitHubを買収しました。
その後2020年4月、GitHubの無料プランでもプライベートリポジトリの利用ができるようになりました。
インパクトのあるニュースでしたが、
個人開発者にとってはAzure Reposで満足していたので今さらな印象もありました。

Azure DevOpsはBoards(タスク管理)やPipelines(CI/CD)等がReposと容易に連携でき、使い勝手が良いですが
GitHubとも連携できます。
[GitHub 統合の概要 - Azure DevOps | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/devops/cross-service/github-integration)

# 今後

2つのサービスを行き来するならAzure DevOpsで完結した方がスマートでいいような気がしますが、
GitHubと比べるとAzure Reposは少しマイナーな印象があります。
今後のそれぞれの立ち位置が気になるところです。

GitHubもAzure DevOpsも、ロードマップが公開されています。
Azure DevOpsの日本語化はまだかな...

https://github.com/github/roadmap

https://learn.microsoft.com/ja-jp/azure/devops/release-notes/features-timeline
Rogers PCBおよびPTFE PCB：JLCPCBで高周波PCBが利用可能

最近<a href="https://jlcpcb.com/HAR" rel="nofollow"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">JLCPCB</font></font></a>は、高周波PCBを注文したいフィードバックを受けました。絶え間ない努力の最後に、ついに良いニュースをお伝えします。現在JLCPCBRogers PCBとPTFE Teflon PCBの両方が利用可能で、ウェブサイトから適切な基本材料を選択して高品質の高周波PCBを簡単に注文できます。大規模生産能力のため、<a href="https://jlcpcb.com/JPA" rel="nofollow"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">JLCPCB</font></font></a>は10cm*10cm 5枚以内のHF母材、つまりRogers PCBは99.5ドルからPTFE PCBは50.5ドルからすべて特別な価格を提示することができます。市販されている他のHF PCBに比べて100ドル以上節約できます。

​​

次の仕様は現在JLCPCBの高周波PCBでサポートされています。

基材: Rogers, PTFE Teflon

レイヤー：2レイヤー

はんだマスク：グリーン

シルクスクリーン：ホワイト

外側銅重量：1オンス

​​

JLCPCBのRogers PCB仕様

PCB厚さ: 0.51/0.76/1.52

PCBラミネート：RO4350B（Dk=3.48、Df=0.0037）

​​

JLCPCBのPTFE Teflon PCB仕様

PCB厚さ: 0.76/1.52

PCBラミネート: ZYF255DA(Dk=2.55, Df=0.0018)/ZYF265D(Dk2.65,Df=0.0019)/ZYF300CA-C(Dk=2.94, Df=0.0016)/ZYF300CA-

​​

高周波PCB、それは何であるか。

高周波PCB（高周波PCB）は、複雑な設計、無線周波数（RF）、マイクロ波、無線通信デバイス、および通信に一般的に適用されるピング信号ホルスレートと最大100 GHzの周波数範囲を提供する高い電磁周波数を持つ特殊回路基板です。一般に、高周波ＰＣＢは誘電率定数が低く、散逸率が低い。これは非常に複雑な電子機器に適した選択です。

​​

高品質高周波PCB選択方法

1.適切なDk / Dfを持つ母材を選択します。低いDkを持つボードよりも速い位相速度を持ちます。このような状況で、位相速度や伝送遅延が他の伝送線によって影響を受ける可能性がある高速デジタル回路など、遅延精度に敏感な回路については、PCB母材のDk値にさらに注意を払う必要があります。

​​

さらに、Dkの高いPCBベースは特定の周波数でより小さな波長を生成し、PCB上の回路サイズを小さくします。

​​

2. 基材の熱膨張係数は銅箔の熱膨張係数と一致することが望ましい。温度が大幅に変化すると、その不一致は銅箔が分離する原因となります。

​​

3.耐熱性、耐化学性、耐変形性に優れたPCBを選択します。

​​

Rogers PCBの利点

Rogers-RO435B：この材料は、10 GHzで3.48の誘電率定数を有する強化ガラス炭化水素/セラミック材料で、高周波電力増減設計に一般的に使用されています。RO4350Bラミネートは、Z軸熱膨張係数（CTE）が低く、PTH（Plated Through Hole）によって相互接続された多層回路の高い安定性を保証します。（完成品の厚さは三相で0.6/0.9/1.65mm）。

​​

Rogers PCBの特徴

ガラス強化炭化水素とセラミック誘電体
大量生産工程
優れた高周波性能
低Z軸膨張、優れた寸法安定性
統合薄膜抵抗器の利点
CAF耐性
​​

一般的な使用

グローバルコミュニケーションシステム
高い信頼性と謎の多層回路
ワイヤレスコプシンデバイス
​​
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1873014/5872d83b-e1ce-c52d-7e56-5bb125266580.png)


PTFE Teflon PCBの利点

PTFE Teflon PCBの実用性の点で優れた総合的な性能を持ち、高複雑性と高信頼性設計に理想的な材料選択です。耐熱性がよく、放熱性が強く、誘電特性に優れ、機械的安定性が優れています。耐久性に優れ、一定量の酸化と紫外線に耐えることができ、費用対効果の高いオプションでもあります。

​​


​​

<a href="https://jlcpcb.com/JPA" rel="nofollow"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">JLCPCB</font></font></a>でRogers PCB＆PTFE Teflon PCBを注文する方法

ガーバーファイルをウェブサイトにアップロードします。
必要に応じて「Rogers」または「PTFE」を選択してください。
必要な他の仕様を選択してください。
カートに保存してお支払いください。
​​

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1873014/06e82a8e-7c86-2971-6c3f-8fad428e00a9.png)

​​

<a href="https://jlcpcb.com/JPA" rel="nofollow"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">JLCPCB</font></font></a>は、常にすべてのエンジニアとメーカーのために革新を容易にすることを目指しています。大規模な機能のおかげでJLCPCBこれは非常に低価格で高品質のPCBを提供することができ、より革新的な機能性のための予算を節約します。見積ページで高品質の高周波PCBを購入してください。
JAVA学習の記録②　【クラスのフィールド】

# JAVA学習の記録②【クラスのフィールド】

前回までの学び[JAVA学習の記録①　【オブジェクト指向の概要】](https://qiita.com/rion0726ittoti/items/f1e6c467eebf90e811ac)

## フィールドについて
フィールドとは、インスタンスにデータを記録するための変数のこと。
例えば、犬を表すDogクラスでいうと、犬の名前や年齢、何を食べるかなど犬に関する情報を記録する変数がフィールド。実体（インスタンス）にデータを記録する。

フィールドの定義
```
　String name;
　型　フィールド名
```
フィールドの定義は、変数の宣言とまったく同じ。
違いは、定義する場所
***フィールドの定義は、クラスのブロック内でそのクラスに定義されているすべてのメソッドから利用できる。***
***変数の宣言は、メソッドのブロック内で変数を宣言したメソッド内でのみ利用できる***

***フィールドにアクセスする方法***
同じクラスに宣言されているフィールドにアクセス場合は、***フィールド名=値***
他のクラスからフィールドにアクセスする場合は、***インスタンスの変数名.フィールド名=値***と記述する。
```JAVA:Dog.java
public class Dog {
     String name;       //フィールド定義
     boolean hungry;    //フィールド定義

     void someMehod(){
         name = "ポチ"  //nameフィールドに"ポチを代入"
         Sytem.out.println(name);  //nameフィールドに代入された値を表示
     }
} 
```

```JAVA:UseDog.java
public class UseDog {
   public static void main(String[] args) {
       Dog pochi = new Dog();  //Dogクラスの型のインスタンスを生成して変数pochiに代入
       pochi.name = "ポチ";    //pochiインスタンスのnameフィールドに"ポチ"を代入
       Dog ken = new Dog();   //Dogクラス型のインスタンを生成して変数kenに代入
       ken.name ="ケン";      //kenインスタンスのnameフィールドに"ケン"を代入     
       System.out.println(pochi.name);  //pochiインスタンスのnameフィールドに入っている値を表示
       System.out.println(ken.name);    //kenインスタンスのnameフィールドに入っている値を表示
   }
}
```
このように同じクラス内に定義されているフィールドにアクセスするのか、他のクラスからフィールドにアクセスするのかで代入方法が異なります。また、フィールドは、インスタンスごとに保持されるもの。上の例では、Dogクラス型のインスタンスを２つ（pochiとken）生成し、それぞれのnameフィールドに値を代入しました。

参考文献
「いちばんやさしいJAVAの教本」著者　石井真
Athena Federated QueryでDynamoDBのスキーマが正常に認識できなかった際の対処法

## はじめに

DynamoDB上に格納されたデータをQuickSightで可視化しようとAthena Federated Query(DynamoDBコネクタ)を使用したところ、DynamoDB上に定義された属性(カラム)が一部しか取得できないという状況が発生しました。
本記事ではその解消手順について記載しています。

## 実際の設定手順
DynamoDBコネクタに組み込まれているスキーマの推論機能が完全ではないらしく、このような現象が発生してしまっているようです。
これを解消してあげるために、GlueでDynamoDBのスキーマを定義します。

### Glue上でスキーマを定義する

GlueのCrawlerを使用して自動でテーブルスキーマを生成した場合、DynamoDBのテーブル名の-(ハイフン)が_(アンダーバー)に自動的に変換されてテーブル名の整合が取れなくなる場合があります。なので、ここでは手動で作成する手順を紹介します。

まず、コンソール上からGlueのページを開き、データベースを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/59c38b8c-8d56-e961-cbe4-b93298a2b333.png)

その際、Database名は**default**を指定します。（それ以外は空欄でOK）
![MicrosoftTeams-image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/caed1eb4-4ea7-b4ef-6bc5-e396f55b5ab1.png)

次にtableを作成します。
NameにはDynamoDBのテーブル名を指定してください。
Databaseには先程作成した**default**を指定します。
それ以外はデフォルト値のまま作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/76de4c83-1a47-18ab-d308-3518907fcf87.png)

tableの作成が完了したら、テーブルの詳細ページ → Actions → Edit tableより設定を変更します。
以下の図のように各項目を修正してください。
* Table details
    * input format: 削除
    * Output format: 削除
    * Serialization lib: 削除
* Table properties
    * classification: json → dynamodb へ変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/d44163fc-42dc-6bec-c03d-e5f9f2526b68.png)

その後、dynamodb上の実際のスキーマ定義を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/34beb036-5d0f-638d-52aa-f2ebcc2d522b.png)

スキーマ定義が完了し、Athena上でスキーマ定義が正常に参照可能か確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168722/bcbde751-7c7e-3c11-72ca-4f02614d20af.png)

Glue上で定義したdynamoDBの定義がAthena上で参照できることが確認できました！

## 終わりに
Athena Federated Queryを使用した際、dynamoDBのテーブル定義をGlueで実施する方法を記載しました。
本記事がどなたかのお役に立てれば幸いです。

## 参考記事
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/connectors-dynamodb.html
https://github.com/awslabs/aws-athena-query-federation/issues/348
Javaを基本からまとめてみた【継承】

## 継承
- あるクラスのメンバを受け継いで別のクラスを作ることを『継承』と言う。この機能を利用することでシステムの機能拡張の差分のみのプログラムで実現が可能になる。

- 継承元となるクラスをスーパークラス、継承先となるクラスをサブクラスと言う。
- 継承の利点
○ソースコードの重複を防ぐ
○機能拡張が容易になる
○プログラム構造の理解が容易になる
○仕様へんこうへの対応が容易になる

- 継承の書き方は、サブクラス名の後にextendsを記述しスーパークラス名を指定する
```
public class サブクラス名 extends スーパークラス名{
    処理
}
```
- Javaでは単一継承飲みが認められており、1つのクラスが重複のスーパークラスを持つことはできない。あるスーパークラスを継承したクラスを更に継承するといった階層的な継承は可能


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/4b94e711-832e-84bb-504e-c96d3797365d.png)

「

## 参考サイト
[【Java-オブジェクト指向】Javaプログラミングの「オブジェクト指向」が絶対理解できる講座【プロ講師が丁寧解説】
](https://www.udemy.com/course/uz-java-obj/learn/lecture/21205574#overview)
[【初心者向け】Javaの継承とは？extendsの使い方をマスター！](https://camp.trainocate.co.jp/magazine/java-extends/)
備忘録Uipath2


※個人的備忘録です。情報の欠落や相違がある可能性があります。
メソッドを呼び出しを使用して、ファイルコピーを行う場合以下のパラメータが必要。
特にBooleanを忘れない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097196/b70833b1-0403-677d-2700-089909853d09.png)
LINE notifyで天気通知

# [Python]LINE notifyを使って翌日の天気を教えてくれるプログラム

最近APIって単語をやけに聞くな...（聞く余裕がでてきた...）と感じるので、超超簡単ですが、LINE notifyを使って天気を教えてくれるプログラムを書いてみました。
Udemyの講座を参考にしましたが、極力自分で作りたい...と思っていたので、最低限視聴し、あとは自力で取り組むスタイルで進めました。
やっと少しづつPythonのコードに慣れてきたな...と感じてきている程度のレベル感です。
これだけでもプログラミングってすご！ってなってます。
同じように未経験で入社した人に向けて、こんなこともできるようになるのか。と参考になれば御の字です。

記録に残す目的で記事にします。
___
### 取り組んだ時のスペック
* 未経験で入社し、約7か月経過
* 使用言語はPython、並行してJavaScriptの学習
* Pythonの資格等は未取得(現在Python認定基礎試験学習中)
___

### ①LINE notifyを利用するための準備
LINE notifyを使うためには鍵の発行をする必要がありますが、これはネットで調べれば即出てきました。最近はchatGPT様がご健在ですので聞けばすぐに答えてくれますが、今回はググり力を少しでもつけるために封印しました。

簡単な流れはLINEnotifyから自分のアカウントでログイン→トークンを発行→トークルームを選んで発行。
誰か他の人に送りたい場合はここで選べば良さそうです。(私はそんな勇気はなかったので自分だけにしました。)

コード上では
token = "自身のアクセストークン"の形で入れてます。
合わせてLINE notfifyのhttps://notify-api.line.me/api/notify
LINEへの通知のためのAPIもurlに入れてます。
```
token = "自身のアクセストークン"
url = https://notify-api.line.me/api/notify
```
これだけで準備完了。
え？これだけでいいの？ってなりました。
これだけみたいです。信じられません。
___

### ②Webスクレイピング
今回はBeautifulSoupというライブラリを使用しました。
なんでこの名前なんでしょうか...
```
!pip install BeautifulSoup4
from bs4 import BeautifulSoup
```
これでOK。
BeautifulSoupはWebページの情報(HTML)を取ってくる専門のライブラリです。

今回は東京の翌日の天気の中でも、
天気・最高気温・最低気温・時間帯ごとの降水確率を送るようにします。
ちなみにYahoo天気から引っぱってきます。

大量にあるHTMLの中からhtml.find_all()を使って翌日の天気の部分を抽出します。
```
forecast = html.find_all("div", attrs={"class": "forecastCity"})[0]
```
これでforecastCityというクラス名のものを抽出。要素は1つなのですが、すべてがリストの中に入ってしまっているので[0]を付けてます。
これでリストから出すことに成功。

さらにforecastの中から翌日の天気にあたる部分を抽出。
```
tommorow = forecast.find_all("div")[1]
```

あとは最高気温等も同じようにするだけです。
```
weather = tommorow.find_all("p", attrs={"class": "pict"})[
    0].text.replace("\n", "").replace(" ", "")

high = tommorow.find_all("li")[0].text

low = tommorow.find_all("li")[1].text

rain_06 = tommorow.find_all("td")[4].text
rain_612 = tommorow.find_all("td")[5].text
rain_1218 = tommorow.find_all("td")[6].text
rain_1824 = tommorow.find_all("td")[7].text
```

format関数を使って定型文を作り、そこにあてはめるようにします。
```
message = """
明日の天気は{}
最高気温は{}
最低気温は{}
降水確率は
0-6時:{}
6-12時:{}
12-18時:{}
18-24時:{}
です""".format(weather, high, low, rain_06, rain_612, rain_1218, rain_1824)
```

そして仕上げ。
```
auth = {"Authorization": "Bearer " + token}
content = {"message": message}

requests.post(url, headers=auth, data=content)
```

これで実行すれば自分のLINEに通知が！！！
感動しました。
エンジニアっぽいことができました。（笑）

追加でタスクスケジューラを使って毎日20時に送られてくるように設定をします。
これで完成です。

あとは雨予報なら送るとか追加してもよかったかもしれないです。

___

### まとめ
はじめて完全業務外でこういったものを作ってみましたが、
先輩、上司の方が自分の作りたいものを作るのが一番勉強になる。と言っていた意味が分かったような気がしました。
楽しい...と思いながらできたので満点です。

これからもいろんなもの作っていきたいです、AIとか非常に気になる...。
STM32F401CCU6(Black Pill)とSSD1306をArduinoIDE2.0.3上で使ってみた

　性能は高いのに最近あまり耳にしないSTM32F401CCU6(Black Pill)ですが、一年ほど前にお安く手に入れたのに使えてなかったです。またSSD1306も購入後眠っていたので、両方活用しようと考えました。しかし、ネット上の情報も少なく、STM32CubeIDEを使うのが主流のよう。まずはArduinoIDEで何とか動かしたいと色々模索してみたら、案外簡単なことだったのでご紹介します。
![SSD1306動作.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/55f9d75c-6caf-5180-d48b-17186bbd3a0a.jpeg)
　まず、ESP32などに押され気味なBlack Pillです。ご存じない方はこちらを参考に。
https://www.mischianti.org/2022/07/02/black-pill-stm32f4-pinout-specs-and-arduino-ide-configuration-4/
プログラム書込みモード(DFU)に入るのにも癖があります。個体差もあるかも知れませんが、私のは比較的簡単に入れます。[NRST]と[BOOT0]を同時押しののち少し様子を見て、[NRST]をほんの僅か早く離すと「STM32 BOOTLOADER」が現れます。この辺りは、デバイスマネージャーを開いておいて見ながら作業すると良いですね。
![デバイス.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/325672a0-5395-02aa-00f5-85f34cc64ff7.jpeg)
　さて、上記サイトを参考にArduinoIDEでボードを使えるようにします。私の環境のArduinoIDE2.0.3のスクショでは見にくいので上記サイトの図をお借りしています。
![Arduino_F401CC.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/ae636702-a87c-4e96-a3f9-7f5a46b3c984.jpeg)
　「Adafruite_SSD1306」のLibraryを導入し、その後「File→Examples→Adafruite SSD1306→ssd1306_128x64_i2c」と進みます。いつもの作法通り、Verify、Uploadとすんなりいきますが、書き込み後に表示されません。ウーン、相変わらず私が良く解っていないだけ？
　I2CアドレスはNANOで使ったときに「0x3C」とわかっていたのですが、念のため調べてみることにしました。「File→Examples→Wire→i2c_scannaer」と進み、このスケッチを書き込み動かしてみたところおかしい。i2cのアドレスが見つからないとのメッセージが出てきます。沈思黙考ののちWire.begin()の前に以下のように指定してみました。これで無事動くようになりました。めでたし、めでたし💦。Exampleそのものですし長いので、ソースは載せません。
```
  Wire.setSDA(PB7);
  Wire.setSCL(PB6);
  Wire.begin();
```
kaggleへの初挑戦日記①

# はじめに
1日の中でやったことを日記として書いていく

# コンペ選定
## 結論
下記のコンペに選定
https://www.kaggle.com/competitions/predict-student-performance-from-game-play/overview
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679107/d8455467-cddb-67d3-36e9-bad5eb0027ca.png)

## 理由
タイタニックと似たようなデータ形式で、CSVデータから1つの値を予測するというわかりやすさがあった。
画像はCSVデータの中の各カラム説明。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679107/59fc2f8b-e9be-eb3f-ee5e-3ffcbd9ed75a.png)


# コンペへの参加
タイトル右下の「Join Competition」をクリックしさんか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679107/d9306da0-2111-abb8-47a1-cd488cfe35f2.png)

# 標準入力・標準出力の方法調査
公開されているベースラインコードから標準入出力を学習
## コードの選び方
コードの一覧を見ると、様々なコードがあり、どれを選べばよいか迷う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679107/6e18ce51-9ea1-db19-7f3c-68488a02e5ff.png)

投票順で並び替えて、最も多い投票を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679107/895c37d5-eebb-4e0a-bc7c-724cc7c896b1.png)

## 学習方法
Copy＆Editでコードをコピーし、kaggle上で実行しながら入力の理解。
当然のことながらデータも一緒に見ながらだと理解が早かった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679107/701fb8e8-4997-2386-1afa-fbe2a371ffcb.png)

結局出力のところがよくわからんから、コピーしたやつを一旦提出
バージョン1として保存して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679107/d31b84e0-bbab-1205-fe16-ff2b2820a718.png)

リーダーボードからsubmit
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679107/bfbcf5c4-fcfd-f92f-9cab-e9ba2060b9a5.png)

ノートブック、バージョン、output fileの選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679107/24d55ee0-a57d-f5f1-66cc-50c1ef77c01f.png)

提出完了？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679107/b2f2c883-0086-977f-df18-3f4a8157f11a.png)

ここで推論やsubmission.csvを作っているのだが、envの内容がわからないので、詳しくはわからず。
この人はなぜこんなことがかけたのか？
kaggleのこのAPIのときはもうこれって、決まっているのかな？
ただ、学習したモデルをここで読み込めば良いだけということは理解できたので、次に進む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679107/0679a828-fb6c-38a2-ad55-c3d74b134848.png)

# 標準出力は諦めて機械学習本編
とりあえず今のやつをダウンロード
※ここからインポートもできそう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679107/1d3fa726-cd32-7232-84cd-ca833f1ee7a6.png)

ローカルでいじっていく準備

# 今日はここまで
お疲れさまでした。
正規表現一覧(ChatGPT依存)

バックエンドでバリデーションを行うときにだいたい、そのフレームワークに存在するルールを使い、必要とあらばカスタムルールを作ると思います。
しかし、カスタムルールとか作っていくうちに「全部正規表現で実現したいな」と思ったのがこの記事を書くことになったきっかけになります。
テストをしてから載せていますが、用いる場合は各自テストを行ってから使用してください。
**当該記事にて、発生する責任は負いかねます。**
**※間違っていたら指摘いただけると助かります**

## 見なくていいよ
ほとんどのテストケースはPHP 7.4.3で実行しました。
```PHP:test.php
<?php
$has_test_case = array
(
    "テストケース1",
    "テストケース2",
    "テストケースn"
);
$regex = "正規表現";
foreach ($has_test_case as $test_case) {
    if (preg_match($regex, $test_case)) {
        echo 'true' . ' : ' . $test_case;
    } else {
        echo 'false' . ' : ' . $test_case;
    }
    echo "\n";
}
?>
```

## 正規表現
| ルール | 正規表現 |
| ---- | ---- |
| 空文字 | ``` ^$ ``` |
| 数字のみ(1回以上) | ``` ^\d+$ ``` |
| 数字以外(1回以上) | ``` ^[^0-9]+$ ``` |
| 特定文字が含む(例↓) | ``` .*[].* ``` |
| (例1) Hello, World! (true) | ``` .*[H].* ``` |
| (例2) Hello, World! (true) | ``` .*[eoj].* ``` |
| (例3) Hello, World! (false) | ``` .*[j].* ``` |
| ひらがな1文字以上 ※注1 | ``` /[\x{3040}-\x{309F}]+/u ``` |
| ひらがなのみ ※注2 | ``` /^\p{Hiragana}+$/u ``` |
| カタカナ ※注3 | ``` /[\x{30A0}-\x{30FF}]+/u ``` |
| 郵便番号(ハイフンなし) | ``` ^\d{7}$ ``` |
| 郵便番号(ハイフンあり) | ``` ^\d{3}-\d{4}$ ``` |
| フリーダイヤル(ハイフンなし) ※注4 | ``` ^(0120\|0800\|0570\|080\|012)\d{7,8}$ ``` |
| (固定)電話番号(ハイフンあり) | ``` ^0\d{1,3}-\d{1,4}-\d{4}$ ``` |
| (携帯)電話番号(ハイフンあり) | ``` ^0[789]0-\d{4}-\d{4}$ ``` |
| ipv4 | ``` /^((25[0-5]\|2[0-4][0-9]\|[01]?[0-9][0-9]?)\.){3}(25[0-5]\|2[0-4][0-9]\|[01]?[0-9][0-9]?)$/ ``` |
| ipv4(RFC 1918準拠) ※注5 <br> ・10.0.0.0 ～ 10.255.255.255 <br> ・172.16.0.0 ～ 172.31.255.255 <br> ・192.168.0.0 ～ 192.168.255.255 | ``` /^(?:10.(?:25[0-5]\|2[0-4]\d\|[01]?\d{1,2}).(?:25[0-5]\|2[0-4]\d\|[01]?\d{1,2}).(?:25[0-5]\|2[0-4]\d\|[01]?\d{1,2})\|172.(?:1[6-9]\|2\d\|3[01]).(?:\d{1,2}\|1\d{2}\|2[0-4]\d\|25[0-5]).(?:\d{1,2}\|1\d{2}\|2[0-4]\d\|25[0-5])\|192.168.(?:[0-9]\|[1-9][0-9]\|1[0-9]{2}\|2[0-4][0-9]\|25[0-5]).(?:[0-9]\|[1-9][0-9]\|1[0-9]{2}\|2[0-4][0-9]\|25[0-5]))$/ ``` |

メールアドレスとか、ipv6とかまた機会があれば追加します。

## 参照サイト
注1の参考サイト
https://www.asahi-net.or.jp/~ax2s-KMTN/ref/unicode/u3040.html

注2の参考サイト
http://www.unicode.org/charts/PDF/U3040.pdf

注3の参考サイト
http://www.unicode.org/charts/PDF/U30A0.pdf

注4の参考サイト
https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AA%E3%83%BC%E3%83%80%E3%82%A4%E3%83%A4%E3%83%AB

注5の参考サイト
https://www.rfc-editor.org/rfc/rfc1918
Googleデジタルマーケティング＆Eコマース：マーケティングファネルの価値

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/84e33f4e-81cb-98a6-4546-f2ec06fd8b8b.png" width="800">

以前、[マーケティングファネルの基礎][funnel]について紹介しました。

[funnel]: https://qiita.com/mapami/items/56f851127a0880d3c97e

# マーケティングファネルの目的

***<font color="MediumVioletRed">『利益、収益、新規顧客、またはそれ以外であっても、ビジネスが目標を達成できるようにすること』</font>***

全てのマーケティング活動は、ビジネス目標の達成につながるよう、うまく最適化される必要があります。マーケティング担当者としては、カスタマージャーニーのすべての段階において、ターゲットとなるオーディエンスに確実にリーチし、共鳴させたいと考えているはずです。

# マーケティングファネルの利点

### <font color="MediumBlue">カスタマージャーニーを考慮するように促す</font>

マーケティングファネルは、顧客がブランドとどのような体験をするかを考慮するよう促します。

- 彼ら・彼女らは、いつ初めてブランドを体験するのでしょうか？
- 彼ら・彼女らは、どのように体験するのか？
- 彼ら・彼女らは、最初の体験の後、何をするのでしょうか？

このような質問は、マーケターとして、顧客の視点からブランドとビジネスをよりよく理解するのに役立ちます。

### <font color="MediumBlue">マーケティング戦略を最適化する</font>

どんなマーケティング戦略にもギャップがありますが、ファネルはそのギャップを認識し、修正するのに役立ちます。例えば、

- ディスプレイ広告が見込み客とつながっていない。
- 広告につながったのにWebページの読み込みが遅くて先に進めない。

ファネルを最適化することで、このような課題を発見し、対処することができるのです。

### <font color="MediumBlue">コンバージョン率を高める</font>

カスタマージャーニーを考慮し、マーケティング戦略を最適化すれば、コンバージョン率を高め、より多くのビジネス成果を上げることができます。例えば、

- Eコマースビジネスの場合、潜在顧客が有料顧客になる割合を追跡することができます。100人が商品ページを訪問し、そのうち1人だけが商品を購入したとすると、コンバージョン率は1％です。

ファネルを最適化することで、潜在顧客により良い体験を提供することができます。これにより、コンバージョン率が向上し、最終的に企業の収益が増加します。

:::note info
マーケティングファネルの主な目標は、顧客に素晴らしい体験を提供し、より多くの収益を得ることです。すべてのマーケティング活動は、十分に最適化される必要があります。これにより、マーケティングのパフォーマンスがビジネス目標の達成に役立つようになります。何が顧客をファネル内に移動させ、何が移動させないかを学ぶことは、マーケターとしてより重要な仕事の1つです。
:::
バスタブ曲線

# バスタブ曲線
```システム機器や装置のライフサイクルにおける故障率の推移```を表した曲線で。この形が```浴槽に似ている```ことから```バスタブ曲線```と呼ばれます。

時間の経過によって、三つの期間に分けられます。

### 初期故障期間
```製造工程での欠陥```などが故障原因となる```使用開始直後```の期間

### 偶発故障期間
```ごく稀に故障```が発生する安定期

### 摩耗故障期間
```部品の劣化や摩耗```などが故障原因となる期間

# 出典
https://gihyo.jp/book/2022/978-4-297-13178-4

# 図
https://www.fukudaco.co.jp/support/glossary/bathtub-curve.html
Javaを基本からまとめてみた【アクセス制御(privateとpublic)・アクセス用メソッド(getterとsetter)】

## アクセス制御(privateとpublic)
- privateは自クラス内からのアクセスのみを許す修飾子です。
⇨ カプセル化のキモはこのprivateをフィールドやメソッドにつけることで、他のクラスからその存在を隠すことにある。

- privateとは逆に外部クラスに公開したいフィールドやメソッドにはpiblic修飾子をつける。

- オブジェクト指向では基本的にフィールドにはprivateをつける。フィールドにpiblicを付けるケースは極めて稀で、フィールドにprivateをつけるとそのフィールドは外部クラスから変更はおろか参照すらできなくなう。

- クラスで内部に使うことを想定したメソッドには必ずprivateをつける。外部に公開するメソッドは基本的にはpublicをつける。

## アクセス用メソッド(getterとsetter)

- privateをつけたフィールドには外部から参照・変更ができるような専用のメソッドを必要に応じて提供する。これをアクセス用メソッドといい、参照メソッドをgetter、代入用メソッドをsetterと呼ぶ。

- getterは引数無しで呼び出されると、対応するprivateなフィールドの値を参照し、戻り値として返すだけのメソッドです。

```
(public) フィールドの型　get[フィールド名](){return [フィールド名];}
```
- setterは引数を対応するprivateなフィールドに代入するだけのメソッド。
```
(public) void set[フィールド名](フィールドの型　引数名){[フィールド名]=
引数名;}
```




## 参考サイト
[【Java-オブジェクト指向】Javaプログラミングの「オブジェクト指向」が絶対理解できる講座【プロ講師が丁寧解説】
](https://www.udemy.com/course/uz-java-obj/learn/lecture/21205574#overview)
TFHEの最新動向（2023年３月版）

この記事は [2023年四半期カレンダー（３月版）](https://qiita.com/0917laplace/items/663c7b78854b5a0d47f7) の４日目の記事です

2023年１月・２月に投稿されたePrint（2023/001-2023/302）を対象に整理します

タイトルやアブストに書かれているキーワードから分野を判定します（中身まで見ると大変なので）
＊ですので，以下の集計は正確なものとは限らないです（が，これだけでも結構大変）

本数が少ないので，各ePrintのアブストを見て思ったこととかも後で簡単に書きます

# 全体

|著者  |タイトル  |number  | URL |
|---|---|---|---|
| Jakub Klemsa, Melek Önen, and Yavuz Akın | A Practical TFHE-Based Multi-Key Homomorphic Encryption with Linear Complexity and Low Noise Growth | 2023/065 | https://eprint.iacr.org/2023/065.pdf |
| Gabrielle De Micheli, Duhyeong Kim, Daniele Micciancio, and Adam Suhl | Faster Amortized FHEW bootstrapping using Ring Automorphisms | 2023/112 | https://eprint.iacr.org/2023/112.pdf |
| Andrei Stoian, Jordan Frery, Roman Bredehoft, Luis Montero, Celia Kherfallah, and Benoit Chevallier-Mames | Deep Neural Networks for Encrypted Inference with TFHE | 2023/257 | https://eprint.iacr.org/2023/257.pdf |

## 2023/065
Multi-key TFHEに関するePrintです

既存方式より速くしたり（4.5-6.9倍ほど速い），色々と優位性がアブストに書かれています

## 2023/112
Amortized bootstrap って何？ってところからなんですが，multi-value bootstrap　に近いのかな？たぶん？（間違っていたらすぐ消します）

これも既存方式の改善に関する内容で，暗号文のサイズ減らしたよとか色々書かれているそうです

## 2023/257
Zamaから出た新しいePrintですね

> In this work we show how to construct Deep Neural Networks (DNN) that are compatible with the constraints of TFHE, an FHE scheme that allows arbitrary depth computation circuits.

らしいです

TFHEの機械学習とかAI的なアルゴリズムへの実用的な応用も間近に迫ってきているって感じですね

~~TFHE-rsじゃなくてconcreteでやったんかって感じですが・・・~~


## 感想
意外と２ヶ月で３本しか出てないんだなって感じでした

もう少し多いかと勝手に考えていて，追い切れなさそうだなって思っていたのですが，
このペースなら頑張れば出たときに読めそう（がっつり論文解説ではなく，軽く読んだ感想とかなら書けそう）なので，
これからはちょっと頑張ってみようと思いました

---------------------------
今回の内容はここまでです．ここまでご覧になってくださった方々ありがとうございます！
caddy configure proxy pass start with  "foo" path


![caddy](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/0a63d437-6aa8-b5b0-eae5-cb8396935210.jpeg)

> Caddy simplifies your infrastructure. It takes care of TLS certificate renewals, OCSP stapling, static file serving, reverse proxying, Kubernetes ingress, and more.
Its modular architecture means you can do more with a single, static binary that compiles for any platform.
Caddy runs great in containers because it has no dependencies—not even libc. Run Caddy practically anywhere.

### config

```conf
{
  auto_https off
}

:3000 {
  root * /xxx

  route /api/* {
   uri strip_prefix /api

    reverse_proxy {
      to localhost:2000
    }
  }

  file_server
}
```

### Thank chatGPT

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/65c0b846-0dfe-43ce-1c62-59dab6612777.jpeg)


![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/592bca8b-65a1-2f0e-2e32-3eb32f1049e1.jpeg)

---

Ref:

https://qiita.com/shooter/items/a43069e5d475954bb574

https://caddyserver.com/
累積バグの時のグラフ

# ゴンペルツ曲線
信頼度成長曲線、バグ曲線ともいいます。
横軸に```テスト時間```、縦軸に累積の```バグ発見数```をとった曲線のこと。

テストが進むにつれてバグの発見数が増え、```曲線の傾きが急```になります。
```テスト後半期からはバクの発見数は少なくなり曲線も緩やか```になります。
全体としては```S字カーブを描く```のが特徴でこの形状が大きくなる場合は、何らかに問題があると考えられます。

# 出典
https://gihyo.jp/book/2022/978-4-297-13178-4

# 図があります
https://cyzennt.co.jp/blog/2021/01/01/%E3%82%B4%E3%83%B3%E3%83%9A%E3%83%AB%E3%83%84%E6%9B%B2%E7%B7%9A%EF%BC%88%E4%BF%A1%E9%A0%BC%E5%BA%A6%E6%88%90%E9%95%B7%E6%9B%B2%E7%B7%9A%EF%BC%89%E3%81%A8%E3%81%AF/

# 感想
知らなかった。
抜取り検査

# 抜取り検査
```一定量（ロットという）から一部を抜き取って検査```し、その検査でロット全数を合格とするか否かを判定する品質管理の方法です。

不良品が発見されない場合でもそのロットに不良品が含まれていないことは保証できない。
しかし
```確率の考え方を使ってロットあたりの抜取り数や合格基準を設定して判断```する。

```製品数が多かったりすると使われる検査```方法。

## OC曲線
抜取り検査においてロットの不良率と合格率を表す図です。
### 図
https://www.keyence.co.jp/ss/products/measure-sys/measurement-selection/process/sampling-inspection.jsp#:~:text=OC%E6%9B%B2%E7%B7%9A%E3%81%8B%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8B,%E6%B6%88%E8%B2%BB%E8%80%85%E5%8D%B1%E9%99%BA

# 出典
https://gihyo.jp/book/2022/978-4-297-13178-4