OmniAICreator/Qiita-1.07M huggingface dataset:
【Google Cloud Day'21】「DX を加速させるための Google Cloud でのエンタープライズ データ活用」を視聴して

例えば、自動車業界でいうと、もともと自動車を作ってた会社ともともとITの会社が自動車業界に参入したのでは、アプローチの仕方が違う。Googleも右側だが、Maas観点で考えることができる。
CXを通じて顧客への価値が提供される。接客やウェブでの操作もはいる。いい接客をするには従業員の考えも変えないといけないのでEXも重要。その基盤になるのがデータ。
構築が容易になったが、活用ができていなので、それが早めに顕著に表れるようになった。
事業部だけでは活用できない。基幹システムが認識している暗黙の知識とかも共有してほしい
一つのBIでデータ分析も可能になってきた。分析基盤はSaasに近いので、AWSをIaasで使っていても、データ分析のSaasはGCPが優れているから、GCPにするというのも可能
BIも進化していて、連携するだけですぐにデータを活用することも可能になってきている

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/db03cb34-f6cf-fe38-4b51-b7118a993be0.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/fa10d83f-13cc-42cf-07e9-8418f4a3ba57.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/895ec234-104e-e07e-1c60-f4c34f492825.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/87ca4b0d-b41b-f425-2af2-f0da0508059b.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/a0676a4e-0ea6-34b4-bfcd-973a4b55120e.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/23328d9f-f22d-e88f-f990-9345585347fa.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/55bd6651-ec6c-ce42-21c5-4769f566adb5.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/9a8d0dc7-a7d4-8aaf-3c0b-e4b217eb1029.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/1e14bbaa-b2fe-efd1-e02f-b3ecaae26a75.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/df739225-d4f8-c397-635a-e74cdb37d5a5.png)
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/9febb63e-28b4-cb9b-807d-ef4da449baa9.png)
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/c3b6d76d-33b2-5a67-6ca1-fa259077215b.png)
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/8266615e-21ab-66c5-7017-4b2d9a4ca6bc.png)
UE4 Blueprint ローカル変数の使いどころについて


主に非プログラマー向けにBP関数のローカル変数の使いどころについて書き留めたものです。
状況によってはここに書かれている物が必ずしも正義というわけではありませんが、無駄なメンバ変数の撲滅など開発の手助けになれば幸いです。



## 関数内でしか使用せず、次の更新まで値の保持が必要ない変数
メンバ変数とローカル変数のざっくりとした違いとして、適用されるスコープ（参照出来る範囲）が違うのはお気づきかと思います。
必要以上にスコープを広げる事は想定外の使われ方をされたり、他の変数を探す際のノイズになったりなど、開発効率に悪影響を及ぼす可能性があります。
そのため、関数外での使用を予定していない場合はメンバ変数を作るのは避けるようにしてください。
※ただしメンバにして調整したい定数のような扱いをする変数に関してはこの限りではありません。

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97



## Pure関数や行った計算の結果を何度も使いまわす場合

Pure関数は戻り値が参照される度に関数が実行され、値が再評価されます。
つまりPure関数内で重たい計算をしていて（しかも同じ結果）それを複数回呼んでいる場合だと、無駄な処理をしてしまっている可能性があるので注意しましょう。


Pure関数とNonPure関数の違いについてはヒストリアさんの記事がよく纏まっているのでこちらを参照してください。

https://historia.co.jp/archives/3929/


## 値に名前を付けたい時
複雑な計算や条件式を書いた際にはその処理に対して何をしているかのコメントを書くと思います。
その際に処理を説明するような名前のローカル変数に格納して使用する事を検討してみてください。
このようにローカル変数を使用した場合、コメントを見ないでも変数から計算の意味や意図が読み取れるので
ノードが乱雑になりにくく読みやすさが向上し、バグの早期発見の手助けになるなど有用な事が多いです。

またその処理が関数化できるのであれば、こちらも合わせて検討してみてください。

---
VScodeのJupyterでマークダウンのテキスト選択ができない問題の解決法

先日のアップデートでVScodeのJupyterの見た目(だけじゃないと思うけど)が大きく変わり、色々良くなった反面、マークダウンのテキストを選択しようとすると手のひらマークになって選択できない問題がありました。今回はその解決法がわかったので共有しておきたいと思います。

#解決方法
1.ツールバー(+コード +マークダウンとかあるやつ)の右の・・・を選択
2.「ノートブック レイアウトのカスタマイズ」を選択
3.「Notebook: Drag And Drop Enabled」のチェックを外す

以上で完了です。

今回[こちらの記事](https://qiita.com/uikou/items/c27f39c52b3eda8526d5)を参考にさせていただきました。感謝します。アップデートがわかりやすくまとめられていたのでぜひご覧になってください。

それでは失礼します。
AnsibleでAmazon Linux2にamazon-cloudwatch-agentを入れる

AnsibleでAmazon Linux2にamazon-cloudwatch-agentを入れてデータを取得する基本設定です。

# 設定ファイル
ここではウィザードで作ったBasicなEC2 Linuxの監視設定を利用します。

```sh
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
```


ファイルは以下の通りです。

```ansible/roles/amazon-cloudwatch-agent/files/amazon-cloudwatch-agent.json
{
    "agent": {
        "metrics_collection_interval": 60,
        "run_as_user": "cwagent"
    },
    "metrics": {
        "append_dimensions": {
            "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
            "ImageId": "${aws:ImageId}",
            "InstanceId": "${aws:InstanceId}",
            "InstanceType": "${aws:InstanceType}"
        },
        "metrics_collected": {
            "collectd": {
                "metrics_aggregation_interval": 60
            },
            "disk": {
                "measurement": [
                    "used_percent"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "mem": {
                "measurement": [
                    "mem_used_percent"
                ],
                "metrics_collection_interval": 60
            },
            "statsd": {
                "metrics_aggregation_interval": 60,
                "metrics_collection_interval": 10,
                "service_address": ":8125"
            }
        }
    }
}
```

# Ansibleタスク
collectdを使うためにepelを最初に有効化しています。

```ansible/roles/amazon-cloudwatch-agent/tasks/main.yaml
---
collectd.html
- name: Enable epel repo
  shell: amazon-linux-extras install epel -y

- name: Install collectd
  yum:
    name: collectd
    state: latest

- name: Install amazon-cloudwatch-agent
  yum:
    name: amazon-cloudwatch-agent
    state: latest

- name: Copy amazon-cloudwatch-agent config
  copy:
    src: amazon-cloudwatch-agent.json
    dest: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
    mode: '0644'

- name: Fetch amazon-cloudwatch-agent config
  shell: |
    /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
      -a fetch-config \
      -m ec2 \
      -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json \
      -s

- name: Restart amazon-cloudwatch-agent 
  systemd:
    name: amazon-cloudwatch-agent.service
    state: restarted
```


IAM権限あるAmazon Linux2のEC2サーバーならこれを適用するだけで、CloudWatch AgentによるOS上からの情報取得が動くはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116068/1ebb2e49-8ba1-f5c7-7ef8-5eff61560982.png)
Couchbaseコマンド解説 cbrestore

### cbrestore

#### 説明
このツールは`cbbackup` コマンドを使用してバックアップされたデータを復元します。
ターゲットクラスターは、データのバックアップ元と同じクラスターでも、別のクラスターでもかまいません。ただし、このツールはバケットを作成しないため、ターゲットクラスターにバックアップ先として指定したバケットが存在する必要があります。

#### コマンド基本構文

```
cbrestore <バックアップディレクトリ> <ターゲットURL> --username <ユーザー名> --password <パスワード> [オプション] 
```

#### 競合解決（コンフリクト・リゾリューション）

cbrestoreを使用してバックアップから復元する場合、CouchbaseServerは復元するすべてのドキュメントに対して競合解決を実行します。これは、バックアップ後に更新されたドキュメントが復元プロセスによって誤って上書きされないようにするためです。その結果、復元プロセスを実行した後、一部のドキュメントがバックアップファイルの内容と一致しない場合があります。クラスター上でドキュメントが最近削除された特定のケースでは、この競合解決のためにドキュメントがまったく復元されない場合があります。
同じキーで現在のドキュメントを上書きしながらバックアップの内容を復元するためには、cbrestoreコマンドオプションの一部としてパラメータ`conflict_resolve=0` を渡します。 


#### 操作例

最も基本的な操作は、バックアップディレクトリにあるすべてのバックアップを復元することです。

復元するには、次のコマンドを使用します。この場合、クラスターにはすでに`beer-sample` という名前のバケットがあります。cbrestoreターゲットクラスターにバケットが作成されないことに注意してください。

```
$ cbrestore ~/backups http://10.112.193.101:8091 -u Administrator \
  -p password
```

`cbrestore` コマンドを実行すると、`~/backups` ディレクトリ内のすべてのデータがターゲットクラスターに復元されます。バックアップ内のバケットのいずれかがターゲットクラスターに存在しない場合は、エラーが返されます。次のように`-b` 、フラグと`-B` フラグを使用して、あるバケットを別のバケットに復元できます。

```
$ cbrestore ~/backups http://10.112.193.101:8091 -u Administrator \
  -p password -b beer-sample -B new-bucket
```

これにより、`beer-sample` のバックアップデータがターゲットクラスターの`new-bucket` バケットに復元され ます。バックアップに複数のバケットが含まれている場合、-bフラグを使用して復元できるのは1つだけです。

復元には、復元するバックアップのサブセットのみを選択する機能もあります。

バックアップディレクトリに次のような4つのバックアップが含まれている場合：

```
backups
└── 2019-06-25T141453Z
    ├── 2019-06-25T141453Z-full
    │   └── bucket-beer-sample
    ├── 2019-06-26T141553Z-diff
    │    └── bucket-beer-sample
    ├── 2019-06-27T151453Z-full
    │   └── bucket-beer-sample
    └── 2019-06-28T161553Z-diff
        └── bucket-beer-sample
```

次に、次のコマンドを使用して、最初の2つだけを復元できます。

```
$ cbrestore ~/backups http://10.112.193.101:8091 -u Administrator \
  -p password -b beer-sample --from-date 2019-06-25 --to-date 2019-06-27
```

このツールは、キーに基づいてドキュメントをフィルタリングする機能も提供します。`-k` フラグに正規表現を指定すると、復元される式に一致するキーを持つドキュメントのみが生成されます。

```
$ cbrestore ~/backups http://10.112.193.101:8091 -u Administrator \
 -p password -b default --k '^user:.*'
```

上記のコマンドは、プレフィックスが`user：` のキーを持つドキュメントのみを復元します。
① CUDA-PCL評価用のROS2(Foxy)  Docker構築

# 必要なもの

Jetpack 4.5.1がインストール済みのJetson AGX Xavier。

## ROS2用 Docker

まず、ROS2 Dockerをインストールします。

```
#!/bin/bash

docker run \
    --runtime=nvidia \
    -it \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v /home/jetson/data:/home/jetson/data \
    -e DISPLAY \
    -e QT_GRAPHICSSYSTEM=native \
    -e QT_X11_NO_MITSHM=1 \
    -v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:ro \
    -v /etc/localtime:/localtime:ro \
    -v /tmp/argus_socket:/tmp/argus_socket \
    -v /dev/:/dev/ \
    -u jetson \
    --privileged \
    --network=host \
faborobot/ros2-foxy-jetson
```
## 次回以降の起動用にScript化

Jetson AGX Xavierのユーザ名がjetsonの場合に、XAuthorityを使わずにセキュアな接続が可能です。以後の作業は、Jetson AGX Xavierのユーザ名がjetsonを前提にします。ユーザ名が、jetsonではない場合、XAuthorityでの認証をオススメします。

`run_ros2.sh`

```
#!/bin/bash

docker run \
    --runtime=nvidia \
    -it \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v /home/jetson/data:/home/jetson/data \
    -e DISPLAY \
    -e QT_GRAPHICSSYSTEM=native \
    -e QT_X11_NO_MITSHM=1 \
    -v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:ro \
    -v /etc/localtime:/localtime:ro \
    -v /tmp/argus_socket:/tmp/argus_socket \
    -v /dev/:/dev/ \
    -u jetson \
    --privileged \
    --network=host \
faborobot/ros2-foxy-jetson
```

```
sudo ./run_ros2.sh
```

## デモ(直接Jetson AGX Xavierにログインしている場合)

```
rviz2 
```

## デモ(SSHでJetson AGX Xavierにログインしている場合)

```
export DISPLAY=:0
rviz2 
```

## 次の項目

https://qiita.com/akira-sasaki/items/56551e62f9d93efcf6f5
POWERSHELL　バッチを叩く人それぞれの名前をエクセルに書き込み、マクロを起動させる

```powershell
# Excelオブジェクト作成
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false

# 既存のExcel
$book = $excel.Workbooks.Open("指定したエクセルのパス")

# シート取り出し
$sheet = $excel.Worksheets.Item("書くシート")
$sheet2 = $excel.Worksheets.Item("名前を保存するシート")

# sheet2に個別の名前を保存

$sheet2.Cells.Item(1,4) = "個別の名前"

#namとゆうマクロを起動

$excel.Run("nam")

$book.Save()

# 閉じる
$book.Close()

$excel.Quit()
[void][System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($sheet)
[void][System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($sheet2)
[void][System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($excel)


```
時系列データ分析でグループ毎に欠損データを補うスゴ技テクニック

時系列データでグループ毎にリサンプリングして欠損行の補間を行う処理に困ったので共有
例えば、こんな店舗別の売上データがあったとして、

```
shop	date	sales
A	2020-01-01	100
A	2020-01-04	200
B	2020-01-02	300
B	2020-01-03	400
C	2020-01-02	500
C	2020-01-04	600
```

各店舗で売上が無かった日は売上０として行を補完したいとする。
最終的に手に入れたいデータとしては↓のイメージ

```
shop	date	sales
A	2020-01-01	100.0
A	2020-01-02	0.0
A	2020-01-03	0.0
A	2020-01-04	200.0
B	2020-01-01	0.0
B	2020-01-02	300.0
B	2020-01-03	400.0
B	2020-01-04	0.0
C	2020-01-01	0.0
C	2020-01-02	500.0
C	2020-01-03	0.0
C	2020-01-04	600.0
```

日付インデックスをグループ間で粒度を揃え、同じグラフ内で可視化したい場合や、
グループを跨って日付単位で集計したい場合などには、このような粒度でデータを揃えたいときありますよね。

グループによっては間の日付が歯抜けしていたり、期間の始まりと終わりが一致していない、
なんて言う時に綺麗にデータを整えることができるので是非紹介したい方法になります！

説明にあたり、まずはサンプルデータを準備します。

```python
# データ準備
sample = pd.DataFrame({
    "shop": ["A", "A", "B", "B", "C", "C"],
    "date": pd.to_datetime(["2020-1-1", "2020-1-4", "2020-1-2", "2020-1-3", "2020-1-2", "2020-1-4"]),
    "sales": [100, 200, 300, 400, 500, 600],
})

```

`pd.pivot_table`でまずは横展開し、`fillna`メソッドでNan値に０を代入


```python
data = pd.pivot_table(sample, index="shop", columns="date").fillna(0)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658983/755a0066-5cc4-fdb5-613d-dbaf5b19aef4.png)

`stack`メソッドで再度、縦に展開

```python
data = data.stack().reset_index()
data
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658983/ffb00cb0-1bb8-7168-90b9-b95e46443953.png)

できた！！
CROSS JOINをつかって日付とグループの組み合わせテーブルをわざわざ作成する必要がないので、少ないコード量で実現できて楽チンですね！
Pug内にPHP記述する

HTMLのテンプレートエンジンであるPugとPHPとを共存させる方法について書き留めておきます。

# .　で直接PHPを記述する
Pugの仕様でピリオド（.）の後のインデントの中のテキストはコンパイルされず、そのまま出力されます。
それを利用します。

```Pug:index.pug

.
    <?php 

    require("configfile.php");

    ?>


html
    head
        meta(http-equiv="X-UA-Compatible" content="IE=edge")
        title
        meta(charset="utf-8")
        meta(name="description" content="")
        meta(name="author" content="")
        meta(name="viewport" content="width=device-width, initial-scale=1")
        link(rel="stylesheet" href=path_css+"style.css")
        link(rel="shortcut icon" href="")

        script(src=path_js+"model.js") 

```


# 属性値などでPHPを利用する
クラス名などの属性値では、上述の書き方は利用できませんので、属性値に直接PHPを記述します。このとき属性値内の"<"と">"がコンパイルされないように 属性 != "属性値" の形で =の前に!をつけることでエスケープさせます。

```Pug:index.pug
section(class!="<= $class_name?>")
```
【ReactNative】バージョン管理のいろいろ【iOS/Android】

## 概要

ReactNativeでアプリを作っていく中で、諸々のファイルで管理しているバージョンが多くて、
たまに分からなくなるので備忘としてまとめました。

## 共通

### アプリバージョン

```native/package.json
"version": "1.0.0",
```

```native/package-lock.json
"version": "1.0.0",
```

## iOS

### Xcode設定のバージョン
DebugBuild用、ReleaseBuild用とわけてバージョン管理をすることができる。
管理しなくてもビルドは可能。

```native/ios/app-name-native.xcodeproj/project.pbxproj
// Debug
CURRENT_PROJECT_VERSION = 1;

// Release
CURRENT_PROJECT_VERSION = 1;
```

### アプリバージョンおよびビルドバージョン

AppStoreConnectにアップロードした際は、ビルドバージョン（CFBundleVersion）が見られるため、
ビルドバージョンを重複させてアップロードすることはできない。

```native/ios/app-name-native/Info.plist
	<key>CFBundleShortVersionString</key>
	<string>1.0.0</string>

	<key>CFBundleVersion</key>
	<string>1</string>
```

```native/ios/app-name-tvOS/Info.plist
	<key>CFBundleShortVersionString</key>
	<string>1.0.0</string>

	<key>CFBundleVersion</key>
	<string>1</string>
```

```native/ios/app-name-native-tvOSTests/Info.plist
	<key>CFBundleShortVersionString</key>
	<string>1.0.0</string>

	<key>CFBundleVersion</key>
	<string>1</string>
```

## Android

### アプリバージョンとバージョンコード

バージョンコードは、iOSのビルドバージョンとほぼ同義。
PlayStoreConsoleへのアップロードのたびにバージョンアップが必要。
（公開前ならリリースを破棄して、バージョンアップせずにアップロードが可能。）

```native/android/app/build.gradle
  versionCode 1
  versionName "1.0.0"
```

## CodePush
CodePushを使っているため、configでアプリバージョンを管理。

``` confing.json
  "versions": {
    "scheme": "app-name://",
    "app": "1.0.0"
  },
```
3年後の今日の曜日

3年後の今日の曜日を表す方法

package Week;

import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.Period;


public class Week {

	public static void main(String[] args) {
	
	//現在日付※自主的
	LocalDateTime date1 = LocalDateTime.now();
	System.out.println("date1 : "+ date1);
	
	//３年後の現在時間※自主的
	System.out.println(date1 + "の３年後:"+ date1.plus(Period.ofYears(3)));
	
	
	//３年後の曜日
	LocalDateTime date2 = LocalDateTime.now();
	System.out.println("date2 : "+date2);
	 
	 
	DayOfWeek  dayofweek = date2.getDayOfWeek();
    System.out.println("曜日：" + dayofweek);
	
    DayOfWeek  dayofweek3 = date2.plusYears(3).getDayOfWeek();
	System.out.println("3年後の今日は"+date2.plusYears(3));
	System.out.println("3年後の曜日：" + dayofweek3);
	
  
	}

}

実行結果
date1 : 2021-06-16T11:57:56.848633900
2021-06-16T11:57:56.848633900の３年後:2024-06-16T11:57:56.848633900
date2 : 2021-06-16T11:57:56.851625400
曜日：WEDNESDAY
3年後の今日は2024-06-16T11:57:56.851625400
3年後の曜日：SUNDAY


①LocalDateTime date2 = LocalDateTime.now();で現在の日時を表す　（date2はなんでもいい）
②表示
③DayOfWeek  dayofweek = date2.getDayOfWeek();　で曜日を表す
④DayOfWeek  dayofweek3 = date2.plusYears(3).getDayOfWeek();　で３年後の曜日を表すインスタンス生成
⑤System.out.println("3年後の今日は"+date2.plusYears(3));　で３年後の今日を表示
⑥System.out.println("3年後の曜日：" + dayofweek3);　で３年後の曜日を表示

import java.time DayOfWeek
import java.time LocalDateTime

パッケージを含めたクラス名のことを完全修飾名と言います。本来、クラスを一意に特定するためには、完全修飾名で記述しなければなりません。しかし、to.java.code.sample.basic.Animalのような名前を毎回記述するのは面倒です。
そこで、あらかじめ利用するパッケージをインポート（import）しておくことで、コード内ではパッケージを省略して記述できるようになります。import命令は、一般的にpackage宣言の直後に記述します。
Gmailで7日経った下書きメールはGASで自動で削除する

# はじめに
こんにちは。実家の畑を勝手に耕しているおじさん問題で、毎朝1時間おきにパトロールしに行ってます、筆者です :innocent: 

さて、**Gmail**に気づいたら**下書きメール**が溜まっていたなんてことはないでしょうか？
自動で保存してくれるので、**スマホの電池が途中で切れたり**、**間違ってアプリ起動落としちゃったり**したときに、下書きとして残っているのはありがたいことです。

ただ、それで気づいたら下書きメールが溜まっていたりします...。
いつのなんのメール何だこれ？:thinking: 

なので、7日経った下書きはもう消してしまうことにします:pray:

# Gmailで7日経った下書きメールはGASで自動で削除する

コードはシンプルでこれで行けます:ok_hand:

```js
const main = () => {
  const now = new Date()
  const messages = GmailApp.getDraftMessages()
  for (let i in messages) {
    if (messages[i].getDate() < new Date(now.getFullYear(), now.getMonth(), now.getDate() - 7)) {
      messages[i].moveToTrash()
    }
  }
}
```

# トリガーを毎日セット
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/260111ee-f778-73be-8d9f-16b916caf8a2.png)

# 補足
以下の記事のコードとがっちゃんこすると、トリガー1つでいいかもです！

https://qiita.com/akitkat/items/f4070b81d85af2f9a354

# おわりに
気づいたらゴミ溜まっているなんてことが多いGmail。自動でお掃除するのって大事だと思います:v:
それでは！
Springの動的クエリの作成方法まとめ



# 動的クエリの作成方法

調べたことをまとめてみる。間違っている所もかなりあると思いますがよろしくお願い申し上げます。
違っていたらコメント欄に書いていただけると嬉しいです。よろしくお願い申し上げます。

## 結論

**作成方法は複数ある**

### 方法

1. Specifiacation
1. QueryDSL

### 記述方法の種類
 
1. NativeQuery(`@query`アノテーションにSQLを直書き)
1. JPQL
1. CriteriaAPI


#### CriteriaAPIとSpecifiationはどちらを選ぶべきか？

結論：Specifiationを使うべき

SpecifiationはCriteriaAPIのラッパー

- CriteriaAPIは作成した　Predicateを再利用できない
- Specifiationは再利用が可能

#### SpecifiationとQueryDSLのどちらを選ぶべきか？

結論：好みによる

JpaSecificationExecutorを使うと、標準のJPA CriteriaとMetamodel APIを中継する。
Metamodel API はマッピングに基づいてメタモデルを作成し、コンパイル時にタイプセーフにするために使用される。

一方、QueryDSLはJPAに限定されないフレームワーク。
JPAに限らず、SQL、Collections、MongoDB、Luceneなどでも利用が可能




参考URL(いつもありがとうございます)
---

- 公式ドキュメント
    - [Advanced Spring Data JPA-Specifications and Querydsl](https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl)
    - [2.5. Specifications](https://docs.spring.io/spring-data/data-jpa/docs/1.7.x/reference/html/#specifications)


- 他
    - [Spring Data JPA の Specificationでらくらく動的クエリー](https://qiita.com/tag1216/items/3a408d2751a6310e2948)
    - [Spring Data JPAで動的にクエリを生成する（複数ワード検索）（ページング対応）](https://qiita.com/parapore/items/80a88a774ae11eaebbed)
    - [JPA Specificationで複数キーワードによる絞り込み検索](https://qiita.com/ibara1454/items/7d65d75a910dced33b50)
    - [Spring Data JPA でのクエリー実装方法まとめ](https://qiita.com/tag1216/items/55742fdb442e5617f727)
    - [SpringBoot お役立ちサイト集（随時更新）](https://qiita.com/mikoski01/items/3f5f8793415248eacca6)
    - [Creating JPA query with Date in Spring](https://stackoverflow.com/questions/48382486/creating-jpa-query-with-date-in-spring)
    - [JpaSpecificationExecutor vs QueryDslPredicateExecutor](https://stackoverflow.com/questions/51712539/jpaspecificationexecutor-vs-querydslpredicateexecutor)

- 参考リポジトリ
    - [spring-data-jpa-workshop](https://github.com/fred4jupiter/spring-data-jpa-workshop/blob/dc16ce16ec779941b86b3522e56c37b3617361a3/src/main/java/com/opitzconsulting/springdata/jpa/repository/CustomerRepository.java#L18)
    - [spring-data-specifications](https://github.com/yaqine/spring-data-specifications)

- youtube

<iframe width="560" height="315" src="https://www.youtube.com/embed/Zcs7tnK_7ec" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Zyqpo8gxSO0?start=2376" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
gitのコマンドをエイリアスで簡単化する

#はじめに
gitのコマンド打つのがめんどくさい。
bashでエイリアスを設定して簡単化する。

#本文
gitのconfigでも設定できるらしいが、それはあくまで名前の省略などが出来るだけ。自分はとんでもないめんどくさがりやなので頻度の高いコマンドはオプションなども全部まとめて指定しておきたい。

```ruby:.bashrc
alias ga='git add .'
alias gst='git status'
alias gcm='git commit -m '
alias gps='git push'
alias gpl='git pull'
alias ud='. ~/.bashrc'
alias opb='code ~/.bashrc'
```
ついでに他のコマンドも簡単化している。いままでは

```
git add .
git commit -m "コメント"
git push 
```
と打たないといけないのが

```
ga 
gcm "コメント"
gps 
```
で完了する。

#おわりに
アーキテクチャの授業で習った「よく使う命令を高速化すれば全体が高速化される」というのを思い出してやってみた。いまのところはgitのコマンドでよく使うのはこれくらいなのでいいかなと。


#参考文献
なし
URLについて

#はじめに

本記事は動画( https://youtu.be/0KXQAW3Ttfw )で説明に使用している
スライドを記事化したものです。動画と合わせて御覧ください。
[![-DrdYw8fHwc](http://img.youtube.com/vi/0KXQAW3Ttfw/0.jpg)](http://www.youtube.com/watch?v=0KXQAW3Ttfw)

# URLとは

Uniform Resource Locatorの略称。
インターネット上のリソース（データやサービス）を特定するための形式的な表示方法
類似した言葉URI (Uniform Resource Identifier)、意味はURLと同じ。
使用できる文字は、RFC 3986で定められています

# URLの成分

![#2 URL (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487565/0ef31237-748d-d064-6471-fe2e75b23caa.png)

# プロトコル指定

プロトコルとは通信方法や通信規格のこと。
一般的なWebブラウザが対応しているプロトコル
- HTTP	| http://xxxx			平文通信
- HTTPS	| https://xxxx			暗号化通信
- FTP	| ftp://xxxx			ファイル転送
- FILE	| file://x:\xxxx\xxxx.txt	ローカルファイル（ファイルエクスプローラーと同様)

使用できるプロトコルはブラウザに依存。

# サーバ指定(ドメイン or IPアドレス)

<dl>
<dt>サーバ指定部分がドメインの場合</dt>
	<dd>ブラウザはDNSサーバに問い合わせを行いドメイン文字列からIPアドレスを取得し、<br/>
	IPアドレスでサーバにアクセスを行う。</dd>

<dt>IPアドレスの場合</dt>
	<dd>ブラウザはIPアドレスを元にサーバにアクセスを行う。</dd>

<dt>localhostについて</dt>
	<dd>localhostは使用しているPCのDNS機能がlocalhostをIPに変換している
	ローカルネット内ではローカルDNSが参照しているマシーン名でも可能</dd>
</dl>

# サーバ上のファイル指定

サーバの公開ディレクトリからの相対パス
<dl>
<dt>Webサーバ側の処理で</dt>
<dd>ファイル指定のファイルが存在有無、存在していればファイルの内容を返却する。
	指定ファイルがCGIプログラムである場合は、実行結果の標準出力を返却する。
</dd>
<dt>CGIプログラムか？否かについて</dt>
<dd>Webサーバの設定ファイルにて定義し、主にファイル拡張子で判別設定を行う。</dd>
</dl>

# URLの成分Ⅱ

![#2 URL (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487565/d28a58f4-0833-3954-b5f9-23915ac1bb31.png)

# URLエンコード・デコード

URLで使用できる文字列(RFC 3986)以外の文字をURLとして記述する方法としてURLエンコードがあります。
便利だと思ったvscodeショートカット集

#はじめに
調べればいくらでも出てくるが、多すぎて逆にまとまらない。個人的に知らなくて便利だと思ったショートカットをまとめる。適宜追加削除する可能性あり。UbuntuやWSLで使ってるので混ざってるかも。

#本文

| キー | 動作 | 
|:--|:--|:--|:--|
| Ctrl　+　移動キー | 単語ごとの移動 |
| Shift + 移動キー | 選択、Ctrlも押すことより効率的に | 
| Ctrl + Shift + K | 行ごと削除 |
| Alt + 移動キー | 選択したものを行ごと移動 |
| Ctrl + H | 置換、Cntr + Alt + Enter ですべて置換|
| Ctrl + K Ctrl + F  |選択範囲のフォーマット（フォーマッター必要）|
| Ctrl + K　Ctrl + C | コメントアウト|
| Ctrl + K　Ctrl + U | コメントアウト解除|
| Ctrl + /| コメントアウトと解除、上のやついらないんじゃ、、、|
| Ctrl + L | 行選択。押し続けることで選択できる行が増える|
| Shift + Home or End |行頭、行末に移動しながら同時に選択可能| 
| Ctrl + B | サイドバーの開閉|
| Ctrl + @ | ターミナルを開く|

#おわりに
作業効率あげたい。
それではまた。

#参考文献
[1]:https://qiita.com/12345/items/64f4372fbca041e949d0

[[1]]:VS Code の便利なショートカットキー
VBA  エクセル　今日の日付分のみ、入力最終行から上に検索してセルに色付け


```vb
Sub check()
    Dim str As String
    str = Format(Now(), "Short Date")　'今日の日付をstringで保存
    Range("C1").End(xlDown).Select
    
    While ActiveCell = str　'今日の日付であれば繰り返す
　　　　'やりたい処理
        If ActiveCell.Offset(0, 2) = "" Then
            ActiveCell.Offset(0, -2).Interior.ColorIndex = 1
        End If
        If ActiveCell.Offset(0, 3) = "" Then
            ActiveCell.Offset(0, -2).Interior.ColorIndex = 9
        End If
        If ActiveCell.Offset(0, 4) = "" Then
            ActiveCell.Offset(0, -2).Interior.ColorIndex = 3
        End If
        If ActiveCell.Offset(0, 5) = "" Then
            ActiveCell.Offset(0, -2).Interior.ColorIndex = 4
        End If
        If ActiveCell.Offset(0, 6) = "" Then
            ActiveCell.Offset(0, -2).Interior.ColorIndex = 5
        End If
        If ActiveCell.Offset(0, 7) = "" Then
            ActiveCell.Offset(0, -2).Interior.ColorIndex = 6
        End If
        If ActiveCell.Offset(0, 11) = "" Then
            ActiveCell.Offset(0, -2).Interior.ColorIndex = 7
        End If
        If ActiveCell.Offset(0, 13) = "" Then
            ActiveCell.Offset(0, -2).Interior.ColorIndex = 8
        End If
　　　　'やりたい処理終了　　　　　

        '一つ上に移動してセレクト
        ActiveCell.Offset(-1, 0).Select
    Wend
    
End Sub

```
商品削除機能の実装

本日、商品削除機能の実装が完了した。苦労したのは以下のコード。  

 def destroy
    if current_user.id == @item.user_id
      redirect_to root_path if @item.destroy
    else
      render :show
    end
 end　　


コードを読み解いていくと

（１）現在ログインしているユーザー（current_user.id）と
　　　商品を出品しているユーザーが一致しているかどうか判定。

（２）（１）の条件式が正しくて（true）
　　　出品した商品が削除されたのなら
　　　トップページに戻る。



（３）もし商品が削除されなければ商品詳細ページに遷移するという流れになる。



最初は以下のようにコードを書いていた。  

def destroy
    if @item.destroy
      redirect_to root_path if current_user.id == @item.user_id
    else
      render :show
    end
 end



上記のように書くと商品が削除された後に
現在のユーザーと出品者が一致しているのか判定される。



エラーが出る訳ではないものの
アプリが予期しない動きをする可能性がある。

そのため修正を行なった。
重みあり有向グラフの隣接行列と隣接リスト（Java）

###問題

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_graph_step4

重みあり有効グラフの隣接行列と**隣接リスト**。
可変長配列がちょっとややこしいJavaで厄介なのは隣接リスト。

でも「もう配列は現場で使わないかな。Listが基本だと思う」とTwitterでフォロワーに言われたので慣れましょうとかなんとか。
現場に入る未来があるかどうかは別として。

###コード

```java
import java.util.Scanner;
import java.util.ArrayList;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        int m = sc.nextInt();
        
        int[][] gl = new int[n][n]; //隣接行列
        ArrayList<TreeMap<Integer, Integer>> al = new ArrayList<TreeMap<Integer, Integer>>(); //隣接グラフ
        
        for(int i=0; i<n; i++){
            TreeMap<Integer, Integer> tm = new TreeMap<Integer, Integer>();   //グラフ初期化
            al.add(tm);
        }
        
        for(int i=0; i<m; i++){
            int a = sc.nextInt()-1;
            int b = sc.nextInt()-1; //aからbに向かう枝が
            int k = sc.nextInt();
            
            gl[a][b] = k;   //行列を1にする
            
            al.get(a).put(b, k);
        }
        
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                System.out.print(gl[i][j]);
            }
            System.out.println("");
        }
        
        // System.out.println(al);
        
        for(int i=0; i<n; i++){     //グラフ表示
            for(Integer key : al.get(i).keySet()){
                System.out.print(key + "(" + al.get(i).get(key) + ")");
            }
            System.out.println("");
        }
    }
}
```

###覚書
１．新しくクラスを作ってみるなど迷走したが、HashMapを使えばいいんだと気づく。

２．HashMapだと「keyの順番（ノード名）」でソートするところで躓いたので、TreeMapで実装。

３．何気に一番時間かかったのここだと思う。外側のArrayListを順番に取ってきて、中のTreeMapのkeyを取ってきて（このfor文の書き方も覚えないとだな……）、key表示とkeyの中身を……

```java
        for(int i=0; i<n; i++){     //グラフ表示
            for(Integer key : al.get(i).keySet()){
                System.out.print(key + "(" + al.get(i).get(key) + ")");
            }
            System.out.println("");
        }
```

###参考

https://living-sun.com/ja/java/469478-java-adjacency-list-implementation-of-graph-with-directed-weighted-edges-java-graph-linked-list-adjacency-list.html

https://qiita.com/niwasawa/items/9ca65eb4d5f836c72ce8
ポートフォリオは徐々にアップデートしていくべき

ポートフォリオは徐々にアップデートすべき理由を列挙していきます。

## 結局ポートフォリオも使ってもらってなんぼ

これが一番だと思いますが、結局のところ企業だろうと個人だろうとWEBサイトWEBアプリは使ってもらってなんぼだと思います。
使ってもらえない、もしくは使えない、使ってないアプリやサイトは不要ですからね。

最近見た動画ですが、YouTubeで有名なセイト先生のアプリがクローズの話がありましたが、あれが良い例だと思います。
ビジネスでやるなら初動で数百人にダウンロード、課金8人は正直お金になりません。
https://youtu.be/ZXvkU-JDgRM

だからこそポートフォリオでフリマアプリやツイートアプリはあまり価値がないんです。
なぜなら使われないから。
フリマアプリやツイートアプリなんて、もう既存のもので十分じゃないですか。

そして何より使ってもらうためには公開しないといけないです。
公開してこそ、初めて使用できるため、無駄に技術やインフラにこだわりすぎて、いつまで経っても公開できないアプリとHerokuでデプロイして、運用しながら、使ってもらいながら、追加機能実装や改善をしているアプリどちらが良いかなんて明白です。

## そもそも未経験の技術力なんてたかが知れてる

未経験が技術力で勝負、なんて絶対に無理です。
それこそ「舐めてんのか？」って話であって、そんなことよりもアプリを作って公開して、使って改善して、ここまでをやってきたかどうか、という点が重要なのであって、それはきちんとしたアプリであれば、きっとプロのエンジニアの方はわかるはずなんです。
（Githubのイシューとか）

## 上記の理由から作ったアプリはとっとと公開すべきです。

仮にそれがHerokuでも良いです。
大事なことは作って、公開して、改善してというサイクルをいかに回すか。
それに加えて、なぜそのアプリを作ったのか、これからどんなアプリを作りたいのか、これをきちんと言語化することが一番大事だと思います。
あとはそれを伝わるような構成にすれば良いのかなと。

## 技術的な話

### アプリの機能面

まずはある程度の機能で公開してしまって良いと思います。
その上でユーザーから「こんな機能が欲しいなぁ」というのを追加していけば良いかと。

### インフラ面

Herokuでデプロイ、というのは結構地雷扱いされがちですが、最初は仕方ないと思います。
最初からAWSで独自ドメインで、なんて難易度が高い。
ということでまずは

Herokuでデプロイ→S3の導入→EC2でサーバー構築→独自ドメイン

こんな順番が良いのかなと個人的には思ってます。

最低でもS3の導入は必須ですかね。
Herokuでデプロイしたものは画像が一定期間過ぎると期限切れになってしまうので。

### 環境面

インフラ面でAWSを導入できたら、次はDockerの導入→CircleCIの導入という順番になると思います。

ここまでできればポートフォリオとしては十分だと思います。

## まとめ

ポートフォリオで大事なポイント

- アプリは使ってもらってなんぼ。ユーザーからのレビューに対してアクションを取るためにもとっとと公開。
- AWS、Docker、CircleCIの導入は公開後に徐々に行なっていく。
【Linux】mount, umountについて

# 概要
マウントとはハードウェアをソフトウェア的に認識させること。

# 実践

## mount
```
mount /dev/sdb1 /mnt
```
このコマンドを実行するとsdb1として認識されているハードウェアをソフトウェア的に認識させ流ことができる。
`/dev/sdb1`はデバイスファイル
`/mnt`はマウントポイント

```
    /
    ├── mnt
    │   └── dev
    │        └── sdb1
    │
```

## umount
```
umount /mnt
```
/mntにマウントしているデバイスをアンマウントすることができる。

```
umount /dev/sdb1
```
というように、マウントポイントではなくマウントしているデバイスを指定することも可能

# fstabについて
自動マウントするためのファイル
fstabを更新した場合`mount -a`を実行する


```
/dev/sda1              /             ext4      defaults,noatime      0      1
/dev/sda2              none          swap      defaults              0      0
/dev/sda3              /home         ext4      defaults,noatime      0      2
```
-  1列目: デバイスファイル名
-  2列目: マウントポイント
-  3列目: ファイルシステムの種類
-  4列目: オプション


## ファイルシステムについて


| file system | 説明 |
|:-----------:|:----|
| ext2        |古いlinuxで使われていたファイルシステム。ジャーナリング機能がない。|
| ext3        |ext2にジャーナリング機能を追加したファイルシステム。|
| ext4        |現在のlinuxでの標準ファイルシステム|
| btrfs       |オラクル製ファイルシステム|
| xfs         |CentOS7のデフォルトファイルシステム|
| iso9660     |CD-ROM、DVD-ROMのファイルシステム|
| swap        |swap用のファイルシステム|
| auto        |どのファイルシステムかをマウントに推測させる。|
react-datepickerでバリデーションする方法

![image](https://img.menta.work/1600/post/1CEtDePa9jo4EVDopg4lzn7ODbMxVZd2BIi4ADCB.png)

react-datepickerを使うと、簡単にデータピッカーを作ることが出来ます。




今回の記事では、react-datepickerでのバリデーションを紹介します。




具体的には、例えばWebサービスのユーザー情報登録などで、生年月日を入力するシチュエーションを考えてみまして。




１５歳以上ではないと登録できないですよということを、バリデーションで実行してみようというものです。




react-datepickerでバリデーションをする方法




まず、下記のようなDatePickerコンポーネントがあったとして、maxDateという引数を使うと、




●●●●年前の設定は出来ないという風にすることができます。




```js
<DatePicker
selected={startDate}
onChange={handleChange}
maxDate={TimeValidation}
/>
```



では、TimeValidationを見てみるとどうなるかと申しますと、こんな感じになります。




今日の日付から、１５年前（5475日前）を指定することで、それ以前の日付からしか日付を選べなくなります。

![aaaaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/c01ce686-b0a4-6987-71c2-cf14150c354e.png)



例えば、今が２０２１年だったら、２００６年よりも前に生まれた人しか生年月日を入力できません。



```js
const initialDate = new Date();

const TimeValidation = initialDate.setDate(initialDate.getDate() - 5475);

```


以上になります。




react-datepickerには、他にも色々な引数を使えるので、是非とも色々調べてみてください。




下記の記事を参考にしました。




[React Datepicker and Timepicker Component with Validation using react-datepicker Example Application](https://www.freakyjolly.com/react-datepicker-using-react-datepicker/)


[react-datepickerでバリデーションする方法 off.tokyo](https://off.tokyo/blog/react-datepicker/)
FAX受信サービス


FAX廃止がついに官公庁でも言われて来ましたが、いまさらFAX受信を処理する必要がでてきました（涙。ということで、[Twillioかな...と思ったらサービスが終了](https://cloudapi.kddi-web.com/news/latest/twilio-programmable-fax-end-of-life-on-december-17-2021)との事でしたので、ちょっと調べて見ました

# InterFAX

https://www.interfax.jp/index.html

Twillioからの紹介先。APIは充実している。月額チョットタカイ。

| 初期 | 月額 | 枚数課金 |
|:-:|:-:|:-:|
| ¥1,650 | ¥2,420  | 1000枚以上で11円/枚  |

## 開発情報

https://www.interfax.jp/developer/index.html

# 秒速FAX Plus

https://fax.toones.jp/plus/

履歴、PDF取得のAPIのみ。

| 初期 | 月額 | 枚数課金 | 
|:-:|:-:|:-:|
| ¥1,100 | ¥1,030  | 無し（月額プランによる）  | 

## 開発情報

https://fax.toones.jp/plus/system/fax_api.html

シンプルな感じ。受信のWebhookみたいなのは無さそうなのでトリガーはメール処理で、過去分とかのチェックはAPI経由ですかね。

# KDDIペーパレスFAX

https://biz.kddi.com/service/cloud-data-center/fax/

APIは無いがGoogleDrive連携有

| 初期 | 月額 | 枚数課金 | 
|:-:|:-:|:-:|
| ¥1,100 | ¥1,045  |  | 

## 開発情報

https://web.pl-fax.com/information/help/

API無し。Googleドライブ連携からの連動有。留守番電話的な機能とかFAX機からの取り出しとか電話サービスのおまけ的な感じ。ドライブ連携以外はちょっと作りが古い気がするのでちょっと不安...。

# ぶつぶつ

InterFAX程充実したAPIを使う必要は無いので、秒速FAXが使いやすそうだが、結局添付メールを処理する前提であればKDDIのサービスがGoogleDrive連携があるので手離れが良くて（場合によってはノンプログラミングなので）良いかもしれないな。ということで、検討中です。
[Rails] MVCモデルを深掘る~View編~

## はじめに
*※基本的なMVCの考え方や使い方はこの記事には記載していません。*

Railsで用いられているMVCモデルの考え方。始めてRailsに触れたときは本当に理解に苦しめられました。
今でこそ、なんとなく使い方がわかってきて、コントローラーで各アクションを定義してその対応するビューを作ってあげてみたいにやってますけど、なんとなくなんです。なんとなくじゃダメだ！って思いまして。。。

今回から3回にわたってM(モデル）、V（ビュー）、C（コントローラー）それぞれの仕組みを深掘りしていきたいと思います。
今回はビューを掘り下げていきます！よろしくお願いします。

## Action View

HTMLなどのレスポンスをブラウザに表示するビューの機能は**Action View**という仕組みによって実現されています。ビューファイルで使うerbの拡張子を持つファイルはAction Viewの仕組みに含まれているERBを利用しています。

##ControllerとViewの関係
Railsアプリケーションでは、app/viewsディレクトリの中にコントローラー名と同じ名前のディレクトリが作成されることによって、コントローラーとその対応するビューが関連づけられています。そしてビューファイルがブラウザへ返されるまでに、その対応したビューファイルにレイアウトや部分テンプレートも組み合わさって表示されます。ビューファイルがそのままブラウザに返されているわけではなく、Action Viewによってまとめられてから返されているのです。

controllerとviewの関係といえば、コントローラーで定義したインスタンス変数が対応したviewの中でも使用できますよね。これは、ただ単純にコントローラーに定義したから対応したビューで使えるといったことではなく、Railsの中で定義されている複数のメソッドたちを通して、読み替えられ、Action Viewに渡されています。そしてもう一度ビューファイルのインスタンス変数としてセットされて、使えているという仕組みです。

感覚的にcontrollerで定義したからviewでインスタンス変数が使えていますし、その表現が間違っているわけでもないですが、Railsに搭載されている様々なメソッドによってcontrollerで定義したものがviewで使えるんだということは頭の片隅に置いとくべきですね。

本当の意味で仕組みを理解するためにはRails自体を構築しているソースコードを読み解く必要があるようですが。。。


## ヘルパーメソッド

ビューファイルの中でよく使うlink_toやform_withらはヘルパーメソッドと言い、あらかじめ定義されている処理です。
ヘルパーメソッドは自分で作ることもできます。
ERBタグを使ってRubyの記述をビューファイルに書くことはできますが、一連の処理をビューファイルに書くよりも、ヘルパーメソッドを自分で作ってまとめた方がすっきりとしたコードに見えます。

ヘルパーメソッドを作成するためにはHelperというモジュールを使います。

## モジュール

Rubyのクラスみたいなものです。しかしモジュールはインスタンスを生成できません。
下記のように定義します。

```Ruby
module モジュール名

end
```

モジュールの中にクラスを定義することも可能です。

```Ruby
module Sample
  class Test
  end
end
```

上記の例でTestクラスを呼び出す。↓

```Ruby
Sample::Test
```

インスタンスを生成したいときはクラスを使い、処理だけが必要な時にモジュールを使うという認識でOKです。

モジュールの中にクラスを定義することで、もし上記の例でTestクラスが複数あったら、下記のように区別ができます。

```Ruby
module Sample1
 class Test
 end
end

module Sample2
 class Test
 end
end

Sample1::Test
Sample2::Test
```

## Helper
ヘルパーメソッドを作るためのモジュールです。
app/helperの配下に用意されています。application_helper.rbや各コントローラーに対応したhelperファイルに処理を定義することでヘルパーメソッドとして使えます。

```Ruby:application_helper.rb
module ApplicationHelper
  def sample
    # sampleというヘルパーメソッドです
  end
end
```

1行目に注目してください。実際には◯○Helperと定義されています。
また、上記のようにヘルパーメソッドを定義したら下記のようにビューファイルで使用できます。

```erb:index.html.erb
<%= sample %>
```

ビューファイルにRubyの処理を長々と書いたり、同じ処理を繰り返し使う場合はヘルパーメソッドとして切り出した方が好ましいです。


## 最後に
自分で書いときながら、オリジナルアプリでビューファイルにガッツリRubyの処理を書いていて、反省です。モジュールについて学んだことは完全にスコーンと頭から抜けていたのでいい振り返りになりました。今回のことを実際に活かしていけるようにしていきたいですね。
Tableauにて作ったVIZをテンプレートっぽく使いたい

# 概要
ID-POSといったある程度フォーマット・カラムの決まったデータに関してダッシュボードを作った場合、また別の機会に同じダッシュボードを作りたい！
テンプレートなどを用意しておけば、すぐ作成できるしいいじゃないか！

って思ったのですが、そこでハマったので、メモにしたいと思います


# 　【OK】ユニオンを使って入れ替える
いろいろ試したのですがこれが一番シンプルにうまくいきました

まず、もととなるTableauワークブックを複製します。
今回は
- 202101_clientA_subscription　＜こちらに入れ替えたい＞
- 202102_clientB_subscription　＜もともとVIZに設定されているテーブル＞

というBigQueryのテーブルを想定して記載します。

とあるVIZで、こんなデータソースを設定しています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140981/841d64ef-a0af-c6cc-3d94-2367c34bb375.png)

こちらにユニオンに加えます。
入れ替え対象のテーブルの上に、入れ替えたいテーブルを持っていくと「ユニオン」ってのが出てきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140981/159aedff-5e8a-0f99-066c-a952f9a3173b.png)

ユニオンの編集をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140981/b7e6c433-5c76-a36c-d7bf-0b326df8e028.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140981/9a1e2c10-bf15-f1f5-37c0-6ada218d855e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140981/d0e36870-9035-32c6-ef94-1b197c3d2d6d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140981/86265128-8281-4e47-3714-0f0a74a5d515.png)

これで、テーブルの入れ替えは完了！
ただし、基本的に同じテーブル構成である必要はあります


# 試していないこと
## Viewを作ってその中で対象のテーブルを変える
ただ、これをやると・・・前のVIZも変更がかかってしまうよなぁ・・・


# 【失敗】twbファイルを直接編集
当該のデータセット名をテキストエディタなどで置換するという方法を最初に試しました。
が・・・・このファイルをTableauで開こうとするとエラーが出て開けない

まぁ、正規のやり方ではないので単純なデータセット名の置換だけではうまく行かなかったと思われます

#　【面倒】データソースを消して新しいものを入れる
正直、作り直しと同じぐらい手間が・・・

#　【面倒】テンプレートを手本に見ながら作り直す
まぁ・・・・より洗練されていいものができるかもしれません・・・できることは多いですがガガガ
[Ruby on Rails]画像をリンクにする方法

初めに...学習期間1ヶ月未満の超絶初心者です。
不明点等を整理するために記述しており、
誤り、勘違い、理解不足等　多々あるかと思います。



<h1>Ruby on Railsで画像をリンクにする方法。</h1>


```perl:app/views/post_images/index.html.erb

<% @post_images.each do |post_image| %>
<div>
  <%= link_to post_image_path(post_image.id) do %>
    <%= attachment_image_tag post_image, :image %>
  <% end %>
:
:
```

link_toの後ろでリンク先URLを指定しています。
今回の場合、post_image_path(post_image.id)にリンクするように指定いるので、
生成されるリンクは、http~~~~~~/post_image/:id （←:idには３とか４とか。）になります。

<h1>link_toの　do、end って何！？

ずっと、謎でした。このdo...
何をdoしてるのかわかりませんでしたが、
link_toでは、do から　end の間がaタグで囲まれた状態になるそう...
結果、<%= attachment_image_tag post_image, :image %>で表示されてる画像が、
aタグに囲まれたimgタグになってくれる。
勉強したことは記事にして公開しといたほうが良いかもなぁ

と思った。

1年ぐらい触ってないと忘れちゃうし、、、

忘れた時に、過去の自分がどの辺まで理解してたかを知れるのに意味がある。。。

勉強時間の1割ぐらいはそういう記事を書くのに費やしても良いかもなぁ
Laravelでカスタムバリエーションを本格的にやる

Laravel5時代にかなりつくり込んで、Laravel8で久しぶりに触ったのでメモ。

カスタムバリデーションに関してドキュメントにはRulesってのを追加するというものが書かれています。
https://readouble.com/laravel/8.x/ja/validation.html

でもリクエストをつくってバリデーションしたい時にあまり良くなさそうです。
いくつか方法がありそうですが、本格的にカスタムする場合、大元のValidatorをカスタムにしてしまうのが良さそうです。

## Validatorのカスタム
Laravelの基本の動きのカスタムときたら、プロバイダーを作って呼び出すようにすればOKですね。
`app/Providers/ValidatorServiceProvider.php` を作成。
`config/app.php` で呼び出しを書いておきます。

```php:ValidatorServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ValidatorServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot(): void
    {
        $this->app['validator']->resolver(function($translator, $data, $rules, $messages, $customAttributes) {
            return new \App\Custom\Validator($translator, $data, $rules, $messages, $customAttributes);
        });
    }
}
```

上記の例の場合 `app/Custom/Validator.php` を用意します。
中身は `\Illuminate\Validation\Validator` を継承して、 `validateXXX()` って関数を作れば、ルールで `xxx` が呼び出せるようになります。

```php:app/Custom/Validator.php
<?php

namespace App\Custom;

class Validator extends \Illuminate\Validation\Validator
{
    /**
     * 電話番号チェック
     *
     * @param  string  $attribute
     * @param  mixed   $value
     * @return bool
     */
    public function validateTel(string $attribute, mixed $value): bool
    {
        return preg_match('/^0[0-9]{1,4}-[0-9]{1,4}-[0-9]{1,4}$/', $value);
    }
}
```

## Translatorもカスタマイズしたい
そんなこともあるかもしれないです。
gettextで国際化してるときにとかで使いました。
そんなときは `$translator` をカスタムにしてやればOK。
Translatorは `Illuminate\Contracts\Translation\Translator` のインターフェースを実装しておけばOKです。

```php:ValidatorServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ValidatorServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot(): void
    {
        $this->app['validator']->resolver(function($translator, $data, $rules, $messages, $customAttributes) {
            $translator = new \App\Custom\Translator;
            return new \App\Custom\Validator($translator, $data, $rules, $messages, $customAttributes);
        });
    }
}
```
Power Automate Desktop<PAD>でエクセルデータの比較をする方法

事務系の方の仕事の中には、２つエクセルファイルを比べてファイルAにはあってファイルBにはない項目を抽出する、という仕事があります。
(ex.経理の入金処理、実売データの製品型番の名寄せetc)

Power Automate Desktopを使って、上記の業務を自動化してみました。Excelマクロは使いません。
私は野球が好きなので、広島カープの選手で2021年06月14日の試合にスタメンで出ているが、05月14日の試合にはスタメンで出ていない選出を抽出したいと思います。

<使用するエクセル　スクリーンショット>
※今回は比較するシートを同じエクセルブックに保存しています。
![2シート比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/9124ed41-2829-7cbd-02cb-bdd08b251d69.png)
<h2>作業の流れ</h2>
該当のエクセルファイルを開く
2つのシートの最初の空の行を取得する（マクロで良くやるアクションです。範囲の設定に使えます。）
2つのシートのデータが入っている範囲を取得する
データをリストに格納する(リストに取得）
リストの内容を減らす（Carp0614にあってCarp0514にないものを抽出）
新規エクセルファイルを開く
新規エクセルファイルに抽出した内容を貼り付ける

<PAD画面上のフロー>
![Flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/2b2239b0-c6f3-aa0a-5b77-414a3fb7bd30.png)

<h2>一番大事なのは、データをリストに格納するという作業です。</h2>

Excelワークシートから読み取りでデータを取得出来ているので
『ExcelData0614とExcelData0514を比較すればいいじゃん！』と思うのですが、
これはDataTableという型で保存されているのでこのままでは使えません。
データテーブル列をリストに取得させることでやっと使えるようになるのです。
下記の作業でColumnAsList0614とColumnAsList0514にデータを格納しています。
![リストに取得.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/c80188ec-dd80-5eb0-8004-3a34caea1e97.png)

その後の"リストの内容を減らす"の作業で、”ColumnAsList0614にはあるがColumnAsList0514にはない選手名”が変数：ListDifferenceに格納されたので、新規エクセルファイルを開き貼り付けます。
![減らした項目.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/7bb3f318-7839-37d7-9668-f473db579094.png)

（林選手は期待の若手です。コロナで主力が出れなくなり一軍に上がりました。坂倉選手はバッティングがいい若い選手です。薮田選手は復活が待たれるピッチャーです。）

フロー変数の結果は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/fd947377-9328-9f21-b3db-5bd4306f2ab5.png)

上記のような流れで、PADのアクションの<b>”共通リスト項目の検索”をすれば
”0514にも0614にもスタメンの選手を抽出する”</b>、といったことも出来ます。

以上になります。

私はコードを書くのが苦手なのでPADを使ってノーコードでプログラムを組めるのがとても良いと感じています。試してみてください。
displayプロパティの区別方法(inline・inline-block・block)


CSSのdisplayプロパティを使って、inline、inline-block、blockの3つを指定できます。

##インライン
インラインは横並びになる要素で、テキストにかかわる要素です。
Heightやwidthの指定ができないのが特徴です。

デフォルトでインラインになる要素は、「a」や「span」などです

##	インラインブロック（display:inline-block）
Widthやheightは指定できるものの、横に並んで表示されます。

デフォルトでインラインブロックになるものは、button、input、textareaなどです。

**ボタン**を作る時は、aをinline-blockに指定して、大きさを変えるのが一般的です。

##ブロック
ブロック要素は、要素が縦に並びます。Widthやheightだけでなく、marginも指定できます。

デフォルトでブロックになるのは、h1などの見出し要素、header、footer、div、p、ulなどです。
機械学習勉強記録 Lasso回帰で過学習を避ける

# 1 回帰
回帰とは、実測値に対して、アルゴリズムを選択し、実測値を近似できるように当てはめることです。
近似結果を直線で表現する線形回帰と、直線ではない形で表現する非線形回帰があります。

線形回帰の有名なアルゴリズムは、
単回帰分析、重回帰分、Ridge 回帰（リッジ回帰）、Lasso 回帰（ラッソ回帰）
などがあります。
非線形回帰の有名なアルゴリズムは、
決定木（回帰木）、ランダムフォレスト、ニューラルネットワーク
などがあります。

## 1.1 正則化とノルム
まず、正則化とノルムについて。
正則化(regularization)とは、過学習を抑制するためによく用いられる手法で、
目的関数に、「正則化項（モデルの複雑性に罰則を科すための追加の項）」を導入します。



ノルムは、平面あるいは空間におけるベクトルの「長さ」の概念です。
3次元までは図で示すことができるんですが、４次元以上になると図で示すことができないんですよね。
でも数式上では表すことができるという、感覚的に理解するのがなかなか難しいものです。
L2ノルムとL1ノルムがあり、
L2ノルム $||w||_2$ ＝ ベクトル成分同士の差の二乗和の平方根
L1ノルム $||w||_1$ ＝ ベクトル成分同士の差の絶対値の和
で表されます。

#2 Lasso回帰
Ridge回帰やLasso回帰は、
・アルゴリズム的に説明性が高いものを使いたい時
・変数の量があまりにも多く、人間の目で確認するのが難しい時で、特徴量の取捨選択をしたい時
に使われるアルゴリズムです。

Lasso回帰は重回帰分析に対して、L1ノルムを使用して正則化を行う手法です。
式で表すと、このようになります。

$ L=||Xw-t||_2^2+\alpha||w||_1$

そもそも目的関数$L$が0に近い時の重みを求めるのが重回帰分析でした。
$||Xw-t||_2^2$はノルムで書いてあるのでややこしく感じますが、
$Xw$は入力変数×重み、つまり実測値$y$
$t$は目標値で、
重回帰分析でいう$L=(y-t)^2$と同じと思って大丈夫です。
(実測値-目標値)の2乗が0に近いほど、目的関数として良いということだけ抑えましょう。

Lasso回帰では、重回帰分析に$\alpha||w||_1$という正則化項が追加されます。
なので、$L$を0に近づけるためには、$||Xw-t||_2^2$の中の$w$が小さくなる必要があります。
すると$w$が小さくなり、0になるものも現れます（こうして0になった$w$を含んでいる状態をスパース性がある、という）。
0になる$w$がいくつか現れれば、結果的に変数の数を減らすことができる、というわけです。

## 2.1 Lasso回帰の実装

Lasso 回帰も今までと同様に scikit-learn で簡単に実装が可能です。

```python
from sklearn.model_selection import train_test_split
x_train, x_test, t_train, t_test = train_test_split(x, t, test_size=0.3, random_state=0)
```
`train_test_split`で分割したデータをもとに、Lasso回帰をします。

```python
# モデルの定義
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=1)
# モデルの学習
lasso.fit(x_train, t_train)
Lasso(alpha=1)
# モデルの検証
print('train score : ', lasso.score(x_train, t_train))
print('test score : ', lasso.score(x_test, t_test))
```
ここで、`alpha=1`としているのは、正則化の強さを表します。
正則化項の値が大きくなればなるほど、重み$w$が小さくなるということですね。

原理を理解して使うのは骨が折れますが、
とりあえず、使い方だけ覚えておくのでも問題ないかなと思いました。
java objectのリストに対してソート

     
         List<Object> sortedList = flat.stream().sorted(new Comparator<Object>(){

     	    @Override
     	    public int compare(Object s1, Object s2) {
     	    	Object[] row1 = (Object[]) s1;
     	    	Object[] row2 = (Object[]) s2;
     	        return ((String) row1[9]).compareTo((String)row2[9]);
	     	    }
	
	     	}).collect(Collectors.toList());
PHP エラーログを別ファイルへ書き込む方法

LINEBOTの作成中にエラー文をブラウザー上で確認できないので、別ファイルに書き出して確認したいと思い調べたので備忘録として起こしておきます。


## 手順
###１.エラー文を書き込むファイルを作成
```terminal
debug.log
```
 権限の変更を変更しておく

```terminal
chmod 777 debug.log
```

### 2.エラーログの出力先の変更

```php
ini_set("log_errors", "on");
ini_set("error_log", dirname(__FILE__) . "/debug.log");
```
これでエラーログの保存先を変更することができます。
今回は[こちら](https://deep-blog.jp/engineer/13312/#error_log)を参考にさせていただきました。
pyinstallerで実行ファイル化したら"qt.qpa.plugin"が出た話

pythonは環境ごとにモジュールを入れなければいけないなど、非常に環境構築が面倒です。なので、実行ファイル化のためのツール「pyinstaller」はありがたい存在です。しかし、Ubuntuで実行ファイル化をして実際に動かしてみると、画像認識（OpenCV）が上手く処理していないことが判明。解決策があまり出てこなかったので、記録ついでに。

##作業環境
Ubuntu20.04
python(pyinstaller、opencv-python、opencv-contrib-pythonインストール済み)
※windowsは実行ファイル化の際にそれらしいdllファイルを作ってくれるので、今回のようなエラーは発生しないと思います。

今回は実行ファイルをonefileにせずpyinstallerを動かしています。

##エラー内容
```
qt.qpa.plugin: Could not find the Qt platform plugin "xcb" in "/home/ユーザ名/opt/etc/Desktop/dist/main/cv2/qt/plugins"
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
```
[以前投稿した画像認識処理と似たようなコード](https://qiita.com/sinsen9000/items/e2586cc5fdf9cb2f5fe0)を使用しています（画像取り込み→結果をウィンドウ表示）。
カメラで画像を取り込めたものの、取り込めた画像を表示できないようです。因みに画像取り込み自体ができていない場合は画像加工の処理で何かしらのエラーが出るはずです。

##解決策
結局のところ、pyinstallerのファイル参照が不十分なのが原因でした。
エラー内容と照らし合わせると、`cv2`フォルダの中にある`qt`フォルダを参照できなかったとのこと。なので、まずqtフォルダを作業環境のcv2フォルダからコピぺします（cv2フォルダは、デフォの環境なら`~/.local/lib/python3.8/site-packages`の中に入っているはず）。
これで、plugins以下のフォルダ・ファイルは認識可能となりますが、**この状態では全てのソースファイルを参照していない**ため、引き続きqt.qpa.pluginは出てしまいます。参照していないファイルの確認は、libqxcb.soを閲覧することで分かります。下が参照しきっていないソースファイルの一覧。

```
$ ldd main/cv2/qt/plugins/platforms/libqxcb.so | grep "not"
	libQt5XcbQpa-70670cdb.so.5.15.0 => not found
	libfreetype-8d3bcff4.so.6.14.0 => not found
	libz-d8a329de.so.1.2.7 => not found
	libQt5Gui-ca084835.so.5.15.0 => not found
	libQt5Core-d92f2856.so.5.15.0 => not found
	libX11-xcb-1ae4fd0e.so.1.0.0 => not found
	libxcb-icccm-413c9f41.so.4.0.0 => not found
	libxcb-image-e82a276d.so.0.0.0 => not found
	libxcb-shm-7a199f70.so.0.0.0 => not found
	libxcb-keysyms-21015570.so.1.0.0 => not found
	libxcb-randr-a96a5a87.so.0.1.0 => not found
	libxcb-render-util-43ce00f5.so.0.0.0 => not found
	libxcb-render-637b984a.so.0.0.0 => not found
	libxcb-shape-25c2b258.so.0.0.0 => not found
	libxcb-sync-89374f40.so.1.0.0 => not found
	libxcb-xfixes-9be3ba6f.so.0.0.0 => not found
	libxcb-xinerama-ae147f87.so.0.0.0 => not found
	libxcb-xkb-9ba31ab3.so.1.0.0 => not found
	libxkbcommon-x11-c65ed502.so.0.0.0 => not found
	libxkbcommon-71ae2972.so.0.0.0 => not found
```
これらを参照するには、`opencv_python.lib`フォルダを先ほどの作業環境からcv2フォルダと同じディレクトリ（今回の場合はmainフォルダ）へコピペする必要があります。opencv_python.libフォルダの中を見ると、大体同じようなファイルがいくつかあるかと思います。
![Screenshot from 2021-06-15 11-47-11 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669580/eb281d25-8253-e296-98ca-f95dde2319e5.png)
このフォルダをコピペして初めて画像取り込み結果のGUIが表示されます。
まとめを兼ねて、最終的なファイル構成図を載せておきます。使用環境からcv2とopencv_python.libを探して、必要なものをコピペするという感じですね。

```
main
  |- cv2（実行ファイル化の際にフォルダ生成）
  |   |- cv2.cpython-38-x86_64-linux-gnu.so（生成済み）
  |   |- qt（使用環境からコピペする）
  |       |- fonts
  |       |- plugins
  |            |- platforms
  |                   |- libqxcb.so
  |
  |- opencv_python.libs（使用環境からコピペする）
  |　　　　　　|- 各種ファイル
  |
（中略）
  |
  |- main（実行ファイル）
```
pyqt5でも同じようなエラーが出るらしいのですが、pyqt5の解決策だけでは足りないというのには注意ですね。
Proxmox VEのLinuxコンテナ内の/etc/hostsを保持する

ProxmoxでLinuxコンテナ内の/etc/hostsファイルを書き換えて再起動したところ、
/etc/hostsファイルの修正内容が消えていた。

保持するためには、コンテナのOS内で、/etc/.pve-ignore.hostsファイルを作成しないといけないらしい。
https://pve.proxmox.com/wiki/Linux_Container#_guest_operating_system_configuration

```
# touch /etc/.pve-ignore.hosts
```
これで消えなくなった。