OmniAICreator/Qiita-1.07M huggingface dataset:
日本のフリーランスサービス分野における今後の動向

時間ができたので、副業、フリーランスについて簡単に調べてまとめてみました。
予想については、あくまでも個人の意見なのでそこはよろしくお願いします。
とりあえず、今後の自分のキャリアを考えながらつらつらと書いてみたメモ書きです。。

####フリーランスの市場規模・成長性
現在日本においてフリーランス人口は1000万人あまりで国内労働人口の約6分の1を占める数となっていおり経済規模にすると約20.1兆円という試算もあります。、昨今の副業解禁ブームなども伴い、市場規模もそれに応じてさらに大きくなると予想されている。米国では、1 億 6 千万人の労働力人口のうち 5,730 万人が既にフリーランス化しており、2027 年にはフリーランス人口が過半数になるという予測が出ています
>出典：プロフェッショナルな働き方 フリーランス白書 2018


####市場内の分類
厚生労働省が発表した、フリーランス白書2018において、フリーランスは以下3つに分類される。
表: フリーランス分類

| 分類 | 例 |
|:--|:--|
|クリエイティブ系  | デザイナー、編集者、映像ディレクター、コピーライター、フォトグラファオー、アーティスト  |
|ビジネス系   | エンジニアやライター、コンサルタント、広報や人事・財務などのスペシャリスト  |
|職人系    |スタイリスト、美容師、フードコーディネーター、ハンドメイド作家、ハウスキーパー、スポーツトレーナー、講師など   |

>出典：プロフェッショナルな働き方 フリーランス白書 2018

####ターゲット領域（稼ぎたいなら）
経済産業省が公表している、”電子商取引に関する市場調査"において、toC向けのEC取引総量が約16兆円、toB向けの取引総量が317兆円となっている。toC向けの市場が成長しているとは言え20倍の市場規模の差がある中では、**toB向けの領域にフォーカスするのが良いと考える**。(上記分類だと一番はやるならビジネス系だろと個人的には考える。もちろん得意分野にもよるが・・・）
>出典：平成 29 年度 我が国におけるデータ駆動型社会に係る基盤整備

###ターゲット領域での課題
toB向けの市場に絞った上で、今後フリーランスの市場規模が増えていくに伴い、以下課題を解消するためのニーズが高まると予想される。サービスを提供しようと考えた場合、この領域においても、**フリーランス側へのアプローチよりも企業側サイドの課題を解決することのニーズと単価が高いと考えられる**。

 - 企業側(toB側へのアプローチ）
  - フリーランスの**スキルの担保**（質）
  - フリーランスの**管理**
 - 個人側
  - 実績がない場合、ランサーズやクラウドワークスでマージンを多く引かれる、企業側に買いたたかれる(収入面）
  - 基本的には既存の持っているスキルで勝負するため、スキルのアップデートが乏しい（スキル）
  - 契約先の法人での待遇

>出典：中小企業庁　小規模企業白書

###フリーランス先進国アメリカにおける事例

**Wroking on Working** :　品質の高いフリーランスの予定を確保するサービス
審査を通過し、優秀だと判断されたフリーランスが登録できてる。企業側はその優秀なフリーランスのスケジュールを押させることができる。
>https://workingnotworking.com/
>https://www.advertimes.com/20160516/article224843/5/

**Gigster** : トップクラスのエンジニアを提供するサービス

- series B
- 作りたいプロダクトに応じて明瞭会計で提供する。
フリーランスので仮想チームを組み、企業のエンジニアリング部門の業務を請け負う

>https://gigster.com/

**Engineering.ai** : AI x フリーランス

 - series A
 - 一部GIgsterと似た動きをする。異なる点としては、システムやデザインを部品として保管しておきそれを有効に活用する。また、案件に応じて質の高い世界中のフリーランスをアサインする仕組み。

>https://techcrunch.com/2018/11/06/engineer-ai-raises-29-5m-series-a-for-its-aihumans-software-building-platform/
>https://www.engineer.ai/customers/

####今後についての予想
グローバルでは、Samsungなどの大企業が**Upwrok**(アメリカにおけるフリーランスのプラットフォーム）を活用して60%のコストカットに成功している(*)。現在の日本においては、それほどフリーランスの活用が進んではないが、今後企業に対してのアプローチとして、先に見た[* Wroking on Working] や**Gigster**といったや**質の高いフリーランスを提供するサービスが進む**と考えられ、テクノロジーを活用した"クラウドソーシングx　AI , Blockchain を活用したハイスキル人材のマッチングサービス"や**Gigster**の様に、質の高いフリーランスを仮想チームとしてまとめプロダクト開発を請け負うサービス”が今後増えていくと考えられる。

また、フリーランス側（個人）に対してのアプローチはスコープ外としているが、客観的にみるとクラウドソーシングのプラットフォームやオンライン講座などがあげらるが既に飽和状態となっている。そのため、差別化として情報弱者を対象とした”情報商材の販売”とのグレーなビジネスがさらに増えそうなので、注意したい。

####まとめ
フリーランス界隈でサービスを提供するなら：企業向けに質を担保したサービスだろう。
そのアプローチとして、PM含めてやってしまう　or  テクノロジーを使ってマッチングプラットフォームを提供する・・・・
今後他のアプローチもありそうだし継続的に注視していきたい。

P.S. 他にも情報があれば教えていただけると幸いです。
/bin, /usr/bin, /usr/sbin, /usr/local/bin の違いとは？

Linuxを触っているとたくさんのコマンドを使うようになります。
最初は意味不明なコマンドの一覧でしたが、慣れてくるとGUI操作が煩わしくて戻れなません。
GUIって気づくとファイルやフォルダがぐちゃぐちゃになるのはなぜだろうか？

で、dockerで立ち上げたテスト環境をいじくり回していたらbin,/usr/bin,/usr/sbinの違いって何だろうと思って調べてみました。

# /bin
まずは/binですね。
これは、Linuxの基本コマンドが登録されているdirectoryのようです。
Linuxのディストリビューションによって違いがあるようですが、Linuxでしたら、だいたい同じようなコマンドが置かれているみたいですね。

# /sbin
管理システムコマンド
/binコマンドはroot or user　でも使えるコマンドですが、
/sbinコマンドは、rootユーザー以外は通常環境パスが通ってないので、デフォルトでは使えないコマンドです。

# /usr/bin

/usr/binは、/binと違い、一般ユーザーが使うコマンドが格納されているみたいです。


# /usr/sbin
/usr/sbinは管理コマンド。


#/usr/local/bin
/usr/local/binは自分でインストールしたコマンドを使えるようにする場所みたいです。
Linuxのリポジトリにあるもの以外のものをインストールした時や自作のコマンドを格納しておく時に便利みたいですね。

```bash
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
```
とdocker公式のubuntuのPATHからわかるように
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
という優先度から、自作や外部からのインストールは/usr/local/sbin もしくは　/usr/local/binに保存しておくと良さそうですね。

もしくは、同じコマンド名で、元からあるコマンドに追加機能を加えるようなやり方もありかもしれません。
MacでOpenGLのGLFWを使う方法

以下の2つの方法を紹介します。

1. Xcodeを使う
2. GCCを使う

# 動作環境
macOS Mojave (10.14.4)
GLFW (3.3)
Xcode (10.2.1)
GCC (4.2.1)

# GLFWのインストール
以下のコマンドでインストールします。

```bash
brew install glfw
```

infoでバージョンやパスを確認できます。

```bash
brew info glfw
```

# サンプルコード
[GLFW Documentation](https://www.glfw.org/documentation.html)にあるExample codeを`main.cpp`として扱います。

以下のような黒い画面が表示されます。
<img width="752" alt="Screen Shot 2019-05-16 at 12.23.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404817/ae0950ea-df51-462b-27ac-af1afe0e490f.png">


# 1. Xcodeを使う場合

## プロジェクトの作成
`New` > `Project` で新規プロジェクトを作成し、`Command Line Tool`を選びます。
Product Name等を適当に設定し、Languageは`C++`とします。
<img width="727" alt="Screen Shot 2019-05-16 at 12.25.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404817/802b480d-ac12-5baf-0d26-d39b9361dda9.png">

## ライブラリの追加
Build Phases の Link Binary With Libraries に `OpenGL.framework` と `libglfw.3.3.dylib` を追加します。

`libglfw.3.3.dylib` は `/usr/local/Cellar/glfw/3.3/lib` にあるものをドラッグ&ドロップします。
<img width="1345" alt="Screen Shot 2019-05-16 at 12.31.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404817/4db07663-461d-7c5b-eeae-adcc6f729fd3.png">

`OpenGL.framework` は +ボタンを押して検索して追加します。
<img width="826" alt="Screen Shot 2019-05-16 at 12.33.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404817/e71dba2d-5c0b-b016-b334-b5b9d6f1c1f1.png">


## パスの設定
Build Settings の Header Search Paths に `/usr/local/Cellar/glfw/3.3/include` recursive と指定します。

Header Search Paths が見つからない場合は、ALLを選んで検索窓に`Header search`と入力してみてください。
<img width="869" alt="Screen Shot 2019-05-16 at 12.40.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404817/faf88a2a-0290-c9e2-648d-286b9bb6fc8b.png">


## 実行
main.cpp にコードを記述して実行します。
うまく行けば黒い画面が表示されます。

# 2. GCCを使う場合

## コンパイル

```bash
gcc -o main main.cpp -lglfw -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo
```

## 実行

```bash
./main
```

# 参考
[GLFW Documentation](https://www.glfw.org/documentation.html)
[Macで GLFW 3.2 を使う方法](https://qiita.com/itoru257/items/c647a2a13fc83cb256d1)
[MacユーザーのためのOpenGL始めかた](https://qiita.com/totepo18/items/b2a6bdb8054f8c9a1cbe)
Linux初心者向けrootからのユーザー情報操作

ユーザー作成方法


# ユーザー作成

###1.管理者にログイン(su)するか、一時的に管理者権限(sudo)を利用する。

```
# useradd オプション ユーザー名
```
試しで使う場合は、特にオプションは指定せずに useradd userName を設定。

###2.パスワードの設定

```
# passwd 設定したユーザー名
```
jiraを使って不具合管理

Jiraって不具合追跡ツールとして作られたそうですが、分析という観点からはちょっと遠い。。
なので不具合「管理」をする上で追加したカスタムフィールドを以下にまとめた

# 不具合管理について

## 不具合を管理する意義

* 不具合追跡：不具合がどのように処理されたかを確認する
* 不具合管理：プロジェクトの不具合発生をコントロールすることが目的

追跡だけだったら、発生したことが確実に蓄積され、それらがもれなく修正・再確認・リリースされればいいのですが、「コントロールする」となれば、「なぜ」その不具合が起きたのか。
再発防止のためにはどうしたらいいのかが大事になってくるわけです。

## Jiraは不具合追跡ツール？

その観点で見ると、
1. タスクorバグとして「課題」を記録する
2. 課題に「TODO」「進行中」「完了」といったステータスを関連付ける
3. 「完了」していない課題がなくなることをひたすら目指す
ことができるようツールであることがわかります

## 不具合コントロールの目的

(特に継続性がある）プロジェクトに対して、「不具合」発生に対するリリース物への影響を最小にする

1. 不具合に取り掛かる「優先度」を合理的に判断できるようにする
2. そもそも「不具合」の発生を少なくするようにする

### 不具合コントロールのために必要なこと

1. 優先度を判断するための必要な情報を漏れなく、最小工数で入れられる
2. 不具合再発防止のための分析をするための情報を最小工数で入れられるようにする
3. そして、そもそも、不具合を正しく伝えるために必要最低限の情報を漏れなく入れられるようにする
ことが大事です

#### 不具合を正しく伝えるために必要な項目（不具合発見時報告）

カスタムフィールドを作って、課題に追加する。

* 発見方法（テストケース実施 / テスト設計 / 開発 / レビュー / 日常運用 ....) 
    * ラベル：後から方法が追加されるので
* 発生環境 (dev / staging /本番 ..)
    * ラベル：後から方法が追加されるので 
* 再現方法
    * 複数行テキスト
* 期待値
    * 複数行テキスト
* 問題点：期待値と異なること
    * 複数行テキスト
* 発生頻度 (常に、不規則、希に、1度だけ）
    * 選択リスト（単一選択）
* 参照（テスト項目書 /参考仕様書 ...  テストケースとの突き合わせに必要）
    * テキストフィールド（1行）
    * URL
* アプリバージョン=Revision (テキストフィールド1行)

#### 優先度判断に必要となるもの (不具合原因調査時)

* 不具合レベル（損害リスク・業務停止・運用回避（要復旧）・運用回避（復旧不要）・影響なし）
    * 選択リスト（単一選択）
* 新規/潜在（潜在不具合/直近開発由来）
    * 選択リスト（単一選択）
* 発生原因
    * 複数行テキスト
* 影響範囲
    * 複数行テキスト
* 対応方法 (対応不要 / 仕様書修正 / テスト修正 / 実装対応 / その他環境修正など )
    * 選択リスト（複数選択）

#### 再発防止に必要なこと（不具合対応後)

* 不具合種別
    * 不明,仕様誤り,仕様漏れ,設計誤り,設計漏れ,実装誤り,実装漏れ, 環境設定誤り,テストデータ誤り,テスト仕様誤り, リリース誤り, 再現せず,その他
    * ラベル：後から方法が追加されるので 
* 対処内容
    * 複数行テキスト
* 原因分析
    * 複数行テキスト
* 再発防止案(防止策）
    * 複数行テキスト

## タスク管理に必要なこと

* 件名
* 報告者
* 報告日
* 調査完了目標日
* 調査完了日
* 調査者
* 対応完了目標日
* 対応完了日
* 対応者
CentOS7 一般ユーザーがsudoできるよう設定

`CentOS7デフォルト上 wheel グループのユーザーはすべてコマンド実行できる` が、念のため確認

+ root 権限で visudo 
下記の２行があれば、CentOS7デフォルト上 `wheel` グループのユーザーはすべてコマンド実行できる

```
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
```

+ usernameをwheelグループに追加

```
usermod -aG wheel username
```

+ 自分のグループを確認

```
groups
```

+ username をログインし直し `★重要`


+ sudo ls /root
`username` 自身のパスワード（rootのパスワードではない）でroot権限のコマンドが実行できる
piazza swift 自分用メモ

##Stringに含まれるか

https://qiita.com/osamu1203/items/3ee63291c37d91428b55

```swift
var str : String = "hello Swift"

if str.contains("Swift") { // -> true
    print("Swiftが含まれる")
}

if str.contains("swift") { // -> false
    //ここには来ない
}

//大文字小文字を無視させて評価
if str.lowercased().contains("swift") { // -> true
    print("swiftが含まれる")
}

//これも同様にcaseを無視
if str.localizedCaseInsensitiveContains("HELLO"){ // -> true
    print("HELLOが含まれる")
}
```

##paizaにて与えられる値の取り出し

```swift
let input_line = readLine()!
let inputHairetu : [String] = input_line.components(separatedBy : " ")
```

## Stringの先頭と後ろの文字の取り出し

```swift

let moji = "ABCDEFG"
let prefixMoji = moji.prefix(3) // 先頭３文字の「ABC」
let suffixMoji = moji.suffix(2) // 末尾2文字の「FG」
```
Android推奨のビルド速度の最適化を試す

機能拡張やマルチモジュール構成化もありデバッグビルドがどんどん遅くなっていったので、Androidが推奨する[ビルド速度の最適化](https://developer.android.com/studio/build/optimize-your-build)の中で適用できるものを試してみました。


#### 計測方法
以下のコマンドでクリーンビルドの時間を計測しました。ネットワーク状況による誤差をなくすため、オフラインモードで実行します。

```
./gradlew clean
./gradlew assembleDevDebug --offline
```


# 不要なリソースのコンパイルを回避

build.gradleに以下のような記述を追加し、対象の言語や画像リソースを限定することで、ビルド速度の改善が期待できるようです。

```build.gradle
android {
  ...
  productFlavors {
    dev {
      resConfigs "en", "xxhdpi"
    }
    ...
  }
}
```

開発を担当している[Relux](https://play.google.com/store/apps/details?id=com.loco_partners.relux)ではテストに複数言語が必要なため、``resConfigs "xxhdpi"`` のみを追加。

#### 計測
|前|後|
|:--|:--|
|10m15s|10m16s|
早くなっていない・・・言語ファイルも限定できる場合は早くなるのだろう・・。



# デバッグビルドでのCrashlyticsの無効化

デバッグビルドでCrashlyticsへのレポートが不要な場合は、その設定を無効にします。

```build.gradle
android {
  ...
  buildTypes {
    debug {
      ext.enableCrashlytics = false
    }
}
```
```kotlin
val crashlytics = Crashlytics.Builder()
                    .core(CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
                    .build()
            Fabric.with(this, crashlytics)
```


#### 計測
|前|後|
|:--|:--|
|10m16s|10m11s|
微妙に早くなったのかな・・？


# 静的な依存関係バージョンを使用

build.gradle内でバージョン番号の後ろにプラス記号をつけて記述しているものをハードコード指定に置き換えます。一つ該当していましたので置き換え。

```build.gradle
//classpath 'io.fabric.tools:gradle:1.+'
classpath 'io.fabric.tools:gradle:1.29.0'
```

#### 計測
|前|後|
|:--|:--|
|10m11s|9m23s|
結構早くなった！プラス記号を多く使っているプロジェクトの場合はさらに改善が見込めそう・・！


# Gradleヒープサイズの増加とdex-inプロセスの有効化

build.gradleのdexOptionsのjavaMaxHeapSizeの値を調整し、gradle.propertiesに下記のような記述を追加します。XmxはjavaMaxHeapSizeに+1024MBした値にすると良いようです。

```build.gradle
dexOptions {
        javaMaxHeapSize "4g"
    }
```

```gradle.properties
org.gradle.jvmargs= -Xmx5120M
```

#### 計測
|前|後|
|:--|:--|
|9m23s|8m49s|
早くなったー！

約14%高速化（10m15s -> 8m49s）できました(^_^)/
Postgresでのカラム追加、削除、型変え


Postgresでのカラム追加、削除、型変えのコマンドです。

#テーブルにカラムを追加
```
ALTER TABLE テーブル名 ADD COLUMN カラム名 データ型;
(例) ALTER TABLE t_user ADD COLUMN user_type int2; 
```

#テーブルのカラムを削除
カラムのデータが消えてしまうので注意しましょう

```
ALTER TABLE テーブル名 DROP COLUMN カラム名;
(例) ALTER TABLE t_user DROP COLUMN user_type; 
```

#カラムのデータ型を変更
```
ALTER TABLE テーブル名 ALTER COLUMN カラム名 TYPE データ型
(例) ALTER TABLE t_user ALTER COLUMN user_type TYPE VARCHAR;
```
sshrcにコマンドを入れたら `Received message too long 1869283328` で怒られた

SSHで接続されたときにSlackへ通知するスクリプトを sshrc に仕込んだら、SFTPで以下のメッセージで怒られて接続に失敗しました。

```
Received message too long 1869283328
Ensure the remote shell produces no output for non-interactive sessions.
```

### 修正前

コマンドの実行結果を標準出力していました。

```shell:/etc/ssh/sshrc
curl -X POST --data-urlencode 'payload={"channel": "'"$SLACK_CHANNEL"'", "username": "'"$SLACK_USERNAME"'", "text": "'"${SLACK_MESSAGE}"'", "icon_emoji": "'":${SLACK_ICON_EMOJI}:"'"}' ${SLACK_WEBHOOK_URL}
```

### 修正後

コマンドの実行結果を `/dev/null` へ強引にリダイレクトさせました。具体的には、コマンドの末尾に `&> /dev/null` を追加しただけです。

```shell:/etc/ssh/sshrc
curl -X POST --data-urlencode 'payload={"channel": "'"$SLACK_CHANNEL"'", "username": "'"$SLACK_USERNAME"'", "text": "'"${SLACK_MESSAGE}"'", "icon_emoji": "'":${SLACK_ICON_EMOJI}:"'"}' ${SLACK_WEBHOOK_URL} &> /dev/null
```

### 参考記事: 

- [sftp > Error: Received message too long 1935895584 の対処 - Qiita](https://qiita.com/7of9/items/b08a2846023796975c16)
- [linux - SFTP error "Received message too long" - Stack Overflow](https://stackoverflow.com/questions/8250379/sftp-error-received-message-too-long)
- [サーバーにsftpできないときは - console.lealog();](https://lealog.hateblo.jp/entry/2012/12/30/160812)
vue-cliを使って、vue + typescript環境を作成する


vue-cliを使うだけで、typescript環境が作れる（いつのまに⁉️）

作成時、vue-cli v3.7.0を使用

```
# 1. Install Vue CLI, if it's not already installed
npm install --global @vue/cli

# 2. Create a new project, then choose the "Manually select features" option
vue create my-project-name

? Check the features needed for your project: TS, Router, Vuex, CSS Pre-processors, Linter
? Use class-style component syntax? Yes

```

- 公式参照
https://vuejs.org/v2/guide/typescript.html
新社会人の心構え〜傾聴姿勢編〜

# はじめに
　新社会人として身につけるものを入社2ヶ月の新人がまとめたものになります。
「そんなもんで出来て当然だ」
と思っている人も心の中でバカにしながら読んでいただけたらと思います。

# そもそも傾聴姿勢って？　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416620/065ea67b-c035-7ac3-86a1-6192aefc06fd.png" width=100px>
　硬い言葉で言ってますが要は人の話を聞く姿勢のことです。
これが出来ている出来ていないとでは１年後に大きな差がつくと僕は思っています。

でもいきなりこんなことは出来ません。僕は傾聴姿勢に行きつくまでに手順が存在すると思っています。
そちらの手順を紹介したいと思います。

# 1.清潔感を大事にする
まずはこの画像を見てください
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416620/8650fb7c-e880-3410-b463-5c70eb74c999.jpeg"width=250px><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416620/b04fcb3d-2158-7b01-4de9-b60cd4b812e8.jpeg"width=200px)>
　もしあなたに後輩が出来たとして仕事に関しての質問された際に、どちらの後輩に親身になって教えようと思いますか？
僕は圧倒的に右の後輩に教えようと思いますね。大半の人はそうだと思います。
傾聴姿勢を行う＝**人に話を聞く**ということです。
ですので最低限の身だしなみは整えて相手を不快にさせないということを心がけましょう。またオシャレすることによってプラスにもマイナスにもなります。
![DfiMPDHVAAAQ3mb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416620/d14dec72-e37b-df6f-f0f3-c57e304b182f.jpeg)![加藤純一オシャレ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416620/f7b2184b-2efe-d8ec-8599-9940363eb739.jpeg)
　仮に画像①、②と名前をつけてどちらがいいと思いますか？
②のほうがいい感じしますよね。
清潔感を大事にしないと、この後行程が全て無駄になります。

# 2.いろんな人と会話をする
　職場にはいろんな先輩がいます。まずはその人との接点を持ちましょう。雑談、仕事の話などなんでもいいと思います。まずは自分の名前を知ってもらいましょう。
# 3.敬語をしっかり使う
　名前を覚えてもうらうことが出来たら敬語をしっかり使いましょう。**言葉遣いが悪いと不快に思われてしまいここまでの全てが無駄になり、今後その人との付き合いはなくなってしまうでしょう。**ここまで出来て傾聴姿勢が出来るようになります。次は、傾聴姿勢の中身を書いていこうと思います。

#　傾聴姿勢の具体的なこと

####1.話は目で聞く
　これは僕がいつも心掛けていることなのですがとても大事だと思ったので書きます。
会話中に下を向いていたりしたら、
「こいつ本当に聞いてんのかな」
と思われてしまうからです。なので相手の目を見てしっかりと聞くということを意識した方がいいと思います。

####2.レスポンスを返す
　１.だけやっていても相手に
「人が話しているのにボーッとしてるんじゃないか」
と思われてしまいます。なので話の合間にレスポンスを返しましょう。**相槌**などもいいと思います。

####3.そこからさらに話を盛り上げる
　2.のやり方で
「そーなんですね」
とか話が続かないレスポンスはやめましょう。**先輩方の話はどれも自分のためになる**ので
話をどんどん聞き出すためにも、「そーなんですね　〇〇〇〇」といった続く形のレスポンスを返すのがいいと思います。

**この３つをバランスよく行うのが傾聴姿勢です**

#　究極の傾聴姿勢
　ここまでいろいろ書きましたが僕自身が思う**究極の傾聴姿勢は相手が「話してよかったな　あ　このことも話すか」**と思わせるものだと思っています。これにするために1~3の他にも、分からないことを相談する場合に「全部わかりません」じゃなくて「ここまでは分かったですけど〇〇が分かりません」にした方が相手からしたら**努力**の後が見えるので張り切って教えてくれると思います。また、自分の分からないところが分かる様になるし、さらに質問したことに
よって話が更に広がるので**一石二鳥**になるわけです。


# 　ビジネス面で実践すると
　**傾聴姿勢**がどの様にビジネスの面で利用できるかというとクライアントの**需要に早く気付ことができる**ということです。社長のお話で**ドリルの発注が来たけど、クライアントが欲しいのは穴だった**というのを例えで説明すると、クライアントが欲しいものは穴=**需要**でビジネスは**需要を満たすこと**なのでクライアントに穴を提供することが大事なのですが、需要が分からないと供給もできないので、いち早く需要に気付くのに効果的なのが**傾聴姿勢**になります。究極の傾聴姿勢を行うとクライアントから得られる情報がより多くなるのでさらに早く需要に気付ことができます。これらが出来ると、もしかしたら**クライアントから高評価をいただけるので、別の案件も依頼されるかもしれません。**



#　まとめ
　上記のポイント出来れば後輩ができた時に、先輩から話してもらった話をそのまますることで先輩の体験談をあたかも自分の体験談のように語ることが出来るわけです。後輩からは**あの先輩は雑談から仕事の話まででできる頼れる先輩**という位置付けを獲得し、上司からは**後輩の面倒見がいいやつに見えるし、クライアントからの高評価で信頼も得られる**とちょろいわ。　

ひん

**参考サイト**  http://love-hacks.jp/making-girlfriends/
Linux OS ubuntu のlocale 設定

# locale 設定

手元の環境構築で言語設定、時間、地域などのlocale設定をしてないと、何かと不便であると感じることが多かったので、日本語環境の設定手順を記録しておきます。

```bash
$ locale

LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
```


LANGとLANGUAGEが空になっているので、
デフォルトの言語設定担っている。

この状態だと、日本語のようなマルチバイト文字をコンソール上で入力すると文字化けを起こしてしまうので、
変更する。

```bash
$ locale -a   # localeの言語設定できる一覧が表示される
C
C.UTF-8
POSIX
```

デフォルトの環境では日本語のパケージがないので、インストールする


```bash
$ apt install language-pack-ja-base language-pack-ja ibus-mozc # 日本語関連パッケージをインストール

$ locale -a
C
C.UTF-8
POSIX
ja_JP.utf8    #追加された日本語パッケージ
```

日本語環境のパケージがインストールされたので、環境設定を上書きする

```bash
echo 'export LANG=ja_JP.UTF-8' >> ~/.bashrc
echo 'export LANGUAGE="ja_JP:ja"' >> ~/.bashrc
```

一度ログアウトしてから再ログインすると日本語に対応している。

dockerで環境構築しているなら、Dockerfileに日本語環境を構築していると手間を省けるので楽だと思います。

```dockerfile
FROM ubuntu:latest

RUN apt update && apt upgrade -y
RUN apt install language-pack-ja-base language-pack-ja ibus-mozc
RUN echo 'export LANG=ja_JP.UTF-8' >> ~/.bashrc
RUN echo 'export LANGUAGE="ja_JP:ja"' >> ~/.bashrc
```


環境構築って慣れないと、
アプリ開発をする前に疲れちゃいますよね。
ささっと開発できる環境をいつでも簡単に作れる状態にしておくことが大切であると最近強く感じています。
ZipのNode.jsを環境変数を設定せずにパスを通す方法(windows)

# 手順
## 1.ZipのNode.jsを以下のフォルダに展開したとする。
C:\00\tool\node-v10.15.3-win-x64

## 2.コマンドプロンプトを立ち上げる 
## 3.以下のコマンドを実行する
set PATH="C:\00\tool\node-v10.15.3-win-x64";%PATH%

これで、このコマンドプロント上であれば、どのフォルダからでもnodeコマンドを実行できる
S3+SNS+EmailもしくはSQSへ通知してみる

#1.S3+SNS（Email）パターン#


手順1.S3バケットを作成する。

手順2.SNSでトピックとサブスクリプションをEmailで作成する。

手順3.SNSでアクセスポリシーを設定する必要がある。（重要）

　[宛先の SQS キューにアタッチする IAM ポリシーの例。](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/NotificationHowTo.html)

```
{
 "Version": "2008-10-17",
 "Id": "ID",
 "Statement": [
  {
   "Sid": "SID",
   "Effect": "Allow",
   "Principal": {
     "Service": "s3.amazonaws.com"  
   },
   "Action": [
    "SNS:Publish"
   ],
   "Resource": "arn:aws:sns:ap-northeast-1:268546037544:naata-sns",
   "Condition": {
      "ArnLike": { "aws:SourceArn": "arn:aws:s3:::naata-s3-sqs" }
   }
  }
 ]
}
```

手順4.S3バケットでEventsを設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/ae6ee802-92de-741e-2d27-7533bc5047d2.png)

手順5.S3へファイルをアップロードし、Emailに通知が来ているか確認する。



#2.S3+SNS（SQS）パターン#

手順1.S3バケットを作成する。

手順2.SNSでトピックを作成する。アクセスポリシーは先程と同じ。

手順3.SQSキューを作成し、SNSトピックへのサブスクライブする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/f0d67575-e1d8-4999-8bd2-906bdc4cc62e.png)

手順4.SNSでサブスクリプションをSQSで作成し、SQSのエンドポイントを指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/b612a443-f2c6-ae1a-afe4-c5b21754f794.png)

手順4.S3へファイルをアップロードし、SQSキューでメッセージを表示してみましょう。
Dockerでイメージを作成する方法

# Dockerでイメージを作成する方法
まずはdockerのライフサイクルを学ぶ
参考
https://qiita.com/zembutsu/items/d146295cfcf69c205c1e

環境
Docker version 18.09.2
docker-compose version 1.23.2

### 方法１：Dcokerfileを使用してイメージを作成する
[公式ドキュメント](http://docs.docker.jp/engine/reference/commandline/commit.html)では、文書化されていてメンテナンスがしやすい理由からこちらが推奨されているようです。

1. Dcokerfileの作成（下記サイト参照）
2. Dcokerfileを使用してイメージを作成する
`$ docker build -t [名前：タグ名] [パス]`
3. 作成したイメージからコンテナ起動
`$ docker-compose up -d [コンテナ名] [イメージ名：タグ名] /bin/bash`

参考
https://qiita.com/pottava/items/452bf80e334bc1fee69a
https://knowledge.sakura.ad.jp/15253/
### 方法２：構成を変更したコンテナを元にイメージを作成する

```
# コンテナを一時停止しないようにするオプション（–-pause=false）をつけて作業内容を保存する
$ docker commit --pause=false [保存したいコンテナID] [保存したいイメージ名:付けたいタグ]

# 作成したイメージからコンテナを起動する
$ docker run -it --name [コンテナ名] [イメージ名：タグ名] /bin/bash
```
Windowsでインストーラに頼らないGoの始め方

# はじめに
Goをちょっと試したいと思ったが、気軽にインストーラでインストールして、何が起こっているかわからないのは気持ちが悪かったので、インストーラに頼らずインストールをしてみようと考えた。
基本的に[公式ドキュメント](https://golang.org/doc/install
)の通りに実行していく。
# 環境
OS：Windows10 64bit（バージョン1809）

# インストール
1. ダウンロード  
https://golang.org/dl/ にて最新（記載時はgo1.12.5）の64bit用zipファイル（～amd64.zip）をダウンロードする。
1. ファイルを展開  
公式推奨の`c:\Go`にzipを展開する。
（`c:\Go\bin`となるようにする。）
1. 環境変数を追加  
`PATH`に`c:\Go\bin`を追加する。
1. 確認  
コマンドプロンプトを開き`go version`を実行する。  
以下のように出力されたらインストールは成功している。

```
> go version
go version go1.12.5 windows/amd64
```

# hello, world
お約束のhello, worldを出力する。
インストールが成功したら、どのディレクトでもソースをコンパイルと実行ができると思う。しかし、下手に公式推奨から外れると後々パッケージ管理や各種ライブラリの関係で不具合が発生すると初心者には色々厄介そうなので、公式推奨に乗っかることにする。
Goにはワークスペースという概念があるが、正確には理解していないためとりあえず公式ドキュメントに書いてあるとおりに実行していく。

1. ワークスペースを作成 
`%USERPROFILE%\go`というディレクトを作成する。  
ここがGoにおける作業場所のルートになっている様子。  
`%USERPROFILE%`がどこだかわからない場合は`echo %USERPROFILE%`や`cd %USERPROFILE%`などを実行すると良い。
1. ソース作成
`%USERPROFILE%\go\src\hello\hello.go`をディレクトリとともに作成する。
ソースは以下のとおり。

    ```go:hello.go
    package main

    import "fmt"

    func main() {
	    fmt.Printf("hello, world\n")
    }
    ```

1. コンパイルと実行  
以下のとおり実行すると、`cd %USERPROFILE%\go\src\hello\hello.exe`が作成される。

    ```
    > cd %USERPROFILE%\go\src\hello
    > go build
    ```
続けて実行すると以下の通りとなる。

    ```
    > hello
    hello, world
    ```

# アンインストール
これまで作成したディレクトと環境変数を削除します。
具体的には、`c:\Go`と`%USERPROFILE%\go`をまるごと削除し、環境変数`PATH`に追加した`c:\Go\bin`を削除します。

# おわり
各種ライブラリの導入（`go get ...`）をした場合、アンインストールするには、他にもディレクトを削除する必要があるかもしれませんが、そこまで試せていません。
基本文法を試す程度であれば、`%USERPROFILE%\go\src`以下にディレクトリを作成してソースを書いていけば、先のアンインストール手順で環境はもとに戻ると思います。
Go実装 参考先メモ

#### 基本

- [A Tour Go]
(https://go-tour-jp.appspot.com/welcome/1)
- [逆引きGolang]
(https://ashitani.jp/golangtips/index.html)
- [Go言語で幸せになれる10のテクニック]
(https://qiita.com/ksato9700/items/6228d4eb6d5b282f82f6)
- [他言語プログラマがgolangの基本を押さえる為のまとめ](https://qiita.com/tfrcm/items/e2a3d7ce7ab8868e37f7)

#### コーディング規約
- [#golang CodeReviewComments 日本語翻訳]
(https://qiita.com/knsh14/items/8b73b31822c109d4c497)

#### 並列
- [Go の channel 処理パターン集]
(https://hori-ryota.com/blog/golang-channel-pattern/)  
- [golang の channel を使ったテクニックあれこれ](https://mattn.kaoriya.net/software/lang/go/20160706165757.htm)  
- [Goでchannelがcloseしてるかどうか知りたい というアンチパターン](https://beatsync.net/main/log20150325.html)  

##### 構造体
- [Go言語での構造体実装パターン](https://blog.monochromegane.com/blog/2014/03/23/struct-implementaion-patterns-in-golang/)  

#### エラーハンドリング

- [Go言語の例外を必ず扱うような言語機能のありがたさ]
(https://i101330.hatenablog.com/entry/2018/08/26/004005)  

#### Gorm
- [Gorm.io docs](http://gorm.io/ja_JP/docs/)
docker-composeエラー：Couldn't connect to Docker daemon - you might need to run `docker-machine start default`.

$ docker-compose up しようとしたらエラーが…

```
ERROR: Couldn't connect to Docker daemon - you might need to run `docker-machine start default`.
```

念のためdocker-machineをrestartするが変わらず・・・
どうやらTLS証明書の接続エラーを吐いてるらしい・・・
こちら↓を参考に解決を試みる
https://qiita.com/yoskhdia/items/a769b9d05657e4798203
無事docker-compose up出来ました。

公式ドキュメントにトラブルシューティングがありました。
http://docs.docker.jp/toolbox/troubleshoot.html


### そもそもなぜTLS証明書が接続エラー（IP違うよと言われる）
https://www.ogis-ri.co.jp/otc/hiroba/technical/docker/part6.html
>原因の一つとして、証明書を作成した時（Dockerホストを作成した時）の IPアドレスと、今回 Dockerホストを起動したときの IPアドレスが異なることが考えられます。Docker Machine は Dockerホストを起動する時に IPアドレスを動的に割り当てるため、Dockerホストを複数作成していると、このようなエラーがよく発生します。


しかし、その後コンテナ側に入ろうと $ docker exec -it laradock_workspace_1 /bin/bash したら、今度は下記のエラーが…

```
could not read CA certificate "\\c\\Users\\***\\.docker\\machine\\machines\\default\\ca.pem": open \c\Users\***\.docker\machine\machines\default\ca.pem: The system cannot find the path specified.
```

公式ドキュメントのトラブルシューティングで、マシンの削除～新しいマシンの作成を端折っていましたが、
環境変数の指定はせなあかんのでした。

```bash
$ eval $(docker-machine env default)
```
上記を怠ると、dockerコマンド入力時に「could not read CA certificate〜 」のエラーになるという事でした。
php-master-changes 2019-05-15

今日は tokenizer 用のコード生成スクリプトのリファクタリング、テストに使われていた *.dat の拡張子を *.data への変更、disable_functions を eval に使えるようにする修正、コードの単純化、interface のオートロードで例外が投げられた際に誤ったクラスを定義してしまう問題の修正、opcache で配列内の配列が絡む式について間違った評価を行う場合がある問題の修正、7.2 系の開発バージョン引き上げと 7.3.6RC1 のタグ付け直しがあった！

# 2019-05-15
## petk: Enhance the tokenizer data generator script
- https://github.com/php/php-src/commit/b4dec0e11dbfd20cd6ad3d0f812fa0879cb5e3ee
- [7.4~]
- ext/tokenizer で、パーサのヘッダファイルからトークン名/定数名を取り出すコードの生成スクリプトをリファクタリング

## petk: Rename *.dat to *.data for common file type
- https://github.com/php/php-src/commit/f1a53501e649d7d5d9fe9d0d8c47c6139de5f29e
- [7.4~]
- テストに使われていた *.dat の拡張子を *.data へ変更

## beberlei: Fix bug [#62397](https://bugs.php.net/bug.php?id=62397) - disable_functions does not work with eval.
- https://github.com/php/php-src/commit/050d299364ded5cb7b878bc515aa763c9c623c4b
- [disable_functions](https://www.php.net/manual/ja/ini.core.php#ini.disable-functions) が [eval](https://www.php.net/manual/ja/function.eval.php) には効かない問題の修正
- 元々 eval は関数でなく言語構造だから、という理由で非対応だったが、まあ潰せてもいいかというので潰せるようにしてるもよう
- eval が無効化対象に指定されている場合には zend_compile_string を潰す形で対応されてる
- master なので [create_function() は削除済](https://qiita.com/sj-i/items/418282051c3c647e7aed#nikic-remove-create_function)、[文字列引数での assert() も削除済](https://qiita.com/sj-i/items/f793c0b129c50c4f7420#nikic-remove-special-treatment-of-strings-in-asserts)だけど、他にも無効化時に影響受ける部分あるんじゃないかな？
- cli での stdin 経由での実行、あと mbregex の e ってまだ動くんだっけ

## petk: Update changelogs
- https://github.com/php/php-src/commit/c27b531af7928349791194db87cfd7f38e5f3b7b
- [7.4~]
- ↑を NEWS、UPGRADING へ反映

## sgolemon: Bump for 7.2.20
- https://github.com/php/php-src/commit/4fa32d67bf3fbea0241f0e786dbcb5517d25e1a2
- [7.2~]
- 7.2 系の開発バージョンを 7.2.20 に引き上げ

## dstogov: Removed ability to compile PHP without EX(run_time_cache). ZEND_EX_USE_RUN_TIME_CACHE was always defined.
- https://github.com/php/php-src/commit/f9e801584701779e9035e1a21b815e30f6e59129
- [7.4~]
- EX(run_time_cache) なしでのコンパイルをできないようにしてコードを単純化

## cmb69: Update NEWS regarding re-tagging 7.3.6RC1
- https://github.com/php/php-src/commit/714d2d8ae1eb1331049cb847c3e9cb4907930b07
- [7.3~]
- 7.3.6RC1 のタグを振り直したので 7.3.7 へ先送りになりそうだった修正が含まれるようになり、それにあわせて NEWS を更新

## nikic: Fixed bug [#76980](https://bugs.php.net/bug.php?id=76980)
- https://github.com/php/php-src/commit/35353dc49a73a58c17c7896c4c4c3997ef2c007d
- [7.2~]
- クラス定義時の interface のオートロードで例外が投げられた際、クラスがその interface 抜きで定義されてしまう問題の修正
- [な、なんじゃこりゃあ！](https://3v4l.org/s8ti7)
- Fatal になるよう修正された

## nikic: Fixed bug [#78015](https://bugs.php.net/bug.php?id=78015)
- https://github.com/php/php-src/commit/9d76fbd0c4ae71df2a476ce7529728fa19b37549
- [7.3~]
- ext/opcache で、SCCP 最適化により配列内の配列が絡む式について間違った評価を行う場合がある問題の修正
【Git】 差分がないはずなのに大量の差分が出た時の対処法

##環境
macOS High Sierra 10.13.6
SourceTree 2.3.2

##症状
差分がないのに差分として扱われています。

![スクリーンショット 2019-05-16 10.15.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417215/664c8bf2-e44a-2678-2684-4361928e7a1d.png)

##結論
gitの設定でファイルモードを無視するように変更すれば解決しました。

##手順
SourceTreeの[メニュー] -> [操作] -> [ターミナルで開く]を選択し、ターミナルを開いてください。
ターミナルで下記を実行します。

```terminal:設定
$ git config core.filemode false
```

```terminal:確認
$ git config -l | grep filemode
```
core.filemode=falseが返ってこれば設定OK

これでSourceTreeのファイルステータスを見ると差分が消えてるはずです。

##補足
今回の件は、ターミナルで差分を確認すると下記のような差分が表示されます。

```terminal
old mode 100755
new mode 100644
```
これはファイルモード（パーミッション）が違うよっていうメッセージらしいのです。
それが引っかかって表示されていたようですね。

git reset --hardしたり、改行コードを確認したりしても当然解決はしないので、もしかしたらハマった人も多いのでは？
でも記事がほとんどなかったので、ハマったのは私くらいなのかなぁ・・・？
「差分がないのに差分が出る」で検索したら改行コードについての説明ばかりでした。

発生するタイミングは環境構築のタイミングくらいになると思うので、
環境構築時に身に覚えのない差分が大量に出たら、まずはこちらを確認してみたらいいかもしれませんね。

##参考
https://blog.t5o.me/post/20121119/git-chmod-git-config-core-filemode.html
【MySQL】AUTO INCREMENTのリセット【個人的備忘】

AUTO INCREMENTのカラムがあるテーブルに対してdeleteを実行しても、AUTO INCREMENTの値はリセットされません。

その場合は以下のSQLを実行し、任意の数値からAUTO INCREMENTが開始されるように変更する必要があります。

`ALTER TABLE "テーブル名" AUTO_INCREMENT = "任意の値";`

<font color="red">※任意の値は数値型のため、シングルクオーテーション（'）を付けるとエラーになるので要注意</font>
<br />
>- 試験環境でdeleteを実施する度に忘れるので自分的備忘として投稿
IBM Cloud Internet Services (CIS) とIBM Cloud Object Storage (ICOS) の連携

#CISのResolve Override with COS機能とは

先日、IBM Cloud Internet Services (CIS)のページルールで、Resolve Override with COS という機能が利用可能になりました。
https://cloud.ibm.com/docs/infrastructure/cis?topic=cis-resolve-override-cos#resolve-override-cos

これは、CISで使っている利用者のドメイン、サブドメインを、ICOSのBucketに紐づけられる機能です。
先日可能になったICOSのパブリックアクセス機能（ https://cloud.ibm.com/docs/services/cloud-object-storage/iam?topic=cloud-object-storage-iam-public-access ）と組み合わせる事で、例えば、www.example.com としてCISを通して公開しているウェブサイトのうち、image.example.com 配下のファイルはICOSから配信するといった事が簡単にできるようになりました。

CISを使ってウェブサイトを公開しながら、画像・動画・PDF等の静的ファイルはICOSに置いておきたい、といったユースケースに便利かと思います。

実際に設定してみます。

#ICOSのBucketにファイルをアップロードして公開

下記などを参考に、ICOSにファイル（今回は画像ファイル）をアップロードし、パブリックアクセス可能な状態にしておきます。
https://qiita.com/testnin2/items/6379e5bc5ea165212e15

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/c5a68392-66f8-6f15-e0ee-d208859c8397.png)


#Resolve Override with COSのページルールを作成
CISのページルールで、Resolve Override with COSのルールを作成します。

今回はimageというサブドメインをICOSと紐づけたいので、URL matchの欄をimage.[自ドメイン]にしています。

Rule Settingで、Resolve Override with COSを選択すると、そのアカウントにあるICOSのbucketをプルダウンから選べますので、今回の画像ファイルを配置したbucketを選択します。

「Provision 1 Resource」ボタンを押下して、ルールを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/e2a47036-bb98-8dab-4129-93c7259f18a1.png)

このタイミングで、bucket名.[自ドメイン]から実際のICOS bucketへのCNAMEレコードがCISのDNSに自動的に作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/fb9ad3ab-973b-f1b5-6521-ff71c929c2c1.png)

作成したルールを再度edit画面で見ると、このルールで実際に行われることは、マッチしたURL文字列のResolve Overrideと、その際のHost Header Overrideである事が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/9bdb671a-ad40-f191-8048-9e9a47a7cf1d.png)

このルールと、次項で行うDNS設定により、image.[自ドメイン]へのリクエストが、ICOSのbucketに向かうようになります。

# DNS設定
次に、CISのDNS設定画面で、サブドメイン「image」に対するレコードを作成します。Proxy設定はONにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/c1b4161f-b3f2-feab-0b26-ccda16f3a344.png)

このレコードを追加する目的は、Proxy設定をONにすることで、image.[自ドメイン]へのアクセスがCISを経由するようにする事です。CISを経由させることで、前項で定義したページルールのURL matchにマッチするようになり、そのルール内のResolve Override定義によって名前解決され、リクエストがICOSに向かうので、実はこのDNSレコードの名前解決設定は使われません。ですので、上記の例では、imageの名前解決先をICOS bucketへのCNAMEとしていますが、ここは何でも構いません。（どこか適当なウェブサーバーへのAレコードにしても動作は変わりません。）

#動作確認
以上の設定により、image.[自ドメイン] へのアクセスで、ICOSに置いたファイルへのアクセスが可能になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/456ccc72-f038-f9c0-3a6f-703490de662c.png)
最短でリッジ回帰とラッソ回帰を説明（機械学習の学習 #3）

# はじめに
数学素人の「機械学習の学習」メモです。
今回は、リッジ回帰とラッソ回帰について、数学素人が「最短で」理解できることを目指しています。
※このグラフ↓をみて意味が理解できなかったので、素人なりに解釈を頑張ってみた記録です。
![リッジラッソ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386487/1198b4d2-afd0-94d3-622b-d8ed4a0fa629.png)


# 1. 過学習とは
過学習とは**「訓練データに対する誤差は小さいが、テストデータに対する誤差が大きい状態のこと」**です。
機械学習では過学習がしばしばおこるらしいです。
我々は「未知のデータ」に対する誤差を小さくしたいので、訓練データに過度にフィット（過学習）しないように**調整**する必要があります。

## 過学習状態の誤差関数
過学習となっている誤差関数は、グラフが大きく振れる形をとることが多いそうです。大きく振れる、ということは、**重み（回帰係数）が大きい状態**です。
過学習を抑えるためには、重みを小さくしたほうがよさそうです。

# 2. 正則化法
目的の関数（誤差関数）にペナルティ項を加えた関数を最小化する方法のことです。
ペナルティ項ですが、重みは小さいほうがよさそうなので、「**重みの大きさに相当するもの（→ノルム）**」を設定することにします。

## ノルムとは
ベクトルの「大きさ」をざっくり表すものです。

【定義】
$$\vec{x} = (x_1, x_2, \dots, x_n) \hspace{10mm}  1 \leq p < \infty　$$
に対し
$$(|x_1|^p + |x_2|^p + \dots + |x_n|^p)^{\frac{1}{p}}$$
を$\vec{x}$のLpノルムという。

## L1ノルム、L2ノルム
L1ノルム
$$|x_1| + |x_2| + \dots + |x_n|$$
L2ノルム
$$\sqrt{|x_1|^2 + |x_2|^2 + \dots + |x_n|^2}$$

nが２の場合のL1ノルム、L2ノルムイメージがこちらです↓。　確かに大きさっぽいです。
![リッジラッソ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386487/76f274f8-c8b0-0443-a872-16b79f5fa87e.png)

# 3. リッジ回帰、ラッソ回帰
誤差関数$E$に正則化項を加えた、
$$ S = E + \lambda(Lpノルム) 　　\lambdaは正則化パラメータ、\lambda>0$$
を考えます。この時、

- L1ノルムを使ったものが*ラッソ（Lasso）回帰*　
- L2ノルムを使ったものが*リッジ（Ridge）回帰*
 
となります。

# 4. そして、あのグラフの解釈
新たな関数

$$ S = E + \lambda(Lpノルム) 　　\lambdaは正則化パラメータ、\lambda>0$$
のSが最小になる重みを考えます。重みWとして二次元（w1,w2）の場合で考えます。

## 正則化項の値の取り方
![リッジラッソ３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386487/e0f34091-80bc-f5d3-89cf-320a20237093.png)

## ①誤差関数Eが最小の場合
正則化項を表す正方形／円を記載しています。
![リッジラッソ４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386487/81f9d0d1-8c10-d16a-e528-799799f7f410.png)

## ②誤差関数Eが最小より少し大きい場合
誤差関数の最小値よりα（なんでもよい）だけ大きい場合の、w1,w2は複数考えられます。（みんな楕円で書いているので、きっとそうなるんだと思います。）
誤差関数が決まっているので、正則化項が小さいほど$S$が小さくなります。その楕円を形成するw1,w2の中で正則化項が最小になるところは、グラフの正方形・円が一番小さくなるw1,w2です。
![リッジラッソ５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386487/f75ac1c1-ae5c-1b4e-2042-efb7eb140290.png)
正則化項が①の時より小さくなりました。もしかしたら①より②のほうが$S$が小さくなるかもしれません。

## ③誤差関数がもう少し大きい場合、を考えていくと…
以下のグラフになります。（見づらいですが）オレンジ色の線のどこかで、$S = E + \lambda(Lpノルム)$が最小となります。
![リッジラッソ６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386487/75b1c167-31a6-e386-b4ae-d0e9f77b712b.png)

## 結果
Sが最小となるところを表したグラフがこう↓なるよ、ということです。
![リッジラッソ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386487/d2d9c7e0-f4ae-12f9-d97c-017e27e1fb22.png)

# 5. リッジ回帰、ラッソ回帰の特性
（若干力尽きました…参考サイトをご覧ください）

【ラッソ回帰】
〇一部のパラメータがゼロになる。→特徴選択できる。
×微分できない（推定で求めるようです）

【リッジ回帰】
〇なめらかなモデルが得られる。
〇微分可能（解析的に解ける）
×パラメータはゼロにならないので、モデルが複雑になりやすい。

# 6. 参考にしたサイト
1. [機械学習はじめよう 第9回 線形回帰［後編］](http://gihyo.jp/dev/serial/01/machine-learning/0009?page=3)
2. [高校数学の美しい物語 ノルムの意味と、L1、Ｌ2、Ｌ∞ノルム](https://mathtrain.jp/lpnorm)
3. [PRMLの線形回帰モデル](https://www.slideshare.net/mobile/yasunoriozaki12/prml-29439402)
4. [回帰モデルにおけるL1正則化とL2正則化の効果](http://breakbee.hatenablog.jp/entry/2015/03/08/041411)

# 7. （蛇足）つぶやき
あのグラフ、３次元のものを２次元で表しているんですね。「誤差関数の等高線表示」とか書いてあって、筆者には？？？でした。
イメージわかない！と思っていたのですが、上記サイト3の資料で３次元で表したグラフがありました。（スライド４４、４９、５０）
３次元派？の方にお勧めです。
PHP をブラウザですぐ確認する

### 概要
Python の SimpleHTTPServer みたいに
PHP もビルドインの簡易ウェブサーバ立てられることを知ったので備忘録。
（注：実行したディレクトリの表示ではなく、PHP をブラウザで確認できる機能です）

### 環境
php 5.4 以上

### 使い方
```
$ cd <ブラウザで見たい php があるディレクトリ>
$ php -S localhost:3000
```
あとはブラウザで `localhost:3000/<見たいphpファイル>` にアクセスするだけ。
:warning: 80 番ポートは php コマンド時に root 権限が必要です

### 所感
Oauth 認証の PHP ライブラリを手元で確認したくて、ウェブで確認するには Apache 立てる必要あるのか（面倒だな）と思って調べていた所、この機能を見付けました。
（久しぶりに PHP 触ったため、自分の知識が古い可能性が大）
PyCharmで「python version 2.7 does not support〜」と警告が出たときの対処法

PyCharmでf文字列(フォーマット文字列リテラル)を利用したとき、以下のような警告メッセージが表示されるときがあります。

```
Python version 2.7 does not support a 'F' prefix
```
以下の対処を行えば、上記警告メッセージは表示されなくなります。

1. **[Preferences]**を開く
2. **[Editor]**→**[Inspections]**を選択
3. 検索欄で`Code compatibillity`と検索し、**[Code compatibillity inspection]**を選択
4. **Options**の中から**2.7**のチェックを外す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290735/871dbb2c-7230-2991-7c41-5e29117a7683.png)
今さらだけど、Git周りについて(基本コマンド, ブランチ)

#はじめに
Gitは超便利なプログラムのソースコード等の変更履歴を記録や追跡などが行えるツールです。
もはや開発では当たり前のように使われていると思いますので、身につけている方も思いと思いますが、アウトプットも兼ねてGitの基本コマンドからブランチ分けまで書いてみます。

#Gitとは
そもそもGitとは ... プログラムのソースコード等の変更履歴を記録や追跡が行えるツール
です。
"変更履歴を記録や追跡が行える"とは、つまりファイルの内容を過去のものに戻したり、ファイルのどの部分を編集したのかを目視で確認することができるのです。めっちゃ便利。

#Gitのリポジトリ
Gitのリポジトリには"リモートリポジトリ"と"ローカルリポジトリ"があります。

"リモートリポジトリ" ... 専用のサーバに配置して複数人で共有するためのリポジトリ
"ローカルリポジトリ" ... ユーザー個人が各々のマシン上にもるローカル環境のリポジトリ

普段作業するときは"ローカルリポジトリ"で作業し、公開したいタイミングで"リモートリポジトリ"にアップロードします。

#Gitのリポジトリ作成からリモートリポジトリへアップロード
まずリポジトリを作成しましょう。
リポジトリの作成方法は2つあり、一つはすでにあるリモートリポジトリをコピーする方法。もう一つはリポジトリを新規作成する方法です。

すでにあるリポートリポジトリをコピーするには"clone"コマンドを使います。

```
git clone (リポートリポジトリのパス)
```
とします。

新規作成には"init"コマンドで初期化を行います。

```
git init
```

#addとcommit
次にリポジトリにファイルを追加してからコミットしてみます。
追加するには"add"コマンドです。

```
git add (追加したいファイル名)
```
git addコマンドは様々ば方法で実行することが可能です。
*以下は一例です。

```
git add . # カレントディレクトリのすべてのフォルダ,ファイル
git add *.py # pythonファイルのすべて
git add -u # 変更されたファイルのすべて
git add -n # 追加されたファイルを調べる
git rm --cached # addしてしまったファイルを除外
```
次にコミットです。
コミットも様々な方法で実行可能です。
*以下は一例です。

```
git commit -a # 変更のあったファイルすべて
git commit --amend # 直前のコミットを取り消す
git commit -v # 変更点を表示してコミット
git commit -m "コメントを追加" # コメントを残してコミット
```

#リモートリポジトリへpush
最後にpushコマンドを実行し、リモートへアップロードします。

```
git push master origin
or
git push
```
以上でリモートへのアップロードまでが終了です。

#ブランチとは
ざっくり言うと枝分かれて別々の作業が行えるという機能です。
masterという一番大元のブランチがあり、そこから処理や機能分けで開発するためにブランチを作成して最後にすべてのブランチを統合します。

処理や機能で分けて開発することによってさらにどこを追加し、どこを編集し、等わかりやすくなりますよね。

#ブランチ操作
ブランチ作成は"branch"コマンドです。

```
git branch (ブランチ名)
```
とします。

ブランチを切り替えてみます。
コマンドは"checkout"です。

```
git checkout (ブランチ名)
```

ブランチを削除するコマンドも必要ですね。
"-d"オプションをつけることで削除が可能です。

```
git branch -d (ブランチ名)
```

ブランチ名を変更したいときは"-m"オプションです。

```
git branch -m (ブランチ名)
```

それではブランチごとの編集を統合(merge)してみましょう。
まず、変更ファイルをコミットする必要があるため編集元のブランチでcommitを行いmasterに移動します。

```
git merge (ブランチ名)
```

これで大元のmasterブランチにファイルを更新することができました。

#最後に
Gitは本当に便利ですね、Githubと一緒に使うとさらに開発が楽になると思います。

この記事ではまだほんのさわりの部分しか触れていませんので、ggるなりなんなり調べてみるとさらに色々な編集方法や名義方法が出てきますので是非調べてみてください。

しがない学生が書いた記事を読んでくださった方には感謝します。ありがとうございました。
プログラミング未経験者がN予備校の2019年度プログラミング入門をやってみた。

# はじめに
私は、プログラムミングを始めて、4か月くらいのスーパー初心者です。
新卒入社をして研修でN予備校をずっと触っているので、N予備校について記事を書きます。


##N予備校ってなに？
ドワンゴという会社が提供しているe-learningサービス。月額1080円（税込み）で使用できる。
見た感じ、大学受験色が強そう。こんなのでプログラミングが学べるの？と思ったんです
やってみると意外とハードでした。

##N予備校を実際やってみた。
まず初めに簡単なHTMLの説明があって・・

>
Web ページ（ホームページ）を作るための言語です。Hyper Text Markup Language（ハイパーテキスト・マークアップ・ランゲージ）の略で、そのまま「エイチティーエムエル」と読みます。詳しくはこれから少しずつ説明していきます。
ここではまず、簡単な HTML を見て、実際に編集を行ってみましょう。

なるほど、とりあえず次から編集をやってみればいいのね。

#VSCODEでHTMLを書く。
実際にVSCODEをインストールして、手順通りに操作を進めていき何もないところで `html:5`　と入力すると・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416305/81e772b7-0fe9-a955-2afa-77e4841c25c9.png)
　　　　　　　　　　　　　　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416305/36ceba44-daf2-88b1-d449-ffc5426e6be2.png)

（ちゃんとインストールの手順も書いてくれてました。）

「おお、何が書いてあるのかわかんねえ」

よくよく見てみると、titleだったり、bodyだったりという見慣れた英単語が・・・
これはGoogle先生に聞いてみるしかない,と思ったんですがちゃんと解説もしてくれてました。
(N予備校さんすごい！)




実際にやってみたのはhtmlの編集をして、タイトルを変えるくらいなんですが、やってみたあとになんとなくHTMLの入れ子構造の図が見えてくるのではないかと思います。
　私は見えるようになるまで時間がかかりました。( ;∀;)

すげえ理解できる。なんかVSCODEあればHPつくれるんじゃね！とちょっと気分が上がります( ´∀｀ )

#まとめ
N予備校さん結構分量多いけど初心者にめっちゃ優しい！いいじゃんこれ。
（なんかN予備校の回し者みたいですが、違いますよ）
ほかにもいいサービスはあるかもしれませんが、入り口としてこんなに詳しく書いてあるサービスは
ほかにはないんじゃないかなと思います！
peatrixでメールアドレスが変更できなかった件

peatix
https://peatix.com

でメールアドレスを変更しようとして、入力しなおして、保存しても、
また前のメールアドレスに戻ってしまうという現象に遭遇した。

原因はわからない。
対策として、一旦アカウントを削除し、
新規に登録した。

同じ現象が出た方へのお知らせと、原因とか別の対策をご存知の方がいるかもしれないとひとまず記録。

あとで気がついたら、下記メールが来ていた。画面にメール送りましたって出たっけ？
おまけに、表示を元のメールに戻すって、どゆこと。Do you know me?

```
Peatix アカウントのメールアドレスを変更するリクエストを受け付けました。メールアドレスはまだ変更されていません。

以下のボタンをクリックして、手続きを完了してください。ログイン画面が表示されますので、変更前のメールアドレスでログインしてください。

変更する:
https://peatix.com/user/のあとにごちゃごちゃ

もしこのリクエストにお心当たりのない場合には、このメールは破棄してください。

このメールは xxx@xxx 宛に送られました。
```
一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53
###  文書履歴(document history)
ver. 0.01 初稿 20190516 朝
ver. 0.02 行修正 20190516 午前
ver. 0.03 メール追記 20190516 昼前
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Pythonのバージョン切り替えツール「pyenv」の備忘録


## pyenv

### 仕組み

`~/.pyenv/versions/`に様々なバージョンのpythonがインストールされる

`~/.pyenv/shims/python`にpythonという名前のスクリプトがインストールされる。このスクリプトは実行された環境によって実際に実行するpythonバイナリを切り替える。このスクリプトをpythonコマンドの代わりとして使うことで環境毎にバージョンを切り替える。

どのバージョンを選ぶかは以下のアルゴリズム。

1. PYENV_VERSION環境変数
2. カレントディレクトリ中にある .python-version に記述されたバージョン
3. 親ディレクトリをたどり .python-version を探す 
4. ~/.pyenv/version ファイル
5. 上記が全てない場合は "system" Python

### コマンドメモ

#### 使えるバージョン一覧

```
pyenv install --list
```

#### バージョンのインストール

```
pyenv install 2.7.15
```

`~/.pyenv/versions/` に追加される


#### インストールされているバージョンの一覧

```
pyenv versions
```

もしくは

```
ls ~/.pyenv/versions/
```

#### そのディレクトリ配下で有効になるバージョンの確認

```
pyenv version
```

#### そのディレクトリ配下でバージョンを切り替える

```
pyenv local 2.7.15
```

もしくは

```
echo 2.7.15 > .python-version
```
よく忘れるLinuxコマンド

良く忘れるコマンドを判例ととともにメモ

関連：[よく忘れるコマンドの考え方](https://qiita.com/asuzuki2008/items/c8eaa9243381c7550350)

# iconv

テキストファイルを指定した文字コードで出力（表示）する。

## SHIFT_JISのファイルを、とりあえず表示したい
```
iconv -f SHIFT_JIS 001.csv
```

# netstat

ネットワーク関係の状態を表示してくれるコマンド。

## ポートを使っているプロセスをわりだす
```
netstat -anp
```

# tar

ファイルの圧縮/解凍。
引数の`x`が解凍で、`c`が圧縮の意味だったはず。
でもどこでも`zvf`を使っている例が多いので、なんとなくそれを使っている。

## tar.gz解凍
```
tar -xzvf ファイル名
```

## tar.gz圧縮
```
tar -zcvf ファイル名
```

##その他圧縮について詳しい情報
https://qiita.com/t-kubouchi/items/158e02aa6b8e62b76242

# wget

指定したURLをファイルダウンロード。

##URLからダウンロード
```
wget http://~~~
```
【Xcode9】 ld: file too small (length=0) file エラーでハマった

#環境
macOS High Sierra 10.13.6
Swift 3.1
XCode 9.4.1

#症状
ソースは間違っていない（gitで管理しており他の人は問題なく動いていた）にも関わらずビルド時に下記のエラーが発生。

```text:error_log
ld: file too small (length=0) file 'xxxxxxxxxxxxxxxxxxxx' for architecture xxxx
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

##結論
Cleanしたら直った。

##やり方
[メニュー] -> [Product] -> [Clean]

もしくは

Cmd + Shift + K

##参考
https://qiita.com/snow_richisland/items/0df7764938e59a8572b3#cmd--shift--k

##備忘録
参考の記事にも書いてありますが「エラー発生→実装は間違っていない→とりあえずクリーン」これは覚えておいた方が良さそう。

まだswift歴1ヶ月ですが、こんなエラーに４時間以上持ってかれた。。。
同じ初心者仲間で同じ泥沼にハマらないようにメモも兼ねての投稿。
PythonとMySQLを接続する手順

# Django インストールから設定まで


## インストール
```bash
sudo apt update
sudo apt upgrade
```

## Python install
```bash

sudo apt install python3
sudo apt install python3-pip
```


## mysql install
```bash
sudo apt install mysql-server mysql-client
sudo mysql_secure_installation
sudo apt-get install python3-dev
```

https://pypi.org/project/mysqlclient/

mysql_secure_installation コマンドを実行し、管理者(root)パスワードなどインストール後の初期設定を行う。基本的には「y」で進める。

## django に必要なライブラリをインストール

```bash
pip3 install mysqlclient
pip3 install Django
pip3 install mysqlclient
```
React NativeでExpoを使用する場合の制限

# ここに書いてあること

Expoのドキュメントの「[Why not Expo?](https://docs.expo.io/versions/latest/introduction/why-not-expo/)」の内容です。（2019/05/16時点）
※もし「これ重要なのに書いてないじゃん！？」みたいのあったら教えてください。

# 要約

- ExpoはRubyにおけるRailsのようなReact Native版のマネージドワークフロー（フレームワークみたいのもの？）である。
- ExpoはXcodeやAndroid Studioを使わずjavascriptだけでスマホアプリ開発ができる。
- Expoはいくつか制約があるので作成するスマホアプリの要件に適合するか事前に検討したほうがよい。

# 制約

## 全てのiOS/AndroidのAPIを使用できない

- BluetoothやWebRTCは使用できない。
- でも開発中だからAPIのリリースをチェックしてほしい。[Expoブログ](https://blog.expo.io/)
    - 例えばこのブログを見ると最近（2019/5/10）、画像の圧縮がExpoCLIで対応したことが分かります。

## バックグラウンド実行はできない

- アプリが最前で動いていない時やスマホがスリープ状態のときは実行できない。
- ただし、位置情報の取得はバックグラウンドでも可能。
- OSが提供する音楽再生やバックグラウンドでのプッシュ通知はできない。

## アプリのサイズを小さくできない

- Expoは使用しないAPIも含まれているので、iOSで２０MB、Androidで１５MBのアプリサイズにはなる。

## 特定のプッシュ通知機能は使えない

- Expoの提供する[プッシュ通知](https://docs.expo.io/versions/latest/guides/push-notifications/)なら使える。

## 古いOSバージョンはサポートしていない

- iOS 10以降 / Android 5以降

## OS特有のAPIを実装することはないでしょう
Golang - How to Compiler Like C/C++ Preprocessor with Build Tags?

In C/C++, we used ***#ifdef*** to decide it whether to compile or not.

```c
#ifdef MACRO

controlled text

#endif /* MACRO */
```

In Golang, we simply prepare two files and run the command.

```golang:main_debug.go
// +build debug

package main
...
...
```

```golang:main_release.go
// +build !debug

package main
...
...
```

```
go build -tags debug
or
go build -tags release
```

https://gcc.gnu.org/onlinedocs/cpp/Ifdef.html
https://stackoverflow.com/questions/38950909/c-style-conditional-compilation-in-golang
AWS認定Big Data勉強記 - 6.1: Redshift Spectrum

こんにちは、えいりんぐーです。

今回はRedshift Spectrumについてまとめます。

#### Q: Redshift Spectrum とは何ですか?

Redshift Spectrum は、ロードや ETL を必要とすることなく Amazon S3 のエクサバイト単位の非構造化データに対してクエリを実行できる Amazon Redshift の機能です。クエリを発行すると、クエリはクエリ計画を生成および最適化する Amazon Redshift SQL エンドポイントに移動します。Redshift はどのデータがローカルでどのデータが Amazon S3 にあるかを特定し、読み込む必要がある Amazon S3 データの量を最小化する計画を生成して、リソースプールから Amazon Redshift Spectrum の作業者に Amazon S3 からデータの読み込みと処理を要求します。

#### 参考資料
基本的に以下の資料をもとにしています。

 - Black Belt資料
    - [Redshift 2016](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-amazon-redshift)
    - [Redshift Update & Spectrum 2017](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-amazon-redshift-update)
    - [Redshiftテーブル設計ガイド](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-amazon-redshift)
    - [Redshift Update 2019](https://www.slideshare.net/AmazonWebServicesJapan/20190122-aws-black-belt-online-seminar-amazon-redshift-update)
 - ドキュメント
    - [Redshiftとは?](https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/welcome.html)
    - [Redshiftのベストプラクティス](https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/best-practices.html)
 - [よくある質問](https://aws.amazon.com/jp/redshift/faqs/)
 - AWSブログ
    - [Amazon Redshiftを使用した高性能ETL処理のベストプラクティス Top 8](https://aws.amazon.com/jp/blogs/news/top-8-best-practices-for-high-performance-etl-processing-using-amazon-redshift/)
    - [Amazon Redshift Spectrum 10 のベストプラクティス](https://aws.amazon.com/jp/blogs/news/10-best-practices-for-amazon-redshift-spectrum/)

###### 特徴

1. エクサバイト級までスケール
2. 高速
3. オンデマンド・クエリ毎の費用
4. オープンファイルフォーマット
5. データを移動せずにクエリ
6. フルマネージド

###### ユースケース

 - 定期的に追加されるデータをS3に置く
    - 変更が少ないデータはRedshiftに
 - アクセス頻度が低いデータをS3に置く
    - 頻繁にアクセスされる直近のデータはRedshiftに
 - S3上のデータを複数Redshiftクラスターで共有したい時
    - 同時実行性能の向上
    - 複数AZによる可用性の向上

###### S3を直接クエリできるメリット

 - Redshiftのクエリがそのまま活用できる
 - ローディングにかかる手間が不要
 - ファイルフォーマットを変更する必要がない
 - RedshiftのデータとS3のデータをジョイン
 - 1つのS3のデータに複数のRedshiftクラスターからアクセス可能

###### 使い方

1. S3にファイルを作成
    2. csv, parquet, sequencefileなどの形式。gzipなどの圧縮にも対応
    3. S3にアクセスできるIAMロールを用意
2. `CREATE EXTERNAL SCHEMA` でクラスターとデータカタログもしくはHive Metastoreを接続
    3. Athenaか独自Hive Metastoreを利用する
3. `CREATE EXTERNAL TABLE` で外部表としてS3データを定義
4. クエリを実行 (`SELECT COUNT(*) FROM ...`)

###### ベストプラクティス

 - 読み取りデータ量の削減
    - 圧縮
    - 列指向フォーマット
    - サイズを揃える
    - パーティショニング
        - 検索されるレンジに従ってフォルダを作成してファイルを格納する
        - 日付など
 - 表の配置
    - ファクト表をS3に、ディメンション表をRedshiftに置く
 - 効果的なクエリ
    - 必要な列だけ取得
    - アグリゲーション、フィルターで戻すデータを最小にする

###### 暗号化
Redshift Spectrum は、AWS Key Management Service (KMS) によって管理されるアカウントのデフォルトキーを使用して、Amazon S3 のサーバー側の暗号化 (SSE) をサポートします。

###### Amazon Athenaとの使い分け
 - Amazon Athena は、従業員が Amazon S3 のデータに対してアドホッククエリを実行できるようにする最も簡単な方法です。Athena はサーバーが不要です。そのため、セットアップや管理のためのインフラストラクチャがなく、即座にデータ分析を開始できます。
 - 頻繁にアクセスされるデータが存在し、そのデータを一貫性のある高度に構造化された形式で保存する必要がある場合は、Amazon Redshift のようなデータウェアハウスを使用します。これにより柔軟性が増します。頻繁にアクセスされる構造化データを Amazon Redshift に保存し、Redshift Spectrum を使用して Amazon Redshift のクエリを Amazon S3 データレイク内のデータ全体に拡張することができます。これにより、任意の場所に任意の形式でデータを保存でき、必要なときに処理することができます。
Craft CMS で親・子カテゴリのナビゲーションを出力する

表題の通り、今回は親子関係を持つカテゴリのナビゲーションをテンプレートで出力するためのサンプルコードについて。

前提として、ハンドル名 `event` のカテゴリグループに第二階層までのカテゴリが登録されているものとする。

```twig
{# ------------------------------------------
変数など
--------------------------------------------- #}
{# 対象カテゴリのクエリをセット #}
{% set categoryQuery = craft.categories.group('event') %}
{# トップレベルカテゴリを取得 #}
{% set categories = clone(categoryQuery).level(1).all() %}


{# ------------------------------------------
出力
--------------------------------------------- #}
<dl>
  {# トップレベルカテゴリのループ処理 #}
  {% for category in categories %}
    <dt>{{ category.title }}</dt>

    {# ループ中のカテゴリを親にもつ、子カテゴリを取得 #}
    {% set subCategories = clone(categoryQuery).descendantOf(category).descendantDist(1).all() %}

    {# 子カテゴリのループ処理 #}
    {% for subCategory in subCategories %}
      <dd><a href="{{ subCategory.url }}">{{ subCategory.title }}</a></dd>
    {% endfor %}
  {% endfor %}
</dl>
```

はじめに `categoryQuery` にハンドル名 `event` のグループに含まれるカテゴリ全体を取得し、`clone(categoryQuery)` で複製したオブジェクトを利用して異なる条件で絞り込みを行なった結果を `categories` と `subCategories` にセットしている。

ここでは `.descendantOf(category).descendantDist(1)` としているため、ループ中のカテゴリの子階層だけが対象になる。

なお、ネストされたカテゴリ項目ごとのマークアップに変化がない場合は、公式ドキュメントでも紹介されている `{% nav %}` タグを利用して簡潔に定義することもできる。

```twig
<ul>
  {% nav category in categories %}
    <li>
      <a href="{{ category.url }}">{{ category.title }}</a>
      {% ifchildren %}
        <ul>
          {% children %}
        </ul>
      {% endifchildren %}
    </li>
  {% endnav %}
</ul>
```

## 参考

**カテゴリクエリ | Craft 3 ドキュメント**
https://docs.craftcms.com/v3/ja/dev/element-queries/category-queries.html
dataclassでクラス変数を記述する

# やり方
typingモジュールに、クラス変数であることを明示的に宣言する用の型が用意されているので、データクラスの作成時にクラス変数であることを明示して宣言すれば、__init__で用いられない。

```python:
from dataclasses import dataclass 
from typing import ClassVar

@dataclass
class TestClass:
    var1: ClassVar[str] = "class"
    var2: str = "instance"
```

```bash
$ TestClass(var1='var').var1
>>> TypeError: __init__() got an unexpected keyword argument 'var1'
$ TestClass(var2='var').var2
>>> 'var'
```

# Reference 
* https://docs.python.org/ja/3/library/typing.html#typing.ClassVar
* https://docs.python.org/ja/3/library/dataclasses.html#class-variables