OmniAICreator/Qiita-1.07M huggingface dataset:
tensorflowやKerasで機械学習始めたいけど教師データが多すぎてメモリエラーになって困っている方へ贈る記事

# 対処法
一度にメモリに読み込むからメモリに乗りきらなくてエラーになるので、  
「その都度」乗せればいいですよ。

具体的な手順としては

1. 画像を「ちょっとずつ読み込む」関数を作る
2. `fit`メソッドでの学習をやめ、`train_on_batch`メソッドと`for`ループで学習する。

`train_on_batch`では、「画像の集まり」を引数に指定することで、それらをまとめて1回だけ学習してくれる、`Keras`のモデルオブジェクトのメソッドです。

なので、

```python3:32はバッチサイズなので適当にいじってください
for 画像を32枚集めたもの in ちょっとずつ読み込む("D:\\教師データ1000000枚\\??.jpg", 枚数=32):
   model.train_on_batch(画像を32枚集めたもの, 画像を32枚集めたもの)
```

みたいにすれば、1000000枚分のデータを一気にメモリに乗せることなく、32枚ずつメモリに乗せるんで、
メモリエラーにはならないってわけです。
# ちょっとずつ読み込む 関数をプレゼントします

ちょっとずつ読み込む関数は、次のように書けます。
(まあ本当は`function`じゃなくて`generator`なんすけどね)

```python:path_to_4darray.py
from PIL import Image
import numpy as np
import glob
import random

def ちょっとずつ読み込む(globpath, 枚数, 行数=None, 列数=None, 上限=1, カラー=True, dtype=np.float64, sort_func="shuffle"):
    pathたち = glob.glob(globpath)
    if   sort_func == "shuffle":
        random.shuffle(pathたち)
    elif sort_func is None:
        pass
    else:
        pathたち = sorted(pathたち, key=sort_func)
    
    path数 = len(pathたち)
    バッチ数 = path数//枚数 # 剰余は切り捨てる仕様である
    for i in range(バッチ数):
        読みに行くpathたち = pathたち[(i * バッチ数):(i * バッチ数 + 枚数)]
        読んだ結果 = np.array([_path_to_3darray(path, 行数, 列数, 上限, カラー, dtype) for path in pathたち])
        yield 読んだ結果


def _path_to_3darray(path, 行数, 列数, 上限, カラー, dtype):
    def main():
        img = Image.open(path).convert("RGB")
        img = リサイズ(img, 行数, 列数)
        npy3d = 色(img, カラー) 
        npy3d = dtypeと上限(npy3d, dtype, 上限)
        return npy3d

    def リサイズ(img, 行数, 列数):
        if   行数 is not None and 列数 is not None:
            return img.resize((列数, 行数))
        elif 行数 is not None and 列数 is     None:
            列数 = round(img.width * 行数 / img.height)
        elif 行数 is     None and 列数 is not None:
            行数 = round(img.height * 列数 / img.width)
        else:
            raise ValueError("行数または列数の最低どちらかは指定してください。")
        return リサイズ(img, 行数, 列数)

    def 色(img, カラー):
        arr = np.array(img)
        if not カラー:
            return (0.3*arr[:,:,[0]])+(0.59*arr[:,:,[1]])+(0.11*arr[:,:,[2]])

    def dtypeと上限(npy3d, dtype, 上限):
        npy3d = npy3d.astype(np.float64)
        npy3d *= 上限/255
        npy3d = npy3d.astype(dtype)
        return npy3d
       
    return main()

```

これを`path_to_4darray.py`って名前で保存してください。

# 「ちょっとずつ読み込む」関数の使い方

```例
from PIL import Image
import numpy as np
from path_to_4darray import ちょっとずつ読み込む

i = 0

for 画像たち in ちょっとずつ読み込む("D:\\教師データ1000000枚\\*.jpg", 枚数=32, 上限 = 255, 行数=144, 列数=256, カラー=False, dtype=np.uint8):
    j = 0
    for 画像 in 画像たち:
        Image.fromarray(画像[:,:,[0,0,0]]).save(str(i)+"_"+str(j)+".png")
        j += 1
    i += 1
```

みたいにすると、`python`は画像を32枚ずつ読み込んで、環境に画像を保存してくれます。

引数について: (気が向いたら加筆します)
ヘッドレスCMSのContentfulをHugoと連携してGithub Pagesで公開する(1)

# 概要
[今回のソース](https://github.com/higebobo/hugo-contentful-blog/releases/tag/v1.0)

[Contentful](https://www.contentful.com/)は近年流行りのヘッドレスCMSの中でも恐らく最もポピュラーなものであろう。
[Nuxt](https://nuxtjs.org/)や[Gatsby](https://www.gatsbyjs.com/)等との連携はよく行われている。

一方、同様のサイトジェネレータの[Hugo](https://gohugo.io/)で使う方法はないかと探していたらこんなのがあったので紹介する。

[ModiiMedia/contentful\-hugo](https://github.com/ModiiMedia/contentful-hugo)

# 環境

* Hugo: v0.71.0-DEV/extended
* Node.js: v14.15.4

上記はあくまでも現在のローカル環境である。
最終的にGithub Actionsを用いて公開する場合は異なるバージョンを用いる。

# Hugoによるサイト構築

Hugoのインストールについては割愛する(オフィシャルガイドはこちら→[Install Hugo \| Hugo](https://gohugo.io/getting-started/installing/))。

サイト作成

```shell
hugo new site hugo-contentful-sample
```

レポジトリ初期化

```shell
cd hugo-contentful-sample
git init
echo '*~' >> .gitignore
echo '*.bak' >> .gitignore
echo '*.orig' >> .gitignore
echo '.env' >> .gitignore
echo 'public' >> .gitignore
echo 'resources' >> .gitignore
```

## テーマの導入

次にテーマを導入する。
自分で作成することもできるが、[既存のテーマ](https://themes.gohugo.io/)を使うのが手っ取り早い。
今回は[Blonde](https://themes.gohugo.io/themes/blonde/)を用いる。

```shell
git submodule add https://github.com/opera7133/Blonde.git themes/blonde
```

コピーでもよいのだが、上記例ではgitのサブモジュールとして導入している。
自分の経験上、オリジナルレイアウトにまったく手をつけないシチュエーションは少ないのでレイアウトをオーバライドしてカスタマイズするようにしている(もちろんこの方法はテーマのレポジトリが大幅に改修された場合に対応がいる場合がある)。

次に設定ファイルやサンプルコンテンツをコピーする

```shell
cp -pr themes/blonde/exampleSite/{config.toml,content,package.json} .
```

Blondeは[postcss](https://github.com/postcss/postcss)というNode.jsのCSS Processorを使っているためパッケージのインストールが必要となる(ほとんどのテーマはNode.jsを要求しないので以下のインストール作業は不要)

パッケージのインストール

```shell
npm install
echo 'node_modules' >> .gitignore
```
設定ファイルの修正(themeのところが重要)

```diff
--- config.toml.orig	2021-08-16 07:50:27.071038402 +0900
+++ config.toml	2021-08-16 08:12:05.769485895 +0900
@@ -2,9 +2,10 @@
 title = "Blonde"
 author = "wamo"
 languageCode = "en"
-DefaultContentLanguage = "en"
+DefaultContentLanguage = "ja"
 enableInlineShortcodes = true
-theme = "Blonde"
+themesDir = "./themes"
+theme = "blonde"
 enableRobotsTXT = true
```

上記設定はあくまでも**取り敢えず動く**ことを目的としているので今後必要に応じて修正していく。

## サービス起動

ここまでできたのでサービスを起動する。

```
hugo serve
```

デフォルトでは http://localhost:1313 で公開されるので確認する。

トップ画面

![FireShot Capture 062 - Blonde - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691494/688b1402-9d54-270e-3e77-9047b4cc765d.png)

ブログ本文

![FireShot Capture 063 - Blonde - Rich Content - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691494/15b05d04-2ba0-8cbc-a46a-78f34a865267.png)


今回はここまで。([今回のソース](https://github.com/higebobo/hugo-contentful-blog/releases/tag/v1.0))
次回[Contentful](https://www.contentful.com/)との連携を解説する。
【AWS】AWS Lambda

#はじめに
AWS認定試験取得に向けてAWSの知識を整理するためのまとめです。
今回はAWS Lambdaについてまとめます。

#Lambdaとは
なんらかイベントが発生したときに、ユーザが設定したコードを実行し、
コードを実行する基盤はAWS側で管理するサーバレスコンピューティングなサービスです。
Lambdaで実行するコードは「Lambda 関数」と呼ばれます。

#Lambdaの特徴

EC2と比べると自由度は落ちますが、インフラ周りの構成、管理はAWS側の負担となるので、
その分コードを書くことに注力できます。

## 基本設定
###メモリ
64MBごとに128MB〜10,240MBの間で設定可能です。
容量に応じてCPU能力なども比例します。

###実行時間
900秒（15分）が最大実行時間です。
タイムアウト時間は1秒から15分の間で任意に設定できます。

###スケール
利用者側でスケーリングの設定は必要なく、
リクエスト数に応じて自動的にスケールします。

## サポートされている言語
Python、Node.js、C#、Go、Java,Ruby、PowerShellの言語をサポートしています。
カスタムランタイムを使えば、上記以外の言語も利用可能になります。

## ほかAWSサービスとの連携
AWB APIなどの用途で使う場合は、APIGateway、Lambda、DynamoDBを組み合わせて
使われるパターンが多いです。
他にもS3、RDS、CloudWatch、Alexaなどさまざまなサービスがサポートされているので、
柔軟なサービスの構築が可能です。


#料金
使用した分課金される従量課金制です。
（リクエスト数とコードの実行時間）
もしくは、ComputeSavingsPlansも利用可能です。
（１年もしくは３年の機関で、一定の使用量を契約して、低価格で利用できるプラン）

#参考サイト
https://aws.amazon.com/jp/lambda/
https://d1.awsstatic.com/webinars/jp/pdf/services/20190402_AWSBlackbelt_AWSLambda%20Part1%262.pdf
WooCommerce の決済画面で「syntaxerror: unexpected token < in json at position 0」が出たときの確認方法

ちょっと躓いたので備忘録として

決済画面で、「syntaxerror: unexpected token < in json at position 0」のエラーが出たので原因の確認方法

##Chrome での確認方法
https://mikejolley.com/2015/11/12/debugging-unexpected-token-in-woocommerce-2-4/

詳細はこちらなのですが、簡単に書いておくと、Chrome の「検証」で「Network」に行って、「Fetch/XHR」をクリックして、最後の処理のjsにチェックを入れて、「Response」を見たら原因が記載されているという感じです。
【R】 基礎データ抽出

library(readr)
library(dplyr)

write.csv(wty,"C:/Users/kohei/Documents/R/eddp/WTY_data/wty_data.csv")
wty_data<-read_csv("c:/Users/kohei/Documents/R/eddp/WTY_data/wty_pick_data.csv")

#key,型,国,Year,登録日,番号1,2,3,4,コード
pick_col<-c("UNI_KEY_ORI","FR_CD","Cont_CD","MY_CD","REP_DO_DATE","PN_5","PN_3_1","PN_3_2","PN_EX","SY_CD_1","SY_CD_2")
wty_pick_data<-wty_data[,pick_col]

#日付型変更
wty_pick_table_data$$REP_DO_DATE <- as.POSIXct(strptime(as.character(wty_pick_table_data$REP_DO_DATE), format="%Y%m%d"))


#番号連結
wty_pick_table_data<-wty_pick_data %>% as.data.frame() %>% mutate(parts_code = paste(!!!rlang::syms(c("PN_5","PN_3_1","PN_3_2","PN_EX")), sep="-"))


#集計
wty_table<-data.frame(table(wty_pick_table_data$$MY_CD,wty_pick_table_data$Cont_CD,wty_pick_table_data$FR_CD,wty_pick_table_data$parts_code))
wty_table<-wty_table[order(wty_table$Freq,decreasing = T),]

#累積
parts_list<-unique(wty_table$$Var4)
pick_parts<-parts_list[1]
FR_CD_data<-""
Cont_CD_data<-""
MY_CD_data<-""
wty_parts_table<-wty_pick_data[wty_pick_table_data$parts_code==pick_parts&wty_pick_table_data$FR_CD==FR_CD_data&wty_pick_table_data$Cont_CD==Cont_CD_data&wty_pick_table_data$MY_CD==MY_CD_data,]
acc_table<-data.frame(table(wty_parts_table$REP_DO_DATE))
acc_table$Var1 <- as.POSIXct(strptime(as.character(acc_table$Var1), format="%Y%m%d"))
write.csv(acc_table,"c:/Users/kohei/Documents/R/eddp/WTY_data/acc_table.csv")
Raspberry Pi 初期設定メモ

# 1. 下準備
## 1-1. マイクロSDフォーマット
・「[SD Memory Card Formatter](https://www.sdcard.org/ja/downloads-2/formatter-2/)」でマイクロSDカードを**クイックフォーマット**でフォーマット。

## 1-2. マイクロSDにOSをインストール
####1. [RaspberryPi公式](https://www.raspberrypi.org/software/)でOSインストーラーをダウンロード。
####2. OSとストレージを選択してWRITE。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637498/73e2bfdd-261b-78ce-a1a4-aa0c28e44d67.png)

# 2. 周辺機器接続
####1. ディスプレイ
####2. キーボード
####3. マウス
####4. Wifiのパスワード控える
####5. マイクロSD挿入
####6. 電源ケーブル挿し込み(電源ON)

# 3. 初期設定
####1. 言語選択
####2. デフォルト
|1  |2  |
|:-:|:-:|
| ユーザー名  | pi  |
| パスワード  | raspberry  |
####3. Wifi設定
####4. アップデート
####5. Restart
####6. 日本語入力設定
ターミナルで
```sudo apt-get install ibus-mozc```

# 4. VNC Viewer 設定
## 4-1. Raspberry Pi 側設定
#### 4-1-1. Startボタン ＞ 設定 ＞ Raspberry Pi の設定

#### 4-1-2. インターフェース ＞ VNC: 有効

#### 4-1-3. ディスプレイ ＞ 解像度を設定 (PCの場合DMT～推奨)

#### 4-1-4. VNCサーバ設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637498/42e2bdee-0052-ed4d-be78-a0796f1702c0.png)
・VNCボタンクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637498/3cb75286-8410-7e9f-16cc-d544ca82a5d3.png)
・IPアドレスメモ *(192.168.3.11)*。

## 4-2. Windows 側設定
#### 4-2-1. VNC Viewer ダウンロード＆インストール。

#### 4-2-2. File ＞ New Connection
|1|2|
|:-:|:-:|
| VNC Server.  | 192.168.3.11  |
| Name  | 好きなの  |

#### 4-2-3. アイコンダブルクリック
医療情報技師　2018

##エビデンスレベル
1. システマティック・レビュー
1. コホート研究
1. 症例報告
1. 専門家の意見

##院外処方箋

院外処方箋は交付日を含めた４日以内が使用期間

##歯科の記録

診療録の保存期間は医科と同じ５年間である。
自由診療に関わるものは別用紙に記入する。

##診療録等の記録

|記録の種類|法律|期間|
|:--:|:--:|:--:|
|助産録|保助看法|5年|
|診療録|医師法または歯科医師法|5年|
|調剤録|薬剤師法|3年|
|歯科技工指示書|歯科技工士法|2年|
|救急救命処置録|救急救命士法|5年|
AtCoderログ：0078 - ABC 214 A

# 問題

https://atcoder.jp/contests/abc214/tasks/abc214_a

## 問題文
> AtCoder Beginner Contest は、今回で $214$ 回目の開催となりました。
> 今までの AtCoder Beginner Contest において、出題される問題数は次のように変化しました。
> ・$1$ 回目から $125$ 回目までは $4$ 問
> ・$126$ 回目から $211$ 回目までは $6$ 問
> ・$212$ 回目から $214$  回目までは $8$ 問
> $N$ 回目の AtCoder Beginner Contest において出題された問題数を求めてください。

## 制約
> ・$1 \le N \le 214$
> ・入力は全て整数である。

# 回答
## 回答1 (AC)
問題文に沿ってコードにしていけば良いでしょう。問題文そのままだと最初の if 文の条件は「1<=n && n<=125」となりますが、制約より「1<=n」であることが保証されているので、「n<=125」だけで十分です。同様に、問題文そのままだと 2 つ目の if 文の条件は「126<=n && n<=211」となりますが、この条件を判断している時点で最初の if 文の条件は成立していない、つまり「n<=125」は成立していないので、「126<=n」であることは確定しています。従って、2つ目の if 文の条件は「n<=211」だけで十分です。

```C++:abc214a-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int n;
  cin >> n;

  if ( n<=125 ) {
    cout << 4 << endl;
  } else if ( n<=211 ) {
    cout << 6 << endl;
  } else {
    cout << 8 << endl;
  }
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc214/tasks/abc214_a/editorial) → [公式解説](https://atcoder.jp/contests/abc214/editorial/2432)
回答1と同じ方針でした。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0080 - ABC 088 C](https://qiita.com/RoadLynton/items/2e7f3cddfc34d92dae8e)
AtCoderログ：0077 - ABC 088 C

# 問題

https://atcoder.jp/contests/abc088/tasks/abc088_c

## 問題文
> $3 \times 3$ のグリッドがあります. 上から $i$ 番目で左から $j$ 番目のマスを $(i,j)$ で表すとき, マス $(i,j)$ には数 $c_{i,j}$ が書かれています.高橋君によると, 整数 $a_1, a_2, a_3, b_1, b_2, b_3$ の値が決まっており, マス $(i,j)$ には数 $a_i+b_j$ が書かれているらしいです.

> 高橋君の情報が正しいか判定しなさい.

## 制約
> ・$c_{i,j}~(1 \le i \le 3, 1 \le j \le 3)$ は $0$ 以上 $100$ 以下の整数

## 収録されている問題セット
- [AtCoder に登録したら次にやること](https://qiita.com/drken/items/fd4e5e3630d0f5859067) ([第08問類題](https://qiita.com/drken/items/fd4e5e3630d0f5859067#%E7%AC%AC-8-%E5%95%8F--abc-085-c---otoshidama-300-%E7%82%B9))

# 回答
## 回答1 (AC)
できることがたくさんあって、逆に何をしたらよいかがわかりにくい問題です。この問題のポイントは、変数 $a_1,a_2,a_3,b_1,b_2,b_3$ の値を求めることが出来ない点に尽きます。6個の変数の和 $a_i+b_j$ は9種類あるので、個々の変数の値が求められそうなものですが、以下の考察により無理であることがわかります：3個の変数$a_1,a_2,a_3$ の値は無関係なので、一列目に並んでいる3種類の変数の和 $a_1+b_1$, $a_2+b_1$, $a_3+b_1$ の値も無関係である。また、3個の変数$b_1,b_2,b_3$ の値は無関係なので、一行目に並んでいる3種類の変数の和 $a_1+b_1$, $a_1+b_2$, $a_1+b_3$ の値も無関係である。よって5種類の変数の和 $a_1+b_1$, $a_2+b_1$, $a_3+b_1$, $a_1+b_2$, $a_1+b_3$ の値は無関係である。逆に、これ以外の4種類の変数の和 $a_2+b_2$, $a_3+b_2$, $a_2+b_3,a_3+b_3$ は他の変数の和と関係を持っている、つまり他の変数の和から計算することが出来る。例えば $a_2+b_2=(a_1+b_2)+(a_2+b_1)-(a_1+b_1)$ と変形できるので、変数の和 $a_2+b_2$ は3種類の変数の和 $a_1+b_2$, $a_2+b_1$, $a_1+b_1$ から計算できます。

コードを作成する上では、1行目と1列目の5種類の値が正しいと仮定して、残りの4種類の値がつじつまにあっているかを確認すれば良いでしょう。例えば列ごとに見ると、、各列の1行目と2行目の差は常に $S=a_2-a_1$、2行目と3行目の差は常に $T=a_3-a_2$ になるはずです。そこで具体的な変数の値 $c_{i,j}$ に対し、1列目から $S,T$ を求め、2列目と3列目において差が $S,T$ になっているかをチェックすれば良いでしょう。コードは以下のようになりました。

![abc088c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1589302/04d78235-4e25-0e79-48ee-4efeeab068ff.png)

```C++:abc088c-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  vector<vector<int>> c(3, vector<int>(3));
  for ( int i=0; i<3; i++ ) {
    for ( int j=0; j<3; j++ ) {
      cin >> c.at(i).at(j);
    }
  }

  int s = c.at(1).at(0)-c.at(0).at(0);
  int t = c.at(2).at(0)-c.at(1).at(0);
  string answer = "Yes";
  if ( c.at(1).at(1)-c.at(0).at(1)!=s ) {
    answer = "No";
  } else if ( c.at(2).at(1)-c.at(1).at(1)!=t ) {
    answer = "No";
  } else if ( c.at(1).at(2)-c.at(0).at(2)!=s ) {
    answer = "No";
  } else if ( c.at(2).at(2)-c.at(1).at(2)!=t ) {
    answer = "No";
  }

  cout << answer << endl;
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc088/tasks/abc088_c/editorial) → [ユーザ解説](https://atcoder.jp/contests/abc088/tasks/abc088_c/editorial)
$a_1,a_2,a_3$ をループで変化させ、関係式から $b_1,b_2,b_3$ を求め、残りの関係式のつじつまがあっているかをチェックする解法です。

## [AtCoder の解説](https://atcoder.jp/contests/abc088/tasks/abc088_c/editorial) → [コンテスト全体の解説](https://img.atcoder.jp/abc088/editorial.pdf)
$a_1=0$ とおくことで他の変数の値を確定させ、残りの関係式のつじつまがあっているかをチェックする解法です。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0076 - ABC 214 に参加しました](https://qiita.com/RoadLynton/items/f01f58c1b0a64d9b32d3)
- 次の記事 → [AtCoderログ：0078 - ABC 214 A](https://qiita.com/RoadLynton/items/f9484704e348f334ea22)
OculusQuest2（Quest1）でパススルー

#0.背景
OculusQuest2に試験的機能として
ビデオパススルーが試験実装されました。
動かすまで地雷踏みまくったので
2021.8.16現在での個人的忘備録も兼ねたこれが最短かもしれない導入方法。

#1.環境準備
・unity2020.1.17f1（unity2020.3LTSでも確認）
・上記unityインストール時にAndroidサポート一式※▽収納開いて確認すること！！
・OculusQuest2（v31）、Quest1でも可能らしい（未検証）
・adbが使える前提

#2.設定
1.Androidにスイッチプラットフォーム
2.playersettingから
　・カラーをGammaからLinner
　・mono2からIL2CPP
　・vulkan削除
　・ARM64にチェック
　・showSplushImageにチェック（unitypro,plusの場合）
　・XR-manegementのOculusにチェック

#3.OculusIntegration 31導入
1.アセットストアからOculusIntegration31をインポート
※インポート後にアップグレードなど聞かれるので良しなに

#4.ビルド
1.sampleframework/passthoughから適当なシーンを開く
（ARシーンが分かりやすくお勧め）
2.OVRCamera→Experienceにチェック
→passthoughCallibrationチェック
→passthroughにチェック
3.ビルド
※XRmanegimentがねえよとか言われるかもなので
パッケージマネージャから入れる

#5.Quest2にインストール&Quest環境設定
・adb shell setprop debug.oculus.experimentalEnabled 1
※Quest2を起動するたびにこのコマンドが必要です。

#6.遊ぶ
日記；回すだけ⑨ST言語でモータを回す記述＜その1＞

###ST言語を使う
　最初、ST言語はC言語のようにがりがりプログラムを書いていかないとモータは回らないと思っていました。調べると、複数の言語が使える国際規格「IEC1131-3」にあるファンクション・ブロック（FB）をST言語の中で利用できるようになっているのです。
　ファンクション・ブロック（FB）は、次のような形です（https://infosys.beckhoff.com/から転載）。
![t114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/3131f14e-79f8-a362-bafd-5d5fed7d163c.png)
　左が入力、右側が出力です。必要なところだけ、記述します。例えば、モータの名前が「軸1」であれば、Axisに軸1を記入します。このモジュールが呼ばれたら、有無を言わせず実行するには、ExecuteをTRUEにします。このファンクション・ブロック（FB）は絶対位置の移動を実施するので、位置はPositionへ、速度はVerlocityを、加速度はAccelerationに実数を書き込みます。
　つまり、C++のクラス・ライブラリと考えればいいわけです。引数がなければ、デフォルト値が使われたりします。
　ST言語内で、図のない形でファンクション・ブロック（FB）が使えます。
　デフォルトだと、スタンダードのライブラリが利用できますが、Motion用にMC2ライブラリを追加すれば、

- MC_Power（電源ON）
- MC_Reset
- MC_SetPosition
- MC_MoveAbsolute
- MC_MoveRelative
- MC_MoveAdditive
- MC_MoveModulo
- Notes on modulo positioning
- MC_MoveVelocity
- MC_MoveContinuousAbsolute
- MC_MoveContinuousRelative
- MC_Halt
- MC_Stop

などが利用できます。これらは、
https://infosys.beckhoff.com/
　-TwinCAT 3
　　-TF5xxx - Motion
　　　-PLC Libraries Motion
　　　　-Tc2_MC2
　　　　　-Motion function blocks
　　　　　　-Point to point motion
 付近に解説があります。
###何をどう書けばいいのか
　上記のような利用できるファンクションがあって、モータを回すには、何と何を書けば、指定の位置へモータを回すことができるか、という解説は見つかりませんでした。

　youtube　Beckhoffの日本法人のコンテンツです。[TwinCAT3モーションプログラム動作](https://www.youtube.com/watch?v=l897EpbkSbQ)

　9秒後の画面を止めます。プログラムが見えています。最初はMC_Power、次はMC_MoveAbsoluteです。この二つでデモをやっています。

　次回、実際にプログラムを書きますが、ほぼ内容が同じものが、youtubeの[12. TwinCAT3 motion program](https://www.youtube.com/watch?v=e6gAGjHUfgU)にあります。韓国語を字幕を出し翻訳してみましたが、ほとんど意味がわかりませんでしたから、画面の操作を見て理解しましょう。
　この事例も、MC_PowerとMC_MoveAbsoluteの二つを使っています。

　たくさんのファンクションを使う例は、[MB06a. [TwinCAT 3 NC] Program MC_Velocity, MC_Relative, MC_Absolute Motion Control [8/20]](https://www.youtube.com/watch?v=DVtIo7e8634)にあります。プログラムはラダーですが、MC2のファンクション・ブロック（FB）をたくさん使っています。


###資料
　IEC61131-3の日本語の資料は、少し古いように思えます。

- https://www.wago.co.jp/io/CAA_manuals/pro_caa.html
- https://cache.industry.siemens.com/dl/files/409/27002409/att_109023/v1/ST_Programming_jap_ja-JP.pdf
- https://www.wago.co.jp/download/tech/data/temp_real_jp.pdf?PHPSESSID=0841b636013f4312cd27b9f6ea484087
コメントアウトすら調べないと出来ない僕向けのコメントアウト備忘録

# 初めに
これは、調べないとコメントアウトのやり方すら思い出せない僕向けの各言語のコメントアウトの備忘録である。

# Python
```python:python 
#１行のコメントアウト

'''
複数行のコメントアウト
複数行のコメントアウト
'''
```

# C,C++
```c:c,c++
// １行のコメントアウト

/*
複数行のコメントアウト
複数行のコメントアウト
*/
```

# Java
```java:Java
// １行のコメントアウト

/*
複数行のコメントアウト
C,C++と同じ書き方で良いことに書いて気づいた。
*/
```

# HTML
```html:html
<!--
１行、複数行共通
-->
```

# 補遺
また使う言語が増えたら追記する。
【実践！Gitコマンド】「cherry-pick」で、あるブランチの特定のコミットを他ブランチに反映させる

チェリーピックは「いいところだけをつまみ食いする」的な意味合いらしいです。
余談ですが、小学校の休み時間のサッカー中、ゴール前に張り付いてシュートだけ決めることを「いいとこドリップ」と呼んでいたのを思い出しました。
当時の缶コーヒー、BOSS贅沢微糖のCMのフレーズです。
刺さる人は同世代の可能性が高いです。

## 目次
-  case1. mainブランチにdevブランチの特定のコミットを反映させたい
-  case2. mainブランチにdevブランチの**複数**のコミットを反映させたい


## case1. mainブランチにdevブランチの特定のコミットを反映させたい

### ①【devブランチ】過去のコミットメッセージを確認
```
$ git log
```
以下のように出力されるので、「欲しいコミット」のハッシュ値を控えておく

```
commit 87c07d8a68b3c1b1a5a164cf9b8534ee1423304b
    いらないコミット１

commit 9cc0edfe16706596b7b1883677b7f34334ea22da
    欲しいコミット

commit 78336ca1ee6c8a5780796b3950406cf3cf548b98
    いらないコミット２

commit fa1bc860dbb6950494be369a38da84f20713e51b
    いらないコミット３
```

### ②【mainブランチ】「欲しいコミット」を反映させる
```
$ git cherry-pick 欲しいコミットのハッシュ値
```
これだけでOK！

## case2. mainブランチにdevブランチの複数のコミットを反映させたい

### ①【devブランチ】過去のコミットメッセージを確認
```
$ git log
```
以下のように出力されるので、「欲しいコミット」のハッシュ値を控えておく

```
commit 87c07d8a68b3c1b1a5a164cf9b8534ee1423304b
    いらないコミット１

commit 9cc0edfe16706596b7b1883677b7f34334ea22da
    欲しいコミット１

commit 78336ca1ee6c8a5780796b3950406cf3cf548b98
    欲しいコミット２

commit fa1bc860dbb6950494be369a38da84f20713e51b
    欲しいコミット３
```

### ②【mainブランチ】「欲しいコミット１～３」を反映させる
```
$ git cherry-pick 欲しいコミット１のハッシュ値..欲しいコミット３のハッシュ値
```
間に「..」を挟むだけでOK！
【8章】Javaを学ぼう

今回の記事では、繰り返し処理について書いていきたいと思います。私自身のアウトプットの場になりますので、よろしくお願いいたします！

#繰り返し処理について
繰り返し処理とは、一定の処理を自動で繰り返し行う処理のことです。
例えば、1から50までの数字をコンソールに出力したい場合、System.out.println()を50回書くのはとても大変なことです。このような処理を自動化するのが繰り返し処理です。

##while文
while文は「条件がtrueの間、{ }内の処理を繰り返す」ことができます。

```java:Main.java
while(条件式) {
  繰り返しをする処理;
}
```

繰り返し処理の流れとしては、まずwhile文の前で変数の初期化を行います。この変数は、while文を繰り返すかどうか判断するために用います。処理が一周終わると、その度に変数は更新され、再び条件式がチェックされます。trueであればもう一周処理を行い、falseであれば繰り返しが終了します。

```java:Main.java
int i = 1;                //①
while(i <= 5) {           //②
  System.out.println(i + "回じゃんけんをしました");  //③
  i++;                    //④
}
```

①で変数iを用意し初期化、②で条件定義、③で処理結果を実行後に④で変数iに1を足していきます。
そうすると6回目の繰り返しでwhileの条件がfalseになり、繰り返し処理が終了します。
④で最後に**変数iに1を足し忘れると変数iは1のまま変わらず、条件が永遠にtrue**になってしまうので、繰り返し処理が無限に行われ、**無限ループ状態**となってしまいますので、必ずどこかで条件がfalseになるように実装しなければなりません。

##for文
次にwhile文同様、繰り返し処理の1つであるfor文について解説していきたいと思います。
for文では、forの後の()内に、「変数の初期化、条件式、変数の更新」の3つを記述します。while文とも比較していきたいと思います。

```java:Main.java
//while文繰り返し処理
int i = 1;                //①
while(i <= 5) {           //②
  System.out.println(i);  //③
  i++;                    //④
}

//for文繰り返し処理
for(int i = 1; i <= 5; i++) {
      //①      //②   //④
  System.out.println(i);
         //③
}
```

それぞれはセミコロン（;）で区切りますが、最後の**変数の更新にはセミコロン（;）をつけない**ことに注意してください。

##breakについて
繰り返し処理を終了するためには、条件をfalseにする以外に、breakを使って強制的に終了させる方法があります。
条件分岐と組み合わせることで、任意の箇所で繰り返し処理を終了させることができます。

```java:Main.java
for(int i = 1; i <= 10; i++) {
 if(i > 5) {
  break;   //変数iの値が6になった段階で繰り返し終了
 }
  System.out.println(i);
}
```

出力結果↓

```java:コンソール
1
2
3
4
5
```

##continueについて
continueはその周の処理だけをスキップして、次の周を実行することができます。continueも条件分岐と組み合わせて利用するのが一般的といえます。

```java:Main.java
for(int i = 1; i <= 10; i++) {
 if(i % 2 == 0) {
  continue;   //変数iの値が2の倍数の時、その周のループをスキップし、次のループを実行
 }
  System.out.println(i);
}
```

出力結果↓

```java:コンソール
1
3
5
7
9
```

以上が繰り返し処理についての内容になります。次章では配列について記事を書いていきたいと思います。配列でもfor文などが出てきますので、忘れないようにしたいと思います。
最後までご覧いただきまして、ありがとうございました！
【7章】Javaを学ぼう

今回は条件分岐の時に使用する、構文である**switch文**について記事を書きたいと思います。
自身のアウトプットの場となりますので、よろしくお願いいたします。

#switch文について
条件分岐には最もよく使うif文の他にswitch文という構文もあります。
下図のように記述します。

```java:Main.java
switch(条件の値) {
 case 値1:
  処理;
  break;
 case 値2:
  処理;
  break;
 case 値3:
  処理;
  break;
}
```

switch文は構文が少し複雑で「:」や「;」を間違えないように記述しましょう。

##if文とswitch文の比較について
switch文とif文の比較を具体例を用いて確認してみます。

```java:Main.java
//if文の場合
int x = 4;
if(x % 2 == 0) {
 //trueになる  
 System.out.println("偶数");
} else if (x % 2 == 1) {
 System.out.println("奇数");
}

//switch文の場合
int x = 4;
switch(x % 2) {
 case 0:  
  System.out.println("偶数");
  break;
 case 1:
  System.out.println("奇数");
  break;
}
```

switch文では、()の中の条件の値と、caseの値が「==」になるとき、処理が実行されます。
今回は「x % 2」が何であるか、で処理を分けたとき、case 0が値として一致したため("偶数")の処理が行われました。

また、switch文の最後につけている**break**とはswitch文を**終了する命令**です。breakがないと、合致したcaseの処理を行った後、その次のcaseの処理も実行してしまいますので、注意するようにしてください。

```java:Main.java
int x = 4;
switch(x % 2) {
 case 0:  
  System.out.println("偶数");
  //breakがない場合
 case 1:
  System.out.println("奇数");
  break;
}

```

出力結果↓

```java:コンソール
偶数
奇数  //合致しない処理まで実行されてしまう
```

##switch文のdefaultについて
switch文では、どのcaseとも一致しなかったときに実行する処理を、defaultに指定することができます。これはif文でいうelseに似ています。

```java:Main.java
//if文の場合
if(rank == 1) {
 System.out.println("金メダル獲得");
} else if (rank == 2) {
 System.out.println("銀メダル獲得");
} else if (rank == 3) {
 System.out.println("銅メダル獲得");
} else {
 System.out.println("メダル獲得なし");
}

//switch文の場合
switch(rank) {
 case 1:  
  System.out.println("金メダル獲得");
  break;
 case 2:
  System.out.println("銀メダル獲得");
  break;
 case 3:
  System.out.println("銅メダル獲得");
  break;
 default:
  System.out.println("メダル獲得なし");
  break;
}
```

以上がswitch文の説明になります。
次章では、繰り返し処理について書いていきたいと思います。よろしければご覧になってください！

最後までご覧いただきまして、ありがとうございました！
任意の時間内に任意の間隔でシェルスクリプトを実行する変なやつのメモ

#概要
引数で設定した期間内で、任意の間隔でスクリプトを実行する。

:::note info
引数：command::term(s),interval(s),script
:::
```bash
#!/bin/bash
round=$(($1/$2))
scr=$3
for ((i=0;i<$round;i++))
do
 eval ${scr}
 sleep $2
done
```

#使用例

```bash
$ ./pulse 60 5 "bash ./temp" #60秒間に5秒間隔でtempと言うシェルスクリプトを実行する
56478
55991
56478
55991
55991
57452
55991
56478
56965
55504
56965
56965
```

※変更：普通に割り算することにしました。
#補足
一分毎とかなら普通にcron使ったほうが良いよ。

おわり。
JetBrainsのToolbox AppをUbuntuにインストールするだけ

結論から言うと、[jetbrains-toolbox-install](https://github.com/nagygergo/jetbrains-toolbox-install) を利用すれば下記で良い感じにinstallしてくれます。

```bash
$ curl -fsSL https://raw.githubusercontent.com/nagygergo/jetbrains-toolbox-install/master/jetbrains-toolbox.sh | bash
```


<br>

公式サイトの、tar.gzファイルダウンロードして………？
ってなったので書きました。
実は中にあるバイナリファイル実行すれば良い感じに処理してくれるので終わりだったりします。

## マニュアルでは…

[jetbrainsのドキュメント](https://pleiades.io/help/idea/installation-guide.html#52da1484) によると tar.gz をダウンロードして/optに展開して実行するとよいらしい。
例えば、versionが1.21.9712だと下記を実行すれば良いみたいに書かれてる。

```bash
$ sudo tar -xzf jetbrains-toolbox-1.21.9712.tar.gz -C /opt
$ /opt/jetbrains-toolbox-1.21.9712/jetbrains-toolbox
```

しかしコレだと次回起動する時にちゃんとしたパスを覚えているか不安でしょうがないため、
/usr/local/bin/ などにシンボリックリンクが張りたくなる。

```bash
$ ls -s /opt/jetbrains-toolbox-1.21.9712/jetbrains-toolbox /usr/local/bin/jetbrains-toolbox
## 2回目以降はコレで実行
$ jetbrains-toolbox
```

コレを実際にやってくれるのが[jetbrains-toolbox-install](https://github.com/nagygergo/jetbrains-toolbox-install)。
ドキュメント内にもリンクが記載されているので公式？。

### でも /usr/local/bin/ にリンク要らないぽいんだよね。。。

あっ…Toolbox AppってOS再起動しても自動起動するし、アプリケーションで検索にもいるのね……

![jetbrains-icon-example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155890/f64cf8cf-eadb-4ad8-2c2b-efbcaceb4a53.png)

つまり/optに展開されたバイナリファイルは実行されると、
下記に自身のコピーを作成(シンボリックリンクでない)してるぽい。

```
~/.local/share/JetBrains/Toolbox/bin/jetbrains-toolbox
```

アプリケーション表示するためのファイルを作成、追加しているぽい。

```bash
~/.local/share/applications/jetbrains-toolbox.desktop
```

また、OSの起動時に自動起動するような設定を作成、追加しているぽい。

```bash
~/.config/autostart/jetbrains-toolbox.desktop
```

そのため、基本的に自動起動して常駐するのでアプリを手動で起動することはほぼ無い(ツールバーに常にいる)ですし、
アプリを手動で起動したいときも「アプリケーションを表示する」から検索して使えるようになってます。

確かに端末から```$ jetbrains-toolbox```と打って起動することはほぼ無いので、
インストールする際は、ダウンロードしたtar.gzファイルを展開してバイナリファイルを実行するだけでも良いと思います。
ということで冒頭のスクリプトは、最新版のToolbox Appを一行でインストールできるのが便利な感じですね。

## 備考

この実行するだけでインストールされるバイナリの作り方知っている方がいましたら誰か教えてください。
多分初めて見たので面白かったし、ライブラリとかテンプレートが存在しそうな気がするのですが……

## 参考

https://pleiades.io/help/idea/installation-guide.html
https://github.com/nagygergo/jetbrains-toolbox-install
仮想通貨の自動売買チュートリアル。はじめに

以下のチュートリアルの導入

https://qiita.com/richmanbtc/items/05916384bf9d2b1e2f35

## botterとは？

botterは仮想通貨(ビットコインなど)をプログラムで自動でトレードする人のことです。
自動売買プログラムをbotと呼びます。

botterになると不労所得を得られます。
実際に儲けることは可能です。
以下を読むとbotterの全体像をつかめます。

[「お前もbotterにならないか？」仮想通貨のボットで稼ぐのどうやるのまとめ。](https://note.com/hht/n/n61e6ecefd059)

以下のタグは毎月、仮想通貨の月次損益を報告するために使われています。
botterと裁量トレーダーが混在しています。
ここで報告しているような人をフォローすると界隈の雰囲気をつかみやすいです。
[#仮想通貨月次報告](https://twitter.com/hashtag/%E4%BB%AE%E6%83%B3%E9%80%9A%E8%B2%A8%E6%9C%88%E6%AC%A1%E5%A0%B1%E5%91%8A)

## botterはkaggleみたいで楽しい

botterの以下のような点はkaggleに通じるものがあると思います。

- botter界隈での成績競争
- 儲かるbotを作れたときの達成感
- 改善による成長実感
- 知的好奇心の刺激

## データサイエンティストが求められている

botter界隈で機械学習は去年から少し流行りはじめたくらいの状況で、まだノウハウが溜まっていません。
kaggleで活躍しているような、本職のデータサイエンティストがbotter界隈に入ってきたら、勝てる気がしません。
本職の人たちが界隈に入ってきて、互いに刺激になったらいいなと思います。

## チュートリアルは重要な部分に絞った

botを作り実際に儲けるためには、以下のステップが必要です。

1. 儲かるアルゴリズムを探す
1. botの実装
1. デプロイ
1. 運用

bot開発に費やす時間のうち99%は1に費やされます。
2, 3, 4はかんたんです。
私が初めて儲かるbotを作ったときは、1に1ヶ月半かかりました。
その後の2, 3, 4は半日でした。
1を詳しく解説するのが大事です。
なので、このチュートリアルでは1のみ解説します。

他にも理由はあります。

- 1を突破できれば、実際に稼働して儲けるのが楽しみすぎて、2, 3, 4はチュートリアルが無くても苦にならない
- ボットはウェブサービスなどと比較してシステムがシンプルなので、品質の低いコードでも問題なく動く
- 2, 3, 4の解説記事は他にもたくさんある
GoのEven Or Oddの問題から解決方法の豊富さ

[Go](https://golang.org/)の勉強がてら問題をといており、解き方が複数あり個人的なポエム。

bit wise and が結構優秀だったので、覚書。

## 課題

```
引数number(int)を渡すEvenOrOdd関数を作成して、引数が偶数の場合は"Even"、奇数の場合は"Odd"を返却する関数を作成しなさい。
```

### 解決方法1. あまりを計算してstringを返却する

```main.go
package main

func EvenOrOdd(number int) string {
    if result := number % 2; result == 0 {
        return "Even"
    }
    return "Odd"
}

```

### 解決方法2. 連想配列を作成して、計算結果をkeyにしてvalueを返す

```main.go
package main

import "math"

func EvenOrOdd(number int) string {
	dict := map[int]string{0:"Even", 1:"Odd"}
	return dict[int(math.Abs(float64(number))) % 2]
}
```

### 解決方法3. 配列を作成して計算結果をkeyにしてvalueを返す

解決方法2に近い。

```main.go
package main

import "math"

func EvenOrOdd(number int) string {
    return []string{"Even", "Odd"}[int(math.Abs(float64(number))) % 2]
}
```

### 解決方法4. 連想配列でbit wise andを利用して計算を実施する

```main.go
package main

func EvenOrOdd(number int) string {
    dict := map[int]string{0:"Even", 1:"Odd"}
    return dict[number & 1]
}
```

### 解決方法5. 配列を作成して、bit wise andを利用して計算を実施する

```main.go
package main

func EvenOrOdd(number int) string {
   return []string{ "Event", "Odd" }[number & 1]
}

```

### テスト

以下のテストケースで確認

```main_test.go
package main

import (
	"testing"
)

func TestEvenOrOdd(t *testing.T) {
	tests := []struct {
		name string
		arg int
		want string
	}{
		{ name: "Even", arg: 2 , want: "Even" },
		{ name: "Odd", arg: 1, want: "Odd" },
		{ name: "Zero", arg: 0, want: "Even" },
		{ name: "minus Odd", arg: -1, want: "Odd" },
		{ name: "minus Even", arg: -2, want: "Even" },
	}

	for _, tt := range tests {
		t.Run(tt.name, func (t *testing.T) {
			t.Cleanup(func() {
				t.Log("clean up !")
			})

			defer t.Log("defer!")

			if result := EvenOrOdd(tt.arg); result != tt.want {
				t.Fatalf("EvenOrOdd() = %v, want %v", result, tt.want)
			}
			t.Log("after EvenOrOdd() ...")
		})
	}
}
```
[環境構築] Pythonで機械学習もWeb開発もやりたいよ！！っていう素敵な欲張りさんへ

#前置き
- Web開発でも機械学習でもPythonを使用するよ〜ってなったときの環境構築の1つの案を提案します
- Python触って2年くらいの大学生の考えなので間違っている、情報が足りない可能性がありますことご容赦ください


#対象読者
PythonでWebアプリケーションも作りたいし機械学習もしたい!! っていう人（自分）

#結論
###pyenv使ってPythonとAnacondaを両立させました

#バージョン
- macOS Catalina 10.15.7
- anyenv 1.1.4
- pyenv 2.0.4
- Python 3.9.0
- virtualenvwrapper 4.8.4

#動機
- 今までの環境はpipとcondaをごちゃ混ぜで使っていて気持ち悪かった

- インターンシップでPythonでバックエンド開発することになり、機械学習用の環境とWeb開発用の環境を分割したかったから

#やったこと
1. AnacondaやローカルにインストールしていたPythonをアンインストール

2.  Homebrewからanyenvをインストール+パスを通す
2.  Homebrewからpyenvをインストール+パスを通す
2.  pyenvで機械学習用、Web開発用にAnacondaとPythonをそれぞれインストール
2.  プロジェクト単位で仮想環境を用意したいのでvirtualenvwrapperをインストール+パス通す

#過去環境をアンインストール
1. Anaconda消去手順
    1. anaconda-cleanを利用
    1. anacondaディレクトリを削除
    1. shellのパスを削除
    1. アプリケーションを削除
1. Python消去手順(Homebrewでインストールしている場合)
    1. brew listでインストールしているPythonを調べる
    1. brew python@ uninstallでアンインストールする
    
Anacondaの削除のコマンド解説やHomebrew以外でPythonをインストールしている方は下記詳細にてご確認ください！
[
Anaconda3をmacOSから完全にアンインストールする方法](https://weblabo.oscasierra.net/python-anaconda-uninstall-macos/)
[pythonをアンインストールする5つの方法](https://shikaku-mafia.com/python-uninstall/)

#anyenv、pyenvをインストール
これの通りやればいいよ！！っていうのがあるのでそちらを貼ってしまいます
[anyenvとpyenvでPythonをインストールする](https://qiita.com/suke_masa/items/f4db76408b4739de11e3)

#virtualenvwrapperをインストール
- これはvenvという軽量な仮想環境を作成するモジュールをいい感じに整理してくれるやつです
- venvはPythonの3.3から標準実装されているのでインストールする必要はないです
- 公式ドキュメントを読んでいただけたら使い方すぐわかると思うのでリンク貼っておきます

[virtualenvwrapper公式ドキュメント(インストール使い方)](https://virtualenvwrapper.readthedocs.io/en/latest/)

#まとめ
1. 今回はWeb開発でも機械学習でもPythonを使用するよ〜ってなったときの環境構築の1つの案をまとめさせていただきました。
1. 初めての投稿かつ筆者があやふやなところもありまして、わかりづらい&&間違っている箇所があると思いますのでもし気づいていただけたらコメントで優しく教えていただけたら嬉しいです！
1. 具体的なコマンドとかはリンクを参照していただく形にしたんですが、この記事内にコマンドなど全部埋め込んだ方がいいのかと書き終えた時点で悩んでおります。時間があったらそれにも挑戦してみます！

#最後に
拙い日本語でしたが最後まで記事を読んでいただきありがとうございました！
良い開発ライフを！！
RCI - 順位相関指数

RCI - Rank Correlation Index
RCI(順位相関指数)がTA-Libに無いのでPythonで書いてみた。


```python:rci.py
    import numpy as np

    def rci(close: np.ndarray,
            timeperiod: int = 9) -> np.ndarray:
        rci = np.full_like(close, np.nan)
        rank_period = np.arange(1, timeperiod + 1)
        for i in range(timeperiod - 1, len(close)):
            rank_price = close[i - timeperiod + 1:i + 1]
            rank_price = np.argsort(np.argsort(rank_price)) + 1
            aa = 6 * sum((rank_period - rank_price)**2)
            bb = timeperiod * (timeperiod**2 - 1)
            rci[i] = (1 - aa / bb) * 100
        return rci
```

ちょっと改良版
forループをやめて高速化しました。
ただしtimeperiodが大きすぎるとメモリ消費が激しく
Forループ版との速度差が縮まっていきます。


```python:rci_np.py
def rci(close: np.ndarray,
        timeperiod: int = 9) -> np.ndarray:
    rank_target = [np.roll(close, i, axis=-1) for i in range(timeperiod)]
    rank_target = np.vstack(rank_target)[:, timeperiod - 1:]
    price_rank = np.argsort(np.argsort(rank_target[::-1], axis=0), axis=0) + 1
    time_rank = np.arange(1, timeperiod + 1).reshape(timeperiod, -1)
    aa = np.sum((time_rank - price_rank)**2, axis=0, dtype=float) * 6
    bb = float(timeperiod * (timeperiod**2 - 1))
    cc = np.divide(aa, bb, out=np.zeros_like(aa), where=bb != 0)
    rci = (1 - cc) * 100
    rci = np.concatenate([np.full(timeperiod - 1, np.nan), rci], axis=0)
    return rci
```
絶対LaTeX環境入れたくない人の戦い(Cloud LaTeX + VSCode + GitHub)

## きっかけ

こんな記事を見つけた

https://www.slideshare.net/kinmemodoki/git-2016-70268276

GitHubで卒論を管理する。そんなクールなことができるのかと思いつつ、$\LaTeX$をインストールするのは面倒くさい。

そんな人が、$\LaTeX$を使うための記事です。

## 環境

- macOS 
- VSCode
- Gitインストール済み
- GitHubアカウント作成済み
- **LaTeXインストールしたくない！**

## Cloud LaTeXって？

知ってる人は[次の章](#vscodeの拡張機能を入れる)へ

[Cloud LaTeX](https://cloudlatex.io/ja)とは、ウェブブラウザ上でLaTeXを編集、コンパイルできるツールです。
LaTeXの基本機能はもちろん、ドラックアンドドロップで画像や表をアップロードできるなど、非常に便利なサイトです。

最近、このCloud LaTeXにVSCodeの拡張機能が開発されました。
＝ローカルでソースを管理できます
＝Git/GitHubでバージョン管理できます。

アカウントは[こちら](https://cloudlatex.io/users/sign_up)から作成できます。

## VSCodeの拡張機能を入れる

https://marketplace.visualstudio.com/items?itemName=cloudlatex.cloudlatex

ここからインストール、[マニュアル](https://github.com/cloudlatex-team/cloudlatex-vscode-extension/blob/master/docs/README_ja.md)に沿って設定を進める

必須ではないですが、LaTeX Workshopを併用するとPDFのプレビューやコマンドの補完機能が使えます。

https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop

テストのために、下記のLaTeXソースコードを使用しました。

<details><summary>LaTeXサンプルコード</summary><div>

LaTeXのマニュアル中からサンプルコードをお借りしました。
CC BY 4.0 [LaTeX入門/レポート](https://texwiki.texjp.org/?LaTeX%E5%85%A5%E9%96%80%2F%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88)

```latex
\documentclass[dvipdfmx]{jsarticle}
\begin{document}

\title{情報科学レポート}
\author{奥村晴彦}
\maketitle

\section{はじめに}

この文書は，ごく基本的なレポートや論文の例を示すものです。
実際にこのソースを入力してタイプセット（コンパイル）し，
タイトル，著者名，本文，見出し，箇条書きがどのように表示されるかを
確認してみましょう。

\section{見出し}

この文書の先頭にはタイトル，著者名，日付が出力されています。
特定の日付を指定することもできます。

そして，セクションの見出しが出力されています。
セクションの番号は自動的に付きます。

\section{箇条書き}

以下は箇条書きの例です。これは番号を振らない箇条書きです。

\begin{itemize}
  \item ちゃお
  \item りぼん
  \item なかよし
\end{itemize}

これは番号を振る箇条書きです。

\begin{enumerate}
  \item 富士
  \item 鷹
  \item なすび
\end{enumerate}

\section{おわりに}

これは一段組の例ですが，二段組に変更することもできます。

解説文を読んで，このソースをいろいろと変更してみましょう。

\end{document}
```
</div></details>

### 若干詰まったところ

- VSCodeにインストールしたのち、設定する場合は**フォルダ**を開く必要があります
- ファイルの出力先である`cloudlatex.outDir`には、デフォルトのままだと動きませんでした。同じディレクトリに入れる場合は`.`を入力します
- LaTeX Workshopと併用する場合、Settings.jsonを編集する必要がありますが、その場合は`基本設定: ワークスペース設定を開く (JSON)`を選択します。

## GitでLaTeXを管理する

### GitHubにプライベートレポジトリを作る

卒論やレポートなどは、プライベートレポジトリがのぞましい。

### .gitignoreを設定する。

LaTeX固有の中間ファイルと、Cloud LaTeX拡張機能のフォルダを除外する

```text
.vscode/
*.log
*.pdf
*.synctex
__latexindent_temp.tex
```

その他、使ってるうちに変なファイルが出てきたらステージする前に追加する。

## ひたすらレポートor卒論を書く

レポートを書きまくる

ブランチの切り方は下記の記事が大変参考になったので、真似させて頂こうと思っています

https://fromatom.hatenablog.com/entry/2014/02/09/001136

まとめると、n稿ごとにブランチを切り、n稿が完成したらGitHub上でPRを送ります

それにより、自分のやったことが可視化されるメリットがあります。

## 参考文献

https://www.slideshare.net/kinmemodoki/git-2016-70268276

https://fromatom.hatenablog.com/entry/2014/02/09/001136

https://github.com/cloudlatex-team/cloudlatex-vscode-extension/blob/master/docs/README_ja.md

https://hydrocoast.jp/index.php?LaTeX/Git%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E6%96%87%E6%9B%B8%E3%81%AE%E7%AE%A1%E7%90%86
仮想通貨の自動売買チュートリアル。FAQ

以下のチュートリアルに関するFAQです。

https://qiita.com/richmanbtc/items/05916384bf9d2b1e2f35

## Jupyter環境に追加ライブラリをインストールするには？

JupyterのDockerfileは以下にあります。
ここで追加ライブラリをインストールしてください。

https://github.com/richmanbtc/mlbot_tutorial/blob/master/docker_images/jupyter/Dockerfile

このファイルを編集後、Jupyter環境をビルドしなおして、コンテナを作り直してください。
mlbot_tutorialディレクトリで以下のコマンドを実行するとビルドできます。

```bash
docker-compose build
```

mlbot_tutorialディレクトリで以下のコマンドを実行するとコンテナを作り直せます。

```bash
docker-compose up -d
```
～ bit演算 ～ チートシート

#目次
[二進数に変換](#二進数に変換)　`bin()`
[論理演算子](#論理演算子)
　AND　`&`
　 OR　 `|`
　NOT　`~`
　XOR　`^`

#はじめに

チートシートの扱いついては[ここ](https://qiita.com/ysys_Ba/items/d27282b888abbd1f43e7#%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)を読んでください

#二進数に変換

```python:bit.py
print(bin(334))
```
```python:ans.py
>>> 0b101001110
```
最初の`0b`以降が２進数表記になってる

#論理演算子

```python:bit.py
# 114 =    1110010(2)
# 514 = 1000000010(2)

print(114 & 514) # AND
print(114 | 514) # OR
print(114 ^ 514) # XOR
print(~114)      # NOT
```
```python:ans.py
>>> 2    # 0b10
>>> 626  # 0b1001110010
>>> 624  # 0b1001110000
>>> -115 # -0b1110011 ( = 0b0001101)
```

それぞれの桁に対し、
`AND`：どちらも1ならば1を返し、それ以外は全て0を返す
`OR` ：どちらか一方のみでも1ならば1を返し、それ以外は全て0を返す
`XOR`：どちらか一方のみが1ならば1を返し、それ以外は全て0を返す
`NOT`：1ならば0を返し、0ならば1を返す（2の補数表現より、~N = -(N+1)）
Atcoderで時々出てくるXORの性質として、**A XOR B = C ⇔ A XOR C = B** がある
医療情報技師試験に向けて

#解像度　これだけは覚えるしかないのか問題

暗記が苦手だ〜〜
と言ってても仕方ないし、そもそも資格試験なんて暗記100％なところあるから仕方ない

###VGA
解像度　640＊480

###SVGA
解像度　800＊600

###XGA
解像度　1024＊768

###SXGA
解析度　1280＊1024

###HD
解析度　1366*７６８

###FHD
解析度　1920＊1080

###４K
解析度　3840*2160

###８K
解析度　7680＊4320
医療情報技師試験４

#医療情報技師　2019 医学医療編
パッと解いてみて、うやむやになっているところをまとめてみた

##平均在院日数
退院した患者が何日入院していたか

在院患者延べ数÷［（新入院患者数＋退院患者数）÷2

これがイマイチ理解できない

まず理解すべきところは_のべ患者日数_ というところです。

>1日1人カウント。
>1人が50日間入院していたら50人。2日間の入院が25人いた場合も50人です。

>　これを、『その期間内の入院患者数と退院患者数を足して2で割ったもの』で割る。
>Aさんが入院したら、1。同じAさんが退院したら、プラス1。合計して2です。
>このままだと、同じ人が2回カウントされていますので、2で割る。……という考え方でいいと思います。

##医療機器の分類
医療機器は使用安全上のリスクの大きさから３つに分けられる。

###高度管理医療機器
機器の機能障害によって患者に大きな影響を与えるもの
輸液ポンプなどもそう

###管理医療機器
電子内視鏡など

###一般医療機器
使用目的に沿って適正に使用されている状況で副作用や機能障害が生じた場合でも、人の生命および健康に与える影響がきわめて軽いものをさす。 体外診断用機器、鋼製小物（メス、ピンセット、鋏(はさみ)など）、聴診器、水銀柱式血圧計、X線フィルム、歯科技工用用品などが含まれる。

##根本原因分析(RCA)
インシデントなどから根本的な原因を追求する方法

###4M4E分析
4M5E分析とはフレームワーク型の分析手法で、インシデントやアクシデントの要因を4つの「M」の視点から分析して、さらに対策を5つの「E」の視点で行う手法です。

インシデントやアクシデントが発生した場合、4M5E分析では下図の4つの「M」の視点から分析していきます。
![4m.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960912/31a728dd-8dfb-6cf0-4fc3-ef471e91b984.png)



![5e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960912/b0ee265e-d696-88de-23da-37b728139d46.png)

###SHELモデル
当事者である人間（概念図中心のL：LIVEWARE）が最適な状態を保つためには４つの要因が影響しているということを表したものです。
中心のLが不定形な外縁となっているのは、人間が状況によってその能力や限界が様々に変化することを表しており、その不定形な外縁にピッタリと合うように４つの要因と当事者自身の対応を考えるというモデルです。

![01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960912/697e2f49-a2de-3004-81b7-4937d602e8ba.gif)

##診療ガイドラインの目的

* 医療の質の向上
* エビデンスの提供
* 患者への情報提供
* 施設格差の解消

##特別生物由来製品

生物由来製品とは、人その他の生物に由来するものを原料又は材料として製造をされる医薬品、医薬部外品、化粧品又は医療用具のうち、保健衛生上特別の注意を要するものとして、厚生労働大臣が薬事・食品衛生審議会の意見を聴いて指定するものをいう。（改正薬事法第２条第５項）

特定生物由来製品とは、生物由来製品のうち、販売し、賃貸し、又は授与した後において当該生物由来製品による保健衛生上の危害の発生又は拡大を防止するための措置を講ずることが必要なものであつて、厚生労働大臣が薬事・食品衛生審議会の意見を聴いて指定するものをいう。（改正薬事法第２条第６項）

具体的には….

血液製剤（赤血球製剤、血漿製剤、血小板製剤）
血液凝固因子
人血清アルブミン
人免疫グロブリン　などがある。


###使用上の注意

患者の同意が必要です
人の血液より調製される製剤にはアレルギー反応や感染症などの危険性があります。医療機関はその内容と血液製剤や血漿分画製剤の必要性を患者様に説明し同意を得る必要があります。

__20年間__ その情報を保管する義務があります。（　__医療品医療機器等法__　）　

##処方箋について

保険診療による長期投与の制限は原則廃止されている。医師の判断による適切な期間の投与が可能である。
ただし

* 麻薬・向精神薬（最大14〜90日）
* 発売後一年の新薬は投与制限がある（原則として最大１４日）
* 麻薬の処方時には患者の住所及び麻薬使用者の免許証番号の記載が必要（麻薬及び向精神薬取締法）専用の処方箋が必要

放射線医薬品を用いた検査

* 骨シンチグラフィ
* PET検査

##新薬開発のステップ
1. 基礎研究
1. 非臨床研究　(動物実験)
1. 臨床研修

臨床検査はさらにステップが分けられる


* 臨床薬理検査　　健常人や患者ボランティアに薬物動態を検査する
* 探索検査前期　　患者を対象として推奨容量を推定する
* 探索検査後期　　効果・安全性を検査する
* 検証試験　　多くの患者に有効性・安全性を検証する
* 製造販売後臨床検査　　販売後も安全性・有効性を検査する

##検定方法

###t検定
正規分布に従う２群の差を検定する
独立の２群と対応のある２群の２種類がある

###符号検定
正規分布に従わない場合に介入前後に変化があるか検討する方法

###符号付け順位和検定
正規分布に従わない対応のある２群の差を比較する手法である

###Wilcoxonの順位和検定
正規分布に従わない対応のない２群の差を比較する手法である

##臓器がん登録
専門の医師が属する病院などで実施される、全ての病院が対象ではない
全国がん登録では都道府県に届け出ることが義務化されている

全国がん登録に登録される情報は個人情報（氏名、性別、生年月日、住所）、診断を行った医療機関名、診断日、がんの種類と進行度、発見の経緯、治療内容、死亡日
node.js超入門ノート3(Webページ追加編)

# Webページの追加
まずはテンプレートファイルを作成します。
viewsフォルダに以下のファイルを追加します。

```html:hello.ejs
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="content-type" content="text/html">
        <title><%= title %></title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
    </head>
    <body class="container">
        <header>
            <h1><%= title %></h1>
        </header>
        <div role="main">
            <p><%- content %></p>
        </div>
    </body>
</html>
```
変数は以下のように指定します。

```
<%= 変数名 %>  HTML表記NG
<%- 変数名 %>  HTML表記OK
```

次にroutesフォルダに以下のソースコードを記載する。

```javascript:hello.js
var express = require('express');
var router = express.Router();

/* GET home page. */
// 以下の'/'は後のapp.jsで示す/hello以降のアドレス
router.get('/', (req, res, next) => {
    var data = {
        title: 'Hello!',
        content: 'これは、サンプルのコンテンツです。<br>This is sample content.'
    };
    res.render('hello', data);
});

module.exports = router;
```

最後にhello.jsにアドレスを割り当てる。

```javascript:app.js
// ルート用モジュールのロード
var hello = require('./routes/hello');
// アドレスに割り当てる
app.use('/hello', hello);
```

サーバーを起動し、以下のアドレスにアクセスする。

http://localhost:3000/hello

https://qiita.com/Glider2355/items/fdcfba17215ac148745d
MCD(Mel-cepstrum distortion)を求める(音の長さが異なる版)

# MCDを求めるが音の長さは違う
- 前回の記事でこんなのを書いた<br>
[MCD(Mel-cepstrum distortion)を求める](https://qiita.com/fleming_tone/items/618572daba8f8c3b6b51)
- しかし,普通声質変換などで生成された音声がrefrenceと**全く同じ長さになるわけない！！**
- よって，今回は音声の長さを異なる音声でMCDを求められるようプログラムを更新
- 長さの異なるものを合わせるためにDTW(Dynamic Time Warping)を用いて合わせるよ！<br>
[DTW(Dynamic Time Warping)動的時間伸縮法](https://data-analysis-stats.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/dtwdynamic-time-warping%E5%8B%95%E7%9A%84%E6%99%82%E9%96%93%E4%BC%B8%E7%B8%AE%E6%B3%95/)

#使用する要素技術とツール達
- MCD(modulation spectra distance)式は以下の通り[参考サイト](https://dsp.stackexchange.com/questions/56391/mel-cepstral-distortion)

```math
\frac{10\sqrt{2}}{\ln10}\frac{1}{T}\sum_t\sqrt{\sum^{25}_i 2||mc(t,i)-mc_{synth}(t,i)||^2}
```

- DTW(Dynamic Time Warping) [参考サイト](https://data-analysis-stats.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/dtwdynamic-time-warping%E5%8B%95%E7%9A%84%E6%99%82%E9%96%93%E4%BC%B8%E7%B8%AE%E6%B3%95/)

>DTWとは時系列データ同士の距離・類似度を測る際に用いる手法です。波形の距離を求める手法としてはユークリッド距離（Euclidean Distance）や マンハッタン距離等（Manhattan distance）があるかと思います。

>DTWは２つの時系列の各点の距離(誤差の絶対値)を総当たりで求め、全て求めた上で２つの時系列が最短となるパスを見つけます。時系列同士の長さや周期が違っても類似度を求めることができます。

- ツールはlibrosaの`librosa.sequence.dtw`を使います！[librosaのリンク](https://librosa.org/doc/main/generated/librosa.sequence.dtw.html)
- `librosa.sequence.dtw`から得たwpを用いて対応を取れば`nnmnkwii.metrics`で比較できる！

# 実装コード
```python
# -*- coding: utf-8 -*-
import os
import sys
import librosa
import numpy as np
import pyworld
import pysptk
from nnmnkwii.metrics import melcd

args=sys.argv
if len(args) != 3:
    print("python3 mcd_dtw.py [input wavfile1] [input wavfile2]")
    sys.exit()

else:
    sr = 22050
    FRAME_PERIOD = 5.0 #default 5.0
    alpha = 0.65  # commonly used at 22050 Hz
    fft_size = 512 #default 512
    mcep_dim = 34 #default 34

    wav1, _ = librosa.load(sys.argv[1], sr=sr, mono=True)
    wav2, _ = librosa.load(sys.argv[2], sr=sr, mono=True)
 
    # Use WORLD vocoder to spectral envelope
    _, sp1, _ = pyworld.wav2world(wav1.astype(np.double), fs=sr, frame_period=FRAME_PERIOD, fft_size=fft_size)
    # Extract MCEP features
    mgc1 = pysptk.sptk.mcep(sp1, order=mcep_size, alpha=alpha, maxiter=0, etype=1, eps=1.0E-8, min_det=0.0, itype=3)
    # Use WORLD vocoder to spectral envelope
    _, sp2, _ = pyworld.wav2world(wav2.astype(np.double), fs=sr,frame_period=FRAME_PERIOD, fft_size=fft_size)
    # Extract MCEP features
    mgc2 = pysptk.sptk.mcep(sp2, order=mcep_size, alpha=alpha, maxiter=0, etype=1, eps=1.0E-8, min_det=0.0, itype=3)

    ref_frame_no = len(mgc1)

    min_cost, wp = librosa.sequence.dtw(mgc1[:, 1:].T, mgc2[:, 1:].T)
   
    result = melcd(mgc1[wp[:,0]], mgc2[wp[:,1]] , lengths=None)
```

- 細かい変数などがあるが余り気にしないで，基本的には関係なし
- 参考サイトは以下(https://github.com/SamuelBroughton/Mel-Cepstral-Distortion/blob/master/mel-cepstral-distortion.ipynb)
Vue.jsのトラップ -- Vue.jsの単一ファイルコンポーネント（SFC）ではname指定を省略してよい

# 結論

Vue.jsでは単一ファイルコンポーネント（SFC）の場合、`name`オプションにコンポーネント名を指定しなくても**ファイル名（○○.vue）からコンポーネント名を自動推論してくれます。**
そのため、通常は`name`オプションでコンポーネント名を明示的に指定する必要はありません。


```vue:Button1.vue
<template>
  <button>Example Button 1</button>
</template>

<script>
export default {
  name: "Button1", // この指定は省略可能
                   // (省略した場合のコンポーネント名は、ファイル名が「Button1.vue」なので「Button1」となる)
  methods: {
    // ...
  }
};
</script>
```

参考：[Automatic Name Inference - Vue.js (v3) APIリファレンス](https://v3.ja.vuejs.org/api/sfc-spec.html#automatic-name-inference)　※英語

# そもそもname指定は何のために必要なの？

Vue.jsの公式ドキュメント内、[nameオプションの説明](https://v3.ja.vuejs.org/api/options-misc.html#name)によると下記の通りです。

> コンポーネントがテンプレートの中で自分自身を再帰的に呼び出すことを許可します。コンポーネントが `app.component` でグローバルに登録されているとき、グローバル ID が自動的にその名前として設定されることに注意してください。

> `name` オプションを指定する他の利点はデバッグです。名前付きのコンポーネントは、警告メッセージでより助けになります。また、[vue-devtools](https://github.com/vuejs/vue-devtools) でアプリケーションを調査するとき、名前のないコンポーネントは `<AnonymousComponent>` として表示されてしまい、あまり情報量が多くありません。`name` オプションを提供することで、より情報量の多いコンポーネントツリーを得ることができます。

要約すると、
(1) コンポーネントAの中で、A自身を再度呼び出したいときに使う
(2) vue-devtoolsでコンポーネント名を表示するために使う
という2つの目的で使われるとのことです。

また、Vue.js APIリファレンスの「[Automatic Name Inference](https://v3.ja.vuejs.org/api/sfc-spec.html#automatic-name-inference)」によると、「Dev warning formatting」（開発時警告のフォーマット）にも使われるそうです。おそらく、開発者ツールで表示されるWarningやエラーメッセージの際に使用されるのでしょう。

# おわりに

Vue CLI（`vue create`）やVite（`npm init vite@latest`）で新しいVue.jsプロジェクトを作成すると、その中のサンプルコードでは軒並み`name`が指定されています。
そのため、Vue.jsを学び始めるときにサンプルコードを見て「なるほど、Vue.jsではコンポーネントの名前を常に指定した方がいいんだな。ファイル名と手動で合わせないといけないから二重記載になって面倒だけど仕方ない :frowning:」と思い、そのあと自分の作ったVue.jsプロジェクトでもずっと`name`を指定し続けていませんでしたか？　**私はそうしていました。**

この記事を読んで、同じようなトラップにはまる人が減り、逐一`name`指定を書く手間から解放されれば幸いです。
Power Automate Desktopを使って新規依頼をTeamsのチャネルで共有してみた


こんにちは！
在宅勤務になってから、情報共有がとても大切になりました。
(とはいっても、コロナ流行後に就職しているため、以前との働き方の違いはわかりません)

テレワークが増えたことで業務では、メールとTeamsの両方を主に使用しています。
しかし、どのツールで共有を行うかが少し問題になってきます。

例えば・・・依頼を受ける側として考えてみてください。

①メールで依頼書の受信
②依頼書を対応一覧への転記←意外と時間がかかります
③Teamsから案件関係者に連絡

上記の3つのフローが発生します。
①と③に関してもう少し効率化できないかを考えてみました。

メールではなくて、最初からTeamsでやり取りすれば
解決する話では？と思う方もいらっしゃると思います。

しかし、定期的に対応している案件でなく、イレギュラーな新規案件ほど
メールから始めるケースが多々あります。

Power Automate Desktopとoutlookを連携させてトライしてみました。

#完成図したもの#
【Power Automate Desktop】
![PowerAutomate Desktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1802156/69fd297a-d91f-afd2-c2b5-02a2a62303b2.png)

【Teamsへの投稿】
![Teams.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1802156/96661ebc-a924-eb28-027a-52ea3bfff572.png)




#使用したもの#
・[Power Automate Desktop](https://flow.microsoft.com/ja-jp/desktop/  
https://qiita.com/maekawawawa/items/76cc0e7754fdcdf8bd7c)
・[Teams](https://www.microsoft.com/ja-jp/microsoft-teams/free)
・[Outlook](https://www.microsoft.com/ja-jp/microsoft-365/outlook/email-and-calendar-software-microsoft-outlook)


作成するうえで参考にさせていただいた記事

https://qiita.com/maekawawawa/items/76cc0e7754fdcdf8bd7c


#作成フロー#
重要ポイントは
「Outlook」から「Teamsのチャネル」に対して、メールを送信する部分です。
![スクリーンショット (450).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1802156/b6c04c2a-49e4-030e-53d9-4c41c563d984.png)
アカウント：自身のoutlookメールアドレス
宛先：Teamsのチャネルのアドレス

#考えていたこと#
新規案件の連絡が来る際には「依頼書（Excel）」も送付されてくるため、その依頼書内容を簡単に
案件管理表（Excel）にも転記して更新したファイルを一緒に投稿してみたかった。
細かい作業まで、指定して同じフローを繰り返せるため、その点を踏まえていきたいです。

ここまで読んでくださりありがとうございました。
Playgrounds コードを学ぼう2 エキスパートを初期化する、クリア！


仕事の忙しさにかまけて、自宅学習を怠っていました。
これでは、結果はついてきません。



久しぶりに、Playgroundsでswiftプログラミングの練習を実施。

以下、表題クリア時のソースです。

```swift:test.swift
var daiya = 3
var ii = 0


// 前進して、ボタンを押す処理
func zenshin(){
    // 正面ブロックでなければ、進む
    while !expert.isBlocked {
        expert.moveForward()
    }
    expert.turnLockUp()// 鍵を開ける
    expert.turnRight()// 右を向く
}

func an(){
    // 定義ダイヤの数と取得ダイヤの数がイコールでなければ実行
    while daiya != ii {
        //全方向行き止まりではないなら、実行
        if !expert.isBlocked && !expert.isBlockedLeft && !expert.isBlockedRight {
            // ジェムの上に来たら、、、ジェムを取得
            if expert.isOnGem {
                expert.collectGem()
                ii = ii + 1}
            expert.turnLeft()
            expert.moveForward()
        }
        //左が行き止まり、かつ正面が行き止まりでない
        if expert.isBlockedLeft && !expert.isBlocked {
            // ジェムの上に来たら、、、ジェムを取得
            if expert.isOnGem {
                expert.collectGem()
                ii = ii + 1}
            expert.moveForward()
            //右が行き止まり、かつ正面が行き止まりでない
        } else if expert.isBlockedRight && !expert.isBlocked {
            // ジェムの上に来たら、、、ジェムを取得
            if expert.isOnGem {
                expert.collectGem()
                ii = ii + 1}
            expert.turnLeft()
            expert.moveForward()
            //右が行き止まり、かつ正面も行き止まり
        } else if expert.isBlocked && expert.isBlockedRight {
            // ジェムの上に来たら、、、ジェムを取得
            if expert.isOnGem {
                expert.collectGem()
                ii = ii + 1}
            expert.turnLeft()
            expert.moveForward()
            //正面が行き止まりならば
        } else if expert.isBlocked {
            // ジェムの上に来たら、、、ジェムを取得
            if expert.isOnGem {
                expert.collectGem()
                ii = ii + 1}
            expert.turnRight()
            expert.moveForward()
            
        } else {
            
        }
        

    }
    
}
/*ここからが実行部分*/
zenshin()
an()




```
SQLって？　(プログラマー初心者による初心者のための)

かけだしプログラマーの浅い知識でゆるく軽くアウトプットしようと思います!

###SQLってなんだ？
SQLはデータベースと対話するための言語です。
つまりMY SQLなどを操作するためのものです。

###SQLでできること
ＤＢやテーブルのcreate  :作成
　　　　　　　　alter   :更新
　　　　　　　　drop    :削除

データのinsert  :追加
　　　　update  :更新
　　　　delete  :削除
　　　　select  :取得

####後書き
新しい知識が増えるごとにこのページを更新していきたいなと考えています。
間違っている点などあれば教えていただければと思います。
Amazon GuardDutyを各リージョンで一括 有効/停止/削除

# 一括有効化
```sh
for REGION in `aws ec2 describe-regions | jq -r ".Regions[] | .RegionName"`; do
  aws --region ${REGION} guardduty create-detector --enable
done
```

# 一括停止
```sh
for REGION in `aws ec2 describe-regions | jq -r ".Regions[] | .RegionName"`; do
  DETECTOR=`aws --region ${REGION} guardduty list-detectors | jq -r ".DetectorIds | .[]"`
  aws --region ${REGION} guardduty update-detector --detector-id ${DETECTOR} --no-enable
done
```

# 一括削除
```sh
for REGION in `aws ec2 describe-regions | jq -r ".Regions[] | .RegionName"`; do
  DETECTOR=`aws --region ${REGION} guardduty list-detectors | jq -r ".DetectorIds | .[]"`
  aws --region ${REGION} guardduty delete-detector --detector-id ${DETECTOR}
done
```