OmniAICreator/Qiita-1.07M huggingface dataset:
代表的なjustify-contentと、特徴。

## justify-contentの種類

justify-contentは大きな分類として<font color="red">**「位置による配置」と「均等配置」**</font>があります。
それぞれの配置方法で値を列挙します。

【位置による配】
justify-content: center;
justify-content: start;
justify-content: end;
justify-content: flex-start; 
justify-content: flex-end;
justify-content: left; 
justify-content: right; 

【均等配置】
justify-content: space-between;
justify-content: space-around;
justify-content: space-evenly;
justify-content: stretch;

これだけあります。ただ実際に良く使うものとしては以下になります。

【よく使う値】
justify-content: center;
justify-content: flex-start; 
justify-content: space-between;
justify-content: space-around;
justify-content: space-evenly;

今回はこのよく使う5つに焦点を当てて解説していきたいと思います。

## そもそもjustify-contentとは

簡単に言ってしまうと。
<font color="red">**flexboxにおける、コンテナ内のアイテムの整列をするプロパティです。**</font>
整列というのは、ExcelやWordにもある、文章の中央揃えや文字の間隔を空ける機能をイメージに近いです。

一応大前提として、flexboxの親クラスをコンテナ、子クラスをアイテムと言います。
これがわからないと理解出来ないのでしっかり区別しましょう。

## それぞれの特徴

#### justify-content: space-between;

<font color="red">**１番目のアイテムと最後のアイテムを両端に設置し、残りのアイテムを等間隔に配置します。**</font>
値の部分の英語の意味を理解するとより分かりやすくなります。

space→空白
between→間

アイテムとアイテムの「間」に「空白」を入れる。と考えといいでしょう。
また「空白」は当分された値が配置されます。以下参照。

![スクリーンショット 2020-11-25 1.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/aaa76074-43be-e0d0-0f85-1d8a73dbcd22.png)

一番イメージしやすい値だと思います。<font color="red">**使用頻度も高いです。**</font>

#### justify-content: space-around;

ちょっと考え方が難しいです。まずは英語の意味を理解します。

space→空白
around→周り

アイテムの「周り」に「空白」が均等に配置されます。
言葉だけだと難しいので画像と図を作りました。

![スクリーンショット-2020-11-25-2.06.27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/9a3d4ac1-580d-333c-be1b-ae4448278578.jpeg)

アイテムの周りに同じサイズのmarginをつけてる感じです。<font color="red">**使用頻度としては、これも結構使われます。**</font>

#### justify-content: space-evenly;

一見「space-around」に近いですが、全ての「空白」が「均等」に配置されます。
英語の意味通りです。

space→空白
evenly→均等

![スクリーンショット-2020-11-25-1.21.33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/1db22984-8f9f-bbac-6311-4967b05f3420.jpeg)

空白が全て均等なので非常に分かりやすい値です。<font color="red">**使用頻度としては、これも結構使われます。**</font>またspace-aroundとどっちを使うかよく迷います。

#### justify-content: center;
これは簡単です。コンテナの中心にアイテムが配置されます。

![スクリーンショット-2020-11-25-1.21.54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/02a56caf-0702-09e5-cd5b-db27ac2ea0a6.jpeg)

#### justify-content: flex-start;

これも簡単なのですが、使い所に関しては悩むところがあります。<font color="red">**コンテナの「左」から配置が始まります。**</font>
ちなみにflex-endだと「右」から配置されます。
正直今のところ「justify-content:normal;」「justify-content:start;」と違いが分からないです。(わかる人いたら教えて)
ただしレスポンシブで値を上書きする時によく見かけます。

![スクリーンショット-2020-11-25-1.22.17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/60c88eec-92b3-19a0-320e-3eff807e1619.jpeg)

## 最後に
今回はだいぶ内容が薄くなってしまいました。
ただjustify-contentはdisplay:flex;とセットでよく使うので復讐になってよかったです。
それぞれ実際に使う際に気をつけないと行けない点があってそれも記事にしたかったのですが時間の関係でまとめられませんでした。手が隙次第まとめていきます。
Storm 0.5 for macOS 起動できない時

#概要
EffectiveTDsのシミュレーションソフト「Storm 0.5」について
「Storm_nodelocked.app」から起動できない時の手順

>公式ページ (https://effectivetds.com/storm/)

~~フィッシング消えてくれ...~~

#ダウンロード
（読み飛ばして大丈夫です）
Demo版の方は先ほどの公式ページ下部の「Download Strom Demo MacOS」から、ライセンスを購入した方はページ上部の「My account」->「Downloads」からdmgファイルをダウンロードして「Application」内にインストールします。demo版はフォルダ内の「Storm_demo.app」から起動します。

#MachineIDを表示
ライセンスを購入した方はMachineIDと名前を送ってライセンスファイルを貰う必要があります。MachineIDを表示する実行ファイルは「Storm_nodelocked_0.5.XXX」内の「MacOS」フォルダにあります。

ターミナルを開いて

```:zsh
 cd ../../Applications/Storm_nodelocked_0.5.063/Storm_nodelocked.app/Contents/MacOS
```

```:zsh
 ./Storm_nodelocked
```

と実行して、

```zsh
Storm 0.5.063: hello
 (c) 2017 - 2020 Sebastian Schaefer - storm@blackbox-vfx.de
built on: Nov 15 2020

resetting
License not found or not valid. :(
Please pass on the following machine ID to license@blackbox-vfx.de:

Machine ID: XX:XX:XX:XX:XX:XX
```
このMachineIDをメールで送ります。

#ライセンスファイルを貰って起動

![mail_storm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583941/457154d4-024d-db66-aa0e-21f65b78d9ec.png)

こんな感じでライセンスファイルが送られてくるので、指示通りファイルを同じフォルダに入れて起動できます。

#環境
 macOS Catalina 10.15.6
脱深夜残業、脱早朝出勤！たった5分でkintoneの使用可能な時間帯を制限する方法

#さよなら深夜残業。こんにちは早朝出勤。（苦笑）
どこかで聞いたことのあるフレーズですね。
せっかく kintone を導入しても深夜まで作業していちゃだめですよね。
今回の記事ではたった 5 分でできる「さよなら深夜残業。こんにちは早朝出勤。（苦笑）」を禁止する方法を紹介します。

※ kintoneの使用可能な時間帯を制限するだけです。作業効率が上がるかはあなた次第です（？）

#さっそくやろう
もう残り時間も 4 分を切ったのでさくさくとやります。
やることはたった 3 つです。JavaScript のファイルを作成 -> JavaScript ファイルのアップロード -> おしまい。
この 3 ステップで、**指定した時間帯以外のアプリの利用を禁止** します。

### 1. JavaScript のファイルを作成
以下のコードをコピペして JavaScript のファイルを用意します。
ファイル名は任意ですが、nozangyo.js というファイルを作成し、そこに以下のコードをコピペします。
if 文の条件でアプリの使用可能な時間帯を設定します。
「(hour >= 8 && minute >= 0)」は開始時刻、「(hour <= 20 && minute <= 59)」は終了時刻の指定です。
以下の例では 8:00 - 21:00 まで使用可能となっていますが、適宜変更してください。(時刻が日をまたぐ場合は不等号の向きにご注意ください)
また、「location.href = 'https://<対象の環境のサブドメイン>.cybozu.com/k/#/portal';」は自社の kintone の URL に合わせてください。

```nozangyo.js
(function() {
	'use strict';
	const date = new Date();
	const hour = date.getHours();
	const minute = date.getMinutes();

	// 使用可能な時間帯を設定する
	if ((hour >= 8 && minute >= 0) && (hour <= 20 && minute <= 59)) {
		//document.write("使用可能です");
	} else {
		alert('時間外です');
		location.href = 'https://<対象の環境のサブドメイン>.cybozu.com/k/#/portal';
	}
})();
```


### 2. JavaScript ファイルのアップロード
kintoneシステム管理 -> JavaScript / CSSでカスタマイズ -> PC用のJavaScriptファイル (スマートフォン用のJavaScriptファイル) の "アップロードして追加" ボタンからさっき作った js ファイルをアップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320008/bfaa3d9b-cede-9c9e-ed19-3baa4ea331dc.png)


### 3. おしまい
深夜 1 時
「さて顧客リストのアプリでも開くか～」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320008/ef282362-5e19-8be3-ace4-1cd04d6557d4.png)


「ん！？」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320008/5a971b55-c73a-5025-85f3-164262ad2a1f.png)

「（なぜかポータルに戻ったぞ）」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320008/05980dc3-e51e-bcec-08e1-63e57bfabfe4.png)



さよなら深夜残業。さようなら早朝出勤。
[PlayCanvas] Buttonの入力イベント(修正)

# はじめに
PlayCanvasにはクリックやタップなどの入力に反応してイベントを発火させる事が出来るButtonというものがあります。
これには**Hover**, **Pressed**, **Inactive**という項目があり、それぞれ未入力時、押下時、非活性時のボタンのビジュアルが設定できます。
[基本的な実装方法](https://qiita.com/yushimatenjin/items/3479ee3fd7aa712cbefe)は割愛しますが、これにより以下のようなものが実装できます。
![demo_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67270/66b41b83-8d87-16d0-72e8-20cb161a4cf1.gif)

# 本題
先の動画には問題があり、Blackと書かれたボタンは非活性状態にしているものなのですが、動作しています。
非活性にしているということは本来動作してほしくない部分のハズです。

想定している動作はこのようになります↓
![demo_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67270/6091e0d0-3ee0-99c9-02ab-bb799eb1a3ca.gif)

これを実装する方法は3つあります。
1. Button Componentの**Active**の項目を見て処理を行うか判断する。
2. Element Componentの**Use Input**のチェックボックスを外す。
3. `this.entity.button.on`を使用する。

## 1. Activeの項目をチェックする
自前のスクリプト上で制御する方法です。
`this.entity.button.active`がtrueの場合は活性状態なので、処理を実行する、といった感じの実装をしてあげればいいです。

``` javascript
var Button = pc.createScript('button');

Button.prototype.onPress = function() {
    if( this.entity.button.active ){
        /* 活性時の処理 */
    }
};
```

## 2. Use Inputをfalseにする
Element ComponentのUse Inputの項目をfalseにする事で、入力イベントそのものを受け取らない様にする方法です。
実装としてはこちらがメインになります。

## 3. this.entity.button.onを使用する
Button Componentにイベントを登録する方法です。
この方法では自動的にActiveの状態をチェックします。

``` javascript
var Button = pc.createScript('button');

Button.prototype.initialize = function() {
    this.entity.button.on(pc.EVENT_TOUCHSTART, this.onPress, this);
};

Button.prototype.onPress = function() {};
```

# おわりに
最後の方法はなぜか[公式マニュアル](https://developer.playcanvas.com/en/tutorials/ui-elements-buttons/)に書いてない。
REAPERで7.1chサラウンドを2chステレオにダウンミックスする

7.1chサラウンドの音源を2chステレオにダウンミックスしたくて、[DTS Neural™ Surround DownMix](https://www.waves.com/plugins/dts-neural-surround-downmix)のサイトを見たりいろいろ調べていたところ、[audiokineticのサイト](https://www.audiokinetic.com/library/2016.2.6_6153/?source=Help&id=downmix_tables)に以下のようなダウンミックス表を見つけました。

Input Channels | L | R
---|---|---
FL(1ch)|1|0
FR(2ch)|0|1
C(3ch)|1/√2|1/√2
SL(5ch)|1/√2|0
SR(6ch)|0|1/√2
BL(7ch)|1/√2|0
BR(8ch)|0|1/√2

LFEチャンネル(4ch)は無視するみたいです。
なるほど、これに従って入力音声から出力音声を生成すれば良さそうだ。

REAPERにはJSという音声処理を自分で記述できる仕組みがあるので、これを使います。
REAPERにトラックを作成し、FXをインサートし、メニューバーからFX→Create new JS FX...をクリックする。
![スクリーンショット 2020-11-25 2.19.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56668/d0a841cc-694d-36c8-5e9f-04b19a462412.png)

エフェクト名を入力したらテキストエディタが開くので、以下のコードをコピペします。

```
desc:7.1 to 2ch downmixer
//tags: mixer gain
//author: Niusounds

in_pin:L
in_pin:R
in_pin:C
in_pin:LFE
in_pin:LS
in_pin:RS
in_pin:LCS
in_pin:RCS
out_pin:L
out_pin:R

@slider
_1_sqrt2 = 1 / sqrt(2);

@sample
spl0 = spl0 + spl3 * _1_sqrt2 + spl5 * _1_sqrt2 + spl7 * _1_sqrt2;
spl1 = spl1 + spl3 * _1_sqrt2 + spl6 * _1_sqrt2 + spl8 * _1_sqrt2;
```

Cmd+Sで保存すればできあがりです。

5.1chの場合は上記のうち7,8chを使わなければ良いだけなので、5.1chの音源にもそのまま適用可能だと思います。


[audiokineticのサイトの別ページ](https://www.audiokinetic.com/library/2016.2.6_6153/?source=Help&id=standard_configurations)にも記載がありますが、

> The Wwise downmix performs no normalization, given the arbitrary nature of normalization coefficients. It is, therefore, common that downmixing from configurations with large numbers of channels to configurations with few channels results in loudness gains.

適当訳: ダウンミックスをすると音量が増えます。

なので、上の処理を通すと元の音源よりもピークレベルが上がります。ピークを超えないように適宜ゲインを調整する必要がありそうです。
【iOS14】CollectionViewのscrollToItemが機能しない場合の対処法

iOS14において、CollectionViewの`scrollToItem`が機能しないバグが報告されています(執筆時、2020年11月25日現在)。AppleのDeveloper Forumsでも話題になっており、iOS14.2でも修正されていないようです。私もOS依存のバグとは気づかず、仕事で10時間くらい時間を溶かしました（ずっとiOS14のシミュレータでなんでスクロールできないんだろうと四苦八苦してた）

https://developer.apple.com/forums/thread/663156

## scrollToItemの説明（読み飛ばし可）

`scrollToItem`は指定した`indexPath`までcellをスクロールさせることができるものです。アプリ初回起動時のウォークスルー、チュートリアル画面などで、スワイプではなくボタンタップでcellをスクロールさせるような場合に使ったりすると思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290717/0f40a101-378b-1964-676c-3a02e2e5198b.gif" width="240">

例えば上記のような画面で「次へ」を押した時にページをスクロールするような場合は、以下のように書けます。

```
collectionView.scrollToItem(at: IndexPath(item: newPage, section: 0), at: .init(), animated: true)
```

しかしiOS14では、「次へ」を押してもなぜかスクロールされない状態となっています。


## 解決方法
フォーラムでは下記のように`scrollToItem`前後で`isPagingEnable`のBool値を切り替えるような手法が提案されています。

```
self.collectionView.isPagingEnabled = false
self.collectionView.scrollToItem(at: indexPath, at: .left, animated: false)
self.collectionView.isPagingEnabled = true
```

実際試すとこれでもうまくいくのですがこれよりも、冒頭のようなチュートリアル画面を作りたい場合は、同じくcollectionViewの`setContentOffset`で代用する方が良いのではないかなと思いました。

```
let cellWidth = collectionView.frame.width * CGFloat(newPage)
let cellHeight = CollectionView.frame.minY
collectionView.setContentOffset(CGPoint(x: cellWidth, y: cellHeight), animated: true)
```

チュートリアル画面ではなくとも今まで`scrollToItem`を使っていた実装は、同じように座標を取得する方法が有効かと思います。

おそらくすぐにAppleが対応してくれる問題だとは思うのですが、もしお困りの方がいらっしゃったら試してみてください〜


## 参考
[UICollectionViewでチュートリアル画面を作る](https://qiita.com/ddd503/items/434ce6b6e57a1552e2d9)
XibファイルのButtonを配置してActionさせる方法　addTarget

Xibで書いたらViewControllerに紐付けできない！！どうしようと悩んでいて解決したのでメモります。

#ファイル構成
青いViewの読み込みしたいファイルが`sampleHomeView.Swift` `sampleHomeView.xib`
ViewControllerのファイルが`sampleViewController.swift` `sampleView.Xib`です。
この4つファイルで説明します。
![スクリーンショット 2020-11-25 1.19.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684645/76817fc0-5d86-443e-c4ce-c53d9765d6e3.png)
#解説
こちらを参考にXibをViewに読み込ませてみてください！
　　　　　　　↓↓↓↓↓↓↓↓↓↓
[Xibファイルで作ったUIをViewに読み込む方法](https://qiita.com/Resan0725Apple/items/5525c79864b7d4780c06)

読み込ませたら`sampleHomeView.xib`にUIButtonを置きましょう。
![スクリーンショット 2020-11-25 1.33.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684645/7a504240-138e-c83a-7b13-5477de172721.png)


Buttonを置いたら、`sampleHomeView.swift`に紐付けしていきます！注意⚠️Outletです。
![スクリーンショット 2020-11-25 1.36.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684645/bb160a54-a01b-c0e6-ca25-097564825fd3.png)
その次に`sampleViewController.xib`で紐付けをします！
TypeをUIViewではなく、読み込ませている`sampleHomeView`に設定します。
![スクリーンショット 2020-11-25 0.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684645/a61e553a-41dd-b993-d722-6da3b27813a8.png)

XibファイルからViewControllerに引っ張って紐付けすることができないので違う方法で紐付けます！

sampleHomeViewと書くとプロパティーで先ほど紐付けしたボタンが
sampleViewControllerの中でsampleButtonが呼べるようになります。

for 今回はタップした時に呼ばれます。

@objc funcの中に処理を書きます。

Xibでやる場合はIBActionではないんですね〜！！
コードはこんな感じです。

```Swift:sampleViewController.swift
import UIKit

class sampleViewController: UIViewController {
    
    @IBOutlet weak var sampleHomeView: sampleHomeView!
    @IBOutlet weak var sampleView: sampleHomeView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        sampleHomeView.sampleButton.addTarget(self, action: #selector(sampleViewController.tapSampleButton(sender:)), for: .touchUpInside)
    }
    
    @objc func tapSampleButton(sender:Any) {
        sampleView.backgroundColor = UIColor.red
    }
    
}


```

ちなみに`sampleHomeView.swift`のコードはこんな感じ

```Swift:sampleHomeView.swift
import UIKit

class sampleHomeView: UIView {
    
    @IBOutlet weak var sampleButton: UIButton!
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        loadView()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        loadView()
    }
    
    private func loadView() {
        let className = String(describing: type(of: self))
        let view: UIView = Bundle.main.loadNibNamed(className, owner: self, options: nil)?.first as? UIView ?? UIView()
        view.frame = bounds
        addSubview(view)
    }
}


```

今回ではボタンを押すと背景色が赤になるというようになっています。
![スクリーンショット 2020-11-25 1.58.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684645/2b93e671-a548-9839-a9e0-d0bed358ab8d.png)
このようにXibファイルでButtonを使ってみました！！
以上、XibファイルのButtonを配置してActionさせる方法でした。
【Firebase】Realtime Database 書き込み/読み取り/削除


#書き込み
①push : 
要素ない場合     → 追加
すでに要素ある場合→その要素に新しい要素を追加

②set :
要素ない場合     → 追加
すでに要素ある場合→上書き

③update : 
要素ない場合     → error
すでに要素ある場合→上書き

```csharp
firebase.database().ref("test").push({
 name: payload.name,
 title: payload.title
})

firebase.database().ref("test").set({
 name: payload.name,
 title: payload.title
})

firebase.database().ref("test").update({
 name: payload.name,
 title: payload.title
})
```


#読み取り

①1回読み取り　→　once()
※１回だけのみトリガーすることが可能です。
※ その後再びトリガーされることはありません。

```csharp
var commentsRef = firebase.database().ref('tests')

commentsRef.once('value').then(function(snapshot) {
  console.log(snapshot.val());
});
```


#削除

①remove() 
※ 他の書き込みオペレーション（set() や update() など）の値として null を指定する方法でも削除可能。

```csharp
firebase.database().ref("freetalks").child(payload.id).remove()
        .then(()=>{
          commit("deleteTalk", payload)
        }
```
30代からのプログラミング勉強　1日目

#30代からのプログラミング勉強　1日目
ズブズブの素人(おっさん)備忘録。
学習は主にUdemyを活用。
アウトプットによる理解度確認として日々投稿していく予定。

どうぞよしなに。
##学習コースと内容

[HTML/CSS/JavaScript] フロントエンドエンジニアになりたい人の Webプログラミング入門

導入部からという事でVisual Studio Codeのインストールや設定から行い簡単なHTMLの動作について動画内容を真似をしつつ学習。


####学習したHTMLタグ

見出し（6段階ある）

    <h1><h/1>

行（という表現でいいのか...）

    <p></p>
input（nameは必須。他は必要に応じて）

    <input type="" name="" value="">


##所感
動画コンテンツなので直接動作を見ながら学習できる点は初心者の私から見ても進めやすいと感じた。
あと、Chromeで即反映するのはとても楽しい。

##番外
Markdown記法？なんだこれ慣れてないと時間かかる...けど、これもこれで楽しかったり。

学ぶべき事は膨大だがこれに限らず引き続き楽しみながらの学習ライフとしていきたいと思うのであった。(ここまで書くだけで1時間かかったけど笑)
Salome-Meca2019による練習２：書籍『例題で極める非線形有限要素法』より

Salome-MecaはDEXCS2014版を長らく使っています．最近，Salome-Mecaの2019 を使い始めました．そのための練習用に，以下の本に載っているMarcでの事例をSalome-Mecaで計算しようとしています．

Markdown記法に慣れていないため読み難いかもしれません．頑張ってMarkdown記法を覚えていきます．


**例題で極める非線形有限要素法**
CAEで正しい結果を導くための理論トレーニング
発行元：丸善出版　　発行年月日：2020年10月
https://www.maruzen-publishing.co.jp/item/?book_no=304000

-----------------

##【CS03-01】 棒状試験片

形状：中央部の直径がΦ5mmの長さが約50mmで，両端部の直径がΦ10mmの棒状試験片．
　　　段付き部のフィレットは大勢に影響がないので適当な寸法で作成しました．
境界条件：一端を固定し，他端に軸方向荷重19.325=2.5×2.5×π[N]を掛けます． 
縦弾性係数は200,000[MPa]，ポアソン比は0.3です．

理論解：中央部での応力は 1 [MPa]で，歪みは 5×10^-6 [mm/mm]となります。

全体メッシュは
- 3D:Extrusion 3D
- 2D:Qudrangle:Mapping
- 1D:Wire Discretisation
           Local Length 0.5

端面の円形にはサブメッシュを設定しました．
- 2D:Radial Quadrangle 1D-2D
- 1D:Wire Discretisation

| メッシュ | 2D Number of Layer|1D Local Length |
|:--------|------------------:|:---------------:|
| Mehs3   |10    | 0.25   |
| Mesh1   |10    | 0.5    |
| Mesh2   |10    | 2.0    |


線形要素で作成し，メッシュ数は下表になりました．

| メッシュ | Hexahedrons | Pyramids | Prisms |
|:--|--:|:--:|:--:|
| Mehs3  |233604 | 0 | 25956|
| Mesh1  |116802 | 0 | 12978|
| Mesh2  | 29664 | 0 |  3296|


計算結果は下記です．
ひずみの単位は　×10^-6 [mm/mm]です．


| メッシュ | Exx     | Eyy      | Ezz      | νxy     | νxz     |νの平均値|
|:--------|--------:|:--------:|:--------:|:-------:|:-------:|:-------:|
| Mesh3   | 5.52585 | -1.69475 | -1.69953 | 0.30669 | 0.30756 | 0.30713 |
| Mesh1   | 5.52470 | -1.67929 | -1.69914 | 0.30396 | 0.30755 | 0.30576 |
| Mesh2   | 5.50267 | -1.69175 | -1.69175 | 0.30744 | 0.30744  |0.30744 |

表の上のメッシュほど円周を細かく分割しています．
参考にしている本では,もとの円よりも近似した多角形のほうが面積が小さいため歪Exxが理論値より大きくなり，表の上のメッシュほど円を正確に近似しているので歪Exxが理論値に近づいていくと書かれています．
ところが，Salome-Mecaで計算した結果はそのような傾向になっていません．
Salome-MecaのAFFE_CHAR_MECA の FORCE_FACE は単位面積当たりの荷重[MPa]を指定します．そして，メッシュを Extrusion で作成したためメッシュによる差が出ていないだろうと考えられます．

理論値の 5×10^-6 に対して全て5.5×10^-6で約10%大きな値になっています．ポアソン比は約2%くらいの誤差のため，変形しにくい剛性が高い状態になっています．~~２次要素で計算して傾向が変わるか試してみたいです．~~

２次要素で計算した結果を下表に示します．２次要素とすると精度が改善するだろうと思いましたが、歪Exxの値はさらに大きくなりポアソン比の値も大きくなり，不思議な結果です．原因に心当たりのある方はコメントしていただけると嬉しいです．ソルバーの設定はデフォルトのままなので MUMPS です．(2020/12/02追記)

| メッシュ | Exx     | Eyy      | Ezz      | νxy     | νxz     |νの平均値|
|:--------|--------:|:--------:|:--------:|:-------:|:-------:|:-------:|
| Mesh2   | 5.55378 | -1.84095 | -1.84063 | 0.33148 | 0.33142 | 0.33145 |



下の図は．Mesh3 です．
![mesh_cs_03_01_3_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888272/e4109567-eb19-1b55-83ad-d8d94ec8101f.png)
![mesh_cs_03_01_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888272/1edad5a1-d871-6c5c-e784-6c79d8ad176f.png)
React 未学習者 Q.「React って学習コスト高いんでしょ？」A.「

いやいやいやいや！高くない高くない、全く高くない！
簡単！React なんてホント簡単だから！！超簡単だよ？
ほら、これみて！

```html
<div id="first">Hello world</div>
```

これ React で表示するなら、

```jsx
ReactDOM.render(
  <div id="first">Hello world</div>,
  document.getElementById("root")
);
```

ってするだけだからね？
`ReactDOM.render([描画したい要素], [描画する位置])` って書いてるだけだからね？

# Q.「コンポーネントって難しいんでしょ？」A.「

いやいやいやいや！難しくない難しくない、全く難しくないって！
簡単！コンポーネントなんてホント簡単だから！超簡単だよ？
ほら、これみて！

```jsx
const App = () => {
  return <div id="first">Hello world</div>;
}
```

これ App って名前付けたコンポーネントね。
コンポーネントなんて単に関数みたいなの書くだけだからね？
コンポーネント名の 1 文字目を大文字にして、描画したい要素を `return` するだけだからね？

え、App コンポーネントを描画したい？それなら、

```jsx
ReactDOM.render(
  <App/>,
  document.getElementById("root")
);
```

ってするだけだからね？ほら、簡単でしょ？

# Q.「Props っていう新しい考え方を覚えないといけないんでしょ？」A.「

いやいやいやいや！新しくない新しくない、全く新しくないって！
データデータ！Props なんて単なる受け渡し用のデータだから！
ほら、これみて！

```jsx
ReactDOM.render(
  <App/>,
  document.getElementById("root")
);
```

これ、さっきの App コンポーネントね。これに `title` っていう名前で `PROPS` って値を渡したいときは、

```jsx
ReactDOM.render(
  <App title="PROPS"/>,
  document.getElementById("root")
);
```

って書くわけ。この追記した部分 `title='PROPS'` を Props って読んでるだけだからね？
ちなみに受け取りは、App コンポーネントで

```jsx
const App = (props) => {
  return <div id="first">Hello {props.title}</div>; // 'Hello PROPS'
}
```

ってするだけだからね？ほら、簡単でしょ？

# Q.「State っていうのも聞いたことがあるんだけど？」A.「

そうそうそうそう！State 、State ！なんで State 知ってるの？神なの？ 
State はデータ！State は内部管理用のデータだから！
ほら、これみて！

```javascript
const [count, setCount] = useState(0);
```

これ `count` っていう名前の State と、State を更新する `setCount` って関数を記述してるだけだからね？

`useState(0)` って単に `count` の初期値を `0` ってしてるだけだからね？

え、つまり State はどう使うのって？
例えば、

```jsx
const {useState} = React; // state 使う時はこれ書いてね。

const App = () => {
  const [count, setCount] = useState(0);
  return (
    <div onClick={() => setCount(count + 1)}>Click me</div>
  );
}
  
ReactDOM.render(
  <App/>,
  document.getElementById("root")
);
```

みたいにすれば、クリックすると 1 増える div 要素が作れるわけ。ほら、簡単でしょ？

# Q.「・・・・・」A.「

あ、そういえば、いままで言ったことって 1 つの HTML ファイルで書く想定だったから、書く時は次の script タグ加えてね。（重要）

```html
<script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
```

あと 自分で書くソース部分は `<script type="text/babel"> ... </script>` って書いてね。（重要）

# あとがき

こんな感じで、全力＆前のめりに React の学習は簡単だよって言ってくれる人がいたら良かったのに、と思ったので書きました。

JSX とかクラスコンポーネントとか環境構築の話とかはあえて触れずに書いてます。新しいこと学ぶときってどうしても心理的ハードルが生まれると思うので、覚えることは最小限にして伝えたくて。

この記事が誰かの React 学習のとっかかりになれると嬉しいです。

読んでいただき、ありがとうございました。

みんな React やろうぜ :)

- - -

Kindle（セルフ出版）で本出してます。ご興味ある方はぜひ。

- [React学習挫折経験者による挫折しないReact基礎学習](https://www.amazon.co.jp//dp/B08P255DXY)

振り返りを兼ねて個人開発系アドカレに参加しました。

- [3年間の個人開発を通じて得た気付き](https://qiita.com/drytt/items/b78db945eceb03cae2cf)
PC-KeibaDBテーブル名のメモ

# PC-KeibaDBのテーブル名メモ

pc-keiba様でPostgresに作成していただいた、セットアップデータのDB。
テーブル名に略語が多用されており、競馬素人にはピンと来ないので以下に名前の対応表を作成。
JRAｰDataLab様から提供されているサンプルコードにDB仕様書があったのでこちらを参考にマッチを見つける（人力）。
ついでに競馬用語の勉強させていただく。

|PC-Keiba|JRA|
|---|---|
|jvd_hc|坂路調教|
|jvd_hn|繁殖馬マスタ|
|jvd_hr|払戻|
|jvd_hs|競走馬市場取引価格|
|jvd_hy|馬名の意味由来|
|jvd_ks|騎手マスタ|
|jvd_ra|レース詳細|
|jvd_rc|レース詳細|
|jvd_se|馬毎レース詳細|
|jvd_sk|産駒マスタ|
|jvd_tc|発走時刻|

# オッズテーブルのメモ

- オッズは28頭想定で8桁毎繰り返しで表記されている
- 単勝の場合、馬番2桁、オッズ4桁（3桁＋小数点以下1桁）、人気2桁
ゴミの日に何の種類のゴミを出さなきゃダメなのか通知してくれるLINE BOT

#やりたいこと＆その理由

ワイ奥さん『いい加減にゴミの日を覚えろ』
ワイ『はい』

覚えられないので、BOTに頼ることにしました。


#実装方法
１：　当日の日付を取得
２：　ゴミ出しの曜日だった場合は、曜日に応じてテキストを設定
３：　fetchを利用して、LineAPIを叩く


#アルゴリズムを考える
ネット上でゴミの日を確認したところ、月曜日、火曜日、金曜日は簡単に実装できることがわかった。問題は水曜日。

不燃ごみの日とペットボトルの日が交互に来ていることがわかった。日付が偶数の時、っという条件処理をしようと思ったが、ほかの月を確認したところ、必ずしも偶数の日に不燃ごみがくるわけではなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/32d889a2-b4cd-0031-0349-5845a7a272b4.png)


水曜日に関してはテキストメッセージが交互で切り替わればいいはずなので、

```
水曜日の日付　- 過去の水曜日の日付(ペットボトルの日) = 日付の差分
```
として、

```
日付の差分 - (n * 7) = 0
```

の時のnの値が偶数であれば、2週間後のペットボトルの日のはずだし、奇数であればそれ以外の不燃ごみの日である、っという判定ができると考えた。


#完成系
日付に関してはmoment.jsを利用しています。

```コード.js

function pushMessage() {
  var access_token = PropertiesService.getScriptProperties().getProperty("lineChanelToken");
  var group_id     = PropertiesService.getScriptProperties().getProperty("groupId");
  var url = "https://api.line.me/v2/bot/message/push";

  
  var petBottleDay = Moment.moment("2020/11/11");
  var today        = Moment.moment();
  var dif          = today.diff(petBottleDay,"days");
  var day          = today.day();

  
  if(day == 1){
    var text = "今日は月曜日です。資源ゴミの日です"
  }else if(day == 2){
    var text = "今日は火曜日です。燃えるゴミの日です"
    }else if(day == 3){
      var whatDay = checkIncombustibleOrPetBottle(dif);
      var text = "今日は水曜日です。" + whatDay;
      }else if(day == 5){
        var text = "今日は金曜日です。燃えないゴミの日です"
      }
  
  
  var headers = {
    "Content-Type" : "application/json",
    'Authorization': 'Bearer ' + access_token,
  };
  
  var postData = {
    "to" : group_id,
    "messages" : [
      {
        'type':'text',
        'text': text
      }
    ]
  };
  
  var options = {
    "method" : "post",
    "headers" : headers,
    "payload" : JSON.stringify(postData)
  };
  
  UrlFetchApp.fetch(url, options);

}

//燃えないゴミか、ペットボトルの日か判定
function checkIncombustibleOrPetBottle(dif){
  var minusNum = 7;
  var count    = 0;
  
  for(var i = 1; dif > 0; i++){
    dif -= minusNum;
    count += 1;
  }
  
  if(count % 2 == 0){
    return "ペットボトルの日です"
  }else{
    return "燃えないゴミの日です"
  }
}
```

#アウトプット
無事に動いており、期待通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/54928896-9ba1-8d6f-ddab-cd27cedca264.png)



#トリガーの設定
最後に以下のキャプチャのようにトリガーをすれば、終了。毎朝、トリガーがされるはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/ba1e8ce1-55c4-0694-736c-5f7e61c05595.png)




#つまった箇所：　LineのroomIdまたは、groupIdが分からない！

正直、一番躓いたかもしれません。
LineのMessagingAPIの仕様なのですが、pushのAPIをコールするときにuserId、groupId、またはroomIdが必要です。
しかし、なんとgroupIdとroomIdはwebhookのイベントオブジェクトに含まれており、画面から確認することができませんｗ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/1298fb70-c26e-9555-f1a6-54a4a2b1258d.png)

色々頑張ってwebhookを試していたのですがうまく行かず、最終的には以下の記事の通りに行って、groupIdが分かりました。

[LineのBotからの通知をトークルームに投稿したい](https://teratail.com/questions/265087)
VSCodeでデータ整形時によく使うショートカットまとめ

VSCodeを使っていてよく使うショートカットをまとめました。
コピペ、保存は息をするように使っているので省略です。

## 行移動
<b>Alt + 上下キー</b>

並び替えや数行の移動で使用する。
範囲選択することで複数の行も移動できる。

![01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270112/ae9287e2-6935-e220-b34b-1510468710b0.gif)

## 行の複製
<b>Alt + Shift + 上下キー</b>

範囲選択することで複数の行も複製できる。
クリップボードにコピーされないので、コピペの邪魔にならない。

![02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270112/d5da7567-55e1-f9af-95f1-38690f9204eb.gif)


## 単語ごとのカーソル移動
<b>Ctrl + 左右キー</b>

コロンやセミコロン、プレフィックスやサフィックスを付ける時に便利。

![03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270112/1b945280-49dc-9ab9-a609-54f95722b974.gif)


## 単語の選択
<b>Ctrl + D</b>

何回も押すことで複数選択することができる。
Escキーを押すことで複数選択は解除できる。
単語だけでなく自分で指定した範囲でも同じ文字列なら複数選択できる。
変数名を変える時やデータの成形時に役に立つ。

![04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270112/432bdd30-13e4-9570-dfb3-262d0bf289f9.gif)


## 行の末尾まで選択
<b>Shift + End</b>

コードの途中から末尾まで消したいときに便利。
データの成形時にも良く使う。

![05.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270112/717f3e90-f95d-bbc3-caee-bd5f69e00a13.gif)

## 行の切り取り(コピー)

<b>Ctrl + X</b>

ポイントは、範囲を選択しないこと。
切り取りたい行にカーソルがあればどこでも行を切り取れる。
デバッグコードの移動に便利。
行のコピーも同様にできる。



## 応用
単語の移動や選択、末尾の移動を駆使したらExcelの仕様書を基にコードを書くのもお茶の子さいさい☕

### 型定義
Excelのデータを複数コピーしても整形する技術があればなんてことは無いですね！
![06.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270112/ec058d6a-0d47-1745-6a2d-e379a2d3f1e4.gif)

### データ作成
たとえ100行あっても楽勝ですね！
![07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270112/bd96b8b6-ba3e-76b7-02df-00c96d51a804.gif)
Aliexpressの商品検索を効率化するUserJS

Aliexpress、安くて便利ですね。

多種多様な商品の取り扱いがあるのはいいのですが、玉石混交。

一般的な名称で検索するとヒットしすぎて目的の商品や価格を探すのが大変で、これがけっこう時間かかるものです。

商品を検索するときはだいたい安い順にしますが、そうすると複数価格を設定している商品が優先的に表示されてしまい、なかなか目的の商品までたどり着けません。

ということで、UserJS使ってレンジ価格の商品は非表示にしてしまいましょう。

```javascript
// ==UserScript==
// @name         Aliexpress Show Only Single Price
// @namespace    https://www.ana-kutsu.com/
// @version      0.1
// @author       AnaKutsu
// @match        https://www.aliexpress.com/*SearchText*
// ==/UserScript==

(function() {
    'use strict';

    var elmProductContainers = document.getElementsByClassName('product-container');
    var elmProductContainer = null;
    if (0 < elmProductContainers.length) {
        elmProductContainer = elmProductContainers[0];
    }
    var interval = null;

    if (elmProductContainer) {
        // generate button
        var button = document.createElement('button');
        button.innerText = 'Delete range price items';
        button.onclick = function () {
            interval = window.setInterval(function () {
                window.scrollBy({top: document.scrollingElement.clientHeight});
            }, 50);
        };
        elmProductContainer.insertBefore(button, elmProductContainer.firstChild);
        // delete items when hit bottom
        document.addEventListener('scroll', function () {
            if (document.scrollingElement.scrollHeight - (document.scrollingElement.clientHeight + document.scrollingElement.scrollTop) < 1000) {
                if (interval) {
                    clearInterval(interval);
                    interval = null;
                    window.scrollTo({top: 0});
                    var elmItems = elmProductContainer.getElementsByClassName('list-item');
                    for (var i = 0; i < elmItems.length; i++) {
                        var elmItem = elmItems[i];
                        var elmPrices = elmItem.getElementsByClassName('price-current');
                        if (0 < elmPrices.length) {
                            var elmPrice = elmPrices[0];
                            if (elmPrice.innerText.indexOf(' - ') + 1) {
                                elmItem.style.display = 'none';
                            }
                        }
                    }
                }
            }
        });
    }
})();
```

大まかな処理の流れは

* 実行ボタンを画面内に表示
* ボタンが押されたらいったん一番下までスクロール (HTML要素がLazy Loadのため)
* 価格のエレメントに「 - 」が含まれていたらその商品は非表示

という感じです。

複数価格商品でもちゃんとした価格の商品もあるので、そういう商品を見逃してしまうことになるのですが、まぁ仕方がないでしょう。
WordPressで検索エンジンをElasticSearchにするまで

##WordPressの検索エンジンをパワーアップしたい...
そんな方に検索エンジンElasticSearchをおすすめします。
手順はいたって簡単
1. ElasticSearchServiceの用意
2. WPにElasticPressプラグインを導入
3. ElasticSearchとElasticPressの連携
4. インデックスの作成
5. 日本語最適化(Kuromoji)
##ElasticSearchServiceの用意
そもそもElasticSearchServiceとは？を知りたい方は以下参照
[Amazon Elasticsearch Service](https://aws.amazon.com/jp/elasticsearch-service/)
導入手順は、人がやってくれているので以下参照
https://qiita.com/takayuki-miura0203/items/c2ad9527d818fd20ca93

注意点は、2点
・http接続を許可すること
細かいアクセスコントロールをオフにするを選択し、 HTTPSの要求をオフにしておきましょう。
（後述するElasticPressにつながらない現象が発生する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309863/d86b451b-118a-4885-e075-3a297cf7a373.png)

    
 
・インスタンスタイプを小さくしたほうがいいという点（時間課金なのに止めることはできないので）

ドメインが立ち上がったら、エンドポイントをメモしておいてください
WPとの接続に使用します。

## WPにElasticPressプラグインを導入
プラグイン管理画面で、ElasticPressを検索しインストール

## ElasticSearchServiceとElasticPressの連携
WPにて、管理画面サイドバーにElasticPress>settingを選択し、設定画面に入る
ElasticPress.ioではなくThirdPartyを選択し、ElasticsearchHostURLにElasticSearchServiceのエンドポイント名を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309863/de8c73fa-391e-d0be-d027-ef91adadc190.png)
その後、画面上部の同期ボタンを押下することでインデックスが作成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309863/cd840551-5da0-803b-7b8a-a8af9fd2c7dd.png)

## 日本語最適化(Kuromoji)
ElasticSearchを日本語に最適化するためには形態素解析などが必要
それらをKuromojiといったプラグインが行ってくれる
そもそもElasticSearchに求められる形態素解析ってなにをやっているかは以下を参照
https://qiita.com/kouyaf77@github/items/7d22f224e82520514ec7
https://sssslide.com/speakerdeck.com/kunihikokido/developers-dot-io-2016-c-2-elasticsearchdezi-you-zi-zai-nijian-suo-fen-xi-dekiruyouninarutamefalsehinto
https://medium.com/hello-elasticsearch/elasticsearch-833a0704e44b#.qnax0vuwt

どうやって、ElasticPressでやるのかについては以下の記事を参照
https://www.arigato.es/elasticpress%e6%97%a5%e6%9c%ac%e8%aa%9e%e8%a8%ad%e5%ae%9a/
注意点は、5-2.phpを編集するのではなく7-0.phpを編集すること(おそらくphp or WPのバージョンによってファイルを使い分けている)(当環境はWPのバージョンが5.0以上)
Advanced Architecting on AWSを受講しました

公式サイトの説明はあまりに情報が少ないので、
受講を検討している方の一助となればと思い記録を残します。

# Advanced Architecting on AWSとは
Architecting on AWSの応用編コースになっています。
様々な要件に基づいて複雑で難易度の高いアーキテクチャを設計できることを目指します。
受講者のターゲットは次の通り。要求されるレベルは高いです。

* ソリューションアーキテクトアソシエイトを取得した方
* 業務でAWSを利用していて一通りのサービスを熟知している方

[Advanced Architecting on AWS](https://aws.amazon.com/jp/training/course-descriptions/advanced-architecting/)

# 実施概要
* 講師: 1名
* 受講者: 十数名くらい
* 形式: オンライン
* 日数: 3日間

# 講義内容
※ 内容は時期や講師によって変更となる可能性があります

## 1日目
* Well-Architectedフレームワーク
* AWSアカウントの管理
* ネットワーク（ハンズオン有）
* デプロイ管理（グルディス有）

## 2日目
* データストア・データ移行（ハンズオン有）
* 大規模アプリケーション向けアーキテクチャ（ハンズオン有）


## 3日目
* セキュリティ対策（ハンズオン有）
* データ暗号化（グルディス有）


# Well-Architectedフレームワーク
まずは、お馴染みのWell-Architectedフレームワークから学んでいきます。
自動化やマネージドサービスを駆使してビジネス価値の向上にリソースを割きましょうね。
勘に頼らずにちゃんとキャパシティプランニングしてアーキテクチャ決定しましょうね。等々

[Well-Architectedフレームワーク](https://d1.awsstatic.com/whitepapers/ja_JP/architecture/AWS_Well-Architected_Framework.pdf)

# AWSアカウントの管理
セキュリティや監査の観点から、どのようなアカウント構造を取るべきか学べました。
個人的には、AWS Organizationsを詳しく知らなかったので勉強になりました。

# ネットワーク
VPCやオンプレミスとの接続といったネットワーク周りを学びます。
VPCエンドポイントを利用したVPCとVPC外サービス（S3やSQS等）のセキュアな通信方法であったり、
サイト間VPNやDirect Connectを使用したオンプレとの接続サービスやその選択基準を勉強しました。

# デプロイ管理
数々のDevOpsツールの内、CloudFormation、CodeDeploy、OpsWorks、Beanstalk、ECSに焦点を当てています。講師の方曰く、AWSのプロビジョニングはCloudFormation、構成管理はAnsibleを利用するのが運用者に易しくシンプルでよいとのことでした。もちろん要件に依りますが。

# データストア・データ移行
データストアやキャッシュ、データベースについて一通りのサービスを学びます。
S3のパフォーマンスを向上する方法であったり、ElastiCasheの使い所など勉強になりました。
また、オンプレの大容量データをどうやってAWSに運び出すのか、リードタイム、コストの観点から最適な方法を選ぶ手続きも勉強しました。

# 大規模アプリケーション向けアーキテクチャ
大量のトラヒックを捌くためのアーキテクチャや、Blue/Greenデプロイメントによる安心なリリース方法について学びます。ハンズオンでは、リードレプリカをElastiCasheで置き換えたときのクエリ実行時間を比較することで、いかにキャッシュが高速にデータを更新できるか体験しました。

# セキュリティ対策
DDoS攻撃やUDPリフレクションなどのセキュリティ攻撃をどうやって防ぐのかが主題です。
これには、バックエンドサーバをインターネットに公開しない、なるべく固定的にEIPを持たないという一般的なことから、CloudWatchやGuardDutyを使った異常検知の方法まで幅広く学ぶことができました。 

ハンズオンでは、XSSをWAFによって防御する様子を実際に攻撃して体験しました。

# データ暗号化
データキーを暗号化するためのカスタマーマスターキーの安全な管理を実現するのがKMSです。
さらにセキュリティ性をHWレベルで高めたCloudHSMであったり、自前で鍵を用意するDIYもありますが、基本はKMSでよさそうでした。

# まとめ
個人的には、本講座は辞書的に活用するのがよさそうだと感じました。
全ての講義内容を今すぐ使うわけではないので、必要になったときに、そういえば講座でこういう方法を勉強したなと思い出しながら、実際に手を動かしてみて自分のものにしていきたいです。
ReduxToolkitのインストール手順まとめ

# この記事について
- 最近React + ReduxToolkitを使用しての開発案件を行ったのでフレームワーク別に手順を整理
- ReduxToolkitとは？的な話は割愛(魅力を語る記事は検索するとたくさん出てくるので)

# create-react-appを使用する場合

## 新規プロジェクト作成と同時にインストールする場合

それぞれ指定したtemplateはデフォルトでReduxToolkitがインストールされます

- JavaScriptの場合

  ```
  create-react-app {プロジェクト名} --template redux
  ```

- TypeScriptの場合

  ```
  create-react-app {プロジェクト名} --template redux-typescript
  ```

## 既存プロジェクトへ追加する場合

redux本体はReduxToolkit(@reduxjs/toolkit)に含まれているので、明示的に指定してインストールは不要です

- JavaScriptの場合

  ```
  yarn add @reduxjs/toolkit react-redux
  ```

- TypeScriptの場合

  ```
  yarn add @reduxjs/toolkit react-redux
  yarn add -D @types/react-redux
  ```

# create-next-app(Next.js)を使用する場合

## 新規プロジェクト作成と同時にインストールする場合

[公式github](https://github.com/vercel/next.js/tree/master/examples)に色んなテンプレートがあるのでそれを指定

- JavaScriptの場合

  ```
  create-next-app --example with-redux-toolkit {プロジェクト名}
  ```

- TypeScriptの場合

    create-react-appの時みたいにReduxToolkit + Typescriptの都合の良いテンプレートはなさそうなので、何かと設定に手間がかかりそうなTypeScriptのテンプレートを指定してプロジェクト作成して後から個別でReduxToolkitをインストールします。

  ```
  create-next-app --example with-typescript {プロジェクト名}
  ```

## 既存プロジェクトへ追加する場合

create-react-appの所に書いた方法と同じ

## 今回使用したNext.jsのテンプレート
- https://github.com/vercel/next.js/tree/master/examples/with-redux-toolkit
- https://github.com/vercel/next.js/tree/master/examples/with-typescript
Java テキストファイル（.txt .csv）からの入力　java.io.FileReader

#１，データを文字列としてテキストファイルへ保存する方法
>➊FileReader fr = new FileReader("ファイル名");

>➋Buffered br = BufferedReader(br);

>➌String rec;   rec = br.readLine();

>➍fr.close()

#２，ソースコード（テキストファイルからの入力）
>テキストファイルから文字の入力をおこなうためには、**read()**メソッドを使う

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/6eaa2cc1-0879-7325-e5b6-0de150ce36c1.png)

>レコード単位（行単位）による効率のよい入力処理　readLine()メソッドを使う

テキストファイル
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/af7b41f9-db8a-c9b5-5fff-31da9e9627c1.png)
csvファイル
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/39cc7b62-1de2-d9ea-4af8-0592cdfac6a0.png)


>split()メソッドを使って、csvファイルのレコードを配列に格納する方法

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/8c0fe0c3-e07e-d5db-156b-3d8d1c92b4ae.png)

#Java チュートリアル:clipboard:
:coffee: Java テキストファイル（.txt .csv）への出力　java.io.FileWriter : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2a101f159b1d8447d2cc "here")
:coffee:  Java テキストファイル（.txt .csv）からの入力　java.io.FileReader : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/31c677bb619e73b717a9 "here")
:coffee:  Java モニターからの入力　java.util.Scanner : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ece84972a49544916cac "here")
:coffee:  Java GUIからの入力　javax.swing.JOptionPane : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/c0b9a2bd9018131b2a48 "here")
:coffee:  Java Mathクラス　Math.sqrt : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/fc5500308a58c3f75887 "here")
:coffee:  Java 乱数の生成　java.util.Random : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/ac357d0fa5b4f70acb9a "here")
:coffee:  Java Stringクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/17b6ea08650d9c8ae072 "here")
:coffee:  Java Wrapperクラス : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6d2a8480587e40fee90a "here")
:coffee:  Java ArrayListクラス　java.util.ArrayList : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/6478e5851e9a30d0d65c "here")
:coffee:  Java メソッド（method）の作り方とオーバーロード : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/2b132cb5298f9fc97730 "here")
:coffee:  Java printf()メソッド : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/3e471b8006f9500ef3e4 "here")
:coffee:  Java オブジェクト（Object Oriented Programming）とコンストラクタ、スコープ（local,global） : [:white_check_mark:here](https://qiita.com/iwasaki-hub/items/488d41a259aa5a43f921 "here")
千葉県Go To EAT向けに店舗検索BOT（AI LINE BOT）を作った話(2)【概要】

<a href="https://qiita.com/Haradasn/items/3078bbca437a4046aab5">千葉県Go To EAT向けに店舗検索BOT（AI LINE BOT）を作った話(1)</a>の続きです。

システム構成は、以下の通りです。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896062/2c41870f-d8f2-3078-dff8-10aff382cf13.png)

【フロー】
1.スマホでLINEのBOTを操作し、検索したいお店に関連するワードを入力します。
2.入力するとLINEのMessageing APIを経由してAI検索サーバ上のWEBサーバへhttpsリクエストが飛びます。
3.リクエストは、flaskで受け付け、検索ワードと類似度の高いお店をAIで判別します。
4.AIで判別した結果をもとに、データベースからお店に関する情報を返却します。


AI検索サーバはお金をかけないために、AWSで無料枠として提供されているt2.microを採用しました。ただし、AIモデルの作成にはメモリが少ないので、モデルの作成作業自体は、手元のsurface pro 6を使用しました。


AIモデルの作成には、食べログサイトの情報とGo To eat千葉県のHP上のお店一覧（shop_list.pdf）を使用しています（お店一覧は現在はダウンロードできなくなっています）。



以降の記事で、構築手順について話をしていきます。
【Rails】bcryptを使ってログイン機能を作ったけど失敗した話



Railsでログインページを作っていました。
bcyrptのGemを使って作ろうとしたのですが、正しいメールアドレス・パスワードを登録し、ログインしようとしても「ログインに失敗しました」と表示され、なかなかできず…


#環境
Rails 5.2.4.4
DB:SQLite

#問題のあったコード
・gemfileにてcryptをインストール済み
・userモデルに has_secure_password を定義
・usersテーブルに password_digest:string を追加


```ruby:users_controller.rb

class UsersController < ApplicationController

  def sign_in_process
    user = User.find_by(email: params[:email])
    if user && user.authenticate(params[:password])
      user_sign_in(user)
      flash[:success] = 'ログインしました'
      redirect_to products_path
    else
      flash[:danger] = 'ログインに失敗しました'
      redirect_to sign_in_path
    end
  end

end
```

user_sign_in(user)の部分はhelperで、

```ruby:users_helper.rb
def user_sign_in(user)
  session[:user_id] = user.id
end
```
と書いています。

#解決方法
paramsの後に[:user]を追加しました

```ruby:users_controller.rb

class UsersController < ApplicationController

  def sign_in_process
    user = User.find_by(email: params[:user][:email])
    if user && user.authenticate(params[:user][:password])
      user_sign_in(user)
      flash[:success] = 'ログインしました'
      redirect_to products_path
    else
      flash[:danger] = 'ログインに失敗しました'
      redirect_to sign_in_path
    end
  end

end
```
ログを見るとSQL文にメールアドレスがNULLと表示され、paramsの中にデータが入っていませんでした。
そのため、paramsの後に[:user]と書き、userモデルのemailカラム、passwordカラムに対応するようにしました。
Caddyの使い方メモ

Caddyというものを使えば簡単にSSLの鯖が立てられると聞いて、試してみた。

公式サイト: [Caddy - The Ultimate Server with Automatic HTTPS](https://caddyserver.com/v2)
公式ドキュメント: [Welcome -- Caddy Documentation](https://caddyserver.com/docs/)

## インストール
バイナリをダウンロードするかビルドして入手し、パスを通す
[Download Caddy -- Caddy Documentation](https://caddyserver.com/docs/download)

## 構成
今回は階層的にはこんな具合。
テキトーなファイルが無いと面白くないのでhtmlファイルを置いておく。

```
C:/
	tool/
		caddy/
			caddy.exe
	exapmle/
		Caddyfile
	ver/
		a.html
	test/
		b.html
```

## 設定
`Caddyfile` 拡張子なし のファイルを作成
仮に `C:/example/` に置いておく

```Caddyfile
# url:port
# {$SITE_ADDRESS} としておけば環境変数から設定可能
localhost {
	# rootは指定パスをサーバールートにする
	root * C:/ver/
	# ファイル一覧をみる
	file_server browse
}
localhost:2019 {
	respond ":2019 response"
}
localhost:2020 {
	# リバースプロキシの設定
	reverse_proxy https://localhost:2021
}
localhost:2021 {
	root * C:/test/
	log {
		output file C:/test/access.log
	}
}
```

## 起動・停止

```sh
cd C:/example/
```

`Caddyfile`のある場所まで移動して、起動したら
`https://localhost`,`https://localhost:2020` など設定したパスにブラウザでアクセス

### テスト向け

```sh
caddy run
```

`ctrl + C`　で抜ける。

### サービス・デーモンとして

```sh
caddy start
```

```sh
caddy stop
```

## 感想

「設定が簡潔で読みやすく、公式ドキュメントが散らかっていない」という点、
`caddy start`で動作しているときに**ダウンタイムなし**で設定を更新できるのもなかなかの感動ポイント。
python json.dumpsでdecimalがある場合の対応

# はじめに
例えば、DynamoDBでint/float的な数値データを扱うと、データがdecimalとして取り出されます。こういったデータが含まれるようなqueryやgetしたアイテムに対してpythonの標準的なjson.dumpsを実行すると、変換できない型により例外が発生しましす。で、いつもこの対処方法を忘れるのでメモを残します。（類似でDatetime型で同様のことが起きます)
json.dumpsが型エラーで失敗したら変換関数を用意することで対処できます。

# そもそも
json.dumpsには引数としてdefaultを指定することできます。ここで変換用の関数をセットすることで対象外の型を自分でハンドルしてお好みの型に変換できます。
以下公式からの抜粋

> default を指定する場合は関数を指定して、この関数はそれ以外では直列化できないオブジェクトに対して呼び出されます。 その関数は、オブジェクトを JSON でエンコードできるバージョンにして返すか、さもなければ TypeError を送出しなければなりません。 指定しない場合は、 TypeError が送出されます。

# 実際には？
変換用関数を用意します。

```python
from decimal import Decimal

def decimal_to_int(obj):
    if isinstance(obj, Decimal):
        return int(obj)
```

json.dumpを実行する際には、

```python
json.dumps(your_val, default=decimal_to_int)
```

として、defaultの引数に変換関数をセットするだけです。

今回はdecimalを変換するようにしか書いてませんが、型変換関数に想定される型チェック、変換ロジックを用意しておけばマルチの型対応も対応可能です。datetimeはstrftimeで書式つけの文字列にして返すとか。
というわけで、当たり前の用に使ってる関数もちゃんと成り立ちを理解できると便利ですね。というわけで、きちんと理解したい方は[こちら](https://docs.python.org/ja/3/library/json.html)をご確認下さい。


とても短い記事ですがいつも忘れるので、ほぼ自分用のメモです。

# 他のやり方は？

[simplejson](https://pypi.org/project/simplejson/)などは対応できる型が多いようです。自分は使ったことないですが。
もしAWS Lambdaで使いたい場合は標準パッケージに含まれないために、[自分でパッケージに追加する](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-package.html)か、[Lambda レイヤー](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html)として登録する必要があります。
三点リーダーを❤に置換するJavaScript

TLに流れてきたので。

```js:replace.js
function rplc(){
  h=[...'❤'][0];
  document.body.innerHTML = document.body.innerHTML.replace(/…/gi, h);
}
rplc();
```

Unicode絵文字だからすんなり行けるかと思ったけど、「❤」を出力するのは一手間いる感じだった。


おまけ。
<a href="javascript:{function r(){h=[...'❤'][0];document.body.innerHTML=document.body.innerHTML.replace(/…/gi, h);};r();}">ブックマークレット</a>

```js:中身
javascript:{function r(){h=[...'❤'][0];document.body.innerHTML=document.body.innerHTML.replace(/…/gi, h);};r();}
```
Python制御構文（備忘録）

Pythonの制御構文周りの備忘録です。
随時追加・修正を行っていきます。

## 比較演算子
| 演算子 | 説明 |
|:-:|:-:|
| A == B | AとBが等しい |
| A != B | AとBが等しくない |
| A < B | AがBよりも小さい |
| A > B | AがBよりも大きい |
| A <= B | AがB以下 |
| A >= B | AがB以上 |
| A in [LIST] | [LIST]の中にAがある |
| A not in [LIST] | [LIST]の中にAがない |
| A is None | AがNoneである |
| A is not None | AがNoneでない |
| 条件A and 条件B | 条件Aと条件Bのどちらも満たす |
| 条件A or 条件B | 条件Aまたは条件Bのどちらかを満たす |

## if
```python
num = 5
if num == 0:
    print('数値は0')
elif num < 0:
    print('数値は0より小さい')
else:
    print('数値は0より大きい')
```

## while
```python
limit = input('Enter:') # 入力を受け付ける
count = 0
while True:
    if count >= limit:
        break # countが10以上ならループを抜ける

    if count == 5:
        count += 1
        continue # countが5なら次のループへ

    print(count)
    count += 1
else: # breakされずにループが終了したら実行する
    print('Done')
```

## for
```python
for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
    if i == 5: # iが5なら次のループへ
        continue:

    if i == 8: # iが8ならループを抜ける
        break:

    print(i)
# breakされずにループが終了したら実行する
else:
    print('Done')

# 指定回数処理したいが値を取り出す必要が無い時に_を利用する
for _ in range(10):
    print('hello')

# 2から3つ飛ばしで10を超えるまで処理を行う
for i in range(2, 10, 3):
    print('hello')

# インデックスも取得したい場合
for i, animal in enumerate(['dog', 'cat', 'bird']):
    print(i, animal)

# 複数のリストを同時に展開して取得したい場合
animals = ['dog', 'cat', 'bird']
foods = ['meat', 'fish', 'bean']
for animal, food in zip(animals, foods):
    print(animal, food)

# 辞書のループ処理
data = {'x': 10, 'y': 20}
for k, v in d.items():
    print(k, ':', v)
```
Redmineにアップロードできるファイルサイズの設定

#ここどす
管理の設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ec72a1f2-72f6-92d7-3f69-a8744cfa1de9.png)
ファイルタブの『添付ファイルサイズの上限』
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f836c7a4-3b3f-ceec-ff8f-dd03ec6749c2.png)


#蛇足
管理系のパラメータは一通りおさらいしておきたいと思ったわん。

ファイルをアップするだけじゃなくて、ブラウザ上で閲覧したり、ちょこっと編集できたら便利だなあ。
アップしたPDF見ようとすると『ダウンロードしてくださいね❤』ってなるからちょっとめんどい。


#バージョン
CentOS Linux release 8.2.2004 (Core)
Redmine 4.0.6
リレーションシップのダミーデータを作成する

###環境
ruby '2.6.5'
rails '6.0.3'

###seeds.rb
```
# user
User.create(
  email:                'aaaaaa@au.com',
  password:             'aaaaaa',
  account:              'arigatou'
  )

5.times do
email = Faker::Lorem.sentence(word_count: 8) + '@au.com'
password = 'password'
account = Faker::Lorem.sentence(word_count: 6)
User.create!(
      email:                 email,
      password:              password,
      account:               account
      )
end

# article
users = User.all
5.times do
content = Faker::Lorem.sentence(word_count: 50)
users.each { |user| user.articles.create!(content: content) }
end

#relationship
users = User.all
user = users.first
following = users[1..6]
followers = users[1..6]
following.each { |followed| user.follow!(followed) }
followers.each { |follower| follower.follow!(user) }
```
###コード説明
以下の記述でログインする用のユーザーを作成

```
# user
User.create(
  email:                'aaaaaa@au.com',
  password:             'aaaaaa',
  account:              'arigatou'
  )
```
以下の記述で
5人のユーザーを作成します。
今回はemailとaccountカラムは一意に設定しているのでfakerでランダムに作成します。
バリデーションなどで文字数の指定をしている場合はバリデーションに合わせた数字に変更してください

```

5.times do
email = Faker::Lorem.sentence(word_count: 8) + '@au.com'
password = 'password'
account = Faker::Lorem.sentence(word_count: 6)
User.create!(
      email:                 email,
      password:              password,
      account:               account
      )
end
```
以下のコードは
作成したユーザー全てにarticleを作成させたいので
全てのuserを取得し、ランダムな文字列のcontentを作り、
each文でarticleを作成するという流れになります

```
# article
users = User.all
5.times do
content = Faker::Lorem.sentence(word_count: 50)
users.each { |user| user.articles.create!(content: content) }
end
```
最後にフォロー関係ですが
全てのユーザーを取得、
最初のユーザーをログインするユーザーと仮定し取得し、
それ以外のユーザーをフォロー、また他のユーザーにフォローされるという状況を作りたいので
following = users[1..6]
followers = users[1..6]
という記述になります
取得したユーザーをあとはeachでフォローしていく、してもらうという記述になります
なのでrails db:seedを行ったあとのリレーションは
user.firstは６人のユーザーにフォローされていて
user.firstは自分以外の６人にフォロされている状態になる

```
#relastionship
users = User.all
user = users.first
following = users[1..6]
followers = users[1..6]
following.each { |followed| user.follow!(followed) }
followers.each { |follower| follower.follow!(user) }
```
トラベルシューティングに役立つAnsible-playbookコマンドのオプション

###コマンド書き方
```
ansible-playbook [オプション] [yamlファイル名]
```
<br>

###オプション
プレイブックのインストールなどの変更は行わず、条件式の確認やシンタックスの確認を行う

```
--check(-C)
```
<br>
fileやtemplateモジュールで利用したファイルの差分を表示する

```
--diff(-D)
```
<br>
指定のターゲットノード、グループだけ実行する

```
--limit="ノード名"(-l)
```
<br>
実行するターゲットノードのホストを表示する

```
--list-hosts
```
<br>
実行するタスクのタグを表示する

```
--list-tags
実行するタスクのタグを表示する
```
<br>
実行するタスクを表示する

```
--list-tasks
```
<br>

指定のタスクから以降を実行する

```
--start-at-task="TASK名"
```
<br>

タスクごとに実行の可否（y/n/c）を指定しながら処理を行う

```
--step

y：タスクを実行
n：タスクをskipして、次のタスクに移行
c：後続のタスクをすべて実行
```
<br>
処理の詳細を表示する

```
--verbose(-v)

-v：タスク結果の詳細表示
-vv：タスク定義位置の詳細表示
-vvv：SSH処理内容の表示
-vvvv：SSH処理内容の詳細表示
-vvvvv：SSHコネクションのデバッグ表示
```
<br>
###メモ
本番環境ではプレイブックを実行する前に、「--check」や「--diff」オプションを活用してテストすることをおすすめ。
ただし、状態変更を実行しなければ確認できないタスクは実行できない。
JavaScriptでジャイロセンサー（方向センサー）つかって遊んでみた

ジャイロセンサ使ってみた。色々遊べそう。
（※センサを搭載していないデバイスで閲覧している場合、何も面白くないものが表示されていると思います。）

センサを搭載してても、Qiita記事への埋め込みだとセンサが取れないっぽい。
codepenのサイトから直接閲覧する必要あり。

<p class="codepen" data-height="525" data-theme-id="light" data-default-tab="result" data-user="kob58im" data-slug-hash="MWjggNO" style="height: 525px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="3D Sensor test">
  <span>See the Pen <a href="https://codepen.io/kob58im/pen/MWjggNO">
  3D Sensor test</a> by kob58im (<a href="https://codepen.io/kob58im">@kob58im</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

three.jsを使用しているのは手軽に可視化したかったからであって、ジャイロセンサの取得は素のJavaScriptで書けます。（参考サイト参照）

なお、記事作成時点（2020.11.24）で、参考サイトによると

> これは実験的な機能です。本番で使用する前にブラウザー実装状況をチェックしてください。

および

> 警告: Chrome と Firefox では角度の扱い方が異なり、一部の軸の向きが逆になっています。

だそうです。


# 参考サイト

 - [デバイスの方向の検出 - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Detecting_device_orientation)
【Java】0で割る割り算の例外処理

#プログラミング勉強日記
2020年11月24日
Javaで電卓のプログラムを組んでいるときに0での割り算でエラーが出てプログラムが強制終了したので、その例外処理の方法を記述する。

#異常終了する場合
　Javaでは条件を見たなさにと起こる例外があり、例外処理をしないとプログラムが異常終了することがある。以下のサンプルコードのように例外処理をしないと、異常終了する。

```java:異常終了するサンプルコード
public class Main {
    public static void main(String[] args) {
        int a = 123;
        int b = 0;
        int c;
        c = a / b;
    }
}
```

```:実行結果
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at ZeroDividException.main(ZeroDividException.java:7)
```
　このように0で割ってしまっているのでプログラムが強制終了する。


#0での割り算における例外処理
　プログラムの異常終了を防ぐために、例外処理を加える。

```java
public class Main {
    public static void main(String[] args) {
        try{
            int a = 123;
            int b = 0;
            int c;
            c = a / b;
         } catch(ArithmeticException e) {
                 System.out.println("エラー(0で割っています)"); 
         }
     }
}
````

```:実行結果
エラー(0で割っています)
```
　例外処理をすっることで、エラーメッセージを表示させて強制終了を防ぐことができる。

#参考文献
[例外処理](http://www.aoni.waseda.jp/ichiji/2012/java-01/java-12-3.html)
[Java(例外処理)](https://www.sasukepg.jp/post-980/)