OmniAICreator/Qiita-1.07M huggingface dataset:
線形モデルによる回帰

皆さんこんにちは。
私は今[Pythonで始める機械学習](https://www.amazon.co.jp/Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E2%80%95scikit-learn%E3%81%A7%E5%AD%A6%E3%81%B6%E7%89%B9%E5%BE%B4%E9%87%8F%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A8%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E5%9F%BA%E7%A4%8E-Andreas-C-Muller/dp/4873117984)で勉強中です。

線形回帰という面白い概念が出てきたので少しまとめよーかなと思います。

# そもそも回帰とは？
>回帰（かいき、英: regression）とは、統計学において、Y が連続値の時にデータに Y = f(X) というモデルを当てはめる事。別の言い方では、連続尺度の従属変数（目的変数）Yと独立変数（説明変数）Xの間にモデルを当てはめること。X が1次元ならば単回帰、X が2次元以上ならば重回帰と言う。[Wikipedia](https://ja.wikipedia.org/wiki/%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90)

つまり、回帰の目的は**連続値の予測**に着地する。
例えば・・・・
ある人の**年収（目的変数)**を、学歴と年齢と住所（説明変数）から予測する事。
トウモロコシ農家の**収穫量(目的変数)**を、前年の収穫量、天候、従業員数（説明変数）から予測する事。


# では、線形モデルによる回帰とは
線形モデルによる回帰とは文字通り、線形関数を用いて目的変数を予測するものです。

回帰問題での線形モデルによる一般的な予測式は、

```math
y = w[0] \times x[0] + w[1] \times x[1] + \dots + w[p] \times x[p] + b
```
と表せます。

ここでx[0]・・・x[p]は１データポイントの**特徴量**を示し、w, bは学習されたモデルの**パラメータ**であり、yはモデルからの**予測**である。

つまり訓練データから最適化されたw, bを求め（学習し）,新しいx[0]・・・x[p]を入れられたときに、
出来るだけ正確な**y**を出力することに帰着する。

ここで線形モデルを用いた回帰には様々なアルゴリズムが存在する。
それらのモデルの相違点は、**w, b**を求める(学習する）方法とモデルの複雑さを生業する方法に存在する。

今日は最も単純で古典的な線形回帰手法である**通常最小二乗法（OLS）**について触れたいと思う。

# 通常最小二乗法（OLS）
それでは簡単にするために、1つの説明変数で考えましょう。
つまり数式は

```math
y = wx + b
```
この線形回帰では訓練データにおいて、yと予測値の平均二乗誤差が最小になるようにw, bを求める。
文章じゃわかりづらいので画像で考えると下記です。

![IMG_2226.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255565/85da99b8-7427-36da-fd0a-7e3977b01b84.jpeg)
つまり青い線（誤差）の長さの二乗和が出来るだけ小さくなるように**w**と**b**を求めて、その結果が赤い直線となります。

数式で書くならば

```math
平均二乗誤差=\frac{1}{n}\sum_{i=1}^{n} (y_i - y'_i)^2,  (y_i:i番目の訓練データでの値, y'_i: i番目の予測値)
```
この平均二乗誤差が小さくなるように、w, bを選んでいきます。
これがOLSです。簡単で美しいですね。


# サンプルコード
```python
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

import mglearn

X, y =mglearn.datasets.make_wave(n_samples=60)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

lr = LinearRegression().fit(X_train, y_train)

print("lr.coef_(傾きOR重み) : {}".format(lr.coef_))
print("lr.intercept_(切片) : {}".format(lr.intercept_))

print("Training set score: {:.2f}".format(lr.score(X_train, y_train)))
print("test set score: {:.2f}".format(lr.score(X_test, y_test)))
```
結果はこちら

```
lr.coef_(傾きOR重み) : [0.39390555]
lr.intercept_(切片) : -0.031804343026759746
Training set score: 0.67
test set score: 0.66
```

この直線をプロットしてみる。
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255565/0c01f891-4b68-5eb2-1cac-93e979bd5d15.png)

しかし、予測が６６％とはあまり良くありませんね。
おそらくこれは適合不足（underfitting)だと考えられます。

次回は別の回帰モデルであるRidgeとLassoについてです。
皆さん、いい夜をお過ごしください。
おやすみなさい。
【画像処理100本ノックに挑戦】Q.31. アフィン変換(スキュー)

# 使用したライブラリ
[【画像処理100本ノック】独自の画像入出力クラスを作る](https://qiita.com/jajagacchi/items/834e8425b84f94df8a49)
[【画像処理100本ノックに挑戦】独自の行列クラスを作る](https://qiita.com/jajagacchi/items/df881888ee6a116f7730)

# Q.31. アフィン変換(スキュー)
> (1)アフィン変換を用いて、出力(1)のようなX-sharing(dx = 30)画像を作成せよ。
(2)アフィン変換を用いて、出力2のようなY-sharing(dy = 30)画像を作成せよ。
(3)アフィン変換を用いて、出力3のような幾何変換した(dx = 30, dy = 30)画像を作成せよ。

例えばx方向なら、次の図のように変換するわけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/31d9d081-0767-3583-0f8c-c671850f8c0d.png)

```math
(x,y) \to (ay+x,y)
```

のような感じに変換すればよいことがわかります。

```c++
int main()
{
	PPM ppm("imori.pnm");
	int width = ppm.Get_width();
	int height = ppm.Get_height();

	double a = 30./(double)height;
	Matrix A(2, 2);
	A.set({
		1, a,
		0, 1
		});
	Matrix B(2, 2);
	B.set({
		1, 0,
		a, 1
		});
	Matrix C(2, 2);
	C.set({
		1, a,
		a, 1
		});
	
	int Width = width+30;
	int Height = height+30;
	PPM ppm2(Width, Height);
	for(int j=0; j<height; j++)
		for (int i = 0; i < width; i++)
		{
			Matrix X(2);
			X.set({
				(double)i,
				(double)j
				});
			Matrix X2 = C * X;
			int i2 = X2(0, 0);
			int j2 = X2(1, 0);
			if (0 <= i2 && i2 < Width && 0 <= j2 && j2 < Height)
			{
				ppm2(i2, j2, 'r') = ppm(i, j, 'r');
				ppm2(i2, j2, 'g') = ppm(i, j, 'g');
				ppm2(i2, j2, 'b') = ppm(i, j, 'b');
			}
		}
	
	ppm2.Flush("out.ppm");
	return 0;
}
```

![imori.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/dffc0d8f-5010-33ad-5056-c2eb338d993b.png) ![x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/9be2fae0-d31e-c08b-e03f-b3d2c888e18d.png) ![y.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/6295d325-28c4-c3e7-220c-8f15cb84005b.png) ![xy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/89346975-22c5-c01d-8726-c587d5207a15.png)
Javascriptレシピ⑦

Javascriptの簡単なメモです。
アプリ制作に応用できる基本レシピですので、参考にされたい方はどうぞ。

###window.closeメソッド

window.closeメソッドはブラウザのタブを閉じる処理を行います。

ブラウザのタブはどれもwindowオブジェクトが持ってるのでwindow.closeメソッドでタブの操作が出来ます。

```js

let _window;
_window = window.open('http://ttt');
setTimeout(() => _window.close(), 3000);

```

###includesメソッド

文字列や配列の中に引数で指定した値が含まれているかどうかをチェックしてくれます。
第二引数に開始インデックスを数値として指定できます。

```js
const arr = 'wanko pome';
arr.includes('o', 3);
//true
```

indexOfメソッドも似たような役割ですが、こちらは指定した値が含まれる場合は要素のインデックスを、ない場合は−１を返します。
指定した値が含まれているかどうかだけのチェックではなく、その値に対して何か操作を加えたいケースではindexOfを使います。

```js
const wanko = 'pome';
wanko.indexOf('p');
//0
```

大文字小文字関係なく調べたい場合はtoLowerCaseやtoUpperCase

```js
wanko.toUpperCase().includes('w');
```

###正規表現で文字列の抽出

正規表現を使うと複雑なパターンによる文字列検索が行なえます。
URLやメールアドレスの形式になっているか、スクレイピングの判断に役立ちます。

書き方は二種類あります。

①スラッシュで囲まれた正規表現リテラルを使用する

  定数として決められたパターンを照合させたい時に使います。

```js
const wanko =/abc/;
```

②正規表現オブジェクトのRegExpを使用する

動的な操作に対し使用します。

```js
const wanko = new RegExp('abc');
```

文字列に一致するものがあるかテストするメソッドをRegExpは持っています。

```js
const str = '32312edwd1d1';
/ab*c+[0-9]*/g.test(str);
```

###アクセス元の端末がスマホかどうかを判定する

端末情報はJavascriptのnavigatorオブジェクトに格納されています。
navigatorオブジェクトのuserAgentプロパティによってスマホかどうか判断します。
userAgentプロパティを文字列検索かけてスマホかタブレットか判定していきます。

```js
const ut = navigator.userAgent;

if(ut.indexOf('iPhone') > 0 || ut.indexOf('iPod') > 0){
    'smaho';
} else if(ut.indexOf('iPad'){
'tablet';}else{
    'pc';
}
```


###テキストボックスから値を取得

テキストボックスの要素をJavascriptで指定し、その要素のvalueプロパティを参照することで取得できます。

①getEementByIdを使う方法

```js
const message = document.getElementById('input').value;
```

②フォームからたどっていく方法

```js
const message = document.forms.form1.input.value;
```

###ミリ秒単位の経過時間を取得する方法

ミリ秒は１０００ミリ秒で１秒に換算されます。

onClickでstart()とstop()をボタン要素に書きます。
変数宣言を忘れないで下さい。

```js
function start(){
    stare_time = new Date();
}

function stop(){
    end_time = new Date();
    diff = end_time.getTime() - start_time.getTime();
 }
```

###マウスオーバーイベント

マウスオーバーイベントは要素にマウスが乗った時に発火するイベントです。
逆にマウスが離れた時に発火するmouseoutイベントもあります。

```js
wanko.addEventListner('mouseover', function(event){
    //
}, false);
```

```js
//forで複数の要素に対してマウスオーバーを指定しています。

for(i = 1; i <= 3; i++) {
    const elem = document.getElementById('div' +i);
    elem.addEventListener('mouseover', event => {
        event.target.style.background = 'orange';
        setTimeout(function() {
            event.target.style.backgroundColor = '';
        },500);
    }, false);
}
```
Apple Developer Program の管理者が最低限意識すべきこと

受託開発企業の `Apple Developer Program` の管理者として一年間仕事をしてきたので、
最低限これだけは意識しておいたほうが良いと思ったことをまとめます。

受託開発企業というところもあり、ある程度領域が狭まってしまっていることもあるかと思いますので、ご了承ください。

# プログラムの種類

### Apple Developer Program (ADP)
開発及びAppStoreでの配布で利用する
AppStore配布が出来る
Ad Hoc配布が出来る
カスタムB2B配布が出来る
TestFlight(テスト配布)が利用出来る

### Apple Developer Enterprise Program (ADEP)
開発及びIn-Houseでの配布で利用する
Ad Hoc配布が出来る
In-House配布が出来る

# 配布方法

### AppStore 配布

- AppStoreを利用した最も一般的な配布方法
- ADPでしか使えない
- 配布前に審査に出す必要がある

### Ad Hoc 配布

- App Storeを利用しない配布方法
- ADP(ADEP)に登録されたデバイス(最大100台)にのみ配布可能
- `Provisioning Profile` の有効期限(1年)が切れるとアプリが起動できなくなる
- 配布用証明書が無効になるとアプリが起動できなくなる
- 新たにデバイスを追加する場合、下記の手順が必要
  1. ADPにデバイスを登録
  2. 追加したデバイスを `Provisioning Profile` に追加
  3. `ipa`ファイルの作成

### カスタムB2B 配布

- VPP(Volume Purchase Program)を利用した配布方法
- ADPでしか使えない
- 配布前に審査に出す必要がある
- 配布先企業は `Apple Business Manager` に登録しなければならない
- `Apple Business Manager` の `Volume Purchase Program` を利用して配布する

### In-House 配布

- App Storeを利用しない配布方法
- ADEPでしか使えない
- `Provisioning Profile` の有効期限(1年)が切れるとアプリが起動できなくなる
- 配布用証明書が無効になるとアプリが起動できなくなる
- デバイスの追加で作業が発生しない
- アプリが第三書にインストールされない様に配布方法を工夫する必要がある

# 管理対象

- People
- Certificates
- Identifiers
- Devices
- Profiles
- Keys

# People
メンバーの管理

よく使う:

- Account Holder
- Admin
- App Manager
- Developer

あまり使わない:

- Finance
- Marketing
- Sales
- Customer Support

詳細
[Apple Developer Programにおける役割 - サポート - Apple Developer](https://developer.apple.com/jp/support/roles/)

# Certificates
証明書の管理

### 開発用証明書

主に使うもの:

- Development
  iOSアプリの開発時に必要
  Xcode11以降ではこちらを利用する
  ※ Apple Developer Webサイト では `Apple Development` という記述になっている
  ※ Developer権限でも作れる

- iOS Development
  iOSアプリの開発時に必要
  Xcode11未満はこちらを利用する
  ※ Developer権限でも作れる


### 配布用証明書

※ 最大数が決まっている(現状 3つまで)

主に使うもの:

- Distribution
  iOSアプリの配布時に必要
  Xcode11以降ではこちらを利用する
※ Apple Developer Webサイト では `Apple Distribution` という記述になっている

- iOS Distribution
  iOSアプリの配布時に必要
  Xcode11未満はこちらを利用する

# Identifiers
アプリを識別するためのID `Bundle ID` の管理

意識的に管理する必要はない認識。
(ですが、上限が決まっているなどあった場合、後で面倒な事になる可能性はあります。)

# Devices
端末の管理

僕の場合は、社内端末にはプレフィックスをつけて社外端末と区別できるようにしています。

# Profiles
`Provisioning Profile` の管理
`Provisioning Profile` は `証明書` , `App ID` , `UDID` を紐付けて「誰が何のアプリをどの端末に入れられるか」をまとめるファイル

## 開発用プロビジョニングプロファイル

主に使うもの:

- iOS App Development
  iOSアプリの開発時に利用する  
  ※ Developer権限でも作れる

## 配布用プロビジョニングプロファイル

主に使うもの:

- App Store
  AppStoreでの配布やTestFlightでのテスト配布時に利用する

- Ad Hoc
  Ad Hocでの配布時に利用する

# Keys
鍵ファイルの管理

主に使うもの:

- Apple Push Notifications service (APNs)  
  プッシュ通知の開発時に利用する  
  ※ 最大数が決まっている(現状 2つまで)

今後使いそうなもの:

- Sign In with Apple
  Apple IDを使用して認証できるようにする時に利用する

# あとがき
間違ってるところなどあればご指摘いただけると幸いです。
データサイエンスの新着情報を収集するために使っているサービスたち

この記事はZOZOテクノロジーズ #4 Advent Calendar 2019 24日目の記事です。
昨日は @maoyama さんの[「SwiftUIでgit-blame-pr.plをMacアプリにしてみた」](https://qiita.com/maoyama/items/fd1bb60e47ddea111518)でした。

# はじめに
こんにちは。ZOZOテクノロジーズ ZOZO Researchの後藤（[@Ryosuke0624](https://twitter.com/Ryosuke0624)）です。本記事では、私がデータサイエンスの新しい話題をキャッチアップするために、日常的に実践している情報収集の方法を述べたいと思います。


## メールマガジン
データサイエンスや機械学習のジェネラルなニュースは、メールマガジンの購読によりカバーしています。

### Weekly Machine Learning
https://www.getrevue.co/profile/icoxfog417
週1回の頻度で届くメールマガジンです。その週に話題になった機械学習に関するニュースが、短い紹介文とともにまとめられています。1週間に登場する機械学習に関するニュースは膨大ですが、企業で機械学習を実践している方によるフィルターにより、難なく追える程度の分量に厳選されているのが有り難いです。

<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309434/45bd4e21-800e-127a-dd57-727d6fcf11af.png">




### The Batch
https://www.deeplearning.ai/thebatch/
週1回の頻度で届く、トップAI研究者のAndrew Ngさんによるメールマガジンです。その週の厳選されたAI関連のニュースがNgさんの感想とともに紹介されます。

<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309434/a1bdb09b-d1ff-7e56-9be1-65e70d72a5a7.png">


## Google Alerts
https://www.google.com/alerts
Google Alertsは、関心のあるキーワードを登録すると、そのキーワードに関連する最新のニュースを通知してくれるサービスです。一例ですが、現在開発を進めている機械学習システムに関連するキーワードを登録することで、テックベンチャーのPRTIMESの投稿や競合の動向などをキャッチしています。広い話題を扱わざるを得ないメールマガジンではカバーできない、狭い話題をカバーするのに有用なツールです。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309434/afefcb67-447c-6b21-1cf2-98a6b0ce27f3.png">


## Google アプリのニュース推薦
https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox
アプリ版のGoogleです。このアプリ内では閲覧履歴に基づいたニュースが推薦されます。推薦される内容は都度変わりますが、私の場合は「データサイエンス」、「クラウドコンピューティング」、「ファッションテック」、「テックベンチャー」に関する話題が多いようです。日常的には追わないメディアの、興味深い記事がピンポイントで推薦されることがあり、面白い発見が多いアプリです。


<img width="400" alt="image.png" src="https://paper-attachments.dropbox.com/s_A74AEA9416C43B6A9E6CABDCC7AB0D4B27D9A5770187DC68424DFA12B8DAEB98_1574326138823_Screenshot_20191121_174618_com.huawei.android.launcher.jpg">


## Google Scholarの「おすすめの論文」
https://scholar.google.com/
Google Scholarは学術論文の検索サービスです。このサービスの「おすすめの論文」モジュールでは、自分が過去に執筆した論文やお気に入りに登録した論文を元にGoogle Scholarが新着の関連論文を推薦してくれます。私は研究が本業というわけではないので、arXivを毎日チェックのではなく、「おすすめの論文」を眺めることでなるべく効率的に関連分野の動向を追うようにしています。

<img width="600" alt="image.png" src="https://paper-attachments.dropbox.com/s_A74AEA9416C43B6A9E6CABDCC7AB0D4B27D9A5770187DC68424DFA12B8DAEB98_1574325527032_image.png">



## Google Scholarの「アラート機能」
https://scholar.google.com/
Google Scholarのアラート機能です。キーワードを登録しておくと、キーワードを含む新着論文がメールで通知されます。著者を登録しておくと、その著者が書いた論文や引用された論文も通知されるので、自身の研究分野でトップの研究者を登録しておくと、関連分野の新着論文がバンバン届きます。例えば、私の場合「deepfashion」というファッションに関する研究で度々使われるデータセットの名前をキーワードとして登録しておくと、Precisionの高い結果が得られます。

<img width="600" alt="image.png" src="https://paper-attachments.dropbox.com/s_A74AEA9416C43B6A9E6CABDCC7AB0D4B27D9A5770187DC68424DFA12B8DAEB98_1574325596790_image.png">


# おわりに
情報収集のツールが確立していない方のお役に立てれば幸いです。
明日は @ararajp さんの担当です。お楽しみに！
【Lua】ぼくの失敗（エラー）【TIC-80】


# はじめに

皆さん、エラーは出していますか？
自分は1年少し前から「[TIC-80](https://tic.computer/)」で遊んでいますが、
ここ半年くらいで出したエラーを雑に集計してみました。

AdventCalender関係なしにクリスマスイブにこんな記事投稿するなんて
**人生のエラーが多い**んじゃないですかね？

- 環境は「**Lua5.3** in **TIC-80** 0.70.6」
- Lua(5.1)自体はAviUtlのスクリプトで少し触った経験あり
- TIC-80を触っているのは1年ちょい
- ここ半年間ほどで出したエラー

## attempt to index a nil value （61回）

直訳：nil値をインデックスしようとしました
意訳：nil値に対し添字やキーを指定している


```lua

tbl={
  {7, 8, 9},
  {4, 5, 6},
  {1, 2, 3}
}

print(tpl[2][2])
--> attempt to index a nil value (global 'tpl')
print(tbl[0][2])
--> attempt to index a nil value (field '?')

```

一つ目のようにテーブルの名前を間違えてもでますし、
二つ目のように `tbl[0]`が`nil`を返す場合でも前半は同じメッセージですね。

二次元フィールド上のパズルゲームや経路探索のプログラムを組んでいたので、
おおよそ二つ目の範囲外指定に近い形でのエラーだった思います。
というか別々に集計すべきでしたね、いきなりガバってますね、大丈夫か？

## [attempt] ～ a nil value （48回）

```
arithmetic on a nil value ～
concatenate a nil value ～
get length of a nil value ～
compare number with nil ～
call nil value ～
```

nil値に対する操作で index 以外をまとめました。
それぞれ`nil`に対し**算術演算**、**文字列連結**、**長さ取得**、**比較演算**をしようとしている（できないよ）

- 変数の初期化忘れ
- 単純なタイプミス

だいたいこの2つが原因（のはず）です。
そういえば（コルーチンの）スレッド内で`coroutine.yield()`と書くべきところを
`coroutine.yeild()`とタイプミスしても`call nil value`のエラーを出してくれなかった気がします。


## ～ expected near ～　（16回）
```
'end' expected near ～
')' expected near ～
']' expected near ～
```
`end`、`)`、`]`が～の近くに期待されています（ないとおかしいよ！）
ブロックや括弧の閉じ忘れですね。

## syntax error near ～ （18回）

```
syntax error near ～
unexpected symbol near ～
'then' expected near ～
```
～の近くに文法エラー
～の近くに期待されないシンボルがある
～の近くに`then`が期待される（ないとおかしいよ）

ここら辺はまとめて初歩的な文法誤り（記述漏れやタイプミス）


## invarid param～　, bad argument ～ （15回）

不正なパラメーター、引数

関数の引数の指定のミスですね。
ホストプログラム（ここではTIC-80）が用意したAPI（前者？）や
標準ライブラリ（後者？）などは引数が不正ならこのようなメッセージを出してくれる。

## 'for' limit must be a number ～ （2回）

for の制限は数値でなければならない

はい。


## attempt to call ～ （4回）

```
attempt call a table value （7回）
```
テーブルを（関数）呼び出ししようとした（できないよ）

関数でないものに対し関数呼び出しをしようとするとこのメッセージですね。
`for n,v in ipairs(tbl) do`と書くべき所で、
`ipairs`を忘れると後者のメッセージになります。

これも別集計すべきだったのではないでしょうかねぇ。

## attempt to arithmetic on a table value ～
テーブルに対して算術演算をしようとしてるよ

## cannot resume dead coroutine  （8回）

死んだ（終了した）コルーチンは再開できません。

ステージクリア演出をコルーチンで書いていたときのエラーだったと思います。
最後を何か入力あるまで待つ無限ルーチン（1フレームごとにyield）にしたんだったかな。
コルーチンを最初からしたい場合は定義しなおす必要があるんでしょうか？

Lua5.4ではコルーチンにリセット機能が追加されるっぽい？

# まとめ

他にもちょこちょこあった気がしますがこの辺で。
めっちゃ雑な集計ですみません。
テーブル周りは多いですね。縦横ループするマップでのA*アルゴリズム経路探索など
分不相応なものにも手を出してたりしたので。ちゃんと考えてから書けば少しはましになる‥‥はず。

その他は初歩的なものばっかりです。まるで成長していない‥。

みなさんはどんなエラーをどれくらいの頻度で出してるのでしょうか？
興味あります！
Maplat UIでPOIを表示する

Maplat Advent Calendarですが、24日目はUI付きのMaplatでPOIを設定してみましょう。
今日の動くものはこちらです。実はバグが判明しましたが... => [Maplat Advent Calendar Day 24](https://codesandbox.io/s/maplat-advent-calendar-day24-l3jpb)

Maplat UIでも、基本はアプリ設定ファイル中の`pois`設定でPOIの定義ファイルを指定するのは変わりません。

```maplat_ac_day24.json
{
  "app_name": "Maplat Advent Calendar Day24",
  "home_position": [139.5321, 36.249302],
  "default_zoom": 17,
  "start_from": "tatebayashi_ojozu",
  "sources": [
    {
      "mapID": "tatebayashi_ojozu",
      "label": "綱吉時代",
      "setting_file": "https://s.maplat.jp/r/tatebayashimap/maps/tatebayashi_ojozu.json"
    },
    {
      "mapID": "tatebayashi_castle_akimoto",
      "label": "秋元時代",
      "setting_file": "https://s.maplat.jp/r/tatebayashimap/maps/tatebayashi_castle_akimoto.json"
    },
    "osm",
    "gsi"
  ],
  "pois": "pois/pois.json"
}
```
そして、指定された先の`pois/pois.json`の中で、POIの設定をします。
これも、基本はMaplat Coreの場合と変わりませんが、Maplat Coreと違いMaplat UIはPOIをクリックなどした際の既定の処理（具体的には情報ポップアップの表示）が走りますので、そこに表示すべき情報を設定する必要があります。

```pois/pois.json
{
  "main": {
    "pois": [
      {
        "id": "castle",
        "lat": 36.243881,
        "lng": 139.543517,
        "name": "館林城",
        "url": "https://ja.m.wikipedia.org/wiki/%E9%A4%A8%E6%9E%97%E5%9F%8E",
        "icon": "parts/blue_marker.png",
        "selected_icon": "parts/red_marker.png"
      },
      {
        "id": "shrine",
        "lat": 36.25163,
        "lng": 139.528562,
        "name": "愛宕神社",
        "html": "<html><body><div class=\"poi_data\"><p class=\"col-xs-12 poi_img\"><img class=\"poi_img_tag\" src=\"img/atago_shrine.jpg\"></p><p class=\"recipient poi_address\">群馬県館林市西本町9-9</p><p class=\"recipient poi_desc\"><b>梢から火を吹き老杉を守ろうとした不思議の社</b><br>役行者創建と伝わる古い神社で、江戸期は市中の総鎮守と定められて城主の手厚い保護を受けたといいます。ところが明治を過ぎると藩の庇護もなくなり、社殿も荒れ果てました。なんとか費用を工面し社を修理したいと思う神主に、悪徳商人がつけこみます。境内に十数本生えていた樹齢数百年の巨杉を二束三文で買い取り一儲けしようとしたのです。ところがいざ伐採しようとするとにわかに突風が巻き起こり、杉の梢が火を吹き始め、その火が神主の居宅に燃え移り全焼してしまいました。幸い梢は2、3本が焼けただけでしたが、この不思議を見た信徒たちは伐採中止を求め、老杉は難を逃れました。残念ながらその後、公害で老杉は枯れてしまい、今は1本も残っていません。<br><br>参考: 『館林・邑楽の民話と伝説』川島維知著</p></div></body></html>"
      }
    ]
  }
}
```
`name`は、オープンしたダイアログのタイトルとして使われます。
`url`、`html`などはコンテンツとして何を表示するかを設定します。
`url`の場合は、ダイアログの中でそのURLを`IFRAME`の中で開きます。
`html`の場合は、そのHTML記述を`IFRAME`の中で開きます。

動作の感じはこんな感じになりますが、バグを見つけてしまいました。
![Maplat UIでPOI](https://t.tilemap.jp/maplat/ui_with_poi.gif)
まず、館林城のPOIをクリックすると館林城のWikipediaが表示されています。
続いて愛宕神社のPOIをクリックすると、対応したコンテンツが表示されています。
そこで館林城に戻ると...タイトルは館林城なのに、なぜか愛宕神社のコンテンツのままです。
まあ、日々成長中のライブラリなのでこういうこともあります。
利用して問題があれば、イシューをレポートいただければ華僑雨滴速やかに対処します。
今回のイシューも既に事故レポートしました。 => [こちら](https://github.com/code4history/Maplat/issues/170)

さて、明日はいよいよ最終日。
多言語化対応みたいな技術ネタをもう一つやるか、それともまとめとして文章ネタにするか悩んでいます。
Microsoft Learn 23日目

12月は、毎日 [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/) を受講していこうという記録。
※受講後に書き込むので公開に間に合わないこと多々あります(アドベントカレンダーの意味ｗ)

12/23 は
**Core Cloud Services - Azure ネットワークオプション**
 - Azure Traffic Manager を使用して待ち時間を短縮する

を受講。以下、簡易メモ。

# Core Cloud Services - Azure ネットワークオプション
## Azure Traffic Manager を使用して待ち時間を短縮する
### ネットワーク待ち時間とは
ネットワーク経由でデータが送信されるのにかかる時間を指す。
通常、待ち時間はミリ秒単位で測定される。

### 異なるリージョンへのスケールアウト
データセンターを構築するコストは、機器のコストだけではない。
電源、冷却装置、および各場所でシステムを常に稼働させるための人員を提供する必要がある。
データセンター全体をレプリケートするには、多額のコストがかかる場合がある。
だが、Azure では既に機器と人員が用意されている。
待ち時間を短縮する1つの方法は、サービスの正確なコピーを複数のリージョンに提供すること。

### Traffic Manager を使用して最も近いエンドポイントにユーザーをルーティングする
Traffic Manager はユーザーに最も近い DNS サーバーを使用して、ユーザートラフィックを世界中に分散されたエンドポイントに送信する。
クライアントとサーバー間を通過するトラフィックを認識することはなく、 代わりにクライアントの Web ブラウザーを優先エンドポイントに送信する。
SPRESENSEのLTE拡張ボードをビッグローブSIMでお試し

#SPRESENSEのLTE(Cat-M1)拡張ボードをお試し
##準備
SPRESENSEのLTE拡張ボード（CXD5602PWBLM1）が発売されました。
動作検証のSIMがまだあまりないので、手持ちのMVNOのSIMを試してみました。

- SPRESENSEメインボード
- LTE拡張ボード
- BIGLOBE SIM（タイプD、タイプA）

##テスト
LTE拡張ボードにBIGLOBEのSIMを入れ、
[SPRESENSEのチュートリアル](https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html#_tutorial_lte)を参考にプログラムを書き込みます。

// APN data
\#define LTE_APN       "apn"      // replace your APN
\#define LTE_USER_NAME "user"     // replace with your username
\#define LTE_PASSWORD  "password" // replace with your password

の部分を

// APN data
\#define LTE_APN       "biglobe.jp"      // replace your APN
\#define LTE_USER_NAME "user"     // replace with your username
\#define LTE_PASSWORD  "0000" // replace with your password

に変更するだけです。
ビッグローブのタイプD、タイプAのどちらのSIMもAPNは同一です。
プログラムを書き込み、実行すると、普通につながりました。
Cat-M1は専用のSIMが必要なのかと思いこんでいたので、普通のMVNOのSIMで動作確認取れたのは良かった。

**注意点として、メインボードのUSBをMacにつなげただけでは電源が足りず、LTEボードのUSBコネクタにも別途電源供給が必要でした**
![IMG_0917.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142851/b8797717-1117-86ca-ed6a-68d1619f60cc.jpeg)
一人寂しくクリスマスを過ごすデベロッパーに捧げます

クリスマスを楽しく過ごすために作りました！
30分くらいで作れました！
GitHub Pages 便利だなー

## 作ったもの
https://tanikento.github.io/xmas/
![xmas.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325018/e51dfc66-b496-e496-2199-76f43b19f21d.png)

## 手順
1. https://tanikento.github.io/xmas/ を開く
2. Chrome DevTools を開く
3. 「Push!」ボタンを押す

こんなことをしている私はクリスマスも一人で楽しくプログラミング！
では楽しいクリスマスを！笑

## 参考
[貴方はいくつ知っている？あまり知られていない便利なChrome DevToolsの機能まとめ](https://qiita.com/HayatoKamono/items/86e55a17b69f8b020010)
VBAの関数型風プログラミング用のライブラリを書いた

### ライブラリを触ってみようという方へ
VBA-Functional という関数型プログラミング用のライブラリを [github](https://github.com/mnru/VBA-Functional) にあげたのですが、説明分をほとんど書けていません。なので興味を持ってくださる方は、modTestモジュール内の関数を直接触ってもらったほうが雰囲気がわかると思います。全体的にToy Programmingっぽいですが、modUtilにあるprintAryやprintTimeあたりが実用性が高いと思うので、試してもらえるとうれしいです。

このライブラリには関数プログラミングと配列の操作の機能がありますが、今日は関数プログラミング的な部分を書こうと思います。

#### ライブラリの関数の命名法

まず関数名は語尾で区分けをしているので表にしておきます。
関数オブジェクトというのは僕が勝手に作った言葉なので、後で説明します。

|語尾|種類|
|---:|:--|
|～Ary| 配列用関数|
| ～A | 関数型プログラミング用関数|
| ～F | 特に関数オブジェクトを引数とする関数|
| ～Fs |特に関数オブジェクトの配列を引数とする関数|


#### 定番関数のmapAを中心とした説明

以下[ ]は配列、" "は文字列を意味します。

関数型風なプログラミングの実現には、ExcelのメソッドApplication.Runが活躍しています。これは、他のマクロを呼び出すメソッドで　
```Application.Run("fn0",arg1,arg2,arg3)->fn0(arg1,arg2,arg3)```
のようにマクロ名と30個までのパラメータを引数をとります。マクロは関数のようなものだから、関数を引数にとる高階関数とみなせます。
関数型プログラミングの定番であるmap,filter,foldLeft,reduceLeftもApplication.Runを利用して、mapA,filterA,foldA,reduceAという名前で定義しました。
addOneを数を一つ足す関数とすると、mapAは
```mapA("addOne",[1,2,3])->[addOne(1),addOne(2),add(3)]->[2,3,4]```
のように計算します。
mapは通常、一変数の関数と配列を引数にとりますが、、mapAは、さらにパラメータをとれるように拡張しています。また、演算子やVBAの組込みの関数は、マクロではないため、そのままではmapAに使うことができません。そこで

```VisualBasic:
 Function calc_(num1, num2, symbol As String)
    Dim ret
    Select Case symbol
        Case "+": ret = num1 + num2
        Case "-": ret = num1 - num2
        Case "*": ret = num1 * num2
        Case "/": ret = num1 / num2
        Case "\": ret = num1 \ num2
        Case "%": ret = num1 Mod num2
        Case "^": ret = num1 ^ num2
        Case Else
    End Select
    calc_ = ret
    End Function
```

のように、通常では関数名に使えない記号をパラメータにとって計算できるcalc_というマクロを作りました。
これを使うと、
```mapA("calc_",[1,2,3],1,"+")->[2,3,4]```
といった計算がaddOneのようなその場しのぎの関数を作らなくてもいいので、いろいろ
気楽に試してもらえると思います。
filterA,foldA,reduceAも同様な拡張をしています。
また今のところfoldRiget,reduceRightには対応していません。
配列の関数にrevAryを用意しているので、組み合わせて使ってください。

#### 部分適用と関数の合成の実現


既存の関数から新しい関数を作る部分適用や関数の合成も実現したいところです。
まず、先頭が関数名の配列を計算するevalA定義しました。
```evalA(["fn0",arg1,arg2,arg3])->fn0(arg1,arg2,arg3)```
配列の要素を順にApplication.Runに渡しているだけですが、関数名を先頭とする配列を操作することが、関数を操作することになるので、部分適用や関数の合成を考えやすくなります。


```1)     [[1,2],["calc_",Null,Null,"/"]
2)       [[2,1],["calc_",Null,Null,"/"]
3)       [[2]["calc_",1,Null,"/"]]
``` 
1式は通常の割り算、2式は1番目と2番目の引数を入れ替えたもの、3式は1番目の引数に１を代入して1変数関数にしたもの表しています。こういった配列を僕の勝手な用語で関数オブジェクトと呼んでいます。

また　2式　はArray関数を使って書くと
```Array(Array(2,1),Array("calc_",Null,Null,"/"))```
のように結構大変になるので
```mkF(2,1,"calc_",Null,Null,"/")```
のようにisnumeric関数を使って関数名の前にある数字を識別して関数オブジェクトを作る関数mkFも定義しました。
ここまで準備できれば、二つの数の組[2,4]を2式に関数オブジェクト前半の示す数字の位置に従って後半の未完成な式に代入し、その数列をevalAすれば計算できます。
実際にそれを行う関数をapplyFとして定義しました。
```applyF(Array(2,4),mkF(2,1,"calc_",Null,Null,"/"),true) -> 2```
(式の最後のtrueは配列をばらして2か所に代入するように指示するオプションです)


また同様に
```4)    
 [
          [[1],["calc_",Null,1,"+"]],
          [[1],["calc_",Null,2,"*"]]
          ]```
4式は、1を足す関数と2をかける関数を並べた配列で、この二つの関数を合成した関数を表しています。この計算は順次計算結果を次の関数オブジェクト代入することで得られるので、applyFsを定義することができます。
```applyFs(2,Array(mkF(1,"calc_",Null,1,"+"),mkF(1,"calc_",Null,2,"*")),false) -> 6```

こんな感じで原始的ですが、関数オブジェクトを使って部分適用や関数の合成を実現しています。また、filterA,mapA,foldA,reduceAはパラメータをとれるように拡張しているので、applyF,applyFsとともに部分適用関数、合成関数に対して使うことができます。

やっていることのわりに説明が長くなってしまいました。いろいろ遊んでもらえると嬉しいです。
プログラミング未経験者向け Julia本を誉めてみる


[Julia Advent calendar 2019](https://qiita.com/advent-calendar/2019/julialang) の 16 日目です。 投稿したは 12/24 です。
プログラミング未経験者向け Julia本を、いくつか紹介します。

# Tanmay teaches Julia for beginners

11月末に刊行されたプログラミング未経験者向けの Julia 本（英語）の新刊を入手しました。これです。

* "Tanmay Teaches Julia for Beginners: A Springboard to Machine Learning for All Ages, Tanmay Bakshi
    * [McGrawHill Higher education]
(htps://www.mheducation.co.uk/tanmay-teaches-julia-for-beginners-a-springboard-to-machine-learning-for-all-ages-9781260456639-emea)
    * [amazon](https://www.amazon.com/Tanmay-Teaches-Julia-Beginners-Springboard/dp/1260456633)
    * Youtube の CM → [Tanmay Teaches Julia](https://www.youtube.com/watch?v=1XVGTyX9en4)


タイトル冒頭の Tanmay は、著者の Tanmay Bakshi さんです。13歳のときに IBM Watson 上へ [AskTanmay](https://github.com/tanmayb123/AskTanmay-NLQA-System-) を実装したとして有名になりましたね。
書籍の裏表紙にある "Why should I learn Julia as my first programming language" の問いがよいですね。答えは、「プログラミングの考え方もコーディングも学べて、AI/MLに最も近い先進言語がJuliaです」。

前書きは、Julia Computing の共同創立者かつ CEO の Viral B. Shah さん（Julia のドキュメントに PR すると mergeしてくれる人です）が、計算性能と抽象的表現力を同時に実現するという Julia のコンセプトを強調しています。
この書籍は、プログラミングに全く未経験な人向け（”no prior experience required”）を謳っていて、プログラムを書くとは、デジタルとは、ファイルやインターネットとはなどの説明と、プログラミングが交差するような流れになっています。
目次の項目は、上の amazon のリンクを参照してください。キーボードから文字列を受け取って、数字に変換したり、条件分岐したり、繰り返したりなど、具体的な例でプログラムを解説します。簡単なデータベースを作るために、ベクトル（1次元配列）と辞書型（Dict）を導入するというのも、いい方法だと思いました。
最後の節は、副題の 「A Springboard to Machine Learning （機械学習入門への踏み台）」として、Flux を用いた顔認識 (Zygoteに収集済の)の実行例が紹介されます。実行方法と結果の画像があるだけですが、簡単に実行できそうな雰囲気を醸し出しています。
元気で明快な文章も気に入りました。YouTube の自信に満ちたプレゼンと好一対です。
四則演算以外の計算はありません。多重ディスパッチも型注釈もありません。200ページ弱の小ぶりな書籍ですが、プログラミングの導入本として推薦します。 
（Youtube のリンクに、購入した書籍が写った顔写真を送ると、個人レッスンが受けられるみたいなリンクがあります。早速応募しました。楽しみです）

# Think Julia: How to Think Like a Computer Scientist

さて、昨年 2018 年は Julia 1.0 がリリースされ、言語仕様が固まってきた印象があります。それまでの Julia 書籍のほとんどは、プログラミング経験者向けだったと思いますが、初めてのプログラミング言語としての Julia 解説も準備すべき好機でしょう。
本年 2019年 5月に刊行された↓の書籍は、その端緒でした。

* Think Julia: How to Think Like a Computer Scientist, Ben Lauwens, Allen Downey
    * 英語原文 [github io](https://benlauwens.github.io/ThinkJulia.jl/latest/book.html)
    * [O'Reilly Media](http://shop.oreilly.com/product/0636920215707.do)
    
こちらはネットで原文を読めます。多重ディスパッチ、パラメトリック型など、Julia の概念用語の解説を含めた大著です。ユニットテストなども扱っていて、ソフトウエア工学を志向する人向けの内容だと思います。（日本語訳も進行中と聞きました。）

# Cookbook

今年刊行された Julia プログラミングクックブックもよい本と思います。

* Julia プログラミングクックブック、Bogumił Kamiński、Przemysław Szufel、中田 秀基 訳
    * [O'Reilly Japan](https://www.oreilly.co.jp/books/9784873118895)
    * 英語原著 [Packt publishing](https://www.packtpub.com/application-development/julia-10-programming-cookbook)

プログラミング経験者向けと思います。howto 集なので、自分のやりたいことと合致するかどうかで満足度が変わるでしょうね。

# 終わりに

技術書典や技術書博でも、Julia 本が増えてきました。色々な側面から解説が増えるとよいですね。
12月24日 クリスマスイブも、あと1時間で終わります。
Railsアプリ、EC2の本番環境でMySQLを直接いじる方法

自分の作ったアプリを本番環境で起動させた時に、エラーが出てしまうことはあると思います。
currentフォルダ内のlogを見て、エラーを発見したとしても、それがMySQLのエラーだと直接コマンド打たないと行けないので、修正が結構めんどくさいんですよね！

そこで、よく使うMySQLのコマンドをまとめました！


##ログイン

```
$ mysql -u root -p
Enter password: パスワードを入力（実際に文字は見えません）
```

##データベースの確認
```
show databases;
```
以下のように出てきます

```
+----------------------------------+
| Database                         |
+----------------------------------+
| information_schema               |
| xxxxxxxxxxxxxxxxxx|
| mysql                            |
| performance_schema               |
+----------------------------------+
```

##いじるデータベースの選択
上のコマンドで確認したものの中から選びます

```
use データベース名;
```
これが出ればOKです

```
Database changed
```

##テーブル一覧表示
```
show tables;
```
##データの検索

とりあえずテーブルの中身を全部見たい場合は

```
SELECT * FROM テーブル名;
```
##データの削除
僕がよく使うのはこれ、とりあえずエラー引き起こすデータは消してしまえ精神

```
DELETE FROM テーブル名 WHERE id = 数字;
```

##補足
この方法はあくまで、直接いじらないと直せないエラーなどを解決する方法です！
Railsの場合は、カラムの追加やテーブルの新規作成などは
マイグレーションファイルを使っていつものようにやれば大丈夫です。
Maplat UIを使いつつ、Maplat CoreのAPI操作を行う方法

後ほんの数日なのに急速にやる気が落ちてきているMaplat Advent Calendarです。
やる気がなくなっているというよりは、終わりが見えてきたので燃え尽き症候群気味なのと、Maplatの先の開発に取り掛かりたくてうずうずしているといったところです。
が、でもあと1時間以内に記事あげればなんとか1日遅れで済ませられるので、なんとか23日目やっていきましょう。

今日はUI付きのMaplatを使いつつ、APIを使った制御も行ってみましょう。
今日の動くものはこちらで確認できます。 => [Maplat Advent Calendar Day 23](https://codesandbox.io/s/maplat-advent-calendar-day23-lu9be)

いや、正直別に難しくないですね。
Maplat UIを使う時、

```MaplatUIのオブジェクト生成.
var app = new MaplatUi(option);
app.waitReady.then(function() {
});
```
こんな感じでMaplat UIのオブジェクトを生成しますが、実はこのMaplat UIオブジェクト`app`に対し、`app.core`にMaplat Coreオブジェクトが入っているのです。
なので、この`app.core`にAdvent Calendarの前半で説明したAPIを実行してやれば、普通にAPI制御できます。

なので、以下のような感じでHTMLにボタンを追加し、`app.js`内で`app.core.changeMap`で地図を切り替えてやれば、外部から地図が切り替えられますね。

```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Maplat Advent Calendar Day 23</title>
    <link rel="stylesheet" href="app.css" />
  </head>
  <body>
    <div class="mainview">
      <div id="map_div"></div>
    </div>
    <div class="button">
      <button id="gsi">GSI</button>
      <button id="osm">OSM</button>
      <button id="ojo">御城図</button>
      <button id="aki">秋元</button>
    </div>
  </body>
  <script src="app.js"></script>
</html>
```

```app.css
.mainview {
  position: absolute;
  top: 5%;
  bottom: 5%;
  left: 5%;
  right: 5%;
}
.button {
  position: absolute;
  top: 95%;
  bottom: 0%;
  left: 5%;
  right: 5%;
}
```

```app.js
import "@maplat/ui/dist/maplat.css";
import { MaplatUi } from "@maplat/ui";

var option = {
  appid: "maplat_ac_day23"
};

var app = new MaplatUi(option);
app.waitReady.then(function() {
  document.getElementById("gsi").addEventListener("click", function(e) {
    app.core.changeMap("gsi");
  });
  document.getElementById("osm").addEventListener("click", function(e) {
    app.core.changeMap("osm");
  });
  document.getElementById("ojo").addEventListener("click", function(e) {
    app.core.changeMap("tatebayashi_ojozu");
  });
  document.getElementById("aki").addEventListener("click", function(e) {
    app.core.changeMap("tatebayashi_castle_akimoto");
  });
});
```
動作は以下のような感じですね。
![Maplat UIをAPI制御](https://t.tilemap.jp/maplat/ui_with_api.gif)
何気に、ボタン側で制御してもちゃんとUI側の地図の選択状況も更新されてるのがわかってもらえると思います。

明日は、Maplat UIでPOIを加える方法を説明したいと思います。
CSM(認定スクラムマスター)研修　感想戦　3日目

## このページについて

Scrum Allianceの公認研修である認定スクラムマスター研修に行ってきました。
全3日制。その3日目で得た学びをまとめたものです。

※[3日通しての総括編はこちら](https://qiita.com/ketman55/items/3b17d8e933a40d6f1b17)
※以下は全て個人の理解/感想であり、内容に誤りを含む可能性があります。悪しからず。

## アジェンダ

 * 半分はアジャイル開発宣言、スクラムガイドに基づくQ&A（グループ討論）
 * もう半分はボードゲーム製作を題材にしたスクラム体験

以下、個別のメモ

## プロダクトオーナーの責任

 * バックログの管理の他に、「プロダクトのビジョンを示すこと」も大切
  
## 「直感」で見積もる事に真剣になる

【見積もりは難しい】

 * アジャイルでは不確実性を前提としており、どこまで考えても正解には辿り着かない
 * 見積もりの当てにならなさは何度も証明されてきたそうだ
  * 同じ内容の資料について、文字の大きさを変えて渡すと、文字が大きい(＝紙の数が多くなる)資料の方が見積もりが高くなる
  * 要求が5つ書いてある資料と、要求が6つ書いてあり1つが斜線で取り消された資料を渡すと、後者の方が見積もりが高くなる

【開発者が見積もる意義】

 * 最も信頼出来る直感を持つ人たち ＝ 開発メンバ
 * 開発者が自分たちで決めた（彼らに権限を委譲した）という事実も重要になる
 * これによって、彼らがベストを尽くすことにコミット出来る環境が整う

【その他】

 * POは見積もりには参加しないが、その場には居た方が良い
 * アンカリング（他人につられる）ため、いっせーのせで見積もろう
 * 開発者間の認識相違を無くすことが見積もりの最も重要な要素
 * 最初はあえてSとXLだけのカードで見積もるのも手（有用でした！）

## スクラムマスターの役割

 * 最初はスクラムチームの導入支援
 * 次第に組織を変えていくことに役割が移っていく
 * 次第にスクラムマスターはスクラムチームからフェードアウトしていく

## スクラムマスターの活動をどうやって評価するか？

 * [スクラムマスターズチェックリスト](https://scrummasterchecklist.org/)で確認することが出来る
 * ただし、スクラムチームの理解度（実力の何％を出せたか）を測るものであり、スクラムチームの成果（提供出来た価値の総量）とは切り離して考えるべきだ。という議論になった（受講生内で）。

## スプリントレビュー

 * デモでは開発者から多くを説明しないほうが良い（素直な評価を阻害する）
 * プロダクトバックログアイテムが完了したかどうかは、POと開発チームが協力して判断する
  * 設計書や自動テストなども含まれるため、POやステークホルダだけでは判断できない
 * デモの参加者からのフィードバックをプロダクトバックログへ組み込む
 * 完了しなかったアイテムもプロダクトバックログへ戻す
  * ただし、優先順位が依然として最上位とは限らない
  * フィードバックも含め、POはこれらの優先順位を最新化する

## レトロスペクティブ

 * スプリントレビューはWhat（モノ）のカイゼンを図ることに対して、スプリントレトロスペクティブはHow（スクラムチーム）のカイゼンを図るもの
 * KPTも良いが、先ずはニュートラルにチームを観察し、沢山上げることを重視した方が良い

## その他の雑感（スクラム体験をやっての気づき）

 * 終わったのか微妙だけれど締めちゃおうのDone5つよりも、ちゃんと終わったと判断出来る1つのDoneの方が尊い
 * 余裕が無いとスプリントの最後の方でバタバタして品質を誤魔化したり、デモの準備が不十分になる危険がある
 * 開発者目線でバックログを並べるとログイン機能などが上の方に来がちだが、もっとコアな機能(注文機能とか)が上に来るべきである
  * プロダクトがユーザの欲しいものかどうか（価値あるものかどうか）はコア機能ほど判断しやすい

## リンク

 * [総括編](https://qiita.com/ketman55/items/3b17d8e933a40d6f1b17)
 * [1日目（基本姿勢編）](https://qiita.com/ketman55/private/f357b056606535b8ddf5)
 * [2日目（大規模スクラム編）](https://qiita.com/ketman55/private/ff7d08e1b8cdc96e3349)
 * [3日目（実践編）](https://qiita.com/ketman55/private/f22903306ed7ae10d5e4)
【画像処理100本ノックに挑戦】Q.30. アフィン変換(回転)

# 使用したライブラリ
[【画像処理100本ノック】独自の画像入出力クラスを作る](https://qiita.com/jajagacchi/items/834e8425b84f94df8a49)
[【画像処理100本ノックに挑戦】独自の行列クラスを作る](https://qiita.com/jajagacchi/items/df881888ee6a116f7730)

# Q.30. アフィン変換(回転)
>(1)アフィン変換を用いて、反時計方向に30度回転させよ。
(2) アフィン変換を用いて、反時計方向に30度回転した画像で中心座標を固定することで、なるべく黒い領域がなくなるように画像を作成せよ。 （ただし、単純なアフィン変換を行うと画像が切れてしまうので、工夫を要する。）

そんなに難しくないです。コードはひどいですが。

```c++
int main()
{
	const double pi = 3.141592653589793;
	double theta = -pi / 6.;
	PPM ppm("imori.pnm");
	int width = ppm.Get_width();
	int height = ppm.Get_height();
	double a=cos(theta), b=-sin(theta), c=sin(theta), d=cos(theta), tx=0, ty=0;


	Matrix A(2, 2);
	A.set({
		d/(a*d-b*c),-b/(a*d-b*c),
		-c / (a * d - b * c),a / (a * d - b * c)
		});
	
	Matrix X2(2);
	X2.set({
		(double)width/2.,
		(double)height/2.
		});
	Matrix X0 = A * X2;
	tx =-(width/2- X0(0, 0));// -tx;
	ty =-(height/2- X0(1, 0));


	int Width = width;
	int Height = height;
	PPM ppm2(Width, Height);
	for(int i=0; i<Width; i++)
		for (int j = 0; j < Height; j++)
		{
			ppm2(i, j, 'r') = 0;
			ppm2(i, j, 'g') = 0;
			ppm2(i, j, 'b') = 0;
		}
	for(int i=0; i<Width; i++)
		for (int j = 0; j < Height; j++)
		{
			Matrix X2(2);
			X2.set({
				(double)i,
				(double)j
				});
			Matrix X0 = A * X2;
			int i0= X0(0, 0)-tx;
			int j0 = X0(1, 0)-ty;
			if (0 <= i0 && i0 < width && 0 <= j0 && j0 < height)
			{
				ppm2(i, j, 'r') = ppm(i0, j0, 'r');
				ppm2(i, j, 'g') = ppm(i0, j0, 'g');
				ppm2(i, j, 'b') = ppm(i0, j0, 'b');
			}
		}
	
	ppm2.Flush("out.ppm");
	return 0;
}
```

![imori.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/3bc5386d-7b8e-207d-64d2-8ef15b57b1a4.png) ![out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/4de63e9c-0b11-f361-053f-915de3597ce1.png) ![out2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/05cf3ffa-0fa8-962d-7a6e-914b83679db2.png)
DonkeyCar 車上のラズパイでカメラ画像の静止画ファイルから動画を生成する

#ffmpegのインストール
$ sudo apt-get install ffmpeg
#keras-visのインストール
$ pip install git+https://github.com/autorope/keras-vis.git
#動画生成コマンド
~/mycar にて
$ donkey makemovie --tub 静止画ファイルのフォルダ名 --out ./movie.mp4
#salient動画生成コマンド
負荷が大きいので範囲を指定する
$ donkey makemovie --tub 静止画ファイルのフォルダ名 --out ./movie.mp4 --type linear --salient --model ./models/mypilot.h5 --start 1 --end 100
#動画ファイルをPCに転送して再生
rsync,WinSCp等のファイル転送ツールを使用してPCに転送しPCで再生する．
PowerShellでkubectlの結果をjqで整形するまで

# これは何

KubernetesのNodeのTaintsだけをバーッと見たいけど現時点では良いコマンドが無いので、`jq`で`kubectl describe node`から整形する。
WindowsのPowerShellで実現したい。

# 全体

1. PowerShellで`chocolatey`をインストールする
1. `chocolatey`で`jq`をインストールする
1. `kubectl describe node`の結果を`jq`で整形する

# PowerShellで`chocolatey`をインストールする

### PowerShellを管理者として実行
省略

### 公式サイトに従い`chocolatey`をインストールする

公式
https://chocolatey.org/install

Step2のindividualを参照

```
PS C:\WINDOWS\system32> Get-ExecutionPolicy
Restricted
```

「`Restricted`が返ってきた場合」の手順もあるので、従う

```
PS C:\WINDOWS\system32> Set-ExecutionPolicy AllSigned
```

```
PS C:\WINDOWS\system32> Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

これでインストール完了

### 動作確認

```
PS C:\WINDOWS\system32> choco
Chocolatey v0.10.15
Please run 'choco -?' or 'choco <command> -?' for help menu.
```

# `chocolatey`で`jq`をインストールする

### 公式サイトに従い`jq`をインストールする

公式
https://stedolan.github.io/jq/download/

```
PS C:\WINDOWS\system32> chocolatey install jq
```

### 動作確認

```
PS C:\WINDOWS\system32> jq
jq - commandline JSON processor [version 1.6]

Usage:  C:\ProgramData\chocolatey\lib\jq\tools\jq.exe [options] <jq filter> [file...]
        C:\ProgramData\chocolatey\lib\jq\tools\jq.exe [options] --args <jq filter> [strings...]
        C:\ProgramData\chocolatey\lib\jq\tools\jq.exe [options] --jsonargs <jq filter> [JSON_TEXTS...]

jq is a tool for processing JSON inputs, applying the given filter to
its JSON text inputs and producing the filter's results as JSON on
standard output.

The simplest filter is ., which copies jq's input to its output
unmodified (except for formatting, but note that IEEE754 is used
for number representation internally, with all that that implies).

For more advanced filters see the jq(1) manpage ("man jq")
and/or https://stedolan.github.io/jq

Example:

        $ echo '{"foo": 0}' | jq .
        {
                "foo": 0
        }

For a listing of options, use C:\ProgramData\chocolatey\lib\jq\tools\jq.exe --help.
```

# `kubectl describe node`の結果を`jq`で整形する

とりあえず各NodeのNode名とTaintsを表示してみる。

```
PS C:\WINDOWS\system32> kubectl get nodes -o json | jq ".items[]|{name:.metadata.name, taints:.spec.taints}"
{
  "name": "ip-10-0-1-174.us-east-2.compute.internal",
  "taints": null
}
{
  "name": "ip-10-0-54-134.us-east-2.compute.internal",
  "taints": [
    {
      "effect": "NoSchedule",
      "key": "dedicated",
      "value": "groupName"
    }
  ]
}
{
  "name": "ip-10-0-91-149.us-east-2.compute.internal",
  "taints": null
}
```

# おわり

taintsを取得するコマンドはなぜ無いのだろう。
Excelの列番号と数値の相互変換

Excelの列番号形式の文字列を作るときに、参考に[Apache POI](https://poi.apache.org/)の[CellReference#formatAsString](https://github.com/apache/poi/blob/REL_4_1_1/src/java/org/apache/poi/ss/util/CellReference.java#L489)（から呼ばれている[convertNumToColString](https://github.com/apache/poi/blob/REL_4_1_1/src/java/org/apache/poi/ss/util/CellReference.java#L456)）の実装を読んでみたら面白かったのでメモ。

---

Excelの列番号はAから始まり、A, B, C, ..., X, Y, Z, AA, AB, AC, ...のように増加していく。

この記号列に対して、配列の添え字っぽく0, 1, 2, ...と0から順に整数値を対応させていくと、

* A = 0
* B = 1
* ...
* Y = 24
* Z = 25
* AA = 26 = 26 * 1 + 0
* ...
* AZ = 51 = 26 * 1 + 25
* BA = 52 = 26 * 2 + 0
* BB = 53 = 26 * 2 + 1
* ...

となり、A〜Zで各桁を表現する26進数だと思うと、最下位の桁ではA, B, ...を0, 1, ...として扱い、それ以外の桁ではA, B, ...を1, 2, ...と扱うことになり統一感がない。

Apache POIの`CellReference#formatAsString`はこのようにはせず、対応する数値を1から始めることにして、

* A = 1
* B = 2
* ...
* Y = 25
* Z = 26
* AA = 27 = 26 * 1 + 1
* ...
* AZ = 52 = 26 * 1 + 26
* BA = 53 = 26 * 2 + 1
* BB = 54 = 26 * 2 + 2
* ...

として、各桁で文字の意味が同じになるようにしている。

あとは、0を表す文字がなく、ふつうの26進数とは桁上がりのタイミングがずれる（10<sub>26</sub>がZになったり、20<sub>26</sub>がAZになったりする）ことに注意すると、変換は以下のようになる（代入があると読みにくいのでSchemeで再帰で書き直した）。

```scheme
(define alphabets "ABCDEFGHIJKLMNOPQRSTUVWXYZ")

(define (integer->excel-column n)
  (define (f i)
    (string-ref alphabets (- i 1)))
  (let loop ((n n)
             (rs '()))
    (cond
     ((zero? n)
      (error "cannot represent as excel-column" n))
     ((<= 1 n 26)
      (list->string (cons (f n) rs)))
     (else
      (let-values (((q r) (quotient&remainder n 26)))
        (if (zero? r)
            (loop (- q 1) (cons (f 26) rs))
            (loop q (cons (f r) rs))))))))
```

逆変換は何も考えずに基数変換っぽく変換する。

```scheme
(define (excel-column->integer col)
  (string-fold (lambda (c knil)
                 (+ (string-index alphabets c)
                    1
                    (* knil 26)))
               0
               col))
```

0始まりの添字に変換したい場合は適当に変換前に+1したり変換後に-1したりすればよい。
ディレクトリの深淵を覗くとき、rmすると危ないのだ

<a href="https://qiita.com/advent-calendar/2019/yarakashi-production" target="_blank" rel="noopener">本番環境でやらかしちゃった人 Advent Calendar 2019</a>に触発され、聖夜に懺悔したい気持ちがダイマックスしたので投稿。

# 深淵を覗くとき...
落ちると危nｯｱｰｰｰｰｰ!!! となってしまったお話。

# 当時の現場
まだ仮想化環境の「カ」の字もなかった時代の出来事でした。
※「カ」の字はあったかも。そんぐらいの時代。

SES基盤メンとして、環境構築/保守に従事していた男がおったそうな。

とある環境構築が終わり、サービスイン直後のバタバタも落ち着き、馴染みの後輩君に保守を引き継いでいる日中の出来事でしたとさ。

# なにをした？
後輩：
「ライブラリ管理に渡す資料としてファイル構成見てるんですけど、変なとこに変なファイルあるんですよね。」

ワイ：
「どれや？(本番ssh接続ｶﾀｶﾀ...)
......ぁ、ゴミファイル残ってたか。ごめん消すね。（rmﾎﾟﾁｰ」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325245/e7197950-90cd-9659-946c-b69d62d1e902.png)

後輩：
「ん...警子ちゃんが！DBのフェイルオーバー走ってる...?」

ワイ：
「 :innocent: 」

## なにがおきた？
共有ディスク領域で、クラスタ監視しているファイルを削除してました。

幸い（というか当然だが）、無事にフェイルオーバーしてシステム影響は無かったのですが、お客さんへも通知が行っており、各方面からお叱り頂きました。
※すこし前に別環境で事故があり、ナーバスになっていた。

# 惨劇はなぜおこってしまったのか
ファイル名が`test~`みたいな名前で、自分がいまどこのDIRに居るか深く考えずrmしてしまいました。
ファイル名から、試験用のゴミファイルだと安直に判断してしまったんですね。

もちろん、設計では`test~`みたいなファイル名にはなっていなかった。
構築のドタバタで試験用設定がそのまま本番に。

設計も構築も確か自分。。

# 二度と惨劇を起こさないために
いろんな要因でバタバタしたプロジェクトでしたが、
安定して運用されている、平和になった時代にランボー(1st)は不要でした。

バックエンド開発がメイン業務となった今も度々、<ruby>メモリアルを反芻<rp>（</rp><rt>フラッシュバック</rt><rp>）</rp></ruby>し、テンションの切り替えに役立てています。

当時のプロパー勢の方々、ほんとにごめんなさいでした。
Azure Pipelines の通知を Teams で受け取る

さすが両方とも Microsoft が作ってくれたおかげか 3 Step で完成します。すごく簡単なので Azure Pipelines と Teams の組み合わせで開発しているチームはぜひ導入してください。

## Manual

### 1. Teams に Azure Pipelines App を追加する。

Teams の左下にある Apps から `Azure Pipelines` を `Add` または `Add to a team` します。

[![Image from Gyazo](https://i.gyazo.com/9ecb782df0fc7e2b9cb1616650ce5f72.png)](https://gyazo.com/9ecb782df0fc7e2b9cb1616650ce5f72)

この例では `Qiita > Azure Pipelines` という Channel に `Add to a team` しました。

[![Image from Gyazo](https://i.gyazo.com/b86f0540516eb281086efaaf9910af56.png)](https://gyazo.com/b86f0540516eb281086efaaf9910af56)

### 2. Teams 上に追加した Azure Pipelines に Sign in する。

Azure Pipelines Bot が追加されているので、 Bot 宛に `signin` を送ります。

[![Image from Gyazo](https://i.gyazo.com/449d366f86bcdd85da6de7ec5a5d1bb2.png)](https://gyazo.com/449d366f86bcdd85da6de7ec5a5d1bb2)

Bot がメッセージを返してくれるので `Sign in` を選択します。

[![Image from Gyazo](https://i.gyazo.com/68c39c3fa6f8db425a5ab11da192bdd4.png)](https://gyazo.com/68c39c3fa6f8db425a5ab11da192bdd4)

認証画面で自分のアカウントでサインインしたあと、資格情報を Accept したら完了です。

### 3. 通知を受け取りたい Azure Pipelines を設定する。

Bot の `subscribe` command に、通知を受け取りたい Pipelines の URL を送ります。

[![Image from Gyazo](https://i.gyazo.com/e5e3ce80357e4af4fd28d50f75e4d9d7.png)](https://gyazo.com/e5e3ce80357e4af4fd28d50f75e4d9d7)

認証情報や Pipelines の権限に問題がなければ、無事に設定が完了します。

[![Image from Gyazo](https://i.gyazo.com/4b7c4af4301d057320a5467cbdaf44f5.png)](https://gyazo.com/4b7c4af4301d057320a5467cbdaf44f5)

Pipelines の Build が完了すると Teams に通知が来ます。

[![Image from Gyazo](https://i.gyazo.com/2c2f1364f1f02c40e9ce23692385b6fb.png)](https://gyazo.com/2c2f1364f1f02c40e9ce23692385b6fb)
IDを使ったページ内リンクの作り方

# ページ内リンクってどうやるの？

## 目的
ページ内リンクの作り方が分かったため残すことにする

## やり方
1. リンク先になる見出しや文にid属性をつける
2. リンク元になる<a>タグのhrefに"リンク先id名"をつける

## 例
```
<a href="#contents">リンク元</a>
・
・
・
<div id="contents">
  <h2>リンク先はこちらです</h2>
</div>
```
webサイトの「URLを共有する」を実現するために使ったJavaScriptライブラリをまとめた

##前提(本質的には関係ないです)
- Spring Bootを利用したwebアプリケーションです。
- テンプレートエンジンはThymeleafを使用しています。
- HTMLは必要な部分のみ記載しています。
- jQueryを使用しています。

##QRコード作成
###qrcode-generator

https://cdnjs.com/libraries/qrcode-generator
https://www.npmjs.com/package/qrcode-generator

###具体例
```html:send_by_qr.html
<!-- ~~ -->
<div class="form-group offset-sm-3 col-sm-3" id="qrcode">
	ここにQRコードが入ります
</div>
<!-- サーバサイドから渡されたURLをいったん保持します -->
<input type="hidden" th:value="${qr}" id="qrvalue" />
<!-- ~~ -->
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/qrcodegenerator/x.x.x/qrcode.min.js"></script>
```

```JavaScript:make_qr.js
// 画面表示時にid指定したDOM要素のvalueからQRコードを生成します。
$(function() {
	var qr = qrcode(0, 'M');
	if ($('#qrcode').length > 0) {
		var qr = qrcode(0, 'M');
		qr.addData($('#qrvalue').val());
		qr.make();
		$('#qrcode').html(qr.createImgTag(4, 16));
	}
});
```

##LINEで共有
###具体例
```html:send_by_line.html
<!-- ~~ -->
<a id="icon_line" class="任意のCSS"><i class="任意のCSS"></i>LINEで共有する</a>
<!-- ~~ -->
```

```JavaScript:send_by_line.js
$(function() {
	$('#icon_line').on('click', function(){
		window.open("https://social-plugins.line.me/lineit/share?url=" + encodeURIComponent($('#qrvalue').val()),
				"_blank",	"top=50,left=50,width=500,height=500,scrollbars=1,location=0,menubar=0,toolbar=0,status=1,directories=0,resizable=1");
		return false;
	});
});

```

##クリップボードにコピー
###clipboardjs

https://clipboardjs.com/
https://haniwaman.com/clipboard-js/#clipboardjs

####具体例
```html:send_by_clipboard.html
<!-- ~~ -->
<p class="form_label mb32">
	<textarea id="text_area_qr" th:text="${qr}" class="form_control">https://example.com</textarea>
</p>
<p>
	<button class="任意のCSS" data-clipboard-target="#text_area_qr">クリップボードにコピー</button>
</p>
<input type="hidden" th:value="${qr}" id="qrvalue" />
<!-- ~~ -->
<!-- clipboardjsはライブラリをダウンロードしてよしなに配置しています。 -->
<script th:src="@{/js/clipboard.min.js}"></script>

```

```JavaScript:send_by_clipboard.js
$(function() {
	new ClipboardJS('.btn-clipboard').on('success', function(e) {
          // ぬるっと現れてふわっと消える
	  $('.clipboard-success').fadeIn(100).fadeOut(2000);
	});
});
```
Vキャスの部屋に入ってる人数を表示してみる

#はじめに
こちらの記事はVCIアドカレ2019の第25日目の記事です。
[VCIアドカレ2019](https://qiita.com/advent-calendar/2019/vci)

#コメビュのおまけ機能
今回のアドカレの始まったころに作成したVCI「コメビュ」のおまけ機能で、部屋の人数を表示する機能を入れました。
おおまかなやり方は”サンフラワーふじ”さんに教えていただいたのですが。
結構大変でした。

#部屋の人数をどうやってとるか
そんな便利な関数は有りませんでした。

すでに人数検出機能を実現していた”サンフラワーふじ”さんにお聞きしたら、定期的にカウントしているということでした。

はぁ、やっぱり。

さて、楽な逃げ道が無かったので自分なりに解釈しておおまかなアルゴリズムを考えます。

#おおまかなアルゴリズム
VCIの特性上同じ部屋の中に居る人は同じVCIを読み込んで実行します。
こんな感じでやればできるんでは？

1. VCIを出した人が人数のカウンターを1にして、カウントアップしてくださいってメッセージを送る
2. VCIを実行中の人はカウントアップのメッセージを見てカウンターを＋１する
3. しばらく時間がたってからVCIを出した人がカウンターの数を確認する

簡単ですけど、人数取るだけで定期的な人数確認ルーチンが必要になります。
ここまでやるなら、余計な機能と見るとか、ここまでやっても必要な機能と見るか・・・

#Luaで書いてみる
実際にはupdate部分にループのカウントを入れて、動作を間引くのですが本質には関係無いの省略します。

サンプルなので、実際にはウエイトとういか、数回に1回しか実行しないようにスクリプトを記載する必要がありますのでご注意。

```Lua:HeyaNinzuu.lua
local ninnzuu = 0

function update()
	-- 10秒に1回とかに動作を制限した方が現実的ですね
	vci.state.Set('HomeMember',0) -- 人数のグローバル変数をリセットする
	--(しばらくWait、値が全VCIに範囲されるまで待つ）
	vci.message.Emit('ComeView',CountUp) -- カウントアップのメッセージを飛ばす
	--(しばらくWait、カウントアップの処理が終わるまで待つ）
	ninzuu = vci.state.Get('HomeMember') -- カウントアップの終わった値を表示
	print("部屋に入っている人の人数"..ninzuu)
end

function ComeSet01(sender, name, message) --カウントアップのメッセージ処理
	if message == "CountUp" then
		vci.state.Add('HomeMember',1)
	end
end

vci.message.On('ComeView', ComeSet01) --カウントアップのメッセージ受け取り用
```

書いてみると以外と面倒な処理になってしまいました。
これをそのまま使うと、VCIを複数出した時に正確にカウントされないので、oOさん作成のcytanb.luaなどを使用する必要があります。

でも、もっと簡単にできると良いのですが・・・

**できらぁ！**

#さぁアップデートだ
2019/12末にVCI0.24のアップデートが行われました。
良いタイミングですね、いろいろできる事が増えました。

このアップデートの中に、部屋内のアバター関連の情報を取得する関数なんてものが有りました。

これってもしかして・・・。

そんなわけで、さっそく新しい関数を使って同じことをやってみましょう。

```Lua:HeyaNinzuu2.lua
function update()
--（適当な時間間隔で実行するように制限が必要、毎フレーム人数取っても意味が無い）
    local test
    test = vci.studio.GetAvatars()
    print("部屋に入っている人の人数"..#test)
end
```
ずいぶん簡単になったね・・・。
アップデート万歳。

#コメビュのアップデート
折角なのでコメビュのアップデートもしようと思ったのですが、そのうち機能追加、要望追加、趣味追加等を行います。
より使いやすく、分かりやすく、役に立てばいいなぁと思ってますのでよろしくお願いします。

#おわりに
アドカレは最終日となりますが、機会あったらまた何か書いていきたいと思います。

今回のアドカレを企画してくださったfeathさん、参加した皆様お疲れさまでした。

まったね～ノシ
プログラミングを始めて半年経った自分が半年前の自分に伝えたいこと

こんにちは。
19卒新卒で未経験からエンジニアをやっているトモヤです。
プログラミングを始めて半年ちょい経過した自分が、半年前の自分に伝えたいことを書いてみようと思います。
とりあえず公開しといて、思いつくまま更新していこうと思います。

###エラー出た時はとりあえずググる
エラーの内容読んでるとハマっちゃうことが多いのは私だけでしょうか。
とりあえずエラー文をそのままコピペしてググっちゃった方が早いなって最近思いだした。

###foreach意地でも使わない
foreach使い勝手よくて濫用しちゃうけど、他にどうにかする方法ないか調べてみる。
そうするとだいたい見つかる。
foreach使うと処理重くなっちゃうから、奥の手って思っとく。
foreachというコンフォートゾーンにハマらない。

###バックスラッシュと「.+」だけで検索と置換はだいたいなんとかなる
正規表現って言われるとなんか「うっ」ってなるんだけど、とりあえずバックスラッシュと「.+」使うだけでも超便利。
検索だったり置換するときの効率が全然違うのでとりあえず使ってみるのがいい。
他は必要になったときにググればおk。

###ツールを活用する
IDE以外にも活用できるツールはたくさんある。
https://difff.jp/ だったり、DeepLだったり。

###ビューから作ってとにかく確認入れとこう
最初の頃はちょっとの処理書くだけでも一苦労なのでとにかく戻りは減らしたい。
ということでできるだけ早く上司に見せられる状態にしてから確認入れておこう。
どんだけ仕様詰めといても認識の違いは出てしまうので、早く形にして見せてみよう。

###とにかく方法開示してみる
エンジニアって、自分の目の前の画面一つで全て作業が行われてしまうから、他の人に改善余地を気づいてもらいにくいかもなって思ってる。
だから、意識的に方法を開示するのって、自分のスキルを伸ばしていく上で重要だなと思ってる。
ある作業に対して、「あーヤバイ、めんどくせえのきたー」とかって冗談めかして言ってみるだけでも、「こうしたら簡単じゃん」って言ってもらえて、作業見直すきっかけになるなーと。

###速いことよりも早いことが大事
速度ももちろんのこと、それよりも期日を守れるかどうかが大切。
自分のスピードを把握して、それに合わせて適切な期日を切れるように交渉する練習も大切だなと。
期待されるのはもちろん嬉しいことなんだけど、期待を裏切った時には期待はそのままの大きさで失望に変わってしまうから、期待を調整しないといけないなと。
某サッカーゲームが何回もアップデート延長するから、僕は怒っています。

###やっぱり速いのも大事
新人のうちにどうしても無理そうな期日に食らいついてみるのもいいよなと。
振り返ると、どうにか間に合わせるために必死だった時に学んだことってたくさんある。
制約下においてこそ工夫は生まれる。

###やっぱりプログラミングは楽しい
正直最初はしんどかった。
わからないことだらけで、少しの処理を読むにも書くにも膨大な時間がかかる。
期日が迫る終わらない仕事。
一生懸命やってるけど、終わっていないという動かない事実。
ただ、少しずつ読み書きできるようになって、見立ても少しずつ精度が上がってきて、モノづくりをしていく上での視点も少しずつ身について、少しずつ実装にオプションも持てるようになって、少しずつ先輩と議論できるようになって、今はとても楽しい。
エンジニアという職業は、現実世界に生じる問題をどのように克服するかというマクロな問題解決と、それをどのようにシステムに落とし込んで実現するかというミクロな問題解決とが楽しめる贅沢な職業だなと。
エンジニアという世界に飛び込んで本当に良かった。