OmniAICreator/Qiita-1.07M huggingface dataset:
スプライン vol.4 ～正則化法～

#参考本
 多変量解析　小西貞則著　

# 前回記事

https://qiita.com/yudaiyamashita/items/1de41a8a3381557f0478

# 正規化法

複雑な現象の構造を近似する非線形回帰モデルを推定するための方法の一つである正則化法について。

# 正則化最小2乗法

$p$次元説明変数ベクトルを$\boldsymbol x$で表し, 目的変数$y$に関して観測された$n$組のデータを$\{ (\boldsymbol x_i, y_i); i = 1, 2, 3 \cdots, n\}$とする.

(ベクトルは縦ベクトルを考える.)

$$y_i = \sum_{j= 0}^m \omega_j b_j(\boldsymbol x_i) + \epsilon _i , i= 1,2, \cdots,n$$

$$\boldsymbol y = B\boldsymbol　\omega +\boldsymbol　\epsilon$$
$\boldsymbol y$は観測値ベクトル,　$\boldsymbol w$は$m$次元のパラメータ(ウエイト)ベクトル 
さらに
$$B = \begin{pmatrix}
b_1(\boldsymbol x_1)  && b_2(\boldsymbol x_1) && \cdots && b_m(\boldsymbol x_1) \\\
b_1(\boldsymbol x_2)  && b_2(\boldsymbol x_2) && \cdots && b_m(\boldsymbol x_2) \\\
\vdots  && \vdots && \cdots &&
\vdots \\\
 b_1(\boldsymbol x_n)  && b_2(\boldsymbol x_n) && \cdots && b_m(\boldsymbol x_n) \\\
\end{pmatrix}$$

これまで通り誤差項に対して以下を仮定する
$$E[{\epsilon_i}]=  \boldsymbol 0　{iは添え字}$$

$$E[{\boldsymbol \epsilon}{\boldsymbol \epsilon}^T]=   \sigma^2 I$$

基底関数の増加は、ぱらめーた数の増加に伴うモデルのデータへの過学習と推定の不安定を誘発するので場合によっては最小２乗推定量に含まれる$(B^TB)^{-1}$の計算が右脳になることもある。モデルの複雑さが増すにつれて減少する誤差項の2乗和に逆にモデルの複雑さに依存して値が大きくなるペナルティ項$R$を課した関数

$$S_\gamma(\boldsymbol \omega) =(\boldsymbol y - B \boldsymbol \omega)^T(\boldsymbol y - B \boldsymbol \omega)+ \gamma R$$
の最小化をはかる. このパラメータ$\gamma$は正則化パラメータと呼ばれ、モデルの適合度と曲線の滑らかさを指す。

この推定法は正則化最小２乗法と呼ばれる.

#正則化最尤法

対数尤度関数(先述)にペナルティ項を課すことで、正則化法を構成できる。
誤差項$\epsilon_i$ ($i = 1, 2,\cdots, n$)は互いに独立に平均0、分散$\sigma^2$の正規分布に従うものとする. このとき、ガウスノイズを持つ非線形回帰関数モデルの対数尤度関数は

$$l(\boldsymbol \theta) = \sum_{i=1}^n \log f(y_i|\boldsymbol x_i; \boldsymbol \omega, \sigma^2)= -\\frac{n}{2} log(2\pi \sigma^2)-\frac{1}{2\sigma^2}(\boldsymbol y -B \boldsymbol \omega)^T(\boldsymbol y -B \boldsymbol \omega)$$
である。
ただし、$\boldsymbol \theta = (\boldsymbol \omega^T, \sigma^2)^T$である

この対数尤度関数の最大化によって$\boldsymbol \omega$と$\sigma^2$の最尤推定量は$\hat{\boldsymbol \omega}= (B^TB)^{-1}B^T\boldsymbol y$, $\hat{\boldsymbol \sigma}^2= \frac{1}{n}(\boldsymbol y -B \boldsymbol \omega)^T(\boldsymbol y -B \boldsymbol \omega)$

最大対数尤度は、
$$l(\hat{\boldsymbol \theta)} =  -\frac{n}{2} \log(2\pi) -\frac{n}{2} \log(\hat{\sigma}^2)-\frac{n}{2}$$

#複雑なモデル化に対しては
多数パラメータをもつモデルを最尤法によって推定しようとすると対数尤度の値は、構造を近似するモデルがデータの近くを通るにつれ次第に大きくなっていく。
分散の最尤推定値が残差平方和
に相当していることからモデルが複雑に連れて減少し(ごく小さいものの２乗、これは個数が大きくなっても影響は大きい。)

$$\log(\hat{\sigma}^2)$$の絶対値が大きくなる。

$$l_\lambda(\boldsymbol \theta) =\sum_{i=1}^{n} \log f(y_i| \boldsymbol x_i; \boldsymbol \theta) -\frac{\lambda}{2} R(\boldsymbol \omega)$$
AutomatorとTesseractを使って画像から検索可能なPDFを作る

この記事はmacOS Monterey 12.2時点で書かれています。

この前は画像にSpotlightコメントを付加したんですけど、

https://qiita.com/rnatori/items/cd9b5ee063320b4dc05f

でもSpotlight検索可能にするだけなら、Tesseractの機能で透明なテキスト入りのPDFに変換することはできるんですよ。そっちにしよっか

# Automator
今回はアプリケーション形式で作ってみましたが、フォルダアクションでも動きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37794/9c24dcd5-aa3c-ecf4-826e-9dce4539e921.png)

#のシェルスクリプト部分

```
export PATH=$PATH:/opt/homebrew/bin:/opt/homebrew/sbin
for f in "$@"
do
	tesseract "$f" "$f" -l jpn+eng pdf
done
```

#どうなるか
画像ファイルをドロップすると（今度は複数でもいい）、元の画像と同じフォルダにPDFがどんどん出来ていきます。全部終わると画像ファイルはゴミ箱に移動されます。ゴミ箱したくなかったらシェルスクリプト以降は不要です。これAutomatorの意味あったかな…まあフォルダアクションにもできるし…

#余談
スキャナから画像をフォルダアクションに渡していた時に気づいたのですが、作成日が未来のファイルはフォルダに入れてもフォルダアクションが作動しません。アプリケーション形式のAutomatorワークフローは問題なく作動します。スキャナが古くて内蔵時計が狂っていたらしい…
文字列をwindowsでフォルダ名に使える文字列に変換するPythonプログラム

#はじめに
Pythonでどこかからとってきた文字列で自動的にフォルダを作成していると、winwowsで使用できないフォルダ名になってしまって、消すのがとても大変になることがあります。
そこでwindowsのディレクトリ名に使えるように名前を変更するプログラムを紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/80066901-6dc3-ed55-e0c5-9cde9601fc4f.png)


#変更する文字

###半角文字
まず、windowsのフォルダで使用できない文字があります。それが以下の文字です。
`\　/　:　*　?　"　<　>　|`
そのため、以下の全角文字に変更します。
`￥　／　：　＊　？　”　＜　＞　｜`

https://www.itc.u-toyama.ac.jp/el/win7/restricted.html

###エスケープシーケンス
上の使用できない半角文字の中に`\`がありましたが、これだけを置き換えると、エスケープシーケンスとしてとらえておらず、おかしくなってしまいます。
例えば、`皆さん\nこんにちは`を変換すると`皆さん￥nこんにちは`というようになってしまします。
しかし、本当にしたいのは、`\n`を削除した`皆さんこんにちは`です。
そこで、エスケープシーケンスを削除します。なお、これは半角文字を置き換える前にやらないといけません。
具体的には、エスケープシーケンスには、以下のものがあります。

http://wisdom.sakura.ne.jp/programming/c/Cdata1.html

https://pg-chain.com/python-escape

|記号|	意味|
|:-:|:-|
|\a	|ベル文字（アラート）|
|\b	|１文字分戻る|
|\f	|ページ送り（クリア）|
|\n	|改行、復帰|
|\r	|同じ行の先頭に戻る|
|\t	|水平タブ|
|\v	|垂直タブ|
|`\\`	|\を表示|
|\?	|?を表示|
|\'	|シングルクォーテーション(')を表示|
|\"	|ダブルクォーテーション(")を表示|
|\0	|ヌル|
|\N	|8進定数（Nは8進数の定数）|
|\xN|	16進定数(Nは16進数の定数）|

これをすべて削除、もしくは置き換えます。
なお、`\N`と`\xN`は変換は諦めます。
`\?`に関しても、ほかのサイトなどを見るとエスケープシーケンスとして処理されていなさそうなので無視します。
また、誰かがよく知らずにバックスラッシュを使用しているとどうしようもないことがあります。例えば、`ここに\appleがあります`という文字列は`\a`が認識されて削除されてしまいます。

###先頭/末尾のドット/空白

先頭/末尾にドット/空白があると、ファイル削除すらできない大変なフォルダができてしまいます。
>というのも多くのアプリケーションによって
「C:\hoge」(末尾にスペースやピリオドがない、ごく普通のフォルダ)
「C:\hoge.」(末尾にピリオドがあるフォルダ)
「C:\hoge 」(末尾にスペースがあるフォルダ)
　なんと、この3つが同じものとして扱われ、不定な名称となります。

https://all.undo.jp/asr/1st/document/01_03.html

そのため削除します。
`strip`関数を使用して削除すると、先頭/末尾の__1文字__しか削除できないので、`while True`でなくなるまで回します。


#プログラム


```rename_for_windows.py
def rename_for_windows(name):
    while True:
        tmp = name
        #半角文字の削除        
        name = name.translate((str.maketrans({'\a':'','\b':'','\f':'','\n':'','\r':'','\t':'','\v':'',"\'":"'",'\"':'"','\0':''})))    
        #エスケープシーケンスを削除
        name = name.translate((str.maketrans({'\\':'￥','/': '／' , ':': '：', '*': '＊', '?': '？', '"': "”", '>': '＞', '<': '＜', '|': '｜'})))
        #先頭/末尾のドットの削除 
        name = name.strip(".")
        #先頭/末尾の半角スペースを削除
        name = name.strip(" ")
        #先頭/末尾の全角スペースを削除
        name = name.strip("　")
        
        if name == tmp:
            break
        
    return name
```




#間違えて作成した消せないフォルダの削除の仕方

ちなみに、間違えて作ってしまった消せないフォルダの削除の仕方は以下のページに書いてあります。



[Microsoft 名前の最後にドットが入った消せないフォルダができてしまいました。](https://answers.microsoft.com/ja-jp/windows/forum/all/windows-10/b3cfbb53-5ede-4fc7-888b-25af16c645c4)

#まとめ
文字列をwindowsでフォルダ名に使える文字列に変換するPythonプログラムを紹介しました。
私自身、スクレイピング時に自動的にフォルダを作っているのですが、この時にフォルダ作成前にこのプログラムを挟むようにしています。
同じことができるライブラリがあればいいのですが...
是非皆さん使って似てください。




#参考

https://qiita.com/kusunamisuna/items/a32679874afedc032158
Powershell 6以降でもGetActiveObject()でExcelを呼ぶ方法

Powershell 6以降、`[System.Runtime.InteropServices.Marshal]::GetActiveObject(progID)`はありません。ですが、作るのは簡単です。

## クロスプラットフォーム化の代償

Windows専用のShellとして誕生したPowershellは、クロスプラットフォーム化してLinuxやMacで動くようになりました。しかしその際、様々な変更や**使用できなくなったAPIがあります。**

https://docs.microsoft.com/ja-jp/powershell/scripting/whats-new/differences-from-windows-powershell?view=powershell-7.2

`[System.Runtime.InteropServices.Marshal]::GetActiveObject`も、使えなくなった機能の一つです。

## 無いなら作ろう`GetActiveObject`

幸い、[stack overfowでGetActiveObjectの中身が分かります。](https://stackoverflow.com/a/65496277)コードが分かれば解決出来たも同然です、Powershellで`Add-Type`を使えばいいのです。

```powershell:GetActiveObject_自作

Add-Type -TypeDefinition @'
using System;
using System.Runtime;
using System.Runtime.InteropServices;
public static class Marshal2
{
    internal const String OLEAUT32 = "oleaut32.dll";
    internal const String OLE32 = "ole32.dll";

    public static Object GetActiveObject(String progID)
    {
        Object obj = null;
        Guid clsid;

        // Call CLSIDFromProgIDEx first then fall back on CLSIDFromProgID if
        // CLSIDFromProgIDEx doesn't exist.
        try
        {
            CLSIDFromProgIDEx(progID, out clsid);
        }
        //            catch
        catch (Exception)
        {
            CLSIDFromProgID(progID, out clsid);
        }

        GetActiveObject(ref clsid, IntPtr.Zero, out obj);
        return obj;
    }

    //[DllImport(Microsoft.Win32.Win32Native.OLE32, PreserveSig = false)]
    [DllImport(OLE32, PreserveSig = false)]
    private static extern void CLSIDFromProgIDEx([MarshalAs(UnmanagedType.LPWStr)] String progId, out Guid clsid);

    //[DllImport(Microsoft.Win32.Win32Native.OLE32, PreserveSig = false)]
    [DllImport(OLE32, PreserveSig = false)]
    private static extern void CLSIDFromProgID([MarshalAs(UnmanagedType.LPWStr)] String progId, out Guid clsid);

    //[DllImport(Microsoft.Win32.Win32Native.OLEAUT32, PreserveSig = false)]
    [DllImport(OLEAUT32, PreserveSig = false)]
    private static extern void GetActiveObject(ref Guid rclsid, IntPtr reserved, [MarshalAs(UnmanagedType.Interface)] out Object ppunk);

}
'@

```

`Marshal2`というクラス名には特に意味はありません。重要なのは中で呼んでいる3つのWindows API関数です。これで、Powershell6以降でも起動済みのExcelを捕まえることができます。

:::note info
`Add-Type`によるC#コード埋め込みは[MSDNにも書いてある](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/add-type?view=powershell-7.2#examples)由緒正しき方法です。
:::

```powershell:使い方はPowershell5.1までのGetActiveObject(progID)と同じ
# 起動済みのExcelのインスタンスを捕まえる
$excel = [Marshal2]::GetActiveObject('Excel.Application')

# 新規作成
$newBook = $excel.Workbooks.Add()

# 値の代入
$newBook.ActiveSheet.Range('A1:B3').Value2 = 10

# ダイアログ無しでブックを閉じる
$excel.ActiveWorkbook.Close($false)

# Excelの修了
$excel.Quit()

# 後始末
Get-Variable | Where-Object Value -is [__ComObject] | Clear-Variable | Remove-Variable
[GC]::Collect()
```

ダイアログが出るとまずい場合はこうすると良いでしょう。

```powershell
$excel.DisplayAlerts = $false
```

`Get-Variable | Where-Object Value -is [__ComObject] | Clear-Variable | Remove-Variable`については[この記事](https://qiita.com/SilkyFowl/items/b4b6271619bd6d3824f7)をご覧ください。
【RSpec】なぜテストを書くのか？

伊藤さんのスライドの中で「テストの品質」についてこう書かれていた。

##テストの役割
1. 安全ネットとしての役割
2. 実装の正しさを証明する役割
3. コードの品質を向上させる役割
4. 省力化ツールとしての役割
5. バグを叩き潰す役割
6. 設計を支援する役割
7. 説明書としての役割


その中でも実際にテストを書いていて、特に実感したものを所感とともに挙げていく。

##その1　バグを叩き潰す役割
バグが起きたときは**修正する前に**テストを書く。

```
修正しちゃんと実装されたらこう動くというテストを書いて落としておく
→バグ改修
→実装が正しければテストがグリーンになる
```

上記の手順でバグ改修を行うことで、目視だけではなく実装として正しく修正されたことの証明にもなる。
（たまに書いたテスト自体が間違っていた場合もある…）


##その2　説明書としての役割
テストは仕様書にもなる。
過去の自分や他の人が書いたコードを読み解くとき、すでに走っているプロジェクトに途中で入って各機能を理解しなくてはいけないときなどにテストを読むことでだいたいを理解するのに役立った。


###おわりに
まだ独学で開発していた頃はテストを書いていなかったため、テストがあることでの安心感など分からなかったが、今となってはテストなしではいられなくなった。「テストなしでバグ改修とか無理！」とまでになった。


##参考

https://speakerdeck.com/jnchito/number-tamarubykaigi01
開成中学2022年第1問(2)「1234567+2345671+3456712+4567123+5671234」を9で割った余り wolframalphaで

wolframalphaでやってみました。
以下、wolframalphaで計算するための入力文字数です。
入力文字数に、改行文字1文字は、カウントしていません。

### 入力文字数:46文字
1234567+2345671+3456712+4567123+5671234  mod 9

https://www.wolframalpha.com/input?i=1234567%2B2345671%2B3456712%2B4567123%2B5671234++mod+9&lang=ja

### 入力文字数:47文字

1234567+2345671+3456712+4567123+5671234を9で割った余り


https://www.wolframalpha.com/input?i=1234567%2B2345671%2B3456712%2B4567123%2B5671234%E3%82%929%E3%81%A7%E5%89%B2%E3%81%A3%E3%81%9F%E4%BD%99%E3%82%8A&lang=ja



### 入力文字数:23文字

https://www.wolframalpha.com/input?i=%281%2B2%2B3%2B4%2B5%2B6%2B7%29*5+mod+9&lang=ja



### 入力文字数:3文字

https://www.wolframalpha.com/input?i=1*5&lang=ja



### 入力文字数:なし

# 小学生なら、1の数を数えて、1個,2個,3個,4個,5個で余り5
2+7=9
3+6=9
4+5=9


https://youtu.be/ypEXmr0aNSo



# ポイント
1から7。0.8,9があっても同じですけど。7で止めてあるのが、絶妙です。
過去問の類題を教えて下さい。

# 参考

(「算数」なので未知数はXとは表示されていない)

https://news.yahoo.co.jp/articles/d8c818950d82697ae8b625570ece4f19f513930c


オンラインで

https://moji.onl.jp/
【Flutter】ios simulatorが認識されない場合の対処方法

Android Studioでやっても、VScodeでやっても、起動しているios simulatorが認識されない！
Androidの端末は認識されてるのに！
という時は、一度flutter doctorコマンドを実行し、なぜ認識できないのか調べます。

```
flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 2.10.1, on macOS 11.6 20G165 darwin-arm, locale
    ja-JP)
[!] Android toolchain - develop for Android devices (Android SDK version
    32.1.0-rc1)
    ✗ cmdline-tools component is missing
      Run `path/to/sdkmanager --install "cmdline-tools;latest"`
      See https://developer.android.com/studio/command-line for more details.
    ✗ Android license status unknown.
      Run `flutter doctor --android-licenses` to accept the SDK licenses.
      See https://flutter.dev/docs/get-started/install/macos#android-setup for
      more details.
[!] Xcode - develop for iOS and macOS
    ✗ Xcode installation is incomplete; a full installation is necessary for iOS
      development.
      Download at: https://developer.apple.com/xcode/download/
      Or install Xcode via the App Store.
      Once installed, run:
        sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
        sudo xcodebuild -runFirstLaunch
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.1)
[✓] VS Code (version 1.63.2)
[✓] Connected device (1 available)
[✓] HTTP Host Availability
```
自分の場合、このような感じになりました。
どうやら、Xcodeのところの一番下にある、このセットアップを行わないといけないようです。

```
$sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
$sudo xcodebuild -runFirstLaunch
```
では、実際にセットアップをしていきます。
まずは、このコードをターミナルで実行します。

```
$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
```
その後、このコードをターミナルで実行し、読み進めていき、「agree」を入力したら終了です。

```
$ sudo xcodebuild -license
```
これで無事にios simulatorが認識されました。
もし困っている方がいらっしゃいましたら、是非お試しください。
![スクリーンショット 2022-02-14 19.51.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1150411/e1638a6d-68c5-a5e7-3a0f-7742cfa0eb6a.png)
Macのzshを改造する

Homebrewでzsh関連インストール

```shell:terminal
brew update
brew install zsh
brew install zsh-completions
brew install zsh-autosuggestions
brew install zsh-syntax-highlighting
```

zshをデフォルトに設定

```shell:terminal
chsh -s /bin/zsh
```


.zshrcに以下追加

```shell:.zshrc
path=(/path/to/homebrew/share/zsh-completions $fpath)

autoload -U compinit
compinit -u

source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source /usr/local/share/zsh-autosuggestions/zsh-autosuggestions.zsh
```

ターミナルを開くたびに聞かれる。

> zsh compinit: insecure directories, run compaudit for list. Ignore insecure directories and continue [y] or abort compinit [n]?

以下のコマンドで出てくるパスを出力する。

```sh:terminal
compaudit
```

出力されたパスに対して権限変更する。

```sh:terminal
chmod 755 /usr/local/share
chmod 755 /usr/local/share/zsh
chmod 755 /usr/local/share/zsh/site-functions
```

以上
スコープの種類を理解する

Webアプリケーションのスコープに関する解説記事です。

## はじめに
webアプリケーションの勉強をはじめてすぐの方をターゲットにしています。
* よく耳にするセッションとはどういうものか
* セッションを含む、スコープとは何か
上記を知るためのとっかかりとしてください。

## 1. スコープ概要
&emsp;スコープとはインスタンスを保存できる領域のことです。
int型やdouble型など基本データ型変数はスコープに保存できません。
スコープには3種類あり、保存できる領域の広さ（有効期限）によって区別されます。

## 2. スコープの種類
・リクエストスコープ
　　→レスポンスが返されるまで利用できる
・セッションスコープ
　　→リクエストをまたいで利用可能
　　　有効期限は開発者が決めることができる
・アプリケーションスコープ
　　→Webアプリケーションが終了するまで利用できる
　　　最も有効範囲が広く、アクセスしている全員が共有できる

## 3. 利用方法
### **リクエストスコープ**
リクエストスコープとはHttpServletRequestのメソッドを使用するということです。
 ・リクエストスコープに保存する
 &emsp; reqest.setAttribute("属性名",インスタンス)
 &emsp;※第1引数：String型、第2引数：Object型
 ・リクエストスコープからインスタンスを取得する
&emsp; インスタンスの型 変数名 = (インスタンスの型)reqest.getAttribute("属性名") 
### **セッションスコープ**
セッションスコープはHttpSessionのメソッドを使用するということです。
・セッションスコープの取得
 &emsp; HttpSession session = request.getSession();
 ・セッションスコープに保存する
 &emsp; session.setAttribute("属性名",インスタンス)
 ・セッションスコープからインスタンスを取得する
&emsp; インスタンスの型 変数名 = (インスタンスの型)session.getAttribute("属性名") 
 ・セッションスコープからインスタンスを削除する
&emsp; session.removeAttribute("属性名")
### **アプリケーションスコープ**
アプリケーションスコープはServletContextインスタンスです。
・アプリケーションスコープの取得
 &emsp; ServletContext application = getServletContext();
 ・アプリケーションスコープに保存する
 &emsp; application.setAttribute("属性名",インスタンス)
 ・アプリケーションスコープからインスタンスを取得する
&emsp; インスタンスの型 変数名 = (インスタンスの型)application.getAttribute("属性名") 
 ・アプリケーションスコープからインスタンスを削除する
&emsp; application.removeAttribute("属性名")

## さいごに
セッションスコープであるHttpSeeeionインスタンスはブラウザから使われなくなってもすぐにガベージコレクションの対象にならず消滅しません。
そのため多用しすぎるとメモリ不足になってしまうことがあります。
そこでセッションスコープを破棄することでインスタンスを削除するメソッドがあり、セッションスコープに保存している全てのインスタンスが消滅します。
　session.invalidate(); 
ＥＣサイトでのログアウト時などに使用されます。

本記事では解説を省きましたが、ページスコープと呼ばれるものがJSPにあります。
そのページ単体でのみ使用され、最も有効範囲が狭いスコープです。

### 参考
(1) 志賀澄人 スッキリわかるサーブレット＆JSP入門 株式会社インプレス 2019
(2) FUJITSU 人材育成・研修サービス　プログラマー育成コース for Java
https://www.fujitsu.com/jp/group/fap/services/java-education-kc/course/technology/web-apl/06-jsp/
Elasticsearch ってなに？

## 勉強前イメージ

んーサーチっていうくらいやからなにか調べるやつなんかね？

## 調査

### Elasticsearch とは

Elastic社が提供している、大容量データを扱うことを想定した全文検索エンジンでログの解析などに特化しています。
Apacheライセンスの下で公開されている、オープンソースのソフトウェアになります。
Elastic Stackというプロダクト軍の一部で心臓部分の検索・分析エンジンになります。
Elasticsearchを利用すると、大容量のデータからIPアドレスなどでユーザを特定したりすることが出来ます。

### Elasticsearch の特徴

- スケーラビリティ

サーバを追加することで、システムを拡張し大規模なシステムを構築できます。
最初は小さく作ってアクセスが増えてきたときに拡張するという方法が取れます。

- ハイアベイラビリティ

クラスタを構成して、その内の一つが壊れて停止してもサービスを継続できます。
データを維持したまま冗長化を行うことが可能です。

- 分散構成

↑で書いたように、クラスタを構成しデータを分散できる。
またデータの冗長化も可能。

- Restful API

検索や登録はAPIを通じて行い、APIはRestful APIの形式です。

## 勉強後イメージ

サーバ上に構築する検索エンジンって感じかな？
あまり検索エンジン自体が身近じゃないからピンとこなかったけど、
DBのクラスタ構成に近い感じのような気がする。

## 参考

- [Elasticsearchとは](https://www.designet.co.jp/faq/term/?id=RWxhc3RpY3NlYXJjaA)
- [Elasticsearch](https://e-words.jp/w/Elasticsearch.html)
認可に関するチェックマトリクス

仮定：権限A　権限Bが存在する場合

閲覧可能: o
閲覧不可能: x

||権限Aユーザ|権限Bユーザ|未認証|管理者|
|--|--|--|--|--|
|Aコンテンツ|o|x|x|o|
|Bコンテンツ|x|o|x|o|
|パブリックコンテンツ|o|o|o|o|
|管理画面|x|x|x|o|
Burp intruderの設定のコピー

Burpでintruderの設定を別のintruderにコピーすることができる。
そのやり方を説明する

Intruder > Copy attack config > With payload positions

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2306409/35826c18-d798-dcb8-cf6e-677c76576be6.png)

※無償版では不可能
Apache EChartsを使ってグラフを書いてみる！ ~1日10行コーディング~

## 概要

### 1日10行コーディングとは

まず、1日10行コーディングというのは、1日10行でいいから新しいコード書こうよって感じのやつです(雑)
(1日1記事とか1機能とかだと続かない気がしてしまってる...)

### 実装するもの

とあるソシャゲのイベント走った記録とかができるサービスを作りたい。

今日はその１つの機能のグラフ表示部分を作ってみたいと思う。

## 手順

1. echartsのjsファイルをダウンロード
https://www.jsdelivr.com/package/npm/echarts?path=dist
こちらのページのdist配下のecharts.jsを保存する。

2. HTMLを記述
下記は公式にあるものを参考に記載

    ```html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="echarts.js"></script>
        <title>グラフ</title>
    </head>
    <body>
        <div id="main" style="width: 800px;height:400px;"></div>
    </body>
    </html>
    ```
上記のようにheadタグで1.で保存したecharts.jsを読み込むように定義して、グラフを表示したいエリアをdivで定義する。

3. JSでグラフの描画を記述

    ```javascript

    // Initialize the echarts instance based on the prepared dom
    var myChart = echarts.init(document.getElementById('main'));

    // Specify the configuration items and data for the chart
    var option = {
    title: {
        text: 'ECharts Getting Started Example'
    },
    tooltip: {},
    legend: {
        data: ['sales']
    },
    xAxis: {
        data: ['Shirts', 'Cardigans', 'Chiffons', 'Pants', 'Heels', 'Socks']
    },
    yAxis: {},
    series: [
        {
        name: 'sales',
        type: 'bar',
        data: [5, 20, 36, 10, 10, 20]
        }
    ]
    };

    // Display the chart using the configuration items and data just specified.
    myChart.setOption(option);
    ```

4. 開いてみる
    ![スクリーンショット 2022-02-14 19.05.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/19e224ed-2ccb-f840-4c8f-18d1f3d413ed.png)
上のタイトル部分とラベル部分がかぶってるが一旦表示はできた。

5. かぶらないように修正
場所がかぶってるのはwidthの値のせいだったから

    ````html
    <div id="main" style="width: 800px;height:400px;"></div>
    ````
こうすることで解消。

6. 棒グラフにする
棒グラフにはオプション変えるだけでできた

    ````js
        // Initialize the echarts instance based on the prepared dom
        var myChart = echarts.init(document.getElementById('main'));
  
        // Specify the configuration items and data for the chart
        var option = {
          title: {
            text: 'ECharts Getting Started Example'
          },
          tooltip: {
            trigger: 'item'
          },
          legend: {
            data: ['sales']
          },
          xAxis: {
            data: ['1/11', '1/12', '1/13', '1/14', '1/15', '1/16']
          },
          yAxis: {},
          series: [
            {
              name: 'sales',
              type: 'line',
              data: [1000, 2000, 3000, 3000, 5000, 6000]
            }
          ]
        };
  
        // Display the chart using the configuration items and data just specified.
        myChart.setOption(option);
    ````
    ![スクリーンショット 2022-02-14 19.26.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/faafdd9e-fc3f-0151-896c-f7235896fd61.png)

棒グラフできた！！
以上！！
Chromeの恐竜ゲームをスクロールで再現してみた

# Chromeの恐竜ゲームとは

オフライン時にChromeブラウザで遊べるミニゲームです
![スクリーンショット 2022-02-14 17.35.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478226/24d168da-e51e-f182-54d5-a518f1a80cd3.png)

# 完成したもの

![dinogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478226/a576725c-ce22-8dbf-40b7-403e84dfda74.gif)

ページのスクロールに応じて恐竜が走ります
※ブラウザサイズによって挙動がちょっと不安定かもです🙇‍♂️
https://git-gen.github.io/dino_scroll.html

# 作り方

## cssでドット絵を用意する

恐竜・サボテン・雲のcssを用意します
cssでドット絵を描く方法は単純で、
基準とした要素に擬似要素のbox-shadowを使ってひたすらドットを打ちます
ソースコード見て頂けるとわかると思うのですが、結構面倒なんでエクセルとか使うと楽です

（例）■■□■
```scss
.dinosaur {
  position: relative;
  width: 40px;
  height: 10px;

  &::before {
    content: '';
    position: absolute;
    width: 10px;
    height: 10px;
    transform: scale(0.3, 0.3);
	  box-shadow:
            0 0 $black,
            10px 0 $black,
            30px 0 $black;
  }
}
```

## レイヤーを分けてパララックスを活用する

レイヤー要素をキャラクター・背景・地面と分ける事で、キャラクターが前進しているしている様に見せます

- game_layer
    - 恐竜とUIなど
    - 画面固定
- cloud_layer
    - 雲
    - 遅くスクロールする
- map_layer
    - 地面・サボテン
    - 速くスクロールする

## アニメーションを付与する

アニメーションの付与にはjsの「GSAP」というライブラリを使用します
scrollTriggerという機能をつかいアニメーションをつけるのですが、
GSAPの使用方法はざっくりとしか書いてません
詳しく知りたい方は公式の方を見ていただけると！
https://greensock.com/docs/

### 横スクロール

縦スクロールを横スクロールに変換します
まずアニメーションにはxPercentを使用します
xPercentはX軸方向に要素を動かすアニメーションです
次に重要なのはpinというオプションで、
これをtrueにするとアニメーション実行中は要素が画面に固定されます

```js
// 背景のスクロール
gsap.to(".map_layer", {
  xPercent: -100,
  ease: "none",
  scrollTrigger: {
    trigger: ".container",
    pin: true,
    scrub: 1,
    start: "top top",
    end: "+2000",
    onUpdate: () => {
      dino_run();
    }
  }
});

// 雲のスクロール
gsap.to(".cloud_layer", {
  xPercent: -40,
  ease: "none",
  scrollTrigger: {
    trigger: ".container",
    pin: true,
    scrub: 1,
    start: "top top",
    end: "+2000",
  }
});
```

### 恐竜のアニメーション

恐竜がサボテンをジャンプで避けるアニメーションをつけます
実際には恐竜がその場で跳ねているアニメーションをつけます
gsap.toで恐竜が跳ねてgsap.fromToで恐竜が元の位置に戻ると行った感じ
toggleClassを使うとアニメーション実行中に対象要素にclassを付与する事もできます

```js
gsap.to(".dinosaur", {
  y: -130,
  ease: "Power3.inOut",
  scrollTrigger: {
    trigger: ".game_layer",
    scrub: 1,
    start: "+250",
    end : "+300",
    toggleClass: {
      targets: ".dinosaur",
      className: "jump"
    },
  }
});
gsap.fromTo(".dinosaur", {
    y: -130,
  },
  {
    y: 0,
    ease: "Power3.inOut",
    scrollTrigger: {
      trigger: ".game_layer",
      scrub: 1,
      start: "+300",
      end: "+350",
      toggleClass: {
        targets: ".dinosaur",
        className: "jump"
      },
    }
  }
);
```

### その他

その他に恐竜の足をバタつきやゲームオーバーの表記はGSAPからのコールバックで行っています
使ったのはこちら

- onComplete
    - アニメーションが完了した際に呼び出される
- onUpdate
    - アニメーションが更新される度に呼び出される

# github

上記の手順で完成です！
github pagesのソースはこちらになります

https://github.com/git-gen/git-gen.github.io
Dockerでファイルの読み取りがフリーズする

## 事象

DockerのVolumeでホストと共有しているファイルを削除する、リネームする（あるいは編集だけでも？）と、フリーズ、あるいは読み取りがロックされているかのような挙動が発生する（下記参照）。

- ブラウザから当該ファイルを取得しようとすると、そのファイルがずっとpendingになって取得できない。
- コンテナの中に入って当該ファイルを確認しようとしても、そのファイルがあるディレクトリでlsコマンドを打つと結果がずっと返ってこない。
- docker-compose downなどしても、結果が返ってこずタイムアウトする。
- Dockerを再起動する以外に解決方法はない。

環境はこんな感じ。

- macOS Big Sur 11.5.1
- Docker Desktop 4.5.0

## 対策

原因はさっぱりですが・・・Docker DesktopのPreferences→Generalで、「Use gRPC FUSE for file sharing」のチェックを入れると治ります。
cookieのExpires, Max-age属性を省略した場合の動作

cookieのexpiresとmax-age属性はcookieの有効期限を指定する属性だ。
これらを省略した場合の動作はどうなるのか

どうやらセッションクッキーとなるようだ

https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Set-Cookie

> Expires=<date> 省略可
クッキーの有効期限で、 HTTP の日時タイムスタンプです。詳細な書式は Date を参照してください。

> 指定されなかった場合は、クッキーはセッションクッキーの寿命になります。セッションはクライアントが終了したときに終了するので、セッションクッキーはその時点で削除されます。

> Max-Age=<number> 省略可
> クッキーの期限までの秒数です。ゼロまたは負の数値の場合は、クッキーは直ちに期限切れになります。 Expires および Max-Age の両方が設
VSCodeのRemoteSSH先にてcodeコマンドが使えない場合の一対処

# 概要
VSCodeにてGCP上のインスタンスにて開発環境を構築しているので、VSCodeのRemoteSSHを用いてGCP上のインスタンスに接続して、開発作業を行なっている者だ。今回、codeコマンドがある日突然RemoteSSH先のVSCodeにて使用できなくなったので、その対処法を下記に示す。ざっと調べた限りでは、クリティカルな解決方法はなかったので備忘録的に記載する。尚、筆者はzshを用いてる。

# 事象
RemoteSSH先のVSCodeのTerminalにて下記の事象が発生した。

```zsh
$ code
zsh: command not found: code
```

# 原因
`/home/{USER_NAME}/.vscode-server/bin/{COMMIT}/bin` にPATHが通っているのが通常の状態なのだが、その配下に`code`が存在しないため、not foundになる。では、どこに`code` が存在しているかというと、`/home/{USER_NAME}/.vscode-server/bin/{COMMIT}/bin
/remote-cli/`である。どうやら配置が変わったのかわからないが、PATHが通ってないだけなら話が早い

```zsh
$ echo $PATH | grep vscode
PATH={OTHER_PATHs}:/home/{USER_NAME}/.vscode-server/bin/{COMMIT}/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/usr/local/go/bin

$ pwd
/home/{USER_NAME}/.vscode-server/bin/{COMMIT}/bin

$ tree
.
├── code-server
├── helpers
│   └── browser.sh
└── remote-cli
    └── code
```

# 解決
下記を.zshrcに追加する(bashなら.bash_profileやら.bashrcやらに)ことで、PATHを`remote-cli`まで通してあげれば良い

```zsh
# vscode
if [[ ! -z VSCODE_IPC_HOOK_CLI ]]; then
	for i in $(ls ~/.vscode-server/bin); do
		export PATH=$HOME/.vscode-server/bin/$i/bin/remote-cli:$PATH
	done
fi
```
【vue-cli+Vuetify】HTML要素の横スクロールバーを上下に表示する

# やりたいこと
vue-cli＋Vuetify環境下にて、
HTML要素の横スクロールバーを下部だけでなく上部にも表示したい。

# 完成品
![横スクロール上下.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198171/486021a7-3c29-8844-1d1c-3be6c9be17be.gif)
ここでのスタイルはなるべく最低限にしています。

# 実現方法
以下の通りに実装しました。※下述の参考記事から発想を得ました。

1. 横スクロールバーをつけたいHTML要素（以下、「コンテンツ」）に
   CSSで下部の横スクロールバーを表示させる
2. コンテンツの上に新しいブロック要素を追加し、
   [1]と同様にCSSで下部の横スクロールバーを表示させる
3. コンテンツと[2]で追加した要素のスクロールイベントを
   Vuetifyの v-scroll.self で拾う
4. コンテンツと[2]で追加した要素の element.scrollLeft を
   [3]のイベント内で同期させる

## template
```vuejs
<template>
  <div>
    <!-- 横スクロールバー上 -->
    <div id="topbar" class="scroll-x-topbar" v-scroll.self="onScrollXTopBar">
      <div class="inner-topbar"></div>
    </div>

    <!-- コンテンツ ＋ 横スクロールバー下 -->
    <div id="content" class="scroll-x-content" v-scroll.self="onScrollXContent">
      <div class="inner-content">
        これはサンプルです。これはサンプルです。これはサンプルです。これはサンプルです。これはサンプルです。これはサンプルです。これはサンプルです。これはサンプルです。これはサンプルです。これはサンプルです。これはサンプルです。これはサンプルです。
      </div>
    </div>
  </div>
</template>
```
## script
```javascript
export default {
  methods: {
    onScrollXTopBar(e) {
      document.getElementById("content").scrollTo(e.target.scrollLeft, 0);
    },
    onScrollXContent(e) {
      document.getElementById("topbar").scrollTo(e.target.scrollLeft, 0);
    },
  },
};
```
## style
```scss
.scroll-x-topbar {
  overflow-y: hidden;
  overflow-x: scroll;
  width: 500px;
  height: 10px;
}
.scroll-x-content {
  overflow-y: hidden;
  overflow-x: scroll;
  width: 500px;
}
.inner-topbar {
  width: 1000px;
  height: 1px;
}
.inner-content {
  width: 1000px;
  background-color: lightskyblue;
}
```

# 参考記事
以下の記事を類似の一例として参考にさせていただきました。ありがとうございました。

https://dev.classmethod.jp/articles/css_scrollbar_adjustment/

https://qiita.com/kuro-wassan/items/86b6a24787116797a5d0
Burp プロジェクトのオプションのみを保存する方法

Burpのプロジェクトのオプションのみを保存できる方法を紹介する

１Project > Project options > Save Project options

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2306409/eafbf314-6e00-d27d-14b4-7040f4910619.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2306409/3ceddeb6-d62a-c502-2590-c2f80875c288.png)
AWS Lambda (Node.js) 上で discord.js を使おうとしてつまずいた

2023/11/14 追記しました。

# 何につまずいたのか
ざっくり言うと、 Node.js で記載した AWS Lambda の関数上で最新版の [discord.js](https://discord.js.org/) を使おうとしたら使えなかった。

# なぜ使えなかったのか
[AWS Lambda で使える Node.js のバージョン](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html)が現状 (2022/2/14) v14 系までなのに対し、[最新版の discord.js は v16.6.0 以上でしか動かない](https://discord.js.org/#/docs/discord.js/stable/general/welcome)。

# 現状の打開策
どうしても使いたいなら古いバージョンの discord.js （ [12.5.3](https://www.npmjs.com/package/discord.js/v/12.5.3) がギリギリ Node.js v14 系に対応している模様）を使うしかない。ただし、**非推奨になっているのでオススメはできない。**しっかり対策したいなら他のライブラリを探すか、AWS Lambda が Node.js v16 系に対応するのを待つしかなさそう・・・。

# その後
時は流れ 2023 年 11 月。今や AWS Lambda は v18 をサポートするまでに至りました。 Discord.js も Node.js v16.11.0 以上でいいので、もう怖くないね。
Go言語_Slice

# Go言語 Slice

## The Go Blog 『[Arrays, slices (and strings): The mechanics of 'append'](https://go.dev/blog/slices)』から

>Arrays have their place—they are a good representation of a transformation matrix for instance—but their most common purpose in Go is to hold storage for a slice.

Go言語における配列の最も共通する目的はスライスのストレージを保持するため

>A slice is a data structure describing a contiguous section of an array stored separately from the slice variable itself. A slice is not an array. A slice describes a piece of an array.

スライスはスライス自体の変数とは別に保存されている配列の連続するするデータ構造の事です。スライスは配列ではありません、スライスは配列の一部を表現しています。
【初心者による初心者のためのLaravel0章】 ~Laravelとは~

# 概要
ここでは、laravel初心者である私が初心者ながらlaravelの基本について、アウトプットもかねてまとめていこうと思います。しかし、初心者だからこそ、初心者の方にとってはわかりやすいと思える説明ができるてるかもしれません！！
とっても簡単にまとめることを心がけているので、是非ご拝読お願いします！！

# Laravelとは
始めに結論から述べていきます。
<h6>laravelは、「PHPのフレームワークの一つ」です!</h6>

終わっちゃった。。。。

ただ重要であり、ほとんどの初心者が知りたいのは、
**「フレームワークって何？？」**
**「laravelの特徴は何??」**
ってことだと思います。

次にそれらについてまとめていこうと思います。

#フレームワークとは（読み切れば100%掴めます）
またまた結論から述べていきます。
<h6>フレームワークは、「開発を楽チンにしてくれるもの」です！</h6>

いやぁ、、、意味わっかんねぇっす！！💢💢

ってことで、もう少しだけ楽チンにフレームワークをまとめましょう。

**フレームワークは、開発でよく使われる機能が最初からモリモリに詰め込まれているチョーチョー便利なものです。**
それに加えて、仕組みが備わっています。仕組みというか流れというかルールですかね。（ここはlaravelの特徴で下でまとめます）
そのルールに従いながら、元々詰め込まれた機能たちを使って自分なりに手を加えてアレンジしていくといったことができます。
**PHPだけで全てをゼロから作るより数段お得**ですよね！！！！！

例えば、人間には手・足があります。これはもともと備わった人間のフレーム（土台・構造）です。この土台に対して、手を振る機能や殴る機能や拍手機能、走る機能や蹴っ飛ばす機能を独自に盛り込んでいくことで人間というものに磨きをかけ、人間らしくなっていきます。人間のフレーム（土台）がなければ、手足を手に入れるところから始めなければ、走る機能などは手に入れられません。少し過激的になってしまい申し訳ないです、、、。
プログラミングでいうところのフレームワークも同じです。**そもそも土台がなければ、その土台を作るところから始めなければなりません。**フレームワークはそんな土台を提供してくれ、さらに機能までも用意してくれているんです、先人たちは凄すぎますね。。。。

実際にlaravelに元々備わっている「認証機能」というものを少しだけ紹介します。
私たちが普段よく使うログイン画面とかありますよね。
「メールアドレスを入力して、パスワードを入力して、新規登録やログイン、ログアウトができる。」
これが認証機能です！
この機能が欲しくて作りたくて使いたくてしかたない方、朗報です。laravelには元々その機能が備わっています。
認証機能使いま〜す宣言をして、あとはルールに従ってアレンジしたら出来上がりです💖（これは簡単に言い過ぎですけど、、、、）

他にも、DBを直感的に操作できるようにしてくれていたり、view(見た目)部分をめっちゃ作りやすくしてくれているbladeを提供してくれていたりと、このように**とにかく開発をより楽に正確に作れる機能がモリモリ詰め込まれたものがフレームワークです！！**

#laravelの特徴
またまたまたまた結論からです。
laravelの大きな特徴は、、、

**1.MVCモデル**
**2.学習コストが低い**
**3.Bladeの存在**

です！！！！！
順にまとめていきます。

**1.MVCモデルとは**
これは開発設計の一つなのですが、そんな難しいことは今はいいんです。
M(Model)、V（view）、C（Controoler）の三つを合体させた者がMVCですが、それぞれに役割が備わっており、それらが連携することによってプログラムが機能します。**これが上記の「laravelとは」であげた"ルール"に該当します。**
ここではMVCの説明は簡単にしますが、
M(model)はDB情報を担当します。
V（view）は見た目・ユーザーに見せる部分を担当します。
C（controller）はMとVの橋渡し的担当の頑張り屋です。MVCの心臓かもしれません。

この三つを理解することがlaravelを理解することだと思います。
このMVCパターンのルールに従い、記述することがlaravelの大きな特徴の一つといえますね！！

**2.学習コストが低い**
laravelは他のフレームワークと比べて学習コストが低いです。
その理由として、**「文献が多いこと」**が挙げられます。
laravelは公式ドキュメントがしっかりしており、なおかつ世界的に見ても利用者が多いフレームワークです。その分、ネットに転がっているlaravelの情報量もまた非常に充実しています。そのため、初めてPHPフレームワークを触るならばlaravelだと言われています。
ちなみにこれめちゃめちゃ重要なことですよね。。
「わからない→調べる→できない→また調べる→できたっっっ！✨✨」
を繰り返すプログラミングにおいて文献が少ないというのは絶望的ですよね、、特に初心者なら、、、。


**3.Bladeの存在**
これに関してはBladeの凄さが与ーーーーくわかる記事がありましたので是非見てほしいです！
[【Laravel入門】ビューとBladeと継承](https://qiita.com/yukibe/items/86ccd3f72ecf943825a6)


<h1>おわりに</h1>
初心者なりにlaravelとは一体どんなものなのかをざっくりまとめてみましたが、まだまだわからないところばかりなので、間違っている箇所などありましたら、是非ご指摘お願いします！
100日でSQLの達人になる@LeetCode! Day14 <複数列同じ値が続く列を見つけるロジック>

## 603. Consecutive Available Seats （問題レベル: Easy）要課金
今日の問題はこれ。
一列に並んだ座席のうち連続で空いている座席をリストアップするという問題。

この問題はSQLの文法というよりは、ロジックの問題。
最初は`not in`を使う方法を考えていたが、Discussをみて`in句`を使う方がずっとシンプルなことに気がついた。
解法は色々あるが最終的には下記回答が自分としては一番しっくり来た。

```
select seat_id
from cinema
where seat_id in (
　　　　select a.seat_id from cinema a, cinema b where (abs(a.seat_id - b.seat_id) =1 and a.free=1 and b.free=1))
order by seat_id asc
```

今回のポイントは「複数列同じ値が続く列を見つけるロジック」だった。
何とか２週間続いています。

* [LeetCode](https://leetcode.com/)の問題は、MS SQL Serverで解いています。
Burpのtargetにワイルドカードを利用する

burpのtargetには一見、固定文字列しか指定できないような雰囲気があるが、以下のような手順で正規表現を利用できる。

１ 対象ターゲットの選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2306409/b01b47dc-a918-7e0f-f659-995d7b50bb11.png)

２ 「Use advanced scope control」にチェックを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2306409/49423e53-3b0b-e7b7-8d84-8eea2d77d719.png)

３ 「Add」を選択

４ 正規表現を利用できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2306409/bed5e2e5-3b59-c9d4-ccaa-47d5d6cbeb31.png)
Burp intruderのリクエスト時間確認方法

Burpのintruder実行時にリクエストに掛かった時間を確認した場合以下のように確認する。

Columns > Response received

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2306409/43d70ab3-1d84-3f30-bb7a-cc7ab2c8d84d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2306409/fe1d01c2-a220-dc9a-8ca7-a9152b92fedb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2306409/df85538e-7281-8552-2f2f-a9e20f6df9f4.png)
AWS CLIの振り返り ~CloudFront入門編~

#本記事の目的
JAWS-UG CLI オンラインハンズオンの復習として、ハンズオンで取り上げられたAWSサービスに関する用語と、使用したAWS CLI コマンドを箇条書きでまとめる。
今回はCloudFront入門編を取り上げる。

#主なAWSサービス用語
####オリジンサーバー
オリジナルとして定めたオブジェクトを保存するコンテンツサーバ。リージョンに存在するS3バケット等を設定できる。

####エッジサーバ
オリジンサーバのオブジェクトをコピーし、様々な場所から配信するキャッシュサーバ。エッジロケーションに存在する。

####ディストリビューション
オリジンサーバ及びエッジサーバにおけるコンテンツ配信設定の単位。

####デフォルトルートオブジェクト
ディストリビューションのルートURLにアクセスした際に表示されるオブジェクト。

####ETag
HTTPにおけるレスポンスヘッダの1つ。ETagを使用する事で、HTTPにおけるキャッシュの有効性を確認できる。


#主なAWS CLI コマンド一覧
####CloudFrontディストリビューションの作成
```
aws cloudfront create-distribution \
  --origin-domain-name "${CLOUDFRONT_ORIGIN_DOMAIN_NAME}" \
  --default-root-object ${CLOUDFRONT_DISTRIBUTION_DEFAULT_ROOT_OBJECT}
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|--origin-domain-name|オリジンドメイン名|任意||
|--default-root-object|デフォルトルートオブジェクト名|任意||

####CloudFrontディストリビューションの付加
```
aws cloudfront tag-resource \
  --resource ${CLOUDFRONT_TAG_RESOURCE} \
  --tags "${STRING_CLOUDFRONT_TAGS}"
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|--resource|タグ対象リソース(ARN)|必須|引数の例：`Items=[{Key=<タグのキー名>,Value=<タグの値>}]`|
|--tags|タグ文字列|必須||

####CloudFrontディストリビューションの一覧表示
```
aws cloudfront list-distributions
```

####CloudFrontディストリビューションのタグ別一覧表示
```
aws cloudfront list-tags-for-resource \
  --resource ${CLOUDFRONT_TAG_RESOURCE}
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|--resource|タグ対象リソース(ARN)|必須||
※list-distributionsコマンドではタグ表示ができない。そのため、代わりに全てのディストリビューションに対してlist-tags-for-resourceコマンドを使用する事で、タグの有無を確認する。

####CloudFrontディストリビューションの詳細表示
```
aws cloudfront get-distribution \
 　--id ${CLOUDFRONT_DISTRIBUTION_ID}
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|--id|ディストリビューションID|必須||

####CloudFrontディストリビューションの詳細設定表示
```
aws cloudfront get-distribution-config \
  --id ${CLOUDFRONT_DISTRIBUTION_ID}
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|--id|ディストリビューションID|必須||

####CloudFrontディストリビューションの更新
```
aws cloudfront update-distribution \
  --id ${CLOUDFRONT_DISTRIBUTION_ID}
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|--id|ディストリビューションID|必須||

####CloudFrontディストリビューションの削除
```
aws cloudfront delete-distribution \
  --id ${CLOUDFRONT_DISTRIBUTION_ID} \
  --if-match ${CLOUDFRONT_ETAG}
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|--id|ディストリビューションID|必須||
|--if-match|ETag|任意||

####CloudFrontキャッシュ無効化の作成
```
aws cloudfront create-invalidation \
  --distribution-id ${CLOUDFRONT_DISTRIBUTION_ID} \
  --paths ${CLOUDFRONT_PATHS}
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|--distribution-id|ディストリビューションID|必須||
|--paths|キャッシュ無効化対象オブジェクトパス|任意||

####CloudFrontキャッシュ無効化の一覧表示
```
aws cloudfront list-invalidations \
    --distribution-id ${CLOUDFRONT_DISTRIBUTION_ID} 
```
|オプション|引数|必須/任意|備考|
|---|---|---|---|
|--distribution-id|ディストリビューションID|必須||


#参考文献
- AWSCLIコマンドリファレンス:[cloudfront](https://docs.aws.amazon.com/cli/latest/reference/cloudfront/index.html)
- JAWS-UG CLI専門支部：[ハンズオン(簡易版): CloudFront入門](http://prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com/handson_light-aws_service/handson_light-aws_service-cloudfront-novice/index.html)
【コード付き】Twitter bot開発の資料共有（botを使ったお小遣い稼ぎの事例も紹介）

![eyecatch-for-twitter-bot-seminar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289248/1c5a6980-baac-4a5b-b10f-0725e5845e7d.png)

この度、Twitter bot開発に興味ある人向けの解説資料を作りました^^

サンプルコードも用意しているので、

**「解説記事だけでなく、実際に動くコードも参考にしながら手を動かして、オリジナルのTwitter botを作りたい」**

という方は、ぜひこちらの解説資料がお役に立てば幸いです^^
↓
https://tsuyoshi.notion.site/Twitter-bot-e5c4e114e3dc4447b55bc0567fcfbe1a

<br/>

また、こちらの資料を読んでいただくとわかると思いますが、後半の方では、Twitter botを使った**お小遣い稼ぎ**の事例も紹介しています。


何も結果が出ないプログラミング学習を続けるより、「お小遣い稼ぎ」のように、何かインセンティブがあるプログラミング学習の方が**挫折せずに続けられる**かなと思うので、事例を紹介することにしました^^


- Twitter bot開発に興味がある
- Twitter botを使ったお小遣い稼ぎの事例を知りたい


といった方は、少しでもこちらの資料が参考になれば幸いです^^
↓
https://tsuyoshi.notion.site/Twitter-bot-e5c4e114e3dc4447b55bc0567fcfbe1a
順列計算

プログラミングスキルチェックの問題を解く際に順列計算を行う場面が多くなった。
以下の記事を参考にさせていただきgolangで実装してみました。
 [順列の全探索をするプログラム（競技プログラミング向け）](https://qiita.com/suzuki-navi/items/a80677a0747232843957)
@suzuki-navi　様ありがとうございます。
備忘録目的です。

```go
type Cat struct {
    id int
    eat_time int
    fuman int
}
(中略）

    //呼び出し側
    cats:=make([]Cat, N)
    ・・・中略：配列へのメンバ設定・・・
    cat_len:=len(cats)
    pat:=1
    for {
        sb:=""
        i:=0
        for i=0;i<cat_len;i++ {
            sb+=fmt.Sprintf(" %d", cats[i]);
        }
        fmt.Printf("pattern %d\n",pat);
        fmt.Println(sb);
        
        if !nextPermutation(cats) {
          break
        }
        pat++
    }
(中略）

//順列を求める関数
//ここではStruct（Cat型）のSliceをidをキーに順列を求めています。
func nextPermutation(arr []Cat) bool {
    len:=len(arr)
    left:=len-2
    
    for left >= 0 && arr[left].id >= arr[left+1].id {
        left--
    }
    if left < 0 {
        return false
    }
    right:=len-1
    for arr[left].id >= arr[right].id {
        right--
    }
    t:=arr[left]
    arr[left]=arr[right]
    arr[right]=t
    left++
    right=len-1
    for left < right {
        t:=arr[left]
        arr[left]=arr[right]
        arr[right]=t
        left++
        right--
    }
    return true;
}
```
nvimでcocをセットアップする


## coc
- https://github.com/neoclide/coc.nvim
- vimをIDE化させるプラグイン

## セッティング

```~/.config/nvim/init.vim
" Use release branch (recommend)
Plug 'neoclide/coc.nvim', {'branch': 'release'}

" Or build from source code by using yarn: https://yarnpkg.com
Plug 'neoclide/coc.nvim', {'branch': 'master', 'do': 'yarn install --frozen-lockfile'}
```

`PlugInstall`でインストールする

cocでは、LSPのマネージャーとしても動作する。
LSPというのは、Language Server Protocolという、Microsoftが言い始めた概念のよう。

例えば、Go用のLSPをインストールする場合このような感じでインストールする。

```
CocInstall coc-go
```

インストール済の拡張機能を確認するコマンド

```
CocList extenstion
```

terraform-lspを使う場合は、Coc-Installからはダウンロードできないようで、下記でセッティングする。

lspのバイナリをダウンロード

```bash
wget https://github.com/juliosueiras/terraform-lsp/releases/download/v0.0.12/terraform-lsp_0.0.12_linux_amd64.tar.gz
tar xvzf terraform-lsp_0.0.12_linux_amd64.tar.gz
sudo mv terraform-lsp /usr/local/bin/
```

`:CocConfig`を実行すると表示されるので、下記のようにする

```~/.config/nvim/coc-settings.json
{
	"languageserver": {
    "terraform": {
      "command": "terraform-lsp",
      "filetypes": ["terraform"],
      "initializationOptions": {}
    }
	}
}
```

このような感じで、普段使っているIDEみたく補完が効くようになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/d905877b-0f9b-9859-d66c-7b91de19858e.png)
突然Docker上のMySQLに接続できなくなるが再起動をすると治る

# 結論

ipv6で接続する。
Javaで接続する場合はjdbcの設定を以下のようにする

```
jdbc:mysql://address=(protocol=tcp)(host=::1)(port=3306)(user=root)/db
```

# 事象
Docker上のMySQLにしばらく接続していると、何かのタイミングでMySQLへの接続がけられるようになる。
エラーは以下の通り

```bash
access denied for user 'root'@'localhost'
```

* MySQL Workbenchではなぜか接続できる
* OSを再起動してもなぜか接続できる
* ゲストOSを落とすとエラーは変わる
* 127.0.0.1で設定してみてもダメ
* Dockerの再起動でもダメ

ググってみてもrootの権限が足りないだのなんだの…こちとらさっきまで接続できていたんじゃい！

# 原因
根本原因がわからん…だれかデバッグ方法教えてくれ
ただネットワークがらみっぽい感じではある。
`127.0.0.1`でだめな理由は多分localhostに勝手に読み替えられていたのだと思う。

# 対応
ipv6で指定することで無事接続ができた。
なんでやねん…。
Dynamics 365 Finance and Operations ~ Budgeting（予算作成）~

#予算作成（Budgeting）とは
・予算とは、収入や支出の計画のことである。
・GL,AP,PO,SO,FA,PA,EX,HRといった収支が絡む各モジュールと連携する。
・あくまで期首の計画なので、期中に実際との差異が発生したら分析＆報告しなければいけないし、期末には振り返りと来期のフォーキャストを行う必要がある。
（予算登録エントリ→予算（予実）管理→予測→...以下ループ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/41441875-0340-999f-91cc-2924c65c4ef1.png)
#D365 FO での予算作成のメリット
・ERPとして、各モジュールと連携してリアルタイムに予算作成や管理ができる
・複数の予算作成方法に対応（ゼロベース、トップダウン、ボトムアップ）
・エクセルテンプレートが利用できる
・予算申請と承認は、標準のWFが利用できる
etc.
#予算作成のプロセス（例）
1. 財務部門が昨年度予算を元に基準予算を決める
2. 各事業部（営業、サービス、IT etc.）がレビューして、追加含めて予算申請＆承認
3. 再び財務部門が全体の予算承認をレビューして、CFOがレビュー＆承認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/97bc8f28-18de-b385-680b-e20ec05d3fc7.png)

#予算作成プロセスにおける検討事項および D365 FO での設定
・予算サイクル（月次、四半期、年次）→ Budget Cycles
・予算範囲となる部門の階層構造（金額の積み上げ（Aggregation）と分配（Distribution）を決めるために） → Organization hierarchies
・予算オーナー → Assign users to roles
・ステージ（プロセス）→ Budget planning configuration
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/28348eac-72ab-aad3-a0b2-25dae279b81c.png)

#ステップ① 予算登録エントリ（基準予算の作成）
https://docs.microsoft.com/ja-jp/dynamics365/finance/budgeting/basic-budgeting-overview-configuration

・予算年度、明細（日付、収支種別、勘定構造、配賦するディメンジョン、金額 etc.）を入力する。
・Update budget balances を押すと、完了となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/d76ea2a4-5d0c-3412-0be7-c1c69d4a24d8.png)

#ステップ② 予算（予実）管理や予測
・経費予算や購買予算を超過したもの、収益予算の未達のもの、をリアルタイムで確認可能（Actual vs. Budget）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/b9669c1a-2e01-6a2d-fd63-53ba7fd5f989.png)
40 代おっさん GASのJavaScriptの基本を学んだ‼

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## JavaScriptの基本

### ステートメント

スクリプトを実行すると上から順に実行される。
一つずつの命令が処理される。
その処理する命令の最小単位をステートメントと呼ぶ
<font color="Red">ステートメントの終わりにセミコロン（;）</font>を記述する。

### 関数

関数とは
一連の処理をひとまとめにしたもの

```javascript
function 関数名() {
  処理
}

```

複数のステートメントを<font color="Red">｛｝</font>でグループ化したものを
<font color="Red">ブロック</font>と呼ぶ

### JavaScript使用する文字

半角英数字と記号を使う
大文字、小文字が厳密に区別される

### コメント

//　一行だけのコメント
/* */ 囲んだ範囲

スクリプトエディタでCtrl+/でコメントイン、アウトができる。

## 参考資料

<https://www.amazon.co.jp/s?k=google+apps+script+%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80&adgrpid=110264232688&gclid=CjwKCAiA9aKQBhBREiwAyGP5lSl7AJJLCvOEHb4wQgMlyqW1fll5X8GDTT_Rkd1_soUAyIPMXQr26hoClHEQAvD_BwE&hvadid=553833563682&hvdev=c&hvlocphy=1009076&hvnetw=g&hvqmt=b&hvrand=4378489642044417389&hvtargid=kwd-594191211348&hydadcr=4106_13159878&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_2x1owglv0s_b_p52>
Webの勉強はじめてみた その31 〜クライアントのフレームワーク〜

N予備校「プログラミング入門Webアプリ」を受講しています。
今回は第4章7,8節です。

## モジュールバンドラー
:::note
複数ファイルのJavaScriptを1つにまとめられる
Node.jsのコアモジュールをブラウザでも利用できる
:::

### webpack
モジュールバンドラーとして`webpack` を使用。
`babel-loader`も同時にインストール。

```
yarn add webpack@4.26.1 webpack-cli@3.1.2 @babel/core@7.1.6 @babel/preset-env@7.1.6 babel-loader@8.0.4 --dev
```

`babel-loader`
 - 最新のJavaScriptで書かれたコードをブラウザが実行できるバージョンにコンパイルするモジュール


`webpack`の設定ファイル

```javascript:webpack.config.js
module.exports = {
  context: __dirname + '/app',
  entry: './entry',
  output: {
    path: __dirname + '/public/javascripts',
    filename: 'bundle.js'
  },
  mode: 'none',
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  }
};
```

`__dirname` 
 - 現在の場所を示す既に用意された変数(定数？)
`mode`
 - `bundle.js`の圧縮の方法
`test`
 - 正規表現を使うときの決まり文句
`exclude`
 - 外部ファイル。今回は`node_modules`から引っ張ってくる
 
```javascript:entry.js
'use strict';
import dc from 'damage-calc';
import crypto from 'crypto';

const root = document.getElementById('root');
root.innerHTML = 
  `<p>
    攻撃力 100, 防御 50, 防御貫通 30 のダメージは 
    ${dc.effectiveDamage(100, 50, 30)}
  </p>
  <p>
    ${crypto.randomBytes(8).toString('hex')}
  </p>
  `;
```

`import`で書かれたモジュールが`bundle.js`に書き込まれる。

```
npx webpack
```

`webpack.config`の内容をもとに、`bundle.js`に出力。

`express`で作られた`layout.pug`を変更

```pug:layout.pug
script(defer, src='/javascripts/bundle.js')
```

`defer`属性
 - スクリプトを文書の解析完了後に JavaScript を実行することをブラウザに示す属性。ページ表示速度が向上する。

## jQuery
:::note
HTML の文章の横断や操作、イベントハンドリング、アニメーションなどを 行うための簡単な API を提供するライブラリ
:::

インストール。

```
yarn add jquery@3.4.1
```

```javascript:entry.js
import $ from 'jquery';

const block = $('#block');
const scalingButton = $('#scaling-button');

scalingButton.click(() => {
  block.animate({ width: '200pt', height: '200pt' }, 2000);
  block.animate({ width: '100pt', height: '100pt' }, 2000);
});
```

`click`は古いらしい。

```javascript:entry.js
scalingButton.on('click', () => {
  block.animate({ width: '200pt', height: '200pt' }, 2000);
  block.animate({ width: '100pt', height: '100pt' }, 2000);
});
```

## まとめ
この辺り、ちょっとサーバーとクライアントの境が自分の中で曖昧になってきてる。整理しないと。
【Vue.js】親コンポーネントから子コンポーネントのメソッドの呼び出し方

親コンポーネントから子コンポーネントのメソッドの呼び出し方について簡単にメモしておく。
ちなみに、逆に子コンポーネントから親コンポーネントのメソッドを呼び出す場合は、```$emit```を使用する。

# 子コンポーネントのメソッドの呼び出し方
## 基本的な書き方
子コンポーネントのメソッドを呼び出すポイントは以下の2点になる。
① 子コンポーネントに任意の名前を**ref属性**を使って付ける。

```Vue
<sample ref="child"/>
```

② ```$refs```を使って子コンポーネントのメソッドを実行する。

```javascript
this.$refs.child.testMethod();
```
上記のように書くことで、子コンポーネントの```testMethod()```が実行される。

## サンプル
親コンポーネントから子コンポーネントのメソッドを呼び出す簡単なサンプルを書いてみた。
親コンポーネントのボタンが押されると子コンポーネントの```clear()```が呼ばれるようになっている。

```Vue:親コンポーネント
<template>
	<div>
		<text-box ref="textBox" />
		<button @click="textClear">クリア</button>
	</div>
</template>

<script>
import TextBox from "./components/TextBox.vue";

export default {
	name: "App",
	components: {
		TextBox,
	},
	methods: {
		textClear() {
			this.$refs.textBox.clear();
		},
	},
};
</script>
```

```Vue:子コンポーネント
<template>
	<div>
		<h2>名前:</h2>
		<input type="text" v-model="playerName" />
	</div>
</template>

<script>
export default {
	name: "text-box",

	data() {
		return {
			playerName: "",
		};
	},
	methods: {
		clear() {
			this.playerName = "";
		},
	},
};
</script>
```
簡単にMODXからWordpressの投稿を表示する

（取り急ぎ）MODXでWordpressの投稿を表示する方法です。
普通にWordpressをインストールした状態です。

```text:バージョン
MODX:1.0.25J
Wordpress:5.9
```

以下をスニペット「wp_init」として保存する。
なおrequire_onceの引数をwp-load.phpへのパスに修正。

```php:wp_init
require_once('/wordpressインストール先/wp-load.php');
```


以下をスニペット「wp_posts」として保存する。
```php:wp_posts

if (is_null($params["tpl"])) {
    return "tpl is null.";
}
if (is_null($params["catTpl"])) {
    return "catTpl is null.";
}

$p_cat = $params["cat"] ? $params["cat"] : "";
$args = [
    "posts_per_page" => 10,
    "offset" => 0,
    "category" => $p_cat,
    "category_name" => "",
    "orderby" => "date",
    "order" => "DESC",
    "include" => "",
    "exclude" => "",
    "meta_key" => "",
    "meta_value" => "",
    "post_type" => "post",
    "post_mime_type" => "",
    "post_parent" => "",
    "author" => "",
    //    'post_status'      => 'public',
    //    'suppress_filters' => false
];
$result = "";
$posts = get_posts($args);

global $post;

foreach ($posts as $post) {
    setup_postdata($post);
    $cats = "";
    $category = get_the_category();
    foreach ($category as $cat) {
        $cats .= $modx->parseChunk(
            $params["catTpl"],
            [
                "link" => get_category_link($cat->term_id),
                "slug" => esc_attr($cat->slug),
                "name" => esc_html($cat->name),
            ],
            "[+",
            "+]"
        );
    }
    $result .= $modx->parseChunk(
        $params["tpl"],
        [
            "cats" => $cats,
            "date" => get_the_time("Y年m月d日"),
            "title" =>get_the_title()
        ],
        "[+",
        "+]"
    );
}

wp_reset_postdata();

return $result;
```

以下をチャンク「post_tpl」「post_cat_tpl」としてをそれぞれ作成
```html:post_tpl
[+cats+]
[+date+]
[+title+]
```

```html:post_cat_tpl
[+link+]
[+slug+]
[+name+]
```


Wordpressの記事を表示したいページに以下を記述。

```html:
[[wp_init]]
[[wp_posts? &tpl="post_tpl" &catTpl="post_cat_tpl"]]
```

完了。

ニーズにあわせてそれぞれ修正して使えるはず。
【Blue Prism】よく使う判断ステージのロジックについてまとめてみた（基礎編）

# 判断ステージとは
Blue Prismの実装で必ず使っているのが判断ステージ<br>
判断ステージは条件分岐を行う箇所です<br>
以下のプロセスのサンプルを用意しましたので、これをベースによく使用する中身のロジックを色々紹介します<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/d2f295eb-ef26-fbc7-0fb3-a10b51256d67.png)

この式の中に入れる内容を以下で説明します。<br>![テスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660650/0dd110d1-38f0-518c-363e-548a099962c5.png)



# よく使うロジック
## 文字列を使う判断
実務経験上、文字列を使う判断が多めなのでこちらを紹介します。<br>
### アイテムデータに値がある
```
[アイテム1]<>""
```

### アイテムデータに値がない
```
[アイテム1]=""
```

### アイテムデータが特定の文字列（完全一致）
```
[データ1]="あいうえお"
```

### アイテムデータに特定の文字列（部分一致）
```
Instr([データ1],"あいう")>0
```

## ２つ以上の条件を設定する場合
２つ以上の場合は主に「OR」や「AND」を使用します。

### OR（どちらか一つの場合）
```
[データ1]="あいうえお" OR [データ1]="かきくけこ"
```

### AND（両方の場合）
以下の条件を指定しました。
データ1に値が設定されているかつ"あいうえお"の場合

```
[データ1]<>"" AND [データ1]="あいうえお"
```


## 数値を扱った判断
### 指定した数値と一致する
```
[データ1]=2
```

### 指定した数値以上・以下の場合
#### 以上
```
[データ1]>=2
```

#### 以下
```
[データ1]<=2
```

#### 未満
```
[データ1]<2
```

#### 値より上
```
[データ1]>2
```

## 日付を扱った判断
### 今日の日付と一致
```
[データ1]=Today()
```

### 今日より以前の日付
```
[データ1]<=Today()
```
### 今日より後の日付
```
[データ1]>=Today()
```

# さいごに
いかがでしょうか？　
**今回は**
**1.文字列を使った判断**
**2.2つ以上のロジックを使った判断**
**3.数値を使った判断**
**4.日付を使った判断**<br>
の4つを紹介しました。<br>
これ以外にも様々な判断ロジックがありますので
今後そちらも挙げていけたらと思います！<br>