OmniAICreator/Qiita-1.07M huggingface dataset:
Minecraft Skript 入門編 Part.4

# Skriptを勉強するうえで使いやすいサイト

|サイト名|概要|リンク|基本言語|
|:-:|:-:|:-:|:-:|
|![SkriptHub](https://skripthub.net/static/svg/SkriptHubLogoWhite.svg)**SkriptHub**|アドオンごとのエフェクトやイベントの検索が可能で簡単なサンプルコードを確認可能。|[ここをクリック](https://skripthub.net/docs/)|英語|
|![skUnity](https://forums.skunity.com/styles/uix/uix/logo.png)**skUnity**|Skriptに特化したフォーラム。作りたいコードのヒントはいっぱいあります！！|[ここをクリック](https://forums.skunity.com/)|英語|
|**Skriptのドキュメンテーション**|Skript単体のドキュメンテーション。イベントやエフェクトなどについて検索できます。|[**イベント**](http://en.njol.ch/projects/skript/doc/events)・[**エフェクト**](http://en.njol.ch/projects/skript/doc/effects)・[**コンディション**](http://en.njol.ch/projects/skript/doc/conditions)・[**Expressions**](http://en.njol.ch/projects/skript/doc/expressions)・[**タイプ**](http://en.njol.ch/projects/skript/doc/classes)|英語|
|**bukkitプラグイン「skript」の導入**|Skriptに関する記事は５つしかありませんが多くの日本人Skripterが一度は見たことのある記事だと思います。ですが、バージョンが古いため最新の情報と比べながら閲覧することをお勧めします。|[ここをクリック](https://ch.nicovideo.jp/cch/blomaga/ar614485)|日本語|

次は[コチラ](https://qiita.com/meoto2408/items/b3971c115bf91d3262e2)

前は[コチラ](https://qiita.com/meoto2408/items/dc9574d0f9653b261bf7)
プログラミング初心者がコーディング以外に知ったほうがいいこと

# コーディングは「コーディング」作業だけではない。

プログラムを開発する時、コーディング作業そのものは全体の中のごくごく小さいです。
例えば設計やレビューや各種MTG等、「手を動かす」こと以外の時間が多く存在するのはよく知られています。

ではコーディングそのものはコードを書くだけかというとそうではありません。
プログラミング初学者が知ると作業が捗るチップスを私見ながらまとめます。

## 移動

### 文頭、文末、行頭、行末

ひとつの目標はキーボードだけでコーディングを完結させることです。
マウスでカーソル移動や矢印キーの長押しでの移動は時間がもったいないです。

| 種類 | キーボード |
|------|-------------|
| 文頭 | Ctrl + Home |
| 文末 | Ctrl + End |
| 行頭 | Home |
| 行末 | End |

以下は、上のショートカットを順に試している例です。

![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/c7cca9f4-d14e-6566-796d-74d253ed621d.gif)


### タブ移動

特にGUIアプリの場合**Tab**を使うことでマウスに手を触れることなく、
キーボードだけで入力・編集作業を継続できます。

申し込みフォーム画面等で効果があります。
「ファイルを開く」でエクスプローラーのポップアップ上でTabキーを使い、
フォルダ変更→ファイル指定→ファイル開くということがマウスレスで行えます。

### 行移動「Ctrl + G」

プログラムを実行してエラーになると大抵エラーに関連した行番号が表示されます。
この場合**Ctrl + G**で行を指定して移動できます。

## 選択

### コピー、カット、ペースト、

マウス右クリックから実行するのではなく、
キーボードショートカットを使いましょう。

| 操作 | キーボード |
|--------------------|------------|
| コピー | Ctrl + C |
| カット | Ctrl + X |
| ペースト(貼り付け) | Ctrl + V |

### 全選択、範囲選択

**Ctrl + Aキー**でコードのすべてを選択できます。

### 戻す

**Ctrl + Z**で直前の編集内容を戻すことができます。


### 検索と置換

コード全体をマウスホイールで移動し文字を探すのは時間の無駄です。
一般的に以下のショートカットで**検索**を行えます。
また、その検索内容を指定の文字に置き換えることができ、**置換(ちかん)**と呼びます。


| 種類 | キーボード |
|------|------------|
| 検索 | Ctrl + F |
| 置換 | Ctrl + H |

以下はWindowsのメモ帳アプリでの「書籍」を「BOOK」に置換する例です。

![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/8ed28844-1e68-eabf-4dd8-f9475d4901aa.gif)


### ※矩形選択

若干特殊な内容ですがエディタによっては**矩形(くけい)選択**機能を備えています。
例えば以下のようなCSVデータがあったとします。

```text
No,氏名,性,電話番号,生年月日
1,新村修二　,男,0989252316,1964/04/17
2,桑原凛　　,女,0597543344,1978/08/03
3,宮内絢菜　,女,0778902184,1963/04/13
4,菅原一也　,男,0955870917,1999/07/25
5,須田桜子　,女,0554668805,1981/06/05
6,末吉菜摘　,女,0785107394,1973/07/31
7,杉野慶子　,女,0541289378,1962/10/26
8,狩野淳子　,女,0556321856,1993/05/03
9,長沢千代乃,女,0441387326,1978/07/08
```

電話番号の一定位置に「**-**」を一つずつ入れるのは非常に腰が折れます。
だからといって正規表現での検索と置換も初学者には難しいです。
VisualStudioCodeでは矩形選択を備えており、キーボードでもマウスでも操作可能です。

| 種類 | 操作 |
|------------|------------------------------------|
| マウス | Shift + Alt + 左クリックでドラッグ |
| キーボード | Ctrl + Shift + Alt + 上下キー |

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/ebcd65c8-e4a4-ac50-7956-123fb456bcfd.gif)

## 文字コード

UTF-8、Shift-JIS、UNICODEという3種類を覚えておいたらとりあえずなんとかなります。
ファイルを開こうとしたら文字化けするという場合は、上の3つのうちのいずれかを選択して開くようにしましょう。

※Excelでcsvを作成すると「BOM付きUTF-8」という形式になります。
　ファイルの文頭に見えない文字コードが隠れていてUTF-8として取り込もうとすると
　エラーが起きることが多いことは頭の片隅に入れておきましょう。

## まとめ

上述したものは多くのプログラマーが無意識的に行っているものがほとんどです。
また書籍にも「何を作るか」の説明はあっても、「どう作るか(書くか)」の説明はないものが多いです。

今回の内容を普段から意識して行うと、本来行うべきコーディングの時間の割合を高めることができます。

今後も違う視点から初学者向けに共有していきます。
Power AutomateでTrelloの作成済みのカードにラベルを付与しようとしたら出来なかった

Power AutomateでTrelloの作成済みのカードにラベルを付与しようとしたら出来なかったという話。

## フローのエディター画面でTrelloのカードにラベルを付与できるアクションが見当たらない

Power AutomateでTrelloの作成済みのカードにラベルを付与したかった。
しかし、フローのエディター画面でTrelloのアクション一覧を見てみたが、「カードにラベルを付与する」「カードのラベルを更新する」のようなアクションは見当たらない。

![スクリーンショット 2020-03-21 15.48.48.png](https://image.docbase.io/uploads/4947c32a-2eda-4040-8433-ab03b08836ca.png)
![スクリーンショット 2020-03-21 15.49.15.png](https://image.docbase.io/uploads/624022ee-831c-4a2c-8f02-732e80c73772.png)
![スクリーンショット 2020-03-21 15.49.24.png](https://image.docbase.io/uploads/a161ddcc-4460-4f98-b340-f29600ad34e3.png)

「カードの更新」アクションの中で指定できるのでは？と思い確認したが、そのような項目はなかった。
![image.png](https://image.docbase.io/uploads/f080be26-5054-4750-ab8f-2ce911aca1e6.png)

ちなみに「カードの作成」アクションではちゃんと「ラベルID」の項目がある。
![image.png](https://image.docbase.io/uploads/1a95b020-81a6-4b85-b0a3-ae1de43d6dff.png)

## Microsoftの情報をあたってみた

MicrosoftのPower Usersコミュニティのページを見てみると以下のような質問投稿があった。

- [Flow to add a label to Trello Card](https://powerusers.microsoft.com/t5/Building-Flows/Flow-to-add-a-label-to-Trello-Card/td-p/245705)

> I'm creating flows to take actions when a new card is added to a list and i'd like to add a label to the card. I can't easily find a way of doing this - can anyone help?

それに対しての回答はこう。

> It seems that you are using the trigger When a new card is added to a list, to add a label to the card, you will have to use the action Update a card. However, currently there is no Label Id field could be used to update the card.

要するに、作成済みのTrelloのカードにラベルを付与する機能は現在未実装とのこと。

## 代替策

ラベルの代わりにカードのタイトルにプレフィクスを付けるようにした。

例：`受信メール`というラベルを付与する代わりに、タイトルを`[受信メール]<元のタイトル>`とする。

## おわりに

Power Automate Ideasに、「カードのラベルを更新できるようにしてほしい」という要望が上がっているので、同じ箇所で困っている人はVoteすると良いと思う。（Microsoftアカウント必須）

- [https://powerusers.microsoft.com/t5/Flow-Ideas/Trello-Connector-Label-only-avaialble-for-new-cards/idi-p/125887?advanced=false&collapse_discussion=true&filter=location&location=idea-board:FlowIdeas&q=label%20to%20trello%20card&search_type=thread](https://powerusers.microsoft.com/t5/Flow-Ideas/Trello-Connector-Label-only-avaialble-for-new-cards/idi-p/125887?advanced=false&collapse_discussion=true&filter=location&location=idea-board:FlowIdeas&q=label%20to%20trello%20card&search_type=thread)

以上
Python、os操作について

#（１）前提
デスクトップにディレクトリtestを作成し、ディレクトリ内にtest.pyとtest.txtを作成。
test.txtは、”テスト完了”と記述。
ディレクトリ内にディレクトリtext2を作成し、test2.txtを作成。
test2.txtは、”テスト２完了と記述。

```
test
├test.py
├test.txt（”テスト完了”と記述）
└test2
 └test2.txt（”テスト２完了”と記述）
```



#（２）pwd
カレントディレクトリを、ターミナルでpwdを入力すると以下の通り

```
/Users/*******/desktop/test
```

#（３）os.getcwd（）と\__  file__
os.getcwd()でカレントディレクトリの絶対パスを取得し、\__file__でカレントディレクトリ内からの相対パスを取得する。

```
import os

print(os.getcwd())
print(__file__)
```

実行結果は以下の通り。


```
/Users/*******/Desktop/test
file_test.py
````

#（５）os.path.abspath()
\__file__で取得できるのはカレントディレクトリからの相対パスだが、os.path.abspath()で絶対パスに変換できる。ディレクトリも絶対パスで取得可能。

```
import os

print(os.path.abspath(__file__))
print(os.path.dirname(os.path.abspath(__file__)))
```

実行結果は以下の通り。

```
/Users/*******/Desktop/test/file_test.py
/Users/*******/Desktop/test
```

#（６）os.path.join
os.path.joinとは、引数に与えられた二つの文字列を結合させ、一つのパスにする事ができる。
まず、ディレクトリtest内にあるtest.txtを読み込む。

```
with open('test.txt',encoding='utf-8') as f:
    print(f.read())
```

すると、以下のようになる。

```
テスト完了
```

次に、ディレクトリtest2内にあるtest2.txtを読み込む。

```
with open('test2/test2.txt',encoding='utf-8') as f:
    print(f.read())
```

すると、以下のようになる。

```
テスト2完了
```

次に、os.path.joinを使い、カレントディレクトリまでの絶対パスと、test2.txtへの相対パスを結合したものでtest2を読み込んでみる。

```
import os

target = os.path.join(os.path.dirname(os.path.abspath(__file__)),'test2/test2.txt')
with open(target,encoding='utf-8') as f:
    print(f.read())
```

とすると、以下のようになる。

```
テスト2完了
```

#（７）chdir
chdir [移動先のパス]として使う。ターミナル上でカレントディレクトリを移動する際に使う。
まず、移動先のパスを作成する。

```
import os
target2 = os.path.join(os.path.dirname(os.path.abspath(__file__)),'test2')
```

設定した移動先パスを経由してカレントディレクトリを移動する。

```
os.chdir(target2)
```

念の為、カレントディレクトリを確認し移動てきているかどうかを確認する。

```
print(os.getcwd())
```

ちゃんとtestから、test2にカレントディレクトリが移動できていることが確認できた。

```
/Users/*********/Desktop/test/test2
```

test2.txtを直接読み込んでみると（

```
with open('test2.txt',encoding='utf-8')as f:
    print(f.read())
```

以下の通り、ちゃんと出力される。
（カレントディレクトリがtestの場合は、with open('test2.txt',encoding='utf-8')の部分を、with open('test2.test2.txt',encoding='utf-8')とする必要がある。)


```
テスト2完了
```

#（８）まとめ

```.py:test.py
import os

print(os.getcwd())
print(__file__)
print(os.path.abspath(__file__))
print(os.path.dirname(os.path.abspath(__file__)))

print('------------------------------------')

with open('test.txt',encoding='utf-8') as f:
    print(f.read())
with open('test2/test2.txt',encoding='utf-8') as f:
    print(f.read())
target = os.path.join(os.path.dirname(os.path.abspath(__file__)),'test2/test2.txt')
with open(target,encoding='utf-8') as f:
    print(f.read())

print('------------------------------------')

target2 = os.path.join(os.path.dirname(os.path.abspath(__file__)),'test2')
os.chdir(target2)
print(os.getcwd())
with open('test2.txt',encoding='utf-8')as f:
    print(f.read())
```

#参考にしたサイト
[Pythonで実行中のファイルの場所（パス）を取得する__file__](https://note.nkmk.me/python-script-file-path/)
話題沸騰ポットに対して Property based testing を試してみる (2)給湯(水)させる

#はじめに
[話題沸騰ポットに対して Property based testing を試してみる (1)蓋の開け閉め、水を充填させる](https://qiita.com/freddiefujiwara/items/5f8eaf834d2a24afdee1)に引き続き
[fast-check](https://github.com/dubzzz/fast-check)を使ってProperty based testingを試しています。
題材として
[テスト設計コンテストU-30クラス](http://aster.or.jp/business/contest/rulebooku30.html)でテストベースに指定されている
[「話題沸騰ポット要求仕様書 (GOMA‐1015型) 第７版](http://www.sessame.jp/workinggroup/WorkingGroup2/POT_Specification.htm)にすることにしました.


#準備
[こちら](https://github.com/freddiefujiwara/goma-1015/blob/feature/pour/__tests__/lib/index.spec.ts)に今回実装したコードを配置してみました。
Nodejsの環境が手元にあれば、試すことができます。

```bash
git clone https://github.com/freddiefujiwara/goma-1015.git
cd goma-1015
npm i
npm test
```
#早速給湯に対してProperty based testingしてみましょう
##給湯(水)させる

次に、ポットから中に入っている水を給水してみましょう
ボットに事前にコンセントに刺すplugInと外すplugOutとpour(給水ボタン)という機能をそれぞれ追加しておきましょう
[要求仕様書](http://www.sessame.jp/workinggroup/WorkingGroup2/POT_Specification_v7.PDF)には書いてないですが下記とします

- 蓋が閉まっていないと、給水されない (*this is openの例外が発生)
- コンセントに刺さってないと(Plug In)、給水されない (*plug should be connectedの例外が発生)
- pourボタンを押下した秒数だけ給水される(10 ml/sec)
- 空の状態でpourボタンを押すても水は給水されない 0ml給水される 

これらをProperty based testingで確認していきましょう
fc.nat(10)を使って1-10秒までの任意の秒数のpourボタンを押下して確認していきます
また、fc.nat(1000)で空になったら0-1000までの任意のmlの水を充填しましょう

```JavaScript
import fc from 'fast-check'
import Goma1015 from '../../src/lib/index'

describe('Goma1015', () => {
  .
  .
  .
  it('can pour', () => {
    let g = new Goma1015()
    //check definition
    expect(g.pour).toBeDefined()
    expect(g.plugIn).toBeDefined()
    expect(g.plugOff).toBeDefined()

    //deault plugOff
    expect(() => g.pour(15)).toThrowError(/plug should be connected/)
    //pouring needs to be pot closed
    g.open()
    g.plugIn()
    expect(() => g.pour(15)).toThrowError(/is open/)
    g.close()

    //plugOff
    g.plugOff()
    expect(() => g.pour(15)).toThrowError(/plug should be connected/)
    g.plugIn()

    //negative sec
    expect(() => g.pour(-1)).toThrowError(/can't be poured with negative sec/)
    //can not pour water anymore if empty
    expect(g.pour(100)).toBe(0)

    //property based testing for pour
    g = new Goma1015()
    //fill to full
    let water = 1000
    g.plugIn()
    g.open()
    g.fill(water)
    g.close()
    let sec = 0
    fc.assert(
      fc.property(fc.nat(10), fc.nat(1000), (s, w) => {
        //refill if empty
        //* water is poured 10 ml/sec
        if (sec >= water / 10) {
          expect(g.pour(s)).toBe(0)
          sec = 0
          water = w
          g.open()
          g.fill(water)
          g.close()
          return
        }
        //not empty
        //s equals 0 pour should be 0
        expect(g.pour(s) == 0).toBe(s == 0)
        sec += s
      }),
    )
  })
})
```

#最後に
次はいよいよ[沸騰](https://qiita.com/freddiefujiwara/items/076cbe57cab936b54fc3)させてみたいと思います
また、コードにもし間違いありましたら[Pull request](https://github.com/freddiefujiwara/goma-1015)は大歓迎です。
長くなってしまいましたが　最後まで読んでいただきありがとうございました。
Output Lottery hkについて知る

![Untitled-21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606428/227ecacb-2ab4-f720-e39f-464c5971d691.jpeg)

トーゲルは、世界に歴史を持つ推測数（ギャンブル）です。トーゲルは正式名称ではなく、宝くじはダークトトの略語です。

Totoは、メディアを使用して数字を決定するアクティビティを意味し、通常ボールを使用していくつかの数字を持っています。

暗くなるとは、閉じた状態または公開されていない状態で実行されるアクティビティを意味し、宝くじは閉じた状態または不正な状態で行われるボール番号を描くことで行われるゲームです。

過去/過去に、宝くじは手動で行われましたが、2015年から2020年の時代と技術の洗練により、賭け者やプレイヤーが簡単に遊べるオンライン宝くじゲームが登場するまで宝くじをより簡単に遊べるようになりました。

このオンラインギャンブルゲームでは、プレーヤーはスマートフォンのみを使用して宝くじゲームに簡単にアクセスでき、香港の費用を確認できるようになりまし / <a href="https://pengeluaranhkg.com">keluaran hk</a>.

世界の宝くじゲームの最も完全なガイドは、宝くじシンガポール、香港宝くじ、シドニー宝くじ、およびカンボジア宝くじを含む大きく異なります。香港の宝くじのエージェントにアクセスして、HKデータの結果とPaito HKを入手してください。
配列で受け取ったRequestに対してのバリデーション 


```view
  <table>
    <form action="/person/create" method="post">
      {{ csrf_field() }}
      <tr>
        <th>name: </th>
        <td><input type="text" name="person[name]" value="{{ old('name') }}"></td>
      </tr>
      <tr>
        <th>email: </th>
        <td><input type="text" name="person[email]" value="{{ old('email') }}"></td>
      </tr>
      <tr>
        <th>age: </th>
        <td><input type="text" name="person[age]" value="{{ old('age') }}"></td>
      </tr>
      <tr>
        <th></th>
        <td>
        <input type="submit" value="send">
        </td>
      </tr>
    </form>
  </table>
```

上記のように配列にまとめて```name="person[name]```のような形でフォームを送信する場合

バリデーションの書き方が少し変わる
・配列名.name
・配列名.email
上記のような指定方法となる

```
  // バリデーション  //

  # requestが配列で送られてくる場合は'配列.要素名'となる
  public static $rules = array(
    'person.name' => 'required',
    'person.email' => 'email',
    'person.age' => 'integer|min:0|max:150'
  );
```
pandas で　'DataFrame' object has no attribute 'ix'　が出てきたとき


##困ったこと
pandasを使ってcsvへの書き込みをしようとしたら、以下のようなエラーを吐かれた
## 現象
```
 'DataFrame' object has no attribute 'ix' 
```
##原因
pandasの最新バージョン(1.0.2)では無理らしい。<a href="https://pandas.pydata.org/pandas-docs/version/1.0.0/whatsnew/v1.0.0.html#removal-of-prior-version-deprecations-changes">詳しくはドキュメント</a>読んでね❤️。

##対処法
まずはpandasのバージョン確認して(今回はjupyter notebook使ってたので次のように)

```
 print(pd.__version__)
```

必要に応じて過去のバージョンに戻せばよひ。
pipなりcondaなりでバージョンを指定してなんかコマンド打とう。
Windows10上のSpacemacsで日本語の変換サジェストが表示されない

# 概要
Windows10でSpacemacsを使っていると、日本語の変換サジェストが機能しなかったりする。

(正確にはEmacsの問題だが、つまりEmacsを拡張しているSpacemacsでも同様の問題がある)

GNU Emacs 26.3を使っていた。


理想はこう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201962/95081a3b-381c-a3b1-01d4-484f27990be3.png)


現実は非情。インライン表示しかされない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201962/a8146cb0-698a-ee81-510a-6c304b1b479a.png)




# 対処
**ウィンドウを移動すれば表示される**という最高に面白い対処法が既に知られていた。

cf. [Windows 8 MS-IME problem](https://github.com/chuntaro/NTEmacs64/issues/3)

> 今のところ回避策としては、Emacsの起動後に以下のいずれか1つの操作を行えば、日本語入力可能になります。
(1)マウスでウィンドウを移動する。
(2)マウスでウィンドウをリサイズする。
(3)メニューバーが表示されていれば、F10キーを2回押す。

実際、Spacemacsもマウスでウィンドウを移動させてからだと変換サジェストが表示される。どうして……





# 余談
僕はGNU Emacs本体でも問題なく日本語を使えているが、[Windows用にIMEパッチ適用済みのビルド](https://github.com/mhatta/emacs-26-x86_64-win-ime)も存在していた。

cf. [Emacs 26.3 に IMEパッチを当てたバイナリを mhattaさん（Masayuki Hattaさん）が作ってくださいました！ ありがたく使用させていただきます．](https://noike.info/wp/knoike/2019/12/31/82400/)
Macの基本的なショートカットキー

#Macの基本的なショートカットキー
##◎アプリケーション操作
###アプリケーションを終了させる
###command + Q
##◎その他
###Macのメニューバーにカーソルを合わせる
###control + F2
###Dockにカーソルを合わせる
###control + F3
###Macのツールバーにカーソルを合わせる
###control + F8
###スクリーンショットを撮る
###shift + command + 3

##コメント
Macで、よく使うショートカットキーを日々更新していきます。
Objective-Cのnullable指定

Objective-CのオブジェクトとSwift(Swift 5)のOptionalがよくわかっていなかったので復習した。
Objective-C側の宣言により、以下になるようである。

|Objective-C|Swift|
|---|---|
|nonnullを指定、または<br>NS_ASSUME_NONNULL_BEGIN内で無指定|Non-optional|
|nullableを指定|Optional|
|null_unspecifiedを指定、または<br>無指定|Implicitly unwrapping optional|

また、nilが代入されているhogeというプロパティに対してアクセスするとき、以下のような結果となる。

|種類|アクセス方法|結果|
|---|---|---|
|Non-optional|hoge?|Compile error|
|Non-optional|hoge|Runtime error (crash)|
|Optional|hoge?|nil|
|Optional|hoge|Compile error|
|Implicitly unwrapping optional|hoge?|nil|
|Implicitly unwrapping optional|hoge|Runtime error (crash)|

Implicitly unwrapping optionalで `?` を書かないでアクセスして、かつ、値が `nil` だと、ランタイムエラーが発生してcrashする。これはguard文でも防げない。すなわち `guard let a = obj.hoge` だとcrashするので `guard let a = obj.hoge?` と書く必要がある。(`hoge!`もcrashする)
というわけでnull_unspecifiedは危険なので、全部いったんnullableにしてからnonnullに直していけばよいのではと思う。

参考:
- [Nullability and Objective-C - Swift Blog - Apple Developer](https://developer.apple.com/swift/blog/?id=25)
- [Swiftのランタイムエラーを捕捉する - THE BLUE NOWHERE](http://y-sumida.hatenablog.com/entry/2018/08/04/220105)
React開発環境を作る2

https://qiita.com/daga_0301/items/a7aa8bed488b13f5db64 の続き

まずはファイル構成から

```
│  .babelrc
│  .eslintrc.json
│  package-lock.json
│  package.json
│  webpack.config.js
│
├─public
│      index.html
│
└─src
        index.css
        index.js
```

##webpack
webpackは今回使うツールの中で最上位のツール
javaScriptのモジュールやらcssやらを一つのファイルにまとめてくれます。
だから、htmlでこのようなことをしなくてよくなる。

```html
<link rel="stylesheet" href="./css/bootstrap.min.css">
<link rel="stylesheet" href="./add.css">
<script src="./js/jquery-3.4.1.min.js"></script>
<script src="./js/bootstrap.min.js"></script>
```


webpackはwebpack.config.jsファイルで設定をします。

```js
module.exports = {
    entry: { //バンドルする元ファイルの場所を指定
        app : "./src/index.js" 
    },
    output: { //バンドルした成果物のファイル名と場所を指定
        filename: "bundle.js",
        path: __dirname + "/public"
    },
    devServer : {//サーバーを立ててwebpackを起動するときの設定
        historyApiFallback: true,
        contentBase : __dirname + '/public',
        port:8080,
        publicPath:'/'
    },
    devtool:"#inline-source-map",
    module:{ //モジュールの設定
        rules:[
            {
            test:/\.js$/, //.jsと付くファイルを対象にする
            enforce:"pre", //最初に実行することを指定
            exclude: /node_modules/, //node_modules/にあるファイルは除外
            loader:"eslint-loader" //eslint-loderを使う
        },
        {
            test:/\.css$/,　//.cssと付くファイルを対象にする
            loader:["style-loader","css-loader"]
        },{
            test:/\.js$/,
            exclude:/node_modules/,
            loader:'babel-loader'
        }]
    }
};
```

##babel
babelはes6,es7で書いたjavascriptをes5に変換してくれます。
現在、javascriptはes6まで策定されていますが、ブラウザによってはes5しか対応していないものもあります。
import,class,letなどがes6になります。
この問題を解決してくれる素晴らしいツール、使わないわけにはいかない。
babelの設定ファイルは.babelrc
「.」から始まるファイルは設定によってはエクスプローラで表示されないので注意してください。

```js
{
    "presets": ["env","react"]
}
```

##eslint
eslintはタイプミスをチェックしたり、コードスタイルのルールを設定してくれます。
vsCodeにも組み込めるみたいなのでそっちで設定してもいいかも、
設定項目が馬鹿みたいに多いので動きさえすればいいのなら使わなくてもよい。
設定ファイルは.eslintrc.json

```.eslintrc.json
{
    "env":{
        "browser":true,
        "es6":true
    },
    "parserOptions":{
        "sourceType":"module",
        "ecmaFeatures":{
            "experimentalObjectResetSpread":true,
            "jsx": true
        }
    },
    "extends" : ["eslint:recommended","plugin:react/recommended"],
    "plugins" :["react"],
    "rules":{
        "no-console":"off"
    }
}
```

##css-loader style-loader
css-loaderとstyle-loaderはwebpackでcssファイルをバンドルするときに必要
css-loaderはcssファイルを読み取って、style-loaderがstyleタグを出力するらしい（←よくわかってない
設定ファイルはありません。


##終わり
今回はここまで
次はreactを動かしてみます。
typescript-eslint で js ファイルと共存する

## 概要
TypeScript を用いたプロジェクトでも一部のファイルは JavaScript として書くケースがあります。
この場合に eslint の config を使い分けていないと js のファイルで、ts 用のルールが使用されて、エラーが検知されてしまいます。
ここでは、この問題の回避方法について紹介します。

## 環境
- eslint@6.8.0
- @typescript-eslint/eslint-plugin@2.24.0

## 問題
TypeScript を用いたプロジェクトでは以下のような `.eslintrc.js` が用意されることが多いと思います。


```js
module.exports = {
  env: {
    node: true
  },
  extends: [
    "eslint:recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:prettier/recommended",
    "prettier/@typescript-eslint"
  ],
  plugins: [
    "@typescript-eslint"
  ],
  parser: "@typescript-eslint/parser",
  parserOptions: {
    sourceType: "module"
  },
  rules: {
  }
} 
```

この config では js ファイルに対しても `explicit-function-return-type` などの、ts ファイル専用のルールを用いて lint が実行されてしまいます。

## 解決策
https://eslint.org/docs/user-guide/configuring#configuration-based-on-glob-patterns にある通り `overrides` か `.eslintrc.js` を複数用意します。
今回は `overrides` を使う方法を紹介します。


```js
module.exports = {
  env: {
    node: true
  },
  extends: [
    "eslint:recommended",
    "plugin:prettier/recommended",
  ],
  plugins: [],
  parser: 'babel-eslint',
  rules: {
  },
  overrides: [
    {
      files: ["*.ts", "*.tsx"],
      extends: [
        "plugin:@typescript-eslint/eslint-recommended",
        "plugin:@typescript-eslint/recommended",
        "prettier/@typescript-eslint"
      ],
      plugins: [
        "@typescript-eslint"
      ],
      parser: "@typescript-eslint/parser",
      parserOptions: {
        sourceType: "module"
      },
      rules: {
      }
    }
  ]
}
```
先に js 向けの設定を書いて、後から ts 向けの設定を `overrides` で設定しています。

js 向けと ts 向けの設定をどっちから書くかを考える必要がありますが、TypeScript は JavaScript のスーパーセットであることを考慮すると、ts 向けの設定を先に書くのが良いかと思います。
jwtで認証を実装する時のrspecテスト

# はじめに
今参加させていただいているスタートアップでapi実装をしており、認証をfirebase authenticationに頼っているのですが、rspecでテストを行うときにjwtの認証をよしなにスキップする方法でめちゃめちゃハマったのでその備忘録です


# 元々のコード(説明のためかなり省略しています)

```ruby:applicatioion_controller.rb
class ApplicationController < ActionController::Base
  before_action :authenticate!

  private
  def authenticate!
    if request.headers['Authorization'].present?
      jwt = request.headers['Authorization']
      # jwtを渡すと検証を行いユーザーの情報を返してくれる独自モジュールを呼び出し
      @user_info = Firebase::JwtAuth.authenticate(jwt) 
    else
      render json: { type: '401', message: 'not authorized' }, status: 401
    end
  end
end
```

```ruby:user_controller.rb
class UsersController < ApplicationController
  # ユーザー一覧を持ってくる
  def index
    users = User.all
    render json: user status: :ok
  end
end
```


```ruby:spec/requests/user_spec.rb
describe UsersController, type: :request do
  let(:headers) { { CONTENT_TYPE: 'application/json', Authorization: 'hoge_token' } }

  describe 'GET /users' do
    it '全てのユーザーを取得する' do
      # header情報をくっつけてリクエストする
      get "/users", headers: headers

      # ステータスコード200が返ってくる、、、はずだった
      expect(response.status).to eq(200)
    end
  end
end
```

# 問題点
最初はこんな感じで実装してたのですが、、、これだと色々と問題があります

- jwtは有効期限が決められているため、実装した瞬間は通ることはあっても一定の時間が経つと通らなくなってしまう
- テストをするたびにfirebase側に不要なリクエストを送ってしまう

もっとあるとは思いますが、ざっとこんなところでしょうか？

# 対処法
これの対処法としては
テスト時に`authenticate!`メソッドが呼ばれた時はあらかじめ設定しておいた`@user_info`を返すような***スタブ***を作成するというものです

※スタブってなんぞ？って人は↓この辺を見てあとは自分で調べてくださいw
https://wa3.i-3-i.info/word14933.html

ってことなのでそのスタブを作っていきます

```ruby:/support/authenticated_helper.rb
module AuthenticationHelper
  def authenticate_stub
    # 渡したいインスタンス変数を定義
    @user_info = [
      {
        'name' => 'kosuke',
        'email' => 'kosuke@example.com',
        'email_verified' => true,
      }
    ]
    
    # allow_any_instance_ofメソッドを使ってauthenticate!メソッドが呼ばれたら
    # ↑のインスタンス変数を返す
    allow_any_instance_of(ApplicationController).to receive(:authenticate!).and_return(@user_info)
  end
end
```

そして作ったスタブをテストコードから呼び出します

```ruby:spec/requests/user_spec.rb
describe UsersController, type: :request do
  let(:headers) { { CONTENT_TYPE: 'application/json', Authorization: 'hoge_token' } }

  describe 'GET /users' do
    it '全てのユーザーを取得する' do
      authenticate_stub # ←追記

      # header情報をくっつけてリクエストする
      get "/users", headers: headers

      # ステータスコード200が返ってくる
      expect(response.status).to eq(200)
    end
  end
end
```

こうしてあげることで`authenticate!`メソッドが呼ばれた時に用意しておいたインスタンス変数が帰るので
無事テストを通すことができます

以上!
Chromeのショートカット集(Mac版)

#Chromeのショートカット集(Mac版)
##タブの左右移動
###右にタブ移動
・Option + Command + 右キー
###左にタブ移動
・Option + Command + 左キー
##タブの削除
・Command + w
##タブを新規で開く
・Command + t
##コメント
Macで**ブラウジングする時**に、よく使うショートカットを日々更新していきます。
[PostgreSQL]テーブルの項目の型の調べ方/確認の仕方

##はじめに
PostgreSQLで実装中に「今のテーブルのそれぞれの項目の状態ってどうなってたっけ？」
となったときに、カラムの型の確認の仕方がまとまっていなかったので、まとめる

##環境
macOS Catalina
Ruby 2.5.1
Rails 5.0.7.2
PostgreSQL 12.2

##確認方法

###1. `psql -l`で、確認したいテーブルが含まれるデータベースの名前を確認する
PostgreSQLにあるデータベースが一覧表示されるので、確認したいテーブルが含まれるデータベース名をコピーしておく

```terminal:ternminal
$ psql -l #PostgreSQLのDBを一覧で表示する

##実行結果 （今回は「app-name_development」が対象）
                                 List of databases
          Name           | Owner  | Encoding | Collate | Ctype | Access privileges 
-------------------------+--------+----------+---------+-------+-------------------
 app-name_development    | user   | UTF8     | C       | C     | 
 app-name_test           | user   | UTF8     | C       | C     | 
 postgres                | user   | UTF8     | C       | C     | 
 template0               | user   | UTF8     | C       | C     | =c/user        +
                         |        |          |         |       | user=CTc/user
 template1               | user   | UTF8     | C       | C     | =c/user        +
                         |        |          |         |       | user=CTc/user
(5 rows)
```
###2. `psql -d データベース名`とコマンド入力
コンソール状態のようになる

```terminal:ternminal
$ psql -d app-name_development #1.でコピーしたデータベース名
psql (12.2)
Type "help" for help.

app-name_development=# 
```
###3. `\d テーブル名`とコマンド入力
入力したテーブル名のカラム、インデックス、外部キーが一覧表示される

```terminal:ternminal
$ psql -d app-name_development
psql (12.2)
Type "help" for help.

app-name_development=# \d users #確認したいテーブル名
                                        Table "public.users"
   Column   |            Type             | Collation | Nullable |             Default              
------------+-----------------------------+-----------+----------+----------------------------------
 id         | integer                     |           | not null | nextval('woms_id_seq'::regclass)
 name       | character varying           |           | not null | 
 group_id   | integer                     |           |          | 
 created_at | timestamp without time zone |           | not null | 
 updated_at | timestamp without time zone |           | not null | 
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
    "index_users_on_group_id" btree (group_id)
Foreign-key constraints:
    "fk_rails_b5bbe7a612" FOREIGN KEY (group_id) REFERENCES groups(id)

app-name_development=# \q #\qで終了
```

##追記（2020/03/21）
これ書いた後に気付いたが、普通に`db/schema.rb`を確認するだけでよかった気もする...
GoogleMapAPIでマーカーに数値を表示する方法

## GoogleMapAPIでマーカーに数値を表示する方法
### 結論
google.maps.Markerのインスタンスを作成する際に、label: に値を入れてあげる。
その際には文字列でないと、デフォルトのマーカーが表示される。

```
  new google.maps.Marker({
    position: { lat: 12.97, lng: 77.59 },
    label: '1',
    map: map,
  });
```

### 感想
ネットで探しても探し方の問題か、あまり良い記事がなかったので公式リファレンスをみたら一発だった。
今後は公式リファレンスを見る！（Google翻訳で問題なくみれるレベルでした）
https://developers.google.com/maps/documentation/javascript/examples/marker-labels?hl=ja#maps_marker_labels-css
global IP の定期的な取得

家のDesktopに外からsshで繋ぎたい、けれどglobal IPがたまに変更されてしまうときに使えます

```shell:get_global_ip.sh
while true; do curl --silent inet-ip.info > output_file; sleep 36000; done
```

あとはoutput_fileをクラウドにあげるなり、メールで定期的に自分に送れば知らないうちにglobal ipが変更になっていてもsshを繋げます。
魔法JS☆あれい 第6話「indexOfなの絶対lastIndexOf」

登場人物

丹生（にゅう）あれい
魔法少女「魔法（マジカル）JS（女子小学生）☆あれい」として活動中。

イテレー太
正体不明の魔法生物。

第1部「ミューテーター・メソッド編」
* [第1話「popでpushした、ような……」](https://qiita.com/8amjp/items/e44e707ccc8c95b4a40d)
* [第2話「shiftはとってもunshiftって」](https://qiita.com/8amjp/items/3fc1b2defd28ba1c2df3)
* [第3話「もうsortもreverseも怖くない」](https://qiita.com/8amjp/items/86f5294981fbebd3fe2d)
* [第4話「fillも、spliceも、copyWithinもあるんだよ」](https://qiita.com/8amjp/items/0741e35b70ea32711265)

第2部「アクセサ・メソッド編」
* [第5話「joinなんて、concatなわけない」](https://qiita.com/8amjp/items/229c41ad2146728abd89)


## indexOf()

イテレー太「この話、別に魔法少女ものっていう設定じゃなくてもいいよね」
あれい「第6話にして我に返ってんじゃねえよこの駄犬」
イ「さ、気を取り直して、今回僕が魔法世界から召喚したデータは……これだ！」

```js
items = [
  'ウォーター', 'ワォーリー', 'ウォ一リ一',
  'ウォーソー', 'ウォーリー', 'ウ才ーリー',
  'ウォーリー', 'チャーリー', 'チャーハン'
];
```

あ「なんなんだこのデータは」
イ「この配列の中から、『ウォーリー』という文字列が前から何番目にあるのか？　を探し出して、`return`して敵を倒してよ！」
あ「そしてなんなんだその注文は」
イ「さあ、早く！」
あ「面倒くせえなあ……」

```js
return items.indexOf('ウォーリー');
// 4
```

イ「配列魔法を使うとウォーリーも簡単に見つかるね！」
あ「ところで、3番目のやつは違うのか？」
イ「あ、あれは伸ばし棒（ー）じゃなくて漢数字の一なんだよ」
あ「まぎらわしいな」
イ「ちなみに、漢字とカタカナが混じってる文字列は、ダブルクリックしても一部しか選択されないよ！　みんなもやってみてね！」
あ「何の豆知識だよ」

### 解説

> `indexOf()` メソッドは引数に与えられた内容と同じ内容を持つ配列要素の内、最初のものの添字を返します。存在しない場合は -1 を返します。

（[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)より）

String（文字列）オブジェクトに対する`indexOf()`メソッドは有名ですが、配列にもほぼ同じメソッドが用意されています。配列内を検索し、指定した値が最初に現れる場所（インデックス）を返します。

## lastIndexOf()

イ「ところで、さっきの配列にはもう一つ『ウォーリー』が隠れているよ！」
あ「興味ねえよ」
イ「それじゃあ、今後はさっきの配列を後ろから検索して、『ウォーリー』という文字列が何番目にあるのか？　を探し出して、`return`して敵を倒してよ！」
あ「データの召喚をサボってんじゃねえよ」
イ「さあ、早く！」
あ「面倒くせえなあ……」

```js
return items.lastIndexOf('ウォーリー');
// 6
```

イ「配列魔法を使うとどこに隠れてても一発で見つかるね！」
あ「今回は手抜き感が半端ないな」

### 解説

> `lastIndexOf()` メソッドは配列中で与えられた要素が見つけられた最後の添字を返します。もし存在しなければ -1 を返します。配列は `fromIndex` から逆向きに検索されます。

（[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf)より）

配列内を最後から検索し、指定した値が最初に現れる場所（インデックス）を返します。配列内に指定した値と同じものが1つしかない場合は、結果は`indexOf()` と同じになります。

## 次回予告

sliceメソッドを使ってまで、君にはコピーしたい配列があったんだろ？
それは間違いなく実現したじゃないか。

[第7話 includesのsliceと向き合えますか？](https://qiita.com/8amjp/items/007ac192399225db3843)
忙しい人のためのGo入門

とりあえうz、Go始めてみようかなと思った人向け

# 忙しい人のためのGo入門

## そもそもGoとは
Goは，2009年にGoogleにより発表されたオープンソースのプログラミング言語です。

## Goの特徴は
シンプルな言語仕様，型システム，並行処理

## おすすめの講座
### progate Go講座
https://prog-8.com/languages/go

### dotinstall Go入門


### サンプルアプリ
Goでアプリケーションを作る講座
https://rightcode.co.jp/blog/information-technology/golang-introduction-environment-1


## 基本的な文法（公式ドキュメント）
http://golang.jp/category/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88

↓もわかりやすい
http://gihyo.jp/dev/feature/01/go_4beginners

## ユニットテスト
https://qiita.com/keiichi-hikita/items/ae241bd8c710bbfdf0a8
https://www.tweeeety.blog/entry/2018/01/22/233520

## CMS
Ketchup
https://github.com/ketchuphq/ketchup

## フレームワーク
こちらの記事が詳しい。
https://qiita.com/yumin/items/5de33b068ead564ebcbf

## テンプレートエンジン
こちらの記事が詳しい。
https://qiita.com/kamina/items/58e5290ff0f569a76331

## ライブラリ
https://github.com/avelino/awesome-go

## 並行処理
https://qiita.com/suin/items/82ecb6f63ff4104d4f5d
https://qiita.com/gold-kou/items/8e5342d8a30ae8f34dff

goroutine ゴルーチン　並行処理させたい関数 go func()
channel 関数同士で受け渡しするために使う
waitGroup 同期させるために使う


1万リクエスト
https://qiita.com/Azunyan1111/items/a1b6c58dc868814efb51理
https://qiita.com/suin/items/82ecb6f63ff4104d4f5d
https://note.com/akikun2020/n/nbe945100f3a0



##　感想
並行処理おもしろーい
EclipseでJUnit5がjava.lang.NoClassDefFoundError: org/junit/platform/engine/EngineDiscoveryListenerになる

eclipseでJUnit5を実行しようとしたら、以下のようなエラーが発生する場合がある。

```java
java.lang.NoClassDefFoundError: org/junit/platform/engine/EngineDiscoveryListener
	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
	at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
	at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:801)
	at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:699)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:622)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	at org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.getLauncherDiscoveryListener(LauncherDiscoveryRequestBuilder.java:241)
	at org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.build(LauncherDiscoveryRequestBuilder.java:235)
	at org.eclipse.jdt.internal.junit5.runner.JUnit5TestLoader.createUnfilteredTest(JUnit5TestLoader.java:75)
	at org.eclipse.jdt.internal.junit5.runner.JUnit5TestLoader.createTest(JUnit5TestLoader.java:66)
	at org.eclipse.jdt.internal.junit5.runner.JUnit5TestLoader.loadTests(JUnit5TestLoader.java:53)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:526)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Caused by: java.lang.ClassNotFoundException: org.junit.platform.engine.EngineDiscoveryListener
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	... 18 more

```

これの解決には```junit-platform-launcher```の依存性を追加する。spring-bootと一緒に使う場合にはversion指定は必要ない。

```gradle
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
```

# 参考
* http://www.ne.jp/asahi/hishidama/home/tech/java/junit/5/gradle.html#h_eclipse_test
* https://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-ND16-JUnitUsage.pdf
* https://junit.org/junit5/docs/snapshot/user-guide/#running-tests-ide
【Github Actions】Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

## 事象
Github Actionsで突然Mysqlに接続できなくなった

```
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```

## 原因
2020/3/12から、Github ActionsのUbuntuで
Mysqlが自動起動しなくなったため

https://github.blog/changelog/2020-02-21-github-actions-breaking-change-ubuntu-virtual-environments-will-no-longer-start-the-mysql-service-automatically/

## 解決策
workflowにMysqlを起動させるコマンドを追加

```
- run: |
    sudo /etc/init.d/mysql start
```
### 修正後ソース
```
name: Ruby

on:
  push:
  pull_request:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v2
    - name: Set up Ruby 2.5
      uses: actions/setup-ruby@v1
      with:
        ruby-version: 2.5.x
    - name: Budle install
      run: |
        gem install bundler
        bundle install --jobs 4 --retry 3
    - name: Setup Database
      run: |
        cp config/database.yml.ci config/database.yml
        sudo /etc/init.d/mysql start # ここを追加
        bundle exec rake db:create
        bundle exec rake db:schema:load
      env:
        RAILS_ENV: test
    - name: test with Rake
      run: |
        bundle exec rake
      env:
        RAILS_ENV: test
```
## 最後に
公式ドキュメントちゃんと読みましょうという話
Amazon ECS の Volumes と Bind Mount の仕組み

#1.Volumes#

`/var/lib/docker/volumes/` ↔️　`/var/www/html`

![スクリーンショット 2020-03-21 13.46.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/76cee64c-2753-0ee0-5e89-1bb644d0e2f9.png)

管理者権限でログイン

```
sudo su
```

`/var/lib/docker/volumes/`　に移動。

```
cd /var/lib/docker/volumes/

ll
drwxr-xr-x 3 root root  4096 Mar 21 04:47 80a6b074bf3171ef09d22cfdc17c950986315ec71498fe2c10fe364573a3dcff
```

`80a〜`に移動`

```
cd 80a6b074bf3171ef09d22cfdc17c950986315ec71498fe2c10fe364573a3dcff

ll
drwxr-xr-x 2 root root 4096 Mar 21 04:47 _data
```

`_data`に移動。

```
cd _data

-rw-rw-r-- 1 root root 111 Mar  9 09:36 index.html
```

`index.html`を適当に編集し、変更が表示されるか確認する。

```html:index.html
<html>
    <head><title>ecs volumes demo</head></title>
        <body>
this is ecs volumes demo
        </body>
</html>
```



#2.Bind Mount#

`/root/Volume01` ↔️　`/var/www/html`

![スクリーンショット 2020-03-21 14.09.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/206afded-9eaf-9e70-9eb1-06dd97bb152e.png)
![スクリーンショット 2020-03-21 14.13.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/186b3066-4826-1838-e61d-7e1eee80fef6.png)

`Volume01` ができているか確認。

```
sudo su

cd

ll
drwxr-xr-x 2 root root 4096  3月 21 05:14 Volume01
```

`Volume01`に適当な`index.html`を開き、反映されるか確認。

```
cd Volume01
```

```html:index.html
<html>
    <head><title>ecs bind mount  demo</head></title>
        <body>
this is ecs bind mount demo
        </body>
</html>
```



#3.リンク#
[Amazon ECS](https://qiita.com/leomaro7/items/deb114e5ec209a044e5d)
コミットログを消さずにGitのリポジトリを統合する


<https://github.com/TakesxiSximada/.org-capture> というリポジトリを統合する場合

    git remote add https://github.com/TakesxiSximada/.org-capture cap
    git subtree add --prefix=capture cap master

**&#x2013;prefix** で指定した場所にディレクトリが作成され、その下にファイルが作成される。
【Python】ARC006A(集合(set)最強説)【AtCoder】

集合`set`が最強だなと思ったのでメモ。

# [ARC006A](https://atcoder.jp/contests/arc006/tasks/arc006_1)
Difficulty:238
問題自体は簡単。
あとはいかに早くスマートに記述できるかが競プロで高パフォーマンスを出すための鍵！
※スマートに記述できた方が、バグもコード量も減ると思う！

別に`set`なんか使わなくても解けるんだけど、今回は`set`を使って解いてみる。

##集合`set`の予備知識
高校数学のベン図みたいなことができる！
`A|B`:和集合
`A&B`:積集合
`A^B`:排他的論理和(どっちか一方のみtrue ビット演算のXOR)
`A-B`:差集合(Aのみにあるもの)

具体的には・・・

```python:test.py
A={1,2,3,5,6}
B={2,4,5,7}
print(A|B)
print(A&B)
print(A^B)
print(A-B)
```

出力結果
<img width="287" alt="スクリーンショット 2020-03-21 14.03.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183481/720e07dc-4327-57ec-fe5e-5b642c370f67.png">

`set`強い(確信)
いろいろ使いどころありそう

##実際にARC006Aを`set`を使ってとくとこんな感じ

```python:test.py
def I(): return int(input())
def LI(): return list(map(int,input().split()))
E = set(LI()) #集合として受け取る！
B = I()
L = set(LI()) #集合として受け取る！
ans = 0
count = len(E&L) #積集合！！！
if count==5 and B in L:
    ans = 2
else:
    ans = {6:1,5:3,4:4,3:5}[count] if count>=3 else 0
print(ans)

```

この集合の知識が頭にはいっていればこの問題は3分以内でコード描けるはず！
こういうの知らなくても解けるけど、知ってると早く解ける=強い人になれるとなんとなく思ってる。

おわり!
[Firebase]: 匿名認証を利用する

最近サーバとのデータ通信が必要なiOSアプリを作成しているのですが、FirebaseのデータベースサービスであるFirestoreを利用してから数週間経ったある日、こんなメールが、
<img width="549" alt="スクリーンショット 2020-03-21 13.35.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501910/a2404c56-a999-91b8-6d8b-9e7c7ab0dc30.png">

データベースが攻撃に対して脆弱であり、セキュリティルールを厳しくせよとのことでした。

認証されたユーザーからのみアクセスを許可するルールにすれば解決なのですが、ログイン機能を持たせるアプリでもないため、どうしたものか、、、と思案していたところ、Firebaseの**匿名認証**という機能を発見しました。匿名認証を利用することで、ユーザーにログインを強制することなく、データベースのセキュリティを安全に保つことができます。

> Firebase で認証する一時的な匿名アカウントを、Firebase Authentication で作成して使用できます。一時的な匿名アカウントを使用すると、アプリに登録していないユーザーが、セキュリティ ルールで保護されているデータを使用できるようになります。
https://firebase.google.com/docs/auth/ios/anonymous-auth?hl=ja

設定方法は下記の通りです。

## 匿名認証の実装方法
Authenificaion → ログイン方法　から匿名認証を有効にします。
<img width="978" alt="スクリーンショット 2020-03-21 14.02.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501910/97948079-07db-241e-b8e5-e0fde6241a19.png">

AppDelegaet.swiftにsiginInAnonymously()メソッドを追加すれば、起動時に自動で匿名ユーザーが作成されます。

```swift:AppDelegaete.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        FirebaseApp.configure()
        
        // 匿名認証(下記のメソッドがエラーなく終了すれば、認証完了する)
        Auth.auth().signInAnonymously() { (authResult, error) in
            if error != nil{
                print("Auth Error :\(error!.localizedDescription)")
            }

             // 認証情報の取得
             guard let user = authResult?.user else { return }
             let isAnonymous = user.isAnonymous  // true
             let uid = user.uid
            return
        }
        return true
    }

```

## セキュリティルールの設定方法
認証ユーザーのみ読み取りを許可するよう、Firestoreのセキュリティルールを修正します。

```
service cloud.firestore {
  match /databases/{database}/documents {
	match /collectionName/{document=**}{
		allow read: if request.auth != null;
	}    
  }
}
```
wikipediaのリンクをpythonで再帰的に集める

http://www.minekawada.com/wikipedia-python-wordcloud.html


目次
前回のあらすじ
アルゴリズム
ソースコード


wikipediaのページから、さらに先のページへと連続的にアクセスして、リンクを深掘りしていきたいと思います！
最終的な目標は、検索したwikipediaのページを中心にリンクを収集することで、検索ワードを中心にデータを収集し、ワードクラウドを作成すること

例
http://www.minekawada.com/kawaminee/wordcloud/%E3%82%A2%E3%83%B3%E3%83%91%E3%83%B3%E3%83%9E%E3%83%B3
[python] インスタンス変数の一覧を取得する



# まず
次のようなオブジェクトがあるとします。

```python
class Tarou:
    def __init__(self):
        self.name = 'tarou'
        self.age = 15
        
tarou = Tarou()
tarou.height = 170
tarou.weight = 58
```



# 一覧取得


### その①　vars

@shiracamus さんにコメントいただきました。dict形式で返してくれる関数があります。

```python
print(vars(tarou))
```

```:実行結果
{'name': 'tarou', 'age': 15, 'height': 170, 'weight': 58}
```

```python: こんな感じで使うといんじゃないでしょうか
class Tarou:
    def __init__(self):
        self.name = 'tarou'
        self.age = 15

    def get_my_instance_var_names(self):
        return vars(self)

tarou = Tarou()
print(tarou.get_my_instance_var_names())
```
```
{'name': 'tarou', 'age': 15}
```




### その② インスタンス.\_\_dict__

```python
print(tarou.__dict__)
```

```:実行結果
{'name': 'tarou', 'age': 15, 'height': 170, 'weight': 58}
```

### 注意点

**dict属性のもでなければエラーとなります。**

```
TypeError: vars() argument must have __dict__ attribute
```


# 参考
[エキスパートPythonプログラミング ](https://amzn.to/2XGLk0m)
JavaScriptでクラスを定義する方法！

JavaScriptを記述する場合、基本的には専用のjsファイルを作成して、処理を記述するのが一般的ですね。
しかし、何も考えずに処理を記述すると下記のように関数（function）が増えていってしまいます。

```javascript
function() {
alert('処理1');
}
function() {
alert('処理2');
}
function() {
alert('処理3');
}
```
処理内容が小さければ、上記のような記述でも問題ありませんが、処理の内容が大きいと可読性やメンテナンス性が損なわれます。

大規模なプロジェクトを経験した方であれば、JavaScript地獄なんて言葉を聞いた方も多いと思います。

私も別のプログラマーが作った10万ステップのJavaScriptの改修を任され、とても苦労した経験があります。

そこで今回は、JavaScriptをクラス定義で記述し、可読性やメンテナンス性に優れたコーディング方法を紹介します。

##JavaScriptでクラスを定義する方法

もっともシンプルな中身のないクラスを定義する方法は簡単で、ただ空の関数リテラルを代入するだけです。

```javascript

var Member = function() {};
```

そして、インスタンス化するには、以下のように記述します。

```javascript

var member = new Member();
```

ただし、空の関数リテラルを代入しただけなので、このインスタンス化したクラスは意味がありませんね。

そこで、もう少し一般的な使い方を考慮してクラス定義していきます。

##プロパティとメソッドを持つクラスを定義する方法

プロパティとメソッドを持つクラス定義は、下記のとおりです。

```javascript

var Member = function(firstName, lastName) {
    // 名前（名）
    this.fistName = fistName;
    // 苗字（姓）
    this.lastName = lastName;

    /**
     * 名前を返却.
     * @return string 苗字（姓）と名前（名）を連結して返却
     */
    this.getName = function() {
        return this.lastName + ' ' + this.fistName;
    }
}
```

インスタンス化するには、以下のように記述します。

```javascript

// 苗字（姓）と名前（名）を引数にクラスをインスタンス化する
var member = new Member('一郎', '鈴木');

// 名前を出力する
alert(member.getName());
```

以上で、苗字（姓）と名前（名）を保持し、連結した名前を返却するメソッドのクラスを定義することができました。

しかし、このクラス定義には以下の問題点があります。

- メソッドの数に比例して”無駄”なメモリを表示する

つまり実際の開発現場では、上記のようなクラス定義は行ってはダメです！！！

ではJavaScriptでクラス定義は意味ないの？

JavaScriptには、上記のような問題を解決する方法が用意されています。

実際の開発現場では、下記の方法でクラス定義を行いましょう！

##JavaScriptでクラス定義する場合はprototypeを付加する！

```javascript

var Member = function(firstName, lastName) {
    // 名前（名）
    this.fistName = fistName;
    // 苗字（姓）
    this.lastName = lastName;
}

// prototypeを付加してメソッドを定義
Member.prototype.getName = function() {
    return this.lastName + ' ' + this.fistName;
}
```

名前（名）と苗字（姓）は今までどおり関数リテラルを記述すればOKです。

注目は、getNameメソッドを定義するときに「prototype」を付加するところです。この「prototype」を付加することで、”参照”されるようになります。

つまり、複数インスタンス化した場合でも、関数オブジェクトは暗黙的な参照を持つことになり、無駄に作られることはありません。

つまりメモリの消費を抑えることができるようになります。

ちなみに関数を定義する際に下記のように毎回prototypeを付加するのは大変ですね。。

```javascript

var Member = function(firstName, lastName) {
    this.fistName = fistName;
    this.lastName = lastName;
}
Member.prototype.getName1 = function() {
    return this.lastName + ' ' + this.fistName;
}
Member.prototype.getName2 = function() {
    return this.lastName + ' ' + this.fistName;
}
```

そのため、複数の関数リテラルを定義する場合は、以下のように書き換えることができます。

```javascript

var Member = function(firstName, lastName) {
    this.fistName = fistName;
    this.lastName = lastName;
}
Member.prototype.getName1 = {
    getName1 : function() {
        return this.lastName + ' ' + this.fistName;
    },
    getName2 : function() {
        return this.lastName + ' ' + this.fistName;
    }
}
```

##まとめ：JavaScriptでクラス定義する場合は、prototypeを付加して無駄なメモリを消費しないようにしよう！

JavaScriptでクラスを定義することで、可読性やメンテナンス性に優れたプログラムを記述することができます。

そして、prototypeを付加することで無駄なメモリを消費せず、スマートな定義ができるようなります。

以上、JavaScriptでクラスを定義する方法でした。
[neo4j] 開発環境をdockerで構築する

# はじめに
- neo4jを使う機会があったので、手元のMacで手軽に動かしたかった
- 手元で手軽に＝Dockerでしょ。と言うことで、やってみた
- 初期パスワード変更も行えるようにしたことが工夫点
（これやらないと、ブラウザから変更作業が必要）
- 何だかんだで、docker-composeから環境変数をDcokerfileに渡すのが一番ハマった。先人達の知恵に感謝

# ディレクトリ構成
```shell
docker
├── docker-compose.yml
└── neo4j
    ├── Dockerfile
    ├── conf
    ├── data
    └── logs
```


# Dockerfile
- image build中にデフォルトユーザ`neo4j`のパスワードを環境変数として渡せるようにしている
- `NEO4J_AUTH`に`user/password`と設定するとパスワードが設定できるらしい

```docker
FROM neo4j:4.0.2
ARG NEO4J_PASSWORD
ENV NEO4J_AUTH=neo4j/${NEO4J_PASSWORD}
```


# `docker-compose.yml`
```yml
version: '3.7'
services:
  db:
    build:
      context: ./neo4j
      args:
        NEO4J_PASSWORD: $NEO4J_PASSWORD
    image: hmiyakoshi0803/neo4j:4.0.2
    restart: always
    ports:
      - "7474:7474"
      - "7687:7687"
    volumes: 
      - ./neo4j/data:/data
      - ./neo4j/logs/:/logs
      - ./neo4j/conf/:/conf
    ulimits: 
      nofile:
        soft: "40000"
        hard: "40000"
```


# 起動方法
- `hogehoge`部分に好きなパスワードを設定する

```shell
$ NEO4J_PASSWORD=hogehoge docker-compose up -d --build
```

- 起動したか確認する

``` shell
$ curl 127.0.0.1:7474
{
  "bolt_routing" : "neo4j://0.0.0.0:7687",
  "transaction" : "http://127.0.0.1:7474/db/{databaseName}/tx",
  "bolt_direct" : "bolt://0.0.0.0:7687",
  "neo4j_version" : "4.0.2",
  "neo4j_edition" : "community"
}
```



# 参考
[Run Docker with Neo4j](https://neo4j.com/developer/docker-run-neo4j/#docker-run)
[Dockerfile ARG入門](https://qiita.com/nacika_ins/items/cf8ceb20711bd077f770)
[docker-composeから環境変数をDockerfileに渡す方法](https://qiita.com/Targityen/items/2717511ca9f12c1c667f)





以上
Firestore データの追加　現在時刻を配列に格納する　(Swift)

現在時刻を何度も取得して、Firestoreドキュメントの配列に格納していくやり方で困ったので、メモ＆共有。

<H2>ポイント1. 現在時刻はTimestamp(date: Date())で取得。</H2>

Fieldvalue.timestamp()　で時刻を取得することもできるんですが、
これをFirestoreのTimestamp配列フィールドに入れようとするとエラーになります。

2020年3月時点では、Fieldvalue.timestamp()は配列に対応していないようです。

よって、公式ドキュメントにさらっと書いてある「Timestamp(date: Date())」で現在時刻を取得してTimestamp配列に入れると、こちらは問題なし。


<H2>ポイント2.arrayUnionは配列の新規作成でも使える </H2>

公式ドキュメントでは、arrayUnionは「配列がある場合に」と記載されていますが、以下のように、配列がない場合でも１番目の配列要素を作成してくれました。

以上、ご参考まで。



        let historyRef = db.collection("history").document(String(user!.uid))
        
        historyRef.setData([
            "userid" : String(user!.uid),//ユーザID
            "objectid" : objectid,
            //arrayUnionで、初回配列がない場合でもた1個目の配列要素を自動で追加してくれる
            "history" : FieldValue.arrayUnion([Timestamp(date: Date())])
        ], merge: true
            ) { err in
            if let err = err {
                print("Error adding document: \(err)")
            } else {
                print("Document added with ID")
            }
        }
【Vue.js】スコープ付きスロットが理解できるように例を交えて考える

## はじめに
簡単に使えることが魅力のVue.jsにおいて、
最初の関門になるものの１つがスロット（slot）だと思います。

特に、スコープ付きスロットは、
理解が難しく感じる人が少し多い気がするので、
私なりの理解について書こうと思います。

## スロット（slot）について
まずは、スロットについてのおさらいです。

スロットは、特定領域の描画内容を、
親のコンポーネントにまるまるお願いしたい時に使います。

夕飯の献立を「体が温まるものが食べたい〜」と母親に伝えて、
実際に何を作るかは母親に任せるようなイメージです。

実際にコードで表すと、こんな感じでしょうか。

```html:MyChild.vue
<template>
  <div>
    <h2>今日の献立</h2>
    <slot name="hot-meal"></slot>
  </div>
</template>
```

それを使う親コンポーネント

```html:MyParent.vue
<template>
  <div>
    <my-child>
      <template v-slot:hot-meal>
        <h3>たまごスープ</h3>
        <p>賞味期限が過ぎた卵のたまごスープ</p>
      </template>
    </my-child>
  </div>
</template>
```
　

描画結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349044/33d53aa5-0223-6b55-625d-d8d41b6fcaf4.png)


このように子コンポーネントの`<slot name="hot-meal">`で指定した領域に、
親コンポーネントから`v-slot:hot-meal`の形式でslotのnameを指定することで
描画内容をまるまる渡すことができます。
ちなみに、slotが１つの場合はnameを省略することもできます。

## スコープ付きスロットについて
スロットについておさらいしたところで、
次は本題のスコープ付きスロットについてです。

スコープ付きスロットは、
子コンポーネントが持つデータをスロット内において、
親が使うことを許可する仕組みです。

子供が卵を持っていると考えてください。
夕飯の時にこの卵を使ってくれてもいいなと思ってたとします。
その場合に、「この卵、使ってもいいよ」と卵に張り紙を貼っておくイメージです。

コードで説明します。



子コンポーネントのslotタグにおいて、
eggという名前で、eggというデータをバインドしています。
このバインドされた属性は、スロットプロパティと呼ばれています。

```html:MyChild.vue
<template>
  <div>
    <h2>今日の献立</h2>
    <slot name="hot-meal" v-bind:egg="egg"></slot>
  </div>
</template>
```
script側はこんな感じです。

```javascript:MyChild.vue
<script>
export default {
  data(){
    return {
      egg: 'うずらの卵'
    }
  }
}
</script>
```
　
　

そして親コンポーネントでは、スロットプロパティを通して、
子コンポーネントのデータを使う事ができます。

下の例だと、slotPropsという名前で、スロットプロパティを受け取っていますが、
slotPropsという名前でなくても任意の名前を使えます。

```html:MyParent.vue
<template>
  <div>
    <my-child>
      <template v-slot:hot-meal="slotProps">
        <h3>たまごスープ</h3>
        <p>{{ slotProps.egg }}のたまごスープ</p>
      </template>
    </my-child>
  </div>
</template>
```
　
　
このように、子コンポーネントのeggというデータを受け取ることができています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349044/0136f3f2-9300-08f0-d516-2a3554f3d448.png)


## まとめ
* slotは、親に描画内容を任せるためのもの
* スコープ付きスロットは、親に描画で使える材料を渡すためのもの

## おわりに
「スコープ付きスロットっていうわかりづらい概念があるから、Vue.js使うのやめよう」という人が減ればいいなと思います。（そんな人いないか..）


## 参考
https://jp.vuejs.org/v2/guide/components-slots.html