OmniAICreator/Qiita-1.07M huggingface dataset:
行番号のフォーマットを変更するnlコマンドのnオプション

nlコマンドはnオプションを指定することで、行番号のフォーマットを変更することができます。変更できる書式は「左詰め」「右詰め」「ゼロ埋め」の3つです。

#ｎオプションの使い方

まずはマニュアルを参照してみましょう。

## info nl (GNU coreutils)
```console
‘-n FORMAT’
‘--number-format=FORMAT’
     Select the line numbering format (default is ‘rn’):

     ‘ln’
          left justified, no leading zeros;
     ‘rn’
          right justified, no leading zeros;
     ‘rz’
          right justified, leading zeros.
```

## man nl (BSD)
```console
     -n format    Specify the line numbering output format.  Recognized format
                  arguments are:
                  ln      Left justified.
                  rn      Right justified, leading zeros suppressed.
                  rz      Right justified, leading zeros kept.

                  The default format is rn.
```
つまり、`-n`の後に

ln：左詰め
rn：右詰め（デフォルト）
rz：右詰めゼロ埋め

のいずれかを指定すればいいことがわかりますね。`-n`を指定しないときは`-n rn`が指定されたのと同じ動きになります。また、coreutilsの`nl`ではロングオプション形式もサポートしており`-n ln`を`--number-format=ln`と指定することもできます。わざわざ長いオプションを書くのは面倒ですが、何のオプションなのか明確になるので可読性は向上します。
そしてマニュアルを読む限りにおいて、これら2つの実装は`-n`の機能差はありません。しかしbusyboxの`nl`は残念ながら`-n`のオプションそのものをサポートしていません。

## POSIX

せっかくなので、フォーマットに関しては標準ドキュメントであるPOSIX（IEEE Std 1003.1-2017）も眺めてみましょう。

> STDOUT
The standard output shall be a text file in the following format:
>
"%s%s%s", \<line number\>, \<separator\>, \<input line\>
>
where \<line number\> is one of the following numeric formats:
>
%6d
When the rn format is used (the default; see -n).
%06d
When the rz format is used.
%-6d
When the ln format is used.
\<empty\>
When line numbers are suppressed for a portion of the page; the <separator> is also suppressed.
In the preceding list, the number 6 is the default width; the -w option can change this value.

出典：https://pubs.opengroup.org/onlinepubs/9699919799/utilities/nl.html

C言語のフォーマット指定子によって、出力は`<line number>` `<separator>` `<input line>`の3つの文字列の組み合わせ`%s%s%s`であると記載されています。そして、`<line number>`は`%6d` `%06d` `%-6d`といずれも10進の符号付き整数であり、デフォルトでは6桁となっているようです。

# nオプションを試す

前置きが少々長くなってしまいましたが、それでは[最初の記事](https://qiita.com/Carol_815/items/d1081ff7a7d3f9971edc)で使用したテキストファイル「utl-kita」で実際に試してみましょう。

左詰め

```console
$ nl -n ln utl-kita
1     	東京
2     	上野
3     	尾久
4     	赤羽
5     	浦和
6     	さいたま新都心
7     	大宮
```

右詰め（デフォルト）

```console
$ nl -n rn utl-kita
     1	東京
     2	上野
     3	尾久
     4	赤羽
     5	浦和
     6	さいたま新都心
     7	大宮
$ nl utl-kita
     1	東京
     2	上野
     3	尾久
     4	赤羽
     5	浦和
     6	さいたま新都心
     7	大宮
```

ゼロ埋め

```console
$ nl -n rz utl-kita
000001	東京
000002	上野
000003	尾久
000004	赤羽
000005	浦和
000006	さいたま新都心
000007	大宮
```
しっかり6桁であることも確認できました。

# 余談

なぜフォーマットに`lz`「左詰めゼロ埋め」が存在しないのでしょうか、一瞬考えてしまいました。
`100`を6桁で左詰めゼロ埋めすると`100000`になりますね。ぜひ銀行口座の残高などで積極的に使ってほしい書式です。
【Spring】データベースから取得できない

###環境
Windows10
SpringBoot(v2.4.0)
pleiades 2020
MySQL 8.0

###エラー

```
com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string [データベースのデータ]
```

###原因（型の不一致）

Entityクラスの型が間違っていました。

- データベースはVARCHAR
- EntityクラスでInteger

にしていました。

###解決法（Entityクラスの型をStringにする）

```java
private Integer [カラム名]
↓変更
private String [カラム名]
```

ただこれだけ。


初心者にありがちなミス。エラーをそのままググっても英語ばかりでなかなか見つかりません。

とりあえず
`Cannot determine value type`
とあるように、`value type = データ型`
としっかり見定めてからググるべきでした。
CVCurveToolで作成したカーブのpositionをpythonで計算する


mayaでカーブの特定の箇所のPositionの情報を取ろうとしたら、control vertexのPositionは取れるけど特定の場所のPositionを取得するようなコマンドがない！
(よく探してないので実際はコマンドあるかもですが…)
じゃあカーブを1から計算してPositionを割り出そう！というお話です。
![2020-12-03_14h38_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529842/c2baf1b5-ca5a-c82a-4474-a4a13c7ac4ed.png)

##**はじめに**
mayaのCVCurveToolで作られるカーブは種類で言うとB-スプライン曲線になります。
[wikipedia](https://ja.wikipedia.org/wiki/B-%E3%82%B9%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E6%9B%B2%E7%B7%9A)によるとB-スプライン曲線とは、与えられた複数の制御点とノットベクトルから定義される滑らかな曲線だそうです。
複数の制御点＝control vertexなのであとはノットベクトルが分かれば計算できそうです。

##**ノットベクトルとは**
ノットベクトルは、制御点がNURBS曲線のどこにどのように影響を与えるかを決定するパラメータの値(ノット)の列です。ノットの数は常に制御点の数＋曲線の次数＋1に等しくなります。
仮にmayaのデフォルトのままで曲線の次数(CurveDegree)を3、制御点(control vertex)を最小で4とするとノットの数は8となります。
![2020-12-03_15h42_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529842/d52618dc-82c3-d873-9dd3-8d3d77da1e27.png)

##**pythonで計算**
計算にはnumpyとscipyを使用します。mayaへの導入の仕方は説明してくれているサイトがけっこうあるので割愛します。
下記がコードになります。

```python
import numpy as np
from scipy import interpolate
import maya.cmds as cmds

ctr = np.array([(0, 0), (1, 1), (2, -1), (3, 1), ])
x = ctr[:, 0]
y = ctr[:, 1]

l = len(x)

t = np.linspace(0, 1, l - 2, endpoint=True)
t = np.append([0, 0, 0], t)
t = np.append(t, [1, 1, 1])

tck = [t, [x, y], 3]

sample = np.linspace(0, 1, (max(l * 2, 70)), endpoint=True)
out = interpolate.splev(sample, tck)
for x, y in zip(out[0], out[1]):
    cmds.spaceLocator()
    cmds.move( x, y, 0 )
    cmds.scale( 0.05,0.05,0.05)
```
`(0, 0), (1, 1), (2, -1), (3, 1)`が制御点になります。
それをその次の行でx,yに分けています。

```python
ctr = np.array([(0, 0), (1, 1), (2, -1), (3, 1), ])
x = ctr[:, 0]
y = ctr[:, 1]
```
tがノットベクトルになります。
tの先頭に[0, 0, 0]と末尾に[1, 1, 1]に追加しています。このように複数のノットに対して、同一の値を与えることで曲線が制御点の上を通るようになりカーブの始点と終点の制御点が一致するようなります。

```python
l = len(x)
t = np.linspace(0, 1, l - 2, endpoint=True)
t = np.append([0, 0, 0], t)
t = np.append(t, [1, 1, 1])
```
scipyのsplevという関数を使用するのでそれ用にデータを整形します。
・ノットベクトル
・制御点(x,y)
・曲線の次数
上記を一つにまとめます。

```python
tck = [t, [x, y], 3]
```
`sample `はどれくらいの間隔でPositionを取得するかの値になります。70のところを大きくすると取得できるカーブが滑らかに、小さくするとカクカクになります。
`interpolate.splev(sample, tck)`でカーブを出力して`out`に格納しています。

```python
sample = np.linspace(0, 1, (max(l * 2, 70)), endpoint=True)
out = interpolate.splev(sample, tck)
```
計算としてはここまでですがせっかくなので、maya上に表示してみます。
取得したPositionの所にLocatorを配置していきます。

```python
for x, y in zip(out[0], out[1]):
    cmds.spaceLocator()
    cmds.move( x, y, 0 )
    cmds.scale( 0.05,0.05,0.05)
```
表示されました！mayaのカーブの位置と一致しているのも確認できました。
![2020-12-03_16h36_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529842/00a2d0bc-6f6c-e745-dac5-fad9613f2f99.png)

##**おわりに**
今回は実験として平面空間でやりましたが、立体空間でも同じようにできるかと思います。
あまり応用が利く感じではないですが、カーブの仕組みを理解しておくと色々役に立つので参考になれば幸いです。
FigmaのAutoflowを使って画面遷移図を書く

# はじめに
Figmaを使う機会があったのでメモとして残します。
Figmaはデザインツールですが、画面デザインと一緒に画面遷移図も見れたらいいなと思って調べてみると「Autoflow」というプラグインがあったので使ってみました。

# 前提
- Figmaのデスクトップ版をインストール済み
- コンポーネントを作れる

# Autoflowのインストール方法
メニューの[Community]->[Plugins]を選択します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869527/ffd209de-0cae-6324-36b0-146f9389c1e6.png)
「Autoflow」を見つけて[Install]します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869527/e2772cb9-756d-3aa5-d5e0-3dab05893cd2.png)
以上

# 実際にやってみる
まずは画面名を書く箱をコンポーネントで適当に作ります。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869527/ede57ad8-5c9b-74af-ad97-0ed4b192230f.png)
画面遷移図を書きたいPageでコンポーネントからコピーしたいくつかの画面を並べます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869527/0dcd7b5a-3802-60a2-cf42-5e38109a7832.png)
右クリック->[Plugins]->[Autoflow]でAutoflowのウィンドウを出します。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869527/d8011cf2-5674-95dd-0a13-81a25ebc1ee4.png)
Shiftを押しながら繋げたいボックスを選択すると
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869527/eb8bfffc-166f-db4f-f1a7-4656e2689a4b.png)
勝手に矢印を引いてくれます。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869527/2694097f-e862-9c12-4bb8-a3a6f3d447e8.png)
自由度はあまりなさそうですが、シンプルで素早く作れるので便利です。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869527/4dfd51d5-ae47-a3d8-bd19-7b9726152d36.png)

# 最後に
Figmaを使っていて、シンプルな遷移図やフローを書くならExcelより早いし便利だと思いました。
何より画面デザインと並べて見れるのが助かります。

# 参考
- [Figma-Autoflow](https://www.figma.com/community/plugin/733902567457592893/Autoflow)
専門学校でプログラミングを勉強する学生にささげる高効率学習環境[Vim]

#はじめに
さて，当方は専門学校でASCII C，Java(Tomcat含む)，OracleSQL等を勉強する学生である
今回はDOS窓で完結する超ウォークスルーな開発環境を
提案したいと思う
なお今回は初学者向けという事もあり使うのはプレーンなvimであることをご了承いただきたい
またNeoVimなどと違いインストーラーを公式でダウンロードしてインストールすればまずどこの環境でも動くので導入に関しては割愛する
但しVimのインストーラーはパスを通してくれないので
そこは適宜調べて設定してもらいたい
パスを通さないとコマンドラインで素直に動かないので後述する利点が半減してしまう
#私の提案する開発環境はVimです
なぜvimなのか
* ヒントが無い
* 非常に軽い
* 異常終了系に強い
* デフォルトでSJISな事
* キーボードで完結する
* ほぼすべてのまともなLinuxデストリビューションでvimやviが入っている為慣れておくとサーバ系実習でリードできる
###コードヒントが無いと何故良いのか
AtomやVSCodeを使っている民は経験があるかもしれないが超便利なコードヒントが出る
VSCodeなんかはmainと打っただけで

```java
public void main(String[] args){
    /*中略*/
}
```
が自動入力されたり，コンパイルを通す前何か文法的なエラーがあるとごねてくれたりする
一見便利なように見えるが
この機能があるがために(文字打って/コンパイル通してエラー出して)覚えるという貴重なタイミングを逃してしまうのだ
人間とはなんと怠惰な生物なのだろう
###非常に軽い
CUIベースのソフトウェアな事，コードヒント等裏で動く物が無い為GUIソフトよりも軽く
非力なネットブックを買ってしまっても安心してコードを書ける
またそれで実習等でDatabaseサーバなんかを起動してしまった場合でも安定して動かせることがとても大きい
###異常終了系に強い
デフォルトのvimはswpファイルを自動的に生成するため万が一強制終了してしまってもRキーで復帰できることが多い
復帰できていることを確認したら
:wqコマンドで保存し，もう一度開いてDキーでswpファイルを消してしまおう
但しswpファイルなどはデフォルトで編集中のファイルと同じディレクトリで生成されてしまうため
ソースコードを置いているディレクトリやコンフィグが置いてあるディレクトリなどが雑然としてしまう難点が存在するが
設定ファイルを変更してバックアップファイルを生成するディレクトリを変更することをお勧めする
###デフォルトでSJISな事
ここで？？？となった方も納得された方の二パターンに分かれたと思うが
javacやbccなどのコンパイラのデフォルトはShift-JISな為
AtomやVSCodeなどのグローバルなエディタではUTF-8なエディタだと
高確率で不可解かつ学習の面で見ても無意味なバグが発生する
無意味というのは少々言いすぎな感じも否めないが
文字エンコードに関して勉強するとき以外はこのエラーとは無縁でありたい
なおJavacでは-encodingオプションを用いればエンコードが指定できるが抜本的とは言えないし
Web系などを勉強するときを除いてUTF-8をデフォルトで使う言語コンパイラも少ないこと
本校ではWebはサクラエディタ，それ以外はTeraPadを推奨されている事情を鑑みても
**WebとWeb以外のプログラミングではエディタを分けることを推奨したい**（因みに私はNeoVimをWeb系用に用いている）
###キーボードですべて解決すること
コマンドラインエディタの為当然CUIである
むしろここが慣れないという事で敬遠されがちだが
数個の基本操作とモード切替を覚えるだけで一応Vimを使えるようになったと
周りのクラスメイトに自慢できる
そればかりか
（メモ帳等を開く）→ （コーディングして保存）→ マウスを動かしてDOS窓を立ち上げて javac 某.java　なんてやらずとも
（DOS窓を開く）vim 某.java →　（コーディングして保存）→ javac 某.java で1手数の削減になる
**高速なプログラムを作るにはデカい箇所で高速化するよりもループの中を一ミリ秒でも高速化した方が早い**ように
1手数を削減してより多くのコードやコーディングスタイルを学び，デバッグを進め
制作活動を高速化しよう！
#おまけ
コマンドモード（vimを起動した直後のモード）
**:w**  保存
**:w!** 強制的に保存（vimrcを壊したときぐらいしか使い道が無い気がする）
**:wq** 保存して終了
**:q**  終了
**:q!**  保存せずに終了（:!qはダメ）
**/検索したい文字列** 検索
**:%s/置換前/置換後/**  置き換え
**:%s/置換前/置換後/g** 全て置き換え
**y** コピー(vimではヤンクという)
**そしてy** その行をコピー
**もしくは上下キー** その行と上下の行をコピー
**d** 切りとり
**そしてd** その行を切りとり(ddは行削除にも使えるぞ！)
**もしくは上下キー** その行と上下の行を切りとり
**p**　ペースト（貼りつけ）

編集モード（左下に編集と表示されてる時のモード）
Escキー　コマンドモードに戻る
#最後に
ここではVimの基本的な使い方とVim等のコマンドラインエディタがいかに効率的な物であるかという事を書いたつもりだが
どうだっただろうか
コードの書ける優秀な初心者も描けない駆け出し初心者も操作手数を減らせば確実に早くなれるので
VimやEmacsを頑張って使って幸せになってもらいたい

（突っ込まれそうなので追記）
なおGUIのエディタを使うなという話ではなく
GUIなエディタでも優秀なモノは多々あるし
自由に大きな範囲のコピペなどが出来るという利点は大きい
コードヒントも制作作業何かでは重宝するしあっても良い局面がある
一つだけ言えることは
新しく見たクラスやメソッドはきちんとリファレンスを引こうという事だけで
闇雲にコードヒントやコード補完に頼るのも良くないしVimとかを使うと手数が減るしサーバ系触るなら
絶対使えた方が良いのでVimって言うお話です
Notionでコードブロックにキャプションを付ける

アルプ株式会社でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2020](https://qiita.com/advent-calendar/2020/notion) 3日目のエントリです。
2日目は[Notionでブラウザのアドレスバーからページを作成する notion.new](https://qiita.com/pictiny/items/f04c7200251c6997cb80)でした。

# コードブロック
Notionではページ内にコードブロックを作ることができます。
参考:[コードブロック](https://qiita.com/pictiny/items/bb1b30739546ba762629#%E3%82%B3%E3%83%BC%E3%83%89%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF)

コードブロックにはキャプションを付けることができます。
コードブロックの右上をマウスオーバーすると `Caption` のボタンが表示され、キャプションを追加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/0997f444-740b-bca7-1190-99fb831ae030.png)

キャプションはコードブロックの下部に表示されます。

# まとめ
コードブロックにタイトルや説明を付けるときはキャプションで書いておくと、1つのブロックになり、ドラッグ・アンド・ドロップでの操作がしやすくなります。
参考: [ブロック](https://qiita.com/pictiny/items/11b5ce7fdf203beacfdc#%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF)

コードブロックについては[Code blocks](https://www.notion.so/Code-blocks-69df2788f65345bbbe18596cfa1750fe)に公式ドキュメントがありますので、そちらもご覧ください。
C++でマインスイーパを作る！⓪（挨拶）

<b>　　　※実際のコーディングは次回から行います！　今回は挨拶なので何なら飛ばしてください。※</b>

##ご挨拶
　はじめまして、ミチョと申します。
　私は5月に初めてHTML/CSSに触れ、雰囲気で趣味のweb制作を続けてきました。その中で、Javascript/PHP/Javaも少し勉強したのですが（<b>Progateはいいぞ</b>）、正直言って……

<b>　　他に何を作ればいいのか分からん‼</b>

　これにより、全てのモチベが尽きていました。
　実は2-3月ごろにC++の勉強もしていたのですが、これと同じ理由でしばらく手を引いていました。

　が、もうすぐ2020年も終わろうという今日この頃、せっかくなので何かしら簡単なゲームでも作れないかと思い立ち、C++の解説書やオセロの作り方の動画を参考にしながらなんとか作ってみたわけです。
　オセロの制作は意外にも上手くいきました。
　↓↓こんな感じで……↓↓
![othello.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920221/0387500c-29e9-d896-aae4-7710c44f27ab.png)

>①WASDでカーソル（◎）の移動を制御できる
②ターンの概念があり、先手（●）の次に後手（〇）のターンが回ってくる
③石を置けるマスの数が表示される（どこにも置けない場合はターンがスキップされる）
④そして何より、石をひっくり返すことができる

　と、基本的なオセロの機能を一応備えたゲームにすることが出来ました。
　↓↓そして、返す刀で「今度はマインスイーパを作ろう！」と思い立ち、夜中にひたすらコーディングをしてこちらも完成させました。↓↓
![minesweeper.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920221/2bb91c29-903e-6b33-464c-b7a5e8b96390.png)

　短期間かつ初歩的ながら2つのゲームを実際に作ってみて分かったことは、

<b>　　実際に作らないと作れるようにならん‼(？？？)</b>

　ということです。そりゃ挫折もするわ。

　もう少ししっかり述べてみましょう。
>①1作目（オセロ）を作るのにはリアルに3日かかった
②2作目（マインスイーパ）を作るのには1日もかからなかった
③オセロとマインスイーパの制作難易度の違いを加味しても、問題を自分で解決することによる時間短縮が大きかった

　このことから、<b>プログラミング学習における挫折を克服する方法はプログラミング学習を行うこと</b>と考えたわけです。めちゃくちゃアホっぽい文章になってしまいましたが、要は<b>やらなきゃ分からない</b>ということです。

　おそらく私と同様、「作ったことがないから作れない」という状態の方がたくさんいらっしゃると思います。そこで、自分の頭を整理することに加え、そうした方々のための指針になれば良いなと思い、僭越ながらマインスイーパの制作過程をまとめていきたいと思います。よろしく！！






＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
　読んでいただきありがとうございました。
　未熟者ゆえ、いたらぬ点が多くあると思います。分からなかった箇所に関してはご質問いただければ返せる範囲でお返事させていただきます。また、間違っている点や改善点などありましたら存分にご指摘ください。真摯に学ばせていただきます。
　　　　　MICHO
UIFlow でウオッチドッグっぽいのを実装する

## はじめに
M5Stack/Stick でUIFlowによる運用を行っています。
通信エラーやWi-Fi接続が悪い場合など，エラー処理ができずフリーズする場合があり，
ウオッチドッグタイマーっぽいのを実装して対策をしてみます。

## 開発環境
・M5Stick-C
・UIFlow(Bata1.66)　Micropython v1.12
　2020/12/03 確認
　M5Stack シリーズは特に問わないと思います。

## Flow
メインループがフリーズしても，割込プログラムが動作することを利用して
Timer1 にてカウントアップ，一定時間メインループが進まないとリセットします。
Bボタンを押している間，無限ループになりフリーズを模擬しています。

<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186241/ade0fbb5-e885-8ff5-96de-3ebe1c8344df.png">

```Sample.py
#ESP Reset
  machine.reset()
```

## まとめ
Wi-Fi やセンサ通信のエラーの時にフリーズしていることが多々あります。
上手く利用して安定動作につなげよう。

## 注意事項
Timerの多重割込は動作しませんでした。
割込処理の監視はメインループで行うと良いでしょう。
Amazon Rekognition のコンテンツモデレーションに新た6つのカテゴリが追加

# はじめに
この記事は株式会社ナレッジコミュニケーションが運営する [Amazon AI by ナレコム Advent Calendar 2020](https://qiita.com/advent-calendar/2020/knowcom-amazonai) の 12日目にあたる記事になります。
今回は、Amazon Rekognition のコンテンツモデレーションに追加された新しい6つのカテゴリについてご説明いたします。

# Amazon Rekognition のコンテンツモデレーション
Amazon Rekognition にはコンテンツモデレーションという機能があります。
コンテンツモデレーションでは、深層学習に基づき、不適切、迷惑、または不快な画像や動画を検出し、検索、削除が行えるようになります。
いままでは、検出できるカテゴリは、「Explicit Nudity (明示的な裸体)」、「Suggestive (暗示的)」、「Violence (暴力)」、「Visually Disturbing (過激な描写)」など、多く存在します。

# 追加された6つの新しいカテゴリ
今回のアップデートにより、以下の6つのカテゴリが追加されました。

- 「Drug (ドラッグ)」
- 「Tobacco (タバコ)」
- 「Alcohol (酒)」
- 「Gambling (ギャンブル)」
- 「Rude Gestures (無礼なジェスチャー)」
- 「Hate Symbols (ヘイトシンボル)」

# 使用例
例えば、企業がユーザーからの苦情を受けて不快または不適切な画像、広告、動画を削除する場合、通常であればサードパーティー製のコンテンツを利用したり、多くの人員を割り当てて人力で行うことが多いかと思います。しかしユーザーからのリクエストすべてを人力でこなすにはかなり多くの労力が必要です。
そこで、Amazon Rekognition のコンテンツモデレーションです。
コンテンツモデレーションを利用することにより、担当者は Amazon Rekognition が算出した結果をレビューするだけで済み、本来従事するべき作業に集中することができます。
またコンテンツモデレーションでは、第一、第二カテゴリが用意されており、担当者の希望に合わせて削除したい対象をより詳細にカスタマイズすることができます。
カテゴリについては[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/moderation.html)にまとめられておりますのでそちらをご参照ください。

# おわりに
内容が内容だけに試してみるということはできませんでしたが、Amazon Rekognitionの精度については別記事にて検証しておりますので、そちらも参考にしてください。

[Amazon Rekognition Custom Labels でアーモンドとピーナッツの判別モデルを作ってみた。](https://qiita.com/KC_NN/items/d265eddcbdc8a47ed88c)
【Rails】Rubocop-airbnbを使ってみた！

#Rubocopとは
コードがコーディング規約を守っているかを解析する静的コード解析ツールのことです。
Rubocopは詳細な設定をしなくてはなりませんがRubocop-airbnbはairbnbで使用されているRubocopの設定を使用することができます。

#Rubocop-airbnbのインストール
Gemfileのdevelopmentグループに以下の記述をした後bundle installしてください。


````ruby:Gemfile
group :development do

  gem 'rubocop-airbnb'
end

```

#ファイルの作成
アプリケーションフォルダの下に.rubocop.ymlと.rubocop_airbnb.ymlを作成します。
ファイル名の最初に「.」がついているので間違えないように注意が必要です！

```ruby:.rubocop.yml
inherit_from:
  - .rubocop_airbnb.yml

#ここにはrubocopでコード解析したくないファイルやフォルダを指定
AllCops:
  Exclude:
    - 'db/**/*'
    - 'bin/*'
    - 'config/environments/*'
    - 'config/application.rb'
    - 'config/initializers/*'
    - 'config/spring.rb'
    - 'lib/tasks/*'
    - 'vendor/**/*'
    - 'path/ruby'
```
```ruby:.rubocop_airbnb.yml
require:
  - rubocop-airbnb
```

#コードの解析
```pc:ターミナル
$bundle exec rubocop --require rubocop-airbnb
```
実行結果（例）
Offenses:の後には具体的なコーディング違反箇所が出力されます。
今回の例では38ファイルをチェックして298箇所のコーディング違反があったと教えてくれています。

```
Inspecting 38 files
CC.....CCC..W...WWW.CCC.CW.C.W.........C.CC.CC..CCC.CC.............CCCCCCCC..........

Offenses:

:
:

38 files inspected, 298 offenses detected
```

#コードの自動修正
解析内容をもとに一つ一つ修正していくのはとてつもなく大変ですが-aオプションをつけることで自動で修正してくれます。

```pc:ターミナル
$ bundle exec rubocop --require rubocop-airbnb -a
```

実行結果
コーディング違反は検出されなかったという結果が帰ってきました。

```
Inspecting 38 files

:
:

38 files inspected, no offenses detected
```

※自動修正が安全ではない場合は修正から除外されるなど全部修正されるわけではありません。
また公式ドキュメントには-aオプションは実験的なものなので使用には注意が必要との記載があります。
公式ドキュメント:
https://docs.rubocop.org/rubocop/usage/auto_correct.html#safe-auto-correct

#その他

ファイル単位やフォルダ単位での実行

```
$ bundle exec rubocop --require rubocop-airbnb -a {解析対象ファイルor解析対象フォルダ}
```

origin/masterとの差分があるファイルに対して実行

```
$ bundle exec rubocop --require rubocop-airbnb -a $(git diff $(git merge-base origin/master HEAD) --diff-filter=d --name-only)
```

#最後に
ご覧いただきありがとうございました。
初心者のためご指摘等ございましたら教えていただけると幸いです。
Windows版PHP8＋PDOでSQLServer2019Expressにアクセスしてみる

# 目的
Windows 10 Pro x64 ＋ httpd-2.4.46-o111h-x64-vc15 に 
php_sqlsrv_80_ts、php_pdo_sqlsrv_80_ts をインストールして
SQL Server 2019 Expressにアクセスしてみる
※現在phpinfoでpdoモジュールを認識しないことを確認(解消されている)
※一度 pdo_odbc のみで認識させると php_pdo_sqlsrv_80_ts が正常に認識されるようだ・・・
※pdo周りはまだ不安定のようだ pdo_pgsql 単独指定だと phpinfoのpdo欄には表示されないが、pdo_pgsql は表示される
※pdo_odbc,pdo_pgsql の指定で、phpinfoのpdo欄にpdo_odbc,pdo_pgsql共に表示される

対象データは[AdventureWorksLT2019](https://docs.microsoft.com/ja-jp/sql/samples/adventureworks-install-configure?view=sql-server-ver15&tabs=ssms)を復元しておく
※LoadModule php_module に変更されたことに注意(php8_module ではない)
## ダウンロード
[PHP 8.0 (8.0.0)](https://windows.php.net/download#php-8.0)より
VS16 x64 Thread Safe(php-8.0.0-Win32-vs16-x64.zip)をDLして、適当なフォルダに解凍して配置する。
※自分の場合は C:\Dev\Lang\php8 とリネームして配置
※現在 ext 以下のモジュールは古い環境でコンパイルしたようだ(compiled with module API=20180731\nPHP)
## SQL Server 用のドライバのインストール
[microsoft/msphpsql](https://github.com/microsoft/msphpsql/releases)
より Support for PHP 8.0 の最新版をDL後適当なフォルダで解凍する
php_sqlsrv_80_ts、php_pdo_sqlsrv_80_tsを C:\Dev\Lang\php8\ext 以下にコピーする
※PHP Warning:  PHP Startup: Unable to load dynamic library 'php_pdo_sqlsrv_80_ts' で認識されないようだ
## httpd.confの修正
C:\Apache24\conf\httpd.conf の最後に以下を追加する
<pre>
LoadModule php_module C:\Dev\Lang\php8\php8apache2_4.dll
AddHandler application/x-httpd-php .php
AddHandler application/x-httpd-php-source .phps
PHPIniDir  "C:/Dev/Lang/php8"
</pre>
## php.iniの修正
short_open_tag = On　;これは好みかなぁ・・
zend.multibyte = On
zend.script_encoding = UTF-8
extension_dir = "ext"
cgi.force_redirect = 0
cgi.fix_pathinfo = 1
fastcgi.impersonate = 1
fastcgi.logging = 0
extension=php_mbstring
extension=php_sqlsrv_80_ts
extension=php_pdo_sqlsrv_80_ts

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII
mbstring.substitute_character = none
mbstring.func_overload = 0
mbstring.strict_detection = auto
## 動作の確認
apache を再起動する
C:\Apache24\htdocs　以下に以下を配置

<pre>
> cat info.php
&lt;?php phpinfo(); &gt;
</pre>
http://localhost:8080/info.php　にアクセスすると phpinfo が表示される
※以下はリリース版が出た後に確認かな？？
sqlsrv、pdo_sqlsrvが認識されていることを確認する
## サンプルコード
```php
<?php
	$dsn = 'sqlsrv:server=localhost;database=AdventureWorksLT2019';
	$user = 'demo';
	$password = 'demo';

    $dbh = new PDO($dsn, $user, $password);
    
    $sql = "select * from SalesLT.Address";
    foreach ($dbh->query($sql) as $row) {
        print($row['AddressID'] . ' ' . $row['AddressLine1']);

    }
	$dbh = null;
?>
```

# 参考にしたのは以下のサイト
[Windows 10 に Apache をインストールしてみる](https://qiita.com/tabizou/items/089923716e977ccb69d6)
[Windows版PHP＋PDOでSQLServerにアクセスしてみる](https://qiita.com/tabizou/items/036be9cd6498f68a365a)
[Ubuntu 16.04 x64 + SQL Server2017 Express で AdventureWorks2017.bak を復元してみる](https://qiita.com/tabizou/items/ec4153fcaae6bb022592)
[httpd.conf on Windows: can't locate API model structure `php8_module`](https://stackoverflow.com/questions/63400240/httpd-conf-on-windows-cant-locate-api-model-structure-php8-module)
（JavaScript: IE）自作クラスの代入値を、参照は出来ても、メソッド以外では変更できないようにしてみる

> **注意:** 本記事は`Symbol`などの画期的な機能が存在しないIEなどの~~邪悪な~~古いブラウザを対象としたものです。「IEなんてアウト・オブ・眼中！オレは時代の最先端を征く！」という方はブラウザバックするか、ページ最後の「おまけ」にある、`class`式のプライベートフィールドや`Symbol`を使った例を参照してください。

----
普通のクラスの場合、代入値は簡単に変更できてしまいます。

```js
/* カウンター用のクラス */
function X() {
    this.num = 0;
}
X.prototype.add = function(v) {
    this.num++;
}

var x = new X;

x.add();
console.log(x.num);
// 1

/* カウントの値を不正なものに書き換える */
x.num = 'aaa';
console.log(x.num);
// 'aaa'
x.add();
console.log(x.num);
// NaN
```

本来想定している値とは違うものに変えられてしまうと、予期せぬエラーの原因になってしまいますね。

#解決策
* `Object.defineProperties`などを使ってゲッターを設定し、代入値ではなくクラス内の変数を返却させる。
* クラス内の変数にアクセスするため、メソッドは`prototype`への追加ではなく直接`this`で代入する。
 * メソッドを書き換えられないよう、`this`をロックする。

```js
function X() {
    var _num = 0;
    Object.defineProperties(this, {
        'num': {
            get: function() {
                return _num;
            }
        }
    })
    this.add = function() {
        _num++;
    }

    Object.freeze(this);
}

var x = new X;

x.add();
console.log(x.num);
// 1

/* カウントの値の書き換えは無効 */
x.num = 'aaa';
console.log(x.num);
// 1

/* Object.freezeによって、メソッド・代入値の書き換えもロック */
x.add = function(){};
console.log(x.add);
// function() {
//     _num++;
// }
x.b = 1;
console.log(x.b);
// undefined
```
# 最後に
自分で書いておいてそれはどうかとは思いますが、**この手法は使うべきではない**でしょう。

メソッドが`prototype`に登録されていなかったり、代入値の新規作成・変更が不可だったり（これについては`this`をロックしなければいいだけですが）と、普通の仕様とは全くの別物であるため、面倒な制約も数えきれないくらい付いてくることになるでしょう。

この手法はそんなに複雑なものではないですし、同じようなものを考え付く方は普通にいらっしゃると思います。しかしネットで検索してもこのようなものが出てこないということは、つまるところ**使うメリットが無い**ということなんだと私は思います。「どうしても、そう、**どうしても**、書き換えられたくないんだ！」という人以外は、書き換えられるリスクを飲み込んで普通のクラスを書くことをお勧めします。

# おまけ
`class`式をサポートしているブラウザのうち、その一部のブラウザには、「プライベートフィールド」なるものがあります（Safariは未サポート、Firefoxは試験的機能をオンにしている場合のみ。Babelに通してご利用ください。）。これを使えば、上と同様のことを**デメリット無し**に行えます。

```js
class X {
    #num;
    constructor() {
        this.#num = 0;
    }
    add() {
        this.#num++;
    }
    get num() {
        return this.#num;
    }
}

var x = new X;

x.add();
console.log(x.num);
// 1

console.log(x.#num);
// Uncaught SyntaxError: Private field '#num' must be declared in an enclosing class
```

あるいは`Symbol`を使うという手もあります。

```js
(global=>{
    var num = Symbol('num');

    var X = class {
        constructor() {
            this[num] = 0;
        }
        add() {
            this[num]++;
        }
        get num() {
            return this[num];
        }
    }

    global.X = X;
})(this);
```

丸ごと無名関数などに放り込み、クラスのみグローバルに放り出せば、外部からのシンボルへのアクセス方法が絶たれることで、実質的に代入値がプライベート化されます。何よりこちらはES6で規定されたものなので、モダンブラウザ全てで対応しています。
【RPAエンジニア】基礎知識を個人的にまとめた。

RPAエンジニアについて、理解を深めるためにまとめる。

参考文献
☆UiPath（https://www.uipath.com/）

##RPA
Robotic Process Automation（ロボティック・プロセス・オートメーション）
コンピュータ上で行われる業務プロセスや作業を人に代わり自動化する技術
➡︎要するに`ロボットによる業務自動化`

###【背景】

####①デジタル変革時代の到来
さまざまな企業活動の見直しによって最新のテクノロジーが活用されデジタル化が進んだ結果、新たな価値を創造する傾向が年々高まっている（デジタルトランスフォーメーションとも呼ばれる）
業界問わず、自動化の需要が高まってきている

####②人材不足の深刻化
少子高齢化の進行により、日本の生産年齢人口(労働力としての中核をなす15～64歳)の減少が続いている

[懸念点]
❶人材確保の難化による企業同士の働き手の奪い合いが起こる
❷生産年齢人口の減少による生産量、生産スピードの低下から国際競争の中での生き残りが難しくなる

####③労働生産性の低さ
日本の労働生産性はOECD加盟34カ国中21位
労働生産性は、労働者一人あたりがどのくらいの付加価値を生み出したのかを表す指標であり、
事務作業や反復作業を自動化させることで労働者一人あたりの生産性の向上が期待できる

RPAは`生産性の向上`が望める`新たな労働力`として、現在注目されている
➡︎`仮想知的労働者（デジタルレイバー）`と呼ばれる

###【メリット】
⑴`生産性ならびに効率性の向上`
⑵`コスト削減`
⑶`より良い成果`

###【導入例】
`定常的`かつ`定型的`な業務
`継続的`かつ`ボリュームのある`業務
に適している

①`入力`：給与支払情報の変更
②`転記`：営業訪問前の情報収集
③`照合`：請求金額と支払金額の照合作業
④`モニタリング`：経費申請の事前チェック
⑤`送付`：ID・パスワード照会
⑥`集約・加工`：競合商品の情報収集

###【CoE】
Center of Excellence（センター・オブ・エクセレンス）
RPAの導入・運用に必要な専門性を持つ組織横断的に機能するチーム

⑴`RPAスポンサー`
RPA 導入～保守に至るまでビジネス的スポンサーを行う責任を担う

⑵`RPAチャンピオン`
RPAの導入～保守に至るまでの過程を全体管理
スポンサー・現場・IT部署などと定期的にコミュニケーションをとり、
自動化を迅速かつ安全に推し進める責任を担う

⑶`プロジェクトマネージャー`
RPAチームの作成、管理チームメンバーの稼働管理、プロジェクト計画立案
様々な質問に回答するための窓口としてメンバーの質問を集約し、戦略的なイニシアチブを取ります

⑷`RPAソリューションアーキテクト`
企業の指針に沿ったIT戦略・RPAソリューションの実現を担当します
現場・管理者 (ビジネス) 側の要求に対して、RPA の最適解を提案し、
RPA ソリューション・アーキテクチャを定義する開発と、
実装フェーズの両面で支援を行う適切な技術や機能を選出します

⑸`RPA開発エンジニア`
主に、UiPath Studioを活用し、ワークフローの設計・開発・テスト、また RPA ソリューションの実装

⑹`RPAビジネスアナリスト`
ビジネスユーザーと、開発チームの橋渡し役です
自動化におけるプロセスの資料化、および RPA 化対象業務の選定を業務担当者と共に、RPA 化に適した業務プロセスを見極め、RPA化に必要な要件を定義し、業務プロセス定義書 (PDD) や業務フローを作成します

⑺`RPAチェンジマネージャー`
プロジェクトマネージャーがチェンジマネージャーとしての役割を担うことが多く、プロジェクトの成果物と連携し、RPA 導入による要件変更、および実装に向けて、各ステークホルダーとコミュニケーションをとり、要件変更に対し無理なく調節できているか把握します

⑻`RPAスーパーバイザー`
主に、UiPath Orchestrator を活用し、操作環境の一環としてロボット・プロセスを管理します
レポート機能・分析ツールを活用し、ロボットの運用性能とリソース割り当ての持続的な改良に取り組みます

⑼`RPAサービスサポート`
RPA に関するサポートの問い合わせ窓口を担います
問い合わせ内容の一次切り分けを行い、より技術的な問い合わせの対応を RPA デベロッパーへエスカレーションを行います
スモールスタートでは、RPA デベロッパーがサービスサポートの役割を担うこともあります

⑽`RPAインフラエンジニア`
RPA プロジェクトにおけるソリューションアーキテクチャの決定にも関わり、サーバー構築・トラブルシューティングにおけるインフラ支援担当適切な RPA 運用のためのインフラ環境を整備します

###【RPAジャーニー】
RPA導入における「業務整理」「要件定義」「開発テスト」「運用保守」の4つのサイクルを示したもの

`業務整理`：業務の選定基準を軸にRPA化できる業務と困難な業務に整理、業務の流れや作業手順を見える化

`要件定義`：業務プロセス定義書（＝操作マニュアル）の作成
          PDD:Project Design Document

`開発テスト`：定義書を基に開発、不具合がないかのテスト
`運用保守`：エラー発生時や業務変更時への対応、ロボットの稼働状況確認

###【ワード集】
`アクテビティ`：ワークフローを作るための最小の部品
`ワークフロー`：自動化処理の流れをグラフィカルに表現したもの
　　　　　　　アクテビティの実行順序や関係性を示している
`変数`：データを格納するために使う
`フローチャート`：複雑な処理を示すワークフロー
`シーケンス`：直線的な複数アクテビティを処理するワークフロー
`レコーディング`：マウスやキーボード操作を記録して、ワークフローを自動作成する機能
Gitting out of trouble!

### Getting in and out of bad situations with Git

Git can be hard and it's easy to make mistakes. 

Here are some bad situations I've gotten myself into recently, and how I got myself out of them.

####Go back in time

I did something terrible. Can I go back?

```
git reflog
```

*you will see a list of every thing you've done in git, across all branches!*

*each one has an index HEAD@{index} find the one before you broke everything*

```
git reset HEAD@{index}
```

*magic time machine*
![Screen Shot 2020-12-03 at 15.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878034/a69d7970-19d3-6db9-183a-f7e83f6b931e.png)
You can use git reflog to:

- Get back work you accidentally deleted.
- Remove something you tried that broke the repo.
- Recover after a bad merge, or just to go back to a time when things worked. 

####Rewrite history


I committed but need to make a change last commit message

```
git commit --amend
```

I committed but need to make a small change to the last commit

*make your change*

```
git add . # or add individual files
```

```
git commit --amend --no-edit
```

*now your last commit contains that change!*

*Never amend public commits!*

####Rewrite history: interactive rebase

I committed but need to make a bigger change: interactive rebase!

```
git rebase 
```
__git rebase__ re-applies commits, one by one, in order, from your current branch onto another. 

Rebase  accepts --interactive (-i for short) option, which will open an editor with a list of the commits which are about to be changed. This list accepts commands, allowing the user to edit the list before initiating the rebase action.

I made a few commits but want to combine them into one

```
git rebase -i HEAD~4
```

pick 07c5abd Commit message x
pick de9b1eb Commit message y
pick 3e7ee36 Commit message z
pick fa20af3 git interactive rebase, squash, amend


*Commands*
*s, squash = use commit, but meld into previous commit*


####I give up

Reset the state of your repo to be the same as the remote repo (Beware: destructive and unrecoverable action!)

*get the latest state of origin*

```
git fetch origin
```

```
git checkout master
```

```
git reset --hard origin/master
```

*delete untracked files and directories*

```
git clean -d --force
```
xcode 12 で carthage update でビルドエラーとなる

#現象
xcode 12 で carthage update を行うと、exit code 1 エラーが発生する。

#原因
xcode 12 では、Apple Silicon CPU (M1) 対応が入っており、従来の arm64 と M1 用 arm64 のアーキテクチャが重複してしまい競合が発生しているとのこと。（デバイスのarm64 とシミュレータの arm64）

#対策
念のため carthage 本体を更新する。

```
brew update
brew upgrade carthage
```
以下のページの内容で対策を行う。
>Using Carthage with Xcode 12
>https://github.com/Carthage/Carthage/blob/master/Documentation/Xcode12Workaround.md

この中でスクリプトを作成しますが、私は違う環境に持って行っても忘れないように、プロジェクトのルートに carthage.sh を置きました。
　
あとは、上記ページに書かれているように、スクリプトを実行しビルドするだけ。

```
bash carthage.sh update --platform iOS --cache-builds
```

#注意点
この方法で作られた場合、M1 Mac 上のシミュレーターでは動かないので注意しましょう。
WordPressで管理画面から任意のメニューを削除する

ワードプレスのテーマtwentytwentyを基盤に、管理者画面のメニューを操作する実装を行ったので、備忘録的にこの記事を残す。

# 環境情報

PHP：version 7.3.12
WordPress：version 5.5.3
WPテーマ：twentytwenty

# 作業

メニューを減らすにはfunctions.phpに以下を追記します。

```functions.php
function remove_menus() {
    remove_menu_page( 'index.php' ); //ダッシュボード
    // remove_menu_page( 'edit.php' ); //投稿メニュー
    remove_menu_page( 'upload.php' ); //メディア
    remove_menu_page( 'edit.php?post_type=page' ); //ページ追加
    remove_menu_page( 'edit-comments.php' ); //コメントメニュー
    remove_menu_page( 'themes.php' ); //外観メニュー
    remove_menu_page( 'plugins.php' ); //プラグインメニュー
    remove_menu_page( 'tools.php' ); //ツールメニュー
    remove_menu_page( 'options-general.php' ); //設定メニュー
}
add_action( 'admin_menu', 'remove_menus' );

function remove_wp_nodes( $wp_admin_bar ) {
    $wp_admin_bar->remove_node('wp-logo'); // WordPressロゴ
    $wp_admin_bar->remove_node('site-name'); // サイト名
    $wp_admin_bar->remove_node('updates'); // アップデート通知
    $wp_admin_bar->remove_node('comments'); // コメント
    $wp_admin_bar->remove_node('new-content'); // 新規追加
        $wp_admin_bar->remove_node('new-post'); // 投稿
        $wp_admin_bar->remove_node('new-media'); // メディア
        $wp_admin_bar->remove_node('new-link'); // リンク
        $wp_admin_bar->remove_node('new-page'); // 個別ページ
        $wp_admin_bar->remove_node('new-user'); // ユーザー
    $wp_admin_bar->remove_node('view'); // 投稿を表示
    $wp_admin_bar->remove_node('my-account');	// 右のプロフィール欄全体
    $wp_admin_bar->remove_node('edit-profile'); // プロフィール編集
    $wp_admin_bar->remove_node('user-info'); // ユーザー
    $wp_admin_bar->remove_node('logout'); // ログアウト
}
add_action( 'admin_bar_menu', 'remove_wp_nodes', 99 );
```

※この場合、投稿メニューが残る
javascript 問題集 No.17 データの名前を重複している人を集計、人数を表示(降順)

jsonからrequireする。
結果を入れる[]配列を作る。
for文を回して苗字を除いた名前を定義する。
その名前が[]配列に入っているか確かめる
　　　　　　　　　　↓
result.findIndex((r) => r.firstName === firstName

if(index=-1)で[]配列に.pushする。

理解しておくべきポイントは

・findIndexとその返り値
 
最後はsortしてconsoleすること。

＜余談＞
配列の要素のnameを数える時に迷った。
調べてみると
Object.keys(配列).length-1
で解決した。
これで配列の中のオブジェクトの数を確認できる。
Cloud Pub/Subから別のGCPプロジェクトのCloud Runをトークン認証付きで呼び出す

GCPのCloud Pub/SubではpushサブスクリプションでCloud Runなどのサーバレスリソースを呼び出す際に組み込みのトークン認証機能を使用でき簡単に安全な通信を実現することができます。
Cloud Pub/SubからCloud Runを認証付きで呼び出す方法は[公式ドキュメント](https://cloud.google.com/run/docs/tutorials/pubsub)がわかりやすいです。
しかし、ドキュメント記載の方法はCloud Pub/SubとCloud Runが同一GCPプロジェクト内にあることを前提としているため、本記事ではCloud Pub/Sunから別のGCPプロジェクトにあるCloud Runを呼び出す場合の設定方法を説明したいと思います。


## 手順
Cloud Pub/SubがあるGCPプロジェクトとCloud RunのサービスがあるGCPプロジェクトの名前はそれぞれ以下の名前であると仮定して説明します。

- project-pubsub: Cloud Pub/SubがあるGCPプロジェクト名
- project-run: Cloud Pub/SubがあるGCPプロジェクト名



まず、project-pubsubのCloud Pub/Subでproject-run側のリソースへアクセスする際の認証トークンを発行できるようにするために、project-run側で以下のIAMロールを付与します。
 
```
gcloud projects add-iam-policy-binding project-run \
    --member=serviceAccount:service-[project-pubsubのproject number]@gcp-sa-pubsub.iam.gserviceaccount.com \
    --role=roles/iam.serviceAccountTokenCreator
```

次に、Cloud Runサービスのエンドポイントへのアクセス権限を持つサービスアカウントをproject-pubsubで作成します。

```
gcloud iam service-accounts create [サービスアカウント名] --project project-pubsub
gcloud run services add-iam-policy-binding [Cloud Runのサービス名] \
    --member=serviceAccount:[サービスアカウント名]@project-pubsub.iam.gserviceaccount.com \
    --role=roles/run.invoker \
    --project project-run
```

最後に、pushの宛先となるCloud Runのサービスのエンドポイントと作成したサービスアカウントを認証で使用するサービスアカウントを指定してCloud Pub/Subのサブスクリプションを作成します。

```
gcloud pubsub subscriptions create [サブスクリプション名] --topic [トピック名] \
    --push-endpoint=[cloud runのエンドポイント] \
    --push-auth-service-account=[サービスアカウント名]@project-pubsub.iam.gserviceaccount.com \
    --project project-run
```

以上の設定でCloud Pub/Subから別のGCPプロジェクトにあるCloud Runを認証付きで呼び出すことができるようになります。

## Cloud Pub/SubからCloud Runを呼ぶ時に気を付けること
Cloud Pub/Subではpushサブスクリプションを作成すると、デフォルトでは通知したメッセージに対してpush先からNACKが返ってきたら瞬時に再送処理を行います。
例えば、push先のCloud Runに問題がありpush先として指定したCloud Runのエンドポイントを叩いても5xx系エラーが返ってしまう状態になっていた場合、Cloud Pub/Subは何度もそのエンドポイントを叩き続けます。
その結果、Cloud Run側で大量のエラーログをデフォルトのログ出力先であるCloud Loggingに吐き続け、意図せぬコスト増に繋がる可能性があるので注意が必要です。
この問題を回避するためにpushサブスクリプション側では以下の設定を行っておくとよいでしょう。

- pushサブスクリプションの`Retry policy`の設定において、デフォルトの `Retry immediately`ではなく `Retry after exponential backoff delay`を指定し、再送処理の間隔を適切に空ける数値設定を行う。
- pushサブスクリプションの `Message retention duration` を短く設定し、長時間メッセージを保持しないようにする。
プリザンターの一覧画面で特定条件のセルに色をつける（サーバスクリプト）

本記事は [Pleasanter(プリザンター) Advent Calendar 2020](https://qiita.com/advent-calendar/2020/pleasanter) 4日目の記事です。

# 最新機能

12/3にリリースとなったサーバスクリプトの最新機能で一覧画面のセルにCSSで装飾できる機能のご紹介です。これまでもセルCSSという機能がありましたが、各項目に固定のCSSクラスを出力する機能でした。JavaScriptを利用すれば動的に装飾することはできましたが、ページのロード時や行の追加ロード時など複数の契機で動かす必要があり、コーディングが大変でした。新機能では、サーバサイドでレコードの条件を判定して、その結果に応じたCSSを出力することができるようになりました。

|製品|バージョン|
|---|---|
|.NET Framework版|0.50.200.*|
|.NET Core版|1.1.10.0|

※ CentOSなどのLinux環境で動作させるためには下記の追加のセットアップ手順が必要です。
https://pleasanter.net/fs/publishes/2396324

# スタイルの登録

テーブルの管理からスタイルタブを開き、下記のスタイルを登録します。出力先は一覧画面とします。

```css
/* 危険を示す赤背景 */
.cell-danger {
    background-color: red;
    color: white;
}

/* 警告を示すピンク背景 */
.cell-warning {
    background-color: pink;
    color: white;
}
```

# サーバスクリプトの登録

テーブルの管理からサーバスクリプトタブを開き、下記のスクリプトを登録します。条件は画面表示前とします。

```javascript
if (model.NumD < 10) {
    // 数値Dが10以下の場合、数値Dのセルのcssにcell-dangerをセット
    columns.NumD.ExtendedCellCss = 'cell-danger';
} else if (model.NumD < 20) {
    // 数値Dが20以下の場合、数値Dのセルのcssにcell-warningをセット
    columns.NumD.ExtendedCellCss = 'cell-warning';
}
```

# 適用結果

登録したスクリプトにより、商談データの粗利率（数値D）が低いセルを目立つようにすることができました。クライアントサイドのJavaScriptで実装するより、かなり簡単に実装することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78230/d76176d1-61ba-c99f-4353-6da942cdfd86.png)

このサンプルは、デモ環境の「商談管理の例」の「商談」テーブルでご確認いただけます。デモ環境は下記からご利用いただけます。
https://pleasanter.azurewebsites.net

今後も無料で使えるオープンソースのプリザンターの機能強化に取り組んでまいります。ぜひご期待ください！メリークリスマス！🎅
IT初心者のPython3エンジニア認定基礎試験合格までの道

#Python3エンジニア認定基礎試験の概要

* 問題数：40問
* 合格基準：正答率70%以上で合格(40問中28問)
* 受験料：11000円(税込)
　　　：学生は半額

* 試験方式：コンピューター上で実施するCBT（Computer Based Testing）形式
* 出題範囲：オライリー・ジャパン「Pythonチュートリアル 第3版」

#筆者について

* 2020年の春に某Sierに就職した新人エンジニア
* 学生時代は情報系の専門学校に通っていたが、特に勉強をせず自堕落な日々を送っていた
* Pythonについては名前だけ知ってた程度
* プログラミングスキルは学生時代と新人研修で少しかじった程度で特にできることはない

※完全に知識0からの学習だったため、良い基準になると思います。

#学習期間

10月上旬(何日だったか忘れた)～11月7日の約1か月

毎日**平均1~2時間**(合計**40時間**くらい？)学習しました。

#試験結果
正答率85％(40問中34問正解)で**合格**でした:clap:

#学習方法

**➀　試験の概要の把握**(1h)

　　　　⇩

**➁　「Pythonチュートリアル 第3版」**を一通り読む(10h)
　　※内容がお堅くてこの時点では何が何なのかよくわかりませんでした。
　もしかしたら初心者向けの参考書を読んだ方がいいかも。

　　　　⇩

**➂　過去問を解く**（活用した場所は下の**「参考にしたサイト」**にまとめておきます)(4h)
　　※この時点での正答率は3割くらいでした。
　　※一度過去問を解くことで現状把握をしました。

　　　　⇩

**➃　「Pythonチュートリアル 第3版」をもう一度読む。**(15h)
　　※コマンドプロンプトで実行しながら行ったら覚えやすかったです)

　　　　⇩

**➄　過去問を解く**(10h)
　　※正答率が90％以上になるまで繰り返し解きました。
　　　苦手な部分をメモしておき、チュートリアルを確認しながら行うと効率がいいと思います。

　　　　⇩
➅**本番！:muscle:**

という流れでした。
**「Pythonチュートリアル 第3版」**の内容をどのぐらい理解できているかがこの試験の重要ポイントだと思います。


#参考にしたサイト

####「Pythonチュートリアル 第3版」
URL: [https://docs.python.org/ja/3.5/tutorial/index.html]
(https://docs.python.org/ja/3.5/tutorial/index.html)

**「Pythonチュートリアル 第3版」**の内容は初心者には覚えづらく感じました。チュートリアルを見て無理だ...って思った方はまずは**参考書の購入**をお勧めします。

(自分は金欠だった為、参考書の購入をケチってチュートリアルだけで学習しましたが正直覚えるのがかなり大変でした。)

###********模擬試験サイト********

**模擬試験の問題が内容を多少変えた形で多数出題されます！**
**しっかり理解しておくことでかなり楽になります。**

- - -
####DIVE INTO EXAM: 
URL: [https//diver.diveintocode.jp/exam#exam-list](https//diver.diveintocode.jp/exam#exam-list)

* アカウント作成→ログイン後受講することが出来ます。

* これまでの成績を確認できるため振り返りがしやすいです。
* 試験直前は950点ほどは取れる様になっていました(満点1000点)
- - -
####PRIME STUDY: 
URL: [https://study.prime-strategy.co.jp/](https://study.prime-strategy.co.jp/)

* 第1回～第3回まで3種類の試験があります。

* メールアドレスとニックネームを入力することが受講出来ます。

※回答終了後入力したメールアドレスに自分の回答と答えが送られてくるので正しいメ ールアドレスを入力してください。

※iCloudアドレスだと自分はメール届かなかったので最初に適当に答えてメールが届くかどうか確認したほういいかもしれません。

* 試験直前は9割は解けるようになっていました。

- - -

#試験を受けての感想

今回ほぼ知識のない状態からのスタートでしたが、最初はPythonという名前からして難しそうだな...と思っていましたが実際やってみれば意外と簡単で、模擬試験サイトで**9割**超えていればいけるんじゃないかな？と思いました。

上でも述べましたがこの試験で一番重要なのは
**「Pythonチュートリアル 第3版」の内容をどのぐらい理解できているか**
です！

本番で出る問題も基礎的なものなので、しっかり読み込んで過去問で練習をしてより確実性を上げていってもらえればなと思います！

では！
料理の例で考えるフレームワークとライブラリの違い

## 発端

手元でフロントエンド開発をしていて、Vue.js(フレームワーク)とNode.js(ライブラリ)の違いがわからなくなってきたので、具体例を上げながらその違いについて考えていく。

## 用語確認

###言語
普通、何かのコードを書こうとした時に最初に選ぶのは言語ですよね。
機械学習をしたいなら**python**、フロント開発なら**HTML・CSS・JS**、バックエンドなら**PHP**とか。

###フレームワーク
でも、こんなサービスを作りたい！と思って検索をすると、**Ruby on Rails** (Rubyと何が違うんだ！)とか、Webページ作ろうと思ったら**React**とか、PHPの**Laravel**だとか…
便利だ便利だと皆は言うが、一体こいつらは何者なんだ？

###ライブラリ
そうかと思えばNode.jsだのNumpyだのこいつらは**ライブラリ**ときた。
要するになんか便利なことをしてくれるんだろ？じゃあ一体フレームワークと何が違うんだよ！！

##料理の例で考える
キレ散らかしても仕方ないのでもう一度言葉の意味から捉え直してみる。

###枠組み(フレームワーク)
フレームワークを直訳すると「枠組み」である。
つまり**ある目的を達成するための枠組み**がフレームワークの指すものである。

これを料理を作ることに例えてみる。
料理を作るフレームワークロボット「グルメくん」が存在する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629803/d55f0d6c-81e1-8b40-3b6a-ceb36e7ae97b.png" width=200>

グルメくんはレシピを与えると料理を一人で作ることができる。
しかし、料理に特化していてキッチンから出ることはできないので、買い物などは行うことができない。
また、美的センスはないので、どんな料理も白い皿に盛り付けてしまうが、ユーザがいい感じの皿を渡すとその皿に盛り付けてくれる。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629803/7ed0e704-7ed5-aa86-0ce3-53539570e466.png" width=400>

この時ユーザがしなければならないことはグルメくんにレシピ・材料・皿を与えることだ。
グルメくんが料理という一つの流れの全てを管理していて、その場面場面で必要なものをユーザが与えることで料理が完成する。

###図書館(ライブラリ)
一方でライブラリを直訳すると「図書館」である。
つまり、**便利な諸々の機能(クラスやメソッド)がまとまっておいてある物**がライブラリである。

こちらも料理を作ることで例えてみる。
料理を作る時に役立つライブラリロボット「Kaji」が存在する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629803/74ac9f71-1834-d8a4-41bb-fab2b79e2cf7.png" width=100>


Kajiはとても頭が良くて、お使いを頼めば希望のものを買いに行ってくれるし、指示した通りにカットして炒めてくれる。当然盛り付けも行える。
それだけではなく、キッチンのお掃除もできるし、冷蔵庫の中の傷んだ食材を捨てることもできるし、etc...

ではKajiを使って料理が作りたい時にユーザは何をする必要があるのだろうか。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629803/f8f9b1fe-f689-549b-a01a-620bfa47cb62.png" width=400>

ユーザはレシピを確認してKajiに材料を買ってきてもらい、適切な指示で調理をさせて、盛り付けの最後まで監督する必要がある。
ユーザが料理を作る全体の流れを管理しながら、Kajiはその実際の作業を行ってくれる。

##具体例

以上がフレームワークとライブラリの違いの直感的な説明である。
これをNode.jsとVue.jsを具体例に使って説明すると、

###Node.js(ライブラリ)
Node.jsはJSの**ライブラリ**である。
つまり、JSでできるあんなことやこんなこと(いろんな機能)をコマンド一つで扱うことができる。

###Vue.js(フレームワーク)
Vue.jsはJSの**フレームワーク**である。
つまり、JSを使って作るwebページの雛形であり、細部の調整をすることでwebページを簡単に作ることができる。

##まとめ
プロダクトの雛形として大枠ができている物が**フレームワーク**。
便利機能をまとめた物が**ライブラリ**。

完成品を先に簡単に作っておいてくれるのが**フレームワーク**。
完成品を簡単に作るための機能を呼び出せるのが**ライブラリ**。


##感想
正直フレームワークとライブラリの違いなんてそんなにないだろうし、わかんなくて良くね？
と、長らく思っていましたが、実際に記事を書いてみると自分の中ですっきりと理解できたような気がします。


##参考
[こちらの記事](https://qiita.com/azuki8/items/ad7710fdefaedc63e3f7 "フレームワークとライブラリの違い")を参考にさせていただきました。
スクラムってなんだ・・・！？スクラム初心者のつぶやき Part3

#この記事について
　この記事は、[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html)の開発チーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu)」で行っているアウトプット企画、「[チーム「オキザリス」Advent Calendar](https://qiita.com/advent-calendar/2020/oxalis)」の17日目の記事です。
　この記事では、スクラム開発に着手して約2か月の初心者が「**スクラム**」について感じたことを記事にして行きます。

#この記事の目的
　本記事の目的として、自分と同じスクラム初心者へ「大丈夫、初心者はあなた一人じゃないよ」というメッセージと、スクラム経験者に「初心者はここがわからないのか」と初心者の気持ちが伝わればと思っています:grin:
　では、さっそく記事に移りましょう。


#許可を求めるな謝罪せよ
　「**許可を求めるな謝罪せよ**」これは我々のチーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu)」の基本方針の一つです。
意味合いとしては、「**許可を求めずに良いと思ったことはやる！だめっだったら謝る！**」と認識してます:smiley:
これを初めて聞いたときは正直「え？それでいいの？」と思いました:sweat_smile:
　今までの「**ウォーターフォール開発**」では何をするにも許可が必要で、勝手に物事を進めることはできず、自主的な行動をする気にならない環境でした。（なのに上司は自主性が大事とか言うんだよな・・・:rage:）
　しかし「**スクラム開発**」を行う[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu)では、「**許可を求めるな謝罪せよ**」の基本方針に基づいて行動するため、自主的に行動する気になります。
こういった環境の変化で、人の行動だけでなく気持ちも変わるのを初めて体感しました。
　次の目次では、そういった行動で実際にうまれた「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu)の実験室」を紹介します。

#[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu)の実験室
　[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu)では「**小規模な実験**」をよく行います。
実験の内容に決まりはなく、開発を効率化するためにチーム内で案を出して様々な実験を行います。
「実験に失敗したらどうするのか？」となると思いますが、その際は実験をやめればいいんです。
　[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu)では失敗しても大損害を被らないために、「**1Sprint**」という短い時間で小規模で行います。
この実験を行うようになってから、チーム内での開発環境は確実に向上しました。

　以下は実験内容と結果をまとめたものになります。
![lab.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855853/19489dbd-fed3-7b20-11f6-dbb821b7d82d.png)

#感想
　自主的な行動を行うには本人の気持ちだけでなく、チームの環境も重要だと感じました。
本当に今の環境でいいのか？チームメンバーで話し合ってみるといいかもしれないですね:relaxed:

#終わりに
　いかがでしたでしょうか？読んでいただいた方に少しでも気持ちが伝われば幸いです:relaxed:
私が担当する「[チーム「オキザリス」Advent Calendar](https://qiita.com/advent-calendar/2020/oxalis)」では今回に引き続き、スクラム初心者のつぶやきを記事にしていきます！次回更新は12/25(金)です！

#小ネタ
　実験内容の案で「飲酒して作業すると、居酒屋で盛り上がるのと同じで発言が増えるのでは！？」と思いましたが、仕事にならなさそうなので、お蔵入りしました:sake:

#過去の記事
スクラムってなんだ・・・！？スクラム初心者のつぶやき
**[・Part1](https://qiita.com/kimagre_human/items/7c0bbdd3b3ac838aaf2b)**
**[・Part2](https://qiita.com/kimagre_human/items/1b868d6ae656031c6a47)**
Arduino ManagerのESP32BLEライブラリをインストールする

はじめに・・
　ESP32やESP8266でスタンドアローン機器を作っていて思うのですが
ディスプレイと入力器（ボリューム・ボタン等）の実装が面相臭いねーと。
以前はWebServerを立ててブラウザ経由でポチポチと実装できていたのですが
今度はWiFi接続の調停が面倒臭いねーと。　作った機器も微妙な立ち位置の
機器になるので作るのを控えてしまう今日この頃でありました。

そんな中ESP32のBLE通信を使えばiPhone/Andoroid機器とが簡易な調停で
通信可能なのは知ってるけども誰がiPhone/Android側のソフト作るんだ？
って事で、誰も作って無ければいっちょiPadのPythonで作るかなーなんて
思いつつ連携ソフトをチラホラと探してみたところ、、、　ありました。

　　　　　それが Arduino Manager です。（有料ﾃﾞｽｹﾄﾞﾈｰ

#Arduino Manager
アンドロイドとiOSのアプリがあるようです。（私はiOS用で試しました）
https://sites.google.com/site/fabboco/home/arduino-manager-for-iphone-ipad
https://sites.google.com/site/fabboco/home/arduino-manager-for-android

#アプリのインストール
　AppStoreで「Arduino Manager」をインストールします。
　　　　　　　このソフトは有料です。
　使えなかったとしても責任は持ちませんのであしからず。

#取説のダウンロード
　DocumentationのDownload the documentationから取説をダウンロードします。
　英文ですが・・・　　まー読んでください。

#ライブラリのダウンロードとインストール
　今回はWindowsPCのArduinoIDEで作成するのでLibraries Installationから
　「IOSControllerLibrariesInstaller.exe.zip」をダウンロードします。
　zipを解凍するとIOSControllerLibrariesInstaller.exeができるので
　IOCSControllerESP32BLE以外のチェックを外してインストールします。
　インストールして出来たIOCSControllerESP32BLEフォルダを
　Arduinoの\librariesフォルダにコピーしてインストール終了です。

#サンプルプログラム
　取説のArduino Manager with ESP32 Bluetooth for the impatient項に
　ESP32BLEでの使い方が掲載されています。　細かいマニュアルは無い様なので
　サンプルプログラムを動かして理解しろっ！　って感じかのかなぁ・・・？





あとがき
　個人的には結構イケてるソフトなので、
　　　　お遊びプログラムを作っていこうと思います。
CSVファイルでダブルクォートを入れたい時はどうしたらいいの？

Rubyで、以下のようなタブ区切りのテキストファイル（foo.txt）を読み込み、CSVファイル（bar.csv）として書き出す際にタイトルのような疑問が出たので調べてみた。

> (foo.txt) 
john	m	18
pau",l	m	20
alice	f	15

カラム名もつけて、わかりやすくテーブルにするとこんな感じ。

| Name | Sex | Age |
| ----------- | ----------- | ----------- |
| john | m | 18 |
| pau",l | m | 20 |
| alice | f | 15 |

以下のRubyスクリプトでテキストファイルをCSVファイルに変換してみると...

```rb:Ruby
require 'csv'

input = 'foo.txt'
output = 'bar.csv'
people = []
person = []

File.open(input) do |f|
  f.each_line do |l|
    person = l.chomp.split(sep = "\t")
    people << person
  end
end

CSV.open(output, "w", :force_quotes => true) do |csv|
  people.each do |per|
    csv << per
  end
end
```

CSVファイル、なんか`pau",l`の`u`と`,`の間でダブルクォーテーション（"）が増えてない？？

> (bar.csv)
"john","m","18"
"pau"",l","m","20"
"alice","f","15"

# CSVの仕様（本記事に関係する事項）

CSV形式とは、テキストデータをいくつかのフィールド（項目）に分け、区切り文字であるカンマ「,」で区切ったデータ形式。

例を挙げるとこんな感じ（CRLFは改行）。各レコード（行）でフィールドがカンマで区切られている。

> 日本国,東京,127767944 CRLF
アメリカ合衆国,ワシントン,300007997 CRLF
…

フィールドはダブルクォート「"」で囲んでも囲まなくてもよくて、次の3つのレコードは（CSVの文字列としては）同じ内容。

> 日本国,東京,127767944 CRLF
"日本国","東京","127767944" CRLF
"日本国","東京",127767944 CRLF

# フィールドの値がダブルクォートを含む場合は？

フィールドがカンマ、ダブルクォート、改行を含む場合は、必ずダブルクォートで囲み、
**フィールドに含まれるダブルクォートは2つ並べて（""）エスケープする。**

レコードの内容が「日本[改行]国」「"東京"」「127,767,944」のときはこうする。

> "日本 CRLF
国","""東京""","127,767,944" CRLF

# ダブルクォートが増えたのはエスケープするため

> "john","m","18"
"pau"",l","m","20"
"alice","f","15"

`pau",l`は`"pau"",l"`とすることで、CSVファイル内で１つのフィールド値として認識されるのでした。

# 参考
[CSV (Wikipedia)](https://ja.wikipedia.org/wiki/Comma-Separated_Values#%E4%BB%95%E6%A7%98)
[Common Format and MIME Type for Comma-Separated Values (CSV) Files](https://tools.ietf.org/html/rfc4180)
Windowsでlessみたいにログ監視

#hoge.ps1
$targetFolderを元にフォルダー一覧をメニュー表示して

入力されたディレクトリ/$targetPathのテキストを表示する

```
$targetFolder = 'C:\var\log\tomcat';
$targetPath = '\hoge\hoge.log';

cd $targetFolder;
 
$itemList = Get-ChildItem * | ? { $_.PSIsContainer };
foreach($item in $itemList) {
    Write-Output ([string]$itemList.IndexOf($item) + '：' + $item.Name);
}

$input = Read-Host ('監視対象を入力してください(0～' + ([string]$itemList.Length - 1) + ')');
Write-Output $itemList[[int]$input].Name;

Get-Content -Path ([string]$itemList[$input] + $targetPath) -Tail 0 -Wait;

Read-Host "続けるには Enter キーを押してください..." ;
```
覚えよう！LaTeX Workshopのショートカット

$\LaTeX$でギリシャ文字や特殊記号を打つのは面倒だ．例えば$\alpha$の一文字を打ちたいだけなのに，`\alpha`と六文字も打たないといけない．

そこで便利なのが，VScode Extensionである`LaTeX Workshop`のサジェスト機能だ．なんと二文字打つだけでそれぞれの記号に変換してくれる．
![latexWorkshopShortcut.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669185/f5adba2a-6936-45cd-6875-efbc1b0e1de1.gif)

# ギリシャ文字編
## 小文字編

| ショートカット| ギリシャ文字   |$\LaTeX$    |
| ----          |----        |---- |
|  `@a`  |  $\alpha$     |`\alpha`    |
|  `@b`  |  $\beta$      |`\beta`     |
|  `@c`  |  $\chi$       |`\chi`      |
|  `@d`  |  $\delta$     |`\delta`    |
|  `@e`  |  $\epsilon$   |`\epsilon`  |
|  `@f`  |  $\phi$       |`\phi`      |
|  `@g`  |  $\gamma$     |`\gamma`    |
|  `@h`  |  $\eta$       |`\eta`      |
|  `@i`  |  $\iota$      |`\iota`     |
|  `@j`  |  -            | -          |
|  `@k`  |  $\kappa$     |`\kappa`    |
|  `@l`  |  $\lambda$    |`\lambda`   |
|  `@m`  |  $\mu$        |`\mu`       |
|  `@n`  |  $\nu$        |`\nu`       |
|  `@o`  |  $\omega$     |`\omega`    |
|  `@p`  |  $\pi$        |`\pi`       |
|  `@q`  |  $\theta$     |`\theta`    |
|  `@r`  |  $\rho$       |`\rho`      |
|  `@s`  |  $\sigma$     |`\sigma`    |
|  `@t`  |  $\tau$       |`\tau`      |
|  `@u`  |  $\upsilon$   |`\upsilon`  |
|  `@v`  |  -            |-           |
|  `@w`  |  -            |-           |
|  `@x`  |  $\xi$        |`\xi`       |
|  `@y`  |  $\psi$       |`\psi`      |
|  `@z`  |  $\zeta$      |`\zeta`     |

## 小文字編(var*)

| ショートカット| ギリシャ文字   |$\LaTeX$    |
| ----          |----        |---- |
|  `@ve`  |  $\varepsilon$   |`\varepsilon`  |
|  `@vf`  |  $\varphi$       |`\varphi`      |
|  `@vq`  |  $\vartheta$     |`\vartheta`    |
|  `@vs`  |  $\varsigma$     |`\varsigma`    |

## 大文字編

| ショートカット | ギリシャ文字   |$\LaTeX$    | 
| ----          |----        |---- |
|  `@D`  |  $\Delta$     |`\Delta`    |
|  `@F`  |  $\Phi$       |`\Phi`      |
|  `@G`  |  $\Gamma$     |`\Gamma`    |
|  `@L`  |  $\Lambda$    |`\Lambda`   |
|  `@O`  |  $\Omega$     |`\Omega`    |
|  `@Q`  |  $\Theta$     |`\Theta`    |
|  `@U`  |  $\Upsilon$   |`\Upsilon`  |
|  `@X`  |  $\Xi$        |`\Xi`       |
|  `@Y`  |  $\Psi$       |`\Psi`      |

# 数式編

| ショートカット   |$\LaTeX$    | 
| ---- | ---- |
|  `@(`  |  `\left( \right)`    |
|  `@{`  |  `\left\{ \right\}`    |
|  `@8`  |  `\infty`    |
|  `@6`  |  `\partial`    |
|  `@/`  |  `\frac{}{}`    |
|  `@;`  |  `\dot{}`    |
|  `@:`  |  `\ddot{}`    |
|  `@<`  |  `\leq`    |
|  `@>`  |  `\geq`    |

# Reference
https://github.com/James-Yu/LaTeX-Workshop/wiki/Snippets
【npmのエラー罠】脱出のための秘伝のタレ的コード

#はじめに
こちらに書かれている内容で確かにnpmのエラーの解決率は高いのですが、今後、自分がエラーに陥った際もなぜエラーになってしまったのかが重要ですので、極力エラーの原因を探った上で使用することが最適だと思います。

随時更新

#解決策①：node_modulesを消して再インストール

```
rm -r node_modules
npm install

その後に、もう一度コマンドを実行
```

```rm -r node_modules```：node_modulesの削除→依存関係にあるファイルを削除する


#解決策②：package-lock.jsonを消して再インストール
```
rm package-lock.json
npm install

その後に、もう一度コマンドを実行
```

```rm package.lock.json```：もう一度、モジュールを入れ直すためpackage-lock.jsonを削除

#解決策③：キャッシュをクリアしてみる
```
npm cache clean -f
npm install

その後に、もう一度コマンドを実行
```

```npm cache clean --f```：キャッシュフォルダーからすべてのデータを削除。
```--f```はちなみに、-forceの略です。

#解決策④

#参考
[npm がどうしてもエラーになる](https://qiita.com/kuroro_ru/items/d50212a1919308cc1480)