OmniAICreator/Qiita-1.07M huggingface dataset:
ISE keywords

ISE Specific Keywords:
-
***Identity Service Engine*** or **ISE**. It's radius, TACACS, centralized visibility and control +more for large enterprise networks(10,000以上). It is composed of 4 nodes; PAN, PSN, MnT & PXG. Put these 4 together and you have an ISE Cube. 

***Administration Persona***(Node = Administration Node or **PAN**): The control center where you do all you administration stuff on ISE like creating polices, configurations, certificates, and pushing out dACL, configurations and more.

***Policy Service Persona***(Node = Policy Service Node or **PSN**): Decision maker based on what you configured in the PAN. It evaluates and decides. There can be a large number of PSNs in a deployment. The PSNs can be kept in synch by  sharing a "heartbeat" in within their group. 


***Monitoring Persona***(Node = Monitoring Node or **MnT**): Collects and correlates logs and reports. It can create reports and alerts. 

***pxGrid Persona***(pxGrid Node or **PXG**): It makes pxGrid services possible with ISE. It's role is to share "contextual-based information" using it's framework to exchange data such as threat information between both Cisco and third-parties vendors.

***ISE Profiler***:
In ISE platform this component responsible for the detection and classification of the asset.

***Native Supplicant Provisioning***(**NSP**):
Also TrustSec keyword with onboarding & provisioning. Assign different policies, connection details like type of EAP & SSID to use according to the OS.

Other General Keywords:
-
・***Identity***: A representation of who you are.
・***Credential***: Evidence to prove identity
・***Identity Store***: A database of user or endpoint credentials. A single Identity Store is called a "***Identity Source***"

***Internal Identity Stores***:
This can be a limited account for special purpose like configuring a network device. After creating the Network Access User, you can then associate it with a User Identity Group.

***External Identity Stores***:
ISE supports many external Identity Sources including LDAP, AD(majority of cases), Radius token servers, RSA SecureID, OTP, and SAML.

***Profiling***:
Classification by collecting and analyzing attributes about user or device in order to determine with predefined level of certainty the true identity of asset.

***Posturing***:
Easy to confuse with profiling, but different. 
Posturing happens after the profile is confirmed, and ISE is checking details of the asset such as if it has the correct certificates, applications, version #/patches installed.
latex環境構築の備忘録 ATOM, WINDOWS

#Atom setup
## install Packages 
latex:  for comple
language-latex:  syntax hilight
latexer: complement
pdf-view: pdf viewer

## additional Packages
atom-file-icons

## need software 
Strawberryperl is need to comple on latexmk of atom.
https://strawberryperl.com/

## setting
"uplatex" is set to engine.
Tex Path of latex package is as bellow;
C:\texlive\2021\bin\win32

## how to use
clean: crtl alt c
build: ctrl alt b



#Install Latex for Japanese
TexLive

https://texwiki.texjp.org/?TeX%20Live

you get network-installer.

# Apendix
##Recomended Packeages and Themes
- activate-power-mode
 : It fassinates your coding work by dynamic animation.

##Theme
- Morokai
時期が時期なのでハロウィーン仕様の404ページを作ってみた

期間限定だが、404ページをハロウィーン仕様にしてみました。
ページを読み込んだら、1秒かけてカボチャの口が開いて、メッセージ「404 File not found.」が表示されるというアニメーションです。

右上の「EDIT ON CODEPEN」のロゴをクリックすると、記事に埋め込まれているコードが画面いっぱいに表示されるページに遷移します。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="WNExqgW" data-user="lvn_HO" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/lvn_HO/pen/WNExqgW">
  Untitled</a> by haruyosih (<a href="https://codepen.io/lvn_HO">@lvn_HO</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

口が開くカボチャのパーツを上顎 `div id="upper"  `、下顎 `div id="lower"  `、頬  `div id="cheek"  `の3つのパーツに分け、この3つのパーツを包含するブロックを  `div id="pumpkin"  `としました。さらにこの中にメッセージ用テキストも内包しています。

```html
<div id="pumpkin">
<div id="upper"></div>
<div id="lower"></div>
<div id="cheek"></div>
<div id="message"><span>404</span>File not found.</div>
</div> 
```

① cssでのレイアウトは `div id="pumpkin"  `を基準（ `position:relative;  `）として、「上顎」「頬」「下顎」を絶対配置 `position:absolute; `で配置します。

②はじめは上顎は閉まっている状態です。上顎の高さは294pxで、口が開いた状態にするにはtop: -294px;（要素の高さ分だけ上にあげる）、口を閉じた状態の時には100px下に配置したいのでtop: -194px;とします。この状態で始まり、1秒かけて上に100px移動させるのでアニメーションのcssは以下のようにします。

```css
@keyframes upper {
    0% { 
		top: -194px;
    }
    100% {
		top: -294px;
    }
  }
```

③下顎は `div id="lower" ` はheight: 112pxで、
ページ読み込み後、1秒かかて112px下に移動させるのでアニメーションのcssは以下のようにします。

```css
@keyframes lower {
    0% { 
		bottom: 0px;
    }
    100% {
		bottom: -112px;
    }
  }
```

④頬 `div id="cheek" ` は初めは見えない状態にしておきたいので初期値は  `height: 0  `　、で1秒かけて200pxの高さに変型させます。
その際、基準点が左上になり、上から下に  `200px  `伸びる動きになります。真ん中がから上と下に  `100px  `ずつ広がってほしいので  `position:100px  `（上下真中の位置）として、このブロックの高さ（200px）の半分（100px）の高さにしておきます。
アニメーションのcssは以下のようにします。

```css
@keyframes cheek {
    0% { 
		height:0px;
		opacity: 1;
		top: 100px;
    }
    100% {
		height:200px;
		opacity: 1;
		top: 0;
    }
 }
```

⑤404メッセージもブラーをつけてフェードインで表示されるアニメーションにしました。
HTMLは

```html
<div id="message"><span>404</span>File not found.</div></div>
```
cssで ` blurFadeIn ` というアニメーションネームをつけて、ページを読み込んでから3秒後に3秒かけて文字をフェードインさせます。

```css
#message {
　animation: blurFadeIn 3s ease 3s 1 forwards;
　opacity: 0;
}

@-webkit-keyframes blurFadeIn{
	0%{
		opacity: 0;
		text-shadow: 0px 0px 40px #fff;
		transform: scale(1.3);
	}
	50%{
		opacity: 0.5;
		text-shadow: 0px 0px 10px #fff;
		transform: scale(1.1);
	}
	100%{
		opacity: 1;
		text-shadow: 0px 0px 1px #fff;
		transform: scale(1);
	}
}

```

こうするとページ読み込み後、上下の顎が開いて口の中 `div id="cheek" ` が見えて、更にテキストアニメーションで404メッセージが表示されます。
【mt4/mql4】利益ありポジション全決済処理


# はじめに
<!-- 発端や概要を記載 -->
システムトレードプログラマのmt4/mql4のメモノートです。
初心者向けの簡単なトピックから公開していきます。
.noteでEAそのものも公開していますので良ければそちらも見てください。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [処理内容](#処理内容)
1. [mql4ソースコード](#mql4ソースコード)

<!-- 各チャプター -->
<a id="#処理内容"></a>
# 処理内容
自身のポジションのうち、利益の出ているポジションだけ決裁オーダーを出す関数です。
損失のあるポジションはそのままです。
スプレッド開いていてもポジション決裁を優先したいので、直前ask bidの差をスリッページに設定します。


使いどころとしては
・定期的にポジションの利確を行いたいとか

・ポジション確保したまま週末を跨ぎたくない。ので、ポジション数を減らすとか

・FOMCが迫っているのでリスク回避のためにポジション数を減らすとか

・証拠金率が下がってきたので、リスク低減のために利益のあるポジションを決裁するとか

・とある条件に合致したら、とにかく残高を増やしたいとか


ですかね。
なので基本的には使いたい条件式とセットで使う関数となります。
また、取引会社の状況によりますが、連続して決裁オーダーを出すので約定しきらない可能性があります。
なので念のためsleepを入れたあとに再度本関数を使うのも手だと思います。
なお、急な値変動やスプレッドの変化の際には、わずかな時差で必ずしも利益確定とならないポジション解消もあり得ます。
<a id="#mql4ソースコード"></a>
# mql4ソースコード

こちらが関数側のソースです。呼び出し側の前に記述されている必要があります。
基本的には使いたい条件式とセットで使う関数となります。
なお、オーダーキャンセルも取引会社（FX会社側）での受理が必要ですので他の注文と合わせて使う際にはsleepなどで少しだけでも合間時間を確保しておくと、リクエスト拒否されにくいです。

```c++:test.mq4
//+------------------------------------------------------------------+
#include <stdlib.mqh>
double Priceaskbid[2];
int    Slippage;

//+------------------------------------------------------------------+
//| スリッページにスプレッドを格納して差があるか判定
//|  code by KOUSHIROU
//|  https://note.com/mt4_coder
//+------------------------------------------------------------------+
bool GetMarketInfo() 
{
 RefreshRates();
 Priceaskbid[0]=MarketInfo(OrderSymbol(),MODE_ASK);
 Priceaskbid[1]=MarketInfo(OrderSymbol(),MODE_BID);
 double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
 if(dPoint==0) return(false);
 Slippage=(Priceaskbid[0]-Priceaskbid[1])/dPoint;
 return(Priceaskbid[0]>0.0 && Priceaskbid[1]>0.0);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 利益有ポジションの全クローズ    ALLprofitClose
//| （スプレッド開いててもクローズ優先）
//|  code by KOUSHIROU
//|  https://note.com/mt4_coder
//+------------------------------------------------------------------+

void ALLprofitClose() 
{
 int iOrders=OrdersTotal()-1;
 int i;
   for(i=iOrders; i>=0; i--) 
   {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderProfit() >= 0))
      {
       if((OrderType()<=OP_SELL) && GetMarketInfo()) 
       {
         if(!OrderClose(OrderTicket(),OrderLots(),Priceaskbid[1-OrderType()],Slippage))
         {
         Print("Close order Error");
         }
       }
     }
   }
}
//+------------------------------------------------------------------+
```


こちらは呼び出し側の例
呼び出したいタイミングに合わせてOnTick()、OnInit()とかOnTimer()の中で記述してみてください。何らかの条件（if文とかで特定時間になったらとか）内に記述するのが一般的でしょう。

```c++:test.mq4
ALLprofitClose();
```


皆様の手助けになりますように。
間違いなどあればご指摘いただけると助かります。
以上です
Rails はじめました [1. 環境構築]

# 要件
- ruby 2.7.4
- Rails 6.1.4
- redis latest
- PostgreSQL 12.2
- nginx 1.20

# 開発環境
- macOS Big Sur
- VSCode
- Docker Desktop

## VSCode プラグイン
- [Ruby](https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby)
- [Rails](https://marketplace.visualstudio.com/items?itemName=bung87.rails)
- [Ruby on Rails](https://marketplace.visualstudio.com/items?itemName=hridoy.rails-snippets)
- [Rails DB Schema](https://marketplace.visualstudio.com/items?itemName=aki77.rails-db-schema)

# Docker 環境
- 以下リポジトリに完成した docker-compose.yml 等を格納
    - [soso555BoBs/env-rails](https://github.com/soso555BoBs/env-rails)

## コンテナの構成
- app
    - rails 6.1.4 が稼働する
    - ポート番号 3000 で listen
- web
    - nginx 1.20 が稼働する
    - ポート番号 80 で listen
    - 受け取ったリクエストを app コンテナに渡す
- pgsql
    - PostgreSQL 12.2 が稼働する
    - ポート番号 5432 で listen
- rredis
    - redis が稼働する
    - ポート番号 6379 で listen
- rmail
    - mailhog が稼働する
    - ポート番号 1025 でメールを listen
    - ポート番号 8025 で HTTP リクエストを listen

## 使い方
- 前提として、make コマンドを実行できるようにしておくこと
    - 不可能な場合は、Makefile 内の各コマンドをコピペして実行すれば OK
- 初回 (Rails プロジェクトを作成する)

    ```
    $ git clone git@github.com:soso555BoBs/env-rails.git
    $ cd env-rails
    $ make create-project # Install Rails project
    ```

    - 上記実行後 http://localhost:3000/ で動作確認
    - 以下の手順を全て行うので時間がかかります
        1. rails インストール
        2. build docker image
        3. docker container up
        4. bundle install
        5. webpacker install
        6. rake db:create
        7. container restart

- 初回 (既存プロジェクトをインポートする)

    ```
    $ git clone git@github.com:soso555BoBs/env-rails.git
    $ cd env-rails
    $ git clone git@github.com:hogehoge/rails.git ./backend # Clone any project to the backend directory
    $ make init
    $ make up
    ```

- 2 回目以降

    ```
    $ make up
    ```

- コンテナ終了

    ```
    $ make down
    ```

# 詰まった点
- ```bundle install``` した gem がコンテナを立ち上げる度に無くなる
    - gem がインストールされたディレクトリを永続化していないため
        - 永続化するために docker-compose.yml に以下記述を追加

            ```
            volumes:
              bundle-store:
             :
             :
            services:
              app:
                volumes:
                  - type: volume
                    source: bundle-store
                    target: /usr/local/bundle
                      nocopy: true
            ```

            - ```nocopy: true``` のせいで、永続化しても更新されないため ```nocopy: true``` を削除
            - ```docker-compose run``` と build と up のタイミングに依り volume の内容に不整合が発生。以下記事により解決しました。

https://qiita.com/hokita222/items/49f4ca54835e08fdd6b2

- ```rails server``` 実行時に ```Webpacker configuration file not found``` エラーが発生する
    - bundle install の後に webpacker install を実行することで対応

# 所感
- 実は「コンテナの構成」には嘘が書かれている。実装できていないので追々実装する。
- volume の永続化の解決にものすごく苦労した。
    - きちんとオプションや記述形式を把握しない限りはコピペなんてするもんじゃない。
    - おかげで volume 周りの挙動について勉強になった
- ひとまずこの環境を用いて転職活動アプリを作っていこうと思います。
大量のPowerPointファイルをPNG画像に変換するときに使ったVBScript


Windows 7で動作確認しました。（なぜ今でもWin7なのかは聞かないでください）

```visualbasic
Option Explicit
' 使い方
' 本VBScriptファイルを「D:¥」に保存する。（他のフォルダでも動作は可能）
' PPTX保存用フォルダとして「D:¥png」を作成する。
' PPTX ファイルを「D:¥pptx」に置く
' 画像保存用フォルダとして「D:¥png」を作成する。
' 本VBScriptファイルをダブルクリックする

' File System Object
Dim objFso 
Set objFso = CreateObject("Scripting.FileSystemObject")
' Wsh Shell
Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")
' PowerPoint App
Dim objPptApp
Set objPptApp = WScript.CreateObject("PowerPoint.Application")
' PowerPoint Slide
Dim oSlide
' PPT
Dim objPptDoc

Dim strPath
Dim outPath 
Dim imgName

strPath = "D:¥pptx"
outPath = "D:¥png¥"

' WScript.Echo strPath
Dim obj 'As Object

For Each obj In objFso.getfolder(strPath).Files
	If Right(obj.Name,5) <> ".pptx" Then
		
	Else
		Set objPptDoc = objPptApp.Presentations.Open(strPath & "¥" & obj.Name)
		For Each oSlide In objPptApp.ActivePresentation.Slides
			imgName = outPath & objFso.getbasename(obj.Path) & oSlide.SlideIndex & ".png"
			oSlide.Export imgName, "png"
		Next
		objPptDoc.Close
		Set objPptDoc = Nothing
	End If
Next

objPptApp.Quit

Set objFso = Nothing

WScript.Echo "Finished"

```
スクリプトファイル内の任意の関数を呼び出す方法

<h1>概要</h1>
数多くの関数が入ったスクリプトファイルにおいて
**スクリプトファイルを編集せず**に特定の関数を呼び出す方法

<h2>スクリプトファイルの関数</h2>
例　以下の内容のA.shというスクリプトファイルがあるとすると

```A.sh
funcA(){
   echo "funcAを呼び出しました"
}

funcB(){
   echo "funcBを呼び出しました"
}
```

ターミナル等で以下のコードで実行すると、関数は定義されただけなので何も起こりません

```Terminal
$bash A.sh　
```

実行したい関数名を改めてスクリプトファイル内に書く必要があります

```A.sh
funcA(){
   echo "funcAを呼び出しました"
}

funcB(){
   echo "funcBを呼び出しました"
}
funcA
funcB
```

このように編集すると２つの関数が呼び出され、二文が表示されます

<h2>スクリプトファイルを書き換えるのが面倒！</h2>
これで関数は扱えるようになりましたが、毎回実行したい関数を書き換えるのは面倒です
それを解決するのが今回の方法です

<h1>対処法</h1>
スクリプトファイルに引数を取らせて、その値に応じて呼び出す関数を変える処理を追加することです

```A.sh
funcA(){
   echo "funcAを呼び出しました"
}

funcB(){
   echo "funcBを呼び出しました"
}

##新しく追加する処理↓
#$1とは１つ目の引数という意味です
if [ $1 = "a" ]
then
    funcA
elif [ $1 = "b" ]
then
    funcB
else
    echo "関数は呼び出されませんでした"
fi
```
新しいA.shにおいて、関数を呼び出したい場合に実行するコードは

```Bash
$bash A.sh a
funcAを呼び出しました

$bash A.sh b
funcBを呼び出しました
```
このようになります
<h1>まとめ</h1>

数多くの関数が入ったスクリプトファイルにおいて
**スクリプトファイルを編集せず**に特定の関数を呼び出すには、、、

**スクリプトファイルに引数を取らせて、その値に応じて呼び出す関数を変える処理を追加**
AZ-900:Azure Fundamentalsに2回目で合格した話

こんにちは、GxPの富岡です。
今回はMicrosoft Certified: Azure Fundamentals（AZ-900）を2度の受験を経て取得することができたので、どのように対策して取得することができたのか話します。

# 私の知識レベル
まず、私の知識レベルですが、クラウドに関しては知識がほぼない状態からスタートしました。

- 情報系の大学卒
- 新卒3年目
- インフラ系が弱点
- クラウド初学者

# 受験動機
弊社では様々な勉強会が開催されています。
その中のAzure勉強会に参加しており、「何か成果を出したい」というのが受験動機です。
Azure勉強会自体は、Microsoftが提供しているハンズオン形式の学習サービス「Microsoft Learn」を使って輪読やサンドボックスで演習をするという内容でした。


# AZ-900について
AZ-900とは、Microsoft Certified: Azure Fundamentals（AZ-900）のことで、Microsoftの認定資格です。
Fundamentalsという名前の通り、Azureの基礎知識が問われる資格となっています。Azureに関わるなら持っておきたい資格ですね。

> クラウド サービスの基礎知識と、それらのサービスが Microsoft Azure でどのように提供されるかを理解している必要があります。この試験は、クラウドベースのソリューションやサービスを使い始めたばかりの方や、Azure の初心者の方を対象としています。

https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-900

# 1回目の勉強
Microsoft Learnは日本語訳が不自然な部分もあり、また体系だって学習したかったので「**徹底攻略 Microsoft Azure Fundamentals教科書［AZ-900］対応**」という参考書を読みました。
Microsoft LearnはAzure勉強会で一読していたので読み直しはしませんでした。（これが失策）

https://book.impress.co.jp/books/1119101171

# 1回目の結果と2回目に向けて
正直、余裕だろうと思っていたのですが結果は665点で落ちました。（1000点満点の700点合格です。）
スコアレポートとしてセクションごとの理解度が出るので理解度が低いセクション（自分の場合はクラウドの概念とセキュリティ）を中心に、勉強しなおしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2161631/b75651bd-067a-8400-50be-d23db0a49a21.png)
具体的には、Microsoft Learnの再読とudemyの模擬問題集の受講をしました。
読み直すと、1回目で出題された問題に繋がるセクションがあり、また公式なので試験と同じ言い回しだったのでやはり読んでおくべきだったと感じました。Azureのサービス名はしばしば変更されていて、Microsoft Learnはそれに対応できていませんでしたが、参考書では対応されていました。
udemyの模擬問題集は7回分あり、少し難しい回も用意されていました。解説もしっかりされていたので解説でも勉強することができました。
https://www.udemy.com/course/az-900-microsoft-azure-fundamentals4176/

# 2回目の結果
816点で合格することができました！
セキュリティは下がってしまっていますが、全体的に理解度を向上させることができ、特にクラウドの概念は60%から100%に持っていくことができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2161631/0e0cc42d-a506-b899-2bc0-112631644618.png)
余談ですがudemyの模擬問題集で出た問題と同じ問題が出題され、「あ、これudemyでやったところだ！」となったのでudemyの模擬問題集はやってよかったです。

# まとめ
まとめです。
AZ-900の対策としては、Microsoft learn（ラーニングパス）は必読、体系だった学習・Microsoft Learnを補うために参考書、演習的にudemyの模擬問題集、まですれば合格できるレベルまで持っていけると思います。（知識がある方はMicrosoft Learnだけでも合格できそうです。）
クラウドの基礎知識を問う資格でありAzure以外のクラウドサービスにも当てはまるため、クラウドについて知りたい方におすすめです。後述のとおり無料で受験する方法もあるので気軽に受験できます！


# おまけ
AZ-900の受験費用は12,500円と高めです。しかし、MicrosoftではAZ-900に必要な知識を学習できる無料のウェビナーを実施しており、受講を完了するとAZ-900の受験費用が無料になる特典が付いてきます。AZ-900の受験に興味がある方は、受講することをお勧めします。私はこれで受験しました。なお1回の受験のみという訳ではなく2回目でも使えたので恐らく有効期限中は何度でも使えるのだと思います。

イベント名「Microsoft Azure Virtual Training Day: Fundamentals」
https://www.microsoft.com/ja-jp/events/top/training-days.aspx?activetab=a1%3aprimaryr3
※ウェビナーを申し込んだメールアドレスに特典が付与されるので受験に使うアカウントのメールアドレスで申し込んでください。
AWS CLIからAWS Configルールの一括削除する

# 背景

画面からだと１つずつしか削除できずめんどくさかったから

AWS OrganizationのマスターアカウントからAWS Configを適応されている場合は「OrgConfigRule-ABCDEFG」みたいなルールがあったり、SecurityHubが作成したルール（「securityhub-access-keys-rotated-xxxxx」みたいな名前）があるがそれらは削除できずエラーになるので特に問題はない（本当は分岐したりするべきだけど時間がなかったので省略）


# 各種バージョン

```
$ aws --version
aws-cli/2.1.30 Python/3.8.8 Darwin/20.6.0 exe/x86_64 prompt/off
```

# スクリプト

```bash
#!/bin/bash

PROFILE="profile-1234"

RULES=$(aws configservice describe-config-rules \
    --query 'ConfigRules[].ConfigRuleName' \
    --profile ${PROFILE} --output text)

echo ""
for RULE in ${RULES}
do

    # 削除できなければExceptionに入るのでエラーは捨てる
    POLICY=$(aws configservice delete-config-rule \
        --config-rule-name ${RULE} \
        --profile ${PROFILE} 2> /dev/null)
    if [ $? -gt 0 ]; then
        echo "cannot be deleted ${RULE}"
    else
        echo "remove complete ${RULE}"
    fi
done
```

# 出力結果
```
cannot be deleted aws-config-rule01
remove complete aws-config-rule02
remove complete aws-config-rule03
:
:
```
MySQLのINSERTで合ってるはずなのに構文エラー1064が出て嫌になったとき

MySQLには結構な数の予約語があります

https://dev.mysql.com/doc/refman/5.6/ja/reserved-words.html

カラム名に予約語を使用したテーブルにINSERTするとエラーを吐きます

```
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version
for the right syntax to use near ほにゃらら〜 at line 1
```


もし説明文を格納するカラム名に`desc`等を使用している場合、バッククォート「`」で囲んであげる必要があります

```
INSERT INTO item(name, `desc`) VALUE ('ホゲホゲ', 'これはフガフガです');
```
【便利】gitのコマンド入力を楽にするエイリアス

gitコマンドは、エイリアスを設定していると、非常に打つのが楽になります。

今回はその設定方法を紹介します。

###1. エイリアスをglobalで設定する

```
 $ git config —-global alias."設定したい文字" "gitのコマンド"
```
####またはvimで~/.gitconfigを開き、設定

```
$ vi ~/.gitconfig
```

###2. 設定例
```
例)checkoutを "co"としてエイリアスに設定

$ git config --global alias.co checkout //git coと打つと、git checkout を実行してくれるエイリアス
```

###3. 設定したエイリアスの確認方法
```
$ git config --list 
```

###4. 筆者が実際に設定しているエイリアス一覧
```
alias.co=checkout
alias.br=branch
alias.cm=commit -m
alias.st=status
alias.fe=fetch
alias.me=merge
alias.sta=stash
alias.stp=stash pop
alias.puf=push --force-with-lease origin main
alias.ad=add
alias.di=diff
alias.l=log
alias.lp=log -p
alias.reh=reset --hard
```

###最後に

削除系のコマンドは打ち間違えが怖いので、設定していません。

git以外のエイリアスも作っておくと面白そうなので、今度やってみます。
uintをbytesに変換する（余計な0を消す)

solidity >=0.4.22 <0.9.0;

自分用
Githubに載せるまでもない話(かつハードコードされてるので微妙ですが、一応)

冒頭部分はabi.encodePackedと同等
これだけだと、32byte分、0埋めされているので、0を消したい場合に使う。


```solidity:uint2bytes.sol
    function uint2bytes(uint value) public returns(bytes memory ){
        bytes memory result = new bytes(32);
        assembly {
           mstore(add(result, 32), value)
        }

        uint len = 0;
        if (value < 256) {
            len = 1;
        }else if (value < 65535) {
            len = 2;
        } else {
            //some code
        }

        return slice(result, 32 - len ,len);
    }
```

sliceは下記ライブラリつかってますが、普通にresult[32 - len : len]でもいいかも（未確認
https://github.com/GNSPS/solidity-bytes-utils/

参考
https://ethereum.stackexchange.com/questions/4170/how-to-convert-a-uint-to-bytes-in-solidity/4177
gitignoreの書き方

#gitignoreとは
***gitignore***は、Gitで使われる特殊なファイル。***gitignore***に書かれたファイルは、Git管理の対象から除外することができる。
これは隠しファイル「***.gitignore***」であり、設定したいディレクトリに置く。

# gitignoreの書き方
まずは、Git管理から除外するファイルを設定したいディレクトリに「***.gitignore***」ファイルを作成する。
次に、以下の書き方を使って除外対象のファイルを指定する。

####■ ファイル名・ディレクトリ名を直接指定する
同名のファイルとディレクトリをすべて除外する場合

```
# 指定ファイルを除外する
sample.txt

# 指定ディレクトリを除外する
sample/
```
一方で、ファイルやディレクトリ名の最初に「```/```」を付けると***.gitignore***と同じ階層の相対パスで指定されたものが除外される。

####■ ワイルドカードを使った指定
ワイルドカード「```*```」を使うことで、特定の拡張子などを指定することができる。

```
#　拡張子が「.txt」のファイルをすべて除外する。
*.txt
```

#### ■　除外しないファイルを指定
除外しないファイルやディレクトリを否定「```!```」を使って指定する。
特定のファイルやディレクトリだけを管理したいときに便利。

```
#　sample.txtを除外しない。
!/sample.txt
```

#まとめ
自分の場合は「.js」ファイルのみ管理対象にしたいため、以下と記述した。

```
*
!*.js
```


#####参考
[https://www.sejuku.net/blog/72389](https://www.sejuku.net/blog/72389)
MySQLのインストールについて

# 1. MySQLの公式ホームページに接続
① ブラウザで公式サイト(http//www.mysql.com/jp/) にアクセスし、「ダウンロード」をクリックする。
② ダウンロード画面の「MySQL Community(GPI) Downloads >>」をクリックする 
③ ログイン/サインアップなしでダウンロード開始

# 2. MySQLをインストールする
① インストーラを実行する
② インストールタイプを「Developer Defaulf」に選択し、「Next>」をクリックする。
③ 必要なものをインストールする。
　※PCの状態によって必要なものが異なる。「Execute」をクリックして必要なものをインストールする。

# 3. MySQLを使うために設定する
① ProductConfiguration画面が表示されたら、「Next>」をクリックします。
② MySQL InnoDB Cluster 利用確認
③ Type and Networking 設定を行う
④ Authenticatoin Method設定を行う
⑤ 管理者のパスワードを設定する
⑥ Windows Service設定を行う
⑦ Apply Configuration画面を行う
⑧ 他の製品の設定を行う。
⑨ MySQL Routerの設定を行う
Pythonのタプルについてまとめてみた

### 今回のお題
今回は、Pythonのタプルという概念について取り上げます。

私が経験している他の言語ではあまり馴染みがなかったので筆を取ったというのが本音で基本的には自分用のメモですが、私と同じように他言語から流れてきたPython初学者の方の参考になれば幸いです。
### 目次
- タプルの概要
- 色々なタプル
- タプルでできないこと・できること
- タプルとリストの使い分け

### タプルの概要
タプルは何かを一言で説明すると、「後から要素を変更できないリスト」になります。

listやintなどと同じく、tupleというクラスも存在します。

タプルには配列とは異なり要素を()で区切るという特徴がありますが、逆に言えば他の操作はリストと同じように行えます。

```python
# タプルの生成
tuple1 = ('a', 'b', 'c')

# 要素の取り出し
print(tuple1[0])

# for文
for str in tuple1:
  print(str)
```
### 色々なタプル
色々な、というわかりにくいタイトルですが、要素の数などによって若干表記が変わるということの解説です。

```python
# 通常の表記
tuple1 = ("a", "b", "c")

# 空のタプル
empty_tuple = ()

# 空でないタプルに関しては、、カッコは省略可能
tuple2 = "d", "e"

# 要素が一つの場合にも、末尾に,が必要
tuple3 = "f",
```
要素が一つの場合に最後の,を省略すると、()の有無に関わらずタプル以外の型(上記であればstr）として解釈されるので注意してください。
### タプルではできないこと・できること
冒頭でも説明した通り、タプルでは要素の変更ができません。
また、要素の追加もできません。

```python
tuple = "a", "b", "C"
tuple[0] = "d" # これはできない

tuple1.append("d") # これもできない
```
逆に、タプル同士の結合は可能です。

```python
tuple1 = 1, 2, 3
tuple2 = 4, 5
tuple3 = tuple1 + tuple2
print(tuple3) # 結果：(1, 2, 3, 4, 5)
```
また、ややこしいのですが

- ある変数xにタプルが代入されている場合に、その変数に別の値を代入することは可能。
- あるタプルがリストや辞書を配列として持つ場合に、そのリストや辞書に操作を加えることも可能。
- タプルが変数xを要素として持つ場合に、xの値を更新してもタプルの要素には影響しない。

```python
list = [1, 2]
dict = {"name" "jiro"}
x = 10
tuple = x, list, dict

tuple = (3, 4, 5) # これは変数の更新なので可能

tuple[0][0] = "a" # これはlistの操作なのでOK
tuple[0].append(3) # これもOK

tuple[1]["name"] = "saburo" # これはdictの操作なのでOK
tuple[1]["age"] = 30 # これもOK

x = 20 # これをしてもtupleの要素には影響はない
print(tuple[0]) # 結果：10
```
この辺りは注意点としてあげておきます。
### タプルとリストの使い分け
基本的に上記が守られている限りはタプルとリストのどちらを使っても問題はありません。

ただ、公式ドキュメントによると、「同じ型のものを集める場合にはリスト、違う型のもの同士を集める場合にはタプル」という慣習もあるようです。

例えば、生徒全員の名前を集めるのであればリスト、生徒1人の氏名・クラス・住所を管理するのであればタプルといった感じですね。

### 終わりに
以上、pythonのタプルについてまとめてみました。

もちろん、タプルにするぐらいであれば辞書のほうが便利なケースも多いので極論を言ってしまえばタプルを全く使わなくてもプログラムを書くことは可能かもしれません。

ただ、djangoではデフォルトの記述の中に一部タプルが用いられていることもあり、理解しておいて損はない概念なのかなと思います。
MacPC１台で画面共有時にGoogleスライドのプレゼンター表示を使用する方法

# **概要** 
Windowsのモニター設定を拡張にし、HDMI等でプロジェクターに接続してPowerPointで発表者ツールを表示すると、発表者側は以下のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281354/42b82d3c-79c6-a81d-2a48-a7ba7f13c2b5.png)
プロジェクターに映っている画面はスライドの画面のみになっていて話す内容や次のスライドを確認しながら発表することができるおなじみの便利機能ですが、MacでZoomの画面共有をしたときに同じような見せ方にする方法が今まで分からなかったので今回色々試してみて１つの方法にたどり着きました。

# **要件** 
- MacPC1台のみでできること
- GoogleスライドをZoomで画面共有したときにできること
- 発表者側の画面のみプレゼンター表示されていること
- 画面操作はスライドのページ送り以外不要であること
- １つの画面内でできること

# **Googleスライドのプレゼンター表示の仕様** 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281354/3bc8a8cf-0b63-14cb-4e21-bd7ffd99e823.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281354/e6de2db1-a259-5adc-deb4-aa246f579d88.png)
Googleスライドでは、プレゼンター表示をすると上記のように別タブで開かれます。
そのため、モニターがもう１台あればウインドウを分けて **スライド画面のみ画面共有** して別モニターの方にプレゼンター表示を映しておくことでそれを見ながら発表することは可能かと思います。
ただ、会議室や実際に登壇して発表する場合にいちいちモニターを持ってきて発表する人はさすがにいないと思うので
>  **MacPC1台のみでできること** 

こちらに反していることになります。

しかし、ウインドウが分かれていたとしてもプレゼンター表示側でページを送れば、裏でちゃんとページが切り替わってくれていました。これは使えそうな気がします。

# **Zoomの画面共有の仕様** 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281354/548e5d37-5bd1-98da-73af-38e2c406fa33.png)
Zoomで任意のディスプレイを画面共有した後、別のディスプレイに切り替えると「一時停止しました」と出てディスプレイが切り替わりますが、視聴側から見るともともと共有されていた画面が映っています。
そこで共有していたディスプレイに戻ると最新の画面が反映される形で再度共有が行われます。

つまり、
共有 → プレゼンター表示に切り替えて発表 → 次へを押してから共有画面に一度戻り、反映されたら再度プレゼンター表示に切り替えて発表　・・・
という流れにすれば実質プレゼンター表示しながら発表ができます！！

しかし、この操作には１つ問題があります。
このディスプレイを切り替えて一時停止させる動作、運なのか回線なのか原因は分かりませんがたまに画面が欠けたりしてバグった表示になります。
それは避けたいので今回、

>  **画面操作はスライドのページ送り以外不要であること
１つの画面内でできること** 

この２つのレギュレーションを設けました。

# **最終手段** 
MacにはSplit Viewと呼ばれる標準の画面分割機能があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281354/c98369fc-ee86-b4d7-02dc-bd2b83a37d5c.png)
始めは画面共有はディスプレイごとに行われるものだから無理と思ってましたが、

> ウインドウを分けて **スライド画面のみ画面共有** して別モニターの方にプレゼンター表示を映しておくこと

これができるということを思い出して、ディスプレイ分割した状態でスライド画面のみ画面共有することができないか検証してみたところ、なんとできました。
また、Zoomの画面共有の仕様でもあったとおり、別ウインドウでもプレゼンター表示側からページを切り替えたらページはちゃんと変わってくれました。

これで、視聴側はスライド画面のみ見えて、発表者側はスピーカーノートが見れる擬似的なプレゼンター表示ができました。

# **最後に** 
HDMI一本つなげるだけでできていた発表者ツールがリモート環境下でやり方が分からなくなって、カンペが必要なレベルの発表のときはPCは全画面を共有しつつスマホにカンペをメモしておき、パソコンに並べて置いて見ながら発表するというなんともアナログなやり方をこれまでしていましたが、このやり方で解決するのでよかったです！
もしこれから発表する機会がある方、ぜひ参考にしてみてください！
（他に良い方法を知っている方いましたら教えて欲しいです！
セグメントをマイクロセグメンテーション化する【例題】

## 問題
10.20.12.0/24というセグメントにおいてマイクロセグメンテーション化した。
下記のIPアドレスについて正しいか間違っているか答えよ

A:10.20.12.10/28
B:10.20.12.16/28
C:10.20.12.31/28
D:10.20.12.41/28

①AとBは同一のネットワーク
②BとCは同一のネットワーク
③CとDは同一のネットワーク

## 回答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1603537/f2635d41-5527-43c6-9540-0009ac490fa2.png)

ネットワークを色分けすると上記のようになる。
つまり①は×、②は◯、③は×となる
ReactNativeでアプリ内のWebViewを表示する時に、ヘッダータイトルを動的に変更する方法

## アプリ内でWebViewを表示する時、WebView内で画面遷移してもも動的にヘッダータイトルを変更したい
![header.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/16155b06-d233-25c0-652c-03f28920b75d.png)

アプリを実装していく中で、ほぼ間違いなくStackNavigationを使って画面遷移の制御をすると思います。
アプリで表示するところは画面ごとにタイトルを決めれますが、webViewは一つタイトルを決めて、そこからwebView内で画面遷移しても同じタイトルが使われてしまいます。
webViewを使うときはタイトルを表示しないという選択肢もありますが、タイトルを動的に変更する方法を見つけたので共有します。

## ライブラリをインストール
`react-native-webview`
`cd ios && pod install`

## 実装
WebViewの`onNavigationStateChange`というメソッドを使ってWebViewのタイトルタグを取得します。

```javascript
import React from 'react';
import {WebView} from 'react-native-webview';
import { SafeAreaView } from 'react-native';

export const WebViewTitle = () => {
    const onChangeState = (e) => {
        console.log(e);
      };
  return (
    <SafeAreaView style={{flex:1}}>
      <WebView
        source={{uri: 'https://reactnative.dev/'}}
        onNavigationStateChange={e => onChangeState(e)}
      />
    </SafeAreaView>
  );
};
```
するとWebView内で画面遷移するたびに`onNavigationStateChange`が発火し、コンソールに情報が表示されます。

実際のlog↓
`{"canGoBack": true, "canGoForward": false, "loading": false, "navigationType": "other", "target": 4383, "title": "React Native · Learn once, write anywhere", "url": "https://reactnative.dev/docs/getting-started"}`

ここからタイトルタグを取得し、それをアプリ内で管理すればいいだけです。

ただ、画面のタイトルを制御するファイル（StackNavigation.js）とWebViewを表示するファイル（実際にwebViewを呼び出しているところ）は別々のディレクトリであり、階層的にwebViewの方が子要素になると思います。
ですのでpropsで渡すことは不可能なので、
１、Reduxを使って管理
２、useContextを使って管理
のどちらかを使う必要があります。

またwebViewのタイトルタグが英語だったり、違う表現をしている可能性もありますので、webViewを作るエンジニアと相談する必要があります。
React + Material-UI の Styles で メディアクエリ

# はじめに
いちいちコンポーネントで書く必要性は見当たらないが、一応可能
配列＋バッククォートとか余計な書き方しなくてもいけるということに公開してすぐ気づいた人、、

# コード
```React
import { Grid, List, ListItem } from "@material-ui/core";
import { makeStyles } from "@mui/styles";

const useStyles = makeStyles(() => ({
  root: {
    // Root共通
    display: "flex",
    height: "100vh",
    // 各メディアクエリ設定
    "@media (min-width:1280px)": {
      "& .main > sub": {
        width: "20%",
      },
    },
    "@media (min-width:800px) and (max-width:1279px)": {
      "& .main > sub": {
        width: "30%",
      },
    },
    "@media (max-width:799px)": {
      "& .main > sub": {
        width: "40%",
      },
    },
  },
}));

function App() {
    // classオブジェクト生成
    const classes = useStyles();
  
    return (
      <Grid className={classes.root}>
        <List className={["main"]}>
            <ListItem className={["sub"]}>hoge1</ListItem>
            <ListItem className={["sub"]}>hoge2</ListItem>
            <ListItem className={["sub"]}>hoge3</ListItem>
            <ListItem className={["sub"]}>hoge4</ListItem>
            <ListItem className={["sub"]}>hoge5</ListItem>
        </List>
      </Grid>
    );
  }
  
  export default App;
```

# 終わりに
```"& .main > sub"``` については ```"& .main > li"``` とかにして、subのclass名を取った方がスマートではあるが、わかりやすさ優先
非エンジニアがマイクロサービスについてアウトプットしてみた

## はじめに
・非エンジニアである私が、少しでもエンジニアのことを知ってみようと思いインプットしたことをアウトプットしています。
・参考記事を自分用にまとめたものなので見苦しい部分もあるかと思いますがご了承ください。
・補足等あればコメント頂けると嬉しいです(頑張って理解します)


## マイクロサービスとは
・複数の規模の小さなサービスを組み合わせてひとつの大きなアプリケーションを構成する、ソフトウェア開発の技法のひとつ
・明確な定義は無い
・従来：「全ての機能がまとまったひとつの大きな塊」としてソフトウェアを設計することが多かった
・マイクロサービス：「まず機能を分解していき、小さなサービスをつくる。それらを組み合わせることでひとつの大きなソフトウェアを構成する」という考え方
・それぞれのサービスはネットワークを介して行われる


## マイクロサービスのメリット
### 新しい技術を容易に採用できること
・各々のサービスはネットワークを介してそれぞれが公開したインターフェイスを呼び合うだけで、それ以外の依存関係は無い
⇒ それぞれのサービスが全く異なる技術を採用することが出来る

・技術的に自由である
⇒ チーム毎で自由に技術を採用することが出来る

### 俊敏性がある
・小さくひとつの機能に特化したサービスが開発できる
⇒ 小規模の独立チームで開発が行える(小回りが効く)

### 柔軟性のあるスケーリングが可能
・システム全体ではなく、必要な部分だけを対象としてスケーリング(処理能力の調整)することができる

## マイクロサービスのデメリット
### 関わるマネージャーに幅広い知識と高度な技術力が求められる
・技術的に自由な分、色々なことを知っておかないとコントロール出来ない
・設計やテストの難易度も上がってしまう

### 関係性が複雑になるので管理が重要
・Aという業務にはE,F,Gのマイクロサービスを利用する、Bという業務にはE,H,Iのマイクロサービスを利用する、となると管理が大変になる

### データ通信量が多いのでパフォーマンスが問題になるケースもある
・ネットが繋がっていない状態ではデータのやり取りが出来ない
・大容量のデータを送受信するときには時間がかかる

## おわりに
「マイクロサービス化」を打ち出している企業は「比較的モダンな環境で開発ができる」というメッセージであることが分かりました。
さらにマイクロサービスを採用しているので、それを統括するマネージャークラスの方は一定メンバーをフォローできるだけの技術力があることも理解できました。


## 参考
https://ncdc.co.jp/columns/6503/ 

https://amela.co.jp/%E7%8C%BF%E3%81%A7%E3%82%82%E3%82%8F%E3%81%8B%E3%82%8B%EF%BC%81%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E5%85%A5%E9%96%80%EF%BC%88%E5%88%9D%E5%BF%83%E8%80%85%E3%83%BB/ 

https://atmarkit.itmedia.co.jp/ait/articles/1909/13/news012.html
【mt4/mql4】オーダー（注文）全キャンセル処理

# はじめに
<!-- 発端や概要を記載 -->
システムトレードプログラマのmt4/mql4のメモノートです。
初心者向けの簡単なトピックから公開していきます。
.noteでEAそのものも公開していますので良ければそちらも見てください。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [処理内容](#処理内容)
1. [mql4ソースコード](#mql4ソースコード)

<!-- 各チャプター -->
<a id="#処理内容"></a>
# 処理内容
一度出した注文（指値買い、指値売りその他逆指値注文とか）をキャンセルする関数です。
もちろん約定する前の注文のみ取り消し可能です。


使いどころとしては
・オーダーを出したものの、約定せずに一定時間経ってしまい、オーダー時と状況が違ってしまった場合。にオーダーキャンセルする

・オーダー出したまま週末を跨ぎたくない。ので、オーダーキャンセルするとか

・FOMCが迫っているのでリスク回避のためにオーダーキャンセルするとか

・証拠金率が下がってきたので、リスク低減のために今出してあるオーダーをキャンセルするとか


ですかね。

<a id="#mql4ソースコード"></a>
# mql4ソースコード

こちらが関数側のソースです。呼び出し側の前に記述されている必要があります。
基本的には使いたい条件式とセットで使う関数となります。
なお、オーダーキャンセルも取引会社（FX会社側）での受理が必要ですので他の注文と合わせて使う際にはsleepなどで少しだけでも合間時間を確保しておくと、リクエスト拒否されにくいです。

```c++:test.mq4
//+------------------------------------------------------------------+
//| オーダーを全キャンセル      ALL0rderCancel
//|  code by KOUSHIROU
//|  https://note.com/mt4_coder                 
//+------------------------------------------------------------------+
void ALLOrderCancel()
 {
  int total0Dcnt = OrdersTotal();
  if(total0Dcnt > 0)
    {
     for(int i = total0Dcnt -1; i >= 0; i--)
       {
        bool selected = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if(selected)
          {
           int type = OrderType();
           switch(type)
             {
              case OP_BUY:
                 OrderDelete(OrderTicket());
                 break;
              case OP_SELL:
                 OrderDelete(OrderTicket());
                 break;
              case OP_BUYLIMIT:
              case OP_BUYSTOP:
                 OrderDelete(OrderTicket());
                 break;
              case OP_SELLLIMIT:
              case OP_SELLSTOP:
                 OrderDelete(OrderTicket());
                 break;
             }
           OrderPrint();
          }
       }
    }
 }
//+------------------------------------------------------------------+
```


こちらは呼び出し側の例
呼び出したいタイミングに合わせてOnTick()、OnInit()とかOnTimer()の中で記述してみてください。何らかの条件（if文とかで注文から10分たったらとか）内に記述するのが一般的でしょう。

```c++:test.mq4
ALLOrderCancel();
```


皆様の手助けになりますように。
間違いなどあればご指摘いただけると助かります。
以上です
【mt4/mql4】ロングポジション（買いポジション数）カウント処理



# はじめに
<!-- 発端や概要を記載 -->
システムトレードプログラマのmt4/mql4のメモノートです。
初心者向けの簡単なトピックから公開していきます。
.noteでEAそのものも公開していますので良ければそちらも見てください。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [処理内容](#処理内容)
1. [mql4ソースコード](#mql4ソースコード)

<!-- 各チャプター -->
<a id="#処理内容"></a>
# 処理内容
今のロングポジション数を確認したい場合の処理になります。
ロングということで「買い」です。「BUY」です。「ブル」です。
のポジションがいくつあるかをカウントするコードです。

使いどころとしては
・最大ポジション数を制限したいとき
　→ポジションがあるなら追加エントリーしない。とか

・買い売りのどちらの処理を行えばいいかの判定のとき
　→売りシグナルが出たので、買いポジションがあるなら決済する。とか
　
ですかね。
そんな時はこのコードでロングポジション数を算出してください。

<a id="#mql4ソースコード"></a>
# mql4ソースコード

こちらが関数側のソースです。呼び出し側の前に記述されている必要があります。

```c++:test.mq4
//+------------------------------------------------------------------+
//| ロングポジション数を取得      LongPositionCnt
//|  code by KOUSHIROU
//|  https://note.com/mt4_coder                 
//+------------------------------------------------------------------+

input int MAGIC = 12345;

int LongPositionCnt()//ロングポジション数を取得
{
	 int buys=0;
	 for(int i=0;i<OrdersTotal();i++)
	 {
		 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
		 {
			 if(OrderType()==OP_BUY)  buys++;
		 }
	 }
	 return(buys);
}
//+------------------------------------------------------------------+
```


こちらは呼び出し側の例
呼び出したいタイミングに合わせてOnTick()、OnInit()とかOnTimer()の中で記述してみてください。
LPosCntの中にポジション数が入ります。

```c++:test.mq4
int LPosCnt = LongPositionCnt();
```

取引所によっては、高頻度でアクセスしたりするとエラーではじかれたりします。
そんなときはsleepなどで間をあけるようコーディングしてみてください。

皆様の手助けになりますように。
間違いなどあればご指摘いただけると助かります。
以上です
Markdown 記法のメモ

#コードの挿入
\``` で囲む
※コードブロック上下に空行を挿入
例)rubyで記述したコードをファイル名「qiita.rb」として投稿

(空行)
ruby:qiita.rb
puts 'hello world'　これを\``` で囲む
(空行) 


結果

```ruby:qiita.rb
puts 'hello world'
```
 
バックオートを用いるとシンタックスハイライトが適用され、青字になる

#強調・強勢
_か※で囲むとイタリック体
__か**で囲むと太字

#打ち消し線
~~で囲むと一重取り消し線

#折りたたみ

```
<details>で囲むと追加したい情報、<summary>で囲むと、要約として表示したい文章になる
例)<details><summary>要約として表示したい文章</summary>追加したい情報</details>
```

2chとは
<details><summary>2chとはインターネット掲示板である</summary>〇〇年、ひろゆき氏によって設立された日本最大級のインターネット掲示板である。</details>

#補足説明
\:::note infoと :::で囲む
※ :::note infoと :::はそれぞれ別の行にする必要がある。infoは省略可能

\:::noteの後
infoはインフォメーション
warnは警告
alertはより強い警告

#リスト
###Disc型
・
・
文頭に「※」「＋」「ー」のいずれかを入れる。
※リストを挿入する際はリストの上下に空行が必要
また、「※」「＋」「ー」の後には、スペースが必要

###Decimal型
1.
2.
文頭に「数字.」を入れる
※はDisc型と一緒。

###Definition型
HTMLのblタグをそのまま使う

```
<bl>
    <dt>トマト</dt>
    <dd>赤い野菜</dd>
    <dt>ピーマン</dt>
    <dd>緑色の野菜</dd>
</bl>
```

結果
<bl>
    <dt>トマト</dt>
    <dd>赤い野菜</dd>
    <dt>ピーマン</dt>
    <dd>緑色の野菜</dd>
</bl>

Checkbox型

```
-[ ] タスク1
-[x] タスク2

※リストの前後にスペースが必要

```

結果

- [ ] タスク1
- [x] タスク2

#Blockquotes-引用
文頭に>をおくと引用になる
>引用

#水平線

\***は水平線の表示になる

#リンク
```
[リンクテキスト](URL"タイトル")
または
[リンクテキスト](URL)タイトルなしのリンク
```
#画像埋め込み
```
![代替テキスト](画像のURL)
![代替テキスト](画像のURL "画像タイトル")
```
#テーブル記法
3x2と入力すると「テーブルを挿入」と表示されるのでクリック
結果

| 1 | 2 | 3 |
|:-:|:-:|:-:|
|   |   |   |
|   |   |   |

#リンクカード
URLをリンクカードとして表示します。URLの前後に改行が必要です

URLを入力

(例)

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

#コンテンツの埋め込み
おすすめのyoutuberのTwitterとyoutubeを埋め込む

###TwitterはURLで入力。リンクカードと同様

https://twitter.com/sutehageyoutube/status/1449741272235724804

###youtubeの埋め込み

```
<iframe width="800" height="534" src="https://www.youtube.com/embed/XUa32p9fbTU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
```

このような埋め込みコードはyoutubeの再生画面上で右クリックをして
<>埋め込みコードをコピーをすると得ることができる

<iframe width="700" height="400" src="https://www.youtube.com/embed/XUa32p9fbTU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

#参考記事
https://qiita.com/Qiita/items/c686397e4a0f4f11683d
NGSデータ解析のスキル

　多くの方には次世代シーケンサー（NGS）のデータ解析をしている人はどんなことをやっているのか、わかりづらいところがあるかと思います。そこで、どんなことをやっているのかイメージをもっていただければと、著者が実際に使っているスキルを思い出せる限りざっと書き出してみました。ちょっとでも親しみを感じていただけると幸いです。


#計算

###統計基礎

　様々な統計手法を解析データに応用します。

###Excel

　用意されている関数を組み合わせれば、Excelでも複雑な解析ができます。

###R

　R言語というものを使って指示を出すのでとっつきにくいですが、一般的なプログラミング言語よりお手軽でわかりやすいです。Excelと比べ、次のような利点があります。

+ 大規模データや、メモリを消費するような計算が実行できる。
+ 複雑なプロットやきれいな図が作れる。
+ 複雑な計算も提供されているパッケージを使って簡単に解決できることがある。


#Linux

　CentOSやUbuntu上のコマンドラインでいろいろ解析しています。コマンドラインで操作するのと、環境を準備するのに抵抗があるかもしれませんが、やってみれば思ったよりできる！と感じられるツールかと思います。たくさんのコマンドがありますが、どんなコマンドを使えるといいか、使用頻度が高いと感じるものを挙げてみます。

###操作

　ls / cd / mkdir / df / free / ps / top

###ファイルやデータの閲覧

　less / cat / head / tail / wc / file

###ファイルやデータの加工、解析

　vim / cut / grep / diff / join / paste / sort / uniq

　NGSデータ用の解析ツールはLinuxで使うことを前提にしていることが多いので、その点からしても重要です。ツールのインストールではよくわからないエラーが出ることが多いので、ある意味でツールのセッティングが腕の見せ所でもあります。

#プログラミング

　書いてすぐ実行できるスクリプト言語を1つ使えると便利です。勉強する時間がかかりますが、上記では対応しきれない複雑な条件でデータ抽出ができたりします。NGSではゲノム全体を網羅的に見たりとスケールが大きいため、結果が得られても閲覧できる情報量に落とせるかが重要になりやすいです。


+ awk
+ perl
+ python

など

#NGSの知識

シーケンスデータに含まれるものがどんなデータであるかわかれば、何をすれば良いか予想が付きます。

+ シーケンスの機種や、シングルエンドとペアエンドの違いなど、どうやってシーケンスしているか
+ Whole GenomeやExomeなど、なんの配列なのか
+ どういった種類のミスシーケンスがありえるか

など

　ここまで見ていただくと、なかなか専門性が高いということがお分かりいただけるかと思います。ですが、NGSはゲノムを網羅的に調べる手段（ツール）として優秀です。自身で解析されずとも、より多くの方に親しみを持ってNGSを活用いただけると幸いです。
文字列をBoolに変換

## bool()は使いづらい
文字列型を変換したい場合、何か値が入っていればTrueが返ってくる

configparserと一緒に使おうとして、確かダメだったなーということで今更ながら関数作った。

## 自作関数で解決
最後のelseは不要

```Python
def get_bool(input: str) -> bool:
    if input.lower() == 'true':
        return True
    if float(input) >= 0:
        return True
    else:
        return False
```
Android Studioで作成したライブラリをGitHub Packages（パッケージ管理システム）に公開し、Android Studioの他のプロジェクトから利用する手順

こちらのGoogleドキュメントをご参照ください。
https://docs.google.com/document/d/1hfbsgP9HWjahwQtjHZ5Twk_8AGdA9fZFNDrn--k1N4k/edit?usp=sharing

※Googleドキュメントをマークダウンに変換しようと思ったけど、無理でした。
Djangoを始める

# 記事を書くきっかけ
　Djangoを用いてWebアプリのサーバー側の設定をしようと思い、そのためのコマンドや初期設定を備忘録としてまとめました。

# 目次
- Djangoとは
- Djangoを用いたWebアプリ作成手順
  1. Djangoプロジェクト作成
  1. アプリケーション作成
  1. 初期設定
  1. アプリケーション実行
  1. モデルをデータベースに適用する
  1. 管理画面のログイン情報設定
- まとめ

## Djangoとは
　DjangoはPythonで実装されたWebアプリケーションフレームワークの1つであり、Webアプリケーションの実装に必要な機能が一通り揃っているフルスタックなフレームワークです。

## Djangoを用いたWebアプリ作成手順

## 1. Djangoプロジェクト作成
　Djangoのプロジェクトを作成するにはまず、以下のコマンドでDjangoのプロジェクトを作成します。
　```sample```はプロジェクト名です。

```:Djangoプロジェクト作成
$ django-admin startproject sample
```
　コマンド実行後のディレクトリ構成は以下のようになります。

```:ディレクトリ構成
.
├── manage.py
└── sample
    ├── __init__.py
    ├── wsgi.py
    ├── urls.py
    └── setting.py
```

|ファイル名|役割|
|--------|----|
|manage.py|開発用サーバーの起動,データベースへデータ反映,Djangoの操作管理|
|\_\_init__.py|パッケージ読み込んだ際の初期化用ファイル|
|wsgi.py|Djangoを本物のWebサーバー上で動作させるファイル|
|urls.py|ブラウザからアクセスしたURLに対応した処理を定義するためのファイル|
|setting.py|Djangoプロジェクト全体の設定を定義するファイル|


## 2. アプリケーション作成
　Djangoプロジェクトを作成したらプロジェクト内へ移動し、以下のコマンドを実行してWebアプリのフォルダを作成します。

```:アプリケーション作成
$ python3.10 manage.py startapp sample_app
```
　コマンド実行後のディレクトリ構成は以下のようになります。


```:ディレクトリ構成
.
├── manage.py
├── sample
└── sample_app
    ├── admin.py
    ├── apps.py
    ├── models.py
    ├── test.py
    └── setting.py
```
|ファイル名|役割|
|--------|----|
|admin.py|管理画面の設定を行うファイル|
|apps.py|アプリ自体の設定を行うファイル|
|models.py|データベースの操作をするファイル|
|test.py|Djangoアプリのテストを書くためのファイル|
|views.py|実際の処理を書くファイル|

## 3. 初期設定
　Webアプリフォルダが作成できたら```sample/settings.py```のINSTALLED_APPSを書き換え、WebアプリがDjangoとリンクするようにします。ついでに使用する言語と時間を日本仕様にしています。

```python:sample/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'sample_app.apps.SampleAppConfig'    # 追加
]

# 使用する言語を日本語にする
LANGUAGE_CODE = 'ja'

# 時間をTokyoにする
TIME_ZONE = 'Asia/Tokyo'
```

　```sample/settings.py```を変更したら、次は```sample/urls.py```を変更することでURLとWebアプリをリンクさせます。

```python:sample/urls.py
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('/', include('sample_app.urls')),
]
```
　この設定が終わったら、views.pyやmodels.pyを書いてアプリを作成します。

## 4. アプリケーション実行
　アプリの挙動をブラウザで確認したい時は、以下のコマンドを実行します。

```:アプリケーション実行
$ python3.10 manage.py runserver
```

## 5. モデルをデータベースに適用する
　データベースを使用する際は、models.pyで作成したモデルをデータベースに適用する必要があり、以下のコマンド2つでそれを行います。
　1つ目のコマンドでmakemigrationファイルが作成され、2つ目のコマンドでデータベースに反映させています。

```:モデルでデータベース更新
$ python3.10 manage.py makemigrations sample_app
$ python3.10 manage.py migrate
```

## 6. 管理画面のログイン情報設定
　Djangoフレームワークにはあらかじめ管理画面が備わっており、その管理画面にログインするためのユーザーネームとパスワードを以下のコマンドで設定します。

```:管理画面のログイン情報設定
$ python3.10 manage.py createsuperuser
```

## まとめ
　ファイルが多くやや複雑ですが、ルーティングやデータベースの管理が一括でできる点は便利でした。
リーダブルコードまとめ　知っておくだけでレベルアップできるコーディングルール

[記事はこちらに移動しました。](https://tro555-engineer.com/2022/02/16/%e3%83%aa%e3%83%bc%e3%83%80%e3%83%96%e3%83%ab%e3%82%b3%e3%83%bc%e3%83%89%e3%81%be%e3%81%a8%e3%82%81%e3%80%80%e7%9f%a5%e3%81%a3%e3%81%a6%e3%81%8a%e3%81%8f%e3%81%a0%e3%81%91%e3%81%a7%e3%83%ac%e3%83%99/)
機械学習でよく使われる数学記号(2) 応用編

#1.はじめに

前回の記事に、機械学習でよく使われる数学記号を整理してみました。
今日は応用編です。

https://qiita.com/kotai2003/items/99d770bf6ee1e597d0b3


#2. k近傍法(k-Nearest Neighbor)

k近傍法のコンセプトは一言で表すと「多数決」です。

「k近傍法とは、分類に使われる手法の一つで、与えられた学習データをベクトル空間上にプロットしておき、未知のデータが得られたら、そこから距離が近い順に任意のk個を取得し、その多数決でデータが属するクラスを推定するというものだ。」**出展日経クロストレンド**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/d24952da-eba5-7c76-dbf2-391733b0b5a9.png)


そして、距離は、ユークリッド距離を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/c5464d3a-fb67-af0b-144e-b91e0271c905.png)

##2.1. 数式

```math 
P(y=j|X=x) = \frac{1}{K} \sum_{i\in A} I(y^{(i)} = j)
```
##2.2. 数式の意味

### 2.2.1. 左辺
```math 
P(y=j|X=x)
```

左辺はある点 **X=x** が与えられたときに、その点が**j**というクラスに属する確率を示しています。

### 2.2.2. 左辺

```math 
\frac{1}{K} \sum_{i\in A} I(y^{(i)} = j)
```

そしてそれを具体的に求めるのが右辺です。

Σの部分は、「近傍」に含まれる点を示す添え字i全てについてクラスjに属する数を求めています。
I(y(i)=j) というのは、その点のクラスy(i)がjであるときに1、それ以外の時に0になるような関数を意味しています。
それを足し合わせれば、クラスがjである個数になるのは分かるかと思います。

最後にK個の近傍を取っているので、全体の個数であるKで割ってあげれば、その近傍の中におけるクラスjの割合が求められるわけです。


#3. サポートベクターマシン (SVM)
今後記載予定
 
# 参考資料

https://qiita.com/kotai2003/items/99d770bf6ee1e597d0b3

https://ai.plainenglish.io/the-math-behind-knn-7883aa8e314c

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14251374374
pipインストール手順

#環境
windows10
python3.9
エディタ　VSCode

#事象
pythonをインストールしたが、pipがインストールできていなかった。
[No module named pip]とあるが、python3.4以上は、pipは自動インストールでは？と非常に悩んだ。
調査するとpowerShellは最新のバージョンにアップデートしてみると良いとあったので、
最新にしてみた。

python3.9 の保存場所は以下。
C:\Users\xxx\AppData\Local\Programs\Python\Python39\python.exe

```python:コマンドプロンプト
>python --version
Python 3.9.2

> py -m pip install
C:\Users\xxx\AppData\Local\Programs\Python\Python39\python.exe: No module named pip
PS C:\Users\xxx\AppData\Local\Programs\Python\Python39> pip list
pip : 用語 'pip' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。
名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください
。
発生場所 行:1 文字:1
+ pip list
+ ~~~
    + CategoryInfo          : ObjectNotFound: (pip:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
```



#解決方法
PowerShellを立ち上げる。
python3.9と同じ場所に、以下のファイルを保存する。
ダウンロード先：https://bootstrap.pypa.io/get-pip.py
ファイル名：get-pip.py

python3.9のフォルダ下で、コマンドpython get-pip.pyを実行する。

```python:powerShell
PS C:\Users\xxx\AppData\Local\Programs\Python\Python39> python get-pip.py
Collecting pip
  Downloading pip-21.3.1-py3-none-any.whl (1.7 MB)
     |████████████████████████████████| 1.7 MB 3.3 MB/s
Collecting setuptools
  Downloading setuptools-58.3.0-py3-none-any.whl (946 kB)
     |████████████████████████████████| 946 kB 6.4 MB/s
Collecting wheel
  Downloading wheel-0.37.0-py2.py3-none-any.whl (35 kB)
Installing collected packages: wheel, setuptools, pip
Successfully installed pip-21.3.1 setuptools-58.3.0 wheel-0.37.0
```

確認

```python:powerShell
> pip -V
pip 21.3.1 from C:\Users\xxx\AppData\Local\Programs\Python\Python39\lib\site-packages\pip (python 3.9)
```

念のため、コマンドプロンプトでも確認

```python:コマンドプロンプト
>pip -V
pip 21.3.1 from C:\Users\xxx\AppData\Local\Programs\Python\Python39\lib\site-packages\pip (python 3.9)

>pip list
Package    Version
---------- -------
pip        21.3.1
setuptools 58.3.0
wheel      0.37.0
```



#参考
こちらの記事を参考にさせていただいた。
Qiita: [pipのインストール方法](https://qiita.com/suzuki_y/items/3261ffa9b67410803443)

pipが使えるようになったら、pythonライブラリをインストールできるので
以下のサイトを参考にしつつ、インストールしてください。

https://torusblog.org/vscode-library-install-after/

#考察
C#でUnix Timeの取得

#良くない例
```C#
DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds
```

#良い例
```C#
new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds()
```
#相違点
「良くない例」の型は`double`で、「良い例」の型は`long`。
【AWS】CloudTrail

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


# CloudTrailとは
AWSアカウントのガバナンス、コンプライアンス、運用監査、リスク監査を行うためのサービスです。
CloudTrailを利用することでAWSインフラストラクチャ全体でアカウントアクティビティをログに記録し
継続的に監視、保持できます。
(誰がいつ、どんな操作をしたのか記録する)

#特徴
CloudTrailは全てのAWSアカウントで有効化されていて
アカウントの作成時点からアカウントアクティビティを記録します。
過去90日分のアクティビティを表示、ダウンロードできます。
(90日以上保存する場合は、S3へ保持する）

## マルチリージョン設定
ある一つのアカウントで、複数のリージョンから1つのS3バケットにログファイルを
配信するように設定できます。
1つの設定ですべてのリージョンに適用されるため、既存リージョンにも新しくサービスを起動したリージョンにも適用されます。

## ログファイルの暗号化
CloudTrailではデフォルトで指定されたS3に配信されるすべてのログファイルをS3の
サーバー側暗号化(SSE)を使用して暗号化します。
AWS KMSキーで暗号化することもできます

## データイベント
データイベントログを有効化することで、オブジェクトレベルのAPIアクティビティを記録し
誰がリクエストを行ったか、どこでいつリクエストされたかなどの詳細情報を受け取ることができます

## CloudTrail Insights
リソースプロビジョニングの急上昇、IAMアクションのバースト、
または定期的なメンテナンスアクティビティのギャップなど、
AWSアカウントの異常なアクティビティを特定します。
AWS組織全体でCloudTrail Insightsイベントを有効にするか
もしくはCloudTrailtここのアカウントで有効にできます。

## 統合
Lambdaと統合すると、CloudTrailからS3バケットにログが書き込まれると、
Lambda 関数が呼び出され、CloudTrail により記録されたアクセスレコードを処理したり、
CloudWatch Logsと統合するとCloudTrailで記録された管理とデータのイベントを
CloudWatch Logsに送信しイベントをモニタリングできるようになります。

## その他
CloudTrail は S3 バケットに約 5 分ごとにログファイルを送信します。
そのアカウントに対してAPI呼び出しがない場合、CloudTrail はログファイルを送信しません。
複数のアカウントの保存先として、1つのS3バケットを設定できます。

# 料金
基本的に無料で利用を開始することができます。
S3 に配信されたデータイベント量、CloudTrail Insightsで分析したイベント量に応じて
従量課金となります。


# 参考サイト
https://aws.amazon.com/jp/cloudtrail/
Java: Spring BootでのWebアプリ開発のYouTube動画をみんなで視聴した

自主的な勉強会として、Spring BootでWebアプリケーションを開発するYouTube動画を、数人の新人開発者と視聴しました。本記事は、その実施内容と私の感想をまとめたものです。

# 勉強会を企画した背景

ふだん、[私はレガシーなWebアプリケーションの開発・保守をしています](https://note.com/flyaway/n/nc1ed9bc5ccfc)。一般に、そのようなアプリケーションを修正する際には、さまざまなところに気をつける必要があります。

たとえば、多くの処理を自前でコーディングする必要があります。また、何か問題にあたったときに、それをGoogle検索しても、解決のための情報はなかなか見つかりません。

そのようなアプリケーションを触ることに慣れてしまうと、それが普通の世界だと勘違いしてしまう可能性があると思いました。

そうではなく、世の中で広く使われているフレームワークを使っていれば、少なくわかりやすいコーディングで実装ができます。落とし穴にもはまりづらく、開発スピードを上げることができます。それは、結果として、プロダクトの競争力を高めることができるということを共有したかったです。

# 勉強会の流れ

1回あたり30分、5日間連続で開催をしました。

勉強会の流れは下記の通りです。

1. みんなで動画を視聴する
1. 疑問や不明点を質問する。それに対して、回答できる人が答える
1. 時間が余っている場合は、主催者(一番理解している人)が確認のための質問を投げかける
1. 終了後、各自が理解したことや感想をテキストにまとめ、ほかの人から見えるところに共有する

単に動画を視聴するだけでなく、その後に考えたり手を動かす時間を設けることで、できるだけ記憶に定着するようにしました。これは[精緻化](http://www.ipii.co.jp/archives/blog/学習科学の研究者が教える効果的な学習方法：精/)としての効果を狙ったものです。


# 視聴した動画について

[ITを分かりやすく解説](https://www.youtube.com/channel/UC--TPTOTN0O178CcwvMNV6w)で公開されている、Spring Bootを使ったWebアプリケーションの解説動画を見ていきました。

https://www.youtube.com/channel/UC--TPTOTN0O178CcwvMNV6w


## 1日目

Spring Boot, Thymeleaf, Spring Data JPAというフレームワークの基本についての動画です。

https://www.youtube.com/watch?v=jUnMD_Bd3cs

https://www.youtube.com/watch?v=rJ5k1kpY1Eo

やはり、バックエンドとフロントエンドがちゃんと分離できていると保守性が高まりますね。また、テンプレートファイルを利用していると、[XSS脆弱性などを埋め込みにくい](https://qiita.com/flyaway/items/df5cb30c78aec675b3fb#easybuggy-boot%E3%81%AE%E5%A0%B4%E5%90%88)というメリットがあります。

あとは、SQLやPreparedStatementを直接扱うのに比べ、Spring Data JPAの手軽さについて驚いた人が多かったのではないかな、と思います。

## 2日目

MyBatisというフレームワークの解説動画です。

https://www.youtube.com/watch?v=GVAVL24v-OQ

Spring Data JPAはSQL文を書く必要がありませんでしたが、MyBatisではSQL文を直接書くようです。
どちらが好ましいかというのはあまりよくわかりませんでしたが、後から調べてみると一長一短のようですね。

https://www.nextdoorwith.info/wp/se/jpa-vs-mybatis/


## 3日目

これまで出てきた技術を使って、一覧画面を作成する動画です。
昨日と比べて新しい要素はあまり無かったので、復習としての位置付けになりました。

https://www.youtube.com/watch?v=qtKJQlDHO88

特に質問はありませんでしたが、派生して、動画中で使われていた[CDN(Content Delivery Network)](https://blog.redbox.ne.jp/what-is-cdn.html)についての話をしました。


## 4日目

Bean Validationを使った入力値チェックの解説動画です。

https://www.youtube.com/watch?v=ArIiqWEkuPk

入力値のチェックにif文を書かなくても良いというのは、新鮮味があるのではないでしょうか。

視聴後は、[Validatedアノテーション](https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/validation/annotation/Validated.html)についての補足をしました。また、正規表現の内容や[JavaBeansの定義](https://e-words.jp/w/JavaBeans.html)を確認しました。

## 5日目

これまでの総復習です。

https://www.youtube.com/watch?v=4dC-dONADSY

動画中では、[CrudRepository#findById(ID id)](https://spring.pleiades.io/spring-data/commons/docs/current/api/org/springframework/data/repository/CrudRepository.html#findById-ID-)の返却値であるOptionalの扱い方がイマイチなように思いました。このため、「レコードが物理削除されている場合、詳細画面で適切なエラーメッセージを表示するにはどのように修正すればよいでしょうか？」という質問を投げかけました。

結果として、

1. (ドキュメンテーションコメントに明記した上で、)nullを返す
1. チェック例外を返す
1. `Optional<User>` を返す

という3通りの解決策に触れることができました。

# 感想

まず、Spring Bootに関して、このような日本語の動画を製作された作者は素晴らしいと思いました。個人で運営されているようなのですが、短い動画にもかかわらず、とてもわかりやすかったです。

ただ、動画の存在を知っていても、一人だけだとなかなか重い腰が上がらないと思います。それを解決するために、勉強会という形式でみんなで視聴することで、楽しく学ぶことができました。
さらに、視聴後に疑問や不明点を確認し、メモをまとめることで、理解が深まったのではないかと思います。