OmniAICreator/Qiita-1.07M huggingface dataset:
Open棟梁_テンプレートベースのサンプルを実行（DB接続編） 

前回からの続きです。

この記事を確認する前に、
以下の記事からご覧ください。

< https://qiita.com/KOtamagokake/items/710c84b3876aaabb9caa >

#目的
前回、ログインまで完了しました。
今回の目的は、DBと接続して、格納されているデータを
webページで確認することです。

#前提
Open棟梁

DB：postgres
※それ以外は前回の記事を参照

#手順
1.postgresの導入
以下のサイト様を参考に、導入。
< https://www.dbonline.jp/postgresql/install/index1.html >

以下は、このあと使用するのでメモしておいてください。
・ホスト名
・DB名
・ユーザID
・パスワード

2.postgresにテーブルを作成
ダウンロードしたopen棟梁には、サンプル用のデータを作成するための
sqlが書かれたファイルが入っています。今回はそれを使用したいと思います。
以下のファイルを開き、postgresにテーブルを作成、データを追加。

< "C:\root\files\resource\Sql\pstgrs\TestTable.txt" >

3.configファイルの修正

下記のconfigファイルを、1.でメモしたpostgresの情報に合わせて修正します。

![configファイル.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697198/dd241533-694b-b848-a8f6-3777e5dbbfb2.jpeg)


< "C:\root\programs\CS\Samples\WebApp_sample\WebForms_Sample\WebForms_Sample\Web.config" >

4.unsafeをインストール
①visial studioのソリューションエクスプローラーにて、「参照」の上で右クリックし、「NuGetパッケージの管理」をクリック
②「unsafe」で検索し、インストール

手順は以上となります。

#試しにDBからデータを取得
1.プロジェクトを実行し、以下の画面を表示。てきとーにユーザIDとパスワードを入力し、「ログイン」ボタンを押下。（デフォルトだと認証機能なしなのでてきとーで）
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697198/f7ddc5ff-a31a-4309-3740-a36e253ed03c.jpeg)

2.「ノーマル」を選択

![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697198/0ea021de-2c27-bc42-94bd-7442c008a449.jpeg)

3.以下の画像のように、プルダウンから「Postgre」を選択

![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697198/bfcecc60-ab5b-6ac9-8364-9cd07dfe7ef2.jpeg)

4.画面下部にある「一覧取得（dt）」を押下すると、DB内のデータが表示される。
（画像の赤枠内）

![05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697198/023279cc-43ca-21db-99fa-81fe2d56f22c.jpeg)

#おわり
データ取得以外にも、他のボタンを押下すれば、CRUD操作を行えます。
次回は気が向いたら書きたいと思いますー
Raspbian Lite に Xorg をインストール

Raspbian Lite は CUI 用の OS イメージ。
でもちょっと X 上の動作確認がしたくて追加インストール

# 環境

- 2020-05-27-raspios-buster-lite-armhf
- RaspberryPi Model B+



# 何も考えずに失敗

何も考えずに

```

$ sudo apt install xorg


```

 してみた。

```

$ startx
```

としても画面の操作ができない。ウィンドウマネージャが入ってないので当たり前か。

更に何も考えずに

```

$ sudo apt install mate

```

して


```

$ startx
```

すると起動したが、重たい・・・ほとんど使えなかった。やり直し。
![IMG_20200929_173638397.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/34329b37-7731-a91a-e24f-8a192248ff0e.jpeg)

# 先に raspi-config してみる

```

$ sudo raspi-config
```

して、

```
      3 Boot Options         Configure options for start-up  
```

から進めて

```
           B4 Desktop Autologin Desktop GUI, automatically logged in as 'pi' user      
```
を選ぶと 

```

 Do 'sudo apt-get install lightdm' to allow configuration of boot to desktop                                       ```

```

と出てきた。なので

```

$ sudo apt-get install lightdm

```

としてから再起動。そうすると GUI のログオン画面が出てくるが、ここで  pi ユーザーでログオンしようとしてもダメだった。
![IMG_20200929_181713652.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/88b1c4bf-05ae-1974-b061-eb34ff1b6f81.jpeg)


# raspberrypi-ui-mods

```

$ sudo apt install raspberrypi-ui-mods
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  adwaita-icon-theme agnostics aspell aspell-en at-spi2-core bluealsa bubblewrap dbus dbus-user-session dconf-gsettings-backend dconf-service desktop-base
.
.
.
2 upgraded, 502 newly installed, 0 to remove and 38 not upgraded.
Need to get 246 MB of archives.
After this operation, 1182 MB of additional disk space will be used.
```

となる。
この後先のように raspi-config して、再起動すると X が使えるようになった。


![IMG_20200929_191508100 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/12f168ea-bb3e-e631-e487-05ae2215bd2b.jpeg)
rails routesからパスを作る

#環境
* AWS cloud9 EC2
* ruby 2.6.3
* Rails 5.2.4.3

#アクションのパスを作る方法
##ルーティングの確認
　rails routesを実行する

```:Terminal
vocstartsoft:~/environment/***** $ rails routes

         Prefix Verb   URI Pattern                                                                              
          books GET    /books(.:format)                 books#index
                POST   /books(.:format)                 books#create
       new_book GET    /books/new(.:format)             books#new
      edit_book GET    /books/:id/edit(.:format)        books#edit
           book GET    /books/:id(.:format)             books#show
                PATCH  /books/:id(.:format)             books#update
                PUT    /books/:id(.:format)             books#update
                DELETE /books/:id(.:format)             books#destroy
```

##アクションのパスを作成
###1. 一番右の列を見る
飛びたいアクションを確認する
（例：`book#edit`）

###2.一番左の列を見る(Prefix)
1で確認した行のPrefixの列を確認する
※もし空白の場合は、直近の上のものを使用する。
（例：`edit_book`）

###3.`_path`をつける
2で確認したものに `_path` をつける。
（例：`edit_book_path`）

###4.URI Patternの列を見る
URI Patternの列を見て `:id` があるか確認する。

* `id`がなかったら<br>
3で作成したものがパスになる
* `id`があったら<br>
3で作成したものに引数をしてして`:id`を指定する<br>
(例：`edit_book_path(@book.id)`)

###5.HTTPメソッドを確認する
link_toなどではデフォルトでGETが行われるようになっている。
＝＞そのため、GET以外の場合は指定する必要がある。

* 指定方法  
pathの後に、`, method: :httpメソッド`を付け加える  
(例：`book_path(@book.id), method: :delete`)

##何故`:id`が必要なのか
表示したViewページが`:id`によって違う内容にする必要があるかどうかを考える

* `:id`がない`books#index` `books#new`などは、一覧の表示や新規作成のため、特定の`:id`を必要としない
* `:id`がある`books#edit` `books#show`などは、特定の`:id`についての表示をする必要があるため、表示させたい`:id`を引数として指定する
Angularプロジェクト作成

##前提
**・Node.jsがインストールされていること**
**・Angular Cliがインストールされていること**
**・VSCodeがインストールされていること**
##１．Angularプロジェクト作成と起動
１）VSCodeのターミナルから「ng new」コマンド実行でプロジェクト作成
　　my-appは任意の名前で良い

```
$ ng new my-app
```

２）アプリケーションを起動、ブラウザで確認
　　作成したプロジェクトに移動し、「ng serve」コマンド実行でアプリケーション起動
　　「-o」オプションで起動時に自動でブラウザを開くことができる

```
$ cd my-app
$ ng serve -o
```

http://localhost:4200　へアクセスで確認
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/cdafd712-b0dd-2c44-f803-7e4856514123.png)

３）アプリケーションの停止
　　VSCodeのターミナルで「Ctrl + C」で停止

##２．VSCodeでのデバック方法
１）拡張機能(Ctrl+Shift+X)から「Debugger for Chrome」をインストール
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/f3ef7f92-20e2-b32a-990e-b022e54e82dd.png)
２）「launch.json」を作成する
　　メニューから「実行」ー＞「構成を開く」ー＞「Chrome」を選択
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/498ceea2-eb87-fc3e-20b0-3e7467dd70e3.png)
３）デバッグ開始
　　「ng serve」コマンドでプロジェクトを起動状態で、メニューから「実行」ー＞「デバッグの開始（F5）」でChrome起動
　　止めたいファイルの行番号に左側をクリックすることでブレークポイントを設定することができる
　　画面上に表示されているアイコン類で「再開」「ステップイン、アウト」「停止」ができる
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/c12f88ed-2985-60e5-c118-38d0fed91d39.png)
４）変数の内容の確認
　　「console.log」を使用してデバッグコンソールで変数の内容を確認
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/b1a198f9-0a04-fa9d-dbcf-4df1765786fc.png)
Spring Tool Suite (STS)とGradleとSpring BootでWebアプリ起動


##１．STSでプロジェクト作成
１）ファイルから「新規」－＞「Spring スターター・プロジェクト」を選択
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/acaf88fe-91aa-15b0-37bf-6e7291237ba8.png)
２）型に「Gradle」を選択し「次へ」ボタンを押下
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/af3da840-5093-2ac9-de38-87facab420ad.png)
３）「Web」－＞「Spring Web」にチェックを入れ、「次へ」ボタンを押下
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/d3a4dc37-d883-4c56-cc2d-9232eb427a96.png)
４）そのまま「完了」ボタンを押下
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/d98f822c-6c1f-1ba7-3195-4beab07afc4f.png)
５）プロジェクト作成完了
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/204500e6-ed56-c8d4-039b-08da6dc358f0.png)

##２．作成したプロジェクトのプログラムを編集
１）「application.properties」に「server.port=ポート番号」を追加
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/cb4778ae-3227-6a19-29fb-13fe2dafbac0.png)
２）「com.example.demo」パッケージに「DemoController.java」ファイルを追加
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/d00cafce-b818-79bf-1027-5a3f65698dac.png)
３）「src/main/resources/templates」フォルダに「index.html」ファイルを追加
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/8c8dc023-3446-c062-b391-f4fe1f9a9318.png)

##３．作成したプロジェクトを実行
１）「demo」プロジェクトを右クリックし、「実行」－＞「Spring Boot アプリケーション」を選択
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/6fb91ec3-854d-978b-4138-5bce307ee54d.png)
２）アプリケーション起動を確認（Springの文字が表示される）
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/75a34067-03e6-d88a-1a3c-423992bb800d.png)
３）WebブラウザでURLに「localhost:(ポート番号)」を入力で画面が表示される
　　http://localhost:8080/
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/b5327c40-a8a8-1865-c4ec-c7bea885d836.png)
４）アプリケーションの停止は「■」ボタンを押下
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643549/8c1db7df-69e9-de28-9180-a904da3a321c.png)
Raspberry PIで一定期間が過ぎたファイルを削除

#概要
今回はRaspberry PIにてCCTVシステムを構築した場合、一定期間が過ぎた画像ファイルや動画ファイルを自動で削除するため、コマンドを作成とCronに登録してみます。

#一定期間が過ぎたファイルを抽出

下記のコマンドは1日以上過ぎたファイルが表示されます。
現在の日付：2020/09/29
1日以上過ぎたファイルの取得：引数「+1」を指定します。
28日のファイルを取得：引数を「+1」→「0」に指定します。

■コマンド

~~~bash
find /var/lib/motion -name '*.*' -mtime +1
~~~

■実行結果

~~~bash
./03-20200926145041-02.jpg
./03-20200926145042-00.jpg
./03-20200926145042-01.jpg
./03-20200926145042-02.jpg
./03-20200926145043-00.jpg
./03-20200926145043-01.jpg
./04-20200927183825.avi
./04-20200927183825-00.jpg
./04-20200927183825-01.jpg
./04-20200927183825-02.jpg
./04-20200927183826-00.jpg
./04-20200927183826-01.jpg
./04-20200927183826-02.jpg
./04-20200927183826-03.jpg
~~~

#一定期間が過ぎたファイルを削除

上記のコマンドに引数を「-delete」を追加すると削除されます。
次のコマンドで確認しましょう。

■コマンド

~~~bash
find /var/lib/motion -name '*.*' -mtime +1 -delete
~~~

■実行結果
下記のエラーが表示されます。
理由は該当ディレクトリに削除する権限がないからです。
この場合、「sudo」コマンドで「root」権限を利用してファイルを削除しましょう。

~~~bash
find: cannot delete ｡ｮ/var/lib/motion/17-20200927213443-01.jpg｡ｯ: Permission denied
~~~

■sudoコマンドを利用して再度削除
以下のコマンドを実行します。

~~~bash
pi@raspberrypi:/var/lib/motion $ sudo find /var/lib/motion -name '*.*' -mtime +1 -delete
pi@raspberrypi:/var/lib/motion $
~~~

■削除されたか確認
下記のコマンド実行結果でファイルが削除され、表示されないことを確認します。

~~~bash
pi@raspberrypi:/var/lib/motion $ sudo find /var/lib/motion -name '*.*' -mtime +1
pi@raspberrypi:/var/lib/motion $
~~~

#定期的にコマンドを実行するための設定
Linux上では特定コマンドまたはプログラムを定期的に実行するためにはcronを使います。Windowsの場合、タスクスケジューラと同じものです。

■コマンド
下記の画面のように初めて実行した場合、表示されます。
私はVIエディタが好きですので、２を選びます。

~~~bash
pi@raspberrypi:/var/lib/motion $ crontab -e
no crontab for pi - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.tiny
  3. /bin/ed

Choose 1-3 [1]:2
~~~

■cron設定
下記の1行を追加します。
毎日1時０分に31日以上過ぎたファイルを削除するコマンドが実行されます。


参考：cronの設定ガイド
https://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html

~~~bash
# m h  dom mon dow   command
0 1 * * * sudo find /var/lib/motion -name '*.*' -mtime +31 -delete
~~~
※実際に削除されると思いますので、皆さんのご自身で確認をお願い致します。

#終わりに
今回この内容を応用すればファイルを圧縮してメールへ添付及びSlackチャットにも自動でアップロードすることができます。
近いうちにメールやSlackに添付するプログラムを書いてみます。
Pythonによる画像処理100本ノック#12 モーションフィルタ

## はじめに
どうも、らむです。
今回は画像中に動きを付けるフィルターであるモーションフィルタを実装します。

## 12本目：モーションフィルタ



平滑化フィルタとは画像の平滑化を行うフィルタです。このフィルタを適用することによって画像全体をぼやかしたような加工ができます。特にこのモーションフィルタでは流動的なぼかしが可能です。

このフィルタでは注目画素を周辺画素の対角線の平均値で置き換えます。
例えば、3×3や5×5のモーションフィルタは以下のようになります。

| $\frac{1}{3}$ | $0$ | $0$ |
 ---- | ---- | ---- 
| $0$ | $\frac{1}{3}$ | $0$ |
| $0$ | $0$ | $\frac{1}{3}$ |

| $\frac{1}{5}$ | $0$ | $0$ | $0$ | $0$ |
 ---- | ---- | ---- | ---- | ----
| $0$ | $\frac{1}{5}$ | $0$ | $0$ | $0$ |
| $0$ | $0$ | $\frac{1}{5}$ | $0$ | $0$ |
| $0$ | $0$ | $0$ | $\frac{1}{5}$ | $0$ |
| $0$ | $0$ | $0$ | $0$ | $\frac{1}{5}$ |

注目画素が中心だとすると、周辺画素と対応するフィルタ値の積の総和を注目画素に代入すれば良いですね。
3×3フィルタであれば$I(x_0,y_0)×\frac{1}{3} + I(x_1,y_1)×\frac{1}{3} + I(x_2,y_2)×\frac{1}{3}$の値を注目画素に代入します。これで、周辺画素の対角線の平均値が注目画素に代入されていますね。

また、前回同様、画像の端部分はフィルタリング処理が行えないので存在しない画素は0を用いる０パディング処理を行います。


## ソースコード

```motionFilter.py
import numpy as np
import cv2
import matplotlib.pyplot as plt


def motionFilter(img,k):
  w,h,c = img.shape
  size = k // 2

  # ０パディング処理
  _img = np.zeros((w+2*size,h+2*size,c), dtype=np.uint8)
  _img[size:size+w,size:size+h] = img.copy().astype(np.uint8)
  dst = _img.copy()

  # フィルタ作成
  ker = np.zeros((k,k), dtype=np.float)
  for i in range(-1*size,k-size):
    ker[i+size,i+size] = 1/k

  # フィルタリング処理
  for x in range(w):
    for y in range(h):
      for z in range(c):
        dst[x+size,y+size,z] = np.sum(ker*_img[x:x+k,y:y+k,z])

  dst = dst[size:size+w,size:size+h].astype(np.uint8)

  return dst


# 画像読込
img = cv2.imread('image.jpg')

# モーションフィルタ
# 第２引数：フィルタサイズ
img = motionFilter(img,21)

# 画像保存
cv2.imwrite('result.jpg', img)
# 画像表示
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
```

<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/cce04b1a-3c7e-db42-b9de-72d36a6944d1.jpeg">　<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/ab80f601-9c01-f119-af91-acf05e7660bd.jpeg">

画像左は入力画像、画像右は出力画像です。
ぼやけた感じの出力画像になっており、平滑化が行えていることが分かります。また、他の平滑化フィルタとは違い、フィルタの対角線の方向に流れています。

## おわりに
もし、質問がある方がいらっしゃれば気軽にどうぞ。
imori_imoriさんの[Github](https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_01_10/answers_py/answer_6.py)に公式の解答が載っているので是非そちらも確認してみてください。
それから、pythonは初心者なので間違っているところがあっても優しく指摘してあげてください。
ESRGANをpytorch-lightningで学習させてみた(colab環境でのコード付き) 

広島大学で社会基盤(土木)を専攻している３年生です。
現在は１年間休学して建設系のIT企業でインターンをしています。

以前、超解像度モデルである[SRGAN](https://qiita.com/1998922akito/items/f1f4705f3b82b826f50b)と[ESRGAN](https://qiita.com/1998922akito/items/ac6a3566d8a5cdc904cc)を学習と可視化を行ってみました。
超解像度がどんなものか試してみたい方はよければ見てみてください。
今回はpytorch lightningを用いて学習の可視化、学習途中の推論画像の可視化、ウェイトファイルの作成を行いました。

#pytorch lightning([URL](https://github.com/PyTorchLightning/pytorch-lightning))とは
簡潔に言うとpytorchでのモデル学習を簡潔にしてくれるライブラリです。pytorchで使えるラッパーには[ignite](https://github.com/pytorch/ignite)もあるので今後使用してみたいと思います。
こちらのURLにGANでpytorch lightningを使用した例が載せられているので参考にしました。

# 実装コード・感想
実装コードはこちらの[github](https://github.com/Akito-Fujihara/satellite-photo-esrgan/blob/master/pl_esrgan_train.ipynb)です。
通常GANの学習では生成器と識別器で交互に学習します。ESRGANはwarmup_batchsを設けているため指定したイテレータ数は生成器だけを学習するためpytorch lightningで学習させる時には予め学習させておいたウェイトファイルを読み込ませた生成器と用いて学習を行いました。一応[ウェイトファイルのリンク](https://drive.google.com/file/d/1aMfpJiRFmgZecbmqXnwHFFVuOELxaNrb/view?usp=sharing)をあげておきます。よかったら使ってください。
少し手間だったのでもっと簡単なやり方があったらコメントで教えていただきたいです、、、。

今回は5epochだけ学習させました。
こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/293514b0-4168-282a-f4bf-d1f152d1d9e2.png)

あえて２回学習しました。
こんな感じでtensorboardを使うことができます。
なぜか画質がドライブに保存したものと違う感じになってしまっていますが学習途中の画像を可視化しました、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/bca31650-67b6-bfe2-600d-83995bc76395.png)
あとversion_0の方がglobal_stepを引数に入れるのを忘れてpytorch lightningのサンプルものをそのまま使ってしまいましたが見逃してください。

#####感想
パラメータの調整や学習経過などを比較しやすいためこれからkaggleや勉強の際には積極的に使っていくと慣れでどんどん使いやすくなる感じがしています。
mindの研究 その17

#概要

mindが謎なので調べてみた。
vistaに入れた。
練習問題、やってみた。

#chromeの現在開いてるページのアドレスをクリップボードにコピーする。


```

左クリックとは
　結果は　変数
　数１は　変数
　数２は　変数
　数１に　入れ
　数２に　入れ
　数２をつみ
　数１をつみ
　"user32"と　"SetCursorPos"で　ＡＰＩ呼出し２　結果に　入れ
　エラー？　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　一秒待つ
　８をつみ
　０をつみ
　０をつみ
　０をつみ
　０をつみ
　"user32"と　"mouse_event"で　ＡＰＩ呼出し５　結果に　入れ
　エラー？　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　１６をつみ
　０をつみ
　０をつみ
　０をつみ
　０をつみ
　"user32"と　"mouse_event"で　ＡＰＩ呼出し５　結果に　入れ
　エラー？　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　。

右クリックとは
　結果は　変数
　数１は　変数
　数２は　変数
　数１に　入れ
　数２に　入れ
　数２をつみ
　数１をつみ
　"user32"と　"SetCursorPos"で　ＡＰＩ呼出し２　結果に　入れ
　エラー？　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　一秒待つ
　２をつみ
　０をつみ
　０をつみ
　０をつみ
　０をつみ
　"user32"と　"mouse_event"で　ＡＰＩ呼出し５　結果に　入れ
　エラー？　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　４をつみ
　０をつみ
　０をつみ
　０をつみ
　０をつみ
　"user32"と　"mouse_event"で　ＡＰＩ呼出し５　結果に　入れ
　エラー？　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　。

メインとは
　１００をつみ
　１０をつみ
　右クリックし
　２００をつみ
　４３をつみ
　左クリックし
　２３０をつみ
　１２０をつみ
　右クリックし
　「おけ」を　一行表示する。





```

以上。
pandasでネストされたjsonを読み込む

pandasでネストされたjsonを読み込む
read nested json with pandas

## 環境
Google Corab

## 事象
pandasで、

```python
import pandas as pd
pd.read_json('file.json')
```

をしたときに、

| index | title | content |
| --- | --- | --- |
| 1 | aaa | {"col1": "a", "col2": "aa"... |
| 2 | bbb | {"col1": "b", "col2": "bb"... |

のようになるjsonファイルがあったとします。(contentに更にjson形式の文字列が入れ子になって格納された形です。)

これを、

| col1 | col2 |
| --- | --- |
| a | aa |
| b | bb |

と読み込みたかったんですね。

normalizeとかflattenとかで少し検索したら`pd.json_normalize('file.json')`がそれっぽかったので使ってみたところ、`AttributeError: 'str' object has no attribute 'values'`と怒られてしまいました。

## 解決方法
試行錯誤の末、

```python
import pandas as pd
df = pd.read_json('file.json')
df = pd.DataFrame(df.content.to_list())
```

で正しく読み込めたので記事にしておきます。
ツール インストール

# 概要
 - k8sテスト環境構築<br>
<b>ツール インストール</b>

# 構築目次
 - [全体目次] (https://qiita.com/prodigy413/items/89fcb8cfb71e80f541d8)

# 環境
 - Rancher: v2.6.3
 - kubernetes(Client): v1.22.4
 - kubernetes(Server): v1.22.4

# ツール
以下インストール/設定を行う

| Name               |  内容                                    |
| :----------------- | :--------------------------------------- |
| bash-completion    | コマンド自動完成（bashの「Tab」キーと同じ） |
| krew               | kubectlのプラグイン管理ツール              |
| kubectx            | 使用contextを簡単に変更                   |
| kubens             | 作業namespaceを簡単に変更                 |

# kubectl AutoCompletion 設定
 - 作業場所: ClientPC<br>
 - AutoCompletion Page<br>
https://kubernetes.io/docs/tasks/tools/included/optional-kubectl-configs-bash-linux/

~~~
## bash-completion インストール ##
$ sudo apt-get install bash-completion

## 確認（_init_completion is a functionとか何とか出たらOK!!） ##
$ type _init_completion

## Completion スクリプトを「/etc/bash_completion.d」に追加 ##
$ kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl

## 「kubectl」のaliasを使う場合は以下設定追加 ##
$ echo 'alias k=kubectl' >>~/.bashrc
$ echo 'complete -F __start_kubectl k' >>~/.bashrc

## bash reload後、確認 ##
$ kubectl get pod
poddisruptionbudgets.policy        pods                               pods.metrics.k8s.io                
podmonitors.monitoring.coreos.com  podsecuritypolicies.policy         podtemplates 
~~~

# krew 設定
- krew Install Page<br> 
https://krew.sigs.k8s.io/docs/user-guide/setup/install/

~~~
## 以下コマンド実行で krew インストール ##
(
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  KREW="krew-${OS}_${ARCH}" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
  tar zxvf "${KREW}.tar.gz" &&
  ./"${KREW}" install krew
)

## PATH追加 ##
$ vi ~/.bashrc
$ cat ~/.bashrc
..........
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
..........

## 確認 ##
$ kubectl krew
krew is the kubectl plugin manager.
You can invoke krew through kubectl: "kubectl krew [command]..."
..........
~~~

# kubectx, kubens 設定
- kubectx/kubens Page<br>
https://github.com/ahmetb/kubectx

※インストール方法はいくつかあるが、ここでは`krew`を使ってインストール

~~~
## kubectx インストール ##
$ kubectl krew install ctx

## kubens インストール ##
$ kubectl krew install ns
~~~

# 確認
 - kubectx<br>
- サンプルcontext作成<br>
`$ kubectl config set-context ns-kube-system --cluster obi-cluster --namespace=kube-system`<br>
- context変更確認<br>
※黄色のcontextが使用中のcontext<br>
![2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561025/dee25e0c-e913-ffd7-3198-6763f95621a6.png)

 - kubens
namespace変更確認
※黄色のnamespaceが使用中のnamespace
![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561025/3984b507-ebd0-f0bb-7f5c-c02693f785ca.png)
vistaでmse その6

#概要

vistaに、Microsoft Security Essentials入れてみた。
mindで、eicarが作れないか、やってみた。

#サンプルコード


```
出力ファイルは　ファイル。
エラー検査は
　エラー？　ならば
　　エラー文字列で　重大エラー
　つぎに
　。

メインとは
　「eicar.com」で　出力ファイルを　新規オープンし　エラー検査し
　「X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*」で　出力ファイルに　一行書き込み　エラー検査し
　出力ファイルを　クローズし　エラー検査し
　「おけ」を　一行表示


```

#結果

速攻で隔離された。

以上。
k8sテスト環境構築

# 概要
 - k8sテスト環境構築<br>
<b>構築目次</b>

# 構築目次

### Rancher 設定
- [Rancher インストール] (https://qiita.com/prodigy413/items/5c243d9f30fca08fd139)<br>

### ClientPC 設定
- [Helm インストール] (https://qiita.com/prodigy413/items/1c1bfa5ffdd1a3642b03)
- [ツール インストール] (https://qiita.com/prodigy413/items/8db33f731476540e654f)

### Network 設定
- <b>Ingress</b>
 - [Nginx Ingress インストール] (https://qiita.com/prodigy413/items/b26bac84bbb4555ac8f0)
 - [Contour インストール] (https://qiita.com/prodigy413/items/9e0622f4ca999e21c568)
- <b>Load Balancer</b>
 - [MetalLB インストール] (https://qiita.com/prodigy413/items/3a24ff85819dc5eafe25)
- <b>Service Mesh</b>
 - [Istio インストール] (https://qiita.com/prodigy413/items/f7e2f25b094aa31d155a)
 - [Linkerd インストール] (https://qiita.com/prodigy413/items/1b5ec76ded2f4d105314)

### Monitoring 設定
- [Prometheus Operator インストール] (https://qiita.com/prodigy413/items/79a58ff913e6509c613f)
- [Prometheus サンプル設定] (https://qiita.com/prodigy413/items/c0c2304e1bc28f644526)

### Logging 設定</b><br>
- [EFK インストール] (https://qiita.com/prodigy413/items/d0020f3c9614fab56b0f)
- [EFK 設定&動作確認] (https://qiita.com/prodigy413/items/e78f7af685db2b403c53)

### Logging 設定</b><br>
- [Argo CD] (https://qiita.com/prodigy413/items/9bc5eba7b905182d831b)

### 運用
- [Sealed Secrets 設定] (https://qiita.com/prodigy413/items/63b39de347ab57d05814)<br>
- [Lens(Kubernetes IDE) インストール] (https://qiita.com/prodigy413/items/0f55cdba4988de82c0aa)<br>
- [Descheduler 設定](https://qiita.com/prodigy413/items/12c476c5916b7d1ad2ba)<br>
- [Localtunnel 設定](https://qiita.com/prodigy413/items/e74b46bae26cacacb707)<br>
- 追加予定...
【Ruby on Rails】deviseの不要なルートを作らない方法

# 目標
deviseで自動的に作成される不要なルートを作らない。
→新たな新規adminの作成を防ぐ。
※管理者（admin）情報はseedにて記述する場合。


# 開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina

# 前提
※　▶◯◯　を選択すると、説明等が出てきますので、
　　よくわからない場合の参考にしていただければと思います。

- [deviseでログイン環境構築](https://qiita.com/japwork/items/275110b810965fbdf72f)

# seedに記述
seedに管理者の情報を記述。

```rb:db/seeds.rb
...

Admin.create!(
  email: 'aa@aa.com',
  password: 'aaaaaa',
)
```
```:ターミナル
$ rails db:seed
```
これで管理者ページにログインできます。
※seedに関しては開発環境と本番環境で分ける必要があります。
詳しくは[こちら](https://blog.cloud-acct.com/posts/spa-seeddata-setup/)

# routesを編集
```rb:config/routes.rb
  devise_for :admins, :skip => [:registrations, :password],controllers: {
    sessions: 'admins/sessions',
  }
```
# ログインページがデフォルトの状態の場合
このままではエラーが出てしまうので、下記ファイルをの該当箇所を削除。

```erb:app/views/admins/shared/_links.html.erb
<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
  <%= link_to "Sign up", new_registration_path(resource_name) %><br />
<% end %>

<%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
  <%= link_to "Forgot your password?", new_password_path(resource_name) %><br />
<% end %>
```


# 参考
[サインアップするためにDeviseルートを削除するにはどうすればよいですか？](https://qastack.jp/programming/6734323/how-do-i-remove-the-devise-route-to-sign-up)
【PowerShell】 VSCode の統合ターミナル上で実行されているか判定する

環境：

```
PS> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.0.3
PSEdition                      Core
GitCommitId                    7.0.3
OS                             Microsoft Windows 10.0.18362
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

```

## 解： `$env:TERM_PROGRAM`

```powershell
if ($env:TERM_PROGRAM -eq "vscode") {
	# VSCode 内でのみ実行したい処理
}
```
VSCode の統合ターミナル上で実行したときのみ、上記変数には `vscode` という値が代入されます。

## `$env:TERM_PROGRAM_VERSION`

同様に VSCode の統合ターミナル上では `$env:TERM_PROGRAM_VERSION` で VSCode のバージョンを取得できます。
特定のバージョン以降でのみ有効な機能を呼び出すようなときに使えそうですね。

小ネタでした。
【google_maps_flutter】SingleChildScrollView内でGoogle MAPのスクロールを有効にする



Flutterにgoogle_maps_flutterを導入し、Google Mapを表示させているのですが、

```dart

return SingleChildScrollView(
  child: GoogleMap(
    // (省略)
  )
```
というように、Google MapをSingleChildScrollViewの子ウィジットにしたところ、
Google Mapをスクロールしようとしても、画面全体(=SingleChildScrollView)がスクロールされてしまい、Mapを操作できなくなってしまいました。

難しくはなかったものの、日本語の情報がなかったので書き留めておきます。

##解決策
```dart
import 'package:flutter/gestures.dart';  // OneSequenceGestureRecognizerを有効にするために追加
import 'package:flutter/foundation.dart'; // Factoryを有効にするために追加

// (省略)

return SingleChildScrollView(
  child: GoogleMap(
    gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>[
              new Factory<OneSequenceGestureRecognizer>(
                () => new EagerGestureRecognizer(),
              ),
            ].toSet(),
  )
```
↑のように、`gestureRecognizers`を設定してあげればOKです。
(`import`が必要なので、そこだけ要注意)

Flutterは日本後の情報が少なめですが、頑張って英語も読んでみると、割と解決できますね。

###参考
https://stackoverflow.com/questions/61744359/google-maps-inside-a-form-in-singlechildscrollview
参加しないのはもったいない！エンジニア志望の学生がハッカソンに参加する３つのメリット

突然ですが、エンジニア志望学生のみなさん

**「ハッカソン」に参加したことはありますか？**

*「ハッカソン？何それ美味しいの？:frowning2:」*
*「言葉は聞いたことあるけど、参加したことはないなぁ...:frowning2:」*



この記事を読んでいる人の中にもそう感じている人がいることでしょう。

ハッカソンを知らない、知っているけど何となく参加していない、
そんなあなたに断言します。

就活のことを考えても、エンジニアとしての成長のことを考えても
**ハッカソンに参加していないエンジニア志望学生は100%損をしています。**

本記事では**ハッカソンに７度参加し、うち３度優勝した**私が考える「**エンジニア学生がハッカソンに参加するメリット**」について紹介していきます。

##  そもそもハッカソンって？

ハッカソン(hackathon)とは「hack（プログラミングに取り組む）」と「marathon(マラソン)」を組み合わせた言葉です。**エンジニアやデザイナーがチームでアプリ開発に取り組み、その出来栄えや技術力を競います。**通常２〜3日間で行われることが多く、数万 ~ 100万円の賞金がでるものもあります。


## ハッカソンに参加するメリット
*「ハッカソンについてはわかったよ。でもそれって参加して何の意味があるの？:frowning2:」*

ここまでを読んでそう感じた人も多いことでしょう。
ここからは具体的に「**エンジニア志望の学生がハッカソンに参加するメリット**」について考えていきたいと思います。

### 1. 自学だけでは身につかない開発スキルが得られる
皆さんは普段の生活の中で「**寝食を忘れて開発に没頭したこと**」はあるでしょうか？
余程ストイックな人でなければないはずです。
ハッカソンは限られた時間の中で成果物を完成させることを要求されるため、一定期間集中して開発に取り組むことになります。（それこそ寝食を忘れるほどに）
もちろんかなりきついですが、**その期間での技術力の伸びは飛躍的です**！（個人的には**１ヶ月間自学するよりも一度ハッカソンに参加した方が技術力が上がったと感じています**）
また、Gitなど、**共同開発に必要な知識を実践の中で身に付けることができます。**
### 2. 企業へのアピールになる
ハッカソンは**様々な企業の協賛（主催）の元で開かれている**ことが多いです。
これは学生エンジニアが集まるハッカソンが**「優秀な学生エンジニアを獲得する格好の場」**であるからです。
したがって、多くの場合、各社のエンジニアや人事がメンターとして参加しています。ハッカソンで優秀な成績を残すことができれば、**思わぬ有名企業との接点を作れるかもしれません。**
(実際私も、あるハッカソンでこれまで全く接点のなかった某有名IT企業の人事の方に声をかけられ、選考を受けた結果内定を獲得しました。)
### 3. 「参加した」ことがガクチカになる
エンジニアに求められるガクチカは多くの場合「**何かを開発した経験**」です。普段から個人開発をしている人ならともかく、こういった経験を作ることはかなり敷居が高いことだと思います。
ところがハッカソンであれば、**「誰かとチームを組んで開発に取り組んだ経験」をたった２日間で作ることができます。**
ただ、「学校でプログラミングを学んだ」よりも「ハッカソンで〇〇を開発した」という方が、**100倍刺さるガクチカになる**こと間違いなし！！

## まとめ
いかがでしたでしょうか？
本記事をよんで少しでも「ハッカソンに参加してみようかな...」と思える人がいれば幸いです！
Vue 映画情報をTMDb APIを使って取得

#はじめに
完成イメージはこんな感じ

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">はじめてVueを触ってみた。。。Angular以外jsフレームワーク知らんから、これからはVueを本格的に学んでいく！<br>ってことで、映画情報をVue（v2系）で取得してみた。<a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング</a> <a href="https://twitter.com/hashtag/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E8%BB%A2%E8%81%B7?src=hash&amp;ref_src=twsrc%5Etfw">#エンジニア転職</a> <a href="https://t.co/UvEHYFiirR">pic.twitter.com/UvEHYFiirR</a></p>&mdash; 高卒プログラマーげんと (@gento34165638) <a href="https://twitter.com/gento34165638/status/1310902062100566024?ref_src=twsrc%5Etfw">September 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#環境
Vue v2系です。

どうやら2020/09現在、vue v3系ではvuetifyが使えないようなので、あえてv2系にしました。。
https://github.com/vuetifyjs/vuetify-loader/issues/127

使えるようになってら、コメントより教えてください:blush:

別に「vuetifyなんて使わない」と言う方は、特にバージョンを気にしなくて良いかと！

#vuetifyを入れる
コマンドプロンプトかターミナルより、プロジェクトvueの階層へ移動

```console
vue add vuetify
```

#TMDbのAPI keyを取得
[【Ionic + Angular】TMDb APIで映画の一覧を取得して表示する](https://qiita.com/kokogento/items/646122b3126037840e72#映画情報を取得できるtmddb-api)
上記リンクのリンクより、取得できます。

#映画情報を取得
##axiosを入れる

```console
npm install axios
```

まぁ映画上を取得するだけならaxiosを使う必要はなさそうですが、後々に検索機能とかもやってみたいので:smile:

##一覧を表示してみる

```vue:Home.vue
<template>
    <v-container>
        <v-row>
            <v-col v-for="movie in movies" :key="movie.id">
                <v-card>
                    <v-img v-bind:src="'http://image.tmdb.org/t/p/w300/' + movie.poster_path"></v-img>
                    <v-card-title>{{ movie.title }}</v-card-title>
                    <v-card-subtitle>{{ movie.release_date }}</v-card-subtitle>
                    <v-card-text>{{ movie.overview }}</v-card-text>
                </v-card>
            </v-col>
        </v-row>
    </v-container>
</template>

<script>
import axios from 'axios'

export default {
    name: 'Home',
    data() {
        return {
            movies: [],
         // 自分のkeyに置き換える
            apiKey: '***',
        }
    },
    methods: {
        getMovies() {
            // &language=jaで日本語に（日本語版がないものは空欄になるけど、、）
            axios.get(`https://api.themoviedb.org/3/movie/now_playing?api_key=${this.apiKey}`)
            .then(response => {
                this.movies = response.data.results
                console.log(this.movies);
            })
            console.log(this.movies);

        },
    },
    created() {
        this.getMovies();
    }
}
</script>
```

https://developers.themoviedb.org/3/movies/get-now-playing
:point_up:ドキュメントはこちら

現在上映中の映画を取得しました〜。
iCloud Drive の同期を起こすスクリプト

iCloud Drive が同期されていないときに，ワンクリックで同期を促すコマンドファイルを作った

iCloud Drive はDropboxのように即座に更新されるわけではなく
他のマシンで作業しようと思っても更新が反映されていない時がある

そんな時は，「iCloud Drive」フォルダに新しい書類を保存してみてください
https://support.apple.com/ja-jp/HT203052
とのことなので

iCloud Drive 内（書類フォルダなど）に次のコマンド実行ファイルを置いて
自身を更新させることで他のファイルも同期させる

次の内容のファイルを作成（拡張子 .command なら名前はなんでも）

```shell:refresh_iCD.command
#!/bin/sh
touch "$0"
```

ターミナルで実行権限をつける

```
chmod +x refresh_iCD.command
```

このファイルをDockに置いて同期しているか怪しいときにクリックすると更新されます

私はDockに置かずに ~/Library/Scripts/ 内にエイリアス作ってメニューバーのスクリプトメニューから呼び出しています
iOSアプリの数字キーボードで完了ボタンを表示する

##目次
1. はじめに
2. 実装方法
3. まとめ


##はじめに
銀行などのアプリでユーザーに郵便番号や電話番号を入力させたいとき、
入力ボックスを選択すると数字のみのキーボードが表示されるかと思います。

この記事では、数字キーボードを表示する方法と完了ボタンを表示する方法についてご説明したいと思います。

##実装方法
###①テキストボックスを設置する
今回はログイン画面で数字のみのキーボードを利用したいので、
ログイン画面に、ログインIDを入力するためのキーボードを設置します。
Widgetはユーザーが入力できるよう、テキストボックスを使います。

このように設定しました。
![スクリーンショット 2020-09-29 20.13.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/12f74bd1-a3e2-910d-6ea1-d1c75d144fc1.png)

###②右メニューで数字キーボードを選択
Textbox Widgetは標準で、以下のようになっているので
数字のみ記入できるように、設定を変更します。

【デフォルトの設定】
![スクリーンショット 2020-09-29 20.13.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/09a505e5-e799-0b8e-379a-25b7a19a90ca.png)

:point_down_tone1:以下のように変更

【変更内容】

- Input Mode :　Numeric Only
- Keyboard Style : Number Pad

このままでも、数字入力のみができるキーボードが表示されます。
<font color="Red">ですが、このままの設定だと「完了」ボタンが表示されず、
キーボードがずっと表示されたままになります。</font>

以下の動画のように、ID入力後にログインボタンを押下したいのに、
キーボードが表示されたままで操作ができません。。:sweat:

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/QEW8krIFEf">pic.twitter.com/QEW8krIFEf</a></p>&mdash; Kony (@Kony12763790) <a href="https://twitter.com/Kony12763790/status/1310905988241711104?ref_src=twsrc%5Etfw">September 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

###③完了ボタンを表示
完了ボタンを表示するためには、上記に加えて下記項目を変更します。

- Close Button : On
- Close Button Text : 完了
- Keyboard Action Label : Done
- <font color="Red">Input View Type : CancelとNone以外に設定</font>

![スクリーンショット 2020-09-29 20.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/294df0a2-0ee9-4588-8240-4b5edc45878f.png)

ここで注意していただきたいのは、
Close ButtonをOn、Close Button Textのテキストを入力しても、
Input View TypeがNoneになっている場合は、キーボード上部の完了ボタンが表示されません。

完了ボタンを表示する必要があるキーボードについては、
<font color="Blue">Input View Typeをの設定をCancelとNone以外に設定することを忘れないようにしてください:warning:
</font>
最後にアプリの動作をみてみましょう。
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/oZzZQo7pwJ">pic.twitter.com/oZzZQo7pwJ</a></p>&mdash; Kony (@Kony12763790) <a href="https://twitter.com/Kony12763790/status/1310906335723053056?ref_src=twsrc%5Etfw">September 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

完了ボタンが表示されて、無事ログインボタンが押下できましたね！

##まとめ
アプリ開発をしていて地味につまづいた部分だったため、
同じところでつまづいている方がいたら参考になれば嬉しいです！
【Ruby on Rails】Webpackerにselect2導入メモ

[Ruby on Rails 7 (stimulus) の場合はこちらの記事です](https://qiita.com/YutoYasunaga/items/9044a3d590f7d8f1f41d)

## jQuery導入
select2を使う為に、jQueryが必要です。

[jQuery導入方法](https://qiita.com/YutoYasunaga/items/9a7eaa0a4ca898535912)

## select2導入

```:terminal
yarn add select2
```

```javascript:app/javascript/packs/application.js
import 'select2'
import 'select2/dist/css/select2.css'

document.addEventListener('turbolinks:load', () => {
  $('.js-select').select2({
    placeholder: 'Select an option',
    allowClear: true
  })
})
```

## カスタマイズスタイル
```:sass
$select2-height: 38px

.select2-container
  .select2-selection--single
    height: $select2-height
    line-height: $select2-height
    .select2-selection__arrow, .select2-selection__rendered
      height: $select2-height
      line-height: $select2-height

  .select2-search--dropdown .select2-search__field
    font-size: 16px
    padding: 4px
```

以上でRuby on Railsアプリケーションにselect2が導入できました。
```select``` タグに ```js-select``` クラスを付けたら動くはずです。
無料の個人的開発学習用環境メモ

### 個人的メモ
できる限り無料で、開発・学習を行うための環境メモ Windowsで開発している人向け

## デザイン系
+ **GIMP**
+ **Figuma**

Figumaはウェブやスマホ用のレイアウトがデザインでき、色のテンプレートも用意されているのが、デザイン未学習者にとって嬉しいです。

## メモ系
+ **Notion**
Markdown記法で、開発ごとにページを分けられる。
エクスポート可能。
カレンダーやToDoリスト、カンバンなどがコマンド一発で配置可能。
Trelloとも連携可能で、プロジェクト管理もできる。とにかく便利。

+ Mery
Windows標準のメモ帳と本格的なエディタの間にあるようなツール。
Notepad++が使えなくなったときにインストールして以来お世話になっている。
普段使用しているVSCodeが作業ディレクトリと結びついているため、文字コードやJSONファイルなどのちょっとした変更に便利。

## エディタ
+ **VSCode**

## 仮想環境
+ **VirtualBox**
+ **Docker Toolbox**

Dockerの環境構築には、Linuxやサーバ、ネットワークの知識が関わってくるため、勉強になるし需要もあると思って積極的に使っている。
もちろん、何が目的でDockerを使うか、ということを考えた上で。

Windowsのバージョンが2004の方は、WSL2 + Dockerで実現できるようです。
自分は、バージョンアップでエラーが出ます。

## 開発に役立つサービス
+ **Google Cloud Platform**

Compute Engine (VM) / Firestore (NoSQL DB) / Cloud Storage (マルチメディア用ストレージ)を使っている。
頑張れば無料で使える (https://cloud.google.com/free?hl=ja) そのため、作ったサービスの置き場所にちょうど良い。

+ **Travis CI**

Travis CI (https://travis-ci.org) は、Github上のコードのビルドやテストを行うサービスで、GithubのリポジトリがPublicならば無料、Privateなら有料になる。オンラインなので、導入も楽。

+ **Auth0**

Auth0 (https://auth0.com/jp/) は、TwitterやFacebookのアカウントを利用して、認証を行うOpenID Connectを楽にするサービスです。
ユーザ名、パスワードの管理が必要なくなり、ログイン画面のUIもデフォルトで用意されています。
作っているサービスに会員登録を入れるなら、これが良いと思います。
「SLAM入門」4.3章 におけるグラフベースSLAMの導出


前回は完全SLAM問題を漸化式にするまでをやりました．
https://qiita.com/ReoNagai/items/8b4ea2f6e7a86f11683f

今回は「SLAM入門」で扱うSLMA，グラフベースSLAMにおける完全SLAM問題の漸化式を求めます．
前回と同様に省略された式変形をすべて乗法定理で変形しています．

対応しているページはp44です．


# 導出

```math
\begin{equation*}
\begin{split}
まず乗法定理で同時確率に変換する\\
\ p(x_{0:t}| z_{1:t}, a_{1:t}, c_{1:t})=&\frac{p(x_{0:t}, z_{1:t}, a_{1:t}, c_{1:t})}{p(z_{1:t}, a_{1:t}, c_{1:t})}\\
分母のz_{0:t}をz_tとz_{0:t-1}に分割して、乗法定理により分割する\\
=&\frac{p(x_{0:t}, z_{1:t}, a_{1:t}, c_{1:t})}{p(z_t|z_{1:t-1}, a_{1:t}, c_{1:t})p(z_{1:t-1}, a_{1:t}, c_{1:t})}\\
分子のz_{0:t}をz_tとz_{0:t-1}に分割して、乗法定理により分割する\\
=&\frac{p(z_t | x_{0:t}, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_{0:t}, z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_t|z_{1:t-1}, a_{1:t}, c_{1:t})p(z_{1:t-1}, a_{1:t}, c_{1:t})}\\
分子の2項目を乗法定理で分割する\\
=&\frac{p(z_t | x_{0:t}, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_{0:t}| z_{1:t-1}, a_{1:t}, c_{1:t})p(z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_t|z_{1:t-1}, a_{1:t}, c_{1:t})p(z_{1:t-1}, a_{1:t}, c_{1:t})}\\
分母と分子で同じ項を削除する\\
=&\frac{p(z_t | x_{0:t}, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_{0:t}| z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_t|z_{1:t-1}, a_{1:t}, c_{1:t})}\\
分母を消してηとする（これで2行目の式になる）\\
=&η p(z_t | x_{0:t}, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_{0:t}| z_{1:t-1}, a_{1:t}, c_{1:t})\\
2項目を乗法定理で分数にする\\
=&η \frac{p(z_t | x_{0:t}, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_{0:t}, z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_{1:t-1}, a_{1:t}, c_{1:t})}\\
分子の2項目のx_{0:t}をx_tとx_{0:t-1}に分割して,乗法定理で2項に分割する\\
=&η \frac{p(z_t | x_{0:t}, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_t| x_{0:t-1}, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_{0:t-1}, z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_{1:t-1}, a_{1:t}, c_{1:t})}\\
分子の2項目において，直前のロボット位置x{t−1}と移動量a_tがあれば\\
現在位置x_tが決まるという過程に基づいて依存関係のない変数を取り除く\\
=&η \frac{p(z_t | x_{0:t}, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_t| x_{t-1}, a_t)p(x_{0:t-1}, z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_{1:t-1}, a_{1:t}, c_{1:t})}\\
3項目を乗法定理で分割する\\
=&η \frac{p(z_t | x_{0:t}, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_t| x_{t-1}, a_t)p(x_{0:t-1}| z_{1:t-1}, a_{1:t}, c_{1:t})p(z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_{1:t-1}, a_{1:t}, c_{1:t})}\\
分母と分子で同じ項を削除する（これで3行目の式になる）\\
=&η p(z_t | x_{0:t}, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_t| x_{t-1}, a_t)p(x_{0:t-1}| z_{1:t-1}, a_{1:t}, c_{1:t})\\

\end{split}
\end{equation*}
```

これで漸化式に変形できました．

続きはまた今度．
git tagの基本コマンド


# 基本コマンド

```:既存のタグ(ローカル)一覧を確認
git tag
```
```:既存のタグ(リモート)一覧を確認
git ls-remote --tags
```

```:現在のコミットにタグ名をつける
git tag タグ名
```
```:リモートリポジトリへプッシュ
git push origin <tag-name> #単体タグ
git push --tag #全タグ
```
```:タグの削除(ローカル)
# ローカル

git tag -d tag名
git tag -D tag名 #強制削除

# リモート

git push origin --delete タグ名
```
```:リモートのタグをローカルでチェックアウト
git checkout -b ブランチ名 refs/tags/タグ名
```
matlabの計算完了通知メール送信(mailsend)

Try関数中の 何らかのプログラム (program)を実行し、エラーがなければ、実行完了メール。
エラーを取得すれば、構造体MEが生成され、エラー通知とエラー内容メールを送信するコード

###　＜プログラム使用例＞

```MATLAB
clear  %初期化
try
 program %処理するプログラム
catch ME %エラー内容を取得
end
mailsend; %本プログラム
```


### メインコード (mailsend.m )

```MATLAB
% Gmail / Yahoo の送信アドレス・サーバー設定
% 現時点でYahooメールからの送信を用いているため，Gmailの設定は未使用。

% Define these variables appropriately:
% 送信元のアドレス，パスワード
Mail.sendAdd = '________@yahoo.co.jp'; %Your Yahoo email address
Mail.sendPassword = 'password';  %Your Yahoo password
% Yahoo サーバー
setpref('Internet','SMTP_Server','smtp.mail.yahoo.co.jp');
% Gmailサーバーを使用する場合は以下のコメントを外す。
%setpref('Internet','SMTP_Server','smtp.gmail.com');

%送信元アドレス設定
%SMTP設定
setpref('Internet','E_mail',Mail.sendAdd);
setpref('Internet','SMTP_Username',Mail.sendAdd);
setpref('Internet','SMTP_Password',Mail.sendPassword);

%Java設定
Mail.Props = java.lang.System.getProperties;
Mail.Props.setProperty('mail.smtp.auth','true');
Mail.Props.setProperty('mail.smtp.socketFactory.class', 'javax.net.ssl.SSLSocketFactory');
Mail.Props.setProperty('mail.smtp.socketFactory.port','465');

%送信先情報の指定
%メール送信先・パソコン名の設定 

%計算しているパソコン名の取得 (例: Mail.namePC='XXX')
%% Mail_contents
[~,Mail.namePC]=dos('hostname'); %PC名の取得

%メール送信先の指定
%Mail.receiveAddに指定されたアドレスにメール送信
Mail.receiveAdd='xxxxxxxxxx@______.jp'; %メールの送り先

%メール本文   
Mail.isME = exist('ME','var');              %エラー情報を取得
if Mail.isME ==1 %1:エラーがあるかどうかを判断
    
%エラーがあれば、メールのタイトルにエラー通知(Tmp.mailTitle)、内容にエラー文(Mail.errorMsg)を含むメッセージ(Tmp.mailMessage)を指定　
   Mail.errorMsg=ME.message; %エラー文を取得
   Mail.mailTitle=strcat(Mail.namePC,':!Calculation Error'); %エラーメールタイトル
   Mail.mailMessage=strcat('エラーメッセージ:',Mail.errorMsg); %エラーメッセージ
else    
    
%エラーが無ければ、メールのタイトルに計算完了通知(Tmp.mailTitle)、内容にメッセージ(Tmp.mailMessage)を指定　　           
   Mail.mailTitle=strcat(Mail.namePC,':Finish Calculation');   
   Mail.mailMessage=strcat('Finished Time (DD-MMM-YYYY hh:mm:ss):',datestr(now));
end

%メールの送信
%送信先アドレス(Mail.receiveAdd)にタイトル(Tmp.mailTitle)、メール文章(Tmp.mailMessage)のメールを送信
sendmail(Mail.receiveAdd,Mail.mailTitle,Mail.mailMessage); %メール送信
```
Rでの「不正なマルチバイト文字」のエラーとマルチバイト文字とは

#プログラミング勉強日記
2020年9月29日
Rを扱ったときにマルチバイト文字に関してのエラーが出たのでマルチバイト文字についてまとめる。

#概要
　Rでファイルを読み込むときにマルチバイト文字があると怒られてしまった。

```r
 make.names(col.names, unique = TRUE) でエラー: 
   '<ef>ｻ<bf>閧･譁僊' に不正なマルチバイト文字があります 
```

#マルチバイト文字とは
　簡単に言うと<b>全角文字</b>のこと。具体的には、1バイトのデータでは表示することのできない文字のこと。
　

#解決方法
　ネットで調べてみるとエンコーディングを指定するとうまくいくようだが、私の場合はファイルの保存方法を間違えていただけだった。

　Excelで作ったファイルを`.csv`で保存するときは名前を付けて保存にするのではなく、エクスポートからファイルを保存するとうまくできた。

#参考文献
[マルチバイト文字](https://wa3.i-3-i.info/word1809.html)
世界最速で「無題のスプレッドシート」を作成する

###__URL欄にspreadsheet.newと打ち込みEnter__


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">URLに<a href="https://t.co/n2vbdJ1CGA">https://t.co/n2vbdJ1CGA</a> と打ち込んで世界最速で無題のスプレッドシートを作成できます。<br>案外知られてないのかも？ <a href="https://t.co/QWLTed2Vsv">https://t.co/QWLTed2Vsv</a> <a href="https://t.co/bv3VVXYGup">pic.twitter.com/bv3VVXYGup</a></p>&mdash; ウーリズム (@Uh_rhythm) <a href="https://twitter.com/Uh_rhythm/status/1310895113493712896?ref_src=twsrc%5Etfw">September 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


日々の業務でspreadesheetを使うことが多い方には割と有用な小技だと思います。

__Gmailアカウントの認証は済ませておいてくださいね！__

ちなみに__document.new__で無題のドキュメントが作成できます。

また__slide.new__で無題のプレゼンテーションが作成できます。


とある識者の方にナレッジを提供できたことが嬉しかったのでメモしておきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164405/09ad03cb-beef-0876-2c3d-01cad593adb5.png" width="70%">
Pythonによる画像処理100本ノック#11 平滑化フィルタ（平均フィルタ）

## はじめに
どうも、らむです。
今回は画像中のノイズを除去するメディアンフィルタを実装します。

## 11本目：平滑化フィルタ（平均フィルタ）
平滑化フィルタとは画像の平滑化を行うフィルタです。このフィルタを適用することによって画像全体をぼやかしたような加工ができます。

このフィルタでは注目画素を周辺画素の平均値で置き換えます。
例えば、3×3や5×5の平均フィルタは以下のようになります。

| $\frac{1}{9}$ | $\frac{1}{9}$ | $\frac{1}{9}$ |
 ---- | ---- | ---- 
| $\frac{1}{9}$ | $\frac{1}{9}$ | $\frac{1}{9}$ |
| $\frac{1}{9}$ | $\frac{1}{9}$ | $\frac{1}{9}$ |

| $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ |
 ---- | ---- | ---- | ---- | ----
| $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ |
| $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ |
| $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ |
| $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ |

注目画素が中心だとすると、周辺画素と対応するフィルタ値の積の総和を注目画素に代入すれば良いですね。
3×3フィルタであれば$I(x_0,y_0)×\frac{1}{9} + I(x_0,y_1)×\frac{1}{9} + ... I(x_2,y_2)×\frac{1}{9}$の値を注目画素に代入します。これで、周辺画素の平均値が注目画素に代入されていますね。

また、前回同様、画像の端部分はフィルタリング処理が行えないので存在しない画素は0を用いる０パディング処理を行います。


## ソースコード

```meanFilter.py
import numpy as np
import cv2
import matplotlib.pyplot as plt


def meanFilter(img,k):
  w,h,c = img.shape
  size = k // 2

  # ０パディング処理
  _img = np.zeros((w+2*size,h+2*size,c), dtype=np.uint8)
  _img[size:size+w,size:size+h] = img.copy().astype(np.uint8)
  dst = _img.copy()

  # フィルタ作成
  ker = np.zeros((k,k), dtype=np.float)
  for x in range(-1*size,k-size):
    for y in range(-1*size,k-size):
      ker[x+size,y+size] = (1/k**2)

  # フィルタリング処理
  for x in range(w):
    for y in range(h):
      for z in range(c):
        dst[x+size,y+size,z] = np.sum(ker*_img[x:x+k,y:y+k,z])

  dst = dst[size:size+w,size:size+h].astype(np.uint8)

  return dst


# 画像読込
img = cv2.imread('image.jpg')

# 平均フィルタ
img = meanFilter(img,9)

# 画像保存
cv2.imwrite('result.jpg', img)
# 画像表示
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
```

<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/cce04b1a-3c7e-db42-b9de-72d36a6944d1.jpeg">　<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/43c5227d-d4bb-9e1d-9e96-8c7430b21e54.jpeg">

画像左は入力画像、画像右は出力画像です。
ぼやけた感じの出力画像になっており、平滑化が行えていることが分かります。

## おわりに
もし、質問がある方がいらっしゃれば気軽にどうぞ。
imori_imoriさんの[Github](https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_01_10/answers_py/answer_6.py)に公式の解答が載っているので是非そちらも確認してみてください。
それから、pythonは初心者なので間違っているところがあっても優しく指摘してあげてください。
フィッシャー・イェーツのシャッフル

#サンプル文
引数に渡した配列をシャッフルして返す。

```test.js
function shuffle(arr) {
    for (let i = arr.length - 1; i > 0; i--) {
      const j = Math.floor(Math.random() * (i + 1));
      [arr[j], arr[i]] = [arr[i], arr[j]];
    }
    return arr;
  }
```
【postfix】 postfixがメールを受け取って、「.forward」でスクリプトが実行されるまでの流れ

# はじめに

ほぼ使わない技術かもしれませんが、レガシーシステムをいじっているときのpostfixの知見を自分用メモとして書きます。

# 内容

postfixで受信するとかもナンセンスやろとかも、全部置いておいて、以下知見メモです。

## [メール受信の設定]

```
・postfix受信
・/etc/postfix/main.cfで設定されている、「myhostnameパラメータ」により自分のドメインを示して、メールを受信できる状態にします
　→　「mydomainパラメータ」でもドメインを設定しますが、こちらは設定してもしなくても問題ありません
・/etc/postfix/main.cfで設定されている、「inet_interfacesパラメータ」でどこからのメールだけを受け取るか設定します
　→　基本は「all」で設定して全部受け取るようにします
・/etc/postfix/main.cfで設定されている、「inet_protocolsパラメータ」でipv4やipv6のプロトコルを選択します
・「postconf -n」で全体のmain.cfの設定を確認することができます
　→　反映が問題ないかは「postfix check」を使用します

※参考：https://www.rem-system.com/mail-postfix01/
```

## [実行ファイルの設定]

```
・/etc/postfix/virtualで設定されている、「hogehoge.com anything」ですべてを受け取り、「@hogehoge user@hoge.com」で「hogehoge.com」で受信した内容を「userユーザ」で「hoge.com」に送信する設定をします
　→　/etc/postfix/virtualの内容を反映するために、「postmap /etc/postfix/virtual」を実行します
・/etc/postfix/main.cfで設定されている、「home_mailbox = Maildir/」で「/home/user/Maildir/new」にメールが転送される
・/etc/postfix/main.cfで設定されている、「command_directory = /usr/sbin」よりPostfix コマンド群の置かれる場所が分かる
・「/usr/sbin/postconf」内部に「allow_mail_to_commands = alias, forward」がありここら辺の設定で、.forwardが読み込まれる
・.forward内部で設定されているスクリプトが実行される
　→　.forwardがないと、「/home/<ユーザ名>/Maildir/new」に内容が記述されていく
・.forwardにかかれている「python hogehoge.py」スクリプトが実行される

※参考：http://www.postfix-jp.info/trans-2.3/jhtml/virtual.5.html
```
PHP printf クラス　インスタンス

# printf
printfとは「あるフォーマットに従った文字列を返す」関数です。
[構文]
sprintf(文字列のフォーマット, 入力したい文字１,　入力したい文字２,　・・・)
[例]
"%s 君は %s を %d 個食べました。"
「%s」には文字列を、「%d」には数値を代入することができます。ですので、
髙橋 君は パン を 100 個食べました。
という文章にしたい場合は、
sprintf("%s 君は %s を %d 個食べました。", "髙橋", "パン", 7)

と書くことで、「髙橋 君は パン を 100個食べました。」という文字列が返ります。
他にも沢山の指定子がありますので、活用していきたいと思います。
![スクリーンショット 2020-09-29 14.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/90114735-2d14-2abb-fd6e-8d711482ad5e.png)

# クラス
![スクリーンショット 2020-09-29 18.56.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/823e7744-2aef-01b0-4618-a10b34fc2a5d.png)
class Post{}
でクラスを生成できます。
※クラス名の最初は大文字にします。
### プロパティ
public $変数
変数を宣言します。
### メソッド
こちらもpublic をつけて関数を定義します。

### this
this->変数　は変数にアクセスするために使っています。

# インスタンス
![スクリーンショット 2020-09-29 19.09.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/29f97d53-6738-1015-5880-d6378cdbf5ad.png)
$posts[0] = new Post();
でインスタンスを作成しています。

$posts[0]->text = 'hello';
$posts[0]->likes = 0;
でクラス内のプロパティに代入しています。
PostgreSQL　suとsudoの違いについて

# はじめに
エンジニアになり、LinuxやPostgreSQLに触れることになりましたので、記録として学んだことを残そうと思います。
環境は、CentOS7.2です。PostgreSQLを使用します。

# postgresユーザーとpsqlコマンド
DBを操作するためには、psqlコマンドを使用します。
psqlコマンドとは、ターミナルからDBを操作するためのコマンドです。
しかしどのユーザーでもこのコマンドを使用できるわけではありません。（設定を変更すれば可能なようです。）
DBを操作する際は、rootユーザーや一般ユーザーではなく、postgresユーザーに切り替えて（あるいはpsqlコマンドが使用できるユーザーに切り替えて）psqkコマンドを実行し、DBを操作することになります。
そのユーザーの切り替え時に使用するのがsuコマンドとsudoコマンドになります。

# suコマンドについて
suコマンドはsubstitute userとか、super userとか、switch userとか。調べましたが何の略なのか分かりませんでした。
ユーザーを切り替えるという意味です。

```bash
su - postgres
```

postgresユーザーに切り替えています。

ハイフンの有無については、
>「-」の有無に注意してください。「-」があると、直接ログインしたときと同様に環境が初期化されます。
>つまり、カレントディレクトリは新しいユーザーのホームディレクトリとなり、環境変数もすべて初期化されます。
>「-」がなければ、現在の環境をそのままにしてユーザーだけを切り替えます。（中島能和「LinuC教科書　LinuCレベル１　Version10.0対応」p425）

ということのようです。

```bash
su -
パスワード:
```

ユーザー名を省略すると、rootユーザーへの切り替えが行われ、パスワードを求められます。

```bash
su - postgres
#ユーザーをpostgresへ切り替えて
psql test
#psqlコマンドでtestサーバーへアクセスします
￥d
#￥マーク（あるいはバックスラッシュ）dとすることで、testサーバー内にある、テーブルを一覧表示できます
￥d table
#また、￥dの後ろにテーブル名を入力することで、そのテーブルにあるカラムを一覧表示できます
```

suコマンドでpostgresユーザーに切り替えた後、psqlコマンドで対象のサーバーを指定したら、
SELECT～等のSQL文を書いていくことになります。
ユーザーを切り替えるとそのままですので、ctrl + d で元のユーザーに戻ることができます。

# sudoコマンドについて
sudoコマンドの場合ですと、sudoから続けて一行でSQL文まで書くことができます。

```bash
sudo -u postgres psql table -c "SELECT~";
```

sudoコマンドからuオプションでpostgresユーザー切り替え、psqlコマンドからtableというDBを指定し、
続けてコマンドを打つのでcオプション、ダブルクォーテーションで囲んでSQL文が入力できます。

```bash
sudo -u postgres psql table -f /var/test.sql
```

また、SQL文をファイルにまとめている場合、cオプションをfオプションに変えることで実行できます。
上記の場合ですと、/var 配下にあるtest.sqlファイルを実行しています。

ただ、sudoコマンドは毎回ユーザーを切り替えてSQL文を書かなくてはならないので、
suコマンドで一度切り替えてしまった方が、何回もSQL文を書く場合には良いかもしれません。

#まとめ
postgresユーザーに切り替えるための、suとsudoの違いについて記載しました。
もっと奥が深いかと思いますが、これから学習していきます。
転職完了したのでいろいろまとめ

# 転職活動のまとめ
  - 前職
    - メーカーのなかの開発をする部署の社内SE　サーバ管理とか自動化とか 
    - あんまりプログラムは得意ではない。サーバの管理とかをやっていた。
    - だからといってきちんとサーバやネットワークを設計できるわけではない。
    - 使っていた言語はgroovyとpythonとshellくらい。
  - 受けた会社と業種
    - AI系の会社のバックエンド開発
    - 社内SE
    - SREエンジニア
    - SIer
  - 転職理由
    - オンプレのシステムばっかりだったから、クラウド関係のことをしたかった。
    - 前の会社の体制が僕に合わなかった。

# 会社をやめてから、新しい会社に内定をもらうまで半年間ニートした。
 - 転職して半年ニートをしていた期間があった下記のことをやっていたと思う。
   - たくさんの人と会話した。
        - いろんな人と会話した。いろんな社長とか経営者とか。
   - 旅に出ようとした。
        - コロナの関係で旅に出られなかった。残念だった。いろんな世界をみたいと思っていた。
        - ホントはワーキングホリデーしたかった。
   - 本は暇な時に読んだ。結構、読めた。
        - 知識をinputする時間がほしかった。前の会社に勤めていた時はアウトプット重視で働いていたので、あんまり本をじっくり読む時間を取れていなかった。
        - SREとかクーバネティスとかネットワークスペシャリストとか応用情報処理技術者とかの本を読んだ。
   - ゲームもした。ゲームは楽しいと思った。
        - むかしからゲームはよくやっていたので、楽しかった。

# 転職活動の時によく聞かれたこと
 - 会社やめて何してたの？
    - 勉強とかゲームとか。
 - なんで、前の会社で働いてるときに転職活動しなかったの？
    - ゆっくりする時間がほしかったのと、勉強とかゲームとかしたかったし、まとまった時間がほしかった。
 - 前の会社でできなかったことをなんで新しい会社(ベンチャー)でできると思ったの？前の会社の方がお金もあるし、転職しなかった方が自由にできたと思うけど？
 - 会社選びの軸にしていることは何？
    - 社会的な価値
    - 会社で抱えてる課題に私がどのように解決できそうか。働いた時に戦力になりそうか？
    - コロナの状況なので、働き方が自由に選べる
 - ストレス耐性について
 - これまでの働き方について。
    - これについては、コロナ以降フルリモートが多いので、フルリモートで働いたことあるか？ということだった。前職でもリモートで働いていたことを伝えた。
 - 一番辛かったこととどうやって解決したか。
 - 後輩を育成した経験があるか？