OmniAICreator/Qiita-1.07M huggingface dataset:
データエンジニア/データアナリスト/データサイエンティストの違いを考える

## はじめに
はじめまして。

パーソルプロセス＆テクノロジー株式会社（以下パーソルP&T）、システムソリューション（SSOL）事業部所属の出利葉です。

私はモビリティソリューションデザインチームに所属しており、
**モビリティ（ここでは移動手段全般）に関するサービスを考えたり、アプリを構築したり**しながら、
いわゆる**「MaaS」**に取り組んでおります。

私は、BIツールを使ったデータの可視化やデータ分析を担当するべく勉強中です。
そのため、出利葉担当の記事では、BIツールを使う際のちょっとしたTipsや、データ分析にまつわる知識を紹介できたらと思っています。

## 本記事の内容
データ分析ができるエンジニアって、結局肩書は何？と思って調べていくと、どうやら以下のような職種があるようです。

- データエンジニア
- データアナリスト
- データサイエンティスト

どれも名前は聞いたことがあるけど、一体何がどう違うの？と思った方向けに、本記事ではこれら3つの職種の違いについて説明します。

## データエンジニア
データ分析を行うためには、まずデータがないと始まりません。
しかし、「ビックデータ」という言葉に代表されるようにデータ分析に利用するデータは大量になることが多く、
それらを適切に扱えるデータ基盤や分析環境を構築するには、専門的な知識が必要になります。
この、**「データ分析に必要な環境を用意する」**役割が、データエンジニアです。
データ基盤/分析環境の設計・開発・運用を一手に担い、後述するデータサイエンティストやデータアナリストがスムーズに
データ分析業務を行える環境を提供する、縁の下の力持ち的ポジションです。
そのため、データエンジニアになるためには、RDB/NoSQL両方のDBの設計・構築・運用するスキル、
DBを構築するための基盤となるサーバーやネットワーク、クラウドなどインフラを設計・構築・運用するスキル、
Hadoop、Sparkなど大量のデータを扱うための分散処理フレームワークを使いこなすスキルなどが必要になります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1457643/377276cf-bcbf-6e62-37a3-fe5a28bd8b55.png" width=20%>

## データアナリスト
データエンジニアが構築したデータ基盤に蓄積されたデータを可視化したり、分析したりするのが、データアナリストです。
「どのように見せたいか」に合わせて膨大な量のデータの中から必要なものを見分け、時にはデータを並べ替えたり、
変換したりするため、**データを分かりやすく見せるプロフェッショナル**といえます。
データを可視化するために利用するBIツールを使いこなすスキルや、データ分析に必要な統計学の知識、
Python、Rなどのプログラミング言語、SQLを用いたデータ操作スキル、必要なデータを抽出したり、見せるのに適切なグラフを選択したりするためのロジカルシンキング力などが必要になります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1457643/93b7d96e-3148-a5fa-afb0-d288775ba3d6.png" width=30%>

## データサイエンティスト
データの可視化・分析に加え、分析した結果を課題解決やビジネスにどのように活用するのかを考え、提案するのがデータサイエンティストです。
データアナリストに必要なスキルに加え、**顧客の課題を理解し、データ分析の結果から適切な解決策を打ち立てて提案する**ビジネススキルが必要になります。
業務内容によっては予測的分析をするために機械学習やAIの知識が要求される場合もあります。
とはいえ、データアナリストもコンサルティング業務としてデータ分析結果から課題解決やビジネス活用のための施策検討を
行うこともあるため、両者に明確な職種としての違いはないとされています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1457643/46d5f691-c91b-eb1e-6448-7c8998a0c178.png" width=30%>

## まとめ
データ分析に関わる職種には以下のような特徴があります。

- データエンジニア：データ基盤の設計・構築・運用を行う。
- データアナリスト：データの分析・可視化を行う（課題の解決策やビジネスへの活用方法の検討まで行うこともあり）。
- データサイエンティスト：データ分析の結果から課題の解決策やビジネスへの活用方法を検討する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1457643/c0c960cb-8125-b99b-e9c4-3db66d9e9f80.png" width=80%>


## 参考
[データエンジニアとは？仕事内容から年収、必要スキル、資格まで徹底解説]( https://www.bigdata-navi.com/aidrops/1171/)
[データアナリストの業務内容や必要なスキル、取得すべき資格を解説]( https://www.creativevillage.ne.jp/64040)
[初心者でもわかる！データサイエンティストとは −仕事内容、スキル、勉強法、資格まで徹底解説]( https://ainow.ai/2020/01/14/182130/)
[データサイエンティストとデータアナリスト、データエンジニアの違い]( https://pazot.hatenablog.com/entry/data-science-job-diff)

## 宣伝
モビリティソリューションデザインチームのQiitaでは、「MaaS」に取り組む中で現在活用している、
もしくは活用する予定の技術やサービスやとりあえず発信したいことなどなど、幅広く執筆しています。
メンバーごとに違った内容を発信していきますので、お楽しみに！

また、「MaaS」について詳しく知りたい方は、チームメンバーの吉田がnoteにて記事を掲載しておりますので、
ぜひそちらをご覧ください。
[「MaaSとは」でたどり着いて欲しい記事　（1/3 前編）](https://note.com/ppt_msdg_maas/n/naae427dbc37c)
[「MaaSとは」でたどり着いて欲しい記事　（2/3 中編）](https://note.com/ppt_msdg_maas/n/na45c90b2f02f)
[「MaaSとは」でたどり着いて欲しい記事　（3/3 後編）](https://note.com/ppt_msdg_maas/n/n8fd724f7db6c)

最後まで読んでいただき、ありがとうございました。
[Rails]アプリケーション処理の基礎知識MVCとは

# はじめに
以前習ったMVCについて改めて整理をする。

# 1.MVCとは
モデル/ビュー/コントローラという役割の総称。webアプリケーションシステムの処理の構造を表している。

# 2.ルーティングとは
クライアントから送られたリクエストを振り分ける。（リクエストの行先を指定する）
`*configディレクトリの「routes.rb」に記述します。`

# 3.コントローラー（C）とは
コントローラーは、MVCの役割の一つです。
リクエストに対応する処理を決めておき、ルーティングからリクエストを受け取って処理を行ったあと、クライアントにレスポンスを返します。
またレスポンスに必要となるデータがあれば、他の役割と連携してデータを所得したり受け渡しを行い、レスポンスを完成させます。
`*コントローラ作成：rails g ファイルの種類 生成するファイル名`
*基本的には指定する7つのアクションに処理が分類される
・index
・new
・create
・show
・edit
・update
・destroy

# 4.ビュー（V）とは
ビューはMVCの役割の一つです。
ブラウザにレスポンスとして返す見た目を設定します。
ブラウザに表示できるのはHTMLファイルですが、Rubyを埋め込むことができるERB（テンプレートエンジン）を使用すれば、Rubyの記述を埋め込めます。

# 5.モデル（M）とは
モデルはMVCの役割の一つです。
データーベースへのアクセスなど情報のやり取りに関する処理を担当しています。
モデルがあればベータベースにあるテーブルを管理できるようになります。
`*モデル作成：rails g model モデル名`

# 終わりに
Webアプリケーションの基礎になるので、頭に叩き込みたいと思います。
node.js + Expressサーバーのポートを変更する

<p>
初期設定ではlocalhost:3000となっているが、
bin/wwwファイルを変更することでポートを変更できる。
</p>
<p>
この点を
</p>
```
var port = normalizePort(process.env.PORT || '3000');
```
<p>
このように
</p>
```
var port = normalizePort(process.env.PORT || '4000');
```
<p>
これでローカルでwebサーバーを立ち上げる際にポートを分けることができる。
</p>

<h3>参考</h3>
<a href="https://stackoverflow.com/questions/18008620/node-js-express-js-app-only-works-on-port-3000">stackoverflow</a>
ReactでCSSの条件式適用

<h1>三項演算子を使う</h1>
<p>例）ダークモードにする</p>
```react
export default function App() {
  const { isDarkMode } = useDarkMode();
    
  return (
    <main className={`body ${isDarkMode ? "body-dark" : "body-light"}`}>
      <Routes />
    </main>
  );
}
```
<p>cssのクラスを関数(useDarkMode())で真偽値を変更させる。</p>
「95％の習慣化達成率を実現する方法～ハビットエンジニアリング～」で学んだこと(デブサミ2021夏)

# はじめに

本稿は、Developers Summit 2021 Summer の以下のセッションで学んだことを書きます。

セッション名：95％の習慣化達成率を実現する方法～ハビットエンジニアリング～
講演者：片岡 俊行[ゆめみ]
セッション詳細：https://event.shoeisha.jp/devsumi/20210730/session/3225/


# 学んだこと

以下の7つの仕事術を行うことで、習慣化が達成できることを学びました。

## 1. 範囲目標

高すぎる目標だけあった状態では、習慣化は達成できない。

重要なポイントは「範囲目標」を定義して、ミニマムの最低の目標を立てること。
範囲目標とは、Max / Minを決めて、その範囲に収まってればOK！とする考え方。
ミニマムの最低の目標は、バカらしい目標でよい。
例えば、「毎日、書籍を開いて1文だけ読む」。
バカらしい目標でも、それを行うことで「脳が達成した」という快感を受けて、それが継続に繋がる。

## 2. コミュニティの力
継続する上で、コミュニティの力を活用するとよい。
身近な友達に、毎日その目標に対する結果を報告することがおすすめ。
やってもやらなくても報告する。
友達がいない場合は、[「みんチャレ」](https://minchalle.com/)というアプリがおすすめ。

## 3. 過半数の法則
習慣化するためには、過半数を行うことが重要。
1週間の7日間であれば、過半数の4日間ができるようになれば、それが習慣化に繋がる。

## 4. トリガー設計
何かをしたら、ついでに何かをやるという、トリガーを決めると、習慣化しやすい。

## 5. ネガティブ化
逆に、自分から遠ざけたいやめたい習慣をやめるためには、それに対してネガティブに想像する。
例えば、太るからコーラを飲みたくないけど飲んでしまう場合に、コーラにはドブネズミの汁が入っているという想像をして、それを飲もうとするイメージを2時間くらい行う。そうすれば、コーラに対してネガティブになり、遠ざけやすくなる。

# 6. 積読のススメ
積読はネガティブだけど、続けていい。
書籍をまず、少しだけ読んで味見をする。それでその書籍が自分にとって、どれだけの価値があるのかを測る。

これにより、10冊の積読があったとしても、その10冊の中から選りすぐりの価値の高い1冊を読むというマインドになれば、積読はネガティブにならない。

## 7. 月曜日が楽しくなる
土日がプライベート、月～金が仕事と分けて考えることで、落差があることで、月曜が辛く感じる。
その落差を減らすような思考をするとよい。
例えば、土日に書籍を読むことは、それも仕事と考えることで、土日も仕事をしていると考えて、落差を減らす。

また、金曜日の仕事の終わり方も大事。
金曜日の終わりに、ポジティブに意味付けを試みる。
そうすると、日曜の終わりに、ポジティブな仕事のイメージが湧くようになる。


# まとめ
習慣化が達成できる仕事術を学びました。
片岡 俊行さんのトークが、以前よりも感情を全面に出して、お笑い芸人みたいに面白く話してくれたのが印象的でした。

ちなみに私は、普段はエンジニアリングマネージャーとして、チームの皆で楽しく開発する施策を色々実施しています。詳しくは以下を参照ください。
[1年以上かけて生産性倍増＋成長し続けるチームになった施策を全部公開](https://qiita.com/kojimadev/items/4b28f801863cf4e8f0da)

Twitterでも開発に役立つ情報を発信しています → [@kojimadev](https://twitter.com/kojimadev)
railsでfont awesomeの一部アイコンが表示されなかった原因

#はじめに

ポートフォリオのアイコンにfont-awesomeを使ってみたけど
ブラウザによって表示されるアイコンと表示されないアイコンがあった。

* chrome : 表示できない
* safari : 上手く表示される

ネット記事で情報収集して解決法を試してみるも上手く行かなかったので
公式ページで表示アイコンの種類を触っていたら
原因が分かったので、まとめておく。



#使用技術

* rails (6.1.4)
* ruby (2.7.3)
* OS (Mac Catalina_10.15.7)



#Rail6 or Rail5

Railsのバージョンによって、設定方法が異なるので注意する。

・Rails6: パッケージ管理ツールyarnを経由してインストールする
・Rails5: gemfileに対象gemを記入し、bundler経由でインストールする

https://pikawaka.com/rails/font_awesome_sass

#font-awesomeの導入【Rails６】

まず、yarn経由でfont-awesomeをインストールする。

```sh:ターミナル

% yarn add @fortawesome/fontawesome-free

```

インストールできたfont-awesomeをJavaScript, scssに読み込ませる。

```javascript:app/javascript/packs/application.js

〜〜省略〜〜

import '@fortawesome/fontawesome-free/js/all';

```

```scss:app/assets/stylesheets/application.scss

〜〜省略〜〜

@import '~@fortawesome/fontawesome-free/scss/fontawesome';

```

これだけで導入完了！



#原因?
そもそも`Pro(有料版)で使用が保証されている`
**`font-awesome6 (Beta版)`**を選択してしまっていた。


完全に公式ページを飛ばし読みしていた結果で自業自得。笑

でも`Beta版`のうち、一部アイコンは
上手く表示されたので、結局の所は確証は持てない。



#font-awesome画面

![スクリーンショット 2021-07-30 11.58.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1380401/c7d95b48-c72a-bd7e-5a8a-ca0b1e9bf679.png)

使用するアイコンを探せたら

![スクリーンショット 2021-07-30 12.04.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1380401/d2a777bb-98c0-54ce-a6d8-4fede7df8a60.png)

これをrailsのビュー（HTMLファイル）に貼り付ける。



#番外: カスタマイズ

```html:〇〇.html.erb

# サイズ変更
<i class="fas fa-bookmark　fa-2x"></i>
                              ↑ 数字を変更
# カラー変更
<i class="fas fa-apple-alt fa-5x" style="color:#7cfc00;"></i>

# アイコンを重ねる
<div class="fa-stack fa-5x">
  <i class="fas fa-mobile-alt fa-stack-2x"></i>
  <i class="fas fa-align-justify fa-stack-1x fa-inverse" style="color:#ddd;"></i>
</div>

```




#参考記事

https://pikawaka.com/rails/font_awesome_sass



#終わりに

CircleCI導入時にRSpecテストでfont-awesomeが要因のエラーが発生したので
改めて、font-awesome導入方法を調査すると、自分が
rails５とrails６のインストール方法を併記していることに気付いた。

そこからrails６仕様にコードを統一してコマンドを実行したら
CircleCIも動作したので、それをきっかけに
以前あげていた当記事を修正した。

最後までお読み頂き、ありがとうございました。
Amazon EC2を利用した仮想サーバー構築方法②(SSH接続)

AWSの初学者です。
前回までで、Amazon VPCによる仮想ネットワークの構築とAmazon EC2によるインスタンスの作成まで行いました。

前回はこちら: <a href="https://qiita.com/iiiiiiiiih/items/413da3ef8dd45bd3217e">Amazon EC2を利用した仮想サーバーの構築方法①(EC2インスタンス作成編)</a>


今回はSSH接続を行います(私はMacを使用していますので、Windowsの場合は方法が異なる可能性があります。ご了承ください)。

# SSH接続とは?

>SSH(Secure Shell)とは、安全に通信を行って、ネットワークに接続された機器を遠隔操作するための通信手段（プロトコル）の１つです。「通信する側とされる側で、SSHでやり取りをしよう！」と取り決めることで安全に通信を行います。

参考記事: <a href="https://qiita.com/shobooon/items/70cc74cd20c8b5b4fe15">初心者がSSHについて学ぶ(´･ω･`)</a>

今回の場合、
「Amazon EC2で作成したインスタンスを、インターネットからログインして操作するためのプロトコル」
がSSH接続となります。

Macでは、ターミナルから「sshコマンド」を入力して、操作を行います。

# SSH接続の手順
sshコマンドは、暗号化された通信をつかって、リモート通信を行うコマンドです。
基本の使い方は以下2点の通り。

>・ssh オプション 接続先
・ssh オプション ログイン名@ 接続先 接続先で実行したいコマンド

参考: <a href="https://www.atmarkit.co.jp/ait/articles/1701/26/news015.html">【 ssh 】コマンド――リモートマシンにログインしてコマンドを実行する</a>

それでは、ターミナルを起動し、以下のコマンドを入力します。

```none:ターミナル
ssh -i ダウンロードしたキーペアファイル ec2-user@起動しているEC2インスタンスのパブリックIPアドレス
```

・ -iオプションとは?
→ 接続に使用する公開鍵ファイル(今回はダウンロードしたキーペアのファイル。拡張子が「.pem」のもの)を指定する。

「ダウンロードしたキーペアファイル」と「EC2インスタンスのパブリックIPアドレス」については、以下の記事で解説しています。

<a href="https://qiita.com/iiiiiiiiih/items/413da3ef8dd45bd3217e">Amazon EC2を利用した仮想サーバー構築方法①(インスタンス作成編)</a>

初めてインスタンスにログインする際には、以下のような接続を確認するメッセージが表示されるそうです。
「yes」と入力すれば進みます。

```none:ターミナル
The authenticity of host ‘起動しているEC2インスタンスのパブリックIPアドレス' can't be established.
ECDSA key fingerprint is ○○○○.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
```

#もし以下のようなエラーが現れて接続できない場合...

```none:ターミナル
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '〇〇.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
```

上記のエラーは、「鍵ファイルのパーミッション(権限)が、他のユーザーも閲覧できる状態になっている」ために発生するそうです。
したがって、「AWSからダウンロードしたキーペアファイルを、自分以外は読み込めないようにする」という設定をする必要があります。

以下のコマンドを入力すれば、鍵ファイルを自分だけが読み込めるよう設定できます。

```none:ターミナル
chmod 400 ダウンロードしたキーペアファイル
```

chmodコマンドの使い方については、以下の通りです。

>chmod 権限設定　ファイルパス
>
(中略)
>
>chmodはファイル or ディレクトリに対する権限を設定するコマンド。
ユーザー区分ごとに権限を設定できる。

参考: <a href="https://qiita.com/ntkgcj/items/6450e25c5564ccaa1b95">chmod コマンド</a>

SSH接続に成功すれば、ウェルカムメッセージが表示され、コマンドを入力できる状態(ログイン状態)になります。

```none:ターミナル
       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

[ec2-user@ip-10-0-1-10 ~]$  コマンドを入力できる状態
```

ログアウトしたい場合は「exit」を入力すればログアウトできます。

以上で、SSH接続については完了です。
次回は「ファイアウォールによる接続制限」を行いたいと思います。

ここまで読んでいただきありがとうございました。
WioLTE: 時刻を取得

次のページを参考にしました。
[GetTime.ino](https://github.com/SeeedJP/WioLTEforArduino/blob/master/examples/basic/GetTime/GetTime.ino)

## プログラム

```text:get_time/get_time.ino
// ---------------------------------------------------------------
/*
	get_time.ino

					Aug/26/2024
*/
// ---------------------------------------------------------------
#include <WioLTEforArduino.h>

#define APN			   "soracom.io"
#define USERNAME		  "sora"
#define PASSWORD		  "sora"
#define INTERVAL  (5000)

WioLTE Wio;
// ---------------------------------------------------------------
void setup() {
	delay(500);

	SerialUSB.println("");
	SerialUSB.println("*** START ***");

	SerialUSB.println("### I/O Initialize.");
	setupLTE();


	SerialUSB.println("### Sync time.");
	if (!Wio.SyncTime("ntp.nict.jp")) {
	SerialUSB.println("### ERROR! SyncTime ###");
	return;
	}

	SerialUSB.println("*** setup *** ccc");

	SerialUSB.println("### Setup completed.");
}

// ---------------------------------------------------------------
void loop() {
	SerialUSB.println("*** Get time ***");

	struct tm now;

	if (!Wio.GetTime(&now)) {
	SerialUSB.println("### ERROR! GetTime ###");
	}
	else
	{
	SerialUSB.print("UTC:");
	SerialUSB.println(asctime(&now));
	delay(100);
	}

	delay(INTERVAL);
}

// ---------------------------------------------------------------
```

## 実行結果
![get_time_jul30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/292fb70e-3715-3c24-140f-30fd8058d3ad.png)


## Arduino IDE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/ebef14d6-f6c7-7695-e025-e2e13bcecc9a.png)
[C言語] exit()と_exit()の違い

なんとなく気になったので調べてみました。

 + exit: プログラムの終了時に呼び出されるライブラリ関数(glibc）
 + _exit: exit の中から呼ばれ、exit_group を呼び出すシステムコールラッパー(glibc)
 + exit_group: プログラムを終了させるLinuxのシステムコール(Linux)

大きな違いは、2つありました。
1つ目は、終了時に atexit や on_exit で登録した関数が呼ばれるか。
2つ目は、バッファされた標準入出力データを終了時にフラッシュするか。

実際にどのような挙動になるのか試してみました。

```c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void bye(void) // mainが終了したら呼び出される
{
	printf("good bye\n");
}

int main(void)
{
	int i;

	i = atexit(bye); // 正常終了時に呼び出される関数を設定
	if (i != 0) {
		fprintf(stderr, "cannot set exit function\n");
		exit(EXIT_FAILURE);
	}
	printf("good morning\n");
	exit(EXIT_SUCCESS);
}
```

実行結果

```bash:
$ ./a.out
good morning
good bye
```
mainが終了した後に atexit で設定した関数が呼び出されています。
ちなみに exit ではなく、return で終了した場合も実行されます。

次に _exit を使用してみます。

```c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void bye(void) // mainが終了したら呼び出される
{
	printf("good bye\n");
}

int main(void)
{
	int i;

	i = atexit(bye); // 正常終了時に呼び出される関数を設定
	if (i != 0) {
		fprintf(stderr, "cannot set exit function\n");
		_exit(EXIT_FAILURE);
	}

	printf("good morning\n");
	_exit(EXIT_SUCCESS);
}
```

実行結果

```bash:
$ ./a.out
good morning
```
atexit で設定した関数が呼び出されませんね。
_exit の場合は呼び出された時点で即座に終了していることが分かります。

## atexit とon_exit
ちなみにこの2つも少し違います。
どちらも正常終了時に呼び出される関数を登録する事ができます。
しかし on_exit に関しては、すべてのプラットフォームで互換性があるとは限らないようです。
したがって、atexit の使用が推奨されているみたいです。

##バッファリングの違い
違いとして、exit では必ず flush され、_exit では一般に flush されないみたいです。

以下実行例です。

```c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
     printf("hello\nworld");
     exit(0);
}
```
実行結果

```bash:
./a.out
hello
world
```
exit なので、flushされていますね。

次に _exit で終了させます。

```c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
    printf("hello\nworld");
    _exit(0);
}
```
実行結果

```bash:
./a.out
hello
```
world の部分が表示されていません。
flush されていないことが確認できます。

ちなみに fflush を使うことで _exit 前に flush させることもできるみたいです。

```c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
    printf("hello\nworld");
    fflush(stdout);
    _exit(0);
}
```

実行結果

```bash:
./a.out
hello
world
```
flushされていますね。


## まとめ
@fujitanozomu さんにバッファリングの違いについて教えていただき勉強になりました。
forkする場合は重複して flush されることを防ぐために、_exit で抜けるのが定番らしいです。
exit と _exit を状況に応じて使い分けたいですね。
エンジニアが英語を勉強するメリット

# はじめに

ここ数年、ビジネスシーンで英語への注目度も上がってきています。
個人で英語勉強を開始された方も多いではないのでしょうか？

私も転職前の企業で英語が必要となり、勉強、利用した経験を踏まえ
私なりの「エンジニアにとっての英語」について考えをまとめてみました。

ちなみに、補足しておくと現在所属している虎の穴ラボでは英語は必須ではありません。

## 結論

結論を先に言います。

エンジニアにとって英語は仕事の幅を広めたり成長するための必須科目ではないと思います。
ただ、英語に触れておけば自身にとってプラスになるのも事実です。
そのため、余裕があれば勉強をお勧めします。ある種の選択科目に近いと考えています。

必須科目ではないと考える理由を簡単に説明します。

まず文章面について。
昨今、翻訳ツールやサービスも充実し、その精度も上がっています。
そのため、それらを利用することで英語を読み書きするハードルは低くなっていると感じます。

次に会話面についてです。
日本で働く外国籍エンジニアのほとんどは、短い日常会話程度であれば日本語も理解もしてくれます。
無理に英語で話さなくても必要最低限のコミュニケーションを取ることもできます。

また、外国籍の優秀なエンジニアと会話した方が成長する、といった意見もありますが、
日本人でも優秀なエンジニアは多数いらっしゃいます。
そのため、無理に英語を覚えなくても日本語のみで十分仕事の幅も広げられるし成長もできます。

ただ、やはりある程度は勉強をしておいた方が自身にとってプラスになるのは事実ではあります。
そのため、少しでも時間や興味があれば触れることはお勧めします。

これから、私なりにプラスになると感じたことを挙げていきます。

## 日本語のプレゼンテーションの質が上がる

要点を先に述べると、英語プレゼンテーション、報告を経験しておくことで
日本語でのプレゼンテーション、報告をする際に精神的余裕が生まれます。

ウェイトトレーニングをされている方は経験があると思いますが、ウェイトをつけてトレーニングをした後
ウェイトを外して同じトレーニングをすると負荷をほとんど感じられなくなると思います。

やはり多くの日本人にとって「英語」というのはウェイト、つまり負荷になります。

英語でのプレゼンテーションは準備から発表までの全工程が負荷をかけた状態になります。
そのため、ある程度の英語で回数をこなした後、日本語でのプレゼンテーションを実施すると
「英語」というウェイトが外れるため、各工程において余裕が生まれます。

精神的、時間的に余裕が生まれることで結果として質が良いプレゼンテーションにつながると思います。

日本語でのプレゼンテーションや報告が苦手な方は、思い切って英語で場数を経験してはいかがでしょうか。

## 外国籍エンジニアと簡単な雑談ができる

英語を勉強していれば出来て当たり前、と思われる方もいらっしゃると思います。

前述の通り昨今は翻訳ツールなども充実しており、その精度も上がっています。
作業指示等の業務連絡であれば、それらのツールで英文を作成しチャットツールで伝えることも可能です。

ただ、天気の話題、休日の過ごし方などの雑談はチームで働く上で必要不可欠だと考えています。
外国籍エンジニアがチームに在籍している場合、雑談を英語ですることはチームビルディングの面で重要です。

技術的な知識習得もメリットがありますが、雑談を通じて私たちが知らない文化を知ることもできるので
英語での雑談は知見を広めるメリットもあります。

そのため、雑談をするために簡単な英語を覚えることはおすすめです。

## クラス、メソッド、関数の命名にバリエーションが増える

ちょっとした小ネタですが、コーディング面でのメリットについても触れておきます。

コーディングをする上で意外と時間がかかるのがクラスやメソッド、変数の命名です。
特に「計算した」「抽出した」「一時的に」といった状態を表す場合は、意外に時間がかかったりします。

その時に、ある程度の英単語、文法を知っておけばスムーズに命名できたりします。

ただ、欠点としてレビュワーが英単語や文法を知っていないとレビュー時に手戻り発生の可能性があるので
乱用には注意が必要です。

そして、変数名に独自規約があるプロダクトでは活用できないケースもあるのでこちらも注意が必要です。

## まとめ

私なりに英語に触れるメリットを述べてきましたが、身近な事でもプラスな点が多いように感じます。
初めは「業務上必須だから」という受け身な姿勢でしたが、結果として英語に触れたことは無駄ではなかったです

もちろん、英語に触れなくても問題はありません。ただ、英語に触れることで自身の知見が広がることは確実です。

英語を勉強するか迷っている方で、少しでもこの記事を読んで英語へのハードルが低くなれば幸いです。
もし機会があれば、私なりの英語勉強方法を記事にできればと思います。
AWS Lambdaのデプロイに必要なIAMポリシーについて

虎の穴ラボのH.Hです。AWSのLambdaを使用した際に調べた内容をまとめました。

AWSのユーザーには細かなIAMポリシーが設定できるが、細かすぎるために新しくサービスを使用する際に必要なIAMポリシーの確認に時間がかかってしまう。だが時間の短縮のために関連するサービスの全てのIAMポリシーをつけると様々な操作ができてしまい、後々問題が発生する可能性が出てきます。
今回Lambdaをデプロイする作業があり調べましたが、必要なIAMポリシーについてまとめられているページが見つかりませんでした。ということでデプロイする際に使用するユーザーを新設し必要なIAMポリシーを確認したのでまとめました。

# コマンドラインからAWSにLambda関数をデプロイするためのツール
コマンドラインからデプロイするには「AWS SAM CLI」が必要になります。詳細は以下のAWS公式ページを参照してください。

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html

#デプロイの流れ
コマンドラインからローカルで作成した関数でデプロイする流れは以下の通りです。
今回はMac上で作成した関数をデプロイします。関数はNode.jsで作成したものとし、ZIP形式でアップロードするものとします。
## 1)デプロイユーザーの作成
AWS上でデプロイに使用するユーザーは以下のページから作成する。必要なIAMポリシーは後述します。

https://console.aws.amazon.com/iam/home

## 2)デプロイユーザーの設定
AWSで作成したユーザーのアクセスキーやシークレットアクセスキーを取得して、ローカルの環境に設定します。
ローカルに設定するコマンドは以下の通りです。

```sh
$ aws configure

AWS Access Key ID [None]:（作成したユーザーのAccess Key）
AWS Secret Access Key [None]: （作成したユーザーのSecret Access Key）
Default region name [None]: (リージョンの名前、東京の場合はap-northeast-1)
Default output format [None]: json
```


## 3)ビルド
以下のコマンドを実行します

```sh
$ sam build

Building codeuri: （パス） runtime: nodejs14.x metadata: {} functions: ['（関数名）']
Running NodejsNpmBuilder:NpmPack
Running NodejsNpmBuilder:CopyNpmrc
Running NodejsNpmBuilder:CopySource
Running NodejsNpmBuilder:NpmInstall
Running NodejsNpmBuilder:CleanUpNpmrc

Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml

Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided
```
## 4)デプロイ
以下のコマンドでデプロイが実行される。初回には後述するCloudFormationのスタックの設定を行います。２回目以降は初回に設定した設定を利用できるので細かな指定をスキップすることができます。

```sh
#初回の場合
$sam deploy --guided
#２回目以降
$sam deploy
```

#デプロイに利用されるAWSサービス
デプロイはソースコードをS3にアップロードし、その後Lambdaに関数が展開されます。
これらの流れを管理しているのがCloudFormationで、個別の処理ごとに名前をつけることができ、処理毎の単位をスタックと呼びます。

東京リージョンのCloudFormationのURLは以下のURLになります。

https://ap-northeast-1.console.aws.amazon.com/cloudformation/home

デプロイ時に同じスタックの名前を使用することで、以前に作成した関数に上書きが行われます。
またデプロイした関数にはポリシーが設定された専用のロールが付与されます。

#デプロイに必要なIAMポリシー
さて本題です。Lambdaをデプロイするのに必要なサービスは４つあります。（CloudFormation、IAM、S3、Lambda）デプロイを行うユーザーがこれらのサービスに対してアクションを行うためのポリシーを所有していないとデプロイに失敗します。（厳密には処理中に問題が発生し、取り消しが行われた際の削除のIAMポリシーも含まれています）
サービス毎に必要なIAMポリシーの一覧を記載します。
## 1)CloudFormation
DescribeStackEvents
DescribeStackSetOperation
CreateChangeSet
DescribeChangeSet
ExecuteChangeSet
GetTemplateSummary
DescribeStacks
## 2)IAM
GetRole
PassRole
DetachRolePolicy
CreateRole
DeleteRole
AttachRolePolicy
UpdateRole
PutRolePolicy
CreateUser
## 3)S3
GetBucketTagging
GetBucketWebsite
GetJobTagging
GetObjectVersionTagging
RestoreObject
GetBucketAcl
GetBucketNotification
GetBucketPolicy
GetObjectVersionTorrent
PutObject
GetObject
GetIntelligentTieringConfiguration
GetObjectTagging
GetMetricsConfiguration
GetBucketLocation
GetObjectVersion
## 4)Lambda
GetFunction
CreateFunction
UpdateFunctionCode
DeleteFunction
AddPermission

#まとめ
今回のIAMポリシーの確認で関数のコードをアップするために使用されているS3のIAMポリシーが多く必要であることがわかりました。またロールの作成などでIAMに対してもIAMポリシーが必要になったのは盲点だと思いました。
外部からアクセス可能にするにはAPIGateWayなどLambdaの関数を起動するサービス追加で必要になるのでご注意ください。
【GAS】google formの自動返信メールをHTMLで送信する

<h1>目的</h1>

Google formの自動返信をGASを使って行う方法はたくさん記事ができているのものの、
<b>・HTML形式でメール送信
・送信元を指定する</b>
の2つの要素を包含できているものがなかったので、備忘がてらまとめておく。


<h1>基本のやり方</h1>

スクリプトエディタの開き方や、トリガーの設定方法などは、既存記事にあるので、ここは省略。

下記参照：
【簡単！】Googleフォーム送信時にGASを自動実行する方法
https://www.yukibnb.com/entry/form_trigger


<h1>HTML形式での送信のやり方</h1>

コード.gsファイルと、message.htmlファイルをスクリプトエディタのなかにファイルを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1825290/6efb2dc4-9ac4-ea1a-96df-5e321ae06478.png)


<h4>コード.gsの例</h4>

```javascript:コード.gs
function onFormSubmit(e) {
  // フォームの回答を取得　回答順で指定する
  var email = e.values[1]; //メールアドレス
  var companyName = e.values[2]; //法人名

　//使用するhtmlファイルを指定
  var html = HtmlService.createHtmlOutputFromFile("message").getContent();

  //メールの設定
  let to = email;
  let subject = "アンケート回答の御礼"; //件名
  let body = 'htmlメールが表示できませんでした'; //message.htmlが表示できない時の予備
  let options = {
    from: '~~~~~~~~~~', //送り元（必要に応じてカスタム）
    cc: '~~~~~~~~~, ~~~~~~~~', //CCの設定（必要に応じてカスタム）
    htmlBody: html
  }

  ///メール送信
  GmailApp.sendEmail(
   to, 
   subject, 
   body,
   options
   );
}
```

<h4>message.htmlの例</h4>

これがメールの本文になる。
htmlの書き方がわからない人も、下記のようなテキスト→html変換の無料オンラインサービスを使って
コピペするだけでOK

```html:message.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
      
      <p>いつも大変お世話になっております。<br>

        カスタマーサポートでございます。</p>

      <p>この度はお忙しい中アンケートにご協力いただきまして、<br>

        誠にありがとうございました。</p>

      <p>いただきましたご意見、ご要望を、<br>

        今後のサービスや業務改善に役立てて参ります。</p>

      <p>今後ともご愛顧賜りますよう、よろしくお願い申し上げます。</p>

      <p><br>
      </p>

  </body>
</html>

```

<h1>注意事項</h1>
・トリガーの設定はお忘れなく！
・EmailApp.sendEmailの関数だと送信元がうまく設定できないので、注意！GmailAppの方を使う


<h1>メールの送信元の注意</h1>
fromで指定したメールアドレスに関しては、
基本的に自分のgoogleアカウントにエイリアスの通ったメールアドレスしか設定できないので、
<b>送信元にしたいアカウントで、GASを用意してトリガーの設定をする必要がある。</b>

参考URL：https://rtomura-taxacc.com/gas_specify-sender-address-and-sender-name/

グループメールの場合は、SMTP サーバーの設定は必要なく、アカウント管理者から承認をもらうだけでOK。


<h1>★ gsファイルからHTMLファイルに値を渡したい時</h1>

下記を追加し、htmlファイルに渡す。

```javascript:コード.gs
　var template_index = HtmlService.createTemplateFromFile('message');
　template_index.name = companyName;
  html = template_index.evaluate().getContent();

```

htmlファイルの中では、

```html:message.html
　　<?=name?>　様
```
といった形で使うことができる。
vimのショートカット（ほんのり）


Vimでよく使いそうなもの。



| key | 効果 | 備考 |
|:-:|:-:|:-:|
| ctrl + ww  | 分割したウィンドウの切り替え  |   |
| ctrl +wv  | 垂直分割され同じファイルが開く |   |
| :term  | 水平分割し、ターミナルが開く  |   |
| :vert term  | 垂直分割し、ターミナルが開く  |   |
【VSCode】タブで選択したファイルにフォーカスしないようにする方法


#事象

タブを切り替えるたびにエクスプローラ上のフォーカスしているファイルが毎回変わってしまい、イライラ。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874156/a6e57916-d8f9-4e3b-80f6-88dbb08da087.png)

#対処

###setting.jsonに以下を追記
```
"explorer.autoReveal": false
```

:v:
「地域課題解決のためエンジニアが集結！温泉MaaSを支えるMicrosoft AzureとLINEの技術」で学んだこと(デブサミ2021夏)

# はじめに

本稿は、Developers Summit 2021 Summer の以下のセッションで学んだことを書きます。

セッション名：地域課題解決のためエンジニアが集結！温泉MaaSを支えるMicrosoft AzureとLINEの技術
講演者：清水 宏之[日本マイクロソフト] / 比企 宏之[LINE]
セッション詳細：https://event.shoeisha.jp/devsumi/20210730/session/3233/

# 学んだこと

以下の話がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403606/fbb2a1bf-1e24-ce70-c76e-1c0a7df44c18.png)

## Maasとは

Mobility as a Service (自家用車以外の全ての交通手段による移動を1つのサービスとして捉え、シームレスにつなぐ新たな『移動』の概念)。
路線、時刻確認、路線検索、予約、支払い、チケット等をまとめて手配する考え方。

## なぜLINEがMaasの支援を始めるのか

LINE公式アカウントの利用が増えている。

MaaSはDXの要。

企画者が陥りがちなUXとして、ユニークエクスペリエンスをやってしまうことがある。
オフラインでのカードは統一規格になりやすいが、オンラインシステムの場合は、訳のわからんものが出来やすい。

ユーザーに求められるのは、ユニバーサルエクスペリエンス。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403606/e59d0701-be31-16d8-bbca-3c0d8355237d.png)

ユーザーは現地(オフライン)で焦りたくない。

MaaSのデモを以下のサイトで公開中。
「新しい移動体験を、LINEで」
https://lineapiusecase.com/ja/usecase/maas.html

## Maas事例の紹介

長野県千曲市にて、温泉で足湯しながら仕事をするなど、様々なワークスペースを提供している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403606/6d889962-571c-1652-5207-d8c4fcad85ce.png)

しかし、以下の問題がある。

- ワークスペースが点在
- 公共交通で来る人が多い
- 駐車場完備でない
- 公共交通路線とワークスペースが離れている
- 送迎は継続性に難あり

そこでMaaSの導入を検討。温泉MaaSアイデアソンを開催。

初めて訪れた地域で、タクシー会社に電話で配車を依頼するのは、ハードルが高い。
そこで、気軽にタクシー会社に配車を依頼するサービスの導入を検討。

まずは、LINEの簡単なアプリ(LINE公式アカウントLIFFアプリ)で試してみる。
タクシー会社に、配車受付のみで試してみる。

（所感：既存の仕組みを極力変更せずに、ユーザーが気軽にLINEで利用できるような、ミニマムに価値を提供できる形で検討されており、素晴らしいと思いました）

システム構成は、バックエンドはAzure、フロントエンドはLINEアプリ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403606/acf36763-96ad-c5de-f76c-daf3b223d721.png)

上記サービスのハンズオンのイベントを開催。
【地方活性化！】MaaS Hands-On with Microsoft Azure【ミニアプリ】
https://linedevelopercommunity.connpass.com/event/220376/


# まとめ
MaaS という概念が、地方において重要ということが分かりました。
今回のMaaSのサービスは、既存の仕組みを極力変更せずに、ユーザーが気軽にLINEで利用できるような、ミニマムに価値を提供できる形で検討されており、素晴らしいと思いました。

ちなみに私は、普段はエンジニアリングマネージャーとして、チームの皆で楽しく開発する施策を色々実施しています。詳しくは以下を参照ください。
[1年以上かけて生産性倍増＋成長し続けるチームになった施策を全部公開](https://qiita.com/kojimadev/items/4b28f801863cf4e8f0da)

Twitterでも開発に役立つ情報を発信しています → [@kojimadev](https://twitter.com/kojimadev)
Paramsメソッド　Strong Parametersについて

Railsアプリケーションは、フォーム（form withなど）に記述した内容を送信した場合、
それを、Parametersという名のハッシュ値に変換して、Railsアプリケーション内部へと送り込む。
送られてきたパラメータ（Parameter）は、Railsがデフォルトで常備しているparamsメソッドを使用することで取得できる

```
class BlogsController < ApplicationController
  def new
    @blog = Blog.new
  end
  def create
    Blog.create(title: params[:blog][:title], content: params[:blog][:content])
  end
end
```
パラメータは二重ハッシュのようなデータ構造で送られてくるため、以下のようなコードになって送られてくる

```
{"blog"=>{"title"=>"hoge", "content"=>"fuga"}}
```
また、カラムが増えた際に以下のように度々追加していくのは、手間がかかる

```
def create
  Blog.create(title: params[:blog][:title], content: params[:blog][:content], user_id: params[:blog][:user_id], category: params[:blog][:category],...)
end
```
そこで、以下のように簡潔に記述しcreate(params[:blog])とすることで、1つずつ指定しなくても、まとめて渡すことができる。これをマスアサインメントと呼ぶ。

```
def create
  Blog.create(params[:blog])
end
```
しかし、params[:blog]は、「blogに紐づくパラメータであれば、何でもcreateメソッドに渡してしまう」のでセキュリティに問題がでます。そこでStrong Parametersを使います
Strong Parametersは、送られてきたParameterを取得する際に、「何を許可するか」を指定します。

Strong Parametersの使い方

```
params.require(:blog).permit(:title)
```
上記のコードはblogキーのtitleのみ取得を許可します
contentも取得するためには、下記のように設定します

```
params.require(:blog).permit(:title, :content)
```

Strong Parametersの使用方法

```
class BlogsController < ApplicationController
  def new
    @blog = Blog.new
  end
  def create
    Blog.create(params.require(:blog).permit(:title, :content))
    redirect_to new_blog_path
  end
end
```

strong Parametersはcreateでもupdateでも使われる汎用性の高い処理なので、最初からメソッドとして定義する(privateに記載すればどこでも呼び出しが可能）

```
class BlogsController < ApplicationController
  def index
  end
  def new
    @blog = Blog.new
  end
  def create
    Blog.create(blog_params)
    redirect_to new_blog_path
  end
  private
  def blog_params
    params.require(:blog).permit(:title, :content)
  end
end
```
【セキュリティ】SASEについて再度まとめる

#アジェンダ　
ゼロトラストネットワークとは　
SASEとは
マクニカさんのウェビナー共有　

#SASEとは
SecureAccessSrviceEdgeの略
調査会社の米Gartnerが2019年に提唱した。
SASEは、通信がIaasなどに入る手前の部分でセキュリティー対策をしたり、WANやインターネットなどのネットワーク接続機能をクラウドから提供したりする。
スケーラビリティや管理性を上げることが可能。
GartnerではこのSASEに関して、2024年までに少なくとも40％の企業が導入計画を立てる、と予想しています。
https://www.cybernet.co.jp/netskope/tips/04/

#SASEが提唱された背景
端末→オンプレへ行くときのVPN負荷増、オンプレ→各拠点やクラウドへの出口部分の負荷増、を解決するためには何が必要かという課題を元にSASEが提唱された。
ゼロトラストの背景と似てます。

#ゼロトラストとSASEの違い
ゼロトラスト＝強固なセキュリティ対策のための一つの概念
SASE＝ゼロトラストを実現するためのソリューション

セキュリティやネットワークの製品や概念がたくさん出てきたので、それを一旦まとめてわかりやすくしたという感じでしょうか。
当然、ゼロトラストもSASEのの一部になっています。
https://www.cloud-security.jp/blog/difference-safe-and-zero-trust
https://www.ntt.com/business/lp/sase.html

絵
複数の製品を組み合わせてSASEを実現する、という状態。
それに加えて、何をもってSASEを提供しているかは、ベンダーごとに定義が異なるという、まだまだこれからな市場？


#最近のウェビナーを見ていて（2021/7/30現在）
「ゼロトラストを実現するために～」といった感じのウェビナーが多く見受けられる。
一気にゼロトラストの完成形を導入するのは難しいので、導入のしやすさからEDR中心のウェビナーや、ゼロトラスト実現の第一歩としてIdaas中心のウェビナーもある。

#マクニカはSASE視点でのウェビナーを実施していました
ゼロトラストの中身は別途記事に記載済み。

HPで扱っている製品や構築～運用までやってることも書いてあります。
https://www.macnica.net/zerotrust/index.html/

相談窓口もあるそうです。
https://www.macnica.net/pressrelease/zerotrust_20210413.html/

#Zscalerは？
SASE部分は、Zscalerが対抗になる。
https://www.zscaler.jp/products/secure-access-service-edge

広義のSASEを提供しているのは以下の企業などがある。
Akamai、vmware,cato networks、クラウドフレア、シスコ、Zscaler、ネットスコープ、フォースポイント、フォーティネット、パロアルト、Macafee

#出てきた用語は別で説明
たぶん用語がわからないと思うが、興味があれば調べてほしい
【Vue】Jest実行時にCannot read property 'module' of undefined【Jest】

## 環境
Vue 2.6.11
cli-plugin-unit-jest 4.5.0

## 発生したエラー

```terminal
$ yarn test:unit
 ● Test suite failed to run
    TypeError: Cannot read property 'module' of undefined
   ...
```

##　該当のテストコード

```login.spec.ts
import Test from './component/Test.vue';

test('test Test Component', () => {
    console.log(Login);
    // 本来はここにテストコードを書く
});

```

テストコードは、記事の本筋から逸れてしまい、長くなるので載せていません。あしからずorz
1行目のimportがうまくいってないようです。

## 解決方法
まず、大前提として、importのパスが正しいか、import先でexportがされているかを確認し、vueファイルが読み込めてないのか？と思い、package.jsonやjest.config.jsの設定を見直しても直らず。。。

そこで下記のGitHub issuesを発見。
[tsconfig.json with no compilerOptions causes typescript-compiler to error](https://github.com/vuejs/vue-jest/issues/242#issuecomment-759845783)

下記のように、tsconfig.jsonに```"compilerOptions": {}```を追加することで直りました。

```tsconfig.json
{
  "extends": "../../tsconfig",
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ],
  "compilerOptions": {}
}

```
TerraformとALB-request timed outについて

## これは何
TerraformでAWS環境を構築した際、ALBのHealth checkでrequest timed outになったので、解決のメモ。

## つまり…
request timed outなので、ググって以下を参考に対応。

```
"AWSのDocumentより"
HTTP 408: Request timeout
アイドルタイムアウト期間の期限が切れる前に、クライアントからデータが送信されませんでした。
TCP キープアライブを送信しても、このタイムアウトを防ぐことはできません。
各アイドルタイムアウト期間が経過する前に、1 バイト以上のデータを送信します。必要に応じて、アイドルタイムアウト期間を長くします。
```

```
"Qiitaより"
リクエストが通るには、
ロードバランサに設定したセキュリティグループのアウトバウンドルール
インスタンスに設定したセキュリティグループのインバウンドルール
の双方で接続を許可する必要があります。
```

ふ〜む、なるほど。
どうやら、タイムアウト値が短すぎるのか、SGのルールを見直す必要がありそうです。


```
参考
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html
https://qiita.com/koseki/items/61372f25dfe8c8bb7a63
```


## 結論
SGのルールは問題なく、どうやらTimeoutの期間が短すぎた模様。

```
"Terraform Document より"
timeout - (Optional) Amount of time, in seconds, during which no response means a failed health check. 
For Application Load Balancers, the range is 2 to 120 seconds, and the default is 
5 seconds for the instance target type and 30 seconds for the lambda target type. 
For Network Load Balancers, you cannot set a custom value, 
and the default is 10 seconds for TCP and HTTPS health checks and 6 seconds for HTTP health checks.
```

ALBのHealth checkについては、デフォルトのまま、特に値を変えることなくapplyしていたので、適当に以下に変更。

```
resource "aws_lb_target_group" "main" {
  name     = "lb-tg"
  port     = 80
  protocol = "HTTP"
  vpc_id   = aws_vpc.main.id
  health_check {
  interval = 90
  timeout = 60
      }
}
```

これで、request timed outは解決しました。
結局はデフォルトの値だとrequest timed outになる、ということだったのですが、他にも原因があるのかもしれません。
timeoutって普通はしっかり考えてデフォルト値にはしない(？)から、そんなに同じような問題を抱えている人がいないんでしょうか。

Terraformのデフォルトに従うとエラーになる、なんて天下のHashi Corpがするかなあと思ったりします。
なので他にも原因がありそうだなあと思いつつ、これで解決はしたので何だかなあという感じです。


```
参考
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb_target_group
```
関数の出現順でエラーが起きるのを防ぐ

####ファイルの拡張子を.cppから.inoに変更するだけでビルドが通るようになります。

PlatformIOでArduinoの開発をしていて、技術ブログの記事にあるソースコード等を ~~コピペ~~ 参考にしたときなどに、
```error: 'hoge' was not declared in this scope```
のようなエラーがでることがあります。

例えば下のように、```hoge()```が使用されている場所より後ろで定義されている場合です。

```
void func1(){
  hoge();
}

void hoge(){
:
}
```

こんな時は```hoge()```が使用されるより前の場所に

```
void hoge();
```
とプロトタイプ宣言を入れるか、プロトタイプ宣言をまとめたヘッダーファイルを作成して#includeするか、またはhoge()をfunc1()の前に移動すればいいのですが、めんどくさいなー、今時そんな前時代的なことはしたくないなー、ってこともありますよね。
そんな時は、ファイルの拡張子を.cppから.inoに変更するだけでビルドが通るようになります。ただし
![2021-07-30_103917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/9bc1044d-8de3-ee9d-76b0-97cf430227b7.png)

とのことなので注意が必要です。自分で試してみた限りではIntelliSenseちゃんと機能していましたが。。。
Stripeサブスクリプションで何が可能で何ができないか？

クレジット決済ゲートウェイのStripeを用いたサブスクリプション課金の実装について、プランの組み合わせなどを中心に、できる事とできない事をリスト化します。
決済の登録から実際のInvoice生成までの挙動と、マッチする利用方法なども合わせて書きたいと思います。

また、Stripe APIのバージョンも新しくなり、古いバージョンとの差異についても軽く触れたいと思います。

## １つのサブスクリプションの中に、月次と年次、などの期間の異なるアイテムを持たせることはできない。
Stripeでは、例えば年間ライセンスの基本料金と、月額のオプション料金を合わせて一つのサブスクリプション内で登録することはできません。言い換えると、年間ライセンスの支払い時に、月額オプションを12ヶ月分をあわせて決済するということはできません。

## prorate 周りの追加と削除時の決済について
最新のバージョン（2020-08-27系 stripe-phpライブラリではv7系）では、prorateパラメータは、proration_behaviorというパラメータになっている。（ただし、prorateパラメータも引き続き使える。）

◯キャンセルまたは、個数マイナス変更時に、prorateが有効になっていると、前払いで確定したサブスクリプション期間の金額から、変更時の残りの日数日割り差額が「繰り越し」状態として残る。これは、次回請求確定時に相殺されるので、意図しない割引となってしまう場合がある。
キャンセルまたは個数マイナス変更については日割りを按分しない、要は「途中キャンセルの返金は無し」を実現するには、proration_behaviorを'none'にする必要がある。


◯年次プランなどの中長期プランにおいて、追加分を即時決済したい場合は、updateで送るパラメータのproration_behaviorを"always_invoice"とすると、残りの日数の日割りのInvoiceが作成される。

ここで注意すべきポイントは、同一期間内で、個数を削減→追加、と変更を繰り返した場合のケース。
仮に従業員が一人辞めて新たに一人増えるケースにおいて、続いて1ユーザー削除、さらに1ユーザー追加した場合、トータルユーザー数は変わらないけれど、追加したユーザー分の日数日割り分が、即時決済されてしまう。

* 削除はprorate:falseで上記追加分の引き継ぎは無し
* 次に1ユーザー追加時には"proration_behavior:always_inovice"で即時決済

これでは、期間の最初に削除したユーザー分の料金は支払い済みにも関わらず、さらに追加料金が発生してしまい、お客様は納得しない。

追加時に、同一期間内に削除があるかどうか判定して、それによって追加決済するかどうか、という計算はできない。
期間内の最終的なユーザーライセンス数によって決済するには、proration_behaviorの値はデフォルトの「create_prorations」とすると、次の期間が始まるタイミングで、今の期間内の「最終的な」追加分をキチンと計算してくれる。

年間ライセンスなどの場合、料金の上乗せが来年になってしまうが、Stripe標準の計算機能を使う場合はどうしようもない。

:::note info
【期間の途中で、create_prorationsからalways_invoiceに切り替えた場合】

create_prorations設定で、期間内にライセンス追加し、翌期に日割り分が持ち越されている状態で、新たにalways_inoviceでライセンス追加した場合、今回変更のあった部分のみ、即時請求が確定し、過去にcreate_proratsionsで登録された繰越分については、そのまま繰越状態となっており、次の期間の開始時の請求に合算されていた。
:::

## 商品タイプの「計測された使用量に基づく請求」について
Usage APIを利用し、使用した数量を登録していくタイプの商品になり、当然後払いとなります。年間ライセンスとなると、実際のキャッシュインが一年後とかになるので、注意が必要です。
また、数量は整数となるので、仮にディスク容量などの使用量を販売したい場合は、MB単価などの設定が必要です。

例えば、「1GB当たり〇〇円」などの料金設計は向きません。1.3GBの場合は2GB分の料金（◯◯円×2）といった計算はできません。
そういった商品設計の場合は、使用量に基づく請求ではなく、普通の商品として登録し、自社側で数値計算するのが良さそうです。


## バージョンが上がって、plan_idは無くなってprice_idになった
以前はPlanという商品の中にネストされたアイテムがベースになっていたが、最新のバージョン（2020-08-27系 stripe-phpライブラリではv7系）では、名前が変わってPriceという概念になっている。公式のAPIリファレンスでも、全てPriceやprice_idとなっているが、以前のplan_idと互換性があり、現時点ではどちらもAPIは受け入れてくれる。

古いstripe-phpライブラリで、plan_idを指定するパラメータに、price_id（price_xxxxx）を入れたり、新しいライブラリでprice_idパラメータにplan_id（plan_xxxxx）を入れても問題はない。古い商品IDはplan_xxxxxのままですが、そのままprice_idとして運用できます。
Supabase: auth.usersテーブルにリレーションを貼れるようにする

Supabaseでpostgresユーザーがauth.usersテーブルにリレーションを貼れるようにするSQLです。

```sql
grant references on table auth.users to postgres;
```

このSQLはSupabase管理画面のSQLエディタから実行する必要があります。
AWS 認定 デベロッパー – アソシエイト試験勉強

#前提
AWS 認定 デベロッパー – アソシエイト試験に向けた勉強のメモです。
完全に自分用として使用するため、自分に向けた備忘、気付きを記載する場にします。

#サービス
##Lambda
###バージョンとエイリアス
バージョン：Lambda のコードの断面のようなもの。
エイリアス：特定の Lambda バージョンに対するポインタ。
何が嬉しいか：エイリアスを使用することで関数のリリース・ロールバックが簡単できる
例えば、S3 のイベント通知をトリガーとして Lambda 関数を使用するユースケースを思い浮かべてみる。
S3 バケット側の設定として Lambda のエイリアスを指定すれば、Lambda 側のコード変更に伴い S3 側の設定変更は必要がなくなる。Lambda 側で新しいバージョンを発行し、エイリアスに新しいバージョンを紐づけることでリリース、エイリアスに元のバージョンを紐づければロールバックができる。
参考：[Lambda Functionのバージョン・エイリアス運用方針 #アドカレ2015](https://dev.classmethod.jp/articles/lambda-version-and-aliace/)

###環境変数
複数環境 (開発と本番など) で同一のコードを使用しながら、関数内から別々のリソースにアクセスするといった時に使用する。
[環境変数のシナリオ例](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-envvars.html#configuration-envvars-example)
>環境変数を使用して、テスト環境および本番環境における関数の動作をカスタマイズできます。例えば、同じコードでも設定が異なる 2 つの関数を作成できます。1 つの関数はテストデータベースに接続し、もう 1 つはプロダクションデータベースに接続します。この状況では、環境変数を使用して、データベースのホスト名とその他の接続の詳細を関数に伝えます。 

これも便利だなと思った。
>テスト環境で本番環境よりも多くのデバッグ情報を生成する場合は、環境変数を設定して、より詳細なログ記録またはトレースを使用するようにテスト環境を設定できます。

###ベストプラクティス
関数内で任意の条件が満たされるまで関数を自動的に呼び出すような再帰的なコードを使用しない。
[AWS Lambda 関数を使用するためのベストプラクティス](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/best-practices.html)

##ElastiCache
[Redis と Memcached の比較](https://aws.amazon.com/jp/elasticache/redis-vs-memcached/)
基本的に Memchached の方が多機能。Memcached にあって Redis にない唯一の機能がマルチスレッドアーキテクチャ。Memchached はシンプル。
>Memcached はマルチスレッドであるため、複数の処理コアを使用できます。これは、コンピューティング性能をスケールアップすることで、より多くの操作を処理できることを意味します。
md-to-pdfをProgrammatic APIで実行する際のoption

markdownファイルをpdfに変換してくれる[md-to-pdf](https://www.npmjs.com/package/md-to-pdf)ですが、コマンドラインでの実行の他にもプログラムからも実行できます。[公式の例](https://github.com/simonhaenisch/md-to-pdf#programmatic-api)
プログラムから実行する際のオプションの指定方法ではまったので、まとめます。

# option名称
コマンドラインのオプションは[こちら](https://github.com/simonhaenisch/md-to-pdf#usage)に紹介されてますが、プログラムからこれらのオプションを指定する際は、オプションの名称が変わるようです。
[こちら](https://github.com/simonhaenisch/md-to-pdf/blob/f6b2dee2dfcc39881729b8bdb5de8587c84c73e3/src/lib/config.ts#L6-L30)にコード内にあるデフォルトの設定があるので、オプション名はこちらを参照する。

# 実行方法
公式ページにあるHeader/Footerのオプションを例にプログラムから実行する場合は、以下のように2つ目の引数にオプションのオブジェクトを渡す。

```javascript
const fs = require('fs');
const path = require('path');
const { mdToPdf } = require('md-to-pdf');

const Op = {
    pdf_options:{
        format: 'a4',
        margin: '30mm 20mm',
        printBackground: true,
        headerTemplate:
        `<style>
            section {
                margin: 0 auto;
                font-family: system-ui;
                font-size: 11px;
            }
        </style>
        <section>
            <div>Hoge株式会社</div>
        </section>`,
        footerTemplate:`
        <section>
            <div>
                Page <span class="pageNumber"></span>
                of <span class="totalPages"></span>
            </div>
        </section>`,
    },
    launch_options:{
        args:["--no-sandbox"],
    }
};

async function exportPDF (fpath){
    const pdf = await mdToPdf({ path: fpath },Op).catch(console.error);

    if (pdf) {
        fs.writeFileSync(path.join('./pdf',path.parse(fpath).name+'.pdf'), pdf.content);
        console.log("Done:"+fpath);
    }
}

exportPDF('readme.md');
```
（レポート） Developers Summit 2021 「素早く賢く失敗するDeveloper Productivityの実現を目指して」

# Developers Summit 2021 「素早く賢く失敗するDeveloper Productivityの実現を目指して」

2021/07/30に開催されたDevelopers Summit 2021での発表です。
https://event.shoeisha.jp/devsumi/20210730

# チーム参加してきました

[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html) のチーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu?slide=3)」にて参加してきました。
チーム7人で参加して、その場で実況しつつ、記事も作っています。

# 手段からではなく、事業やユーザ目線で考える
- ユーザに機能や改善を素早く、かつ高頻度で届けられているか？


# CA メディアに管轄における課題
- メディア開発は特に不可実性が多いので、共通の課題として持つ

# 賢く失敗するために超えるべき課題
- 賢く失敗するには設計・実装フェーズよりも、ソフトウェアのリリースサイクルを組織として強化すべきと判断

# メディア管轄として目指す、DPの理想状態
- 開発者と事業がスケールし続けるための高い生産性と品質を生み出す原動力を育てる。

# 3つのsigを編成
- Special Interest Group
- それぞれの専門家別にsigを編成
- サードパーティー活用、独自ツール開発など油断にこだわらずに、組織にフィットするベストプラクティスを考案し、定着させていく。

# 開発者マーケティングの強化
- プロダクトやベストプラクティスを作るだけでなく、効果的に使ってもらう取り組みが必要不可欠
- ドキュメント、Blogなどのユーザが能動的にプロダクトを体験してもらう仕組みを提供

# 習熟度チェック
- 3つのsigにおける、各プロジェクトの熟練度のチェックを実施
- 現状把握、プラクティスの認識、今後の戦略・意思決定に活用

# DORA
- デプロイ頻度やリードタイム、MTTRなどで組織のパフォーマンスを測り、上を目指していく
- 段階的に買う事業への導入を準備中
- 技術者が常にわかりやすい指標を持って改善を続けていくことが重要

# 技術者本位の改善に留まらないようにするには
- 技術者以外の観点で開発がどうよくなるのか？
- 自分たちのビジネスにポジティブに影響することは何か？について
- 技術者＝事業部でOPについて共通の課題・目標達成、合意形成をできるようにする。

# DP改善マンと事業との微妙な距離感
- プロダクトや事業に対して、DP改善の貢献度合いが見えにくい
- もしくは伝えきれていないケースがよくある

# 必要な心持
- エンドユーザやプロダクト、事業との距離を縮めて、本質的な改善が何か見定めよう
- チームから期待してもらえて、わかりやすいDPの目標やKPIを設定しよう

# 感想
- 技術者よがりの改善にならない様、常にわかりやすい指標を持って改善を続けていくことが重要だと思いました。自分自身が技術者よがりの改善を行ってしまうことがあったため、心に刺さりました。
AWS ElasticBeanstalkのTime-based Scalingでスパイクに備える

Qiitaの記事であまり詳しい説明を見かけないので　ElasticBeanstalk の Time-based Scaling についてご紹介したいと思います。

# Time-based Scaling とは

ElasticBeanstalk では AutoScaling により、サービスへのアクセス増加に対して柔軟にリソースが追加される仕組みが備わっています。
しかし、AutoScaling では決められたCPU使用率などの閾値を超えない限りインスタンスの追加は行われないため、急激なアクセス増には上手く対応出来ないという欠点があります。

そこで登場したのが Time-based Scaling です。

https://aws.amazon.com/jp/about-aws/whats-new/2015/05/aws-elastic-beanstalk-supports-time-based-scaling/

あらかじめアクセス数の増加が予想できる場合、スケジュールを事前に登録しておくことで希望するインスタンス数を自動的に立ち上げておくことが出来ます。

普段10台で運用している環境で、19時を過ぎたら20台のインスタンスを用意したい、という場合には19時を過ぎたタイミングで不足分のインスタンスが自動的に立ち上がり、ロードバランサーに追加されます。
逆に24時を過ぎたら10台に戻したい、という場合もスケジュールを追加することで対応出来ます。

# 設定方法

マネージメントコンソールでの設定方法を簡単にご紹介します。

まず環境を選択し、「設定」を開きます。
「容量」の「編集」を押して編集画面を開きます。

![スクリーンショット 2021-07-29 17.58.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128744/3829cead-d321-e37f-e506-f878d303c119.png)


よく使うのは AutoScaling の設定とスケーリングトリガーの部分ですが、画面の一番下に Time-based Scaling の設定メニューがあります。（日本語環境では「時間に基づくスケーリング」と表記）

![スクリーンショット 2021-07-29 17.58.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128744/953e4eea-4e78-fab9-5cf6-60c46de79825.png)

「スケジュールされたアクションの追加」からスケジュールが追加出来ます。

![スクリーンショット 2021-07-29 18.02.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128744/521d6284-df2a-21a6-0fbf-a6a9f712e51c.png)

インスタンスの最小数・最大数は指定した時間以降のAutoScalingの最小値・最大値を設定します。
希望する容量には必要なインスタンス数を設定します。
指定した時刻に起動しているインスタンス数と希望する容量とに差分がある場合、自動的にインスタンスの起動や停止が行われます。

頻度には1回限りか繰り返しが選べます。
通常は繰り返しを選択し、CRON式でスケジュールを指定することになると思います。

一定期間のみの適用であれば、開始時刻・終了時刻を指定して制御することも可能です。

「追加」を押すと先程のスケジュールの一覧に追加されます。

![スクリーンショット 2021-07-30 10.06.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128744/d732ab78-f8b3-1c59-322d-436284ecf970.png)

# 注意点

## UTCベースなので時刻を間違えやすい

CRON式を日本基準で書いてしまうと9時間ずれてしまいます。
また、曜日の指定なども注意が必要です。

スケジュールのリストにタイムゾーンの選択肢としてUTCとローカルがありますので、ローカルを選択して正しく設定されているかを確認するようにしましょう。

## 「適用」を押すまでは反映されない（スケジュールを変更した場合も同様）

スケジュールは「適用」を押すまでは環境に反映されていません。
追加や変更をした後は必ず「適用」を押しましょう。

## AutoScaling の設定にも注意

Time-based Scaling は指定した時間に希望した容量のインスタンスを確保する仕組みです。
あらかじめインスタンスを増加させていたとしても一定期間アクセスが無いと AutoScaling の設定に従って余分なインスタンスは停止されてしまいます。

もし、このようなケースが予想される場合はスケジュールで指定する最小値と希望する容量の値をそろえておくことで防ぐことができます。

# まとめ

スマートフォン向けのアプリではプッシュ通知やログインボーナスなどで急激なアクセス増加が定期的に起こりますが、AutoScaling だけではなかなか対処が難しい問題です。

もしこのような状況で悩まれている方がいたら Time-based Scaling を使ってみてください。
初投稿　メモ用

draw.io

フローチャートやオフィスのレイアウト図、ネットワーク図を作成できる無料の作図ツール。
GoogleChromeのようなブラウザ上で操作ができ、作成した図はGoogleドライブやGithubと連携させて保存が可能です。
顧客向けの資料や、プレゼンテーションに用いる。
draw.ioでは、図形やアイコンなど豊富な素材が提供されており、工数をかけずとも質の高い図を作成できる。

CRM

Customer Relationship Managementの略
顧客を中心に考えてビジネスを展開し、利益の最大化を目指すマネジメントの手法
C言語の授業でコード行数一定以上の条件課題が出されたあなたへ

# C言語の授業でコード行数一定以上の条件課題が出されたあなたへ

この記事の対象者：やばい！もうすぐ課題の締め切りがくる！だが全然プログラム書けねえ！だからと言って友人の手を借りる事もできない！そんなアナタへ

```c
#include <stdio.h> 
#include <stdlib.h>

int i;

int main() {

  FILE *outputfile;
  outputfile = fopen("d.txt", "w");
  fprintf(outputfile, "#include <stdio.h>\n");
  fprintf(outputfile, "int main() {\n\n");

  for (i=0;i<247;i++){ // 247 = (N-6)/2, この場合N=500行

    // print something

    fprintf(outputfile, "  ");
    fprintf(outputfile, "printf(");
    fprintf(outputfile, "\"a\"");
    fprintf(outputfile, ");");
    fprintf(outputfile, "\n");

    // add back slash

    fprintf(outputfile, "  ");
    fprintf(outputfile, "printf(");
    fprintf(outputfile, "\"");
    fprintf(outputfile, "\\");
    fprintf(outputfile, "n");
    fprintf(outputfile, "\"");
    fprintf(outputfile, ");");
    fprintf(outputfile, "\n");
  }

  fprintf(outputfile, "\n");
  fprintf(outputfile, "return 0;\n");
  fprintf(outputfile, "}\n");
  fclose(outputfile);

  return 0;
}
```

unix環境等で上のプログラム「sample.c」を手元のディレクトリに設置し、

gcc -o sample sample.c ; sample ; rename d.txt d.c d.txt ; gcc -o d d.c ; d

を投げるだけでN行のcのコード「d.c」を生成する事ができる！

このコードそのものは"a"と何行もただ出力するだけの物だが、これを応用すれば「コードを書くコード」を作る事ができる。

諸君の幸運を祈る

XD
「わかち書き」不要のCharformerをGoogle&DeepMindが発表

1カ月ほど前にGoogleとDeepMindが発表した、"Charformer"に関する論文を紹介します。


原論文
https://arxiv.org/abs/2106.12672


この論文では自然言語処理の前処理でよく行われている「トークン化」を自動化したモジュールを導入しています。

"Charformer"は"Character"と"Transformer"をくっつけた言葉で、文字単位の分析にTransformersの手法を応用しているようです。

Qiitaで"Charformer"と検索しても１件もヒットしなかったので、Qiita上での第一報かと存じます。

詳細な解説は私の手に余るので、以下に３点だけ重要な点を記載します。



・導入した手法：gradient-based subword tokenization(GBST) module

・標準的な英語、非標準的な英語、多言語のいずれのタスクでも既存のモデルと同等かそれ以上のパフォーマンスを達成。

・同数のパラメータを持つモデルと比較して、メモリ効率性も高い。



以下のリンクより、元論文および解説動画もご参照ください。

原論文
https://arxiv.org/abs/2106.12672

解説動画（非公式）
https://www.youtube.com/watch?v=debgj24BAZE&t=183s


了
Go言語豆知識（一）

###豆知識###
Go言語には、スライスという概念があります。スライスは値型ではなく、参照型のデータです。スライスは値型のArrayを参照しています。
スライスを拡張するにはappendメソッドを使います。もしスライスを拡張するときに、元に参照するArrayの長さを超えた場合は、新しい参照元Arrayを再作りすることになります。

###コード###
```golang
	slice1 := []int{1,2,3,4}
	slice2 := slice1[:3]

	fmt.Println("最初の段階、slice1,slice2はおなじ参照元Arrayを参照しています")
	fmt.Println(slice1)
	fmt.Println(slice2)

	fmt.Println(&slice1[0])
	fmt.Println(&slice2[0])
	fmt.Println()

	fmt.Println("slice2の長さはまた参照元Arrayの長さを超えていない")
	slice2 = append(slice2, 15)

	fmt.Println(slice1)
	fmt.Println(slice2)

	fmt.Println(&slice1[0])
	fmt.Println(&slice2[0])
	fmt.Println()

	fmt.Print("slice2は元のArrayの長さを超えました。")
	slice2 = append(slice2, 16)
	fmt.Println(slice1)
	fmt.Println(slice2)

	fmt.Println(&slice1[0])
	fmt.Println(&slice2[0])
```

```sh

最初の段階、slice1,slice2はおなじ参照元Arrayを参照しています
[1 2 3 4]
[1 2 3]
0xc0000b4000 <-参照元のアドレス(Array)
0xc0000b4000　<-参照元のアドレス(Array)

slice2の長さはまた参照元Arrayの長さを超えていない
[1 2 3 15]
[1 2 3 15]
0xc0000b4000　<-参照元のアドレス(Array)
0xc0000b4000　<-参照元のアドレス(Array)

slice2は元のArrayの長さを超えました。[1 2 3 15]
[1 2 3 15 16]
0xc0000b4000　<-参照元のアドレスA(Array)
0xc0000b8000　<-参照元のアドレス(新しいArray)
```

出力のように、最初slice1とslice2はおなじ参照元長さが4のArrayに参照しています。
slice1はArrayの0-3番目まで切り出しています。
slice2はArrayの0-2番目まで切り出しています。

１回目のappend作業をしてら、slice2の長さは3から4までに伸ばしました。そのときに参照元Arrayの長さは4です。slice2の拡張によって、参照元Arrayの4番目値が修正されました。


2回目のappend作業をしてら、slice2の長さは4から5までに伸ばしました。そのときに参照元Arrayの長さは4です。
もともとの参照元Array(長さ4)はslice2(長さ5)を納めないから、slice2の参照を収めるために、新しい参照元を作ることになります。
そのときに、slice1の参照元とslice2の参照元はそれぞれ異なる参照元になります。

```
0xc0000b4000　<-参照元のアドレスA(Array)
0xc0000b8000　<-参照元のアドレス(新しいArray)
```


###説明###

![名称未設定.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/b92ed9d5-3995-78be-0ede-661c126c4ad2.jpeg)

![名称未設定.002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/266099a1-4607-8d06-d3a5-380e6158324c.jpeg)

![名称未設定.003.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/a947fb87-290f-936d-6255-49267dc962c3.jpeg)


<iframe width="560" height="315" src="https://www.youtube.com/embed/0mUJtlneLK0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


###まとめ###
スライスは参照しているArrayの長さを超えたら、新しい参照元を作成することになります。
【Rails】pry-byebugを使ってdebugする方法


#対象者

* byebugを使ってデバックしたい方


#目的

* byebugを使ってアプリの状態を確認すること

#実際の手順と実例
###1.pry-byebugのインストール

Gemfileに下記を追加

```ruby
group :development do

:
:
  gem 'pry-byebug'

end
````

その後**bundle install**を実行します


###2.使い方

* rbファイルではbinding.pry
* erbファイルでは<% binding.pry %>

例としてブログの新規投稿を行うアプリを使います。

#####１．Controllerで使う場合
````
class BlogsController < ApplicationController

:
:

  def create
    blog = Blog.new(blog_params)
    binding.pry   

    blog.save
    redirect_to blog_path(blog.id)
  end

:
:

end
````

上記のようにsave前にbinding.pryをいれました。
このままサーバーを立ち上げてもロードされず、処理が一度止まります。

ここでTerminalに戻ると

````
From: /home/ec2-user/environment/CARAVAN/app/controllers/blogs_controller.rb @ line 22 BlogsController#create:

  18: def create
  19:   blog = Blog.new(blog_params)
  20:   blog.save
　　　　21:   binding.pry
=>22:   redirect_to blog_path(blog)
  23: end

[1] pry(#<BlogsController>)>
````

21行目で処理が止まっているのが分かります。
コマンドで「blog」と入力すると、変数blogの内容が表示されます。

````
[1] pry(#<BlogsController>)> blog
=> #<Blog:0x00007f20ec1130f0 id: nil, title: "テストタイトル", category: "テストカテゴリー", body: "テスト本文", created_at: nil, updated_at: nil>
[2] pry(#<BlogsController>)>
`````

今回は何事もなく稼働しています。

例えば、ここで変数に何も入っていなければ（nil）、19行目に変数がうまく渡っていない、20行目でsaveがうまく行えていない等の可能性が考えられるので、エラー箇所がこのあたりにあると考えられます。



#参照

>[Rails tutolial 7.1.3 debuggerメソッド](https://railstutorial.jp/chapters/sign_up?version=6.0#:~:text=%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,7.1.3%20debugger%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89,-7.1.2%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE)

####投稿者コメント
エラー文が出ないときにpry-byebugにかなり助けられました！
いまではアプリ作るときGemには必ず入れておきます


####My Profile
プログラミング学習歴②ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。