OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyは全てがオブジェクト

## 全てがオブジェクトってどういうこと？
Rubyでは全てがオブジェクトですが、これは実際のところどういうことなのでしょうか。

https://stackoverflow.com/questions/18790442/are-there-primitive-types-in-ruby

文字通りの意味なのですが、primitiveとの違いを考えるとわかりやすいと思います。

Rubyではstringは```String Class```のインスタンスですが、javascriptでは```primitive value```です。

これはどういうことかというと、Rubyのstringはオブジェクトであるため変更可能(mutable)ですが、javascriptにおけるstringはprimitive valueであるため変更不可能(immutable)であるということです。
- ruby
```ruby
    str = "hola"
    str[0] = "c"
    # str => "cola"
```
- javascript
```javascript
    let str = 'hola'
    str[0] = 'c'
    console.log(str)
    // => Uncaught TypeError: Cannot assign to read only property '0' of string 'hola'
```
↑ javascriptでは```primitive value```を変更しようとするとキレられます。


同じ文字列であったとしても別のインスタンスが生成されます。
```ruby
    "hello".object_id # => 10260
    "hello".object_id # => 27900
```
```==```では、内容を比較して判定します(同値性)。なので```object_id```が違ったとしても内容が同じであれば```true```を返します。
```object_id```を基準に判定するのは```equal?```メソッドです。

https://docs.ruby-lang.org/ja/latest/method/Object/i/=3d=3d.html

https://docs.ruby-lang.org/ja/latest/method/Object/i/equal=3f.html

mutableであることを意識しておかなければ、バグらせてしまう可能性があります。
下記のように意図しない変更が生じてしまうことがあるので注意が必要です。
```ruby
    a = "hola"
    b = a
    b[0] = "c"
    puts a # => "cola"
```

メソッドさえもオブジェクトです。
```ruby
    "hello".class.instance_method(:size).class
    # => UnboundMethod
```
UnboundMethod Classのインスタンスであることがわかります。

https://docs.ruby-lang.org/ja/latest/class/UnboundMethod.html


## 終わりに
これを理解することができたのは、おそらくjavascriptについての知識がついたからです。
異なるパラダイムを持つ言語を学ぶことは、すごい意味のあることだと思いました。
numpy配列を引数に取れる & njitと併用できるメモ化



### メモ化とは
メモ化（英: memoization）とは、プログラムの高速化のための最適化技法の一種であり、サブルーチン呼び出しの結果を後で再利用するために保持し、そのサブルーチン（関数）の呼び出し毎の再計算を防ぐ手法である。[wikiより](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E5%8C%96)

簡単に言うと、関数の引数と戻り値をペアで覚えておいて、次回同じ引数が来た時に関数の中を通らず結果を返すことで高速化する手法です。

Python3.8では標準ライブラリ`functools.lru_cache`でメモ化が可能です。[こちら](https://qiita.com/alchemist/items/c75174c41b0bcd31ecc6)とか参照ください。ただしこちらは引数にnumpy配列を取れなかったので以下、自作しました。

### メモ化デコレータ作成
```python
from numba import njit
from functools import wraps
import numpy as np
import time
```

numpy配列に対応するために
引数を無理やりstrにキャストして辞書のキーにしています。
```python:メモ化デコレータ
def cache(f):
    c = {}
    @wraps(f)
    def _wrapper(*args,**kwargs):
        key = ''.join([str(arg) for arg in args]) + ''.join([str(k)+str(v) for k,v in kwargs.items()])
        if key not in c:
            c[key] = f(*args,**kwargs)
        return c[key]
    return _wrapper
```

ついでに時間計測デコレータ
```python:時間計測デコレータ
def proc_time(f):
    @wraps(f)
    def _wrapper(*args, **kwargs):
        st = time.perf_counter_ns()
        res = f(*args, **kwargs)
        t = (time.perf_counter_ns() - st) * 0.000000001
        print(f'{format(t,".2E")} sec')
        return res
    return _wrapper
```

### 自作メモ化テスト

```python:メモ化テスト
@proc_time
@cache
def calc(a,b,c):
    """負荷のあるテキトーな計算"""
    for _ in range(10000):
        for i in range(1, len(a)-1):
            a[i] = (a[i-1]+a[i+1])*0.5 + b
        a[len(a)-1] = a[len(a)-2]
    return a+c


calc(np.zeros(100), 1, True)
calc(np.zeros(100), 1, True)
calc(np.zeros(100), 1, c=True)
```

```python:結果
1.84E+00 sec
1.12E-03 sec
1.57E+00 sec
```
1回目は普通に計算しているので遅いです。
2回目はメモ化で1回目の結果を呼び出しているので速いです。
numpy配列に対応したメモ化になっています。
3回目は引数の与え方が違うので1回目や2回目と別物と判断、計算しているので遅いです。

### メモ化デコレータとnjitデコレータを併用する
calc関数に@njitデコレータ追加しました。
njitで高速化するので計算回数を100から10000に増やしています。
```python:njit併用テスト
@proc_time
@cache
@njit # 追加
def calc2(a,b,c):
    """負荷のあるテキトーな計算"""
    for _ in range(10000):
        for i in range(1, len(a)-1):
            a[i] = (a[i-1]+a[i+1])*0.5 + b
        a[len(a)-1] = a[len(a)-2]
    return a+c



calc2(np.zeros(10000),0,True) # ダミー実行
calc2(np.zeros(10000),1,True)
calc2(np.zeros(10000),1,True)
```

```python:結果
9.64E-01 sec
6.48E-01 sec
2.66E-04 sec
```
1回目はjitコンパイル時間を除外するためのダミー実行です。
cacheの効果は2回目と3回目の差で確認でき、
njit併用でもメモ化動作していることが確認ます。


### njitした関数からメモ化した関数を呼び出す
```python
@cache
@njit
def _calc3(a,b,c):
    for _ in range(10000):
        for i in range(1, len(a)-1):
            a[i] = (a[i-1]+a[i+1])*0.5 + b
        a[len(a)-1] = a[len(a)-2]
    return a+c

@proc_time
@njit
def calc3(a,b,c):
    return _calc3(a,b,c)


calc3(np.zeros(10000,dtype=np.int8),0,True)
calc3(np.zeros(10000,dtype=np.int8),1,True)
calc3(np.zeros(10000,dtype=np.int8),1,True)
```

```python:結果
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Untyped global name '_calc3': Cannot determine Numba type of <class 'function'>

File "..\..\..\AppData\Local\Temp\ipykernel_4136\4257892594.py", line 13:
<source missing, REPL/exec in use?>
```
うまくいきません。


### まとめ
- メモ化デコレータを作成しました。以下特徴を持っています。
    - メモ化した関数の引数にnumpy配列を取れる
    - 条件付きで、メモ化デコレータとnjitデコレータを併用できる
    - keyが長い文字列なので検索効率悪いです。
paizaラーニング「N が M ずつ増えたときにいつ K を越える？ Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__inc_m
#### 私の解答
```Python3
n,m,k = map(int,input().split())
ans = 0
if n <= k:
    while n + m <= k:
        n = n + m
        ans += 1
    print(ans+1)
else:
    print(0)
```
私の解答は長すぎでした。
#### 解答例
```Python3
N, M, K = map(int, input().split())
num = 0
while N <= K:
    N += M
    num += 1

print(num)
```
Lisp 食べ比べ (2) ループ処理編

2024/02/23 更新

## はじめに(環境説明)
私が Lisp を使った順番で言えば、Common Lisp ⇒ Emacs Lisp ⇒ Scheme (Racket) となります。
(今まで使ったことがありませんが Gauche Scheme も追加しました。)

```
$ sbcl --version
SBCL 2.2.10

$ emacs --version
GNU Emacs 28.2

$ racket --version
Welcome to Racket v8.6 [cs].

$ gosh -V
Gauche scheme shell, version 0.9.12 [utf-8,wthreads], x86_64-w64-mingw32
```

**例によって、上記の環境を使って、「Lisp 食べ比べ」をしてみたいと思います。**

## さて今回は

整数回ループしたり、リストの要素数分ループしたりということをやります。
表示周りでは書式制御などがキモになります。

## 実行上の留意点

* sbcl (Common Lisp) と racket (Scheme) は元々バッチ実行ができますから、ソースを実行ファイルに食わせるだけでいいのですが、emacs (Emacs Lisp) はどうするかといいますと「バッチモード実行」を使います。

* また、emacs では、以下の記事に載せてある xprint.el がホームディレクトリに置かれてあることを前提とします。

> [Emacs Lisp でプリントデバッグをする (5) - Qiita](https://qiita.com/javacommons/items/50b2ac5e84143308c2cc)

## ソースと実行結果

以下に3つのソースを示します。
sbcl, emacs, racket, gosh (Gauche) の実行ファイルにパスが通っているのを前提にbashのshebangを使って実行しています。

```cl:Common Lisp [SBCL] (test02.lsp)
#! /usr/bin/env -S sbcl --script
(defparameter loop-count 5)
(dotimes (i loop-count)
  (format t "i+1=~S~%" (1+ i))
  )
(defparameter misc-list '(11 22 abc "def ghi"))
(dolist (x misc-list)
  (format t "x=~S~%" x)
  )

;;; Welcome to the Emacs shell
;;; 
;;; ~/racket $ cd "d:/Users/javac/Documents/.repo/env/racket/" && time "./test02.lsp"
;;; i+1=1
;;; i+1=2
;;; i+1=3
;;; i+1=4
;;; i+1=5
;;; x=11
;;; x=22
;;; x=ABC
;;; x="def ghi"
;;; 0.202 secs
;;; ~/racket $
```

```elisp:Emacs Lisp (test02.el)
#! /usr/bin/env -S emacs -batch -l
(load "~/xprint.el")
(setq loop-count 5)
(dotimes (i loop-count)
  (xdump (1+ i))
  )
(setq misc-list '(11 22 abc "def ghi"))
(dolist (x misc-list)
  (xdump x)
  )

;;; Welcome to the Emacs shell
;;; 
;;; ~/racket $ cd "d:/Users/javac/Documents/.repo/env/racket/" && time "./test02.el"
;;; Loading d:/Users/javac/Documents/.repo/env/xprint.el (source)...
;;; (1+ i) := 1
;;; (1+ i) := 2
;;; (1+ i) := 3
;;; (1+ i) := 4
;;; (1+ i) := 5
;;; x := 11
;;; x := 22
;;; x := abc
;;; x := "def ghi"
;;; 0.295 secs
;;; ~/racket $
```

```racket:Scheme [Racket] (test02.rkt)
#! /usr/bin/env racket
#lang racket
(define loop-count 5)
(for ([i loop-count])
  (printf "i+1=~s\n" (+ i 1))
  )
(define misc-list '(11 22 abc "def ghi"))
(for ([x misc-list])
  (printf "x=~s\n" x)
  )

;;; Welcome to the Emacs shell
;;; 
;;; ~/racket $ cd "d:/Users/javac/Documents/.repo/env/racket/" && time "./test02.rkt"
;;; i+1=1
;;; i+1=2
;;; i+1=3
;;; i+1=4
;;; i+1=5
;;; x=11
;;; x=22
;;; x=abc
;;; x="def ghi"
;;; 0.655 secs
;;; ~/racket $
```

```scheme:Scheme [Gauche] (test02.scm)
#! /usr/bin/env gosh
(define loop-count 5)
(dotimes (i loop-count)
  (format #t "i+1=~S~%" (+ i 1))
  )
(define misc-list '(11 22 abc "def ghi"))
(dolist (x misc-list)
  (format #t "x=~S~%" x)
  )

;;; Welcome to the Emacs shell
;;; 
;;; ~/racket $ cd "d:/Users/javac/Documents/.repo/env/racket/" && time "./test02.scm"
;;; i+1=1
;;; i+1=2
;;; i+1=3
;;; i+1=4
;;; i+1=5
;;; x=11
;;; x=22
;;; x=abc
;;; x="def ghi"
;;; 0.318 secs
;;; ~/racket $
```
----

## 最後に

**今後も、Common Lisp、Emacs Lisp、Scheme のそれぞれの書き方で同じことをする・・・というのをアップしていきたいと思います。**

**もっと良い書き方あるよーて方はコメント等で教えてください！**

それでは！
paizaラーニング「10 進数から M 進数に変換 Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__conv_nbase

#### 私の解答
```Python3
N,M = map(int,input().split())

shinsu= 0
i = 0
while N > 0:
    digit_num = N % M
    shinsu += digit_num * pow(10, i)
    N //= M
    i += 1

print(shinsu)
```
前の問題の解答例を修正して書きました。

#### 解答例
```Python3
N, M = map(int, input().split())

base = ""
while N > 0:
    base += str(N % M)
    N //= M

print(base[::-1])
```
- N が自然数であれば、M で割った余りを取ると、M 進数に変換した際の M^0 の桁を求めることができます。
- M^0 の位を求めたら N を M で割り、もう一度同じ操作を繰り返すと M^1 の位を求めることができます。
- これを繰り返していくことで N を M 進数に変換することができました

文字列を反転させるという方法を取っていました。色々な書き方があるんですね。
paizaラーニング「10 進数から 2 進数に変換 Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__conv_binary

- 整数の10進数を2進数に変換
算数か数学で習ったことがあるような気がしましたが、全く覚えていませんでした。ググってみたところ、整数の10進数を2進数に変換するには、変換したい10進数を商が0になるまで2で割りつづけ商と余りを求めればよいと、基本情報技術者講座のウェブサイトに掲載されていました。

<a href="https://coursera.org/share/cc07bf7f4e860424e05b2686a8580b7b">面白かったgoogleの2進数に関する講義はこちら。</a>


結構考えてみたのですが、プログラムが思いつきませんでした。今回は解答例を参照して勉強することにしました。
#### 解答例1
```Python3
N = int(input())

binary = 0
i = 0
while N > 0:
    digit_num = N % 2
    binary += digit_num * pow(10, i)
    N //= 2
    i += 1

print(binary)
```
- N % 2とすることで、2 進数にした場合の数字を求め、pow(10, i) を掛けることで現在の桁に合わせて 10 の累乗をしています。
- これを N が 0 になるまで繰り返すことで 10 進数を 2 進数に変換しています。

#### 解答例2
```
N = int(input())

print(bin(N)[2:])
```
- Python の場合、組み込み関数である bin() を使用することで、10 進数を 2 進数に変換することができます。
- 変換後の最初の 2 文字は 2 進数を表す 0b なので出力する際には除去する必要があります。
ブラウザの開発ツール(F12)からスクリーンショットを撮る方法

# はじめに
ブラウザ内の画面の一部を切り抜いたり、あるいはページ全体をスクリーンショットしたいことがみんなあるだろう。

これらの機能は拡張機能でサポートされていたりするが、開発ツール内からコマンドを叩くことによっても実行できる。

# やり方
windows前提で話をする。
はじめにＦ１２で開発ツールを開いたら、shift+ctrl+Pを叩く。

するとコマンドを打ち込めるターミナルが出てくるので、Screenと入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551117/20d877c4-e98d-6972-a50d-5b3e92f4bb94.png)

いくつかcaputure ~ screenshotと出てくる。

# capture area screenshot
我々がいつも行っているwin+shift+Sでの切り抜きと同じ。

# capture full size screenshot
そのページ全体をスクリーンショットしてくれる。

# capture node screenshot
htmlの要素を指定したスクリーンショット。

# capture screenshot
ブラウザ画面のスクリーンショット。
Unity URP Renderer Dataを用いて移動可能な穴を描画する

# 概要
URPで作成したシーンに、メッシュに穴を開けずに描画する方法を説明します。
頂点データをいじらなくて済むので、穴自体の移動が簡単に行えます。
![画面収録 2022-11-27 1.15.06.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/3bc85d6b-f70e-29fd-a64b-606fa62d67a0.gif)

プロジェクトのソースコードはこちら
https://github.com/Arihide/unity-hole-stencil

# 解説

#### プロジェクト準備
3D（URP）からプロジェクトを作成します。
![スクリーンショット 2022-11-27 1.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/ce72fec8-b33d-0bf3-80af-0d9c4acf9809.png)

プロジェクト作成後、Project Settings→Quality より Defaultを Performantにします。
最低限の構成から始めたいためです。
![スクリーンショット 2022-11-27 0.51.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/bd8e1f30-7ccd-3f5b-b54d-90f0503ab817.png)


続いて以下の2種類の穴のモデルを用意します。
* [Hole]内側の底と側面に面があるメッシュ
* [HoleMask]Holeと同じ形状の円柱
![スクリーンショット 2022-11-27 1.26.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/bd65cea6-0fdb-a668-399f-d185850423fa.png)

#### シーン設定
続いてシーンに上記モデルを配置します。ただの円柱に見えますが、HoleとHoleMaskが同じ位置に存在します。
![スクリーンショット 2022-11-27 1.07.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/1e53980f-ccfc-9442-6c60-17524103814d.png)

その上に穴を開けたい平面をHoleモデルの置きます。今の所は未設定なので穴は平面に隠れています。
![スクリーンショット 2022-11-27 1.07.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/6a68c2c8-a3e5-ada1-79b3-c30339d63ae8.png)

#### レイヤー設定
Holeモデルを再度選択し、インスペクタ右上からレイヤーを追加します。
![スクリーンショット 2022-11-27 1.06.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/979c42f8-8ab0-271e-c0a5-b38b0d992022.png)

以下の2つを追加します。
![スクリーンショット 2022-11-27 1.06.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/1da38840-3d5f-e958-4418-da9abaea1f2f.png)

Hole,HoleMaskに対してそれぞれレイヤーを追加します
![スクリーンショット 2022-11-27 1.06.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/36394827-b873-b332-4338-192de7c9437a.png)

#### Renderer Data設定
Projectタブより`Assets/Settings/URP-Performant-Renderer.asset`を選択しインスペクタに表示します。
![スクリーンショット 2022-11-27 1.05.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/8787d6f8-d550-011a-240d-a08710d454fe.png)

Render Objects（Experimental）を選択します。
![スクリーンショット 2022-11-27 1.08.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/9b707bbc-9bca-6d41-40ad-4ed423f6b057.png)

次のように2つ追加し設定をします。すると穴が無事表示されるようになります。
（正しく表示されない場合、HoleMaskのY座標を上にずらしてみてください）
![スクリーンショット 2022-11-27 1.13.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/4caa38f0-1d59-e5a6-f2b3-22cd2e2f2cb6.png)

最後にここで設定したRender Objectsの値について簡単に説明します。

* 最初にHoleMaskレイヤーに対して追加の処理を行う
    * Stencilにチェックを入れ、Value=1,ConpareFunction=Always,Pass=Replaceを設定
        * これにより、「HoleMaskが描画される部分にStencil=1」を書き込む
* 次にHoleレイヤーに対して処理を行う
    * Depthにチェックを入れAlwaysに変更する
        * HoleはPlaneに隠れているため、Depth Testを通過せず描画されないのを避けるため
    * Stencilにチェックを入れ、Value=1を設定
        * HoleMaskがStencil=1に設定した部分だけHoleを描画したいため



#### 注意点
コライダーには影響しないため、穴に物体を落としたいなどは追加で処理の追加が必要になります。
gnuplotでファイルの統計情報を得たい

# 統計情報の抽出
```
stats 'out.d' nooutput
```

この時点でファイル内の統計情報が格納されます。

ファイル内での最大、最小値はSTATS_min_y,STATS_max_yで取得できる。これを応用すると、arrowの位置をファイルごとに操ることができたりする。
```
set arrow from  X1 , STATS_min_y to X1 , STATS_max_y nohead lw 2 dt (10,5) lc rgb "red"
```

他にもいろいろな情報が見れるので参考文献先で確認してみてね。

# 参考文献
https://ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/stats.html
关于apng png gif imagemagick的那些处理


## 静态PNG图片

去除png图片的透明背景（转换为白色）

```
magick mogrify -format png -alpha remove *.png
```
注：mogrify为覆盖（但后缀名不同仍然无法覆盖），convert为输出新文件

## 动态PNG图片转换为GIF
一键：
```
 magick.exe convert -format gif -set dispose Previous -layers coalesce -loop 0 apng:origin.png test.gif
```
拆解：

- -formart gif：转换为gif格式
- -set dispose Previous 重置dispose选项，并设置为“Previoius”模式，详细看这里[ImageMagick （legacy） – 命令行选项](https://legacy.imagemagick.org/script/command-line-options.php?#dispose)
- -layers  coalesce 让gif变成类似胶片的模式，虽然没看懂但是……加了这个之后突然就好了，说明在这里 [ImageMagick （legacy） – 命令行选项](https://legacy.imagemagick.org/script/command-line-options.php?#layers)
- -loop 0 ：修改循环次数为无限
- apng: ：动态png强制以apng格式读取，否则将认作静态png处理

## 批量处理
本来想用shell，后来发现想要做的循环和判断几乎可以在一行里解决。那么先上一行流。
```
 ls ./apng |awk -F ".png" '{print $1}' |xargs -I {} magick.exe convert -format gif -set dispose Previous -layers coalesce -loop 0 apng:./apng/{}.png ./gif/{}.gif
```

拆解

- ls ./apng 打印目录下文件
- awk -F ".png" '{print $1}'：以.png为分隔符切割前一步输出，并打印第一个区块（这里顺便起到了grep的作用，但是总感觉可以用ls解决……）
- xargs -I {}：将前文输出内容多次使用 例如后面 ./apng/{}.png ./gif/{}.gif，就使用了文件名两次，来分别制定原文件名和输出文件名。



## 参考したページ

[ImageMagick – Command-line Tools: Mogrify](https://imagemagick.org/script/mogrify.php)

[提取与优化Line贴图的正确姿势 - 哔哩哔哩](https://www.bilibili.com/read/cv362796)

[Can I use ImageMagick to convert Animated PNG (APNG) into animated WEBP format? · Discussion #3846 · ImageMagick/ImageMagick](https://github.com/ImageMagick/ImageMagick/discussions/3846)

[ImageMagick – Image Formats](https://imagemagick.org/script/formats.php)

[为什么有的GIF图片只会播放一遍，而有的会重复播放？关于gif你想知道的一切！ - 轻狂书生han - 博客园](https://www.cnblogs.com/qkshhan/p/16202931.html)

[Animation Basics -- IM v6 Examples](https://legacy.imagemagick.org/Usage/anim_basics/#previous)
Rails module

## はじめに
これまで個人開発をしていて、Railsでmoduleを使うことはほとんど使うことはありませんでした。
実際にインターンをしてみると、moduleってかなり使われているなという印象です(特に名前空間としての役割)。
moduleがclassとどう違うのかや、どんな使われ方をするのかなどをまとめたいと思います。

## moduleとclassの違いについて
moduleとclassの違いは以下の記事がとてもわかりやすいです。

https://qiita.com/fukumone/items/2dd4d2d1ce6ed05928de

- moduleはインスタンスを生成できないが、classはできる
- moduleは他のmoduleやclassを継承することはできないが、classは継承することができる

## 主な使い方
- 名前空間として使う
- メソッドを格納する場所として使う

#### 名前空間としての使い方
特にこの使い方が多いのかなと思います。
moduleを使ってネストさせることによって名前空間を作ることができます。
小さなプロジェクトであれば名前の衝突をすることはほとんどありませんが、企業のリポジトリとなるとそうはいきません。
クラス名が同じだったとしても、それをラッピングするmoduleが異なれば衝突することはありません。

```ruby
    module Rspec
        module Rails
            class ActiveRecordConfiguration
                # ...
            end
        end
    end
```
↑ ```RSpec::Rails::ActiveRecordConfiguration```
参照の際には```::```を使って表すことができます。

#### メソッド格納としての使い方
moduleではメソッドを格納することができます。
mixinして他のクラスで使うこともできますし、そのmodule単体のメソッドとして使うこともできます。

##### module単体で使いたいとき

```mod.rb
    module Mod
        
        def return_hello
            'hello'
        end
    
        module_function :mod_only
    
    end
```
module_functionで指定することでmodule単体のメソッドとして定義されます。
 => ```Mod.return_hello```で参照することができます。

##### mixinして使う場合
- **moduleをインスタンスメソッドとしてmixinしたいとき**
```↓ Post classでMod moduleをmixinすると想定します```
```mod.rb
    module Mod
    
        def return_hello
            'hello'
        end
    
        def return_self_instance
            return self
        end
    
        def return_self_attribute_title
            return self.title
        end
    
        def mod_only
            return 'only_module'
        end
    
        module_function :mod_only
    
    end
```
使いたいクラス内でincludeします。
```post.rb
    class Post < ApplicationRecord
        include Mod
    end
```

```ruby
    post = Post.first
    post.return_hello # => "hello"
    post.return_self_instance # => #<Post:0x000056107ac12fd8...
    post.return_self_attribute_title # => postインスタンスがtitle attributeを持っていた場合にはその値が返される(なければundefined method `title'が返される)
    post.mod_only # => no method errorが返される
```
どのクラスにincludeすることもできます。
attributeが一致しているならばself.attributeのようにmoduleでメソッドを定義しても、呼び出したクラスから使うことができます。
module_functionで指定しているものはmodule単体でしか使えないためinclude先で使うことはできません。
複数のクラスに共通する処理はmoduleに切り出すのがいいのかなと思います。

- **moduleをクラスメソッドとしてmixinしたいとき**
クラスメソッドとしてmixinしたい場合には```extend```を使います。
要領はインスタンスメソッドとしてmixinするときと全く同じです。
```post.rb
    class Post < ApplicationRecord
        extend Mod
    end
```
```ruby
    Post.return_hello # => 'hello'が返ってくる
    Post.return_self_instance # => selfを返すクラスメソッドであるためPost classが返ってくる
    # => Post(id: integer, title: string, content: string, user_id: integer, created_at: datetime, updated_at: datetime)
```
競技用プログラミング学習サイト一覧

https://www.toy-pro.net/

https://onlinejudge.u-aizu.ac.jp/courses/lesson/8/ITP2/1

https://qiita.com/harupy/items/7a2709ae46dcd430bde4

https://1kohei1.com/leetcode/

https://kenkoooo.com/atcoder/#/table/

https://leetcode.com/problemset/all/


# アルゴリズム
https://www.codereading.com/algo_and_ds/


https://xtech.nikkei.com/atcl/nxt/column/18/02296/121600002/

https://xtech.nikkei.com/atcl/nxt/column/18/02296/121600001/
Docker 入門


# 参考動画

https://www.youtube.com/watch?v=lZD1MIHwMBY&t=1560s






# 参考サイト

https://tech.nri-net.com/entry/using_docker_containers_with_vscode

https://qiita.com/etaroid/items/b1024c7d200a75b992fc

https://knowledge.sakura.ad.jp/13265/


https://kitsune.blog/docker-install#Docker_ToolboxWindows_10_Home


https://qiita.com/wMETAw/items/b9bc643ded4b92bf6add




https://codezine.jp/article/detail/12831



https://o2mamiblog.com/docker-beginner-1/



https://camp.trainocate.co.jp/magazine/whats-docker/



https://qiita.com/k5n/items/2212b87feac5ebc33ecb#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%81%A6%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B


https://qiita.com/kon_yu/items/7c40f4dfbd1cce006ce7

Docker Desktop
「神エクセル」についての一家言

「神エクセル」、ネットではやたら騒がれてる問題ですよね。

せやけど、東証プライム上場企業含め数十の企業の現場で仕事してきた筆者ですが、いずれのほとんどの現場でも
**「Excelは、昔から普通に仕様書のプラットフォームとして使われてたよ！」**
という事実はあらかじめ申し上げたうえで、改めて思うところを。

### 1. 「神エクセル」と「Excel方眼紙」の違い ###
個人的に強く思ってんのは、標記の二者を混同してるんちゃうかと。
もちろん、筆者もお役所主導のいわゆる「Excel方眼紙」的なワークシートに悩まされた時期はありましたよ、ええ！

1990年代後半ごろから、デジタル機器がまったくなかった職場にPCが普及するなか、各端末で数少ない、共通で使えるアプリであったExcelで、印刷に合わせるためにレイアウトを整えたドキュメントを作るのはもう必然の流れでした。
そんな中、お役所仕事でハンコを押す欄、文字を一文字ずつ記入する欄etc.の関係で誕生したんが<b>「Excel方眼紙」</b>になるんですが、個人的にはこれが最も撲滅すべき対象やと感じております。
![my_0330excel01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170624/9bf58ad1-ba71-fa65-27e6-7246cbb23f42.jpeg)
（【参照】[なぜ「ネ申エクセル」は生まれたのか　誕生を目撃した元市役所職員が語る“美しさ”の追求](https://www.itmedia.co.jp/news/articles/2203/31/news064.html) より）

ただ、それ以外の「神エクセル」って、そんなに悪ですか？
図表、グラフ、文章・・・と、一つのファイルにまとめて参照できるって、要件定義含めた各種仕様書としては究極の理想やと思うんですが？

加えて、<font color=red><b>レイアウト設計さえしっかりしてれば</b></font>、VBAで扱うにも印刷で扱うにも何の問題もないんですが？
### 2. 知らないものは知らない ###
この辺の論争になるときに、必ず取り上げられるのが
**「お役所は、何でこんな状態を放置してるんや！」**
という議論。

いやでもね、お役所みたいにすごく閉鎖した世界の中で「何でこんなこと分からんねん！」っていきなりインネンつけられても、そりゃ困るでしょ？
例えば、あなたが明日から自衛隊の最新鋭潜水艦の操縦をやれ！と言われて、それができなくて、
「お前はそんなことも知らんのか！」
って怒られるって・・・こりゃ立派なパワハラですよね？

頭の片隅にも前提知識やネタやアイデアがない人に対して何かをさせようとする場合、前提なりヒントなりインスパイアのネタを与えるんが、私らIT技術者の仕事かなと思ってて。
具体的に、Excelからデータをうまく取り込んで効率よく業務改善した例だとかを紹介して、現状を打破する提案をすべきで。
それをやんのが"SIer"の仕事でしょ？

またとないビジネスチャンスですやん！
あれこれ批判する前に、自ら提案書作って提出しましょ！:blush:
iOS内蔵辞書を見れるUIReferenceLibraryViewControllerをSwiftUIから触る


目も腰も痛い。Swift歴2週間の松本です。
UIReferenceLibraryViewControllerに関する日本語の記事はこれで4件目です。(私調べ)
みなさんもっと使ってください。
現在Swiftの勉強のために辞書アプリを作っていますが、Appleの公式ガイドラインには


:::note Info
A UIReferenceLibraryViewController object should not be used to display wordlists, create a standalone dictionary app, or republish the content in any form.
:::

https://developer.apple.com/documentation/uikit/uireferencelibraryviewcontroller

とあるので、AppStoreではこのクラスを使った辞書アプリは公開できませんね。

今回このクラスを使うに当たり素人には難しい点がいくつかあったのでまとめておきます。


まず、UIKitであること。SwiftUIの中でUIViewを使うには
UIViewRepresentableまたはUIViewControllerRepresentableを介する必要があります。
色々試しましたがmodal viewの.sheetと組み合わせても表示がモタつかないようにするには、
呼び出し元のContentView.swiftで辞書のViewControllerを作り、それをUIViewRepresentableに渡してSwiftUIの扱えるViewにラッピングして返してもらうのが一番スムーズでした。
```ContentView.swift
 .sheet(isPresented: $showDict){
                        let refLibVC = UIReferenceLibraryViewController.init(term: "text")
                        DictView(refLibVC: refLibVC)
                    }
```

```DictView.swift
struct DictView: UIViewRepresentable{
        var refLibVC:UIReferenceLibraryViewController
        func makeUIView(context: Context) -> some UIView {  
        let uiLayoutContainerView = refLibVC.view.findViews(subclassOf: UIView.self)        

        return refLibVC.view
    }
    func updateUIView(_ uiView: UIViewType, context: Context) {}
}
```



ただし、こいつが作ってくれるViewControllerにはおせっかいにもNavigationBarとToolBarも含まれます。modal viewで表示するにはシンプルな方がよかったので、下のコードを追加してこいつらを取り除きます。


```DictView.swift
struct DictView: UIViewRepresentable{
//(中略)
func makeUIView(context: Context) -> some UIView {  
        //(中略)
        //内蔵辞書のナビゲーションバー,ツールバーを除去する。 
        let navigationBar = refLibVC.view.findViews(subclassOf: UINavigationBar.self).first
        navigationBar!.removeFromSuperview()
        let toolBar = refLibVC.view.findViews(subclassOf: UIToolbar.self).first
        toolBar!.removeFromSuperview()
        //(中略)
    }
//(中略)
}
```

```DictView.swift
//再帰的?にすべてのSubViewを見つけてきてくれる関数、神。
extension UIView {
    func findViews<T: UIView>(subclassOf: T.Type) -> [T] {
        /*<T: UIView>この表記はジェネリクス関数であることを表す。
         ローマ字は何でも良いが、ここではT。引数はUIView以下のクラスの型。返り値はクラス?*/
        return recursiveSubviews.compactMap { $0 as? T }
        //compactMapに関してはまた今度調べよう!
    }
    
    var recursiveSubviews: [UIView] {
        return subviews + subviews.flatMap { $0.recursiveSubviews }
        //flatmapってなんだよ!
    }
}
```
あとは、ナビゲーションバー,ツールバーを取っ払った分のズレの解消と、セミモーダル(iOS16以降)の実現のために呼び出し元に以下のmodifierを追加。
```ContentView.swift
 .padding(.top,-55)
 .presentationDetents([.medium,.large])
```
ここまで作ると結構いい感じにできます。
![ezgif-3-27d17a631c.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361573/76015ad5-41cb-5842-5f4e-7f79114c6c5d.gif)
もともとこんなに止まっていたのが以下のようにスムーズになりました。やはりUIReferenceLibraryViewControllerを渡してあげるのがいいのかとおもいます。

![ezgif-3-1742b397e4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361573/774da275-4a0a-df6c-abd2-af9152b93b6e.gif)


参考:
https://qiita.com/shtnkgm/items/fac2756599b3dfcb7aa2

https://stackoverflow.com/questions/64764292/how-to-change-uireferencelibraryviewcontroller-view-dismiss-done-button-to-an
memo_20221127

〇自分用メモ

「マークダウン記法」
https://backlog.com/ja/blog/how-to-write-markdown/

「Youtubeからサムネ画像を取得する方法」
https://www.softel.co.jp/blogs/tech/archives/5156
https://www.billionwallet.com/goods/youtube_image.html
【Unity】PhotonとUniVRMを使ってアバター同期できるメタバースを作る際の注意点


# はじめに
:::note warn
2022年11月30日現在、PUN2ならびにPhoton Fusionでは、ランタイム生成されたGameObjectをオンライン同期することができません！！！
:::
特に言いたいことは以上です。PhotonとUniVRMを用いてメタバース開発する際は上記の仕様に要注意です。

気軽にUnityでメタバースを作ろうとなれば、以下の方法を考えると思います。
1. 同期サーバーにPhotonを用いて、アバターにはVRMを採用する
2. ローカルにあるVRMファイルをUniVRMを用いてランタイムロードさせる
3. ランタイムロードしたVRMオブジェクトをPhotonに同期させる

しかしながら、Photonでは上記のやり方ができません。
![tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188551/cb6cf88d-617c-940c-ccf6-70278411a91f.png)
とはいえ、工夫すればVRMオブジェクトを同期できます。
## PhotonとUniVRMを用いてVRMアバターを同期させる一例
以下の手順を踏まえてVRMオブジェクトを同期します。
* VRMファイルをアップロードならびにランタイムロードできるサーバーを構築する
* Photonで位置情報と回転情報ならびにアバター変更RPCを同期させる
* 入室時にサーバーから全員分のVRMファイルをランタイムロードする
* 同期された位置情報と回転情報をVRMオブジェクトにセットする
* 自分もしくは相手のアバター変更時に、サーバーからVRMファイルをランタイムロードする

![tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188551/346161fd-77e3-ab6d-75c3-40c59cd4e824.png)
ネットワークセキュリティーグループについて

●ネットワークセキュリティーグループ
仮想マシンが送受信するネットワークトラフィックを制御するためのファイアウォール機能を提供する。
ネットワークインターフェイスだけでなく、仮想ネトワークのサブネットにNSGを関連づけて使用することもできる。
NSGをサブネットに関連づけることでこうりつよくNSGを管理できる

●NSGの規則
受信セキュリティ規則ち送信んセキュリティ規則がある。

※●ネットワークインターフェイスとサブネットに異なるNSGを関連づけた場合
この場合は、特定のトラフィックを許可する場合は、両方のNSGに許可規則が存在する必要がある。受信トラフィックの場合はサブネットに関連づけたNSGが最初に評価され、次にネットワークインターフェイスに関連づけたNSGが評価される。

※NSGのリージョンとその関連付け先のリソースのリージョンは同じである必要がある。
リソースの関連付けはNSGの作成後に行う必要がある
【QGIS】シェープファイルを表示する

## はじめに
この記事は#30DayMapChallenge2022 26日目の記事です。
テーマはIsland(s)です。
QGISを使って小笠原諸島のポリゴンデータを表示してみます。

![image](https://raw.githubusercontent.com/tjukanovt/30DayMapChallenge/main/images/flyers/30dmc-2022.png)

https://30daymapchallenge.com/

## QGISとは
フリーでオープンソースの地理情報システム
ほとんどのUnixプラットフォーム、Windows、macOS上で動作する

## シェープファイルとは
Esriが提唱したGISデータフォーマット
地物の位置や形状、属性情報を持つベクターデータを格納できる
複数のファイルから構成されており、必須のファイルはshp, shx, dbfの3つ


## 事前準備

既にインストール済みのQGIS（バージョン3.22.3）を使います。
QGISを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/13c801a9-4ba2-7996-cb45-16f32c999cd1.png)

## データダウンロード
国土数値情報から[小笠原諸島データ](https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-A21.html)をダウンロードします。

サイトにアクセスして、最新年度のファイルをダウンロードします。
ダウンロードしたZIPファイルを展開します。

ファイルの中身はこんな感じでした。

![image](https://user-images.githubusercontent.com/83101503/204094032-a5ee26f1-d675-4330-b757-51c64aa6deca.png)

## データ表示
拡張子が.shpファイルを選択してドラッグ&ドロップします、または
レイヤタブから、レイヤを追加＞ベクタレイヤを追加をクリックします。

![image](https://user-images.githubusercontent.com/83101503/204094176-ff900be6-37b5-4928-be71-a932c14ed99f.png)

ソースタイプはファイルを選択し、ソースから拡張子が.shpファイルを選択します。
入力できたら「追加」をクリックします。
![image](https://user-images.githubusercontent.com/83101503/204094298-8321ee0e-2762-4552-bc33-876cbf70ec59.png)


![image](https://user-images.githubusercontent.com/83101503/204094407-9f754579-9963-41c6-8ccc-b20d64672549.png)

小笠原諸島のポリゴンデータを表示できました！

## 参考文献
https://www.esrij.com/gis-guide/esri-dataformat/shapefile/
Mathematics and methods, ボッシュ自動車handbook(英語)11版A.C.<3>

Automotive Handbook countdown Calendar 2022

https://qiita.com/advent-calendar/2022/automotivehandbook

12/3 参加記事です。

ボッシュ自動車handbook(英語)11版(0-1) 課題と記事一覧new

https://qiita.com/kaizen_nagoya/items/a9d2887bf2a7598dc8e5

# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970
Chassis systems, 1108
Chassis control, 1260
Vehicle bodies, 1310
Comfort and convenience, 1392
Safety systems in the motor vehicle, 1410
Vehicle security systems, 1430
Automotive electrics, 1450
Vehicle electrical systems for hybrid and electric vehicles, 1560
Automotive electronics, 1620
Entertainment 1780
Drive assistance and sensors, 1804
Drive assistance systems 1872
Future of automated driving 1934
Appendics, 1940
# Mathematics and methods
no. Number
p. page
v. views
g. goods.
s. stocks

|no.|title|P.|v.|g.|s.|
|:----|:----|--:|--:|--:|--:|
|12|Mathematics https://qiita.com/kaizen_nagoya/items/be563c60f07c87ff103c|204|151|0|0|
|13|Technical Statistics https://qiita.com/kaizen_nagoya/items/36a180bc10252050330e|226|169|0|0|
|14|Finite element method  https://qiita.com/kaizen_nagoya/items/4b6cb82f2324e4e8ab22|234|122|0|0|
|15|Control engineering https://qiita.com/kaizen_nagoya/items/493d0216d2b78913bddf|242|181|0|0|
|16| Artificial intelligence, https://qiita.com/kaizen_nagoya/items/97954bd014dbe68654de|248|223|0|0|


# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d



# Advent Calendar 2022

今年企画した４つのAdvent Calendarと、それぞれの記事一つをご紹介します。

AUTOSAR Advent Calendar 2022

https://qiita.com/advent-calendar/2022/autosar

AUTOSAR References to ISO, IEC, ITU, IEEE, RFC and SEA etc.

https://qiita.com/kaizen_nagoya/items/d7d252211e10a79516df

Automotive Handbook Advent Calendar 2022

https://qiita.com/advent-calendar/2022/automotivehandbook

Basic principles, ボッシュ自動車handbook(英語)11版まとめ<2>

https://qiita.com/kaizen_nagoya/items/24a1ba5da3d09b2a95d1


2022 いいねをいただいた記事ランキング(O.K.版) Advent Calendar 2022

https://qiita.com/advent-calendar/2022/goods

2022年１月下旬　いいねをいただいた記事　16

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

AdCale(O.K.) Advent Calendar 2022

https://qiita.com/advent-calendar/2022/adventcalendar2022

「会議は15分未満」に。小耳にはさんだ話。

https://qiita.com/kaizen_nagoya/items/510c47c5d1e8d03145db

AdvencCalendar2022 報告

https://qiita.com/kaizen_nagoya/items/5b4b99cb9ad571f4094b

誤差の評価が苦手（専門分野以外）

https://qiita.com/kaizen_nagoya/items/cc3a50827b24ab80985f



 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞


# 文書履歴(document history)
ver. 0.01 初稿 　20221203
Kali Linux参考サイト

https://blog.tokumaru.org/

https://myhobbies-blog.net/kalilinux/

https://www.motokis-brain.com/article/97


https://torusblog.org/install-kalilinux-on-windows-using-virtualbox/



https://qiita.com/y-araki-qiita/items/b5e345984d8a076145c8


https://qiita.com/melonattacker/items/caf5de3071db1ae10367


https://qiita.com/Kuroakira/items/5aa5f77d13ee4a108b41



https://shin569.hatenablog.com/entry/2020/04/11/220835



https://qiita.com/HirMtsd/items/ba702c83c70e25670896


https://slacknotebook.com/virtualbox-import-kali-linux-premade-image/



https://renoji.com/IT.php?Contents=OS_Kali/Setting_VirtualBox_Install.html#:~:text=%E3%80%8CVirtualBox%E3%80%8D%E3%81%AB%E3%80%8CKali%20Linux%E3%80%8D%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95&text=%E3%80%8C%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%80%8D%E3%82%92%E9%81%B8%E6%8A%9E%E3%80%82,%E3%81%A7%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E7%94%BB%E9%9D%A2%E3%82%92%E9%96%89%E3%81%98%E3%82%8B%E3%80%82


https://qiita.com/Kuroakira/items/5aa5f77d13ee4a108b41



https://qiita.com/v_avenger/items/745760829f834a854aa1
Intelligent Speech Interactionについて　vol.1

# Intelligent Speech Interactionとは
Intelligent Speech Interactionは、音声認識、音声合成、自然言語理解などの最先端の技術に基づいてリアルタイム音声認識、短文認識、音声合成、記録ファイル認識といったサービスを提供しています。
特徴としては、金融や保険、司法、電子商取引といった専門的な分野にも対応しています。

# 機能
Intelligent Speech Interactionの機能は大きく6つあります。

**1.短文認識**
**1分以内**の短い音声に対する認識機能。
音声検索や音声ショートメッセージなど、短い音声対話をするシーンでの利用が想定されています。
音声アシスタントやモバイルアプリなどに統合することも可能です。

**2.リアルタイム音声認識**
長さにかかわらず、オーディオストリームをリアルタイムで認識し、テキストに変換することができます。
ライブ動画のリアルタイム字幕や会議の議事録などでの利用が想定されています。

**3.記録ファイルの認識**
音声などの録画データから音声データをテキストに変換することができます。
議事録の要約やコールセンターでのセンシティブな単語の検出などでの利用が想定されています。

**4.音声合成**
テキストから自然な響きの音声に変換することができます。
イントネーションや音量の調整ができるため、オーディオブックの読み上げやスマートデバイスに利用することが想定されています。

**5.音声合成スピーカーのカスタマイズ**
トレーニングデータを使用して、スピーカーをカスタマイズすることが出来る機能です。
トレーニングデータは少量で済むため、より人間らしい声を使用したいシーンでの利用が想定されています。

**6.自己学習プラットホーム**
音声認識のパフォーマンスを向上させるのに役立るホットワードトレーニングとカスタム言語モデルを提供しています。
専門用語が多い利用シーンでの音声認識精度を向上させるために利用されることが想定されています。

# 料金
料金タイプは大きく分けて3つあります。
**1.無料試用版**
Intelligent Speech Interactionには無料試用版が準備されています。
従量課金制と異なるのは、利用できるサービスが制限され、期間も限定されています。

**2.従量課金制**
商用版でサービスを利用する際の料金制度です。
サービスによって、請求項目が異なります。
使用量は日単位で清算されます。

**3.リソースプラン**
サービスを使用する前に料金を支払うプラン。
リソースプランのクォータを使い切った後は従量課金制モードに切り替わります。
有効期限が切れるとリソースプランは無効になります。

**各サービスの料金体系**
各サービスの詳細な料金体系については[こちら](https://www.alibabacloud.com/help/en/intelligent-speech-interaction/latest/pricing#conbody-6b4-x5d-06o)。

* リアルタイム音声認識
    * 処理されたスピーチの合計時間
    * 無料試用版
        * 同時通話数が2件以内であれば、1日あたり無制限に利用
        * 期間は3か月間
* 短文認識
    * サービスが呼び出された回数
    * 無料試用版
        * リアルタイム音声認識と同様
* 記録ファイルの認識
    * 処理された録音ファイルの合計時間
    * 無料試用版
        * 各暦日に最大合計2時間まで
        * 期間は3か月間
* 音声合成
    * サービスが呼び出された回数
    * 無料試用版
        * リアルタイム音声認識と同様
* 自己学習プラットフォーム
    * カスタム言語モデルは最大10個まで無料で作成できる
* 音声合成スピーカーのカスタマイズ
    * 別途お見積り

# SDK
一部のサービスはSDKが用意されています。
それぞれのSDKで利用可能な言語はこちら。

|サービス名|言語|
|:---:|:---:|
|短文認識|Java/C++|
|リアルタイム音声認識|Java/C++|
|音声合成|Java/C++|

# 対応言語
現時点では、中国語、広東語、英語、日本語、韓国語、フランス語、インドネシア語に対応しているとのこと。

# まとめ
多機能ではありますが料金体系が少し複雑なことと、SDKの対応言語が少ない印象です。
次回、実際に触りながら色々と確認していきたいと思います。
Homebrew インストール for Mac M2

# The introduction
M2チップのMacを購入して開発環境を構築してみた。

# The main body
## install

https://brew.sh/index_ja

```shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
M2チップだと、パスを要求されるので、指示通りに下記2点をやればOK。

```shell
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/{User name}/.zprofile
```

```shell
eval "$(/opt/homebrew/bin/brew shellenv)"
```

下記とかで反応よければOK。
```shell
brew help
```

# The end
M2チップマシンになったからって、なんでパスを要求されたんだろか。
Deno fresh で <html lang='en'> の言語を変更する

### なに？
Deno 上で動く [fresh](https://fresh.deno.dev/) で出てくる `html` が `lang='en'` なのを `lang='ja'` に変えたいときにやるやつです。
まだ発展途上のフレームワークなので、ドキュメントに書いてなかったり破壊的変更があったりするので注意です。この記事は [v1.1.2](https://deno.land/x/fresh@1.1.2) が対象です。

### こうする
`main.ts` で以下のようにするとできます。

```ts:main.ts
const render: RenderFunction = (ctx, render) => {
  ctx.lang = "ja";
  render();
};

await start(manifest, { render, plugins: [twindPlugin(twindConfig)] });
```

### 感想
さいしょ Plugin とかでやるのかな～とか思ってたんですけど Plugin は生成された html に応じて js と css を挿入するやつっぽいです。
GitHub の Issue に同様の質問があったのでそこにワークアラウンドがありました。感謝。
https://github.com/denoland/fresh/issues/920#issuecomment-1327961106

ドキュメントが充実するといいですね～
YOLOを触ってみた。

# はじめに
YOLOを触ったことなかったので、YOLO v5を触ってみました。

## 参考
２つの記事を参考にしました。

https://laid-back-scientist.com/yolo-v5

https://www.alpha.co.jp/blog/202108_02

## まずは動かす
まずはYOLO v5lを使って、うちのネコ2匹を認識するか確認します。
* 2匹ver.
![n_1 小.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610302/58f788eb-4e49-bb2e-06ce-fc28953fef8c.jpeg)
* 1匹-1ver.
![n_2 小.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610302/6551f7fc-e800-e1e1-d1a1-cc61a09ec9d4.jpeg)
* 1匹-2ver.
![n_3 小.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610302/fa59a216-2d46-6d9a-f9e6-640791b410a6.jpeg)

2枚目に2つ枠があって怪しい（違う何かと認識？？）ですが、とりあえずネコと認識してくれています。


## 学習させてみます
全く別のものは認識してくれると思いますので、今回は2匹のネコをそれぞれ認識してくれるか確認します。

では、2匹のネコの名前で学習させます。
Train　50枚
Test　5枚
Val　5枚

* 2匹ver.
![n_1 小.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610302/f18e9e2e-2a72-6298-3611-50eaf647d8f9.jpeg)
* 1匹-1ver.
![n_2 小.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610302/1ffb533d-5ca9-3c18-b72d-cf5297c73562.jpeg)
* 1匹-2ver.
![n_3 小.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610302/4958b0e8-3ad8-0512-f6e4-f27ca47a6bae.jpeg)
ネコであると同時にそれぞれの名前も認識してくれています。
※3枚目の枠が2つあるけど、位置情報の設定間違えたかな・・・

# まとめ
YOLO v5を触ってみましたが、学習までとても簡単に行えました。
ホコリを被っているラズパイを引っ張り出してネコ様悪巧み監視システムを作ってみようと思います。

またいつの日か・・・
Ubuntu 22.04 のビープ音を消す方法

## はじめに

Ubuntu を操作しているとよくビープ音（警告音）が鳴りますよね。長らくまぁいいかと思ってそのままにしていたのですが、やはり気に障るので消すことにしました。

## TL;DR

`Terminal` を開いて、以下を実行しましょう。

```sh
gsettings set org.gnome.desktop.wm.preferences audible-bell false
```

## ビープ音タイプを変更する方法

ちなみに、ビープ音のタイプを変えたい場合は、`システム設定->サウンド`から変更できるようです。
![Screenshot from 2022-11-26 19-15-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/a248f931-6f8e-2743-a1cc-b0c518a57fff.png)
【SwiftUI】Menuのボタン順番について

# はじめに
意識したことがないとあまり気づかないと思うのですが、
`Menu`内のボタンの表示される順番は、
`Menu`の`label`に近い方向から順番に表示されます。

|||
|-|-|
|![スクリーンショット 2022-11-26 22.09.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/70f5ed16-ec17-1345-23ad-42c65749724a.png)|![スクリーンショット 2022-11-26 22.09.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/93465353-7186-5760-56ef-c014a490a5d7.png)|

どこに配置されていても上から表示されてほしい場合があります。
そんな時の解決方法を紹介しようと思います。

# 解決方法
```diff_swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Menu {
                Button("ボタン1") { }
                Button("ボタン2") { }
                Button("ボタン3") { }
                Button("ボタン4") { }
                Button("ボタン5") { }
            } label: {
                Text("メニューボタン")
            }
+           .menuOrder(.fixed)
            Spacer()
            Menu {
                Button("ボタン1") { }
                Button("ボタン2") { }
                Button("ボタン3") { }
                Button("ボタン4") { }
                Button("ボタン5") { }
            } label: {
                Text("メニューボタン")
            }
+           .menuOrder(.fixed)
        }
    }
}
```

|||
|-|-|
|![スクリーンショット 2022-11-26 22.12.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e5e64f60-e366-a254-8060-93a12c5c4998.png)|![スクリーンショット 2022-11-26 22.12.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/eca86e79-4b6d-b726-f33f-b1244d71d789.png)|

# おわり
iOS16からしか使えないです😭

https://developer.apple.com/documentation/swiftui/grid/menuorder(_:)
PythonでOpenImageIO(OIIO)を使ってOpenEXRをJPEGに変換する

# 自己紹介
株式会社digitalbigmoのパイプラインエンジニアの小池@plinecomです。

# これは何？
私はOpenEXR推しの人なんだけれど、OpenEXRを簡単にプレビューできないことは良くあるので、JPEGあたりに変換したいと思ったのだ。でも、すでに何千万枚もあるし、今後も増えるので、Pythonで処理したい。そこで、普通はOpenCVってなるところなんだけど、OpenImageIOという便利そうな仕組みがある事を知ったので、こちらを利用することにした。OpenImageIOの方が[対応しているファイル形式](https://openimageio.readthedocs.io/en/latest/builtinplugins.html#bundled-imageio-plugins)も多いし、画像データをNumPy配列で扱うので、後々色々便利だと思うのだ。特にDPXにも対応しているっぽいのがポイント高いと思った。

# コード（低レベルAPI版）
```python:low.py
import OpenImageIO as oiio
import glob

if __name__ == '__main__':

    for path in glob.glob('/foo/bar/*.exr'):
        print(path)
        jpg_path = path.replace('.exr', '.jpg')

        #Read File
        inp = oiio.ImageInput.open(path)
        spec = inp.spec()
        pixels = inp.read_image("float")
        inp.close()

        #Write File
        out = oiio.ImageOutput.create(jpg_path)
        out.open(jpg_path, spec)
        out.write_image(pixels)
        out.close()
```

# コード（高レベルAPI版）
```python:high.py
import OpenImageIO as oiio
import glob

if __name__ == '__main__':

    for path in glob.glob('/foo/bar/*.exr'):
        print(path)
        jpg_path = path.replace('.exr', '.jpg')

        #Read File
        buf = oiio.ImageBuf(path)

        #Write File
        buf.write(jpg_path)
```

# 必要なPython外部モジュール
* OpenImageIO
* NumPy

Dockerfileも用意した。
```Dockerfile:Dockerfile
FROM rockylinux:8
RUN dnf install -y which python3 epel-release
RUN dnf config-manager --set-enabled powertools
RUN dnf install -y python3-openimageio python3-numpy
```
```terminal:terminal
docker pull plinecom/py_oiio
```

# 低レベルAPI版のコードの説明
NumPyの配列を取ろうとするなら、低レベルAPIを使う方が早い。（高レベルAPIからNumPy配列を取る方法もある）

## EXRファイルの読み込み方法の指示
```python:
        #Read File
        inp = oiio.ImageInput.open(path)
        spec = inp.spec()
        pixels = inp.read_image("float")
        inp.close()
```
read_image()関数から取得できるオブジェクトpixelはNumPy配列である。せっかくOpeEXRなので、画像データはfloat型で出してもらうように指示を出している。

## 画像の書き出しと変換方法の指示
```python:
        #Write File
        out = oiio.ImageOutput.create(jpg_path)
        out.open(jpg_path, spec)
        out.write_image(pixels)
        out.close()
```
書き出し先とファイル名を指示する。拡張子をもとに画像形式を自動で処理してくれるので、拡張子を変えれば、OpenImageIOが対応している形式に出してくれる。
# 高レベルAPI版のコードの説明
特にない。読み書きそれぞれ１行しかないし、見ればわかるはず。

# 宣伝
株式会社digitalbigmoでは美肌プラグインの販売や映像VFXの制作業務を行なっています。ご興味のある方は、webページを見にきてください。一緒にお仕事しましょう。

https://digitalbigmo.com

# 参考文献
[OpenImageIO本家（英語）](https://sites.google.com/site/openimageio/home)
[OpenImageIO本家リファレンス（英語）](https://openimageio.readthedocs.io/en/latest/index.html)
Flask スクレイピングアプリ最終章〜結果を表示する〜

https://qiita.com/sasao-genmaicha/items/0234f7ac12bbd54c2602

前回の記事👆ではAPIを使って欲しい情報を取得したので今回はブラウザ上にそれらを表示したいと思います。


https://app-rank-git1.herokuapp.com/

👆こちらは完成したアプリです。GitHubでスター数が多い人気リポジトリーTOP5をスクレイピングしてます。




まずはresults.html

```python:result.html
{% extends 'base.html' %}

{% block body %}
<div class="card text-center" style="margin: 150px;">
    
{% for result in results %}
    
       <h3>{{ result }}</h3> 
     
{% endfor %}

<form action="/">
    <button class="btn btn-secondary" type="submit">戻る</button>
</form>
</div>   
{% endblock %}
```

こちらのHTMLはシンプルに仕上げました。まずは上から順に説明します。

<p>{% extends 'base.html' %}</p>
こちらはflaskのお決まりの呪文。HTMLタグやHEADタグは別のbase.htmlに置いてそこから引っ張ってきてます。コードがスッキリしていい感じ。

<p>{% block body %}</p>
そしてこちらのblockからbody部分を書いていきたいと思います。

（注: block直下のdivタグですがこれはbootstrapでデザインを整えてます。今回は結果表示の解説メインなのでこちらは割愛します）

まず５つ取った結果をfor文で回し表示させます。FlaskではHTMLでもfor文が使えるので大変ありがたい。
使い方は波括弧とパーセント記号で囲むだけ。ただ注意したいのは結果を入れた変数（今回はresult）は二重の波括弧で囲う必要があります。
そして最後に再び波括弧とパーセントでendforと書くだけ。
慣れてしまえば割と記述方法は簡単だと思います。




ちなみにこの右側の変数resultsはどこから来ているのかというと、
{% for result in results %}
　　　　　　　　👆これ

```python:app.py
app.route('/results', methods=['POST'])
def do_scraping():
    results = git.git_api()
    return render_template('results.html', results=results)

```
前に他の記事で紹介したapp.pyから来てます。

関数do_scraping()の中でTOP5の結果が入ってる別の関数git_api()を引っ張ってきてresultsに格納してます。そしてそのresultsは直下のrender_templateでさらに同じ名前のresultsに格納してます。

・・・なんかわかりずらいですね汗

順番としては..
前回紹介したファイルgit.pyをインポートしそのファイル内にある関数git_api()を呼び出してます。
pythonのお決まりの書き方で.pyを省略して書きます。なのでgit.git_api()に書き直して変数resultsに入れます。

この時点でresultsには関数git_api()が入ってます。関数git_api()には既にTOP5の結果が入ってます。・・ということはresultsにはもうTOP５が入ってるワケですね。

そしてそのTOP5をさらにrender_template内で変数resultsに入れます（！？）


これ名前が一緒だからややこしいんですがこの時のresults=resultsは、右側がたった今TOP５を入れたresults、左側がHTMLで使うresultsなんです。

そう、さっきfor文で回したresultsはここで作られてたんですね。

（ちなみにこの二つの変数、名前を一緒にする必要はありません。なので左側をたとえばresults_for_htmlみたいな名前にしてもオッケーです。ただ他の方々が解説してるのを見ると名前の統一は一般的みたいです。その方がシンプルな記述になるからだと思いますが慣れない内は変数名を変えて工夫してみましょう）

これでやっとHTMLにTOP5が表示できます。

仕上げにformタグでボタンを作って最初のページに戻れるようにしましょう。
![スクリーンショット 2022-11-26 13.29.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980135/e6e3f5b2-9543-c06e-7fc5-2a66c11e9a34.png)
actionでTOPページのURLについてるスラッシュを指定します。buttonを作りTOPページに戻れるように"submit":stuck_out_tongue_closed_eyes:


これでひとまず最低限の機能を備えたスクレイピングアプリが完成しましたね。ふぅ・・


これからもっとデザインを調整したり機能を追加してポートフォリオにしたいと思います。
次はbootstrapをマスターしてその辺の解説も追加予定。

まだまだ課題は残ってますがこれでひとまずスクレイピングアプリ編は終了。
はぁ、長かった・・w







ここまで読んでくださった方、本当にありがとうございます。次回はbootstrapとか、もっとスクレイピングに特化した記事を書きたいと思います:grinning:
【Linux】ファイルの変更部分のみ取得する方法

## はじめに

以下のような2つのファイルがある場合に内容を比較して変更箇所のみ取得する方法について記載します。  

```old.txt
変更なし
変更なし
変更なし

```

```new.txt
変更なし
変更なし
変更あり
追加
追加
追加

```

## `diff`コマンド

`diff`コマンドを使用して次のように実行することで変更箇所のみ取得できます。  

```terminal
$ diff --old-line-format='' --unchanged-line-format='' --new-line-format='%L' old.txt new.txt
変更あり
追加
追加
追加
```

- `--old-line-format`
  1番目のファイルだけにある行の出力に使用するフォーマットを設定する。  
- `--unchanged-line-format`  
  両方のファイルに共通な行の出力に使用するフォーマットを設定する。  
- `--new-line-format`  
  2番目のファイルだけにある行の出力に使用するフォーマットを設定する。  
- `%L`  
  行頭などに何もつけず1行ずつ出力する。
  `+%L`とすると以下のようになります。  

  ```terminal
  $ diff --old-line-format='' --unchanged-line-format='' --new-line-format='+%L' old.txt new.txt
  +変更あり
  +追加
  +追加
  +追加
  ```

  また`%l`とすると以下のようになります。  

  ```terminal
  $ diff --old-line-format='' --unchanged-line-format='' --new-line-format='%l' old.txt new.txt
  変更あり追加追加追加
  ```

## `comm`コマンド

`comm`コマンドを使用して次のように実行しても変更箇所のみ取得できます。

```terminal
$ comm -13 old.txt new.txt
変更あり
追加
追加
追加
```

- `-13`  
  `old.txt`のみに含まれる行と両方のファイルに含まれる行を出力しないようにする。  
  すなわち変更や追加があった行のみ出力する。  

ただしファイルが`sort`されていない正しく比較できず以下のようなエラーが出力されます。  

```terminal
comm: file 2 is not in sorted order
comm: input is not in sorted order
```

これを出力させないようにするには`sort`してから`comm`するか`sort`する必要のない場合には以下のようにオプションを付けます。

```terminal
comm --nocheck-order old.txt new.txt
```
Finchのイメージ格納先ディレクトリを変更する

# はじめに

Docker Desktop の代替となる Finch というアプリケーションが AWS より発表された｡
選択肢が増えることは非常に嬉しいニュースであり､期待を持って受け入れている｡

https://github.com/runfinch/finch

Dockerを使用していると､いつの間にかコンテナイメージが肥大化していてメインストレージを圧迫しているなんてことはありがちだと思う｡Docker DesktopであればGUIから格納先を変更することも可能であるが､いかんせん `v0.1.0` としてリリースされたばかりのFinchにはそんな機能はない｡

そんなFinchのイメージ格納先ディレクトリを変更する手順について記載する｡

## 注意

内容は私の環境での調査結果であり､ `v0.1.0` とまだまだ開発の途上にあるアプリケーションであるため､十分な知識のもと自己責任において操作して欲しい｡

# 結論

コンフィグファイルとおぼしきファイルを一通り見たが､イメージの格納先に関する設定項目は見当たらなかった｡
イメージの場所を特定し､外付けSSDにシンボリックリンクを張ることで対応した｡

```zsh
# finch vm init は事前に実行しておく

# Finchは事前に停止させる
finch vm stop

# 新しいパスを指定
NEW_IMAGE_PATH="/Volumes/exssd/finch/diffdisk"

# イメージファイルを外付けSSDに移動
mv "/Applications/Finch/lima/data/finch/diffdisk" "${NEW_IMAGE_PATH}"

# シンボリックを作成する
ln -s "${NEW_IMAGE_PATH}" "/Applications/Finch/lima/data/finch/diffdisk"
```


# イメージの場所

`aarch64` で動く `macOS 12.6` の場合､ GitHub の pkgファイルからインストールすると､ `/Applications/Finch` にファイルが展開される

VMエンジンは lima が使用されている


インストール手順に従い､　`finch vm init` を実行すると `/Applications/Finch/lima` の下に `data` というディレクトリが作成された｡

```zsh
$ ls -l /Applications/Finch/lima/data/finch
.rw-r--r-- 494M finch 26 11 20:21 basedisk
.rw-r--r-- 204M finch 26 11 20:21 cidata.iso
.rw-r--r-- 573M finch 26 11 20:28 diffdisk
srw-------    0 finch 26 11 20:22 ga.sock
.rw-r--r--    6 finch 26 11 20:21 ha.pid
srwxr-xr-x    0 finch 26 11 20:21 ha.sock
.rw-r--r--  29k finch 26 11 20:27 ha.stderr.log
.rw-r--r--  167 finch 26 11 20:22 ha.stdout.log
.rw-r--r-- 7.6k finch 26 11 20:21 lima.yaml
.rw-------    6 finch 26 11 20:21 qemu.pid
srwxr-xr-x    0 finch 26 11 20:21 qmp.sock
.rw-r--r--  46k finch 26 11 20:27 serial.log
srwxr-xr-x    0 finch 26 11 20:21 serial.sock
srw-------    0 finch 26 11 20:22 ssh.sock
```

直感的にこのディレクトリが怪しいと､ `/Applications/Finch/lima/data/finch` 以下のディレクトリを監視しながら `finch run` や `finch compose build` などの操作を行った結果､ `diffdisk` というファイルに大きな変化があった｡

```zsh
$ ls -l diffdisk
.rw-r--r-- 558M finch 26 11 20:23 diffdisk

$ ls -l diffdisk
.rw-r--r-- 1.2G finch 26 11 20:33 diffdisk
```

挙動を観測する限り `/Applications/Finch/lima/data/finch/diffdisk` にイメージが格納されていると思われるので､このファイルのみAPFSでフォーマットされた外付けSSDに移動させたのち､シンボリックを張ることで対応した｡(前述)

# さいごに

環境がいい感じに壊れまくっててDocker動かなくなってて困ってたけどOS入れ直すのもめんどくさいなーってなってた所に使えそうなものが登場したのでしばらくはこの壊れた環境とともに生きていけそうです！！！(ぇ…)
OpenCVで画像処理（平滑化）

# はじめに
こんにちは！
[MYJLab Advent Calendar 2022](https://qiita.com/advent-calendar/2022/myjlab)の10日目は私が担当します。よろしくお願いします！
昨日は、@Glen-Maki さんの[XGBoostでチャンピオンズカップを予想してみたという話](https://qiita.com/Glen-Maki/items/fa97ed8c3039f39f957c)でした。
こちらの記事も是非ご覧ください！

# この記事でやりたいこと
Google Colaboratory上でOpenCVの機能を使って画像処理をおこないます。
今回は、画像の平滑化をしていきます。

# やってみる
早速ですが、はじめていきましょう！

## 環境
私は"Google Colaboratory"を使用しました。

## 準備
今回はGoogleDrive内の画像を使用するので
以下の方法でGoogle ColaboratoryからGoogleDriveへアクセスできるようにします。

```
from google.colab import drive
drive.mount('/content/drive')
```

また、Google ColaboratoryでOpneCVとMatplotlibを使用できるようにします。
Matplotlibは、画像を表示するために使用します。

```
import cv2
from matplotlib import pyplot as plt
```

次に、処理をする画像を指定します。
このように、処理したい画像を置いているディレクトリのパスとファイル名を繋げたものを記述します。
```
IMG_FILE = '処理したい画像を置いているディレクトリのパス + ファイル名'
```
私は、GoogleDriveのMy Drive下にある'image'というディレクトリの中に置いている'bear.jpg'という画像を処理したいので、'/content/drive/My Drive/image/bear.jpg'と記述しました。

そして、下記の方法で画像を読み込みます。
OpenCVはMatplotlibと色の並びが異なるので、cvtColorを用いて色の並びを変換します。


```
img = cv2.imread(IMG_FILE, cv2.IMREAD_UNCHANGED)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
```

ここまでの手順で加工前の画像を表示する準備ができました。
実際にこちらの記述を追加して画像を表示してみましょう。
※plt.axis('off')は軸を消去するための命令です
```
plt.axis('off')
plt.imshow(img_rgb)
```
実行結果はこのようになります。可愛いですね。
![bear_処理前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2287469/0572a1c1-73e1-0348-650b-c1c2321534bc.png)




## 本題
さて、ここからが本題になります。

ここまでの準備で画像が表示できるようになったので、
ここからは画像処理をおこなっていきます。

OpenCVで画像を平滑化する方法は複数あるようですが、
今回はcv2.blurを使用して平滑化します。
※数値を大きくするほど平滑化具合が強くなります。
```
img_blurred = cv2.blur(img_rgb, (50, 50))
```
準備の時と同様に、画像を表示します。

```
plt.axis('off')
plt.imshow(img_blurred)
```

## 実行結果
実行結果はこのようになります。無事に平滑化できたようです。

![bear.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2287469/3288f71f-30eb-c09f-8800-a8347f03301c.png)

# おわりに
今回は、OpenCVで画像を平滑化してみました。
何か問題などがございましたら、ご指摘いただけますと幸いです。宜しくお願い致します！

最後までお読みいただき、ありがとうございました。
[MYJLab Advent Calendar 2022](https://qiita.com/advent-calendar/2022/myjlab)には面白い記事がたくさんあるので、是非ご覧ください！

# 参考
+ [Google Colaboratoryで画像処理(初級編)](https://qiita.com/croquette0212/items/36cadce5bf0fb703ed19)
+ [PythonでOpenCVの画像データをMatplotlibで表示する](https://water2litter.net/rum/post/python_cv2_bgr2rgb/)