OmniAICreator/Qiita-1.07M huggingface dataset:
Swift Buttonに影を付ける（ついでに丸にも）

#### ・書く理由
あまり使わないので、アウトプット用に書きます。

#### ・コード

・cornerRadiusの値は縁だけ丸くするなら15.0~20.0くらいが良いかと。
・shadowColorは影の色です。グレーでも黒でもお好きな色を。
・shadowRadiusは影の丸さです。これも3~5程度で良いかと。
・shadowOffsetは影のサイズです。CGSizeで指定可能です。
・shadowOpacityは影の透明度です。すいません、ここは適当です。
　値を変えながら試してみてください。

```swift:ViewController.swift

func ButtuonShadow(position: UIButton){
        //ボタンに影をつけて丸にする
        position.layer.cornerRadius = screenWidth/12
        position.layer.shadowColor = UIColor.black.cgColor
        position.layer.shadowRadius = 3
        position.layer.shadowOffset = CGSize(width: 2, height: 2)
        position.layer.shadowOpacity = 0.5
        
    }

```

あまり需要はなさそうですが、たくさんボタン付けたりするなら。
１人にでも役に立てたら幸いです。
【Q&A】Typescript　ts-node できない　を解決

#TypeScriptのままでコードを実行したいよね？
手軽にTypeScriptのコードを実行したいとき「ts-node」が便利です。
しかし、上記のことを知らないとTypescriptを実行する時、
tsc→nodeと2つの作業が必要でした。。
これがまた手間でして。

「ts-node」が使えれば1つ手順で完了します。
神様ですね。

ざっくりこんな感じで楽になります.
>現状：tsc →　node　→確認
改善： ts-node  →確認


実際に「ts-nodeの導入」で詰まって30分ぐらい無駄にしたので
以下に記載しておきます。

#こんな感じで詰まった
![なんでやねん.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/ac5b76f8-f556-e089-9d91-d5291b7b8460.jpeg)


#これで解決
公式？ドキュメントだと以下のように書いておりましたmm
https://www.npmjs.com/package/ts-node


```
# Locally in your project. 
npm install -D typescript
npm install -D ts-node
 
# Or globally with TypeScript. 　両方しとけばOK
npm install -g typescript 
npm install -g ts-node
```

あと忘れちゃいけない「node」「npx」のインストール.
（しなくてもいいかも🤔）
>npm install -g node
npm install -g npx


#実際にどう改善されたか？
##ts-node でやってみる
![hahaha.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/f4d6aa09-5d7c-fcd4-bbdf-a37c12501ed6.jpeg)

##tsc→node
![ts.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/938e316e-b73d-418e-666f-8e2ece06d4c7.jpeg)

意外と実行結果早いなこっち。。



たった１つの作業が減ったですが、
ストレスなく実行できるのは便利ですね.
【Java】CalendarクラスとDateクラスの使い方

#プログラミング勉強日記
2020年10月30日
[昨日の記事](https://qiita.com/mzmz__02/items/d873e1b1f366ab2cf835)でCalendarクラスについて取り扱ったが、Dateクラスとの違いであったり使い方がわからなかったのでまとめる。

#CalendarクラスとDateクラスの違い
　CalendarクラスとDateクラスは、Javaの日付の処理を行うことができる。日付を扱うという点では同じだが用途が違う。

　具体的には、Calendarクラスは日付や時刻を演算処理を行うことができ、<b>日付の値を計算する</b>ことができる。Dateクラスは1970年1月1日0時からの経過時間を持っていて、<b>指定した日付や時間を取得する</b>のに用いられる。下記にサンプルコードを示す（今回はメソッドの説明はしない）。

##Calendarクラスの使い方

```java
import java.util.Calendar

public class Main {
  public static void main(String[] args) throws Exception {
    Calendar calendar = Calendar.getInstance();
    System.out.println(calendar.get(Calendar.YEAR) + "年" + calendar.get(Calendar.MONTH)+ "月" + calendar.get(Calendar.DATE) + "日" );
  }
}
```

```:実行結果
2020年10月30日
```

##Dateクラスの使い方

```java
import java.util.Date;
 
public class Main {
  public static void main(String[] args) throws Exception { 
    Date date = new Date();
    System.out.println(date);
  }
}
```

```:実行結果
Fri Oct 30 10:43:58 UTC 2020
```

#CalendarクラスからDateクラスに変換する方法
　Calendar型の変数に対してgetTimeメソッドを用いて現在時刻を取得して、Date型の変数に設定することでCalendarクラスからDateクラスに変換できる。

```java
import java.util.Date;
import java.util.Calendar;
 
public class Main {
  public static void main(String[] args) throws Exception {
    // CalendarクラスからDateクラスに変換
    Calendar calendar = Calendar.getInstance();
    Date date = new Date();
        
    date = calendar.getTime();
    System.out.println(date);
  }
}
```

```:実行結果
Fri Oct 30 10:43:58 UTC 2020
```


#DateクラスからCalendarクラスに変換する方法
　日時を設定するsetTimeメソッドを使用することでDateクラスからCalendarクラスに変換できる。

```java
import java.util.Date;
import java.util.Calendar;
 
public class Main {
  public static void main(String[] args) throws Exception {
    //DateクラスからCalendarクラスに変換
    Date date = new Date();
    Calendar calendar = Calendar.getInstance();
        
    calendar.setTime(date);
    System.out.println(cl.getTime().toString());
  }
}
```


```:実行結果
Fri Oct 30 10:43:58 UTC 2020
```





#参考文献
[【Java入門】DateとCalendarの使い方・変換方法まとめ](https://www.sejuku.net/blog/20154)
[Date⇔Calendarの変換方法](https://www.sejuku.net/blog/20275)
ale+dein.vimに関して調べたこと

# この記事は？
aleとdein.vimを使っていく中で困ったことや調べた事をまとめる。
規模が大きくなってきたらaleとdein.vimで分けるかも。

## aleとは？
色々なファイルのlintツール。
以前はファイルの種類によってツールが別れてたが、これ一つで一通りまかなえるので最近（2020.11）のおすすめ。
（もっといいやつあったら教えて下さい）

## dein.vimとは？
vimのプラグインとプラグイン毎の設定を管理してくれるやつ。
今までは `.vimrc` に記載していたが、インストールの記述と設定の記述が煩雑になってわけわからなくなりがちだったので、これできれいにまとめる。

### Refs
- [dein.vimでプラグイン管理のはじめ方](https://qiita.com/sugamondo/items/fcaf210ca86d65bcaca8)

# ale
## 正しいリポジトリは？
以前は `w0rp/ale` だったが、　`dense-analysis/ale` に変わっていた。
https://github.com/dense-analysis/ale
## lint関連
### lintがなぜか動かない時
どこかでエラーが出てる可能性がある。
vimで対象ファイル開いている時に、 `:ALEInfo`と打つと、チェック実行時ログが出てる。
成功時にはチェック結果が、失敗時にはエラーログが出てるので、これをヒントに調査する。

### php_codesniffer
- vim起動時のlintや自動整形を稼働させるには環境ににcomposer等でphp_codesnifferを入れておく必要あり。
- `phpcs.xml` 等で作成したカスタム設定をaleでも適用させたいがなぜか反応せず。（調査中）
- ちなみに単独で動かすなら、 `phpcs --standard=phpcs.xml <file name>` で指定


### docker(hadolint)
エラーメッセージが結構わかりにくいのでここで詳細調べる
https://github.com/hadolint/hadolint/blob/master/README.md#rules

# dein.vim
### dein.toml公開（lint部）
```toml
[[plugins]] # lint tool
repo = 'dense-analysis/ale'
hook_add = '''
"行頭のマークが出る部分を常に表示するようにする
let g:ale_sign_column_always = 1
"phpcsのスタイル
"let g:ale_php_phpcs_standard = '~/phpcs.xml,PSR1,PSR2'
"phpcbfのスタイル
"let g:ale_php_phpcbf_standard = '~/phpcs.xml'

"自動整形
let g:ale_fixers = {
\ 'php': ['phpcbf'],
\}
"ファイル保存時に整形実行
let g:ale_fix_on_save = 1
" 保存時のみ実行する
let g:ale_lint_on_text_changed = 0
"lint
let g:ale_linters = {
  \'javascript': ['eslint'],
  \'ruby': ['rubocop', 'reek'],
  \'php': ['phpcs', 'phpcbf'],
  \'Dockerfile': ['dockerfile_lint', 'hadolint'],
  \'scss': ['stylelint']
\}
let g:ale_dockerfile_hadolint_use_docker = 'enable'
let g:ale_scss_stylelint_use_global = 1
" 表示に関する設定
" let g:ale_sign_error = ''
" let g:ale_sign_warning = ''
let g:airline#extensions#ale#open_lnum_symbol = '('
let g:airline#extensions#ale#close_lnum_symbol = ')'
" エラー行にカーソルをあわせた際に表示されるメッセージフォーマット
let g:ale_echo_msg_format = '[%linter%]%code: %%s'
highlight link ALEErrorSign Tag
highlight link ALEWarningSign StorageClass
" Ctrl + jで次の指摘へ、Ctrl + kで前の指摘へ移動
nmap <silent> <C-w>k <Plug>(ale_previous_wrap)
nmap <silent> <C-w>j <Plug>(ale_next_wrap)
'''
hook_post_source = '''
let g:ale_linters = {
  \'Dockerfile': ['dockerfile_lint', 'hadolint']
\}
'''
```

# 編集後記
fix_on_saveは、整形できないエラーがあった際にエラー文言だけが出力されて保存されるのでどうしようか迷い中。
hookのタイミングはいつも忘れる。
hookの動きが自分の中で落とし込みが甘い。
気が向いたらしっかり落とし込もう。
Swift コードレイアウト時のステータスバーの高さ

#### ・記事を書く理由
コードレイアウトでステータスバーの高さを取得したかったが、出来ず、、、
ネットでやっと記事を見つけたが相当時間がかかったのでここに書くことにしました。

#### ・やり方
SceneDelegate内にこのコードを書きます。
コメントアウトされてるところは除外してます。


``` swift:SceneDelegate.swift

    import UIKit
    //ここ↓
    var statusHeight = CGFloat()

    class SceneDelegate: UIResponder, UIWindowSceneDelegate {

     var window: UIWindow?
     func scene(_ scene: UIScene, willConnectTo session:UISceneSession, options connectionOptions:UIScene.ConnectionOptions) {
        guard let _ = (scene as? UIWindowScene) else { return }
        //ここ↓
        statusHeight = window!.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
    }
```

これで取得可能で他のSwiftファイルでも扱えます。
初学者の独学ですので、暖かい目で見てください。。
HTML/CSS:文字に影をつけたい

#【概要】

<b>[1.結論](#1結論)</b>

<b>[2.どのようにコーディングするか](#2どのようにコーディングするか)</b>

<b>[3.開発環境](#3開発環境)</b>


#1.結論
<b>text-shadow:</b> を使います！
<br>

#2.どのようにコーディングするか

文字に対して下記のように設定します！

```css
  text-shadow: **px **px **px #色指定;
```


左からx軸、y軸、ぼかし具合、色指定になります！
結果下記のように文字の方通りに影をカッコよくデザインできます！

![スクリーンショット 2020-10-30 19.15.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/3f2eba38-59d8-e96d-d141-5f50b37f7f80.png)


<br>

#3.開発環境
HTML5
CSS3
<br>
SaaS型データカタログ（無償版）をプロビジョニングしてみる。

組織内外にとっ散らかってしまっている各種データを整理して、すぐに使えるようにしておきたい！
そんなDX時代の要望に答えるのが**データカタログ**です。

ここでは、IBMCloud上で使用できるSaaS型データカタログ、
「Watson Knowledge Catalog（通称WKC）」を実装してみましょう。

無償のliteプランがありますので、今回はそれを試してみたいと思います。

前提として、IBM Cloud上でのID（IBMid）を作成する必要があります。
手順：https://qiita.com/Shumpei_Kubo/items/564126081dea547dd742

このデータカタログは、「IBM Cloud Pak for Data as a Service（CP4DaaS）」というSaaS型データプラットフォームの１機能という位置付けになります。

- なお、本記事は2020/10時点で筆者が試したものですので、時間の経過に伴って画面等の内容が実態と合わなくなる可能性があります。

- 進めていく途中でうまくいかなかった場合は、その前のステップに戻ってやり直してみましょう。作成したものを削除してやり直すのでも良いと思います。

---
「リソースの作成→」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/ef8bc998-0516-a9ff-a6f3-a3f556ab0961.png)


---
検索窓で「Watson knowledge catalog」を検索して選択します。
![スクリーンショット 2020-10-29 10.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/a8007a1d-5497-a574-035e-cb09c13868f5.png)


---
リージョンはダラスを選択し、ライトプランが選択されていることを確認します。
![スクリーンショット 2020-10-29 11.04.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/853771ba-b144-c0f5-c378-3b9685307627.png)

サービス名を設定します。タグは任意に設定します。
タグの設定についての詳細はこちらをご参照ください。
https://cloud.ibm.com/docs/account?topic=account-tag
![スクリーンショット 2020-10-29 11.05.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/f3249618-c1e0-65e0-8c5a-9a2b9f5b69e8.png)

---
「Get Started」をクリックします。
![スクリーンショット 2020-10-29 11.06.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/5c81ba0b-9e56-bbef-d0fa-9de530f5650e.png)

WKCのプロビジョニングを待ちます。
![スクリーンショット 2020-10-29 11.13.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/58b675dc-bae0-c1d4-db02-b09646cf5498.png)


---
他にもWatson Studioや、Watson Machine Learning などのサービスを選べますが、
今回はWKCのみとします。（「選択＋」というボタンを押さない）
「Continue」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/30fdf86e-1b6d-4038-258d-efaaf4fe29f5.png)


---
「IBM Cloud Pak for Dataへの移動」をクリックします。
![スクリーンショット 2020-10-29 11.14.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/fdbbb066-ee3a-6830-76d4-85ba2d217ca3.png)

---
WKCが実装された、CP4DaaSの管理画面が出てきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/1008f75c-f59c-c898-5556-05a3642e6e5d.png)
Cluster API: v0.3.10 変更内容

## はじめに

ここでは 2020/10/2 にリリースされた Cluster API v0.3.10 の変更内容についてまとめます。Cluster API は、Kubernetes クラスタのプロビジョニング、アップグレード、運用を行う宣言型 API とツールを提供する Kubernetes のサブプロジェクトです。

- https://github.com/kubernetes-sigs/cluster-api/releases/tag/v0.3.10

## ⚠️ 互換性のない変更

「互換性のない変更」は、運用者向けの内容だけでなく、Infrastrucure provider といった各種プロバイダの実装向けにパブリックな関数のシグネチャの変更も CHANGELOG に書いてくれていて親切です。CI でパブリックな関数、変数のシグネチャに変更があると警告ができるようになっています。

- CRD を取得するときに metadata-only client を使用する ([#3625](https://github.com/kubernetes-sigs/cluster-api/pull/3625))
    - 影響: `ConvertReferenceAPIContract` 関数のシグネチャが `func(context.Context, logr.Logger, client.Client, rest.Config, corev1.ObjectReference) error` に変更されました
- ClusterCacheTracker で発生する可能性のあるデッドロックを排除する ([#3654](https://github.com/kubernetes-sigs/cluster-api/pull/3654))
    - 影響: ClusterCacheTracke の Watch メソッドを使用している場合、引数 `WatchInput` 構造体にユニークな `Name` が必要になりました
- [testing] docker machine pool と machine pool に対する e2e テストを追加 ([#3506](https://github.com/kubernetes-sigs/cluster-api/pull/3506))
    - 影響: `ApplyClusterTemplateAndWait` 関数のシグネチャが `func(context.Context, ApplyClusterTemplateAndWaitInput) *ApplyClusterTemplateAndWaitResult` に変更されました
- [testing] e2e セットアップ中に失敗した場合に kind クラスタをクリーンアップする
    - 影響: `LoadImagesToKindCluster` 関数が `error` を返すようになりました

## ✨ 新しい機能

- Machine のドレインのタイムアウト値を指定できるようになりました ([#3662](https://github.com/kubernetes-sigs/cluster-api/pull/3662))
    - :memo: Machine `spec.NodeDrainTimeout` フィールドで、ノード削除時のドレインのタイムアウト値が指定できるようになりました。デフォルトは `0` で時間制限がありません。
- [clusterctl] `clusterctl completion` コマンドが実装されました ([#3622](https://github.com/kubernetes-sigs/cluster-api/pull/3622))
    - :memo: シェル自動補完大好きな私が実装しました。v0.3.10 時点ではサブコマンドと引数のみが補完されます。ぜひ使ってみてください。
- [clusterctl] リモートにある設定ファイルが使用できるオプションが追加されました ([#3553](https://github.com/kubernetes-sigs/cluster-api/pull/3553))
    - :memo: `clusterctl init` や `clusterctl config cluster` コマンドの `--config` オプションが URL を受け付けるようになり、リモートに置かれたファイルを使えるようになりました
- [clusterctl] Cluster API Infrastructure providers に DigitalOcean (CAPDO) が追加されました ([#3621](https://github.com/kubernetes-sigs/cluster-api/pull/3621))
- [clusterctl] Cluster API Infrastructure providers に OpenStack (CAOP) が追加されました ([#3681](https://github.com/kubernetes-sigs/cluster-api/pull/3681))
- [clusterctl] AWS EKS bootstrap と control-plane providers が追加されました ([#3618](https://github.com/kubernetes-sigs/cluster-api/pull/3618), [#3685](https://github.com/kubernetes-sigs/cluster-api/pull/3685))

## 🐛 バグ修正

1つだけピックアップします。

- マネージドな Control Plane でのノードの削除の問題を修正しました ([#3673](https://github.com/kubernetes-sigs/cluster-api/pull/3673))
    - :memo: CAPA (Cluster API Provider AWS) の EKS provider を使ってクラスタを作成した場合に ControlPlane Machine が存在しない（EKS を使用しており、ControlPlane はマネージドであるため）ことで、Machine が削除されなかったようです
画像認識技術の基本原理（初心者向け）

画像認識技術とは？

　テキスト認識、顔認識などすべて画像認識技術の応用です。ただし、これは全部画像認識技術の基本応用です。最先端の技術はすでに犬の写真のか猫の写真のかを認識できるようになりました。
　それはどうやったの？専門家たちの研究で、人間は物の輪郭を見てから、それが何ですかを判断しています。画像認識技術も同じでまずは画像の輪郭を認識から始めます。

![c3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837885/ab250102-c69a-6435-1fd7-4a031094b37b.png)


　カリフォルニア大学の学生AditDeshpandeは、《A Beginner's Guide To Understanding Convolutional Neural Networks》という記事を書きました。その中に初心者向けて、画像認識のアルゴリズムや基本的な原因を分かりやすく紹介しました。

　コンピュータは画像を数値配列に転換していますので、「画像認識」とは数値配列を分析することです。一般的に余裕な情報を除外するために、画像を縮小し（49 x 49ピクセル）、各ピクセルの色情報をグレー値に変換して、49 x 49のマトリックスを取得することができます。
次に、左上から小さなブロックを1つずつ取り出して計算します。
![c5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837885/773d19c6-3bae-7fc8-d11c-464d8bc2a723.png)

例１：
![c6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837885/595bdab4-ce67-4a2e-2746-372c3cabf276.png)

右側の図は曲線、左側は曲線の7 x 7のグレーマトリックスです。曲線のところにエッジグレー値が高い、他はすべて「0」です。

これから画像認識を行います。下記はネズミの画像です。
![c7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837885/7303db4a-f1cd-1d3a-4795-89451752475b.png)

![c8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837885/13243f82-6834-8e5e-0d9f-9e2194cb545c.png)



左上隅のブロックを取り出して、グレーマトリックスに転換し、マトリックスの重複ところの数値を乗算して合計する結果は6600です。かなり大きい数値ですが、何を説明できるのか？
![c9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837885/beae20a4-2941-5f69-2ec6-e59bf3c8bc47.png)

ネズミの頭をマトリックス化にすると値は0になります。

結論：
　計算結果の値が大きいだと画像一致する部分が多いという結論出来ました。通常はたくさんモードが事前用意されており、ブロックごとに最適なモードを計算され、最後に全体を判断されます。
Power Automateの承認の種類メモ

Power Automateには承認が３つ存在する。
どれが適切なのか、日本語版と英語版でごっちゃになりやすいので備忘録としてかく。

特にこう……動的なコンテンツの「応答」と「結果」の違いがよくわかっていないので
それが理解できればいいと思う。
というのも、今私が取り組んでいる承認フロー(SharePointリストとの連携)では
コンテンツの承認状態がうまく更新されない事象で困っているからだ。
多分出力が「応答」もしくは「結果」の違いが関連しているとは思うんだけど…。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/7572ccb9-9352-fe9e-0c85-29644e4bd266.png)

2020/10/30の時点での3つの承認
・開始して承認を待機
・承認を作成
・承認を待機

##開始して承認を待機

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/a6a5d8c9-39a8-6b0c-b030-c163691f129f.png)

自動承認プロセスを開始し、完了するまで待機します。承認は取り消し可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/0962872c-8986-6c31-ef00-efdd53bf7a59.png)

「開始して承認を待機」を選択すると、承認の種類を選ぶ必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/7d6f94b7-ae3f-d325-60ff-ea1aaa764d6d.png)

試しに私が使いそうな「承認/拒否-最初に応答」を選択するとこうなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/59d9f8d2-a6af-79bb-7909-26b6dc4a4926.png)

「開始して承認を待機」は、その後の条件コントロールで「応答」「結果」両方選択できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/4371e52b-f791-7fcf-4fcf-d53a2d451df5.png)



##承認を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/f1b3a845-7907-8c6d-4f39-2af005c97d0b.png)

自動承認プロセスを開始しますが、承認が完了するのを待機しません。
承認は取り消し可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/9a1397ae-d8f8-b3af-02a4-82cae8324298.png)

「承認を作成」を選択すると、承認の種類を選ぶ必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/32d1a266-058d-2d9d-c67f-845ed79dd83c.png)

試しに私が使いそうな「承認/拒否-最初に応答」を選択するとこうなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/e604ae25-1b1d-0cb0-5c19-f70f98571ba0.png)

「承認を作成」は、その後の条件コントロールで「応答」も「結果」も選択できない。
承認フローは直後に承認結果による分岐をするのが普通だと思うので、
このアクションがどのように作られるのかがまだよくわからない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/576aeae5-3fb9-28b1-c77a-bd9ef2f1c508.png)

##承認を待機
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/ca239b24-60f2-d286-06a2-c4b823be4ef2.png)

指定された承認が完了するまで待機します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/2d712663-0e1b-33bb-ab29-c119aa203a50.png)

「承認を待機」を選択すると、上2つと異なり"どの承認か"を示す「承認ID」の入力が必要になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/8ea1e376-1f4d-908f-c513-c15091e88bd5.png)

「承認を待機」は、その後の条件コントロールで「応答」「結果」両方選択できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/7e6e6eb5-0dbe-8d89-5cef-473c8ae3e574.png)
また、動的コンテンツの「応答」関連が多い気がした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/2e0995aa-f76f-7947-d87e-36a0315caa9c.png)

結局、承認アクションを作るなら「開始して承認を待機」が一番無難なのだとは思われる。
しかし期待していた「応答」「結果」の違いはわからなかった……。
ちなみに、下記参照のLearn moreのリンク先内に「応答」「結果」の違いは説明されていなかった。(残念)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/c6ecf7e1-af51-3438-7232-083e5d711199.png)


#参考URL
Learn moreのリンク先
https://docs.microsoft.com/ja-jp/connectors/approvals/#start-and-wait-for-an-approval
Command Lineの様々なコマンド

今更ながら、コマンドについて勉強してみた。
また、ググったりするのも面倒なので、自分の確認用メモとして残しておこうと思う。
（随時更新中）
<br>

基礎知識
-

- ディレクトリ

　コマンドラインではフォルダの事を<b>ディレクトリ</b>と呼ぶ。
　また、自分が今いるディレクトリを<b>カレントディレクトリ</b>と言う。

```.text:ターミナル
sample@sampleMBP game % 
// → gameと記載されている所が今いるディレクトリ（カレントディレクトリ）
```

<br>

色々なコマンド
-

- ファイルの作成

　ファイルを作成するには、<b>touchコマンド</b>を使用。
　<b>`「touch ファイル名」`</b>と入力して実行することで、空のファイルを作成することが出来る。
<br>

- ファイルの中身を表示

　コマンドでファイルの中身を表示するには、<b>catコマンド</b>を使用。
　<b>`「cat ファイル名」`</b>と入力することで使用する事が出来る。

　このコマンドを使う場合はディレクトリに注意。
　何処のディレクトリにあるファイルなのかをしっかり確認する。
　ディレクトリ：game　→　ファイル：test.py


```.text:ターミナル
// ホームディレクトリで catコマンドを使用してもファイルながないと言われる
sample@sampleMBP ~ % cat test.py
cat: test.py: No such file or directory

// gameディレクトリで catコマンドを使用すれば、ちゃんと表示される
sample@sampleMBP game % cat test.py
a = 10
```
<br>

- ディレクトリを作成

　ディレクトリを作成するには、mkdirコマンドを使用する。
　<b>`「mkdir ディレクトリ名」`</b>と入力することで使用する事が出来る。
　mkdirは、make directory の略です。

```.text:例
// gameディレクトリの中に mkdirコマンドを使用してPSのディレクトリを作成
sample@sampleMBP game % mkdir PS

```
<br>

- ディレクトリの移動

　ディレクトリを移動するためには<b>cdコマンド</b>を使用する。
　<b>`「cd ディレクトリ名」`</b>とすることで、指定したディレクトリに移動することが出来る。

```.text:ターミナル
// ホームディレクトリから、cdコマンドでgameディレクトリに移動
sample@sampleMBP ~ % cd game
sample@sampleMBP game ~ %

```
<br>

- カレントディレクトリを確認

　作業中のディレクトリを確認できる<b>pwdコマンド</b>を使用する。

```.text:ターミナル
// pwdコマンドで、カレントディレクトリまでの階層が全て表示
sample@sampleMBP game~ % pwd
/Users/sample/game
```
<br>

- ディレクトリの中身を表示

　ディレクトリを移動するときなどには、ディレクトリの中身を見れた方が便利なので、
　lsコマンドを使い中見を確認する。
　lsは、listの略です。

```.text:ターミナル
// lsコマンドで、ディレクトリの中身を確認
sample@sampleMBP game ~ % ls
Chapter3				script.py
Chapter5				test.py
```
<br>

- ホームディレクトリに移動

　cdコマンドでは、ディレクトリを指定せずに「cd」のみで実行すると、
　ホームディレクトリと呼ばれるディレクトリに移動することが出来る。
　ホームディレクトリとは、新規にターミナルを立ち上げた場合に作業中となるディレクトリ。
　ホームディレクトリは、<b>/Users/ユーザ名と「~」</b>で表されます。

```.text:ターミナル
// cdのみのコマンドで、ホームディレクトリに移動
sample@sampleMBP game ~ % cd
sample@sampleMBP ~ %
```
<br>

- ファイルを移動

　ファイルを移動させるには、<b>mvコマンド</b>を使用する。
　<b>`「mv ファイル名 ディレクトリ名」`</b>とすることで指定したディレクトリにファイルを
　移動させることが出来る。

　mvコマンドでは、ファイル1つずつだけでなくディレクトリごと移動させることも可能。
　<b>`「mv ディレクトリ名 移動先のディレクトリ名」`</b>とすることで、そのディレクトリ以下のファイルやディレクトリも
　一緒に移動させることが出来る。
<br>

- ファイル名を変更

　先程、ファイルやディレクトリの移動に使ったmvコマンドは、ファイル名を変更することにも使用。
　<b>`「mv ファイル名 新しいファイル名」`</b>とすることでファイル名を変更出来る。

```.text:ターミナル
// lsコマンドで、ディレクトリの中身を確認
sample@sampleMBP game ~ % ls
Chapter3				script.py
Chapter5				test.py
// mvコマンドで、ファイル名を変更
sample@sampleMBP game ~ % mv test.py production.py
// 再度lsコマンドで、ファイル名が変更されているかを確認
sample@sampleMBP game ~ % ls
Chapter3				script.py
Chapter5				production.py
```
<br>

- ファイルのコピー

　ファイルをコピーするにはcpコマンドを使用する。
　<b>`「cp コピーするファイル名 新しいファイル名」`</b>とすることでコピーすること出来る。

　cpコマンドでは「-r」を付けることで、ファイルだけでなくディレクトリもコピーすることが出来る。
　<b>`「cp -r コピーするディレクトリ名 新しいディレクトリ名」`</b>とすることでコピー出来ます。
<br>

- ファイルの削除

　ファイルを削除するにはrmコマンドを使用する。
　<b>`「rm ファイル名」`</b>とすることで削除出来る。

　rmコマンドは「-r」を付けることでディレクトリも削除することが出来る。
　<b>`「rm -r ディレクトリ」`</b>とすることでディレクトリを削除することも出来る。
インフラエンジニアのAI（ML）入門→MLOpsへ【AWS DeepRacerで学ぶ】

AWS Summit Online（2020）に参加したのですが、AI関連のセッションが多かったです。
AIが徐々に気になってきましたので、下記についてまとめました。
・インフラエンジニアがAIを学ぶ価値が分かる
・流行ワード「MLOps」のイメージが分かる
・AIの勉強の仕方がわかる

私はインフラエンジニア経験は10年以上ありますが、AIは初学者です。
本記事を読むことで下記の様な悩みが解決できると思います。
・AIについてどうやって学習していけばよいか分からない
・ITエンジニアの仕事はAIに奪われるのではないか心配（AIが仕事を奪うのは事実です）

## インフラエンジニアのスペシャリストとしてのキャリアを考える
### 第４次産業革命とは
[第４次産業革命のインパクト](https://www5.cao.go.jp/keizai3/2016/0117nk/n16_2_1.html)

内閣府のページに技術革新としてIoTやビッグデータ、AI、ロボット技術が利用されていくとあります。
2017年の時点で政府主体で上記の技術を推していたことが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/9200937b-c316-db8f-33fa-8ee6f6107e91.png)

### AI人材の重要性
[IT 人材需給に関する調査（みずほ情報総研株式会社）](https://www.meti.go.jp/policy/it_policy/jinzai/houkokusyo.pdf)

100万人程度のIT人材の中で従来型IT人材は2030年には10～20万人程度の仕事がなくなるという試算がでていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/a8cef2c3-c52d-8d74-34c1-3c67bcc1402a.png)

※先端IT人材とは「AI やビッグデータ、IoT 等、第４次産業革命に対応した新しいビジネスの担い手」のことだとあります。

### AWS資格から見たエンジニアの専門領域
AWSの資格の専門領域分野にはAIやビッグデータの他にもネットワークやセキュリティ、データベースがあります。AI関連として２つの資格（Machine Learning、Alexa Skill Builder）があることからAIに力を入れていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/0da8a920-9ee5-54b5-f1b9-f4859e74ffc4.png)



## インフラエンジニア×AI知識＝MLOps
### MLOpsとは
DevOps+AI知識＝MLOpsという理解で良さそうです。
[2019年のDevOps/MLOpsエンジニアの標準的スキルセット](https://qiita.com/poly_soft/items/8dd105341869f93b129c)

MLOpsという職種の事例ですが、下記aidemy社の事例動画が分かりやすいので、ぜひ見て頂きたいです。
（AWS Summitへの登録が必要ですが）

[CUS-85：製造業における IoT×AI/ML 基盤の構築とその運用事例](https://resources.awscloud.com/aws-summit-online-japan-2020-on-demand-industry-3-12034/cus-85-aws-summit-online-2020-aidemy)


動画見る時間が無い方向けに一言で纏めてしまうと、
MLOpsとはAIの学習モデルの開発ではなく、運用を担当する職種です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/699b7130-ef6d-c6b3-fbd9-5847a03896d9.png)

リソースを用意したり、システムの監視や分析をしたりする
インフラエンジニアのシステム運用と似通っている職種だというイメージです。
（ただしAIの基礎知識は必須になるかと）

※AWSのSageMaker利用するとMLOpsの基本的な機能を楽に実現できるようです。


### AI知識が必須となる案件は少ない
MLOps案件募集をみると
必須スキルにはAWSやGCPなどのクラウド利用経験やプログラミング経験がありますが、
機械学習スキルについては尚可という位置づけの案件が多いです。
インフラエンジニアとしてのキャリアを生かせば今ならスキルチェンジは可能です。

## AI入門【AWS DeepRacerで学ぶ】
### AWSのAIへの取り組み
「すべてのデベロッパーに機械学習の恩恵を」というAWSの理念があります。
AWS DeepRacerは「強化学習をすべての開発者に届けるためのサービス」ということで
楽しみながら強化学習を学べるようになっています。
ハンズオンもあります。
※最初は無料枠で実践可能。面白さにハマると課金されます。

[AWS DeepRacerハンズオン](https://aws.amazon.com/jp/about-aws/events/2020/doc121111/)


## さいごに
恐怖を煽るような記事になってしまいましたが、基本的には新しいことを学ぶのは楽しいです。
特にDeepRacerは遊び感覚で学べるツールなので積極活用していきましょう。
学んだ先に新たな職種であるMLOpsにチャレンジしてみるのも面白そうです。
【ロードマップ】React1ヶ月やってみて

# はじめに

こんにちは！ばーんです。

今回はReactをキャッチアップして学んだことを書いていきたいと思います。
自身の備忘録と、今後人にすすめる時の基準として。

生のJSを半年ほど書いて、10月まるっとReactと向き合いました。

## Reactで覚えていく内容

ざっと書いていくと↓こんな項目かと

### 基礎的な内容

- JSX
- CSS-in-JS
- クラスコンポーネントと関数コンポーネント
- propsとstate
- API(GraphQLは除く)

### 応用的な内容

- 各種ライブラリの実装(Router / Form / Test)
- TS
- SSG
- 状態管理(Redux)
- SSR
- React Native
- Webpack
- Firebase

and more...

## 現在の状態

1ヶ月でどれぐらいできるようになったの？という話ですが

- 基本的な内容の理解〜実装ができる
- 全体像をみて理解できていない単語が殆どなくなった。ふわっと概念は把握できた

## 実際にやったこと

**2020/11/1追記**

この記事書いた翌日からGatsbyやり始めたのですが、
最初はGatsbyチュートリアルの方が分かりやすいかなと感じました！

ステートには触れずにJSXやCSS-in-JSから入るので

参考サイト: [Gatsbyチュートリアル](https://www.gatsbyjs.com/tutorial/)

- お仕事(ECサイトのリプレイス)

これは本当にありがたかった…やはり実務に勝るものはないので多くのことを学べました。
propsのバケツリレー / 情報構造 / コンポーネントの分け方など

- 公式チュートリアル1周
  - CSS-in-JSに変更
  - squares / boradをコンポーネントに分けてみる(別のディレクトリに分ける)

基本的なことはここで学べますし、環境構築も含めて簡単にできました。
ただ、おすすめは少し内容に＋αするとより学べるのかなと思います。
 
参考サイト: [公式サイト](https://ja.reactjs.org/tutorial/tutorial.html)

- Udemy視聴

後半のReduxはかなり難しいのですが、クラスコンポーネントで簡単なアプリケーションの作成はできるようになります。
mapの使い方など基礎的な部分にもフォーカスされているのでとても良かったです。
個人的にはさらっと見て、その後自分で実装したいアプリをこれを参考にしながら作るとかはいいかなと感じました。

参考サイト: [Udemy](https://www.udemy.com/course/react-redux-basic/)

- りあクト！読了

歴史的背景、JSの基礎、最新の技術についてまで網羅されており、とても理解が捗りました。
ただ、情報量は多い為完全に理解しながらというよりさっと読んで輪郭を掴むという進め方です。

参考サイト: [りあクト！](https://oukayuka.booth.pm/)

- 過去に作った静的サイトをReactでリプレイスする

有識者の方に指導いただきながら進めました。
CSS-in-JSやJSXについて、ディレクトリの分け方についてなどを学べます。
また、元サイトがscssで入れ子だらけで作ってたのでその辺の苦労も身に染みましたw

※静的サイトが無い方でも公式チュートリアルを応用すれば同じこと学べるかと思います。

参考サイト: [リプレイス途中のGitHub](https://github.com/hashibadaiki/react-portfolio)

## 学んだこと、所感

### ①技術が幅広く、入れ替わりが激しい。その為技術選定が難しい
大きいもので言うと「クラスと関数ってどっちで書いたほうがいいの？」、
Reduxより良い状態管理の方法ないの？など日進月歩で進んできた技術なので

○○は●●よりこういった点で優れている
と1つ1つ理解していないと判断が難しいなと感じました。

### ②書いてみないとわからないことが多い
もちろん殆どの技術がこうだと分かっているのですが、特にこの傾向が強いと感じました。
なので、ふんわり感覚を掴んで進んでいき小さいサイクルで実践していくが今まで以上に重要だと感じました。


## 今後やっていくもの

直近でやっていきたいのが

- クラスコンポーネントに慣れる
- 基本的にTSで書いていく。慣れる
- テストツール(Jest)に慣れる

です。どれも繰り返し実践で経験することで品質も上がっていくのかなと考えています。
TSやJestはReact特有では無いですが、今後必ず必要になるはずなので。

この辺りに慣れてくれば

- Redux
- Webpack
- SSR

などのアドバンスな内容を意識的に挑戦していこうと考えています。
クラスコンポーネントやReduxは変わりつつある技術だと思いますが、過去のプロジェクトの対応になると触る機会も多いと思うので。

参考サイト: [Reactロードマップ](https://roadmap.sh/react)

## さいごに

さいごまでご覧いただきありがとうございました！

しばらくReactを中心に進めていきたいと思います＾＾
WSL1のUbuntuをWSL2に変換しようとしてハマったときのメモ

# 概要
- WSL2にしてDockerが使いたい
- 変換をかけるとHard-Linkでエラーが出る
- フォーラムに投稿されてた方法で解決できた
  - https://github.com/microsoft/WSL/issues/4457

## 対策

rubyの全削除＋dpkgのエラー（中身が残ってる）で削除できなかったものは手で削除

```bash
sudo apt purge ruby
sudo apt autoremove --purge && sudo apt autoclean -y

sudo rm -rf /var/lib/gems
sudo rm -rf /usr/share/fonts/truetype/lato
```

変換に時間はかかるけど、再構築が面倒だったのでこうしてみた。
問題なさそうなので、しばらくこのままで運用して見る予定。
rubyはなんのために入れたんだったかなあ……
Laravelのシーディングのやり方についてまとめてみた

マイグレーションを行なった後に手作業でダミーのデータを作っていた時があった。

ダミーデータを何個も手作業で入れるのは流石にどう考えても非効率である。

そんなへっぽこな私がテーブルに簡単にダミーデータの入れ方を学習したので私みたいに無知だった人は是非ここで学んでもらってこれからの学習を楽にしてもらいたい。

#①シーダーファイルの作成
初期状態のファイルにデータを入れることを「シーディング」という。そのための処理を行なって行きたい。

ターミナルを開き

```
php artisan make:seeder (ここにシーダーファイル名をいれる)
```
と入力。これで
App->database->seedsフォルダ内に作られることになる。

#②シーディング処理を行う。
ファイル内を除くとupと呼ばれるメソッドがあるのに気づくだろう。その中にテーブルに予め作っておいたカラムに該当するデータを入れていくというわけだ。

```
use Illuminate\Support\Facades\DB;　　←この文章を追加しないとDBとの接続ができない。

   public function run()
    {
        $param=[
            'name'=>'taro',
            'mail'=>'taro@yamada.jp',
            'age' =>12,
        ];
        DB::table('people')->insert($param);
　　}
```
テーブル内には「name」「mail」「age」のカラムを入れていたのでそのカラムに対してそれぞれ配列で
配列で値を入れている。今回は配列の変数を$paramと置いている。

そして最後にデータベース内にあるテーブルに対して変数paramとして挿入すれば良い。

#③シーディングの実行
これだけではデータベースにデータを入れ込めてはいない。

このシーディングファイルとseedsファイル内にあるDatabaseSeeder.phpと紐づける必要がある。

```
〜DatabaseSeeder.phpファイルの中〜

   public function run()
    {
         $this->call(①でつくったファイル名::class);
      
    }
```
これで紐付けが完了した。最後にターミナルで

```
php artisan db::seed
```
と入力すればデータベースに先ほど入れたデータが入力されたことになる。
IBMidを作成してみる。

- Cloud Pak for Data というSaaS型データ基盤を使う為の準備として、IBMCloudのID（IBMid）を作成します。
- 有効なメールアドレスがあり、かつ１６歳以上でIDの作成可能です。

---
https://cloud.ibm.com/login
にアクセスし、「アカウントの作成」をクリックします。
![スクリーンショット 2020-10-29 9.27.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/c8a5a154-7a6c-7f73-17f5-2cf5a366593f.png)

---
アカウントの作成画面でEメール、そして新たにパスワードを設定し、「次へ」をクリックします。
![スクリーンショット 2020-10-29 9.31.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/7e4a0e83-3533-dadf-9ad5-0af6d28a99f0.png)


---
登録したメールアドレスにメールが送信されましたので、その検証コードを入力する必要があります。
![スクリーンショット 2020-10-29 9.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/b0f35f78-bee0-305f-b003-240a1511e819.png)


---
メールがきていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/c86e0322-65f5-b72a-dce6-f0c341338c4e.png)


---
検証コードを入力して「次へ」をクリックします。
![スクリーンショット 2020-10-30 19.18.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/b8c0f774-cda0-6873-3e60-491932b094c4.png)


---
名前と国（あるいはリージョン）を入力して「次へ」をクリックします。
![スクリーンショット 2020-10-29 9.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/bbe9e68d-3855-b5c8-93c0-b639ae7197ff.png)


---
「アカウントの作成」をクリックします。
![スクリーンショット 2020-10-29 9.41.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/bf8bb98b-a8ac-0572-cd24-320cbdb852bf.png)


---
アカウントの作成、ログイン処理を待ちます。
![スクリーンショット 2020-10-29 9.46.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/9443fa8d-60b5-b974-c69d-dbca1e4c1326.png)


---
IBMのプライバシーポリシーを確認して、「次に進む」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/02af8528-d0c2-8262-3509-1294f0e4695b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/4d7f18b5-3041-6a9f-da72-073012aba025.png)

---
IBMCloudにログインできました！
![スクリーンショット 2020-10-29 9.49.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/2fa8c2f4-c18d-99d7-30a8-b85c43bc2c14.png)
OpenJtalk で日本語の発話

こちらと同じことを、Ubuntu 20.10 で確認しました。
[OpenJTalk + python で日本語テキストを発話](https://qiita.com/kkoba84/items/b828229c374a249965a9)

私が確認した環境

```text
$ uname -a
Linux iwata 5.8.0-26-generic #27-Ubuntu SMP Wed Oct 21 22:29:16 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
$ python --version
Python 3.8.6
```

1) ライブラリーのインストール

```bash
sudo apt install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
```

2) 音声ファイルのセットアップ

```bash
get https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.6/MMDAgent_Example-1.6.zip/download -O MMDAgent_Example-1.6.zip
```

```bash
unzip MMDAgent_Example-1.6.zip MMDAgent_Example-1.6/Voice/*
```

```bash
sudo cp -r MMDAgent_Example-1.6/Voice/mei/ /usr/share/hts-voice
```

3) Python による再生

```py:jtalk.py
#! /usr/bin/python
#
import subprocess
from datetime import datetime

def jtalk(tt):
    open_jtalk=['open_jtalk']
    mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic']
    htsvoice=['-m','/usr/share/hts-voice/mei/mei_normal.htsvoice']
    speed=['-r','1.0']
    outwav=['-ow','open_jtalk.wav']
    cmd=open_jtalk+mech+htsvoice+speed+outwav
    subprocess.run(cmd,input=tt.encode())
    aplay = ['aplay','-q','open_jtalk.wav']
    subprocess.run(aplay)

def say_datetime():
    d = datetime.now()
    text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
    jtalk(text)

if __name__ == '__main__':
    say_datetime()
#
```

実行

```bash
./jtalk.py
```

時間を言い、open_jtalk.wav　が作成されます。

wav ファイルの再生

```text
$ aplay open_jtalk.wav 
再生中 WAVE 'open_jtalk.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
```

サンプルのプログラム

```py:ex01.py
#! /usr/bin/python
#
import jtalk

jtalk.jtalk('こんにちは')
#
```

```py:ex02.py
#! /usr/bin/python
#
import jtalk

text_aa = 'あるひとがろばを一匹飼っていました。'
text_aa += 'このろばはそれまで長い間、休まずせっせと麦を水車小屋に運んできました。'

#
jtalk.jtalk(text_aa)
#
```
WSH/JScriptをバッチとして実行する（まだこんなことやってる


以前、こんなのがありました。

>WSH/JScriptをバッチとして実行する（何を言ってるのかわからない - Qiita
>https://qiita.com/itasnasal/items/70b042f1fe96ef106c12

この時気に入らない点として

・ゴミが1行表示される。
・起動パラメータがエレガントに扱えない。

とあるが、それ以前に「別バッチを一つ用意する」というのがそもそも気に入らない。
特段の前準備とか無しで、起動するバッチファイル一個ですべてが解決できるようにしたい。

けど、そのままずっと忘れたままだった。

で、最近

>WSH JScript Chakra エンジンの共存による機能制限の回避（WScript Quit 代替） - イネマルのプログラミング備忘録
>https://inemaru.hatenablog.com/entry/2020/08/11/020312

これを見ていると、「WSH/JScriptをバッチとして実行する」のに、JScriptの条件コンパイルを利用していた。

JScriptの条件コンパイルという機能は、自分は「あるのはおぼろげに知っていたけど、詳細は全く知らない」状態だった。この機会にちょっと勉強してみた。

へー。こんな機能があったんだ。

32ビット/64ビットのチェックと切り替えに使えるな。今は SysWOW64 の有無で簡易チェックしてるけど、きちんとしたチェックができる。

それよりだ。

```
@set ステートメント

条件コンパイル ステートメントで使用する変数を作成します。

@set @varname = term 
```

これわっ。

```
@set @hogehoge=0 /*
```

と書けば、

>JScriptでは条件コンパイル用変数設定＋コメントの開始
>バッチでは環境変数「@hogehoge」に「0 /*」を設定

となるじゃないですか。試してみたが大丈夫だ。

というわけで hello.bat を改良して hello2.bat にしてみた。

``` hello2.bat
@set @x=0 /*
@set @x=
@cscript //nologo //E:JScript "%~f0" %*
@exit /B
*/ // ↑でバッチ自体は終了するので、ここからはバッチからは無視される。
// ↓JScript コードを記述する

var WshShell = new ActiveXObject("WScript.Shell");

WshShell.Popup( "hello, world" );
```

ゴミ表示は出ないし、起動パラメータも普通に扱える。
おまけに「別バッチを一つ用意する」必要もない。

完璧じゃん。今のところ、特に不都合は見つかってない。

早速、現在検討中の案件で使ってみよう。
【Ruby on Rails】redirect_toの使い方

# はじめに
コントローラー内で処理が終わった（終わらなかった）後に
どのページに遷移させるかを考えないといけませんが、
その際にredirect_toを使用します。

# redirect_toとは
指定したURLに遷移させることができるメソッドです。

```rb:基本的な書き方
redirect_to "リダイレクト先"
```

# 実際のコード
このコードに関しては、使えるものがあり次第更新していきます。

```rb:URLで指定
redirect_to "https://qiita.com/japwork"
```
```rb:path名で指定
redirect_to root_path
```
```rb:アクション名で指定
redirect_to action: :index
```
```rb:異なるコントローラーのアクション名で指定
redirect_to controller: :post, action: :index
```
```rb:前のページに戻る
redirect_to :back
```
```rb:同じページをリダイレクトする
redirect_to request.referer
```

# 成功時にメッセージを表示させる

```rb:controller
redirect_to  root_path, notice: '成功です'
```
```erb:view
<%= notice %>
```

# renderとの違い
redirect_toはアクションを実行して、そのアクションに対応したviewを表示させます。

renderはアクションを実行せずにviewを表示させます。
viewにアクションで取得するインスタンス変数がある場合はエラーとなります。

# まとめ
if文と併用することにより、結果次第で遷移先を変えて表示することができるため、
様々な方法を知っておく必要があります。
上記の他にもステータスコードもあるので、興味があれば調べてみてください。

またtwitterではQiitaにはアップしていない技術や考え方もアップしていますので、
よければフォローして頂けると嬉しいです。
詳しくはこちら　https://twitter.com/japwork
Laravelのマイグレーションの仕方についてまとめてみた。

Laravelを学習していては避けれないDBとの付き合い。その中でも
「マイグレーション」の作り方はしっかり覚えていく必要があるのでまとめてみた。

# ①マイグレーションファイルの作成
```
php artisan make:migrate create_people_table
```

自分の操作しているディレクトリに移動した状態でターミナルでマイグレーションファイルの作成を行う。

```
php artisan make:migrate （自分が決めたファイル名）
```
構文としてはこんな感じである。

#②テーブルの作成
App→database→migrationsと移動し、自分の作ったマイグレーションファイルに移動。

作成日の後ろに自分の作ったファイル名があるから容易に見つけることが出来るだろう。

```
    public function up()
    {
        Schema::create('people', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('mail');
            $table->integer('age');
            $table->timestamps();
        });
    }
```
public function upがテーブル作成処理をするメソッドなのでここに自分が作りたいと思っているテーブルのカラムをいれていく。

予めに$table->bigIncrements('id')と
$table->timestamps()はマイグレーションファイルを作成した時に勝手に作られているものである。

今回はテーブルに「name」と「mail」そして「age」の３つのカラムを入れみた。

#③マイグレーションを試す
またターミナルに戻り

```
php artisan migrate
```
と記入すればDBにテーブルが反映されていることが出来るだろう。
MAMP(MacOS)でのmy.cnfファイルの作成方法

MySQLのバージョンアップにより、` General error`などの様々なエラーが出るようになりました。
下記の方法で`my.cnf`を作成・設置することで解決できます。

調べてみると、`/Applications/MAMP/Library/support-files/my-default.cnf`を
コピーして設置するとできるみたいですが、`my-default.cnf`ファイルが同梱されていたのはバージョンが5.6までのようです。
ちなみに私の方では、`support-files`フォルダには`magic、mysql-log-rotate、mysql.server、mysqld_multi.server`しかありませんでした。

なので、新規で作成して設置する必要があります。
1.`MAMP`→`conf`→こちらに `my.cnf`を作成・設置します。
作成方法に関しては、他のファイルをコピー＆ペーストし、ファイル名と中身の内容を変えることで可能です。

![スクリーンショット 2020-10-30 17.01.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601015/c3db78f5-2ff3-657e-7f1b-15a240df357d.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601015/d3c7b303-3d31-3d20-de3f-207513cadc05.png)

詳しい内容につきましたは下記の参考元サイトをご覧ください。
参考元はこちら↓
(https://qiita.com/21century_girl_/items/5be2606b3bfa98514952)
(https://rensrv.com/hs/osx/mamp/dep-mycnf/)
初心者としてAndroidアプリ開発を一から学ぶ #1

一応過去に2年くらい開発していたことがあるのですが

- 7年のブランク
- 最後に触ったバージョンは Android 4.4
- AndroidStudio：インストールしたことならあるよ
- Kotlin：何それ美味しいの？

という状態で、先日AndroidStudioをインストールして、画面レイアウトすら作れず途方に暮れました…自分の経験なんて化石でしかないんやと。
正直「何となく触ればわかるだろう」と高をくくっていたのですが、Hello Worldすらできない状態なので、初心者として一から学んでいこうと化石は決心しました。

というわけで、「何かしらのプログラミング経験はあるけどAndroidワカラナイ」という状態の人間が、Android開発を学んでいく方法を探りながら書き留めていこうと思います。

## まずはDeveloperガイド
とりあえずは公式ドキュメントのデベロッパーガイドを読み進めようと思います。
（老人なので「す、すごい、日本語になっている…！」と感動しました）
[Android Develipers > ドキュメント > デベロッパーガイド](https://developer.android.com/guide)

### 公式のコース、チュートリアルなど
デベロッパーガイドの最初に、下記の案内があります。
実際の内容は全部英語っぽいです。AAD認定試験を考慮するならこれは英語のままクリアしておきたいところでしょうか。

>Codelab: 自分のペースで学習できる短いチュートリアルです。それぞれのチュートリアルでは、個別のトピックを扱っています。Codelab では通常、小さなアプリを作成するプロセスや、既存のアプリに新しい機能を追加するプロセスについて順に説明しています。
>コース: Android アプリの作成方法を順を追って学習するためのガイド付きトレーニングです。
>オンライン トレーニング: 動画を使ってオンラインで学習できます。Kotlin で Android アプリを開発する Udacity のコースや（紹介動画がこのページに埋め込まれています）、下記のオンライン コースをご覧ください。

## ドキュメントの読み進め方
「そんなもん好きに読めばいい」のですが、順を追っていく道なのか、脇道なのかが判然としないままリンクがいっぱいあって初学者は迷いそうと思ったので。（迷った）

デベロッパーガイドは画面左カラムにメニューがずらっと並んでいて、これを上から読んでいくのが順当かなと思います。
選択されているドキュメントが右に表示されるのですが、文章中のリンクは関連項目ではあるものの、順当にいけば後で出会う内容のようです。
なので、とりあえず全体の概容を把握したい人は、リンクはスルーして「次へ」にあたる部分を進んでいく（＝左カラムの上から順になめる）のが良いと思います。

確認しないと落ち着かない方はリンク先を都度確認するのも良いですが、迷子になりそう＆読み進むのに時間がかかりそうなので、心が折れない程度で諦めをつけたほうが幸せになれると思います。（あくまで個人の意見ですが）

### AndroidStudioは先にインストールしておいた方がいい
「はじめに」の次はもう「初めてのアプリを作成する」、とりあえずまずはHello Worldしてみましょうという方針なので、最初に開発環境は作っておきましょう。
「Android 開発環境 構築」とかでググってやってみた記事を探す方が、公式よりわかりやすいと思います。

### 実機で試したければadb環境も用意しておいた方がいい
チュートリアルのアプリを実機で実行したい方は端末とUSBケーブルと、端末のadbドライバ（メーカーサイトで探す）を入れておきましょう。
これもやり方がよくわからなければググりましょう

アプリを実行する段にはエミュレータでの実行方法も載っているので、実機が無くても大丈夫です。化石はいま繋げる端末がないのでエミュレータでやります。

※実機がある場合もエミュレータを触っておくと良い気がします（持ってないバージョンのOSとか確認するのに必要になるので）

### エミュレータの終了方法
ドキュメントだとアプリを実行してHello Worldした後そのままUIの作り方に進んでしまうんですが、化石はここで一旦終わりたかったのでメモ。

エミュレータの横にツールバーが表示されているので、右上の「×」をクリックでエミュレータ自体を終了できます。

![エミュレータ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738160/b79d6fde-1d31-1ced-6e46-98298de3c96f.png)


***
今回はここまで。
各種DNSレコード(A,TXT, NS, MX, ..) をdigで一発でdigる

毎回忘れるのでここにかいておく 
(digはオプション指定しないとDNSレコード以外の情報があって見にくい + パースしにくいんんですよね)

```
$ dig @8.8.8.8  +nocmd +nostats +nocomments +noques qiita.com any
qiita.com.              59      IN      A       13.114.93.234
qiita.com.              59      IN      A       54.92.88.68
qiita.com.              59      IN      A       54.249.143.121
qiita.com.              299     IN      NS      ns-1049.awsdns-03.org.
qiita.com.              299     IN      NS      ns-171.awsdns-21.com.
qiita.com.              299     IN      NS      ns-1956.awsdns-52.co.uk.
qiita.com.              299     IN      NS      ns-772.awsdns-32.net.
qiita.com.              299     IN      SOA     ns-1956.awsdns-52.co.uk. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
qiita.com.              299     IN      MX      10 aspmx.l.google.com.
qiita.com.              299     IN      MX      20 alt1.aspmx.l.google.com.
qiita.com.              299     IN      MX      20 alt2.aspmx.l.google.com.
qiita.com.              299     IN      MX      30 aspmx2.googlemail.com.
qiita.com.              299     IN      MX      30 aspmx3.googlemail.com.
qiita.com.              299     IN      MX      30 aspmx4.googlemail.com.
qiita.com.              299     IN      MX      30 aspmx5.googlemail.com.
qiita.com.              299     IN      TXT     "pardot859913=459e91b4646f79a9dc3bb58970676deab274ab5fb48dbb4a2ae1f01950a469f5"
qiita.com.              299     IN      TXT     "v=spf1 include:_spf.google.com include:amazonses.com include:servers.mcsv.net include:mail.zendesk.com include:aspmx.pardot.com a:qiita.com ~all"
qiita.com.              59      IN      AAAA    2406:da14:add:902:3867:685d:c093:172
qiita.com.              59      IN      AAAA    2406:da14:add:901:7e91:543:a91a:8490
qiita.com.              59      IN      AAAA    2406:da14:add:900:8075:db7d:2398:433c
qiita.com.              299     IN      SPF     "v=spf1 include:_spf.google.com include:amazonses.com include:servers.mcsv.net include:mail.zendesk.com include:aspmx.pardot.com a:qiita.com ~all"
```
vscodeでDockerを使うときに、Volumeを速くする。

##背景
Dockerのあるファイルをcloneして始める時に、毎回reopen in containerで時間がかかってしまう。なんとかしたいと思い、探していたところ、「Docker Mac Volume 遅い」でググると、色々出てきたので、そこに出てきた記事を参考に解決しました。

##方法

```
$ gem install docker-sync
```
その後、docker-sync.ymlファイルを作る。

```docker
version: '2'

syncs:
  document-root:
    sync_strategy: rsync
    notify_terminal: true
    sync_host_ip: 'auto'
    sync_host_port: 10872
    sync_excludes: [ '.git', '.idea', 'vendor', 'docker', '*.yml' ]
    sync_args: '-v'
    src: ./
    sync_userid: '33'
```


これで、reopen containerをvscodeで再び行ったところ、かなり速度が改善されていました。
GitHubのDefault Branchを変更する方法

##Default Branchがmasterになっていない
私は英語がぱっぱぱらーで、GitHubの使い方に慣れていなくて1人でアプリケーション作りながら練習中なんですよ

なぜかわからないけど自分がNew Branchで作ったブランチが、Default Branchになっていたことがあったんですよ

GitHub Desktopでいろいろ弄っていたんですけど、全く解決しなかったんですよ

うん。GitHubで元の設定変えればよかったんですよ

めっちゃ簡単だったんですよ

##解決方法
1. GitHubで問題のアプリケーションのメインページに飛ぶ
2. Settingタブへ
3. 最初はOptionsが選択されているが、Branchsを選択
4. デカデカとDefault branchと出てくるのでそこで任意のブランチを選択
5. updateをクリック

これでDefault Branchの変更が可能です

でもなんでDefault Branchがmasterから変わっていたんでしょう？？
調べた結果に該当する様なことしてないけどなあ
これも何かわかったら再度編集します


<br>
ちなみに10月から、新規作成されるリポジトリのデフォルトブランチ名は`master`という名前から`main`という名前に変更になっているらしいですね
なにやら人権問題の関係で、、、

深く言及することは知識不足なので避けますが、エンジニアも1人の人間なので世界の情勢は把握しておかないとと思った次第です
AWS CLI v2のTips

2020年2月に[AWS CLI v2](https://aws.amazon.com/jp/blogs/news/aws-cli-v2-is-now-generally-available/)がリリースされましたね :tada: 

個人的にはこれまでAWS CLIを使う機会が少なかったこともあり、v1からアップグレードした当初は変化に気付かなかったのですが、数ヶ月使ってみてv1から挙動が変わった点や進歩を感じた点があったのでまとめました。

## TL;DR

- すべてのプロファイルでページャを無効にするには環境変数 `AWS_PAGER` に空文字をセットする
- Lambda実行のペイロードに通常の文字列を渡してエラーになる場合は `cli_binary_format=raw-in-base64-out` を設定する
- AWS CLI v2からAWS側のリソース名の入力時にタブ補完が効くようになった

## すべてのプロファイルでページャを無効にする

AWS CLI v2では出力が長い場合に[クライアント側で指定したページャを出力に使用できるようになった](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-pagination.html#cli-usage-pagination-clientside)そうです。

デフォルトではOSのデフォルトのページャを使用するとのことですが、個人的にはページャよりターミナルのスクロールで見るが好きなのでページャを無効にします。

ページャを無効にするには、以下のどこかでページャに空文字列を指定すればOKです。

> 次の方法を優先順に使用して、出力ページャーを指定できます。
> - 名前付きプロファイルで config ファイルの cli_pager 設定を使用する。
> - AWS_PAGER 環境変数を使用する。
> - default プロファイルで config ファイルの cli_pager 設定を使用する。
> - PAGER 環境変数を使用する。

ただ、多くのAWSプロファイルを切り替えて作業することが多いと、個々の名前付きプロファイルにいちいち `cli_pager=`をセットするのは面倒です。そんな場合は**環境変数 `AWS_PAGER` に空文字をセットする**ことで、すべてのプロファイルでページャを無効にできました。

最初defaultプロファイルに `cli_pager=`をセットしておけば、名前付きプロファイルの方で未指定の時にいい感じにdefaultの方を見に行ってくれるだろうと思っていたのですが、名前付きプロファイルを使った時はdefaultプロファイルの設定はすべて無視される仕様のようです。

## バイナリパラメータをv1と同じく文字列で渡す

AWS CLI v2で、v1の時と同じように `aws lambda invoke` のペイロードにJSONの文字列を渡すとエラーが発生してしまいます。(参考. [AWS CLI v2にしたらlambda invokeがコケる - Qiita](https://qiita.com/marqs/items/793b72bbd9557441fbf4))

これは[ドキュメント](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cliv2-migration.html#cliv2-migration-binaryparam)に記載されている通り、バイナリを受け取るパラメータはデフォルトですべてbase64エンコードされた文字列を受け取る仕様に変更されたことが原因です。

v1ではコマンドによって受け取る形式がまちまちだったため統一されたとのことでしたが、シェルから対話的に実行する際にbase64での入力が必要だと扱いづらいですよね。この挙動についてはプロファイルの設定で `cli_binary_format=raw-in-base64-out` を追加することでv1と同様の挙動に戻すことができます。

前述のページャのように環境変数で指定することはできないので、設定を適用したいプロファイルが複数ある場合はすべてのプロファイルに同じ設定を追加する必要があります :innocent: 


## サーバ側のリソース名に補完が効くようになった

[v2リリースのブログ記事](https://aws.amazon.com/jp/blogs/news/aws-cli-v2-is-now-generally-available/)に書いてある内容そのままなのですが、AWS側のリソース名をタブで補完できるようになっています。

個人的にはs3のバケット名やディレクトリ（プレフィックス）を補完してくれるようになってものすごく捗りました :sparkles: 

## 参考資料

- [AWS CLI v2 が一般利用可能となりました | Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/aws-cli-v2-is-now-generally-available/)
- [AWS CLI のページ分割オプションの使用 - AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-pagination.html)
- [AWS CLI v2にしたらlambda invokeがコケる - Qiita](https://qiita.com/marqs/items/793b72bbd9557441fbf4)
集約で境界を正しく表現する意味

# 集約

DDDでは変更の単位として扱われ、言葉の意味からはオブジェクトの集合の意味が強く感じられますが
その真の意味はもう少し深いところにあります

まずは、定義からみていきます

## 集約の定義

集約は不変条件を維持する単位として切り出されたエンティティと値オブジェクトの集合であり
集約には境界とルートが存在します

### 不変条件


> ある処理の間、その真理値が真のまま変化しない述語 by [Wiki](https://ja.wikipedia.org/wiki/%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6)

[値オブジェクトの意味する不変](https://qiita.com/kichion/items/151c6747f2f1a14305cc#%E3%82%A4%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88)のimmutableではなくinvariantが原訳としては正しいです
不変条件というとややこしいですが、「制約条件のような一貫性のルール」でビジネスルールと捉えて良いでしょう

### 境界

集約に何が含まれるのかを定義するためのまさしく境界です


### ルート

集約に含まれる特定のオブジェクトです
原則的に集約の保持するフィールドの操作はこのルートが一任します
（**ルートのみが変更を行うことで不変条件を保ちます**）

ルートが操作を一任するという点で「デメテルの法則」に則ったコーディングが求められます

#### デメテルの法則

デメテルの法則によると、メソッドを呼び出すオブジェクトは次の４つに限定されます

* オブジェクト自身
* 引数として渡されたオブジェクト
* インスタンス変数
* 直接インスタンス化したオブジェクト

集約の不変条件からも重要なことはもちろん結合度を下げて保守性を上げる効果も期待できます


## 集約の原則

- 境界を定めて、変更の単位をまとめる
- 不変条件を正しく表現する

### 境界を定めて、変更の単位をまとめる

後述の「集約の単位」でも記載していますが、トランザクションの単位としてまとめることが求められます
この原則からずれるとデータロックの原因になりパフォーマンス劣化になります
また、集約の一部検証がうまく行えないことで処理が失敗する可能性も高くなってしまいます

### 不変条件を正しく表現する

Serviceクラスなどに処理が点在することで「ドメインモデル貧血症」を引き起こし、のちの変更コストが増大します
正しく不変条件が実装されないことでソフトウェアとしての曖昧さが高くなりバグの温床になります

また、不変条件というのは単語的な表現です
エンティティ・値オブジェクトが持つ情報をそのまま表現するのではなく、ユビキタスな表現を行うことでよりビジネスルールを明確にします
例えば、車であれば右に曲がるとき「ハンドルを右にきる」のような表現をします
（ステアリングが…タイロッドが…といった詳細は集約で隠蔽化されるべきです）


## 集約の単位

集約の単位はより小さくより扱いやすくなどの観点で決めがちですが、「トランザクションの単位」というのがわかりやすい方針ではないでしょうか
何となく決まるものと言うよりは「ビジネスルールに寄り添った単位」になるのが自然です

### 集約例

賃貸住宅という集約のルートを考えた時に以下の考え方ができます
「家には複数人住める」 「入居者のなかに代表の契約者がいる」 「退去時にはすべての住人がいなくなる」

![jitaku_taiki__relax_family (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66063/28eb9a36-b76e-1ca2-bc5f-40fca957b2de.png)　　　![keiyaku_keiyakusyo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66063/fcfdc16e-dfaf-5723-8913-e0e7cd56ffa1.png)　 ![driving_blue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66063/d9bf068b-3758-e40c-a567-bb908e1aecd7.png)

代表の契約者がいないのに住人がいたり、退去時に子供だけ残すといったことはないはずなのです
また、入居者の身辺状況や名前といった情報は賃貸住宅において直接操作したい内容ではないのです

つまり、入居者エンティティは別にあるが賃貸住宅が抱えるものではなく
**賃貸住宅は入居者エンティティのID郡を保持している**状態が自然と言えそうですね

```
【賃貸住宅】
- 住所
- 契約者ID
- 入居者ID

【入居者】
- ID
- 名前
- 生年月日
```

## 集約のメリット

ここまで仰々しいことをするメリットは何なのでしょうか？

集約を正しく扱うことでデメテルの法則で掲げているようなソフトウェアとしての保守性向上はもちろん
集約オブジェクトが雄弁にビジネスルールを語りだすようなコードになっていくのが理想です

DDDの本質は「何らかの問題を解決する」ための方法論なので問題解決を早く行うために
**ビジネスの実態を表現して継続的な改善に対する不確定要素を最小にする**ことではないかと思います

# 参考

1. 成瀬 允宣. ドメイン駆動設計入門 ボトムアップでわかる！ドメイン駆動設計の基本
2. [ボトムアップドメイン駆動設計 後編](https://nrslib.com/bottomup-ddd-2/#outline__5)

# その他

[レイヤードアーキテクチャの視点](https://qiita.com/kichion/items/aca19765cb16e7e65946)
[Serviceクラスの意義と勘所](https://qiita.com/kichion/items/983e8330cd2651540d9c)
[ValueObjectという考え方](https://qiita.com/drafts/151c6747f2f1a14305cc/edit)
SPI JAPAN 2020 で学んだ内容の記録

# はじめに

2020/10/14に[SPI JAPAN 2020](http://www.jaspic.org/events/sj/spi_japan_2020/)というソフトウェアプロセス改善のカンファレンスに参加しました。
いくつかセッションを視聴したので、そこで学んだことの記録です。
発表資料は上記ページから公開されています。

## いざ！品質革新本部Transformationで働き方をアップデート！

発表者：松崎 美保(TIS株式会社)

課題意識として、一人ひとりが変革するマインドを持つべき。

以下の方針で改革を行った。

- 全員が自ら考え、自ら変える
- 柔軟な発想を活かす
- 部門を超えて議論する

具体的な進め方は、定義したチーム毎に自分たちで決める。

2年間で議論された取り組みは80テーマにもなる。

価値観ババ抜き：価値観が書かれたカード60枚をメンバー全員に配る。ババ抜き形式でカードを交換する。カードを抜かれる時に、自分が大切にしている価値観のカードは抜かれことを断ることができる。最終的に各自のカードは3枚となり、その残ったカードで、各自が大事にしている価値観が分かる。

称賛ツール：1日3通限定でメッセージ形式で、特定の相手に感謝の言葉を送信できる。多く感謝されている人のランキングも表示できる。

働き方改革Nextとして、オフィスにコラボレーションスペースを作ったりなど、検討している。

目に見える効果が出るものから進めると、効果がすぐにあって改革を進めやすい。

## デコボコチームをエナジャイズし続けた３つの要素とは

発表者：珠野 知子(株式会社日立ソリューションズ)

エネジャイズ（元気づける）ための活動を行うことで、心理的安全性が高まった活動の紹介。

毎朝15分のDayly Meetingで、以下の要素を活用して行った。

- アジャイルプラクティス
- オンラインツール(Teams)
- 傾聴技法

3人のチームにおいて、その3人の相違点が強みとなるという考え方をした。

傾聴技法として「積極的傾聴」を用いて、メンバーの意見に「いいね、やってみよう」「いいね、それで？」「もっと教えて」などのように、あなたの考えをもっと知りたいという意図で質問する。

雑談チャンネルをつくって、雑談を行うことで心理的安全性を高めた。


## 品質向上にむけた人材育成への取り組み事例

発表者：後藤 淳(NECソリューションイノベータ株式会社)

プロジェクト審査会という、プロジェクトの遂行が妥当か審査する会議体を作成した。

しかし、審査会は、責められる場、避けたい場として認識されていた。

品質を担保できる組織風土の醸成のため、様々な活動を行った。

集合教育はデメリットがあるため、以下の対策を実施した。

緊張感が希薄になり一方通行になる
→対策：少人数での検討や事前課題の提出などを行った

理解度の把握困難
→対策：ディスカッションで把握

義務感、本人の意思次第
→対策：自身の考え方に共感してもらう工夫

## IT新時代を牽引するニュータイプになろう! ～Withコロナでも大丈夫! 必要とされる改革・変革とは?～

情報サービス産業協会(JISA)の会員(ほぼ受託開発チーム)の現場での過去4年間のアンケート結果

- アジャイル開発に対して、批判的に考える比率が年々増加している。
- アジャイル宣言を知らない人が、年々増加している。
- アジャイル開発は、ビジネス価値に繋げれていない(コスト構造、収益構造は、変わっていない)