OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL5.7をインストールする方法

##背景
EC2内にmysqlがインストールされていなかったのでmysql5.7をインストールしたい

##まず最初に

```
sudo yum update -y
```

をしてパッケージをupdateします。

そして


```
sudo yum remove -y mariadb-libs
```

でデフォルトで入っているmariaDBを消します。

##MySQLをyumに追加する

```
sudo yum isntall -y https://dev.mysql.com/get/[Red Hat Enterprise Linux 7をダウンロードしたリンク]
```

Red Hat Enterprise Linux 7をダウンロードしたリンクは↓のリンクのLinux7をインストールしてNo thanks, just start my download.を押すとダウンロードされます。
 https://dev.mysql.com/downloads/repo/yum/

##MySQLを有効化

```
yum repolist all | grep -E "mysql[0-9]+-community/x86"
``` 

でMySQLを確認してみるとデフォルトではMysql8.0が有効化されていると思うので、これを5.7に変えます。

```
sudo yum-config-manager --disable mysql80-community
```

でMySQL8.0を無効化し、

```
sudo yum-config-manager --enable mysql57-community
```

で5.7を有効化します。

```
yum repolist all | grep -E "mysql[0-9]+-community/x86"
```

で5.7が有効化されていることを確認したら、いよいよ5.7のインストールと起動を行なっていきます。

##MySQLのインストールと起動！

```
sudo yum install -y mysql-community-server
```

でMySQLをインストール。

```
sudo systemctl start mysqld
```

でmysqldを起動します。

*ちなみにmysqldとはMySQLのデーモン（MySQLをバックエンドで動かしているものです）

```
systemctl status mysqld.service
```

でMySQLが動いていることを確認します。

```
sudo systemctl enable mysqld
```

でmysqldを自動で動かせるようにしておきます。

```
mysql --version
```

でMySQLのversionが5.7になっていれば成功です
PyQt5のチュートリアルを動かす ① Hello World 

# はじめに

以下のサイトを参考にPyQt5のチュートリアルを動かしてみました。

https://www.tutorialspoint.com/pyqt5/pyqt5_hello_world.htm


# サンプル1

最初のサンプルです。

```python:sample1.py
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
def window():
   app = QApplication(sys.argv)
   w = QWidget()
   b = QLabel(w)
   b.setText("Hello World!")
   w.setGeometry(100,100,200,50)
   b.move(50,20)
   w.setWindowTitle("PyQt5")
   w.show()
   sys.exit(app.exec_())
if __name__ == '__main__':
   window()
```

実行結果

![Screenshot from 2021-11-28 18-06-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/3bced8db-901c-c30d-1375-91ab99bad5ab.png)

=== プログラムの説明 ===

このプログラムは以下の流れで処理を行っています。
1.PyQtに含まれる`QtCore`,`QtGui`,`QtWidgets`モジュールをインポート
2.アプリケーションオブジェクトの`QApplication`クラスを生成
3.`QWidget`で最上位のウィンドウを作成し,`QLable`オブジェクトを設置
4.ラベルに"hello world"という文字を記載
5.`setGeometry()`メソッドでウィンドウのサイズと位置を定義
6.`app.exec_()`メソッドでアプリケーションのメインループに入る

# サンプル2

また、先程のコードをオブジェクト志向の様に作成することも可能です。

その場合のコードは以下のようになります。

```python:sample2.py
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class window(QWidget):
   def __init__(self, parent = None):
      super(window, self).__init__(parent)
      self.resize(200,50)
      self.setWindowTitle("PyQt5")
      self.label = QLabel(self)
      self.label.setText("Hello World")
      font = QFont()
      font.setFamily("Arial")
      font.setPointSize(16)
      self.label.setFont(font)
      self.label.move(50,20)
def main():
   app = QApplication(sys.argv)
   ex = window()
   ex.show()
   sys.exit(app.exec_())
if __name__ == '__main__':
   main()
```

実行結果です。

![Screenshot from 2021-11-28 18-26-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/da333da6-db23-ae05-07d0-b14e2258f95f.png)

=== プログラム説明 ===

先程のプログラムと違う点については`QWidget`クラスを元にしたwindowクラスを宣言しているところです。これによって,1つ1つのwidgetを独立して作成していき、それを組み合わせることで大きなGUIプログラムを作成していくものと予想できます。

# さいごに

QApplicationというクラスがPyQtのアプリを内部で管理しているのでしょうか?
今後もサンプルを動作させていき理解を深めて行ければなと思います。

# 次回

次回はモジュールやツールのまとめです。

https://qiita.com/hoshianaaa/items/301f07e6e87abb6979a3
AtCoder Beginner Contest 229の[C - Cheese]をSwiftで

SwiftでAtCoder Beginner Contest 229の[C - Cheese]を解きました。

## 問題内容

>問題文
ピザ屋で働く高橋くんは、まかないとして美味しいチーズピザを作ることにしました。
今、高橋くんの目の前に N 種類のチーズがあります。
i 種類目のチーズは 1 [g] あたりのおいしさが Aiで、Bi[g] あります。
ピザのおいしさは、ピザに乗せたチーズのおいしさの総和で決まります。
但し、チーズを使いすぎると怒られてしまうため、乗せたチーズの重さは合計で W [g] 以下である必要があります。
この条件のもとで、可能なピザのおいしさの最大値を求めてください。

https://atcoder.jp/contests/abc229/tasks/abc229_c

## 解答コード

```swift
func abc229C(){
    var aa = readLine()!.split(separator:" ").map{Int($0)!}
    let n = aa[0]
    var w = aa[1]
    var result = 0
    var array : [[Int]] = []
    
    for _ in 0..<n { array.append(readLine()!.split(separator:" ").map{Int($0)!}) }
    array.sort{$0[0] > $1[0]}
    
    while w > 0{
        for i in 0..<n {
            if array[i][1] <= w{
                result += array[i][0] * array[i][1]
                w -= array[i][1]
            }
            else{
                result += array[i][0] * w
                w = 0
            }
        }
        break
    }
    print(result)
}
abc229C()
```
AとBの配列の配列、二次元配列を作って、A(1gあたりのおいしさ)が大きい順に並び替えを行います。

あとは重さのキャパが0になるまでチーズの重さを追加していきます。

追加する際にはBをすべて使えるか、一部しか使えないかで振り分けしています。

## Swiftのお役立ち情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
Goのソースコードのファイル名の末尾が_ios.goだとビルド対象にならない

# 問題
Goで以下のファイル名を使うと多くの場合に問題が生じます。
なぜでしょうか？

```
hoge_ios.go
```

# 解答
ファイル末尾の `_ios.go` がbuild constraintだとみなされるため。
Goにはビルド対象の環境毎にソースコードを変えることができるbuild constraintという仕組みがあります。

https://pkg.go.dev/go/build#hdr-Build_Constraints

そのため、Windows環境でのみ利用できる機能とLinux環境でのみ利用できる機能を混在させることもできます。
この指定はファイルの先頭に以下のように書くことができますが、ファイル名で指定することもできます。

```go
// +build windows
```

ファイル名で指定する場合は、ファイル名の末尾を `_windows.go` とすると、上記と同じ効果が得られます。


windowsやlinuxなどは良く知られたものなので、目にする機会も多いかと思います
しかし、このbuild constraintに指定できる対象は意外な程に多いです。
以下のドキュメントにかかれているもの全てが対象になります。

https://go.dev/doc/install/source#environment

特にiosやjsは文字数が少なく、これらの環境向けのGoバイナリを生成することがほぼないため、問題が発生した場合に発見が遅れがちです。
ディレクトリ内の全てのファイルがbuild constraintによってビルド対象から除外された場合は、以下のエラーが発生しますが、そうでない場合は未定義の関数や構造体に関するエラーとしてコンパイルエラーになることが多いです。

```
build constraints exclude all Go files in XXXXX
```
condaとpipとTensorFlow【Python】

# はじめに
Anaconda環境でTensorFlow2.4.1を用いてコードを書いていたのですが、TensorFlow2.6以降に追加された関数を利用したかったので、下記のようにcodnaインストールできるバージョンを探してみました。

```bash
conda search tenosrflow-gpu
```

すると、「tensorflow-gpu 2.4.1」（Anacondaのバージョンによっては「tensorflow-gpu 2.5.0」）が最新のバージョンとなっており、望む結果ではありませんでした。

#conda install tensorflow と tensorflow-gpu
TensorFlow2.x系は基本的にGPUを用いるので、「tensorflow」と「tensorflow-gpu」のどちらをインストールしてもGPUを用いることができるらしい（先に結論：condaではできない）ので、インストール可能な「TensorFlow」のバージョンを調べてみました。

```bash
conda search tensorflow
```

すると、「tensorflow 2.6.0」が最新のバージョンとなっていました。試しに（以下、失敗しますが）「tensorflow 2.6.0」を念のため仮想環境内でインストールしてみます。

```bash
conda create -n tf260 tensorflow=2.6.0
```

これで、TensorFlow2.6.0をインストールすることができたので、Pythonを起動してGPUを認識できているかを確認します。

```python:GPUを認識しているかどうかを確認するコード
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```

結果、GPUを認識していなことが分かります。ここから、conda installでGPUを利用したい場合は「tensorflow-gpu」をインストールする必要があるということが分かりました。

# ~~解決策はpip~~
~~Anacondaを利用する際には基本的にconda installを利用するように心掛けていますが、今回は仕方ないのでpip installを用いることにします。念のため仮想環境内で作業します。~~

```bash
conda create -n tf260pip pip
conda activate tf260pip
pip install tensorflow==2.6.0
```

~~これで正常にtensorflow2.6.0をインストールすることができました！では、GPUを認識しているかどうかを確認してみると（先ほどのコードを再利用）、しっかりとGPUを認識していることが分かります！~~

# conda install でGPUに対応したTensorflowをインストール
conda installする際にビルドを指定することで、CUDAやcuDNNも同時にインストールすることができるようです。詳しくは以下の記事に記載しています。
[conda install のみでTensorFlowとGPU環境（CUDA、cuDNN）を構築する](https://qiita.com/ktokey/items/7ee9c112198a6b0b5709)

# まとめ
知っている方も多いと思いますが、condaとpipでインストールする際の参照先は異なります。condaの場合でGPU環境を利用したいなら「tensorflow-gpu」をインストールする必要がありますが、pipの場合は「tensorflow」をインストールすることでGPUを認識することができるようです。
Intellijでjlinkビルドエラーが出たとき文字化けした話

Intellij IDEA Ultimateを使ってJavaFXアプリケーションを開発しているとき、jlinkを使ってビルドしたくなって設定に`clean javafx:jlink`と入力した。
そしたらなんと!!エラーが出てビルドが失敗してしまったのだ...
エラーを読んでググって解決すればいいと思ってエラー文を見ると

```
[WARNING] Required filename-based automodules detected. Please don't publish this project to a public artifact repository!
�G���[: jlink�ł͎������W���[���͎g�p�ł��܂���: file:///C:/Users/mfmii/.m2/repository/net/synedra/validatorfx/0.1.13/validatorfx-0.1.13.jar�����validatorfx
[ERROR] Command execution failed.
```

...読めない

そう、文字化けが発生してしまったのだ!!

## 原因を探る
コンソール側はUTF8なので、ビルドしたときのエラーメッセージが日本語でUTF8でなかったと思われる。
文字化けした文字コードを解析するとUTF-8なんで、ナニカからUTF8になって文字化けが発生したのだろう。
これはShift_JISだろうと思いネットの文字化け修正サイトで直してみた。しかし...

```
string(265) "?ｽG?ｽ?ｽ?ｽ[: jlink?ｽﾅは趣ｿｽ?ｽ?ｽ?ｽ?ｽ?ｽW?ｽ?ｽ?ｽ[?ｽ?ｽ?ｽﾍ使?ｽp?ｽﾅゑｿｽ?ｽﾜゑｿｽ?ｽ?ｽ: file:///C:/Users/mfmii/.m2/repository/net/synedra/validatorfx/0.1.13/validatorfx-0.1.13.jar?ｽ?ｽ?ｽ?ｽ?ｽvalidatorfx"
```

逆に解読不可能になった。

## 解決策1
とりあえず[もじばけらった](https://lab.kiki-verb.com/mojibakeratta/index)を使用して総当りしてみる。

結果: 惨敗
もう解読不可なんてレベルじゃないナニかができた

## 解決策2
Intellij IDEAでjavaの文字コード、言語を切り替えてとりあえず英語でもなんでもいいから出そうとしてみる。

結果: 変わらない
どんだけ設定いじっても文字化けしたままだった

## 解決策3
Intellij IDEAのコンソール出力をShift_JISに切り替えてみる。

結果: どうやって変えるのかわからない
教えて下さい...

## 最終解決策
Intellij IDEAを使わずにコマンドプロンプトから実行する。

```
cd /d G:\...\demo\
C:\Users\mfmii\.jdks\adopt-openjdk-11.0.12\bin\java.exe <省略> clean javafx:jlink
```

結果: できた

結局Shift_JISで正しかったらしい
ちなみにエラーはこいつだった

```
エラー: jlinkでは自動モジュールは使用できません: file:///C:/Users/mfmii/.m2/repository/org/yaml/snakeyaml/1.29/snakeyaml-1.29.jarからのorg.yaml.snakeyaml
```

このためにテスト前の貴重な時間の3時間かけたのにこのオチだとなんか悲しいかな...
MUI (Material-UI) で簡単なクイズアプリを作った話

# 概要
React の学習を兼ねて，新しくなった MUI (Material-UI) を用いたクイズアプリを作成した．作成したクイズアプリは [GitHub Pages で公開](https://denkiuo604.github.io/react-quiz-app/)している．また，ソースコードは [GitHub にある](https://github.com/denkiuo604/react-quiz-app)．

# 詳細
具体的な実装については，[GitHub にあるソースコード](https://github.com/denkiuo604/react-quiz-app)を見ていただくことにし，本記事ではプログラムの構成や役割について述べる．

## プログラムの構成
[GitHub リポジトリ](https://github.com/denkiuo604/react-quiz-app)の `src` ディレクトリ内にあるプログラムのうち，クイズアプリを実現する本質的なものは以下の5つである．

```
│  quiz.js
│
└─components
        qbcheckboxlist.js
        qbradiolist.js
        qbtextfield.js
        quizboard.js
```

以下，この5つのプログラムの役割を説明する．

## プログラムの役割

### quiz.js
アプリに表示する問題を記述するプログラムである．以下にその一例を示す．

```javascript:quiz.js
const quiz = [
    {
        id: 1,
        statement: '10000000の100000倍は1(　　)である。括弧にあてはまる漢字1字を答えよ。',
        type: 'text',
        answer: '兆',
    },
    {
        id: 2,
        statement: '4と6の最小公倍数はいくつか。',
        type: 'number',
        answer: '12',
    },
];
```

上記のように，アプリに表示する問題をオブジェクトの配列 `quiz` として記述する．オブジェクトの各プロパティの意味は次の通りである．

- `id` : 問題番号
- `statement` : 問題文
- `type` : 回答欄の種類
- `answer` : 正答

プロパティ `type` には `text`，`number`，`radio`，`checkbox` の4種類が用意されている．`radio`，`checkbox` を指定した場合，上記4つのプロパティに加えて

- `choices` : 選択肢

が必要である．`choice` には，選択肢をオブジェクトの配列で次のように指定する．

```javascript
choices: [
    {
        value: 'choice1',
        label: '偶数と偶数の和は奇数である。',
    },
    {
        value: 'choice2',
        label: '偶数と奇数の和は偶数である。',
    },
    {
        value: 'choice3',
        label: '奇数と偶数の和は奇数である。',
    },
    {
        value: 'choice4',
        label: '奇数と奇数の和は奇数である。',
    },
]
```

プロパティ `value` には，各選択肢を表す一意的なIDを指定する．`value` に指定された値は，前述のプロパティ `answer` で正答を指定するのに用いる．また，プロパティ `label` には，クイズアプリに表示される選択肢の文言を指定する．

さらに，プロパティ `type` に `checkbox` を指定した場合，プロパティ `answer` には正答を配列で指定する．以下にその一例を示す．

```javascript
{
    id: 4,
    statement: '次のうち、素数であるものをすべて選べ。',
    type: 'checkbox',
    choices: [
        {
            value: 'choice1',
            label: '1',
        },
        {
            value: 'choice2',
            label: '2',
        },
        {
            value: 'choice3',
            label: '3',
        },
        {
            value: 'choice4',
            label: '4',
        },
    ],
    answer: [
        'choice2',
        'choice3',
    ],
}
```

### quizboard.js
`quiz.js` に記述された各オブジェクトを基に，クイズを画面に表示するコンポーネントである．`quiz.js` の記述に問題がある場合は，エラーを表示する．

#### エラーが表示される例
- プロパティ `type` に `radio` を指定しているが，プロパティ `choice` が配列で指定されていない

### qbtextfield.js
`quizboard.js` の子コンポーネントであり，回答欄にテキストボックスを表示する．`quiz.js` において，プロパティ `type` に `text`，`number` が指定された場合に使用される．

### qbradiolist.js
`quizboard.js` の子コンポーネントであり，回答欄にラジオボタンリストを表示する．`quiz.js` において，プロパティ `type` に `radio` が指定された場合に使用される．

### qbcheckboxlist.js
`quizboard.js` の子コンポーネントであり，回答欄にチェックボックスリストを表示する．`quiz.js` において，プロパティ `type` に `checkbox` が指定された場合に使用される．

# 参考
- [MUI: The React component library you always wanted](https://mui.com/)
A.行ごとに対応した条件で変数を作る

# これだとエラーなんだよね

```R:
theta <- 0.6
lambda <- 3.5
N <- 10
sample <- data.frame(FLG= rbinom(N,size=1, prob = theta) )
sample %>% 
  mutate(value = if_else(FLG==0, 0, rpois(1,lambda)))
```

エラーの内容が

```
 エラー: Problem with `mutate()` column `value`.
ℹ `value = if_else(FLG == 0, 0, rpois(1, lambda))`.
x `false` must be a double vector, not an integer vector.
```

とあるから，`mutate`のところでうまくいってないのは明らか。
しかも，`false`がdoubleのベクトル出ないとダメだ，整数ベクトルじゃないか，という話。
試しにポアソンじゃなくて正規分布で乱数発生させると，通るには通るんですよね。

```R:
sample %>% 
  mutate(value = if_else(FLG==0, 0, rnorm(1,lambda,1)))
```

でもこれだと，行ごとに乱数が出ているわけじゃなさそう。

```
> sample %>% 
+   mutate(value = if_else(FLG==0, 0, rnorm(1,lambda,1)))
   FLG    value
1    1 3.607727
2    1 3.607727
3    1 3.607727
4    0 0.000000
5    0 0.000000
6    1 3.607727
7    1 3.607727
8    0 0.000000
9    1 3.607727
10   1 3.607727
```

ということで，行ごとに処理するために`rowwise`をかますのと，条件分岐で0のところは自動的に複製コピーされてるんだろうな，と思ったので0のところも関数で出てくるベクトルにしよう。ということでこんな感じで解決しました。


```R:
sample %>% 
  rowwise() %>% 
  mutate(value = if_else(FLG==0,rpois(1,0),rpois(1,lambda)))
```

ほうらね。

```
# A tibble: 10 × 2
# Rowwise: 
     FLG value
   <int> <int>
 1     1     2
 2     1     3
 3     1     4
 4     0     0
 5     0     0
 6     1     4
 7     1     1
 8     0     0
 9     1     3
10     1     1
```


以上，**ゼロ過剰ポアソン分布の例を作ろう**と思った時に直面した問題とその解決でした。




こんな感じで，自分のTips,こんなバグをこうやって解決したよ，というような話を，よろしければ皆さんもお寄せください。
[出題編はこちらです。](https://qiita.com/advent-calendar/2021/r_tips_attack25_q)
あるいは「こちらの解法のほうが美しいぞ」というのがありましたら，コメントいただけると幸いです。
今みてるwebページをクリスマス仕様にするクソアプリを作りました

## はじめに

これはクソアプリ Advent Calendar 2021の
カレンダー3の3日目の記事です。
クソアプリアドカレは毎年盛況で今見てる時点でカレンダー4までいってます、すごい。
私もクソアプリを作りたくなったので参加することにしました。

## 作ったもの

![xmas_kuso_app.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/933c020e-0659-94ed-e0b6-46d78b443fef.gif)

## コード

拡張を公開するにはデベロッパー登録しないといけないため社内限定公開にしてあります。
ソースコードはgithubにアップしてありますので手元に持ってきて自身で拡張登録すればどなたでもお使いいただけます。
https://github.com/yamamoto-hiroya/xmas_kuso_app

## 解説

軽くソースコードを解説します。
ブラウザ上部の拡張アイコンをクリックすると
background.jsが発火します。

```js:background.js
// backgroundで動くjs
// ブラウザ上部のアイコンをクリックすることで発火し、content.jsの方にメッセージを飛ばす（トリガー）
chrome.browserAction.onClicked.addListener(function(tab) {
  /**
   * 第一引数: タブのID
   * 第二引数: ポストするキーとバリュー
   * 第三引数: コールバック関数（レスポンスが戻ってきた時に実行される）
   */
  chrome.tabs.sendMessage(tab.id, { trigger: "on" },
    function(msg) {
      console.log("background側のconsole:", msg);
    });
});
```

発火した結果content.jsに処理が移る。

```js:xmas_kuso_app.js
$(function(){
  /**
   * @param object message backgroundからポストされた値
   * オブジェクトになっていてmessage.trigger = 'on'のような形になっている
   * @param sender
   * @sendResponse
   * これらは2つとも宣言してないとsendResponseが最後に返せなかったので設定した
   *
   * backgroundからメッセージが送られてきた時（ブラウザボタンをクリックされた時）に発火する
   */
  chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
    // 意図したbackground.jsからの送信でない場合は弾く
    if(message.trigger !== 'on'){
      return false;
    }

    /** ----- main ----- **/
    /**
     * 画面上の全ての要素をループで回す（ちょっと重いかも）
     * 背景色を緑にしてツリーっぽくする
     * 文字色を各種オーナメントを模して黄色、赤、白にする
     */
    $.each($("*"), function(index, element){
      $(element).css('background-color', '#0B7B48');
      if(index%3 === 0) {
        $(element).css('color', '#B51802');
      } else if(index%3 === 1){
        $(element).css('color', '#FFE33A');
      } else if(index%3 === 2){
        $(element).css('color', '#FFFFFF');
      }
    });

    /**
     * 雪を降らせる
     * こちらのコードを参考にさせていただきました。
     * @see https://rui-log.com/css_make-it-snow/
     */
    $('body').before("<div class='snow'>●</div> ");

    sendResponse('Done');
  });
});
```

`chrome.runtime.onMessage.addListener`
でbackgroud.jsからのメッセージを取得
意図したメッセージなら処理するようにしている。

画面上の全要素をループで回し、background-colorをツリー色に変更。
文字色は剰余算して3パターンにし、オーナメントっぽく赤・白・黄に変更。

雪を降らせる部分のcssはこちらを参考にさせていただきました。
https://rui-log.com/css_make-it-snow/

```css:xmas_kuso_app.css
.snow {
  color: snow; /*雪の色*/
  font-size: 18px; /*雪の大きさ*/
  position: fixed;
  top: -5%; /*初期位置*/
  z-index: 9999;
  text-shadow:
  5vw   -100px 2px,
  10vw  -400px 3px,
  20vw  -500px 4px,
  30vw  -580px 1px,
  39vw  -250px 2px,
  42vw  -340px 5px,
  56vw  -150px 2px,
  63vw  -180px 0,
  78vw  -220px 4px,
  86vw  -320px 9px,
  94vw  -170px 7px;
  animation: anim 5s linear infinite;
}

@keyframes anim {
  100% {
    color: transparent;
    top: 150%;
  }
}
```

## おわりに

連打すると雪が増えるし元に戻すにはリロードするしかないです。
開発時間は1時間程度です。
このあたりがクソアプリ感ありますね。
少しでもクリスマスを感じられると良いとおもいます（こなみかん）

以下宣伝です。
[Hamee](https://recruit.hamee.co.jp/)でもアドカレをやっていますので興味がある方はこちらもチェックしてみてください！
[Hameeのアドカレ](https://qiita.com/advent-calendar/2021/hamee)
Q.行ごとに対応した条件で変数を作る

さあそろそろネタがなくなってきましたw

これも誰得みたいな話なんですが，今回は次のようなケースです。

```R:
theta <- 0.6
lambda <- 3.5
N <- 10
sample <- data.frame(FLG= rbinom(N,size=1, prob = theta) )
```

上のコードを実行すると，次のようなデータフレームができます。

```
> sample
   FLG
1    1
2    1
3    1
4    0
5    0
6    1
7    1
8    0
9    1
10   1
```

ここで，FLGが0のところは0のままで，1になっているところは`lambda=3.5`のポアソン分布に従う乱数が入る，というようなデータを作りたい。

最初次のようなコードを書いていたんですが，エラーが出てうまくいきませんでした。
**どうしましょう。**

```R:
sample %>% 
  mutate(value = if_else(FLG==0, 0, rpois(1,lambda)))
```

```
 エラー: Problem with `mutate()` column `value`.
ℹ `value = if_else(FLG == 0, 0, rpois(1, lambda))`.
x `false` must be a double vector, not an integer vector.
```


[解答編はこちら。](https://qiita.com/advent-calendar/2021/r_tips_attack25_ans)
Docker 環境で Jetty または Tomcat を使って Webアプリを実行する。



#前提

- Windows環境
- 「c:\usr\webapps」にWARを配置しておく。


#コマンド

##Jetty 最新版を利用する場合

```
docker run --rm -it -p 8000:8000 -p 8080:8080 -v c:/usr/webapps:/var/lib/jetty/webapps jetty
```

##Tomcat 9.0 を利用する場合

```
docker run --rm -it -p 8000:8000 -p 8080:8080 -v c:/usr/webapps:/usr/local/tomcat/webapps tomcat:9.0
```


以上。
A.変数の中にある数字を使ってグループ化したい

さて，解決編。

私はこうしました。

```R:
sample <- data.frame(
  name = c("theta.1.1","gamma.1.2","theta.2.1","lambda.2.2"),
  value = c(0.120,0.0796,0.584,0.264)
)

sample %>%
  mutate(
    variables = str_split_fixed(name, pattern = "\\.", n = 3)[, 1],
    val1 = str_split_fixed(name, pattern = "\\.", n = 3)[, 2],
    val2 = str_split_fixed(name, pattern = "\\.", n = 3)[, 3]
  )
```

とりあえず文字列処理ですから，`stringr`とか`stringi`パッケージのお世話になるのは確定ですよね。
で，`stringi`パッケージの`str_split_fixed`で，ピリオドをキーにして3つの要素に分けます。ピリオドはそのままだと記号じゃなく第一引数の意味になっちゃうから，`\\`でエスケープします。

ここで次のようにしても，見た目にはそれっぽくなるんです。

```
sample %>%
  mutate(
    variables = str_split_fixed(name, pattern = "\\.", n = 3))
```

が，実はこれ，変数`name`が複数の要素を持っている変なデータフレームなので美しくない。

```
     [,1]     [,2] [,3]
[1,] "theta"  "1"  "1" 
[2,] "gamma"  "1"  "2" 
[3,] "theta"  "2"  "1" 
[4,] "lambda" "2"  "2" 
```

なので，作る時に列の要素も指定してやらないといけない。それが[,1]とか[,2],[,3]のところですね。

あんまり美しくない答えかもしれないんですけど，私はこれしか思いつかないのでこうしてます。




こんな感じで，自分のTips,こんなバグをこうやって解決したよ，というような話を，よろしければ皆さんもお寄せください。
[出題編はこちらです。](https://qiita.com/advent-calendar/2021/r_tips_attack25_q)
あるいは「こちらの解法のほうが美しいぞ」というのがありましたら，コメントいただけると幸いです。
八百屋からエンジニアになってみて

はじめまして！
八百屋からエンジニアに転職しましたまつと申します！
拙い文章ですが私の経験談をお伝えできればと思います。
最後まで目を通していただければ幸いです。

●私について
幼少期はレゴのブロックを組み立てたり、高校生になってからは野球部だったので壊れたグローブを直したりしていてとにかくものづくりが好きでした。将来もものづくりがしたいと思っていましたが、理系科目が苦手だったためその道は無理だと判断し、大学では経営学部に入りました。
そして卒業後は八百屋で働くこととなりました。

●私がエンジニアを目指そうと思ったきっかけ
私がエンジニアを目指したきっかけは結論から言うと「人と人を繋ぎたい」と思ったからです。
八百屋は小売業です。小売業は極論かもしれませんが、儲けが出れば商売が成り立ちます。
ですが私は働くうちに先程いった極論に違和感を感じるようになりました。
「農家様が作られた野菜を消費者に届けるだけでなく、農家様が野菜を育てるときに注がれた愛情も一緒に届けたい。」と思うようになったのです。
しかし技術のない私にできることといえばPOPにその商品についての文言を数行記載することくらいでした。
そこでもっと農家様と消費者を繋ぐ何かを作りたいと思うようになり、自作のアプリでならそれができるのではないかと考え、プログラミングをしてみようと思いました。

●プログラミングを学ぶ中で
私がプログラミング学習を始めたときのパソコンスキルはMoSを大学で取得していたもののブラインドタッチもまともにできない程度でした。
それでも自分が記載したコードでパソコンの画面が少し動いただけで楽しくて、最初HTMLでHello Worldが表示されたときの感動は今でも忘れません。
よくエンジニアには自走力が大切だと言われます。実際にその通りです。ただ今思うと自走力という言葉を便利に理解しすぎていました。
私が学習を始めたころはなんでも暗記しようとしていました。
それは私が今まで（学生時代のテストなど）は英語の文法や日本史など暗記でどうにかできるものばかりだったためです。プログラミング学習は良い意味でカンニングできます。ググれば答えのようなコードも出てきます。それで動けば解決のように感じます。テストでいえば100点です。
でも本当は違うということにあとから気付きました。プログラミング学習は確かに覚えるものもあるのですが、自分でコードを書いてみて実際に動かしてどのように動くのかを理解することの方が重要なのです。今ではそのことを考えるようになってから一気に自分の中の地盤ができたような気がしています。

●エンジニアになってみて
今も毎日が学習です。仕事でもまだまだ何もできない状態ですが、ポテパンで学んだ自走力を活かして日々頑張っています。
わからないことも多く挫けそうになることもあります。1解決したらわからないことが3に増えたりもします。
でも以前わからなかったことが解決したら成長を実感できますし、辛くても自分がなぜエンジニアになりたかったのかを思い出すようにしています。
そして最初に描いていた目標に一歩一歩近づいていけたらなと思っています。
この文章が少しでもお役に立てたなら幸いです。最後まで読んでいただきありがとうございました。
オブジェクトを上下にゆらゆらさせる

ゆっくりその場から上下に動きます
インスペクタのspeedで上下運動のスピードを変えられます


```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UpDownLoop : MonoBehaviour
{

    Vector3 startPos;
    public float speed = 1.0f;

    void Start()
    {
        startPos = transform.position;
    }

    void Update()
    {
        float sin = Mathf.Sin(Time.time * speed) +startPos.y; //ゲーム開始からの経過時間を1～-1に変換
        transform.position = new Vector3(startPos.x,sin,startPos.z); 
    }
}
AfterEffects ショートカット Mac

#■覚えておきたいショートカット 基本

選択
V

スケール
S

位置
P

回転
R

不透明度
T

全キーフレーム
U

閉じる
E

#■作成
平面の作成
Command + Y

平面の設定
Command + shift + Y

コンポジションの新規作成
Command + N

コンポジションの設定
Command + K

プリコンポーズ
Command + Shift + C

#■レイヤー作成
レイヤーの複製
Command + D

レイヤーのカット
Command + Shift + D

レイヤーのカット 左
Option + [

レイヤーのカット　右
Option + ]

選択を外す
command + shift + H
バッチという存在を初めて知ったので備忘録

#目的
バッチという存在を初めて知ったので備忘録

#結論
起動すると指定したアプリやWEBサイト、ファイルなどを起動できるらしい。

使ってみた。
私はMacで利用
Windowsはstartで始めるらしい。

```shell:WEBサイト開きたい時
　●open URL
```

```shell:アプリケーションを開きたい時
　●open -a <アプリ名>
　＊[アプリ名] の場所にはパスも記載。
```

#感想
これは便利！
GCPを実務未経験の初学者が使ってみた話。

５ヶ月ほど前にwebアプリケーションを作成した際、本番環境としてGCPのAppEngineを選択したのだが、なかなかに苦労したので今更ではあるがそれらを可視化しようということで記事を作成しようと思う。
##GCPの使用用途について
Laravelの学習に際して、その本番環境として友人の勧めにより使用することを決めた。
今まではレンタルサーバーを使うことが多かったので、クラウドを扱う練習という意味でもあった。
## 使ったサービス
<ul>
<li>App Engine</li>
<li>Cloud SQL</li>
</ul>
## GCP利用にあたってのフロー
<ol>
<li>デプロイする成果物の作成</li>
<a href="https://model-seeker.com">ModelSeeker</a>
<li>Udemyでの学習</li>
<a href="https://www.udemy.com/share/103Qh83@cenkkvIMCSxpYt0FcOSoeR84WDfcvgd2Ee_G23JQKZCbgMcnLvD0kRtV_1024k9CXA==/">最速で学ぶ - Google Cloud Platform（GCP）入門完全攻略コース</a>
<br>こちらの講座ではComputeEngineを使ってVMインスタンスを作成したり、ロードバランサーを使い、それらに対するアクセスの負荷を分散する演習などをハンズオン形式で学習することができた。AppEngineを利用するよりも難しい内容だったが、GCPってこんなことができたりするんだ、ということが少しわかるようになった。
<li>GCPの利用設定とデプロイ</li></br>
app.yamlの作成やgoogle cloud SDKの設定からデプロイ、データベースの設定等を行った。
この記事ではここの部分において学んだことや苦労したことなどを述べていきたい。
</ol>
##苦労したこと
苦労したことと言っても、正直全て苦労したのだが、（というのも初めて触るものが多すぎたから）その中でも特に頭がごちゃごちゃになったものを...

#### app.yamlの設定
~~まず変な拡張子だなと思った。~~
スペースの数を間違えるだけでエラーが出ちゃうという神経質さにこっちまで神経質になった。
オートスケーリングの設定もできるみたいだけど、正直その辺はよくわからなかったから設定してない。

#### gcloudignoreの設定
いざデプロイ！と思いコマンドラインでgcloud app deployと叩いてみたところ、待てど待てど処理が完了しなかった。よくみるとデプロイ中のファイルが3万個くらいあった、、、。AppEngineでの上限ファイル数は1万らしく、大してファイルが多いわけでもないのになぜこんな数になるんだと思って調べてみると、gcloudignoreでデプロイ対象を適切に指定しなければならなかったらしい。

#### え？どうやってmigrateするの？問題
ローカル環境ではmigrationファイルをもとにartisan migrateコマンドでデータベースを構築してくれて簡単で便利だったのだが、本番環境ではここがどうしてもうまく行かなかった。ローカル環境のテーブルとクラウドを同期する方法を色々試してみてうまく行かなかったので、phpMyAdminから構築済みのデータベースを手動でローカル環境にダウンロードして、storageにアップロード、SQLにインポートという形をとった。
でもこれ、データベースの構成に修正を加えたくなった時、どうすればいいのだろうか...?

#### Cloud SQLの設定
上で無事に構築済みのデータベースをGCP上にアップロードできたのだが、サイトにアクセスしてもうまくデータベースに接続できておらず、エラーを吐き続けていた。app.yamlの設定もうまくできてたし、何でだろうと思っていた。
というのも本来、CloudSQLのインスタンス＞作成したデータベース＞テーブル　みたいな順番の構成になっていないといけなかったのに、このインスタンスの中にローカルで構築した複数のテーブルをそれぞれぶちこんでいたのが原因みたいだった。
こんなの当たり前すぎて誰も記事にしていなかった。見当違いなことをしすぎてローカル環境でもエラーを吐くようになって、半泣きになりながら解決手段を模索したのは今となってはいい思い出だ。基本的にはこう言ったエラーは日を跨ぐとまた訳が分からなくなってしまうので、その日のうちに何とかするのだが流石に次の日に持ち越すことを決意した。その日は布団の中でテキストエディタの黒い画面とエラー画面が頭の中を巡り続けて、朝まで眠れなかったからダブルでしんどかった。

## 学んだこと
こんな感じで慣れない技術や新しいことを取り入れる時って特に神経をすり減らすし、分からないことだらけで嫌になることもあるけど、うまくいった時の達成感はそれ以上のものだし、なんかすごい成長した気分になる。
最初はわからないっていうのは当たり前のことだしそんな簡単に行ったら面白くない。それにビビらずに、ちょっと自分を過信してやってみることが大事なんだな、と抽象的な言葉ばかり並べて申し訳ないが、そういったことを感じた。
あ、あと間違えてSQLの容量設定を１００GBにしてしまい、毎月３０００円くらいお金がかかっているのだが、勉強代ということで（笑）

拙い文章でしたがここまで読んでいただき感謝しています。何か気になる点やご指摘等ございましたら教えていただけるとありがたいです。
Jackを使ってシンセとオーディオプレーヤーを同時に鳴らす

### jackdをインストール ###
Jackの本体でバックグラウンドで起動させて使う。

```
$ sudo apt-get install jackd
```

### pulseaudio-module-jackをインストール ###
pulseaudio-module-jackはPulse Audioの出力をAlsaではなくJackに切り替える。Jackを指定できるオーディオプレーヤーには必須ではない。

```
$ sudo apt-get install pulseaudio-module-jack
```

Pulse Audioの設定

```
$ sudo nano /etc/pulse/default.pa 
```

末尾に下記の3行を追加。

```
load-module module-jack-sink
load-module module-jack-source
set-default-sink jack_out
```

Pulse Audioを再起動

```
$ pulseaudio -k
```

### audaciousをインストール ###
音楽再生アプリ。再生デバイスとしてPulse Audioの他にJackを直接指定することもできる。

```
$ sudo apt-get install audacious
```


### jackdを起動 ###
オプション
* -R はリアルタイムモード
* -d alsa -d hw:0 で出力にAlsaを使用、2番目の-dはデバイスを指定。デバイスはalsaixserでF6を押すと確認できる。
* -r サンプリング周波数
* -p バッファサイズ
* -n バッファ数 (直結の場合は2、USBの場合は3が推奨らしい。大きいとレイテンシも増えると思う)

```
$ jackd -R -d alsa -d hw:0 -r 44100 -p 64 -n 2
```

ハードウェアは名前でも指定できる。`cat /proc/asound/cards`でデバイス名を調べる。下記はPCM5102Aをhifiberryのドライバで使用している場合の例。[]内がドライバ名。

```
$ cat /proc/asound/cards
 0 [fmidi          ]: MIDI Gadget - f_midi
                      MIDI Gadget
 1 [sndrpihifiberry]: RPi-simple - snd_rpi_hifiberry_dac
                      snd_rpi_hifiberry_dac
```

そこで得たデバイス名をhw:の後に指定する。

```
$ jackd -R -d alsa -d hw:sndrpihifiberry -r 44100 -p 64 -n 2
```


これでJackを使って複数のオーディオ再生アプリを低レイテインシで同時に使うことができる。それぞれのアプリでJackまたはPulse Audioを指定すれば良い。

なんか良くわからないが、誰かが勝手にデフォルト設定(48kHz, 1024 samples)でjackdを起動してるので、一旦それを殺してPulse Audioを再起動してから自分のシンセを起動してる。

```start_app_sample.sh
#!/bin/sh
sudo killall jackd
jackd -R -d alsa -d hw:0 -r 44100 -p 64 -n 2 &
sleep 1
pulseaudio -k
MySynthApp <- 走らせたいシンセのプログラム
```

[Bluetoothオーディオレシーバーとしても動作させる場合](https://qiita.com/ring2/items/1e06990aecc85c81b57e)は下記が必要だった。OS起動時にjackdを起動してるやつが見つかればこんな処理はいらないかもしれない。。。sleepが2箇所入ってるが、これが無いと動かない場合があった。あと、ALSAで使うハードウェアの音量がMAXになってないとイヤなのでそれも追加した(amixerの部分)。

どうしてこんな風に動作するのかは正直わからないが、PulseAudioのALSAモジュール(module-alsa-sink)を入れるとPulseAudioがALSAのデフォルトになり、ハードウェア指定では操作できない。なので、volume-watcherではハードウェア指定なしにデフォルトのデバイス（PulseAudioのALSA Sink）の音量をいじっている。シンセはJackを通じてALSAに流しているのでその音量変化の影響を受けない。良くわからないが偶然に偶然が重なって奇跡的に動いているような感じ。

```start_app_sample.sh
#!/bin/sh
killall volume-watcher.
killall jackd
jackd -R -d alsa -d hw:0 -r 44100 -p 64 -n 2 &
sleep 1
pulseaudio -k
sleep 1
pulseaudio -D
volume-watcher.py &
amixer -c0 cset numid=3 100%
MySynthApp <- 走らせたいシンセのプログラム
```
XilinX Vivado で BRAM(Block RAM) サイズを変更する方法

# はじめに
XilinX VivadoのDiagramでBRAMを配置したものの、BRAMをダブルクリックしてサイズをカスタマイズしようとしても、Depthの項が灰色となりサイズが変更できないという現象にぶちあたりました。
ググったり資料を見たりしてもナカナカ判らなく、解決法を見つけるまでしばらく悩んだのでここに手順を記録しておきます。

# 結論
いきなりですが、まずは結論を書いておきます。
__BRAMのサイズを設定するには、DiagramのBRAMモジュールではなく、AddressEditorでRangeの所で変える。__

# 状況
Diagram画面で、Add IP(Ctrl+I)でBlock Memory Generaterを使ってBRAMを置きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105578/3b21a32b-0808-2da7-f8c6-31fd5fa079ab.png)
ダブルクリックしてサイズを変更しようとしても
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105578/317bfa78-918d-8985-7bea-622c1bb001d7.png)
Rangeが変更できそうに見えても、灰色地で変更できません。

# 解決策
サイズは一旦忘れてともかく AXI BRAM Controllerなども配置し、一旦回路を作り上げます。Validate Design(F6) でエラーやワーニングが無い状態にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105578/c31b7e38-7bdf-5277-bdaf-b71eb69c246a.png)

次に、Address Editorを開き、Network 0 を展開します。
そして Rangeの所で BRAMサイズを設定します。単位はByteです。32bitバスの場合は実際のBRAMの深さは1/4になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105578/bf300188-ed84-cfd5-acaa-977dba202d8c.png)

次に、再度 Diagramに戻り、Validate Design(F6) を行うと、自動的にBARMサイズが変更されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105578/b539f9dc-f044-8192-74f3-017f7ee90d60.png)

***
BigQueryで特定のテーブルを参照しているクエリを見つけ出す方法

データ基盤を運用していると、あるテーブルがどこから使われているかを確認したくなる時があります。
多くの場合は不要なテーブルの棚卸しをしているときに、念のために削除した場合に影響がないかどうかを確認したいというときです。

BigQueryにはINFORMATION_SCHEMA.JOBSというクエリの実行履歴に関するVIEWがあるので、これを利用して調査をしてみます。

# 必要な権限
この処理を行うためには以下の2つのどちらかのロールが必要です。

- BigQuery Resource Viewer
- BigQuery Administrator

# 調査クエリ
以下のクエリでテーブルに対して実行されているクエリが調査できます。
FROMの後ろで指定しているVIEWは各自の環境に合わせて調整してお使いください。

```sql
SELECT
  job_id,
  creation_time,
  project_id,
  user_email,
  job_type,
  statement_type,
  destination_table,
  referenced_tables,
  query -- NOTE: JOBS_BY_PROJECTにしないとクエリ文字列は取得できない
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION
WHERE
  (
    SELECT
      LOGICAL_OR(rt.project_id = "プロジェクトID" AND 
                 rt.dataset_id = "データセット名" AND
                 rt.table_id = "テーブル名"
      )
    FROM UNNEST(referenced_tables) AS rt
  )
ORDER BY creation_time DESC
```

参考:

https://cloud.google.com/bigquery/docs/information-schema-jobs
【JavaScript】モジュール③　モジュールコンテキストとモジュールスコープ


#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。

前回の記事

https://qiita.com/nao0725/items/fe9339e07cee2b3c81e6


#目的

* モジュールについての理解を深める

#本題
###1.モジュールコンテキスト

モジュールコンテキストではthisが使えない

````moduleB.js
// thisを出力してもundefinedと出力される
console.log(this);
// 関数でも同様
function fn(){
  console.log(this);
}
// moduleを使わない場合にはwindowオブジェクトが取れていた
fn();
``````

```module.js
function fn(){
  console.log(this);
}
fn();
// objの中に格納した場合
const obj = {
  fn
}
// fnはobjのメソッドとして使える
obj.fn();
// 呼び出し元のobjのことを参照する
`````


####2.モジュールスコープ

moduleA.js, moduleB.jsを用意
基本的にはそれぞれで使う変数や関数はそれぞれのファイル内だけで使用できる

外部の変数や関数を使う場合はimportやexportで明示的に宣言する必要がある

**例**

````moduleA.js
const a = 0
````

moduleAで上記のように宣言しても, moduleB.jsに持ってこれない（importしない限り）

````moudleB.js
// 関数外で変数を宣言
const a = 0
function fn(){
  console.log(this);
  // レキシカルスコープは使用可能
  console.log(a);
}
fn();

const obj = {
  fn
}
obj.fn();
``````

グローバルスコープも使用可能


````moduleA.js
// window.bに1を代入
window.b = 1
`````

````moduleB.js
// moduleA.jsで宣言された変数を使用するために読み込む
import "./moduleA.js"
// 以下で1と出力される
console.log(window.b);
// fromを書かなくてもmoduleAを実行するだけなのでOK
```````


今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
* [Let'sプログラミング JavaScript入門](https://www.javadrive.jp/javascript/)
スクラムを友達と回し始めた話（プロローグ）

## 初めに

趣味開発でもスクラムという手法が使えるのか？ということを試しているスクラム歴1年の僕の話です

## 状況

* チームの人数は僕含めて6人
* 目的はWebアプリ開発(スケジュール管理アプリ)
* Webアプリ開発・スクラム共に経験者は僕だけ
* 現在はsprint3
* 僕は社会人2年目のAWSを用いてサーバレスシステムを構築していたり、ネイティブアプリを開発していたり多種多様なことをしているエンジニア
* メンバーはITに関わっているが、SIerだったり、大学生だったりする(今回使う技術は未経験)
* 全員同じサークル出身のため面識はある

## 使用ツール・技術

* Rails6
* Docker

### git管理
* GitHub
* SourceTree

###コミュニケーション

* Slack
* Skype

### スクラム管理
* Jira
* Trello

## どうしてスクラムを始めたか
* 現在のメンバーが多少なりとも、今の仕事に不満を持っていたり、Webアプリ開発に興味があった
* 僕がスクラムについてアウトプットする場が欲しかった

## 今どういう状態か

* 開発を行う段階ではなく、勉強段階である
* 勉強にはRailsチュートリアルを用いている

## 僕が感じた、趣味と業務のスクラムの違い

|項目 |  趣味  |  開発  |
| ---- | ---- | ---- |
|  僕の役割  | SMとPOの兼任   |開発チーム
|  使える時間  |  週5時間  |毎日7時間以上
|  デイリースクラム  |  Slackで日報投稿  | 通話MTG
|  スプリント期間  |  2week  | 2week
|  スプリントバックログへの意識  |  超えても趣味だし良いよね  | 絶対にSprint跨がないこと


## これからの改善点

* 僕以外の現役Railsエンジニアorスクラム経験者の獲得(SM or TLが欲しい)
* スプリントを超えるということが見積もりができないということに繋がることを認知
* チームを今より好きになってもらう
* Railsチュートリアルが嫌になってしまった時も周りにサポートできる姿勢を貫く
【SwiftUI】画像（UIImage）をpngファイルとしてiPhoneに保存する

#何の記事？

SwiftUIで写真を撮影するアプリを作っているのですが、カメラロールに保存された写真には名前を付けることができません。そこで、画像をiPhoneの本体に名前付きで保存できるようにします。

この記事の情報は次のバージョンで動作確認しています。
【Xcode】13.1
【Swift】5.5.1
【iOS】15.1
【macOS】Big OS Monterey 12.1

#iosアプリのファイルシステム

iOSアプリは、システムが不正に操作されるのを防ぐ為、アクセスできるフォルダがアプリ毎に隔離されています。これをSandbox構造と呼びます。対象のフォルダは、端末からアプリを削除すると一緒に削除されます。

Mac本体とiPhoneとを接続すると、Finderからファイルシステムにアクセスすることができます。アプリごとにフォルダ分けされていることがわかります。


#アプリにファイルを書き込みするためには

```swift
    //private func saveToDoc (image: UIImage, fileName: String ) -> Bool{
    public func SaveToDoc () -> Bool{
     　  　let pngImageData = UIImage.pngData(image)
　　　　　　　　　　　　　　　//iPhone内ファイルシステムのURLを取得
        let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
　　　　　　　　　　　　　　　//ファイル名をつなげる
        let fileURL = documentsURL.appendingPathComponent("test.png")
　　　　　　　　　　　　　　//保存
        do {
            try pngImageData()!.write(to: fileURL)
            print("SaveToDoc Done!")
        } catch {
            //エラー処理
            return false
        }
        return true
    }
```
#権限の設定
上記スクリプトによりエラーなく実行できますが、権限を設定しておかないとファイルシステム内にアプリのフォルダが作成されません。必要な設定は下の２つです。
・Supports opening documents in place
・Application supports iTunes file sharing
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/07e9f2a4-e71b-e1c8-d530-e77f2f733523.png)

これらの設定後にアプリを起動させると、ファイルシステム内に新しいフォルダが作成されました。test.pngも無事に保存されていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620139/26781f76-de4b-a580-e0b7-cd4e50ae15cc.png)


参考：
https://develop.hateblo.jp/entry/iosapp-uiimage-save
https://capibara1969.com/2836/
任意のオブジェクトをエモく回転＆ふんわり上昇させる

MVなんかでよくある、フワ…とオブジェクトが上昇してく演出を再現しました。
回転もさせられます。

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RiseUpper : MonoBehaviour
{
    Vector3 startPos;
    public float x = 0.5f;
    public float y = 0.5f;
    public float z = 0.5f;
    public float speed = 0.005f; //上昇スピード

    void Update()
    {
        transform.Rotate(x,y,z);
        transform.position = new Vector3(0, startPos.y, 0);
        startPos.y += speed;
    }
}
GitHub PagesでSwaggerをホスティングするGitHub Actionsの書き方

チーム開発をする時にAPI仕様書をOpenAPI形式で書くことが多いかと思います。
その場合によく問題になるのはその仕様書をSwaggerでホスティングする場所です。
チームの人数が少なければ、各自の環境でdockerなどを使ってSwaggerを立ち上げても良いですが、人数が多くなるとどこかでホスティングしたくなります。

この記事ではGitHub Pagesでホスティングするための設定を紹介します。

# 設定例

以下のYAMLファイルをGitHub Actionsで実行することで簡単にSwaggerをGitHub Pagesでホスティングできます。
GitHub Pagesの公開設定をPrivateにすることで、特定の組織に属している人のみに公開するという認証もできます。

```yaml
name: "swagger release"

on:
  pull_request:
    branches:
      - 'main'
    types: [opened, synchronize, closed]

jobs:
  swagger-validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Install swagger-cli
        run: |
          npm install -g swagger-cli

      - name: Validate swagger files
        run: |
          swagger-cli validate -d swagger.yaml --type yaml --format 3

  swagger-release:
    if: github.event.pull_request.merged == true
    needs: swagger-validate
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Install swagger-cli
        run: |
          npm install -g swagger-cli

      - name: Inject Swagger static files
        run: |
          wget https://github.com/swagger-api/swagger-ui/archive/refs/tags/v4.1.0.tar.gz
          tar -zxvf v4.1.0.tar.gz swagger-ui-4.1.0/dist/
          cp swagger-ui-4.1.0/dist/* docs/
          
      - name: Combine Multiple Swagger Files
        run: |
          swagger-cli bundle swagger.yaml  --outfile docs/swagger.yaml --type yaml --format 3

      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./docs
```

# 応用編(独自ドメインでホスティングする)
上記のままですと、公開設定がPrivateの場合はホスティングされるドメイン名が適当な英単語をつなげたものになってしまい、少々不格好です。
そのため、独自ドメインでのホスティングを行ってみます。
まずはホスティングしたいドメインの情報を以下のようにYAMLファイルに追加します。


```yaml
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./docs
          cname: <ホスティングしたいドメイン> # この行を追加
```

その後、そのドメインに以下のようなCNAMEレコードを追加します。

```
<ホスティングしたいドメイン> 300 IN CNAME <リポジトリが所属するOrganization名>.github.io.
```

その後数分まてば独自ドメインでのホスティングが完了します。

参考:

https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site
JavaScriptで動的に関数を指定する

# はじめに
JavaScriptで実行する関数をif文で振り分けるのではなく変数で指定する方法を示す。


# 動的に関数を指定する

参考にしたのがこちら。

https://qiita.com/umanoda/items/233f4835197d51d6395d

## 基本のかたち

連想配列とか辞書とか呼ばれるキーと値から構成される配列で、値として関数を指定する。
関数を直接記載するのではなく、「関数を呼び出す」という内容の無名関数を指定する。

```javascript:基本
var doSomething = {
    "A": function(){funcA();},                        // 関数を呼び出すやり方
    "B": function(){console.log("Bが実行された");},    // 直接記載するやり方
    "C": funcC(),                                     // こう書くと定義された瞬間に呼び出されてしまうようだ
};

function funcA(){
    console.log("Aが実行された");
}

function funcC(){
    console.log("Cが実行された");
}

// キーの変数で関数を呼び出す
var funcName = "A";
doSomething[funcName]();

// 変数を使わないならこう書いてもよい
doSomething.B();


//以下、実行結果
Cが実行された
Aが実行された
Bが実行された
```
## 引数を使う

関数に引数を使うときはこうする。
hogeよりも明示的に変数であることをあらわす変数名は…hensuだ！ hensuしかない！

```javascript:引数あり
var doSomething = {
    "A": function(x){funcA(x)},
};

function funcA(x){
    console.log("Aが実行された：引数は" + x);
}

var funcName = "A";
var hensu = 123;
doSomething[funcName](hensu);


//以下、実行結果
Aが実行された：引数は123
```

## 関数の戻り値を利用する
連想配列の各キーの値は「関数を呼び出す」という内容の無名関数。だから呼び出された関数が`return`で戻り値を返すだけでは駄目。呼び出された関数だけでなく無名関数にも`return`が必要だ。


```javascript:戻り値を活用
var calc = {
  "+": function(a, b){return funcAdd(a, b)},  // 正しい
  "-": function(a, b){funcSubtract(a, b)},    // 正しくない：undefinedを返す
  "*": function(a, b){return a*b},            // 正しい
};

function funcAdd(a,b) {
  return a+b;
}

function funcSubtract(a, b) {
  return a-b;
}

var ans = calc["+"](5, 2);
console.log(ans);

//以下、実行結果
7
```


# オチ
これを活用して、Dateオブジェクトから`getDate()`や`getHours()`といった個別のメソッドを呼び出すのではなく、引数として"d"を指定してやれば日付を返し"H"を指定してやれば時を返すような独自関数を作ることを考えた。というか見事に作り上げた。
そして記事を書こうとして、**その途中で[Moment.js](https://momentjs.com/)を知り、自分がこれまでおこなってきたことが無駄だったと知った**のだった。

https://momentjs.com/

私の場合、VBAやPythonなど他言語も正しい教材で学んだわけではないが、特にJavaScriptに関してはつまみ食いの傾向が強かった。[桃鉄ガチャ](https://qiita.com/mo256man/items/dc4ddd12952ee97df8be)を作ったときにjQueryを知ったが、そのときに「JavaScriptには便利な外部ライブラリがありそれを取り込んで使うことができる」ことをより汎用的に学んでおけばこのような二度手間もなかったのだが。

# 終わりに
これはこれで良しとしよう。私は経験を積んだのだ。
Firebaseで初めてChatアプリを作成してみた

Youtubeを参考に初めてFirebaseで遊んでみた。
[githubにアップ](https://github.com/PriKubota/First-farebase)

## 感想
JSでDBに登録できるのがすごいと思った。
JSばんばんかける人には使い勝手が良さそう！

## 知識
今後まとめていく予定です。
【TypeScript】非情報系卒の駆け出しエンジニアなりにDIするコードをvanillaで書いてみた

# 前書き

日常を過ごしていて、「TypeScriptでDIできたらいいな～。できればvanillaで。」なんて思うことはありませんか？
私はふと道を歩いているときや湯船に浸かっているときになります。
なんて思いながら調べてみると[InversifyJS](https://github.com/inversify/InversifyJS)や[tsyringe](https://github.com/microsoft/tsyringe)に辿りつきますが、vanillaじゃないですよね。
なので今回は足りない脳みそを濡れた雑巾のように搾り取り、強引に依存性を注入するコードを書きました。
ですので、この文章は搾りカスの出涸らしが書いています。いつもより稚拙な文章ですがお付き合いください。

追記(2022/05/15): 続きを書きました。 [Re:【TypeScript】非情報系卒の駆け出しエンジニアなりにDIするコードをvanillaで書いてみた](https://qiita.com/masayasviel/items/e6542986802024fcf974)

# 要件

- パッケージのインストールを用いない
- 使う側になるべく依存性の注入を意識させない

# コード

対象インスタンスを継承元が同じクラスの異なるインスタンスに渡し、対象インスタンスのプロパティを変化させることで依存性の注入が出来ているかを確認します。
なお、以下に示すコードファイルはすべて同階層に置いています。

## target.ts

対象インスタンスとなるクラスです。
変化させる対象のプロパティは `param` で、インクリメントとデクリメントができるようにしてあります。

```target.ts
export class Target {
    private param: number;
    constructor() {
        this.param = 0;
    }
    increment() {
        this.param++;
    }
    decrement() {
        this.param--;
    }
    get currentParam() {
        return this.param;
    }
}
```

## cls.ts

依存性注入するクラスです。
ファイル名が安直でウケますね。
継承先にDIを意識させたくなかったため、デコレータ+implementsを用いる方向で試行錯誤したのですが、力不足で実現できませんでした。
なので継承元にコンストラクタとは別に `init()` を作成し、それを呼び出すことで継承先がDIを意識しにくくしつつ依存性注入を行っています。そうなるとメソッド名は `_init()` にしたほうがよさそうですね。
また、 `init()` が呼び出される前提のため、対象インスタンスを格納する `target!: Target;` はその場しのぎをしちゃっています。危ないですね。
`init()` は下に記載する呼び出すタイミングでコードを簡略化するために `this` を返却しています。
ここではAとBの2つのクラスを定義しています。これらを呼び出します。

```cls.ts
import { Target } from './target';

export abstract class Base {
    abstract member: string;
    target!: Target;
    constructor() {}
    init(target: Target): this {
        this.target = target;
        return this;
    }
    increment(): void {
        this.target.increment();
    }
    decrement(): void {
        this.target.decrement();
    }
}

export class A extends Base {
    member = 'A';
    constructor() {
        super();
    }
}

export class B extends Base {
    member = 'B';
    constructor() {
        super();
    }
}
```

## main.ts

実行するファイルです。
変数名が雑で申し訳ないです。短いコードなので許してください。
DIできているかを確認するために `main()` でtargetインスタンスを作成しています。
`setting()` で注入を行いつつインスタンスを作成して返します。
また、`init()` したい関係でBaseから継承されているクラスのみを依存性注入対象としたいため `<T extends Base>` しています。
注入対象クラスはインスタンスを受け取る形にしたくないため、型

```typescript
interface Type<T> extends Function {
    new (...args: any[]): T;
}
```

を定義しています。これは

```typescript
>>> import { A } from './cls';
>>> typeof A
Function
```

より、Function型を継承していると捉えています。
"捉えています"というのは、このコードは[Angular type.ts](https://github.com/angular/angular/blob/a92a89b0eb127a59d7e071502b5850e57618ec2d/packages/core/src/interface/type.ts)からまんまパクっているためです。

```main.ts
import { Base, A, B } from './cls';
import { Target } from './target';

interface Type<T> extends Function {
    new (...args: any[]): T;
}

function setting<T extends Base>(target: Target, classes: Type<T>[]): T[] {
    return classes.map(t => (new t()).init(target));
}

function main() {
    const target = new Target();
    const d = setting(target, [A, B]);
    d.forEach(c => c.increment());
    console.log(target.currentParam);  // 2
}

main();
```

AとBそれぞれで1回ずつ `increment()` しているため2が出力されます。

# おわりに

問題点だらけなので参考程度に留めてください。
kubernetes(AWS EKS)+go gin+React+Three.js+websocketでVR YouTube ウォッチパーティー作ってみた

## website: [Ygg](https://ygg-drasill.com)

<img width="99%" alt="VR watch partyの様子" src="https://i.imgur.com/U2ef3eK.png">

<iframe width="99%" height="500" src="https://www.youtube-nocookie.com/embed/mLSMSRFRlco" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
## 機能面

### 現状の機能

- Syncボタンで再生同期
- アバター(という名の緑色の箱)をwasdキーで移動
- 簡易チャットでコメント共有
- 動画IDで再生する動画を選択
- 動画のミュート アンミュート

### これから実装したい機能

- 再生したい動画によって部屋分け
- アバターエモート
- スマートフォンのブラウザからも動かせるようにする

## モチベーションとアーキテクチャ選定

### モチベーション

kubernetesを少しだけ触る機会があり、これは継続して使用しないと何も身につかないと思い何かを作ってみようと決心

...YoutubeのVRウォッチパーティーにするか！

### アーキテクチャ選定

- インフラ: [kubernetes](https://kubernetes.io/ja/docs/concepts/overview/what-is-kubernetes/) on [AWS EKS](https://aws.amazon.com/jp/eks/)
Dockerコンテナベースでアプリケーションのスケーリングができるということで学習意欲が湧く
 
- バックエンド: [golang gin](https://github.com/gin-gonic/gin) 
バックエンドを静的型付け言語で書いてみたい & 流行に合わせてgoで書いてみたい → [go framework間で比較](https://qiita.com/yumin/items/5de33b068ead564ebcbf) → 人気と実装の簡便さからginを選択

- フロントエンド: [React](https://ja.reactjs.org/)
React か Vueかで迷う → [React vs Vue.js、2021年に勢力図を広げるのはどちらでしょうか？](https://jp.quora.com/React-vs-Vue-js-2021%E5%B9%B4%E3%81%AB%E5%8B%A2%E5%8A%9B%E5%9B%B3%E3%82%92%E5%BA%83%E3%81%92%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%A9%E3%81%A1%E3%82%89%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B) + いつかReact Nativeも学んでみたい

- VR 表現: [Three.js](https://threejs.org/)
クライアントGPUでレンダリング処理できるWebGLを簡単に扱えるJavaScriptライブラリ　UnityをWebGLビルドするという選択肢も考えられたが、Unity未経験のため断念

- フロントエンド - バックエンド 通信: Websocket
TCPとUDPで迷ったが、TCP(Websocket)のほうが実装&プロトコル管理の観点で簡単に思えたということと、高リアルタイム性が求められているわけではないので一旦Websocketを選択

折角なので未経験だが興味のある分野もりもりで試してみることに

## システム構成図

![](https://i.imgur.com/K1ie8Xh.png)

- k8s クラスターはeksctl create clusterで作成。
- Ingress ControllerとしてAWS ALBを設定することで必要に応じてALBがプロトコルをhttps→wssにアップデートしてくれるらしく、Websocket通信を行う上では便利
- Route53でドメインを取得し、ACMで取得した証明書をあてる

詳しくは [はじめてのdraw.ioでAWS EKSシステム構成図作成](https://qiita.com/PuppyPepper/items/5587f708e457b78b9100)

## 開発Tips

以降このページを目次として開発時の記事を追加していく予定です！超初歩的なことからわからなかったので超初歩的なことから書く予定です。

↓執筆済み
- [はじめてのdraw.ioでAWS EKSシステム構成図作成](https://qiita.com/PuppyPepper/items/5587f708e457b78b9100)
↓ 雑に執筆予定
- Docker環境での開発(マルチステージビルドで軽量コンテナのススメ)
- AWS 基本事項(EKSはどのようなAWSリソースで成り立っているのか？)
- kubernetes 基本リソース(Node Pod Deployment Service Ingress)
- Nodejs(create react appとは webpack,babelとは)
- Go開発(Go playground, go.mod)
- Three.js(Three.jsでDOMエレメントをレンダリングする方法)

## おわりに
qiita初投稿&めちゃめちゃ初学者なので、間違っている部分多々あると思います。ご指摘待ってます。

## 参考
[Golang フレームワーク比較](https://qiita.com/yumin/items/5de33b068ead564ebcbf)

[React vs Vue.js、2021年に勢力図を広げるのはどちらでしょうか？](https://jp.quora.com/React-vs-Vue-js-2021%E5%B9%B4%E3%81%AB%E5%8B%A2%E5%8A%9B%E5%9B%B3%E3%82%92%E5%BA%83%E3%81%92%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%A9%E3%81%A1%E3%82%89%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B)
gmail.comで会社のGCPを使っている人を炙り出す方法

会社で利用しているGCPを個人のGoogleアカウントで利用するのはご法度です。
この記事ではそのような人を炙り出す方法を紹介します。

# 必要な権限
この操作を行うためにはOrganizationレベルでの `Cloud Asset Viewer` ロールが必要です。

# 手順
## Organization IDの取得
最初に以下のコマンドを実行して、12桁の数字からなるGCPのOrganization IDを取得します。

```
$ gcloud organizations list
DISPLAY_NAME            ID  DIRECTORY_CUSTOMER_ID
hoge.com      123456789012              XXXXXXXXX
```

## Cloud Asset Inventoryで調査
次にCloud Asset Inventoryの機能である、全てのIAM権限に対して検索する機能を使って調査を行います。

```
gcloud asset search-all-iam-policies  --scope='organizations/<さっき取得したID>'  --query='policy:gmail.com'
```

これでgmail.comでGCPを利用している全てのIAM権限がダンプされます。
Nuxt.js2.15.8をインストールした時に生じる脆弱性とビルド時のエラーを力技で修正する

# はじめに
Nuxt.jsの学習を始めてみよう！と思ったところ、環境構築でエラーに遭遇したのでその対策をまとめてみました。

# 開発環境

* Apple M1
* Docker
    * 20.10.8
* Docker Compose
    * 1.29.2
* Node.js
    * 16.13.0(LTS)

# 修正方法
まずは、パッケージの脆弱性がどうなっているかを

```
npm audit
```

で確認してみましょう。

## 1. glob-parent  <5.1.2

![スクリーンショット 2021-11-28 12.24.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1477513/711a2704-af56-b939-2262-565c07c79986.png)

「fix available ~」以降ですが、「`npm audit fix --force`でこの脆弱性を修正することができますが、Nuxt.jsのバージョンが2.13.3になりますよ」と言っています。fixし、npm run devすると

## 2. DeprecationWarning: Use of deprecated folder mapping "./" ~

![スクリーンショット 2021-11-28 13.15.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1477513/1b22239e-5a46-738b-1299-da432876aab7.png)

添付の内容を要約すると、「/src(Nuxt.jsが入るディレクトリ)/node_modules/@nuxt/components/package.jsonで非推奨のフォルダマッピング『./』が使われてます」となっており、「Update this package.json to use a subpath pattern like "./*"」と言われているので、/src/node_modules/@nuxt/components/package.jsonの「./」を「./*」へ修正します。

![スクリーンショット 2021-11-28 13.39.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1477513/77c97235-1f08-ddb2-4562-4e80efba42a8.png)

というエラーも出た場合は、同じ方法で修正してあげます。その後、npm run devすると

## 3. Module build failed (from ./node_modules/babel-loader/lib/index.js)

![スクリーンショット 2021-11-28 14.11.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1477513/a91517ae-bd9a-adef-7137-3528a00b7b7d.png)

こちらに関しては、
https://stackoverflow.com/questions/66325582/nuxt-js-cannot-find-module-babel-preset-env-lib-utils を参考にさせていただきました。「@babel/preset-env updated, use old version 7.12.17」と書かれているため、

```
npm i @babel/preset-env@7.12.17
```
をします。その後、npm run devすると

## 4. These dependencies were not found

![スクリーンショット 2021-11-28 14.17.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1477513/4f136aca-7643-7dbf-d2d2-6fd03261e21e.png)

こちらに関しては、https://akizora.tech/npm-run-build-corejs-error-3208 を見ていただければと思います。
サイト内にある通り、

```
npm add core-js@2
```

します。その後、npm run devをしてみてください。おそらくビルド時のエラーはないと思われます。お疲れ様でした！！

# さいごに
高い脆弱性をもつパッケージを修正し、エラーもなんとか解決することはできましたが、node_modules内のファイルを直接変更しているので、この方法がベストではないと思います。より良い方法をご存知でしたら、教えていただけると幸いです。
【Python】ラズパイのIPアドレスを取得したい

## はじめに

ラズパイを使用してIPアドレスを取得するコードを書く機会がありました。
はじめに実装したコードでプログラムを実行したときにIPアドレスを取得できましたが
ループバックアドレスが取得されるだけということがありました。


IPアドレスを取得する方法はいくつかありますが
その中でも3つ簡易的なコードと合わせて紹介していきます。

## 対象読者

- IPアドレスを取得したい方
- 自分と同じようにそういった機会がある人

## 目次

- [はじめに](#はじめに)
- [対象読者](#対象読者)
- [目次](#目次)
- [IPアドレスを取得するプログラム](#ipアドレスを取得するプログラム)
    - [1. 冒頭でも触れたループバックアドレスを取得するプログラム](#1-冒頭でも触れたループバックアドレスを取得するプログラム)
    - [2. Pythonの標準ライブラリを使用](#2-pythonの標準ライブラリを使用)
    - [3. 指定したインターフェイスのIPアドレスを取得することができる](#3-指定したインターフェイスのipアドレスを取得することができる)
- [おわりに](#おわりに)
- [参考文献](#参考文献)

## IPアドレスを取得するプログラム


### 1. 冒頭でも触れたループバックアドレスを取得するプログラム

- 「python IPアドレス」 と検索したらまずはじめにでてくる（でてきた）IPアドレスを取得する方法

```python
import socket

ip = socket.gethostbyname(socket.gethostname())
print(ip)
```

### 2. Pythonの標準ライブラリを使用

- 標準ライブラリを使用してお手軽にIPアドレスを取得する方法
- ネットワークに接続するために使用されるインターフェイスのIPアドレスを取得
- インターフェイスを指定するわけではないが実際に使用されるインターフェイスのIPアドレスを取得することができる

```python
import socket

connect_interface = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
connect_interface.connect(("8.8.8.8", 80))
print(connect_interface.getsockname()[0])
connect_interface.close()
```


### 3. 指定したインターフェイスのIPアドレスを取得することができる

- モジュールをインストールしてIPアドレスを取得する方法
- 求めているインターフェイスを明示的に指定できるため取得したIPアドレスを取得することができる

```python
import ipget

target_ip = ipget.ipget()
print(target_ip.ipaddr("eth0"))
```

## おわりに

どのような方法で取得するのが正しいかなどはわかりませんが
たくさんの選択肢があるということを念頭においてユースケースによって使い分けられたらと思います。

## 参考文献

- [PythonでIPアドレスを取得する方法【初心者向け】](https://techacademy.jp/magazine/18874)

- [Pythonでeth0のIPアドレスを取得するにはどうすればよいですか？](https://www.webdevqa.jp.net/ja/python/python%E3%81%A7eth0%E3%81%AEip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/1047391080/)

- [ラズバリーパイのIPアドレス取得方法について](https://teratail.com/questions/79991)