OmniAICreator/Qiita-1.07M huggingface dataset:
[Apex] 承認プロセスでロックされた見積と商談の同期

## 見積のレコードロック(承認プロセス)の影響
* 見積がレコードロックかかると、見積品目の作成編集削除ができなくなる。
* 見積がレコードロックされていると商談との同期ができない。
* 同期している見積レコードがロックされていると商談商品の作成編集削除ができなくなる。

## Apexで見積と商談を同期させる
* 基本的には、Apexで見積と商談を同期させたいときは、商談のSyncedQuoteIdに見積IDを設定するだけで良い。
* 見積がレコードロックされている場合は、レコードロックを解除してから同期を行う必要がある。
    * レコードロックの解除は、ログインユーザがロックされているオブジェクトのすべて編集権限をもっているか、Apexの `without sharing` が必要。
    * Apexでレコードロックを解除する場合、[Approvalクラス](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_approval.htm)を使用する。レコードロック、ロック解除はDMLとして処理されるため、ガバナ制限に注意。

```java
Quote approvedQuote = [SELECT OpportunityId FROM Quote WHERE Id = :objId];
Approval.unlock(approvedQuote);
update new Opportunity(Id = approvedQuote.OpportunityId, SyncedQuoteId = approvedQuote.Id);
Approval.lock(approvedQuote);
```

## 商談見積同期内容
* 品目レコード項目変更
    * 商談→見積: 反映される
    * 見積→商談: 反映される
* 品目レコード削除
    * 商談→見積: 反映される
    * 見積→商談: 反映される
* 品目レコード作成
    * 商談→見積: 反映される
    * 見積→商談: 反映される(スケジュール(OpportunityLineItemSchedule)は作られない)

## 参考
- [Approval クラス | Apex 開発者ガイド](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_approval.htm)
- [見積の同期のトラブルシューティング | SALES CLOUD の基本](https://help.salesforce.com/articleView?id=quotes_sync_troubleshooting.htm&type=5)
IQ Bot テーブルの空欄を埋める

IQ Botを使って、空欄行を埋めるやりかたを解説します。

##イメージ

以下のような処理を行います。
![01_空欄埋めイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/cec3aec6-4438-a14a-2560-cfa31b89531e.jpeg)

##やりかた

[テーブルに対するカスタムロジック](https://qiita.com/IQ_Bocchi/items/67694b1b0d1376ede7e7#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E9%A0%85%E7%9B%AE)を使って、以下のように処理します。

```python:空欄埋めのカスタムロジック実装例

# 値を保存する変数: table_values
#表の操作をするときに必ず入れるコード（最初）
import pandas as pd
df = pd.DataFrame(table_values)

#############################################
# ↓↓↓ ここからが今回の処理 ↓↓↓ 
#############################################

#日付の空欄埋め
vDate = ""
for i in range(len(df)):
  if df.at[str(i),"日付"] != "":
    vDate = df.at[str(i),"日付"]
  else:
    df.at[str(i),"日付"] = vDate

#伝票番号の空欄埋め
vDenpyoNo = ""
for i in range(len(df)):
  #df.at[str(i),"伝票番号"] = "aaa"
  if df.at[str(i),"伝票番号"] != "":
    vDenpyoNo = df.at[str(i),"伝票番号"]
  else:
    df.at[str(i),"伝票番号"] = vDenpyoNo  

#############################################
# ↑↑↑ ここまでが今回の処理 ↑↑↑
#############################################    

#表の操作をするときに必ず入れるコード（最後）
table_values = df.to_dict()

```

##解説

上記のカスタムロジックを読んで、何をやっているか想像がついた方は、解説は読み飛ばしてOKです。

###処理のポイント
上記の日付、伝票番号とも、処理の仕組みとしてはまったく同じことをやっています。
日付なら日付、伝票番号なら伝票番号の列を１行ずつ読んでいき、値が入っていればそれを変数に格納し、空欄であれば変数の値を代入するという処理です。

```python:空欄埋めのカスタムロジック抜粋

#日付の空欄埋め
vDate = ""                         # 変数の初期化
for i in range(len(df)):           # 抽出結果のテーブルを１行１行処理する（処理中の行をi番目とする）
  if df.at[str(i),"日付"] != "":   # i番目の行の日付欄の値が空欄でなかったら（★）
    vDate = df.at[str(i),"日付"]   # 　→　変数に日付欄の値を入れる
  else:                            # ★以外の場合（＝i番目の行の日付欄の値が空欄だったら）
    df.at[str(i),"日付"] = vDate   # 　→　変数の値で日付欄を埋める

```

###応用ポイント

上記のロジックを自分の業務に当てはめて応用したい場合、基本的に変える部分は`df.at[str(i),"日付"]`の中の"日付"の部分だけでOKです。

この部分を、自分が処理したいIQ Botのテーブル項目名に変えます。

IQ Botの項目名にスペースが含まれている場合は、スペース部分はアンダースコア(_)に置き換えます。

「伝票番号」という項目に対して処理したい場合は`df.at[str(i),"伝票番号"]`に、
「明細 消費税」という項目に対して処理したい場合は`df.at[str(i),"明細_消費税"]`に変えるという要領です。

上記の例の`vDate`や`vDenpyoNo`はただの変数名なので変えなくても動きますが、見た目のわかりやすさを考えると、しかるべき名前に変えておいた方がいいでしょう（消費税欄ならvTaxなど）。
Adobe製CSSライブラリ「Spectrum CSS」がいい感じ！

# [Spectrum CSS](https://opensource.adobe.com/spectrum-css/get-started.html)　とは？
Adobeがメインコミッターとなって開発されているOSSのCSSコンポーネントライブラリです（OSSなのでタイトルの「Adobe製」というのは厳密には間違ってるかもしれません）。Apache-2.0ライセンスで公開されています。
GitHubのStarsも660とBootstrapなどの有名類似ライブラリに比べるとまだまだメジャーではないですが、さすが天下のAdobe、デザインがかなりイケてます。
しかも他のライブラリでは見かけないコンポーネントもいくつかラインナップされています。

[Openbase.io](https://openbase.io/js/@adobe/spectrum-css)で見るとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/260ca38e-5f06-1972-4888-7ba6009b0d08.png)

ライブラリの名前にもなっている「Spectrum」とはAdobeのデザインシステムの総称とのこと。詳しくは[こちら](https://blogs.adobe.com/japan/web-introducing-spectrum-how-adobe-is-building-a-design-system-at-scale/)

# 面白いコンポーネント
ボタンやフォームなど一般的なコンポーネントは一通り揃っていますので、ここでは変わり種をご紹介します。

### Action Bar
Gmailのメールリストなどのようにまとめて操作する系のコンポーネントです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/15e78d12-2a87-68ab-0dde-606161c86cd9.png)

### Banner
数字を入れる事ができるBadgeはよく見ますがBannerはめずらしいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/49b451ed-d7b1-693d-4e77-31f1ed4d9076.png)

### Coach Mark
初期起動時のインストラクションなどで表示される例のマーカーです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/7d5e1322-cf0c-9b99-e370-891f317b6f65.png)

### Dial
ツマミです。このコンポーネントはAdobeのソフトウエアでよく見る気がします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/1d4ded60-74ae-3e54-8de4-778cd9b786c2.png)

### Slider
さすがAdobe。スライダーは色にも対応しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/f4fd264f-4f48-f253-8a70-dd5184358e24.png)

### Tree View
ありそうでなかなか無いツリービューも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/2d5b32d6-2de1-73cc-5442-3608ea9f9ce6.png)

---
以上独断と偏見での変わり種コンポーネント紹介でした。
全てのコンポーネントは[このページ](https://opensource.adobe.com/spectrum-css/accordion.html)から実際に動かしてみることができます。


# その他
### ダークモード対応
ライト、ダークの各テーマファイルがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/3f3d9e5c-de03-8e53-4991-d9a5b2c02ed1.png)

### あくまでもコンポーネントのみ
[Spectrum CSS](https://opensource.adobe.com/spectrum-css/get-started.html)はコンポーネントのみの提供でレイアウトに関わるCSSは提供していないようです。自前で頑張るか[Simple Grid](http://www.simplegrid.io/)などのGridレイアウト専用ライブラリと組み合わせるとうまく使えそうです。

### IE11未満では使えない
[ドキュメント](https://github.com/adobe/spectrum-css/blob/master/README.md#using-spectrum-css)に以下の記載がありました。
>This has the lowest bundle size and the simplest usage, but is incompatible with < IE 11

また、IE11で使用する場合は[legacy usage documentation](https://github.com/adobe/spectrum-css/blob/master/README-legacy.md)を参照する必要があるようです。

---
以上、自分もまだ実際に組み込んでみてはいないので、使用感などはレポートできませんがデザインだけ見ると今後の常用ライブラリになり得そうな気がしました。
今更ながらJenkinsfileのよく使うディレクティブをまとめてみた


#はじめに

記念すべき初投稿となる記事は、CI/CDツールでもよく利用される**Jenkins Pipeline**について書きました。

今回、Qiitaに投稿しようと思ったきっかけは２つあります。
1つ目は、「学びはアウトプットする事が重要だよ」と先輩社員の方に言われ実際に行動に移してみようと思ったらからです。
2つ目は、JenkinsのPipelineをこれから使おうとしている人へ向けて、少しでも役に立てば良いなと思ったからです。

本記事を読めば、Jenkinsfileでよく使うディレクティブについて学ぶことができ、簡単なPipelineを作成できるようになると思います！！

#そもそもJenkinsとは何か？
下記のサイトに分かりやすくまとめられています。

- [公式サイト](https://www.jenkins.io/)
- [Jenkinsの概要](https://cloudbees.techmatrix.jp/jenkins/)
-  [ダウンロードから基本的な使い方まで](https://eng-entrance.com/jenkins-use)

#Pipelieneとは何か？

Jenkins2からPipelineという機能が標準採用され、PipelineコードをJenkinsfileに定義することで、今までUIでポチポチして定義していた各種タスクを、コードベース(Groovy)で定義できるようになりました。

Pipelineは2つの構文をサポートしています。
構文の違いは下記の記事で紹介されているので、確認してみてください。

- [declarative pipeline サンプル集](https://qiita.com/ys1230415/items/51b36fedf1434e877765)

#ジョブからの実行方法
1. Jenkinsの左上の新規ジョブ作成をクリック
2. ジョブ名を入力し、パイプラインをクリックし「OK」ボタンをクリック
3. 各種設定を行い、一番下のPipelineにスクリプトを記載する  
(短いスクリプトであればここに記載してもよいですが、バージョン管理やGit上で管理したい場合は、Shared Library(共有ライブラリ)を使用するのをお勧めします)
4. 作成完了したら「OK」をクリックし、実際にビルドを実行して動作確認をする

[共有ライブラリに関しては、こちらの記事が参考になります](https://qiita.com/bols_blue/items/50b024cf423439e8e99a)

共有ライブラリ呼び出し方の例）

```
//masterブランチ使用する場合
@Library('sample(ライブラリ名)') _
//ブランチを指定したい場合
@Library('sample(ライブラリ名)@develop/#hogehoge') _

//以下に呼び出したい関数や操作/処理を記載する
pipeline {
   def call()
}

```

#よく使うディレクティブ

本記事のメインであるJenkinsfileに使用する各ディレクティブを説明していきます。

#### 関数定義

```
def call(引数１, 引数２) {
    具体的な処理を記載
}
```

#### node
実行ノードを指定できる。実行マシンを指定するイメージです。

```
node('build'){
 
}
```

#### timestamps 
コンソールに処理の実行時間を表示する。

```
timestamps{

}    
```

#### stages/stage/steps
stagesがJenkins上に表示されるStage View部分の一つです。進捗を可視化してくれます。
stepが一つ一つの手順で、stageはそれの集まりです。

```
stages('Test'){
   stage('Test No1'){
     steps{

     }
  }
}    
```

#### Gitを複数クローンする
Git上にあるリポジトリをworkspace上にクローンします。
複数のリポジトリをクローンする場合は、ディレクトリを別途作成します。
別で扱わなければ後からクローンしたほうが上書きしてしまうためです。

```
//ディレクトリを移動してからコマンドを叩くことが可能になります
dir('foo'){
    //リポジトリとブランチを選択します
    git url: 'GitのURL', branch: 'master'
}
```

#### シェル実行
```
sh 'cat testfile'
sh 'ls'

//複数行のシェルを実行する場合
"""
echo "start"
sh 'sh -x ファイル名.sh'
echo "end"
"""
```

#### Junit実行
```
//Junitテスト実行(gradle版)
gradlew test --tests テストファイル名

//テスト結果集計
junit　'**/hoge/test/**.xml'

```

#### 成果物保存　
```
archiveArtifacts 'ファイル名'
```

#### パラメータを渡して後続のジョブを実行

```
build job: '後続のジョブ名' 
//後続ジョブが失敗してもジョブを成功としたい場合
build job: '後続のジョブ名',　propagation:false
 
parameters: [
string (name: "param1",value: "value1"
string (name: "param2",value: "value2"
//パラメータ付きビルドを利用してジョブ実行可能
]
```

#まとめ
今回は、Jenkinsfileでよく使用するディレクティブについて紹介しました。
Jenkinsには、pipeline syantaxという自動で構文を作成してくれる機能もあるので、活用してみるといいかもしれないです。

記事を読んでくれた方、ありがとうございました。
一個流し（流水化）と平準化

**1.流水化**
要求→設計→コーディング→テスト→利用（試用）→レビュー(フィードバック)迄のリズミカル(周期的)なサービス・サプライ・チェーンを確保することがジャストインタイム実現の基本的な要件である。
Agile開発ではプロダクトバックの一つのプロダクトアイテム（基本はユーザーストーリーで記述されている）に対して上記プロセスを滞留なく流れる水のごとく進んでいくようにすることである。
さらに、ユーザーの評価(レビュー)がタイミング良く遅滞なく行われる環境をも設定することが重要である。
これはユーザーとの協力関係(ユーザー参加)が必須の条件となる。
また**「流れ」を可視化したボードを使用することで、開発プロセスの異常を誰でも容易に察知**できる様になる。

**2.平準化**
「流れ」を作る基本的な条件として、平準化に取り組む必要がある。
平準化を実現するためには、生産現場で言えばロットを小さくして柔軟性を高めることである。システム開発の場合も、同様な考え方ができる。
アジャイル開発では、タスクの粒度を小さくすることにほかならない。
タスクの粒度を小さくできればできる程、**システム開発において柔軟性とユーザーへの適応力**が高まります。
簡単レシート印刷 receiptline でバーコードと QR コードを作ってみた

日本発のオープンソース receiptline でレシート印刷に少しずつトライしています。

ネットオークションやフリマアプリでレシートプリンターを探していましたが・・・
とうとう何台か落札することができました！

まだ手元にないので、[前回](https://qiita.com/dopperi46/items/e871ce96dadea11d243c)利用した開発ツールを引き続き使います。
今回はバーコードと QR コードです。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/87367b78-656b-2bdd-8143-03beee1dfbf3.png)

# バーコード

バーコードアイコンをクリックすると、ダイアログボックスが開きます。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/55e4afd4-5748-a5a5-2a68-27f6977a62ae.png)

適当にデータを入れて、サイズと可読文字の有無を選びましょう。

ここは無難にデフォルト設定の CODE128 にしておきます。
CODE128 は「〇〇 Pay」のバーコードに使われているそうです。

キャンセルしたいときは、ダイアログボックスの外をクリックします。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/c6bbc422-39f3-dcd7-7ac8-aa97c613ee43.png)

編集エリアに code プロパティと option プロパティが追加されました。

code プロパティは、バーコードを出力します。
名前は `code` または `c`、値はバーコードデータです。

option プロパティは、この行以降のバーコードを設定します。
名前は `option` または `o`、値はバーコードオプションです。
複数のオプション値は `,` or 1 つ以上のスペースで区切ります。

```text:ReceiptLine
{code:WIND402; option:code128,2,72,hri}
```

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/dee0f1e8-41dd-4d67-6518-d097bc985ef0.png)

# QR コード

二次元コードアイコンをクリックすると、ダイアログボックスが開きます。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/97d8e37c-933b-b287-403c-cf710bd3b8b8.png)

二次元コードは QR コードのみです。
適当にデータを入れて、サイズと誤り訂正レベルを選択します。

キャンセルしたいときは、ダイアログボックスの外をクリックします。

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/c88f1a0e-90fd-047e-b7e5-92fdbf066a62.png)

編集エリアに code プロパティと option プロパティが挿入されました。

二次元コードのプロパティはバーコードと同じです。
option プロパティの値は QR コード用になっていますね。

```text:ReceiptLine
{code:Do it! Make it! Shake it!; option:qrcode,5,M}
```

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/67b2e5d3-b4ff-841a-2ebc-5c08c4865e9c.png)

# バーコードの位置揃え

文字列と同様に、テーブルの区切り文字 `|` で位置揃えができます。
バーコードと QR コードを、左揃えと右揃えにしてみます。

code プロパティと option プロパティを分離して、短縮名を使います。
また、クワイエットゾーンが必要なので、間隔を1行ずつ空けることにします。

```text:ReceiptLine
{o:code128,2,72,hri}
|{c:WIND402}

{c:WIND402}|
=

{o:qrcode,5,M}
|{c:Do it! Make it! Shake it!}

{c:Do it! Make it! Shake it!}|
```
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/c68685ce-9f08-80c2-547d-2faf4841a53f.png)

ちなみに、バーコードと QR コードは、2 列にしたり罫線を引いたりすることができません。
この制約はレシートプリンターのコマンド仕様に由来するようです。

# バーコードの種類

code プロパティと option プロパティの対応をまとめました。  

|種類|option|code|使い道|
|:---|:---|:---|:---|
|CODE128|code128|ASCII 文字列|コード決済|
|CODE93|code93|ASCII 文字列|？？？|
|NW-7<br>(Codabar)|nw7<br>codabar|数字と一部の記号<br>(先頭と末尾は ABCD)|宅配伝票|
|ITF<br>(Interleaved 2 of 5)|itf|偶数桁の数字|段ボール箱|
|CODE39|code39|英数字と一部の記号|現品票|
|JAN<br>(EAN)|jan<br>ean|13 桁の数字<br> 8 桁の数字|商品|
|UPC-A<br>UPC-E|upc|12 桁の数字<br>7 桁の数字|北米の商品|
|QR Code|qrcode|ASCII 文字列<br>漢字|続きは Web で|

次回は、変換ライブラリの API を試してみようと思います。
papermillで、Notebookの実行結果を返り値として取得

[papermill](https://github.com/nteract/papermill)でnotebookを実行した時に、こんな感じでnotebookの最後のセルの出力を値として取得できます。

```python
nb = papermill.execute_notebook('index.ipynb', ...)
nb['cells'][-1]['outputs'][0]['text']
```

## 使い方
### 環境
- python: [3.8.3-slim (Docker)](https://hub.docker.com/_/python)
- [notebook](https://github.com/jupyter/notebook): 6.0.3
- [papermill](https://github.com/nteract/papermill): 2.1.2

### 使い方の例
下記のような、fizzbuzzを実行するだけのnotebookを定義してみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/46e3e4ed-e782-d3e8-fb7c-bc6815f7f5b5.png" width=480>

上記notebookをpapermillで実行するコードを記述します。別途[papermillのパラメータ機能](https://papermill.readthedocs.io/en/latest/usage-parameterize.html)を使って引数を定義することで、notebookを引数と返り値を持つひとつの関数のように利用できます。

```python:main.py
import papermill

def notebook_result(path, param):
    nb = papermill.execute_notebook(path, '/dev/null', dict(num=param))
    return nb['cells'][-1]['outputs'][0]['text']

print(notebook_result('fizzbuzz.ipynb', 15)) #=> fizzbuzz
```

```bash
$ poetry run python main.py
(中略)
fizzbuzz
```

## 参考
- [Let user choose how to deal with execution result\. by jarrekk · Pull Request \#107 · nteract/papermill](https://github.com/nteract/papermill/pull/107/files)
- [The Notebook file format — nbformat 5\.0 documentation](https://nbformat.readthedocs.io/en/latest/format_description.html)
PackageCompiler.jlでPlotsの呼び出しを高速化する2020年7月版

JuliaではPlotsが遅くて、

```julia
@time using Plots
```
が

```
 11.756235 seconds (17.73 M allocations: 964.209 MiB, 2.77% gc time)
```
とかなってしまい、読み込みが遅くてげんなりしてしまいます。

これを解決するためのパッケージとして、PackageCompiler.jlがあります。
しかし、どんどん開発されたせいでQiitaでも他の記事でも色々な情報が混在して混乱してしまいます。
ここでは、2020年7月現在のPackageCompiler.jlを使ったPlotsの高速化について書きます。

なお、
https://julialang.github.io/PackageCompiler.jl/dev/examples/plots/
と
「PackageCompiler.jl で Makie.jl の呼び出しを速くする」
https://qiita.com/SatoshiTerasaki/items/478f29cf4343364a136f
を参考にさせていただきました。

# 確認環境
- Mac OS 10.14.6
- Julia 1.4.2

# 解決策
]キーを押して

```
add PackageCompiler
```
でPackageCompilerをインストールします。

次に、

```julia
using PackageCompiler
create_sysimage(:Plots,sysimage_path="sys_plots.so")
```
をします。以上です。sys_plots.soというファイルができていると思います。

# 使い方
Juliaを一度終了させ、もう一度起動してみます。この時、

```
julia --sysimage=sys_plots.so
```
とします。
すると、

```julia
@time using Plots
```
が

```
0.002958 seconds (796 allocations: 39.406 KiB)
```
となりました。
速いですね！

# 常に早くする。
Macの場合、ホームディレクトリにある.bashrcか.bash_profile
を開き、

```
alias julia='julia --sysimage ~/sys_plots.so'
```
を追記しておくと、常にPlotsが早くなります。
あるいは、

```
echo "alias julia='julia --sysimage ~/sys_plots.so'" |cat >> ~/.bash_profile
```
でも良いはずです。ここで、sys_plots.soはホームディレクトリにおいてあると想定しています。
【裏技】RDS for MySQL において sql_mode を空白にする【非推奨】

# 背景

RDS for MySQL の 5.5 から 5.6 にバージョンアップするにあたり、
極力後方互換性を保って移行したいと思い、MySQL 5.5 と同じような動作となるようにパラメータの値を検討していた。

sql_mode についても 5.5 ではデフォルト値 (= 空白) に設定していたため、同様の設定を 5.6 にも引き継ぎたいが
MySQL 5.6.6 以降においてデフォルト値は NO_ENGINE_SUBSTITUTION が適用されることになる。


これをなんとか空白にしたかった

## 無理やり空白にする方法

パラメータグループにおいて、sql_mode を 「,」 カンマだけを入力して登録する

そうすると、許可されていない空白が値として登録できました。 `"ParameterValue": ""` となっていますね。

```
urabe:~ $ aws rds describe-db-parameters --db-parameter-group-name test-mysql-56-params| jq '.Parameters[]| select(.ParameterName == "sql_mode")'
{
  "ParameterName": "sql_mode",
  "ParameterValue": "",
  "Description": "Current SQL Server Mode.",
  "Source": "user",
  "ApplyType": "dynamic",
  "DataType": "list",
  "AllowedValues": "ALLOW_INVALID_DATES,ANSI_QUOTES,ERROR_FOR_DIVISION_BY_ZERO,HIGH_NOT_PRECEDENCE,IGNORE_SPACE,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,NO_DIR_IN_CREATE,NO_ENGINE_SUBSTITUTION,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_UNSIGNED_SUBTRACTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY,PAD_CHAR_TO_FULL_LENGTH,PIPES_AS_CONCAT,REAL_AS_FLOAT,STRICT_ALL_TABLES,STRICT_TRANS_TABLES,ANSI,DB2,MAXDB,MSSQL,MYSQL323,MYSQL40,ORACLE,POSTGRESQL,TRADITIONAL",
  "IsModifiable": true,
  "ApplyMethod": "immediate"
}
urabe:~ $ 
```

## ご注意

AWS としては動作保証するものではないので、ふーん そんな挙動あるんだ、とだけ思っておいてください。
2020/7/20 現在たまたまそういう動作があったということで、今後動作が変わるかもしれません。
実運用では使わないでくださいね。使われたとしても、どういう問題が起こるか保証できかねます！m(_ _)m！

NO_ENGINE_SUBSTITUTION が有効であっても、正しく動作するように対処するのがベストだと思います。
C/C++学習に役立つ参考Webサイト20選

C/C++は最も重要なプログラミング言語です。 以下は、C/C++ソースコードを提供する20個の優れたWebサイトとWebページのリストです。 このリストは、ソースコードへのリンクとそれらの簡単な説明を提供します。

**1.https://www.hotscripts.com/category/scripts/c-cpp/**
何百ものC/C++スクリプトとプログラムを提供する。すべてのプログラムはさまざまなカテゴリに分類される。

**2.http://www.planetsourcecode.com/vb/default.asp?lngWId=3**
10,000行を超えるC/C++の無料ソースコードを提供する。

**3.http://www.daniweb.com/code/c.html**
DANIWEBが実用的なコードセグメントを提供する。

**4.https://www.drdobbs.com/cpp**
ソースコードを提供します。

**5.http://www.cprogramming.com/cgi-bin/source/source.cgi**
C/C++のプログラミングリソース。

**6.http://private.codecogs.com/**
CodeCogsは、C/C++の数値コンポーネントである共同オープンソースライブラリです。

**7.http://www.cis.temple.edu/~ingargio/cis71/code/**
学生向けの簡単なC言語プログラムのリスト。

**8.http://www.codeproject.com/?cat=2**
codeprojectが提供するC/C++リソースコードプロジェクト。

**9.http://www.thefreecountry.com/sourcecode/cpp.shtml**
C/C++ライブラリのDLL、VCL、ソースコード、コンポーネント、モジュール、アプリケーションフレームワーク、クラスライブラリ、ソースコードフラグメントなどを無料で使用できるようにする。

**10.http://people.sc.fsu.edu/~burkardt/cpp_src/cpp_src.html**
365個C++に関するソースコードリスト。

**11.http://www.cplusplus.com/src/**
一般的なコンソールプログラムとC ++で記述されたWindowsプログラムのコードリスト。

**12.http://users.cs.fiu.edu/~weiss/dsaa_c++/code/**
C++言語のデータ構造とアルゴリズム分析（第2版）のソースコード。

**13.http://www.bbdsoft.com/downloads.html**
C++ソースコード

**14.http://www.moshier.net/**
天文学と数値ソフトウェアのソースコード

**15.http://cplus.about.com/od/cgames/C_Games_with_Source_Code.htm**
ゲームに関連するC++ソースコード。

**16.http://www.programmerworld.net/resources/c_library.htm**
無料のC++ソースコードとその他の便利なツール。

**17.http://www.josuttis.com/libbook/examples.html**
C++標準ライブラリの例をダウンロードできる。

**18.http://www.einet.net/directory/65892/Developers.htm**
Cプログラム

**19.http://www.daniweb.com/code/cplusplus.html**
便利なコードスニペット。

**20.https://en.cppreference.com/w/cpp/language/reference**
コードを実行、修正できるWebサイト。
Railsが自動でやってくれて助かるけどびっくりしたところ

TECH::CAMPで学習中に戸惑ったところをメモ。
公式リファレンスを読み込んだわけではないので間違っているところもあるかもしれない。

# tl; d
- index, show, new, editのアクションには何も書かなくてもいい。
- form_withはモデル名とカラム名で指定すればいい。
- link_toはPrefixでインスタンスを渡せばいい。

# Railsが自動でやってくれる
### index, show, new, editのアクションには何も書かなくてもいい

```ruby
def index
end

def show
end

def new
end

def edit
end
```
７つのメソッドの中でも、この4つは最低限これだけ書けば動いてくれるみたいでびっくり。
ビュー側にデータを送るために、アクティブレコードメソッドを使って、インスタンス変数を宣言して……と基礎コースで勉強したみたいに用意していたのはなんだったの。
たしかに、これらのアクションはURLやPrefixでアクションを指定した時点で、該当するモデル（show, editの場合は加えてid）のインスタンス変数を用意するのはほぼ確定してる。
なので書かなくても自動でインスタンス変数も用意しておいてくれてるということか。

ただし、表示順序を入れ替えるだったり、N+1問題を回避するためにincludeで関連モデルを読み込むだったり、JavaScriptと連携したり、などの場合は相応の記述をする必要がある。

### form_withはモデル名とカラム名で指定すればいい。
```html.erb
<%= form_with(model: @tweet, local: true) do |form| %>
	<%= form.text_field :name, placeholder: "name" %>	
	<%= form.text_area :text, placeholder: "text" , rows: "10" %>
	<%= form.submit "SEND" %>
<% end %>
```
渡されたインスタンスがレコード内にあるかを自動判定してくれるので、どのアクションに向けてデータを送るかのパスを書かなくていい。
こうすることで、newのビューとeditのビューでformのコードをそのまま使いまわせるという。
ただし、form_withにこれはnewのインスタンスですよ、と知らせるためにnewアクションでnewする必要があるみたい。

`form.text_field :name`などの個別の入力フォームを生成している部分では、カラム名を指定しておくと、どのカラムに保存するかも勝手にやってくれる。
しかも、このカラム名のシンボルがHTMLに変換された際に`id = "name"`の様に変換されるので、JavaScriptで使う用にidを設定しなくても、そのまま`document.getElementById("name")`で指定できて便利。

### link_toはPrefixでインスタンスを渡せばいい。
```html.erb
<% rooms.each do |room|%>
	<%= link_to room.name, room_messages_path(room), method: :get%>
<% end %>
```
Prefixはインスタンスを指定できるのでいちいち `"rooms/destroy/#{room.id}"` の様に数値に変換したり、式展開する必要もない。
URIパターンを定数化した様なものかな？と思っていたけど、引数っぽいのを指定できるPrefixって何者？メソッド？
Firebaseを使った正しいサインイン

を馬鹿なりに考えて見た。

### きっかけ
業務外で他人のFlutterによるBLoC + Providerの構成でのFirebase認証処理を見ることがあったのですが、それは私が学習初期に参考にしたGithub上に転がっていた実装と比較して、悪い実装に見えました。
しかし、完成優先で仕事で行っているわけでもなかったので、指摘をせずにスルーしてたのですが、内容整理をしたかったのでQiitaに起こしました。

#### 間違っていると考える実装
1. 画面からVMを通じてサーバに認証をリクエストする。
2. 認証結果を画面で受け取り、結果を判定。成功の場合は次のTOP画面へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526878/fc6d4b88-98ca-935c-3562-688b5069ef7b.png)

### なぜ違うと考えたか？
- 画面にロジックを持たせることになるため。
- 認証状態はアプリの状態として持ち回るべきであり、これを行わない場合VMごとに認証レポジトリを呼び出す必要がある。
- Firebaseは認証状態変更リスナーがあるので、リアルタイムに認証状態の変更をすることができる。使わない手はない。
- 認証結果による次のアクションを認証サーバーではなく、画面が判断しており役割分担に誤りがあると考えた。

他にも様々あると思いますが、コーディングの観点で思いつくものを書きました。

### 正しいと考えている実装

認証の状態を保持した上でトップに描画のコントローラ（状態に応じて返す画面をswitch文で返すビュー）をおき、認証状態に応じて画面を切り替える。
Firebaseの場合はログイン画面モデルが認証結果を受け取る必要ななく、認証状態プロバイダーの中でFireStoreのインスタンスに認証状態変更リスナーを利用しさらに楽に実装できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526878/46afff50-ea98-2f67-386e-ea1579874e70.png)

### まとめ
フロントエンドにおけるビュー層のあるべき姿は、あくまでコントローラが指定した状態をそのまま投影べきだと考えます。
サインインのスコープは短絡的にはサインイン画面に対するものに見えますが、アプリ全体の状態なので認証状態を保持するプロバイダーによって判断すべきだと考えます。
【Laravel】データベース 

この記事は以下の書籍を参考に執筆しました

- [PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)



#データベースの準備
##Laravelのアプローチ
###DBクラス(クエリビルダ)
一番シンプルなDBクラスを使用する
直接SQLを直接実行するようなもの。

クエリビルダ機能がついている。

|用語|説明|
|---|---|
|DBクラス|DB利用のための基本的な機能を備えている。|
|クエリビルダ|メソッドを使ってDBにアクセスできるようになり、SQLではなく、PHPらしい処理ができるようになる|


###Eloquent(ORM)
EloquentというORMを使用することで、DBクラスよりも遥かにPHPらしい処理をできる。

|用語|説明|
|---|---|
|ORM|DBのデータとプログラミング言語のオブジェクトの間を取り持つ|

##SQLiteデータベースを用意する
Laravelはどのデータベースを使っても同じ扱いができるため、どのデータベースを使おうと基本的に違いはない。
ここではSQLiteを利用していく
###SQLiteの特徴
SQLiteはデータベースサーバの起動が必要なく手軽に利用できる。
PHPにはSQLiteファイルにアクセスするための機能があるため,SQLite本体すら不要。
###テーブルを利用する
Laravelカレントディレクトリへ移動してdatabaseディレクトリへ移動して下記コマンド

```
$ sqlite3 database.sqlite
```
下記コマンドでDBを作成

```sql
CREATE TABLE `people` (
   `id`   INTEGER PRIMARY KEY AUTOINCREMENT,
   `name`   TEXT NOT NULL,
   `mail`   TEXT,
   `age`   INTEGER
);
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


###ダミーレコードを追加

```sql
INSERT INTO `people` VALUES (1,'taro','taro@yamada.jp',35);
INSERT INTO `people` VALUES (2,'hanako','hanako@flower.com',24);
INSERT INTO `people` VALUES (3,'sachiko','sachi@happy.org',47);
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)



##DB利用のための手続き

```php：config/database.php
'default' => env('DB_CONNECTION', 'mysql'),
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


これを以下に修正

```php：config/database.php
'default' => env('DB_CONNECTION', 'sqlite'),
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


これでLaravelで利用するDBがSQLiteになった

#参考文献
- [PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)
初心者によるプログラミング学習ログ 376日目

#100日チャレンジの376日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
376日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>昨日の作業・やったこと⇩<br><br>●寝る直前の筋トレ5分、kindle読書 10分<br>●ブログ1記事作成<br>●プログラミング学習376日目 10h<br>・架空LP作成(<a href="https://twitter.com/ririru_123?ref_src=twsrc%5Etfw">@ririru_123</a> )<br>・pc版お問い合わせ部分以外を作成<br><br>汗疹できた<a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a></p>&mdash; ぱぺまぺ@社畜✕投資✕ブロガー (@ppmp65) <a href="https://twitter.com/ppmp65/status/1284944120687910912?ref_src=twsrc%5Etfw">July 19, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
AWS SDK のリクエストヘッダを見る方法

* **AWS SDK for PHP** の場合  
例えばsqsクライアントの場合

```php
$client = new SqsClient([
    'region'      => ***,
    'version'     => ***,
    'credentials' => [
        'key'    => ***,
        'secret' => ***
    ],
    'debug' => true, # ←コレを追加
]);
```
debugを `true` にすることで標準出力にログが出力される。
参考： https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/faq.html

* **AWS SDK for JavaScript** の場合  
例えばsesクライアントの場合

```JavaScript
new AWS.SES().sendEmail(sesParams, function(err, data){
    if(error){
        console.log(this.httpResponse); // ← コレを追加
    } else {
        console.log(this.httpResponse);
    }
});
```
`this` というのは `AWS.Response` のことらしい。基本的にはレスポンスの情報を参照出来るらしいけど、リクエストした情報( `AWS.Request` )も見れる。
参考： https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/using-a-callback-function.html
Unity 3D入門 #5 [メッセージウィンドウの作成]

ゲーム作成に不可欠なメッセージウィンドウを作ります。

UI->Panelを作成し、そこにテキストを追加したいと思います。
参考URL:https://xr-hub.com/archives/11782

参考URLに従い作成している途中、下のような画面となり、何か失敗したかと思いましたが、Gameビューで見ると、２枚目のように表示されていたので問題はなさそうです。
<img width="858" alt="スクリーンショット 2020-07-20 17.41.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670403/51f33f58-4780-b028-fd14-4f1f964dfec5.png">

<img width="856" alt="スクリーンショット 2020-07-20 17.42.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670403/6dc993d4-795a-ff60-4b24-42d1d1d025fd.png">


また、メッセージウィンドウを出し入れするプログラムを書きます。
プログラムはプレイヤーにアタッチし、特定のキーを入力することで表示/非表示されるようにします。

オブジェクト検索の参考URL：https://marunouchi-tech.i-studio.co.jp/2266/
キー入力参考URL：https://tech.pjin.jp/blog/2015/09/30/unityのキー入力まとめ-～inputクラス～/ 
キーコード参考URL：https://docs.unity3d.com/ja/2019.4/ScriptReference/KeyCode.html

しかし、下のようなコードを書いた場合、問題が発生しました。

```
void Update()
    {
        if (Input.GetKeyDown(KeyCode.I)){
            if (messagePanel.activeSelf){
                messagePanel.SetActive(false);
            }else{
                messagePanel.SetActive(true);
            }
        }
    }
```

一度「i」を押しただけで二回コードが呼ばれ、messagePanelのsetActiveがtrue->false->trueのように一瞬で変更され、結局メッセージウィンドウが表示され続けてしまいました。

＞上のスクリプトを二つ別々のオブジェクトにアタッチしていたことが問題でした。


最後に、次に向けてタイマーを画面上に表示させようと思います。
タイマー作成参考URL：https://techacademy.jp/magazine/9311

```
float countTime = 0;
void Start() {
    Timer = GameObject.Find("Timer");
}
void Update() {
    countTime += Time.deltaTime; //スタートしてからの秒数を格納
    Timer.GetComponent<Text>().text = countTime.ToString("F2"); //小数2桁にして表示
}
```

簡単に書くと上のように実装。

GetComponent<Text>()でエラーが出た時の参考URL：https://monaski.hatenablog.com/entry/2015/11/03/125957

![ezgif-7-676c0b901692.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670403/3b5710e9-72e8-0854-597d-9102cff63525.gif)
データベースと管理システムについて

# はじめに
この記事は、インターネット上の百科事典や技術情報サイト、SQLの基礎を学ぶイベントを基に、データベースのデータ型と管理システムについて、初心者目線で情報収集した内容をまとめたものです。
技術的に誤っている点がございましたら、ご指摘いただけますと幸いです。

# データベースとは何か
データベースとは、検索や集積が簡単にできるように整理された、情報の集まりのことを指します。
例として、住所録や検索エンジンがあげられますが、企業で例えるなら企業の情報を掲載したデータが該当します。
では、**データベースモデル**は何に例えられるのでしょうか？それは、企業の理念や方針です。
データベースモデルは、データベースに格納するデータをどのように配置するか規定している構造だからです。

## データベースでデータを保存する際の形式
### 階層型
![column_image6411_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423502/449c4d5f-568a-0500-0322-b1a362b0537f.jpeg)
出典: <[そもそもデータベースとは？基礎から分かるデータベース入門](https://proengineer.internous.co.jp/content/columnfeature/6411)>

データとデータとの関係を「木構造」で表現して、階層構造を作り、データを管理するモデルです。
階層型データモデルでは、データは常に「1対多」の親子関係でなくてはいけません。
（※）木構造: データ構造の一つで、階層が深くなるほど枝分かれしていく構造のこと。

<hr>

### ネットワーク型
![column_image6411_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423502/8fe6f8c8-7f8a-0899-ca48-03ed8dc23b7a.jpeg)
出典: <[そもそもデータベースとは？基礎から分かるデータベース入門](https://proengineer.internous.co.jp/content/columnfeature/6411)>

階層構造を作る点では階層モデルと同じですが、それぞれのデータが網目のように繋がり合い、「多対多」の親子関係を持つモデルです。

<hr>

### リレーショナル型
![column_image6411_04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423502/cca84170-a5a8-e3d2-a751-835bf32fb490.jpeg)
出典: <[そもそもデータベースとは？基礎から分かるデータベース入門](https://proengineer.internous.co.jp/content/columnfeature/6411)>

行と列で構成される、二次元の表形式でデータを表現するモデルです。

## 階層型とネットワーク型の課題、リレーショナル型の功績
階層型やネットワーク型のモデルは、データ構造に強く依存します。そのためデータ構造を理解できる、専任のエンジニアによる作業が必要でした。
それに対し、リレーショナル型モデルは、データ構造に依存しないように、操作するデータとそれの扱い方を分けて、柔軟かつ容易なデータの取り出しを可能にさせました。

# データベース管理システムとは何か
データベースを管理するためのソフトウェアです。以下、二つに大きく分けた管理システムの種類です。

**データベース管理システム**（英: Database management system / DBMS）
階層型モデル、ネットワーク型モデル、カード型データモデルなどが幅広く利用されています。

**リレーショナルデータベース管理システム**（英: Relational database / RDBMS）
近年では、上記のDBMSより主流である、リレーショナル型モデルが利用されています。

## よく耳にするDBMS
代表的なソフトウェアをご紹介致します。
各DBMSの特徴は、[PostgreSQLではじめるDB入門](http://db-study.com/archives/24)から引用させていただきました。
### 商用ソフトウェア
#### Oracle Database
> 最大のシェアを誇るDBMS。
技術者も多く書籍やネットなど情報量が圧倒的に豊富。

#### Microsoft SQL Server
> Windowsプラットフォームに特化したMicrosoftのDBMS。
Oralceに次ぐシェアを誇り、情報量も豊富。

### オープンソースソフトウェア
#### MySQL
> OSS DBMSとしては最大シェアを誇る。
とにかく軽いのが特徴。

#### PostgreSQL
> オブジェクト関係データベース管理システム（ORDBMS）。
MySQLとよく比較され、市場シェアでは圧倒されているが、近年、PostgreSQLが選ばれるケースが増えている。

# 備考
DBMSは上記の他にも、OODBMSやXMLDBMS、NoSQLなどが存在しています。
NewSQLという新しい形のSQLデータベースもあるようで、ますますDBから目が離せなくなりそうです。
ここまで拝読していただき、ありがとうございました。

## 参考文献
- フリー百科事典『ウィキペディア（Wikipedia）』
    - [データベース](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9)、[データベースモデル](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%A2%E3%83%87%E3%83%AB)、[データベース管理システム](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)
- SQL ServerやAzure SQL Databaseについての基礎を学ぶイベント
    - [SQL Beginners Day #1](https://sqlserver.connpass.com/event/181297/)
NSTextView に font や color を設定する

```swift
let view = NSTextView()
view.delegate = context.coordinator
view.string = text
view.font = NSFont.systemFont(ofSize: NSFont.systemFontSize*1.3, weight: .regular)
view.backgroundColor = NSColor(cgColor: CGColor(red: 0, green: 10, blue: 10, alpha: 10))!
```

NSTextView へ何かを施そうとするといちいち難しいので、備忘録です。


```swift
let view = NSTextView()
let font = NSFont.systemFont(ofSize: NSFont.systemFontSize*1.3, weight: .regular)
let paragraphStyle = NSMutableParagraphStyle()
        
paragraphStyle.alignment = .left
paragraphStyle.firstLineHeadIndent = 0.0
paragraphStyle.lineSpacing = 8.0

let attributes: [NSAttributedString.Key: Any] = [
    .font: font,
    .paragraphStyle: paragraphStyle
]
        
let attrString = NSAttributedString(string: text, attributes: attributes)
view.textStorage?.append(attrString)
```
[React] useStateのセッターで配列を更新しても再レンダリングされない時

## 前置き
Reactのstate hookで配列を定義していて、更新したいと思いセッターに値を渡すと中身は更新されているのにコンポーネントが再レンダリングされない事案にぶち当たりました。

```tsx
const [hoge,setHoge] = React.useState<SampleType>(InitialArray)
```

これに悩まされて数時間無駄にしたので誰かのお役に立てば...

## 問題のコード
問題となるコードのサンプルを作ってみました

```tsx
/*--------------------------------略*/
const LunchList: React.FC = () => {
  const [lunchlist,setList] = React.useState<Lunch[]>(InitialArray)

  React.useEffect(()=>{
    const setvalue = lunchlist
    setvalue.push('パスタ') //重要
    setList(setvalue)
  })
/*--------------------------------略*/
}
```

パット見動きそうなのですがこれだと前置きで話した通り再レンダリングされません。

### なぜ？
調べてみたところReactのstate hookは

```javascript
object.is()
```
を使って変更があったかどうかを判別しているので、
今回の例のように`lunchlist`をコピーした`setvalue`を
`push()` などで直接操作してセッターに渡しても再レンダリングされないようです。
>公式の記事
>If you return the same value from a Reducer Hook as the current state, React will bail out without rendering the children or firing effects. (React uses the Object.is comparison algorithm.)

## 解決
オリジナルでもコピーでもダメなら新しい配列をつくってしまう

```javascript
const setvalue = [...lunchlist, 'パスタ'] //解決
setList(setvalue)
```

こうしてしまえば`object.is()`で変更があったか判別できるので再レンダリングしてもらえます

以上
SSH でログアウトした後もプロセスを残すメモ

# はじめに

SSH接続している際に、ログアウト後もプロセスを持続させる方法のメモです。
やりたいことは基本的にはこれでできます。

```sh
$ nohup コマンド内容 > out.log &
```

例

```sh
$ nohup echo "very very heavy task" > out.log &
```

これを実行すると、カレンドディレクトリに `out.log` ファイルが作成され、出力内容が保存されます。

```plaintext:out.log
very very heavy task
```

# 関数化

ここからがメインです。先程のコマンドはちょっと長いので、関数として登録します。

僕が使用しているシェルは zsh なので `~/.zshrc` に次の内容を追記します。
bash の場合は `~/.bashrc` に追記してください。

```sh:.zshrc
background () {
    nohup ${@:1} > out.log &
}
```

内容を保存して、変更内容を適応します。

```sh
$ source ~/.zshrc
```

これで実行したいプロセスの先頭に `background` を付けるだけで、バックグラウンド実行することができます。

```sh
$ background echo "very very heavy task"
```

引数がいくつあっても大丈夫です。

```sh
$ background python takes_many_args.py foo bar --arg3 1234 --arg4 abcd
```
【Swift】可変長引数の関数に配列を渡したい！ときのworkaround

# 結論

自前の関数なら同名の関数をoverloadできます。

```swift
 // 配列を引数に取る関数側にロジックを実装する
 func greet(_ people: [String]) {
     print("Hello, \(people.joined(separator: ", "))!")
 }
 
 // 可変長引数を持つ関数側では、内部で配列を引数に取る関数を呼び出す
 func greet(_ people: String...) {
     greet(people)
 }
```

言語仕様として、引数に渡すときに配列を展開することはできないので、フレームワーク内の可変長引数（例えば、printなど）の関数に配列を渡すのは現状は難しいようです。

# 参考

[Passing an array to a function with variable number of args in Swift](https://stackoverflow.com/questions/24024376/passing-an-array-to-a-function-with-variable-number-of-args-in-swift)
Rubyでハナチャン(非破壊配列操作)

![listmonster.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21180/aa6c4d04-571b-575a-97a1-0992682787c9.png)

出典: [Learn You a Haskell for Great Good!](http://learnyouahaskell.com/starting-out)

## head

`array.first`

```ruby
irb(main):005:0> a = [1, 2, 3]
=> [1, 2, 3]
irb(main):007:0> a.first
=> 1
irb(main):008:0> a
=> [1, 2, 3]
```

## tail

`array.drop(1)`

```ruby
irb(main):005:0> a = [1, 2, 3]
=> [1, 2, 3]
irb(main):009:0> a.drop(1)
=> [2, 3]
irb(main):010:0> a
=> [1, 2, 3]
```

## init

`array[0...-1]`

```ruby
irb(main):010:0> a
=> [1, 2, 3]
irb(main):011:0> a[0...-1]
=> [1, 2]
irb(main):012:0> a
=> [1, 2, 3]
```

## last

`array.last`

```ruby
irb(main):013:0> a
=> [1, 2, 3]
irb(main):014:0> a.last
=> 3
irb(main):015:0> a
=> [1, 2, 3]
```
今日のメモ（バックスラッシュ記法、出力メソッド、ヒアドキュメント）

#バックスラッシュ記法
『\』に続けて文字を指定することで多様な使い方ができる

| 指定内容       |生成される文字        |
|:-----------------|------------------:|
| \x            |xの文字そのものを生成 |
| \n           |            改行 |
| \r             |              キャリッジターン |
| \f               |                改ページ |
| \a             |             ベル |
| \e          |           エスケープ |
| \s          |           空白 |
| \b          |           バックスペース |
| \t          |           タブ |
| \v          |           垂直タブ |

**※ダブルクォート『""』で囲んだ時のみ適用され、シングルクォート『''』で囲むと単なる文字と認識される**

\nなどを適用した結果を確認したい場合は、printかputsで出力。
↓『pとprintとputsの出力違い』↓

```
irb(main):012:0* p "a\nb"
"a\nb"
=> "a\nb"

irb(main):013:0> print "a\nb"
a
b=> nil

irb(main):015:0* puts "a\nb"
a
b
=> nil
```

#出力メソッドの違い
| メソッド | 改行 | 出力内容の構築メソッド |　バックスラッシュ記法 |
|:-----------------|------------------:|:------------------:|:------------------:|
| p |引数ごとに改行| inspectメソッド | そのまま出力 |
| print | 改行しない | to_sメソッド | 　適用した結果を出力 |
| puts | 引数ごとに改行 | to_sメソッド | 　適用した結果を出力 |

#ヒアドキュメント
終端を示す識別子にTESTを使用しました。
その間に挟まれた2,3行目が文字列となる。

```
hello = <<TEST
    ohayou
    gozaimasu
TEST

puts hello


#=> 
    ohayou
    gozaimasu
--------------------------------------------------

def hello
    -<<TEST
      ohayou
      gozaimasu
    TEST
end

puts hello
```

~~**※終端を示す識別子の前にはスペース等を記述してはいけない**~~
【JavaScript】日付の取得、計算、バリデーション (Dateオブジェクト)

#はじめに

日付の取得、日付の計算、便利なバリデーションなど学んだことを自分用のメモとして残します。
※後にlet,constなどの宣言について学ぶので今回は'var'を使用しています。


#Dateオブジェクトについて

DateオブジェクトはJavaScriptにもともと組み込まれているオブジェクトで、日付を取得したり、時間を計算する場合などによく使われます。

簡単に参考例を挙げてみます。


```js:js
// 本日の日時を取得する事ができます。
var today = new Date();

//取得したtoday(本日の日時)の西暦のみを取得します。
var Year = today.getFullYear();
//取得したtoday(本日の日時)の西暦のみを取得します。
var Day = today.getDate();
//取得したtoday(本日の日時)の西暦のみを取得します。
var Time = today.getHours();
.
.
.
//など調べると多くのメソッドがあります。
```


日付を入力してもらうプログラムを作る時など、日時を任意に設定することもできます。

```js:js
//各場所に数字を入力することで設定する事ができます。
//new Date(年, 月, 日,,,)←時間まで指定する事ができます
var date = new Date(2020, 7, 20);


//変数を当てはめることもできる

var y = 2020;
var m = 7;
var d = 20;

var date = new Date(y, m-1, d);
// 月は「0」を起点(1月 = 0)とするので「-1」で調整します
```


#日付の計算

日付を取得して計算をすることもできます。
年、月、日などの計算もできます。


```js:js
const date1 = new Date(2020, 7, 20);


date.setDate(date.getDate() + 3);
//3日後
//3日前を求めるときは - にします


date.setYear(date.getyear() + 3);
//年の計算
date.setMonth(date.getMonth() + 3);
//月の計算



```


#日付のバリデーション

日付を入力してもらうプログラムなどの際の有効な数字を以下のコードを使用することで簡単にチェックする事ができます。
（※半角英数字、文字数などのバリデーションは必要に応じて設定しないといけません。）


```js:js
var y = 2020;
var m = 7;
var d = 20;

var date = new Date(y, m-1, d);

var month = date.getMonth() + 1;
// 月は「0」を起点とするので今度は「+1」で調整します

if(m == month){
 var result = "有効な日付";
} else {
 var result = "無効な日付";
}
```

Dateオブジェクトで日付を取得する時、「7」を指定しているのに「Aug（8月）」になってしまいます。それは**月は「0」を起点**とするので7だと8月になります。（0 = 1月）

ですから、**var date = new Date(y, m-1, d);**で取得する時にm(月に−１しています)。

では、**13月に相当する「12」**を指定するとどうなるかというと、

```js:js
var today = new Date(2020, 12, 1);


console.log(today)

//Fri Jan 01 2021 00:00:00 GMT+0900 (日本標準時)
```
**月が1つ進んで2021年1月1日（水）**が返ってきます。

これは**日の部分も同じ**で、たとえば4月30日までしかないのに、4月31日を指定すると、以下のように5月1日が返されます。

```js:js
//2020年4月31日を指定
var today = new Date(2020, 3, 31);

//Fri May 01 2020 00:00:00 GMT+0900 (日本標準時)
```

この特性を使って、指定した月と返ってくる月が同じかどうか調べれば、日付が有効かどうか分かるということなんですね。
Flask_httpauth(速攻でログイン機能)

# 項目
1. flask-httpauthの使い方
2. AWSで使う際の作法

# 1.flask-httpauthの使い方
```bash:ターミナル
$ pip install flask-httpauth
```
- これで`flask-httpauth`をインストール完了、`pip freeze`も忘れずに

```python:python
from flask import Flask, render_template ,request
import pymysql
from flask_httpauth import HTTPBasicAuth
app = Flask(__name__)
auth = HTTPBasicAuth()

users = {
    "user": "password",
}

@auth.get_password
def get_pw(username):
    if username in users:
        return users.get(username)
    return None

@app.route("/")
@auth.login_required
def home():
    return render_template("home.html",subjects=subjects)
```
- `users`に入ってるやつは`"ユーザ名":"パスワード"`、これの組み合わせでログイン出来るか判断する
- この組み合わせを増やしてログイン可能アカウントを増やす事も可能
- `@auth.get_password~~return None`でいい感じにログイン処理をする
- `@auth.login_required`をルートに入れる事で、この処理の前にログイン作業を入れる
- テンプレートを書かないでもログインフォーム作れるの有難い

# 2.AWSで使う際の作法
- 使うpyファイルと同じ場所に`.ebextentions`ディレクトリを作り、その中に`auth.config`をviで作成

```bash:auth.config
container_commands:
  01_wsgi_pass_headers:
    command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'
```
- これで動く

# 3.終わりに
- 終わり！
交渉アナリスト補　二日間の研修受けました！

## 交渉アナリスト補

２級合格したので、勢い余って、こちらの研修も受けることにしました。
２級で学んだことをかいつまんで説明されたが、ロールプレイングがメインの研修でした。

## １日目
二つのロールプレイを行いました。

### ある発明機器を売る

一つ目は、架空の機械を売り買いするロールプレイング。

私は、買い手になり、とある郊外に立っているレストランのオーナーという設定。
目的はなるべく安く、お互いにWInWinになるようね、創造的な解決策を模索するというのが狙い。

このシムレーションは２回行われたが、二度とも商談はもうちょいのところで成立しませんでした。

### 一度目

標準小売価格７０万円というのは高く、キャッシュフローがカスカスのわがレストランに取っては、いたい出費。
こちらで準備したシナリオ：
売り手は、販路を拡大したい。レストラン業界にはまだ、足かせがないの
私の提示したオファー：
わがレストランで、試験的に使用し
使用した詳細を我が社のHPに載せる
販売者とHPに載せる
この試験がうまくいけば、系列のレストラン１００店舗に導入するきっかけになる。総額７０００万円の売り上げ。
なので、ただで使わせて欲しい。

回答
→１００店舗に導入できるのは嬉しいが、確証がないので、投機的。ただで提供すするのは割りに合わないということで、交渉の時間切れ。


### 二度目（別の人と同じシナリオで）

二度目は、なるべく前振りを短くして、同じオファーで望む。
売り手はかなり食らいついてきて、値段交渉に入る。
一度目の失敗から、ただという要求は出さずに、どこまで安くできるかをネゴる。

売り手はそれでも７０万円に固執しており、３ヶ月に試用期間を設けて、さらに分割払いではどうかという提案をしてくる。

総額を安くできないか？もし試用期間で機械がうまく動かなかったら、返品は可能かなどの交渉を行う。

かなりいいところまで行くが、ここで時間切れ。あと５分あれば、交渉は成立したかと思うが残念。

### 学んだこと
要点は簡潔に。主張は先に提案したものにアンカリングされがちなので、ファーストオファーをした方が優勢になる。

### ある不動産の販売
次のロールプレイングは、不動産の販売。今回私は販売者になり、１億８０００万円の物件を、最低でも１億６０００万円で売るというシナリオ。物件は、前に有名人の買い手いたが、その人が病気でなくなったので、また売りに出されるという「呪われたマンション」。雑誌にも取り上げられてしまい、売り側としては、ネガティブな状況でスタート

こちらも、２回のシムレーションがあった。

### 一度目
値段交渉と、付加価値が何が付けれるかのお互いの模索、ファーストオファーでこちらから１億８０００万円で提示したが、それには相手はアンカリングされずに１億４０００万円のカウンターオファーをくらい、うろたえる。

その後、こちらも実はあと３組この物件に興味を持っているカップルがいるなどの話で、値段交渉にのぞむが、セキュリティーシステムがしっかりしていない、他の物件も見ていてそっちの方が安いなどのBatnaで応戦される。

結局、値段交渉で最後まで折り合いがつかづに、時間終了。

### 二度目（別の人と同じシナリオで）
今回は、相手の状況をよく聞くことに専念。いろいろわかってきて、それらの状況を加味して、想像的な解決を目指す。
値段交渉で１億６０００万円で交渉が成立する寸前で時間終了。

### 振り返り
思いも寄らないカウンターオファーが来ると、うろたえてしまい、分割型交渉に陥ってしまい、なかなか想像的交渉に戻すのが難しかったです。一呼吸必要に感じました。



## 2日目

今日は二つのグループによるロールプレイ

### 店舗争奪
あるショッピングモールに、店舗の空きができて、その店舗のテナントになるべく、３社で提案をするというもの。見事提案の通った会社には、栄光のNegoバッチ（ねこのマスコットキャラクター）がもらえる！

３チームに分かれてそれぞれの会社の人間になりきり、プレゼンに望む。

チーム一丸となって、ショッピングモールの顕在、潜在ニーズを考え、そこから弊社ではどのような価値を創造できるのか、また、ショッピングモールの不安をどのように解消して行けるのかなどを議論する。

プレゼンでは、２枚の大きな模造紙を使って行うため、我々のとった作戦は、１枚目左側に、ショッピングモールの大目的と、解決すべき問題を羅列し、それに対応する右側に、それぞれ解決提案を列挙。２枚目は、それを元に、プレゼン用に絵を使い、ビジュアルに訴えることにした。

三社プレゼンの後、結果発表。

で、なんと、我々の提案が受け入れられ、見事栄光のNegoバッチをGet! これは流石に嬉しい！

講師から改善点が挙がったが、我々のチームは解決すべき問題が、出題内容からある程度網羅されており、その解決策も提示されていたので良かったと。ただ、ヴィシオンとか目的が、があまりにも高尚すぎて、そこから落としんだ解決すべき問題とのレベルにギャップがあるとのことでした。

### 3社競合

見事、テナントに昇格した、ガーデニング会社に、今度は、新たに同じショッピングモールにさらに店舗に空きができたので、３社で競合して、提案をして欲しいとのこと。つまり、３社間交渉を行うことになる。

ここでは、かなり長い交渉の時間が設けられ、一人一人が各社の代表者になり、３社交渉にのぞむというもの。

会議を優位に進めたかったので、私がくちびをきり、各社からの要望をまず出して、それを元に交渉して行きましょうと提案し、受け入れられたので、弊社の条件を出す。続いて、残り２社も条件を出してきた。

ここで交渉が難航し、気付いたら分配型交渉に陥っていた。最初に考えていたシナリオでは、創造型交渉に持ってゆく予定だったが、最初に各社の要望を上げてしまったのと、１社が強行姿勢を撮っていたので、他社（弊社も含む）がそれに負けてはいけないという打ち合わせの流れになってしまい、お互いに引くに引けなくなってしまった感があり、最終的にはなんとか３社で合意したが（３社合意が、この交渉アナリスト補の合格条件）、思った方向に進めなかったので、かなり心に傷を追ってしまった気がする。

### 振り返り
各社の要望を出すのは、出し方に気を付ける。また強行姿勢をとっている会社に対しての対応策（２級で学んだ）を出しても良かったのかな、と今反省してます。

研修は以上で終わり、無事交渉アナリスト補を取得したが、微妙に心残りな最後の演習だった。にがい経験ではあるが、本番で気をつけるべき項目が身にしみてわかったので、非常に良い経験だったと思います。

結果的には、無事交渉アナリスト補の認定書を受領しました！

あー、終わった！　二日間疲れたが、充実した研修でした。

次は１級にチャレンジ！
【Swift】\()を使用せず、文字列と一緒に変数をコンソール出力する方法

コンソールに文字列と一緒に変数を出力したい際、下記のように「 \ (変数)」を使用する方が多いと思います。

```swift

var foodList = ["カレー", "ラーメン", "カツ丼"]
print("食べ物： \(foodList)")
//出力結果　食べ物： ["カレー", "ラーメン", "カツ丼"]
```

実は下記のように、変数の前に「 , 」をつけるだけでもOKなんです。
「 \ ()」をタイプするよりも圧倒的に楽なのでオススメです。

```swift

print("食べ物： ", foodList)
//出力結果　食べ物： ["カレー", "ラーメン", "カツ丼"]
```
【vue/javascript】 ライブ動画再生がうまくいかなかったので、hls.jsで解決した話（IE11再生も）

# はじめに

ライブ動画再生がうまくいかなかったので、hls.jsで解決した話（IE11再生も）。

ライブ映像だとなぜかvideojsでうまく再生されない。しかも安定性にも欠ける部分があるらしい。

・https://www.techlive.tokyo/archives/4295
・https://ch.nicovideo.jp/skas-web/blomaga/ar1798847

ということでvideojsではなく、hls.jsを使用することにした結果、うまくいったのでメモ。

ちなみに、IE11再生もうまく行きます。
IE11再生させたい時には、開発者ツールを開いてネットワークタブにある「常にサーバから更新する」をオンにしてみてください。

・https://www.gitmemory.com/issue/video-dev/hls.js/2421/547774657

## 結論

videojs同様に、ドシンプル。

```vue
<template>
    <video id="video_id" controls webkit-playsinline autoplay></video>
</template>

<script>
import hlsjs from 'package.jsonのhlsjsで定義されていた名前' // hlsjsをnpmでインストール
export default ({
    data() {
        return {
            // hlsjsを機能させるための初期化処理を格納した変数
            hls: new Hls()
        }
    },
    methods: {
        // 動画再生時にこの関数を叩く
        playVideo: function(video_url){
            this.$nextTick(function () {
                var video = $('#video_id').get(0);
                if(Hls.isSupported()) {
                    var hls = this.hls;
                    hls.loadSource(video_url);
                    hls.attachMedia(video);
                    hls.on(Hls.Events.MANIFEST_PARSED,function() {
                        // 動画再生
                        video.play();
                    });
                } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
                    video.src = video_url;
                    video.addEventListener('loadedmetadata',function() {
                        // 動画再生
                        video.play();
                    });
                }
            })
        },
        // 動画停止時にこの関数を叩く
        stopVideo: function(){
            // 動画停止
            this.hls.destroy();
        }
    }
})
</script>
```

## ちなみに

videojsだと以下のように実装。

```vue
<template>
    <video id="video_id" controls webkit-playsinline autoplay></video>
</template>

<script>
import videojs from 'package.jsonのhlsjsで定義されていた名前' // videojsをnpmでインストール
export default ({
    methods: {
        // 動画再生時にこの関数を叩く
        playVideo: function(video_url){
            var player = videojs("video_id", 
              {
                flash: {
                  hls: {
                    withCredentials: false
                  }
                },
                html5: {
                  hls: {
                    withCredentials: false
                  }
                }
              }
            );
            player.src({
              src: video_url,
              type: 'application/x-mpegURL'
            });
            player.play();
        },
        // 動画停止時にこの関数を叩く
        stopVideo: function(){
            // 動画停止
            videojs('video_id').dispose();
        }
    }
})
</script>
```
【ポートフォリオを作成する方へ】文字列を省略する方法

ポートフォリオを作成する際、長文を省略して「続きを読む」とか「...」と表示したいなと思い調べたのでこちらにまとめます。

##結論
truncateメソッドを使います。

##使い方
truncateは2種類あります。

###String
```string.rb
 "春はあけぼの。やうやう白くなりゆく山際、少し明かりて、紫だちたる雲の細くたなびきたる。".truncate(30) %>
 # "春はあけぼの。やうやう白くなりゆく山際、少し明かりて、..."
```
| オプション   | 説明  | デフォルト |
|:------- | :-------  |:-------|
|:omission| 省略された文字列の後ろにつける文字列　|...|
|:separator|区切り文字。中途半端なところで文字列が切れないようにする。日本語だとできない。   |  なし |

これらを使うと、

```string.rb
"春はあけぼの。やうやう白くなりゆく山際、少し明かりて、紫だちたる雲の細くたなびきたる。".truncate(30, omission: '...続きを読む', separator: ' ')
# "春はあけぼの。やうやう白くなりゆく山際、少...続きを読む"
```

###TextHelper

```texthelper.rb
truncate("春はあけぼの。やうやう白くなりゆく山際、少し明かりて、紫だちたる雲の細くたなびきたる。")
# "春はあけぼの。やうやう白くなりゆく山際、少し明かりて、..."
```
| オプション | 説明 | デフォルト |
|:--------|:------|:-------|
|:length   |省略前の文字列長   |  30 |
|:omission   |省略された文字列の後ろにつける文字列   | ...  |
|:separator   |区切り文字。中途半端なところで文字列が切れないようにする。日本語だとできない。| なし|
|:escape   |HTMLエスケープ(falseを指定するとエスケープしない)   |true   |

##実際に使った結果
投稿をしてくれた人の内容を表示をする際に使いました。

```
<%= truncate(@post.content, length: 50) do %>
  <p><%= link_to '続きを読む', @post %></p>
<% end %>
```

<img width="996" alt="スクリーンショット 2020-07-20 19.03.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547550/c10f8aa3-5f1e-46ce-3b7d-f805f3f96017.png">
週報入力をすると右側に投稿が表示され、投稿内容50文字表示したあと、続きを読むというリンクで詳細に飛ぶようになっています。

##参考
https://apidock.com/rails/String/truncate
https://apidock.com/rails/ActionView/Helpers/TextHelper/truncate
JavaScript Dateオブジェクトの罠について

# Dateオブジェクトの罠について
## 年月日指定でオブジェクトを生成する時、区切り文字によって時刻が異なる
### ハイフン区切りの場合

```javascript
var date = new Date('2020-07-01');
console.log(date);
// => Wed Jul 01 2020 09:00:00 GMT+0900 (日本標準時)
```

### スラッシュ区切りの場合

```javascript
var date = new Date('2020/07/01');
console.log(date);
// => Wed Jul 01 2020 00:00:00 GMT+0900 (日本標準時)
```

- ハイフン区切りの場合では、指定年月日の**09:00:00**を返すが、スラッシュ区切りの場合では、指定年月日の**00:00:00**を返す