OmniAICreator/Qiita-1.07M huggingface dataset:
Colab環境でfugashiを使ってヨミガナを表示する5行

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) 　Colab環境で日本語のヨミガナを表示したい

##やること

[Colab環境でMeCabを使ってヨミガナを表示する5行](https://qiita.com/Ninagawa_Izumi/items/21715a63b82fa432fe52)の姉妹記事です。
Colab環境でfugashiのみを導入し、ヨミガナを取得してみます。
ついでに分かち書きや品詞もfugashiのみで取得してみます。Mecab-Pythonより便利かも。

##環境

- [Colaboratory環境](https://colab.research.google.com/notebooks/intro.ipynb)
- ブラウザはChrome推奨

colabを少し使ったことがある前提で進めていきます。
でもpythonを知らなくても実行できる説明にします。

## ５行のスクリプト
```Shell:Colab
!pip install fugashi[unidic-lite]
from fugashi import Tagger
fugger = Tagger()
text = "赤巻紙青巻紙黄巻紙"
print("".join(w.feature.kana for w in fugger(text)))
```
出力結果
>アカマキガミアオマキガミキマキガミ

たった５行で導入から形態素解析を経てのヨミガナ出力までが完了しました。手軽です。
fugashiには辞書が必要なので、[unidic-lite]を指定しておかないと動きません。
print文の中の内包表記がよくわからないという方は、[姉妹記事](https://qiita.com/Ninagawa_Izumi/items/21715a63b82fa432fe52)が参考になるかもしれません。


### 発音も取得できる
.feature.kanaの部分を.feature.pronとすると、発音の読みも取得できるそうです。

```python:python
text = "昇竜拳"
print("".join(w.feature.kana for w in fugger(text)))
print("".join(w.feature.pron for w in fugger(text)))
# 結果
# ショウリュウケン
# ショーリューケン
```
"ウ"が"ー"になったりするのがポイントです。音声合成の時などに便利かもしれません。


### 分かち書きの出力
ついでに分かち書きを出力してみます。

```python:python
text = "納豆巻しか勝たん"
print(" ".join(w.surface for w in fugger(text)))
# 結果
# 納豆 巻 しか 勝た ん
```

### 品詞の取得

品詞も取得してみます。

```python:python
text = "納豆巻しか勝たん"
print(" ".join(w.surface for w in fugger(text)))
print(" ".join(w.feature.pos1 for w in fugger(text)))
# 結果
# 納豆 巻 しか 勝た ん
# 名詞 名詞 助詞 動詞 助動
```
.feature.pos1のところが品詞の取得で、.pos2〜.pos4は品詞についての補足情報となるようです。
たとえば普通名詞か固有名詞の判断などは.pos2で可能です。
機械学習で名詞だけを抽出したい場合などに使えるかもしれません。



##謝辞
前記事のコメント蘭で@polm23 様、@KoichiYasuoka 様にご指摘いただいた部分を参考に、初心者向けとして記事化しました。
(作者ご本人や大学の先生から添削いただいていたようで大変恐縮です。)

リンク：
- [fugashi](https://github.com/polm/fugashi)
LeetCode日本語修行11日目- [377-コンビネーションサムIV]

### Combination Sum IV
参考:https://leetcode.com/problems/combination-sum-iv/
###問題の内容:
相異なる整数配列nums，指定整数targetが与えられた場合、targetに加算される可能な組み合わせの数を返します。
###例:
例1:
Input: nums = [1,2,3], target = 4
Output: 7
Explanation:
7の組み合わせ:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)

例2:
Input: nums = [9], target = 3
Output: 0
###ヒント:
1 <= nums.length <= 200
1 <= nums[i] <= 1000
All the elements of nums are unique.
1 <= target <= 1000

---

このような問題を見た瞬間、最初に出た単語はDP...
先ず問題を分割します。
target＝０の場合
何も選択しないのは正し、これしかない、 
**dp[0]=1**
1 < x <=targetの場合
dp[x] != 0,dp[x]の中の組合の最後のnum必ずnumsの中に入ります。
そして、今**targetTemp = target - num**
これを貰った結果はdp[target-num]
dp[target-num]の中に、全ての結果をnumを入れると、全ての加算結果はtargetです。
num＜targetの時
全てのdp[target-num]の結果を加算してのはdp[target]です

```Kotlin
class Solution {
    fun combinationSum4(nums: IntArray, target: Int): Int {

       var dpArray = IntArray(target+1)
        dpArray[0] = 1
        for(i in 1 .. target){
            for(num in nums){
                if(num <= i){
                    dpArray[i] += dpArray[i - num]
                }
            }
        }
        return dpArray[target]
    }
}

```
AtCoder Beginner Contest 199　備忘録

ABC199の備忘録
https://atcoder.jp/contests/abc199

A：AC
B：不正解　解答みて正解
C：不正解　解答みて正解
D：未着手
E：未着手
F：未着手

A - Square Inequality
A^2＋B^2＜C^2を判定するだけ。
そのままコード書けばOK。

```php
#include <bits/stdc++.h>
#include <math.h>
using namespace std;

int main() {
  int A,B,C;
  cin>>A>>B>>C;
  if((A*A+B*B)<(C*C)){
    cout<<"Yes"<<endl;
  }
  else{
    cout<<"No"<<endl;;
  }

  }

```

B - Intersection
数列 An, Bnについて、いずれのAi,BiにおいてもAi<x<Biを満たすxの数を数える。

すべてのnまでの組み合わせで新たに配列Cを作って、出そうとしたが、回答をみて、
「AのmaxとBのminの間の数を算出すればオッケー」
と気づく。よく読めばめっちゃ単純シリーズの問題。
シンプルにAの最小値とBの最大値を出して、引き算するだけ。（同数含むので1足す）
0の場合はマイナスになっちゃうケースがあるので、そこだけ場合分けして出力。
わかっちゃえば早い。

```php
#include <bits/stdc++.h>
#include <math.h>
using namespace std;

int main() {
  int N;
  int A[1100];
  int B[1100];
  int Amax=0;
  int Bmin=10000;

  int k=0;

  cin>>N;
  for(int i=0;i<N;i++){
    cin>>A[i];
  }
  for(int i=0;i<N;i++){
    cin>>B[i];
  }

  for(int i=0;i<N;i++){
    if(Amax<=A[i]){
      Amax=A[i];
    }
    if(Bmin>=B[i]){
      Bmin=B[i];
    }
}

if((Bmin-Amax+1)<=0){
  cout<<"0"<<endl;
}
else{
  cout<<(Bmin-Amax+1)<<endl;
}

}

```
C - IPFL
文字列Sの文字を入れ替えたりする問題。
文字数は2Nで宣言され、最大で2*3E5なので、結構多い。
入替の回数はQで宣言され、最大で3E5と、こっちも結構多い。
T=1とT=2の2種クエリがあり、T=1の時は指定も1文字だけを入れ替え、
T=2の時は前半と後半の文字をまるっと入れ替える。

substrとswapを新たに使った。

S.substr(int A, int B) で
「文字列SのA文字目からB文字分を抜き取る」
となる。
swap(S.at(A), S.at(B))で
「文字列SのA文字目とB文字目を入れ替える」
となる。

swapともに、文字列数が多い場合は計算量がバカにならない。
文字数が多い場合でT=2の前後文字入替を1文字ずつやってると、計算が文字数分だけ実行されることになり、
Qが大きい場合TLE(時間ｵｰﾊﾞｰ)になる。
なので、substrで前半と後半に文字列を分割し、swapを1回にする。
T=1の時は
A<B<N、A<N<B、N<A<B　の3ｹｰｽで前半文字列から入れ替えるのか、後半文字列から入れ替えるのか変わるので、
場合分けしてその都度何文字目と入れ替えるかを記述。
ちなみに、最初はT=1は文字列Sで入替を行い、T=2の時に文字列SをS=front+backで結合させてみたが、
これだとTLEになってた。
文字列の足し算って各文字ごとに計算がかかってる？
想定よりも計算量が多くなるようなので、分割後は結合させずにT=1もT=2もそのまま入替するようにしてAC。



```php
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
 
int main() {
  int N, Q;
  string S;
  cin>>N>>S>>Q;
  int T[400000];
  int A[400000];
  int B[400000];
  int AA,BB;
  string front;
  string back;
  front=S.substr(0,N);//文字列分割　前半分
  back=S.substr(N,N);//文字列分割　後ろ半分
  for(int i=0;i<Q;i++){
    cin>>T[i]>>A[i]>>B[i];
    if(T[i]==1){//T=1
    AA=A[i]-1;//文字数アクセスのため1ずらす
    BB=B[i]-1;
      if(N<A[i]){
        swap(back.at(AA-N),back.at(BB-N));
      }
      else if(N>=B[i]){
        swap(front.at(AA),front.at(BB));
      }
      else{
        swap(front.at(AA),back.at(BB-N));//文字入替
      }

    }
    else{//T=2
    swap(front,back);//前後スワップ
    }
  }
  cout<<front<<back<<endl;
}

```
ハスケル子「タグごとに色がついてたらいいのにな…」

## とあるWeb制作会社

ハスケル子「社長、こないだ頼まれた仕事おわりました」
ハスケル子「次のお仕事、なにかありますか？」

社長「おお、ありがとう」
社長「ほな今日は、ワシが書いたコードのレビューをお願いするわ」

ハスケル子「わかりました」

## 次のお仕事、開始

社長「このプルリクをレビューして欲しいんや」

ハスケル子「わ、差分めっちゃ多いですね」
ハスケル子「5,000行もあるじゃないですか」

社長「まあな」
社長「でも、内容は簡単やで」
社長「とあるHTMLファイルがあってな」
社長「その中の全ての`br`タグを`hr`タグに修正しただけやから」
社長「それがちゃんとできてるか、5,000箇所ほどチェックしてもらうだけや」

<img width="500" alt="スクショ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295452/1a4abcf3-61a3-0db4-ee91-560d90757a19.png">

ワイ「↑ソースコードはこんな感じや」

ハスケル子「（え、めんどくさい・・・）」
ハスケル子「（よりにもよって`br`タグと`hr`タグって・・・）」
ハスケル子「（見分けづらい・・・）」

## ともかくレビュー開始

ハスケル子「うーん、めんどくさいなぁ」
ハスケル子「ってか、こんな似たようなパーツの繰り返しなら」
ハスケル子「VueとかReactを使ってコンポーネント化しておけば効率的なのに・・・」

社長「いや、VueとかReactってなんか難しそうやん」

ハスケル子「`npm`でインストールして簡単に始められますよ」

社長「`npm`って何？」

ハスケル子「・・・な、なんでもないです」
ハスケル子「（しかたない、チェックしていくか・・・）」

## ひたすらチェックする

ハスケル子「`hr`、ヨシ！」
ハスケル子「`hr`、ヨシ！」
ハスケル子「`hr`、ヨシ！」

<img width="500" alt="スクショ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295452/a7f06210-ae95-a2ff-b6bc-b4a5cb4524ad.jpeg">


社長「**そこ、`br`タグ残ってるで！**」

ハスケル子「す、すみません！」
ハスケル子「（**いや自分のミスやん・・・**）」

## 何かに頼りたい

ハスケル子「なんか疲れた・・・」
ハスケル子「タグごとにそれぞれ違う色がついてたらいいのにな・・・」
ハスケル子「VSCodeの拡張機能で、何か便利なのないかな・・・」
ハスケル子「検索してみよ・・・」
ハスケル子「`tag`、`color`・・・と」

## あった

ハスケル子「**タグに色つけ太郎・・・？**」
ハスケル子「バカみたいな名前の拡張機能だけど、どんなのだろ」

> この拡張機能を使うと、HTMLのタグがカラフルになります。私の髪の毛のように。
VueやReactのコンポーネントでもOKです。

<img width="1000" alt="スクショ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295452/19d4c8b1-d6ae-2cd8-ba6f-68657aa687f1.png">

ハスケル子「へえ、HTMLのタグだけじゃなくて」
ハスケル子「VueやReactのコンポーネント名にも、それぞれ色をつけてくれるんだ」
ハスケル子「それよりこの**ゲーミングキーボード**みたいな髪・・・」
ハスケル子「これ、やめ太郎さんじゃん・・・」
ハスケル子「何やってんだろこの人・・・」

## インストールしてみる

ハスケル子「取り敢えず入れてみたけど」
ハスケル子「どうかな」

<img width="500" alt="スクショ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295452/afae9636-7ee4-e7a5-1073-55fab18178ad.png">

ハスケル子「わ、カラフル」
ハスケル子「カラフル過ぎて頭がおかしくなりそう」
ハスケル子「でも今日の仕事にはちょうどいいから我慢しよう」

## 30分後

ハスケル子「タグに色つけ太郎のおかげで、タグを見分けやすくなったから」
ハスケル子「サクッと終わったな」
ハスケル子「っていうかやめ太郎さん、VSCodeの拡張機能とか作れるんだ」
ハスケル子「こないだまで`yarn dev`も知らなかったのに」
ハスケル子「意外とOSS活動してるんだな」

ワイ「（ふふふ、せやで・・・！）」

ハスケル子「じゃあ、タグに色つけ太郎を**アンインストール**しよ」
ハスケル子「なんか不快だから」

ワイ「いやもう消すんかい！」

**〜おしまい〜**

## よかったら使ってみてくださいやで

[**Color the tag name（タグに色つけ太郎）**](https://marketplace.visualstudio.com/items?itemName=jzmstrjp.color-the-tag-name)
[Swift5] TableViewの実装メモ

##TableViewメモ
・UITableViewDelegate, UITableViewDataSourceを継承する

実装するメソッド
・numberOfSections：セクション数
・numberOfRowsInSection：セクションあたり表示するセル行数
・heightForRowAt：高さ
・cellForRowAt：セル内処理

セル内の処理
・TableView.dequeueReusableCellでCell表示
・indexPath⇨return cellの繰返し処理

```Swift
import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    @IBOutlet weak var TableView: UITableView!
    @IBOutlet weak var textField: UITextField!
    
    var textArray = [String]()
    var imageArray = ["1","2","3","4","5"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        TableView.delegate = self
        TableView.dataSource = self
    }

    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return textArray.count
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 586
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = TableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        
        let imageView = cell.contentView.viewWithTag(1) as! UIImageView
        let label = cell.contentView.viewWithTag(2) as! UILabel
        
        label.text = textArray[indexPath.row]
        imageView.image = UIImage(named: imageArray[indexPath.row])

        return cell
    }
    
}

```
実際にテーブルとデータを用意してHAVING句を試す

HAVING句とは、集計した「結果」に対して条件を付けます。
実際に試してみましょう。

確認用にテーブルとデータを用意します。

```sql
CREATE TABLE test_table (
  id bigint(20) UNSIGNED NOT NULL,
  kind int(11) NOT NULL
);
ALTER TABLE `test_table` ADD UNIQUE KEY `id` (`id`);
ALTER TABLE `test_table` MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
```

```sql
INSERT INTO `test_table` (`kind`) VALUES ('1');
INSERT INTO `test_table` (`kind`) VALUES ('1');
INSERT INTO `test_table` (`kind`) VALUES ('2');
INSERT INTO `test_table` (`kind`) VALUES ('3');
INSERT INTO `test_table` (`kind`) VALUES ('4');
INSERT INTO `test_table` (`kind`) VALUES ('4');
INSERT INTO `test_table` (`kind`) VALUES ('4');
INSERT INTO `test_table` (`kind`) VALUES ('3');
```

データを見てみます。

```sql
SELECT * FROM test_table;
```

```console
+----+------+
| id | kind |
+----+------+
|  1 |    1 |
|  2 |    1 |
|  3 |    2 |
|  4 |    3 |
|  5 |    4 |
|  6 |    4 |
|  7 |    4 |
|  8 |    3 |
+----+------+
```

INSERTした情報がそのまま出てきます。

では、kindで件数を集計します。

```sql
SELECT kind, count(kind) as cnt FROM test_table GROUP BY kind;
```

```console
+------+-----+
| kind | cnt |
+------+-----+
|    1 |   2 |
|    2 |   1 |
|    3 |   2 |
|    4 |   3 |
+------+-----+
```

kindと集計された件数cntが出てきます。

では、kindが3の列を抽出します。
普通にWHERE句で指定します。

```sql
SELECT kind, count(kind) as cnt FROM test_table WHERE kind = 3 GROUP BY kind;
```

```console
+------+-----+
| kind | cnt |
+------+-----+
|    3 |   2 |
+------+-----+
```

kindが3の列が普通にヒットします。

では、cntが3の列を抽出します。
先ほどと同様、WHERE句で指定してみます。

```sql
SELECT kind, count(kind) as cnt FROM test_table WHERE cnt = 2 GROUP BY kind;
```

```console
Unknown column 'cnt' in 'where clause'
```

エラーが出ちまいました。
cntなんてカラムは無いよ、ということです。
これは、**WHERE句は集計する前のテーブルのカラムには適用ができない**からです。

そこで使えるのが**HAVING句**です。
集計した「結果」に対して条件を付けます。

```sql
SELECT kind, count(kind) as cnt FROM test_table GROUP BY kind HAVING cnt = 2;
```

```console
+------+-----+
| kind | cnt |
+------+-----+
|    1 |   2 |
|    3 |   2 |
+------+-----+
```

ちゃんと抽出できました！
やったね！！
[Swift5] WKWebviewの表示

## WKWebviewを使う
・インスタンスをつくる⇨大きさを決めてviewに追加⇨URLをロード
・didCommitメソッドでローディングアニメーション開始
・didFinishメソッドでローディングアニメーション停止

```Swift
import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {

    @IBOutlet weak var indicator: UIActivityIndicatorView!
    @IBOutlet weak var toolBar: UIToolbar!
    
    var webView = WKWebView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        indicator.isHidden = true
        
        //大きさをきめていく
        webView.frame = CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height - toolBar.frame.size.height)
        
        view.addSubview(webView)
        webView.navigationDelegate = self
        
        // URL load
        let url = URL(string: "https://google.co.jp/")
        let request = URLRequest(url: url!)
        webView.load(request)
        
        indicator.layer.zPosition = 2
    }
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        // load完了時に呼ばれるメソッド
        indicator.isHidden = true
        indicator.stopAnimating()
        
    }
    
    func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
        // 読み込み開始時に呼ばれるメソッド
        indicator.isHidden = false
        indicator.startAnimating()
        
    }
```
Docker+Railsチュートリアルやってみる

## はじめに
Docker Composeを利用してRails/PostgreSQL アプリを設定しRailsのwelcomeページを表示させる。

## 前提
Docker Composeをインストール済みの状態で進めます。

```
[mac] $ docker --version
Docker version 19.03.12, build 48a66213fe

[mac] $ docker-compose --version
docker-compose version 1.26.2, build eefe0d31
```
#用意するファイル
作成するのは4つのファイル
`・Dockerfile
 ・Gemfile
 ・Gemfile.lock
 ・docker-compose.yml
`
#### Dockerfile

```
// なんのイメージをベースにするか指定する
FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
// ワークの作業場所を名前指定なんでも良い
WORKDIR /myapp
// ソースコードをコピーしてくれる　左側がローカル　右側がdockerのディレクトリ位置
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
```


#### Gemfile

```
source 'https://rubygems.org'
# rails　バージョン指定しておくと雛形をインストールできる
gem 'rails', '5.0.0.1'
```

#### ・Gemfile.lockは生成するのみ


#### docker-compose.yml

```
version: '3'
# サービスがコンテナの集まり
services:
# 各コンテナ名前は自由に変えれる
  db:
    # 使いたいDockerのイメージを指定する
    image: postgres
    # 環境変数設定できる
    environment:
      - POSTGRES_PASSWORD=password
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    # 依存先指定、連携をしている
    depends_on:
      - db
```

####docker runコマンドでrailsアプリを生成

```
$ docker-compose run web rails new . --force --database=postgresql
```

新しくGemfileが生成されたのでDockerのイメージをbuildコマンド再構築（主にGemfile や Dockerfile を修正したとき）

```
$ docker-compose build
```

#### データベースの設定
`config/database.yml`

```
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test
```

```
$ docker-compose up
```
[http://localhost:3000](http://localhost:3000)
URLにアクセスすると
データベースがないとエラーになる、

別タブで下記のコマンドを実行

```
$ docker-compose run web rake db:create

Created database 'myapp_development'
Created database 'myapp_test'
```

***RailsのWelcomeページが表示される***

起動中のコンテナを一覧で確認
railsとpostgresがちゃんと表示されてる！

```
$ docker ps 

CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS          PORTS                    NAMES
ab03bcea1ff5   rails_docker_web   "bundle exec rails s…"   55 minutes ago   Up 55 minutes   0.0.0.0:3000->3000/tcp   rails_docker_web_1
88857ed2a3d5   postgres           "docker-entrypoint.s…"   55 minutes ago   Up 55 minutes   5432/tcp                 rails_docker_db_1
```

####最後に
アプリケーションの停止

```
$ docker-compose down
```

簡単にアプリを立ち上げ、また削除ができました。
Docker使いこなせたらすごく便利！色々試して練習しようと思います。
【AWS】EC2サーバーでビルドしてたらout of memoryが出たのでSwap領域を確保した話

## 事象
個人アプリのEC2がt2.microなので、メモリ不足を起こして、
インスタンス内でビルドを行うとout of memoryでエラーになるようになった。

```
<--- JS stacktrace --->
Cannot get stack trace in GC.
FATAL ERROR: NewSpace::Rebalance Allocation failed - process out of memory
 1: node::Abort() [node]
 2: 0x8cd49c [node]
 3: v8::Utils::ReportOOMFailure(char const*, bool) [node]
 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [node]
 5: 0xa6813b [node]
 6: v8::internal::MarkCompactCollector::Evacuate() [node]
 7: v8::internal::MarkCompactCollector::CollectGarbage() [node]
 8: v8::internal::Heap::MarkCompact() [node]
 9: v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node]
10: v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
11: v8::internal::Factory::NewFixedArray(int, v8::internal::PretenureFlag) [node]
12: v8::internal::OrderedHashTable<v8::internal::OrderedHashSet, 1>::Allocate(v8::internal::Isolate*, int, v8::internal::PretenureFlag) [node]
13: v8::internal::OrderedHashTable<v8::internal::OrderedHashSet, 1>::Rehash(v8::internal::Handle<v8::internal::OrderedHashSet>, int) [node]
14: v8::internal::OrderedHashTable<v8::internal::OrderedHashSet, 1>::EnsureGrowable(v8::internal::Handle<v8::internal::OrderedHashSet>) [node]
15: v8::internal::Runtime_SetGrow(int, v8::internal::Object**, v8::internal::Isolate*) [node]
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @ production: `cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the @ production script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/ec2-user/.npm/_logs/2021-04-24T12_52_05_489Z-debug.log
```

物理的にメモリを増やすインスタンスのスケールアウトも方法の一つであるが、
今回はSwap領域を確保する事で対応する。

## Swap領域とは
メモリの使用量が物理メモリの使用量を超えると使われる領域の事。
https://wa3.i-3-i.info/word1721.html

## 手順

```
#ホームディレクトリに移動
[ec2-user@ip-***-**-**-*** ~]$ cd

#処理に時間がかかる可能性があるコマンドです
[ec2-user@ip-***-**-**-*** ~]$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512
# しばらく待って、以下のように表示されれば成功
512+0 レコード入力
512+0 レコード出力
536870912 バイト (537 MB) コピーされました、 7.35077 秒、 73.0 MB/秒

[ec2-user@ip-***-**-**-*** ~]$ sudo chmod 600 /swapfile1

[ec2-user@ip-***-**-**-*** ~]$ sudo mkswap /swapfile1
# 以下のように表示されれば成功
スワップ空間バージョン1を設定します、サイズ = 524284 KiB
ラベルはありません, UUID=74a961ba-7a33-4c18-b1cd-9779bcda8ab1

[ec2-user@ip-***-**-**-*** ~]$ sudo swapon /swapfile1

[ec2-user@ip-***-**-**-*** ~]$ sudo sh -c 'echo "/swapfile1  none        swap    sw              0   0" >> /etc/fstab'
```

以降、問題なくビルド出来るようになりました。
【メモ】実務始めてよく使うgit操作

# 概要
実務で最近よく使うgit操作について書いていきます。
個人的なメモも兼ねての投稿です！

# 先輩「このブランチで作業してください〜」

既存のブランチをローカルに反映させれば良いので、下記コマンドを入力します。

```terminal
$ git fetch
$ git checkout -b hoge origin/hoge
```

### メモ
**git fetch**
リモートブランチの最新情報を取得するコマンドです。
リモートブランチの情報が取得できていれば行わなくてもよいですが、
個人的には確認がめんどくさいので、毎回やってます。

**git checkout -b hoge origin/hoge**
origin/をつけてあげることで、リモートブランチ側と紐づかれます。


# 先輩「このブランチから切ってください〜」
ポートフォリオでは、masterと作業ブランチといった感じでした。
実務では、それ以外にもブランチが存在します。

確実にブランチを切るために、githubからこの作業は行っています。
例として、sample1ブランチから切るとしましょう。


【手順】
①指定されたブランチを選択します
②任意のブランチ名をつけます
③from ''が指定されたブランチになっていることを確認し、create branchをクリックします。
![スクリーンショット 2021-04-24 11.27.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697823/2bba8fa8-83cd-d43e-8c2f-02ee3da9da5e.png)

そして、git fetchすると以下のように表示されます

```terminal
From http://Github.com/hogehoge/git_app
 * [new branch]      hogehoge-fix    -> origin/hogehoge-fix
```

そのまま下記コマンドを入力して完了します。

```terminal
$ git checkout -b hoge origin/hoge
```
### メモ

プルリクを出すとき、マージ先のブランチがどこになっているか確認した方が良いです。
![スクリーンショット 2021-04-24 22.06.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697823/e0f55ce1-8015-ea65-f668-5a599e1c9875.png)


今回の例で言うと、sample1ブランチにマージするプルリクを出しますが、
特に確認せず出すと、マージ先がdefaultのブランチになってしまいます。
（それをしてヤンキーなプルリクだったと言われました・・笑）



# 先輩「コンフリクト起きているので解消してください〜」

プルリクを出した時に、起こります。
原因は修正箇所がかぶってしまったなどなど。

対処としては、
1. マージ先のブランチの最新情報をローカルに取り込む
2. 作業ブランチに移動して、git mergeする
3. 対象ファイルにコンフリクトしている内容が表示される。

```
# マージ先のブランチにて
$ git pull origin HEAD

# 作業ブランチへ移動
$ git checkout 作業中のブランチ名

# マージ先のブランチの最新情報を取り込む
$ git merge マージ先のブランチ名
```

### メモ
修正する時、コンフリクトしている内容を消して良いかどうかわからないときは
素直に先輩に聞くようにしています。

もしかしたら必要なコードの可能性は大いにあり得るので！

# 参考

- [【入門者向け】Gitのfetchコマンドについて図を用いて解説](https://eng-entrance.com/git-fetch)
- [gitでリモートブランチをローカルにcheckoutする](https://qiita.com/YusukeSuzuki@github/items/3bd5752783fd2c2f8805)
- [Git コンフリクト解消手順](https://qiita.com/crarrry/items/c5964512e21e383b73da)
- [第4話 コンフリクトは怖くない！解決方法【連載】マンガでわかるGit ～コマンド編～](https://www.r-staffing.co.jp/engineer/entry/20190927_1)
MySQL の index について

まず、この動画はおすすめ
https://www.youtube.com/watch?v=OsIxUT7D728

この動画の中で出た B-Tree と B+Tree の動きを確認できるサイト

B-Tree
https://www.cs.usfca.edu/~galles/visualization/BTree.html

B+Tree
https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

ぜひお試しください！
VscodeとDockerでPython-Flaskの開発環境をサクッと作った

# 概要
Flaskを触ることになったのでサクッと開発環境を用意したい。
Dockerを開発環境に構築したかったが、エディターはvimを卒業してVscodeを使用したかったので備忘録として残していく。

# 手順
## 1.Dockerインストール
https://docs.docker.com/docker-for-mac/install/

## 2.Vscodeのインストール

https://code.visualstudio.com/download

## 3.Vscodeで「Remote-Containers」をインストール

Vscode上で「ctrl + shift + X」で拡張機能メニューから「Remote-Containers」を検索してインストール。

このプラグインにより、Docker環境に仮想のVscodeを作ってくれるらしい。

## 4.Python-Flaskの環境を構築してくれるソースコードをダウンロード

https://github.com/Microsoft/vscode-remote-try-python

上記のソースを任意のフォルダにクローンする。

## 5.Remote-Containersの機能を使ってダウンロードした上記ソースコードを開く

「command + shift + p」を入力後「Remote-Containers:Rebuild Container」を選択
その後、上記ダウンロードしたフォルダを開く。
(※これでDockerの環境構築が始まる。)

## 6.環境構築が終わったらターミナルを開いて以下を実行

```
python -m flask run --port 9000 --no-debugger --no-reload
```

以下から画面を確認できる。

http://127.0.0.1:9000/
python tkinterGUIへの埋め込みmatplotlibで3Dフィギュアをプロット


python で　tkinterウィンドウ内にmatplotlibを埋め込み
3Dフィギュアをプロットする。

自分のメモまでです。

#実行サンプル
左側のdrawボタンを押すと、
3Dフィギュア(固定)がプロット表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423803/d705c4ba-884d-7d41-329b-09cd78351f5b.png)


#実行環境
windows10
Anaconda3

#実行手順
下記ソースコードをファイル保存して、
Anacondata prompt から 
python ソースコードのパス　
で実行。

#ソースコード
```
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import matplotlib.animation as animation
import tkinter.messagebox
from tkinter import *
import tkinter as tk



#lorenz
def button_add():
   def lorenz(x, y, z, s=10, r=5, b=28):
       '''
       Given:
          x, y, z: a point of interest in three dimensional space
          s, r, b: parameters defining the lorenz attractor
       Returns:
          x_dot, y_dot, z_dot: values of the lorenz attractor's partial
              derivatives at the point x, y, z
       '''
       x_dot = s*(y - x)
       y_dot = r*x - y - x*z
       z_dot = x*y - b*z
       return x_dot, y_dot, z_dot

   dt = 0.01
   num_steps = 10000 

   # Need one more for the initial values
   xs = np.empty(num_steps + 1)
   ys = np.empty(num_steps + 1)
   zs = np.empty(num_steps + 1)

   # Set initial values
   xs[0], ys[0], zs[0] = (0., 1., 1.05)

   # Step through "time", calculating the partial derivatives at the current point
   # and using them to estimate the next point
   for i in range(num_steps):
       x_dot, y_dot, z_dot = lorenz(xs[i], ys[i], zs[i])
       xs[i + 1] = xs[i] + (x_dot * dt)
       ys[i + 1] = ys[i] + (y_dot * dt)
       zs[i + 1] = zs[i] + (z_dot * dt)

   # Plot
   fig = Figure()

   canvas = FigureCanvasTkAgg(fig, w)
   canvas.draw()

   ax = fig.add_subplot(111, projection="3d")
   ax.plot(xs, ys, zs, lw=0.5)
   ax.set_xlabel("X Axis")
   ax.set_ylabel("Y Axis")
   ax.set_zlabel("Z Axis")
   ax.set_title("Lorenz Attractor")

   toolbar = NavigationToolbar2Tk(canvas, w)
   toolbar.update()

   canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)
##   plt.show()

#---------------interface---------------
w = Tk()
w.title("Lorenz")
w.geometry('800x600')
frame = tk.Frame(w)
frame.pack()

button1 = tk.Button(w, text='draw', fg='red', command= lambda : button_add())
button1.pack(side=tk.LEFT)

w.mainloop()
```


#関連資料
tkinterウィンドウ内に3Dフィギュアをプロット
参考　https://www.javaer101.com/ja/article/27212977.html
バッチファイルで他のバッチファイルの戻り値を利用する

Y子です。
いろいろバッチファイルを作っていますが、同じような処理をいくつものファイルに書くのは、書くのも読むのもしんどい気がしてきました。
一話完結の記事にするために1つのバッチファイルにまとめ、とは言え再利用しやすくするためにサブルーチン化し、結局は1つのバッチファイルが大きくなる、というジレンマを、最近のわたしは感じていました。

そこで今回は、1ファイルのコード量を減らす目的も兼ねて、処理を複数のバッチファイルに分け、戻り値として値をやり取りする方法を考えます。

# 概要
バッチファイルから別のバッチファイルを実行し、その実行結果を戻り値として受け取る方法を比較します。
_【[確認環境：Windows 10 Home (Bld. 19042.928)](https://qiita.com/koiwaiwaiko/items/ef2d457ae1e1a7c8b698 "Windows10のバージョンを確認・表記する")】_

# コード
## (1) 呼び出される側（errorlevel）
まず、呼び出される側を2種類作ってみます。
引数を与えると、それをそのまま返すという簡単な処理です。

1つ目は、`errorlevel`として戻り値を返すタイプ。
本来「終了コード」として使われる環境変数を、バッチファイルの戻り値に流用する手法です。
この手法は、いろいろなサイトで紹介されていました。

`exit /b `に続けて値を書いて終了すると、呼び出し側は`%errorlevel%`で受け取れます。

```bat:return_result1.bat
@echo off

setlocal
set arg=%~1
exit /b %arg%
endlocal
```

## (2) 呼び出される側（標準出力）
2つ目は、標準出力で戻り値を返すタイプ。

単純に`echo`コマンドで値を出力します。

```bat:return_result2.bat
@echo off

setlocal
set arg=%~1
echo %arg%
endlocal
```

## (3) 呼び出す側
前述の(1)(2)に同じ引数を渡し、戻り値を受け取って出力するバッチファイルです。
同じ値に対して、それぞれどのようにふるまうのか、比較できるようにします。

```bat:call_bat.bat
@echo off

setlocal
set arg=%~1

rem 戻り値をerrorlevelで取得
call return_result1.bat %arg%
echo 結果1：%errorlevel%

rem 戻り値をバッチの標準出力から取得
for /f "usebackq" %%a in (`call return_result2.bat %arg%`) do set result=%%a
echo 結果2：%result%

endlocal
```

# 実行結果
まずは数字を与えた場合。
どちらの処理も、与えた数字をそのまま取得できるようです。

```:実行結果（数字を与えた場合）
> call_bat.bat 1
結果1：1
結果2：1

> call_bat.bat 1234567890
結果1：1234567890
結果2：1234567890
```

次に、文字を与えた場合。
`errorlevel`を使う方は、「0」に変わってしまいました。
「終了コード」なので、数字しか戻せないように見えます。
標準出力の方は、問題なく戻り値を取得できました。

```:実行結果（文字を与え場合）
> call_bat.bat a
結果1：0
結果2：a

> call_bat.bat abcdefghij
結果1：0
結果2：abcdefghij
```

ためしに、文字数字交じりも与えてみます。
標準出力の方は、こちらも問題なさそうです。
`errorlevel`を使う方は、文字が出てくるとその後が捨てられてしまうようです。

```:実行結果（文字数字交じりを与え場合）
> call_bat.bat 123abc
結果1：123
結果2：123abc

> call_bat.bat abc123
結果1：0
結果2：abc123

> call_bat.bat 1a2b3c
結果1：1
結果2：1a2b3c
```

# おわりに
「戻り値は数字に限る」なんて制約は、無い方がいいですもんね。
`errorlevel`は使い勝手が悪いので、`echo`の出力を受け取る方法の出番が多そうです。

__[前回のFIND関数](https://qiita.com/koiwaiwaiko/items/69873cb9c642380b155f "バッチファイルで指定の文字が何文字目か調べる（ExcelのFIND関数相当）")__ は、今後ほかのバッチファイルから呼びたい機能です。
見やすさのために「2 文字目」なんて出力にしてしまいましたが、値を他の機能で使うことを考えると、「2」だけにしとけばよかったですね。


では！
【Heroku】アプリをWebに公開してみよう

## この記事を読むと以下のことがわかります。

- Herokuを用いて、自身のアプリケーションをWebに公開する方法

## 以下の方法を順番に実施していきます。

- Herokuにアカウント登録する
- Herokuをインストールする
- Herokuにデプロイする



## Herokuにアカウント登録しよう
- アプリをWebに公開するためにはHerokuにのユーザー登録が必要です。登録が済んでいない方は登録を行ってください。

## Herokuをインストールする【ターミナル操作】
```
% brew tap heroku/brew && brew install heroku
```
→Herokuをインストールします（ディレクトリはどこでもOK）

```
% heroku --version
```
→バーションを確認します（バージョンが出力されればOK）

Herokuの導入が完了しました。

## Herokuにデプロイする【ターミナル操作】
```
% heroku login --interactive
```
→Herokuに登録したEmailとPasswordを入力し、Herokuにログインする

```
% heroku create アプリ名
```
→Heroku上にアプリを作成するコマンドです。アプリ名が決まってない場合はここで決める必要があります。

```
% git config --list | grep heroku
```
→「fatal: not in a git directory」以外が表示されていればOKです

```
% heroku addons:add cleardb
```
→こちらはHerokuでMySQLを使用できるようにするコマンドになります
　※以下成功した場合の表示です
　Creating cleardb on ⬢ ajax-app-123456... free
　Created cleardb-vertical-00000 asCLEARDB_DATABASE_URL
　Use heroku addons:docs cleardb to view documentation

```
% heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`
```
→ClearDBデータベースのURLを変数heroku_cleardbに格納するコマンド（Ruby on Railsを使う場合は必要）

```
% heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5}
```
→データベースのURLを再設定するコマンド。DATABASE_URLの冒頭がmysqlのジェム名と一緒か確認しましょう

```
% heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
```
→Heroku上に環境変数を設定するコマンドです（環境変数を設定していない場合：不要）

```
% heroku config
```
→Herokuの環境変数一覧を表示するコマンド。RAILS_MASTER_KEYという変数名で値が設定されていればOKです（環境変数を設定していない場合：不要）

```
% heroku stack:set heroku-18 -a （アプリ名）
```
→デプロイ（公開）されたアプリケーションを読み取り正常に稼働させるためのコマンドです

```
% git push heroku master
```
→Herokuへアプリを追加するコマンドです

```
% heroku run rails db:migrate
```
→マイグレーションを実行します

```
% heroku apps:info
```
→Herokuにデプロイ（公開）されたアプリケーションの情報を見ることができるコマンドURLなど確認できます

表示されたURLをコピペしてアクセスしてみましょう！！

正しく表示されてたら完了です。

おつかれさまでした！！
Angular パイプ

備忘録

### 構文
~~~
{{exp | pipe [:param1 [:param2...]]}}
exp : 整形対象の式
pipe : パイプ名
param1,2 : パラメータ名
~~~

パイプをつなげることで組み合わせも可能

### 記述例
~~~TypeScript
@Component({
  selector: 'my-app',    
  template: `
    <p>全部大文字: {{msg | uppercase}}</p>
    <p>全部小文字: {{msg | lowercase}}</p>
    <p>最初だけ大文字: {{msg | titlecase}}</p>
    <p>5～9文字を出力: {{msg2 | slice : 4: 9}}</p>
    <p>組み合わせ　5～9文字を出力 | 大文字: {{msg2 | slice : 4: 9 | uppercase}}</p>
  `
})
export class AppComponent {
  msg = 'test'; 
  msg2 = 'abcdefghijklmn';
}
}
~~~

### 表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404257/42dcae08-0041-c50c-2904-49f5a454cf0e.png)
Macでdevcontainerを使ってX11 Forwarding

1. VSCodeのextensionで`Remote - Containers`をinstall
1. 画面左下を押し、Remote-Containers: Add Development Container Configuration Files...を選択
1. どちらでもいいが今回はdocker-composeを選択
1. .devcontainerフォルダが作成される。
1. 中のdocker-compose.ymlに①を追記
1. Reopen in Container
1. Xquatsをホストにインストール
1. Xquatsの環境設定 > セキュリティ > ネットワーク・クライアントからの接続を許可
1. Mac再起動
1. ホスト側で `netstat -an | grep -F 6000` > 6000ポートが開いていることを確認
1. ホスト側で `xhost +localhost` > localhostとの接続を許可
1. devcontainer側でなにかGUIアプリを起動(xeyesなど)
1. Xquatsが起動


①


```
    image: mcr.microsoft.com/vscode/devcontainers/base:focal
    environment: 
      - DISPLAY=host.docker.internal:0
```

`host.docker.internal:0`はコンテナ側から見るホストのIPで、ホスト側へとX11 Forwardingしている。

## 参考

https://gist.github.com/cschiewek/246a244ba23da8b9f0e7b11a68bf3285
【jq コマンド】JSON 要素をキー名でソートする

> `jq` コマンド[^jq]でソートをする際に、**要素の「キー名」でソート**したい。

[^jq]: [jq](https://stedolan.github.io/jq/) は JSON データ（要素やオブジェクト）を操作するためのコマンド・ツールです。[Stephen Dolan](https://github.com/stedolan) 氏によって C 言語で書かれた軽量プログラムです。

↓ これを

```json:ソート前
{
  "Charlie": "tres",
  "Bravo": "dos",
  "Delta": "quatro",
  "Alfa": [
      "uno",
      "one"
  ]
}
```

↓ このようにソートしたい（一階層目の並び順に注目）。

```json:ソート後
{
  "Alfa": [
    "uno",
    "one"
  ],
  "Bravo": "dos",
  "Charlie": "tres",
  "Delta": "quatro"
}
```

[「jq コマンド キー ソート」でググって](https://www.google.com/search?q=jq+%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89+%E3%82%AD%E3%83%BC+%E3%82%BD%E3%83%BC%E3%83%88)もドンピシャの記事がなかったので自分のググラビリティとして。

- 関連記事: [JSON 要素をキー名の「長さ」でソートする](https://qiita.com/KEINOS/items/36c5eb4cf14ba1552253) @ Qiita

## TL; DR <sub><sup>（今北産業）</sup></sub>

1. `-S` ショート・オプションを使う
1. `--sort-keys` ロング・オプションを使う
1. `cat sample.json | jq -S .` もしくは `cat sample.json | jq --sort-keys .`

## TS; DR <sub><sup>（キーでソートされた順序で各オブジェクトのフィールドを `jq` で出力する）</sup></sub>

[「jq コマンド キー ソート」でググる](https://www.google.com/search?q=jq+%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89+%E3%82%AD%E3%83%BC+%E3%82%BD%E3%83%BC%E3%83%88)も、タイトルから内容のわかる記事が、なかなかヒットしなかったのですが公式のマニュアルに記載がありました。

> - `--sort-keys` / `-S`:
>
> Output the fields of each object with the keys in sorted order.
>
> <sub>（【筆者訳】キーでソートされた順序で各オブジェクトのフィールドを出力します。）</sub>
> <sub>（[Invoking jq](https://stedolan.github.io/jq/manual/#Invokingjq) | jq Manual @ GitHub）</sub>
>
> 

```shell-session
$ cat sample.json | jq -S .
{
  "Alfa": [
    "uno",
    "one"
  ],
  "Bravo": "dos",
  "Charlie": "tres",
  "Delta": "quatro"
}
```

- [オンラインで動作をみる](https://paiza.io/projects/0DSrwUYrDioZ2gufYdvYNA) @ paiza.IO
WSLでGazebo

# WSLでGazebo

WSLのUbuntu20.04上で、Gazeboをインストールし、起動する方法をまとめました。

## 関連記事

- [WSLでROS2(Foxy)](https://qiita.com/akira-sasaki/items/694afd7533d32e812778)
- [WSLでNav2](https://qiita.com/akira-sasaki/items/888ebcf2b3dfccd112a1)

## Insider Program

下記リンクより、Insider programに移動し、アカウントを登録します。

[https://insider.windows.com/getting-started](https://insider.windows.com/getting-started)

![insider001 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/675eee8c-c55c-2492-d032-f39e9bdabe76.png)

Windowsのメニューから**設定>更新とセキュリティ>Windows Insider Program** を選択。

![win001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/23c57a27-cb85-096b-e33c-5a4a2a47a7ec.png)

**Dev Channel**を選択します。

![win002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/1346783e-1b05-8b62-4fc6-7ada5e8c8e5b.png)

Windowsのメニューから**設定>更新とセキュリティ>Windows Update** を選択。

![win003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/b172c74f-a1cb-3f9d-0fa7-8330cc3155e5.png)


Windows UpdateでDev Channelのイメージをインストールします。

## wslのインストール

PowerShellを管理者権限で立ち上げ、下記コマンドを実行します。

![insider007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/d933c98e-7fca-c8cd-5999-52c026a2ae2b.png)


```
wsl --install
```

![insider0013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/c5e01e31-469e-c96b-c7ab-09acd648c69f.png)

![insider0014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/0a355396-8147-ae44-3617-6400be754505.png)

インストールが完了したらマシンを再起動します。

## Ubuntu

再起動するとUbuntu20.04が起動します。

![insider0015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/e5427802-bc48-8cd2-3807-45e09f84cc42.png)

idとpassの設定をします。

## Gazeboのインストール

Ubuntu20.04のTerminalで、Gazeboを下記コマンドで実行し、インストールします。

Gazeboのインストール

```
curl -sSL http://get.gazebosim.org | sh
```

起動

```
gazebo
```

![gazebo-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/bba0abec-087f-c67c-db4c-ac59efbf288f.png)

```
gazebo /usr/share/gazebo-11/worlds/robocup14_spl_field.world
```

![gazebo3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/16501d87-2ea7-8b13-4749-678403631e71.png)


```
gazebo /usr/share/gazebo-11/worlds/pr2.world
```

![gazebo1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/65ede31b-1c45-4e57-e02f-7928a4b06c14.png)
インスタンス　$??? = new ***;　を学んだよ

##インスタンスとは
インスタンスとは、クラス内でnewを使用して定義されたもの。
(クラス内での役割指定。今回の場合tanakaがインスタンス化された。)

|name|age|
|:--|---:|
|山田|32|
|田中|45|
|佐藤|51|


```PHP
<?php
class Staff {
  public $name;
  public $age;
}
//publicどこからでもアクセス可能。アクセス修飾子がない場合は、publicを指定したものと同じ。

//tanakaがスタッフ欄にインスタンス化して新たにクラスに入ったよ。
$tanaka = new Staff; 

//インスタンス名->プロパティ名  　　※プロパティの"$"はつけない
//tanakaというインスタンスは名前を意味してるので$nameに、"tanaka"として入れたよ。
$tanaka->name = "tanaka";
//$tanakaをnameに突っ込んだよ。＝　tanakaとして表示するよ。

echo $tanaka->name; //　tanaka　が表示されるよ。
```


https://qiita.com/non0311/items/26f18af83d84ae95bc91#:~:text=%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AF%E3%80%81%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A7%E5%AE%9A%E7%BE%A9,%E5%87%BA%E6%9D%A5%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82
モデルとテーブルを作成する（Ruby on Rails）

#プログラミング勉強のための備忘録
2021/04/24
Ruby on Railsで資産管理アプリを作成しています。
備忘録として、株式投資で得られた配当金を記録していくテーブルを作成する流れをまとめました。

#データベースを用意する
データを保存するためのテーブルを作成する。`rails g model モデル名`で作成できる。モデル名は頭文字を大文字にして、単数形にする。
ターミナルでコマンドを実行すると、`app/models`フォルダにモデルが定義されたファイルと、`db/migrate`フォルダにマイグレーションファイルの２つが生成される。
今回は配当金を記録するためのテーブルを作成するため、モデル名は「Dividend」とした。

```html:ターミナル
$ rails g model Dividend
```

#データベースにカラム名を追加する
モデルと共に自動生成されたマイグレーションファイルに追記する。

```ruby:******_create_dividends.rb
class CreateDividends < ActiveRecord::Migration[6.1]
  def change
    create_table :dividends do |t|
      # ここから追記する
      t.date :month
      t.string :name
      t.float :dividend_based_dollar
      t.float :tax_based_dollar
      t.float :income_based_dollar
      t.integer :dividend_based_yen
      t.integer :tax_based_yen
      t.integer :income_based_yen
      # ここまで追記する
      t.timestamps
    end
  end
end
```

#データベースにマイグレーションファイルの変更を反映させる
以下のコマンドを実行して、データベースに変更を反映させる。データベースに反映されていないマイグレーションファイルが存在する状態でページにアクセスすると、エラーが発生する。そのため、マイグレーションファイルを作成した場合は、必ずこのコマンドを実行する。

```html:ターミナル
$ rails db:migrate
```

#次にやること
データベースに値を入力するページとフォームを作成する。

#参考文献
[https://qiita.com/mzmz__02/items/f018b67243175e8f0891](https://qiita.com/mzmz__02/items/f018b67243175e8f0891)
ユーザーを検索する機能を実装するの巻　その１

##ユーザー検索
・全ユーザーを表示するページ（/users）上での、ユーザー名の検索と検索結果を表示する機能を付けたいとおもいます。

##gemをインストールする
・ユーザー検索をする際にRails用の検索機能を簡単に実装できる、Ransack Gemを使いたいと思います。

```
#gemファイルに追加してbundle install
gem 'ransack'
```
##実装
・ユーザーの検索用のフォームを作ります。

```app/views/users/_search_form.html.erb
<%= search_form_for @q do |f| %>
  <h1>ユーザー検索</h1>
<div class = "input-group">
  <%= f.text_field :name_cont, placeholder: "ユーザーネームを入力" %>
  <%= f.submit '検索' %>
</div
<% end %>
```

・「name:cont」を利用しています。
・今回の検索ではユーザー名(name)に検索ワードが含まれているか(cont、containのこと)を調べるため、「:name_cont」を指定しています。

・次にUsersContorollerのindexアクションに処理を加えたいと思います。

```app/controllers/users_controller

def index
    if params[:q] && params[:q].reject { |key,value| value.blank? }.present?
      @q = User.ransack(search_params, activated_true: true)
      @title = "検索結果"
    else
      @q = User.ransack(activated_true: true)
      @title = "全てのユーザー"
    end
      @users = @q.result.paginate(page: params[:page])
end

~省略~
private
    def search_params
      params.require(:q).permit(:name_cont)
    end

```

・params[:q][:name_cont]にユーザーが指定した検索ワードが含まれている。検索ワードの指定がない場合は全アクティブユーザーを取得します。
・「モデル名.Ransack(検索条件)」の結果を「result」で取得、検索なしの時と検索ありの時でタイトルを変更しています。

・Viewに_search_form.html.erbを挿入します。(この部分は各自で違うと思いますが...。）

```app/views/users/index.html.erb

<% provide(:title,'ユーザー検索') %>

<h1><%= @title %></h1>

<div class="row">
<%= render 'users/search_form' %>
</div>

<%= will_paginate %>

<% unless @users.empty? %>
<ul class= "users">
  <%= render @users %>
</ul>
<% else %>
<p>
  ユーザーが見つかりませんでした。<br>
  お探しのユーザー名を確認してください。
</p>
<% end %>

<%= will_paginate %>
```

・検索結果が０の時にはメッセージを表示するようにしました。

##最後
・以上になりますが、とりあえずできました。
・テストは次回やってみたいと思います。
【AWS】終了してしまったEC2インスタンスを復元させる（※スナップショットが必要です）

AWSのSAA（ソリューションアーキテクトアソシエイト）試験に受かることを目論むエンジニア1年目の者です！
<p></p>
最近はAWSの仕事を任されていて、特にEC2を動かすことが多いのですが、
先日、「大事なEC2インスタンスを誤って終了させてしまう」というビッグイベントを経験しまして（大ごとでは無かったけど死ぬほど動揺した）、
今回はその時どうやって復元に成功したかについて、備忘録として記しておきたいなと思います。
<h1>最初に言いたいこと</h1>
スナップショットを取得しておいてよかった！！！
<h1>EC2インスタンス終了するとどうなるか</h1>
EC2インスタンスの状態が「終了済み」になった場合、終了を取り消したり、再び起動させたりすることはできない。
そして、そのインスタンスにアタッチされているEBSも終了と同時に自動で削除されてしまう。
そう、一度終わったら元には戻れないんです…。
<p></p>
でも、まだ諦めちゃいけない。
終了したEC2インスタンスをどうにか元に戻したい時、最後の望みとなるのが、スナップショット。
スナップショットは、「ある時点（瞬間）における対象の全体像を丸ごと写し取ったもの」という意味で、ここではEBSのボリュームのイメージをS3に保存したものを指します。
復元の手順としては、スナップショットからAMIとEBSを復元し、復元したAMIからEC2インスタンスを作成し、そのインスタンスに復元したEBSをアタッチさせる流れとなります。
<h1>復元した手順</h1>
<h3>スナップショットからEBSとAMIを作成</h3>
・AWSコンソールを開き、左上のサービスから「EC2」を選択
・「スナップショット」を選択
・作成されたスナップショットを選択し、左上の「アクション」をクリック
・「ボリュームの作成」をクリック![178c26c598e84c4eaad4e1772d7a649d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678858/cc8ffe01-c76b-ca39-69d0-fbabc2112b90.png)
・ボリュームタイプをGeneral Purpose SSD (gp3)に設定し、「ボリュームの作成」をクリック
![0731d323d54a5aabb783f951b6fe334e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678858/0b080eeb-1945-a23b-eae7-e2233975dbab.png)
・もう一度スナップショットを選択し、左上の「アクション」をクリック
・「イメージの作成」をクリック
・任意の名前を記入
・ルートデバイス名（例：/dev/sda1）をメモしておく
・「作成」をクリック
![4396520d336f2e3782c805356941b2d0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678858/72d80863-fbb0-4f4e-37dc-9a5e1c298461.png)
<h3>AMIからEC2インスタンスを作成しEBSを紐付ける</h3>
・EC2の左側のリストから「AMI」をクリック
・先ほど作成されたAMIを選択し、「起動」をクリック
![eef1700de7cf3a07badd9a0db5ca2113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678858/98e0cce2-f441-bfae-f5c7-bc49299e4fb6.png)
・EC2の作成手順に従いEC2インスタンスを作成する
・作成されたインスタンスが実行中なのを確認したら右上の「インスタンスの状態」をクリック
・「インスタンスの停止」をクリック
![82a0d70777a0f11bcb8b5ee358e4082d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678858/5c34f836-4c41-1162-c22b-51a741912f11.png)
・インスタンスが停止済みになったらEC2の左側のリストから「ボリューム」をクリック
・EC2作成と同時に作成されたボリュームを選択し、左上の「アクション」をクリック
・「ボリュームの強制デタッチ」を選択し、「デタッチする」をクリック
![18ecbb1c3f1e005932f06d6d8efd0315.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678858/a2045dc6-2326-7dc8-7775-95113572a786.png)
・スナップショットから作成されたボリュームを選択し、左上の「アクション」をクリック
・「ボリュームのアタッチ」を選択し、任意の名前を記入
・インスタンスを先ほど作成したEC2インスタンスを選択し、デバイスを先ほどメモしたルートデバイス名を記入して、「アタッチする」をクリック
![e6c2cf66b2e9ec5bf18e0951a9d6dfb6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678858/3adb8323-5da7-87d8-1855-7f8fe773a858.png)
・EC2の左側のリストから「インスタンス」をクリック
・停止したEC2インスタンスを選択し、「インスタンスの状態」をクリック
・「インスタンスの開始」をクリック
<h1>もう誤って終了させないために</h1>
機能として、EC2の起動設定時あるいはインスタンス作成後にで終了保護の設定ができます。
この機能のおかげで間違えてインスタンスを終了させてしまう事態を防ぐことができます。
<h3>EC2の起動設定で終了保護を設定</h3>
・EC2のインスタンスの画面で「インスタンスの起動」をクリック
・ステップ3「インスタンスの詳細の設定」で「終了保護の有効化」にチェックを入れる
<h3>インスタンス作成後に終了保護を設定</h3>
・EC2のインスタンスの画面で終了保護したいインスタンスをチェックし
・「アクション」→「インスタンスの設定」→「終了保護を変更」と進む
・「終了保護の有効化」にチェックを入れる
<h1>最後に</h1>
そもそも終了の処理をする時にインスタンスのチェックがついてることをきちんと確認しておけばよかった。反省。
ただ、これを機にスナップショットと終了保護機能の重要性に気づけたので、次に活かしていきたいと思います！
<p></p>
この記事はAWS初学者を導く体系的な動画学習サービスAWS Cloud Techの課題として作成しております。
[https://aws-cloud-tech.com](https://aws-cloud-tech.com)
私みたいなおっちょこちょいな人でもしっかり学べる大変優しい環境です！！！
Memory Networks（とNeural Turing Machines）の解説でわかりやすいと思った記事N選(まだN=3)

#　概要
以下の論文の「<font color="orange">**Memory Networks　（とNeural Turing Machines）**</font>」(3つ)を理解するときに、わかりやすいと思った記事をリストアップする。
※最初は、(c)のみを対象に考えたが、ちょっと、取りつく島がなかったので、(b)(a)と追加。

(a)
Neural Turing Machines
https://arxiv.org/abs/1410.5401
Graves, Alex, Greg Wayne, and Ivo Danihelka. "Neural turing machines." arXiv preprint arXiv:1410.5401 (2014).

(b)
Memory Networks
https://arxiv.org/abs/1410.3916

Weston, Jason, Sumit Chopra, and Antoine Bordes. "Memory networks." arXiv preprint arXiv:1410.3916 (2014).

(c)
End-To-End Memory Networks
https://arxiv.org/abs/1503.08895

Sukhbaatar, Sainbayar, et al. "End-to-end memory networks." arXiv preprint arXiv:1503.08895 (2015).


# 記事一覧

| |記事名|URL|評価(いいと思ったときに★を入れる)|
|:--:|:--|:--|:--|
|1|《日経Robo》質問応答を学習で獲得するMemory Networks|https://xtech.nikkei.com/dm/atcl/mag/15/00144/00010/|:star2:|


# 【1】《日経Robo》質問応答を学習で獲得するMemory Networks

日経Roboの解説記事。Preferred Networks 岡野原氏によるもの。

https://xtech.nikkei.com/dm/atcl/mag/15/00144/00010/

##なぜ、わかりやすいか

|なぜ、わかりやすいか（１ポイント）|
|:---|
|論文のメイン？となる図を、丁寧に説明してくれているから|

# 【2】Oral Session: End-To-End Memory Networks

https://www.youtube.com/watch?v=ZwvWY9Yy76Q&t=425s
Oral Session: End-To-End Memory Networks[Microsoft Research
]

(出典：上記のYoutube)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/b669a6b2-acde-bc15-6c52-da5d7e53b84e.png)

画質、謎の劣悪さ。ただし、別に画質が悪くてわからない部分は、ほど、ないと思う。


##なぜ、わかりやすいか

|なぜ、わかりやすいか（１ポイント）|
|:---|
|論文の筆者自身による講演(Youtube)のため。|


# 【3】Neural Turing Machines (Paper Explained) (Youtube)

https://www.youtube.com/watch?v=XBgwq4IePLw

(図は、上記より抜粋）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/5fced313-da3a-583c-650b-5f9aa1a94d94.png)


##なぜ、わかりやすいか
|なぜ、わかりやすいか（１ポイント）|
|:---|
|まだ、ほとんど理解できていないが、画面スクロールが上手。|


# わからないことリスト

|Question　(state:open)|
|:--|
実は、基本的なところで、MemoryとかExternal Memoryとかいう言葉の使い方がよくわかっていない。


|Anser|
|:--|
まだ、回答ではないが、対象論文を2つに増やした。(b)が元々対象にしたもので、(a)をたした。



# まとめ
特にありません。
投稿記事の時間の表示方法


![febc6509d03de2df9a31cc0c0488ca5d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1301666/96ed1ec4-232a-f50e-aca7-771a9c1ec030.png)

投稿機能を実装しましたが、投稿した時間が表示されていません。
ここに時間を表示します。


```ruby
<p><%= picture.created_at%></p>
```
このコードをviewファイルの該当の部分に記述します。
<p><%= モデル名.created_at%></p>で記述します。
次にconfigにあるapplication.rb内に以下のように修正し
時間表示を日本時間に直します。

```ruby
module Kari35089
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0
    config.time_zone = 'Tokyo'
```
サーバーを再起動し、このように表示することができました。

![225fbe130e812d7eec61fae5008f681c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1301666/cf8381b6-44ac-c884-735a-19dcad040408.png)

次に+900という表示を消します。
以下のように修正します。

```ruby
<p><%= picture.created_at.strftime("%Y-%m-%d %H:%M")%></p>
```

![1bee5506bbf7139794173a358049cc2f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1301666/93a153ff-4b4a-b6cf-b89a-5592e6118f20.png)

正しく表示することができました。
[Swift] ベータ版XcodeのSwiftのバージョンを調べる

通常Swiftのバージョンはターミナルで`swift --version`と打てば出てくるのですが、ベータ版XcodeのSwiftのバージョンはこの方法では出せません。
ベータ版XcodeのSwiftのバージョンを調べるには直接Swiftの実行ファイルを指定して以下のようにすれば大丈夫でした。

```
{ベータ版Xcodeの置いてあるディレクトリ}/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift --version 
```

私の環境では以下のように出力されました。

```
Apple Swift version 5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55)
Target: x86_64-apple-darwin20.3.0
```
ECR / ECS / Fargate / EC2についてと使ってみて思ったこと

## 想定読者
- Dockerのことは大体わかっている人
- AWSのコンテナ関連サービスの関係性が掴みきれていない人

## サービスとDockerコマンドとの対応

各サービスとDockerコマンドをざっくり対応づけてみました。
※ 主要なコマンドのみに厳選しています。

|サービス|Dockerコマンド|
|:---|:---|:--|
|CodeBuild|docker build<br>docker push|
|ECR|docker images<br>docker rmi|
|ECS|docker pull<br>docker run<br>docker stop<br>docker-compose up<br>docker-compose down|



## アーキテクチャ

アーキテクチャを描きました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253933/97e71fcc-4346-4d74-2af1-b6bac5a5dbd5.png" width=50%>


　DockerHubのオフィシャルイメージとかを使う場合は、CodeBuildはいらないですね。EC2とFargateの違いは、調べるとたくさん出てくるのでここでは割愛します。
　概念理解のために読み替えると以下のような感じでしょうか。

<img align="right" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253933/b360fb56-3dd8-4cb6-1001-c99af1a474ad.png" width=50%>

## ECSを使ってみて思ったこと

### よかったところ
* dockerと同等の設定が簡単にできて便利

### 気になったところ
* サービス停止しても勝手に起動するのやめてほしい[^1]
* 原因不明の「タスク定義を作成できませんでした」やめてほしい
* EC2で起動する場合、デフォルトロールにセッションマネージャ使える権限をつけておいてほしい
* サービス停止しててもEC2は実行中で課金されてるのを気づかせないようにしてる感じがずるい(EC2で起動する場合)。


[^1]: 止めたいサービスの「必要なタスク数」を0にして更新した後に起動してるサービス停止しないといけなかった

## 終わりに

　ECSは便利でしたが、使ってみると気になるところがたくさんありました。少しずつ改善されることを祈っています。
xzコマンドの使い方

最新版は以下に記載しています。
https://hana-shin.hatenablog.com/entry/2023/03/27/231218

#1 xzコマンドとは?
ファイルを圧縮するコマンドです。

#2 環境
VMware Workstation 15 Player上の仮想マシンを使いました。
仮想マシンの版数は以下のとりです。

```console:CentOSの版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 8.3.2011
```

```console:カーネル版数
[root@server ~]# uname -r
4.18.0-240.el8.x86_64
```

```console:xz版数
[root@server ~]# xz -V
xz (XZ Utils) 5.2.4
liblzma 5.2.4
```

本仮想マシンの仮想CPU数は8個です。

```console:仮想CPUの個数
[root@server ~]# cat /proc/cpuinfo |grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3
processor       : 4
processor       : 5
processor       : 6
processor       : 7
```


#3 オプション一覧

```console:オプション一覧
[root@server ~]# xz --help
Usage: xz [OPTION]... [FILE]...
Compress or decompress FILEs in the .xz format.

  -z, --compress      force compression
  -d, --decompress, --uncompress
                      force decompression
  -t, --test          test compressed file integrity
  -l, --list          list information about .xz files
  -k, --keep          keep (don't delete) input files
  -f, --force         force overwrite of output file and (de)compress links
  -c, --stdout, --to-stdout
                      write to standard output and don't delete input files
  -0 ... -9           compression preset; default is 6; take compressor *and*
                      decompressor memory usage into account before using 7-9!
  -e, --extreme       try to improve compression ratio by using more CPU time;
                      does not affect decompressor memory requirements
  -T, --threads=NUM   use at most NUM threads; the default is 1; set to 0
                      to use as many threads as there are processor cores
  -q, --quiet         suppress warnings; specify twice to suppress errors too
  -v, --verbose       be verbose; specify twice for even more verbose
  -h, --help          display this short help and exit
  -H, --long-help     display the long help (lists also the advanced options)
  -V, --version       display the version number and exit

With no FILE, or when FILE is -, read standard input.

Report bugs to <lasse.collin@tukaani.org> (in English or Finnish).
XZ Utils home page: <http://tukaani.org/xz/>
```
Chia plot を複数処理するメモ

## 背景

SSD が複数枚あるような環境で plot の処理をそれぞれの SSD に割り当てたい.

GUI だと SSD ごとに plot 処理を割り当てするとかできない. 

### GUI での Plot in Parallel

![Screenshot from 2021-04-24 20-21-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/dfba2007-8583-f6aa-357c-b0db4c2bb59a.png)

10 plot あったら 10 個並列で処理する. そのため tempdir(usually SSD)の領域も 10 倍消費する(k=32 100 GB だと 3 TB くらい消費する)ので注意!(一晩動かしていたら SSD ディスク領域ゼロになっていてつらかった :cry:)

また, queuing の場合, `Add a plot` で新しく plot 処理つくっても既存の plot 処理のあとに追加されるだけ(= 複数 plot が走らない) 


## 方法

GUI wallet 当たりで Wallet あたりセットアップしているものとします.

とりあえずはコマンドラインで, 個々の plot 処理を立ち上げることになります.

https://world.hey.com/smeriwether/chia-fundamentals-and-plotting-chia-in-parallel-ebba76eb

https://github.com/Chia-Network/chia-blockchain/wiki/CLI-Commands-Reference

```bash
$ chia plot create -k 32 -n 10 -t /mnt/ssd0  -d /mnt/hdd/
```

デフォルトでは thread 2 で処理します. CPU やメモリ性能足りない場合は thread 1 にしたりメモリ使用量減らすオプションを指定しましょう.


## TODO

* [ ] GUI のように plot が何％おわったかどうか status を表示する方法を探す
* [ ] 大規模で効率よく plot 処理する
  * https://github.com/rjsears/chia_plot_manager
  * https://github.com/ericaltendorf/plotman
  * あたりで.