OmniAICreator/Qiita-1.07M huggingface dataset:
レンタルサーバーにアプリをアップロードする際の手順書

#目的
レンタルサーバー(mixhost)にwebアプリをアップロードする際の手順書

#実施事項
##DB構造の変更、追加、削除(不要テーブル)
削除は現状アプリが動かなるなる可能性あるのでソースアップ後がよい

##DBデータ作成
現状はphpMyAdminで行う

##参考(上2件のピックアップ例)
※下記ように細かく列挙

- access_time削除
- room_authorityテーブル追加
- lDbCmdFxFBcxJjQは削除、すとちゃんアカウントのみ追加
- update_settingテーブル追加
- update_intervalは3600に変更する
- room_event_infoテーブル変更  
    - disp_orderカラム削除（ソースアップ後）
    - plan_event_url追加
    - plan_event_img_url追加
    - plan_event_started_at追加
    - plan_event_ended_at追加(以上planデータはnullでOK)
    - update_time追加(すべて0でOK)
    - room_annotation追加(あやりroomは追加しておくこと)
- room_select_info_listner
    - priority追加(すべて0でOK。ソース変更後、修正する)
- room_select_info_room
    - priority追加
 
##ソースのアップロード
##不要になったファイルの削除(JS,PHPなど)
下記に使用一覧作成
https://docs.google.com/spreadsheets/d/e/2PACX-1vQC-hk7KVccCibpfEpuztrB9NLWJUKpjZUyUt6Fxk5hNWgdg26OKg-TBI-GXX66IPw_GXS03XozRNq7/pubhtml?gid=1468114336&single=true

##その他
###新規アプリでツイッターログインの場合『Twitter Developerページで開発者申請』を行う
https://developer.twitter.com/en/apps/
###参考
[Twitter Developerの開発者申請（例文あり）とAPIキー取得方法まとめ](https://qiita.com/Stchan/items/02d7b48bc7af8321513a)
既存アカウントにアプリ追加する場合、他のアプリを真似たほうが早い

###同様の場合ツイッターAPIキーの設定を『.htaccess』に行う【個人ルール】
###あわせてDBユーザネームなどの設定を『.htaccess』に行う【個人ルール】
```
SetEnv DB_USERNAME 'xxxxxxxxxxxxx'
SetEnv DB_PASSWORD 'xxxxxxxxxxxxx'
SetEnv DB_NAME 'xxxxxxxxxxxxxxx'
SetEnv TW_API_KEY 'xxxxxxxxxxxxxxxx'
SetEnv TW_API_SECRET_KEY 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
SetEnv TW_CALLBACK_URL 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
```

###セッション時間の設定をする
session.gc_maxlifetime:43200
session.save_path:/home/xxxxxxxx/session
scikit-learnのLabelEncoderを使ってみる（初心者向け）

文字データを数字に置換する必要があるときに、便利！

### やっている事

タイタニック号のデータセットを利用して

* 任意のラベル名のカラム値を文字→数字へ変換
* 数字へ変換されたものを、文字に戻す

### 準備

タイタニック号のデータは、seabornに入っているので、呼び出します。

```
import seaborn as sns
import pandas as pd
from sklearn import preprocessing

titanic = sns.load_dataset("titanic")
```

数字へ変換されたラベルを、文字ラベルに戻すために辞書を用意

```
le_dict = {}
```

中身を確認

```
print(titanic.head())
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/8c2d68e7-4aa7-5351-484d-fef085953eb3.png)

### 実行

任意のラベル（sex, class）があるカラムのみ、文字→数字へ置き換えます

```
for column in ["sex", "class"]:
    le_dict[column] = preprocessing.LabelEncoder()
    le_dict[column].fit(titanic[column])
    titanic[column] = le_dict[column].transform(titanic[column])
```

結果を確認

```
print(titanic.head())
```

male -> 1, female ->0などに置き換えられたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/70eb13c4-dd28-0a26-1bef-2e3591adffab.png)

### ラベルを戻す

inverse_transform()を利用すれば戻すことができます。

```
for column in ["sex", "class"]:
    titanic[column] = le_dict[column].inverse_transform(titanic[column])
```

結果を確認

```
print(titanic.head())
```

何事もなかったかのように戻りました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711655/ed919670-6387-b6f0-748f-844270d8b6d9.png)


### 全コード

```
import seaborn as sns
import pandas as pd
from sklearn import preprocessing

titanic = sns.load_dataset("titanic")
le_dict = {}

print(titanic.head())

for column in ["sex", "class"]:
    le_dict[column] = preprocessing.LabelEncoder()
    le_dict[column].fit(titanic[column])
    titanic[column] = le_dict[column].transform(titanic[column])

print(titanic.head())

for column in ["sex", "class"]:
    titanic[column] = le_dict[column].inverse_transform(titanic[column])

print(titanic.head())
```

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html
【Lambda】Lambda関数②

## 同時実行数
**同時実行数**：ある時点で同時に実行されているLambda関数の数（デフォルトでは同一アカウントの同一リージョン内につき最大1,000）

- 関数レベルの同時実行数を設定することも可能
- アカウントレベルの同時実行数 - 関数レベルの同時実行数 = 他のLambda関数で共有される同時実行数

## スロットリング
**スロットリング**：各アカウントごとに設定されているリソースの利用上限を超えた場合に、利用が制限されること

スロットリングされたリクエストの処理方法

|イベントソースのタイプ|処理方法|
|:--|:--|
|同期呼び出し<br>（プッシュ型）|・429エラーを返却する<br>・リトライするためには、呼び出し元でリトライ作業を行う|
|非同期呼び出し<br>（プッシュ型）|・最大6時間自動的に間を空けてリトライする<br>・デッドレターキューを設定することで、スロットリングされた原因を調査可能|
|ストリームベース<br>（プル型）|・データの有効期限が切れるまでスロットリングされたデータの処理を試みる<br>・処理の順序を保つため、データの有効期限が切れるか処理が成功するまで同一のシャードから新しいレコードは読み込まない|
|キューベース<br>（プル型）|・正常に呼び出されるか、キューの期限に達するまでスロットリングされたレコードの処理を試みる|

## リトライ動作
Lambda関数の実行に失敗した場合の処理方法

|イベントソースのタイプ|処理方法|
|:--|:--|
|同期呼び出し<br>（プッシュ型）|・429エラーを返却する<br>・リトライするためには、呼び出し元でリトライ作業を行う|
|非同期呼び出し<br>（プッシュ型）|・2回まで自動的に間を空けてリトライする<br>・デッドレターキューを設定することで、関数がエラーになった原因を調査可能|
|ストリームベース<br>（プル型）|データの有効期限が切れるまでエラーが発生したデータの処理を試みる<br>・処理の順序を保つため、データの有効期限が切れるか処理が成功するまで同一のシャードから新しいレコードは読み込まない|
|キューベース<br>（プル型）|・メッセージの処理に失敗すると、それをキューに返却する<br>・メッセージは可視性タイムアウト期間を過ぎると再度処理が可能になる|

## デバッグ
- ログはCloudWatch Logsに出力される
<br>→ エラー発生時にはログを確認することで原因を特定可能
- マネージメントコンソール上でテスト実行することが出来、コンソール上に実行結果とログの出力も可能
- **AWS SAM（Serverless Application Model）**というフレームワークを利用することで、Lambda関数をローカル環境で実行・テスト・デバッグすることが可能
SQLインジェクション問題と、エスケープによる対処方法について

#はじめに
エンジニアが携わるセキュリティに関する問題として、一番最初に目にするのは、SQLインジェクション問題ではないでしょうか。
そこで、SQLインジェクション問題とはどういったもので、どうすれば対処できるか？　ということについてまとめてみました。

#SQLインジェクション問題とは
SQLインジェクションとは、Webアプリケーションに対する攻撃の一種です。
SQLの脆弱性を突き、データベース上の情報を盗み取ったり、改ざんしたりすることが可能となります。
もし企業が会員の顧客情報を流出してしまったら、それだけで倒産となる可能性も十分にありうる時代です。
セキュリティの観点からいって、必ず対処しておくべき問題のひとつといえるでしょう。

#具体的な例

以下のようなSQL文で考えてみます。

```sql
select * from 会員テーブル where 会員番号='○○';
```

このとき、会員番号は1,2,3..というような整数の値を取ることにします。

```sql
select * from 会員テーブル where 会員番号='1';
```

1つの整数につき、1つのデータのみが該当するので、常に0件か1件の答えが返ってくるはずです。
システムとしては、そのように想定されて作られています。

しかし、ここで以下のような入力をおこなったとします。

```sql
select * from 会員テーブル where 会員番号='1' or 会員番号 > '0';
```

すると、会員番号が1もしくは0より大きい数字をデータベースより探すことになります。
もちろん、データベース上のすべてのデータが該当することになります。
そのため、システムとしては予期せぬエラーが発生していることになり、ストップしてしまう可能性があるのです。

#エスケープによる対処方法

SQLインジェクション問題を解決するためには、SQL文に一工夫を加えることが必要です。

```sql
select * from 会員テーブル where 会員番号=?;
```

上記のような書き方をすると、特殊記号である『'』や『;』がデータベースの読み込みに使われることなく、そのままの文字列としてみなされます。
結果として、不正な入力を防ぐことが可能となります。

#最後に
データベースのセキュリティを高めることは、エンジニアとして重要な仕事です。
一つずつ対処法を覚えていき、より強固なセキュリティを作り出していきましょう。
【Lambda】Lambda関数①

## 基本設定
- メモリは最小128MBから最大3,008MBまで64MB単位で選択可能
<br>→ 最適なメモリサイズを指定することでコスト最適化が可能
- タイムアウト時間は最長15分まで指定可能
<br>→ タイムアウト時間を超えるLambda関数の実行は全て失敗となる
- メモリに比例するCPUが割り当てられる（メモリと独立しての設定は不可）
- Lambda関数の設定情報として環境変数を定義しコード内から参照することで、処理に応じて関数内の変数の値を変更可能

## Lambdaレイヤー
複数のLambda関数でコードを共有するための機能

- 複数のLambda関数で用いられる共通機能をレイヤーとして登録すれば、それをLambda関数で利用するレイヤーとして指定するだけで複数のLambda関数を利用出来る
- 1つのLambda関数につきレイヤーを5つまで指定可能

## バージョン / エイリアス
### バージョン
Lambda関数のバージョンを発行する機能

- 全てのLambda関数には **$LATEST** という特別なバージョン（常に最新のバージョン）が存在する
- バージョンを発行すると、1から順に付与されたバージョン番号を持つ$LATESTのスナップショットが発行される
- $LATEST以外のバージョンのコードや設定は編集不可
- Lambda関数はバージョンごとにAWSのリソースを一意に特定するためのARNを持つ
<br>→ 例：バージョン2の関数のARN
<br>　`arn:aws:lambda:aws-region:account-id:function:test:2`

### エイリアス
Lambda関数の各バージョンに別名を付与する機能

例：開発環境用にDEV、本番環境用にPRODというエイリアスを作成する
`arn:aws:lambda:aws-region:account-id:function:test:DEV`
`arn:aws:lambda:aws-region:account-id:function:test:PROD`

DEVにバージョン3、PRODにバージョン2を関連付け、DEVでの動作確認が完了したらDEVエイリアスをバージョン4、PRODエイリアスをバージョンを3に関連付けることで、呼び出す側のコードを変更することなくLambda関数のバージョンをあげることが可能

## ポリシー・実行ロール
Lambda関数には以下2つのアクセス権限定義がある

**1. Lambda関数ポリシー**：Lambda関数へのアクセス権限を定義するもの（リソースベースのポリシー）
**2. 実行ロール**：Lambda関数からのアクセス権限を定義するもの（Lambda関数に割り当てるIAMロール）

## VPCアクセス
Lambda関数からVPC内のEC2インスタンスやRDSインスタンスにアクセスするためには、VPCアクセス設定を行う必要がある

- Lambda関数からアクセスするVPC・サブネット、Lambda関数に割り当てるセキュリティグループを選択
- Lambdaは、Lambda関数の実行時にVPCアクセス設定をもとにENIを作成し、VPC内のリソースへのアクセスを可能にする
<br>→ Lambda関数には、ENIの作成・削除などの権限を持つポリシーを付与したIAMロールを割り当てる必要がある
- `AWSLambdaVPCAccessExecutionRole`は、VPCアクセスを行うLambda関数に最低限必要なアクセス権限を定義しているIAMポリシー
【Lambda】AWS Lambdaとは

## Lambdaとは
サーバーの準備・管理をすることなく、Lambda関数と呼ばれるコードを実行出来るコンピューティングサービス

**FaaS（Function as a Service）**：イベントが発生したときに起動させる機能（Function）だけを利用者が開発し、それ以外のサービスはすべてAWSなどのクラウドサービス企業が責任を持つ形態

### メリット
- トランザクション量に応じて自動でスケーリングする
- 起動時点で高可用性が保証されている
- Lambda関数の実行中のみが課金対象で、アイドル時間については利用料がかからない

## Lambda関数
Lambdaの中心となる構成要素としてプログラミング言語で記述された機能

- イベントソースでのイベントをトリガーとして実行される
- 詳細 → [【Lambda】Lambda関数①](https://qiita.com/777cb_/items/f39218b5524ceca64514)、[【Lambda】Lambda関数②](https://qiita.com/777cb_/items/e5895c6d57da1c98c06b)
- Lambda関数を初めて実行する場合、実行用のコンテナ作成やコードのダウンロードなどの準備が行われるため、実行までに時間を要する
<br>**・コールドスタート**：コンテナやENIが新しく作成された後でLambda関数が実行されること
<br>**・ウォームスタート**：既存のコンテナやENIを利用してLambda関数が実行されること
<br>→ 不要なコード・ライブラリの削除、適切なVPCアクセス設定の付与をすることで、コールドスタートの実行にかかる時間を短縮出来る

### コーディング方法
Lambda関数のコーディング方法は以下の3つ

1. マネージメントコンソールのLambdaの画面上で直接入力する
2. マネージメントコンソールのLambdaの画面上でzipファイルをアップロードする
3. S3にアップロードしたzipファイルを参照させる

### 対応言語
Lambda関数が標準でサポートしているプログラミング言語とバージョン

|Node.js|Python|Ruby|Java|Go|.NET|
|:-:|:-:|:-:|:-:|:-:|:-:|
|Node.js 8.10<br>Node.js 6.10|Python 3.6<br>Python 3.7<br>Python 2.7|Ruby 2.5|Java 8|Go 1.x|.NET Core 2.1<br>.NET Core 2.0<br>.NET Core 1.0|

※ Lambda関数には、カスタムランタイムの利用も可能

**カスタムランタイム**：標準ではサポートしていないプログラミング言語でもLambda関数の開発を可能にする仕組み（利用者自身で用意するか、AWSが提供しているものを利用する）

## イベントソース
Lambdaによってサポートされているイベントソース

|同期呼び出し（プッシュ型）|非同期呼び出し（プッシュ型）|ストリームベース（プル型）|キューベース（プル型）|
|:--|:--|:--|:--|
|・ALB<br>・API Gateway<br>・Cognito<br>・CloudFront<br>・Kinesis Data Firehose<br>・Alexa<br>・Lex<br><br><br>|・S3<br>・SNS<br>・SES<br>・CloudWatch Events<br>・CloudWatch Logs<br>・Cloud Formation<br>・CodeCommit<br>・AWS Config<br>・AWS IoT ボタン|・DynamoDB<br>・Kinesis Data Streams<br><br><br><br><br><br><br><br><br><br>|・SQS<br><br><br><br><br><br><br><br><br><br><br>|

### プッシュ型
イベントソースがLambdaを呼び出しLambda関数を実行する

- サービスもしくはアプリケーションが直接実行する
- 順不同で実行される
- 3回までリトライする

**同期呼び出しタイプ**：Lambdaの処理が完了するのを待ってから処理結果をレスポンスとして受け取る
**非同期呼び出しタイプ**：Lambdaに実行命令だけ送り、処理の完了を待たない

### プル型
Lambdaがイベントソースのストリームやキューをポーリングし、新たなイベントが存在した場合にLambda関数を実行する

- ストリームに入ってきた順で処理される
- データが期限切れになるまでリトライする

**ストリームベース**：DynamoDBやKinesisのストリームをトリガーとする
**キューベース**：SQSのキューをトリガーとする

## 外部ライブラリの利用
Lambdaの標準的な実行環境に含まれているライブラリは AWS SDK for JavaScript や AWS SDK for Python などの一部ライブラリのみで、開発に利用する殆どの外部ライブラリは含まれていない

- 外部ライブラリを使用する際は、Lambda関数のコードとコード内で使用するライブラリを合わせてzip化し、Lambdaにアップロードする
- Lambda関数のコードは必ずzipファイルのルートに配置する

## モニタリング
Lambdaの稼働状況を確認するためには、以下2つのサービスでモニタリングを行う

### Amazon CloudWatch
マネージメントコンソールから、アカウントレベルまたは関数レベルで実行数・エラー数などのCloudWatchメトリクスを可視化して確認可能

- CloudWatch Logsを利用することで、より詳細な情報を得ることも可能
- Lambda関数にCloudWatch Logsへのアクセス権限を付与することで情報が収集される

### AWS X-Ray
アプリケーションのパフォーマンス分析及びエラー原因特定のためのサービス

- CloudWatchよりも詳細なパフォーマンス分析が可能（Lambda関数の準備時間、処理実行時間、他サービスの呼び出しに要した時間など）
- X-Rayによるモニタリングは以下の準備が必要
<br>**1.** トレースモードをアクティブにする（Lambda関数の実行ロールに、X-Rayへの書き込みに必要な権限が自動的に付与される）<br>**2.** AWSサービスの呼び出しをモニタリングする場合は、Lambda関数のコード内でサブセグメントを発行し、トレースを有効化する
- 利用する場合、収集したデータをX-Rayに送信するためのX-RayデーモンというアプリケーションがLambdaの実行環境で動作する
- X-Rayデーモンの動作にはLambda関数に割り当てられたメモリが消費されるため、十分なメモリを確保する必要が生じる
Liquid を覗く...（Shopifyをカスタマイズし始めるときに）

最近Shopifyが話題ですね！（雑） 最近こういった記事が話題になっていました。

[アマゾンを破壊する｢ショッピファイ｣の超威力](https://toyokeizai.net/articles/-/391647)

##Shopifyを知らない方へ
Shopifyは一言でいうと、ECサイトを立ち上げることができるサービスです。サイトのデザインも、管理画面もShopifyでできます。Shopifyさえあれば、自分は商品の準備と配送をすればECができます（細かい業務は他にたくさんありますが...）。サイトのデザインもCMS（wordpress）のような画面で出来るのですが、流行り言葉でいうとノーコードという括りに入るのかもしれませんね。

wordpressのようにサイトデザインのテンプレートも用意されているので、早ければ数日で自分のECサイトがオープンできます。便利な世の中です。ちなみにShopifyのサービスは全体的に使いやすいです。UIもモダンだし、もともとは英語のサービスですが、ローカライズもしっかりしている。おすすめです（雑）。

##Shopifyカスタマイズ（フロントエンド編）
さて、Shopifyで作るECサイトは基本的にCMSのような管理画面でテンプレートをベースに、設定項目をいじって作っていくのですが、既存の設定項目だけじゃ満足できない場合が出てきます。

例えば

- 英語と日本語のフォントを分けたい
- 選んだテンプレートでは一つのフォントを選べない場合がある。
トップページのコンポーネントが気に入らない
マージンとか、サブ見出しつけたいとか、そもそもレイアウトを変えたいとか・・・

このへんはLiquidというやつをいじれば実現できます！

###Liquidとは
LiquidとはShopifyが開発・提供するRubyベースのテンプレート言語で、HTMLとストアデータの橋渡しをしてくれます。
コーディング自体やRubyにあまり慣れてないと難しいイメージあるかもしれませんが、けっこう直感的に触れます。

```sample.liquid
<h1>{{ shop.name }}</h1>
{% comment %} shop名が出力される。こういった形でいろんなストアデータ（商品情報とか）を呼び出せます。こういう呼び出しだけじゃなく、論理式も書けます。{% endcomment %}
```

詳しくは公式の記事がわかりやすいので、この記事を読むと良いです。
[Shopifyのテンプレート言語 Liquidの概要](https://www.shopify.jp/blog/partner-shopify-template-language-liquid-overview)

###Liquidを覗く
さて、早速LiquidへGo!
ガッツリ触っていくならローカルで開発環境作ったほうが良いですが、いったんShopifyのエディターで触っていきます。
Shopify管理画面→テーマ→開きたいテーマを選ぶ→アクション→コードを編集する、でオンラインでエディターが立ち上がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829894/e028ca46-6b48-5586-5cd2-cbca4dfbe58e.png)

ディレクトリがたくさんあって、ディレクトリによってはファイルがたくさん入っているのですが、まずは全体像をざっとまとめます。

### 各ディレクトリの使われ方
私がメインで触っているDebutというテーマでは、このようなディレクトリ構成です。おそらく全てのテーマが共通もしくは似ている構成なんだと思います。

- assets: cssやjavascriptなどのファイルをいれるディレクトリ。Liquidから呼び出したい画像ファイルとかもここにアップロードする。
- config: テーマの設定ファイルが入るディレクトリ。Shopifyの管理画面でテーマを設定できますが、設定内容はここのconfigファイルに保存されています。
- layouts: theme.liquidというページ全体のレイアウトを決めるファイルがある。
- templates: 商品ページ、ブログなど特定のページで使われるテンプレートが保存される。
- sections: 各ページのセクション（コンポーネント）のファイルが保存されている。
- snippests: 各ページのセクションに使われる更に小さいコンポーネントが保存される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829894/6250dc3d-c39d-0507-84ab-5a512c7dff21.png)
上のディレクトリをトップページのこのスクショで説明すると・・・

- ヘッダー部分は全ページ共通なので、layouts/theme.liquidに記述
    - ヘッダー部分の記述は、layouts/theme.liquidからsection/header.liquidを呼び出す。このheader.liquidが実際のデザイン。
    - header.liquidの細かいパーツ（例えばメニューのアコーディオン）はsnippests/site-nav.liquidを呼び出す。
- 人気ランキングというコンポーネントはsection/collection.liquidから呼び出されている。
    - このコンポーネントは小さいコンポーネント（商品画像＋商品名＋価格）が8個で構成されているが、この小さいコンポーネントはsnippests/collection-grid-item.liquidから呼び出されている。
- トップページはいろいろなコンポーネント（スライドショー、人気ランキングなどの商品コレクション）などを並べて表示されいる。どのようなコンポーネントがどう使われているかは、config/settings_data.jsonに保存されている。

ざっとイメージ掴んでいただけたでしょうか？
HTMLを生で書くと（今はそんなことをする機会はあまりないと思いますが）、各ページの要素が細かくセクション・スニッペストに分けられているので、全体に適用しやすい形で細かくカスタマイズできます。

アドベントカレンダーの第一弾としてちょっと概観的な話になりましたが、空いている日程で具体的なカスタマイズを行っていきたいと思います。
Docker(docker-compose) + MySQL でのパスワード入力時のエラー / ERROR 1045 (28000): Access denied for user

RailsをAPIモードで Docker + MySQL を使用してWebアプリ開発をしています。

環境構築時に、
`docker-compose up` して dbにログインしようとすると
`ERROR 1045 (28000): Access denied for user`と
ログインができないエラーに遭遇したので、私が解決できた方法を記載しておきます！

### 解決法

私の場合は、docker-compose.ymlで 

```docker-compose.yml
db-data:/var/lib/mysql:cached
```
このようにしてdbデータをローカルに保存してマウントしていたのですが、
ここに試しに作っていた、いくつかのvolumeが残っていたため、
そちらの環境変数が優先され、現在のパスワードが反映されていないという問題でした。

MySQL公式に
> 既にデータベースを格納しているデータディレクトリとともにコンテナを起動した場合は、下記の変数はどれも影響を及ぼさないことに留意してください。

とあるようです。
詳しくは [こちら](https://qiita.com/hanyuTransfer/items/4584d0a4d85f0f78cfb6) の記事をご覧ください。

つまり、
マウント先のローカルのdbを一旦削除して、再度作り直せばOKということです。

### 手順

```terminal
docker-compose down
docker volume ls
docker volume rm (lsで表示されたvolume名をスペース区切りで並べる)
docker-compose up
```

で、作り直して再度ログインすると、問題なくログインできました！！

上記の手順で、
`docker volume rm`時にもしかすると、削除できない場合があるかもしれません。
その時は、

```terminal
docker system prune
docker volume rm ○○
```
とするとうまくいくかも知れません！！
Progate jQuery 初級編　復習

 
スピーディーに復習できました！
thisは国語の現代文の’それ’の使い方に似ているんだなぁって思いました。日本語でも便利で、かつ流動的な言葉ですよね、それって。プログラミングでももちろん便利。
復習するとまた見えてくる世界がかわってきて、面白いですね〜
WordPress(VALUE-DOMAIN + VALUE SERVER) * AFFINGER5

【ドメイン設定】VALUE-DOMAIN（ https://www.value-domain.com/ ）
１：ドメイン登録
・ドメイン名は早いもの勝ち！今すぐ登録しよう！
２：ドメインの設定操作＞DNS情報／URL転送の設定
・当サービス内サーバーの自動DNS設定
「選択してください」で運用する設定に変更

【サーバ設定】VALUE SERVER（ https://www.value-server.com/ ）
１：ドメインの利用＞ドメインウェブの設定
・SSL用ドメイン情報入力
２：ドメインの利用＞無料SSLの設定
・無料SSLを利用するドメインを設定
３：ドメインの利用＞ドメインメールの設定・追加
・ドメインメールの設定
４：データベース＞データベースの追加・インストール
・MySQLの追加・編集（最大：1個）
５：CMSインストール＞ブログシステムインストール
・WordPress＞設置場所・パス「登録したドメイン」

反映に数分かかるので、暫くしてからインストール先を開く

【WordPressインストール】
データベース接続
・データベース名：DB/ユーザー名
・ユーザー名：DB/ユーザー名
・パスワード：MySQL作成時に設定したパスワード
・データベースのホスト：localhost
・テーブル接頭辞：任意の半角英数字

必要情報
・サイトのタイトル：任意のタイトル
・ユーザー名：任意のユーザー名
・パスワード：任意のパスワード
・メールアドレス：利用可能なメールアドレス
「WordPressをインストール」

【WordPressカスタマイズ】

AFFINGER5（ https://affinger.com/ ）
「wing_af5_dl.zip」ダウンロードした圧縮ファイルを解凍する。
Railsチュートリアルやった後くらいに学んだ方が良いことをUdemyで学ぶ

#はじめに
自分は去年から未経験でアプリ開発の現場に就職しました。
当時のレベルはRailsチュートリアルを3周くらいして、まあ多少はRailsのコードは書けるのかな？程度のレベルでしたが、もちろん実務ではそんなものでは全然足りずUdemyで色々受講したりして勉強しました。

そこで自分が受講して実際に役にたっている講座と内容を紹介したいと思います。
良い講座ばかりですが、注意点も多少あるので各章の最後に書いておきます。

#Docker
開発環境を整えるのにもはやDockerは必須ですよね。
Dockerという言葉は聞いたことあるけど、よく分かってない。そんな声がちらほら。

私も環境構築に使うんでしょ？くらいの認識でした。
ということで下記講座を受けました。

[ゼロからはじめる Dockerによるアプリケーション実行環境構築](https://www.udemy.com/course/docker-k/)

Dockerとは何かから、実際にコンテナを立てたり、docker-composeでRails環境作るところまで分かりやすく解説されています。

※注意点
最後にSwarmの解説ありますが、今のデファクトスタンダードはKubernetes、略してk8s（かっこいい）なので、ここは特に見なくても良いのかなって気がしました。（もちろん勉強になると思います）


#React

Dockerで環境構築できたらRailsはAPIモードにしてバックエンド専用、フロントはモダンなやり方で実装したいですね。そこでReactやります。

Railsチュートリアル終わったくらいだと、おそらくjQueryは分かると思いますし、RailsのViewをSlimで書いたりしていたと思いますが、バックエンドとフロントエンドを分離して、RailsはAPIでデータを返すだけ、フロントでの描画はReactで書きましょう。

Reactは二種類の書き方があり、一つはクラスコンポーネント、もう一つは関数コンポーネントです。
公式ではクラスコンポーネントはサポートを廃止する予定はないものの、新しいプロジェクトでは関数コンポーネントで書いても良いんじゃないかと言っていますので、おそらく関数コンポーネント推しなのではないでしょうか。（関数コンポーネントを絶対に使えとは書いてなかったです）

Reactのv16.8からHooksというものが導入されて、関数コンポーネントでstateを扱えるようになりました。最近は関数コンポーネントでしかコード書いてません。というか関数コンポーネントからしか勉強してないので関数コンポーネントしか書けません笑

以下動画ではHooksを使った関数コンポーネントの使い方が学べます。

[【はむ式】React Hooks 入門 - HooksとReduxを組み合わせて最新のフロントエンド状態管理手法を習得](https://www.udemy.com/share/101tSGB0cSdl5RRXo=/)

※注意点
クラスコンポーネントの解説は基本的にありません。クラスコンポーネント使わなくてもコーディングできますが、一応なんとなく読める程度にはなっておいた方が良いとは思いますので別で勉強必要かと思います。
個人的に普段書くことはありませんが、クラスコンポーネントは多少読める程度には勉強しました。


#GraphQL
RailsチュートリアルでREST APIがどんなものかはなんとなく理解したかと思います。
実際は、APIとか意識してなかったと思いますが、`routes.rb`でURLとアクション紐付けてますよね。あれがREST APIです。
そうしたら次は別のAPIプロトコル学んでみましょう。

簡単に説明しますと例えば、REST APIでは`/users`のようなurlにアクセスすると全てのuserの全ての情報が取れます。でも場合によっては全userの名前だけ欲しい時がありますよね？
そうすると、全userのidとかアバター画像のurlとか無駄なデータもフロント側に渡されます。

GraphQLでは欲しいものだけリクエストができるので、全userの名前だけ取得するといったことが可能です。

さらにスキーマ自体がAPIの仕様書になるので開発スピードが上がるということです（正直この辺は時と場合にもよるので絶対正しい訳ではないと思います）

ものすごくざっくり言うとREST APIでは、あるurlに対して何を渡すと何が返ってくるかという仕様書を作る必要があったのですが、GraphQLでは何を渡すと何が返ってくるかという仕様書を作るそれ自体がAPIの実装になるのでわざわざ別で作る必要がないといった感じです。

[【はむ式】フロントエンドエンジニアのためのGraphQL with React 入門](https://www.udemy.com/share/1023XAB0cSdl5RRXo=/)

※注意点
この講座ではGraphQLとはどういうものか学べますが、実際にAPIをどのように実装するかはカバーしていません。Railsで実装する場合には[graphql-ruby](https://github.com/rmosolgo/graphql-ruby)というgemを使って実装していきます。

#まとめ
これでDockerで環境構築して、RailsでGraphQLのAPI作成して、フロントをReactで作れるようになりました。
ReactでGraphQL扱うのにGraphQLクライアント必要なのですが、[Apollo Client](https://github.com/apollographql/apollo-client)が一番有名だと思うので、色々参考にしながら実装してみて下さい。

ちなみにReactの動画でReduxも多少学ぶことができるのですが、普段Redux使っていません。
なぜかというと前にReduxを使おうとしたらApollo Clientと競合したためです。

Apollo Client自体にstateを管理する機能があったり、useContextというHooksを使えば余程複雑ではない限りRedux使わなくても十分対応できると思います。

ということでRailsチュートリアル終わったらこの辺クリアしていくと良い感じに順番に技術を学べるんじゃないかというちょっとした経験談でした。
【Android】Single ActivityにおけるsharedViewModelのスコープについて【Koin】

# はじめに
KoinでViewModelをインジェクトする際には、`viewModel()`と`sharedViewModel()`の二つのやり方がある。
僕が担当しているアプリでは基本Fragment-ViewModelで一対一の関係になっているのだけど、ViewPagerを使用していたりするとViewModelをFragment間で共有したい場面が多くて、そういう時に`sharedViewModel()`が大活躍してくれる。

ただ、今までなんとなく`sharedViewModel()`を使ってきてしまったが故に、こないだちょっと沼にハマってしまった。
今回はそんな`sharedViewModel()`で共有したViewModelのスコープについてご紹介。

## sharedViewModelとは？

前述の通り、ViewModelを**Fragment間で**共有できるViewModelをインジェクトする。
と、今まで思っていた。

というのも実はこの`sharedViewModel()`、インスタンスを共有するスコープがデフォルトでActivityになっているらしい。
中の実装をチラッと覗いてみると、こんな感じになっている。

```kotlin
/**
 * Lazy getByClass a viewModel instance shared with Activity
 *
 * @param qualifier - Koin BeanDefinition qualifier (if have several ViewModel beanDefinition of the same type)
 * @param from - ViewModelStoreOwner that will store the viewModel instance. Examples: "parentFragment", "activity". Default: "activity"
 * @param parameters - parameters to pass to the BeanDefinition
 */
inline fun <reified T : ViewModel> Fragment.sharedViewModel(
        qualifier: Qualifier? = null,
        noinline from: ViewModelStoreOwnerDefinition = { activity as ViewModelStoreOwner },
        noinline parameters: ParametersDefinition? = null
): Lazy<T> = kotlin.lazy { getSharedViewModel<T>(qualifier, from, parameters) }
```

見て欲しいのは、第二引数のfromのところ。
コメントで`ViewModelStoreOwner that will store the viewModel instance. Examples: "parentFragment", "activity". Default: "activity"`とある通り、デフォルトではViewModelのインスタンスを保存している場所がactivityとなっている。

そのため、「ViewModelをFragment間で共有したい時に使用する」という認識は誤りで、**「Activity内で共有できるViewModelをインジェクトする」**という認識の方が正しかったりする。

## スコープを正しく認識していないことによる問題

`sharedViewModel()`のスコープをきちんと認識できていなかったことがわかったわけだけども、これが原因であるバグが発生していた。

それが、下の画像のパターン。
こんな感じで`FragmentA`に`FragmentB`が乗っている画面を作りたくて、二つのFragmentでViewModelを共有するために`sharedViewModel()`を使用していた。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474683/98154cac-31f2-cb6e-f9c8-085313a62f8f.png" width="400"/>


で、この画面が実は下の画像のように、同じ画面に遷移する導線を持っていた。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474683/065acdc7-d65e-55de-e444-88d4902ff588.png" width="500" />

この時ViewModelは画面遷移の際に新たに生成される、**と思っていた**。

実はこのViewModel、`sharedViewModel()`を使っているせいで、画面遷移をしても同じインスタンスのViewModelが使用されている。
自分のプロジェクトはSingleActivityで作られているので、基本的にアプリが起動している間ずっとViewModelのインスタンスが破棄されない状態になっていた。
このままでは、前のデータが残っていたり無駄にインスタンスが残っていたりしてしまう。

## 解決方法

解決方法はそんなに難しくない。
ViewModelを保持しておくスコープを、各Fragmentにしてあげればいいだけ。

さっき見た`sharedViewModel()`の第二引数のデフォルト引数が`{ activity as ViewModelStoreOwner }`となっていたので、こいつを変えてあげる。

```kotlin
private val viewModel: ViewModel by sharedViewModel()
```

こいつを

```kotlin
private val viewModel: ViewModel by sharedViewModel(from = { requireParentFragment() })
```
こう！

# まとめ

SingleActivityでアプリを作っている場合は、スコープをActivityにしたい場面ってあんまりないと思うので、もしかしたら基本parentFragmentを指定してあげるのがいいのかもしれない。
Daggerもそうだけど、DIは設定が難しくてなんとなく使っちゃいがちだけど、やっぱりこういうのきちんとドキュメント読まなきゃだめだね。

おわり。
量子コンパイラを作る。

# 概要

量子コンパイラを作る。
構想編

# 仕様

高位合成言語アセンブラのソースから、blueqat(python)のソースを生成する。

# 投入するソース

半加算器

```
make 4
in 0 1
out 2 3
and 0 1 3
xor 0 1 2
```

# 生成されたコード


```
from blueqat import Circuit

print (Circuit(4).h[ : 2].cx[1, 3].cx[0, 3].ccx[0, 1, 2].m[ : ].run(shots = 100))
```


以上。
VMでマウントする時のメモ

# 概要
結構前にvirtualhostとローカルのマウント設定をまとめたメモがあったので転載。

VMを構築したのちに実際の開発をするのがサーバ上だと大変なので、ローカルとマウントを行いたい時にこの設定をすると楽になる(今だとDockerやVagrantがあるから参考程度に)

# 環境
CentOS6.9

# Virtual Box側の設定

## Guest Additionsの挿入

対象ホストのウィンドウを選択

左上の「デバイス」 -> 「Guest Additions のCDイメージを挿入… 」を選択
![スクリーンショット_2020-12-01_6_00_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153118/2b938c01-fb7c-09f7-799c-fd3c66878f1f.png)

## 共有フォルダの設定

対象のVMを選択→「設定」を押下します。

「共有フォルダ」の項目から以下のように設定します。

![スクリーンショット 2020-12-01 6.32.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153118/cb4b12d3-5511-4833-9854-2d4b4bd33261.png)

対象フォルダはマウントしたいローカルのフォルダを指定してください。
フォルダ名は自由に設定してください(あとで使います)
「自動マウント」と「永続化する」にチェックを入れます。

![スクリーンショット 2020-12-01 6.28.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153118/3c5bd6dc-0e51-6f90-310f-118f6553ff21.png)

上記のようになるので「OK」をクリックします。

# centos-linux側

上記で設定したVBoxLinuxAdditionsを実行します。

```bash
mkdir /media/cdrom

mount -r /dev/cdrom /media/cdrom
cd /media/cdrom
./VBoxLinuxAdditions.run
```

## ./VBoxLinuxAdditions.run実行時エラー対策

上記実行時にいくつかエラーが出たので対処方法をまとめる

### エラー1：Building the main Guest Additions module

以下のようにログ確認を確認、カーネルがなかったのでインストールする。

```
tail -f /var/log/vboxadd-install.log 
```
```
yum -y update kernel
yum -y install kernel-devel kernel-headers dkms gcc gcc-c++
//カーネルをインストールしたら再起動
reboot

//再起動したら再度実行
mount -r /dev/cdrom /media/cdrom
cd /media/cdrom
./VBoxLinuxAdditions.run
```

カーネルのアップデート後はrebootが必要というか、isoの再設定が必要のようです。

### エラー2：bzip2がないと言われる
```
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.2.38 Guest Additions for Linux........
bzip2 not found.  Please install: bzip2 tar; and try again.
[root@soichost cdrom]# ./VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.2.38 Guest Additions for Linux........
bzip2 not found.  Please install: bzip2 tar; and try again.
```
のでbzip2をインストールする
```
[root@soichost cdrom]# yum install bzip2
```
 
## マウントを実行
```
mount -t vboxsf [vboxshare] [directory]
```

以下の項目に沿って実行してください。

|項目|説明  |
|---|---|
|vboxshare |VMの「共有フォルダ」設定時につけたディレクトリ名 |
|directory |マウントしたいcentos側のパス |

そうすると指定したdirectoryにローカル情報がマウントされていると思います。

これでローカルからファイル操作をしてVMに反映させることが可能になります。
gitlabのバージョンアップ時の移行コマンド

# 概要
gitlabを古いバージョンから新しいバージョンに移行する際に一括実行するコマンドをまとめる。

# 手順

## 空のリポジトリを作成

後続のコマンドを実行するために移行先のリポジトリを作成する

## コマンドを実行
以下の手順で旧リポジトリ内容をコピー、[xxx]はそれぞれの内容に置換してください。

[domain]：ドメイン名
[group]：グループ名
[project]：プロジェクト名
[old_group]：旧グループ名

```
git clone http://[domain]/[group]/[project].git [group]/[project]
cd [group]/[project]
 
// 旧リポジトリと接続（タグが取り込まれる）
git remote add -f [project]_old http://[old_domain]/[old_group]/[project].git
 
// 旧リポジトリを取り込み
git merge remotes/[project]_old/master
 
// masterのpush
git push origin master
 
// 全タグのpush（旧リポジトリ接続時に取り込まれている）
git tag|xargs -I{} -n1 git push origin {}
 
 
// ブランチの移行
git branch -r|grep [project]_old/|sed "s|  [project]_old/||g"|xargs -I{} -n1 git checkout -b {} remotes/[project]_old/{}
git branch |sed -e 's/*//g' | xargs -I{} sh -c 'git checkout {}; git push origin  {}'
 
// ワンライナーver
git clone http://[domain]/[group]/[project].git [group]/[project] \
&& cd [group]/[project] \
&& git remote add -f [project]_old http://[old_domain]/[old_group]/[project].git \
&& git merge remotes/[project]_old/master \
&& git push origin master \
&& git tag|xargs -I{} -n1 git push origin {} \
&& git branch -r|grep [project]_old/|sed "s|  [project]_old/||g"|xargs -I{} -n1 git checkout -b {} remotes/[project]_old/{} \
&& git branch |sed -e 's/*//g' | xargs -I{} sh -c 'git checkout {}; git push origin  {}'
```

上記のコマンドで移行できる内容は以下になる。

- ブランチ
- コミットログ
- タグ
- ファイル

issueやwebhook、マージリクエストに関しては移行することができないので、手動で移行する形になります(方法があれば教えてください)
Twitter API で取得できるツイートはエスケープされている。

この記事は[ユニークビジョン株式会社 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/uniquevision)の記事です。

去年は、「1日目から長い」と言われたので少し前にやった勉強会の内容を改めて記事にすることでここはひとつ。

内容は表題の通り。
Twitter API で取得したツイートはエスケープがかかったままであるという内容。

# ツイートの取得
まずは API でツイートを取得
回収するツイートは[これ](https://twitter.com/NTakaUV/status/1331104166027018241)

 #20201124_test_tweet black&white とツイートした内容

```ruby
require 'oauth'
require 'json'

consumer = OAuth::Consumer.new(
 "YOUR CONSUMER KEY",
 "YOUR CONSUMER SECRET",
 site:'https://api.twitter.com/'
)
endpoint = OAuth::AccessToken.new(
 consumer,
 "YOUR ACCESS TOKEN",
 "YOUR ACCESS SECRET"
)

id = '1331104166027018241'

show_url = 'https://api.twitter.com/1.1/statuses/show.json'

res = endpoint.get(show_url+"?id=#{id}")

puts JSON.parse(res.body)['text']
# => #20201124_test_tweet black&amp;white
```

& がエスケープされて返ってきました。

# ネット上の情報
[記事1](http://www.tokumaru.org/d/20070829.html), [記事2](http://koseki.hatenablog.com/entry/20100414/twitterEscape), [記事3](https://iwamototakashi.hatenadiary.jp/entry/20100415/p1), [記事4](https://obel.hatenablog.jp/entry/20160617/1466150948)

2007年ごろから同様の現象が報告されているのを発見した。
Twitter API の提供開始が2006年9月ごろからとのことなので、この現象はAPI提供開始から継続していると考えられる。
なお、Twitter API v2 でも依然確認できる事象なので今後もこのままだろう。

ただし、古い記事と比較的新しい記事では報告内容が微妙に異なる。

いわく、古い記事では「<」, 「>」 がエスケープされている。
いわく、新しい記事では「<」, 「>」, 「&」 がエスケープされている。

では、当記事投稿時点での実際の挙動を確認してみる。

# 現在の挙動
ascii 記号を全て含めたツイートを行い、これを取得してみる。
ツイートは[これ](https://twitter.com/NTakaUV/status/1331107019990790145)

```ruby
# (略)
id = '1331107019990790145'

show_url = 'https://api.twitter.com/1.1/statuses/show.json'

res = endpoint.get(show_url+"?id=#{id}")

puts JSON.parse(res.body)['text']
# => #20201124_test_tweet !"#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~
```

新しめの記事と同じく、「<」, 「>」, 「&」 がエスケープされていることを確認できた。

また、古い記事では
「エスケープされた結果がDBに直接保存されていて、それを画面に表示しているらしい。」
「実体参照をツイートするとデコードされる。`&lt;` とツイートするとTwitter上で < に文字化けする。」
と記述されているが、この現象は確認できなかった。

古い記事で指摘された妙な XSS 対策は幾ばくか改善しているらしい。

# 対象文字
さて、対象文字はなんなのか。
というかどういったエスケープをかけているのか。

私も & が `&amp;` に化けて返ってきた時はHTMLエスケープをしているのかと思ったのだが、" などがエスケープされていないのでどうも違うらしい。

そこで以下のテストをした。

```ruby
require "cgi"

str = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"

puts CGI.escapeHTML(str)
# => !&quot;#$%&amp;&#39;()*+,-./:;&lt;=&gt;?@[\]^_`{|}~

puts str.encode(xml: :attr)
# => "!&quot;#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~"

puts str.encode(xml: :text)
# => !"#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~
```

XML の CharData として処理してると考えると API の結果と一致する。

# まとめ
Twitter API はテキストを XML の CharData としてエスケープ処理をかけて返却することがわかった。

ただし、このあたりの仕様が少なくとも一度変化している様に見えるため、Twitter が未来永劫エスケープしたテキストを返してくるとは信用しきれない。

自身のサービスに取得したツイートの内容を表示する場合、Twitter 側でのエスケープは信用せず一度デコードしてから再度任意のエスケープをかけるなどするのが迂遠であるが妥当な対応なのかもしれない。

# 参照記事
[徳丸浩の日記 2007年08月29日 TwitterのXSS対策は変だ](http://www.tokumaru.org/d/20070829.html)
[こせきの技術日記 2010-04-14 Twitterのエスケープ処理について。](http://koseki.hatenablog.com/entry/20100414/twitterEscape)
[岩本隆史の日記帳（アーカイブ） 2010-04-15 Twitterの中途半端なエスケープにどう対応するか](https://iwamototakashi.hatenadiary.jp/entry/20100415/p1)
[約束の地 2016-06-17 Twitter の API で取得できるデータの一部はエスケープ済みである](https://obel.hatenablog.jp/entry/20160617/1466150948)
【javascirpt】switch文と正規表現を組み合わせるやり方。

# javascriptのswitch文で一瞬躓いたところ
javaScriptでコーティングする際、switch文と正規表現を組み合わせたい。そう思うことってあると思うんです。
その際、

```javascript
var body = "遅刻するので休みます。";

switch(body) {
    case /遅刻/.test(body):
         console.log("遅刻");
         break;
    case /早退/.test(body):
         console.log("早退");
         break;
    default:
        console.log("なんか書いてよ");
}
// 結果：なんか書いてよ
// 本当は遅刻が出力されてほしい。
```
と書くと認識してくれません。

ではどうすればいいのかというと

```javascript
var body = "遅刻するので休みます。";

switch(true) {
    case /遅刻/.test(body): // test()メソッドがboolを返すため。
         console.log("遅刻");
         break;
    case /早退/.test(body):
         console.log("早退");
         break;
    default:
        console.log("なんか書いてよ");
}
// 結果：遅刻
// 以降続く
```
非常に初歩的なものですが忘れたら良くないのでメモ代わりに書きます。

[MDN:正規表現](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions)
なぜJSが必要なのか？　(JS学習アウトプット)

##あいさつ
初めての人は初めまして！知っている人はこんにちは！
Atieです！
実は一度qiitaのアカウントを消したのですが「[web系エンジニアになろう](https://www.amazon.co.jp/21%E4%B8%96%E7%B4%80%E6%9C%80%E5%BC%B7%E3%81%AE%E8%81%B7%E6%A5%AD-Web%E7%B3%BB%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AB%E3%81%AA%E3%82%8D%E3%81%86-AI-DX%E6%99%82%E4%BB%A3%E3%82%92%E7%94%9F%E3%81%8D%E6%8A%9C%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%AD%E3%83%A3%E3%83%AA%E3%82%A2%E3%82%AC%E3%82%A4%E3%83%89%E3%83%96%E3%83%83%E3%82%AF-%E5%8B%9D%E5%8F%88/dp/4408339334)(勝又さん)」の本を読んで「qiitaのアカウントは必要」ということだったのでまた作りました！
qiitaでは主に学習のアウトプットをしていきます！
今回はJSのアウトプットをしていきます！JSはもともと学んでいたのですが「もう一度基礎からしたい！」と思ったので[しまぶーのIT大学](https://twitter.com/shimabu_it)さんの動画を参考に学ばせてもらいました！わかりやすくイラストも使っておりなおかつ「元Yahoo Japan!エンジニア」すごいですよね！さらに無料です！
いい時代になりました...

では！

#なぜJSが必要なのか？
皆さんはなぜwebサイトにJSが必要かわかりますか？
「JSを学ぶのにそこから？」
と思った方「木を見て森を見ず」です
しまぶーのIT大学さんが言っていました
「普通学習するときは”文法”から入るけどそれはお勧めしない。まずは全体像をみて一つの技術を掘り下げていくほうが”文法”を使うタイミングなどがわかる」と
なのでまずは”文法”ではなく「なぜ必要なのか？」というところから学んでいきます

話を戻します
「JSはなぜ必要なのか？」わかりますか？
それは「JS未使用のwebサイト」と「AJAXを使ったwebサイト」の二つを解説する必要があるのでまずはそこから

##JS未使用のwebサイト
最近はどんなwebサイトでもJSが使われるようになりました
それは便利だからです
どこが便利なのか？それは通信を見てもらうとわかると思います

JS未使用の通信
「example.comを見たい！」　→　ブラウザがexample.com(サーバー)にreq(リクエスト)を送る　→　サーバーがres(レスポンス)を返す(htmlファイル) →　ブラウザがhtmlファイルを受け取ってレンダリング(html,cssの支持通りにサイトを組み立てる)
大まかにこのような仕組みになっています(DBがどうのこうのなどは省略しています)
この方式だとページを移動するときにいちいちサイレンたリングしなければいけないので少し不便です

##JS使用のwebサイト
では逆にJSを使っているwebサイトの通信はどうでしょうか
例として「ToDoListのwebアプリケーション」を見てみます
例えばタスクを追加するたびにページが再レンダリングされてはめんどくさいですよね？
さらにこの方法だと追加はできても個人個人で保存ができません

JSを使った場合はサーバーにreqを投げてDBに追加してもらったり消してもらったりしています(JSはセキュリティ上DBに直接操作することはできませんただNode.jsなどは例外)
こういうのを「AJAX」という
AJAXを使うことでページをいちいち再レンダリングせずに追加や削除ができます

このAJAXを使った最たる例が「Googl Map」です
自分は最近JSを学び始めたので昔のことは知りませんでしたが
昔のマップは画面に矢印が付いていてそれを押すことでその方向に移動する仕組みだったらしいです
そしてその移動するたびに再レンダリングが必要

しかし今のGoogle Mapは画面に矢印がなくさらに直感的に使えるようになっていますよね？そしていちいち再レンダリングすることもない
すごく使いやすいですよね！

従来のwebが
・JSがなくてもHPが見れる
・resで返されるのはhtmlファイル
・ページを移動するたびに再レンダリングする必要がある

##JSを使ったwebサイトの仕組み
先ほどではJSが必要な理由について解説しました
ここでは具体的にどんな通信かを見ていきます

「example.comを見たい！」　→　ブラウザがexample.com(サーバー)にreq(リクエスト)を送る　→　サーバーがres(レスポンス)を返す(htmlファイル) →　ブラウザがhtmlファイルを受け取ってレンダリング(html,cssの支持通りにサイトを組み立てる)
ここまでは同じです
しかし「お問い合わせページに行きたい！」となったとき従来の方式ではもう一度上の方法が繰り返されますがJSを使うとresで返されるデータがhtmlではなくjsonというJSのデータが返ってきます
JSのデータとは配列などです

jsonデータの例

```data.json
[
    {"id":"1", "name":"dog"},
    {"id":"2", "name":"cat"}
]
```
このようなデータがresで帰ってきます

AJAXを使用するとページを移動する際に「最低限」のレンダリングで済みます
例えば大体のHPの場合は「ヘッダー」と「フッター」は一緒のデザインになっていると思います
なのでメインであるところのみをレンダリングします
「フッター」と「ヘッダー」が再レンダリングされないので早いです

##まとめ

###JSを用いたweb
- より体験がいいwebサイトが見れる
- レスポンスで返すのは　JSON
- ページ移動時に最低限のレンダリング
(ほかにもたくさんありますがきりがないので...)

###従来のweb
- JSがなくてもHPは見れる
- レスポンスとして返すのはhtmlファイル
- ページを移動するたびに再レンダリングされる

JSすごいですね！

##最後に
ここまで見ていただきありがとうございます！
最後に動画のurlがあるので「JSを学んでみたい！」という方は動画を見て学ぶのがお勧めです！
ではまた！

[AtieのTwitter](https://twitter.com/Atie_BackendPG)
[しまぶーのIT大学さんのTwitter](https://twitter.com/shimabu_it)
[勝又健太さんのTwitter](https://twitter.com/poly_soft)

[次回](https://qiita.com/Atie_web/items/5f58e7c25dde47340f3f)

##学習,参考動画
[【基礎から学ぶ JavaScript 入門 #1】フロントエンド開発でJavaScriptが必要な理由を解説！【ヤフー出身エンジニアが教える初心者向けプログラミング講座】 しまぶーのIT大学さん](https://youtu.be/pnsieVYy72M)
【図解付き】Gitコマンド一覧

#はじめに
本記事を作成しようとした経緯等を簡単に記載します！
同じ境遇の方であればきっと役に立つかもしれません！

##目的
・Git初学者に向けてイメージしやすいインプットをしてもらうため
・自分の覚えのため

##背景
・Git/Github学習中に悩むのが
「今Git上でどんな状態にあるのか」
「コマンド入力後に今のディレクトリやブランチ上のデータがどう扱われているか」
が不明であることでした
・実務を想定してGit/Githubを使用していましたが、よく間違えてmasterブランチにdevelopブランチのデータをmergeしてしまったり、なぜか意図していないプルリクエストが出たりと散々でした。。。
・ちなみに疑似チーム開発を経験したことあるのですが、自分のGit知識のなさからチーム開発PJTを火の海にしてしまったことがあります。。。

そんな背景もあり「課題の可視化」を実践してみようと試みた、というわけです。

##前提
では、本題に入る前に前提だけ頭に入れていただきたいです！
・使用頻度高いものから順に
・使用するソースコード管理サービスは"GitHub"
・以下レイアウトを頭に入れていただきたい読み進めてください。![【Qiita】Gitコマンド一覧(図解付き).xlsx - Excel 2020_11_30 20_56_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780929/8f37beb8-e399-47c5-dd62-72d66d14f08d.png)

###1. "git init"
ローカルリポジトリの箱を作成。(「初期化」とも説明される)
![【Qiita】Gitコマンド一覧(図解付き).xlsx - Excel 2020_12_01 4_48_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780929/1c090beb-c952-3c87-c000-6f50f025b479.png)

###2. "git add ~"
commitするためのステージング作業＝commitするかしないかの選別作業
※参考
![git add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780929/82d83ca7-6ba1-b412-f47b-991f589479cf.png)

###3. "git commit"
git addでステージングしたディレクトリ、ブランチ内の内容を記録する
この先進んでミスったとしても、"git commit"した地点に戻ることができる
![git commit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780929/9a3c6629-842e-1f66-e5b1-f58d71db5747.png)

###4. "git push"
"git commit"した内容をリモートリポジトリに記録
⇒GitHubの管理下に置く
![git push.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780929/6a7109c2-45d7-5a39-f001-39c5335532b4.png)

###5. "git branch (ブランチ名)"
新しいブランチを生成
※ブランチを複数作る理由："git init"時に生成されるmasterブランチは本番用ブランチなので、作業場所を確保するために別ブランチを生成する
![git branch ~.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780929/a0bdeef0-11e0-fb86-0d50-74a9ba9cdbde.png)

###最後に
ほんとに初歩の初歩のコマンドしか記載していませんが、イメージを持ちながらGitを進めていけば思いがけないミスを回避できます。
今後もちょこちょこ増やそうと思いますので、よかったらGitの初学者の方々は参考にしてみてください！

最後まで読んでいただきありがとうございました！

※参考リンク
・"git add"
https://kray.jp/blog/expound-git-add/#
・"git commit"
https://backlog.com/ja/git-tutorial/intro/03/
os自作入門

![629.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546786/3c9a1762-d604-ea2c-4eb6-33cb4bcfe72c.jpeg)

少しずつ挑戦中。。
2020/11、実際にサービスを考えスケールアップを考えた時に、コンピュータ自体のハードウェアに近い構造を知りたかったため。
データ通信やトラフィック量、それぞれに対応するためにはよりコンピュータ自体のことを知ろう！！

アゼンブリ→C言語


バイオス呼び出し
http://oswiki.osask.jp/?(AT)BIOS
Railsのサンプルユーザーをseeds+Fakerで用意する

Rails開発やRspecのテスト時にサンプルのユーザーを数十人用意したり、
管理者を作ったりするのはよくある事かと思います。(たぶん)

しかし、名前を自分で考えたりアプリを作る度に書くのは面倒なので、自分用にseeds修正までの手順を残しておきます。

## 環境
MacOS Catalina
Rails 6.0.3.2
Ruby 2.6.3
mysql 8.0.22

## gemを導入する

Gemfileに下記を追記します。

```bash:Gemfile
group :development, :test do
  gem 'faker'
end
```

忘れずに、bundle installします。

```bash
bundle install
```
準備は以上で完了です。

## seedsファイルを修正する

```ruby:db/seeds.rb

# 管理者ユーザー作成
User.create!(name:  "AdminUser",
  email: "admin@example.com",
  password:  "12345678",
  password_confirmation: "12345678",
  admin: true)

# ゲストユーザー作成
User.create!(name:  "GuestUser",
  email: "guest@example.com",
  password:  "12345678",
  password_confirmation: "12345678",
  guest: true)

# ユーザー作成
1.upto(49) do |i|
  name  = Faker::Name.name
  email = "sample-#{i}@example.com"
  password = 'password'
  User.create!(name: name,
                email: email,
                password: password,
                password_confirmation: password,
                confirmed_at: Time.zone.now,
                confirmation_sent_at: Time.zone.now)
end

```

上記例では、管理者ユーザー/ゲストユーザー/サンプルユーザー50人を作成しています。
サンプルユーザーの名前は、Fakerが用意しているダミーの名前になります。
他にもメールアドレスや職業なんかをFakerで作るのもアリですね。

## データを作る

```bash:ターミナル
rails db:seeds
```
seedsコマンドで、seeds.rbに書いたデータがDBに用意されます。
DBのデータを丸ごとseedsのデータにしたい場合は、「rails db:reset」でDBごと置き換わります。
(ただし、全てのテーブルのデータが消えるので注意)


## Fakerの使い方
Rubyファイル内で Faker::[ジャンル].[タイトル等] を入力すればOK。
上記seedsファイルの例にもありますが、例えばユーザーの名前を作りたい場合下記のように書けます。

```ruby
Faker::Name.name
```

使いたいサンプルデータの一覧は、[Faker公式のリファレンス](https://github.com/faker-ruby/faker)で確認が可能です。
事前に使いたいデータがどんなデータが知りたい場合、Railsコンソールで確認しておくのがラクです。

```bash
rails c
Loading development environment (Rails 6.0.3.2)
[1]pry(main)> Faker::Name.name
=> "佐野 陽斗"
```


## Fakerデータの日本語化について
Fakerは、デフォルトでは英語のデータしか利用できません。
日本語を利用する場合は、i18nを利用し日本語化すればOKです。

日本語化の手順は、下記の記事が参考になりました！
[[初学者]Railsのi18nによる日本語化対応](https://qiita.com/shimadama/items/7e5c3d75c9a9f51abdd5)

## 終わりに
ラクにサンプルデータが用意できて、Fakerマジで最高である。
Pure Dataによるオーディオプログラミング例

Pure Data
===

[オーディオプログラミング言語 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/audiolang)

# 概要

https://puredata.info/

マルチメディア用のオープンソースのビジュアルプログラミング言語。

作者はMaxの開発者でもあるMiller Puckette(カリフォルニア大学サンディエゴ校)。

元MITメディアラボのMiller Pucketteは1980年代のIRCAM在籍時にMaxの前身となるThe Patcherを開発。Maxは1990年にライセンス供与されたOpcode社より販売される。カリフォルニア大移籍後の1996年あらたに再設計した言語としてPure Dataをリリース。

# 実装例

## サイン波生成

特に説明は必要ないくらいシンプルです。

![sine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/b6b5a37a-9b8f-936b-bba9-e0d359aa22a5.png)


## Delayエフェクト

wavファイル再生はreadsf\~にopenメッセージを送ります。ディレイはdelwrite\~でバッファ書き込み、delread\~でバッファ読み込み。*\~で音量調整、+\~でミックス。

![delay.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/a6061ee3-a0a2-83ab-c253-26c2527de67a.png)


# 感想

Pure Dataは第一印象でGUIが地味と感じるかもしれません。ですが、慣れてくるとこれはあえてこういう設計なのだと思えてきます。

Maxをはじめリッチなビジュアルプログラミング環境がある中で、Pure Dataの価値のひとつはサウンドエンジンの軽さとポータビリティにあるように思います。自作のプログラムやシステムにサウンドエンジンを載せたいとき、Pure Data（のGUIを除いた部分）は良い選択肢のひとつです。そういう点で、Luaのような組み込み用言語と考えることもできます。

また、オープンソースであるだけでなく、ノードの仕様もドキュメントが整備されているため独自ノードが作りやすく、自作のハードウェア制御などにも使いやすい構造になっています。

そのあたりがわかってくると、ビジュアルプログラミングの楽しさ演出よりも、GUIとエンジンを切り分けて、プログラムの利用しやすさ、軽さを重視しているストイックな設計も魅力に思えてきます。

とはいえ、用意されているノードだけでは微妙にかゆいところに手が届かないと感じることもあります。そのため本流（vanilla）以外にさまざまな便利機能を追加した拡張Pure Dataが存在します。少し前まではPd-extendedが有力でしたが開発が止まったため、現在はPurr Dataがその位置にあります。

Purr Dataはノードが追加されているだけではなく、それまでTcl/Tkで書かれていたGUIをJavaScriptのnode-webkitベースに書き直しており、パッチコードが曲線になったり、GUIパーツの色を変えられたり、という点でも現代的になっています。最近になってPurr DataのWeb版が公開されたのも、GUIをnode-webkitにしたことの恩恵に思います（ https://purrdata.glitch.me/ ）。Pure Dataは、無償ということもあってこれまでも大学教育などで利用されていましたが、Web版でさらに敷居が下がることが期待されます。vanilla自体もいまだに更新され続けていて、新しいOSにも対応し使いやすさも向上し続けています。

長年揉まれてきただけあり、完成度の高い現役の言語だと思います。

[オーディオプログラミング言語 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/audiolang)
Mitama + nginx + uWSGIで社内システムを立てる

[Mitama Advent Calendar 2020](https://qiita.com/advent-calendar/2020/mitama)の1日目です。

[木瓜丸](https://twitter.com/boke_0)です。
今年は自分と仲間とで作ったPython製のWebフレームワーク『Mitama』ネタでカレンダーを書きます。よかったらみなさんも書いてください(^^)

今回は、そもそもこのフレームワークは何に使うのか、どんなふうに動かすのかを具体例を出しながら解説したいと思います。

# Mitamaとは
![mitama.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381826/1f35b410-f3b9-9d24-0c17-b76f1db76b6b.png)
Github: https://github.com/mitama-org/mitama

Mitamaは、社内システムのような、組織で内部向けに運用するWebシステムを構築するためのフレームワークです。

フレームワークを用いてアプリをPythonパッケージとして作成し、それを配信する様に設定することで、簡単に社内で利用するアプリを内製することができます。また、PyPIにパッケージを公開することでOSSとしてそのアプリをほかの人に使えるようにすることもできます。

（アプリの作り方はまた今度カレンダーに書きたいと思います）

# サーバーで動かしてみよう
## 環境
OS: CentOS
Python: 3.6.8

## インストール
```bash
$ sudo yum install -y nginx uwsgi
$ sudo pip3 install mitama
```

## Mitamaプロジェクトの作成
Mitamaを動かす単位を「**プロジェクト**」といいます。適当なディレクトリで次のコマンドを実行することで、プロジェクトを作成できます。

```bash
$ mitama new someproject
$ ls someproject
mitama.json
```

初期状態では、プロジェクトディレクトリ下にはmitama.jsonが設置されています。
mitama.jsonには起動するアプリの設定などを書きます。

```json
{
    "apps": {
        "mitama.portal": {
            "path": "/"
        }
    }
}
```

apps下のキーにPythonパッケージ名、その辞書のpathプロパティに配信先のパスを設定します。

## uWSGIの設定
まず、uWSGIからMitamaを起動する場合は起動スクリプトを作成する必要があります。プロジェクトディレクトリ（↑の例ではsomeproject/）の中で以下のコマンドを叩いてください。

```bash
$ mitama uwsgi
```

これによって、uwsgi.pyが生成されているかと思います。wsgi-fileにこれを指定してuWSGIを起動することで、uWSGIからMitamaのプロジェクト下のアプリが配信されます。

今回はiniファイルを用いた設定を行いたいと思います。プロジェクトディレクトリ下にuwsgi.iniを設置し、以下の様に書きます。

```ini
[uwsgi]
module=uwsgi
callable=application
master=true
socket=/var/run/uwsgi.sock
chmod-socket=666
wsgi-file=uwsgi.py
chdir=/path/to/someproject/
logto=/path/to/someproject/uwsgi.log
```

パスは適宜変えてください。
今回はlogtoを設定することでエラーやアクセスのログも出力したいと思います。

## nginxの設定
/etc/nginx/conf.d/mitama.jsonを作成し、次の様に書き込みましょう。

```nginx
server{
        listen 80;

        location / {
                include uwsgi_params;
                uwsgi_pass unix:/var/run/uwsgi.sock;
        }
}
```
ここらへんの書き方は好き嫌いがあるかと思うので、uwsgi_passの指定だけ忘れないようにしてください。

## Systemdから起動
uWSGIを起動するコマンドをサービスとして登録してしまいましょう。
/etc/systemd/system/uwsgi.serviceを作成し、以下の様に書き込んでください。

```
[Unit]
Description=uWSGI
After=syslog.target

[Service]
ExecStart=/usr/local/bin/uwsgi --ini /var/www/mitama/uwsgi.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
```

できたらSystemdをリロードし、nginxと一緒に起動しましょう。

```bash
$ sudo systemctl daemon-reload
$ sudo systemctl start nginx
$ sudo systemctl start uwsgi
```

![2020-12-01-040538_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381826/11375cb1-42ef-b714-1509-bfc12f088787.png)

サーバーのアドレスにアクセスしてこのような画面が出たら成功です。

# 終わりに
uWSGIをnginxで使うのって難しいですよね(^^;

iniの生成まで勝手にコマンドで作れたら楽になるんでしょうか。提案とかあったらコメントやプルリクいただけると飛んで喜びます。

よかったらリポジトリにスター付けてください！
マジで。
RailsでDBパスワード等を環境変数(.env)で管理する

DBのパスワードやAPIのアクセスキー等の重要な情報は、
Gitにあげたくなかったり開発環境と本番環境で異なっていたりします。
そういった情報の管理によく利用されるのが環境変数というものらしい。

Railsで環境変数を利用する場合、大まかに下記2パターンある様子。
①.bash_profileに記述する
②dotenv-railsというgemを利用し.envに記述する

今回は、②のenvファイルを利用する方法を自分用に残しておきます。
間違い等あれば、ご指摘いただければ幸いです。

## 環境
MacOS Catalina
Rails 6.0.3.2
Ruby 2.6.3
mysql 8.0.22

## gemを導入する

Gemfileに下記を追記します。

```bash:Gemfile
gem 'dotenv-rails'
```

忘れずに、bundle installします。

```bash
bundle install
```

## .envファイルを作成する

Railsアプリのルートディレクトリに移動し、下記を実行。

```bash
touch .env
```

.envファイルを修正し、管理したいキーを追加します。

```bash:.env
DB_NAME=RailsApp_production
DB_USERNAME=root
DB_PASSWORD=12345678
DB_HOSTNAME=hogehoge
```

○○=hogehoge の○○の部分がキーになるので、使用する際に分かりやすいキー名に設定します。

## 設定した環境変数を使用する

ENV['キー名']で呼び出すことができます。

```ruby
ENV['DB_NAME']
ENV['DB_USERNAME']
```

## 環境変数をgitにあげないようにする

せっかく環境変数を利用しているのに、gitにあげちゃったら元も子もありません。
.gitignoreに下記の行を追記し、.envがgitにコミットされないようにします。
(既に設定していれば修正不要)

```:.gitignore
.env
```

## 終わり
思った以上に簡単に利用することができますね。
環境変数は多くのRailsアプリで利用することになると思うので、できればこの記事を見なくても使えるようにしたい所。
.bash_profileを利用する場合はgemを導入する必要がないのでラクそうだけど、利用手順はちょっと忘れそうな感じがします…。
私は何がやりたいのか、あるいは何がやりたくないのかという話、私の場合

## この記事は

[Develop fun!を体現する Works Human Intelligence Advent Calendar 2020](https://qiita.com/advent-calendar/2020/whi)
[Develop fun!を体現する Works Human Intelligence #2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/whi-2)
Works Human Intelligence アドベントカレンダー 記事にも準備していた投稿ですが、意を決して格下げしました。

## きっかけ
2020年で不惑になりました。新卒で入社してからは今の会社で17年ということになります。
[「ヒューマンスキル」が無いのでマネジメントは無理です](https://qiita.com/e99h2121/items/99cda4721cb09696161f) でも考えてみたのですが、「やりたいこととやりたくないこと」をクリアにしておくのは良いメソッドだなと思いました。
この２つはキャリアの途中途中で変わってもよいものだと思うし、見直してよいものだと思います。
少なくとも現時点での考え方というのをまとめておこうと思います。

## 結論から書くと
### やりたいこと
- 自分の得てきたことをもっと社外に還元していく作業。具体的にはこういった記事の投稿、OSSコミュニティなりへの積極的な参加、社外のイベントへの参加。
- 社外の過酷さをもっと社内に浸透させていく作業。具体的には社外のプロとの協業、自分以上の専門性を持つプロとの協業。海外含めたもの。
- 社内の若者をもっと楽しませる作業。
- 多様性とそれを尊重する風土をさらにはぐくむこと。

### やりたくないこと、あるいはどんな時にストレスを感じるか
- よくわからない独自の開発体制を頑張って保守る。
- 目的のわからない社内の小さな利害関係を頑張って調整する、こなす。
- 年長者だからと言って挨拶させられるような行事へ参加する。


## 学生時にやりたかったこと
ダラダラものを書いて暮らしたいと思っていました。元々ポエマーだったのです。

## 学生時代に今の会社を選んだ理由
ただポエムを書こうにも、ネタが継続して無いと良くないなと思ったことと、[学生時代に経験することになったインターン](https://style.nikkei.com/article/DGXMZO17699140V10C17A6000000/)がそこそこ面白い人たちの集まりであったので、そこに入社することにしました。なので現在の会社に入った理由は、人間観察、業界観察です。技術者としての血筋みたいなものは17年経た今でも、2流にしかなれていないと思います。「根っからの」意識を持つ方々に常に畏敬の念があります。

## やりたかったことと実際のギャップ
やりたかったこと以上に、いろいろなことを経験することになりました。具体的には

- [異動](https://qiita.com/e99h2121/items/873281d73cc504e5a64d#%E7%A7%81%E3%81%AE%E5%85%A5%E7%A4%BE%E4%BB%A5%E6%9D%A5%E3%81%AE%E8%87%AA%E6%85%A2%E3%82%A8%E3%83%94%E3%82%BD%E3%83%BC%E3%83%89)
- 海外赴任
- [ローカライズ、通翻訳コーディネート作業](https://qiita.com/e99h2121/items/2d23ef33dfaa2797c363)
- 結婚・出産
- 産育休復帰
- [会社の分社、会社トップの交代](https://www.works-hi.co.jp/news/20190801)
- それでも終わらない開発

ただここまで来てようやく分かったのは、若者が楽しみを見いだせない開発にあまり未来は無いということ。私が楽しかったのは若かった私以上にクレイジーなおっさんが一杯いたからだということ。おっさん側に立つ今自分に必要なのは、自分が一番楽しむこと。

## 働いてはじめて見えてきた要素

業界のプロフェッショナリズム、継続的に学ぼうとする姿勢。
学んでも学んでも学びきれないほどの領域。常に膨らむ未知。
永遠に技術者への尊敬の念は消えない気がします。だから、ポエムが終わらない。

引き続き考えようと思います。

## 最後に
[何がやりたいのか、あるいは何がやりたくないのか はこの記事を元にしています。](https://blog.kengo-toda.jp/entry/2014/02/01/131321) フォーマットも踏襲させてもらいました。年次的には「後輩」にあたる人物ですが、尊敬する「後輩」の一人です。
真面目にまとめてしまいましたが、普段は[このくらいのことを考えています](https://qiita.com/e99h2121/items/237628abd85329b14a81)。

ま、いいんじゃねーの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/83bc6ed3-ec07-fa3f-38a3-3ca7eed1a8c0.png)

- [Delphiなんかで開発していて恥ずかしくないの？](https://qiita.com/e99h2121/items/e5b823ae69ce418ea235)
- [「失敗を許容する」なんて言われても失敗したくないです](https://qiita.com/e99h2121/items/873281d73cc504e5a64d)
AWS Lightsail(BITNAME) でVirtualhostを作成しサブドメインでNginxで公開

# はじめに

AWS Lightsailで初めてBITNAMEを使用した。
クセはないが設定ファイルの場所やsocketファイルの配置先が一般的ものとは違う、気を付けよう。

# 設定方法

Virtualhostにwww.sample.comというサブドメインを紐づけます。
DNSだったりCDNだったりの設定は適宜よろしくです。

### ディレクトリ作成

雑にディレクトリを作成。

```
mkdir -p /opt/bitnami/nginx/html/www.sample.com
```

### Nginxの設定ファイルを変更

以下がサンプル。
設定ファイルは```/etc```配下にないので注意。
***ここから～ここまで***を参考にしてください。

```/opt/bitnami/nginx/conf/nginx.conf
# Based on https://www.nginx.com/resources/wiki/start/topics/examples/full/#nginx-conf
user               daemon daemon;

worker_processes  auto;
error_log         "/opt/bitnami/nginx/logs/error.log";
pid               "/opt/bitnami/nginx/tmp/nginx.pid";

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format    main '$remote_addr - $remote_user [$time_local] '
                       '"$request" $status  $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"';
    access_log    "/opt/bitnami/nginx/logs/access.log";
    add_header    X-Frame-Options SAMEORIGIN;

    client_body_temp_path  "/opt/bitnami/nginx/tmp/client_body" 1 2;
    proxy_temp_path        "/opt/bitnami/nginx/tmp/proxy" 1 2;
    fastcgi_temp_path      "/opt/bitnami/nginx/tmp/fastcgi" 1 2;
    scgi_temp_path         "/opt/bitnami/nginx/tmp/scgi" 1 2;
    uwsgi_temp_path        "/opt/bitnami/nginx/tmp/uwsgi" 1 2;

    sendfile           on;
    tcp_nopush         on;
    tcp_nodelay        off;
    gzip               on;
    gzip_http_version  1.0;
    gzip_comp_level    2;
    gzip_proxied       any;
    gzip_types         text/plain text/css application/javascript text/xml application/xml+rss;
    keepalive_timeout  65;
    ssl_protocols      TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers        HIGH:!aNULL:!MD5;
    client_max_body_size 80M;
    server_tokens off;

    include  "/opt/bitnami/nginx/conf/server_blocks/*.conf";

    # HTTP Server
    server {
        # Port to listen on, can also be set in IP:PORT format
        listen  80;

        include  "/opt/bitnami/nginx/conf/bitnami/*.conf";

        location /status {
            stub_status on;
            access_log   off;
            allow 127.0.0.1;
            deny all;
        }
    }
    ## ここから ##
    server {
        listen 80;
        server_name www.sample.com;
        root /opt/bitnami/nginx/html/www.sample.com;

        location / {
            index index.html index.php;
        }


        location ~ \.php$ {
            fastcgi_pass   unix:/opt/bitnami/php/var/run/www.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
    ## ここまで ##
}
```

### 再起動

```
sudo /opt/bitnami/ctlscript.sh restart
```

## その他ハマり？ポイント

### php-fmp関連

phpを使うために必要なphp-fmp君。
- 設定ファイルは```/opt/bitnami/php/etc/php-fpm.d/www.conf```にある。
- socketファイルは```/opt/bitnami/php/var/run/www.sock```