OmniAICreator/Qiita-1.07M huggingface dataset:
正規表現で特定の文字が含まれているかを調べる [javascript]

正規表現の使い方とかやれることを何度も忘れてしまうのでやり方をまとめ。

やりたいこと
- 条件(正規表現)に合う文マッチする文字列を検索し、文字列が条件にマッチしているかを調べる .test()
- 条件(正規表現)に合う文マッチする文字列を検索し、文字列を置き換える .replace()

## 正規表現
基礎はサイトで勉強する必要があるとして、
基本的には文字列のパターンを「/」で囲むような書き方をします。

`/(文字列のパターン)/`

自分は正規表現チェッカーサイトとかで実際のデータと比べながら正規表現を作成しています。
https://rubular.com/
シンプル＆下にチートシートがあるためチェックしながら正規表現を作成することができます。
<img width="30%" alt="スクリーンショット 2019-09-12 0.57.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205283/3b5f451d-6ab0-194d-4fd8-7378f6358206.png">

## 正規表現フラグ(修飾子)
正規表現フラグについての理解が曖昧だったためフラグについてもまとめておきます。正規表現には、グローバルな検索や大文字／小文字を区別しない検索を可能にする4種類のオプションフラグがあります。

フラグを正規表現に含めるには次のようにします。
`const re = /pattern/flags;`

| 修飾子 | 内容 |
|:--|:--|
| g | 繰り返しマッチする (global) |
| i | 大文字と小文字の区別をしない (case-insensitive) |
| m | 文字列を複数行として扱う (multi-line) |

##  文字列が条件にマッチしているかを調べる 正規表現 + .test()
##### 例) 入力された文字の最後に '.jpg' が含まれているか
(2019/9/16コメント反映で修正)

```javascript
  // テスト用正規表現
  const regExp = /.*\.jpg$/
  
  // 入力された値の最後に「'.jpg'」が含まれているかをtestする
  const answer = regExp.test(data);
```
全文表示すると下記のようなイメージ

```html
<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"></head>
<body>
  <input type="text" class="js-data" value="test.jpg">
</body>
<script>
  // inputに入力された値の取得
  const data = document.querySelector('.js-data').value;
  // テスト用正規表現
  const regExp = /.*\.jpg$/
  
  // 入力された値の最後に「'.jpg'」が含まれているかをtestする
  const answer = regExp.test(data);

  // コンソール出力　=> true
  console.log(answer);
</script>
</html>

```

##### 例) 入力された文字が「数字/数字/数字」の形をとっているか
*「\d」は0~9の数字の意と同等

```javascript
  // テスト用正規表現
  const regExp = /\d*\/\d*\/d*/g
  
  // 入力された値の最後に「'.jpg'」が含まれているかをtestする
  const answer = regExp.test(data);

```
全文表示すると下記のようなイメージ

```html

<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"></head>
<body>
  <input type="text" class="js-data" value="2019/09/15">
</body>
<script>
  // inputに入力された値の取得
  const data = document.querySelector('.js-data').value;
  // テスト用正規表現
  const regExp = /\d*\/\d*\/d*/g
  
  // 入力された値の最後に「'.jpg'」が含まれているかをtestする
  const answer = regExp.test(data);

  // コンソール出力　=> true
  console.log(answer);
</script>
</html>
```

##  正規表現に合う文字列を置き換える 正規表現 + .replace()
例) スラッシュ(/)で区切られている日付データのスラッシュを取り除く(=空文字''に置き換える)

`2019/09/15 →　20190915`

これは正規表現でスラッシュ(/)の条件にマッチする部分を見つけ出し .replaceで置き換えることで実現できます。<b>「/」は正規表現の予約語となっているため、文字として扱うには前に「\」をつけてやる必要がある。
</b>

```javascript

  // 入力された値に「/」が含まれていたら空文字「''」と置き換える
  const trimmedDate = date.replace(/\//g, '');
```

全文表示すると下記のようなイメージ

```html

<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"></head>
<body>
  <input type="text" class="js-date" value="2019/08/15">
</body>

<script>
  // inputに入力された値の取得
  const date = document.querySelector('.js-date').value;

  // コンソール出力　=> "2019/08/15"
  // console.log(date);

  // 入力された値に「/」が含まれていたら空文字「''」と置き換える
  const trimmedDate = date.replace(/\//g, '');

  // コンソール出力　=> "20190815"
  console.log(trimmedDate);
</script>
</html>
```
【C#】Dictionaryは存在しないキーを指定して値を設定できる

とあるコードのデバッグ中に「お、落ちそうだな。ココ。」と思い検証。
問題なかった。知らなかったなあ。

調べたら公式ドキュメントに書いてあった。
[Dictionary_TKey,TValue_.Item[TKey] Property]
(https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.dictionary-2.item?view=netframework-4.8)

>**プロパティ値**
>TValue
>指定されたキーに関連付けられている値。指定したキーが見つからなかった場合、get 操作は KeyNotFoundException をスローし、**set 操作は指定したキーを持つ新しい要素を作成します。**

以下の４パターンを検証（[検証 by このサイト](https://www.jdoodle.com/compile-c-sharp-online/)）
・存在するキーを指定し、値を取得
・存在しないキーを指定し、値を取得
・存在するキーを指定し、値を設定
・存在しないキーを指定し、値を設定

```c#
var dict = new Dictionary<int, int>();
dict.Add(0, 100);

// 正常ケース
// 存在するキーを指定し、値を取得
try
{
    var a = dict[0];
    Console.WriteLine($"success - value is {a}");
}
catch
{
    Console.WriteLine("failure - key not found");
}

> success - value is 100


// 異常ケース
// 存在しないキーを指定し、値を取得
try
{
    var a = dict[1];
    Console.WriteLine($"success - value is {a}");
}
catch
{
    Console.WriteLine("failure - key not found");
}

> failure - key not found


// 正常ケース
// 存在するキーを指定し、値を設定
try
{
    dict[0] = 200;
    var a = dict[0];
    Console.WriteLine($"success - value is {a}");
}
catch
{
    Console.WriteLine("failure - key not found");
}

> success - value is 200


// 正常ケース？
// 存在しないキーを指定し、値を設定
try
{
    dict[1] = 300;
    var a = dict[1];
    
    // 問題なく動く
    Console.WriteLine($"success - value is {a}");
}
catch
{
    Console.WriteLine("failure - key not found");
}

> success - value is 300
```
【PhpStorm】リポジトリ（SVN）の設定

## リポジトリ（SVN）の設定

### 概要
PhpStormでの開発時に、リポジトリ（今回はSVN）との連携を行う設定手順。

複数のリポジトリを指定して設定を行うやり方となります。
例えば・・・
・ドキュメント系のリポジトリ、ソース系のリポジトリを一緒に管理したい
・リポジトリの全体が大きいので特定のAAAフォルダとBBBフォルダのみをチェックアウトして修正したい
などが想定しています。
リポジトリとの連携を行う前準備としては、「TortoiseSVN」をインストールしています

#### 環境
+ PhpStorm 2019.2.1
+ Windows 10
+ TortoiseSVN 1.11.1（https://tortoisesvn.net/）

---

### 手順

1. 事前準備
フォルダにチェックアウト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363906/a34cb1f9-85df-975e-4846-4123fa270a89.png)
上の二つのフォルダ「aaaa」「bbbb」をにそれぞれチェックアウト
［チェックアウトするフォルダ］
・file:///D:/svn/_SvnTest/aaaa
・file:///D:/svn/_SvnTest/bbbb
［チェックアウト］
・D:\SVN連携
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363906/792d27ea-b177-d103-d8f8-c48c1883cc80.png)

2. PhpStormで開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363906/439c16c2-3d28-2154-3681-2bb26697d606.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363906/db05d1b5-2043-41d2-a6f2-808da301c313.png)

3. File > Settings（Ctrl + Alt + S でも可）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363906/5e8be5b6-9da5-e5e6-92e2-a848a37bb93d.png)

4. Version Control
「＋」で設定を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363906/1b92cab9-7397-f84d-1918-8841478ff020.png)

5. Add VCS Directory Mapping の設定
フォルダマークからSVNと紐づけるディレクトリを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363906/ff7f0a01-69e0-6452-18db-d2f86d26ffe2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363906/5364eb25-f205-d365-f73a-3230155c3a8e.png)
使用するバージョン管理を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363906/f3bd6c24-3cd1-6ebe-b08c-cc79f2023f2b.png)

6. 1つ目のフォルダ（aaaa）に対するリポジトリ設定が完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363906/b418c3af-c109-6b63-8a5c-cde8525ba559.png)

7. 二つ目のフォルダ（bbbb）に対するリポジトリも設定する
「＋」をクリックして 5番 ～ 6番の手順を繰り返す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363906/61383718-47f1-80b7-9e1c-ba35247440d6.png)

8. 二つの設定が完了すると以下のようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363906/5cb873bf-5f29-4672-d86d-1c9b452d3aec.png)
「Version Control」のタブが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363906/5c1a40eb-c899-a5b6-2256-91085e096932.png)
DynamoDBとLambdaとPython3.7

###### botoをrequirements.txtに含める必要はありません
Python3.xには標準で含まれている模様です。
わざわざ入れたらパッケージが45MBになり、コードが画面上で編集できなくなってしまいました。

[→出典](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html)

###### Float types are not supported. Use Decimal types instead.

```py

i = {
  'year': 2015,
  'title': 'The Big New Movie',
  'info': {
    'plot': "Everything happens all at once.",
    'rating': 24.1
  }
}

table.put_item(
  Item = i
)
```

`rating`が24なら問題ないけど、24.1だとエラーになる。

```py

i = {
  'year': 2015,
  'title': 'The Big New Movie',
  'info': {
    'plot': "Everything happens all at once.",
    'rating': decimal.Decimal('24.1')
  }
}

table.put_item(
  Item = i
)
```

シングルクォートがないと下記のエラーになる。ことがある。

```py
  "errorMessage": "[<class 'decimal.Inexact'>, <class 'decimal.Rounded'>]",
  "errorType": "Inexact",
```

```bash
'rating': decimal.Decimal(5.0) ← エラーにならない
'rating': decimal.Decimal(5.1) ← エラー
'rating': decimal.Decimal(5.5) ← エラーにならない
'rating': decimal.Decimal(5.5555555) ← エラー
'rating': decimal.Decimal(5.6) ← エラー
'rating': decimal.Decimal(5.9) ← エラー
'rating': decimal.Decimal(24.1) ← エラー
'rating': decimal.Decimal(24.5) ← エラーにならない
```

なぜか0.5刻みのときだけセーフ。
TypeScriptをちょっと触った

# これを読んでおくと捗る
[イマドキのJavaScriptの書き方2018](https://qiita.com/shibukawa/items/19ab5c381bbb2e09d0d9)

これの構文は大体使えるというか、これを更に便利にしちゃおうぜという感じ。

# TypeScriptって？
Microsoft製のメタ言語。コンパイルするとJavaScriptになる。
型制約が魅力的な言語で、これを満たさないと**コンパイル時にエラーが出る**。

構文もJavaScriptよりかはオブジェクト指向っぽくなってました。
でもちょこちょこJavaScriptが香る箇所があります。

# TypeScriptに用意されている構文

## 変数の型指定

```typescript
var num:number = 0;
let text:string = 'Hello world!';
const str:string = ' :) ';

// nullableをやるなら...
const str: string | null = null;
```

変数宣言の`var`、`let`、`const`はそのまま。
変数名の後ろに型を指定する。

型推論はなく、JavaScriptの型が曖昧なのをバシっと厳密に決めてあげる感覚。

ちなみに`any`にすればJavaScriptらしく曖昧な型にできる。

### キャスト
強制型指定は`as`を使う。

```typescript
const str: any = 'Hello world!';

str as string // > string型として扱われる
```

メソッドの実引数とか、型制約で困ったら使うとよろしいかと。

## class
```typescript:User.ts
export default class User{
    public readonly id: number;
    public name: string;

    constructor(id: number, name: string){
        this.id = id;
        this.name = name;
    }

    public greet(): string {
        return  `こんにちは。 ${this.name}です。`;
    }
}
```

よく見かけるアレ。

`abstract`もあるし`interface`もある。
ただし静的メソッドを抽象メソッドにはできない。
アクセス修飾子も`public`、`protected`、`private`がある。

`readonly`はコンストラクタでのみ代入可、再代入不可のフィールド。
C# なんかでも見かけたやつ。

メソッドのオーバーライドもできる。が、C# みたいに`virtual`にしたり`override`とかつけられない。

## Promise
`async`メソッドの返り値は`Promise<T>`となる。

```typescript
async fetch():Promise<DocumentSnapshot>{
    const snapshot:DocumentSnapshot =
        await firebase.firestore().collection('User').doc('xxxx').get();
    return snapshot;
}
```

おかげさまで型を把握しやすい。良い！

# 良いと思った部分
- IDEの入力補完がガッツリ効く
- クラスベースで作っていくのが自然な発想になる
- 抽象クラスの存在によって柔軟な型制約も作れる
    - オブジェクト指向芸人、静的型付け愛好家大歓喜

# そのへんはJavaScriptだなって思う部分
- Promise / async / await
- `export default`
- 既存のプロジェクトに組み込む場合、webpackやbabelの設定がめんどくさい
    - `.ts`用にトランスパイル（コンパイル？）の設定を書いてあげる必要
    - Jestでテストをするのに若干手間取った
- TypeScriptからJavaScriptを使うと型定義が必要だったりany型と大乱闘するハメになる
    - Firebaseとかだと型定義がライブラリとして存在するから楽ちん
    - [TypeScriptプロジェクトに独自の型定義を配置する方法](https://qiita.com/mtgto/items/e30d1529ca298e49557e)
- `null`と`undefined`を知っとく必要はある

# こういうのほしいと思った部分
- エルビス演算子
    - `?:`がほしい。
        - `||`で代用出来るらしい。[JavaScript でエルビス演算子を使ってみる](https://qiita.com/att55/items/5bbbc29f7b7c730a3bd8)

---

入力補完や型制約はやっぱり偉大だなと思いました。

Kotlinとか嗜んでると割と自然に扱えると思います。
動的型付けにドップリな人だとちょっときついかも。
docker-composeでmysqlコンテナを立てる（永続化）

# mysqlイメージをpull
```bash
$ docker pull mysql
```

# docker-composeのyamlファイル作成
```yaml:docker-compose.yml
version: '3'
services:
  db:
    image: mysql
    # 永続化
    volumes:
      - ./db/mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
```

# 起動
```bash
$ docker-compose up -d
Creating network "docker_default" with the default driver
Creating docker_db_1 ... done

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
ec67f43d81f6        mysql               "docker-entrypoint.s…"   17 seconds ago      Up 15 seconds       3306/tcp, 33060/tcp      docker_db_1
```

# 永続化の確認
```bash
# mysqlコンテナ内に入る
$ docker exec -it docker_db_1 bash
root@ec67f43d81f6:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.17 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

<br>

きちんと永続化されるか確認するために仮のデータベースを作成して、
一旦コンテナを消してからもう一度立ち上げてみて、そのままかどうか確認する。

```sql
# データベース作成
mysql> create database sample;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample             |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> exit
Bye
root@ec67f43d81f6:/# exit
exit
```

```bash
# コンテナ削除
$ docker-compose down
Stopping docker_db_1 ... done
Removing docker_db_1 ... done
Removing network docker_default

# もう一度起動
$ docker-compose up -d
Creating network "docker_default" with the default driver
Creating docker_db_1 ... done
```
もう一度コンテナに入ってmysql見てみてsampleデータベースが残っていればOK
gitのfor-each-refで各ブランチで最後にcommitした人とその更新時刻を一覧表示させる。

普段はあまりそんな状況ないんですがふと今の作業ブランチだけでなくて、<b>すべてのブランチを対象に最新のcommit情報をその更新時刻付きで表示したくなり</b>「うーん、うまいやり方ないかなー」と思ってググったら`git for-each-ref`が使えるとのこと。知らなかった。

#### 公式ドキュメント
[Git - git-for-each-ref Documentation - Git SCM
](https://git-scm.com/docs/git-for-each-ref)

【例】

```sh
git for-each-ref \
--sort=-committerdate \
--count=10 \
--format="
Date: %(color:red)%(authordate:iso)%(color:reset)
%(color:green)[%(authorname)]%(color:reset)
Ref: %(color:yellow)%(refname:short)%(color:reset)
Subject: %(subject)" \
refs/heads refs/remotes

```

上の例だと

- 最新のコミット順
- 10件
- 日付とブランチ名とユーザ名とcommitメッセージ含め

て表示してくれる。
(色とかつけてるからごちゃごちゃしてるけど、整理すればシンプル。）


`for-each-ref`は単体で使うよりこれを使ってブランチ一覧を取得してその上で何かする、みたいな状況で利用されることが多いらしい。

とはいえ、上の例を参考に上手く使えば  
<b>「さっき作業してたブランチなんだっけ？」</b>  
とか  
<b>「あのブランチって誰がいつ切ったの？」</b>  
みたいな調査が楽にできそう。
  
長いので.gitconfigにaliasを追加しておけば良さそう。

```sh
[alias]
	history = for-each-ref --sort=-committerdate --count=10 --format='Date: %(color:red)%(authordate:iso)%(color:reset)\t%(color:green)[%(authorname)]%(color:reset)\nRef: %(color:yellow)%(refname:short)%(color:reset)\nSubject: %(subject)\n' refs/heads refs/remotes
```

![20180504172346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135725/cc5d28b2-570f-7449-b9ac-7740fbbe2540.png)


（[Redash](https://github.com/getredash/redash)のRepo.で試しにやってみた図）

------

...と思ったらすでにこういうのがあるらしい。
まあ、誰かしら作ってるとは思ったけど。

https://github.com/paulirish/git-recent

-----

### 参考

[ブランチ一覧を更新時刻つきで表示したい場合、gitのfor-each-refが使える。 - Bye Bye Moore](http://shuzo-kino.hateblo.jp/entry/2014/07/03/232310)

[ブランチを最新コミット順に並べたら幸せになれた - kakakakakku blog
](http://kakakakakku.hatenablog.com/entry/2015/06/23/123649)


------

この記事は著者のブログからの転載記事となります。

[gitのfor-each-refで各ブランチで最後にcommitした人とその更新時刻を一覧表示させる。 - DOT NOTES](https://taiga.hatenadiary.com/entry/2018/05/04/172538
)
SXG証明書って？

SXG証明書って、なにそれ美味しいの？
という疑問を解消するために調べた内容を、整理のために残しておく。


####SXGを使用しているページをHttpsで通信できるようにするために必要なSSL証明書
- SXG
Signed HTTP Exchangesの略
AMPが自分のドメインで表示されるようになる
AMPでページを表示した時に、キャッシュサーバではなくてオリジナルのWebサイトのURLをアドレスバーに表示できるようになる

- AMPって？
Accelerated Mobile Pagesの略
モバイル向けに軽量、高速に特化したHTMLフレームワーク。OSS。
モバイル端末からネット検索をして、結果に「イナズママーク AMP」が出ていれば、AMP対応されている。

####仕様
DNSにCAA（Certification Authority Authorization )レコードが必要
有効期限は最大９０日
2019年7月現在では対応ブラウザがChrome73以降のみ
取り扱っている認証局も限られている

- CAAレコードって？
Certification Authority Authorizationの略
ドメイン、サブドメインの証明書を発行できる認証局を、制限できる

####参照
RFC
我輩はSXG証明書である。RFCはまだない。

さくらインターネット
https://ssl.sakura.ad.jp/column/amp-sxg/

ヤフーテックブログ
https://techblog.yahoo.co.jp/web/trial_sxg/
Array.fromは実は有能ではないか？

[Array.from](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/from)は配列風オブジェクトや反復可能オブジェクトから配列を作る標準組み込み関数です。

# 主な使い道1 イテレータからの変換
javascriptでは、mapやreduceと言った便利な高階関数がArrayにしか標準実装されていない割に、
MapやSetと言った組み込みオブジェクトから要素を順番に取り出そうとすると大体イテレータや列挙可能オブジェクト経由です。
(それ自体は良い抽象化だと思うんですが、whileとかfor ofになるのが辛い)
イテレータを配列に変換したい場合がしばしばあります。

``` javascript
const array = Array.from(someIterator);
```
そのような場合このようなコードでイテレータから変換が可能です。
(終了するイテレータに限る。また内部的にイテレータを回すので、引数で渡したイテレータは使用済みになります)

# 主な使い道2 配列風オブジェクトからの配列の生成
ただ、上記のイテレータの変換だけなら、スプレッド構文でも同じことが可能です。

``` javascript
const array = [...someIterator];
```
しかし、**配列風オブジェクト**からの配列の生成はこちらでしかできません。

## 配列風オブジェクトとは？
javascriptにおいて、配列風オブジェクトとは以下の要素を満たすオブジェクトです。

1. lengthプロパティを持っている 
2. 数値で添え字アクセス可能

1のlengthは数値でないと正しく動きませんが、2については返すものがundefinedでもいいので、以下のようなコードも動きます。

``` javascript
const array = Array.from({length:3});//[undefined,undefined,undefined]
```
先日、[new Array(数値)で作った配列はundefinedすら入らないので使いにくいという記事](https://qiita.com/xx2xyyy/items/af5c9950c8304e1ba9f4)を書きましたが、
この方法ならundefinedが詰まった任意の長さの配列を作ることが出来るため高階関数との組み合わせも問題ありません。

それどころか、Array.from自体が第二引数としてmap用のコールバック引数を受けてくれます。

``` javascript
const array = Array.from({length:100},(_,i) => i + 1);//1から100までの配列
```

# まとめ
* Array.fromで配列風オブジェクトや列挙可能オブジェクトから配列を作ることが出来る。
* 任意の長さの配列(undefined入り)を使ったり即mapをかけることも可能。
Lightning Web Componentsのやりかた

Lightning Web Componentsの作成方法について三つ種類があります。（Lightningアプリケーションビルダーにコンポーネントを追加）
  ■LWC        ⇒　Visual Studio Codeで実装
      https://trailhead.salesforce.com/ja/content/learn/projects/lwc-build-flexible-apps
  ■Aura       ⇒　カスタムコンポーネント
  ■Visualforce⇒　標準コンポーネントのVisualforce。

次のQittaが一つずつ説明致します。



★Trailhead:単一レコード使用のエラー対策

エラー:
Make sure the 'bearLocation' and 'bearSupervisor' Lightning web components have been added to the Bear record page.

原因:
Label名:Bearレコードページ
Developer名:Bear

対策:
Label : Bear Record Page
Developer Name : Bear_Record_Page
Spring bootでMySQL接続

#環境
Spring tool suite 4.3.2
XAMPP 3.2.4

#摘要
・初投稿。主に自分用にQjitaに残していく。
・Angular と　Spring bootでWeb applicattion開発環境を整えようと四苦八苦してます。 
・JPAは何度やってもハマったので、JDBCで接続。

#書き方
application.propertiesにソースを追加する。
?の前がデータベース名。Timezoneが存在しないというエラーが出たので、
serverTimezone=JSTと記載して突破できた。

```application.propreties
spring.datasource.url=jdbc:mysql://localhost:3306/example?serverTimezone=JST
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
```
依存性の指定

```pom.xml
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web-services</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
```
list内でsql文を指定している

```DbController.java
package com.example.demo;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(path="/jdbc/sample")
public class DbController {

   @Autowired
   JdbcTemplate jdbcTemplate;

   @RequestMapping(path="/users", method=RequestMethod.GET)
   public String index() {
       List<Map<String,Object>> list;
       list = jdbcTemplate.queryForList("select * from heroes");
       return list.toString();
   }

   @RequestMapping(path="/users/{id}", method=RequestMethod.GET)
   public String read(@PathVariable String id) {
       List<Map<String,Object>> list;
       list = jdbcTemplate.queryForList("select * from users where id = ?", id);
       return list.toString();
   }
}
```

#次回
angular⇔spring boot⇔データベース(MySQL）
Redash のクエリを .sql ファイルとしてエクスポートする

Redash の中の人のスクリプトを使うとできました。
[Redash Query Export Tool](https://gist.github.com/arikfr/598590356c4da18be976)
Rddash のバージョンは 1.0.3 、Python のバージョンは 2.7.7 です。

```bash
$ python get-pip.py
$ pip install click requests
$ python query_export.py --redash-url "<your_redash_url>" --api-key "<your_api_key>"
```
Golangのフォーマット指定子についてカンペを作っておいた。package fmt

たびたびGolangのフォーマット指定子まわりについて困惑してfmtのdocを見たり検索したりしているので、知識を整理する目的でGistにまとめておきます。(+vとか#vとか。）

```fmt.go
package main

import (
	"fmt"
	"strings"
)

type user struct {
	id   int
	name string
}

func main() {
	u := user{1001, "taro"}
	fmt.Printf("valInt[%%v]  :  %v\n", u) // デフォルトのフォーマット
	fmt.Printf("valInt[%%+v] : %+v\n", u) // 値が構造体のときフィールド名もつく
	fmt.Printf("valInt[%%#v] : %#v\n", u) // Goの構文表現（=Goのソースコード形式）
	fmt.Printf("Type[%%T]    : %T\n", u)  // 値の型（Type）

	intervalString(20)

	a := 1234
	fmt.Printf("valInt[%%d]  : %d\n", a)      // %d 10進数表記
	fmt.Printf("valInt[%%b]  : %b\n", a)      // %b 2進数表記
	fmt.Printf("valInt[%%o]  : %o\n", a)      // %o 8進数表記
	fmt.Printf("valInt[%%x]  : %x\n", a)      // %x 16進数表記
	fmt.Printf("Boolean[%%t] : %t\n", a == a) // 真偽値(true or false)

	intervalString(20)

	b := 12.0 / 34.0
	fmt.Printf("valFloat[%%f]   : %f\n", b)
	fmt.Printf("valFloat[%%.2f] : %.2f\n", b)

	intervalString(20)

	str := "寿司🍣"
	fmt.Printf("valStr[%%s]  : %s\n", str)  // %s 文字列表記
	fmt.Printf("valStr[%%q]  : %q\n", str)  // %q 文字列表記(ダブルクオーテーション付き)
	fmt.Printf("valStr[%%X]  : % X\n", str) // %X 16進数表記(文字列につき1文字2バイト)

	fmt.Printf("Pointer[%%p] : %p\n", &str) // ポインタ

	s := fmt.Sprintf("str = %s", str) // Sprintfは返り値にフォーマットした
	fmt.Println(s)                    // 文字列を返す

	intervalString(20)
	
	U := '\101'
	fmt.Printf("Unicodeコードポイント[\\101]  : %c\n", U)
	fmt.Printf("ユニコードフォーマット[\\101] : %U\n", U)

	intervalString(20)

	var i interface{} = "print content of interface"
	fmt.Printf("Interface[%%v] : %v\n", i)

}

func intervalString(cnt int) {
	fmt.Println(strings.Repeat("-", cnt))
}

/*
valInt[%v]  :  {1001 taro}
valInt[%+v] : {id:1001 name:taro}
valInt[%#v] : main.user{id:1001, name:"taro"}
Type[%T]    : main.user
--------------------
valInt[%d]  : 1234
valInt[%b]  : 10011010010
valInt[%o]  : 2322
valInt[%x]  : 4d2
Boolean[%t] : true
--------------------
valFloat[%f]   : 0.352941
valFloat[%.2f] : 0.35
--------------------
valStr[%s]  : 寿司🍣
valStr[%q]  : "寿司🍣"
valStr[%X]  : E5 AF BF E5 8F B8 F0 9F 8D A3
Pointer[%p] : 0x40c148
str = 寿司🍣
--------------------
Unicodeコードポイント[\101]  : A
ユニコードフォーマット[\101] : U+0041
--------------------
Interface[%v] : print content of interface
*/
```

## 参考

[fmt - GoDoc
](https://godoc.org/github.com/gophersjp/go/src/fmt)

[Go言語 - %Tや%vの書式で出力される文字列 - 覚えたら書く
](https://blog.y-yuki.net/entry/2017/05/02/000000)

[忘れがちなGo言語の書式指定子を例付きでまとめた - Qiita
](https://qiita.com/Sekky0905/items/c9cbda2498a685517ad0)

[Go by Example: String Formatting
](https://oohira.github.io/gobyexample-jp/string-formatting.html)

-----
この記事は著者のブログからの転載記事となります。

[Golangのフォーマット指定子についてカンペを作っておいた。package fmt - DOT NOTES](https://taiga.hatenadiary.com/entry/2019/09/03/192055)
Promise.allWait:一部のPromiseが失敗しても全てのPromiseが終わるまで待つ

stackoverflow記事[Wait until all ES6 promises complete, even rejected promises](https://stackoverflow.com/questions/31424561/wait-until-all-es6-promises-complete-even-rejected-promises)と同じニーズあった、Promise.allで一部のPromiseが失敗しても全てのPromiseが終わるまで待って欲しい、失敗した場合は最後に纏めて失敗理由の配列をrejectで返させたい。
本文はそれらの調査結果と対策をメモする。

### Promise.all

Promise.allの仕様は一部のPromiseが失敗したら、他のPromiseの結果を待たずに直ちにrejectedされます。普通はそれで十分だが、ある時、やっぱり全て終わってから何かをするという時に、Promise.allだけでは無理。

### Promise.allSettled

2019.9.12現在また仕様策定中（Stag4 Draft）のPromise.allSettledは全て終わったかどうかの意味であるため、結果は全て処理成功`resolved`になる。その結果Objectの`status`によって該当Promiseが成功か失敗かを判別する。
自分が欲しいのは、失敗した場合もちゃんとrejectedを返すことので、それでも行けない。

### 独自の実装

やはり独自で実装しないといけなさそう。以下１つの例。

```javascript

/**
 * Promise.allと同じように渡された全てのPromiseを非同期で処理する。
 * 一部のPromiseがrejectedになっても全てのPromiseの結果が出るまで待つ。
 *
 * @returns 全てのPromiseがresolvedの場合、Promise.allと同じでPromise.resolve(results)を返す
 *          一部のPromiseがrejectedの場合、Promise.reject(reasons)を返す
 */
async function promiseAllWait(promises) {
  // 失敗フラグを立てる
  const wrappedPromises = promises.map((promise) => {
    return promise.then((value) => {
      return {
        isFailed: false,
        value,
      };
    }).catch((reason) => {
      return {
        isFailed: true,
        reason,
      };
    });
  });

  // 非同期処理をする
  const results = await Promise.all(wrappedPromises);

  // 結果を分ける
  const [values, reasons] = results.reduce(([valueArray, reasonArray], result) => {
    if (result.isFailed) {
      reasonArray.push(result.reason);
    } else {
      valueArray.push(result.value);
    }
    return [valueArray, reasonArray];
  }, [[], []]);

  // rejectedの場合
  if (reasons.length) {
    return Promise.reject(reasons);
  }

  // resolvedの場合
  return Promise.resolve(values);
}

```

promiseAllWaitを使えば思った通りのフローでプログラミングできる。

```javascript

const promises = [p1, p2, p3];
promiseAllWait(promises).then((values) => {
  // 全てが成功した場合の処理
}).catch((reasons) => {
  // 全てが処理完了、一部が失敗した場合の処理
});

```

### 参考情報

- [Wait until all ES6 promises complete, even rejected promises](https://stackoverflow.com/questions/31424561/wait-until-all-es6-promises-complete-even-rejected-promises)
- [MDN Promise.all](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)
- [MDN Promise.allSettled](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled)
- [fulfilled, rejected, settled...　Promiseの用語、全部分かりますか？](https://qiita.com/uhyo/items/a9f6e70f43287cc0f52e)
heroku schedulerで任意の曜日のみ実行する方法

# はじめに
heroku schedulerの実行指定を曜日単位で実行するための方法です。

# heroku scheduler
heroku schedulerの実行日時の指定は大きく3種類。

- Every 10 minuts
- Every hour at..
- Every day at..

<img width="397" alt="スクリーンショット 2019-09-07 15.34.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239829/1fd939b3-7333-b894-0c12-06d96b9b36ee.png">
・毎週○曜日だけ実行したい
・毎月○日だけ実行したい
みたいなことを考えたことありませんか？

# 指定方法
例： 火曜日だけあるバッチをコールしたい
`[ $(date +%w) = 2 ] && rake ◯◯◯：◯◯◯`

|フォーマット|出力値|
|:--|:--|:--|
| %a | 日, 月, 火, 水, 木, 金, 土 |
| %A | 日曜日, 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日 |
| %u | 1 〜 7。1が月曜日、7が日曜日 |
| %w | 0 〜 6。0が日曜日、6が土曜日 |
自分のcommit logだけを見たい！author,committerの違いとは。


チームで開発しているレポジトリの場合、自分もしくは他の誰かがコミットした情報のみをまとめて確認したいというケースが稀にある。

```sh
$ git log --author=[user_name]
```
もしくは

```sh
$ git log --committer=[user_name]
```

で検索ができる。

と、ここまでは検索すればすぐに出てくるが、この`author` or `committer` の違いをわかっていない分にはこれだとなんとももどかしい。ということで調べた。

-----

git はすべてのcommitにAuthorとCommitterの情報を記録している。<br>

```
Author - コードを書いた人
Committer - リポジトリにコミットした人
```

この違いは過去のコミットを操作した際などに重宝される。<br>

つまり、ある人がコードを書いてそれをコミットしたあとに`git commit --amend` などで他の誰かが改変した場合にもAuthorは変更されず、あくまでCommitterのみが変更される。<br>

ちなみにAuthorごと過去を改変することも可能なようだが、あまり利用ケースが思いつかない。その人がいた事自体を消したい場合、あるいは見せたくない本名やアドレスが含まれていた場合などだろうか…？<br>

通常の `git log` コマンドではAuthorしか表示されない。<br>

Committerも一緒に表示させるにはoptionをつけて `git log --pretty=full` などとするとよい。

参考）

[Git - git-log Documentation - Git SCM](https://git-scm.com/docs/git-log)

[Difference between author and committer in Git? - Stack Overflow
](https://stackoverflow.com/questions/18750808/difference-between-author-and-committer-in-git)

-----
この記事は著者のブログからの転載記事となります。

[自分のcommit logだけを見たい！author,committerの違いとは。 - DOT NOTES](https://taiga.hatenadiary.com/entry/2019/09/11/182828)
千葉県の停電情報が気になりすぎたのでGASでスクレイピングしてSlackに投げてみた




昨晩のゲリラ雷雨で一時的に軒数増えたりしてずっと気になってた
[TEPCO停電情報の千葉県のページ](http://teideninfo.tepco.co.jp/html/12000000000.html)

結構な勢いで復旧してるので現場の方お疲れ様です。
定期的にF5押して見てたけどめんどくさいのでスクライピングして件数を取ってこようという考えに
以下を~~パク~~参考にさせていただきました

 [【GoogleAppsScript】【Slack】電車遅延情報post](https://qiita.com/H_Neco/items/937ecde84bde9c1c1710)


```

function teidenInfo() {
 
  var yahoo = "http://teideninfo.tepco.co.jp/html/12000000000.html";
  var response = UrlFetchApp.fetch(yahoo);
  var myRegexp_line = /<div id="area_right">([\s\S]*?)<\/div>/i;
  var line_html = myRegexp_line.exec(response.getContentText("shift-jis"));
  var line_list = line_html[0];
  
  var now = new Date();  
  var time = Utilities.formatDate(now, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss');
  
  // 文字の整形
  var line_base = line_list.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g,'')
  var line = "千葉県:" + time + " 現在\n" + line_base
 
    function postMessage(message, hookPoint){
    var payload = {
      "text": message,
      "channelId": '#information',
      "userName": 'train-info',
      "icon_emoji": ':train:'
    }
    var options = {
      "method": "POST",
      "payload": JSON.stringify(payload),
      "headers": {
      "Content-type": "application/json",
      }
    }
    var response = UrlFetchApp.fetch(hookPoint, options);

    if (response.getResponseCode() == 200) {
      return response;
    }
      return false;
  }
    postMessage("```" + line　 + "```",'https://hooks.slack.com/services/[SLACKのソレ]');
}

```

あとはほっとくと以下のように定期的に件数をSlackに吐いてくれます、アイコンは参考元そのまま

![スクリーンショット 2019-09-12 10.31.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17843/65a305ab-d05c-f962-e26b-a16170eb1c74.png)
dockerでchrome起動時にページが表示されない、アニメーションがカクカクする。「Aw, Snap! Something went wrong while displaying this webpage.」

普通にChromeを使っていても起こることがある、「Aw, Snap! Something went wrong while displaying this webpage.」。
原因はChromeのメモリ不足にあるようです。


# 原因

dockerでchrome立ち上げる時は、memory割り当てがデフォルトで64MBになるみたいです。

# 対策
回避するには、chrome起動時にオプション`--disable-dev-shm-usage`を追加することで変更できます。
### chrome65以下の場合
docker起動時に`docker run --shm-size=1gb`でいけます。(1gbのところは任意の値を入れてください)
https://developers.google.com/web/tools/puppeteer/troubleshooting#tips
### ECSでFargate起動タイプでない、かつWindowコンテナでない
Linuxパラメータのなかで、sharedMemorySizeオプションを利用できます。Fargateの場合は、上記の対応で対応する形になります。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html 

ECSではタスク定義のリージョン設定でコンテナに対して、メモリやGPUを設定できます。
「そもそも、ECSのメモリが足りねえよ！」って方はこちらを変更してください。ECSの価格に直結する部分なので、慎重にどうぞ。


他にもキャッシュクリアを行なったり、メモリを節約したり、Googleアカウントの同期停止やコンテナを作り直したりなど、対応方法はいくつかあるのですが、個人的にはコマンド一つで解決できる今回紹介した方法が一番楽でした。

#### その他対応方法一覧
[メモリ使用量を減らし軽くする方法8選| Aprico](https://aprico-media.com/posts/2094)
[タブのメモリを自動解放 - PC設定のカルマ](https://pc-karuma.net/google-chrome-improved-memory-use-enable-tab-discarding/)
[Dockerで使っているコンテナを作り直す方法 - Qiita](https://qiita.com/ponsuke0531/items/9336172e812e7271a966)
javascript 同期処理メモ

- 同期処理

```html

<script>
// 処理を順番に実行する
const processA =function() {
  return new Promise(function(resolve, reject) {
    console.log("processA");
    // 処理が終わったことを知らせる
    resolve();
  })
}


const processB = function() {
  return new Promise(function(resolve, reject) {
    console.log("processB");
    resolve();
  })
}


const processC = function() {
  return new Promise(function(resolve, reject) {
    console.log("processC")
    resolve();
  })
}

// .thenで後に続く処理を書く
processA()
  .then(processB)
  .then(processC)
</script>




<script>
/* for の場合 **************************************************/
function sleep(time) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve();
        }, time);
    });
}


(async () => {
    const a = [1,2,3,4,5];
    // foreachだと非同期になってしまう
    for(let i of a) {
        // new Promiseオブジェクトをawaitすると待機可能になる
        await sleep(1000);
        console.log(i);
    }
})();
</script>
```
- foreach内でawait

```javascript
// いける
Array.foreach(async function(data, index){
    await 関数処理
});

// いける
Array.foreach(async (data, index) => {
    await this.関数処理
});

// 書き方は統一させたほうが良い

```
pythonでAWSのKMSで暗号化・複合化

# はじめに
pythonでAWSのKMS(Key Management Service)を使用して暗号化・複合化をしたのでメモ。


# 暗号化
下記の関数を使用する。
keyIdは、マネジメントコンソールから確認できる「キーID」。
plaintextが暗号化したい文字列。


```python
from boto3 import client
import base64

# 暗号化した文字列を取得
def getEncryptStr(keyId, plaintext):
    kms = boto3.client('kms')
    enc = kms.encrypt(
                    KeyId = keyId,
                    Plaintext = plaintext
                )['CiphertextBlob']

    return base64.b64encode(enc).decode('utf-8')

```

# 複合化
下記関数を使用する。

```python
from boto3 import client
import base64

# 複合化した文字列を取得
def getDecryptStr(plaintext):
    plaintext = base64.b64decode(plaintext)
    kms = boto3.client('kms')
    return kms.decrypt(
                CiphertextBlob = plaintext
            )['Plaintext'].decode('utf-8')
```
Codableの保存にまだ JSON・Plistを使ってるんですか？



`Codable`な`struct`データを保存に使うことって結構ないですか？

最近は `PropertyListEncoder` なども標準ライブラリに入り、ユーザーデータの保存にも使われているように感じます。

しかし`JSON`も`PropertyList`もテキスト形式のデータであり、保存すると容量が大きくなります。なので、最大それらの**数万倍**軽くなる`BoxEncoder`を作ってみました。



## まず実際どうなるか

`Person` というデータを作り、そのデータ10万個を保存した時の値です。
このデータだと4万倍小さくなりました。

| Type  | File Size |
| ----- | --------- |
| Box   | <font color=red>126 B </font>   |
| JSON  | 5.8 MB  |
| Plist | 5.4 MB  |

```swift
// Codableなデータ
struct Person: Codable {
  let name: String 
  let age: UInt8
  let birth: Conutry
  
  struct Conutry: Codable {
    let name: String
    let id: UInt8
  }
}

let alice = Person(name: "Alice", age: 16, birth: .init(name: "UK", id: 12))

/// 100000 データ
let people = Array(repeating: alice, count: 100000)
```

(ランダム性が大きともっと大きくなります。)



## 使用方法

`pod` 経由でインストールできます。

```ruby
pod 'BoxData'
```



 `BoxEncoder` と `BoxDecoder` は `JSONEncoder` や `PropertyListEncoder` などと同様に使えるので、すでにこれらを使っていた場合は、名前以外に変更するとことは一切ありません。

```swift
do {
  // Encoding
	let data = try BoxEncoder().encode(people)
  
  // Decoding
	let decoded = try BoxDecoder().decode(Array<Person>.self, from: data)
  
} catch {
	print(error)
}
```



JSON・Plistと異なり、単一のデータも保存できます。

```swift
let bool   = try encoder.encode(true)
let string = try encoder.encode("Hello Box Format!")
let int    = try encoder.encode(1000_0000)
let array  = try encoder.encode([12, 13, 14, 15])
```


## なぜ容量が小さいか

- バイトフォーマット
- 構造の保存
- `gzip` 圧縮

という理由です。


#### バイトフォーマット

まず、JSON・Plistなどと異なり、データをバイト列として保存します。更に、適切に型 (`UInt8`・`Int16`など)を使い分けることで更に容量を軽くできます。



#### 構造の保存

JSON・Plistなどでは配列データなどについても全ての構造を保存しますが、Boxではヘッダに全てのデータ構造を書き込むので繰り返し構造データを書き込むことがありません。



今回のコードは  [https://github.com/ObuchiYuki/BoxData](https://github.com/ObuchiYuki/BoxData) においてあります。

結構頑張ったので使ってくれると嬉しい
無線センサ

ソーラーパネルとリチウムバッテリーを使ったオフグリッド電源を作る必要があり、これの検証用に無線式のセンサを作りました。
屋外に設置したオフグリッド電源の電圧・電流・筐体温度などを計測して無線でPCに送信します。
RL78G13＋IM920＋INA260＋LM61の組合せです。

[**こちらにまとめました**](https://yokaton.com/mcu-rl78-rsen/)

18650一本で３ヶ月ほど動作します。
ただ保存容量が足りないので、次に作るときはRAMの多いCPUを使いたいかも。
タプルの連結 | concatenate tuples

# やりたいこと
- (1, 2)に3という要素を追加して、(1, 2, 3)にしたい

# どうやる？
配列に要素を追加していくような気持ちで、
ついつい誤った直観で下記のように書いてしまう

```python
a = (1, 2)
b = 3
# として、
# (1, 2, 3)にしたくて
# 下記のように書いてしまう

c = (a, b)

print(c)
> ((1, 2), 3)
# tupleの入れ子になってしまった
```

# Pythonの気持ち

「tupleとスカラーを括弧()でタプってるので、こう返した」

# 直観を修正する

- tupleとtupleにして、連結すればよい

```python
a = (1, 2)
b = (3,)    #末尾のカンマが大事。これがないとtupleにならない。
# として、

c = a + b
> (1, 2, 3)
# できた
```

# おわりに
Pythonのいちいち型宣言をしなくて済むところは、コードがすっきりして好き。
型はメモリ側実装の話でアルゴリズムの本筋ではないので。

しかし、やっぱり型でつまづくなぁという印象。
```if hogehoge == '1':```
を あれー？たしかに、 
```hogehoge = 1``` なのになぁ？？ってつまづいたりする。
cloudwatchで毎朝9時に実行するcron式

# はじめに
日本時間の場合に9時間の誤差があることをたまに忘れてしまうのでメモ。
※AWSの時刻は、UTCであるため。

# cron式
9時間前の時間を設定するだけ。

```text
 0 0 * * ? *
```

# 最後に
動かしてから、あっやべ時差忘れてたってことがちょこちょこありました。
Vueのisとv-modelは併用してはいけない

# 事象

`is`属性で要素名を指定しているコンポーネントに対して、`v-model`を使用すると、`v-model`が機能しなくなりました。

どういうことかは例を見ていただくと早いです。

## 正常

```html
<input type="text" v-model="value">
```

> https://jsfiddle.net/simochee/fjdvowr7/4

## 異常

```html
<div is="input" type="text" v-model="value">
```

> https://jsfiddle.net/simochee/fjdvowr7/5

# 原因

なぜこんな挙動になるのか、それを解決する記述を見つけることはできませんでした。

ともかく`is`と`v-model`は併用しないよう気をつけましょう。

# おまけ

疑似`v-model`の場合は更に奇妙な挙動になりました。

初期値は設定されるし、入力値は設定できるものの、代入による値を上書きできなくなります。

```html
<div
  is="input"
  type="text"
  :value="value"
  @input="value = $event.target.value"
>
```

> https://jsfiddle.net/simochee/fjdvowr7/7/
論理削除を簡単に導入！　 (Rails)

#初めに
簡単に論理削除を導入出来ましたので、初学者、論理削除を導入したい方向けにメモを残します。

#論理削除とは
削除方法には、物理削除と論理削除があります。
物理削除は、DB内からデータを削除します。
論理削除は、対象のデータに削除されたという印（フラッグ）を付け、ユーザ側からは削除された様に見えます。
論理削除の利点は、いつでもデータを復元できる事です。

#開発環境
・ruby-2.5.5
・Rails 5.2.3

導入済みgem
・devise

#導入方法
今回はユーザ退会に対する論理削除の為、``gem:devise``を導入済みである事を前提としています。

##gemの導入

```ruby:Gemfile
gem 'paranoia'
```
gem追加出来たら、**`bundle install`**して下さい。

##カラム追加
Usersテーブルに`deleted_at`と言うカラムを追加します。

```
$ rails g migration AddDeletedAtToUsers deleted_at:datetime
```

すると、以下の様なマイグレーションファイルが生成されると思います。

```ruby:xxxxxxxxx_add_deleted_to_users
class AddDeletedAtToUsers < ActiveRecord::Migration[5.1]
  def change
    add_column :users, :deleted_at, :datetime
  end
end
```

正しければ、**`$ rails db:migrate`**して下さい。

##モデルの編集
```ruby:user.rb
acts_as_paranoid #これを追加
```

以上で、paranoiaの導入、設定は終わりです。

#動作テスト（コンソール）
```
$ rails c #コンソール起動

> user = User.find(1)
> user.destroy #削除コマンド
```
再び、**`user = User.find(1)`**をしても、ユーザは見つからないと思います。
※物理削除をしたい場合は、**`user.really_destroy!`**

#削除データの確認
```
> User.only_deleted
```

#削除データの復元
```
> user.restore
```

#参考資料
・[【Rails】paranoiaで論理削除を実装する](https://remonote.jp/rails-gem-paranoia)
・[paranoiaのgithub](https://github.com/rubysherpas/paranoia)
【out of memory kill process】OOM Killerさんに殺されたくない

#はじめに
APIのレスポンスで500エラーが返ってきていました。
調べると`/var/log/message`に`out of memory kill process`とログがありました。
プロセスがOOM Killerさんに殺されたせいでエラーが起きていたようです。
私のCentOS環境では、以下コマンドで殺されたプロセスが確認できました。

```
$ sudo cat /var/log/messages | grep Killed
```
大事なプロセスが殺されては困るので殺されないようにします。

#OOM Killerとは
Linuxでシステムが実メモリーと仮想メモリー空間（スワップ領域）を使い切り、メモリ不足（OOM(Out of Memory)）に陥った場合、1つ以上のプロセスを強制終了して空きメモリを確保するLinuxカーネルの機能のことです。

#OOM Killerに殺されないようにする
OOM Killerは、各プロセスのoom_score値が高いものを、殺すプロセスとして選択します。
殺される可能性の高いプロセスは`dstat`で確認できます。
dstatのインストール

```
$ yum install dstat
```

殺される可能性の高いプロセスの確認

```
$ dstat --top-oom
```
各プロセスの oom_score値は、/proc/[pid]/oom_scoreで確認できます。
次のコマンドを実行すると、まとめて確認できます。

```
$ grep "" /proc/*/oom_score
```

oom_score値は、oom_adj値によって調整され、oom_adj値は -17～15の範囲の値をとるようです。
-17は特別な意味を持ち、そのプロセスは OOM Killerの対象から外れます。
[E.3.12. /proc/PID - Red Hat Customer Portal
](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-pid)
そのため、プロセスが殺されないようにするには、そのプロセスのoom_adj値に-17を指定すれば良いことになります。
殺されたくないプロセスのPIDを指定して以下コマンドを実行します。

```
$ echo "-17" > /proc/[pid]/oom_adj
```

#追記(2019/09/13)
殺されたくない処理を`$ /your/heavy/command arg1 arg2 arg3 &`のように起動する場合、以下のようにシェルスクリプトにして実行すると便利です。

```non_oomkiller_do.sh
#!/bin/bash
$@ &
echo "-17" > /proc/$!/oom_adj
```

```
$ ./non_oomkiller_do.sh /your/heavy/command arg1 arg2 arg3
```

これによって、コマンド実行時にそのプロセスが殺されないようにできます。

#おわりに
これでOOM Killerさんに殺されなくなりました。

#参考
https://vogel.at.webry.info/201605/article_1.html
https://qiita.com/konpyu/items/20d1989d1251d805cf3b
https://qiita.com/laikuaut/items/1daa06900ad045d119b4
webarenaでubuntu その47

#概要

webarenaでubuntu18.04やってみた。
apache2.4 php7.2 perl5.26やってみた。
phpのsession cookieをperlで、読んでみた。

#サンプルコード


```
#!/usr/bin/perl
	use CGI;
	print "Content-type: text/html\n\n";
	print "<html>\n";
	$q = new CGI;
	$cookie = $q->cookie('PHPSESSID');
	if ($cookie)
	{
		print $cookie;
	}
	print "</html>\n";
```

以上。
EC2でたてたAmazonLinuxでcertbotを使う

## やりたかったこと

Certbotを使ってAmazonLinux2と[Let's Encrypt](https://letsencrypt.org/)間でサーバー証明書を取得したかった


## TL;DR

AmazonLinux2はCerbot非対応のため、AWS公式の下記の記事を参考にセットアップするのが無難...

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/SSL-on-amazon-linux-2.html#letsencrypt

## まとめ

- AmazonLinux2は割と頻繁に更新がかかるので本記事では詳細な手順は記述しないことにしました
- もし困っている方いましたらコメント欄で教えてください :)
DonkeyCar 3.1.0 コントローラーの左右のスティックを入れ替える

#使用しているコントローラーを確認
~/mycar/myconfig.py
の125行目
CONTROLLER_TYPE
を書き換えていなければps3の設定を使用している．
#ソースコードの変更
~/project/donkeycar/donkeycar/parts/controller.py
をテキストエディタで開く．
使用しているコントローラーのクラスを探す．
ps3なら964行目の
class PS3JoystickController(JoystickController):
のクラスを使用しているので，
クラス中のスティックの定義をしている1009,1010行

        self.axis_trigger_map = {
            'left_stick_horz' : self.set_steering,
            'right_stick_vert' : self.set_throttle,
        }

のleftとrightを入れ換える．

        self.axis_trigger_map = {
            'right_stick_horz' : self.set_steering,
            'left_stick_vert' : self.set_throttle,
        }

もしmyconfig.pyで
CONTROLLER_TYPE
をF710に変更してあれば，1164,1165行を書き換える．

以上
GitLabCIを導入するときにハマった事・疑問に思った事などのメモ

以下は全てrunnerをmacOSのマシンにしてる。

# 導入・起動法
GitLab側の設定はこちらの記事がわかりやすかった。<br>(androidのプロジェクトの話になっているけど、.gitlab-ci.ymlのテンプレート作成部分以外はどの言語のプロジェクトでも参考になると思う。)
https://qiita.com/tetsukay/items/91a03b38af8c7eec9551

Runnerの生成は公式ドキュメントに従う。
https://docs.gitlab.com/runner/register/index.html

# runnerの設定をrunnerしてるマシンから見るには

```bash

cat ~/.gitlab-runner/config.toml
```

で見れる。

# ひとつのマシンで複数回 gitlab-runner register を呼んでしまったけどそれぞれの設定はどこで見るの？
- 上記の~/.gitlab-runner/config.tomlの中の[[runners]]]の項目がgitlab-runner registerで作ったrunnerと1対1対応になっている。
- また、GitLab上ではSettings > CI/CD > Runnersで見れる。
- ちなみにconfig.tomlの[[runners]]]を削除したり、nameを変更したりしてもGitLabのSettingsから見える方は特に変更が反映されることはないっぽい。

# gitlab-runnerが動いているか見たい
runnerrunnerにしてるマシンのターミナルから

```bash

gitlab-runner status
```

で確認できる。
# Runnerはちゃんと動いてるはずなのになぜか全然実行されない！
プロジェクトに追加した.gitlab-ci.ymlファイルの中でジョブにtagsパラメーターを設定しているかチェックしよう。

- 設定していない場合 → Settings > CI/CD > Runnersで各Runnerの設定の編集ボタンを押し、「Run untagged jobs」にチェックを入れる
 
 - これにチェックが入っていると、プロジェクトに追加した.gitlab-ci.ymlファイルの中でtagsパラメーターを設定していないジョブを実行できるようになる。
 - 私はこれに気が付かなくて5時間以上溶かしました。

- 設定している場合 → .gitlab-ci.ymlファイルの中でジョブに設定したtagsパラメーターの値と、Runnerのtagの値が一致しているかチェック
 - 一致していなかったらRunnerのタグの設定か.gitlab-ci.ymlファイルのどちらかを修正して一致させる。
 - Runnerのタグの設定はSettings > CI/CD > Runnersで各Runnerの設定の編集ボタン から編集できる。

# tagとは
GitLabCIを使うためにプロジェクトに追加する.gitlab-ci.ymlファイルの中で各ジョブにtagsフィールドを足すことでタグをつけることができる。Runnerでは、自身の持つtagと同じタグを持つジョブだけ実行出来る。複数RunnerをRunnerを登録しているときにジョブごとに実行Runnerを振り分けたりするためにある？

# テストビルド時にrunnerがサブモジュールを見れていない？
.gitlab-ci.ymlのビルドステージのジョブ、.gitlab-ci.ymlのトップに以下の変数を設定する

```yml
variables:
    GIT_SUBMODULE_STRATEGY: "recursive"
```


# 参考になるもの
- GitLab側の初期設定<br>
https://qiita.com/tetsukay/items/91a03b38af8c7eec9551
- Runnerの生成(公式) <br>
https://docs.gitlab.com/runner/register/index.html
- 一番簡単なconfig.toml ファイルの制作例が載っている。読むと何となくconfig.toml ファイルの作法や思想がわかる。<br>
https://kore1server.com/351/GitLab+CI%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BC%88%E7%BF%BB%E8%A8%B3%EF%BC%89
- config.toml ファイルの各細かいパラメーターの設定について(公式) <br>
https://docs.gitlab.com/runner/configuration/advanced-configuration.html
- config.toml ファイルの各細かいパラメーターの設定について(公式) <br>
https://docs.gitlab.com/ee/ci/yaml/#artifactsreports
- tagsを正しく設定しなきゃダメだよ、というQA(公式)<br>
https://forum.gitlab.com/t/activated-specific-runner-is-not-working/7002
- その他参考にしたもの<br>
 - 社外からは別URLでクローンしなきゃいけない時の対処<br>
https://qiita.com/makies/items/5d5b5bab3de59b2f805c
 - runnerがサブモジュールを見れていない時の対処法<br>
https://qiita.com/knjname/items/c69711dbe8ee17505298
#Rails の ActiveJob と resque / sidekiq などの関係がわからないけど、なんのために必要なの？

https://railsguides.jp/active_job_basics.html#ジョブを作成する-ジョブを作成する

># 4.1 バックエンド
>Active Jobには、Sidekiq、Resque、Delayed Jobなどさまざまなキューイングバックエンドに接続できるアダプタがビルトインで用意されています。利用可能な最新のアダプタのリストについては、APIドキュメントのActiveJob::QueueAdapters を参照してください。

># 4 ジョブを実行する
>production環境でのジョブのキュー登録と実行では、キューイングのバックエンドを用意しておく必要があります。具体的には、Railsで使うべきサードパーティのキューイングライブラリを決める必要があります。 Rails自身が提供するのは、ジョブをメモリに保持するインプロセスのキューイングシステムだけです。 プロセスがクラッシュしたりコンピュータをリセットしたりすると、デフォルトの非同期バックエンドの振る舞いによって主要なジョブが失われてしまいます。アプリケーションが小規模な場合やミッションクリティカルでないジョブであればこれでも構いませんが、多くのproductionでは永続的なバックエンドを選ぶ必要があります。

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2411








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#AWS でルート権限ではなく、権限を絞ったIAMユーザーのアクセスキーを作成する画面キャプチャの連続である

- コンソール
- IAM
- ユーザーの追加 
- グループの作成で、使えるサービスを選ぶ
- ユーザーにグループを割り当てる
- タグの選択はスキップする
- アクセスキーをCSVダウンロード

![image](https://user-images.githubusercontent.com/13635059/64739947-a5e57100-d52e-11e9-8cce-be1d9a361645.png)
---
![image](https://user-images.githubusercontent.com/13635059/64739968-b990d780-d52e-11e9-9eb8-62d6eee81626.png)
---
![image](https://user-images.githubusercontent.com/13635059/64739991-cdd4d480-d52e-11e9-8ccd-9743e6decf58.png)
---
![image](https://user-images.githubusercontent.com/13635059/64739996-d3321f00-d52e-11e9-857a-68a9bdbc2010.png)
---
![image](https://user-images.githubusercontent.com/13635059/64740040-f78dfb80-d52e-11e9-9b87-748bbcf5a27a.png)
---
![image](https://user-images.githubusercontent.com/13635059/64740044-f957bf00-d52e-11e9-9dd4-d0e1593a686f.png)
---
![image](https://user-images.githubusercontent.com/13635059/64740048-fb218280-d52e-11e9-9794-f52bb26a2c6c.png)
---
![image](https://user-images.githubusercontent.com/13635059/64740060-0379bd80-d52f-11e9-9167-575bbdfb43ec.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2412








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Railsめも　三つの設計理念と処理の流れ


##はじめに
Railsの設計概念や処理の流れの基本的な部分を備忘録として残しておきます。

##Rails３つの設計理念

###CoC（Convention over Configuration）
「設定より規約」という意味。

従来のフレームワークのように設定を大量に記述するのではなく、ルールに則って開発することで、余計な設定を書かずに出来るだけ少ない労力でプログラミングをしよう！ということ。

ユーザークラスを「User」、データベースを「users」と複数形にすることでRailsは自動的にクラスとデータベースを繋ぐので設定などを書く必要はなくなる。

###DRY（Don’t Repeat Yourself）
「同じことを繰り返さない」という意味。

情報は複数の場所に記載せず一箇所に記述をすることで、変更や修正をする場合もスムーズに行うことができる。

###  REST（Representational State Transfer）

RESTとはWebアプリケーションなどにおける設計概念の一つであり、
RDBMSのCRUD（create/read/update/delete）]
HTTPRequestの各メソッド（GET/POST/PUT/DELETE）
を利用して開発することで意味のつかみやすいURLを設計することができる。

##mvcとそれぞれの役割

mvcとはmodel/view/controllerの頭文字であり、アプリケーションをモデル（データを扱う部分）、ビュー（ユーザーに見える部分）、コントローラ（ユーザーからのリクエストに対してモデルやビューと連携を取る部分）に分割するものである。

###model
Railsアプリケーションの場合はデータベース毎にモデルが用意されており、利用者のリクエスト（url）で呼び出されたアクションは、モデルを介してSQL文を発行してデータベースとやりとりを行いデータを取得したり格納したりする。
データの保持はAction Recordというコンポーネントが担当。

###view
ビューは変数を介して渡されたデータを用いてHTML文書を作成しコントローラへ返す。
アプリケーションの見た目を制御する役割を持つ。
Viewに当たるのがAction View。

###controller

コントローラはユーザーからのリクエスト(url)を受けて、モデルに適切た動作を要求して、またviewを組み合わせる役割を持つ。
controllerに当たるのが。、Action Controllerとなる。

##Rails処理の流れ（リクエストからレスポンスまで）

![rails.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365406/2301d4dc-657f-b92a-ee8a-408ba8af280d.png)

上の図で説明すると

1:リクエストがHTTPサーバを通る
2:Railsアプリケーション内に入ると、コントローラのアクションを案内するルータがいる
3:ルータにリクエストを伝え、コントローラ・アクションに進む
4:アクションで、必要な場合はモデルに操作を要求する
5:モデルがDBで適切な動作をする、データの取り出し又は登録
6:データはアクションの中のインスタンス変数の中に渡される
7:ビューに変数が渡り、HTMLが生成される
8:生成されたHTMLが HTTPサーバを通ってレスポンスとして送られる

##参考サイト
[Railsの処理の流れを理解しよう] (https://diveintocode.jp/tips/process_flow)
clear text(cleartext) と plain text(plaintext)

https://tools.ietf.org/html/rfc4949

* clear text

```
    $ clear text
      1. (I) /noun/ Data in which the semantic information content
      (i.e., the meaning) is intelligible or is directly available,
      i.e., not encrypted. (See: cleartext, in the clear. Compare:
      cipher text, plain text.)

      2. (O) /noun/ "Intelligible data, the semantic content of which is
      available." [I7498-2]

      3. (D) /noun/ Synonym for "plain text".

      Deprecated Definition: IDOCs SHOULD NOT use this term as a synonym
      for "plain text", because the plain text that is input to an
      encryption operation may itself be cipher text that was output
      from a previous encryption operation. (See: superencryption.)

   $ cleartext
      1. (O) /noun/ Synonym for "clear text" [I7498-2].

      2. (I) /adjective/ Referring to clear text. Usage: Commonly used
      instead of "clear-text". (Compare: ciphertext, plaintext.)
      3. (D) /adjective/ Synonym for "plaintext".

      Deprecated Definition: IDOCs SHOULD NOT use this term as a synonym
      for "plaintext", because the plaintext data that is input to an
      encryption operation may itself be ciphertext data that was output
      from a previous encryption operation. (See: superencryption.)
```

* plain text

```
    $ plain text
      1. (I) /noun/ Data that is input to an encryption process. (See:
      plaintext. Compare: cipher text, clear text.)

      2. (D) /noun/ Synonym for "clear text".

      Deprecated Definition: IDOCs SHOULD NOT use this term as a synonym
      for "clear text". Sometimes plain text that is input to an
      encryption operation is clear text, but other times plain text is
      cipher text that was output from a previous encryption operation.
      (See: superencryption.)

   $ plaintext
      (I) Data that is input to and transformed by an encryption
      process, or that is output by a decryption process.

      (C) Usually, the plaintext input to an encryption operation is
      cleartext. But in some cases, the input is ciphertext that was
      output from another encryption operation. (See: superencryption.)
```


```
2.4. Definition Type and Context

   Each entry is preceded by a character -- I, N, O, or D -- enclosed in
   parentheses, to indicate the type of definition (as is explained
   further in Section 3):
   -  "I" for a RECOMMENDED term or definition of Internet origin.
   -  "N" if RECOMMENDED but not of Internet origin.
   -  "O" for a term or definition that is NOT recommended for use in
      IDOCs but is something that authors of Internet documents should
      know about.
   -  "D" for a term or definition that is deprecated and SHOULD NOT be
      used in Internet documents.
```

参考

* https://www.ipa.go.jp/security/rfc/RFC2828-03CJA.html#cleartext (RFC2828 の和訳)
* https://www.ipa.go.jp/security/rfc/RFC2828-03CJA.html#plaintext (RFC2828 の和訳)