OmniAICreator/Qiita-1.07M huggingface dataset:
【Power Automate】SharePointの「アイテムが作成または変更されたとき」トリガーでトリガー元アイテムを更新する場合の無限ループを回避する

#問題になる動作
SharePointリストで追加・更新されたアイテム自体に対して指定列にデータを入れるなどの処理をしたい場合、Power Automateの処理がフロー自身をトリガーしてしまい無限ループを起こしてしまう。

#本記事のシナリオ
① Power Automateによる更新処理のタイムスタンプを保存する列をSharePointリストに作成
② Power Automateで任意の更新処理＋実行時刻のタイムスタンプをSharePointリストに保存するフローを設定
③ フローにトリガー条件を設定（①のタイムスタンプが空欄/至近の時刻でない場合*のみ実行）
*至近の時刻として設定した間隔よりも短い間隔で行われた変更操作に対してはフローが実行されないことが制約となります。

#ステップ
① SharePointリストにPower Automateによる更新処理のタイムスタンプを保存する列を作成

> 列名：任意（本記事では「PA_Auto_Update」）
> 列タイプ：日付と時刻

② Power Automateで任意の更新処理＋実行時刻のタイムスタンプをSharePointリストに保存するフローを設定
utcNow()関数を使って「PA_Auto_Update」列に現在時刻のタイムスタンプが入るように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577061/8da07d79-74a5-ce08-137a-d5fb66dff1d1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577061/be2df9bc-d1d8-d0f6-1d43-772ee304eb1f.png)

③ フローにトリガー条件を設定（①のタイムスタンプが空欄/至近の時刻でない場合のみ実行）
トリガーの「・・・」のメニューからトリガー条件を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577061/2986f9a6-87f1-9a8f-7e5b-732a1e737a59.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577061/d022b495-da22-f4c1-7e14-0930de4dfb5f.png)
####例
「PA_Auto_Update」の時刻が空欄、または 3分前より過去の時刻の場合のみ実行する場合のトリガー条件は以下のとおりです。


```
@or(empty(triggerBody()?['PA_Auto_Update']),less(triggerBody()?['PA_Auto_Update'], addMinutes(utcNow(),-3)))
```

SharePoint側で既定値を設定するなどで「PA_Auto_Update」の空欄を想定しない場合は下記のみでもOKです。-3で3分前の時刻を指していますので、必要に応じてご自由に調整してください。

```
@less(triggerBody()?['PA_Auto_Update'], addMinutes(utcNow(),-3))
```
AppService(Windows,Linux)のJavaバージョンとJavaマイナーバージョンの指定・自動更新・固定化をまとめた

## WebApp（Windows） の Javaバージョン・Javaマイナーバージョンについて

<b>WindowsOS</b>の場合は、全般設定タブでJavaバージョン・Javaマイナーバージョンを両方とも設定できます。
Javaマイナーバージョンのポイントは、Java11(自動更新)と書かれてるものを選んだら、マイナーバージョンは自動で更新されます。
勝手に更新されたくなければ、マイナーバージョンが書かれているJava11.0.7などを選択すれば自動更新されずにバージョン固定できます。

## WebAppforLinux の Javaバージョンについて
<b>LinuxOS</b>の場合、Javaバージョンはメジャーバージョンは選択できますが、マイナーバージョンは指定できません。
指定できないのでマイナーバージョンは、新しいマイナーバージョンに勝手に自動更新が行われます。
自動更新のタイミングは、事前通知もなく、バッチによって順次リージョンごとに行われ、正確な適用時間はわかりません。
　
<b>サポートされている（利用可能な）Javaバージョンは以下の公式ドキュメントから確認できます。</b>
<center>https://docs.microsoft.com/ja-jp/java/azure/jdk/?view=azure-java-stable#supported-java-versions-and-update-schedule:embed:cite</center>

## ポータル画面から選択できないバージョンの設定手順
サポートしている（利用できる）すべてのバージョンが、ポータル画面から選択できるかと言うとそうではないんです。たとえば、Java7 はまだサポートされている（利用できる）状況ですが、ポータル画面の選択には Java8,11 しか選べません。  
　
そういう場合は、以下の手順で変更できます。
以下に紹介する手順は、WindowsOS・LinuxOS 共通です。Resource Explorer というものを使うのですが、この手順は知らない方も多いのではないでしょうか。是非試してみてください。
### ポータル画面で選択できないバージョンの設定方法
（１）Resource Explorer (https://resources.azure.com/) へアクセスし、対象サブスクリプションへログイン
（２）上部 [Search] より "Microsoft.Web/site" からアプリを見つける
（３）左部の対象アプリの config > web を選択
（４）[Edit] ボタンを押下して "javaVersion" を "1.7.0_51" へ変更
（５）[PATCH] ボタンを押下

## Javaバージョンの確認方法
Kuduサイトで java -version とコマンド入力すると、現在アプリケーションに適応中の Java のバージョンが表示される。
（１）Azure ポータル > 該当のAppService > [高度なツール] > [移動] のリンクを押下
（２）Kudu 画面で、上部の [Debug console] > [CMD] を選択
（３）下部のコンソールにて "Java -version" を入力（コマンドプロンプトと同じですね）

## WebAppforLinux で任意の Javaマイナーバージョン を使用する方法
<b>LinuxOS</b>の場合、Javaマイナーバージョンが指定できず自動更新されてしまうので、カスタムコンテナを使用する必要があります。

ざっくりとした流れとしては、
（１）WebAppforLinux のカスタムコンテナを作成する
（２）DockerHub から指定の Java バージョンのイメージをカスタムコンテナにプルする
ということをやっていくと、指定した Java のマイナーバージョン を WebAppforLinux で使用できます。  
　
### カスタムコンテナに関する公式ドキュメントを載せておきます。
　

<b>【公式ドキュメント】　カスタムコンテナ実行方法</b>
<center>https://docs.microsoft.com/ja-jp/azure/app-service/quickstart-custom-container?pivots=container-linux</center>
　
<b>【公式ドキュメント】　AzureAppService のカスタムLinuxコンテナ構成方法</b>
<center>https://docs.microsoft.com/ja-jp/azure/app-service/configure-custom-container</center>
　
<b>【公式ドキュメント】　AzureAppService のコンテナイメージのプル（格納）を行う方法</b>
<center>https://docs.microsoft.com/ja-jp/azure/app-service/configure-custom-container?pivots=container-linux#how-container-images-are-stored</center>
　
以上です。
Centos7のキーボードを日本語に

Centos7をインストールしたら、:を打つのにShift+;となっていたのでいつもの配置に直す方法を調べました。
#参考記事
https://www.toumasu-program.net/entry/2019/02/04/205957

#やり方
一時的に直す場合は以下のコマンドらしい。
```setxkbmap -model jp106 -layout jp106```


しかし、再起動後も配置を維持したいので、```/etc/X11/xorg.conf.d```を見てみた。
その中に```00-keyboard.conf```があったので中身を確認する。

```/etc/X11/xorg.conf.d/00-keyboard.conf
Section "InputClass"
Identifier "system-keyboard"
MatchIsKeyboard "on"
Option "XkbLayout" "us"
Option "XkbModel" "us"
Option "XkbOptions" "terminate:ctrl_alt_bksp"
EndSection
```
どうやらlayoutとmodelの場所を```jp106```に変えればいいらしい。
しかし、キーボードレイアウトが変わらなかったので再起動してみる。
###再起動
systemctl reboot またはshutdownなどで再起動したらしっかりと配置が変更されていた。
[Java]ループ処理について

### Javaのループ処理の種類
- for文
- while文
- do while

の３種類が存在する。

### それぞれのループの詳細について
#### for文 
```java
public class Abc{
    public static void main(String[] args){
        for(int i = 0; i < 3; i++)
            // iが３より小さい間、実行される処理
        }
    }
}
```
<em>for文の構造<em>
`for([初期化部]; [制御式]; [更新部])`

- 初期化部、制御式、更新部は省略することができる。制御式を省略した場合、判定が"True"になるので、"break"などを使用するなど、無限ループにならないように気をつけなければならない。
- 処理を実行する前に制御式を確認する。そのため、制御式が"False"だと処理が1度も実行されずに終わる。
- 制御式は、必ず"True"または"False"となるようにする必要がある。


#### while文
<em>使用例<em>

```Java
public class Abc{
    public static void main(String[] args){
        int i = 0;
        while(i < 10){
            // iが１０より小さい間、実行される処理(最低１回は実行される)
            i++;
        }
    }
}
```

<em>while文の構造<em>

```java
while([制御式]){
   //処理
}
```
-処理の前に制御式をチェックする。(1度も処理をしない場合がある)
- インクリメントやデクリメント等の記述を忘れると、無限ループになりやすい。
- "{}"を省くとwhile文の対象になるのは、whileの次の文のみ(1行とは限らない)になる。

```java
int i = 1;
  while(i < 10)
    if(i <= 9) { //このif文の処理はすべて実行される
	System.out.println("ループ脱出"); //ループ脱出
	System.out.println("成功");     //成功
	break;  
    } 
  while(i == 1)
    System.out.println(i +  "文目は実行される"); //無限ループ

    System.out.println("しかし、2文目であるこれは実行されない");
 
```


#### do while文
```Java
public class Abc{
    public static void main (String[] args){
        int i = 8;
        
        do{
           // iが９より小さい間、実行される処理
        }while(i < 9);
    }
}
```

<em>do while文の構造<em>

```java
do{
   // 処理
}while([制御式]);
```


- while文とは異なり、処理が終了したタイミングで制御式と比較するため、最低１回は実行される。
- while([制御式])の後に";(セミコロン)"が必要なので忘れないようにする。
SSH公開キーを使ってAzure VMにログインする in ラズパイ

## はじめに
ラズパイからSSH公開キーを使ってAzure VMにログインする機会がありましたので、手順をまとめておきたいと思います。

## 環境
- ラズパイ 3 Model B+
- Windows 10 Pro (Azure CLI 実行用）
- Azure CLI 2.21.0

## 手順
### 1. ラズパイ側でキーを作成する
パスワードを忘れずに設定します。

```bash
pi@raspberrypi:~ $ ssh-keygen -m PEM -t rsa -b 4096
```

キーが作成されたことを確認しておきます。

```bash
pi@raspberrypi:~ $ ls -la .ssh
合計 16
drwx------  2 pi pi 4096  4月  6 21:47 .
drwxr-xr-x 19 pi pi 4096  4月  6 21:23 ..
-rw-------  1 pi pi 3326  4月  6 21:23 id_rsa
-rw-r--r--  1 pi pi  740  4月  6 21:23 id_rsa.pub
```

### 2. Windows側で Azure CLI を使用してリソースグループを作成する
作成済みのリソースグループを使っても良いのですが、折角なので新たに作ってみます。

```powershell
az group create --name myResourceGroup --location japaneast
``` 

### 3. 1で作成したラズパイの公開キーをWindows側に持ってくる
方法は色々あるかと思いますが、今回はscpコマンドで行いました。
※WindowsでGitBash等を使ってコマンドを実行します。

```bash
scp pi@192.168.xxx.xxx:~/.ssh/id_rsa.pub ./
```

### 4. Windows側で Azure CLI を使用して VM を作成する

```powershell
az vm create --resource-group myResourceGroup --name myVM --image UbuntuLTS --admin-username azureuser --ssh-key-values id_rsa.pub
```
ポイントは `--ssh-key-values` で、ここに先ほどラズパイから持ってきた公開キーのファイルパスを指定します。

コマンド実行後に VM のパブリックIPアドレスが表示されるので控えておきます。

```
{
  "fqdns": "",
  "id": "/xxxx/xxxx/.../myVM",
  "location": "japaneast",
  "macAddress": "00-0D-xx-xx-xx-xx",
  "powerState": "VM running",
  "privateIpAddress": "10.0.0.4",
  "publicIpAddress": "138.xxx.xxx.xxx", ← これ！
  "resourceGroup": "myResourceGroup",
  "zones": ""
}
```

### 5. ラズパイ側で VM にSSHログインする
パスワードの入力を求められるので、1.でキーを作成する際に設定したパスワードを入力します。

```bash
pi@raspberrypi:~ $ ssh azureuser@138.xxx.xxx.xxx
```

ログインできると以下のように表示されます。

```bash
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-1043-azure x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Tue Apr  1 00:00:00 UTC 2021

  System load:  0.02              Processes:           111
  Usage of /:   4.5% of 28.90GB   Users logged in:     0
  Memory usage: 5%                IP address for eth0: 10.0.0.4
  Swap usage:   0%

0 packages can be updated.
0 of these updates are security updates.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

-bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

azureuser@myVM:~$
```

以上で終わりです。

## 参考ページ
[簡単な手順: Azure 内に Linux VM 用の SSH 公開/秘密キーのペアを作成して使用する](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/mac-create-ssh-keys)
Pythonでサイト一覧のステータスを取得する

お仕事でサイト内の全ページのステータスコード（リダイレクトを含む）を出す作業があったので勉強がてらPythonを使って出せるようにしてみた

## 事前準備

- pythonのインストール
- requestsライブラリのインストール
- ステータスコードを調べたいurl一覧が記載されてるtxtファイル

### txtファイルの例

```
https://www.google.com/
https://www.google.com/404/
```

## 実際かいたもの

```py
import requests

urllist = open('list.txt')
urls = urllist.read().splitlines()

for line in urls:
  res = requests.get(line ,allow_redirects=False)
  url = line
  status =  res.status_code
  print(url + " " + str(status))
```

## 内容の説明
最初にrequestsのインポート

```py
import requests
```

URL一覧を記載したtxtファイルを読み込んで改行で区切って変数にする

```py
urllist = open('list.txt')
urls = urllist.read().splitlines()
```

forを使ってurlのステータスを確認して、urlとセットでステータスをコードを表示させるように
※`requests.get`に`allow_redirects=False`のオプションを設定しないとリダイレクト先のステータスを読み込んでしまうので注意

```py
for line in urls:
  url = line
  res = requests.get(line ,allow_redirects=False)
  status =  res.status_code
  print(url + " " + str(status))
```
アセンブリ言語　strcpyを書いてみる

## コード

```nasm
section .text
	global _ft_strcpy

_ft_strcpy:
	push	rbp
	mov		rbp, rsp
	push	rdi
.copy:
	cmp		BYTE [rsi], 0
	je		.end
	movsb
	jmp		.copy

.end:
	mov		BYTE [rdi], 0
	pop		rax
	leave
	ret
```


## 今回使用したレジスタ

今回は、スタックフレームを使用するため、冒頭と最後でプロローグ、エピローグという処理をしています。

レジスタ|意味
-|-
rax | 汎用レジスタ
rsi | ストリング型の命令でコピー元（ソース）を示す場合に専用に使われます。
rdi | ストリング型の命令でコピー先（デスティネーション）を示す場合に専用に使われます。
bl | rbx(ベースレジスタ)の下位1byteのレジスタ

[Assembly Programming on x86-64 Linux (04)](https://www.mztn.org/lxasm64/amd04.html)

レジスタと引数の関係は以下のようになっています。

引数| レジスタ
-|-
第1引数 | RDI
第2引数 | RSI
第3引数 | RDX
第4引数 | RCX
第5引数 | R8

[x86 calling conventions - Wikipedia](https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI)

string系の関数の引数の順番の規則性を、アセンブリを読むことで理解できました。

## movsb

最初は以下のようにint i = 0;みたいな感じで、インクリメントしながら、rdiに値を入れていく処理を想定していました。

```nasm
.copy:
	cmp		BYTE [rsi + rax], 0
	je		.end
	mov		bl, BYTE[rsi + rax]
	mov		BYTE[rdi + rax], bl
	inc		rax
	jmp		.copy
```

movsbという命令を使えば、

```c
while(*s)
    *dst++ = *s++;
```

のような処理を1命令でかけるということがわかったので書換えました。
terraform workspaceを使って環境ごとにstateファイルを切り替える

## terraform workspace
- ディレクトリを切りなおさなくても、環境を切り替えることでそれぞれのstateファイルを管理するための機能

## 準備

### workspaceの作成
```
terraform workspace new prod
terraform workspace new stg
```

### workspace一覧の表示
```
terraform workspace list
```

### workspaceの指定
```
terraform workspace select prod
```

## terraformファイル
- AzureResourceGroupを環境ごとに作成するだけのもの
 
```main.tf
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=2.46.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "resource_group" {
  name     = "${var.env}-resourcegroup"
  location = "japaneast"
}

variable "env" {
        type = string
}
```


```terraform.tfvars.production
env = "production"
```

```terraform.tfvars.staging
env = "staging"
```

### terraform apply

#### staging
```
terraform workspace select stg
terraform apply -var-file=terraform.tfvars.staging
```

#### production
```
terraform workspace select prod
terraform apply -var-file=terraform.tfvars.production
```

こんな感じにできあがる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/d7541789-c7a2-f4aa-e518-62d1e95a7687.png)
[GCP] IAP接続をsshコマンドで実施する

gcpにて[IAP](https://cloud.google.com/iap)を使用して接続する際、下記のようなコマンドを入力すると思う

```bash:
gcloud beta compute ssh <hostname> --tunnel-through-iap
```

これを**dry-run**で動かすことで、sshコマンドへの渡し方がわかる

```
/usr/bin/ssh -t -i /home/<user>/.ssh/google_compute_engine -o CheckHostIP=no -o HostKeyAlias=compute.4394459190115035637 -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes -o UserKnownHostsFile=/home/<user>/.ssh/google_compute_known_hosts -o ProxyCommand /usr/bin/python3 -S /opt/google-cloud-sdk/lib/gcloud.py beta compute start-iap-tunnel bastion %p --listen-on-stdin --project=<project> --zone=<zone> --verbosity=warning -o ProxyUseFdpass=no <user>@compute.4394459190115035637
```

不要な設定など取り除き、configに落とし込む

```ssh:~/.ssh/config
host <hostname>
  user <user>
  hostname <hostname>
  identityfile ~/.ssh/google_compute_engine
  CheckHostIP no
  IdentitiesOnly yes
  ProxyUseFdpass no
  UserKnownHostsFile=~/.ssh/google_compute_known_hosts
  ProxyCommand gcloud beta compute start-iap-tunnel %h %p --listen-on-stdin --project=<project> --zone=<zone> --verbosity=warning --account=<account>
```

<>内は適宜変更してください
Flaskでraiseした時に、任意のエラーメッセージを返す方法。

## 目的

flaskアプリケーションにおいて、なんらかの不正を検知した時に、raiseをしつつアクセス元にもエラーメッセージを返したい。

- `return make_response("message", 400)`
- `raise Exeption("message")`

この２つの処理を同時にやりたい。



## コード

```python:myexception.py
class MyException(Exception):
    def __init__(self, message, code):
        self.code = code
        self.message = message
```

```python:server.py
from flask import Flask, make_response
from myexception import MyException

app = Flask(__name__)

#デバッグ用
some_check = False

@app.route("/", methods=["POST"])
def root():
    if some_check == True:
        #正常処理
        pass
    else:
        #異常発見
        raise MyException("400 error", 400)

    return make_response("ok",200)

@app.errorhandler(MyException)
def error_my_except(e):
    return make_response(e.message, e.code)
```

## アクセス結果
```console
$ gunicorn -b 0.0.0.0:5000 server:app
[2021-12-12 12:12:12 +0000] [32486] [INFO] Starting gunicorn 20.0.4
[2021-12-12 12:12:12 +0000] [32486] [INFO] Listening at: http://0.0.0.0:5000
[2021-12-12 12:12:12 +0000] [32486] [INFO] Using worker: sync
[2021-12-12 12:12:12 +0000] [32495] [INFO] Booting worker with pid: 32123
```

```console
$ curl -X POST localhost:5000
400 error
```

**raiseしながらresponseを返せました。** :smile: 


## 参考ページ
- [flaskでhttpステータスを返却する方法](https://qiita.com/mink0212/items/52e0ebd66bd94e1303c1)
- [「Flask」でのエラーハンドリングについて考える](https://liginc.co.jp/426034)
[自分メモ] 忘れそうなVSCodeのショートカット



##選択行のコメントアウト
command + /

コメントアウトを解除したい時も同様

##同じ文字列選択
command + d

##一行削除
command + x

##選択行入れ替え
option + 矢印↑↓

##区切りごとに移動
option + 矢印←→

##一番上、下に移動
command + 矢印↑↓

##一番右、左に移動
command + 矢印←→
GitHubのREADME.mdに載せるgif画像を作る

# 目的のコマンドはこちら

```zsh
ffmpeg -i origin.mp4 -vf scale=640:-1 -r 24 output.gif
```

---

普段のアプリ開発やちょっとしたプロジェクトを作ったときに、動作紹介用のgif画像が欲しいときが今まで多々ありました。

そのgif作成には**ffmpeg**を使っていますが、毎回そのコマンドを調べて叩いていたので、今回は備忘録として書いておこうと思います。

欲しいのはこんな感じのgifです。

![movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565474/0171c9f6-57da-8f63-c6ab-28fdf48c5ee9.gif)

# コマンド

```zsh
ffmpeg -i origin.mp4 -vf scale=640:-1 -r 24 output.gif
```

## -iオプション
入力ファイル名を設定。

## -vfオプション
`-filter:v`のエイリアス。
動画に効果を追加できます。

`scale=640:-1` と指定すると幅を640にして、全体のアスペクト比を保って縦サイズを自動計算してくれます。

## -rオプション
フレームレート指定をするオプション。
普段24fpsを指定しています。

# ffmpegのインストール
私はmacOSを使っていて、Homebrewというパッケージマネージャでインストールして使ってます。

コマンドはこちら！

```zsh
brew install ffmpeg
```

または、公式ページが有るのでこちらからのインストールも可能です。
（Linux, Windows, Mac）
https://ffmpeg.org/

![Screen Shot 2021-04-06 at 21.03.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565474/a474a011-5ae9-2a45-8ef2-0a07bc90a1eb.png)

# 最後に

前々からどこかに書いておきたいと思っていて今回やっとできました😁
**ffmpeg**を使えば楽にgif画像が作れるので、よければ是非試してみてください！

ちなみに今回上に貼ったgifは実際のリポジトリに貼っているものです。
（Appleのサンプルをなぞって練習しているリポジトリです）

https://github.com/branch10480/CompositionalLayoutsSample
SQL使いのためのCypher


グラフDBであるneo4jを操作するCypherについて勉強中。

公式の解説では「SQLライク」と売り文句が記載されている。個人的には、これが逆に理解の妨げになった。

SQLならわかるぜー、の気持ちで勉強するとさっぱりわからない。「予約語が似ている」ぐらいのの方がいいかもしれない。

SQLと異なるというところを重点的に記載したほうがわかりやすいのではないかと思い、勉強したことをメモする。個人の感覚を多分に含む。


# INSERT
SQLのINSERTにあたるのは、CypherのCREATEのような気がする。

CyhperのCREATEは、SQLにおけるCREATEというよりINSERTに似ている気がする。Cypherにはテーブルという概念がないのでCREATEに似ている気もする。

name属性にhogeを持つPersonノードを作成する。

```cypher
CREATE (Person{name:"hoge"});
```

複数まとめることもできる。

```cypher
CREATE (p1:Person{name:"hoge"}), (p2:Person{name:"huge"});
```

ここでのp1とp2は、SQLのASのようなものと考えたほうがいいかもしれない。汎用言語の変数と考えてもいいかもしれない。

```cypher
CREATE (p:Person{name:"hoge"}) 
RETURN p;
```

ノードを生成しながら、SQLのSELECTみたいなことをやっている。


# SELECT
SELECTが出たので、SELECTを書く。CyherのMATCHがそれにあたる。
CypherのMATCH...RETURN...がSQLのSELECTかもしれない。

```cypher
MATCH (p:Person{name:'hoge'}) 
RETURN p;
```

name属性が'hoge'のノードを返す。CypherにもWHEREがある。

```cypher
MATCH (p:Person) 
WHERE p.name='hoge' 
RETURN p;
```

一応、同じ結果が返ってくる。
CypherのWHEREは、結果のフィルタをするものらしく、SQLのHAVINGみたいなものという理解。


# エッジ
name属性がhugeのPersonノードから、name属性がhogeのPesonノードへ、Loveというエッジを引いてみる。

```cypher
MATCH (p1:Person{name:'hoge'}), (p2:Person{name:'huge'}) 
CREATE (p1)-[:Love]->(p2);
```

SQL的に言えば、INSERT...SELECT...が近い気がする。
なお、これもRETURNをつければ作成しながら、返るようだ。

```cypher
MATCH (p1:Person{name:'hoge'}), (p2:Person{name:'huge'}) 
CREATE (p1)-[e1:Love]->(p2) 
RETURN p1, e1, p2;
```
Vue.jsに触れてみた

# Hello worldの表示

初めに動作確認のためhello worldを表示してみる。

```html:sample.html
<head>
<meta charset="utf-8">
<title>Sample</title>
<!-- Vue.js の読み込み -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>

<div id="sample">{{ message }}</div>

<script>
    var sample = new Vue({
      el: '#sample',
      data: { message: 'Hello world!' }
    })
</script>
</body>
```
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588477/bfa6a5a7-0891-30ee-72a3-dafb52301251.jpeg)

HelloWorldが出た！

htmlでidを指定（ここではsample）を指定することでscript(el:'#sample)を呼び出し、
{{message}}部分にdata内容が表示される。

[前回](https://qiita.com/h1r0_1126/items/c01e2654f044654114e3)の続きだとcomponentsフォルダ直下にsample.vueを作成

```vue:components/sample.vue
<template>
    <div>
        <p>{{ text }}</p>
    </div>
</template>

<script>
export default {
    data(){
        return {
            text: "Hello_World!"
        }
    }
}
</script>
```

```vue:src/App.vue
<template>
  <div>
    <Sample></Sample>
  </div>
</template>

<script>
import Sample from './components/sample.vue'

export default {
  components:{
    Sample
  }
}
</script>
```

サーバ起動後
http://localhost:8080/

![WS000006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588477/1d8e15da-3f65-f08c-aabf-722fd691b6a2.jpeg)
【Swift】RxSwiftをTwitterで知り合った人に教えてもらったPart1

#はじめに
ある日、RxSwift難しいよ〜的なツイートをしていたら、Twitterで先輩エンジニアの優しい方がDMで教えてくれることになったので、教えていただいたことをまとめていきたいと思います。

#InputとOutput
InputとOutputを使うことで疎結合にできる
プロトコルを使ってインターフェースを作り、Viewはインターフェース(InputとOutput)を介してViewModelにアクセスする
ViewがViewModelにアクセスするときはインターフェースを介すことを必須化するため、Viewでは以下のように書く。

```swift:View
private var viewModel: ViewModelType
```

このViewModelTypeはprotocolで、以下のように定義する

```swift:ViewModel
protocol ViewModelType {
    var inputs: ViewModelInput { get }
    var outputs: ViewModelOutput { get }
}
```

このプロトコル(ViewModelType)をViewのviewModelプロパティの型にしてあげることで、ViewがViewModelにアクセスするときは必ずinputsかoutputsを経由しないといけなくなります。
これによって、viewModelがインターフェースでないプロパティに直接アクセスしてしまうことを防ぐことができます。

#次回の予習
次回にやることをあらかじめ教えてもらったので、それの予習をしておきたいと思います。
・observable(ストリーム)
以下のようなイベントを検知するクラス
onNext, onError, onCompleted

・observer
observableがイベント発生元に対して、observerはイベント処理

・subscribe
observableを購読することができ、イベントを検知してクロージャを実行する

・accept
acceptでRelayに.nextイベントを送ることができる

#おわりに
[次回](https://qiita.com/REON/items/c7f3d72995170f472701)
やっぱり難しいことを理解する最短の手は理解している人に教えてもらうことですね!
javascript テンプレートリテラルについて

こんばんは！taroです！
本日はjavascriptでテンプレートリテラルについて学びました！

テンプレートリテラルを用いると、文字列の中に定数（変数）を入れることができます！やり方は簡単で、文字列の中で「${定数}」とするだけです！複数の変数や定数を埋め込むことも可能です。

ただ、注意点があって、文字列全体をバッククォーテーション（`）で囲む必要があります。これは意外と忘れてしまいやすいの気をつける必要があると思いました。
Railsで画像を貼り付ける方法

画像の挿入といえば、HTMLの場合

```
<img src="ファイルパス">
```
Railsの場合

```
<%= image_tag "ファイルパス", オプション %>
```

というのが準備されていますが、何が違うのか？
ということで、調査しました。結果、下記サイトにたどり着きました。

https://www.autovice.jp/articles/8

まとめると、
image_tagだと、アセットパイプラインの仕組みで変更された画像のファイル名に変換してimgタグを生成してくれるが、
imgタグだと、変換前（保存されてるファイル名）のファイル名で呼び出そうとしてしまうので、該当するファイルがないということで、何も表示されないといったことが起こります。

詳しく説明すると、app/assets/配下のJavaScript、CSS、そして画像はアセットパイプラインという仕組みでコンパイルされていて、画像の場合は以下のようなファイル名に変更されています。

```
main.png
 ↓アセットパイプラインの仕組みで変更されたファイル名
main-35f2b73749c6caa946cd67b9eb73bc199f56f9c03aaee1d25360af09eccf5942.png
```
image_tagを使うと、自動的に変更後のファイル名を呼び出してくれるので、特にこだわりがなければimage_tagでOKかな。
「アセットパイプライン」についてはまた後日。。。
【Mac】ChromeでWEBページ全体のスクリーンショット画像をダウンロードする方法

# Web系テストのエビ撮りに役立つ全体スクリーンショット画像のダウンロード手順

**手順1**

キーボードショートカット: `command` + `option` + `I`

**手順2**

キーボードショートカット: `command` + `shift` + `P`

**手順3**

検索窓に`full`と入力し`enter`キーを押下

# スクリーンショット画像

![qiita.com_rimorimo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478088/05998358-fbf0-b643-ded2-675aeb0cc252.png)
MediaQuery - LandScapeが意図せずに適用される話（Chrome×Android）

## 発生した事象
- 事象
  - スマホ縦画面の入力フォームで、キーボードを起動すると、画面スタイルにLandScape用のスタイルが適用される
- 発生条件
  - Chrome×Android環境
  - MediaQueryでLandScape時のスタイルを設定している

- イメージは下記

```sample.html
<div class="container">
  <div class="main-content-wrapper">
    <div>こんにちは<div>
  </div>
  <div class="input-wrapper">
    <input type=text placeholder="何か入力して">
  </div>
</div>
```


```sample.css
/* スマホが横向きのときに、コンテンツを横並びにしたい */
@media (orientation landscape) and (max-width: 959px) {
  .container {
    display: flex;
  }
}
```

## 調査
- もしかしたら、MediaQueryが何らかの理由で適用されているかもしれないと思い、MediaQuery周りで怪しことがないか調べたら下記の記事を見つけた（古い）
- https://web.archive.org/web/20160509220835/http://blog.abouthalf.com/development/orientation-media-query-challenges-in-android-browsers/

- 読んでみると、下記のような記述がありました

>When the software keyboard is displayed in Chrome for Android or the stock Android Browser[1] the browser window is resized, which triggers a window.resize event and a window.orientationchange event in JavaScript as well as possibly causing CSS media queries to be reapplied.

- Android×Chromeの場合に、ブラウザウィンドウがリサイズされてしまい、JSではWindowの向きが変わったと認識されたり、CSSのメディアクエリがリサイズされたウィンドウで再適用されてしまうとのこと

## 解決方法
- こちらを参考にさせていただきました！
https://stackoverflow.com/questions/8883163/css-media-query-soft-keyboard-breaks-css-orientation-rules-alternative-solut

- ビューポートのアスペクト比がちゃんとデバイスを横向きにしたときの縦横比になっているかをチェックするようにしています

```sample.css
@media (orientation: landscape) and (min-aspect-ratio: 16/9) and (max-width: 959px) {
  .container {
    display: flex;
  }
}
```

以上です

## 参考
- https://web.archive.org/web/20160509220835/http://blog.abouthalf.com/development/orientation-media-query-challenges-in-android-browsers/

- https://stackoverflow.com/questions/8883163/css-media-query-soft-keyboard-breaks-css-orientation-rules-alternative-solut
PHPで時間帯を制御し背景色等を切り替えるCSS外部ファイルを作成する方法

# 雑記

Web開発の現場では通常，フロントエンドとサーバサイドを中心に分業化されているケースが殆どである．とはいえ双方の業務において共通認識として，知っておかなければならない事も多々あるのも現状である．筆者の場合どちらかといえば装飾・デザイン面にはさほど興味がなく，サーバサイド処理等の技術的な内容に関心が偏りがちである．

フロントエンドといえばWordPress等のCMSにわりかし依存度が強い印象であるが，本記事ではフロントエンドエンジニアが知っておいても損のない技術のひとつとしてPHPでCSSを制御する方法について解説していく．

# CSS外部ファイルの読み込み

CSS外部ファイルは通常，拡張子`.css`としHTML内に読み込む場合は下記のタグを記述する．

```html
<link rel="stylesheet" href="hoge.css">
```

# PHPでCSSファイルを制御する

今回はPHPで時間帯によって背景色と文字色を切り替えるCSS外部ファイルの作成方法を記述する．（拡張子については後述参照）

```php:change_by_time.php
<?php
# タイムゾーンの設定（設定値: 日本）
date_default_timezone_set('Asia/Tokyo');

# CSSを記述するコード内でのヘッダ設定
header('Content-Type: text/css; charset=utf-8');

# 現在のシステム時刻（ゼロなしの時）を取得
$now = date('G');

# システム時刻5:00〜16:59までとそれ以外の時刻で背景色と文字色を切り替える
$bgcol = $now >= 5 && $now < 17 ? '#87ceeb' : '#000033';
$ftcol = $now >= 5 && $now < 17 ? '#000000' : '#ffffff';
?>
body {
  background-color: <?= $bgcol; ?>;
  color: <?= $ftcol; ?>;
}
```

# 上記ソースコードの重要点

* **タイムゾーンの設定は必須**

```php
date_default_timezone_set('Asia/Tokyo');
```

* **CSSを記述するコード内でのヘッダ設定**  
`text/css `の部分を他の形式にするとCSSは反映されない．

```php
header('Content-Type: text/css; charset=utf-8');
```

* **三項演算子を使用している**  
if文でも構わないがソースコード短文化のため，本記事ではネストの浅い三項演算子を採用している．

```php
$bgcol = $now >= 5 && $now < 17 ? '#87ceeb' : '#000033';
$ftcol = $now >= 5 && $now < 17 ? '#000000' : '#ffffff';
```

* **【最重要】CSSファイルだが拡張子を`.php`とする**  
PHPで制御しているので，拡張子が`.css`だとPHP制御が効かなくなるので注意が必要．

~~change_by_time.css~~  =>  change_by_time.php

# 実際にHTML内に埋め込む

```html:sample.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- CSS外部ファイルの読み込み -->
    <link rel="stylesheet" href="change_by_time.php">
    <title>タイトル</title>
  </head>
  <body>
    <h1>テキスト</h1>
  </body>
</html>
```

# 表示してみる

**システム時刻5:00〜16:59**
![screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478088/22b5b655-ba11-b1ce-f847-6cba68e34ea2.png)

**システム時刻17:00〜翌日4:59**
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478088/d997d12e-ba69-0d0a-b36f-f97caf37a3aa.png)
VBScriptでEntity FrameworkっぽくSqlQueryで型付きO/Rマッピング

[先日の記事](https://qiita.com/jun1s/items/ab61c2efa4ec96acb8cc)で作った、LINQっぽいArrayListクラスをもっと使い倒す為に、Entity FrameworkっぽくSQLから直接型付きオブジェクトにマッピングしてくれるヘルパー関数 SqlQueryを作成。

型付きっていっても所詮VBScriptですが、IDEの力を借りればそれなりに便利です。

こんな風に使えます。ちょっと.NETっぽくないですか？

```vb
'DBオープン
Set DBConnect = Server.CreateObject("ADODB.Connection")
DBConnect.Open DSN, UID

'SELECT文
Dim SQL
SQL = "SELECT Cd, Name, SectionCd FROM Employee ORDER BY Cd;"

'SQLクエリから直接エンティティのリストを生成
Dim empList
Set empList = SqlQuery( DbConnect, "Employee", SQL ) '第二引数はエンティティクラス名

For Each item In empList.Where("item.SectionCd = 30" ).Items
	Response.Write "<li>" & item.Name & "</li>"
Next

DbConnect.Close
Set DBConnect = Nothing
```

エンティティクラスはこんな感じで自分で定義。テーブル名と同じにする必要はありませんが、メンバ名をテーブルのフィールド名と同名にすればSqlQueryくんが勝手に代入してくれます。

```vb:Employee
Class Employee
	Public Cd
	Public Name
	Public SectionCd
End Class
```

SqlQuery本体はこんな感じです。

```vb:SqlQuery
Public Function SqlQuery(DbConn, className, sql)
	Dim RS
	Set RS = Server.CreateObject("ADODB.Recordset")

	RS.Open sql, DbConn, adOpenKeyset, adLockReadOnly    '静的スクロール、読取り専用

	Dim list
	Set list = New ArrayList

	Do Until RS.EOF
		Dim item
		Set item = Eval("New " & className )

		Dim field
		For Each field In RS.Fields
			On Error Resume Next
			If IsNull(RS(field.Name)) Then
				Execute("item." & field.Name & " = RS(field.Name)")	'Nullを設定
			Else
				'とりあえずSQL Serverで必要なぶん
				Select Case field.Type
					Case adChar '余分な末尾空白を除去
						Execute("item." & field.Name & " = RTrim(RS(field.Name))")
					Case adDBTimeStamp
						Execute("item." & field.Name & " = CDate(RS(field.Name))")
					Case Else
						Execute("item." & field.Name & " = RS(field.Name)")
				End Select
			End If
			On Error GoTo 0
		Next

		list.Add item
		RS.MoveNext
	Loop

	RS.Close
	Set RS = Nothing

	Set SqlQuery = list

End Function
```

楽しいClassic ASPライフの為に。
Linux 数字を含む文字列を数字の大小でソートする

# sort -V

サンプルファイル

```sample.txt
1組     旅立ちの日に
11組    今日の日はさようなら
2組     翼をください
```

昇順 `sort -V`

```
$ sort -V sample.txt
1組     旅立ちの日に
2組     翼をください
11組    今日の日はさようなら
```

降順 `sort -Vr`


```
$ sort -Vr sample.txt
11組    今日の日はさようなら
2組     翼をください
1組     旅立ちの日に
```

辞書順 `sort`

```
$ sort sample.txt
11組    今日の日はさようなら
1組     旅立ちの日に
2組     翼をください
```

```
  -V, --version-sort          natural sort of (version) numbers within text
```

# 参考記事

https://www.atmarkit.co.jp/ait/articles/1611/09/news020.html
[JS] MobileMenu



```
class MobileMenu {
  constructor () {
    this.DOM = {};
    this.DOM.btn = document.querySelector('.mobile-menu__btn');
    this.DOM.container = document.querySelector('#global-container');
    this.DOM.btn.addEventListener('click', this._toggle.bind(this));
  }

  _toggle() {
    this.DOM.container.classList.toggle('menu-open');
  }
}

new MobileMenu();
```

[![Image from Gyazo](https://i.gyazo.com/2db797a5c05225e3834d87c52ce85ecb.gif)](https://gyazo.com/2db797a5c05225e3834d87c52ce85ecb)

---
これをスマホ対応にします

```
class MobileMenu {
  constructor () {
    this.DOM = {};
    this.DOM.btn = document.querySelector('.mobile-menu__btn');
    this.DOM.container = document.querySelector('#global-container');
    this.eventType = this._getEventType();
    this._addEvent();
  }

  _getEventType() {
    return window.ontouchstart ? 'touchstart' : 'click';
  }

  _toggle() {
    this.DOM.container.classList.toggle('menu-open');
  }

  _addEvent() {
    this.DOM.btn.addEventListener(this.eventType, this._toggle.bind(this));
  }
}

new MobileMenu();
```

スマホのブラウザでwebサイトを閲覧した場合にはwindow.ontouchstartが存在するので、
'touchstart'がeventType(　)に格納されます

PCやデスクトップでwebサイトを閲覧した場合にはwindow.ontouchstartが存在しないので、
'click'がeventType(　)に格納されます

そして_addEvent(　)にthis.eventTypeを渡してあげます

こう書くことで、スマホかPCかで登録するイベントのタイプを切り替えることができます
Debianで特定のキーワードを含むファイルのみを監視し、アクションを行う

Debianのバージョンによっては？「apt」で inotify-tools をインストールしても古いバージョンがインストールされます。
inotify-toolsの <font color=blue>**3.20.x.x**</font> からオプションで <font color=blue>**include**</font> が指定できるようになっています。
便利なので、必要な方は自前でインストールをしましょう。

※includeオプションを使用すれば簡単に拡張子の監視などが行えます

## ■インストール

```bash
WORK_VERSION=3.20.11.0
WORK_TMP=/tmp/inotify-tools/
mkdir -p -m 777  ${WORK_TMP} \
  && cd ${WORK_TMP} \
  && curl -OL https://github.com/inotify-tools/inotify-tools/archive/refs/tags/${WORK_VERSION}.tar.gz \
  && tar xzvf ${WORK_TMP}${WORK_VERSION}.tar.gz \
  && cd inotify-tools-${WORK_VERSION} \
  && ./autogen.sh \
  && ./configure --prefix=/usr --libdir=/lib64 \
  && make \
  && make install
```

## ■使用方法

```bash
# /tmp/conf.d/ の中の拡張子 「conf」のファイルを監視
inotifywait -mq --include "\.conf$" -e CREATE,MODIFY,DELETE,MOVED_FROM,MOVED_TO /tmp/conf.d/
```

```bash
# confが追加/変更/削除されたらapacheの設定を再読込
# ※下記の場合、mv等で複数のファイルが追加されるとファイル数だけ「graceful」がされます。
inotifywait -mq --include "\.conf$" -e CREATE,MODIFY,DELETE,MOVED_FROM,MOVED_TO /tmp/conf.d/ | while read; do /etc/init.d/apache2 graceful; done
```
[jQuery/textarea] キーボードショートカットで簡単コピペ

コメント欄でご指摘をいただきました通り、このコードでは元の機能が動いていたようです。改良検討中。

~~CtrlやCommand+C/Vのキーボードショートカットを使って、textareaのコピペを簡単に実現する方法です。MacのChrome/Safariで動作確認済み。検索するとjQueryのプラグインもあるようですが、一切使わずに数行でできるのは驚きです。~~

```html
<html>
  <head>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  </head>
  <body>
    <textarea id="textarea-copy-and-paste-available" rows="5"></textarea>
    <script>
      $('#textarea-copy-and-paste-available').on('keydown', function (e) {
        if (e.keyCode === 86 && (e.ctrlKey || e.metaKey)) { // ctrl+v
          document.execCommand('paste');
        } else if (e.keyCode === 67 && (e.ctrlKey || e.metaKey)) { // ctrl+c
          document.execCommand('copy');
        }
      });
    </script>
  </body>
</html>

```
##参考URL
https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard
Google Cloud Professional Cloud Developer 合格体験記

こんにちは。初投稿です。
Google Cloudの認定資格である[Professional Cloud Developer](https://cloud.google.com/certification/cloud-developer?hl=ja)を取得したので、記事を書いてみようと思います。大した内容ではありませんのでご了承ください。

---

### 1. バックグラウンド
- 業務ではGoogleCloudはじめクラウド未経験
- GoogleCloudの他の認定としてACE,PCA,PDEを取得済み。
- k8sのCKA/CKADを取得済み。
- GCP、コンテナが好き。

---

### 2. 事前対策内容
- [公式の模擬試験](https://cloud.google.com/certification/sample-questions/cloud-developer?hl=ja)を受験→7~8割くらい正解
- [Qwicklabsのスキルバッチキャンペーン（〜2021/5/10）](https://inthecloud.withgoogle.com/q1-skill-challenge-jp-2021/dl-cd.html)でDeveloper取得向けのコースを全て実施。  
- スキルバッジキャンペーンでもらえる Couseraコースは未実施でした。
- 自信のないCloudRunやSpannerあたりの公式docを参照。  
事前対策は以上でした。模擬で7~8割とれたのでいけるんじゃない？という感覚で受験を申し込みしました。

---

### 3. 試験を終えて
- 問題で問われる粒度は思ったより粗く、ProfessionalCloudArchitectと同等の感じでした。
- 問題の傾向はk8sに関するものや、**クラウド上のAPと他のGCPサービスと連携する方法**を問われることが多かった印象です。  
**→k8sにある程度詳しく、ProfessionalCloudArchitectを持っている方であれば取得できる内容だったかと思います。**

---

### 4. ご褒美
- 本資格ではパーカーまたは、スピーカーのいずれかがもらえました。

---

以上、初投稿でした。
閲覧ありがとうございました。
【AWS】AWSでできること

#プログラミング勉強日記
2021年4月6日

#AWSでできること

##1. サーバー環境の構築とWebサイトの運用
　Amazon Elastic Compute Cloud (Amazon EC2)がサーバー環境の構築に使える。必要に応じてスペックを変更することができる仮想サーバーを作成して利用できる。Amazon EC2でインスタンスを生成して、Webサイトを運用できる。
　Amazon EC2は単純で使いやすいインターフェースで、画面上の簡単な操作で作業を行える。

##2. データ保存とコンテンツ配信
　Amazon Simple Storage Service (Amazon S3)は、データの保存や加工、コンテンツ配信ができる。Amazon S3はオブジェクトストレージサービスで、セキュリティやパフォーマンスなどが高レベルである。データのバックアップや復元にAWSを活用することもできる。

　オブジェクトストレージとは、「オブジェクト」という単位であつかう記憶装置。今まではファイル単位やブロック単位でデータを管理していた。ファイルストレージはフォルダを多く使ったディレクトリ構造でデータを格納しているが、オブジェクトストレージは、オブジェクトの保管場所に各オブジェクトを保管して、それぞれオブジェクトIDでデータを出し入れしている。


##3. データベース・業務アプリの利用
　Amazon Relational Database Service (Amazon RDS)は、AWSのデータベースで、簡単にクラウド上のリレーショナルデータベース(行と列によって構成された「表形式のテーブル」と呼ばれるデータの集合を、互いに関連付けて関係モデルを使ったデータベース(引用：[リレーショナルデータベースとは](https://www.otsuka-shokai.co.jp/words/relational-database.html)))のせえっていや操作ができる。

　Amazon RDSはプパッチ更新やレプリケーションなどのサーバーのスペック変更を簡単に行うことができる。

##4. 開発での利用
　AWS CodeStarは、アプリを迅速に開発・構築してAWSにデプロイするサービス。

##5. IoTソリューションの構築
　FreeRTOSは、組込みシステムの構築に有効なマイクロコントローラー向けのリアルタイムOSである。

##5. AI機能の利用
　リアルタイムのパーソナライズレコメンデーションサービスであるAmazon Personalizeや時系列予測サービスのAmazon Forecast、文書からテキストを抽出できる、Amazon Textractなどの機械学習サービスを提供している。
　

#参考文献
[オブジェクトストレージとは](https://www.fujitsu.com/jp/products/computing/storage/lib-f/tech/beginner/object-storage/)
[AWSとは？サービスの概要やできること、クラウド市場の展望について紹介](https://business.ntt-east.co.jp/content/cloudsolution/column-01.html)
[AWS入門。AWSで何ができる？特徴やメリット、勉強方法を解説](https://bcblog.sios.jp/introduction-of-aws-feature-merit/#AWS-3)
【Python】Tableオブジェクトを使用して、表を作成する。

pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、表(セル)の移動に関してです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/8b8ac7ad-0e4f-d619-8a46-da670f017525.png)

上記のようなブック「商品リスト」に

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/ce228316-710d-25e2-92e0-51d37fe1e57b.png)

のようなテーブルを設定したいです。

# Tableオブジェクト

```python
table = Table(displayName='テーブル名', ref='設定するセルの範囲')
```

テーブルの作成にはTableオブジェクトを使用します。

displayNameには同じブック内で重複する名前を付けない限りは
特に縛りはないので好きな名前を付けちゃいましょう。

ref引数へはテーブルにしたいセル範囲を記述します。

# TableStyleInfoオブジェクト

```python
TableStyleInfo(name='テーブルのスタイル名', 行や列の色を変更する設定)
```

次にTableStyleInfoオブジェクトを使って、Excelで用意されている
スタイルを設定します。

name引数へは用意されているテーブルスタイル名を記述します。

- TableStyleLight：淡色(1～21)
- TableStyleMedium：中間(1～28)
- TableStyleDark：濃色(1～11)

中々に種類が多いので実際に見てみるのが一番早いかもしれません。
個人的には「TableStyleMedium8」がお気に入りです。

また、行や列の色を変更する設定も可能で

- showRowStripes：Trueにすると、行の色が縞模様で表示
- showColumnStripes：Trueにすると、列の色が縞模様で表示
- showFirstColumn：Trueにすると、最初の列に色が付く
- showLastColumn：Trueにすると、最後の列に色が付く

これは見比べた方が速いですね。

showRowStripes=True
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/31c0879f-86af-f0d0-b44e-e50bc3486a97.png)

showColumnStripes=True
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/72d606b0-e7f4-c76b-308d-f4ead3f34c6e.png)

showFirstColumn=True
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/3e03fec2-fd4a-e3df-709e-31a8cbea6ebf.png)

showLastColumn=True
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/db719220-ddfa-e563-a56a-b98f420d137e.png)

正直、showRowStripes=True以外に使い道があるのか不思議ですが・・・。

# table.tableStyleInfo属性

```python
table.tableStyleInfo = table_style
```

table.tableStyleInfo属性に、先ほど作成した「table_style」を代入することで
テーブルスタイルがテーブルに設定されます。

# Worksheet.add_tableメソッド

```python
ws.add_table(table)
```

最後に、Worksheet.add_tableメソッドを呼び出してシートにテーブルを追加します。

# 最終的なコード

```python
from openpyxl import load_workbook
from openpyxl.worksheet.table import Table, TableStyleInfo

wb = load_workbook('商品リスト.xlsx')
ws = wb.active

# テーブルを生成する
table = Table(displayName='Table1', ref='B2:I24')

# テーブルのスタイルを決めておく
table_style = TableStyleInfo(name='TableStyleMedium8', showRowStripes=True)

# テーブルのスタイルを設定
table.tableStyleInfo = table_style

# シートにテーブルを追加
ws.add_table(table)

wb.save('商品リスト_テーブル.xlsx')
```

なんだかややこしい記述となってしまいましたが、
出来上がるときれいなテーブルを作れるのでお勧めです。

テーブル自体は使い勝手が良いので使用していましたが、
縦縞(列の色を縞模様)が出来たりするのを知れて有意義な時間でした。
PowerShellで多次元配列に配列を追加

powershellで多次元配列に後から値を追加したいパターン。

連想配列と同様の構文で「$arr += @()」で追加できるかと思いきや、罠があったので共有。

```powershell
[array] $namelist = @(
    @('佐藤'  , '一郎'),
    @('鈴木'  , '二郎'),
    @('田中'  , '三郎'),
);

#＠マーク手前のカンマが肝。
$namelist += ,@('伊藤', '四郎');
```
癖が強いんじゃ。
Laravel クエリビルダーを使ったandやorを複数書きたい

SQLで

    SELECT * FROM xxx
    where id = 1
    AND (
      type = 1 
      OR (type = 2 AND version = 1)
      OR (type = 2 AND version = 2)
    );
のようなSQLを書きたい時があったがカッコの部分でうまくいかなくて困ったことがあったので忘れないように残しておく


    xxx::query()
      ->where('id', 1)
      ->where(function ($query) {
        $query->where('type', 1);
        $query->orWhere(function ($query_inner) {
          $query_inner->orWhere('type', 2);
          $query_inner->where('version', 1);
        });
        $query->orWhere(function ($query_inner2) {
          $query_inner2->orWhere('type', 2);
          $query_inner2->where('version', 2);
        }); 
     })->get();

このように書くことで想定のSQLになった。
PHPStanのBleeding Edgeで純粋な関数呼び出しの結果が保存されるようになった

今まではgetterをifでチェックした場合に if 文の中ではその返り値が保存されていなかったので不便なことがあった。

```php
$person = new Person();

if ($person->getName()) {
    \PHPStan\dumpType($person->getName()); // string|null
}

if ($person->getName() !== null) {
    \PHPStan\dumpType($person->getName()); // string
}
```

https://phpstan.org/blog/remembering-and-forgetting-returned-values

それが、以下のようになるらしい。

```php
// With PHPStan 0.12.83 + bleeding edge

$person = new Person();

if ($person->getName()) {
    \PHPStan\dumpType($person->getName()); // string
}

if ($person->getName() !== null) {
    \PHPStan\dumpType($person->getName()); // string
}
```

しかも、setterを呼び出した場合は保存された値が無効になるという機能付き。（条件はある）

```php
if ($person->getName() !== null) {
    \PHPStan\dumpType($person->getName()); // string
    $person->setName('John Doe');
    \PHPStan\dumpType($person->getName()); // string|null
}
```

前に書いた記事の
https://qiita.com/nishimura/items/42ecba8f90c12b13e721
この悩みも解決されるね。
バッチファイルで拡張子「.zi_」を「.zip」にリネームする(PPAP)

Y子です。
今日も、ファイル名を変えるバッチファイルシリーズです。

# 概要・用途
拡張子が「```.zi_```」のファイルを与えると、「```.zip```」にリネームするバッチファイルです。
コマンドラインで使っても、マウスでドロップしても使えますが、このバッチファイルを __拡張子「```.zi_```」に関連付けしてしまう__ と便利です。
「```.zi_```」の __ファイルをダブルクリックするだけでリネーム__ されます！

### 関連付けの方法
1. 拡張子が「```.zi_```」のファイルを右クリックする
1. 「プログラムから開く」を選択する
1. 「常にこのアプリを使って.zi_ファイルを開く」にチェックが入った状態で「その他のアプリ↓」を選択する
1. 一番下の「このPCで別のアプリを探す」を選択する
1. 今回作成する「```rename_ppap_zip.bat```」を選択して「開く」をクリックする

# コード
```bat:rename_ppap_zip.bat
@echo off

rem 引数がない場合は終了する
if "%~1"=="" (
  echo 引数がありません
  pause
  exit /b
)

rem 変更前のファイル名(フルパス)「C:\work dir\test.zi_」
set str_oldfile=%~1

rem ファイル名分割…拡張子なし「test」と拡張子のみ「.zi_」
set str_old_fn=%~n1
set str_old_ex=%~x1

rem 変更後のファイル名(ファイル名のみ)「test.zip」
set str_newfile=%str_old_fn%.zip

rem 与えられたファイルが「.zi_」なら
if "%str_old_ex%"==".zi_" (
  ren "%str_oldfile%" "%str_newfile%"
  echo ファイル名を「%str_newfile%」に変更しました
rem 想定外のファイルなら
) else (
  echo なにもしませんでした
)

pause
```

# おわりに
__PPAP__ ってあるじゃないですか。
ピコ太郎さんのあれじゃなくて（とても好きですけども）、「__メールでパスワード付きzipを送り、後から別メールでパスワードを送る__」ってやつです。
「__P__ re send __P__ assword file __A__ fter send __P__ assword」の略だとか。（[Wikipedia](https://ja.wikipedia.org/wiki/PPAP_(%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3))）
いろいろ問題は指摘されていますが _（悪意ある人がzipファイルを受信できるなら、パスワードも受信できるじゃーん）_ 、弊社ではまだ現役なんですよねー。
今回は、そんな現場で使えるツールを作ってみたのでした。

ではまたー。
オブジェクト

# オブジェクトリテラル
```php
const person = {
  firstname: 'Ken',
  lastname: 'Tanaka',
  age: 30,
  hobbies: ['game', 'piano', 'sports'],
  address: {
    street: '23 main st',
    city: 'Yokohama',
    prefectuer: 'kanagawa',
  }
}
```
# プロパティの呼び出し

```php
console.log(person.age); //30
```


# 構文
```php
{プロパティ名1:値1, プロパティ名2:値, プロパティ名3:値3, ...}
```
Javaプログラミング(オブジェクト指向、クラス、メソッド、スコープ)

# Javaを学習する中でオブジェクト指向とクラス、メソッド、スコープについて学んだので学習記録を残します:unicorn:

### まず、オブジェクト指向とは何か:full_moon_with_face:
オブジェクト指向とは、アプリケーションの中で扱う対象をオブジェクト（モノ）と見立てて、その組み合わせによって機能を作り上げていく手法のことを言います。オブジェクトとはオブジェクト指向の根本であり、「対象」「物」という意味で、プログラミングにおいてはデータと処理の集まりを意味している。

### クラスという概念について:first_quarter_moon:
クラスはプログラム全体の設計図です。 大まかにデータ（フィールド）と手続き（メソッド）の集合から構成されるしくみです。フィールドやメソッドなどクラスの構成要素をメンバーと言います。

```java
public class Peerson { }
```
クラスには、一般的にはPascal記法（大文字はじまり、単語の区切りも大文字）で、クラスが表すモノを適切に表すような名前を命名します。
クラスの役割によっては、Abstract～（抽象クラス）、～Exception（例外クラス）、～Test（テストクラス）のように、接頭辞／接尾辞を付与する場合もあります。

### new演算子:new_moon:
クラスは、いわゆるモノの設計図です。利用するにあたっては、設計図をもとに具体的なデータを備えたモノ（オブジェクト）を作成する必要があります。オブジェクトはインスタンスとも呼ばれ、オブジェクトを作成することをインスタンス化と言います。
インスタンス化は、new演算子によって実施できます。

```java
Person a = new Person();
```

### メソッド:waning_crescent_moon:
メソッドはプログラムのパーツ(一部機能)の設計図です。 メソッドブロックで囲われた領域でパーツがどのように動くかを記述 します。メソッドのことを関数と呼ぶこともあります。基本的に1つの機能ごとに1つのメソッドを作成します。メソッドブロックは下記のように定義します。
<font color="Blue">[修飾子] 戻り値の型 メソッド名( 引数の型 引数名 , ... ) { 命令群 }</font>

```java
class SampleJava_1 {
	
	public static void main(String[] args) {
		
		//メソッドのしくみ
		
		int print = sum( 2 , 3 ) ;
		
		System.out.println("print：" + print);
		
	}
	
	static int sum( int num1 , int num2 ) {
		
		int calcResult = num1 + num2 ;
		
		return calcResult ;
		
	}
	
}
```

### mainメソッド:last_quarter_moon_with_face:
mainメソッドはプログラムが起動されて必ず一番初めに実行される 特別なメソッドです。 実行したクラス内にmainメソッドが存在しなければ、処理を開始 することができないとしてエラーになります。mainメソッド内の処理を全て実行し終えたらプログラム終了となり ます。(mainメソッドに始まり、mainメソッドに終わる) 戻り値を返す相手もいないため戻り値の型はvoidが設定されています。
mainメソッドは書き方が決められています。 必ず下記のように記載します。

```java

public static void main( String[] args ) { }
      mainメソッド 起動
```
~mainメソッドに始まり、mainメソッドに終わる~
他のメソッドに寄り道しても 必ずmainに戻ってくる。

### スコープとローカル変数:full_moon_with_face:
変数には有効範囲があり、これをスコープと言います。 変数宣言されたブロック内( { } で囲まれた範囲)がその変数の スコープとなります。 スコープ外からのアクセスはすべてエラーとなります。またメソッド内で定義される変数をローカル変数と言います。 当然スコープ外である他のメソッドからは参照したり代入したり できません。

```java
class SampleJava_2 {
	
	public static void main( String[] args ) {
		
		//ローカル変数のしくみ
		
		String message = "不正です" ;
		
		//int print = 0 ;　本当はここにprint変数を定義しておくと同じスコープないでこの変数を呼べる
		
		if( args.length == 2 ){
			
			int num1 = Integer.parseInt( args[0] );   
        //★スコープが別であれば名前が同じ変数を定義することは可能です
			int num2 = Integer.parseInt( args[1] );        
        //★スコープが別であれば名前が同じ変数を定義することは可能です
			
			int print = sum( num1 , num2 );
			//ここで変数を定義してしまうとスコープが違うところではprintを呼ぶことができずにエラーになってしまう。
		}else{
			System.out.println( message );
		}
		
		System.out.println( "print：" + print );         
     //★（エラー）スコープ外からのアクセスはできません（ネストになっているブロック内の変数）
		
	}
	//スコープが違うところでは名前が重複しても問題ない
	static int sum( int num1 , int num2 ) {
		
		int print = 0 ;
		
		int calcResult = num1 + num2 ;
		
		return calcResult ;
		
	}
}
```
以上がオブジェクト指向とクラス、メソッド、スコープについてです！参考までにどうぞ！
デバックの情報を常に見れるようにする方法

#目次
<b>結論</b>
<b>記述方法</b>

##結論
Viewファイル内に<%= debug {変数} if Rails.env.development? %>と記述する。

##記述方法

```php:paramsの中身を見たい時

<%= debug params if Rails.env.development? %>
```
上記の記述はapplication.html.erbの下に記述すると邪魔にならずに便利。
Ubuntu Wine6.5でexeがダブルクリックで起動しない

start.exeがpathにない

```bash:start.exeの配置
cp -a ~/.wine/drive_c/windows/command/start.exe ~/.wine/drive_c/windows/syswow64/
cp -a ~/.wine/drive_c/windows/command/start.exe ~/.wine/drive_c/windows/
```

```bash:他の罠対応しとく
mkdir -p ~/.wine/drive_c/windows/syswow64/drivers
```
サーバーにリモートアクセスするには？

#目次
<b>①結論</b>
<b>②SSH公開鍵とは</b>
<b>③2つの認証方式について</b>
$\tiny{-パスワード認証方式}$
$\tiny{-公開鍵認証方式}$
<b>④リモート接続の流れ</b>

##①結論
SSHなどでパスワード認証方式又は、公開鍵認証方式でリモート接続する。

##②SSHとは
SSHとは、ネットワークに接続された別のコンピュータをリモートで操作する方法のこと。
SSHでは通信データーが「暗号化」されるため安全に遠隔操作を行うことができる。
サーバーをリモートを操作するには基本的には「SSH」を使うようにする。
SSHでサーバーに接続するには「認証」を行う必要がある。以下の2種類がある


##③2つの認証方式について
 -パスワード認証方式
パスワード認証方式とは、ユーザー名とパスワードを予め決めておきサーバーに接続する際にこれらを使ってログインする方式のこと。

-公開鍵認証方式
秘密鍵と公開鍵を使って認証行いログインをする方法のこと。
秘密鍵は「電子署名」を「作る」ことができる。公開鍵は、電子署名のデータが正しいかどうかを「検証する」ことができる。電子署名とは、紙文書におけるサインや印鑑に相当するもので、電子文書に電子署名を行うことで間違いなくその文書が署名者本人のものであることと、内容が改ざんされていないことを証明する。

##④リモート接続の流れ

秘密鍵は、自分のパソコンの中に大切に保管しておき、公開鍵はサーバーの中に保管しておく。

まずは、自分のパソコンで秘密鍵を使って電子署名データを作成してサーバーに送信をする。サーバーに送信された後は、電子署名のデータを受け取り、公開鍵で「検証」をする。そして「検証」に合格をすれば、認証が成功し、リモート接続を許可することができるといった流れになる。
【CSS】画面幅で要素を出し分ける方法。メディアクエリとdisplayの活用

画面幅によって要素を出し分ける方法はcssだけで簡単に実現できる。


displayプロパティとメディアクエリを使う。表示したくない時は`dispaly:none`とし、表示したい画面幅の時に`dispaly:block`とすればOK。

##例１：画面幅375px以下で改行する
376px以上の時は1行で表示して、375px以下になった時に、`<br>`タグで改行する処理。

![br.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/db592f35-7097-f185-3f73-3428787b68a1.gif)


`<br class="newline">`を２つ挿入し、デフォルトは`display: none;`とする。メディアクエリを使って375px以下の時は`display: block;`にする。


```css:.css
.newline{
  display: none;
}

@media screen and (max-width:375px) {
  .newline{
    display: block;
  }
}
```

```html:.html
<p>
  画面幅によって出し分ける方法。
  <br class="newline">
  <br class="newline">
  375px以下で改行する
</p>
```


###sassで記述する
sassのmixinを使うと、簡単に呼び出せるようになりメンテ性が上がる。

```scss:.scss
//mixinの定義
@mixin mq-down ( $breakpoint: 375px ){
  @media screen and (max-width: $breakpoint){
    @content
  }
}

//cssの設定
.newline{
    display: none;
    @include mq-down{
      display: block;
    }
}
```

**▼mixinの定義**
####・`@mixin ミクシン名 ( 初期値 ){処理}`

####・`@include ミクシン名`
mixinの呼び出し。引数を指定しない場合は初期値が入る。

例えば、`@include mq-down(600px)`とすれば、ブレイクポイントが600pxになる。

####・`@content`
mixinの中で`@content`を使うと、呼び出した時に`{ }`の中に記述した内容が`@content`の中に入る。

上記例では、`display: block`がメディアクエリの`{ }`の中に記述される。



<br>
##例２: 画面幅に合わせてdivタグを出し分ける
3つのdivタグを用意して、600px, 375px毎にdivを１つづつ減らしていく。

![div.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/42aa8500-1435-1889-42c2-b85e1e3cd392.gif)


```css:.css
.div1 {
  background: blue;
}

.div2 {
  background: red;
  display: none;
}
@media screen and (min-width: 375px) {
  .div2 {
    display: block;
  }
}

.div3 {
  background: green;
  display: none;
}
@media screen and (min-width: 600px) {
  .div3 {
    display: block;
  }
}
```

```html:.html
<div class="div1">div1</div>
<div class="div2">div2</div>
<div class="div3">div3</div>
```


<br>
###Sassで記述する
sassのmixinを使うとシンプルになる。

```scss:.scss
//mixinの定義
@mixin mq-up ( $breakpoint: 375px ){
  @media screen and (min-width: $breakpoint){
    @content
  }
}

//cssの設定
.div1{
  background: blue;
}
.div2{
  background: red;
  display: none;
  @include mq-up{
    display: block;
  }
}
.div3{
  background: green;
  display: none;
  @include mq-up(600px){
    display: block;
  }
}
```


<br>
scss便利。
is演算子によって宣言された変数が想定外のスコープを持つケース

# はじめに
C#7.0からis演算子で変数の型を判定したのちに、判定した型にキャストをした変数を宣言することが可能となりました。
ただ、宣言した変数のスコープが想定通りでないことがあったので、記事にまとめました。

# スコープが想定通りである例
if文内でis演算子を使って、指定の型である場合はキャストして新たに変数を宣言する場合を考えます。
以下の①の処理は、変数を宣言したif文のスコープ内なので、コンパイルが通ることは直感的に分かります。

```csharp
// 変数objがstring型であるならばキャストして変数strとして定義
if(obj is string str)
{
    // ①ifのスコープ内なので変数strが利用可能
    Console.WriteLine(str);
}
```

# スコープが想定通りでなかった例
if文内でis演算子を使って、指定の型でない場合はreturnし、指定の型の場合はキャストした変数を宣言する場合を考えます。
以下の①の処理は、変数を宣言したif文のスコープ外ですが、コンパイルが通ります。

```csharp

// 変数objがstring型であるならばキャストして変数strとして定義し、
// 変数objがstring型でないならreturnする
if(!(obj is string str)) return;

// ①if文のスコープ外であるはずだが、変数strが利用できる
Console.WriteLine(str);
```

これは言語仕様のようで、[こちらの記事](https://ufcpp.net/study/csharp/start/st_scope/?p=3#declaration-expressions)に詳しく書かれています。上記のような利用方法が多いため、スコープ外でも変数にアクセスできる仕様にしたとのことです。
私自身以下のようにis演算子で型判定をして型一致しなかったらreturnし、その後キャストするという書き方しかできないと思い込んでいましたが、上記の書き方のほうがすっきりかけるのでぜひ活用していきたいですね。

```csharp
// 変数objがstring型でないならreturnする
if(!(obj is string)) return;

// if文の判定後にキャスト
string str = (string)obj;

Console.WriteLine(str);
```
AutoHotKeyでExcelのやり直しをCtrl+Shift+Zにする

おぼえがき。
`#IfWinActive`の値を変更すれば、他のOffice(WordとかPowerPoint)でも使える。


# スクリプト
```
; Excel
#IfWinActive ahk_exe EXCEL.EXE
  ^+z:: Send,^y
Return
```