OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoder Beginner Contest 208

##[A - Rolling Dice](https://atcoder.jp/contests/abc208/tasks/abc208_a)

O(１)

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    int A, B;
    cin >> A >> B;

    if(6*A >= B && A <= B) cout << "Yes" << endl;
    else cout << "No" << endl;

    return 0;
}
```

##[B - Factorial Yen Coin](https://atcoder.jp/contests/abc208/tasks/abc208_b)

O(N)
１円から順番に最大で何枚を使えるかシミュレートします。
解は必ず存在すると誓約があります。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    int P;
    cin >> P;

    int money=0;
    while(P>0){
        int cnt=1;
        int value=1;
        while(value * cnt<=P){
            value *= cnt;
            cnt++;
        }
        P -= value;
        money++;
    }
    cout << money << endl;

    return 0;
}
```

##[C - Fair Candy Distribution](https://atcoder.jp/contests/abc208/tasks/abc208_c)

O(N)
国民番号順に並べ替える。
その後お菓子の配布。
最初の順番に並べ替える。

tupleを使う問題です。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<ll,ll>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    ll N, K;
    cin >> N >> K;

    vector<tuple<ll, ll, ll>> A(N);
    rep(i, N){
        ll a;
        cin >> a;
        A[i] = make_tuple(i, a, 0);
    }

    sort(A.begin(), A.end(), []( const auto &x, const auto &y )
    {
        return get<1>( x ) < get<1>( y );
    });

    ll add = K / N;
    ll amari = K % N;
    for(int i=0; i<N; i++){
        if(i<amari) get<2>(A[i]) = add + 1;
        else get<2>(A[i]) = add;
    }

    sort(A.begin(), A.end(), []( const auto &x, const auto &y )
    {
        return get<0>( x ) < get<0>( y );
    });

    for(int i=0; i<N; i++){
        cout << get<2>(A[i]) << endl;
    }

    return 0;
}
```
Cloud9へTalend API Testerを使ってPOSTしてみた

Cloud9を使ってRailsのアプリ開発をしていた際、APIの動作検証でTalend API Testerを使ってみたので必要な設定等をまとめておく。

## Talend API Testerをインストール
まずはChromeの拡張機能でTalend API Testerをインストールしておきます。
https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm?hl=ja

Chromeのアドレスバーの右側の拡張機能に**Talend API Tester**が表示されていればインストール成功！

## 使い方
Chromeの右上にある拡張機能でTalend API Testerをクリックすると別タブで開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849412/71c0aa9d-0667-1534-9804-c5b89cf9aab1.png)

#### 送信先URL②について
先に結論を言ってしまうと、Cloud9側で```rails s```してPumaを起動しているだけであればポート番号は特に指定する必要はありません。
<pre>https://＜送信先VFS＞.vfs.cloud9.us-east-1.amazonaws.com/＜以下テストしたいAPIのアドレス＞</pre>

### 送信方法
GETやPOSTの送信方法はこちらの記事に詳しくまとめてあったので参考にしました。
https://qiita.com/ktr1211/items/c16cb4f99f91b998af46

①画面上部のMETHOD欄でPOSTを選んで、②次にリクエストの送信先URLを入力したら、③HEADERSにキーを設定します。

```http:HEADERS
Content-Type
application/json
```

④最後にPOSTしたいデータをJSON形式でBODYに書いて、⑤あとはSendをクリックするだけです。

```http:BODY：例
{
  "name": "太郎",
  "memo": "POSTテスト"
}
```

### POSTが失敗した場合は・・・
Rails5.2以降でもし422エラーが返ってきてPOSTに失敗した場合は、以下のコードを追加してCSRF対策を有効にしてください。

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery#この行を追加してあげる
end
```
BVE 地上子(Beacon)

# 1.マップファイル
~~~
Beacon.Put(type, section, sendData);
　type : 地上子種類 (整数)
　section : 対応する閉塞の相対インデックス
　sendData: プラグインに送る値 (整数)
~~~
※Sectionについて
![beaconput4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2053718/81a858f2-925b-9486-c17d-7abceabc7d14.png)

- -1:信号値が0の閉塞インデックス 0:自列車のいる閉塞 1:次の閉塞 2…
- 相対インデックスが-1の場合には先行列車の設定が必要っぽい。
- 相対インデックスが-1、0の場合は、その信号値は必ず停止現示になる。
- 相対インデックス0を除く、自列車より後ろの閉塞はすべて進行現示の扱いになるっぽい。
- プラグインには絶対インデックスに変換されて信号値が渡される。
- 存在しない閉塞を指定するとプラグインが意図しない挙動をする可能性がある。

※SendDataについて

- 値域は-2147483648 ～ 2147483647
- 10進数で表記すること。2進数表記や16進数表記はエラーになる。
- その代わりに、BVEでサポートされている演算は記述可能 (例：Beacon.Put(60, 1, 4+256);)


# 2.プラグイン
地上子を通過するとSetBeaconDataが呼ばれる
進行方向順、同一距離程の場合は記載順に呼ばれる

~~~
void SetBeaconData(AtsBeaconData beaconData)
　beaconData : 地上子情報の構造体
　・float Distance : 対応する閉塞インデックスまでの距離
　・int Optional : 地上子付加情報 (BeaconのSendData)
　・int Signal : 対応する閉塞インデックスの信号値
　・int Type : 地上子種類
~~~

※Typeについて
公式のATSプラグイン(C++)のテンプレートではTypeは0～255で定義されているが、実際はint型なので256以上も可能。

※Distanceについて
出力値を見た限りでは、対応する閉塞の距離程 - BVE内部の現在距離程(通常は次のElapseイベントで渡される距離程)と思われる。
PCでの演算の宿命だが、距離程に小数が含まれていると誤差が発生する。(いまのところ最大約30cmの誤差を確認)
![beaconput.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2053718/0e6d0852-e488-6b49-1dd3-2460ec6f2e32.png)

※Beacon.Putで指定したインデックスの閉塞が存在しない場合
　Distance=0, Signal=0が渡される。
【python】超基礎

## 変数

変数は値を入れておく箱と思ってください。

```python
test_str: str = "test"
test_int: int = 10
```

`test_str`という箱に「test」という文字列が入りました。
`test_int`という箱に「10」という数値が入りました。
文字列は必ずダブルクォーテーションて囲むことが鉄則です。

型という概念があり、今回だとtest_strは文字型、test_intはint型になります。
その他にもリスト型や辞書型などもありますが、おいおいやります。

### リスト型

```python
names: list = ["田中", "鈴木", "田代"]
numbers: list = [1, 3, 100]
```

### 辞書型

こちらはリスト型のパワーアップバージョンで、キーとバリューで成り立っています。

```python
# "キー": "バリュー"
test_dict: dict = { "田中": 76, "鈴木": 80, "田代": 30 }
```

上記は、キーが名前でバリューが点数という例です。

## if文

もし～だったら～
そのままですね。

```python
test_str: str = "test"

if test_str == "test":
    print("同じ")
else:
    print("違う")
```

もし`test_str`と`"test"`が等しければ「同じ」と表示する。
でなければ、「違う」と表示する。

```python
test_int = 10

if test_int == 10:
    print("test_intは10(等しい)")
elif test_int <= 10:
    print("test_intは10以下")
elif test_int >= 10:
    print("test_intは10以上")
```

test_intが10と等しければ「test_intは10(等しい)」と表示。
test_intが10以下なら「test_intは10以下」と表示。
test_intは10以上なら「test_intは10以上」と表示。

**インデントに注意しましょう！**

```python
if test_int == 10:
print("test_intは10(等しい)")
```

この場合だとprint文はifの中に入っていません。(ネストされていない)
処理が別々になります。
if文の中の処理はなく、print文は必ず表示される状態になってしまっています。

## for文（繰り返し処理）

```python
for count in range(5):
    print(count)
```

こちらは５回繰り返し処理が走ります。
countの中身は0～4までカウントアップされます。
実行結果はこちらになります。

```
0
1
2
3
4
```

### リスト型をfor文で回す

```python
heroes: list = ["アンパンマン", "さいたま", "キング", "ジェノス"]

for hero in heroes:
    print(hero)
```

`heroes`の中身を順に`hero`に代入して回します。
実行結果はこちらになります。

```
アンパンマン
さいたま
キング
ジェノス
```

## 関数

```python
def show_heroes(heroes: list) -> None:
    for hero in heroes:
        print(hero)


heroes: list = ["アンパンマン", "さいたま", "キング", "ジェノス"]
show_heroes(heroes)
```

`def show_heroes(heroes: list) -> None:`こちらが関数になります。
一番下の`show_heroes(heroes)`がshow_heroes関数を呼び出しています。
()の中のheroesを**引数**と言います。
heroesをshow_heroes関数に渡しています。
`-> None`については返り値がないという意味です。
返り値については次で説明します。

### 返り値

```python
def squared(test_int: int) -> int:
    squared_int: int = test_int * test_int
    return squared_int


test_int: int = 8
test_2int: int = squared(test_int)
print(test_2int)
```

こちらはtest_intに8を代入して、squared関数で２乗した値を返してtest_2intに代入しています。
`return squared_int`で`squared_int`の値を返すという意味です。
int型を返しているので`-> int`としています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399745/407a8900-a153-c2eb-344e-39d3feb26a5a.png)

### アノテーション

アノテーションとは、変数代入のときの、

```python
test_int: int = 8
```

`:int`の部分になります。

あと、先程の

```python
def squared(test_int: int) -> int:
```

の`-> int`の部分になります。
本当はこれがなくてもプログラム上では動きます。

なぜアノテーションをつけるかというと、変数ではすぐなんの型かがわかりあとあと、メンテナンス性がいいからです。

```python
def squared(test_int: int) -> int:
```

こちらも関数の中身を全部見なくても引数がint型が渡ってきていて、返り値がint型であることが一行だけみればわかります。

```python
def squared(test):
```

アノテーションがない場合、testの中身はなんなのか関数の中処理を見ないとわからないし、返り値の型又は返り値があるかないかなど全くわかりません。

これじゃあ、あとあと修正するときが大変ですよね？

ということでアノテーションはつけましょう！というお話です。
[Flutter] flutter_soundでlistenしても動作しなかった時にdurationを指定した話

こんにちは。Flutter赤ん坊です。ばぶ。

flutter_soundを使っているのですが、プログレスバーに再生位置を反映させたいと思い、onProgressのlistenを用いる事にしました。以下のような具合にです。

```dart
player.onProgress?.listen(
  (event) {
    playerProgress = event.position;
    playerDuration = event.duration;
    notifyListeners();
  },
);
```

すると、待てど暮らせどプログレスバーが反応しない。どうやらlisten内が実行されていないようです。

頭かんかんでflutter_soundのissueを見に行ったところ、どうやら同じ症状で苦しんでおられる方が何人かおられる模様。それ見たことかといくつか漁っていると、

ありました。

どうやらサブスクリプションの時間間隔を指定しないといけないようです。以下のような具合です。

```dart
await player.setSubscriptionDuration(Duration(seconds: 1));
```

これで無事に、listen内が等間隔に実行されました。素晴らしいパッケージを作ってくださっている方々には、感謝しかありません。以上です。
ERB Formatterが動かず、tmpファイルが生成される現象を解決する

#前提
VSCodeにERB Formatterをインストールしていることを前提とします。

#参考記事
[こちら](https://github.com/aliariff/vscode-erb-beautify/issues/9)で議論されており、対象のファイルが重たいとtmpファイルが生成されてしまうようです。
基本的には以下の記事の通りに設定することで解決します。
https://medium.com/@costa.alexoglou/enable-formatting-with-erb-files-in-vscode-d4b4ff537017

#問題点
先述の記事の通りに設定したところ、エラーを吐いて動きませんでした。
エラーになった箇所は下記の"command"の箇所です。

```json:.vscode/tasks.json
{
"version": "2.0.0",
"tasks": [
{
    "label": "ERB formatter",
    "type": "shell",
    "command": "ext=$(echo ${file})  && if [ ${ext##*.} == erb ]; then htmlbeautifier ${file} ${file}; else echo 'Not an ERB file'; fi",
    "presentation": {
        "reveal": "never",
        "panel": "new",
        "echo": false
       },
    "group": {
    "kind": "build",
    "isDefault": true
     }
}
            ]
}
```

#解決方法
"command"の箇所を下記のように書き換えました。

```json:.vscode/tasks.json

"command": "ext=$(echo ${file})  && if [ ${ext##*.} = erb ]; then htmlbeautifier ${file} ${file}; else echo 'Not an ERB file'; fi",

```

※`if [ ${ext##*.} == erb ]`となっていたところを`if [ ${ext##*.} = erb ]`にしました。

このように変更することで、ERB Formatterを正しく動作させることができました！

#補足(ERB Formatterは動くようになったけど、tmpファイルが生成されてしまう場合)
`「command」+「,」(Macの場合)`で設定を開き、検索に「format]と入力します。その中にある「Editor: Format On Save」のチェックを外すことでtmpファイルが生成されなくなります。
Undo/Redoが出来るお絵描きチャット"えんぴつチャット"をWasmで作った

![スクリーンショット 2021-09-17 132128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497826/559a9ace-7352-2ac5-d2c7-135a6dbef5d4.png)

![IMG_0323.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497826/a6e162aa-7b72-faeb-1392-b9adc2c36415.png)

# 公開先
https://minordaimyo.net/pencilchat/

# えんぴつチャットの主な特徴・使い方
- 高解像度の256色キャンバス(A3 600dpi、9921x7016pixel)で軽快な描き味
- 多人数参加でもUndo/Redo可能
- 筆圧と傾き検知に対応
- 参加人数は8人まで(見学参加は現状40人まで)
- 2本指のタッチ操作でキャンバスのスクロール・拡縮
- 2本指タップでUndo、3本指タップでRedo
- キャンバスを原寸サイズで保存可能

# 動作環境
Windows上のChromeと板タブレット又は液晶ペンタブレット
iPad上のSafariとApple-pencil
Android上のChrome
等、大体のモダンブラウザで動作します。

注意：FireFoxで使用する場合
「about:config」で設定画面を開いて
「dom.w3c_pointer_events.dispatch_by_pointer_messages」を「true」に変更してください

#多人数での描画とUndoの挙動について
![ezgif-7-0b0621ae6a0e.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497826/fc4aba56-7e1d-643c-4a38-af1f0b31feb1.gif)

他の参加者に上書きされている場所に対するUndoは、
その参加者がUndoを行った後であれば、Undo可能になります。

![ezgif-7-7d6a549d45ff.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497826/3b744a08-370d-cd98-c58c-89c4e0795d1b.gif)

複数の参加者が同じ領域に同時に描画を行った場合は、Undo不可能になります。

#その他ぎじゅつてきなこと
クライアントサイドはjs+WebAssembly(主にc言語)
サーバーサイドはnode.js+WebAssembly(クライアントと共通のコード)
で作成。

キャンバスは、9921x7016pixel(A3 600dpiと同じ)で8bit/pixel(256色)
クライアント側の消費メモリは300MBくらい、
サーバー側の消費メモリは一部屋当たり250MBくらい。
サーバー側にもBMPでキャンバスを保持しているため、メモリ消費が大きくなっています。

ユーザーインターフェース周りを中心にjsを使用。
お絵描き機能部分はほぼc言語で記述(WebAssembly)。

#Wasmを選択した理由
以前にWindows用のペイントツールを作成しており、そのc言語で書かれたソースを流用できるから。

#Wasmのメリット
高速で省メモリ。
libpngやzlib等のライブラリをリンクした上でもバイナリサイズが小さい。

#Wasmのデメリット
デバッグがつらい。
printf()が唯一の武器…
dockerが立ち上がらないdaemonのレスポンスエラーで自分が行ったこと


##内容

wordpressをdockerで立ち上げていたところ以下のエラーに遭遇

```
 % docker-compose exec wordpress bash
Error response from daemon: Container d53c880a092220967afedd75e0b251e2d6926f877ed34a8ea6328049cf6e407f is restarting, wait until the container is running
```

たまに以下にもなる

```
 % docker-compose exec wordpress bash
unable to upgrade to tcp, received 409
```

記事もないしさっぱり...

##やったこと

未使用イメージ/コンテナ/キャッシュ削除を行うがうまく行かない

```
docker system prune
```

キャッシュでもダメそう

```
$ docker-compose build --no-cache
```


一回全部消すしかないか...と思い、
docker-composeのコンテナ/イメージ/ボリューム/ネットワークを一括完全消去を実施でうまく行きました。

```
docker-compose down --rmi all --volumes --remove-orphans
```



参考
https://qiita.com/suin/items/19d65e191b96a0079417
Linuxとは？

備忘録として、 [コマンド](https://qiita.com/hayashi-m/items/4204e8ac8ede15115e69)の記事を書いた。
今回はLinuxについて。

#そもそも、Linuxってなに？
LinuxはOSの一種。
OSとは「オペレーションシステム」の略。
MacOSやWindowsOSとは違い、Linuxは無料のオープンソースである。

#Linuxの特徴

* 無料で使える
* 新しいOSを開発できる
* サーバーを自由に建てられる
* カスタマイズしやすい
* 低スペックなPCでも利用できる


###無料で使える
オープンソースとは、商用・非商用を問わずソースコードを利用、修正、頒布することが許可されているソフトウェア開発の手法。
MacOSはAppleが、WindowsOSはマイクロソフトが開発・販売している。Linuxは世界中の開発者によって開発され公開されている。

###新しいOSを開発できる
Linuxのベースを活用すれば、新たなOSを作ることもできる。
スマホOSのAndroidもLinuxをベースにしたOSの1つで、一から構築するよりも、手軽な形でOSの設計が可能。

###サーバーを自由に建てられる
自由に改良できるオープンソースのOSのため、サーバーを必要な分だけ構築するコトができる。

###カスタマイズしやすい
自由にソースコードを書き換えられるため、中級者や上級者のほか初心者にもおすすめ。
無料で何度でもインストールできるため、万が一、ソースコードを書き換えた結果、正しく作動しなくなっても大丈夫。何かあれば再度インストールして改めてカスタマイズができる。OSの基礎や仕組みを学ぶ目的で、Linuxが活用されるケースも少なくない。

###低スペックなPCでも利用できる
Linuxは必要最低限の機能だけを備えた軽量OS。
古くなったPCにLinuxを入れることでサクサクうごくようになったり、使いやすいようにカスタマイズできる。



#参考
 [公式サイト](https://www.linux.org/)
 [公式リファレンス](https://www.kernel.org/doc/html/v4.10/index.html#)
remarkjs on vscode プレゼン環境構築メモ

# 環境
- VSCode + Windows 10
- remark.jsでプレゼン資料を作る
    - PowerShellのnpm上でbackslide（remark.jsのCLI）を実行
    - backslide上でリアルタイムのプレビューを実行、ブラウザ上で閲覧

# 手段
## npmのインストール
[Nodejsのウェブサイト](https://nodejs.org/en/download/)からWindows版のインストーラーをダウンロード、インストール
## backslideのインストール
- 実行しているユーザーが管理者でない場合は以下のコマンドをPowerShell上で実行
    - デフォルトでは管理者権限を持つアカウント上に実行ファイルを生成する。
        - 管理者権限がないと実行できないという欠点がある
    - 自分のユーザーのディレクトリ上に実行ファイルを置くことで解決。
   
```PowerShell
npm config set prefix "C:\Users\{ユーザー名}\AppData\Roaming\npm"
```

- 以下のコマンドをPowerShell上で実行

```PowerShell
npm install -g windows-build-tools
npm install -g backslide
```
- 環境変数Pathにbackslideの実行ファイルがある以下のフォルダを追加
    - `C:\Users\{ユーザー名}\AppData\Roaming\npm`

- 再起動し、PowerShell上で`bs`コマンドの環境変数が通っていることを確認
    - `Set-ExecutionPolicy`はコマンド実行を行うために必要
        - スコープが`Process`になっているので、ウィンドウを開く度に実行しなおす必要がある
        - スコープを`CurrentUser`にすると、実行し直す必要がないが、セキュリティ上の問題があることを意識する必要がある

```PowerShell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
bs
```
Pythonで絵文字を削除する方法(2021/9現在)

絵文字を削除する方法を調べてみると、[ブログ(形態素解析前の日本語文書の前処理 python)](https://ohke.hateblo.jp/entry/2019/02/09/141500)などで[emoji](https://github.com/carpedm20/emoji/tree/master/emoji)というライブラリを使って

```python
emojis = "🤗⭕🤓🤔🤘🦁⭐🆗🆖🈲🤐🤗🤖🤑🆙⏩"
print(''.join(['' if c in emoji.UNICODE_EMOJI else c for c in emojis]))
```

このように削除していました。
しかし、ライブラリの仕様が変更されたためか、絵文字は消えませんでした、、、

代わりに[demoji](https://pypi.org/project/demoji/)というライブラリを見つけました。

```python
print(demoji.replace(string=emojis, repl=""))
```

これで絵文字を削除することが出来ました！🤘

## 参考文献
- [形態素解析前の日本語文書の前処理 (python)](https://ohke.hateblo.jp/entry/2019/02/09/141500)
- [pythonで絵文字を駆逐する](https://qiita.com/yoshimo123/items/85331d881aed9ad41020)
- [emoji](https://github.com/carpedm20/emoji/tree/master/emoji)
- [demoji](https://pypi.org/project/demoji/)
Gitlab のリポジトリを Github に fork して同期・運用

オープンソース（本家）の **Gitlab** リポジトリ（**upstream**）を fork し，**upstream** のアップデートを自身の **Github** リポジトリ（**origin**）に手動で取得して同期し，運用する方法の備忘録です．詳しくは [こちらの記事](https://qiita.com/jsasaki/items/f77c23f4fea3f7edb812) を参照頂きたいのですが，記事内容の違いは本家が Github ではなく Gitlab であるため，fork を手動で行う点です．この方法は Gitlab だけでなく，一般に適用できます．
**upstream** の対象ブランチは **master** （永続ブランチ）とし，その純粋なコピーを **origin** の **master** で維持する方針とします．
**origin** では **master** から分岐した **main** を永続ブランチとして Github-flow で管理し，**main** から分岐した **feature** ブランチ（名前は適宜変更）で開発・修正を行い，Githubのプルリクエストで **main** にマージします．本家の **master** がアップデートされたら origin の master に同期し，main に merge します．

## 空の Github リポジトリを作成

Gitlab のリポジトリと同名の空のリポジトリを Github で作成しておきます．

## Gitlab のリポジトリをローカルに取得
Gitlab リポジトリをローカルにクローンします．

```bash
git clone git@gitlab.com:<user-group>/<repo>.git
cd <repo>
```

## origin と upstream を登録
Github（**origin**）と Gitlab（**upstream**）を登録します．Gitlab リポジトリをクローンしたため，その origin には Gitlab のリポジトリが設定されています．これを Github に変更します．

```bash
git remote set-url origin git@github.com:<user>/repo>.git
git remote add upstream git@gitlab.com:<user-group>/<repo>.git
git remote -v
```

## upstream をローカルリポジトリに取得
**upstream** をローカルリポジトリに取得し，現在のブランチが意図したブランチであることを確認してから merge し，**origin** に push します．

```bash
git fetch upstream
git checkout master
git merge upstream/master
git push origin master
```

## main ブランチを作成し，デフォルトブランチに設定
**origin** での永続ブランチとして，**main** ブランチを作成します．

```bash
git checkout -b main
git push origin main
```

この状態では **origin** （Github）のデフォルトリポジトリは master のままですので，main に変更します．
Github の当該リポジトリにおいて，**Settings** をクリックして現れる左側のメニューから **Branches** をクリックします．**Default branch** に現れる **master** の右端にある両方向矢印 `⇄` をクリックするとボックスが現れます．その **master** プルダウンから **main** を選択し，`update` をクリックします．

## Gitlab SSH接続エラーへの対応
Ubuntu 20.04LTS でGitlabへのSSH接続において，以下のようなエラーが現れるようになりました．

```bash
fatal: unable to access '': server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
```

以下を実行したところ，解決しました．

```bash
sudo apt update
sudo apt install --reinstall ca-certificates
```
自然言語処理のお題

[NLP4J Index](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29)

係り受け解析（構文解析）の問題を作ってみました。

```
【問題】
以下の日本語の文章から「主語 ... 動詞」の関係として
「私 ... 歩く」を抽出してください。コードはできるだけ簡潔にすること。

私は歩く。
私が歩く。
私は急いで歩く。
私は急いで歩いた。
私は急いで学校まで歩いた。
昨日、私は急いで学校まで歩いた。

```

次の試験に出します。（笑）

以上
Cypress x GitHub Actionsでサイトを監視したい人のアレコレ

## schedule

scheduleで時間を指定して、E2Eテストをする


```.github/workflows/e2e.yml
name: E2E Test

on:
  schedule:
   - cron: "*/5 * * * *"
jobs:
  e2e-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: 'Run tests'
        uses: cypress-io/github-action@v2

      - name: 'Upload screenshots and videos to Slack'
        uses: trymbill/cypress-slack-video-upload-action@v1.3.0
        if: failure()
        with:
          token: ${{ secrets.SLACK_TOKEN }}
          channels: 'proj-...'
          message-text: 'Cypress tests failed! They have been placed in this thread, good luck.'

```


## + workflow_dispatch

手動でトリガーをかけて、E2Eテストをする。

```.github/workflows/e2e.yml
name: E2E Test

on:
  schedule:
   - cron: "*/5 * * * *"
  workflow_dispatch:
jobs:
  e2e-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: 'Run tests'
        uses: cypress-io/github-action@v2

      - name: 'Upload screenshots and videos to Slack'
        uses: trymbill/cypress-slack-video-upload-action@v1.3.0
        if: failure()
        with:
          token: ${{ secrets.SLACK_TOKEN }}
          channels: 'proj-...'
          message-text: 'Cypress tests failed! They have been placed in this thread, good luck.'
```


## + repository_dispatch

まだ試せてないが、webhookイベントをトリガーとして、起動できる。
Slackなどから、`/cypress`などのSlash Commandで起動してみることも可能。

## 参照

[GitHub Actions/リファレンス/ワークフローをトリガーするイベント
](https://docs.github.com/ja/actions/reference/events-that-trigger-workflows#workflow_dispatch)
Flash(SWF)からベクトルデータでシェイプを取り出したい

過去のFlash資産からイラストを取り出す必要があったんですよ。

なんとかベクトルデータで取り出せないかなぁといろいろ試行錯誤していたのですが、最終的に下記の方法で取り出しました。

* [Flash Player Projector](https://www.adobe.com/support/flashplayer/debug_downloads.html) をダウンロード
* SWFを開く
* PDFにプリントアウト
* イラレでPDFを開く
* AI/SVG/EMFお好きなベクトルデータで吐き出す

元データはFlaだし、Flash CCないし、だけど少しでもデータを救出したいー、って場合に使えるのではないでしょうか。
テスト設計の手順

#テストスコープ

テストの設計には、テスト対象の機能を全て洗い出す必要があります。
このため機能一覧を作成してみます。

#テスト観点
テスト観点とは、「テストの切り口」とよく表現されますが、
簡単に言うと「どんなテストをするか？」を細かく決めたものになります。
下記の図が一例になります。

![スクリーンショット 2021-09-20 午後2.47.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2029513/cb5a9e4f-b878-13f7-43cf-443913f01395.png)
これらを使って、各テストケースに落とし込む必要があります。

#ディシジョンテーブルテスト
ディシジョンテーブルでは、条件のパターンを一覧するための表になります。
複数の条件に着目して、漏れがないよう見やすく作成する必要があります。
動作の条件を網羅的に記述し、それによって生じる結果、処理がアクションとなります。

![スクリーンショット 2021-09-20 午後3.17.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2029513/ed24de38-b60d-f665-efbc-26dafef396af.png)
VSCodeでCouldn't start client Rust Language Serverとなる時に解消する方法

VSCodeでRustのプラグインをインストールした時に、```Couldn't start client Rust Language Server```が表示される時の解決方法
# 解決方法
1. ```Command``` + ```shift``` + ```P```を押す
2. ```基本設定: 設定(UI)を開く``` を選択
3. 検索窓で```rust-client```を入力
4. ```Rust-client: Rustup Path```のパスを```$HOME/.cargo/bin/rustup```に変更する
![スクリーンショット 2021-09-20 15.15.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1968829/e16bd30f-285f-a684-ab7f-06a350860a59.png)
5. VSCodeを再起動
[Java基礎⑧] 二次元配列の基本・for文/拡張for文で出力

<h2>初めに</h2>
今回、二次元配列を学習し、その中身をfor文で取り出すということを
行いました。

<h2>二次元配列とは</h2>
２つのインデックスで要素を指定する配列のこと

```java:
//ひとまず３つの配列を用意します。
String[] teamA = {"りんご","なし","洋梨"};
String[] teamB = {"青森","岩手","宮城"};
String[] teamC = {"お皿","コップ","茶碗"};

//配列に配列を格納します。
String[][] teams = {teamA,teamB,teamC}

//以下では、「りんご」が出力されます。
System.out.print(teams[0][0])
//以下では、「青森」が出力されます。
System.out.print(teams[1][0])
//以下では、「コップ」が出力されます。
System.out.print(teams[2][1])

//インデックスの更新　　「りんご」→「みかん」へ
team[0][0] = "みかん";
//「みかん」が出力されます。
System.out.print(teams[0][0]);

//配列の長さを調べる →「３」と出力されます。
System.out.println(teams.length);

//配列の中身の配列の長さをインデックスを使い求める　→「３」と出力されます。
System.out.println(teams[0].length);

```

<h2>二次元配列のループ処理</h2>

<h3>for文で中身を全部出力する</h3>

```java:
String[][]teams ={{"りんご","なし"},{"青森","岩手"},{"お皿,"コップ"}};

for(int i = 0; i<teams.length; i++){
 for(int j = 0; j<teams[i].length; j++){
     System.out.println(teams[i][j]);
}
}
```

<h3>拡張for文</h3>

```java:
for(String[]team : teams){
 for(String item : team){
 System.out.println(item);
```
<h2>終わり</h2>
vue-property-decoratorでrefを使ったDOM操作がうまくできない

vue2 + typescriptでは$refsがうまく動かないことがあるので
vue-property-decorator の@Refを使うと良いらしいけど
時々refの値が取れないことがある。


```component.vue
<template>
    <div class="row">
        <div class="col">
            <input type="text" ref="textbox" v-model="title" />
        </div>
    </div>
</template>

<script lang="ts">
import { Component, Ref, Vue } from 'vue-property-decorator';

@Component
    export default class Hoge extends Vue {

        @Ref('textbox') readonly textbox!: HTMLInputElement;

        created() {
　　　　　　　　　　　　　　　　　　　　　　　　　　// ref操作
             this.textbox.focus();          
        }
    }
</script>
```
この場合this.textbox が undefindやんけてエラーが出る。

``` 
"TypeError: Cannot read properties of undefined (reading 'focus')"
```

対処方法はsetTimeoutとかthis.$nextTickとか使ってちょっと実行タイミングをずらして操作することらしい。

```vue.js
// ref操作
this.$nextTick(() => this.textbox.focus());
```
なんやそれ（・ω・｀

参考
https://stackoverflow.com/questions/60174338/vuejs-typescript-class-component-refs-focus-not-working
【Xcode12,M1】XLPagerTabStripの利用 備忘録

#Rosettaでターミナルを開く(cocoapodsはインストール済み)
>cocoapodsのインストールはここ(一度インストールすればOK,updateは別途)
> https://qiita.com/Baaaaaby/items/69424c271a22063ca43a

```shell:Terminal
$ cd {パス}
$ pod init
$ open Podfile         //nano も vim 可
```
#Podfile
command+sで保存

```ruby:Podfile.rb
# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'                 # "#"を削除

target 'XLtest' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for XLtest
  pod 'XLPagerTabStrip'             #この行を追加

end

```
##ターミナルに戻る
```shell:Terminal
$ pod install
$ exit
[プロセスが終了しました]
```

#Xcode
以下に従う
> https://qiita.com/KikurageChan/items/35593dc3aac8d694db8e

ーー変更点ーー
Storyboard ID にそれぞれFirst Second Third...追加
階層(左下のタスク一覧みたいなアイコンから確認可)でButtonBarが隠れるのでそこを訂正
UICollection ViewのCellは削除

#参考
> https://qiita.com/KikurageChan/items/35593dc3aac8d694db8e
> https://youtu.be/tkR2USQlkHI

#環境
Xcode Version 12.5.1 (12E507)
Mac M1,2020
macOS Big Sur バージョン11.5.2
Amplify ConsleでAngularの環境設定を切り替える

# 概要
Amplify ConsoleでホスティングされたAngularアプリの環境設定を切り替える方法になります。Amplify Consoleでは環境変数をブランチ単位で管理することができるため、そちらを利用してビルドプロセスをカスタムし、任意の環境でホスティングすることができます。

# Angularの環境設定
Angularでは開発環境用、ステージング環境用、本番環境用などの環境固有の変数をプロジェクトに定義することができます。下記のようなディレクトリ構成で、デフォルトの設定をenvironment.tsに記載することができ、環境が指定された場合に各環境ファイルの記載された内容で上書きされます。

```
└──myProject/src/environments/
   　         　　　　　　　　　└──environment.ts
   　         　　　　　　　　　└──environment.prod.ts
   　         　　　　　　　　　└──environment.stage.ts
```
angular.jsonには次のようにconfigurations配下に設定を追加します。

```json:angular.json
"configurations": {
  "prod": { ... },
  "stage": {
    "fileReplacements": [
      {
        "replace": "src/environments/environment.ts",
        "with": "src/environments/environment.stage.ts"
      }
    ]
  }
}
```
stage環境設定を使ってビルドする際は以下のように--configuration=stageとオプションを指定してbuildを実行します。

```
ng build --configuration=stage
```

# Amplify Consoleの環境変数

冒頭でお話しした通り、Amplify Console上で環境変数の設定から任意の名前で環境名を追加します。その後アクションから「変数の上書きを追加する」を押下し、任意のブランチでデプロイしたいAngularの環境名を追加します。下記画像は「backup」ブランチにstage環境の設定を追加しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203706/5ec32f7b-ce60-084d-7188-7894e6554ba6.png)

# ビルドプロセス

Amplifyのビルド設定を修正します。amplify.yml上のbuildコマンドに、ng build -c ${env}と指定すれば、先ほど指定したブランチ、環境変数でAngularアプリケーションのホスティングを実行できます。

```yaml:amplify.yml
version: 1
frontend:
  phases:
    preBuild:
      commands:
        - echo ${env}
        - npm install
        - npm install -g @angular/cli@12.1.4
    build:
      commands:
        - ng build -c ${env}
  artifacts:
    baseDirectory: dist/ElectricWeb
    files:
      - '**/*'
  cache:
    paths:
      - node_modules/**/*
```

# 参考

https://angular.jp/guide/build
https://docs.aws.amazon.com/ja_jp/amplify/latest/userguide/environment-variables.html
【初心者】インターフェースについて

#はじめに
社内研修で、インターフェースについて教えてもらった。

「インターフェースとは、メソッドの定義と変数の定義を行うだけで、処理は一切行わない。」

なんとなく意味はわかったのだが、より理解を深めるために記事を書いていこうと思う。

#インターフェースとは
どのようなものなのかネットで調べていき、次のような内容であることがわかる。

<b>「変数の定義をしておらず、抽象メソッド（処理内容を記述していないメソッド）のみを
定義したものである。」

より理解を深めていくために、ソースコードを書いていこうと思う。

#インターフェースの実装
インターフェースの宣言から実装までの流れを次のように行う。

・インターフェースの宣言
　クラス名の前に「interface」を付けてクラス宣言を行う。
　メソッドの宣言のみを行い（戻り値、引数の指定はできる）、処理は記述しない。

```

public interface test1{
   public void method();
   //処理は記述しない。
 }

```


・インターフェースの実装
　クラス作成後、「implements インターフェース名」を入力して行う。

```
class test2 implments test1{
    public void method();
      System.out.println("処理を記述");
}
```
#まとめ
インターフェースとは、
<b>処理内容を持たないメソッドと変数を持たないクラスを宣言</b>して使用するものである。
【解決方法】middlemanでCSS(スタイル)が適用されない

# 問題点
middlemanのバージョンを上げて新しいプロジェクトを作成したところ、CSS(スタイル)が適用されなくなった

## 準備
1. 最新のmiddleman(v4.4)をインストール

## 手順
1. 新しいプロジェクトを作成（`middleman init`）
1. サーバ起動（`middleman server`）
1. ブラウザで表示確認

## 結果
- CSS(スタイル)が適用されない
- コンソールにエラーが表示される（`TypeError: Cannot read property 'version' of undefined
`）

|![スクリーンショット 2021-09-20 13.49.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/f2734b35-3b6c-db83-c6a4-8f5a02296c15.png)|
|:-:|

---

# 解決方法

Gemfileで`middleman-autoprefixer`のバージョン指定を「3.0」以上にする

## 修正内容

```ruby:Gemfile
source 'https://rubygems.org'

gem 'middleman', '~> 4.2'
- gem 'middleman-autoprefixer', '~> 2.7'
+ gem 'middleman-autoprefixer', '~> 3.0'
gem 'tzinfo-data', platforms: [:mswin, :mingw, :jruby, :x64_mingw]
gem 'wdm', '~> 0.1', platforms: [:mswin, :mingw, :x64_mingw]
```

```
# バージョンを更新したgemをインストール
$ bundle install

# サーバ起動
$ middleman server
```

|![スクリーンショット 2021-09-20 13.49.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/c6e0425d-22f8-bb5b-cedd-b52ee96b64cb.png)|
|:-:|

## 参考
[css 404 error after build · Issue \#2463 · middleman/middleman](https://github.com/middleman/middleman/issues/2463)
WindowsのWSL2環境にRailsをローカルインストールする

# 概要

WSL2に構築したCentOS環境上に、Railsをインストールする。
環境を汚したくないので、グローバルのgemではなくローカルにインストールする。


# 前提

* WSL2にLinux環境を構築している
* rbenvでrubyを管理している

# 環境

* OSはCentOS 7.9
* ruby versionは2.7.4
* bundler versionは2.1.4（rubyに内包のバージョン）

# やりたいこと

* Railsをローカルにインストールしてアプリケーションのベースを作る

# 手順

### 事前準備

root権限（またはsudo）で `g++`と`MySQL` をインストールしておく。

```
# yum install gcc-c++
# yum install mysql-devel
```

### ディレクトリ作成

ディレクトリを作成し、その中で作業する。

```
$ mkdir rails_application
$ cd rails_application
```

### Gemfileの作成

下記コマンドを実行してGemfileを作成する。

```
$ bundle init
```

出来たGemfileを編集する。(gem "rails" のコメントを外す）

```
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails"
```

### Railsのインストール

.bundle/configを作成し以下のように編集する。

```
---
BUNDLE_PATH: "vendor/bundle"
```

Railsをインストールする。

```
$ bundle install
-- 省略 --
Using rails 6.1.4.1
Bundle complete! 1 Gemfile dependency, 42 gems now installed.
Bundled gems are installed into `./vendor/bundle`
```

無事、vendor/bundle配下にインストールできた。

### Railsアプリケーションの作成

`rails new` コマンドでアプリケーションを作成。
この際、下記2点を考慮し、オプションを設定

* DBにはMySQLを使いたいので、 `-d` オプションを指定
* テストにはRspecを使いたいので、 `-T` オプションを指定

```
$ bundle exec rails new . -d mysql -T
```

`Gemfile` を上書きするか？と聞かれるので了承する。

```
Bundle complete! 14 Gemfile dependencies, 65 gems now installed.
Bundled gems are installed into `./vendor/bundle`
```

無事インストールが完了した。

### 作成されたファイルの確認

```
$ ls -1
app
bin
config
config.ru
db
Gemfile
Gemfile.lock
lib
log
package.json
public
Rakefile
README.md
storage
tmp
vendor
```

まずはここまで。
【AWS CloudFormation】serverless.templateを利用してインフラをコード化してみた。

#はじめに
毎日定期的に通知を送る処理をEventBridge + Lambdaで作成したのですが、CloudFormationの勉強として、それらをserverless.templateにまとめてみました。

##参考にしたドキュメント
AWSの公式ドキュメントを参考にしました。

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-resource-function.html

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-property-function-eventsource.html

## serverless.template

```json:serverless.template
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::Serverless-2016-10-31",
  "Description": "An AWS Serverless Application.",
  "Resources": {
    "ScrapingApp": {
      "Type": "AWS::Serverless::Function",
      "Properties": {
        "FunctionName": "ScrapingApp",
        "Description": "サイトのスクレイピング結果をメールで送信します。",
        "Handler": "ScrapingApp::ScrapingApp.Program::Main",
        "Runtime": "dotnetcore3.1",
        "MemorySize": 128,
        "Timeout": 300,
        "Role": "適切なロール",
        "Policies": [
          "role-lambdaBasic"
        ],
        "Events":{ 
            "EventBridge" : {
                "Type" : "Schedule",
                "Properties" : {
                    "Schedule" : "cron(0 22,8 * * ? *)",
                    "Name": "ScrapingAppEventBridge",
                    "Description": "ScrapingApp関数のトリガーです。"
                }
            }
        }
      }
    }
  }
}
```

## ハマったポイント
EventBridgeの部分のTypeを"EventBridgeRule"としていました。
そちらのPattern内の設定でいけるかと思ったのですが、うまくイベントが発火せず...。
よくよく調べると"Schedule"というTypeを見つけて、そちらを利用するとしっかり発火してくれました。

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-property-function-schedule.html

まだまだ知らないことばかりですが、少しずつ調べて理解できるように頑張ります。
ブラックボックステストとは

#ブラックボックステスト
開発後の最重要工程、テストに関して、、、

ブラックボックステストとは、ソフトウェアの内部構造を意識しないテスト。
主に、**「機能テスト」**、**「システムテスト」**において実施されます。
効率よくテストを実施し、品質を担保するためにやるべきこと。

#ブラックボックステストの各工程
**[1]テスト計画**
テストの目的と範囲を明確に定義する。
テストのアプローチ、環境、人員の調達とスケジュールを定める。

**[2]テスト設計**
実施すべきテストの種類や目的、対象機能、使用するテスト技法、入力、出力を決める。

**[3]テストケース作成**
テスト開始前の状態/条件、期待値(結果)、判定基準を定め、作成する。 

**[4]テスト実施**
作成したテストケースを使い、実際にソフトウェアを操作しながら、
結果判定を入力していく。
期待結果と異なる場合、不具合報告を行う必要がある。

**[5]テスト報告**
テスト結果を要約し、報告する。
テストの合否基準を満たしているか、不具合件数などをもとに評価する。

以上が、大きなテストの流れになります。
これらは、アジャイル、ウォーターフォール、ソフトウェアの種類により
アプローチが異なります。

何をどのくらいテストする必要があるか、
これらを掘り下げて最適なテストを実施していくために、
ヒントを書いていきます。

続く、、、
Google Colaboratoryにおいて、BertJapaneseTokenizerでmecab ipadic-NEologdを使う

#目的
BertJapaneseTokenizerではmecabが使われており、デフォルトでipadic辞書が指定されています。

本稿はより新語や固有表現に強いNEologdを辞書に指定する方法です。
なお、Google Colaboratoryで実行すること前提としています。

まぁぶっちゃけ備忘録です。
#インストール
bertとMeCabのインストールを行います。
##bertのインストール
```
!pip install transformers
!pip install fugashi ipadic
```
fugashiとipadicはBertJapaneseTokenizerで使用します。


投稿時のversionはそれぞれ
transformers == 4.10.2
fugashi == 1.1.1
ipadic == 1.0.0

#MeCabのインストール

MeCabをインストール

```
!apt install aptitude swig
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3
```
mecab-ipadic-neologdをダウンロード

```
!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -a
```
colabではパスが違うとエラーが出てしまうのでパスを指定

```
!ln -s /etc/mecabrc /usr/local/etc/mecabrc
```
投稿時のversionは
mecab-python3 == 1.0.3

#NEologdへパスを通す
```python
import subprocess

cmd='echo `mecab-config --dicdir`"/mecab-ipadic-neologd"'
path_neologd = (subprocess.Popen(cmd, stdout=subprocess.PIPE,
                           shell=True).communicate()[0]).decode('utf-8')
```

#実行
以上でbertとmecabのインストールは完了しているので実際に機能しているか実行してみようと思います。

```python
import torch
from torch.utils.data import DataLoader
from transformers import BertJapaneseTokenizer, BertForSequenceClassification
import MeCab
```

##デフォルトのBertJapaneseTokenizer
```python
text = "機械学習"
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')
encoded_input = tokenizer(text)
encoded_input['input_ids']
print(tokenizer.decode(encoded_input["input_ids"][1]))
print(tokenizer.decode(encoded_input["input_ids"][2]))
```
```
[2, 2943, 4293, 3]
機 械
学 習
```
デフォルトのipadicでは機械学習という単語は登録されておらず、「機械」「学習」と分割されます。
##辞書にNEologdを追加したBertJapaneseTokenizer
```python
text = "機械学習"
tokenizer = BertJapaneseTokenizer.from_pretrained( 
    'cl-tohoku/bert-base-japanese-whole-word-masking', 
    mecab_kwargs={"mecab_dic": None, "mecab_option": "-d {0}".format(path_neologd)})
encoded_input['input_ids']
print(tokenizer.decode(encoded_input["input_ids"][1]))
print(tokenizer.decode(encoded_input["input_ids"][2]))
print(tokenizer.decode(encoded_input["input_ids"][3]))
```

```
[2, 2943, 28519, 29320, 3]
機 械
# # 学
# # 習
```
機械学習として単語が取り出せました。

指定されている変数の詳細は引用をみてください。
#引用
[Google Colaboratory で、NEologd 辞書 で、MeCab を 使う（Python）](https://qiita.com/Naritoshi/items/8f55d7d5cce9ce414395)
[mecab-python3やtransformersのBertJapaneseTokenizerで辞書を指定する](https://qiita.com/momomo_rimoto/items/675950e3be1c6d82d5f0)
[BertJapaneseTokenizerで辞書を指定・変更する
](https://self-development.info/bertjapanesetokenizer%E3%81%A7%E8%BE%9E%E6%9B%B8%E3%82%92%E6%8C%87%E5%AE%9A%E3%83%BB%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B/)
AWS ソリューションアーキテクトアソシエイト合格【未経験エンジニア】


##概要
はじめまして！ 

今回はAWS ソリューションアーキテクトアソシエイトというAWSの資格を取得したのでその概要と勉強方法を載せたいと思います。

前提として、私はインフラ構築に携わったことは無く、
AWSという言葉は聞いたことあるけどどんなものなのかわからない、なんかかっこいい響きがする、、
そんな状態から勉強を始めました。

##期間と勉強時間

期間はぴったり3週間で、勉強時間は51時間半でした。
SAAはAWSのサービスを広く浅く覚えないといけないので、合格だけを目指すのであれば短期間で集中的に学習して暗記するのがいいのかなと思います。

![勉強時間.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593491/7a66f27f-294a-deac-753e-31cb32f8ecaa.png)

※会社の研修で上記学習時間に加えてハンズオン形式で約30～40時間ほどAWSの勉強をしました


##試験の概要
<dl>
<dt>試験時間</dt>
<dd>130分</dd>
<dt>問題数</dt>
<dd>65問</dd>
<dt>回答方式</dt>
<dd>選択式（択一選択/複数選択)</dd>
<dt>合格ライン</dt>
<dd>720点（得点範囲：100～1000点）</dd>
</dl>
下記サイトに試験ガイドが載ってます。必ず確認しましょう。
[AWS Certified Solutions Architect – Associate](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)

##勉強方法と目標決め
他のQiitaの記事を参考に勉強方法（下記）と勉強時間80時間という目標を立てました。
-[エンジニア未経験から取り組んだAWS認定SAA合格までの振り返り]("https://qiita.com/kawaguchi_yuki/items/6add8781df6b2cfd745a")
-[AWS初心者がAWS 認定ソリューションアーキテクト – アソシエイト資格試験に合格した時の勉強法
]("https://qiita.com/fkooo/items/e5284a4ed3c3466ffd41")-[【22時間で合格】 SAA-C02 AWS認定ソリューションアーキテクト-アソシエイト合格NRTA【多分これが一番早いと思います】]("https://qiita.com/saito_ry/items/80d2bbfd895bbc94bf5b")

##試験勉強
###1.試験対策本を読む（所要時間：6時間半）

AWS ソリューションアーキテクトアソシエイトの出題範囲を理解し概要を理解するために以下の試験対策本を読みました。一度読んだだけでは理解できないところも多いので２週しました。
[AWS認定ソリューションアーキテクト - アソシエイト 単行本](https://www.amazon.co.jp/dp/4815607389)
<img width="80" alt="AWS認定ソリューションアーキテクト - アソシエイト" src="https://images-na.ssl-images-amazon.com/images/I/511cEpHSwrL._SX344_BO1,204,203,200_.jpg">


本屋で何冊かパラパラと読んだ中で一番わかりやすかった本です。
AWSの各サービスの概要が書いてあるため、ざっくり概要を理解するのに丁度良かったです。

パソコンの前で本読んで、分からない用語はすぐにネットで調べるようにしていました。

###2.Udemyの模擬試験集をやる（所要時間：37時間）

問題を解くことで知識の定着を図りました。

模擬試験集はUdemyにある↓がおすすめです。
[Udemyの模擬試験問題集(6回分)](https://www.udemy.com/share/101rfM3@G3apKiQL8vKAkdFeJA7L_YShztLld-XTvItmvDclfbzpI7a1bBleb7kgRHLbqbgpsA==/ )

実際の試験を受けた時に初見の用語が無かったので、
このUdemyの模擬試験集は試験問題の出題範囲をしっかりとカバーしているんだと思います。

難易度は実際の試験問題より少し難しいくらいでしょうか。
値段も2440円とお手頃なので、とりあえずやってみることをおすすめします。


問題を解く → 見直し → 再テスト
この流れで模擬試験1～5までやりました（6は時間無くて出来なかった)

模擬試験1 正答率49%
模擬試験2 正答率44%
模擬試験3 正答率49%
模擬試験4 正答率60%
模擬試験5 正答率58%

ざっくりとしか理解してない状態で問題集に取り組んだので、かなり苦労しました。
EBS,EFS,EC2,ECS,EIP,EKS,EMR,ELB...色んなAWSサービスに色んな機能があって頭が混乱してきます、、

###3.各サービスの特徴をエクセルにまとめて暗記！所要時間（8時間）

Udemyの問題集を解いた上で、理解できていないところや頭の整理できていないところを詰めていきます。
書籍や以下サイト等を参考にそれぞれのAWSサービスの特徴をエクセルにまとめていきます。
- [AWSの公式ドキュメント](https://docs.aws.amazon.com/ja_jp/)
- [DevelopersIO](https://dev.classmethod.jp/)
- 先人たちのブログ

「オンプレミス環境からAWSへの移行」や「ビックデータの分析基盤」などあまり馴染みがない分野はどうしても学校の定期試験のような暗記作業が必要になってきます。

###4.本番
テストセンターで受験しました。

身分証明書が2種類必要なので気を付けてください。
- 政府発行の顔写真付き身分証明書
- 自身の氏名が印字されている身分証明書

私は運転免許書と保険証を提示しました。

>You are required to present two forms of original (no photo copies), valid (unexpired) IDs; one needs to be government-issued with registered name, photo, and signature and the second with registered name and signature or recent recognizable photo.

スコアは742点でした。かなりギリギリでしたが何とか合格できて良かったです。

###領収書について
ピアソンVUEで試験を申し込んだ場合は以下のサイトで領収書の受取方法を確認できます(2021/9/20時点)
[領収証について](https://www.pearsonvue.co.jp/Test-takers/Tutorial/Receipt.aspx)

私の場合クレカで支払ったので、受験後「領収書申請フォーム」から申請しました。
特に申請受付完了メール等はなかったのですが、３，４日後に自宅に領収書が郵送されました。
【初心者】抽象クラスについて

#はじめに
会社でJavaの研修を受けた時、なんとなくわかったという感じだった。
自分の中で理解を深めるために、記事を書いておく。

#社内で教えてもらった抽象クラス

社内研修で説明では、次のような説明をされた。

　「継承し、オーバーライドすることを前提としてクラスであり、
　　そこで定義されたメソッド名を統一して子クラスで使用したい時に使用するものである。」


・・・この説明だけをされても意味が分からなかった。
そこで、調べて理解を深めていくことにした。

#調べた結果
調べていくとつぎのような内容が多くあった。

<b>「抽象クラスとは抽象メソッドをもつクラスのことである。」

「抽象メソッドって何？」となった。そこで、抽象メソッドについて調べていく。

#抽象メソッドとは
調べると、<b>「処理内容を記述しないメソッドである」</b>との記述があった。
これを見た時、抽象メソッドとは次のようなものであると勝手に解釈した。

処理が書いてあるメソッドが、何（処理）をするかが「具体的」に宣言されたものがメソッド
である一方で、<b>何（処理）をするかが「わからない、抽象的」に宣言されたメソッド</b>であるということである。

つまり抽象メソッドとは、
<b>「何（処理）をするかがわからない、抽象的に宣言された未完成のメソッド」</b>のことである。


#宣言と使用方法
抽象クラスの宣言方法と使用方法は、次のように行う。

・抽象クラスの宣言
"""

     abstract class class1{
       public void testmethod1(){
        //処理の部分が空白 
　　 
・抽象クラスの使用

    class class2 extends class1{
       public void testmethod1(){
        System.out.println("好きな処理内容");
   
"""

抽象クラスの宣言時には、クラス宣言の最初に「abstract（抽象的な）」を付けて宣言する。

抽象クラスを使用する時は、extendsで継承し、メソッドを呼び出す。
そして呼び出したメソッドに処理を追加して使用する。

#注意点
抽象メソッドとは、処理内容を書いていない抽象的なクラスであることから、
未完成のクラスである。
そのため、抽象クラスからはインスタンスを生成でないことを注意する。


#まとめ
抽象クラスとは、処理内容がかいていない抽象的に宣言されたクラスであり、
継承されて使用されるクラスのことである。
JetBrains IDE でプロジェクトウィンドウの行の高さを変更する

JetBrains IDE (IntelliJ IDEA, WebStorm, PHPStorm, PyCharm など) で、プロジェクトウィンドウの行の高さを変更する方法です。

## Internal Mode を有効にする

[Internal Model](https://plugins.jetbrains.com/docs/intellij/enabling-internal.html?from=jetbrains.org#setting-internal-mode-in-the-ide-properties-file)を有効にします

- メニューの Help > Edit Custom Properties を選択します
- すると idea.properties というファイルが開きます
- 存在しなかった場合は作成されます
- そのファイルに次の行をファイルに追加します

```
idea.is.internal=true
```

ファイルを保存して、IDE をリスタートします

## LaF Defaults を開いて設定する

- Internal Mode を有効にすると Tools メニューに Internal Actions が加えられます
- Internal Actions > UI > LaF Defaults を選択します
- Tree.rowHeight プロパティの値を変更します

以上で、プロジェクト ウィンドウの行の高さを変更することができました。
基本的な構築

__<記事の目的>__
aws cloudtechにて、下記学習した項目の躓いた箇所について記載します。

①VPC②IAM③EC2④RDS

__<使用物>__
HP製ノートPC 1台
__<工程>__
①VPC(サブネット、インターネットゲートウェイ、NATゲートウェイ作成含む)
→問題なく設定完了
②IAMユーザの作成と認証設定
→二段階認証を設定し、「Authenticator」を使用。
　問題なく設定完了
③EC2
→AMIの作成時にアベイラビリティの選択間違え。
④RDS
→セキュリティグループのインバウンドルールの編集にて編集ができない。

__<躓いたところ>__
･AMIの作成時にアベイラビリティの選択間違え。
･セキュリティグループのインバウンドルールの編集にて編集ができない。
･コマンドプロンプトからssh接続ができない。

__<問題解決>__
･AMIの作成時にアベイラビリティの選択間違え。
→AMI作成時に誤って、アベイラビリティの選択を間違えてしまった。
 作成したAMIから編集が出来ないか操作しても編集の項目が見つからない。
 調べてみると、一度作成したAMIのアベイラビリティの変更はできないとのこと。
 AMIのアベイラビリティの選択を間違えても、AMIを使用してインスタンスを
作成する際にアベイラビリティを選択できるため、AMI作成時に間違えても問題はない。

･セキュリティグループのインバウンドルールの編集にて編集ができない。
RDSのセキュリティグループの設定で作成したセキュリティグループを選択しても、
「You may not specify a referenced group id for an existing IPv4 CIDR rule」と表示され、
設定が出来ない。解決策として、既存で作成されているインバウンドルールを削除し、
新たにインバウンドルールを作成し、作成したセキュリティグループを選択すれば設定が可能です。
[解決へと導いてくれたサイト様](https://dev.classmethod.jp/articles/aws-you-may-not-specify-a-referenced-group-id-for/)

･コマンドプロンプトからssh接続ができない。
teratermでssh接続が確認出来たが、コマンドプロンプトからインスタンスへssh接続してみようとトライ。
【コマンド】ssh -i キーファイル.pem ec2-user@IPアドレス
コマンドを実行しても、エラーメッセージが表示される。
内容としてはキーファイルのパーミッションが制限されていないのが原因。
キーファイルのプロパティからログインしているユーザ以外のアカウントを全て削除し、
ログインユーザの権限を「フルコントロール」に変更。
再度、ssh接続のコマンドを実行し、インスタンスへ接続することができた。
[解決へと導いてくれたサイト様](https://qiita.com/eltociear/items/02e8b1f5590b49eb9d87)

__<最後に>__
この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
結局マジックナンバーを使うべきかどうか

https://qiita.com/masakura/items/aee7a01ccaacb2b92c2a

https://qiita.com/maemae/items/9378b003868bf3f3fa83

どっちなんだってばよ！

# 結論

**DRY原則**に従っていれば、マジックナンバーは発生しない

## DRY原則とは

> DRY says that every piece of system knowledge should have one authoritative, unambiguous representation.
> 引用元：https://www.artima.com/articles/orthogonality-and-the-dry-principle

意訳）DRYが言っているのは「システムにおけるすべての知識に対して、単一で信頼できる明確な表現が存在すべきである」ということだ。

**知識と表現の違い**について少し説明しよう。

例えば、「犬」という知識とそれに対する"犬"という表現は別物として考えなければならない。

この記事を読む人の多くは、実際の「犬」を見たことがあり、その知識を持っているだろう。

しかしながら、同じ「犬」でも日本語での表現は"犬"・"犬っころ"・"わんこ"とか色々あるはずだ。

あなたが日本国民としてどの表現を用いても、法により罰せられることは無い。

しかしながら、システム開発の現場で表現をコロコロ変えたり、チームメンバーに伝わらない表現をするのであれば、それは迷惑極まりない。

そして、**日本語のみでなく、プログラミング言語で表現されるソースコードの中でも同様**であることは、皆さんよくわかっているところであろう。

よって、DRYは

> 単一で信頼できる明確な表現

を要請するのである。

## マジックナンバーとDRY原則の関係

DRY原則を説明したところで、マジックナンバーとの関係性について考察してみよう。

例えば、三角形の面積を計算する関数があるとする。

```js
function 三角形の面積(底辺, 高さ) {
  return 底辺 * 高さ / 2
}
```

この場合に気になるのは、「2」がマジックナンバーかどうかだろう。

まず、この関数で表現されている知識は、

- 三角形の面積は「底辺かける高さ割る２」である

という知識だ。

この知識がDRY原則を守って表現されているならば、２の意味するところはシステムに携わる誰にとっても明白なもので、それはつまり「定義通り」ということになる。

マジックナンバーの由来は、

> そのプログラムを書いた時点では製作者は数値の意図を把握しているが、他のプログラマーまたは製作者本人がマジックナンバーの意図を忘れたときに閲覧すると「この数字の意味はわからないが、とにかくプログラムは正しく動く。まるで魔法の数字だ」という皮肉を含む。
> 引用元：[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0))

ということなので、「この数字の意味」（つまり、数字による表現が指す知識）が分かるならば、それはマジックナンバーではないことになる。

つまり、数字がどこにハードコードされていようが、その数字に対応する知識を理解しているならば、マジックナンバーにはならないということになる。

なので、ソースコードに書かれている数字が、ある知識に対する「単一で信頼できる明確な表現」であるならば、マジックナンバーにはなりえないのだ。

以上の論理展開から、

- **DRY原則**に従っていれば、マジックナンバーは発生しない

という結論が導き出されたものである。

# DRY原則を守ろう
JavaScriptの基礎まとめ


jsの基礎知識をまとめた学習記事です。

##JavaScript

JavaScriptとは、ECMAscriptの使用に基づいて実装される言語。

```
ブラウザ
 |-JavaScript
    |-ECMAscript
    |-WebAPI
```


##オブジェクト

キーと値をペアで管理する入れ物。

```js
{ num1: 1, num2: 10 }
```

##メソッド

オブジェクトの中に格納された関数。

```js
{ funA: function a(){
  console.log("ok");
} }
```

##グローバルオブジェクト

ｊｓエンジンによって生成されるコード内のどこからでもアクセスできる（あらかじめ設定されている）オブジェクト。ｊｓの実行前には、グローバルオブジェクト（window）とthisが用意される。


##コンテキスト

文脈。コードの現在の実行状態。

```
・グローバルコンテキスト　→　関数の外側。
・関数コンテキスト　→　関数の内側。
```



##コールスタック
jsがどのように処理を進めたのか追跡している。

`検証ツール→Sources→CallStack`ここで確認できる。

##スコープ

実行中のコードから値と式を参照できる範囲。

`検証ツール→Sources→Scope`ここで確認できる。

```
・自身のスコープよりも外側のスコープは参照可能。
・より内側のスコープの値が優先的に参照される。
```

```js
let a = 0;
function b(){
  //関数コンテキスト
  console.log(this, arguments, a);
};

console.log(a);
console.log(b);
```

##ホイスティング

コンテキスト内で宣言した**変数や関数の定義を**コード実行前にメモリーに配置すること。（コンテキストは、コードの現在の実行状態。）

ホイスティングが働いているので関数宣言の記述よりも上にその関数を呼び出す記述をしたとしてもちゃんと呼び出すことができる。（関数式は不可。）

※undefind→jsが用意している未定義という値。


##クロージャー

関数が外部スコープ（レキシカルスコープ）で定義されている変数を使っている状態。

```js
function a() {
  num = 0;
  function b() {
    console.log(num);
  }
}
```

##即時関数

関数定義と同時に一度だけ実行される関数。

```js

(function a(){
  console.log("ok");
})()
```

##undefindとnull

undefindは値が未定義。

nullは値が空。


##暗黙的な型変換

jsは勝手に型の変換を行ってくれる。

```js
const a = 1;
const b = "1";

c = a + b;
//"11"
```

上記の場合、aがstring型に変換されている。


##==と===

==と===の違いは、**型を比較するかしないか**

```js
const a = 1;
const b = "1";

a == b
//true
//==は型の比較をしない。

a === b
//false
//===は型の比較をする。
```

##if(!a) { }

`if(!a)`の形でaがfalsyな値のときに{}内が実行される。


##JavaScriptのデータ型

jsには８種類のデータ型がある。

```
//プリミティブ型（不変）
string
number
boolean
undefind
null
symbol
bigint

//オブジェクト型（可変）
object
```

```js
let a = "Hello";
let b = a;
console.log(b);
//"Hello"

b = "Bye";

console.log(a);
//"Hello"
console.log(b);
//"Bye"
```
変数aは値を保持する。

<br>

```js
const a = {prop: 1}
a.prop = 2
//constでオブジェクトそのものは再代入できないが、中の値には再代入できる。

const b = {prop: 1}
const c = {prop: 1}
console.log(b === c)
//false
//bとcはオブジェクトへの参照が格納されているのでfalseになる。

console.log(b.prop === c.prop)
//true
//中の値は同じなのでtrue
```

##オブジェクトの参照

その他の型と違いオブジェクトは可変です。どういうことかというとオブジェクトの中身が変わった場合、すべてのオブジェクトの参照を保持している変数は影響を受けるということです。

![スクリーンショット 2021-08-23 14.28.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303613/5a0f4dc1-a1e0-4d05-eb76-cb260cd1cf71.png)

オブジェクト以外の型なら不変なのでこのような影響は受けません。

![スクリーンショット 2021-08-23 14.30.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303613/44990fd3-5b30-5e7d-321c-1cdc011b54aa.png)

オブジェクトは中身が変更されたら、そのオブジェクトへの参照を保持しているすべての変数に影響を与えることをおさえておきましょう。
ちなみにオブジェクト自体への参照がかわるだけなら他の変数に影響を及ぼしません。

![スクリーンショット 2021-08-23 14.33.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303613/1dda5700-32ab-cbf2-755c-ab3ff9c27f07.png)
Node.js+expressの空プロジェクトをマッハで作成チート (Mac)


# はじめに
今更企画！コピペ４回でちょっとイケてる hello world を10秒。たった10秒で作成。9割自分向けのチートですがひひーーん。今すげーアイディア思い浮かんだ。新しい Node の空環境すぐに欲しい。public ディレクトリに index.html を設置してすぐ見れるようにしたい。そんな私の願いを私が叶えて見せます！Node.js や npm コマンドはインストール済みの前提で行きます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594280/fc6b8414-dab7-d5a4-de29-c1f2a4be97a2.png)

# express
```bash:bash
mkdir -p ~/IdeaProjects/sandbox-node-js
mkdir -p ~/IdeaProjects/sandbox-node-js/public
cd ~/IdeaProjects/sandbox-node-js
npm init --yes
npm install express
```

# app.js
```bash:[bash]~/IdeaProjects/sandbox-node-js/app.js
cat << EOS > ~/IdeaProjects/sandbox-node-js/app.js
const express = require('express');
const app = express();
app.use(express.static('public'));
app.listen(18080);
EOS
```

# index.html
```bash:[bash]~/IdeaProjects/sandbox-node-js/public/index.html
cat << EOS > ~/IdeaProjects/sandbox-node-js/public/index.html
<!DOCTYPE html>
<html>
    <body>
        <div id='container' ></div>
        <h2 id='hello'>Hello World!</h2>
        <script src='https://rawgithub.com/mrdoob/three.js/master/build/three.min.js' ></script>
        <script src="https://rawgithub.com/mrdoob/three.js/master/examples/js/controls/TrackballControls.js"></script>
        <script src="https://rawgithub.com/mrdoob/three.js/master/examples/js/renderers/CSS3DRenderer.js"></script>
        <script>
            const SCREEN_WIDTH=window.innerWidth
            const SCREEN_HEIGHT=window.innerHeight
            const renderer = new THREE.CSS3DRenderer()
            renderer.setSize(SCREEN_WIDTH,SCREEN_HEIGHT)
            document.getElementById("container").appendChild(renderer.domElement)
            const camera=new THREE.PerspectiveCamera(45,SCREEN_WIDTH/SCREEN_HEIGHT,1,10000)
            const hello = new THREE.CSS3DObject(document.getElementById('hello'))
            const scene=new THREE.Scene()
            scene.add(camera)
            scene.add(hello)
            camera.position.z=200
            controls=new THREE.TrackballControls(camera,renderer.domElement)
            function render(){
                requestAnimationFrame(render)
                renderer.render(scene,camera)
                controls.update()
            }
            render()
        </script>
    </body>
</html>
EOS
```

# 起動
```bash:bash
node app.js
```

# 表示
[http://localhost:18080/](http://localhost:18080/)
(これはコピペに含めない)

# 最後に
sandbox-node-js のフォルダは最後にお好みにリネームすると良いでしょう。