OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby:正規表現まとめ※コードサンプルあり

※2022年から技術系の記事は[個人ブログ](https://yamaday0u.net/category/programmer/)に投稿しております。ぜひこちらもご覧ください→[yamaday0u Blog](https://yamaday0u.net/category/programmer/)

初心者向けに主な正規表現のパターンを整理しました。

## 主な正規表現のパターン一覧
|パターン|意味|
|:--|:--|
|[a-z]|角括弧で囲まれた文字のいずれか1個にマッチ（この場合はaからzのいずれかの文字にマッチ）|
|\d|数字にマッチ|
|\D|数字以外にマッチ|
|{n}|直前のパターンを n 回繰り返すものにマッチ
|{n, m}|直前の文字が少なくともn回、多くてもm回出現するものにマッチ|
|.|改行以外のどの1文字にもマッチ|
|*|直前の部分式の0回以上の繰り返しにマッチ|
|+|直前の部分式の1回以上の繰り返しにマッチ|
|\A|直後の文字列が先頭にある文字列にマッチ|
|\z|直前の文字列が末尾にある文字列にマッチ|
|?=|直後に設定した文字が続く文字列にマッチ|
|*?|直前に設定した文字が0回以上続く文字列をチェックし、?の直後の文字が出た段階でその1文字を返す|

## 修飾子
|パターン|意味|
|:--|:--|
|/i|大文字と小文字を区別しない|

## 「*」の意味を深ぼる
|パターン|意味|
|:--|:--|
|*|直前の文字の0回以上の繰り返しにマッチ|

「*」の「0回以上の繰り返しにマッチ」がちょっとわかりにくいので、「+」と比較しながら確認します。

|パターン|意味|マッチする文字列の例|
|:--|:--|:--|
|a.*z|aから始まってzで終わる2桁以上の文字列|az, abz,abczなど|
|a.+z|aから始まってzで終わる3桁以上の文字列|abz,abczなど|

「\*」自体は1桁以上の文字列を求めないので、上記の例のように２桁の文字列でもマッチします。「.」は改行以外のどの文字にもマッチしますが、「\*」が後に付くことで「.」にあたる文字がなくてもマッチします。
一方で「+」は１桁以上の文字列を求めるので、２桁の文字列にはマッチしません。


## そのまま使える正規表現の主なパターン一覧
|パターン|意味|
|:--|:--|
|/\A[ぁ-んァ-ン一-龥]/|全角ひらがな、全角カタカナ、漢字|
|/\A[ァ-ヶー－]+\z/|全角カタカナ|
|/\A[a-zA-Z0-9]+\z/|半角英数|
|/\A\d{3}[-]\d{4}\z/|郵便番号（「-」を含む且つ7桁）|

### RailsのActiveRecordの機能で使えるバリデーション
正規表現とは異なりますが、RailsのActiveRecordのバリデーションヘルパーの一つであるnumericalityでは、以下のオプションで使うことで簡単にバリデーションを設定することができます。
※備忘録として一時的にこの記事に残していますが、今後バリデーションの記事を作成した場合は、本項目はそちらへ移動します。

|パターン|意味|
|:--|:--|
|greater_than_or_equal_to: 〇〇|〇〇以上の数値|
|less_than_or_equal_to: 〇〇 | 〇〇以下の数値|

## 正規表現を試せるサイト
[Rubular](https://rubular.com/)という、Rubyで使える正規表現を試すことができるサイトがあります。
自分で作った正規表現が意図した文字列やパターンにマッチするか確認することができるので、正規表現への理解を深める意味でも有益なサイトです。

## 参考資料
[Ruby 3.0.0 リファレンスマニュアル>正規表現](https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html)
[Railsガイドv6.0 Active Record バリデーション](https://railsguides.jp/active_record_validations.html)
[murashun.jp 基本的な正規表現一覧](https://murashun.jp/article/programming/regular-expression.html)
[TechRacho [連載:正規表現] Unicode文字プロパティについて(1)](https://techracho.bpsinc.jp/hachi8833/2013_09_13/13433)
パーシャルでインスタンス変数は使わない

初学者です。
コントローラの修正をしたときに、どのコントローラと結びついているのかわからなくなってしまったので、備忘録として残します。

```ruby:index.html.erb
<%= render 'layout/header' %> #ダメな例
```

```ruby:_header.html.erb
<%= @product.name %> #ダメな例
```


<ul>
<li>モデルのデータと関連付けられるので、使いづらくなる。</li>
<li>コントローラ側でインスタンス変数の名前や動き方を変更したときにパーシャル側の変更もしなければいけなくなる。</li>
</ul>

<h1>対処</h1>

```ruby:index.html.erb
<%= render 'layout/header', product_name: @product.name %>
```

```ruby:_header.html.erb
<%= product_name %>
```

これでできました！！！

<h1>参考</h1>

<a>https://qiita.com/mom0tomo/items/e1e3fd29729b2d112a48</a1>

`locals:`を使ったりもするみたいです。その場合は`partial:`もつける。
【Android】入力方法を指定する方法

#プログラミング勉強日記
2021年1月13日
EditTextには数字用、パスワード用といった複数の入力タイプなど様々な入力方法の指定があるのでその方法を簡単にまとめる。

#キーボードのタイプを指定する方法
　キーボードのタイプを指定するためには、`EditText`タグに`android:inputType`属性を使う。

| 指定する値 | 説明　|
|:--:|:--:|
| text | 通常テキストを入力する |
| textUrl | URLを入力する(通常のキーボードに`/`が追加される) |
| number | 数値を入力する |
| phone | 電話番号を入力する(携帯電話型のキーボードになる) |

```xml
<!-- Eメールアドレスを入力させたい場合 -->
<EditText
    android:id="@+id/editText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint="@string/hint"
    android:inputType="textEmailAddress" />
```

#キーボード入力時を指定する
　`android:inputType`では、初めてキーボードで入力された文字はすべて大文字にする、文字を全てドットで隠すように表示するなど指定することができる。

| 指定する値 | 説明　|
|:--:|:--:|
| textCapSentences | 先頭の文字のみを大文字にする |
| textCapWords | 単語の先頭文字のみを大文字にする |
| textAutoCorrect | 文字のスペルミスを自動で修正する |
| textMultiLine | 複数行を入力する |

```xml
<!-- 入力された文字をすべてドット表示にする -->
<EditText
    android:id="@+id/editText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint="@string/password"
    android:inputType="textPassword"/>
```

#参考文献
[入力方法のタイプの指定
](https://developer.android.com/training/keyboard-input/style?hl=ja)
ポリモーフィック関連付けをしたModelでのfactoryの作り方

ほぼ自分用なので簡易的に記します。

userとprojectに対してコメントができる。

```comment.rb
belongs_to :commentable, polymorphic: true
belongs_to :commenter, class_name: 'User'
```

```user.rb
has_many :comments, as: :commentable, dependent: :destroy
```

```preject.rb
has_many :comments, as: :commentable, dependent: :destroy
```

両方のfactoryを書いてあげれば良い

```factories/comment.rb

FactoryBot.define do
    factory :project_comment, class: 'Comment' do
      association :commenter,   factory: :user
      association :commentable, factory: :project
      commentable_type { 'User' }
      comment          { 'Sample Comment' }
    end

    factory :user_comment, class: 'Comment' do
      association :commenter,   factory: :user
      association :commentable, factory: :user
      commentable_type { 'User }
      comment          { 'Sample Comment' }
    end

end

```

```rb
let(:user_comment) { FactoryBot.create(:user_comment) }
```

で呼び出せる。


ポリモーフィック関連は関連するモデルの追加が簡単であるべき、
よってfactoryの追加も簡単であるべきだと思う。
このように書けば、今後関連モデルが増えてもcomment_typeを増やして対応できる。


```factories/comment.rb
FactoryBot.define do
  comment_type = [:user, :project]

  comment_type.each do |type|
    factory :"#{type}_comment", class: 'Comment' do
      association :commenter,   factory: :user
      association :commentable, factory: type
      commentable_type { type.to_s.camelize }
      comment          { 'Sample Comment' }
    end
  end
end

```
逆にcomment_typeを増やしても対応できない場合は、ポリモーフィックにすべきではない。
関連モデルによってメソッドやfactoryの構成が変わるようでしたらポリモーフィックではなく,STIなどを検討してみればいかがでしょうか。
Vue.js でリストにフィルターをかける

# 初めに
公式ドキュメントにフィルターされた結果の表示の方法があった。ドキュメントでは算出プロパティを用いていたので、最近勉強したメソッドと `v-if` ディレクティブを使って同じ結果になることを確認してみた。
https://jp.vuejs.org/v2/guide/list.html



```html
  <div id="app">
    <li v-for="n in numbers">{{ n }}</li>
  </div>
```

```js
var app = new Vue({
  el: '#app',
  data: {
    numbers: [ 1, 2, 3, 4, 5 ]
  }
})
```

- 動作結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/c4c08b55-628e-afb1-b5c1-657871c959ea.png)

### 算出プロパティでの結果

```html
  <div id="app">
    <li v-for="n in evenNumbers">{{ n }}</li>
  </div>
```

```js
var app = new Vue({
  el: '#app',
  data: {
    numbers: [ 1, 2, 3, 4, 5 ]
  },
  computed: {
    evenNumbers: function () {
      return this.numbers.filter(function (number) {
        return number % 2 === 0
      })
    }
  }
})
```

- 動作結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/493529d2-0ee6-662f-fb03-3f19e40f02bb.png)


# メソッドを用いる方法

こちらは算出プロパティとほとんど変わらない。ただ `v-for` の中に()を書くことをよく忘れてしまう。

```html
  <div id="app">
    <li v-for="n in evenNumbers()">{{ n }}</li>
  </div>
```

```js
var app = new Vue({
  el: '#app',
  data: {
    numbers: [ 1, 2, 3, 4, 5 ]
  },
  methods: {
    evenNumbers: function () {
      return this.numbers.filter(function (number) {
        return number % 2 === 0
      })
    }
  }
})
```

- 動作結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/3e21a7ed-73c2-bc68-f1bb-6a3297adb51f.png)


# v-if を用いる方法

`v-if` の中に条件式を書くだけで動いた。

```html
  <div id="app">
    <li v-for="n in numbers" v-if="n % 2 == 0">{{ n }}</li>
  </div>
```

```js
var app = new Vue({
  el: '#app',
  data: {
    numbers: [ 1, 2, 3, 4, 5 ]
  }
})
```

- 動作結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/3e21a7ed-73c2-bc68-f1bb-6a3297adb51f.png)


# 参考記事

- 公式ドキュメント
https://jp.vuejs.org/v2/guide/list.html
パスを通すとは

##前提
macのterminalでパスを通す方法.
`zsh: command not found: コマンド名`　というエラーが出た時の対処法です.

##デフォルトのシェルを確認
macのシェルにはbashとzshがあります.

```
$ echo $SHELL
```

##パスを通すとは
コマンドが格納されているディレクトリを登録しておくこと.

##手順
###1. 通っているパスを確認

```
$ echo $PATH
```

###2. パスの追加

```
#bashの場合
$ open ~/.bash_profile
#zshの場合
$ open ~/.zshrc
```

```
$ export PATH=/xxxx/bin:$PATH
```

```
#bashの場合
$ source ~/.bash_profile
#zshの場合
$ source ~/.zshrc
```

###3. パスの確認

```
$ コマンド　--version
```
社内システムのAWS構成を紹介してみる

## はじめに
初めての投稿になるので軽く自己紹介。
これまでアプリ開発（Java/PHP/Ruby）などの開発者からPLやPMなどを経験してきました。
今は社内システムのPLや受託案件のPMなどに従事してて、あとは案件の提案活動などをメインにやらしてもらっています。

## 社内システムについて
弊社ではプロジェクト管理や勤怠管理などのシステムをフルスクラッチで開発・運用しており、私は主に運用保守や機能拡張の案件のリーダーに携わっています。
このシステムはAWSを利用していて、上記の業務の傍らAWSのサービスを触る機会が多く、
2年ほど前に試行錯誤しながらAWSのCode3兄弟と呼ばれるCodeCommit/CodeBuild/CodeDeployを使って
デプロイまでのプロセス自動化などAWSの構成を大きく変更してきたので紹介します。

## 社内システムの構成
弊社の社内システムはこちらの構成になっています（2018年頃の構成図）
本番環境、STG環境、開発環境が3、4個あります。
※構成図では複数の開発環境は省略しています

![社内システム構成図-2018(アイコン最新).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605889/4e2ded16-9a0e-9d8f-0085-9de45fc5fe60.png)

## 当時の問題点
- 本番環境及び開発環境へのDeployはCodeDeploy単体で実施
- ソースはGithub上で環境はAWS上にあり管理が面倒
- その他も色々あったけど忘れましたｗ

## 当時色々調べた結果
- デプロイを開発者がプッシュしたら開発環境に自動反映させたい
    - 当時はGit利用していたのでCodeCommitに移管する
    - CodePipelineを導入して自動反映させる

テスト自動化もしたいけど、まずはCodePipelineでCodeCommitとCodeDeployを繋げて自動化しよう！って方針に決まりました。
デプロイ自動化に併せてAWS構成を色々見直してみました。

## 2021年時点の社内システムのAWS構成がこちら

![社内システム構成図-2020(アイコン最新).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605889/2deef921-ca77-fa66-4fc3-4eacd5985d8a.png)

- 開発者がブランチにプッシュするだけでデプロイまで自動で走って幸せ
- なんと言っても僕の運用への負担が大幅に減った
    - これによって社内システム運用を強化するための時間が取れた
    - Lambdaを使ってのデプロイ通知、プッシュ通知をチャット連携できた（開発者がチャット上で確認できる）
- 開発者用のチャットグループへデプロイ通知を行った
    - これまでデプロイ担当者が「デプロイ完了しました」の通知を毎回行っていたのでその手間が省けた
- CloudWatch経由でのメール通知
- AWS WAFの導入
- 構成図からは省いていますがサブシステム構築があったためIDaaSサービスのAuth0を導入しました

## 積み残しの課題
- テスト自動化
    - CodeBuildを挟んでJenkinsなどと連携してテスト自動化したいが、テストコード作成に手が回らない
- AWSからの通知内容
    - JSONの生データをチャットで出力しているだけなんで、すぐに内容が読み取りづらい
- 本番環境も開発環境も全て同じAWSアカウント上に同居してる
    - 運用ミスで本番環境へデプロイやシステム追加によるネットワーク周りの調査などが本番環境もいるんでやるの怖い・・
- その他色々・・・

もっとこういう構成あるよ！とかあればコメントください。

次回は今回追加したCodePipelineの細かい話やAuth0などの記事を書こうかと思います。
docker環境＋vscodeでrubocopを有効にする方法

##動作環境
- ruby 2.6.6
- rails 6.1.0
- vscode
- docker 20.10.2

##この記事が役に立つ人
- docker環境上で既にrubocopを導入しており、コマンドライン上ではrubocopのコードチェック機能を使えるようになっていること


- 上記の条件を満たした上でvscodeでrubocopのコード自動チェック機能を使いたい人 

##問題
vscodeにruby-rubocopをインストールしたのだが、コードの自動チェック機能が使えなかった。
以下の記事によると、vscodeではdocker上のファイルをみることができないらしい？ので、**自分のPC内にdocker環境と同じバージョンのrubyとrubocop関連のgemをインストール必要がある**とのことだった.

>Ruby on Rails とかで docker 環境なのに #VSCode で ruby-rubocop 拡張を有効にするにはどうすれば良いのか？ ( #Rails #Ruby )
https://qiita.com/YumaInaura/items/5cb1387bb738349c5d9e

##解決策
自分のPC内に
ruby(2.6.6)
rails(6.1.0)
rubocop
rubocop-performance
rubocop-rails
をインストールした。

するとvscode上で以下のエラーメッセージが出てきた。

- rubocop is not excutable
- execute path is empty! please check ruby.rubocop.executePath

そこで、以下の記事を参考にexecutePathを設定した。

>[Mac]VScode で ruby-rubocop が動かなくなったら executePath を設定してみよう
https://qiita.com/tommy_aka_jps/items/ca7ae36717b69a7e390b

すると、エラーメッセージが以下のように変わった。

- rubocop.yml: Metrics/LineLength has the wrong name -spaceshould be Layout

そこで、以下の記事を参考にrubocop.ymlを書き換えた。

```ruby:rubocop.yml
# MetricからLayoutに変更
Layout/LineLength:
  Max: 160
  Exclude:
    - "db/migrate/*.rb"
``` 

>Ruby — rubocop のネームスペース変更に対応する
https://qiita.com/YumaInaura/items/53e14adaa5a00b6e59af

これで完了。

##確認方法
最後に、適当なファイルに明らかに間違えた書き方を書いてrubocop側からエラーが返ってきたら導入完了。
CUDAをCから呼び出す方法

#はじめに
自作ISLispインタプリタ・コンパイラにGPGPUの機能を追加しようとしています。float型の配列データを行列とみなしたCUDA利用の乗算と加算の関数が機能するようになりました。この間、CからCUDAを呼び出す方法について試行錯誤しました。わかったことを書き留めます。


#プラットホーム
現在利用している環境はLinux Mint 20.1 です。使用しているNVCCとGCCのバージョンは下記の通りです。

```
$ gcc --version
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Mon_Nov_30_19:08:53_PST_2020
Cuda compilation tools, release 11.2, V11.2.67
Build cuda_11.2.r11.2/compiler.29373293_0

```

#externが鍵
Lisp本体が記述されているCコードは従来通り、GCCでコンパイルします。CUDAコードはnvccでコンパイルします。最終的にリンクするときにはnvccをリンカとして使用します。cublasライブラリを使うファイル、後述する '__NVCC__'ディレクティブを使うCファイルはnvccでコンパイルしてます。

ポイントはextern宣言です。呼び出される側のCUDAコードにexternを記述します。

例

```
kernel.cu  cuda-file
extern "C" void cuda_add(float *a, float *b, float *c, int n);

```

#ifdefの利用

```
__NVCC__
```

これが使えます。これによりnvccでコンパイルされているのか、GCCでコンパイルされているのかを判定しつつGPUのために必要なコードを生成しています。


#シームレス
Lisp処理系自体にCUDAコードを埋め込んでしまいます。ですから、データ転送のためのタイムロスがありません。ElixirやRuby、Pythonから他言語呼び出しを使う場合には少なからずタイムロスが生じます。Easy-ISLispの場合には処理系をCUDAでコンパイルしてしまいますのでこうした問題が生じません。CUDAをお手軽に利用することができます。これとLispのもつ柔軟性、生産性の高さが合わさるとDeep-Learningの計算実験にいくらかでも寄与できるのではないかと期待しています。

#Github
ソースコードはここにおいてあります。gpgpu.cとkernel.cu がGPU利用のためのものです。
https://github.com/sasagawa888/eisl
Discord上でチェスを遊ぶ

# はじめに

趣味の領域を出たことがないので、もっときれいに書けるとかありましたら優しく教えて下さい。

# やりたいこと

discord.pyとchessのパッケージを使用してDiscord上でchessの対戦ができるようにする

# 準備
[discord developer portal](https://discord.com/developers)で登録を済ませトークンを取る
discord.pyのインストール```py -3 -m pip install -U discord.py```
chessのパッケージインストール```py -m pip install chess```

# コード

```python:ChessBot.py

import discord
import chess
from discord.ext import commands

token = "token"

bot = commands.Bot(command_prefix="!")
board = None

@bot.event
async def on_ready():
    print("ready")

@bot.command()
async def start(ctx):
    global board
    board = chess.Board()
    await ctx.send("ボードを作成しました")
    await ctx.send("```" + str(board) + "```")

@bot.command()
async def move(ctx,movePos):
    global board
    if board == None:
        await ctx.send("ボードが作成されていません")
        return
    try:
        board.push_san(movePos)
        await ctx.send("```" + str(board) + "```")
    except:
        await ctx.send(movePos + "は有効な値ではありません")
        a = ""
        for i in board.legal_moves:
            a += str(i) + ","
        await ctx.send("> " + a)
    if board.is_game_over():
        await ctx.send("game over")
        board = None

bot.run(token)
```

# 結果
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374501/152cde1a-f6ef-03ad-147d-135a7b979cb4.png)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374501/4f0bb1eb-5968-e502-85d5-0c316186830c.png)

#つまづいたところ
自分の書いたのは間違っていないのに何やらいっぱいエラーが出てくる（connector.pyやhttp.py）

## 解決方法
原因はSSL証明書の期限切れらしいから新しい証明書をインストールすればいい
1. IEを管理者権限で実行
2. 鍵マークのところを押して証明書を表示
3. インストール

# 最後に
有効な値を取得できなかった際に```legal_moves```を使い移動できる場所をそのまま表示させていたけれど、不必要なものまで表示されてしまったからforで回して結合していった。あそこの部分は綺麗に書ける気がする。  
せっかくctxでユーザ情報を取得できているのでdict利用してユーザごとの勝敗など作ってみたい。
## 参考
https://discord.com/
https://pypi.org/project/chess/
https://teratail.com/questions/267889
OracleBronze　勉強記事１

#はじめに
最近資格勉強をしていた私ですが、あまり効果がみられないため
今日から実験的に資格の取り組みをアウトプットするために記録していきます。
このシリーズで掲載内容に重複がある場合は二回間違えたということ。
#今日間違えた問題の復習
##FM修飾子
to_char()の中で使われるもの。
FMとは
　FIill Mode(埋め込みモード)
効果：0埋めを削除する。
備考：複数回指定できる。
複数回指定した場合
　1回目は適用、2回目は適用解除、3回目は適用というように制御する箇所を指定できる。
　　to_char(sampledate,'<font color="Red">fm</font>MM-DD-RR <font color="Red">fm</font>HH24:MI:SS') 
  　　→9-1-5 09:16:00
　　fmMM-DD-RR 1回目のfmで0埋めを消しているため　「9-1-5」
　　fmHH24:MI:SS 2回目のfmから0埋めを無効にしている　「09:16:00」
　　sampledate　= 2005/09/01 9時16分00秒(09-01-05 09:16:00)の場合
##外部結合
 外部結合を実際にテーブル間の図を書いてみて結果が仕様と合っているか把握する。
　A left outer join B left outer join C 　 //AとBとCを結合した結果
  A left outer join (B left outer join C) D　//AとD(BとCを結合した結果)
##外部キーの親キーの削除について
デフォルトは削除できない。
削除するには
　<font color="Red">ON DELETE</font>のオプションをつける。
 <font color="Red">ON DELETE CASCADE</font> 　// 親テーブルを削除すると、子テーブルの参照している行も削除される
   <font color="Red">ON DELETE SET NULL</font>　// 親テーブルを削除すると、子テーブルの参照している行にNULLが設定される
損益分岐点問題の視覚的解法

令和3年度春期試験の申し込みが始まっていますね！
私は令和元年度秋期の基本情報を受験しましたが、実際に取り組んでみると範囲の広さに驚きました。
せっかく学習したので、その中で得たことを記録として投稿します。

# 損益分岐点とは
私もそうですが、理系出身者にはあまり馴染みのない概念で、ストラテジ系はついつい後ろに回しがちな分野かと思います。
Wikipediaによる説明は以下の通りです。
>[損益分岐点](https://ja.wikipedia.org/wiki/%E6%90%8D%E7%9B%8A%E5%88%86%E5%B2%90%E7%82%B9)
> 売上高と費用の額がちょうど等しくなる売上高または販売数量を指す。～(以下略)

設問の規模としては午前問題の最後の方に１問あるだけなので大したウェイトではないですが、得点源にできればそれだけ得になります。
自分が学習に使用した教材では文章の説明しかなくイメージしにくかったので、グラフ化して考えてみました。
グラフで視覚化してみると意外とスッキリしていることに気が付きます。内容的には中学数学で習うレベルかと思います。

# 図解による説明
グラフで書いてみると以下の通りです。
![損益分岐点.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575325/95973500-a766-bc26-c94b-dfc6e112e2e8.png)

総費用(=固定費＋変動費)は以下の１次関数で表現されます。

```math
y = ax + b\\
 \quad(a:変動費率=\frac{変動費}{売上高}、b:固定費)\\
```

ここで、売上高の直線を便宜上$\,y=x\,$とします。
損益分岐点は総費用と売上高の交点なので、損益分岐点を求めなさい、という問題なら$\,x=ax+b\,$を解けばいいことになります。
これより、損益分岐点$\,x_0\,$は以下の通りになります。

```math
x_0=\frac{b}{1-a}
```

便宜上としたのは、上記を説明するためでした。
損益分岐点の公式は文章で書かれても何？？って感じですが、グラフで捉えるとイメージしやすいかと思います。

# 出題例
受験した令和元年度秋期の過去問を引用しました。

> 出典：令和元年度 秋期 基本情報技術者試験 午前
> 問78　売上高が100百万円のとき、変動費が60百万円、固定費が30百万円掛かる。変動比率、固定費は変わらないものとして、目標利益18百万円を達成するのに必要な売上高は何百万円か。
> ア　108　　イ　120　　ウ　156　　エ 180

設定をグラフ化すると、以下の通りです。
![損益分岐グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575325/95ac1dd1-e3f8-748a-9393-27af49dd9796.png)

まず、切片$\,b\,$は固定費なので$\,b=30\,$です。
問題文から、変動費率$\,a=\frac{60}{100}=0.6\,$となります。
よって総費用の式は以下の通りとなります。

```math
y=0.6x+30
```
目標利益における総費用を$Y_1$、売上高を$Y_2$とすると、以下の関係が成り立ちます。

```math
\begin{align}
Y_2-Y_1&=18\\
X-(0.6X+30)&=18\\
\therefore X=120
\end{align}
```

よって、売上高は(イ)120百万円となります。

# 終わりに
某スクールTの模試で損益分岐点について出題されていて、受験時は何かわかりそうでよくわからずという状態でした。
解説も文章で書かれているだけでイメージがつきにくかったので、グラフにしたらどうかな？と思い上記を考えてみると、そういうことか！となりました。
本番でたまたまほぼそのまま出題されたのもラッキーでした。前回(令和元年度秋期)出たので今回(令和3年度春期)は出題されないかもしれませんが、概念自体は今後仕事をする上で大切なものだと思いますので、文字通り覚えていて損はないかと思います。

# 参考サイト
+ [IPA(情報処理推進機構)](https://www.jitec.ipa.go.jp/1_04hanni_sukiru/_index_mondai.html)<br>
過去問を引用しました。IPAでは過去問の使用に際し、許諾や使用料は不要だが出典を明記すること、となっています。
- [Qiitaの数式チートシート](https://qiita.com/PlanetMeron/items/63ac58898541cbe81ada)<br>
Markdown記法での数式記述方法を参照しました。
@nuxtjs/composition-apiでCan't resolve 'fs'エラーが発生する

Nuxt.jsで`@nuxtjs/composition-api`をimportしてComposition APIを使おうと思ったら下記のようなエラーが発生してしまった

```
ERROR in ./node_modules/@nuxt/utils/node_modules/fs-extra/lib/index.js
Module not found: Error: Can't resolve 'fs' in '..../node_modules/@nuxt/utils/node_modules/fs-extra/lib'

ERROR in ./node_modules/@nuxt/utils/node_modules/jsonfile/index.js
Module not found: Error: Can't resolve 'fs' in '..../node_modules/@nuxt/utils/node_modules/jsonfile'

ERROR in ./node_modules/fs-extra/lib/index.js
Module not found: Error: Can't resolve 'fs' in '..../node_modules/fs-extra/lib'

ERROR in ./node_modules/graceful-fs/graceful-fs.js
Module not found: Error: Can't resolve 'fs' in '..../node_modules/graceful-fs'

ERROR in ./node_modules/jsonfile/index.js
Module not found: Error: Can't resolve 'fs' in '..../node_modules/jsonfile'
```

## 試したこと
下記記事を参考に、nuxt.config.jsのbuildに`fs: "empty"`を追加した

- [Nuxt.jsでModule not found: Error: Can't resolve 'fs' in ' エラーが出た時の対処法 - Qiita](https://qiita.com/TK-C/items/9d4c8cda518ba1def2b2)

さっきのような`Can't resolve 'fs'`エラーは起きなくなったが、代わりに以下のようなエラーが起きるようになってしまった

```
client.js?06a0:96 TypeError: Cannot read property 'native' of undefined
    at eval (index.js?ec2f:126)
    at Object../node_modules/fs-extra/lib/fs/index.js (index.js:700)
    at __webpack_require__ (runtime.js:854)
    at fn (runtime.js:151)
    at eval (index.js?83ef:5)
    at Object../node_modules/fs-extra/lib/index.js (index.js:712)
    at __webpack_require__ (runtime.js:854)
    at fn (runtime.js:151)
    at Object.eval (index.js?f544:6)
    at eval (index.js:853)
```

## 原因と解決策
nuxt.config.jsの`buildModules`に下記を追加していなかった

```nuxt.config.js
export default {
	// 省略
	buildModules: [
		'@nuxtjs/composition-api'
	],
}
```

[公式ドキュメントのQuick start](https://composition-api.nuxtjs.org/getting-started/setup)に思いっきり書いてあるのに、それを読まず`@vue/composition-api`と同じようなやり方でやろうとしたのが原因…

「まずは公式ドキュメントを確認しろ」なんて散々言われてるのに、それを怠ったばっかりに数時間躓いてしまって惨めな気持ちになりました

**まずは公式ドキュメントを確認しましょう！！！！**
Nreal Lightでキャラクター表示（準備編）

#はじめに
ここではNrealLightでキャラクターを表示する下準備として、Unityを使ったAndroid開発のためのセットアップについて説明を行います。Unityに関してはある程度は使える前提で進めます。
本編はこちらです。
https://qiita.com/yambowcto/private/a973252e25cb9e5d44d7

#Unityのインストール
Nreal Developer の説明にあるように Unity2019.4 LTS をインストールします。
ここでは2019.4.16f1をインストールしました。
また、インストール時には Android Build Support にチェックを入れて下さい。
Android SDK & NDK Tools と OpenJDK にもチェックが入っていると次に説明するAndroid SDK をインストールしなくても自動的にインストールされパスも設定してくれます。
ただし、指定したいTarget API LevelのSDKバージョンが入っていない場合は別途必要になるので、次に説明するAndroid Studioを入れた方が自分的には分かりやすいと思ってます。

#Android SDKをインストール
まずは公式サイトからAndroid Studioをダウンロードします。
https://developer.android.com/studio?hl=ja
基本的にはデフォルトのままで進めていけばOKですが、Android SDKの場所がちょっと深いので分かりやすい場所にした方がいいかもしれません。(ここではデフォルトのままでの説明となります）

Android Studioのインストールが終わったら起動して、右下辺りにある Configure > SDK Manager を選択します。
Android SDK の必要なバージョンにチェックを入れてインストールします。
※ NrealLightの開発にはAndroid SDK 8.0（APIレベル26）以上が必要です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837803/d736dc3e-d799-af4b-a4f7-ef896b882a86.png" width="800">

#UnityのAndroidSDKパス設定
メニューのEditからPreferencesを選択、ExternalToolsのAndroid SDK Tools Installed with Unityのパスを変更します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837803/65e4cbae-f907-dfa1-c30d-a4e1f0224ff5.png" width="400">

##Android Debug Bridge（adb）コマンドのパスを設定
adbコマンドを使用するためのパスの設定を行います。
これは必須というわけではないですが、NrealLightをスマートフォンに接続したままUnityで作成したapkファイルをWi-fiでインストール出来るので便利です。

まず、コントロールパネルのシステムを開きます。(ショートカット：Windowsキー + Pause)
次にシステムの詳細設定を開いて環境変数ウィンドウを表示します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837803/79b96409-6676-9d61-d077-9bba53b5e52a.png" width="800">
Pathを選択し、編集、新規でパスを追加します。
追加するパスはAndroidSDKのパスに`platform-tools`を付け加えたものになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837803/7ef87705-d2f8-aa12-6f27-133e20c0c70c.jpeg" width="800">

コマンドプロンプトからadbと入力して決定、エラーが出なければOKです。
コマンドプロンプトはWindows10の場合は検索ボックスでcmdと打つと出てきます。あるいは、スタートメニュー > Windowsシステムツール からでも見つけられます。よく使うのでタスクバーにピン止めしておきましょう。



#Android端末の設定
Android端末の開発向けオプションを有効にします。
この設定を表示するには、端末やOSのバージョン等によって違いがあると思うので分からない場合は検索してみて下さい。
Xperia 5ⅡSOG02 (Android 10)の場合だと、設定 > デバイス情報 > ビルド番号を７回タップすると表示されます。
表示される場所は、設定 > システム > 詳細設定 > 開発者向けオプション となりますので、その設定内のUSBデバッグを有効にしてください。許可するか表示されるのでOKを押します。
※ USBデバッグを有効にしたままにすると動作しないアプリなどありますので、必要ない場合は無効にしましょう。

#おわりに
一部手かなり抜きな説明ですが、以上が基本的なUnityでAndroidアプリを開発するための下準備になります。
Rails must be exist系のエラー(@saveが実行されない)

## 結論

belongs_toにoptional: trueを追加。

```ruby
belongs_to :post, optional: true
```

## なぜか？

Rails5から、デフォルトで紐づけているテーブル同士の、どちらかにデータが無いままDBに格納しようとすると、エラーになる。だから、どちらにデータがない状態のままでもokに」するために'optional: true'を書く必要がある。
inner join で update

# 初めに
よく使うけど忘れてしまうので記録として。

##inner join で 結合したものをupdateしたい
```
UPDATE TableA 
  INNER JOIN TableB ON TableA.code_A = TableB.code_B 
    SET TableA.column_A = TableB.column_B 
  WHERE TableA.flag='1';"

```

## もう一つ結合
```
UPDATE (TableA 
  INNER JOIN TableB ON TableA.code_A = TableB.code_B)
　INNER JOIN TableC ON TableA.code_A = TableB.code_C 
    SET TableA.column_A = TableB.column_B 
  WHERE TableA.flag='1';"
```
Arduino用のI2CデバイスドライバをRaspberry pi用としてPythonに翻訳する

#Arduino用のI2CデバイスドライバをRaspberry pi用としてPythonに翻訳する
ロボットを作ろうと思って使えそうな部品がないかと押し入れを探したところ、昔Raspberry pi用に買ったもののArduino用のライブラリしか用意されてなくてお蔵入りになっていたモータードライバ(GroveのI2C Motor Driver V1.3)を発見。補講日で暇だったのもありRaspberry pi用にpythonで翻訳することにした。

##I2C通信とはなんぞや
今回のモータードライバはI2Cという通信方式でマイコンと通信をするのでまずはその理解から始めることにした。

うまくまとめられないので詳しいことはこちらのサイトさん([I2C通信の使い方][1])に任せるとして、
ざっくりいうとこんな感じで通信するらしい。

1.通信の初期化後マスタ側から今から通信するスレイブのアドレスを送信
2.スレイブから応答があった後データを送信
3.通信の終了

##Arduinoの方のプログラムの理解
なんとなくI2C通信の方式が分かったのでArduino用のサンプルプログラムでどう書かれてるかを見た。(通信部分だけの抜粋)

```
Wire.begin();
delayMicrosecond(10000);

Wire.beginTransmission(i2c_add);
Wire.write(0x82);
Wire.write(0x0a);
Wire.write(0x01);

Wire.endTransmission();
```

ざっくり解説すると、1,2行目で通信の初期化をして、4行目でスレイブのアドレスを送信。5~7行目でデータの送信。9行目で通信の終了といった感じだった。

##Raspberry pi用に書き直す
I2C通信に関して一から作るのはめんどくさいので、Raspberry pi用の通信ライブラリsmbusを使うことにした。これを使うと、

```
import smbus
i2c = smbus.SMBus(1)
i2c.write_i2c_block_data(i2c_add,0x82,[0x0a,0x01])
```
こんな感じに3行で収まってしまった。

1行目はライブラリのインポート、二行目は通信用のインスタンス作成、Raspberry piではI2Cのバスは1を使う(よくわかってない)のでここはSMBus(1)らしい、三行目が通信の命令文。

ここで引数の0x82,[0x0a,0x01]で前一つ、後ろ二つで分かれている理由は、
Arduino側ではすべてWire.writeで書かれてる0x82,0x0a,0x01の三つに関して上では"データ"とひとくくりにしてしまったが、0x82がスレイブ内にあるレジスタのアドレス、0x0a,0x01がそのレジスタに書き込むデータと意味合いが少し違うものだからだった。

##まとめ
smbusを使えば大体上の三行で通信については書き換えできて、特に重要なのは
```
i2c.write_i2c_block_data(スレイブのアドレス,レジスタのアドレス,[書き込むデータ])
```
この一文。今回は書き込むデータが1byte以上なのでこの命令を使ったが、1byteなら
```
i2c.write_byte_data(スレイブのアドレス,レジスタのアドレス,書き込むデータ)
```
こちらを使用、どちらの命令文も二つのアドレスおよびデータはint型で指定でOK。
[1]:http://www.picfun.com/c15.html#:~:text=I2C%EF%BC%88Inter%2DIntegrated%20Circuit%EF%BC%89,%E3%82%92%E5%AE%9F%E7%8F%BE%20%E3%81%99%E3%82%8B%E6%96%B9%E5%BC%8F%E3%81%A7%E3%81%99%E3%80%82
CloudFrontキャッシュを削除状況をAWS CLIでチェックするシェルスクリプト

以前「[**CloudFrontキャッシュを削除するシェルスクリプトを書いてみた。**](https://qiita.com/yuusuke510/items/72c2bcfb4ab0de77d00b)」という記事を書きましたが、Invalidationはすぐ完了しない場合がもあるので処理状況をチェックすることがあるわけですが、それも AWS CLI でチェックすればいいやということで、シェルスクリプト書いたのでまとめます。

# 概要

AWS CLI で CloudFrontキャッシュの **削除リクエスト** のステータスチェックをおこなう処理をシェルスクリプト化。
キャッシュ削除のスクリプトに組み込めないかなと思ったけど、チェックリクエストだけ何回かおこなう可能性があり、また、**Completed** ステータス判定もちょっと面倒そうだったので別スクリプトにしました。

# 必要な準備

まずは AWS CLI の実行環境が必要なので、前回の記事の内容をやってみてください。

[**CloudFrontキャッシュを削除するシェルスクリプトを書いてみた。**](https://qiita.com/yuusuke510/items/72c2bcfb4ab0de77d00b)

## 状況チェックに必要なもの

`aws cloudfront get-invalidation` コマンドを叩くわけですが、引数に **Distribution ID** と **Invalidation ID** が必要になります。（AWS環境を複数持っている人は **profile** なども必要になります。）
**Invalidation ID** は **Create Invalidation** した時に発行されるIDです。

ちなみに `aws cloudfront get-invalidation` で、**Invalidation ID** の引数パラメータは **id** という名称になります。

## 目的のシェルスクリプトを書く

第１引数に **Invalidation ID** を受け取れる想定

```bash
#!/bin/bash
dist_id="ABCDEFGHIJKL"
prof_name="hogehoge"
id="$1"
echo "CloudFront invalidation status check ..."
echo "invalidation-id:$id, distribution-id:$dist_id, profile=$prof_name"
echo -e `aws cloudfront get-invalidation --distribution-id $dist_id --id $id --profile $prof_name | jq -r '.Invalidation | {id: .Id, status: .Status}'`
```

ちなみに **Invalidation ID** とは、**Create Invalidation** した時にAWSから自動的に払い出されるIDのことです。
（↓これです）
![AWS_CloudFront_Management_Console.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130681/336557fd-910c-144d-80a0-0f09ee5a75b8.jpeg)


## 実行してみる

完了していない時のステータス

```bash:完了していない時のステータス
❯ ./checkStatusInvalidation.sh LKJIHGFEDCBA
CloudFront invalidation status check ...
id:ABCDEFGHIJKL, distribution-id:ELKJIHGFEDCBA, profile=hogehoge
{ "id": "ABCDEFGHIJKL", "status": "InProgress" }
```

完了している時のステータス

```bash:完了している時のステータス
❯ ./checkStatusInvalidation.sh LKJIHGFEDCBA
CloudFront invalidation status check ...
invalidation-id:ABCDEFGHIJKL, distribution-id:ELKJIHGFEDCBA, profile=hogehoge
{ "id": "ABCDEFGHIJKL", "status": "Completed" }
```

※AWSからのレスポンス（JSON）上、**Invalidation ID** のキー名は **id** と表記されています。
sublime Text 3でBOM対策をして無用なエラーを回避しよう!!

## BOMって?
**`Byte order Mark`** の略。
数ある文字コードの一つ、`Unicode`でテキストファイルなどを符号化した際に先頭に付けられる、どんな情報なのかを説明する文字列のこと。
メモ帳などから確認することはできない。

`Excel`などで`BOM`がないテキストファイルを開いても、どの文字コードで作成されているのかが識別できず、その中身を確認できないことがある。
しかし、テキストファイルを読み込むようなプログラムで`BOM`があるテキストファイルを読み込むと、エラーを吐き出したり、予期していない動作をすることがあるため、対策が必要なことも。
`BOM`は用途によって、その存在の重要性が大きく変わる。

テキストファイルを読み込むプログラムを組んだ際、どこも問題はないのにエラーが吐き出されることがあったら、`BOM`の存在を疑ってみては。

## sublime Text 3からBOMがあるかどうかを知る
まずは`sublime Text 3`のユーザー設定を変更して、現在作業しているファイルの文字コードを表示させる。

画面上部にあるタブから`Preferences`を選んでクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/9f90daf8-52db-db30-d7fe-30f1ef5468cb.png)

`Preferences`内のメニューが表示されたら、`Settings`をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/c6de6a38-6693-5ce0-e590-ade644b75e66.png)

左側のパネルから`show_encoding: false`を探し、コピー。
その後、右側のパネルに貼り付けて、`false`を`true`に変更し、上書き保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/6fdaba78-8c64-947a-62e0-304681027fc2.png)

そうすると、画面右下に文字コードが表示されるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/d7fc180c-7f87-8aca-223a-f82da1d79bb8.png)

この状態で`BOM`があるテキストファイルを開くと、このように表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/031ca0bd-5060-7e13-004a-f66dfa948546.png)


## sublime Text 3でBOMを削除する
**Q. このテキストファイルにBOMが付いてるのはわかったけど、BOMを削除するにはどうすれば?**
**A. `sublime Text 3`から`エンコーディングして保存`をするだけ。**

画面上部の`ファイル`タブを開き、`Save with Encoding`から保存したい文字コードの形式を選択するだけ。
`with BOM`が付いてる文字コードか、そうでない文字コードかを選ぶだけで、`BOM`を削除したり、付与したりすることができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/f697e2e8-cc73-364b-c5e7-e06f4f7dfe01.png)


**文字コードや`BOM`の有無を確認して、予期せぬエラーと出会わないようにしよう!!**

## 参考記事

- [UTF-8のBOM付き・BOM無しの違いと確認方法 | UX MILK](https://uxmilk.jp/48923)
- [Sublime Text 3：編集中のファイルの文字コードを表示する](https://at.sachi-web.com/blog-entry-1381.html)
プログラミングスクール卒生を採用した話

最近、SNSでプログラミングスクールについて色々な投稿を見かけますよね。
で。流れに乗って採用した側の話を書いてみようかなと思いました。
（勢いで書いたので消す可能性もありつつ）


##弊社についてざっくり
一言で表すと、最近悪とされている「SESをやってる会社」です。社員も十数名と小さな会社です。
金融系の基幹機系の現場に行っている人〜フルリモートでWebアプリを作っている人、それぞれ言語もバラバラです。
最近の悩みは高齢化です。
###私についてざっくり
かれこれ20年弱この業界にいて、SES、受託開発、自社開発と経験をしていますが、一番長いのはSES、という人間です。
金融系から入り、気がついたらPHPのエンジニアになっていました。
SESでエンジニアとして従事している側、人事、営業、を兼務している、一見するとブラックに見えるかもしれない働き方をしていますが、本人はとても充実した日々を過ごしています。

##そもそもなぜスクール卒を採用することになったのか
会社を設立してから表立った採用を行ったこともなく「縁故採用」を繰り返し行ってきました。当初はそれでよかったのですが、今のままだと高齢化してしまう傾向にあり、若い風、新しい風を入れたかった、というのがあります。
そんな折に参加した交流会で、プログラミングスクール卒業生の採用を斡旋している企業の紹介を受けました。
ざっくりと以下の点が売り文句になり、それを「良い」と思いました。

- 前職をやめてスクールに参加しているため、意気込みが違う
- 自分でお金を払ってスクールに通っている（ので意気込みが違う）
- エンジニアになるということの厳しさを伝え、エンジニアになる決意の確認を行っている

エンジニアは楽じゃないってことを事前に伝えているというのも良いなーと思いました。特にうちみたいなSESでしかも何百人もエンジニアが参画しているような大規模案件だと、想像してたのと違う、になりかねないですから……ね。
あと、社会人経験があるならそこの教育も省けるね、ってのも理由になりました。

##採用基準
採用基準はざっくりと以下の3点です。技術力は後からつければいい、という考えなので、人物やポテンシャル重視です。正直な話、SESの会社ではそんなに高望みできないと思っています。エンド直案件とかあれば別かもしれませんが、ね。

- 既存メンバーと合うか
- いい人
- コミュニケーション能力

## 面談をしてみて

###いいな、と思った人の特徴
採用したい！ って思わせる人はやはりいます。面接をした6人中2名は以下ほとんどに当てはまり、本当に採用したかったです。

1. 会話が成り立つ
2. 主体性がある
3. 目標がはっきりしている
4. 将来のビジョンがはっきりしている
5. 成果物を提出後もブラッシュアップしている（ポートフォリオにするためにAWS契約してサーバ立てて面接時にデモンストレーションしたり）

###ごめんなさい、と思った人の特徴
……なかったです。
みなさん社会人経験があるからか大抵上記の1には当てはまるからです。あとは素直でいい子そうだなー、とか、きっとこの社員と話が合うんだろうなーとか、プラスな印象しかなかったです。

## 採用をしてから
いざ採用してみると当然困りごとも出てきます。
2名採用したのですが（上記とは別の方です）、その2名が対極的で、一人は手がかからず自発的に進んでいくタイプで、もう一人は……下記の通りです。
###困ったこと
大きなところとしては、プログラミングスクールはその名の通り「プログラミング」しか教えていないので、ITとはなんぞやから教えないといけなかった点です。

1. インターネットの仕組みがわからない
2. 当然ながらWebサイトが表示される仕組みもわからない
3. サーバって何それ、美味しいの？
4. 思っていた以上に覚える（学習する）ことが多い現実を突きつけられて挫折しかけた
5. 自己学習の習慣がない（業務外の勉強について抵抗がある）

正直なところ、1〜3 はスクールでやってきているものだとばかり思っていたので（カリキュラムをちゃんと確認しろ案件ですが）、まさかここまでとは、というコストです。面接の時に分からなかったのかよ、というお叱りの言葉を受けても反論の余地がありません。本当にその通りなのですが、色々事情がありました。
あと、新卒採用時に使う外部の言語研修とは、内容も目的も違うものなのだとここで初めて知りました（スクールにもよると思います）。

###よかったこと
もちろんよかったこともありますよ。

- 早々に既存メンバーと馴染んだ

それだけかよ！ と思われるかと思いますが、これは結構重要で、気軽に相談できる先輩社員がいるというのは大きいと思っています。昨今若手を採用していて思うのは、メンタル面でのケアを手厚くしていかないと挫折してしまったり体を壊してしまったりすることが多いということです。結果、辞めていってしまった前例もあるので、同じ徹は踏まないぞ、ということでできるだけ相談しやすい環境作りに努めています。

###みなさんのおっしゃる通り、なところもある
自己学習や自発的に何かやると言う点ではやはり劣るものがありました。でもこれから身に付けてくれたら御の字で、エンジニアの中にはこういうタイプでも仕事している人はいるのだから、スクール卒は〜とか言いたくないなって思ってます。
向いてるか向いてないかで言ったら向いてないかもしれないけれど、向いてないからってエンジニアになっちゃいけないことなんてないですから。

##最後に、思うところ
###未経験は未経験だけど
新人採用時に使用していた外部の言語研修くらいはやってきているだろうと思っていたので想定外でした。スクールに通ってても、未経験は未経験なので、コーディングする力はさておいて、成果物がどんなに悪くても、実務に入ってみて、実は応用力があってどんどん吸収していって……ということがありました。人の隠れた能力って本当に分からないです。いつその人が開花するか、またはしないのか、採用なんてバクチなので、そのワクワク感がよくないですか。
###単純にコストとは言えない
紹介手数料は理論年収の30%と決して安くはない金額でした（採用と言う点では一般的？）。金額に見合うか見合わないかはまだ分からないかな、と（希望的観測です）。
将来的にみたらトントンかそれ以上に化けるかもしれない、いや、化けてくれ！ と思ってしまうのですが、きっと化けたらSESなんてやってられない、って辞めてしまいそうです。そうでなくても、そのうちSESは嫌がるかもしれません。すぐに転職してしまうかもしれない。けれど、それがその人のためになっているのならば、社会貢献だったと思って笑顔で手を振りたいと思います。この辺りは、普通の採用と同じことではありますね。
###後悔はしていない
採用したことに対して後悔はしていません。

IT業界は怖くないよー。
Next.jsをSSRでFirebaseデプロイ

#はじめに
next.jsをSSR（サーバーサイドレンダリング）でデプロイをしようと思い、
思いのほか、手間取ったので、ここでアウトプットしておきまーす！

next.jsを**SSG（static generation)静的ビルドする場合はnext exportでoutディレクトリ**で良かったのですが、

**SSRする場合は、cloud functionsをつかって、サイトアクセス時にHTMLを生成しないといけない**ようです！

#デプロイまで

まずいつも通り

firebaseのコンソールでプロジェクトを作成しておいてください！

```
npx create-next-app your app
cd your app
//firebaseをグローバルインストールしていない方は
npm install -g firebase-tools
firebase login
firebase init 
//ここではhostingとfunctionsのみ選択そして既存のプロジェクトIDを選択
```

###buildディレクトリ設定

```
module.exports = {
  distDir: "./.next",
};
```

今回は**server-side-renderingなのでbuildファイルは、.nextディレクトリになります！**

###firebase周りの設定

```:.firebaserc
{
  "projects": {
    "default": "your-projectId"
  }
}
```

```:firebase.json
{
  "hosting": {
    "public": "public",
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
    "rewrites": [
      {
        "source": "**",
        "function": "nextjsFunc"
      }
    ]
  },
  "functions": {
    "source": "./functions/",
    "predeploy": [
      "npm --prefix \"$PROJECT_DIR\" install",
      "npm --prefix \"$PROJECT_DIR\" run build"
    ],
    "runtime": "nodejs10"
  }
}
```

functionsのパスを設定
predeployでデプロイ前installとbuildをデフォルトで行うようにする

###cloud functions関数作成

```js:functions/index.js
const { https } = require("firebase-functions");
const { default: next } = require("next");

const isDev = process.env.NODE_ENV !== "production";
const nextjsDistDir = require("./next.config.js").distDir;

const nextjsServer = next({
  dev: isDev,
  conf: {
    distDir: nextjsDistDir,
  },
});
const nextjsHandle = nextjsServer.getRequestHandler();

exports.nextjsFunc = https.onRequest((req, res) => {
  return nextjsServer.prepare().then(() => nextjsHandle(req, res));
});
```

これで

```
firebase deploy --only functions,hosting
```
サーバーサイドレンダリングのデプロイが完了
RDSの拡張モニタリングのメトリクスをCloudWatchに表示する

# やりたい事
AWSのRDSで拡張モニタリングを有効にすると、見る事ができるメトリクスが増えます。
ですが、この拡張モニタリングのメトリクスはそのままではCloudWatch側に表示できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472216/c1f1950c-f76b-dde4-0267-e3b339475e42.png)
RDSのディスク使用率をCloudWatchのダッシュボードでまとめて見たかったので、
拡張モニタリングのメトリクスをCloudWatchで扱えるように設定してみました。

（ここでは拡張モニタリングの有効化については記載しません）

# CloudWatchLogsからカスタムメトリクスを登録する

[CloudWatch Logs を使用した拡張モニタリングの表示](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_Monitoring.OS.html#USER_Monitoring.OS.CloudWatchLogs)
>DB インスタンスの拡張モニタリングを有効にした後、CloudWatch Logs を使用して DB インスタンスのメトリクスを表示できます。

拡張モニタリングのデータはCloudWatchLogsに保存されているようです。
CloudWatchLogsからカスタムメトリクスを登録します。

## カスタムメトリクス登録手順
1. CloudWatchのロググループから `RDSOSMetrics` を検索して選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472216/ce0074ea-6a3c-d605-2835-4d3e89963364.png)

2. `メトリクスフィルターを作成`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472216/1374965b-4b8d-2d23-e642-b5cd0f0af42b.png)

3. 集計したいメトリクスに合わせた`フィルターパターン`を設定します。
フィルターパターンについては後述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472216/12508fa7-cd13-108b-6fa2-fc34c6edeb6a.png)

4. 各種情報を入力して、メトリクスフィルターを作成します。
メトリクス名前空間名とメトリクス名は、次の手順の画像を見てください。
メトリクス値については、後述のフィルターパターンを参考にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472216/72fa92cd-ebae-6089-87c1-67c2a4d8ddb1.png)

5. メトリクスにカスタムメトリクスが表示されるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472216/018b77ed-5425-b6be-8d35-aaa7847ea4fc.png)

## フィルターパターンについて
一番ポイントになりそうなフィルターパターンについて。

公式資料はこちら。
[ログイベントの語句の一致](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html#matching-terms-events)

拡張モニタリングのデータはJSON形式なので、JSONのパターンについて説明します。
利用できるメトリクスはここに一覧があります。
[使用可能な OS メトリクス](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_Monitoring.OS.html#USER_Monitoring-Available-OS-Metrics)

データ構造は実際のデータ見た方が早いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472216/5c9b0c9e-31e6-2ba6-c8a4-15de6731e108.png)

メトリクスの指定方法はjqコマンドと同じ感じ。
正規表現ではなく、ワイルドカードとして`*`が使えます。（他にもあるかも）

例として、Auroraのディスク使用率を取得するフィルターパターンはこんな感じでした。

```
"{ ($.instanceID = "dbname") && ($.instanceResourceID != "*-secondary") && ($.fileSys[0].usedPercent = *) }"
```

そして、メトリクス値に`$.fileSys[0].usedPercent`を指定すればディスク使用率を取得できました。

# さいごに
記事書いてる最中に見つけたのですが、似たような公式の記事もありました。
[拡張モニタリングの CloudWatch Logs をフィルタリングして、Amazon RDS のために自動化されたカスタムメトリクスを生成するにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/custom-cloudwatch-metrics-rds/)

若干手間ですが、目的は達成できました。
たくさん登録するならTerraformみたいなコード上でコピペが楽でした。
FileMaker 変数の添え字に変数を使う

FileMakerでスクリプトを書く場合、変数(配列)の添字に変数を使いたい。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13513/2d8a3fa6-944b-26b9-c214-45d7cc5af421.png" width="300">

を、

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13513/866bec71-f6b9-c5fa-f6c2-f6027dc002f5.png" width="300">

こうしたい場合、

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13513/7bdaa323-0abb-f43b-6d44-a13fa2844338.png" width="400">

と書くと、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13513/fd65ac97-77eb-75bf-8a51-a45cd5e25719.png" width="400">

「選択された名前は下記の理由にて使用できません」となる。

・・・(ﾟДﾟ)ﾊｧ?となる。

配列として処理したい変数の添字に変数を使いたい場合、繰り返しの部分に変数を入れると、、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13513/a2313305-6e17-528f-db17-68c0a22d3f7f.png" width="400">

結果としてこう出来る。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13513/866bec71-f6b9-c5fa-f6c2-f6027dc002f5.png" width="300">

一回分かってしまえば簡単だけれど、FileMakerのスクリプト回りはクセが強すぎてシンドイ。

参考：
[【FileMaker】変数の繰り返し数（配列）](https://qiita.com/tyuma/items/32d0f48b983f086a543c)
dateコマンドで月や日にちを1桁(YYYY-M-D)で表示したい

# 目的
`date`コマンドで`YYYY-MM-DD`を取得するのはよくあるが、
場合によっては`YYYY-MM-D`や`YYYY-M-DD`や`YYYY-M-D`を取得したい。

# コマンド
各値の`%`の直後に`-`を挿入する。

`YYYY-MM-D`

```bash
date '+%Y-%m-%-d'
```

`YYYY-M-DD`

```bash
date '+%Y-%-m-%d'
```

`YYYY-M-D`

```bash
date '+%Y-%-m-%-d'
```

# 参考url
[date コマンドで月や日付を一桁で表示したい | cloudpack.media](https://cloudpack.media/10032) - 2015-01-09更新、2021-01-13閲覧
【Git】Matched one or more prohibited patternsが出てきたときの対処法

#  前提
コンフリクトを解消した後に

```
% git add .
% git commit
```

を実行すると

## エラー内容

```
[ERROR] Matched one or more prohibited patterns

Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- List your configured allowed patterns in .gitallowed at repository's root directory
- Use --no-verify if this is a one-time false positive

```

が表示されて次に進めなくなります。

そこで、エラー文を読んでみると、最後の行に`--no-verify`を使ってみてと書いてありますね。
これっぽいです。

# 結論、オプションで`--no-verify`を使います

```ターミナル
% git add .
% git commit --no-verify
```

これで`commit merge`ができると思います。
以上です。
docker+laravelでGeneral error: 1812 が発生

# 初めに

docker + laravelを使って、なんかプログラムを作ろうと
migrateを行った際に

```
$ docker exec -it docker-sample_php-fpm_1 bash
root@39aae0ad8da6:/var/www/html# php artisan migrate

   Illuminate\Database\QueryException 

  SQLSTATE[HY000]: General error: 1812 Tablespace is missing for table `laravel`.`migrations`. (SQL: select `migration` from `migrations` order by `batch` asc, `migration` asc)

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
    667|         // If an exception occurs when attempting to run a query, we'll format the error
    668|         // message to include the bindings with SQL, which will make this exception a
    669|         // lot more helpful to the developer instead of just the database's errors.
    670|         catch (Exception $e) {
  > 671|             throw new QueryException(
    672|                 $query, $this->prepareBindings($bindings), $e
    673|             );
    674|         }
    675| 

      +27 vendor frames 
  28  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
```

が発生した。
備忘録として、メモしておく

# 何が起こったか？

出ているエラーをよくみてみると

```
Tablespace is missing for table `laravel`.`migrations`
```

と出ている。
dokcerのmysqlのコンテナーにログインして、テーブルを確認すると

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laravel            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql> use laravel;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-------------------+
| Tables_in_laravel |
+-------------------+
| failed_jobs       |
| migrations        |
| password_resets   |
| tasks             |
| users             |
+-------------------+
5 rows in set (0.00 sec)
```

migrationsテーブルは存在する。
migrationsテーブルの中身を見てみる。

```
mysql> select * from migrations;
ERROR 1812 (HY000): Tablespace is missing for table `laravel`.`migrations`.
```

エラーが出てくる。

# 解決
色々と調べてみたが、いかが手っ取り早そう

```
mysql> drop table migrations;
Query OK, 0 rows affected (0.02 sec)
```

他のテーブルでもmigrateが詰まったら
drop table tbl_name

を実行すれば良さそう。

それでは素敵なdocker lifeを
curl error 60を解決した

エラーが出ていた元のコード

```php

//$postと$headersについては省略
$ch = curl_init('URL');
        $options = [
            CURLOPT_CUSTOMREQUEST => 'POST',
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_BINARYTRANSFER => true,
            CURLOPT_HEADER => true,
            CURLOPT_POSTFIELDS => $post,
        ];
        curl_setopt_array($ch, $options);
        
        $result = curl_exec($ch);
```
エラーが出なくなったコード

```php

$ch = curl_init('URL');
        $options = [
            CURLOPT_CUSTOMREQUEST => 'POST',
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_BINARYTRANSFER => true,
            CURLOPT_HEADER => true,
            CURLOPT_POSTFIELDS => $post,
            CURLOPT_SSL_VERIFYPEER => false,  //追加
            CURLOPT_VERBOSE => true,          //追加
        ];
        curl_setopt_array($ch, $options);
        
        $result = curl_exec($ch);
```
参考（こちらのラインプッシュを試した際に出くわしたエラーです）：https://imoni.net/tips/00xx/0012.html
ユーザーの操作に対するアニメーション反応の演出時間は少しずつ速くすると良いかもしれない

当記事では、GUIコンテンツ（Webページやスマートフォンアプリなど）において、ユーザーの操作に対してアニメーションを使って反応を返すときの効果時間・演出時間に関する思いつきを書き残しています。





## 1. はじめに

私は、あらゆるGUIコンテンツはユーザー操作に対して視覚的な反応を返すべきだと考えています。

Webページで言えば、リンクにマウスカーソルを載せると、リンク色が変わり、マウスカーソルの形状が三角形から指の記号に変化し、リンク下に下線が現れるような、そんな反応が大事だと考えています。

ただし、そのような反応はユーザーにストレスを与える原因であることも理解しています。あまりに長々としたアニメーションは鬱陶しいですし、リアクションの数が多すぎるとかえって混乱します。かといって、アニメーションも無しに急激に変化されるとビックリします。

事の本質は、どの程度の反応・演出が好ましいのか、という程度問題なのです。





## 2. 本題

この問題に対して、いくつかの対策を考え、試みましたが、どれも決定的と呼べるほどのものではありませんでした。なにより、作るコンテンツごとに各アニメーションの時間を調整しなければならないのは厄介な問題でした。

そんなときに思い付いたのが「ユーザーから見たときに『変化』と呼べる事象を階層状に列挙して、深い階層のものほど変化にかかる時間を短くしてく」という閃きでした。





### 2-1. 例

例えば、普通のWebページを考えてみます。

あるページを開いたとき、真っ先にユーザーが体験する可能性ある変化とは何でしょうか。それはページが開かれるという変化です。まず、ここにアニメーションを挿し込む余地があります。例えば、フェードインされるのなんか良いでしょう。ただし、あまりに長々とフェードインしているのは鬱陶しいので0.1秒だけアニメーションすることにします。

```
■ 0.1s: ページを開く → ページが開かれる（ページが描写される）
```

ページが描写された後に起こりうるアニメーションは色々考えられます。よくあるものとしては、リンクとなる文字列にマウスカーソルを載せたときのアニメーションです。マウスカーソルが矢印から手に変化したり、文字色が明るくなったり、文字列に下線が引かれたりと色々なアニメーションが考えられます。

さて、では、このアニメーションにかかる時間はどのように設定するべきでしょうか。私ならばページを開いたときよりも短い時間に設定することを考えます。

何故ならば、このユーザー操作・アニメーションは、先に述べた「ページを開く」という事象よりも深い階層にある（と、私は考える）ためです。

```
■ 0.1s: ページを開く
└ ■ ?s < 0.1s: リンクにマウスカーソルを重ねる
```

この考えについて、上手く言語化できない自分がもどかしいですが、何となく言わんとすることは分かってもらえるかと思います。つまり「リンクにマウスカーソルを重ねる」という操作は「ページを開く」という操作なくしてはあり得ず、そこに私は階層構造を見出したのです。

今回は「リンクにマウスカーソルを重ねる」に関連するアニメーション時間を0.1秒とします。そして、それに合わせて「ページを開く」を0.2秒に再設定します。

```
■ 0.2s: ページを開く
└ ■ 0.1s: リンクにマウスカーソルを重ねる
```

さらに「リンクにマウスカーソルを重ねる」には「リンクをクリックする」や「リンクからマウスカーソルを外す」という操作などがぶら下がっているでしょう。

```
■ 0.2s: ページを開く
└ ■ 0.1s: リンクにマウスカーソルを重ねる
  ├ ■ ?s: リンクをクリックする
  └ ■ ?s: リンクからマウスカーソルを外す
```

これらの親要素である「リンクにマウスカーソルを重ねる」が0.1秒ですが、これら子要素のために0.2秒に設定し直し、「リンクをクリックする」と「リンクからマウスカーソルを外す」の時間に0.1秒を設定します。また、「リンクにマウスカーソルを重ねる」が0.2秒になったため、「ページを開く」も0.3秒に再設定します。

```
■ 0.3s: ページを開く
└ ■ 0.2s: リンクにマウスカーソルを重ねる
  ├ ■ 0.1s: リンクをクリックする
  └ ■ 0.1s: リンクからマウスカーソルを外す
```

このように要素同士を階層状に考え、深い階層ほどアニメーション時間を短くしていくと良いのではないでしょうか。





### 2-2. 副次的な効用

このようにアニメーションを実装していると、ある瞬間に「アニメーション鬱陶しいな」と思うときが出てくるかもしれません。それは1つのページに搭載する要素の階層を深くし過ぎている合図であると考えます。

そのときはサイト構造などを見直すべきかもしれません。





## 3. おわりに

ところで、この記事を書いているときに気付いたのですが、これって普通に使われている技法ですよね。例えば、ハンバーガーメニューを実装しているサイトなどでは「メニューを開く」ことの演出時間は「メニューを閉じる」よりも長いか、あるいは同等です。その逆になっているサイトはむしろ珍しいでしょう。

良い考えを思い付いたぞ、と歓喜しただけに、ちょっと残念です。
Djangoで何らかのスクリプトを定期実行する方法

# きっかけ
趣味で開発している[Webアプリ](https://github.com/box16/ArtMatch)で、
「毎朝7時にニュースサイトから記事を集めてくる」
的なことをやりたくなった

# 概要
1. Django commandというのを新しく作る
2. crontabでDjango commandを定期実行させる

# 手順
### 1. Django commandを新規作成する

そもそもDjango Commandとは何かというと
`python manage.py runserver`
`python manage.py migrate`
のように`python manage.py`の後に続くもの

上記二つは元々あるコマンド
実はこのコマンドは自作できる
詳細は[公式から](https://docs.djangoproject.com/en/3.1/howto/custom-management-commands/)

まずアプリ1ディレクトリの下に`management`ディレクトリを作成する
`management`ディレクトリの下に`commands`ディレクトリを作成する
`__init__.py`は特に作らなくても大丈夫

`commands`ディレクトリの下に、何かしらのスクリプトを作成する
これが新しいDjango commandになる
つまり
`python manage.py 何かしら`
と入力すれば、「何かしら」の中のスクリプトが実行されるようになる

```
プロジェクト
├── アプリ1
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── management ← こいつを新しく作るよ
│   │   ├── __init__.py
│   │   └── commands ← こいつを新しく作るよ
│   │       ├── __init__.py
│   │       └── 何かしら.py ← こいつを新しく作るよ
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── アプリ2
└── manage.py
```

### 2. コマンドの中身を記述する

今、`アプリ1/management/commands/何かしら.py`が作成されている状況
配置はOK
次は、中身で「これはDjango commandだよ」と教える必要がある
そのために最低限必要な記述は以下

```sample.py
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    def handle(self, *args, **options):
        """ここに思い思いのスクリプトを記述する"""
        pass
```

### 3. crontabに記述する

`crontab -e`で編集を行う

```crontab
#毎朝7時に何かしらを実行する
#実行結果はlog.txtに記録する
0 7 * * * /絶対パス/python3 /絶対パス/manage.py 何かしら > /絶対パス/log.txt 2>&1
```

crontabで実行したいコマンドを入力するときは絶対パスで指定するのが良い
特に、仮想環境下のpythonを使っているときとか

[crontabについての詳細](https://www.server-memo.net/tips/crontab.html)
ゼロトラスト / IdaaS + CASB の設計例

**「ゼロトラストはクラウドサービス（SaaS）の導入なので設計は簡単だ！」と考えている方もいると思います。
しかし、クラウドだからこそ設計で
■導入して何をしたいか？を明確にすること！
■その為に複数のクラウドをどのように組み合わせるか！
を行い、「それに合ったクラウドサービスを選択することが大切」です。
これを怠ると、後で「えっ、できると思っていたのができないの！？」といった事がおきます。
ここではそれを防ぐための設計例を説明します。**

**（関連知識）
**ゼロトラストとは**
“米国国立標準技術研究所（NIST）の定義とその意訳**
https://qiita.com/masaaki-murakami/items/6a7f56079aa95f44119d
ゼロトラストの基礎知識
“セキュリティ”の為にみんなが今までやってきた事と、これからすべきことの基礎知識**
https://qiita.com/masaaki-murakami/items/28a737c373138f3773ea
**ゼロトラスト / MDR = EPP+EDR+SOCの設計例
“外部からの攻撃（身代金、搾取等）”対策【 PC・スマホ 】>>>「MDR = EPP + EDR + SOC」**
https://qiita.com/masaaki-murakami/items/0f952c10b17c3dba3815
##ゼロトラスト　/　“内部の情報漏洩”対策　>>> IdaaS ＋ CASB
####１．境界防御からゼロトラストするとできる事
境界防御からゼロトラストすると
❶内部情報漏洩を防ぐ
❷外部からの攻撃から守る
が可能です。今回は❶について紹介します。

一般的に内部情報漏洩対策の為に、社員全員に対して利用できるWebサイト、SaaSの利用を厳しく制限する事を考えがちです。
しかし、ゼロトラストにすると
**■内部情報漏洩のリスクが高い(元)従業員に対して集中的に監視・規制・警告**
といったことが可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/f6973636-70d7-1b7a-fce4-1501e353836b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/1a8113a6-f89e-55a6-e336-41ef6d741b2e.png)

これに次の運用を加えると、「セキュリティレベルのアップ」と、「いろいろなサイトやクラウドを利用する自由」
のバランスをとることができます。
**ステージ１；ブラックサイトのみ規制するとともに、従業員に本施策が実施されている旨を告知する**
**ステージ２；サイトの信用レベルの低いサイトを規制**
**ステージ３；ホワイトリストのサイトのみの利用**

例えば、普段はステージ１として、従業員は比較的自由にサイトにアクセスができる。
内部情報漏洩の問題が大きくなるにつれ、ステージ２、ステージ３に規制レベルをあげる。
####２．機能設計
従業員にとって面倒で、ある意味厄介なセキュリティの強化は、誰のニーズによって実行されるのでしょうか？
セキュリティのニーズは経営者側にあります。
従って、セキュリティは基本的に経営者のニーズに合わせてコントロールできる様にするのが良い設計です。
ここでは、それを行える設計例をしめします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/d47aec48-45ea-347b-3e94-2f727784228a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/d9c3a6d3-f92b-e848-10c5-4e6b61ce98fa.png)

**【参考】**
**ゼロトラストの基礎知識**
“セキュリティ”の為にみんなが今までやってきた事と、これからすべきことの基礎知識
https://qiita.com/masaaki-murakami/items/28a737c373138f3773ea
**ゼロトラスト / MDR = EPP+EDR+SOCの設計例**
“外部からの攻撃（身代金、搾取等）”対策【 PC・スマホ 】>>>「MDR = EPP + EDR + SOC」
https://qiita.com/masaaki-murakami/items/0f952c10b17c3dba3815
APIを叩いていてTimestamp for this request is too fast.とエラーが出た時の解決策

# APIを叩いていたらこんな応答が返ってきました
なぜ・・日本時間なのが悪いのか？と色々推測しました。

``` 
{
  "status": 1,
  "messages": [
    {
      "message_code": "ERR-5009",
      "message_string": "Timestamp for this request is too fast."
    }
  ],
  "responsetime": "2021-01-13T07:43:02.225Z"
}
```

# 結論　PCの時刻設定が違っている
特に設定をいじった覚えはないのですが、確かにずれがありました。
下記画像では、既に時間の修正を行っています。直す前は7.5秒のずれがありました。
![スクリーンショット 2021-01-13 16.59.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247390/739c5ab2-24a7-1030-e8bc-0ad39de89400.png)
https://www.time-j.net/worldtime/country/jp

# 上記サイトと見比べながら人力で修正
時計の時間の部分をぽちぽちやります。
![スクリーンショット 2021-01-13 17.02.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247390/b24564c4-e7c5-efc4-8164-28650b3c2ede.png)

# ちゃんとデータが返ってくるようになりました
```
{
  "status": 0,
  "data": [
    {
      "amount": "4133",
      "available": "4133",
      "conversionRate": "1",
      "symbol": "JPY"
    },
  ],
  "responsetime": "2021-01-13T07:51:49.678Z"
}