OmniAICreator/Qiita-1.07M huggingface dataset:
セキュリティから始まるドメイン駆動設計

この記事は　[ZOZO #3 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/zozo) ９日目の記事になります。

これまでドメイン駆動設計に挑戦したい、やりたいけど設計の仕方が変わるため上司を説得できないなどの理由で導入を見送ってきた方々に、今回は１冊本を紹介したいと思います。

これを読むとドメイン駆動設計でないとまずいとまで考えることができる・・・かな。。。少なくても導入のきっかけにはなるかと思います。

その書籍とは[「セキュア・バイ・デザイン　安全なソフトウェア設計」](https://www.amazon.co.jp/dp/B09F697K2V)になります。

この書籍はドメイン駆動設計をセキュリティ面から捉え直した、、、いや逆ですね。ソフトウェアをセキュリティ面から考慮していったらドメイン駆動設計にたどり着いたという方が正しいかもしれません。

この書籍の大前提として、
「***セキュリティを意識しながら開発を進めるのは実際問題困難***」という立ち位置からスタートしています。

みなさんのプロジェクトではいつごろからXSS攻撃対策やSQLインジェクション対策などのセキュリティの対応をしてますか？始まる前から？実装中すでに？ほぼ終わってから？
理想は始める前からでしょうが、ほとんどの方は終わる頃に外部の脆弱性診断などを通して対策するのではないでしょうか？

それは、開発者は概してある程度の知識を持っていたとしてもセキュリティの専門家ではないこと、実装中の優先度の面でセキュリティへの対処よりビジネスロジックの実装に力を入れてしまいがちなことが理由としてあげられます。

だったら、***セキュリティ的に効果の高い設計を追求すること***でセキュリティについてそれほど意識せず実装できるようにしようというアプローチがこのセキュアバイ・デザインの趣旨となります。

では、***ドメイン駆動設計を実践することでセキュリティ的に効果が高い設計ができるのか？***という点が気になるところですが、そこはこの書籍を読むことで、例を踏まえた説明がなされているのでぜひ読んでいただきたいです。
逆にこの本を読むことでこれまでの設計実はまずいのでは？と思うこともしばしばあるかもしれませんね。

2章とか読むと本当に恐ろしい例が載っています。簡単に要約すると、
オンライン書店の例ですが、購入点数をinteger（-2147483648～2147483647）にしたばかりにマイナスの数値が入力できてしまい、合計金額がマイナスになり、しかもこのシステムが経理システムとの連動もしていたため（オンラインストアでマイナスの金額で返金対応というのはよくあること）、買っていないのに返金対応となってしまったというものです。

これってフロント上でセレクトボックスで整数しか選択できなくても、Javascriptでチェックしていても、ブラウザの機能一つでどうにでもできちゃうことがありますよね。

バック側でバリデーションしていないからというのもありますが、返金することがあるとわかっているとバリデーションが漏れてしまうというのも理解できないでもないですね。

これを設計で防ごうとすると、非常に役に立つのは***ValueObject***になるかと思います。
購入点数をintegerではなくちゃんと「購入点数」として設計することで購入点数という概念を明示的に表現することで、きちんと購入点数の範囲しか扱えないようにする。
その概念を捉えるためにドメインエキスパートを活用する。。。などドメイン駆動設計のエッセンスがすごく役に立つわけです。

さらに言えば、ここは2章には載っていませんが、返金と購入については***コンテキスト***が異なるので、それぞれで「購入点数」という概念が異なります。購入コンテキストではマイナスは厳禁だが、返金コンテキストではマイナスがありえるということです。
この辺りもドメイン駆動設計のテクニックが盛り込まれた設計になると思います。

特にドメイン駆動設計導入に躊躇されている方々に読んでみていただきたい1冊ですのでぜひご一読ください。

次の日も自分ですね。明日は「小ネタ：spotlessフォーマッタでEnumが崩れるのを防ぐ設定」というタイトルでお届けします。
LibSassからDartSassに変更する方法

遅ればせながら、node-sass（LibSass）からDartSassへの変更を行いました。
その時対応した内容を備忘録として、記載します。

## 作業に入る前に
今回は、Gulp（`gulp-sass`）での変更方法について書いてきます。
（私が携わっているサービスがGulpを使っているので…）

## 手順
1. 必要なnpmパッケージをインストールする
1. Gulpファイルを書き換える
1. `@import`を`@use`や`@forward`に置き換える

### 1. 必要なnpmパッケージをインストールする
`gulp-sass`でDartSassのコンパイルをするのに必要な、npmパッケージ（[sass]( https://www.npmjs.com/package/sass )と[fibers]( https://www.npmjs.com/package/fibers )）をインストールします。

``` bash
npm i -D sass fibers
```

### 2. Gulpファイルを書き換える
書き換える箇所は、以下3箇所です。

1. `var sass = require('gulp-sass');`
1. fibersプラグインを読み込む記述を追加する
1. Sassのコンパイルのタスクオプションにfibersを追加する

以下、該当の部分の抜粋です。

```js:gulpfile.js（書き換え前）
const sass = require('gulp-sass');
const options = {
    outputStyle: 'expanded',
    sourceComments: false
};

```

```js:gulpfile.js（書き換え後）
const sass = require('gulp-sass')(require('sass'));
const fiber = require('fibers');
const options = {
    fiber: fiber,
    outputStyle: 'expanded',
    sourceComments: false
};

```
### 3. `@import`を`@use`や`@forward`に置き換える
#### 3-1. 変数や`@mixin`のファイルを書き換え
今まではFLOCCSをベースに、メインとなる`style.scss`に、`@import`を使ってすべてのモジュールを読み込んでいましたが、`@use`や`@forward`を使い分けて設定行く必要があります。
まずは以下手順で共通部分を書き換えます。

1. `global/`を作成する
2. 変数や`@mixin`のファイルを`global/`に移す
2. `global.scss`を作成し、`global/`フォルダのファイルを`@forward`で読み込む
2. 他のまとめ用のファイル（`foundation.scss`や`layout.scss`など）も同様に、`@import`から`@forward`に書き換える

書き換え後は、こんな感じになります。

```tex:書き換え後のディレクトリ構成
common/
│
├── foundation/
│   ├── _reset.scss
│   └── _typography.scss
│
├── global/
│   ├── _mixins.scss
│   └── _variables.scss
│
├── layout/
│   └── _l-body.scss
│
├── object/
│   │
│   ├── component/
│   │   └── _c-button.scss
│   │
│   └── project/
│       └── _p-campaign.scss
│
├── foundation.scss //まとめ用ファイル
├── global.scss //まとめ用ファイル
├── layout.scss //まとめ用ファイル
├── component.scss //まとめ用ファイル
├── project.scss //まとめ用ファイル
└── style.scss
```
```scss:global.scss
@forward "global/variables";
@forward "global/mixins";
```

#### 3-2. 残りのファイルを置き換える
置換えを手作業で行っても良いのですが、大変なので[sass-migrator]( https://www.npmjs.com/package/sass-migrator )を使って書き換えていきます。

まずは、sass-migratorをインストールします。

``` bash
npm i -D sass-migrator
```

インストールが終わったら、以下コマンドを実行していきます。

``` bash
npx sass-migrator module --verbose --migrate-deps ［ファイル名］
```
実行すると、`@import`から`@use`に自動で変更されました。
指定したファイルの関連ファイルも一緒に変更してくれますので、ファイル名の指定でOKです。
<br>
以上です。
最後までお読みいただき、ありがとうございました。

---
### お世話になったサイト
- [LibSassからDartSassにsass-migratorで一括移行する！](https://mykii.blog/sass-migrator/#sass-migrator)
- [Dart Sass（@use）の基本的な書き方と@importから乗り換える方法](https://haniwaman.com/dart-sass/)
- [【Sass】@importを@useに置き換えてみる《FLOCSS対応》](https://notes.sharesl.net/articles/1768/)
kintone プラグインよくあるトラブル 同じ一覧名はダメ

kintone プラグインのよくあるトラブルとして、「同じ一覧名はダメ」があります。
簡単に同じ一覧名が作れてしまうので、ある日突然プラグインが動かなくなったりします。

# 概要

アプリ内に同じ一覧名があると、一覧名を取得する REST API がエラーになります。
一覧別に設定項目指定するようなプラグイン設定が影響を受けます。
同様に、同じグラフ名でも「グラフ設定の取得 REST API」がエラーが発生します。

[一覧の設定の取得 REST API](https://developer.cybozu.io/hc/ja/articles/204529784) ('/k/v1/app/views') の実行例


- エラーメッセージ：　'一覧の取得、または更新に失敗しました。一覧「顧客ランクA」の名前が重複しています。重複しない名前に変更してください。'

![2021-12-05_21h57_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a82aa691-dbe3-8b38-0324-f55fc058fe60.png)

# 同じ一覧名の作り方

アプリの管理権限を持つユーザーが一覧画面の絞り込みをクリックして、既存と同じ一覧名で保存するだけ。
簡単に同じ一覧名をいくつでも作成できます。

![2021-12-05_22h23_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/4e9c5fc1-25de-a541-a02f-9f1d98408b8c.png)

# プラグイン設定でのエラー例

同じ一覧名でエラーを検知して、表示するプラグインなら、エラーメッセージを表示します。
エラー処理が無いプラグインだと、設定画面が開かずに原因が分かりにくい場合があります。

![2021-12-05_22h28_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/83d35c81-5caa-bc06-d8c9-5491d9112e25.png)

# なぜ一覧の設定の取得 REST API がエラーになるのか

一覧の設定の取得 REST API のリターン情報は、一覧名をキーにして情報を管理しています。
この仕様により、同じ一覧名をリターン情報に設定できません。
そのため、制限事項として「アプリ内で重複した名前の一覧が存在する場合、 このAPIで設定を取得することができません。」と記載されています。

![2021-12-05_22h34_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/4e281d59-b5f0-1fd9-dd65-24ac1702b0ce.png)

# 同じ一覧名が複数あった場合のエラーメッセージ

同じ一覧名が複数あっても、エラーメッセージは最初の重複した一覧名だけです。

![2021-12-05_22h45_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d9957a54-7e69-f9d3-d8a7-31dc992fccff.png)

# 仕様変更の要望

kintone の仕様として、アプリ内に同じ一覧名を許可しておいて、REST API ではエラーにするという仕様上の不具合なので、仕様変更を要望するしかありません。
「一覧の設定の取得 REST API」の仕様を維持するなら、同じ一覧名を作成不可にするしかないですね。

# 同じグラフ名でも「グラフ設定の取得 REST API」がエラー

しくみが同じなので、グラフにも問題があります。
同じグラフ名でも「グラフ設定の取得 REST API」がエラーになります。

![2021-12-05_22h56_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ffbd2bd7-e05f-9239-7739-18efa0e533dc.png)
S-JISで保存されたデータをCLoud Pak for Dataで表示するためには

IBMのCloud Pak for DataのAdvent Calendar向けの記事として書きました。実際にやっていてちょっとわかりにくいかな、と思った点です。
Advent Calendar
https://qiita.com/advent-calendar/2021/cloudpaks

Shift-JISエンコーディングされたCSVファイルの扱いです。
Microsoft Windows環境でのエクセルから作成したCSVファイルはShift Jisでのエンコーディングであることが多いようです。
CLoud Pak for Dataでそのようなファイルを読み込むと以下のように文字化けしてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/253ff98e-484a-fe55-dbcb-973dc39d2a03.png)
とりあえず右上の"整形”をクリックしてください。
処理中のメッセージが出た後以下にような画面になります。
そしてここがちょっとわかりにくいのですが下の方の矢印が２つあるところをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/c98a9c1c-0984-2eca-0769-b15bd0cae74d.png)
そうすると以下のような画面が出てきてエンコーディングを選択することができます。ここでSJIS(Shift JIS)を選んでみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/48b5647b-bbd5-2e91-fced-9116916a9ed4.png)
このように文字が正常に表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/0653a780-156d-c0dc-12c6-dddce79bb169.png)
このあとはRefinelyのジョブを作って変換後のデータを保存しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/360623e8-1322-bdb7-4b37-43ce641842d6.png)
任意の名前をつけて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/57771d16-a8b5-20f7-f599-2d03ba507b2f.png)

出力のところにあるのが変換後のデータ名です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/3200b33f-69dc-de08-d29e-e0c44e857378.png)
スケジュールはオフにしてすぐに実行するようにしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/f0774e15-bf09-da92-132b-9ff31fa8e5c1.png)

作成して実行をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/1b8764d0-b6f0-03b6-5b2e-ab900f0e28eb.png)

しばらくするとデータ資産に変換後のデータが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/f81cc9b5-a517-f307-ef70-5a52f3ef763c.png)

選択すると最初から文字化けしないデータが見れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/2961cdee-a5a8-cbe7-f90d-ccad2ff8f9fb.png)
【AWS】AWS Config

# はじめに
AWS認定試験取得に向けてAWSの知識を整理するためのまとめです。
今回はAWS Configについてまとめます。

# AWS Configとは
AWSリソースの設定を評価、監査、審査できるサービスです。
どのリソースに対して、誰が、いつ、何をしたかを自動で継続的に記録し、確認ができます。

# 特徴
## AWS リソースの設定履歴
AWS リソースの変更の詳細を記録し、設定履歴を確認できます。
AWS マネジメントコンソール、API、CLI を使用して、過去の任意の時点でリソースが
どのように設定されていたかの詳細を取得できます。

## ソフトウェアの設定履歴
EC2やオンプレミスで稼働しているサーバーで実行されるソフトウェアの設定変更を
記録できます。
また、他のクラウドプロバイダーによって提供される環境におけるサーバーや
仮想マシンで実行されるソフトウェアの設定変更も記録できます。

## スナップショット
任意のタイミング、もしくは自動で定期的に構成情報をスナップショットとして
保存することができます。

## AWS Config Rules
リソースの準拠すべきルールで事前に設定することで、AWS Configで記録された
関連リソースの設定変更に照らして評価されます。
（全てのEBSボリュームが暗号化されているか、EC2にタグ付けされているか、など）
ルールによるリソースの設定変更の評価結果はダッシュボードで確認できます。
ConfigRulesを使用することで、設定の観点からの全体的なコンプライアンスおよび
リスクステータスの評価、経時的なコンプライアンス傾向の確認、どの設定変更によって
リソースがルールに違反したかの特定が可能です。

#　料金
設定項目や、Config Rulesの評価数に応じて課金されます。

# 参考サイト
https://aws.amazon.com/jp/config/
https://d1.awsstatic.com/webinars/jp/pdf/services/20190618_AWS-Blackbelt_Config.pdf
Twilio Super SIMを買ってみた

これは[Twilio Advent Calendar 2021](https://qiita.com/advent-calendar/2021/twilio)の5日目の記事です。当初[twilio-run](https://www.npmjs.com/package/twilio-run)について書く予定でしたが、思いのほか日本語情報があったのでネタを変えてSuper SIMについて書くことにしました。

少し前にTwilioのメニューを見たとき、Super SIMというものがあったので何ができるのかよくわからないまま勢いでポチッと買ってみました。UPSから電話があって名前や住所の確認がありました（なぜかFirst Nameだけで指定されてたらしい...）が、数日で届きました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/20d8500f-e3b1-ffe4-14e8-90ae48495cd3.jpeg" width="70%"/>

調べると日本語情報はKWC高橋さんのスライドしかないんですよね...プロファイルやFleetsの設定はこちらを参考に進めました。

<script async class="speakerdeck-embed" data-id="f245163afdac403a93b733f327e1a7d5" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>

とりあえず何かのデバイスで試してみようとSIMフリー携帯に挿してみました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/e038a25d-9753-c21c-a402-49e79612b401.jpeg" width="70%"/>

するとTWILIOと出てきました。これだけで「おぉ」ってなりますね。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/6b2782aa-6c7c-7125-8a42-b2486f8a18a3.png" width="50%"/>

よくわからないまま、とりあえずSMSを送ってみたところ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/04701b20-56d1-68d7-7f46-5693ec5c31cc.png" width="50%"/>

ダッシュボードのCommand logに表示されました。

![スクリーンショット 2021-12-05 22.28.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/3c8d7b11-05bd-c8ca-0d83-724297a26b2e.png)

宛先まで届けるものではなく、Twilioに届いてFleetsのSMS Commands Callback URLをキックするって感じなのかな。。何もわかってないまま触ってしまったので、もう少し調べてみたいと思います(^^;どんなことができるものなのか、もう少し日本語情報が欲しい...。
インターネットから機密情報を分離しても単純にセキュリティが向上するわけではない理由

本記事は Sansan Advent Calendar 2021 6日目の記事です

こんにちは、Sansan株式会社でセキュリティエンジニアをしている大井といいます。
CSIRT/RedTeamとして主にWebアプリケーションの脆弱性診断や社内ペネトレーションテストなどを担当しています。

## 病院へのサイバー攻撃
昨今、病院がサイバー攻撃(ランサムウェア)を受け診療できなくなるという事件が発生しました。
事件自体は国外のでも発生しているものと同じで、攻撃手法も一般的なランサムウェアとみられます。
こういった攻撃が発生するたびに「**機密情報を外部ネットワークにつなぐな**」といった言動がTwitterや一部専門家？から上がってきます。
私は一介のセキュリティエンジニアとして、**外部ネットワークからの分離は必ずしもセキュリティの向上を意味しない**と考えています。
その理由を、発生しうる脅威とともに説明したいと思います。

### 分離したネットワークが善意の人物により外部と接続される可能性
分離したネットワークが、社員などのユーザーが外部ネットと接続してしまう可能性があります。具体的には閉鎖系ネットワークのパソコンでは使いにくいからスマホを接続してテザリングしてしまうなどです。
![computer_tethering.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328443/1cd08316-3cba-8361-03f1-dc25dbcf759f.png)


### 分離したネットワークが悪意ある人物により外部と接続される可能性
分離したネットワークが悪意ある人物(いわゆるクラッカー)によりネットワークと接続されてしまう可能性もあります。こうしたツールはすでに一般に販売されています(LAN TURTLE 3Gなど)。またLTEモデムとラズベリーパイなどを利用してかんたんに自作することもできます。
![3G.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328443/f3a836c8-7b48-aef9-74ab-450f0923470d.jpeg)


### 単純なネットワーク分離により脆弱性が放置される可能性
単純なネットワーク分離を行った場合Windowsアップデートなどができなくなり重大な脆弱性が放置される可能性があります。
WSUSなどを利用しても。上位のアプリケーションにおいても同様に脆弱性パッチ適応などを考える必要があります。

### 単純なネットワーク分離によりマルウェアの検知対応が遅れる可能性
上記に上げたような攻撃などでシステムが侵害された場合、その攻撃を検知するためSOCとの通信や検知のためのウイルス対策ソフト定義ファイルアップデートをどのように行うのかといった問題がります。
通常別の手段で通信できるようにしますがその方法自体が分離との矛盾をはらみリスクも発生します。

### 利便性が低下することにより、そもそも分離したネットワーク内に必要な情報が置かれなくなる場合
一般的に分離したネットワーク内のコンピューターは使いにくいです、結果社員が別の場所にファイルをおいたり、個人のLine間でやり取りされるなどの状況が発生する可能性があります
上記の理由から単純なネットワーク分離はセキュリティを向上させるどころか、場合によってはセキュリティの低下を招きます。

## 結局どうすべきなのか 
ではどのようにすればよいのでしょうか？私が思い描く機密系の保護は以下の導入が重要だと思います。
SaaS(クラウド環境)の適切な利用、EDR・NDR・XDR等検知対応系の充実、SOCの設置など、いわゆるゼロトラストの考え方が必須になってくるという認識です。
セキュリティにおいて、これをすれば完璧などという手段は少なく、地道にセキュリティの向上に務めっていく必要があります。
[初心者]　Railsでyoutube APIを使って検索機能を実装してみた

##はじめに


ポートフォリオ作成をするにあたりyoutube APIを使い、検索機能を追加したく、実装してみました。
不慣れで読みにくいかもしれませんが何卒ご了承ください。

YouTube APIは取得しているものとします。

主にこちらの記事を参考にしています。
[Railsでyoutube APIを使ってみた](https://qiita.com/sakakinn/items/46c0d4945e4646f346f6)
大変お世話になりました🙇‍♂️

##開発環境

Rails:6.1.4
Visual Studio Code:1.61.2

##実装してみる

```ruby:youtube.controller
class YoutubeController < ApplicationController
  GOOGLE_API_KEY = ENV["API_KEY"]

  def find_videos(keyword, after: 1.months.ago, before: Time.now)
    service = Google::Apis::YoutubeV3::YouTubeService.new
    service.key = GOOGLE_API_KEY

    keyword = params[:search]

    next_page_token = nil
    opt = {
      q: keyword,
      type: "video",
      max_results: 6,
      order: :date,
      page_token: next_page_token,
      published_after: after.iso8601,
      published_before: before.iso8601,
    }
    service.list_searches(:snippet, opt)
  end

  def index
    @youtube_data = find_videos(@keyword)
  end
end
```

find_videosメソッドに `keyword = params[:search]`を追加し、indexメソッドから `keyword` を呼び出す。

あとはviewから `form_tag` を用いて、`method: :get`のHTTPメソッドを指定し、データを取得します。

```ruby:view/youtube/index.html.erb
  <div class="search-form">
    <%= form_tag(youtube_index_path, method: :get) do %>
      <%= text_field_tag :search, "", placeholder:"材料をどうぞ" %>
      <%= submit_tag '検索' %>
    <% end %>
  </div>

    <div class="row row-cols-3">
      <% @youtube_data.items.each do |item| %>
        <div class="card-box">
          <div class="card border-dark mb-3">
            <div class="bd-placeholder-img card-img-top">
              <% @snippet = item.snippet %>
              <% @video_id = item.id.video_id %>
              <div class="embed-responsive embed-responsive-16by9">
                <div><iframe width="560" height="315" src="https://www.youtube.com/embed/<%= @video_id %>" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
              </div>
              <div class="card-body">
                <h4>タイトル：<%= @snippet.title %></h4>
                <p>チャンネル名：<%= @snippet.channel_title %></p>
              </div>
            </div>
          </div>
        </div>
      <% end %>
    </div>

```
`class="embed-responsive embed-responsive-16by9"`で取得したYouTube動画のレスポンシブ対応をしています。

##実装結果

![画面収録 2021-12-05 22 01 29](https://user-images.githubusercontent.com/78095577/144747685-d93606c3-136c-4ff8-be6d-4707c9817209.gif)

##最後に

とりあえずエラーが出ずに実装することができた程度なんで、もっと簡単な方法があればアドバイスいただけると嬉しいです😅

最後まで読んでいただき、ありがとうございました。
【Rails×AWS】yamlファイルにおける'please note that yaml must be consistently indented using spaces'の解決

https://qiita.com/gyu_outputs/items/b123ef229842d857ff39
こちらの記事を参考にrailsアプリをawsにデプロイする過程で発生したエラーに関する備忘録です。

#エラー詳細

ページトップに添付した記事の中の「credentials.ymlの設定」の箇所で直面したエラーです。

```credentials.yml
db:
  database: アプリ名
  username: root
  password: 設定したPW
  socket: /var/lib/mysql/mysql.sock

```

credentials.ymlを記述した後に、

```database.yml
production:
  <<: *default
  database: <%= Rails.application.credentials.db[:database] %>
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
  socket: <%= Rails.application.credentials.db[:socket] %>
```

上記のようにdatabase.ymlを記述してrspecでテストを実行したところ下記のエラーが発生しました。

```
RuntimeError:
  YAML syntax error occurred while parsing /Users/hoshiyuunari/Desktop/new_app/selftalk_app/config/database.yml. Please note that YAML must be consistently indented using spaces. Tabs are not allowed. Error: (<unknown>): found character that cannot start any token while scanning for the next token at line 75 column 13
```
ちなみに上記エラーコードの「at line 75 column 13」はdatabase.ymlの中では
password: <%= Rails.application.credentials.db[:password] %>
の最初の"<"の部分です。

#原因

エラーコード上はインデントの問題とありましたがそうではありませんでした。

```database.yml
production:
  <<: *default
  database: <%= Rails.application.credentials.db[:database] %>
  username: <%= Rails.application.credentials.db[:username] %>
  password: "<%= Rails.application.credentials.db[:password] %>" #""をつけただけ
  socket: <%= Rails.application.credentials.db[:socket] %>

```
credentials.ymlで設定したpasswordの項目が関係していました。
私の場合、パスワードの頭文字が@だったのですがyamlファイルの規則では@には""をつける必要があります。

credentials.ymlではpasswordに""を付けていましたが環境変数として記述する場合も付ける必要がありました。
プログラムが実行されるまでを超簡単にまとめてみた


プログラムはなぜ動くのか(第３版)を読んで、ソースコードがどのような流れで実行されるのか理解できてきたので超簡単にまとめてみたいと思います。

## プログラムがソースコードから実際に実行されるまでの流れ

#### １. ソースコードをコンパイル+リンク
プログラマが作成したソースコードのままではCPUが読むことができないため、CPUが読める言語(マシン語)に変換(コンパイル)する必要がある。

またプログラマの自作関数は、ソースコードの書かれたファイル内にその内容が書かれているのに対し、すでに定義されている関数(ビルトイン関数)の場合、その内容は書かれていない。

そのためそのビルトイン関数の処理内容が書かれているファイルを結合し(リンク)、実行ファイル(CPUが読んで実行できるファイル)が完成される。

#### 2. メインメモリー上でプログラムを実行
プログラムが実行される段階になると、メインメモリー上に実行ファイルのコピーが作成される。そしてCPUがその実行ファイルを読み込むことで処理が実行される。

以上。

## 補足
### コンパイラ
ソースコードのコンパイラは、記述されている言語、OS、CPUの種類によって異なっている。
例えば同じC言語のコンパイラでもLinux用、Windows用、さらにLinuxの中でもx86系用、MIPS用といったように異なっている。

### CPU
CPU内部は下記に示す４つから構成されている
・レジスタ
CPU内におけるメモリーのような役割。ここに命令やデータを置いて処理を行う。

・制御装置
メモリー上の命令やデータをレジスタに呼び出し実行させる。

・演算装置
文字通り演算等の役割を担う。

・クロック
CPUの動作タイミングとなるクロック信号を出す。

---
超簡単にですが、まとめてみました。
本書はこの１００倍くらい詳しくプログラムの動作原理について解説されているので、この辺りの知識をつけたい方にはとてもおすすめです。

参考文献：
「プログラムはなぜ動くのか 第３版　知っておきたいプログラミングの基礎知識」
矢沢 久雄  (著)　日経BP　(2021/5/13)
ＤＸとは？　何の略ですか？


#前書き
つい３０日前の、お客様との会話である。（実話）

私：弊社のサービス、製品を利用して、DXの実現を。
お客様：DXて、何の略ですか ?
私：DはDegitalの略、Xは、Expereience,Exchangenの略ですかね。
（あわてて、その場で調べる。）
私：Xは、Transformationを意味するみたいです。

私は人事給与、労務関係のシステム製品の保守の職で、お客様は人事給与・労務関係の職である。

#DXとは？　お客様にDXが何の略かを説明できるか?

ビジネスの世界では世界中でDX、DXと騒がれ、テレビでも芸能人を使ってDX関連のCMが流れている今日この頃であるが、
私は、
DXは、Digital Transformationの略であり、
どうして、TransformationがXと略されているか知りませんでした。

#私の結論

ググれば『DXは、Digital Transformationの略であり、TransformationがXと表される理由』がいろいろカイセツがされています。
他人に何かの略語を説明するときは、その略語の意味を知らないと恥ずかしい思いをします。
なお、ダウンタウンDXのDXの意味は、Digital Transformationでなく、デラックス、Deluxeの意味です。

この記事は
**ＤＸとは**　の記事から着想を得ました。

https://qiita.com/takeC74/items/9cf4f3d6a507917f5172

@takeC74(株式会社Works Human Intelligence)さん、
初めての投稿で、どんな投稿をしていいか迷っていた私に参考になる記事をありがとう。

以上、先月の私の小話がきっかけの、Qiitaの入門者にとっては参考になるような素晴らしい木口屋 剛氏の記事を紹介する話でした。
無いなら作ってしまえ、グループ会社全体の技術連携Team

# 背景
非常に閉鎖的で情報共有の仕組があっても共有を本気でする気が無い職場。
否定的になればそのまま飲み会で文句を言うだけですが、出来ることをやってみよう！ってことで以下をしてました。

- 率先垂範で Giver になる　→　社内の情報共有個人表彰
- 同じような思考の人と繋がって情報共有を進める　→　Team や Chat でつながってやる気維持＆刺激、情報交換

この一環で参加した Microsoft の DTS
ここで刺激を受け、やってみようと思ったのが

- Teams でオープンに技術共有を行う。

実際に影響を受けたのは、以下記事にある中外製薬の小竹さんでした。ありがとうございました。 :laughing: 

https://work-life-b.co.jp/personal_case/case02.html

# 結論

一人情シス的に頑張ってる Power Platform 学習者の相互支援を出来るように、グループ会社内で誰もが参加出来て情報共有できる Team を作って活動中。

この気持ちの根源は、やっぱり娘のこの台詞、かな。
[『パパ！失敗してよかったね！これで成長できるね！🥰』](https://qiita.com/baku2san/items/19e7392e77e225d7f655#%E5%B9%B8%E9%81%8B%E3%81%AE%E5%A5%B3%E7%A5%9E%E3%81%AB%E5%BE%8C%E3%82%8D%E9%AB%AA%E3%81%AF%E3%81%AA%E3%81%84%E5%A4%B1%E6%95%97%E3%81%AE%E7%B5%8C%E9%A8%93%E3%81%A0%E3%81%91%E6%88%90%E9%95%B7%E3%81%A7%E3%81%8D%E3%82%8B%E6%88%90%E5%8A%9F%E3%81%BE%E3%81%A7%E3%82%84%E3%82%8A%E5%88%87%E3%82%8C%E3%81%B0%E6%88%90%E5%8A%9F%E4%BD%93%E9%A8%93%E3%81%AE%E3%81%BF)

今後も、娘にも自分自身にも恥じない生き方を選択出来るといいな。

# 実際にやったこと
1. 親会社のIT関連の人とも繋がりが出来ていたので、グループ全体でやっていいかの確認（正式では無いが）<br>この繋がりを事前に出来ていたのも大きかった :relieved: 
1. Microsoft365 が入っていたので、グループ内の誰もが参加出来る Team を MS-Teams で作成<br>これが今年の晩春
1. グループ全体の Yammer にてちょっとした紹介。グループ全体の 1% にも満たない参加者しかいなかったんですが・・

# Team での活動内容
- Power Platform や Microsoft 365 などのアプリ毎にチャネル作成
- Power Platform って便利だよって思えるように、Power Automate で以下を実現
    - OneNote に記述した Welcome Message を参加時に Teams チャットに送付
    - その際、Adaptive Card で期待する技術を選べるようにし、その結果を Lists に反映
    - Microsoft 365 Admin Center からのニュースを日本語翻訳して自動投稿
    - 参加者の構成を Power BI で分析して毎週自動投稿
- 基本は、自由な自治とし、性善説での運営。<br>まぁ・・問題はありましたが・・
- 内容は、Q&A や、情報や事例展開、共有（Zip や JSONなど）なんでもあり。

# 半年経過した現時点での状況
当初仲間三名で始めたのが・・今では

- メンバーは 180 名超
- チャネルは 15 ぐらい？
- 当初のコアメンバー以外の発信や質問も出てきて、自分が休んでいても回答まで終わってることも :relaxed: 

こういう活動の結果、グループ内で他にも積極的に改革をしようとしてる人達と交わることが出来たのも自分にとっては収穫であり、幸せです。情熱のある人と一緒に活動出来ることこそが幸せですよね。

# 今後やりたいこと
- グループ内 OSS：インナーソースでグループ内で役に立つサービスやツールの共同開発
- Low Code や アプリだけでなく、C#/Python といった言語チャネル・・はさすがに厳しいかなぁとも。
String Boot環境構築

１．eclipseをインストール（Windows版のインストールをキャプチャしています）
　　１－１．https://mergedoc.osdn.jp/ にアクセス
　　１－２．Eclipse 2021をクリック(赤枠で囲っている箇所)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353455/e942feed-8715-a7e2-217e-8759729daa35.png)
　　１－３．Windows64bit版 Full EditionのJavaをクリック(赤枠で囲っている箇所)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353455/128b50cb-5779-4011-c301-a475a6d2e732.png)
　１－４．Eclipseダウンロード(ダウンロードが開始されない場合、赤枠のリンクをクリック)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353455/33dcdfa6-31a2-413a-82d0-0b90543d0101.png)
 １－５．Eclipseを解凍（7Zipで解凍, キャプチャでは、Qiitaファルダで解凍）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353455/75a94edb-b955-d734-1929-5dea4f9a1133.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353455/c971f9ac-7c7c-5e01-83af-1e0c9a000e21.png)

２．Spring Bootプロジェクト作成
　２－１．Eclipse起動（workspaceは初期設定）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353455/723b7d01-4569-008a-97cb-f7f1870e9693.png)
　２－２．ファイル→新規→Springスターター・プロジェクトを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353455/104d0422-7994-6ad1-0e7d-ce664bb30da9.png)
　２－３．タイプ：Maven Project, パッケージング：Warで作成
　　２－３ー１．赤枠の箇所を変更して、次へボタンをクリック
　　２－３－２．完了ボタンをクリック、ビルドが完了するまで待つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353455/a8b5f774-0469-6134-c6f0-504f0011de5e.png)
　２－４．パッケージエクスプローラーでプロジェクトを選択して右クリック→実行を選択→Maven installをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353455/cd233079-afa4-d70c-56a9-19057fb97a65.png)
　　（ERRORになった場合、プロジェクトのプロパティのMavenでアクティブMavenプロファイルを空白で再度、上記を実行）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353455/43366e64-dc51-cc99-8d39-511e4d7dacab.png)
　２－５．index.htmlを作成
　　２－５－１．src/main/resources/templatesを右クリック→新規→HTMLファイルをクリック
　　２－５－２．ファイル名をindex.htmlに変更して完了ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353455/eee5120c-e714-b9eb-0afc-bfa875b53de8.png)
　２－６．プロジェクト実行
　　　　　プロジェクトを右クリック→実行→Spring Bootアプリケーションをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353455/5421848d-0c78-aa0d-711c-0c698f71b426.png)

３．ブラウザで確認
　　http://localhost:8080/ にアクセス（正常に表示されている場合、Insert title hereのタイトルが表示される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353455/1501200c-4890-9e13-4406-79c94757b477.png)
forEachの中でasync awaitは使えない（コピペ例）

forEachの中で非同期処理で詰まったので備忘録として書く


<h2>エラー例</h2>
```javascript
      console.log("before_forEach", this.datas);

      this.datas.forEach(async(data) => {
        //非同期処理
      });

      console.log("after_forEach", this.datas);
```

<h2>成功例</h2>

```javascript
      console.log("before_forEach", this.datas);

      for (let data of this.datas){
        //非同期処理
      });

      console.log("after_forEach", this.datas);
```

forで書き直せば、処理順はうまくいくはず！



参考にしたandより詳しい記事

https://qiita.com/jkr_2255/items/62b3ee3361315d55078a
おすすめUdemy講座　データサイエンス初級編

この記事は、[LIGHTzアドベントカレンダー](https://qiita.com/advent-calendar/2021/lightz)6日目の記事です。

# はじめに

こんにちは！

昨年より未経験からデータサイエンスに関する仕事に携わっています。
まだまだ勉強の身ですが、ちょうど一年程経ったので、個人的にデータサイエンスを理解する上で役に立ったUdemy講座を紹介します。

エンジニア寄りかコンサル寄りで共通する基礎以外は学ぶ内容が違ってくると思いますが、まずは基本的なことを扱ってるコンテンツを選んでみました。

あくまで個人の意見なので参考までに。

# Udemy講座とは
一言で言うと、動画形式のオンライン学習プラットフォーム（有料）です。

講師のレベルが高く、現役のエンジニアでありかつ教えるのも上手い人が多い印象があります。
**どんな目的で、どんな技術を習得したら実務に応用できるのか**を理解できる講座が多いので、体系的な学びに繋がるのがメリットだと思います。

様々な動画コンテンツを扱っており、データサイエンス関連以外にも以下のようなものも扱ってます。
  - 開発（WEB、モバイル、ゲーム、DB、ソフトウェアテストなど） 
  - ビジネススキル（ビジネス戦略、コミュニケーション、起業家精神など）
  - 財務会計（簿記、投資・株式、暗号通過&ブロックチェーン）
  - マーケティング（SEO、ブランディング、PR、広告）

その他にもアート、DIY、瞑想、護身術など、かなり趣味に近い分野も取り扱っており色々見ると楽しいのでおすすめです。

# おすすめUdemy講座
それでは、データサイエンスを学びたい人向けのおすすめUdemy講座をご紹介します。

## AI / 機械学習
[【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 -](https://www.udemy.com/course/kikagaku_blackbox_1/)
一番初めの入門講座としておすすめです。数学を全て手書きで解説しているので分かりやすく、なぜ学ぶ必要があるのか、という丁寧に説明してる印象でした。
機械学習の原理を数学から理解し、最終的に実データに対して単回帰分析を実装する内容です。
中級編も公開されており、そちらでは重回帰分析まで範囲を広げ、scikit-learnを用いた機械学習の実装も行っています。私もこの講座からスタートしました。

[【世界で37万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜](https://www.udemy.com/course/datascience365/)
とりあえずこれやっとけば間違いない、のやつです。
特徴としては、データサイエンスに関するビジネス領域の話が多いことです。データサイエンスをビジネスでどう活用するべきか、起こりうる問題点は何か、なども講座で扱っています。最終的には、ケーススタディを元に深い理解を得ることができます。ビジネス課題の把握、データ前処理、モデル実装、Tableauを用いたデータの可視化といった一連の流れを体感できるので、実践的で勉強になりました。


## 統計
[米国データサイエンティストが教える統計学超入門講座【Pythonで実践】](https://www.udemy.com/course/python-stats/)
2021年11月に公開された最新作です。
統計学の基本をある程度網羅していると思います。基本的な記述統計、推測統計の理論を図解を元に説明し、Pythonで実際のデータを統計解析するので、理論→実践で学べます。あと、講師のかめれおんさんは個人的に聞きやすく、他にもDocker講座、git講座、python講座などあるので気になる方是非。


## プログラミング / アルゴリズム
[米国AI開発者がゼロから教えるPython入門講座](https://www.udemy.com/course/python-ai/)
pythonの基礎のみならず、オブジェクト指向プログラミング，SQLを使ったデータベース操作なども学べます。他にも、エラー処理やテストコードの書き方など幅広く網羅されてる印象でした。やさしいレベルからスタートしているので、未経験者でも問題なく講座を受講できると思います。

[現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/)
おすすめしたいもう一つがこちらです。pythonの基礎に加え、データーベースアクセス、WEBフレームワーク、インフラ自動化、並列化、暗号化、非同期処理など応用範囲も広く、簡単なアプリケーション開発に必要なスキルを習得できると思います。



#　注意点
- **定期的に行っているセールで購入する**
Udemyでは度々（月１,2回程度）セールを行っており、格安で講座を購入することができます。
割引率は80~90%くらいが多く、セールを活用すると一講座数千円程度で購入できるので、セール時の購入をお勧めします。

- **詳しい理論について本や教材で学ぶ**　　
どちらかというとUdemyは実装メインのコンテンツが多いので、理論を深く学びたい方は本や教材をおすすめします。
「理論⇨実装⇨理論」という形で実装した後の理論の勉強は、理解度が上がり楽しくできました。
[Flutter] デバイスを傾けた際に、横表示にしないようにしたい

Flutterで、デバイスを傾けた際に、横表示にならないようにしたい。

# 実装

```dart
  class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
      // ↓この設定を追記
      SystemChrome.setPreferredOrientations([
        DeviceOrientation.portraitUp,
        DeviceOrientation.portraitDown,
      ]);
      return new MaterialApp(...);
    }
  }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121224/78f1863a-d82e-5851-814f-6df60de19a5d.png)

# 参考
https://stackoverflow.com/questions/49418332/flutter-how-to-prevent-device-orientation-changes-and-force-portrait
DNSの仕組み

#はじめに
インターネットを利用、活用するために必要不可欠なシステムです。
普段インターネットを利用していても意識することがないので仕組みについて調べてみました。

#目次
1.DNSとは
2.IPアドレスとは
3.ドメインとは
4.DNSの機能
　4-1.キャッシュDNSサーバ
　4-2.権威DNSサーバ
5.DNSの仕組み

#DNSとは
>「DNS（ドメインネームシステム／Domain Name System）」は、ドメイン名に対応するIPアドレスを教えてくれるシステムです。 例えば「aaa.jp」とブラウザのアドレスバーに入れると、DNSに問い合わせを行い、IPアドレス「172.0.2.1」を教えてくれます。 DNSのサービスを実際に担当しているのはDNSサーバーです。 DNSサーバーは２つの種類があります。 PCからの名前解決要求（このドメインのIPアドレスは何ですか？）をとりまとめる「キャッシュDNSサーバ」と、 名前解決要求に対して名前解決結果を返答する「権威DNSサーバ」があります。

引用：https://remacre.jp/column/homepage/8786/


#IPアドレスとは
IPアドレスとは、ネットワーク上で住所（数字の羅列）です。
ネットワーク上での通信相手を識別するために使用されます。
インターネットに接続するすべての端末にはIPアドレスが与えられます。

例）172.0.2.1

しかし、IPアドレスは人にとっては覚えにくい数字の羅列。
人が覚えやすいドメイン名（文字列）というものが存在する。

#ドメインとは
ドメイン名とは、ネットワーク上で住所（文字列）です。
人が覚えやすいようにIPアドレスを文字にしたものがドメインです。

IPアドレスとドメイン名を紐付けて管理しているのがDNSです。

#DNSの機能
DNSによって、IPアドレスとドメイン名の変換を行うことを名前解決と言います。
PCからの名前解決要求（問い合わせ）を取りまとめるキャッシュDNSサーバと
PCから名前解決要求があったときに、管理情報を返答するサーバを権威DNSサーバという。

###キャッシュDNSサーバ
>DNSキャッシュとは、DNSによるドメイン名に対応するIPアドレスの問い合わせ結果を一定期間保存しておき、短期間に繰り返し同じ問い合わせを同じサーバに送らないようにする仕組みです。 この作業を担当するサーバーがキャッシュDNSサーバーです。 DNSサーバーの仕組み全体のスピードアップ化と権威DNSサーバーの負担を軽減する役割を担っています。

引用：https://remacre.jp/column/homepage/8786/

###権威DNSサーバ
>内部にIPアドレスとサーバ名などを対応させるレコードを持ち、キャッシュDNSサーバから来る名前解決要求に対して、返答を返してくれます。 権威DNSサーバは、世界中に分散しており、階層的に名前解決情報を保持しています。

引用：https://remacre.jp/column/homepage/8786/


#DNSの仕組み
利用者（ユーザ）がPCのブラウザ上で、WEBサイトのドメイン名を入力し、WEBサイトが表示するまでの動きは下記のようになります。

![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156198/1474c6eb-c12f-075f-39d1-445798707de6.png)

　①ユーザがブラウザからドメイン名入力し、キャッシュDNSサーバにアクセスする 
　②キャッシュDNSサーバが権威DNSサーバに、管理情報を問い合わせる
　③管理情報のあるDNSサーバーはキャッシュDNSサーバーに、IPアドレスを回答する
　④キャッシュDNSサーバーはユーザに、IPアドレスを回答する
　⑤IPアドレスでWebサイトにアクセス
　⑥WEBサーバからデータを返す、ブラウザ上にWebサイトが表示される

権威DNSサーバはドメイン名をドット.で区切ってそれぞれの階層ごとに管理しています。
区切られた階層の一番上のものをルートサーバといい、
そこから順に下位のサーバに問い合わせをしていき必要な情報を取得します。

#参考
https://www.rworks.jp/system/system-column/sys-entry/16303/

https://www.kagoya.jp/howto/it-glossary/domain/dns-server/

https://www.ntt.com/bizon/glossary/e-d/dns-server.html

https://remacre.jp/column/homepage/8786/
ASTERIA Warpインストール時に選択すべきJavaについて

#はじめに

こんにちは。今回仕事でASTERIA Warpを初めて触ることになりました[@kojimark](https://twitter.com/k_kojima0902)です。
この記事では「ASTERIA Warpインストールガイド：1-1.5. Java のインストール」について、WindowsOS時に選択すべきJavaの種類と、誤って他のJavaをインストールしてしまった場合の対処法をご紹介します。

尚、インストール時は「[ASTERIA Warpインストールガイド](https://help.asteria.com/documentation/warp/ja/2012/InstallGuide.pdf)」の他に「[Advent Calendar Day1](https://qiita.com/advent-calendar/2021/asteriawarp)」の記事なども参考にしています。

#1-1.5　Javaのインストールについて
インストールガイドを見ると「Java8 64bit版が必要です。」と記載があります。
※ここを見落としてはいけません。
![Screenshot 2021-12-05 214148.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342106/d6323aca-91ad-606c-99b6-990b5b7497f6.png)



それではインストールガイドに記載されているjavaのダウンロードページを見てみます。
![Screenshot 2021-12-05 210739 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342106/fbc1a705-f0de-3066-9096-4179f629fed0.png)


WindowsOSについては、3種類のダウンロードファイルが提供されています。

必ず「Windowsオフライン（64ビット）」を選択しましょう。
ビット数の記載がないダウンロードファイルは32bit版になります。


#Java（32ビット版）をインストールするとどうなるのか
フローサービスを開始した際、コマンドプロンプトで「ASTERIA Warp Server started」が表示されません。
また、Program Files(x86)に実行ファイルが生成されます。（本来はProgram Filesに生成されます）
ASTERIA Warpのアンインストールもできなくなります。

#間違ってしまった場合の対処法
Javaのダウンロードページより「Windowsオフライン（64ビット）」をダウンロードし実行環境に入れなおします。
その後、ASTERIA Warpを上書きで再インストールします。
Program Filesに実行ファイルが生成されます。

以上で復旧することができます。

#最後に
さあ、これで本当のタスクである[外部JDBC Driver](https://www.cdata.com/jp/kb/tech/salesforce-jdbc-asteria.rst)の利用準備OK です。
Let'sデータ連携！
functionを利用したOpenFOAMソルバーへのscalar transportの追加

# はじめに
化学種などの輸送を解析したいケースでは、combustionカテゴリーにあるソルバーを使うことになります。
その前にざっくりと計算をしてみたいときなどは、simpleFoamやpimpleFoamなどの既存ソルバーに、スカラー量の輸送方程式、モデルを追加するのが早いです。
ここでは、OpenFOAMのfunctionを利用した実装方法をまとめます。

なお、スカラー量輸送の追加方法は、既に他サイト（例えば[ここ](https://cfd-training.com/2018/08/14/how-to-add-a-passive-scalar-to-your-openfoam-simulations/)）でまとめられているところではありますが、自分の学習・復習目的のために、ここでまとめさせていただきます。その点、ご容赦ください。

# functionを用いた実装方法
解きたいスカラー量を$C$とした場合、

```math
\frac{\partial C}{\partial t} + ({\bf U} \cdot \nabla) {C} = D \nabla^2 {C}
```

の支配方程式を追加することになります。修正、追加が必要となるファイルは次の

- __system/controlDict__
- __system/fvSolution__
- __system/fvScheme__
- __0/C__

になります。



## system/controlDict
スカラー量の輸送解析を追加するのは、controlDict内のfunctionsの中で行います。
以下のように追記してください。

```c++:controlDict
functions
{
    scalar0
    {
        type    scalarTransport;
        functionObjectLibs ("libsolverFunctionObjects.so");
        enabled true;
        writeControl    outputTime;

        field   C;
        nCorr 1;
        D   0.0001; // Diffusion coefficient

        log yes;
    }
}
```

## system/fvSolution
行列解法の指定を行います。
おすすめは以下にあるPBiCGStabです。

```c++:fvSolution
solvers
{
   ...
   C
    {
        solver      PBiCGStab;
        preconditioner  DILU;
        tolerance       1e-6;
        relTol          0;
        minInter        1;
    }
}
```

## system/fvScheme
所望の差分スキームを追記します。
多くの場合は、以下のスキームで良いと思います。

```c++:fvScheme
divSchemes
{
    ... 
    div(phi,C)    Gauss   linearUpwind grad(C);
}
```

## 解析例
以下はpimpleFoam/channel1395に対し、スカラー量$C$の輸送を追加したものになります。下面からスカラー量が染み出してきて、それが左から右に流されている様を表しています。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227359/36d32168-a3ac-2570-8ec8-25bdf2909b3a.png)


# まとめ
以上が化学種などの輸送を想定したスカラー量輸送解析のfunction機能を利用した実装方法です。比較的、容易に化学種の輸送を計算することができます。
なお、化学種輸送をより正確に計算したい場合は、combustion系のソルバーを用いるのが良いと思います（化学種濃度分布による密度変化や多元素輸送拡散時の拡散係数を考慮できる）。
【Android Studio】Gradleでの Jackson の追加方法(Java)

Android Studioを使用した`Jackson`の使用方法について調べたのですが、実装までに四苦八苦したので、メモを残しておきます。

#リポジトリ
`Jackson`が公開されているページです。
ページ内の取得したいバージョンの「Gradle」の部分をコピーします。
jackson-core
https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
jackson-databind
https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
jackson-annotations
https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations

####使用するバージョンの選択
<img width="500" alt="a010b5d5-04f0-c700-22a2-08b424747a45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/a010b5d5-04f0-c700-22a2-08b424747a45.png">

####build.gradleに貼り付ける箇所のコピー
<img width="500" alt="fcc89578-fbe5-fb63-983f-fe01769be76a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/fcc89578-fbe5-fb63-983f-fe01769be76a.png">

# build.gradle
ライブラリの管理は`build.gradle`で行われているので、先ほどコピーした内容を`build.gradle`の`dependencies `に追加します。

```gradle:build.gradle
plugins {
    id 'com.android.application'
}

android {
    // 省略
}

dependencies {
    // ここに追加する
    // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.13.0'

    // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.13.0'

    // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.13.0'

    // 以下はデフォルトの内容
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
```

追加した後に再ビルドをすれば、読み込み完了です。

あとは、`Java`のコードで、下記の様に`jackson`のライブラリを`import`すれば`android studio`で、`Jackson`が使用できるようになります。
（私の場合は、`ObjectMapper`の`readValue`と`writeValueAsString`ぐらいしか使わないため、`ObjectMapper`を`import`しています。）

```java
import com.fasterxml.jackson.databind.ObjectMapper;
```
ウィンドウを最前面化する方法（macOS)

こんにちは。
下記画面例は Terminal ウィンドウが最前面のように一見見えますが、そうではありません。そのままではサイズ変更などもできません。
* 左上隅の三色ボタンが灰色であり、メニューバーにも Finder がアクティブと表示されているなど、そうではありません。
* これに気がつき、目的のアプリケーションを activate し次の操作へ進む必要があります[^1]

[^1]: 面倒な UI なのかもしれません。


<img width="400px" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/9fa21240-e54b-0f56-429e-5292f040107b.jpeg">

### マウスを用いる操作方法

この場合はウィンドウをマウスクリックし最前面化する必要があります。

### キーボードのみを用いる操作方法

Spotlight 検索欄[^2]へ入力し呼び出す操作として、

[^2]: ショートカットを使って呼び出す

* ```Terminal``` ウィンドウを最前面化するには、 ```Terminal```　とそこへ入力します。
* もしくは、下記の AppleScript を呼び出す方法を考えてみました。

```activate_proc.scpt
tell application "System Events"
	repeat with proc in (processes where background only is false and visible is true)
		set procName to (name of proc)
		if {"Finder"} does not contain procName then
			activate application procName
			exit repeat
		end if
	end repeat
end tell
```

<!-- [^1]: キーボードのみを用い最前面化する方法を現在調査中です。 -->
WebSocket通信のクライアント/サーバの環境構築

#要約
　WebSocket通信のクライアント/サーバの環境を構築する。お仕事でWebSocket通信のツール、環境が必要となった際にまとめたものです。
![ezgif.com-gif-maker (10).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/09204396-bfeb-3c66-dcda-b9751d24278c.gif)



```javascript:wsのインストール
~/develop/wscatTest $ yarn init
yarn init v1.22.5
question name (wscatTest): 
question version (1.0.0): 
question description: 
question entry point (index.js): 
question repository url: 
question author: 
question license (MIT): 
question private: 
success Saved package.json
✨  Done in 2.88s.
~/develop/wscatTest $ yarn add ws
yarn add v1.22.5
info No lockfile found.
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...

success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
└─ ws@8.3.0
info All dependencies
└─ ws@8.3.0
✨  Done in 1.40s.
~/develop/wscatTest $ 
```

```javascript:サーバ環境構築
~/develop/wscatTest $ npx wscat -l 3000
Listening on port 3000 (press CTRL+C to quit)
```

```javascript:クライアント接続
~/develop/wscatTest $ npx wscat -c ws://localhost:3000
Connected (press CTRL+C to quit)
```
あとは文字を打てば動画の通りに動きます。![Something went wrong]()
今更ながらかもしれないUnityの導入方法について第2回目

#Unityの導入について第2回目です。
さて、さっそくUnityをインストールと行きたいところですが、まだまだやることがあります。
Unityだけではアバターやアイテムを作成できません。
アバターを作成するときはUniVRMを、アイテムはUniVCIが必要です。
イメージとしてはUnityに追加でインストールするアドオンという位置づけでしょうか。
コレがないとアバターやVCIを作成することが出来ません。

#ではやっていきましょう。
・UniVRMのダウンロードはここから（*https://github.com/vrm-c/UniVRM/releases*）行います。
　このページでは推奨されるUnityバージョンが記載されています。
　このバージョンを覚えておきましょう。
　記事作成時はUniVRM v0.90.0 推奨されるUnityは　2019.4LTSです。
　
　またバーチャルキャストのバージョンが書かれていることもあり、
　ベータ版用であることが書いていることがあります。
　このバージャンを使用すると通常版バーチャルキャストでは読み込めない可能性があるため、
　素直に使用するUniVRMバージョンを下げましょう。
![1_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/780cc619-99ef-47bf-0223-188c068152c6.jpeg)

・次にVCIを作成するときに必要なUniVCIをダウンロード（*https://github.com/virtual-cast/VCI/releases*）しましょう。
　ここでもUnityの推奨バージョンを確認しましょう。

　記事作成時はUniVCI　V0.33.1　Unityは2019.4.30f1となっています。
　また、UniVRMと同じくバーチャルキャストのバージョンについて記載が無いかも確認しましょう。
　
　**さらに大事な事が書かれていることがあります。**
　「重要」と書かれている「unitypackage を使用する場合」をよく読むと、
　「UniVRM v0.33.1 パッケージを導入後、UniVCI v0.33.1 の unitypackage をプロジェクトにインポートしてください。」と書かれています。
　実際はUniVRM0.88.0の間違いですが、UniVCIを導入する前にUniVRMを導入する必要がある場合があります。
　「Assets」のところに必要なUniVRM-xxxx.unitypackageとUniVCI-xxxx.unitypackageが有るのでダウンロードしましょう。
![2_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/9b9d9943-c49b-1ea8-a6fe-5b492e179d75.jpeg)

・UnityHubに画面を戻し、今度こそUnityをインストールしましょう。
　左上に「←環境設定」が表示されている場合はそれをクリックした後、
　左メニューから「インストール」をクリック。
　さらに右上の「インストール」をクリックしましょう。
![3_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/5560a33b-5885-3a4f-ceae-249e2163c875.jpeg)

・インストールするUnityバージョンを選択しましょう。
　UniVCIに書かれていたバージョンとは少し違いますが、
　記事作成時に選択できる「Unity2019.4.33f1(LTS)」を選びましょう。

　ちなみにLTSとは「Long Term Support」の略で、長期サポートされているUnityバージョンをさします。
![4_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/ee3c117f-a0bf-e050-7681-7b14dd9247f4.jpeg)

・次にモジュールを選択しましょう。
　通常Microsoft Visual Studioにチェックが入っていますが、
　基本的に必要ないのでチェックを外しましょう。必要であればインストールして問題ありません。

　Documentationはお好みで。
　日本語はメニュー表記等を日本語にしたいときにはチェックを入れましょう。
![5_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/dcb97d10-abc6-b952-3608-b13aa42b511d.jpeg)
![6_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/c814a997-5c6c-8c89-56e1-c4a03683a7bf.jpeg)

・インストールが自動で進むのでしばらく待ちます。
　環境によりますが5分程度待つかもしれません。
　下の画像のように表示され、これにてやっとUnityのインストールが終わりました。
![7_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353185/4a1e5971-3c8a-6fe0-a09c-d766c6171d47.jpeg)

#さらに次回に続く
前回に比べ短めですが、1回にまとめるには長くなるのでまた次回！
Windows11にアップデートして、WSLgでxtermを起動するまで

Windows11のアップデートがやっと降ってきたので、アップデートしてみました。
試してみたいことはWSLgですよね。
WSLのコンソールからxterm起動しみたんですが、起動しませんでした。

Windows10の時にWSL2をインストール済みの場合、Windows11にアップデートしても自動的にWSLgはインストールされない様です。

パワーシェルを管理者権限で起動し次のコマンドを実行します```

```powershell
wsl --update
```

完了したら、WSLの再起動

```powershell
wsl --shutdown
```

WSLのコンソールからxtermと入力すると起動します。
最初に起動するまではちょっと時間がかかるみたい。


参考

https://docs.microsoft.com/en-us/windows/wsl/tutorials/gui-apps
WSL2でseleniumを使ってみる

# chromeのインストール

```
$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
$ sudo apt install ./google-chrome-stable_current_amd64.deb
```

バージョンを調べる。

```
$ google-chrome --version
Google Chrome 96.0.4664.45
```

# Chromedriverをインストール

chromeのバージョンの96.0.4664.45と同じものをインストールする。

```
pip install chromedriver-binary==96.0.4664.45.0
```

# seleniumのインストール

```
pip install selenium
```

# コードを実行する

```python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary
import lxml.html

# ブラウザーを起動
options = Options()
options.binary_location = '/usr/bin/google-chrome'
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)

# サイトにアクセス
driver.get(
    'https://www.selenium.dev/ja/documentation/')

# htmlを取得・表示
data = driver.page_source
data = lxml.html.fromstring(data)
data = data.xpath("//h1")[0].text
print(data)

# ブラウザーを終了
driver.quit()
```

実行するとサイトのh1タグの内容が表示されます。

```
$ python main.py
Seleniumブラウザー自動化プロジェクト
```


# 参考にしたサイト

https://qiita.com/derodero24/items/9e9567790bde9e4b9d0c
お客さんによって表示内容を変えるテンプレートを作るには（Vue）

# お客さんによって表示内容を変えたい

やったー！ついに最強のテンプレートができた！
これでどんな案件にも対応でき・・・あれ、利用規約とか会社情報とかは、お客さんによって変える必要があるな・・・

# 方法は・・・


まず、プロジェクトによって変わる値を設定したいな
.env.development.localを作ろう、アヒル社だからahiruっと

```
// .env.development.local
VUE_APP_PROJECT=ahiru
```

こうするとVue3の場合、npm run serve した時に、読み込めるんだったよね
とりあえず読み込めてるかチェックしてみよう

```vuejs
// TermsOfService.vue
<template>
  {{project}}
</template>

<script>
import { defineComponent } from "vue";
export default defineComponent({
  setup() {
    const project = process.env.VUE_APP_PROJECT);
      return {
        project
      }
    }
})
```

よしよしテンプレートでもちゃんと読み込めてるね

```
ahiru
```

TermsOfService.vueに直接利用規約を書いちゃうと、表示が分けられないから別ファイルにしよう

```vuejs
// Ahiru.vue
<template>
利用規約
第1項：アヒルであること
第2項：いつでもアヒルたること
</template>
```

ahiruだったらAhiru.vue, kaeruだったらKaeru.vue, hiyokoだったらHiyoko.vue
というふうに読み込めばいいよね

ひとまずAhiru.vueを読み込んでみよう

```vuejs
// TermsOfService.vue
<template>
  <Ahiru/>
</template>

<script>
import { defineComponent } from "vue";
import Ahiru from "./Ahiru.vue";
export default defineComponent({
  setup() {
    component: {
      Ahiru
    },
    const project = process.env.VUE_APP_PROJECT;
    return {
      project
    }
  }
})
```

```
利用規約
第1：アヒルであること
第2：いつでもアヒルたること
```

うんできた

# ここで疑問
あとはprocess.env.VUE_APP_PROJECTの値によって読み込むコンポーネントを分けられたら完成だ・・・
importのところを変えればいいでしょ。これでどう？


```vuejs
// TermsOfService.vue
<template>
  <Ahiru/>
</template>

<script>
import { defineComponent } from "vue";
import Ahiru from `./${process.env.VUE_APP_PROJECT}.vue`;
export default defineComponent({
  setup() {
    components: {
      Ahiru
    }
  }
})
```

結果：エラー！！エラー！！

なんで・・・・？

# 検索
どうやって読み込むコンポーネントを分けるんだろう？

```
import 可変　vue
```

# 検索結果
・タブ機能の作り方
→ 今作ってないし・・・
・非同期コンポーネントの表示
→今使ってないし・・・

# はまる
うーん、VueRouterを使ってhttp://〇〇/ahiru/terms_of_serviceだったらAhiru.vueを読み込むとか？
いや、URLについちゃうのは困る・・・

# 先輩に聞く
あぁそれならこんなふうにしてあげれば？
projectがahiruだったらAhiru.vue, projectがhiyokoだったらHiyoko.vue
というふうに読み込めるよ

```vuejs
<component v-bind:is="project"></component>
```

# いきなり解決
できたー！

```vuejs
// TermsOfService.vue
<template>
  <component v-bind:is="project"></component>
</template>

<script>
import { defineComponent } from "vue";
import Ahiru from "./Ahiru.vue";
import Kaeru from "./Kaeru.vue";
import Hiyoko from "./Hiyoko.vue";
export default defineComponent({
  setup() {
    const project = process.env.VUE_APP_PROJECT;
    return {
      project
    }
  }
})
```

# 学習したこと
## 検索結果は背景を読もう
タブ機能や非同期コンポーネントといった言葉で反射的にバックするのではなく、確かに可変できてるよな
ここからエッセンスを掴めるかもな・・という発想
## やっぱり人に聞くのが一番できるわかる
いきなり聞くとふーんとかしかならないので、とりあえず自分で悩んでから


# 補足
もっといいやり方あるよという方ぜひJoinして私に教えてください
その際には「小林のQiitaみた」と一言あると、いいことあります
[読書備忘録]RubyとSinatraではじめる　Webアプリケーション開発の教科書

# はじめに
`Ruby` 関連本って `Rails` を除いてなかなか出版されない中、`sinatra`ですからちょっとびっくり。
# RubyとSinatraではじめる　Webアプリケーション開発の教科書
[RubyとSinatraではじめる　Webアプリケーション開発の教科書](https://www.morikita.co.jp/books/mid/085561) を図書館で借りて読みました。

いわゆる？安定の森北出版
# 目次
第1章　Webアプリが動くしくみ
第2章　PC上に仮想環境を構築しよう ― Webアプリ作成前の準備
第3章　Rubyのコーディングに慣れよう
第4章　Webカレンダーを作ろう ― いちばん簡単なWebアプリ
第5章　シンプルな掲示板Webアプリを作ろう ― データベースと連携する
第6章　パスワードの管理のしかた ― ログイン機能をつけるための基礎知識
第7章　Cookieの使い方 ― セッションを継続させるための基礎知識
第8章　掲示板Webアプリを完成させよう ― より実用的なWebアプリ

`JavaScript`を使用した派手な部分はないものの、パスワードの暗号化やセッション管理などに章を割いており好印象。

検索すれば得られる知識ではあるものの、手っ取り早く紙媒体で学習したい人におすすめ。
# メモ
+ がんばれRuby
+ がんばれ森北出版
Gitのコマンドの取り消し方マニュアル

よく忘れるので自分用メモ
# git init
`.git`リポジトリを作っているだけなので

```sh
rm -rf .git
```
# git config
`--unset`を使う

```sh
git config --global --unset user.name #user.nameが消去される
```
# git add
## git init直後の場合

```sh
git rm --cached -r . #すべてのファイル
git rm --cached -r example.js #特定のファイル
```
## 2回目以降の場合

```sh
git reset HEAD #すべてのファイル
git reset HEAD example.js #特定のファイル
```

参考: [git add を取り消す](https://qiita.com/yukure/items/89562e5eb1d03995dc5b)
# git commit
## コミットを「取り消す」
直前のコミットの場合は、

```sh
git reset --soft HEAD^ #ローカルのファイルを残しておく場合
git reset --hard HEAD^ #ローカルのファイルも消す場合
```

## コミットを「打ち消す」
これを使うことでコミットをなかったことにするのでなく、ファイルを戻すことができる。

```sh
git revert 1234567890abcdef1234567890abcdef12345678 #コミットのハッシュ値
```

## コミットを「編集」
「コミットメッセージを書き換えたい」等の場合に使用する。

直前のコミットの場合は、

```sh
git commit --amend
```

参考: [[Git]コミットの取り消し、打ち消し、上書き](https://qiita.com/kat0/items/f8dde16294d5f7bf18ed)
# git push
## 歴史改変する場合
(こちらはローカルでコミットを打ち消したあとそれをforce-pushして歴史を改変するので、複数人で作業しているリポジトリやforce-pushを禁止しているブランチでは避けたほうが良いです)

```sh
git reset --hard HEAD^
git push -f origin HEAD
```
## 打ち消す場合
こちらは比較的安全ですが、ログが見にくくなります

```sh
git revert HEAD
git push origin HEAD
```

参考: [git push の取り消し方法](https://www-creators.com/archives/2020)

# git remote
`git remote add`で originを指定していれば

```sh
git remote rm origin
```
# git clone
ローカルリポジトリを完全に削除すればOK。

```sh
cd ../ #そのリポジトリにいた場合
rm -rf リポジトリ名
```
# git log, reflog, diff, show など
これは取り消しというよりやめ方。  
`q`キーを押せば止まる。Ctrl+CやCtrl+Dでは止まらないため注意
# git rebase
`git reflog`で開始前の番号を特定し、

```sh
git reset --hard HEAD@{番号}
```
# git branch
## ブランチの削除
```sh
git branch -D ブランチ名
```
# git fetch
ローカルのブランチは更新されてないため

```sh
git reset --hard HEAD
```
# git merge
## コンフリクトして、まだ手を付けてないとき

```sh
git merge --abort
```
## コンフリクトして、手を付けたけどやめるとき

```sh
git reset --hard HEAD
```

## マージすべて完了したけど戻すとき(revert)

```sh
git revert -m 1 マージコミット
```
### 注意点
取り消したマージコミットに含まれていた変更を再度マージすることはできなくなります。
## マージすべて完了したけど戻すとき(reset)

```sh
git reset --hard ORIG_HEAD
```
### 注意点
コミット自体がなかったことになるので、複数人で作業しているリポジトリではやめたほうがいいです

参考: [【git】マージしたけどやっぱりやめたい時のやり方4種類](https://qiita.com/chihiro/items/5dd671aa6f1c332986a7)
# git pull
## 成功したけどやめたいとき
`git reflog`でpull前の番号を特定し、

```sh
git reset --hard HEAD@{番号}
```
Ubuntu20.04 に git-secrets をインストールする

# はじめに

git-secretsは、Amazon Web Services Labs が提供する、パスワードやその他の機密情報をgitリポジトリにコミットできないようにするツールです。

git と連携して git commit 実行前に自動的にsecretsの有無をチェックします。

Ubuntu 20.04 に git-secretsをインストールします。

# 環境

動作環境は以下の通り。

```bash:Ubuntu
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```

# 手順

## インストール

公式サイトの手順に従って、インストールします。

https://github.com/awslabs/git-secrets

まず、リポジトリをクローンして、

```bash
$ git clone https://github.com/awslabs/git-secrets
```

インストールします。

```bash
$ cd git-secrets
$ sudo make install
```

インストールできたことを確認します。

```bash
$ git secrets -h
usage: git secrets --scan [-r|--recursive] [--cached] [--no-index] [--untracked] [<files>...]
   or: git secrets --scan-history
   or: git secrets --install [-f|--force] [<target-directory>]
   or: git secrets --list [--global]
   or: git secrets --add [-a|--allowed] [-l|--literal] [--global] <pattern>
   or: git secrets --add-provider [--global] <command> [arguments...]
   or: git secrets --register-aws [--global]
   or: git secrets --aws-provider [<credentials-file>]

    --scan                Scans <files> for prohibited patterns
    --scan-history        Scans repo for prohibited patterns
    --install             Installs git hooks for Git repository or Git template directory
    --list                Lists secret patterns
    --add                 Adds a prohibited or allowed pattern, ensuring to de-dupe with existing patterns
    --add-provider        Adds a secret provider that when called outputs secret patterns on new lines
    --aws-provider        Secret provider that outputs credentials found in an ini file
    --register-aws        Adds common AWS patterns to the git config and scans for ~/.aws/credentials
    -r, --recursive       --scan scans directories recursively
    --cached              --scan scans searches blobs registered in the index file
    --no-index            --scan searches files in the current directory that is not managed by Git
    --untracked           In addition to searching in the tracked files in the working tree, --scan also in untracked files
    -f, --force           --install overwrites hooks if the hook already exists
    -l, --literal         --add and --add-allowed patterns are escaped so that they are literal
    -a, --allowed         --add adds an allowed pattern instead of a prohibited pattern
    --global              Uses the --global git config
```

インストールできました。