OmniAICreator/Qiita-1.07M huggingface dataset:
[Next.js] NextAuth(v4)でGoogle Sign inをつける

こちらはv4の実装方法です

## 手順

next-authを追加します。

```
npm install --save next-auth
```

`pages/api/auth/[...nextauth].js`を作成します。

`[...nextauth].js`はこのように実装します。

```javascript
// [...nextauth.js]
import NextAuth from 'next-auth'
import GoogleProviders from 'next-auth/providers/google'

const options = {
  providers: [
    GoogleProviders({
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    }),
  ],
  callbacks: {
    async signIn({ account, profile}) {
      if (
        account.provider === 'google' &&
        profile.email_verified &&
        profile.email.endsWith('@example.com')
      ) {
        return true
      } else {
        return false
      }
    },
  },
  database: process.env.DATABASE_URL,
}

export default (req, res) => NextAuth(req, res, options)
```

`.env.local` を作成し、中身にGOOGLE_CLIENT_IDとGOOGLE_CLIENT_SECRET,NEXTAUTH_URLを記載します。

```
GOOGLE_CLIENT_ID=xxxxxx
GOOGLE_CLIENT_SECRET=yyyyyyy
NEXTAUTH_URL=http://localhost:3000
```

client idとsecretは https://console.developers.google.com/apis/credentials で作成・取得できます


あとは認証をかけたいところでuseSession()するだけです。

```react

import React from 'react'
import { signIn, signOut, useSession } from 'next-auth/react'

export default function Page() {
  const { data: session, status } = useSession()

  return <>
    {!session && <>
      Not signed in <br/>
      <button onClick={signIn}>Sign in</button>
    </>}
    {session && <>
      Signed in as {session.user.email} <br/>
      <button onClick={signOut}>Sign out</button>
    </>}
  </>
}
```

本番環境にdeployするときは環境変数にNEXTAUTH_URLを設定する必要があります。

```
NEXTAUTH_URL=https://example.com
```

## 環境

next-auth v4.10.3

## 参考

https://next-auth.js.org/getting-started/example
https://next-auth.js.org/providers/google
LeetCode Weekly 312-D: Number of Good Paths - 小さい値の点からdsu.merge()

https://leetcode.com/contest/weekly-contest-312/problems/number-of-good-paths/

# 題意
- 木が与えられ、各点には値があります。
- ２つの同じ値の同士を繋ぐパスの組み合わせの総和を求めてください。ただし、このパスは行きと戻りは同じと考えます。自分自身へのパスも1と数えます。(つまり、全ての点x から 点xも1と数える)

# こう考えた
ある点$u$, $v$の値を$x$とした時、この間にパスが存在するのはその間の点の値が全て$x$以下の時です。次のように考えます。
- まず、辺が貼られていない点のみのグラフを考える。値$val$の点を小さい方から見ていく。そのノードから`val以下の点に対する辺`を貼る。
- この辺を貼る時、それぞれの連結成分内に含まれる$val$の数が$a$と$b$であるなら、その結合によって、$a*b$個のペアが作られる
- 
辺がない状態から始めて、小さい値の点からみていき、小さい値に対する辺だけを張ったとき、張られた辺で到達できる点の値は$val$以下であることが保証されます。
連結成分の管理はDSUを使えば良いです。対となれるのは同じ値のノードだけなので、各$val$毎に連結成分内の$val＄の数を数えていきます。

```C++
class Solution {
public:
    int numberOfGoodPaths(vector<int>& vals, vector<vector<int>>& edges) {
        int n = vals.size();
        int maxN = 100000+10;
        dsu uf(100000+10);
        vector<vector<int>> g(maxN);
        vector<vector<int>> costNode(maxN);
        ll ans = 0;
        REP(i, n){
            costNode[vals[i]].emplace_back(i);
        }
        for(auto &x: edges){
            auto u = x[0];
            auto v = x[1];
            if(vals[u] > vals[v]) swap(u, v);
            g[v].emplace_back(u);
        }
        //unordered_map<int, int> leadercost;
        vector<int> leadercost(maxN);
        REP(cost, 100000 + 10){
            ll curcost = 0;
            for(auto &curNode: costNode[cost]) {
                leadercost[uf.leader(curNode)] = 0;
                for(auto &nextNode: g[curNode]) {
                    leadercost[uf.leader(nextNode)] = 0;
                }
            }
            for(auto &curNode: costNode[cost]){
                leadercost[uf.leader(curNode)]++;
                curcost++;
            }
            for(auto &curNode: costNode[cost]){
                for(auto &nextNode: g[curNode]) {
                    if (uf.same(curNode, nextNode)) continue;
                    auto uCost = leadercost[uf.leader(curNode)];
                    auto vCost = leadercost[uf.leader(nextNode)];
                    auto newVal = uCost + vCost;
                    curcost += uCost * vCost;
                    uf.merge(curNode, nextNode);
                    leadercost[uf.leader(curNode)] = newVal;
                }
            }
            ans += curcost;
        }
        return ans;

    }
};
```
https://leetcode.com/submissions/detail/808033375/
【Linux】一定期間経過したディレクトリやファイルを削除する方法

## ファイルの削除
以下のように`find`コマンドを使用して一定の期間が経過したファイルを削除します。

```zsh
find /path/to/dir -name '*.log' -mtime +30 -delete
```

上記を実行すると対象ディレクトリの`.log`ファイルのうち最終変更日から30日経過しているファイルを削除します。

`-mtime`の部分を変更することで期間の起算日を変更できます。
使用可能なオプションは以下のとおりです。


| オプション|説明|
|:-----------:|:------------|
| -mmin|最終変更日時から（分）|
| -mtime|最終変更日時から（日）|
| -amin|最終アクセス日時から（分）|
| -atime|最終アクセス日時から（日）|
| -cmin|データとステータスの最終変更日時から（分）|
| -ctime|データとステータスの最終変更日時から（日）|


また数字の前の`+`の部分には`-`を指定したり指定しないことができます。

| オプション|説明|
|:-----------:|:------------|
| + |過去から指定した数字までに|
| - |現在から指定した数字までに|
| 指定なし |指定した数字前に|

- 30日前までに変更された

```zsh
-mtime +30
```

- 現在から30分前までに変更された

```zsh
-mmin -30
```

- 30日前にアクセスされた
```zsh
-atime 30
```

## ディレクトリの削除
上記の方法では空ではないディレクトリを削除することができません。
中身のあるディレクトリを削除するには以下のように実行します。

```zsh
find /path/to/dir -type d -mtime +30 | xargs rm -fr
```

上記を実行すると最終変更日から30日経過しているディレクトリを削除できます。
何でも「アジャイル」って言うのをやめてくれ

# この記事は何？
どうやって開発してるんですか？って聞くと「アジャイル」って答える人がいるんですが、これ困りますよねって話をしています。
「アジャイル」と一言いってもそのスタイルは多様であり、スクラム開発やエクストリーム・プログラミングなどもあり、その一言でどんな開発をしているか読み取れないからです。
答える側はもう少し詳しく、聞く側も早とちりしてしまわないように気をつけましょうね。

# 「アジャイル開発をしています」と言われても
私は仕事柄いろんな人の開発を改善するための相談に乗ったりすることが多いのですが、その時に重要な情報となるのがそのプロジェクトにおける開発の進め方・プロセス・プラクティスの類の情報です。
どういう開発をしているか？によって、アドバイスする内容が変わってきます。
そんな時に「どうやって開発していますか？」と聞いて「アジャイル（開発）」と一言で答えられると困ってしまいます。
また、様々なイベントやシンポジウムでの発表を聞いていると「うちはアジャイル開発してまして…」という話を聞くことがあって、これもまた困ります。
何が困るの？と言うと、アジャイルにも色々なスタイル・プラクティスがあるので、一言でアジャイルと言われてもどんな開発をしているかイメージできないからです。

# アジャイルの定義
アジャイル開発の定義は色々な形でされていますが、基本的には「アジャイルソフトウェア開発宣言」の価値観を有している開発方法はすべてアジャイル開発だと思っています。

http://agilemanifesto.org/iso/ja/manifesto.html

アジャイル開発宣言の内容は基本的には思想や哲学に類するものです。開発チームの中で思想や哲学を共にすること自体はすごく大事なことなのですが、開発方法の説明としては残念ながら情報不足です。
せめて、スクラムなのか、エクストリームなのか、SAFeなのか？といった情報がほしいです。
それでも不十分なことが多いのですが、まぁ「アジャイル開発です」とだけ回答されるよりよっぽどいいです。

https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA)

https://ja.wikipedia.org/wiki/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0%E3%83%BB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0

https://www.scaledagileframework.com/

# 問題を根深くするニセアジャイル開発
なんでこの程度のことでわざわざ記事にしているのか？というと、この問題をさらに根深くする厄介な事象がよく確認できるからです。
それは「独自のプラクティスによるアジャイル開発」や「ニセアジャイル開発」の存在です。
アジャイル開発自体は先程も言った通り、特定の思想や哲学に則っていれば宣言することはできると思います。
が、その結果アジャイル開発はかなり断片化しているといえます。
一時期のAndroidスマホが端末メーカーによってOSの統一性を失われていたのと同じように、アジャイル開発も開発組織やチームによって統一性を失いつつあります。これ自体は悪いことではなく、進化する過程で避けられるものではないと思いますが、人と情報共有する際には問題になります。
なのでオリジナリティがあるアジャイル開発をしている時は「弊社独自のアジャイル開発をしていまして…」とか「スクラム開発をベースにチームで独自に定義した開発スタイルでして…」とか言ってもらったほうが勘違いしないですむんですよね。いろんなイベントで発表する人にはぜひお願いしたいなと思います。

で、一番厄介なのが「ニセアジャイル開発」です。
こいつは先に述べたアジャイルソフトウェア開発宣言の思想にすら則っていないのにも関わらず、
「とりあえずイテレーティブにしていればアジャイルでしょ？」とか
「設計書を書いてないからアジャイルです」とか
「僕がアジャイルといったからアジャイル開発」
というようなアジャイル開発そのものの認識不足から、自身をアジャイル開発と思いこんでいます。

![C7NmJZBU4AAwHlr.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181045/38b758df-81ad-e181-14e8-01f4498b6649.jpeg)

まぁそのニセアジャイル開発のスタイル自体を問題だと言いたいわけではないのです。
（あまり推奨できるものでもないですが(*)）
大体は話の流れで違和感に気づくのですが、気づかずに勘違いしていると
開発に求める価値観や、大事にしたいことが話し手と聞き手でズレてしまうので
的外れなアドバイスになってしまったり、正しい理解をしないまま情報を持ち帰ったりしてしまいます。
さらには「ニセアジャイル開発の事例」を聞いた「ニセアジャイル開発二世」が誕生し、その事例がさらにアジャイル開発として展開されていき、収集がつかなくなっていきます。
私は先日、某ソフトウェア開発系のイベントに参加しましたが、そこでも2つのニセアジャイル開発事例が「アジャイル開発」として紹介されるのを見ました。もうこれは予想や妄想のタグ医ではなく、現実に起こっている問題なんですよね…。
こうした事態を放置していると、開発手法における色々な好事例の横展開などが進まず
業界全体としての進化・歩みを遅くしてしまうので、ぜひ辞めてほしいです。
また、アジャイルソフトウェア開発宣言で述べられている考え方や思想は非常に重要なことです。
これを読まず、理解せずしてアジャイル開発を始めないようにすべきです。

# さいごに
ということで、自分がどういう開発をしているか紹介するときや、開発スタイルに関する質問を受けたときには
「アジャイルです！」という一言で済ますのではなく、せめてどんなプラクティスに則っているか？それとも独自のものなのか？を明らかにしましょう。
また、「アジャイルです！」とだけ定義して事例などを発表している人を見かけたら
「それってスクラムですか？エクストリームプログラミングですか？」と確認してあげましょう。
そうしてアジャイル開発に関する共通認識を広めながら、好事例を業界で共有していくことで、みんながよりよい開発に進められるようにしていきましょう！
Juliaのdoブロック

# イントロ
ある関数`g`を引数として他の関数`f`に渡すというのは非常に便利な機能である。特に無名関数を渡すような使い方は頻繁に現れる。以下は`map`関数の例である(fがmap, gがx->x^2)。
```Julia
map(x->x^2, [1,2,3])
```
ただし、無名関数の部分が非常に長くなるとかなり煩雑で読み書きし難いコードになる。公式ドキュメントでは条件分岐を含むような関数を`map`に渡す例が載っている(`[A,B,C]`は何か適当なものを指してるだけ):
```Julia
map(
    x->begin
       if x < 0 && iseven(x)
           return 0
       elseif x == 0
           return 1
       else
           return x
       end
    end,
    [A,B,C]
)
```
こういう関数を引数にとる関数を扱うための便利な機能として[doブロック](https://docs.julialang.org/en/v1/manual/functions/#Do-Block-Syntax-for-Function-Arguments)がある。それについてのメモ。

# 記法
まず、どういう記法かを書いてしまう。以下のような記法である。関数`f`は第一引数に関数を受け取れるものとする。このとき、

```Julia
f(第一引数以外) do 無名関数の引数
    無名関数が行う処理 
end
```

とかくと、doの次の部分を引数にとり、その後のブロック内の処理を行う無名関数を作って、fに渡すというコードになる。たとえば、さきほどの`map`の例なら以下のようになる。

```Julia:例1
map([1,2,3]) do x
    x^2
end
```

```Julia:例2
map([A,B,C]) do x
    if x < 0 && iseven(x)
        return 0
    elseif x == 0
        return 1
    else
        return x
    end
end
```

`do a, b`とすれば2個の引数`a`と`b`を受け取る無名関数が作れる。3個以上も同様。ただし、`(a,b)`と書くと、1つのタプルを受け取る関数になるので注意。

# 用法
map関数以外にもたくさんの用法がある。いくつかの便利な用例を書いておく。
## 安全なファイル処理
たとえば、ファイルを開いて何かを処理したあと必ずそれが閉じられるようにしておきたい場合があるだろう(毎度、直接open()としてあとでclose()を書くのではなくて。closeを書き忘れたりしそうじゃない?)。ここで、処理については任意の関数を想定しておきたい。つまり
```Julia
io = open(...)
try
    ioに対する何らかの処理
finally
    close(io)
end
```
というようなことをしたいのだが、tryの中身は色々あり得る。毎回これらを書くのは面倒なので何とかしたいというわけである。このような場合には、処理部分を関数として受け取り、一連の処理を行う関数を作ればよいが、まさにdoブロックが活躍する場面になっている。
```Julia
function open(f::Function, args...)
    io = open(args...)
    try
        f(io)
    finally
        close(io)
    end
end
```
として、
```
open("outfile", "w") do io
    ioに対する何らかの処理
end
```
とすればよい。ファイルの処理の部分はopen内に完全に隠されて、単にファイルに対して何をするかを普通のコードのように書けばよい。

## Fluxの勾配計算
他の例として、[Flux](https://fluxml.ai/)という機械学習向けのJuliaのpackageにおける勾配計算の記法がある。モデル`m`があり、それを使って関数`l`(損失関数とかを想定すればよい)を計算したうえで、`Flux.params(m)`に対して微分したいとする。このような場合、素朴には`Flux.gradient(()->l(hogehoge), Flux.params(m))`とかなのだが`l`の部分は複雑になりうる。ここで`l`の部分をdoブロックを使って外に出しておけばどこまでが関数引数なのかわからなくなったりしない:
```Julia
gradient(Flux.params(m)) do 
    l(hogehoge)
end
```
なお、`gradient`は「引数をとらない関数」を引数にとるので、doの後ろの引数の部分は空白になっている

# 参考
* [公式document](https://docs.julialang.org/en/v1/manual/functions/#Do-Block-Syntax-for-Function-Arguments)
* [Julia その5 関数関連の続き](https://qiita.com/hidemotoNakada/items/3d08770def0a2b40f022
開発関係,Apexの事例

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [Json文字列の変換](https://qiita.com/Keiji_otsubo/items/58cbc5e67b9a228ceea2)
+ [lightning:mapを使ってみる](https://qiita.com/Keiji_otsubo/items/847a6603a82589f27530)
+ [使用しているAPIバージョンの検索](https://qiita.com/Keiji_otsubo/items/c45a7cbc754e105a28c1)
+ [aura:componentの中での文字列から数値への変換](https://qiita.com/Keiji_otsubo/items/2809de6fb07f998f1a37)
+ [Aura でショートカットキーのイベントを得る](https://qiita.com/Keiji_otsubo/items/53becb163c0aac8a9923)
+ [SOQLの結果をCSVファイルとして保存するApexバッチ](https://qiita.com/Keiji_otsubo/items/767ed7fbbf2f72943a14)
+ [Test Apex Class でのToo many SOQL queries: 101エラー](https://qiita.com/Keiji_otsubo/items/22b62c180c72eb739dae)
+ [【Apex】List / Set / Mapの使い方まとめ](https://qiita.com/t_yano/items/f8035c6aa28bc67c3ab8) @t_yanoさま　ありがとうございます。
+ [Apexでオブジェクトの定義情報を参照する ~Salesforce Schema.系 まとめ~](https://qiita.com/s_hayashida/items/517da55c05c6099805dc) @s_hayashida さま　ありがとうございます。
+ [レコードタイプが有効な Salesforce オブジェクトを Heroku で利用する方法](https://qiita.com/sho7650/items/2d95da8459b86566c591) @sho7650 さま　ありがとうございます。
+ [Welcome to JSON2Apex](https://json2apex.herokuapp.com/)
+ トリガーの前に使用する場合は常に、insert、updateなどのDMLステートメントについては言及しません。[宿題を手伝ってください](https://developer.salesforce.com/forums/?id=9062I000000IM3LQAW)
マイグレーションのステータスで表示される、NO FILEを表示させなくするには

## 環境
Rails5.2
Ubuntu20.4

## 内容
不要になったため、マイグレーションファイルを**rm**で削除したのだが、不用意であったため、マイグレーションのステータスを表示すると、**NO FILE**で残ってしまうこととなった。
```
$ rails db:migration:status
up     20220819003642  ********** NO FILE **********
```

この**NO FILE**をステータスから削除することとする。まずは、20220819003642_test01.rbという空ファイルを作成してやる。test01の部分は、どのような名前でもOKです。すると、**NO FILE**から、マイグレーションの履歴が復活しました。
```
$ rails db:migration:status
up     20220819003642  Test01
```

20220819003642_test01.rbの状態は**up**になっています。削除するには、**down**にする必要があります。空ファイルに、空のchangeメソッドを記述します。
```20220819003642_test01.rb
class Test01 < ActiveRecord::Migration[5.2]
    def change
    end
end
```

１つだけロールバックすると、コマンドは正常に流れます。
```
$ rails db:rollback STEP=1
== 20220819003642 Test01: reverting ===========================================
== 20220819003642 Test01: reverted (0.0024s) ==================================
```

ステータスを表示すると、状態が**down**に変更されます。
```
$ rails db:migration:status
down    20220819003642  Test01
```

作成したマイグレーションファイルを削除します。
```
$rm 20220819003642_test01.rb
```

マイグレーションのステータスを表示すると、一時的に作成したTest01の履歴は消えています。
```
$ rails db:migration:status
```
Azure VM の監視運用（CPU・メモリ編）

## 事前準備
[Azure VMの監視運用（準備編）](https://qiita.com/wwalpha/items/a727fd3e88e45193f41f)

## 監視設定
`CPU使用率`、`メモリ使用率` の監視は Virtual Machine から1分間隔で自動収集されるので、設定は不要です。

## 確認方法
1. Virutal Machine の画面で、Overview > Monitoring の順でクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/db9e5616-fd2c-b017-4efc-21ca501730c2.png)

2. 画面スクロールし、`Key Metrics`の部分で表示されています。Chartクリックすると、詳細情報も確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/361370a9-4907-1693-47cd-a3ee2a8d4524.png)

## その他監視項目
-  [Azure VM の監視運用（ディスク・プロセス編）](https://qiita.com/wwalpha/items/a228698255f9854b270b)
Azure VM の監視運用（準備編）

監視設定する前に、`Network` と `Virtual Machine` を準備します。

## 成果物
- Resource Group
- VNet + Subnet
- Virtual Machine (Windows2019)
- Log Analytics Workspace

## 実行コマンド
```
# Resource Group Name
export RG=OperationRG
# Region Name
export Location=japaneast
# Network Name
export VNET=OperationVNET
# Subnet Name
export Subnet=default
# Virtual Machine Name
export Windows_VM=Windows_VM
# Log Analytics Workspace
export Workspace=MonitoringWorkspace

# create resource group
az group create -l $Location -n $RG

# create network
az network vnet create --name $VNET -g $RG --subnet-name default

# create log analytics workspace
az monitor log-analytics workspace create -g $RG -l $Location --workspace-name $Workspace

# create virtual machine (windows)
az vm create -g $RG --vnet-name $VNET --subnet $Subnet \
 --name $Windows_VM --image Win2019Datacenter --size Standard_B1s --public-ip-sku Standard --admin-username azureuser \
 --disable-integrity-monitoring

Admin Password: **********
Confirm Admin Password: **********
{
  "fqdns": "",
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx/resourceGroups/OperationRG/providers/Microsoft.Compute/virtualMachines/Windows_VM",
  "location": "japaneast",
  "macAddress": "00-22-48-E8-F7-79",
  "powerState": "VM running",
  "privateIpAddress": "xx.xx.xx.xx",
  "publicIpAddress": "xx.xx.xx.xx",
  "resourceGroup": "OperationRG",
  "zones": ""
}

```

## 監視項目設定編
- [Azure VM の監視運用（CPU・メモリ編）](https://qiita.com/wwalpha/items/22d7d233f6b64f60148c)
- [Azure VM の監視運用（ディスク・プロセス編）](https://qiita.com/wwalpha/items/a228698255f9854b270b)
- [Azure VM の監視運用（Windowsログ・サービス編）](https://qiita.com/wwalpha/items/f299374fd43989735578)
DataFrameを画像として出力する方法。

## 始めに
　こちらの記事をご覧いただきありがとうございます。
　表を画像にして発表資料に入れたいなーとか思った時に使えそうな、pandasのDataFrameを画像にして出力してもらう手法を書きます。
　自分で後で見返すように作成しますが、ご覧いただいた皆様にも学びがあれば幸いです。

## 参考
以下のページの内容をおおよそそのまま書くだけです。詳しく知りたい方はぜひそちらをご覧ください。

https://tedukapm.tech/python/tableoutput/


# DataFrameを画像として出力する方法。

　早速ですが、その関数のコードが以下です。
```python:DataFrameを画像にする
# dfは出力したいDataFrame
# wは横幅、hは縦幅
# outputPathは出力先のパス

def TablePlot(df,w,h,outputPath):
    fig, ax = plt.subplots(figsize=(w,h))
    ax.axis('off')
    ax.table(
        df.values,
        colLabels = df.columns,
        loc = 'center',
        bbox=[0,0,1,1]
    )
    plt.savefig(outputPath)
    plt.show()
```

　matplotlibに表出力の機能が備わっていたのは驚きました。基本は可視化のためにヒストグラムや散布図を描くときに使っていましたので…。matplotlibの表出力機能を使って、余計な余白などを作らないようにうまく出力してもらっている感じです。


# 終わり。
　DataFrameの出力を画像にするだけなら、画面をキャプチャしてトリミングして保存すればいいのですが、それも回数がかさむとなかなか面倒だったもので助かりました。
LEGOでコロナをやっつける

ちっさいおっさんが帰ってきたで。
6年ぶりやな。元気にしとった？
あれちゃう？コロナとかなってへん？

ソープディスペンサって見たことあるやろ？
あれやん、店の入り口とかに置いてる手ぇ出したら消毒液がピュッって出てくるやつ
つこたことあるやろ？

あれな、おっさん、LEGOで作ってみたんやんか。
いや、わかってるよ。
今更感あるのは。
せやけど、接触感染もゼロちゃうやんか。
これでコロナをやっつけるんやで。

ごちゃごちゃ言うててもしゃあないし、先に動いてるとこ見せよか？
こんな感じやで。
https://youtube.com/shorts/dDxDUJy-6zw?feature=share

シンプルやろ？
作り方はこの画像見てや。
![image0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151562/0582e3f2-38d6-ef43-ec01-93e65ca974ee.jpeg)
![image1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151562/627a6af8-79ef-e2c6-5e08-1414620b27ba.jpeg)
![image2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151562/678f1e11-c7bf-b0eb-dd9b-adb02ef7a319.jpeg)
![image3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151562/4381e0eb-20cf-9c88-5c9d-d8c2b848d089.jpeg)

LEGO Mindstorms NXTの教育用のセットをメインにパーツ追加して作ったわ。
超音波センサとモータをひとつだけ使うよ。
モーターのとこのハンドルは初期位置の微調整に使うねん。

あとはプログラムやな。
MindstormsNXTについてるGUIのやつでもええねんけどな、
今回はJavaで作ったで。
LeJOSいうのんがあって、Javaでプログラミングできるねん。
導入方法はごめんやけどLeJOSでググってみて。
eclipse使う人は32ビット版のやつな。

ソースコードはこんな感じ
![lejos.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151562/dbdd16e6-9817-0696-047d-aae9d6954d43.jpeg)

コメントも入れといたで。
画像やからコピペできひんけど、
簡単なコードやから書いてみてみ。

あと、あれやな、消毒液のボトルもいろんなんあるから
本体はそのまま作っても改造せなあかんやろな。
LEGO好きやったらそれが楽しいとこやねんけどな。
ボトルによってはもっと少ないパーツで実現できると思うで。

ほなまたね。
いつかどこかで。
Seuratでプロット（Dimensional reduction plot）を表示する

# Summary
```R
DimPlot(seurat_object)
```
# 準備

https://qiita.com/amufaamo/items/c185e7ff88c90b443946

こちらで基本的な計算ができたら、次は結果を表示しましょう。
一番基本的な結果は、細胞がどのようにクラスタリングされたかを示す散布図だと思います。それは`Seurat`で`DimPlot`というコマンドを使用します。
まずはRでSeuratを呼び込みます。すでにされている方は不要です。
```R
library(Seurat)
```
# 基本的な図
```R
DimPlot(seurat_object)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262409/ea5ff90f-bea4-662b-e4a4-86ad522bdbac.png)

#　色分けの種類を変えたいとき
デフォルトはSeurat clustersになっています。
新たなプラットフォーム管理者認定でUnity Catalogのスキルを高めて検証しましょう

[Getting Databricks Certified Is Now Easier With Free Overview Courses \- The Databricks Blog](https://www.databricks.com/blog/2022/09/20/develop-and-validate-your-unity-catalog-skills-new-platform-administrator)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Databricksでは、[Databricks Academy](https://www.databricks.com/learn/training)を通じて、経験レベルに関係なしにユーザーが新たなスキルをマスターすることができる、データアナリスト、データエンジニア、データサイエンティスト向けのトレーニングを提供しています。変化し続けるデータとAIのランドスケープにおいては、ロールを変えたいあるいは現在のロールを拡張したいと考える人たちにとってトレーニングと認定試験の取得はさらに価値のあるものとなっています。

さまざまなロール、業界、地域におけるお客さまのニーズに応えるために、Databricks Academyは成長を続けており、我々のオファリングを拡大できることを嬉しく思っています。本日我々は、Databricksレイクハウスプラットフォームを効率的に管理、維持する方法を学ぶお客さま向けに、新たな[Platform Administratorラーニングパスウェイ](https://www.databricks.com/learn/certification/platform-administrator-accreditation)をローンチできることを嬉しく思っています。Platform Administratorラーニングパスウェイは、[Unity Catalog](https://www.databricks.com/jp/product/unity-catalog)について理解すべきすべてを学習者に提供します。Unity Catalogは任意のクラウド上のレイクハウス上でファイル、テーブル、機械学習モデル、ダッシュボードを含むすべてのデータとAIの資産に対する統合ガバナンスソリューションです。これには、専門家によって定義された最新のベストプラクティスに従いながら、どのようにしてグループでユーザーを管理し、計算リソースを管理し、Databricksレイクハウスプラットフォームを統治、セキュアにするのかについて深い理解を行うことが含まれます。認定試験を通じて皆様の知識を示すことで、お客さまはLinkedInや他のレジメに共有できるバッヂを得ることができます。

新たな学習パスウェイは、プラットフォーム管理者がUnity Catalogに対する知識と習熟度を示すユニークな機会を提供し、最終的には皆様の組織で大きなインパクトを生み出すことになります。Celebal TechnologiesのPravin ChaubeyはDatabricksトレーニングを受けた後に自分の生産性の向上を体験しました。

> 「トレーニングは私の生産性を向上させました。以前は2-3時間要していたことが1時間で終わる様になりました。短時間でデリバリーできる様になったのです」 - Pravin Chaubey, Associate Data Engineer

# パスウェイのコンポーネント

Platform Administratorラーニングパスウェイは、[Databricks Academy](https://www.databricks.com/learn/training/login)におけるセルフペースのコースと新たな認定試験という複数のパートから構成されています。

以下のモジュールを含む6時間のコースである**Databricks Platform Administrator learning pathway**

- プラットフォーム管理の基礎
- ID管理
- ワークスペース管理とセキュリティ
- 計算資源の管理
- データの管理
- CI/CDの管理

ラーニングパスウェイによってカバーされるコンテンツを評価する認定試験である**Databricks Platform Administrator Accreditation**。基本的な資格には、Databricksレイクハウスプラットフォームの以下の機能をマスターすることが含まれます。

- グループでどの様にユーザーを管理するのか
- どの様に計算資源を管理するのか
- プラットフォーム、機能とオブジェクトをどの様に統治、セキュアにするのか

認定試験に関する追加情報です。

- 設問数: 25
- 通過スコア: 80パーセント
- 試行回数: 無制限

パスウェイにある学習素材には、キーのトピックをカバーする記録済みのスライドベースの講義から、現実世界のシナリオで学びを実践し、適用するためのハンズオンラボが含まれています。

# 認定を受ける

すでにDatabricksを利用されているのであれば、[Databricks Academy](https://www.databricks.com/learn/training/login)にログインし、コースカタログからPlatform Administration学習パスウェイを見つけることができます。既存のパートナー様であればコースカタログから学習パスウェイを見つけることも可能です。

その他のデータ&AIのプロフェッショナルの方も、Databricksアカデミーでアカウントを作成することで、パスウェイにアクセスすることができます。ログインしたら、コースカタログから[パスウェイ](https://customer-academy.databricks.com/learn/course/1229/databricks-platform-administrator-accreditation)にアクセスすることができます。

:::note
**訳者コメント**
合格しました。
![Screen Shot 2022-09-26 at 12.58.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1673e74e-a2f3-5e2f-f22b-ff3a10bfba8c.png)
:::

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
[小ネタ] Amplify Studioが起動しない場合の対処


はじめてAmplify Studioを使ってみます。


デプロイ済みのアプリの[Backend environments]から[Studioを起動する]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/c96cf83c-21e8-7dbb-43c1-eb42f655434b.png)

以下のエラーが出て、起動しませんでした。

```
An error occurred while fetching the app backend: Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/266453df-c166-6aed-7007-5af01aa184f6.png)

以下のサイトをみてみると、対策として以下のように記載されています。

https://github.com/aws-amplify/amplify-adminui/issues/580

> Amplify コンソールに移動し、[アプリの設定: Amplify Studio の設定] ページにアクセスして、[Amplify Studio を有効にする] トグルを無効にしてから再度有効にしてください。

では同じようにやってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/2d7cd695-3f19-5b8b-f918-9b367bb08bd0.png)

指示に従って「確認」を入力してみるも、ボタンがグレーアウトしたままです。
おそらく日本語対応が微妙なのでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/fbf34a16-4455-a6ac-cd47-7832d5d133ad.png)

一時的に言語設定を英語に変えてみます。
マネジメントコンソール左下の[Unified Settings]のリンクをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/b2285427-ca32-100a-7154-4b22193adf50.png)

「編集」から英語（US）に変更してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/0c5535a5-657c-1316-22e5-ec83111eeb4e.png)

Amplifyの画面に戻ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/9d2797d3-c71b-13ee-867a-0acea7ab312b.png)

英語だと[confirm]のようですね。ボタンも押せるようになったので押してOFFにしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/8ce782d5-a567-9b10-b513-7f024a831814.png)

OFFになったら、ONに戻してみます。(2,3分で完了します）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/55ed0b27-2d76-7114-6737-3ccabb3785eb.png)

Amplify Studioが正常に見えるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/05fee6c5-4722-d730-efc1-bdacd9fa12b2.png)


以上です。
Ubuntu 22.04 "壊れたパッケージ"と出て、aptによるアップグレードが出来ないとき


#### 結論："--reinstall"をつけて、インストールし直すと上手く行くことがある
~~~
$ sudo apt install --reinstall systemd udev
~~~

#### 症状と経緯：upgrade出来ず保留のまま
~~~
$ sudo apt update
$ sudo apt upgrade
  ...
The following packages have been kept back:
  libnss-systemd libpam-systemd libsystemd0 libudev1 systemd systemd-sysv systemd-timesyncd udev
0 upgraded, 0 newly installed, 0 to remove and 8 not upgraded.
~~~

#### パッケージ名を指定してupgradeしても、「壊れたパッケージ」エラー
~~~
$ sudo apt upgrade libudev1
  ...
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 udev : 依存: libudev1 (= 249.11-0ubuntu3.4) しかし、249.11-0ubuntu3.6 はインストールされようとしています
E: 壊れたパッケージ
~~~
#### 英語環境では、"Broken packages"エラー
~~~
$ sudo apt upgrade libsystemd0
  ...
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 systemd : Depends: libsystemd0 (= 249.11-0ubuntu3.4) but 249.11-0ubuntu3.6 is to be installed
E: Broken packages
~~~
#### → reinstall を行ったところ、成功
~~~
$ sudo apt install --reinstall libsystemd0
  ...
以下の追加パッケージがインストールされます:
  libnss-systemd libpam-systemd libsystemd0:i386 systemd systemd-sysv systemd-timesyncd
提案パッケージ:
  systemd-container libtss2-rc0
以下のパッケージはアップグレードされます:
  libnss-systemd libpam-systemd libsystemd0 libsystemd0:i386 systemd systemd-sysv systemd-timesyncd
アップグレード: 7 個、新規インストール: 0 個、削除: 0 個、保留: 6 個。
5,616 kB のアーカイブを取得する必要があります。
この操作後に追加で 6,144 B のディスク容量が消費されます。
続行しますか? [Y/n] y
  ...
~~~
sliceメソッドを使ったプログラムの備忘録

今日も学んだことを忘れないためにメモします。

## sliceメソッドとは
配列や文字列から指定した要素を取り出すことができるメソッド。
```
array = [0,1,2,3,4,5,6]
puts array 
#=> [0,1,2,3,4,5,6]

# 配列から引数で指定した要素を取得
ele1 = array.slice(1)
puts ele1
#=> 1

# 配列番号-4から4つ分の要素を取得
ele2 = array.slice(-4,4)
puts ele2
#=> 3, 4, 5, 6
```

文字列だけでなく、配列、ハッシュからも取り出せる（ハッシュの場合はActiveSupportという外部ライブラリーを使う）

```
# 配列からslice
array = ["Ruby","Python","Java"]
puts array.slice(0)

# 出力結果
#=> Ruby


# ハッシュからslice
require 'active_support'
hash = {"Ruby":"Rails","Python":"Django","PHP":"CakePHP"}
puts hash.slice(:Ruby,:Python)
puts hash.slice(:Ruby,:PHP)

# 出力結果
{:Ruby=>"Rails", :Python=>"Django"}
{:Ruby=>"Rails", :PHP=>"CakePHP"}
```

## プログラム内容
対象の文字列から末尾にある2文字を取得し、取得した2文字を3回繰り返して出力する。

## 記述内容
```
def extra_end(str)
  puts  str.slice(-2,2) * 3
 end
 
extra_end('Hello')
extra_end('ab')
extra_end('Hi')

# 出力結果
#=> lololo
#=> ababab
#=> HiHiHi

```

以上になります。
[DB]データベースの基本、Oracleとmysqlの違い

こんばんは、なるです。

どなたか、バイクのカブを安く売ってるところ知りませんか？
9月に入って外がめちゃめちゃに気持ち良いので、あてもなくバイク走らせてみたいです。
カブかわいくて好きなんですよね～🏍

近いうちにデータベース（以後DB）周りの仕事をすることになったため、
SQLを復習しております。

DBMS（データベースマネジメントシステム）は**Oracle**ということなので、
過去に使っていた**mysql**との違いを交えつつDBの基本知識について整理したいと思います。

## そもそもDBとは
>データベースは一言で説明すると「様々なデータを決まった形で整理して集めたもの」です。

引用元：https://it-biz.online/it-skills/database/

ネットショッピングを例にあげると、情報を顧客情報や商品情報などをルールに従って整理し、それらがDBに保管されているイメージです。

DBにはデータの管理方法の違いでいくつかの種類が存在し、
**OracleとmysqlはどちらもRDB（リレーショナルデータベース）に分類されます。**

## RDB（リレーショナルデータベース）とは？

>リレーショナルデータベースは、エクセルのように表形式（テーブル）であらわされるデータベースで、テーブル間の関係（リレーション）を定義することでデータの結びつきや関連性をわかりやすく表します。

引用元：https://it-biz.online/it-skills/database/#toc5

先程の例になぞらえると、顧客情報や商品情報といった情報が**表形式で**DBに保管されており、
目的に応じたデータを抽出しやすい仕組みのDBといったところでしょうか。

他にも種類があり、それぞれ利点があります。
[こちら](https://it-biz.online/it-skills/database/#toc5) の記事が分かりやすくまとめてくださってますので、興味がある方は見てみてください。

RDBを管理するためのツールをRDBMS（リレーショナルデータベースマネジメントシステム）といい、OracleやmysqlはこのRDBMSの種類となります。
<font color = darkgray >が、実際のやり取りする時にこの単語が出てくることないんじゃないでしょうか？
まとめてDBと覚えてしまっても問題ない気がします。 
例：「おたくのDBなに使ってますか？→Oracleです」これで通じると思います。</font>

## Oracleとmysqlの違い
調べてみたのですが、いやぁ、難しいですね笑

DBの選定や設計、移植をするときには把握した方がいいことが多々ありそうですが、
すでに稼働しているDBにSQLでアクセスする分には、基本的に同じ感覚で大丈夫と感じました。

調べて見つけた気を付けた方がいいポイントを箇条書きにします。
[参考サイト](https://www.ashisuto.co.jp/tech-note/article/20141006_db.html)

※以降専門用語増えると思います。[こちら](https://qiita.com/miriwo/items/873aa03efaf0a572d156)の記事が分かりやすくまとめて下さってます。

1. **空の文字列の扱い**
Oracleでは、文字列と定義されたフィールドが空の場合NULLを返す仕様のようです。
mysqlでは空の文字列はNULLではなく、''という文字列だったので注意が必要。

2. **テーブル名の命名規則**
mysqlではテーブル名の1文字目に数字を付けられるのですが、
Oracleでは命名規則に抵触するようです。

3. **チェック制約の有無**
Oracleにはチェック制約という機能が存在するようです。
カラムの入力規則を、テーブル作成時にユーザーが設定できるようです。
設定されていた場合、レコードの登録時にはじかれる場合があるので、落ち着いて対処しましょう。

3. **関数の細かい違い**
参考：[組み込み関数の共通性](https://www.ashisuto.co.jp/tech-note/article/20141006_db.html#:~:text=%E8%A1%A8%E3%81%AE%E6%9C%89%E7%84%A1-,4.%20%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E9%96%A2%E6%95%B0%E3%81%AE%E5%85%B1%E9%80%9A%E6%80%A7,-%E4%B8%BB%E8%A6%81%E3%81%AA%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF)
こちらを見ると、完全に同じように使える関数はある程度限られてくるみたいです。
こればかりは使いながら都度覚えるしかないですね。

今回調べたおかげで、Oracle使ってエラーが出ても心構えができてる状態で対応できそうです。
やることとしては「調べる→試す→エラー出る→調べる→解決する→始めに戻る」
いずれにしてもこの繰り返しなので今までと変わらないですね！

ひとまずこの記事はここまでにして、また気づきなどがあればまとめるとします。
実際に業務に入ってどんな違いが出てくるか、たのしみですね！

ではまた！

## 参考サイト
[データベースとは？IT初心者向けにわかりやすく３分で解説【DB】](https://it-biz.online/it-skills/database/)
[SQLの観点から「Oracle Database」「PostgreSQL」「MySQL」の特徴を整理しよう！](https://www.ashisuto.co.jp/tech-note/article/20141006_db.html)
[DB系用語まとめ](https://qiita.com/miriwo/items/873aa03efaf0a572d156)
【TypeORM】ちゃんとinitializeしないと、「EntityMetadataNotFoundError」が出るよ

# TypeORMでDataSourceを利用したら、「EntityMetadataNotFoundError」エラーになった。

結論：ちゃんとinitializeしてるよね？

エラー対処にちょっと手間取ったので、共有です。

## 経緯

去年ぐらいに作ったProjectを大きく作り直していた時のことです。
typeormが少し古いバージョン（0.2.x）を使っていたので、0.3.xにアップデートしました。
その際、せっかくならばとDataSource APIに乗り換えました。

- Connection

```ts
const connection = await createConnection({
    type: "mysql",
    host: "localhost",
    entities: [Hoge, Fuga],
    // ...
});
```

- DataSource

```ts
const AppDataSource = new DataSource({
    type: "mysql",
    host: "localhost",
    entities: [Hoge, Fuga],
    // ...
})
```

## エラー

jest+typeormでテストを組んでいたら、以下の様なエラーになりました。

> EntityMetadataNotFoundError: No metadata for "Hoge" was found.

「あれーEntityの指定方法が変わって、Entityクラス直指定じゃダメなのかな。。。」等々、考えながら検索しても、entitiesでディレクトリをどう指定すればよいかみたいな話しか出てきませんでした。

## 解決策

initializeしてください。それだけです。。。

```ts
const AppDataSource = new DataSource({
    // ...
});
await AppDataSource.initialize();
```

いや、そりゃそうだよね。。。createConnectionの時はそれ自体が初期化だったので、抜けてました。エラーメッセージもうちょっと分かりやすくしてくれないかなぁ～
公式ドキュメントにもちゃんと書いてあるので、読みましょう。

## 参考：package.json

```json
  "dependencies": {
    "mysql": "^2.18.1",
    "reflect-metadata": "^0.1.13",
    "typeorm": "^0.3.9"
  }
```
【シェルスクリプト】ワンパンマンの最新話が更新されたらLINE通知を送る

## 概要
なんでもシェルスクリプトでやってしまいたい人です。
今回は人気漫画「ワンパンマン」の最新話が更新されるとLINE通知を送るという、
結構実用的な処理をシェルスクリプトでやっちゃいます。

## カラクリ
### ■最新話が更新されているかの判定
これが一番大事。結論から言うと、
**htmlのソース中の<font color="Red">「次の話を読む」という文字列があるかどうか</font>を見る**
です。
あのサイトでは、次の話がある/ないで以下の挙動を示すのだ。
- 次の話がある→漫画のページの最後に「次の話を読む」ボタンが表示される。
- 次の話がない→漫画のページの最後に「次の話を読む」ボタンは表示されない。

この性質を利用してやろうということだ。つまり、
**これまで最新話だったページのhtmlソースに対し'次の話を読む'という文字列に対してgrepをかけてやり、**
**ひっかかれば最新話が更新されている**
ということだ。
この判定処理を、数分おきとか定期的に行えば良い。

### ■最新話が更新されていたら、LINEのAPIを使って通知を送る
LINEには、POSTで叩くとLINE通知を送れるようなAPIが用意されているのでこいつを利用する。
メッセージ内容はPOSTパラメータとして渡せる。
このAPIの具体的な使用方法に関しては、[こちらの記事](https://qiita.com/keita69sawada/items/58a64b1d1cf640bc6039)などを参考にすると良い。

## もう少し具体的に
上記アイデアを実現するために、具体的には以下のようなシステムを構築する。
![ワンパンマン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524631/8c503b4f-d144-55c8-5535-200ebb080148.png)


以下で、実際にこのシステムを構築していく。

## シェルスクリプトのソースコード
シェルスクリプトのコードは以下の通り。
```sh:newepisode.sh
#!/bin/sh
urlfile=$(dirname $0)/latest.txt # 最新話のURLが貼ってあるテキストファイル
html=$(mktemp) # tmpファイル作成
# 最新話のhtmlを取得
# curl -s:余計な出力はしない
cat ${urlfile} | xargs -I{} curl -s {} > ${html}
# 次の話が追加されたかをチェック
cat ${html} | grep '次の話を読む' > /dev/null 2>&1
# 次の話が追加されている場合の処理
if [ "$?" = "0" ]; then
  # latest.txtの更新
  cat ${html} |
    grep '次の話を読む' |
    sed -e 's/>/\n/g' -e 's/</\n/g' -e 's/href=/\n/g' |
    grep '次の話を読む' -B1 |
    grep 'https:' > ${urlfile}
  url=$(cat ${urlfile}) # 最新話のURL
  # LINE通知
  curl -X POST -H 'Authorization: 認証情報' -F "message=
  最新話が更新されました
  ${url}" https://notify-api.line.me/api/notify > /dev/null 2>&1
fi
rm ${html}
```
※実際に使用する際は、以下のコマンドで実行権限を与えておく。
```
chmod +x newepisode.sh
```


## latest.txtを用意する
現在の最新話のページのURLを張り付けたテキストファイル(ファイル名:latest.txt)を、
上のシェルスクリプトと同じディレクトリに配置する。

## crontabの設定
1分おきに上のシェルスクリプトを実行する。

```:crontab
* * * * * スクリプトを配置しているディレクトリのフルパス/newepisode.sh
```
【LaTeX】TikZで座標をアンカー名で指定した時に生じるずれの解消法

## ずれてしまう例
例えば，下のような図形を描くと，線が僅かにずれてしまっているのが分かる．
```latex:bad-sample.tex
\documentclass[a4j,dvipdfmx]{jsarticle}
\usepackage{tikz}
\begin{document}
  \begin{tikzpicture}
    \tikzset{box/.style={rectangle, draw, text centered, inner sep=1em}}; %rectangleをboxとしてスタイル定義
    \node[box](box1) at (0,0)    {box1};                                  %座標(0,0)を中心としてbox1を描画
    \node[box](box2) at (0,-1.5) {box2};                                  %座標(0,-1.5)を中心としてbox2を描画
    \draw(box1.south west) --(box2.north west);                           %box1の south west からbox2の north west まで線を引く
  \end{tikzpicture}
\end{document}
```
全体図
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663103/e907ec71-1644-24d1-8110-fa70437de33d.png width="300px">
拡大図
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663103/4418beaf-8e61-aea7-a402-b3ed40624ef7.png width="290px"><img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663103/ecc3f35a-4bbc-63c1-d47e-8a8a7cae479c.png width="315.3px">
このずれは，アンカーが線の外側に定義されていることに起因する．
下の画像[^1]の✕印がアンカーの位置だ．
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663103/1387c079-96ca-38dd-486b-87a595fea95b.png width="700px">

つまり，図形の線の太さは既定だと0.4pxであるから，その半分の0.2px分右にずらせば解決する．

## 解決例
```latex:good-sample.tex
\documentclass[a4j,dvipdfmx]{jsarticle}
\usepackage{tikz}
\begin{document}
  \begin{tikzpicture}
    \tikzset{box/.style={rectangle, draw, text centered, inner sep=1em}}; % rectangleをboxとしてスタイル定義
    \node[box](box1) at (0,0)    {box1};                                  % 座標(0,0)を中心としてbox1を描画
    \node[box](box2) at (0,-1.5) {box2};                                  % 座標(0,-1.5)を中心としてbox2を描画
    \node[coordinate, xshift=0.2](box1sw) at (box1.south west) {};        % box1の south west からx軸方向に0.2pxずらした位置を中心としてbox1swを描画(文章を指定していないため，何も描かれない)
    \node[coordinate, xshift=0.2](box2nw) at (box2.north west) {};        % box2の north west からx軸方向に0.2pxずらした位置を中心としてbox2nwを描画(文章を指定していないため，何も描かれない)
    \draw(box1sw) --(box2nw);                                             % box1swからbox2nwまで線を引く
  \end{tikzpicture}
\end{document}
```
拡大図
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663103/62cb3c06-d70e-a947-7fe9-9cb51aaebee8.png width="400px">

[^1]: https://ctan.org/pkg/pgf PGF Manual 786ページより引用
(PyMuPDF) M1 Mac で "import fitz"できなかったがキャッシュ削除で解決した(備忘録)

### "import fitz”で問題が発生しました (PyMuPDF)

https://python-work.com/pdf-get-text/

の”import fitz"を実行できませんでしたが、キャッシュ削除で解決しました。
解決作業の備忘録です。

### 手順（以下の作業は、arm64上で行なっています)

##
```
name -m 

#arm64
```
arm64と返ってきたなら、以下を実行

そうでない場合は、Rosettaをoffにしてやる必要があります。

### 以下を実行
```
pip3 install fitz
brew install mupdf swig freetype
pip3 install PyMuPDF
pip3 install frontend
```

下記サイトの方法をpip3に変えるだけでは、

https://cdmana.com/2022/03/202203221858329522.html

```
pip3 install fitz
brew install mupdf swig freetype
pip3 install https://github.com/pymupdf/PyMuPDF/archive/master.tar.gz
＃ ERROR: You must give at least one requirement to install (see "pip help install")
pip3 install frontend
```
と、エラーになります。ちなみに、
```
pip3 install https://github.com/pymupdf/PyMuPDF/archive/master.tar.gz
＃ ERROR: You must give at least one requirement to install (see "pip help install")
```
で、インストールしたPyMuPDFは、
```
pip3 install PyMuPDF
```
で削除できます(そもそもインストールできていなかったかもしれませんが、時間の都合で検証できていません...)。



### 発生したエラーとその解決法
インストールコマンドの実行中、もしくはプログラム実行時にエラーが出る場合、以前利用したpip3やbrewのキャッシュが残っていることがの場合もあるようです。今回発生していた"import fitz"のエラーは、こちらが原因だったようでした。
```
pip3 cache purge
```
brewが原因なら、

https://qiita.com/laiso/items/92c9f894bcd68d84c52d

を参考にして、brew install mupdf swig freetypeでインストールしたものを削除して
```
brew cleanup -s
```
今回は、以下の手順で解決しました。
```
pip3 uninstall fitz
pip3 uninstall PyMuPDF
pip3 uninstall frontend
pip3 cache purge
brew cleanup -s
# ここまで既存パッケージの削除
# ここから再インストール
pip3 install fitz
# 以下のbrew installの行は、不要かもしれません
brew install mupdf swig freetype
# 以下は、必ず必要なはず
pip3 install PyMuPDF
pip3 install frontend
```

無事、PyMuPDFを利用して、PythonでPDFを読み込みテキストを抽出できるようになりました。

### 感想
試行錯誤しても、なかなかエラーが取れなかったので解決できてホッとしました。
原因がわからない時にログを読むのは大変でしたが、読みが当たって解決するとやった甲斐を感じますね！


### その他のエラーとその解決法



### その他、参考

https://stackoverflow.com/questions/69160152/pymupdf-attributeerror-module-fitz-has-no-attribute-open

https://www.web-dev-qa-db-ja.com/ja/git/pip%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6git%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E3%82%A2%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F/942577670/

https://qiita.com/laiso/items/92c9f894bcd68d84c52d

https://macgarage.jp/homebrew-uninstall/

https://github.com/pymupdf/PyMuPDF/discussions/875

```
    raise RuntimeError(f"Directory '{directory}' does not exist")
RuntimeError: Directory 'static/' does not exist
```
で、怒られた場合は

https://stackoverflow.com/questions/67982760/raise-runtimeerrorfdirectory-directory-does-not-exist-runtimeerror-dire


https://cdmana.com/2022/03/202203221858329522.html
SPSS Modeler ノードリファレンス 4-9 線グラフ

# 4-9 線グラフノード[グラフ作成タブ]
<img width="200" alt="194_161線グラフ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1c343008-8c19-da62-730a-c8929b0a1f72.png">


## 1.ノードの目的
複数の系列を折れ線でグラフ化します。

## 2.解説動画（60秒）

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

## 3.クイックスタート

[可変長ファイル]でデータを読み込み[グラフボード]に接続します。
＊サンプルデータ（CSV）は[5.参考情報]からダウンロードできます。

<img width="400" alt="スクリーンショット 2022-05-06 15.12.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/632a9d6b-2eca-4dfb-efac-5d368d3b3782.png">

[線グラフ]を編集して以下のように設定して[OK]ボタンを押します。

![スクリーンショット 2022-09-15 9.02.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e03ce3cd-f004-0770-364c-9ac7a31f9cfb.png)

線グラフがゲインチャートが表示されました。

![スクリーンショット 2022-09-15 9.07.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/be79bf14-715d-2850-767f-d2792395d47a.png)

ゲインチャートについては以下で詳しく扱っています。

https://qiita.com/416nishimaki/items/89f21513aa53a7c18849

## 4.Tips

#### 評価グラフ

[評価グラフ]で[ゲイン] を選択すると同じチャートを出力可能です。

![スクリーンショット 2022-09-15 9.09.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a23ff997-f860-6755-e004-d48bd6407af4.png)

#### 新グラフ（Ver18.2以降）

右クリックメニュー[データの表示]から新グラフで作成した例は次の通りです。

![スクリーンショット 2022-09-15 9.18.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d4466b5b-8d05-ec02-40fe-ae637a90d9f3.png)

新グラフの利用方法と[グラフボード]との比較は以下の記事で解説しています。

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-04/

## 5.参考情報

#### 利用データ

右クリックでリンク先を保存してください。

https://raw.githubusercontent.com/yoichiro0903n/blue/main/cumulative_failure_rate.csv

#### ノードのヘルプ

https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=nodes-multiplot-node

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee
7日前の値/移動平均との増減率を求める(SPSS Modeler データ加工逆引き4-12)

# 7日前の値/移動平均との増減率を求める

![スクリーンショット 2022-09-04 9.19.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d99a6a20-ab82-8355-bc2f-2c59e16bbc7f.png)

## 1.想定される利用目的

・機械学習モデルでトレンド予測する際に特徴量として利用する
・顧客の特定行動から特徴量を作成する
・設備ログから特定イベントの経過日数を特徴量にする

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/7days_average.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-09-04 9.19.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/91a92c05-94fc-318e-74eb-898e63d8ad48.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-09-04 9.21.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/07f2fe37-30bd-39b6-75f5-3d4290640577.png)

b.[フィールド作成]ノードを編集します。7レコード上の来場者数を関数[@&#xFFF0;OFFSET(来場者数,7)]で参照します。
![スクリーンショット 2022-09-04 9.22.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fb18a070-ac24-0960-b3c5-62bc95f1ec67.png)

式ビルダーから@&#xFFF0;関数を探すと簡単に入力できます。
![スクリーンショット 2022-09-04 9.23.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/036cb4ad-89da-fab2-bde8-9de56ac7b4b2.png)

c.[フィールド作成]ノードを編集します。bと同じ要領で増減率を求めます。
![スクリーンショット 2022-09-04 9.24.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2a72646a-f589-e4e7-fa05-271c608f5b5e.png)

[プレビュー]します。増減の数と比を得られました。
![スクリーンショット 2022-09-04 9.24.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/129c7c27-4ff0-afdf-0919-d8750c20b596.png)

d.[フィールド作成]ノードを編集します。7日間移動平均を関数@&#xFFF0;MEANで求めます。8行目から計算されるようにしてあり、7行目まではNULLにしています。
![スクリーンショット 2022-09-04 9.25.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b5cffcdc-5755-a4e8-8226-417e695ed1b3.png)

e.[フィールド作成]ノードを編集します。移動平均をそれぞれの時点で７日前と比較しています。
![スクリーンショット 2022-09-04 9.25.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6169a45e-cf8b-f016-f9a1-be5c9abac605.png)

[プレビュー]します。
![スクリーンショット 2022-09-04 9.26.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fb7ea23d-7719-e466-7236-cefa5e09c0ad.png)


#### 注意点

移動平均は該当レコードを含むように計算しましたが前日までを対象とする場合もあります。

https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-13/

## 4.参考情報

#### 移動平均を扱った記事

https://qiita.com/416nishimaki/items/bfcfd38557e7bc5982b5

https://qiita.com/1000aki/items/964e4190cf0ce72867f3

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
Heroku+Railsでバッチ処理を作成する

# 目的
個人開発のRailsアプリで、1日1回メール配信を行うバッチ処理を作る必要があり、調べて実装した時の備忘録です。

メール配信はsidekiqで非同期処理させており、開発環境ではsidekiq-schedularで24時間周期で起動させていました。
しかし、本番環境で利用しているHeroku（無料枠）では、30分でWebサーバがIdleになるため、うまく動作しませんでした。このため本番環境ではHerokuのアドオン(Heroku-schedular)を使った構成にしています。

スモールスタート等でRails＋Heroku構成を選択される方は多いと思いますので、参考になれば幸いです。

# 開発環境
+ Rails 6.0.3.3
+ Heroku FreeDyno

# 手順
手順はシンプルです。１はRails、２と３はHeroku側で行います。順を追って説明します。

1. 実行したいタスクをrakeファイルに書く  
2. Heroku-schedularをアドオンする
3. Heroku-schedularにスケジューラを設定する

### 1. 実行したいタスクをrakeファイルに書く 
/lib/tasksの下にrakeファイルを作成してタスクを記述します。
rakeタスクの詳細については[こちら](https://railsguides.jp/command_line.html#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0rake%E3%82%BF%E3%82%B9%E3%82%AF)


```ruby:sample.rake
desc "This task is called by the Heroku scheduler add-on"
task :task_name ,[:arg_1] => :environment do
  # 処理を書く
end
```

:task_nameはタスクの名前です。タスクを実行する時に使います。:arg_1は引数で必要な場合はこの様に記載します。タスク内でDBにクエリを投げる時には```=> :environment```も記載します。

rakeファイルを作成したら、consoleからrakeコマンドで動作確認します。

```
rake task_name
```

### 2. Heroku-schedularをアドオンする
HerokuコンソールのResourcesタブから、Add-onsメニューでHeroku Schedularを検索します。Heroku Schedularを選ぶとプランを選択画面がポップアップされます。Plan nameが「standard-free」になっていると思いますが、そのまま変えずにSubmit order formを押すとアドオンされます。

### 3. Heroku-schedularにスケジューラを設定する
アドオンが完了すると、HerokuコンソールのOverviewにあるInstalled add-onsにHeroku Schedularが追加されているので、選択すると、スケジューラ設定画面に遷移します。Add jobで新しいジョブスケジューリングを設定できます。Run Commandのところに定期実行するコマンド（rake task_name）を記載します。実行時間はUTCなので注意してください。

以上
CSS手書き風テキストアニメーション

# inkscapeでテキストを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/da7d5c89-6b5f-b7bd-600b-ce740b785479.png)

## SVGは下記のように<text>タグ内に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/5bdc1e41-b8ce-7717-a7e2-2ea090afa10f.png)

# テキストをパスへ変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/4d32545a-1d59-e594-c321-179c5b6fbdab.png)

## テキストはパス化される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/374c4981-3b4a-3d54-f005-97391ad657c9.png)

# アニメーションCSSの設定
```css
    <style>
        /* --- テキスト --- */
        path {
            fill: none; /* 1,塗りの色 */
            stroke: #000; /* 2,線の色 */
            stroke-dasharray: 2000; /* 3,破線の間隔 */
            stroke-dashoffset: 2000; /* 4,破線の開始位置 */
            stroke-width: 1; /* 5,線の太さ */
            animation: handwriting 3s ease-in forwards; /* 6,名前 時間 タイミング 終了後の状態 */
        }

        /* --- アニメーション --- */
        @keyframes handwriting {
            0% {
                fill: transparent; /* 1,塗りの色 */
                stroke-dashoffset: 2000; /* 4,破線の開始位置 */
            }
            50% {
                fill: transparent; /* 1,塗りの色 */
            }
            100% {
                fill: #000; /* 1,塗りの色 */
                stroke-dashoffset: 0; /* 4,破線の開始位置 */
            }
        }
```
Python,Ruby,PHP,Java,JavaScript,Perlの文字コードの比較 | プログラミング言語比較

<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlの文字コードの比較

# Python

https://qiita.com/ny7760/items/d9c247781a790210936d

# Ruby

https://qiita.com/ima1zumi/items/28ef13f5af3d9afdeaf3

# PHP

https://qiita.com/suin/items/3edfb9cb15e26bffba11

# Java

https://qiita.com/motoki1990/items/cee6a4a75c0320b79ec4

# JavaScript

https://qiita.com/weal/items/3b3ddfb8157047119554

# Perl

https://perlzemi.com/blog/20161006147575.html
Docker + NestJS + TypeORM + GraphQL


## 初めに
社内発表のため、Docker + NestJS + TypeORM + GraphQLでプロジェクトを作ってみました。
実行した結果は以下のGITHUBを参考してください。
Docker以外には全部新しい経験だったのでこのプロジェクトを作成した時に知っておくべきの知識をまとめてみました。
[コードはここを参考](https://github.com/nys93/nestprj)

## NestJS+GraphQLの組み合わせに関して重要な理解ポイント
NestJSとGraphQLが組み合わさると、通常MVCパターンで最初に構成されるNESTの使い方が少し変わってきます。MVCの中でControllerが消え、代わりにその場をResolverが担当します。GraphQLでResolverとはQueryとMutation(定義は↓参考)を提供するLayerであると考えれば簡単だが、Controllerの役割がURLとリソースを受け取る役割であれば、ResolverはGraphQLの特徴であるQueryとMutationを受けて、その結果をクオリでリターンする。

[QueryとMutationは？]
Query → SELECT分に使える. RESTでGETと該当
Mutation → INSERT, UPDATE, DELETEに使える。RESTではPOST,PUT,PATCH,DELETEに該当


## NestJSに関して重要な理解ポイント


### 📌 MODULE

NESTJSで最も重要な部分の一つはモジュールです。

![Screen Shot 2022-09-10 at 12.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/e3950a0a-f33d-fde1-474f-50c5d4ae64b2.png)

NestJSでは、アプリケーションを正常に実行するために、各モジュールを集めて、一つのルートモジュールを設定する必要があります。
例えば、注文アプリケーションを作成する場合、図のようにユーザーモジュール + 注文モジュール + チャットモジュールを組み合わせてNestJSアプリケーションを実行します。 

![module-Page-4.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/076ec987-84d6-545d-44f6-51727635682a.png)

モジュールをどう設計するかはどこまでもプログラマの自由ですが、逆にこれを悪く設計した時は
難しいプロジェクトになる可能性が高いです。

### 📌 プロジェクト構成

NESTJS基盤のプロジェクトを作成すると以下のようにapp.module.tsが作成されます。

👉 main.ts:サーバ駆動時に実行されるファイルである。 

👉 app.module.ts:　main.tsで唯一呼び出すモジュールである。 該当モジュールに使用したいDB接続、モジュール、GraphQL設定ができる。

👉 ＊.module.ts:使用するコントローラ、サービスまたはResolverなどのモジュールで使用するLayerを定義する。 該当モジュールを使用するためにapp.module.tsにインポートされなければならない。

👉 ＊.resolver.ts:queryまたはmutationを受けてサービスレイヤーに伝達する。

👉 ＊.service.ts:サービス、ビジネスロジックを処理する。

👉 ＊.entity.ts:DBに生成されるオブジェクトを定義する。

### 📌 @
Javaでは＠はannotationと呼ばれますが、NESTJSではdecoratorです。


## TypeORMの重要なポイント
### 📌 Active Record Pattern VS Data Mapper Pattern
TypeOrmの大きな特徴の一つは、作成パターンにActiveRecord PatternとData Mapper Patternがあります。Active Record Patternは、Model自体内ですべての Query Methodを定義し、Model Methodを使用してObjectを生成、削除、照会、修正できるようにする方式を意味します。
Data Mapper Patternは、「Repository」という別のClassで、すべてのQuery Methodを定義し、この「Repository」を使用してObjectを生成、削除、照会、修正することができます。

詳細は以下を参考してください。

[Active Record vs Data Mapper](https://github.com/typeorm/typeorm/blob/master/docs/active-record-data-mapper.md)

## まとめ
今回、Docker + NestJS + TypeORM + GraphQLの構成は色々新しい情報が多いし、boilerplateプロジェクトでもあって、良い設計とか詳しいところは全然気にしなかったです。
次はこのプロジェクトをRefactoringしながら、それぞれの技術の長点を最大活かせる方法に関して
工夫してみたいと思いました。
WindowsのGit bashでシェルスクリプトを実行するショートカットを作る

## TL;DR

シェルスクリプトのショートカットを作り、右クリックメニューからプロパティを開きます。
「リンク先」項目に以下の内容を記述します。

```cmd:ショートカットのプロパティのリンク先
C:\WINDOWS\system32\cmd.exe /c ""C:\Program Files\Git\bin\bash.exe" -i script.sh option"
```

## 解説

### `cmd /c`

実行完了するとウインドウを閉じます。実行完了後にウインドウを閉じたくない場合はオプション`/c`の代わりに`/k`を使います。

### `"C:\Program Files\Git\bin\bash.exe"`

gitのインストール時についてくる`bash.exe`のフルパスを指定します。
環境変数`PATH`に`bash.exe`までのパスが指定してあれば`bash.exe`でも問題ありません。
今回は`Program Files`フォルダ以下に入っているので、スペースでコマンドが分割されないように`bash.exe`までのパスをダブルクォーテーションでくくっています。

### `bash.exe -i script.sh`

`bash.exe`のオプション`-i`は「対話モードで実行」です。
`-i`がないとシェルスクリプト内の一部コマンドが実行されないようです。

### `"bash.exe -i script.sh option"`

`script.sh`は実行したいシェルスクリプトファイルを、`option`はシェルスクリプトファイルに渡したいコマンド引数を指定できます。
`option`はスペース区切りで列挙することで複数でも指定できます。
`bash.exe`がオプション付きシェルスクリプトを実行することを`cmd.exe`に伝えるため、シェルスクリプトを実行するコマンド全体をダブルクォーテーションでくくる必要があります。