OmniAICreator/Qiita-1.07M huggingface dataset:
Apex で multipart/form-data で binary file upload する

Apex で multipart/form-data で binary file upload することがありましたので実装方法を記述してみます。
この例では、pdfファイルをpostすることにしています。

```apex 
	/**
	 * multipart の header で指定するバウンダリー文字列
	 */
	@testVisible
	private static final String BOUNDARY_STR = 'hogehoge' + String.valueOf(DateTime.now().getTime());

	/**
	 * multipart の body 部で使用するバウンダリー文字列
	 */
	@testVisible
	private static final String BOUNDARY_BODY = '--' + BOUNDARY_STR;

	/**
	 * HTTP multipart リクエスト作成
	 * @param paths アクセス先パス
	 * @param fileBody ファイルデータバイナリー
	 * @return APIのリクエストとレスポンス結果
	 */
	@testVisible
	public static HttpResponse sendHttpMultiPart(String paths, Blob fileBody){
		HttpRequest httpReq = new HttpRequest();

		httpReq.setHeader('Content-Type', 'multipart/form-data; charset="UTF-8"; boundary=' + BOUNDARY_STR);

		String header = BOUNDARY_BODY + '\r\n';
			header += 'Content-Disposition: form-data; name="name"\r\n\r\n';
			header += 'file_name' + '\r\n';
			header += BOUNDARY_BODY + '\r\n';
			header += 'Content-Disposition: form-data; name="uploadfile"; filename="file_name"\r\n';
			header += 'Content-Type: application/pdf' ;
        
        Blob requestBody = getMultiPartBody(header, BOUNDARY_BODY, fileBody);
		httpReq.setBodyAsBlob(requestBody);

		httpReq.setEndpoint(paths);
		httpReq.setMethod('POST');

		HttpResponse httpRes = new Http().send(httpReq);
        return httpRes;

	}

	/**
	 * multipart/form-data を作成する
	 * @param header ヘッダー
	 * @param boundary バウンダリー
	 * @param file_body 添付ファイル
	 */
	public static Blob getMultiPartBody(String header, String boundary, Blob fileBody){
		Blob headerBlob = Blob.valueOf(header + '\r\n\r\n');
		Blob footerBlob = Blob.valueOf('\r\n' + boundary + '--');

		Blob bodyBlob = combineBlob(new List<Blob>{headerBlob, fileBody, footerBlob});

		System.debug('Request Header and Footer : \r\n' + headerBlob.toString() + footerBlob.toString());

		return bodyBlob;
	}

	/**
	 * Blob を結合する
	 * @param blobs 結合したいblob
	 * @return 結合したblob
	 */
	public static Blob combineBlob(List<Blob> blobs){
		String encodedHex = '';
		if(blobs == null){
			return Blob.valueOf(encodedHex);
		}
		for(Blob target : blobs){
			encodedHex += EncodingUtil.convertToHex(target);
		}
		return EncodingUtil.convertFromHex(encodedHex);
	}
	
```

肝心な箇所は `combineBlob()` です。ここで`multipart/form-data`の文字列である `header` と、バイナリであるファイルデータを結合しています。

## 課題
6MB以上のファイルでは `FATAL_ERROR System.StringException: String length exceeds maximum: 12000000` が発生するため、ファイルが5MB以内でないと送信できないのが課題としてあります。
laravel ログイン userテーブル id変更

laravelのログイン機能はデフォルトでuserテーブルのidを参照するようになっている。
従い、idではない名前、例えばuser_idをプライマリーキーとして参照したい場合は1手間加える必要がある。

●変更するファイル
「プロジェクトフォルダ」->app->User.php

●User.phpに追記する内容
```
protected $primaryKey = 'user_id';
```

●例
```
<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password', 'kana', 'tel',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    // userテーブルのプライマリーキーはuser_id
    protected $primaryKey = 'user_id';
}

```

●参考
https://zenn.dev/miyapei/articles/725316f6c52a579f2f00
OSのバージョン制限があるモディファイアを便利に使う方法(SwiftUI)

## はじめに

本記事は [SwiftUI Advent Calendar 2022 その2](https://qiita.com/advent-calendar/2022/swiftui) の1日目の記事です。

例えば [scrollDismissesKeyboard(_:)](https://developer.apple.com/documentation/swiftui/view/scrolldismisseskeyboard(_:))  がiOS 16.0から使えるように、OSのバージョン制限があるモディファイアを便利に使う方法を紹介します。

## 環境

- OS：macOS Ventura 13.0.1
- Xcode：14.2 (14C18)
- Swift：5.7.2

## 課題

iOS 16.0未満をサポートしている場合、iOS 16.0+のモディファイアはそのままでは使えません。

```swift:SakatsuInputScreen.swift
struct SakatsuInputScreen: View {
  var body: some View {
    SakatsuInputView()
      .scrollDismissesKeyboard(.interactively) // FIXME: ビルドエラー
  }
}
```

モディファイアはメソッドチェーンで記述するので、間にif文を差し込めません。

```diff_swift:SakatsuInputScreen.swift
struct SakatsuInputScreen: View {
  var body: some View {
    SakatsuInputView()
+   if #available(iOS 16.0, *) {  // FIXME: ビルドエラー
      .scrollDismissesKeyboard(.interactively)
+   }
  }
}
```

## 解決策

Viewにエクステンションで、Viewを返すメソッドを新たに定義します。

メソッド名はサフィックスに `IfAvailable` を付けています。

`if #available()` で分岐し、elseでは `self` をそのまま返します。
if文により返すViewの型が確定しないので、 `@ViewBuilder` が必要です。

```diff_swift:SakatsuInputScreen.swift
struct SakatsuInputScreen: View {
  var body: some View {
    SakatsuInputView()
-       .scrollDismissesKeyboard(.interactively)
+       .scrollDismissesKeyboardInteractivelyIfAvailable() // !!!: ビルド成功
  }
}

+ private extension View {
+   @ViewBuilder
+   func scrollDismissesKeyboardInteractivelyIfAvailable() -> some View {
+     if #available(iOS 16.0, *) {
+       scrollDismissesKeyboard(.interactively)
+     } else {
+       self
+     }
+   }
+ }
```

## おわりに

シンプルなtipsですが、地味に便利です。
みなさんの解決策も知りたいので、コメントなど頂けると嬉しいです :relaxed: 

以上 [SwiftUI Advent Calendar 2022 その2](https://qiita.com/advent-calendar/2022/swiftui) の1日目の記事でした。
明日は埋まっていません。
Rustで簡単なオセロを作った

## はじめに

最近諸理由あってRustを勉強していたのですが、一通り[The Rust Programming Language](https://doc.rust-jp.rs/book-ja/ch00-00-introduction.html)を終えたのでなんか作ってみよう、というノリで作り始めました。

記事としては内容が薄くなってしまったのでご了承ください。

## 完成物

よくあるターミナルで遊べるオセロです。
![Peek 2022-12-15 16-03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1914475/0533d48e-a584-d659-7704-cac5b9558d75.gif)


コード全体は[ここ](https://github.com/ardRiriy/reversi/blob/master/src/main.rs)に置いてあります。

自分で書いておいてなんですが、可読性を気にせずに書いたので割とスパゲッティコード…反省はしています。

## 改善点

### 石の置く位置を入力するときに1文字以下だとpanicが起こる
![Peek 2022-12-15 16-04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1914475/b4c72af6-37a0-b21b-233f-995a48df41c1.gif)

    

文字列長を確認せずに1, 2文字目を参照しようとしているために起こります。逆に3文字以上を入力しても特に問題はないです。

確認すればいいだけなんですが治すのが面倒くさくて放置をしています。
たとえば入力値`s`に対して
```rust
if s.len() == 2 {
/* hogehoge */
}
```
などとしてあげれば簡単に直せそうです。
~~入力をミスらなければヨシ！~~

### 石をひっくり返す判定が汚い

```rust
fn upper_placeable(field: &mut [[Stone; size!()]; size!()], x: u32, y: u32, stone: Stone) -> u32 {
    let mut i = 2;
    loop {
        if y < i {
            return 0;
        }
        if field[(y - 1) as usize][x as usize] == stone.enemy()
            && field[(y - i) as usize][x as usize] == stone
        {
            return i;
        } else if field[(y - i) as usize][x as usize] == Stone::Empty {
            return 0;
        }
        i += 1;
    }
}
```

こういう感じの処理が8個あります。
正直汚いし、似たような処理なので纏められないかなぁと思ってかなり考えたんですが結局いい解決策を思いつきませんでした。
アルゴリズムとか勉強するとできるようになるのかなぁ。みんなどうやっているんだろう。

### 処理を変えて冗長になったところを直そう

```rust
    let left = left_placeable(field, x, y, stone);
    let right = right_placeable(field, x, y, stone);
    let upper = upper_placeable(field, x, y, stone);
    let lower = lower_placeable(field, x, y, stone);
    let left_upper = left_upper_placeable(field, x, y, stone);
    let right_upper = right_upper_placeable(field, x, y, stone);
    let left_lower = left_lower_placeable(field, x, y, stone);
    let right_lower = right_lower_placeable(field, x, y, stone);

    left != 0
        || right != 0
        || upper != 0
        || lower != 0
        || left_upper != 0
        || right_upper != 0
        || left_lower != 0
        || right_lower != 0
```

もともと`*_placeable`関数に石をひっくり返す処理を含めていたので、全部の関数を評価してほしくてこうなったのですが、あとからその処理を別に分けたので不要になりました。


### あとがき

改善点はもっとあるような気がしていたけど、やっていることが単純な処理なので現状の自分ではそこまでみつからなかったです。来年とかに見るとまた面白い気がする来年の自分に期待したいです。

色々問題はあるけど動いてるからヨシ！
t検定の計算をやってみた

## はじめに
ABテストを実施する上で、どちらの方が優れていたかを判断する基準として統計学的に判断する手法が一般的に使われています
利用するだけであればspreadsheetsやexcelなどでも関数が準備されているが名前を聞いたことがあるレベルだったので調べてみました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997826/db8d87a8-d6d7-765e-1e65-1ec30c9c27ce.png" width=50%>


今回t検定で何をやっているのか理解した範囲をアウトプットしてみたいと思います


### T検定とは
> t検定（ティーけんてい）とは、帰無仮説が正しいと仮定した場合に、統計量がt分布に従うことを利用する統計学的検定法の総称である。母集団が正規分布に従うと仮定するパラメトリック検定法であり、t分布が直接、もとの平均や標準偏差にはよらない（ただし自由度による）ことを利用している。2組の標本について平均に有意差があるかどうかの検定などに用いられる。

[wikipedia](https://ja.wikipedia.org/wiki/T%E6%A4%9C%E5%AE%9A)参照


#### 帰無仮説と対立仮説



|用語　|記号|説明 |
|-- |-- |-- |
|帰無仮説 | H0 | 群Aと群Bの母平均が同じであることを確認する　<br> 群Aの母平均 = 群Bの母平均|
|対立仮説 | H1| 群Aと群Bの母平均が異なっていることを確認する<br> 群Aの母平均 ≠ 群Bの母平均 |
|有意水準 |p |滅多に起きないだだろうと思える値を設定する<br>一般的には5%がよく利用される。|


検定の流れとしてはこんな感じ
```
仮定: 帰無仮説　が正しい　
　　　　　　　　　　　群Aと群Bが同じ母平均
と仮定して今回取得されたデータの母平均の差が起きる確率を求める

今回取得されたデータの母平均の差が起きる確率が有意水準より低かった
↓
そんなレアなケースは起きないだろう
↓
仮定そのものが間違っているからだ!!
```
上のような流れで帰無仮説が間違っている　　→　対立仮説が正しいと主張をします。


### 母平均差の検定
2標本でt値を求める場合以下の式で導かれます。

```math
t = \frac{(\bar{x_1} - \bar{x_2})}{\sigma \sqrt{\frac{1}{n_1}+\frac{1}{n_2}}} 
```
```math
\sigma^2 =  \frac{(n_1-1)\sigma_1^2 +(n_2-1)\sigma_2^2}{n_1+n_2-2}
```
この時 tは自由度 n+m−2 の t分布に従う


記号をいきなり出してしまっているので整理したいと思います。

```math
\begin{align}
\bar{x} &=標本平均 \\
\mu&= 母平均　\\
n &=それぞれの標本のサンプル数\\
\sigma &=プールした分散 \\
\sigma_1,\sigma_2 &=不偏分散 \\
\end{align}
```



下に自由度1,5,10のt分布と正規分布のグラフをプロットしました。
サンプル数が大きければ大きいほど正規分布に近づくこととなります。
このグラフの面積が95%に入っているかどうかを見ていくわけです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997826/c2fe2a97-ed7c-aaac-6201-908bf09b7589.png" width=70% alt="aa">





### 実際の数値を入れて計算

利用するデータは以下
あるクラスAとBの点数に有意差があるかどうかを確認したいとします。
有意差は5%とします。

|class A| classB|
|--|--|
|95|99|
|100|74|
|87|89|
|94|95|
|61|93|
|98|92|

帰無仮説、対立仮説を立てます。
- 帰無仮説
　- クラスAとクラスBの学力は同じ
- 対立仮設
　- クラスAとクラスBのどちらかの学力が高い


次にclass Aの標本平均と不偏分散を求めてみる。
```math
\begin{align}
\bar{x_1} &= \frac{\sum(x_i)}{n} \\
&= \frac{(95+100+87+94+61+98)}{6} \\
&= 89.16\\
\\
\sigma_1^2&= \frac{\sum(x_i - \bar{x})^2}{n-1} \\
&= \frac{(95-89.16)^2+(100-89.16)^2+(87-89.16)^2+(94-89.16)^2+(61-89.16)^2+(98-89.16)^2}{6-1} \\
&= 210.16 \\
\sigma_1 &=14.49
\end{align}
```

classBも同じように取得してみます。
||class A| classB|
|--|--|--|
|標本平均|89.16|90.33|
|不偏分散|14.49|8.66|

次にプールされた分散σを計算します。


```math
\begin{align}
\sigma^2&= \frac{(n_1-1)\sigma_1^2 +(n_2-1)\sigma_2^2}{n_1+n_2-2}\\
&=\frac{(6-1)14.49^2 + (6-1)8.66^2}{6+6-2}\\
&=142.61\\
\sigma&=11.94\\
\end{align}
```
最後にtを求めます。

```math
\begin{align}
t &= \frac{(\bar{x_1} - \bar{x_2})}{\sigma \sqrt{\frac{1}{n_1}+\frac{1}{n_2}}} \\
&= \frac{89.16-90.33}{11.94\sqrt{\frac{1}{6}+\frac{1}{6}}} \\
&= 0.16
\end{align}
```

ここで求めた0.16とT分布の表とを照らし合わせて有意差があるか確認します。
自由度10の両側0.05は2.228のため帰無仮説が採択された。




念のためスプレッドシートのT.TEST関数の結果と同じことを確認したとこと一致していることが確認できました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997826/1e8b01c0-a0cf-73db-a2cd-2a2056ca6242.png" width=50%>
※ T.DIST , T.TEST はスプレッドシートに備わっている検定用の関数


### 終わりに
今回勉強したt検定の場合いくつかの条件を満たしていないと適応できません。
今後等分散ではない検定の方式としてウェルチの検定などもありますがまた別の際に読み進めてみようかと思います。

それではまた
Video.js完全マニュアル part1 〜Video.jsを使う理由〜

# はじめに
私は普段動画プレイヤー関連の実装することが多く、その中でもVideo.jsはよく利用しています。
しかしVideo.jsの公式ドキュメントの言語は英語のみです。更にVideo.jsに関する日本語の情報は非常に少なく、情報を収集するのが困難です。
なので今一度Video.jsの公式のガイドである[Video.js Guides](https://videojs.com/guides)を翻訳ツールを使いながら読み解き、日本語化しながら使い方を学んでいこうと思います。

# この記事の対象者
- Video.jsを利用する人
- 動画プレイヤーのUI操作をしたい人
- 動画再生関連のサービスを作りたい人

# この記事の解説する内容
[Video.jsトップページ](https://videojs.com/)

この記事ではVideo.js Guidesを読む前に、Video.jsとは何かをまとめていきます。Video.js Guidesを読み始めるのは次章からなので、Video.jsについて理解のある方は飛ばしてください。

# Video.jsとは
## 何故Video.jsを使うのか？
Video.jsはHTML5上で動作する動画プレイヤーのライブラリです。

HTMLの知識が少しでもある方は、HTMLにVideoタグがあるのを知っていると思います。何故Video.jsというライブラリを利用するのでしょうか？

### 見た目を統一出来る
HTML5のvideoタグを利用した場合と、Video.jsを利用した場合の見た目を様々な端末、ブラウザで比較してみました。

#### HTML5のvideoタグを利用した場合

```html
<video controls src="sample.mp4"></video>
```

![無題のプレゼンテーション (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849606/5516e022-84fd-6c94-fc43-f08656de3b49.png)

以上のように各端末,ブラウザによって全く見た目が異なるのが分かります。

#### Video.jsを利用した場合
[Video.js公式ページ](https://videojs.com/city)に埋め込まれている動画を再生して比較してみました。

![無題のプレゼンテーション (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849606/612ffdd5-dcd2-7e36-1170-c5f59196756d.png)

iPhoneでは音量コントロールが出来ないので音量調整機能は付いていませんが、それ以外の見た目は統一されているのが分かります。

**以上で分かるようにVideo.jsを使うことでどのような端末、ブラウザで動画を再生しても見た目を統一することが出来るという利点があります。**

### 様々な動画ファイル形式に対応
HTML5のvideoタグを利用した場合、再生出来る動画のファイル形式には制限があります。例えばライブ配信で利用されるHLS形式の動画データは再生することが出来ません。
なのでHTML5のvideoタグを利用する場合は、LIVE配信サービスやストリーミングサービスには対応することが出来ません

一方Video.jsはHLSファイルやDASHファイル等のHTML5が対応していないファイル形式に対応しています。

**なのでVideo.jsを使用すればLIVE配信サービスやストリーミングサービスに対応することができます**

### 簡単にスタイリング出来る
前述した通り見た目が環境が異なる場合でも統一されているので、スタイルを調整したい場合ブラウザや端末を気にせずに調整出来ます。

**CSSを追加して自分らしさを出したプレイヤーを作成することが可能です**

### たくさんのプラグインを持つ
Video.jsは数百を超えるプラグインやスキンを用意しています。
プレイリストの作成や、広告の挿入、Chromecast対応、360・VR動画に対応等、様々な種類のプラグインがあります。

また、スキンとは見た目をカスタマイズする機能のことです。再生ボタンを中央に配置するものや、全く新しいレイアウトを作成することが出来るスキンが用意されているので、それを使用することが出来ます。

**自分の作りたいサービスに適したプラグインやスキンを探し出して利用することができます**

[プラグインとスキン一覧](https://videojs.com/plugins/)

### 様々なブラウザに対応
デスクトップやモバイルでの出来る限りのモダンブラウザで動作するように作られいてます。

## videoタグとVideo.jsの比較表

|特徴  |Video.js  |HTML5  |
|---|---|---|
|ブラウザ毎の見た目  |CSSをベースに統一された表示  |各ブラウザで異なる表示 |
|ストリーミング対応  |HLS型式はあらゆる場所で対応<br>DASH型式ではIOS/Safariを除くあらゆる場所で対応  |HLSとDASH型式ではChromeやFirefoxでは再生不可  |
|動画配信プラットフォーム  |プラグインを利用してYoutubeやVimeoに対応  |サポートされていない |
|ブラウザAPIの不整合  |起こらない  |たくさん起こる |

# さいごに
今回の記事ではVideo.jsの特徴と、HTML5のvideoタグに出来なくてVideo.jsで出来ることを紹介しました。
次回から[Video.js Guides](https://videojs.com/guides)の中身に触れていこうと思います。

---
[Twitter](https://twitter.com/manzoku_bukuro)もやってます
Uncaught TypeError: Cannot set properties of null 

```js
<section>
  <form action="#" id="form">
    <input type="submit" value="検索">
  </form>
</section>

<script>
    'use strict';

    document.getElementById('from').onsubmit = function() {
        console.log('クリックされました');
    };
</script>
```
# Uncaught TypeError: Cannot set properties of null 
存在しない要素を指定したときに発生するらしい。
idを```form```を```from```にしていた。
```js
document.getElementById('from').onsubmit = function() {
```
修正したら治った。

# 感想
タイポに最初に気づくべきだった。

# 出典
https://www.sbcr.jp/product/4815601577/
アプリエンジニアからSREに異動して２年経った自分が学んだSRE五箇条


この記事は [モチベーションクラウドシリーズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mcs) 16 日目の投稿です。

:::note
弊社ではテックブログもやっておりますので、宜しければこちらもどうぞ！
https://link-and-motivation.hatenablog.com/
:::

## はじめに
アプリエンジニアからSREに配属されて２年が経ちましたが、やっとSREとしてバリューを発揮できるようになってきたので、SRE初心者だった自分が、今でも意識していること・取り組んで良かったことを５つ簡単にまとめました。


## 1. クラウドサービスを徹底的に理解しろ！
弊社はAWSを使っており、運用全てAWSを使っているので、まずサービスの理解を深める必要がありました。
以下にアーキテクチャの理解・運用の理解に必要な抑えておくべき主要なサービス一覧を示します。


|  カテゴリ |  サービス一覧  |
| ---- | ---- |
|  コンピューティング  |  EC2, Lambda, Elastic Beanstalk  |
|  コンテナ  |  ECR, ECS, EKS  |
|  ストレージ  |  S3  |
|  データベース  |  RDS, ElastiCache  |
|  ネットワーク系  |  VPC, CloudFront, Route53, API Gateway  |
|  開発ツール  |  CodeBuild, CodePipeline  |
|  管理・ガバナンス  | CloudWatch, Systems Manager  |
|  分析  | Athena, Kinesis, Glue   |

※参考：[【2022年】AWS全サービスまとめ](https://dev.classmethod.jp/articles/aws-summary-2022/)

他にも必要なサービスはあるかとは思いますが、主にこの辺を押さえておけば大抵の業務に困りませんでした。

## 2. トイルに誰よりも敏感であれ！
トイルとは、手作業、繰り返される、自動化が可能、戦術的、長期的な価値がない、サービスの成長に比例して増加するといった特徴を持つ作業のことを指します。

開発生産性を上げるまず一歩目としてトイルの削減が必要です。
自分はSREとしてSRE内でのトイル、開発組織のトイル2つの観点から課題を抽出し、1つずつ自動化していきました。

トイルを削減した例をいくつか以下に示します。
|  トイル項目 |  削減時間（1回の作業あたりの時間)  | Before | After |
| ---- | ---- |---- |----|
|  リリース作業での手作業  |  0.5h → 0h  | ・手動でtag打ち<br> ・リリースブランチの作成<br>・リリースフローが複雑、かつ手動でのリリース<br>・etc |・tag打ちの自動化<br> ・リリースブランチの作成の自動化<br>・リリースフローを整理し、自動でリリースできる仕組みを構築<br>・etc |
|  本番環境変数の追加  |  1h → 0.1h  | ダブルチェックで本当に問題ないかを確認しながら、GUI操作で追加作業 |コード管理することでレビューのみの時間で、リリースされると安全に追加される仕組みを構築|
| メトリクスの収集 | 1h → 0h | 4-keysのメトリクスに必要な情報を手作業で計算・収集 |　GitHub Actions・Looker Studio等を使って自動化|

結果が出やすく価値のあるものなので、SRE初心者こそ最初に取り組むべきことだなと思いました。

## 3. 開発者との協働を忘れるな！
SREが勝手に良くしたとしても、開発者にとって本当にそれが良いものかはまた別の問題と捉える必要があります。
なので、運用まわりの変更等の開発者が関わるタスクは、要件定義の段階で開発者を巻き込み、意見をもらいながら、運用に乗るまでしっかりとフォローする必要があります。

:::note
SREのアウトプットは、運用が乗るまでがアウトプットである！
:::
と自分は認識し、日々のタスクに取り組んでおります。

## 4. 監視の通知を見逃すな！
弊社はサービスの監視をDatadogを使ってSlackのチェンネルへ通知をしています。
「これはどのような現象か」を通知が来たときに、素早く察知し、対応するためになんの監視をしているのかを把握する必要があります。

よくあるのはオオカミ少年アラートです。
通知は来るが問題がないため無視してもいいアラートのことを言いますが、これを０にし、対応する必要があるもののみに整理することが重要です。
放置しておくと、重要なアラートが埋もれて気づかなかったり、見ても意味がないと認識してしまうと監視しているチャンネルの重要性が薄れてしまうからです。

また、画像のように通知に気づきやすくするため、Slackのメンション機能を使うことで、漏れを無くします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575460/deb7b181-94d6-0f70-06f7-017193602f30.png)


## 5. ダッシュボードで見える化しろ！
これは最近取り組み、重要だと思ったことです。
弊社は[DORAが開発組織のパフォーマンス指標で掲げている4-keys](https://cloud.google.com/blog/products/devops-sre/using-the-four-keys-to-measure-your-devops-performance?hl=en)を導入し、開発メトリクスを測定しております。
直近まではメトリクスをスプレッドシートで集計し、グラフ化や結果をまとめていましたが、開発者にとって非常にわかりにくく、SREのみ理解している状態でした。

この問題をLooker Studioを用いて、ダッシュボード化することで開発者が現状を把握でき、また、どこに問題かありそうかの分析にも使えるようになりました。（分析に関しては今後の予定です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575460/c5249ef3-2c6d-d42a-c5a0-f849bdecf01a.png)

このように監視すべきもの、分析すべきものはなるべくダッシュボードで見える化する事で取り組むべき新たな課題の発見や活発な議論を促すことができます。
簡単にできることなので、もっと早く取り組めばよかったと思ってます。

## さいごに
もちろん、SREの業務は多岐に渡るので、他にもたくさん重要なことはありますが、自分がやったことと意識したことベースで書かせていただきました。
全てこれに集約できるものではありませんが、SRE初心者にとって最初に取り組むと結果がすぐ出やすいものではないかなと考えております。
何かの役に立てれば幸いです。
簡単Elixirシリーズ ~ 整数nが与えられるので 1行にn回"hello"と出力してください。~

# 簡単Elixirシリーズ
## ~ 整数nが与えられるので 1行にn回"hello"と出力してください。　~ 

この記事は「[Elixir Advent Calendar 2022](https://qiita.com/advent-calendar/2022/elixir)」7日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。

今回は、Twitter眺めてたら以下のツイート発見し、あ、 この小ネタやってみよ。という小ネタ（そう、この記事はサクッとがコンセプトW）

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">こんな問題が出題されます<br><br>Python、PHP、JavaScript、Ruby、C#など28言語で挑戦できるプログラミングゲーム！<br><br>異世界に勇者パーティーとして召喚された新人ITエンジニアの男女が2人ーー<br>目覚めるとそこは、剣（コード）と魔法（SQL）が支配する世界だった！？</p>&mdash; paiza[パイザ] (@paiza_official) <a href="https://twitter.com/paiza_official/status/1600357079578865664?ref_src=twsrc%5Etfw">December 7, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ということで早速書いてみた

```elixir
iex()> num = &(1..&1)
iex()> hello = &Enum.map(num.(&1), fn _ -> "hello" end) |> Enum.join(" ")
iex()> hello.(5)
"hello hello hello hello hello"
```

簡単ですね。
Gitの操作方法まとめ

### gitリポジトリを初期化
```
git init
```


### git の状態を表示
```
git status
```

### ステージングツリーに追加
追加されたファイルは追跡される
```
git add {file}
```

#### 変更されたファイルや追跡されていないファイルを全てステージングツリーに追加
```
git add .
```

### スナップショットを撮る
変更を全て記録して履歴に残す

```
git commit -m {message}
```
```
(例)
git commit -m "This is my first commit!"
git commit -m "added a readme file and updated the index"

```


### gitツリーからのファイルの削除
```
git rm {file}
```
#### 追跡も解除する
```
git rm --cached {file}
git rm --cached -r {file}
```
※既にコミットされているファイルは、削除後に変更をコミットして状態を記録する必要がある
```
git rm {file}
git commit -m "removed the file {file}"
```

### HEAD(現在のブランチ)を移動させる
#### 別のブランチに移動
```
git checkout {branch}
```

#### 別のcommitに移動
```
git checkout {commit}
```
※HEAD をブランチではなく commit に移動させた場合、「Detached HEAD」と呼ばれる状態になる。
この状態では、HEAD はブランチに接続されておらず、ただの commit を指す。
今 HEAD ツリーはこの commit になったので、この commit 内で追跡されているファイルは全て作業ツリーに反映される。
この状態で新しくcommitを作成すると、フローティングコミットになってしまう。

※作業ディレクトリが更新されるので、チェックアウトを使う前には必ず変更をcommitする。
Git は commit されていない変更点を全て置き換え、それらのファイルの内容を新しい Detached HEAD にあるファイルの内容に変更してしまう。


#### 今いるブランチや Detached HEAD の履歴を見る
```
git log
git log --oneline
```
#### 現在のリポジトリのグラフを出力する
```
git log --all --graph --oneline
```

### 別のブランチに切り替える
ブランチの場合はcheckoutではなくswitchを使う
```
git switch
```


### 現在の commit にタグ(commit 名の別名)をつける
```
git tag {tagname}
```
(例)チェックアウトできるようになる
```
git tag "v1.0"
git checkout v1.0
``` 

### 現在の commit の情報を表示
```
git show
git show --shortstat
```
※show を終了するには q キーを使う

### 新しいブランチを作成する
```
git branch {branch-name}
```
※「Detached HEAD」の状態で新しくcommitすると、フローティングコミットになってしまうため、新しくブランチを作成するようにする

#### ブランチの作成(git branch {branch})と移動(git switch {branch}) の両方を一度に実行する
```
git switch -c {branch}
```


### 2 つのブランチをマージ
```
git merge {branch}
```
(例)masterブランチとbranchBをマージ(masterに移動してからbranchBをマージする)
```
git switch master
git merge branchB
```


#### マージで作成される新しいcommitにメッセージを渡す
```
git merge {branch} -m {message}
```

### 不要になったブランチを削除する
```
git branch -d {branch} 
```
※マージした後は、片方のブランチからの commit は全て現在のブランチの commit 履歴に含まれるので安全。
自宅サーバー構築譚：オレオレ認証局が認証する証明書

# 能書き

[自宅サーバー構築譚：基本構想](https://qiita.com/katz_engineer/items/cb592be44daa28a51d9b)に基づく自宅サーバー構築、[前回](https://qiita.com/katz_engineer/items/afd9435bb8a04e33ee8b)の続き。

[前回](https://qiita.com/katz_engineer/items/afd9435bb8a04e33ee8b)はオレオレ認証局を作成しましたが、今回は証明書を作成してこの認証局で認証してみます。

参考文献：[easy-rsaで簡単に自宅CA構築+自己証明書発行 - paloma blog](https://paloma69.hatenablog.com/entry/2021/06/26/181027)
参考文献：[easy-rsaでプライベートCA(認証局)を作ってオレオレ証明書ではないローカル用TLS証明書の管理をする](https://r-o-head.tk/post/private-ca-with-easy-rsa/)

# サーバー鍵

## 有効期限

これから作る証明書の有効期限を100年にしておきます。忘れた頃に期限が切れるとパニクりますので。

参考文献：[【AWS Client VPN】OpenVPN easy-rsaでサーバ証明書の有効期限を100年にする - (技)DENET 技術ブログ](https://blog.denet.co.jp/easy-rsa_validity/)

[前回](https://qiita.com/katz_engineer/items/afd9435bb8a04e33ee8b)の続きでしたら、CAの有効期限は設定しましたが、証明書の有効期限は設定していません。

```console
cd /opt/CA/demoCA/
grep EASYRSA_CERT_EXPIRE vars
```

この場合は下記のコマンドを実行します。```EASYRSA_CERT_EXPIRE```の設定が済んでいたら下記は不要です。

```console
echo 'set_var EASYRSA_CERT_EXPIRE "36500"' >>vars
```

## 鍵生成

EasyRSA の新しいバージョンでは、秘密鍵やCSR（Certificate Signing Request、証明書署名要求）を作らなくてよいらしい。コマンド一発で全部やってくれちゃいます。

サーバー名が```example.home```の場合、下記コマンドを実行します。
途中で認証局 demoCA のパスフレーズを要求されますので、それを入力します。

```console
cd /opt/CA/demoCA/
./easyrsa build-server-full example.home nopass
```

生成された各ファイルは、pkiディレクトリ内の各サブディレクトリに格納されます。

- 秘密鍵: ```pki/private```
- 証明書要求: ```pki/reqs```
- 証明書: ```pki/issued```

## 鍵確認

生成した鍵を確認。

```console
# openssl x509 -text -in pki/issued/example.home.crt -text | grep -E "Issuer:|Subject:"
        Issuer: CN = demoCA
        Subject: CN = example.home
```

有効期限は100年後になっています。

```console
# openssl x509 -dates -noout -in pki/issued/example.home.crt
notBefore=Dec 15 06:26:22 2022 GMT
notAfter=Nov 21 06:26:22 2122 GMT
```

# 仕舞い

鍵を作って署名するのは簡単でした。

本当は、この鍵を仕込んで何かのサーバーが暗号化されるのを確認したかったのですが、それはまた今度。サーバーを何も立てていないので。うーん残念。

とはいえ、これで暗号の為の鍵が出来ました。やったね:thumbsup_tone2:
Power Appsの活用例 - ヒースロー空港

Power Appsというプログラムについて聞いたことはあるがどう使ってどう活用しならいいかがわからない方がいると思います。今回、MS-Learnに載っているユーザーケースを基にまとめてみましたのでご参考になれば幸いです。

以下は参考したページのリンクです
* [顧客ケース スタディ - ヒースロー空港][MS-Learn1]

* [実行中の Power Apps][MS-Learn2]

[MS-Learn1]: https://learn.microsoft.com/ja-jp/training/modules/introduction-power-apps/3-customer-case-study-heathrow-airport

[MS-Learn2]: https://learn.microsoft.com/ja-jp/training/modules/introduction-power-apps/4-power-apps-action


簡単にPower Platformに関して知りたいと思っている方は以下のリンクをご参照ください
* [PL-900 : Microsoft Power Platformとは][MS-Learn3]

[MS-Learn3]: https://qiita.com/fsdg-yook/items/64566bd47da9ac489855



# 顧客ケース スタディ - ヒースロー空港
* ヒースロー空港
    * 世界で最も込み合う空港の 1 つ、複雑さと交通量において小さな都市をモデルにしている
    * 1 日に 76,000 人以上が働き、200,000人の旅行客が通過するため、継続的に運用を最適化することが強く求められている
    * 上記目標を達成するためにはプロセスのデジタル化を行うこと
    * この取り組みの一環として、全従業員にMicrosoft Office 365を導入し、PowerAppsを使用

* アプリには数千のプロセスを簡単に組み込むことができる　→　数百の開発者と数年分の作業量を削減

* 現場の従業員であるSamit SainiさんがPower Appsを用いてアプリを作成し、問題を解決することができたことでデジタル変換のプロセスを実現した
→　ビジネス変更マネージャーからOffice 365の価値について調査依頼があり、調べたところ、Power Appsということがわかった
* Sainiさんはセキュリティ情報を他言語に翻訳するアプリケーションの開発を開始（アプリ管理）
→　以前まではセキュリティチェックポイントにあるブックに保管されていた
* このアプリの成功から現在は複数のアプリが作られている
* 多くの人々が独自のアプリを作り、繰り返しの工数削減に貢献している

上記関連サンプルアプリケーション作成についてはこちら
https://www.microsoft.com/ja-jp/videoplayer/embed/RE4mPeJ?postJsllMsg=true&autoCaptions=ja-jp
【Docker】React+Nginxの環境を作ろうとしたときのエラー 

Dockerでビルド時にエラーが出たのでとりあえずの解決策があったのでメモ
※間違っていた場合、コメントで教えていただけると幸いです

React+Nginxの環境をDockerで作ろうと思い、[こちらのサイト（How to Serve a React App with nginx in Docker）](https://typeofnan.dev/how-to-serve-a-react-app-with-nginx-in-docker/)を参考に構築を行った。

1. reactアプリの作成
`yarn create react-app {プロジェクト名} --template typescript`
作成したプロジェクトに移動

2.Dockerfileの作成
`touch Dockerfile`
私はここでDockerfileをタイポしていたのでお気をつけて・・・

3\. .dockerignoreの作成
`echo "node_modules" > .dockerignore`

4\. Dockerfileの記述
```
# Multi-stage
# 1) Node image for building frontend assets
# 2) nginx stage to serve frontend assets

# Name the node stage "builder"
FROM node:10 AS builder
# Set working directory
WORKDIR /app
# Copy all files from current directory to working dir in image
COPY . .
# install node modules and build assets
RUN yarn install && yarn build

# nginx state for serving content
FROM nginx:alpine
# Set working directory to nginx asset directory
WORKDIR /usr/share/nginx/html
# Remove default nginx static assets
RUN rm -rf ./*
# Copy static assets from builder stage
COPY --from=builder /app/build .
# Containers run nginx with global directives and daemon off
ENTRYPOINT ["nginx", "-g", "daemon off;"]
```

5\. docker build
`docker build -t {プロジェクト名} .`を入力して実行

エラー発生！！
```
 => ERROR [internal] load build context   

rpc error: code = Internal desc = stream terminated by RST_STREAM with error code: PROTOCOL_ERROR
```

[こちらに書かれているページ](https://forums.docker.com/t/docker-build-not-working-rpc-error-protocol-error/121584/3)によると`.dockerignor`を`.dockerignor2`にすると動くようです。
実際私も試してみましたが、正常に動きました。これで大丈夫なのだろうか・・


正常に動くもののもう一つエラーが出力されました
```
=> ERROR [builder 4/4] RUN yarn install && yarn build 

#12 65.77 error expect@29.3.1: The engine "node" is incompatible with this module. Expected version "^14.15.0 || ^16.10.0 || >=18.0.0". Got "10.24.1"
```

nodeのバージョンが×といわれているのでとりあえず`16.10.0`にしておきます。
Dockerfile↓
```
FROM node:16.10.0 AS builder
```
完全無料でAWS IoT！enebularエージェント実行環境を試してみた。

# はじめに

2022年12月1日に開催されたenebular meetupで「enebularエージェント実行環境を試してみた。」というタイトルでLT登壇発表しました。

https://enebular.connpass.com/event/264634/ 

LT登壇発表資料はこちら。

https://www.slideshare.net/kitazaki/20221202enebularmeetupkitazakiv1pdf

# 仕組みの調査

仕組みを調査すると、enebular agentとほぼ同じ機能が提供されていることを確認しています。
enebular-awsiot-agentスクリプトが動作しています。(つまり、AWS IoTを利用しています)

```bash
$ sudo systemctl status enebular-agent-ubuntu.service
● enebular-agent-ubuntu.service - Enebular agent
Loaded: loaded (/etc/systemd/system/enebular-agent-ubuntu.service; enabled; vendor preset:
enabled)
Active: active (running) since Sat 2022-11-26 20:06:16 JST; 1h 40min ago Docs: https://docs.enebular.com/
Main PID: 233260 (node)
Tasks: 29 (limit: 1085)
Memory: 202.1M
CGroup: /system.slice/enebular-agent-ubuntu.service
├─233260 node /home/ubuntu/enebular-runtime-agent/ports/awsiot/bin/enebular-awsiot-agent --enable-syslog --daemon-mode --user ubuntu
├─233271 /home/ubuntu/nodejs-v14.19.1/bin/node /home/ubuntu/enebular-runtime-agent/ports/awsiot/bin/enebular-awsiot-agent --start-core --enable-syslog --daemon-mode --user ubuntu
└─234254 node-red
```

<a href="https://docs.enebular.com/ja/getstarted/agentexecutionenvironmenttutorial">公式ドキュメント</a>では、エージェント実行環境で利用できるデバイスはenebular-agentがサポートする推奨ハードウェア(ラズパイなど)とOS (<a href="https://docs.enebular.com/ja/Other/Support.html#enebular-agent">Debian GNU/Linux</a>)としています。

![スクリーンショット 2022-12-15 15.13.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/0c982513-345f-a85a-75bc-008fe85bb153.png)

エージェント実行環境はクラウド環境でも利用できます。

https://qiita.com/kitazaki/items/2700645dfe014bdaf0fe

## 注意点

制限事項は<a href="https://docs.enebular.com/ja/ExecutionEnvironmentAgent/Overview.html">公式ドキュメント</a>に記載されています。

無料枠では、1つのプロジェクトで2つのエージェント実行環境を利用できます。
3つ以上のエージェント実行環境を利用したい場合は、プロジェクトを分ければエージェント実行環境を利用できます。
ログサイズ、送信メッセージ数、送信メッセージサイズにも月次制限がありますので、停止されても困らないように注意しましょう！
もし、停止された場合は次月のJST 9:00(UTC+0:00)になれば制限が解除されます。(クラウド実行環境も同様のサービス仕様です)
Windows11 個人データ暗号(PDE) と Microsoft Purview AIP を併用利用できるか!?

今回は少しマニアックな内容です。
表題の件気になったので、検証してみました。

# はじめに
今回は`Windows11 22H2`の新機能として登場した個人ファイル暗号化の仕組み`PDE(Personal Data Encryption)`とMicrosoft Purviewの機能のうちのファイルを保護する`AIP(Azure Information Protection)`を併用で使った場合の動作について紹介します。

# TD;DR

結論から行くと・・・
AIPとPDEは併用して暗号化しても問題ありません！
両方便利な機能なので是非使ってみてほしいです。

# PDE(Personal Data Encryption)とは

## 概要
たくさんのユーザーが待ち望んだ、ファイルごとに暗号化をかける仕組みです。
これまで一部のセキュリティ製品がファイルごとに暗号化する機能などがありましたが、ついにMicrosoftが標準でできるようにしようとしています。

[Microsoft公式） 個人データ暗号](https://learn.microsoft.com/ja-jp/windows/security/information-protection/personal-data-encryption/overview-pde)

## 利用要件
・Windows11 22H2 Pro edition以上
・Azure AD 参加
・IntuneでPDEポリシーを有効化
・Windows Hello for Business

→ 上記の要件を見るとあくまで、ビジネスの観点での情報漏洩を防ぐ目的が強いです。
→ 個人で利用するには要件のハードルが少し高い・・・

## 暗号化の方式

256ビットキーを持つ`AES-CBC`を使用してファイルを暗号化します。

## 暗号化・複合化のやり方
:::note warn
現在はWindows11で暗号化・複合化をかける機能はなく、APIを呼び出して自身でプログラムを作成する必要があります。
:::

下記の記事で実装方法を詳しく紹介してますので参考にしてください。
（いずれはMicrosoftがもっと簡単に暗号化をかける手法を提供するのだとは思います。）

[Windows11 PDE 暗号化・複合化 実装](https://sec.atd-net.com/pde/)

※後日PDEのソースコードをGithubに公開予定です。

## 暗号化後の挙動

暗号化が完了したファイルは、鍵マークのアイコンが追加され、権限のないユーザーが開いた場合は下記のようなエラーメッセージが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586845/00323548-74cf-ac92-f70e-b3512d0fe5bf.png)

# AIP(Azure Information Protection)とは

## 概要

Officeドキュメントに秘密度ラベルなどを適用してファイルに保護をかけ、情報漏洩の防止ができる非常に優秀な機能です。

[Microsoft公式) Azure Information Protection](https://learn.microsoft.com/ja-jp/azure/information-protection/what-is-information-protection)


## ラベル管理

[Microsoft Purview](https://compliance.microsoft.com/)の管理画面からラベルを作成することができます。
(ソリューション -> 情報保護 -> ラベル　ページ)

個人的オススメは、「社外秘」「公開可能」「最高機密」の3つでシンプルに運用することです。
（少し複雑になりますが部署ごとのラベルを作ることで、会社内での情報規制も可能です。）


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586845/5f83717e-d0ab-30d6-1b93-cd8609669d3e.png)

「最高機密」ラベルの場合は、「Executive」という配布グループのみに適応され、この配布グループのメンバーのみがラベル割り当て＆閲覧可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586845/45c85d55-591b-a36e-8a72-69ff5e4936ba.png)


作成したラベルをラベルポリシーにより、対象のユーザーに適応します。
すると、適応したユーザーでは下記のように秘密度ラベルが選択可能になります。

　※秘密度というエリア新規追加されます
　※私のアカウントは「Executive」配布グループに所属しているので「最高機密」が表示されています。
　※Officeアプリにラベル情報が降りてくるまで少し時間がかかる可能性あります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586845/1b823670-e36c-f910-d14b-de234aa3e0dd.png)

## 保護の方式

`Rights Management`という仕組みを使用して機密ファイルを保護します。

## ファイル保護の挙動

「最高機密」のラベルを割り当てたドキュメントを権限無いユーザーが開くと下記のエラーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586845/794eec83-dd3f-0ac3-a97d-a3f4ab577eb6.png)



# 検証
## ケース：AIPで保護されたデータに対してPDEの暗号化を実施
### 想定シナリオ

データ流出保護のために個人データ暗号化（PDE）をシステム管理者が自動適用するアプリケーションを開発して社内ユーザーに配布する。
AIPで保護したデータにPDEを適用するとどうなるか？

### 結果

AIPで秘密度ラベルをつけて保護されたファイルに対してのPDE暗号は問題なく動作します。
Windows APIで暗号化の処理を呼び出す際にも例外などは出ずに正常に暗号化可能です。


# まとめ

以上が本日の記事です。

情報漏洩への対策が求められる昨今では、PDE・AIPなどの機能が非常に活躍すると予想します。
是非参考にしてください。

# 参考

[Windows11 PDE実装](https://sec.atd-net.com/pde/)
[Windows 11 22H2新機能 個人データ暗号化 (PDE)について](http://jin-kuro.com/windows11-22h2-personaldataencryption-pde/)
Google Calendar APIで予定を登録する

# 0. はじめに
前回の記事([PythonからExcelを操作できるOpenPyXLを使って月報作成を自動化しよう](https://qiita.com/otiba30/items/0ffeddc7101734317f4f))でtxtファイルから月報を作成していましたが、今回はGoogleカレンダーに登録させます。

ソースコードはこちらを参照ください。
- [otiba30/insert_gcal](https://github.com/otiba30/insert_gcal)



# 1. ライブラリ導入
まずはAPI操作に必要なライブラリを導入します。

```sh
$ pip3 install google-api-python-client google-auth
```



# 2. 事前準備

以下のディレクトリ構成を想定します。

```
insert_gcal
├── key
│   └── project-id-AAAAAAAAAAAAAAAAAAA-BBBBBBBBBBBB.json <- 自身で配置
├── script.py
└── shift.txt <- 適宜作成
```

ソースを準備します。

```sh
git clone https://github.com/otiba30/insert_gcal.git
cd insert_gcal
```



## 2.1. Google Cloud Platform(以下GCP)でAPIの準備

### 2.1.1. GCPプロジェクトを作成
- [GCP公式](https://console.cloud.google.com)

### 2.1.2. Google Calender APIを有効化

1. 左上のナビゲーションメニュー -> "APIとサービス" -> "ライブラリ"
2. 中央の "APIとサービスを検索" と記載された検索窓から "Google Calendar API" と検索し、"有効化"

### 2.1.3. サービスアカウントを作成

1. 左上のナビゲーションメニュー -> "IAMと管理" -> "サービスアカウント"
2. 上の "+ サービスアカウントを作成" -> サービスアカウント名だけ入力(他は不要) -> "完了"

### 2.1.4. サービスアカウントの鍵を作成・配置

1. 左の "サービスアカウント" -> 先程作成したサービスアカウントをクリック -> 上の "キー"
2. "鍵を追加" -> "新しい鍵を作成" -> キーのタイプJSON で "作成"
3. 保存された秘密鍵を keyフォルダに配置する

### 2.1.5. 鍵の名前や登録先のGoogleカレンダーアカウントの入力(script.py)

```python script.py
# 予定を接続するGoogle Calenderの設定
scopes = ['https://www.googleapis.com/auth/calendar']
calendar_id = 'XXXXXXXX@gmail.com' <- ここを修正

# JSON鍵を読み込む
key_dir = 'key/project-id-AAAAAAAAAAAAAAAAAAA-BBBBBBBBBBBB.json' <- ここを修正
gapi_creds = google.auth.load_credentials_from_file(key_dir, scopes)[0]
```



## 2.2. 登録先のGoogle Calenderと連携設定する
1. Googleカレンダーを開く
2. 左のマイカレンダー内、登録先となるスケジュールのオーバーフローメニュー -> "設定と共有"
3. GCPの画面左の "サービスアカウント" -> 作成したサービスアカウントをクリック -> メールを確認
4. "特定のユーザーとの共有" -> "+ ユーザーを追加"
5. 先程確認したメールアドレスを入力し 権限を"変更および共有の管理権限" にして送信



## 2.3. シフト表の入力(shift.txt)
2022年12月のシフト表で、2日が日勤で出社、3日が宿直で出社、8日が日勤で在宅の場合は下記のように記述します。

``` shift.txt
2022 12

2 1
3 2
8 3
```



## 2.4. 予定のタイトルや勤務時間の入力(script.py)
シフトのタイトルや勤務時間の編集をします。</br>
日勤が8:30-17:00(8.5時間)、夜勤が16:30-33:30(17時間)の場合は下記のように記述します。

```python script.py
dict_body = {
    1: ['日勤',  8, 30,  8.5],
    2: ['宿直', 16, 30, 17.0],
    3: ['在宅',  8, 30,  8.5]
}
```



# 3. 実行
実行するとGoogleカレンダーに予定が登録されます。

```sh
$ python3 script.py shift.txt
```



# 4. おわりに
各日付の予定ごとにAPI呼び出ししているので、複数の予定を1回のAPI呼び出しで登録したり、あるいは各日付の処理を並列化させることで処理時間を短縮できます。
前者についてご存知の方はコメントと教えていただけると幸いです。
【U】UTF-8における1文字が占める容量

いつも忘れるのでよく見るやつをまとめました。

## 1バイト

U+0000からU+007Fまでが1byte。
基本的には「日本語JIS配列のQWERTYキーボードで直接入力できる文字」が1バイト

- 日本語(JIS)配列のキーボードにおいて、数字がある段で直接入力可能なすべての記号 `!"#$%&'()-=^~\|`
- 日本語(JIS)配列のキーボードにおいて、右の方で直接入力可能なすべての記号 `` ,.<>/?_;:+*[]{}`@ ``
- 半角アルファベット大文字 `ABCDEFGHIJKLMNOPQRSTUVWXYZ`
- 半角アルファベット小文字 `abcdefghijklmnopqrstuvwxyz`
- 半角アラビア数字 `0123456789`
- ASCII制御文字 `ヌル文字(U+0000)、半角スペース(U+0020)など`

## 2バイト

U+0080からU+07FFまでが2byte。

- ラテン文字の補助・拡張
    - ©`U+00A9`や®`U+00AE`
    - マクロン付きアルファベットはここ
- IPA拡張
    - 発音記号はここ
- コプト文字、ギリシア文字、キリル文字、アルメニア文字、ヘブライ文字、アラビア文字、シリア文字、ターナ文字、ンコ文字
    - シリア文字拡張は3バイト

## 3バイト

U+0800からU+FFFFまでが3byte。

- 2バイト以下でない殆どの文字
    - ひらがな・カタカナはすべてここ
    - 半角カタカナもここ
    - 常用漢字はすべてここ
    - その他使う頻度が高い漢字はだいたいここ

## 4バイト

U+10000からU+10FFFFまでが4byte。

- 古代文字
    - 線文字B、楔形文字など
- 仮名補助
    - 変体仮名とか
- 音楽記号
- 数学用英数字
    - なんかかっこいい感じの文字はデフォルトで入ってる
- 囲み漢字 `🈀🈁🈂🈐🈑🈒🈓🈔🈕🈖🈗🈘🈙🈚🈛🈜🈝🈞🈟🈠🈡🈢🈣🈤🈥🈦🈧🈨🈩🈪🈫🈬🈭🈮🈯🈰🈱🈲🈳🈴🈵🈶🈷🈸🈹🈺🈻🉀🉁🉂🉃🉄🉅🉆🉇🉈🉐🉑`
- 絵文字
- 錬金術記号(?!?!)
- その他色々

サロゲートペアとかのせいでこの限りでない(主に絵文字)こともある
GitHub Actionsで実行しているPHPUnitでOpenSSL関連のエラーが突然出るようになったときの対応

# 発生したこと
突然CIでOpenSSL関連のエラーが出るようになった。
以前CIをとおったコードをReRunしてもエラーがでてしまう。
また、同じコードをローカルでテストすると正常終了する。

# 切り分け
- ローカルとCIでPHPのVerは一緒
- エラーはOpenSSL関連の箇所で発生

という状況だったのでOpenSSLのVerを確認
```
# ローカル
$ php --ri openssl | grep Version
OpenSSL Library Version => OpenSSL 1.1.1s  1 Nov 2022
OpenSSL Header Version => OpenSSL 1.1.1s  1 Nov 2022

# CI
$ php --ri openssl | grep Version
OpenSSL Library Version => OpenSSL 3.0.2 15 Mar 2022
OpenSSL Header Version => OpenSSL 3.0.2 15 Mar 2022
```

# 対策
[ubuntu-22.04 が GA ⚠破壊的変更注意⚠ [GitHub Actions]](https://zenn.dev/snowcait/articles/73e42154ed4654) を参考に
`runs-on: ubuntu-latest` を `runs-on: ubuntu-20.04` に変更したらOK

# 補足
OpenSSLが3.0になった場合
[openssl_encrypt](https://www.php.net/manual/ja/function.openssl-encrypt.php)のoptionsにOPENSSL_RAW_DATAを設定していてもOPENSSL_ZERO_PADDINGと同じ結果になってCIがコケてた。

深堀りすると嵌りそうだったので… `runs-on: ubuntu-20.04` にして逃げた
Azure Administrator(AZ-104)：Azure管理者向けの前提条件「PowerShellスクリプト(パラメーター)」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「PowerShellスクリプト(パラメーター)」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure 管理者向けの前提条件](https://learn.microsoft.com/ja-jp/training/paths/az-104-administrator-prerequisites/)
◇対応するモジュール
[Azure PowerShell でスクリプトを作成して保存する](https://learn.microsoft.com/ja-jp/training/modules/automate-azure-tasks-with-powershell/7-create-resource-using-script)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure管理者向けの前提条件「PowerShellスクリプト(ループ：Do)」](https://qiita.com/fsd-jume/items/66388be0c9d724318dcd)

## PowerShellスクリプト(パラメーター)
・スクリプト内で定義したパラメーターを、実行時にコマンドライン上で入力して指定可能
・指定する際のパラメータ名の入力は任意
⇒入力しない場合は定義した順番通りに設定される
```powershell:testscript.ps1
param ([string]$location, [int]$size)

Write-Host "`$location = " $location
Write-Host "`$size = " $size 
```
**※コードの意味**
**・param ([`データ型`]$`パラメーター名`)**
実行時にしているパラメーターを定義(複数可能)
　-データ型：省略可能
**・「\`」**
エスケープ文字
今回の場合は`$`の前につけることで、`$`を文字として扱う
```powershell:PowerShell(パラメーター名を指定)
.\testscript.ps1 -size 5 -location "East US"
```
```powershell:PowerShell(パラメーター名を指定しない)
.\testscript.ps1 "East US″ 5
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/3d98f5d1-b8b8-a024-7048-56da4a10e55c.png)
**※コマンドの意味**
**・.\\`スクリプト名` (–`パラメーター名`) `パラメーター値`**
パラメーター名を指定してスクリプトを実行可能
　-パラメーター名を指定した場合：順番に関係なく、指定したパラメーターに値が格納
　-パラメーター名を指定しない場合：定義したパラメーターの順番通りに値を格納

## 次の学習内容
**◆Azure CLIとスクリプト**

https://qiita.com/fsd-jume/items/f7964bee1c6a50cbeb93

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
Platioに登録した水やりの時間をGoogleカレンダーにも反映してみた

今回は、Platioでアプリを作り、登録したデータをGoogleカレンダーの予定に反映させるフローを作ってみました。

アプリで登録した予定をカレンダーで日時が見れるようになると便利ですよね。
IT初心者でも、簡単にアプリ作成からGoogleカレンダーへ予定登録ができたのでご紹介します！


## 作成したアプリは「水やり記録アプリ」

Platioの「写真日報」というテンプレートを使って簡単に作ることができました。
中身はこんな感じで、日時は自動登録され、植物の種類を選択するだけの簡単なアプリにしました。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981375/687a3322-53e9-e2ad-5275-5dd773258af2.png)

## 水やりした日時と植物の種類をGoogleカレンダーに登録！

ASTERIA Warpを使って、Platioに登録したデータを取得し、Googleカレンダーに反映する処理をつくります。

### 処理の流れ

処理の流れは以下の通りです。
①Platioからアプリのデータを取得
②Googleカレンダーの予定を登録

## Platio連携の事前設定
Platioアプリに登録されたデータの取得はASTERIA WarpのPlatioアダプターを利用すれば簡単に取得できます！
Platioのミニアプリを作成するときに使う「Platio Studio」のデータビューア―から、開発者向け情報に記載のあるAPI情報をコネクションに登録します。
![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981375/fe18bf31-1518-0f2b-bfba-985ec75bf5d2.png)
接続テストを行い、「成功」が表示されたら設定完了です。
Platioの事前設定は、こちらの1:12～辺りから動画で確認しました！

https://vimeo.com/768416676#t=73

## Googleカレンダー連携の事前設定
Googleカレンダーへの予定登録はASTERIA WarpのGoogle Calenderアダプターを利用すれば簡単に設定可能です！今回はこちらの[Google カレンダーアダプターの紹介](https://support.asteria.com/hc/ja/articles/360003140273 "Google カレンダーアダプターの紹介")を見て設定しました。

## 処理の作成

作ったフローはとてもシンプルです！
![スクリーンショット_20221215_112000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981375/db444878-667d-a741-90f1-b49f9397ce43.png)

Googleカレンダーに登録したい情報を「PlatioGet」コンポーネントで選択します。
![画像111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981375/f1587fbd-492d-be4c-8d27-9187460a6b27.png)
水やりをした「水やり日時」と「植物の種類」の項目を選択して簡単にデータを取得しました。

:::note info
工夫したポイント
マッパー関数の「DateCalc」を使って10分の幅で予定が登録されるように設定しました。
![スクリーンショット_20221215_112125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981375/eea55cbe-9156-a6f3-eebf-acf42047cf5b.png)

:::



### Googleカレンダーを確認

![スクリーンショット_20221215_112036.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981375/3fa008b3-81a0-1863-4891-e38dcbaf6c75.png)

登録された日時に植物の名前がしっかりと登録されています！
初めてPlatioとGoogleカレンダーの連携に挑戦しましたが、IT初心者でも簡単にできました:relaxed:

今回はこちらの動画も参考にフロー作成を行いました:point_down:

<iframe width="560" height="315" src="https://www.youtube.com/embed/e44vdAPOANw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
【livewire】プロパティにnull許容型の型を使用する際の注意点

## 概要
null許容string型で定義した際に
- ``mount()``内で初期化
- nullを入れる
- 値がnullのままリクエストが走る

条件を満たすと未初期化エラーが発生する。

## 再現

こんな感じにnull許容型のstring型を定義します


```php:php
class Index extends Component
{
    public ?string $text;

    public function mount()
    {
        $this->text = null;
    }

    public function hoge()
    {
        dd($this->text);
    }
.....
}
```

```html:blade
<button wire:click="hoge()">aaa</button>
```

aaaボタンをクリックすると

```
Error
Typed property App\Http\Livewire\Top\Index::$text must not be accessed before initialization

```

とエラーが出ます。

## 先に対処

初期化はプロパティの宣言時にやりましょう

```diff_php:php
class Index extends Component
{
+   public ?string $text = null;

    public function mount()
    {
    }

    public function hoge()
    {
        dd($this->text);
    }
.....
}
```

## なんでや？

リクエスト発生時、恐らく
1. クラスのプロパティ初期化
1. フロントから受け取った値を代入する

はずで、

livewireさんは初期化処理を勝手にやってくれる....はずなんですが
``その際に値がnullだったら初期化の際に値を入れてくれない``
んですよね、恐らく。
バグなのやら仕様なのやら
QAに必要なビジネススキル

# はじめに

日々QAとして業務をしている中で、もちろんQAの技術は非常に大切ですが、**同等あるいはそれ以上にビジネススキルが大切**だと感じることが多々あります。こちらの記事では、テスター、設計者、リーダー、マネージャーそれぞれに求められるビジネススキルを記載するとともに、次の段階へレベルアップするためのポイントを書いてみたいと思います。**QAとしてのレベルアップを図りたいと思っている人**の参考になれば幸いです。

**※各項にKindle Unlimitedで読める参考になりそうな本のリンクを張っています。**

# 役割の定義
この記事においては各役割を以下のような形で定義します。
| 役割   　| 業務内容                                                             | 
|:----------|:---------------------------------------------------------------------|
| **テスター** | **テスト実施者。テストやバグチケット起票を行う**|
| **設計者** | **テスト設計者。仕様からテスト観点やテストケースの作成を行う**|
| **リーダー** | **テストリーダー。テストの取りまとめやテスト進捗、テスターの管理を行う**|
| **マネージャー** | **テストマネージャー。テスト計画、スケジュール、予算管理、改善業務、チーム全体のマネジメントを行う**|


# 各役割毎の必要スキルについて
### 1.テスターに必要なスキル
テスターにはテストの実行力、不具合を検知する力も重要ですが、ビジネス面としては以下のような能力が必要です。

**①自身のテスト進捗を把握し完了目途を見積もる力**
**②不明点や課題を言語化し報・連・相する力**
**③不具合を適切にバグチケットに記載する文章作成能力**

特に②、③に関わる、状況を説明するために言語化/文章化する能力は、**あらゆる業務における基本的な能力**なので、苦手だと思ったら本を読むなどして習得していきましょう。

参考：生涯使える大人の文章力
https://amzn.asia/d/hdCsLcu


### 2.設計者に必要なスキル

テスト設計者には、QA設計技法以外に、実装仕様を読み取り、テストが必要な内容をアウトプットする力が重要です。
具体的には以下のような内容です。

**①仕様書を読み取り不明点を確認して正確な情報を集める力
②テストの内容や手順などを文章化する力
③必要に応じて観点やパターン、手順をマトリクスや表にまとめて表現する力**

②はテスターの時に培う文章力を用いますが、①はそれに加えてコミュニケーション能力も一定必要となります。
③の**マトリクスや表にまとめる力は、説明資料などを作る際にも重要**なビジネススキルなのでこの段階で意識的に習得しておきましょう。

参考：一生使える見やすい資料のデザイン入門
https://amzn.asia/d/iJZ1LnE

### 3.リーダーに必要なスキル

テスト全体の進捗や課題の管理を行い、問題発生時には上長や開発担当へ報告、対応方針を検討、相談して決定事項をメンバーに展開します。QA的なスキルは前提となり、以下のようなビジネススキルが重要となります。

**①テスト全体の進捗を管理する力
②メンバーや開発側からの課題や報告、連絡事項を取りまとめて文章化する力
③各メンバーや上長、開発担当者とコミュニケーションを取り報・連・相を行う力**

テストリーダーは進捗管理、課題管理の力が重要になるほか、各セクションとのコミュニケーションが業務の主な内容となります。
メンバーの状況を取りまとめる、メンバーの声を聞くといった**マネジメントの要素も入ってくる**ので、意識的に勉強していきましょう。

参考：新 コーチングが人を活かす
https://amzn.asia/d/gX1TBdi

### 4.マネージャーに必要なスキル

案件全体のテスト工程を管理し、テストの計画を立て、スケジュールや工数、費用を見積もり、開発担当と調整を行います。
リーダーレイヤでは対応できないような課題が発生した場合、開発側の上位層と相談し解決を図り、改善策の提案もします。
それ以外にリーダーやメンバーに対するマネジメントも行います。必要なスキルは以下です。

**①計画を立て、スケジュールや工数を見積もりドキュメント化する力
②課題の状況や改善のための資料を作成し報告/提案を行う力
③リーダー、設計者、テスターに対するマネジメント力**

テストマネージャーは案件全体をマネジメントする立場になります。
案件開始時は計画を立てて開発側とすり合わせ、それをリーダーやメンバーに共有しQA全体を推進していく立場です。
それまでに培ってきた経験を発揮し、リーダーシップをもって方針を決め、開発側の役職者とも対等にコミュニケーションを取っていく総合的な力が求められます。
**自分がやること、人に任せるべきことを意識**し、人の動かし方を勉強していきましょう。

参考：AI分析でわかった　トップ5%リーダーの習慣
https://amzn.asia/d/gAnvZxT

# ビジネススキルの勉強方法

QA技術は資格試験があり勉強もしやすいですが、ビジネススキルは実践ベースなところがあるので勉強しづらい、と思う方もいるかもしれません。いくつかビジネススキルの勉強法について例を挙げてみたいと思いますので参考にしていただければ幸いです。
### ①本を読む
上で記載したような本を読んでみるとそれだけで様々な気づきに繋がります。
**資料作成の本などは手元に置いておいて、作成時に常に見る**等、意識的に実践すると良いと思います。

### ②セミナーに参加する
ビジネススキルに関する様々なセミナーを調べてみると色々出てきます。上長と相談して可能なら参加してみると良いでしょう。
その際、きちんと**レポートを作成することを意識する**と自身の学びにもなり、他者にも共有できるのでお勧めです。

### ③意識的に業務での成長機会を増やす
例えば、
**・テスターであれば、打合せ等議事を意識的に取って文章作成能力を鍛える
・設計者であれば、日々の課題などを意識的に資料化して作成能力を鍛える
・リーダーであれば、意識的な1on1等を行いコミュニケーション能力を鍛える
・マネージャーであれば、大型案件で必ずテスト計画を意識的に立てて計画力を鍛える**

等、自身で能力を伸ばすための機会を自分に課すと成長につながります。


# 最後に
いかがだったでしょうか。各役割においてビジネススキルが重要であることが伝わったかと思います。
特に、テスターから設計者、リーダーと、QAとして上の役割を目指したいと思っている人は、**QA技術だけ勉強していてもどこかで行き詰ってしまう**と思います。
そんな時にはこの記事を参考にして意識的にビジネススキルを学び、マネージャー、そしてさらに上の立場を目指してみてください。
質問力を高めるヒント

## はじめに
今年新卒として入社し、初めてのQiitaアドベントカレンダー参加です。

本当は先週末に受けたAWS SysOps Administratorの合格体験記を書きたかったのですが、普通に落ちたので別のことを書いていきます:writing_hand:（リベンジ頑張ります:fire:）

今回の記事のテーマは、タイトルにもある通り **質問力** です。
## 質問力とは

まず、質問力とは、 **物事の不明点や疑問点などを相手に問いかけるスキル** のことだそうです。

そして、質問力を高めることで以下のメリットが期待できます。
<dl>
  <dt>信頼関係の構築</dt>
  <dd>質問力を習得すると、相手の興味や関心、考え方について、会話の中から効果的に引き出すことができ、相手をより深く知ることができます。</dd><br>
  <dt>より多くの情報取得</dt>
  <dd>様々な切り口からより多くの情報を引き出すことができるようになります。</dd><br>
  <dt>問題の解決</dt>
  <dd>質問力を高めることで、課題や障害に対して的確に問い、深掘りすることができるため、問題解決に繋がりやすくなります。</dd>
</dl>

参考：

https://cam-training.jp/news-column/9406

## なぜ質問力の記事を書くのか
そんな質問力の記事をなぜ書こうと思ったかというと、自分の質問を褒められることが多かったなと感じたからです。

新卒入社し、エンジニア配属になってはや半年。入社してからを振り返ると、プログラミングの経験がないので、技術で褒められることはありませんが、質問やコミュニケーションに関しては、度々褒められてきたなと思います。

この記事執筆の機会に、質問で自分が意識していることを振り返りつつ、さらなる自己成長に繋げられたらと思い、このテーマに決めました。

## どんな点を褒められてきたのか

具体的には以下のようなコメントを頂いてきました。ありがたいです！
* 質問のおかげでグループディスカッションが盛り上がった
* 分からないものを放置しない姿勢がいい
* よく質問してくれるから、状態がわかってありがたい
* Slackの質問の仕方が良い


## 質問で意識している7点
以下、意識しているポイントについて書いていきます。まだまだ完璧にできていないものもあるので、反省込みです。

#### ① 15分調べて分からなかったら聞く :alarm_clock: 
気になったら調べ過ぎてしまうので、なるべく15分で区切って質問できるように努力しています。

#### ② 背景や自分がやってみたことも併せて聞く :footprints:
「これをこうしてみたけどダメでした。」「この記事読んだのですが、この点が分かりませんでした。」という背景と併せて質問をすると、やり取りの回数が減り、お互いの負担が少なくなると気づき、なるべく意識しています。

#### ③ タイトルを付ける :bulb:
長文になりそうだったり、複数のタスクを見てもらっている先輩宛のメッセージだったりする場合は、**【チームタスクの○○についてのご質問】** のようにタイトルを付けることにしています。

これは質問に限らずやっていて、ほうれんそう（報告・連絡・相談）でタイトルを付けることを意識しています。**【現状報告と今後の方針確認】** や、**【○○のセットアップについてのご相談】** のような感じです。

自分で後から見返す時も分かりやすいのでお勧めです。

#### ④ スクショ・コード・ログ・関連リンクを付ける :paperclip:
特に開発に関する質問は、コードやログが解決のヒントになることが多いのでマストで付けるように教わりました。文面を考えていると、忘れてしまうことが多いので、ここは引き続き意識していきたいです。

#### ⑤ 口頭ではなく文面で :incoming_envelope:
自分が口頭の方が質問しやすいこともあり、今までは1on1の時間などにまとめて質問していましたが、文面の方が
* 先輩が好きな時間に返信できる
* 記録に残って見返せるし、後から検索できる

というのを教えていただき、そこからはまずSlackで質問し、回答をSlackでやるのかオンラインで話しながらやるのかの判断は先輩にしていただいています。

質問のやり取りが見返せるのは、休み明けの仕事の思い出しにも役立っていて良いです。
ただ、次々に思い浮かぶ疑問を簡潔な文章に落とし込むのが難しく、作成に時間がかかったり、後回しにしてしまったりすることがあるので、数を重ねて文章力を鍛えていきたいと思います。

#### ⑥ 絵文字を付ける :smile:
長文で質問を何個もすると、自分的には詰めてるみたいな印象を受けるので、絵文字を意識的に使うようにしています。質問の後に、「よろしくお願いします:bow:」みたいに付けることが多いです。

自分の余裕のなさや事態の緊迫感によって付けないこともありますが、印象を和らげる意味でも良いかなと思います。

#### ⑦ 問い合わせや先輩の文面から学ぶ :pencil:
今の部署では、コンサルさんからの問い合わせを受ける仕事を行っており、その文面はかなり参考になります。あとは、先輩の質問の方法などを見て、良いなと思ったものは取り入れています。
最近でいうと、最初にお願いを簡潔に記した後、問題・現状・背景・質問を書いていた依頼は読みやすくて分かりやすかったです。


以上、7つです。引き続き、意識していきたいと思います。

## おわりに
今回は質問力と、それに関して自分が意識していることに関して、記事を書いてきました。自分が当たり前にしていたことも、文章におこして振り返ってみると、改めて意識するきっかけになって良いなと思いました。

引き続き、質問力を鍛えつつ、スキルアップも頑張っていきたいと思います。

何か参考になることがあったら嬉しいです:sunny:
冬休みに見たいIT系の映画！

## はじめに

こんにちは！学校で情報を学んでいる学生です！

プログラミングは自分にとって難しく、もうやりたくないとなる瞬間が多々あります、、

そこでプログラミングに対するモチベーションを上げて思わずプログラミングをやりたくなるような映画を紹介したいと思います！！！


## ソーシャル・ネットワーク
![eiga1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982399/89314b90-7573-ce4a-f7c7-71e4b2e39400.jpeg)

Facebookの創業者であるマーク・ザッカーバーグが如何にしてFacebookを作り上げたかという実話に基づいた物語「ソーシャル・ネットワーク」です！

コンパで女の子に冷たくされた腹いせに、寮にこもった後にイタズラHPを一夜にしてつくり上げるシーンが印象的です！

口論からインターネット上で悪口を書き込むまでに発展し、ついには訴訟にまでなるという作品です！

コードを書く様がリアルに描かれる場面や曇りガラスにアルゴリズムを書きなぐる場面などプログラミングがしたくなること間違いなしの一本だと思います！！！


## イミテーション・ゲーム
![eiga2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982399/9623d069-7f95-7edf-7ac6-8c4bb237309b.jpeg)

当時、ナチスが通信のために使っていて解読不能と言われた暗号機の「エニグマ」を英国の数学者や暗号解読者などが解析するという物語「イミテーション・ゲーム」です！

実在した人物を描いた物語にはタイピングシーンはありませんが、コンピューターの生みの親とも言われるアラン・チューリングの繊細で不幸な歴史を知ることができコードを書いたりするエンジニアやプログラマーにとって貴重な作品になっていると思います！！！


## サマーウォーズ
![eiga3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982399/c5b6054b-75b4-58bc-ea7f-dd48ea570a82.jpeg)

天才的な計算力を持つ主人公ケンジが、世界中の人々が使っている仮想世界OZで起こった大規模ハッキング事件に巻き込まれる物語「サマーウォーズ」です。

また恋愛ストーリーや友達とのつながりを教えてくれるため見ていてとても面白いです！

劇中で使われているプログラミングコードが何であるかがネット掲示板やSNSで特定作業が行われ、現在は日本生まれのプログラミング言語「Ruby」であるとされています！

物語のクライマックスでケンジが、「お願いしまああす！」と叫びながらエンターを叩くシーンがとても印象的です！

こんな世界があったらいいな～と感じながら楽しむことができる映画だと思います！


## おわりに

いかがでしたか？？？

冬休みを活用して思わずプログラミングをやりたくなるようにぜひ今回紹介した映画を見てみてください！！！
Best Security Operations Center (SOC) Practices for your organization

Security ratings are increasingly important in security operations centers (SOC). To effectively contribute to the development of organizational-wide security culture, security analysts must learn to read, analyze, and report security ratings. Here, we go over how analysts may create a security operations center that effectively uses ratings to assess and reduce cyber threats.
![Best Security Operation Center-Blog 1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277629/54514989-b3d1-ece5-5edb-c94ce10019ce.jpeg)
A security operations center serves as the focal point for an organization’s monitoring, detection, response, and analysis of cyber threats. The SOC constantly keeps an eye on everything, including internal network traffic, desktop PCs, servers, endpoint devices, the Internet of Things (IoT), databases, and other things.

![Best Security Operation Center-Blog 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277629/ab218f8a-041c-0e7d-d0d2-65ad35e3bdb4.jpeg)

SOC team members often aren’t focused on creating the security strategy itself; instead, they’re there to put that strategy into action, which includes putting defensive measures in place as needed and assessing the fallout after an incident. Teams employ technology to collect data, check endpoints for vulnerabilities, and verify regulatory compliance while protecting sensitive data.

A clearly defined security strategy that is in line with corporate objectives forms the basis of the SOC’s activity. From then, a variety of tools, features, and functions must be used to build and maintain your infrastructure to deploy and support the plan.

Source: https://www.esds.co.in/blog/best-security-operations-center-soc-practices-for-your-organization/
本番環境用のgemを開発環境にインストールしたくない時の対処法

本番環境ではpostgresを使いたいけど、開発環境ではsqliteを使うという場合は、Gemfileを編集して開発環境と本番環境のgemを分けるようにする。

開発環境
```
group :development, :test do
    gem 'sqlite3', '1.4.2'
end
```

本番環境

```
group :production do
  gem 'pg', '1.1.4'
end
```


開発環境に本番環境用のgemを入れないために以下を実行

```
bundle config set --local without 'production'
```