OmniAICreator/Qiita-1.07M huggingface dataset:
ngModelで配列参照した時の悩み

Angular Advent Calendar 2017 9日目の記事です。

私が働いている[株式会社カケハシ](https://kakehashi.life/)では、Musubiというプロダクトを開発しており、そこにはAngularが使われています。

ちょっとあまり有用な情報ではないかもしれませんが、個人的にすごく悩んだ部分であるので、まとめて見ます。

## 悩み

例えば、以下のようなコードを書きます。

```html:テンプレート側
<button (click)="addText()">add</button>
<div *ngFor="let text of texts;let i = index">
    <input [(ngModel)]="texts[i]">
</div>
```

```typescript:typescript側
 private texts: string[] = ['test1', 'test2'];

  addText() {
    this.texts.push('');
  }
```

この時の出力は、

<img width="224" alt="スクリーンショット 2017-12-03 12.16.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/4044/9ee6f495-a90e-89b3-0e55-2af3e7bf770d.png">

のようになります。

ここで、inputに文字入力したいと思います。まずフォーカスを当てます。

<img width="195" alt="スクリーンショット 2017-12-03 12.17.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/4044/94493977-2175-ee53-abee-6ac60589a09f.png">

そして文字を入力します。すると…・

<img width="306" alt="スクリーンショット 2017-12-03 12.17.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/4044/f3c483bd-62a7-b5f8-bd7d-7b2fbe40e358.png">

フォーカスが外れてしまうのです。こいつは困った。


## 解決策1:配列を直接参照しないようにする

```typescript:改善後
interface StringBox {
  text1: string;
}

@Component({
  selector: 'app-hello',
  templateUrl: './hello.component.html',
  styleUrls: ['./hello.component.css']
})
export class HelloComponent  {
  private texts: StringBox[] = [{text1: 'test1'}, {text1: 'test2'}];

  addText() {
    this.texts.push({text1: ''});
  }

}
```

```html:テンプレート側
<button (click)="addText()">add</button>
<div *ngFor="let text of texts;let i = index">
    <input [(ngModel)]="texts[i].text1">
</div>
```

配列を直接参照しなければいいので、配列のメンバーを参照するとフォーカスが外れて連続で文字が入力できなくなる問題が解決します。
まあでもこの方法はいけてないですね。

## 解決策2:trackByを使う

```typescript:改善後
@Component({
  selector: 'app-hello',
  templateUrl: './hello.component.html',
  styleUrls: ['./hello.component.css']
})
export class HelloComponent {
  private texts: string[] = ['test1', 'test2'];

  addText() {
    this.texts.push('');
  }

  myTrackBy(index: number, obj: any): any {
    return index;
  }

}
```

```html:テンプレート側
<button (click)="addText()">add</button>
<div *ngFor="let text of texts;let i = index;trackBy: myTrackBy">
    <input [(ngModel)]="texts[i]">
</div>
```

これで解決します。

trackBy関数とは、ngForによるオブジェクトの追跡のためのキーを決める式です。
どうも文字を入力すると、Angularは今どの配列を参照しているかわからなくなり、フォーカスが外れてしまうのですが、
trackByでキーを教えてあげると、配列のどの位置を入力されているのがわかるようになり、そのまま入力できるようです。

これで解決できました。
Amazon alexa Skills をイチから作ってみたら（休憩とりまくって）5時間程度でできました

Amazon Echoを購入することができたので、せっかくなのでSkillをつくってみようかなと。
アドベントカレンダーですけど、とくにネタっぽいというわけでもなくとにかくユルくやります:information_desk_person:

どうせなら、自分が使いたいようなもの作ろうかなと思った次第です。
寒くて余計に億劫になりがちな運動、そのモチベーション上げてくれるSkillあったらうれしいのは？！

## よっしゃ、:muscle:筋トレに使えそうなスキルつくろ！

…もうありました:joy:

こまった。

なお、現在この投稿日の前日です。
サクッと実装できるものつくってみます！:raising_hand:


## やったこと
自分の言ったことに対して、とある返答をしてくれる機能を実装してみました。

・しんどいなぁ…ていうとき、キーワードで話しかけたら返答してくれる内容
※ちなみにAlexaになにかしら返答くれる機能は既にあります。


### :gear:Amazon alexa skill の超簡単な構成:gear:

- フロント側：実際の音声インターフェイス→Alexa Skills Kit
- バック側：入力された音声指示からの処理して返す→Lambda

## 開発画面
Skillそのものの開発手法は既にいろんな方が紹介しているので省略します。
今回は自分でつくったところだけ。

### Amazon alexa skill
対話モデル作成用のGUIが用意されているので、作業がやりやすい！

![skill画面.png](https://qiita-image-store.s3.amazonaws.com/0/112369/cd8d6566-c235-44b8-9504-039091f202a2.png)

### Lambda 

alexa skills kitをトリガーにしてLambda関数をうごかす仕組み。
![Lambda1.png](https://qiita-image-store.s3.amazonaws.com/0/112369/929e0200-157f-be93-5009-0618d55efb7c.png)

今回の関数は `Node.js` で書きました。
音声入力があった場合に`LaunchRequest` が動作し、単純に返答するだけの処理です。
とってもシンプルですね！
![lambda_js.png](https://qiita-image-store.s3.amazonaws.com/0/112369/4867ff96-4c4f-0fe3-f7ef-f6dda8b2af24.png)


ちなみにpythonだとより複雑な処理も書けるようですが今回はパス:slight_smile:

## いざテスト

alexa skills kitのテストシミュレータ画面です。

### エラー発生
応答がこない…:thinking:
![テストエラー.png](https://qiita-image-store.s3.amazonaws.com/0/112369/c592b7aa-3db4-41bb-29de-e9fa3e9ff364.png)

Lambda側のエラーを確認してみる
![エラーログ.png](https://qiita-image-store.s3.amazonaws.com/0/112369/41adff60-fb11-83bb-5b18-d47bea0838bd.png)

`Unhandled`のイベントが発生してしまい、なおかつそのハンドラが存在しないので怒られていた。

### 修正

`Unhandled` を追記する。（あとalexaのアクションを`ask`から`tell`に変更）
![lambda修正.png](https://qiita-image-store.s3.amazonaws.com/0/112369/d5dc644d-6f90-4ab1-a3d0-60d1121031fe.png)

うごいた！:hugging:
![テスト成功.png](https://qiita-image-store.s3.amazonaws.com/0/112369/6c3e8890-d606-d88d-548e-08f99c0326ca.png)


## 実機でも試してみる

### Skills Beta Testing を使う

公開情報や、プライバシーとコンプライアンス情報とかを設定すると実際に公開しなくても
ベータテストとして、メール等で招待したユーザーのみ実機での動作確認が可能となる機能です。

招待されると、Amazon Echo(alexa)の設定画面はこんな感じ。アイコンの画像は適当の極みです。
ちなみに、Androidスマホ上からはうまくこの画面に飛ばなかったので、PCのブラウザ上で開きました。
「スキルを有効にする」と、手持ちのEchoで使えるようになります。（画像は既に有効化済み）
![alexa設定画面.png](https://qiita-image-store.s3.amazonaws.com/0/112369/9479b670-a40a-00ef-32a7-eb7f303135e2.png)

## 完成:dancer:

:speaking_head:実際に話しかけて、応答してくれる動画を載せようかと思ったのですが、自分の声が入るのが嫌なので辞めました:relaxed:
でも、ちゃんとEchoは応えてくれたので満足です。

## 感想

alexaのskill開発はとても簡単。
もっと複雑な処理の場合、pythonでなら実現できそう。
python、もっと勉強しようかなと思いました。

なお、今回作ったSkillは公開しない予定です:sunglasses:

本開発作業はAWSやAmazon Developer Servicesのアカウント作成の工程から始めて、実機テスト完了までかかった時間がタイトル通り、大体5時間くらいでした。集中力途切れまくりでした。

最後に、ちょうど半額セールがはじまったのでgoogle home miniも買いました。
こちらもどんなものか楽しみです:stuck_out_tongue:
技術文書をAsciidoc で書いて、GitlabでCIしている話

うちのチームでは、AsciiDoc で仕様書や技術メモを書きGitlab で管理しています。
あるとき、Redpenを紹介されたのを機会に、ドキュメントのCIを回すようにしたので、そのお話です。


## AsciiDoc って？

軽量マークアップ言語の一つです。
以下のような過程を経て、AsciiDocを利用するようになりました。

1. Word を共有フォルダで管理 
  * :cry:  重い。差分管理しづらい。同時編集がしづらい
2. Markdown をgitlabで管理
  * :smile: 軽い。Gitで編集履歴が簡単に確認可能。
  * :smile: Gitlab上で、整形された状態でプレビュー可能。
  * :cry: 方言がある（エディタのプレビューではきちんと表示されても、gitlab上で崩れる）
  * :cry: テーブルの編集が大変（特に更新の時が。。。）
3. AsciiDoc をgitlabで管理
  * :smile: 軽い。Gitで編集履歴が簡単に確認可能。
  * :smile: テーブル編集が楽。複雑な構造のテーブルもかける。[Asciidoc簡易メモ#テーブル](https://qiita.com/hbsnow/items/88e1414ac97501af17ff#table)
  * :rolling_eyes: Gitlab上で、整形された状態でプレビュー可能。ただし、ちょこちょこおかしい（後述）。


## Redpen って?

赤ペン先生ですね
http://redpen.cc

検出設定などかなり細かい設定が可能です。
ただし、教えてくれた人に設定ファイルをもらい、ほぼそのまま使っているので詳しくありません。



## 動作イメージ

1. Gitlab にpush
2. Gitlab CI により、Redpenで校正チェック。ついでに、AsciiDoc をHTML変換 + pagesに公開


## サンプル

https://gitlab.com/hgs/doc-sample

### フォルダ構造

```
.gitlab-ci.yml
src/               ・・・原稿・画像を格納するフォルダ
  image/
build.sh 　　　　　　・・・AsciiDoc から Html への変換するスクリプト
reopen-conf-ja.xml ・・・Redpenの設定ファイル
```


### 各ファイル詳細

#### build.sh

```bash
#!/bin/bash

asciidocfiles () {
  dist="public/${1#src/}/.."
  asciidoctor -a ext=html -r asciidoctor-diagram -D $dist $1
}
export -f asciidocfiles

find src -name "*.adoc" | xargs -I{} bash -c "asciidocfiles {}"
cp -r src/images public
```

原稿のファイル構造を保ったまま処理するために、adocを検索しひとつづつ出力先を指定して変換。
イメージファイルはフォルダごとコピー
また、Gitlabのプレビュー、変換後のHTML両方でファイル間のリンクを保つために、執筆時に以下のような小細工をしています。

* 文書の先頭に`:ext: {adoc}`を定義
* リンクは、`link:index.{ext}[xxx]`のように書く
* asciidoctor での変換時に`-a ext=html`オプションを追加


#### .gitlab-ci.yml

```yaml
test:
  image: wreulicke/redpen:1.9.0
  script:
    - find src -name "*.adoc" | xargs redpen -f asciidoc -l 0 -c redpen-conf-ja.xml 2> redpen.log
  artifacts:
    paths:
      - redpen.log
    expire_in: 1 week
pages:
  image: asciidoctor/docker-asciidoctor:latest
  script:
    - ./build.sh
  artifacts:
    paths:
      - public
  only:
    - master
```

２つのジョブを定義

* check: Redpen で文書チェック
    * Error が１つでも見つかると、エラーになります。(-l オプションで閾値は変更可能）
* pages: build.sh を実行し、html変換 + pages に公開

### 結果

* Gitlab でのプレビュー [link](https://gitlab.com/hgs/doc-sample/blob/master/src/index.adoc)
* Gitlab Pages [link](https://hgs.gitlab.io/doc-sample/index.html)
* Redpen の結果は、GitlabのPipeline から確認 [link](https://gitlab.com/hgs/doc-sample/-/jobs/42904348)

## おわりに

表記ゆれなどを指摘してくれるので、レビュー時は内容に集中できるようになりました。

ただ、以下のような課題も残っています。

* 個々のページになっているので、ひとつのPDFとかに再変換できない。
* gitlabのプレビューでは、少し残念なところがある
    * アイコンが表示されない [issue](https://gitlab.com/gitlab-org/gitlab-ce/issues/28823)
    * 内部リンクが作動しない [issue](https://gitlab.com/gitlab-org/gitlab-ce/issues/30746)
    * umlを表示するには、gitlabの設定が必要
* Redpen の設定ファイルを一から作成するのは大変そう。
* Redpen の誤指摘。suppressアノテーションをつけるとエラーを抑止できますが、その節自体チェックが行われなくなり、将来の検出漏れを埋め込む可能性があります。
jekyll で未来日投稿

GitHub Pageをつかってサイトを公開してるのですが、ローカルと公開側でどうも振舞いが違う。具体的にはGitHub側は日付が未来のものでもすべて表示されてしまうのに対して、ローカルのjekyll serveで確認したものについては日付が未来のものは表示されない。

で、調べていった結果こうでした。
まず _config.yml に未来の日付のものを表示しない設定にする。

```_config.yml
future: false
```

これでGitHub Pageでの未来日の記事は表示されなくなります。
で、jekyll serveで未来日の記事も含んで確認したい場合は以下のようにサーバを起動する。

```
$ jekyll serve --future true --watch
```

これで変更を反映しつつ未来の日付の記事も確認できます。
あそうそう、timezone:の設定しておかないと日付の表示が変になるので、先の _config.yml に以下のも追加しておくといいです。

```_config.yml
timezone: Asia/Tokyo
```

さすがに小ネタすぎてIAMAS Adnvent Calendarに投稿するのは憚られるのでそっと公開しておく。
空文字チェック(-n)で少しハマった

## 何が起きたか
- ShellScriptの中身

```shell-session:example.sh
$param=$1

if [ -n "$param" ];then
 echo $param
else
 echo "引数がありません"
fi
```

- 呼び出し方
`sh example.sh hoge`

- 結果
`引数がありません`

.
.
.
:thinking: 

## 解決法
- 変数を`{}`で囲む

```shell-session:solution.sh
$param=$1

if [ -n "${param}" ];then
 echo $param
else
 echo "引数がありません"
fi
```

普通に変数展開する時は、`{}`無しでも成立するので気づきにくかったです。
kintone Data に接続しTalend からデータ連携

Talend で簡単にCData JDBC driver for kintone をワークフローに統合する方法を説明します。ここではCData JDBC Driver for kintone を使ってTalend Open Studio でkintone data をジョブフローに転送します。

#Talend には多くのオープンソースコネクタがあるのになぜ商用のCData Driver 製品を？
Talend の良さは、その直観的でシンプルなUI もありますが、Talend Exchange で入手できる豊富なオープンソースのコネクタがあります[https://exchange.talend.com/](https://exchange.talend.com/)。ただし、使ってみると「コネクタ毎にクエリや接続設定など差があって使いにくい」「Talend は安定提供だけど、サードパーティのOSS アダプタは？」と感じる方がいると思います。
CData では、80を超えるデータソースに対して統一規格でつくられたJDBC Drivers を提供しています。
[http://www.cdata.com/jp/jdbc/](http://www.cdata.com/jp/jdbc/)
![CDATA Datasource.png](https://qiita-image-store.s3.amazonaws.com/0/152422/8bfaeb3b-1694-e391-35f2-739d00a8b11c.png)

データソースへの接続方法、SQL クエリ、ログ・プロキシ・ファイアウォールなどの設定などがすべて統一仕様になっています。
オープンソースで自由度を高め、コスト低減を実現し、さらにアダプタにはCData JDBC 製品を使うことでユーザビリティ向上を両立することが可能です。


#JDBC Talend にkintone をデータソースとして設定
記の手順に従って、kintone にJDBC 接続を確立します：
CData JDBC Drivers for kintone の30日の無償評価版をダウンロードします。
[http://www.cdata.com/jp/drivers/kintone/download/](http://www.cdata.com/jp/drivers/kintone/download/)

1. kintone data に新しいデータベース接続を追加：新しく接続を追加するには、［Metadata］ノードを展開し［Db Connections］ノードを右クリックして［Create Connection］をクリックします。
2. ウィザードが表示されたら、接続に名前を入力します。
3. 次のページで、［DB Type］メニューから［Generic JDBC］を選択してJDBC URL を入力します。
    - ドライバーのJAR をクラスパスに追加:インストールディレクトリの［lib］内の.jar および.lic を追加
    - ドライバークラス：cdata.jdbc.kintone.KintoneDriver
    - JDBC URL: dbc:kintone:User=myuseraccount;Password=mypassword;URL=http://subdomain.domain.com;SpaceId=myspaceid
4. 接続を右クリックして［Retrieve Schema］をクリックします。
5. デフォルトオプションで［Next］をクリックしインポートしたいテーブルを選択します。
6. デフォルトオプションでウィザードを終了します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152422/9824ff64-95c1-9fcf-fffd-62e4171e5b54.png)

これでTalend にkintone JDBC Driver が配置され、kintone への接続が確立されました。
kintone データはテーブルに抽象化されて取得できるようになります。

#Comments テーブルをフラットファイルに出力
下記の手順に従って、kintone のテーブル（アプリ）をフラットファイル出力コンポーネントに転送します。
1. ［Table Schemas］ノードで、テーブルをワークスペース内にドラッグします。
2. ダイアログが表示されたら［tJDBCInput］コンポーネントを選択します。
3. 次に、［tFileOutputDelimited］コンポーネントをパレットの［Business Intelligence］タブからワークスペース内にドラッグします。
4. tJDBCInput コンポーネントを右クリックしてベクタを出力ファイルにドラッグします。
5. プロジェクトを実行して、データをフラットファイルに出力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152422/ca627fa4-9b1e-181f-e59a-13c0a05134bd.png)

#Talend で使える人気ドライバー

[Microsoft Access](https://www.cdata.com/jp/kb/tech/access-jdbc-talend.rst)
[GoogleAnalytics](https://www.cdata.com/jp/kb/tech/ganalytics-jdbc-talend.rst)
[Box](https://www.cdata.com/jp/kb/tech/box-jdbc-talend.rst)
[Elasticsearch](https://www.cdata.com/jp/kb/tech/elasticsearch-jdbc-talend.rst)
[Google BigQuery](https://www.cdata.com/jp/kb/tech/bigquery-jdbc-talend.rst)
[SharePoint](https://www.cdata.com/jp/kb/tech/sharepoint-jdbc-talend.rst)
[DynamicsCRM](https://www.cdata.com/jp/kb/tech/dynamicscrm-jdbc-talend.rst)
[DynamicsNAV](https://www.cdata.com/jp/kb/tech/dynamicsnav-jdbc-talend.rst)
[NetSuite](https://www.cdata.com/jp/kb/tech/netsuite-jdbc-talend.rst)
[Marekto](https://www.cdata.com/jp/kb/tech/marketo-jdbc-talend.rst)
正規分布の確率密度関数の形があやふやになった時の対処法

# 本日の話題

平均 $\mu$ 標準偏差 $\sigma$ を持つ正規分布は次の形の確率密度関数を持ちます：

```math

f(x;\mu,\sigma):=\frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)_{.}

```

# ざっくりとした式の形の記憶の仕方

よくあるあるなのが，　標準の正規分布に従う確率密度関数

```math

f_{\mathrm{std}}(x):=f(x;0,1)=\frac{1}{\sqrt{2\pi}}\exp\left(-\frac{x^2}{2}\right)

```

だけ覚えていて
たまに　$\sigma$ の冪に二乗がつくんだっけ？どうだっけ？？？とこんがらがっちゃう時はありますが，
その時は落ち着いて

```math
\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
```

が成り立つことを示せばよいわけです． 導出はご丁寧にも

- [ガウス積分（Wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B9%E7%A9%8D%E5%88%86)
に書いてありますね．

さて，天下りになってしまいますが，変数変換を行うことで，

```math
\begin{align}
\int_{-\infty}^{\infty} \exp\left(-\frac{x^2}{2\sigma^2}\right) dx 
&=\int_{-\infty}^{\infty} \sqrt{2}\sigma\exp\left(-y^2\right) dy \quad \left(\mathrm{where}\ \ y=\frac{x}{\sqrt{2}\sigma}\right)\\
&=\sqrt{2\pi}\sigma
 \end{align}
```

すなわち，

```math
\int_{-\infty}^{\infty} \frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{x^2}{2\sigma^2}\right) dx = 1 
```

成り立ちます．確率密度関数の全領域での積分が１になることを考慮すると，　移動のパラメータ（つまり $\mu$　の有る無し）を除いて積分の内部の式と $f(x;\mu,\sigma)$ の形が一致しないといけないはずです．

ここまでの導出を記憶にしておくと　$\sigma$ の冪はなんだっけ??? のボケを回避できると思います．

# [scipy.stats.norm](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html) のドキュメントから

> Notes

> The probability density function for norm is:

```math
f(x)=\frac{\exp⁡(−x^2/2)}{\sqrt{2\pi}}
```
> The survival function, norm.sf, is also referred to as the Q-function in some contexts (see, e.g., Wikipedia’s definition).

> The probability density above is defined in the “standardized” form. To shift and/or scale the distribution use the loc and scale parameters. Specifically, norm.pdf(x, loc, scale) is identically equivalent to norm.pdf(y) / scale with y = (x - loc) / scale.


loc や scale はここでは各々 $\mu$， $\sigma$ に対応します．ここで

$f(x)=\frac{\exp⁡(−x^2/2)}{\sqrt{2\pi}}$, $y=(x-\mu)/\sigma$ と置くと

```math
\begin{align}
\mathrm{norm.pdf(y)/scale}
&=f(y)/\sigma \\
&= \frac{\exp⁡(−(x-\mu)^2/2\sigma^2)}{\sqrt{2\pi}\sigma} \\
&=f(x;\mu,\sigma)
\end{align}
```

だから　`norm.pdf(x,loc,scale)` に対応する数式がわかりましたね．

ということで

```math
f(x;\mu,\sigma)=\frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)
```

分母のシグマの冪は１（というか単純にシグマで割る）ということと exp 内の シグマの二乗は分子側の　x の２乗に関連しているということを理解しておけば混乱はしないはず．

正直バカみたいに暗記する覚えることは嫌いでして，勉強するにあたっては理由付きで記憶しておくのがよいと思います．
python ワンライナーに挑戦 〜 初心者のお勉強 m(_ _)m

bc,tac,grep,sed,awk を python ワンライナーにしてみました。
python に慣れる目的で、日常的に使えたらいいと思ったのがモチベーションです。
しかし、実際に使っているのは「電卓（簡単な計算）」だけです…:sweat:

以下、"file1.txt" は任意のテキストファイルです。

#1) 電卓（簡単な計算）
● bc

```
$ echo "scale=4; 1.23 * 4.56" | bc
5.6088
$ echo "2^3" | bc
8
```

● python

```
$ python -c "print(1.23 * 4.56)"
5.6088
$ python -c "print(2**3)"
8
```

#2) テキストをそのまま出力 （以降のサンプルの準備)
● cat

```
$ cat file1.txt
```

● python ※ これならcatだけでいいのでは…

```
$ cat file1.txt | python -c 'import sys; [print(l,end="") for l in sys.stdin]'
```

#3) テキストファイルを逆順（末尾→１行目）の順に出力
● tac

```
$ tac file1.txt
```

● python

```
$ cat file1.txt | python -c 'import sys; [print(l,end="") for l in reversed(list(sys.stdin))]'
```


#4) 指定行の抜き出し (例: 2〜5行目)
● sed

```
$ sed -n 2,5p file1.txt
```

● python

```
$ cat file1.txt | python -c 'import sys, re; [print(l,end="") for l in list(sys.stdin)[1:5]]'
```
**※ [1:4] ではなく [1:5] であることに注意。何故?**


#5) 指定カラムの抜き出し (例: 2カラム目を抜き出し)
● awk

```
$ awk '{print $2}' file1.txt
```

● python

```
$ cat file1.txt | python -c 'import sys, re; [(lambda x: print(x[1]) if len(x) > 1 else print(""))(i) for i in [l.split() for l in sys.stdin]]'
```


#6) 文字列検索 (例: "ABC"を検索)
● grep

```
$ grep -e "ABC" file1.txt
$ grep -i -e "ABC" file1.txt
```

● python

```
$ cat file1.txt | python -c 'import sys, re; [print(l,end="") for l in sys.stdin if re.search("ABC",l)]'
$ cat file1.txt | python -c 'import sys, re; [print(l,end="") for l in sys.stdin if re.search("ABC",l,re.IGNORECASE)]'
```


#7) 文字列置換 (例: "ABC"を"XYZ"に置換)
● sed

```
$ sed -e 's/ABC/XYZ/' file1.txt
$ sed -e 's/ABC/XYZ/g' file1.txt
$ sed -e 's/ABC/XYZ/ig' file1.txt
```

● python

```
$ cat file1.txt | python -c 'import sys,re; [print(re.sub("ABC","XYZ",l,1),end="") for l in sys.stdin]'
$ cat file1.txt | python -c 'import sys,re; [print(re.sub("ABC","XYZ",l),end="") for l in sys.stdin]'
$ cat file1.txt | python -c 'import sys,re; [print(re.sub("ABC","XYZ",l,0,re.IGNORECASE),end="") for l in sys.stdin]'
```


#いいわけ（まとめ）
電卓以外のワンライナーを実際に使うことは無さそう:sob:ですが、リスト処理、内包表記、lambda式の練習になったので記事にしてみました:sweat_smile:
線の上をなぞれてるかどうか判定する


こんな画像があって、
![no2.png](https://qiita-image-store.s3.amazonaws.com/0/90023/efc3835b-c37e-124a-92d7-98cf403e34df.png "no2.png")

こんなふうになぞったときに、
![no3.png](https://qiita-image-store.s3.amazonaws.com/0/90023/428d91a7-28da-d795-6b0e-b54e2387c0cf.png "no3.png")

ちゃんとなぞれてるかどうか判定する定石とかあるの？　という話が先日、社内で出まして。

定石があるかどうかわからないけど、こんな風にやったら多少ずれたりはみ出たりしてもロバストに判定できそうじゃないですか、というのを試しに実装したので記事にしておきます。定石などあれば通りすがりのエロい人がきっと教えてくれるはず。

# 概要
* 手本となる画像となぞった画像（なぞった部分だけ）の差分を取る
* それをぼかす
* ぼかした画像に閾値以上のピクセルが残ってるかどうかを調べる

# 差分を取る
差分を取る画像は、上の最初の画像と次の画像です。
なお、画像の黒い部分はすべて透明になっているものとします。

![no4.png](https://qiita-image-store.s3.amazonaws.com/0/90023/74c833a1-39c9-7fc6-9dbf-438b862eb3e6.png "no4.png")

差分は次のようになります。（HTML Canvas の globalCompositeOperation を xor にして作成）
![no5.png](https://qiita-image-store.s3.amazonaws.com/0/90023/08afa640-02a3-afed-d9a0-89dfb056bb38.png "no5.png")

# ぼかす
ガウスぼかしを使いました。
![no6.png](https://qiita-image-store.s3.amazonaws.com/0/90023/1e3fa4c6-0b25-4301-7b36-bbce642b9b4b.png "no6.png")

# 結果
例えば、アルファ値が178以上のピクセルだけ残すとすると、真っ黒になるのでちゃんとなぞれていると判定できます。
![no7.png](https://qiita-image-store.s3.amazonaws.com/0/90023/e0a36d54-2791-706c-e3f8-c70e7bfcab81.png "no7.png")

こんな風にはみ出しすぎると、
![no8.png](https://qiita-image-store.s3.amazonaws.com/0/90023/7983587d-7d47-24cb-3fb9-1121d1ae31b1.png "no8.png")

結果はこうなります。
![no9.png](https://qiita-image-store.s3.amazonaws.com/0/90023/cdf5beef-3580-90ab-1f7c-02c001b6bf7e.png "no9.png")

# 実際に動くやつ
https://jsfiddle.net/tw8kdkh2/

# ソースコード
https://github.com/rakusan/nazoru
Appium StudioがXcode9でSimulator選べない問題について


Appium Studioのバージョン 11.2.41
Xcode9.1

## iOSシミュレータを登録しようとしてもがiPhone5sしか表示されない
どうやらXcode9だとうまくシミュレータが取れず「iPhone 5s iOS 11.1」しか表示されず、
またこのまま先に進むことができません。 **※Xcode8であれば正常に動作します**

![Kobito.zidmbD.png](https://qiita-image-store.s3.amazonaws.com/0/11776/e261c3cc-2de3-6237-cbb2-480c2c0d53fe.png "Kobito.zidmbD.png")


### なぜXcode9で動かないのか？
気になったのでAppiumStudioのディレクトリを眺めていると`fbsimctl.zip`を見つけました。

![Kobito.8V4exV.png](https://qiita-image-store.s3.amazonaws.com/0/11776/1ce382e9-bf4e-c469-5490-4f48f7a00feb.png "Kobito.8V4exV.png")

`fbsimctl`はiOS Simulatorの管理ツールである`FBSimulatorControl`(https://github.com/facebook/FBSimulatorControl) のCLI版です、Xcodeをインストールすると使える`simctl`の強化版だと思ってくれればいいと思います。 

しかし`FBSimulatorControl`は残念ながら開発が止まっているようで、
CLIで実行してもシミュレータの一覧は取れない状態となっています。

```
// 実行結果
$ fbsimctl list
Error Domain=com.facebook.FBControlCore Code=0 "Attempting to load a file at path '/Applications/Xcode.app/Contents/Developer/Library/PrivateFrameworks/CoreSimulator.framework', but it does not exist" UserInfo={NSLocalizedDescription=Attempting to load a file at path '/Applications/Xcode.app/Contents/Developer/Library/PrivateFrameworks/CoreSimulator.framework', but it does not exist}
```

iOS Simulatorを使用したい場合、今後`fbsimctl`ではなく`simctl`を使うなどのアップデートがあれば使えるようになるのではないかと思います。

# おまけ
それでもiOS Simulatorを使いたい場合はXcode8をインストールし、`xcode-select -s`などで切り替えて古い環境で動作させる事は可能なのでお試しください。

以上、小ネタでした🙏🏼
Google home mini 購入してみた

#Google Homemini 買ってみた

みんなが知らない事を書いていきたい・・

##chromeブラウザとの連携について・・
知らないと思うので書いていきたい

- chromeブラウザー内の音声が再生される。

これを利用すると、再生できないAFNが再生される。
youtubeの音声も行けるようだ。
wifiネットワーク内のディスクトップパソコンの音声がキャストされるのはどんな手法をとってているのだろうか？
シェルを良い感じにした話

# 自己紹介

じゅんじゅんと言うニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪3回生です。（2017/12/08現在）

イベントや、勉強会に参加してるので是非お会いした際はお声掛けください！

# シェルを良い感じにカスタマイズしました。

Gashoo https://gashoo.jp のアドベントカレンダー https://adventar.org/calendars/2518 でシェルをやるのはどうかなと思ったんですが大目に見てください。笑

最近自分のターミナルを改造しまくって良い感じに進化したので、公開したいと思います。

ちなみに、fishを使っています。

![スクリーンショット 2017-12-03 10.21.38.png](https://qiita-image-store.s3.amazonaws.com/0/90347/40f7dae2-a849-b509-212c-e3aed8b05d07.png)

# まずやったこと

itermのカラースキームを変えました！

itermのカラースキームを[oceanic-next](https://github.com/mhartington/oceanic-next-iterm)

というものに変えました。すげぇエモい。

次にpecoと似たもののfzfを導入しました。

[https://github.com/junegunn/fzf](https://github.com/junegunn/fzf)

fzfによって標準出力したものをパイプで渡したりすると良い感じに選択できるようになります。

![screen.gif](https://qiita-image-store.s3.amazonaws.com/0/90347/00c8864b-b235-ec5e-a1df-8987a1e7e5b1.gif)

次に導入したのがghqです。

[https://github.com/motemen/ghq](https://github.com/motemen/ghq)

ghqはプロジェクト管理ツールです。

これで管理しておくと、`$ ghq list`などでプロジェクト一覧などを取得することができます。

このghqを使うことにより階層構造で管理するのに何も考えずにプロジェクトの管理ができるようになりました。

![screen.gif](https://qiita-image-store.s3.amazonaws.com/0/90347/94eecdaf-af23-e43a-21b7-0a33a3910e24.gif)

あとはこの出力をfzfで拾って、帰ってくるものを`$ ghq look`に渡すとプロジェクトに一発で移動することができます。

僕は`fc`というコマンドをつくって移動しています。

![screen.gif](https://qiita-image-store.s3.amazonaws.com/0/90347/eb27e310-6a1e-0d26-b3ca-c7508e754423.gif)

このghqですが、僕は時々Goを書いているのでGOPATHをどうするか問題にぶち当たりました。

そこで先輩の意見などをきいて結局`.ghq`自体をGOPATHにすることで全てのプロジェクトを管理できるのでその方法で行いました。（なので`.ghq/src/github.com/konojunya`のようなパスになっています。)

最後に行ったのが、hubの導入です。

[https://github.com/github/hub](https://github.com/github/hub)

hubコマンドを使えるようになると、コマンドラインで`hub create xxx`とするとリポジトリを作れたり、ブラウザのページを一発で開けたり、PR送ったりissueを立てたりできるようです。

そのやり方はこんな記事があったのでそこを参照してもらえると嬉しいです。

[hub で GitHub にターミナルから issue、PR を作成する](https://qiita.com/fracmode/items/3d8b4e9d54a5c4a3ee5a)

# まとめ

- oceanic-nextにする
- fzfを導入する
- ghqを導入する
- hubを導入する

他にもこんな便利なものがあるよってものがあったら教えて下さい！！！

# あとがき

Twitter [@konojunya](https://twitter.com/konojunya) でTwitterしているのでぜひフォローください！
Javaによる写真自動リサイズメソッド

Javaでiconとして画像を使用するときに画像サイズとiconコンテンツのサイズが違う！そんなことはありませんか？

今回はiconとリサイズしたいサイズを指定すると自動的に変換した画像を返してくれるメソッドをご紹介します
まずはコード全体を

```java:PictureBuilder.java

public class PictureBuilder {
	public static ImageIcon resizeIcon(ImageIcon icon, int w, int h){
		Image CGresize = icon.getImage();
		 BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
		    Graphics2D g2 = resizedImg.createGraphics();
		    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		    g2.drawImage(CGresize, 0, 0, w, h, null);
		    g2.dispose();
		    ImageIcon resized = new ImageIcon();
		    resized.setImage(resizedImg);
		    return resized;
	}
}

```
使用方法としてはstatic関数なので外部のクラスなどからでも

```java
ImageIcon icon = new ImageIcon("image.jpg");
Imageicon resized = PictureBuilder.resizeIcon(icon,100,200);

```

のようにして使用できます。

・とりあえず手軽にリサイズしたい。
・iconに画像を使いたいんだけどサイズがバラバラで使いにくい
・同じ画像ををいろいろなサイズのiconで使いたい

そういった方におすすめです。
ネットの画像をネタに小話するボット　①概要編

[ボット](https://qiita.com/advent-calendar/2017/bot)アドベントカレンダー８日目になりました。今日は、[Cogbot!](https://qiita.com/advent-calendar/2017/cogbot)アドベントカレンダーにもお邪魔してます。前半の記事はこちらに、後半の記事はCogbot!のほうに掲載します。

今回は、画像のURLを共有して、その感想でユーザと盛り上がる？ボットを作ってみました。

## 実行結果の例

### 題材

![蝶々](https://cdn.pixabay.com/photo/2016/05/14/12/58/butterfly-1391809_960_720.jpg)

出典: https://pixabay.com/photo-1391809/

### 会話例その１

![kekka1.png](https://qiita-image-store.s3.amazonaws.com/0/10290/8586ae4b-4c5f-dba7-1452-44e07dabcc25.png)

ユーザに納得してもらったと感じたら、単純に喜んで終わります。

### 会話例その２

![kekka2.png](https://qiita-image-store.s3.amazonaws.com/0/10290/5094ea1f-dc3a-1924-1908-a4e89aba50f9.png)

ユーザに異議を唱えられたら、ランダムに別の観点から感想を述べようとします。運が悪いと、同じ感想を口走りますが... とにかく、喜んでもらえる（？）まで頑張ります。


## 構成

以下をチョイスして、**ベスト・オブ・ちょっとケチくさいブリード**で作ってみました。

* [Dialogflow](http://dialogflow.com) ... インテント・エンティティ識別、ダイアログ制御
  - バリエーションがある返答を、Web画面上で簡単に定義可能
  - 出口(Slack, Cortana, Alexa, ...)のバリエーションが豊富
* [Azure Functions](https://azure.microsoft.com/ja-jp/services/functions/) ... Dialogflowのwebhookとして利用(C#)
  - Firebaseから外部のAPIを叩く場合はGCPにクレカ登録しなければならないそうで... 
     - 結局Cloud Natural Language APIを使うために登録してしまいましたが
* [Azure Computer Vision API](https://azure.microsoft.com/ja-jp/services/cognitive-services/computer-vision/) ... 画像認識
  - 単純な言葉だけでなく、短文(caption)でも返してくれるので気に入った
* [Azure Translator Text API](https://azure.microsoft.com/ja-jp/services/cognitive-services/translator-text-api/) ... 翻訳
  - Googleの方が遥かに精度がいいのはわかってますが、いきなり２千円以上課金されるそうで...
* [Google Cloud Natural Language API](https://cloud.google.com/natural-language/?hl=ja) ... 感情分析
  - Azure Text Analytics APIに比べて、短文での精度が雲泥の差
  - それでいて翻訳APIのようにべらぼうに高くないし、無料枠もある

Dialogflowに正常系のインテントを5つ用意しています。「Query」と「Reaction」は、ユーザからの入力を受け付け、webhookとして登録したAzure Functionsに渡すインテントです。それ以外は、Azure Functionsから結果を受け取った後に発生するイベントを受け取り、結果を含めてランダムな応答を作成して返すインテントです。

残念なことに、Dialogflowでは、インテントごとに異なるwebhookを登録できません。このため、インテント共通のAzure Functionsで受け付けて、「Query」がきたか「Reaction」がきたかを判定し、その後の処理を変えるようにしています。

![architecture.png](https://qiita-image-store.s3.amazonaws.com/0/10290/49c2ed50-1fe7-b3f1-5bcf-474269040212.png)

## ②実装編

本日(12/8)のCogbot!アドベントカレンダーに投稿した、こちらの記事に進んでください。

https://qiita.com/makopo/items/8a5a25d5e5abb9691f47
AWS認定試験について（2017）

本エントリは、Qiita Advent Calendar 2017 ulgeekの4日目です。

AWS認定は、AWSに関する専門知識を有している証明になります。
本エントリでは、2017年11月時点でのAWS認定試験についてまとめます。

# 各試験の関係性
AWS認定試験はその試験は8種類がリリースされており、ロールベース認定、専門知識認定の2つに大別されます。

## ロールベース認定
ロールベース認定は、そのロールごとに「クラウドプラクティショナー」「アーキテクト」「開発者」「運用者」の4つに分けられます。
また、レベル別にはFundamental、Associate、Professionalの3つに分けられます。

2017年11月には、技術者以外の職種向けまたは技術者の基礎知識の試験として、AWS Certified Cloud Practitioner (CLF)がリリースされました。
~~ロールベース認定のProfessinal認定試験の受験には、対応するAssociate認定が有効である必要があります。~~
2018/10/18に前提条件の廃止が行われました。
https://aws.amazon.com/jp/about-aws/whats-new/2018/10/announcing-more-flexibility-for-aws-certification-exams/

**ロールベース認定一覧**

- AWS Certified Cloud Practitioner (CLF)
- AWS Certified Solutions Architect - Associate (SAA)
- AWS Certified Developer - Associate (DVA)
- AWS Certified SysOps Administrator - Associate (SOA)
- AWS Certified Solutions Architect - Professional (SAP)
- AWS Certified DevOps Engineer - Professional (DOP)

**ロールベース認定とレベルの対応**

| ロール＼レベル | Fundamental | Associate | Professional |
|:--|:--|:--|:--|
|クラウドプラクティショナー|CLF|-|-|
|アーキテクト|CLF(*)|SAA|SAP|
|開発者|CLF(*)|CDA|DOP|
|運用者|CLF(*)|SOA|DOP|
*:これらのロールには必須ではありません。

## 専門知識認定
専門知識認定は分野別に分かれており、現在は以下2つの認定試験がリリースされています。
専門知識認定試験の受験には、最低1つのロールベース認定が有効であることが必要です。
これらの試験は、2017年11月時点で英語でのみ受験ができます。

- AWS Certified Big Data - Specialty (BDS)
- AWS Certified Advanced Networking - Specialty (ANS)

# 試験対策
私が推奨しているのは以下3つです。
ホワイトペーパーはほとんどが英語です。しかし、英語の方が有用な情報が多いため、英語での情報収集を推奨しています。

**[クラウドサービス活用資料集（サービス別資料）](https://aws.amazon.com/jp/aws-jp-introduction/#product)**
各サービスごとに解説されています。AWSの利用マニュアルより読みやすくまとまっています。

**[クラウドサービス活用資料集（Well Architected Program）](https://d1.awsstatic.com/webinars/jp/pdf/services/20170314_AWS-BlackBelt-WellArchitected.pdf)**
AWSの設計がベストプラクティスに則っているかを判断する基準になります。私は問題に解答する際に、Well Architectedに則っているか？をチェックしています。

**[AWS ホワイトペーパー](https://aws.amazon.com/jp/whitepapers/)**
ユースケースにのっとってAWSのサービスが解説されています。各サービスの連携など、体系的な知識を身につけるために読んでいます。

# 受験方法
[AWS トレーニングおよび認定ポータル](https://www.aws.training/CertMetrics/Sso)から受験できます。
APNパートナーの方は、APNポータル経由でサインインを選択してください。

# 認定試験の今後（私見）
専門知識試験が2016年のre:Invent前にリリースされ、2017年のre:Invent前にはCloud Practitionerがリリースされました。
AWS認定の裾野を広げるアップデートが繰り返されており今後も継続的にアップデートが起こると考えられます。

**専門知識認定の拡大**
以前、Securityに関する専門知識認定のリリースが検討されていましたが、延期されました。
Securityも含め、ServerlessやIoTなど知識を問う試験がリリースされていると予想しています。

**認定試験の問題のアップデート**
AWSのサービスは日々アップデートされているため、一部、現在のサービスの仕様とAWS認定試験の問題に齟齬が発生しています。
サービスの追加やアップデートに合わせたアップデートがあると予想しています。

**Professionalより上位のレベルの新設**
以前は、Professional試験よりも上位のMasterレベルの試験の新設が検討されていました。
延期されたか、キャンセルされたかも、どのような経緯で現在リリースされていないかも不明です。
SolutionArchitectProfessional試験やDevOpsEngineerProfessional試験で問えていないレベルの内容も多くあるため、今後のリリースが想定されます。
JavaScriptでHTMLの要素にデータを紐付けたいときは、WeakMapを使うとよい

JavaScriptでHTMLの要素にデータを紐付けたいときは、[WeakMap](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)を使うとよい。

## WeakMapとは

WeakMapとは、オブジェクトをキーとして、それに値を紐付ける仕組みである。詳しく知りたい人は、[uhyohyo.netの記事](https://uhyohyo.net/javascript/16_1.html)を読むとよいだろう。

なお、WeakMapは[IE11でもサポートされている](https://msdn.microsoft.com/ja-jp/library/dn251546.aspx)。

## 例

```html
<button type="button" class="button">ボタンA</button>
<button type="button" class="button">ボタンB</button>
<button type="button" class="button">ボタンC</button>
<button type="button" class="resetButton">リセット</button>
```

```js
const map = new WeakMap();
const buttons = document.querySelectorAll('.button');
const resetButton = document.querySelector('.resetButton');

buttons.forEach((el) => {
  const dataset = { count: 0 };
  map.set(el, dataset);

  el.addEventListener('click', () => {
    dataset.count += 1;
    console.log(`${el.textContent}: ${dataset.count}`);
  });
});

resetButton.addEventListener('click', () => {
  buttons.forEach((el) => {
    const dataset = map.get(el);
    dataset.count = 0;
  });
});
```

☞ [デモ](https://codepen.io/bita-shimada/pen/Kyyadq?editors=1011)

## カスタムdata属性では駄目なのか

[カスタムdata属性](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/data-*)を使ってHTMLの要素にデータを保存することもできるが、それには2つ問題がある。

### 文字列しか保存できない

HTMLのすべての属性値は文字列なので、カスタムdata属性にも文字列しか保存できない。文字列ではない値をセットしても、文字列として保存される。

```html
<div id="sample"></div>
```

```js
const sample = document.getElementById('sample');

sample.dataset.number = 1;
console.log(sample.dataset.number === 1); // => false
console.log(sample.dataset.number === '1'); // => true

sample.dataset.boolean = true;
console.log(sample.dataset.boolean === true); // => false
console.log(sample.dataset.boolean === 'true'); // => true
```

### グローバル空間である

そしてもっと大きな問題は、データの保存先がグローバル空間であるという点である。

カスタムdata属性にデータを保存するということは、プログラム全体で共有された空間に値を保存するということである。だからどこかで上書きされる危険性があるし、名前（属性名）の衝突という問題も起こりうる。

つまり、カスタムdata属性にデータを保存するということは、グローバル変数にデータを保存するようなものなのだ。

カスタムdata属性は、読み取り専用として使うのが安全だろう。

## jQueryの`.data()`では駄目なのか

jQueryの[`.data()`](https://api.jquery.com/data/)を使うと、要素に文字列以外のデータも保存できる。しかしデータの保存先がグローバル空間であるという点は、カスタムdata属性にデータを保存するのと同じである。
エンジニアリング・マネージャの技術との関わりかた、あるいは折り合いのつけかた

(この記事は [Livesense - 関 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/livesense-kan) 掲載のために書かれています)

2017年の春からリブセンスのエンジニア組織改善に関わり、同年夏頃からエンジニア職能の全社リーダを任されることになった能登と申します。社内的には Livesense Engineer Leader という名前の役割なのですが、実質 VP of Engineering の仕事をしており、社内にエンジニアリング・マネージャを増やすことも重要な「おしごと」になっています。

エンジニアリング・マネージャは、主にエンジニアの評価・育成・メンタリングや組織面の問題解決を行う役割ですが、正直言って目指そうとする人は少ないです。エンジニアになろうとする人は技術が大好きか、人とのコミュニケーションをわずらわしいと思うことが多いので、自然なことだと思います。自分も昔はそういう人間でしたし、いまだに内向的な性格は変わらないままです。

ただ、ピープル・マネジメントの部分を、エンジニアリングを理解しない人に任せようとすると

* ビジネスの論理が先行し、エンジニアリングの論理がないがしろにされる
* エンジニアのキャリア形成やモチベーション (≒ 技術の楽しさ) が理解されない

という問題が発生しがちです。

非エンジニアにこういったことを理解してもらうより、エンジニアがピープル・マネジメントをするほうが一般的に容易です。言い方を変えると、非エンジニアにエンジニアの権益を代表してもらうより、エンジニア自身が代表した方がうまく機能しやすいのです。したがってエンジニア、あるいはエンジニアリングをしっかり経験した人がエンジニアリング・マネージャになったほうがよいとされます。

# ここで言うエンジニアリング・マネジメントとは

ちなみに、誤解されないようにまとめておくと、ここで言うマネジメントとは

* 人を管理・コントロールする

というより

* 性善説に基いて信頼して仕事を任せられるメンバーを集める
* その人たちがエンジニアリングに集中できるようあらゆる問題解決を行う
* 問題を感じる時、声を上げられるように心理的安全性を確保する
* 仕事の成果と、メンバーの成長を重ね合わせられるよう目標設定/評価する
* 他部門、他職種の人との調整・対話を行う/促進する
* ここにあげたようなことを自然と実現できるような仕組みづくり、意思決定をする

などを指します。どちらかというと「サーヴァント」と呼ばれるような役割が多くて、それを通して得た知見を元に意思決定をしていきます。

この役割の捉え方は、技術面の責任者 = テクニカル・リード/アーキテクトや、プロダクト面の責任者 = プロダクト・マネージャとの分担として存在するものです。実はもうひとつ、組織のマネージャとして「どんな状況でもなんとかする、結果を出す」という役割もあったりしますが、その有効な実現手段として上記の「サーヴァント」の役割を果たすという側面もあります。

# エンジニアリング・マネージャはコードを書く時間がとれない問題

さて、ある程度の規模のメンバーを対象とするとなるとエンジニアリング・マネージャ専業とならざるを得なくなり、プロダクト・コードを書く、技術の問題に取り組むという時間がなくなるのが問題です。

私はエンジニアリング・マネージャとして 10 年くらいこの問題と付き合って来ましたが、今日は現時点での結論を紹介したいと思います。

いちばん重要なのは、

**「一線でコードを書く人の気持ちを忘れない、そういった人たちへのリスペクトを忘れない」**

ということです。

アンチパターンなのですが、マネジメントを目指す人には、技術について挫折した人が一定いるのも確かです。そういった人は、得てして「技術は重要ではない」と言いがちです。マネジメントを任された人は組織上一定の権限を与えられています。そういった状況で自分が苦手なことの価値を下げるような判断もできてしまいます。つまり、技術より自分の論理を先行させてしまうということです。

多階層の下請け構造に支えられた受託開発の世界では、技術を武器にするより、一時的に集めたメンバー全員が使える無難な技術で納品までたどり着かせるということが重要ですし、永続的に維持される信頼関係に基づいたチームを作る必要もありません。日本で今なおソフトウェア分野のエンジニアが多く存在する受託開発の世界でのマネジメントと、自社プロダクト企業で先に説明した「サーヴァント」中心とするマネジメントでは目指すものが異なります。

何のためにマネジメントの役割を担うか? それはプロダクト実現の中核を担うエンジニアが働きやすい環境を作るためです。エンジニアが苦手なコミュニケーションと、組織づくりを代理して行うのです。そこでの主役はマネージャではなくエンジニアであり、技術はエンジニアの重要な武器です。そのエンジニアや技術を損なうような悪は決してなさない。それをきちんと担保することができれば、マネージャ本人がコードを書いているか、技術の問題に取り組んでいるかは本質的な問題にはならないはずです。

むしろ、マネージャ本人がコードを書いているべきという言い方は、その行為が「この人はコードを書く人の気持ちを忘れていないはずだ」ということを示す実例だからではないでしょうか。

もちろん、「自己組織化」というキーワードがあるように、自分たちの問題を自分たちで発見し、解決していくようなチームづくりも可能だと思います。そうすると、定常的なものについては自分がタッチせず、より例外的・変則的な事象のみ対応するというマネジメントも可能になってきます。そのようなチームづくりを通して自分の時間を確保してコードを書くというのも一つの手です。

# コードを書いていないという罪悪感を払拭する

自分は長く「自分がコードを書いていない」という罪悪感を感じながら、エンジニアリング・マネージャ (あるいはエンジニア人事、エンジニアリング・アドバイザー) をし続けてきました。罪悪感というのは人の心をむしばみます。いつも何か悪いことをしている気持ちが拭いきれない。後ろめたい。。。自己肯定感を著しく損なってきました。

ただ、ある時、気づきました。

「自分はコードを書くことより、エンジニアひとりひとりと向き合いながら、エンジニアが働きやすい組織を作る方が好きだ」

ということに。そして、それは上記の「コードを書く人の気持ちを忘れない」を守る限り悪ではない、ということに。

そういう風に、肯定的にエンジニアリング・マネージャのしごとを捉える人が、社内外問わず、日本に増えてくれることを祈っています。そうすると多数派を占めるエンジニアのみなさんにとっても、自分が苦手なことをしてくれる人が増えてより働きやすくなると思いますよ!

[→ Livesense - 関 Advent Calendar 2017 の他の記事を探す](https://qiita.com/advent-calendar/2017/livesense-kan)
PHPでタイム・ゾーンを設定する

こんなエラーが出たら、タイム・ゾーンの設定をしなければいけない。
いわゆる、タイム・ゾーンの設定ができていないということだ。

```
Warning: date(): It is not safe to rely on the system's timezone settings. You are required to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. 
```

設定するには、日付・時刻の関数である
date_default_timezone_setを使う。

```php
date_default_timezone_set('Asia/Tokyo');
```

PHPではなく設定ファイルで設定するならphp.iniで下記のように設定できる。

```php
date.timezone = "Asia/Tokyo"
```

Mysqlで日付のカラムを使用する時にPHPでこれらの設定が必要ですね。
Webラジコンと言うものをつくりました。

#自己紹介

じゅんじゅんと言うニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪3回生です。（2017/12/03現在）

イベントや、勉強会に参加してるので是非お会いした際はお声掛けください！

# Webラジコンとは

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90347/40f359b7-b071-1141-d2f4-34f9da2c99eb.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90347/a1c67c31-6077-05a6-9e21-2f2ad04b415b.png)

もう2年前になりますね。。。

1年生の時につくったWeb（ios safariなど）で実際のラジコンを操作するというIoTです。

これは学校（HAL大阪）の学内コンテスト？でつくったものなんですがこれの技術的な話を書いていなかったので書いていきたいと思います。

# なにで動かしているのか


このIoTにおいて、問題だったのがブラウザの値をいかにリアルタイムにラジコンに伝えるか。でした。

最初は「[milkcocoa](https://mlkcca.com/)」というサービスを使っていたんですが、少し遅延（数百ミリ秒）が発生していたのでまだ突き詰めれると思って、いろいろ技術を調べていくうちに「web socket」っていうものがあるらしいぞってことに気が付きました。

# web socketってなに？

> WebSocket（ウェブソケット）は、コンピュータネットワーク用の通信規格の1つである。 ウェブアプリケーションにおいて、双方向通信を実現するための技術規格である。(wikipediaより)

**双方向通信を実現するための技術規格である！！**

なるほど。これを使えばよさそうだぞと。



....


........


で、どうするの？？？？？？？？？？


簡易的なライブラリがあるのでそれを使いましょう。

今回僕達は[socket.io](https://socket.io/)を使いました。

全体の構成は以下のようになります。

![スクリーンショット 2017-12-03 9.58.10.png](https://qiita-image-store.s3.amazonaws.com/0/90347/25b1634e-1cb9-8840-a457-3fa57461af72.png)

サーバーはNode.jsで作ったので、Nodeのサーバーへクライアント（web）から値を送って、それを監視しているCで書かれたラジコンのプログラムが値を読んでラジコンのステアリングなどを行っています。

# 詰まったこと

詰まったことはまずWeb Socketがなんたるかを理解できていなかったのとJS力が皆無過ぎたので、どう書けばいいかわからなかったことです。

後ほどコードを公開しますが、ちょ〜〜〜〜汚いのでくっそ暇な人はPR送ってください（またリファクタします...）

# まとめ

web socketは実は結構主流に使われているし、IoTで活用し易いかなとおもうのでぜひぜひ皆さん使ってみてください！！！

# あとがき

Twitterやっています。

[@konojunya](https://twitter.com/konojunya)

このプロジェクトは相棒のまっきー [@makki0205](https://twitter.com/makki0205) と一緒につくったものになります。

コードは [HEW-raspberryPI](https://github.com/HALDevelopersTeam/HEW-raspberryPI)

です。
GitLabのビジネスモデル

[GitLab Advent Calendar 2017](https://qiita.com/advent-calendar/2017/gitlab) 3日目の記事です。

GitLabはオープンソースとして開発されていますが、その開発は営利企業であるGitLab社が主導して行っています。本記事ではGitLab社のビジネスモデルを説明します。

最初に結論から書いてしまうと、GitLab社が採用しているビジネスモデルとオープンコアビジネスモデルであると[こちらの記事](https://about.gitlab.com/2016/07/20/gitlab-is-open-core-github-is-closed-source/)に書かれています。具体的には、ビジネスのコアとなる部分をオープンソースとして公開し、エンタープライズ向けの追加機能はクローズドソースとして開発する戦略を取っています。

このオープンソースとして開発されているのが[GitLab Community Edition](https://gitlab.com/gitlab-org/gitlab-ce)(以下CE)であり、クローズドソースとして開発されているのが[GitLab Enterprise Edition](https://gitlab.com/gitlab-org/gitlab-ee)(以下EE)となります。ちなみに、GitLab EEもソースは公開されていますが、プロプライエタリなライセンスであるため、クローズドソースに分類されます。

現時点におけるGitLab社の主な収入源はGitLab EEのライセンス料金となります。このライセンス料金はユーザー単位の課金方式となっていて、月単位での支払と年単位での支払を選べる様になっています。もちろん年単位での支払の方が料金は安くなります。

つまり、GitLab CEの開発費用をGitLab EEの売上で賄っている形になっています。そこで、重要となるのがGitLab CEには含めないでGitLab EEのみに追加する機能をどうするかという問題です。GitLab EEの売上でそれなりの収益を上げないと、GitLab CEを継続的に開発することもできません。そのため、GitLab EEに追加する機能の判断基準が存在しますが、それについては別の記事にしたいと思います。
【ぶっちゃけiOSアプリ開発】手っ取り早くObjective-cを理解する | その5 @〜コンパイラディレクティブ

細かいことや例外的なことは後回しでいいので、手っ取り早くObjective-cを理解して使い始めたいという人向けです。他言語を経験していることが前提です。
その5はコンパイラディレクティブについてです。@〜というやつです。どうしても知っておくべきものに絞って解説します。

#知っておくべきもの
###@interface〜@end
クラスを定義する。変数やメソッドを宣言する。
詳細は「[その1 ヘッダファイルと実装ファイル](https://qiita.com/Pinehead/items/227a7bdb04f7fc41b9b6)」を参照。
###@implementation〜@end
クラスを実装する。変数やメソッドをの実体を記述する。
詳細は「[その1 ヘッダファイルと実装ファイル](https://qiita.com/Pinehead/items/227a7bdb04f7fc41b9b6)」を参照。
###@property,@synthesize
@propertyは外部に公開する変数（プロトコル）を宣言する。@synthesizeは変数を実装する際に別名を使う場合に使用する（使用しなくてもいい）。
詳細は「[その3 変数とプロパティ](https://qiita.com/Pinehead/items/f4c73ec12fd5b34489ce)」を参照。
###@"文字列"
文字列を使う時は、ダブルクォーテーション"〜"で囲うのに加えて、先頭に@をつける。

```objectivec
   NSString *name = @"Billy Joel";
```

###@public,@protected,@private　と　@try,@catch,@finally
他の言語と同じ。

> その他は必要になったときに調べてください。

#コンパイラディレクティブについてもっと知りたい人
コンパイラディレクティブとは、コンパイラに対する命令である。
Objective-cとして書いて欲しいコードは本当はもっと面倒な別の形なのだが、コンパイラディレクティブを使うとプログラマーは書きやすくなる。
コンパイラがプログラマーに代わってコードを展開してくれる。
###例
- @propertyを使わないと、プログラマーは変数を宣言するたびにセッター/ゲッターメソッドを実装しなければならない。
- @"文字列"を使わないと、「2.@を使わない書き方」のように書かなければならない。

```objectivec:1.@を使った書き方
   NSString *name = @"Billy Joel";
```

```objectivec:2.@を使わない書き方
   NSString *name = [NSString stringWithCString:"Billy Joel" encoding:NSUTF8StringEncoding];
```


---
ぶっちゃけiOSアプリ開発は、アプリ開発にあたってとりあえず知っておくべきことをズバリ書きます。例外はありますのでご了承ください。
TensorBoardの最もシンプルなサンプル

# 追記
もう少し実用的な記事を書いた
[TensorBoardのシンプルな解説]
(https://qiita.com/yabeenico/items/738d91a8f14d9430f5da)

# 環境
```
$ python3 --version
Python 3.5.4
$ pip3 list|grep tensor
tensorboard (1.0.0a6)
tensorflow (1.4.0)
tensorflow-tensorboard (0.4.0rc3)
```

# インストール
```
$ pip3 install tensorflow tensorboard
```

# サンプル
c = a + b のグラフをTensorBoardで表示

``` tensorboard_graph.py
import tensorflow as tf

a = tf.constant(2, name='A')
b = tf.constant(3, name='B')
c = tf.add(a, b, name='C')

sess = tf.InteractiveSession()
writer = tf.summary.FileWriter('./logdir', sess.graph)
tf.global_variables_initializer().run()
print(sess.run(c))
```

```
$ python3 tensorboard_graph.py
5
$ tensorboard --logdir='./logdir'
TensorBoard 0.4.0rc3 at http://localhost:6006 (Press CTRL+C to quit)

```

するとカレントディレクトリにlogdirが生成され，その中にグラフの情報が保存れる.
ブラウザで [http://localhost:6006](http://localhost:6006) にアクセスするとTensorBoardの画面が表示される.
![tensorboard_graph.png](https://qiita-image-store.s3.amazonaws.com/0/101023/93fcb253-19f9-2121-da4b-745514692ed9.png)

# TensorBoardは表示されるがグラフが表示されない場合
```$ python3 tensorboard_graph.py```
の前に
```$ rm -rf ./logdir```
を実行する.
その時tensorboardは終了しておく.
AppEngine + Cloud SQL で Railsをデプロイする方法（GCP）

# GCPの準備
1. プロジェクトを作成
2. APIを有効化 Cloud SQL を有効化（確認？）
3. APIを有効化 Cloud SQL APIを有効化
4. Cloud SQLでインスタンスを作成
5. AppEngineを有効にする
6. Cloud IAMの設定を行い、buildできるようにする（app_engineのbuild時にcloudsqlを操作できるようにする）

```bash
$ gcloud projects add-iam-policy-binding [project_id] \
 --member=serviceAccount:[project_number]@cloudbuild.gserviceaccount.com --role=roles/editor
```

# Railsのプロジェクトの準備

### 1. secret_keyを生成（後ほどyamlに記述します。）

```bash
$ bundle exec bin/rails secret
```

### 2. assetsのコンパイル

```bash
$ bundle exec bin/rails assets:precompile
```

### 3. app.yamlを追加

```yaml:app.yml
entrypoint: bundle exec rackup --port $PORT
env: flex
runtime: ruby
env_variables:
  SECRET_KEY_BASE: [SECRET_KEY]
```

### 4. db情報の追記(config/database.yml)

プロダクジョンに以下のを追記

```yaml:conf/database.yml
username: "[YOUR_MYSQL_USERNAME]"
password: "[YOUR_MYSQL_PASSWORD]"
socket:   "/cloudsql/[YOUR_INSTANCE_CONNECTION_NAME]"
```

# デプロイ

### 1. [YOUR_INSTANCE_CONNECTION_NAME]を調べる

```bash
$ gcloud sql instances describe [インスタンスID]
```

### 2. データベースの準備 1 create

```bash
$ bundle exec rake appengine:exec -- bundle exec rake db:create
or
$ gcloud beta sql connect [インスタンスID] --user=[username] --password
> create database [database_name]
```

### 3. データベースの準備 2 Migration

```bash
$ bundle exec rake db:migrate
$ bundle exec rake appengine:exec -- bundle exec rake db:migrate
```

### 4. デプロイ

```bash
$ gcloud app deploy --no-promote
```
SIerが機械学習案件を受注する場合に注意すべき点に関して

# 前提
「[機械学習案件を納品するのは、そんなに簡単な話じゃないから気をつけて](https://qiita.com/yoshizaki_kkgk/items/fa8b45918445bb3e6dc3)」を読んで、機械学習案件を「請負契約」で受注する事があるのか、と驚きました。

もしかしたら、SIerで機械学習に関係せざるを得ない人がいるのかもしれませんので、実際にそれなりの件数機械学習案件を納品している経験から、参考になりそうな事を書いてみたいと思います。

# 疑問
そもそも 通常のSIer では最初から「機械学習を利用したシステム作成してよ」とお客様から依頼される事があるのでしょうか?
わたしはそのような話をあまり聞いた事がありません。

通常、お客様は「何か解決したい問題」がありそれを解決する時「最近良く聞く機械学習とかはどうなの?この場合使えたりするの?」や「解決方法提案してよ」のような質問がされ、「機械学習」で解決できる内容の**場合がある**、というパターンがほとんどであるという認識です。

無理やり機械学習利用したい、なんてお客様いないはずです。

もしも依頼時に機械学習を使いたいという依頼があるとしたら、あらかじめお客様側で簡単に実験していたりする場合が多いはずです。

ただ、その場合でもお客様自信は開発の素人ですから、それで問題が本当に解決するか不明な状態です。受注する側もお客様が実際に解決したい事項を理解できているか不明なはずです。

# 結論
結論から書いてしまえば、SIer で機械学習必要かもという案件を受注しそうな場合、以下を注意します

- お客様の解決したい問題に対して本当に機械学習が必要か十分に検討する事
- 機械学習を中心として考えるのではなく、「操作UI」や「出力帳票」(つまり見せ方)を中心に考える事
- 機械学習開発開始時点では「請負契約」に「しない」事

です。

また、検討初期の流れとしては以下のような流れになります。

![検討初期の流れ.png](https://qiita-image-store.s3.amazonaws.com/0/203673/79c206ed-533f-64fe-0009-373ba77afb09.png)



# 理由
それぞれの理由を書いてみます。

## お客様の解決したい問題に対して本当に機械学習が必要か十分に検討する事
機械学習が必要そうに見える案件は、「データ解析」案件であるはずです。
「データ解析」案件の多くは「Excel」か「Access」で十分な場合が結構あります。

費用対効果の検討は必須です。機械学習案件は現状時間とお金が結構かかる事を覚悟すべきだと思います。

## 「操作UI」や「出力帳票」(つまり見せ方)を中心に考える事
機械学習だと「データ」を用意して「推定器」を生成し、「Precision」や「Recall」、「MSE」や「RMSE」と言った評価値で評価する、という事になります。

ただし、「どの値をどのような値にするとお客様の問題が解決するか不明」な場合がほとんどのはずです。

**お客様に確認していただくのが大前提**です。

たとえば、「Recall」が「0.6」だと低いように感じますが、「TP」の数が十分であれば「半分以上上手くいっている」という事で「問題が解決」する場合もあるのです。

推定器のチューニングが無意味な場合さえありますし、チューングしすぎると問題がかえって解決しない、という事態が発生する事さえあります。
精度がそこまで良くない方が、「お客様の問題解決には」良い事さえ実際にはありえます。

まずは **結果をお客様に見てもらう**ことを考えて、作成しましょう。

## 機械学習開始時点では「請負契約」に「しない」事
機械学習は、実際にやるまで上手く行くか不明な場合がほとんどです。「請負契約」は成果物の完成を契約してしまうので、機械学習案件には不向きです。

機械学習部分が問題なく、利用システムを作る部分は請負にしても問題ないと思います。

# まとめ
機械学習を必要とする案件の場合、お客様と一緒になって作る様な対応が必要だったりするので、開発しかできない場合には辛いような気がしています。

結局、「顧客との要件検討」が一番重要、というのは何をやっても同じですね。

以上です


# 書いた人に関して
[Tech Fun株式会社](http://www.techfun.co.jp/)スペシャリスト、xza です。
機械学習案件を現在進行系で実施しています。何回も納品をしています。

守秘義務に配慮して一部記述が曖昧になる場合がある事をご了承ください。

この文章は「[Tech Fun Advent Calendar 2017](https://qiita.com/advent-calendar/2017/techfun)」12日目の記事として書きました。
Numpy > TypeError: iteration over a 0-d array > 要素が１つの時にndimが0になる場合がある > 対処

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

### Error

```test_0-d_array_171203.py
import numpy as np


ain = 1
wrk = np.log(1) / np.log(2)
xs = np.array(wrk)
print(xs.ndim)

for elem in xs:
	print(elem)

```

```txt:run
$ python3 test_0-d_array_171203.py 
0
Traceback (most recent call last):
  File "test_0-d_array_171203.py", line 9, in <module>
    for elem in xs:
TypeError: iteration over a 0-d array
```

log同士の除算などの場合でndimが0になる場合があるようだ。

### 対処

以下で対処する。

```test_0-d_array_171203.py
import numpy as np


ain = 1
wrk = np.log(1) / np.log(2)
xs = np.array(wrk)
print(xs.ndim)

if xs.ndim == 0:
	xs = [xs]

for elem in xs:
	print(elem)
```

```txt:run
$ python3 test_0-d_array_171203.py 
0
0.0
```
イーサリアム・コントラクトのデータ周り

## 基本のデータサイズ
- イーサリアムのブロック生成時間は、平均 15 秒
- イーサリアムのブロックサイズは、固定ではない
    - 含めいているトランザクションの GAS Limit 値の合計値が規定されているブロック単位の GAS Limit を超えてなければ良い
    - ブロック単位の GAS Limit はマイナーが、`+/-  1/2024（0.0976%）` 範囲で調整できる
    - ブロック単位の GAS Limit は現在は `6,706,546` GAS（https://ethstats.net/）

## トランザクションが持つデータ
- コントラクトのメソッドを呼び出す際に、定義されているメソッドのパラメータ毎に値を渡す必要がある
- パラメータ毎の値は、32バイトで
- これらの値はエンコードされ、トランザクションの`data`フィールドに保持される

## ブロックが持つデータ
- stateRoot:stateのマークル木ルートのハッシュ値
- transactionsRoot:トランザクションのマークル木ルートのハッシュ値
- receiptsRoot:レシートのマークル木ルートのハッシュ値

### 疑問
- ハッシュ値だけ？データの本体はどこにあるの？

## スマートコントラクトが持てるデータ
- コントラクトアカウント毎にストレージ領域がある
    - 持っている全データのマークル木のルートハッシュを持っている
- スマートコントラクトを定義する際、`mapping (address => uint256)`のような、`どのアドレスがどの残高を持っているか`の情報を保持する場合は、特に制限がない。

## 参考記事
- [[Japanese] Ethereum Development Tutorial · ethereum/wiki Wiki](https://github.com/ethereum/wiki/wiki/%5BJapanese%5D--Ethereum-Development-Tutorial)
- [トランザクションレベルで理解する。イーサリアムの具体的な仕組みを解説](https://zoom-blc.com/what-is-ethereum)
アジャイル侍を目指した話


#概要
半年ほど前に[アジャイルサムライー達人開発者への道](https://www.amazon.co.jp/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%B5%E3%83%A0%E3%83%A9%E3%82%A4%E2%88%92%E9%81%94%E4%BA%BA%E9%96%8B%E7%99%BA%E8%80%85%E3%81%B8%E3%81%AE%E9%81%93%E2%88%92-Jonathan-Rasmusson/dp/4274068560/ref=sr_1_1?ie=UTF8&qid=1512207685&sr=8-1&keywords=%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB+%E3%82%B5%E3%83%A0%E3%83%A9%E3%82%A4)を読んだタイミングで案件を引き継いだので、適用してみました。
本記事では、アジャイルを導入するためにやったことを中心に書こうと思います。

※タスク管理はバックログを使ってます

#対象
アジャイルでやってみようかなと思ってる方。
本で紹介されている以下の３つの真実に「ああ、コレあるわー」と思う方。

**真実１**：プロジェクトの開始時点に全ての要求を集めることはできない
**真実２**：集めたところで、要求はどれも必ずといっていいほど変わる
**真実３**：やるべきことはいつだって与えられた時間と資金よりも多い

#アジャイルサムライ？
それはソフトウェアを顧客に届ける猛々しきプロフェッショナルだ。
（本書より）

#アジャイル
よくある勘違いですが、ドキュメントを作らないのがアジャイルではないです！

ものすごく端的な説明ですが、**「三角測量」**で見積もって、**「イテレーション」**を回し、計測した**「ヴェロシティ」**を元に次のイテレーションで対応するタスクを決める」といった流れになります。

・**三角測量**：基準となるタスクを選び、他のタスクはそれを元に相対的に見積もる。
・**イテレーション**：開発サイクルのこと。 設計・試験・調査・改善という一連の工程。
・**ヴェロシティ**：イテレーションを回す速度。

#やったこと
**1.バックログ**
・ 親課題登録（マスターストーリー）
・ マイルストーン作成

**2.開発チームへの共有**
・三角測量のやり方、サイズ感のすり合わせ

**3.お客さんへの説明**
・簡易的なデモンストレーション

#やり始めてから改善したこと
正直に言うと最初は見積もりの精度が低く、１イテレーションの期限よりも先にタスクが完了していました。
その時は「調整用タスク」として仕様が確定しているタスクやデザイン修正をしていました。

#大切なこと
**1.見積もりに幅をもたせること**
　予め「最短で〇〇人日、最長で〇〇人日」と伝えておくと後々調整しやすいです

**2.プロジェクト全体でアジャイルのルールを守ること**
 イテレーションを回している際は、緊急対応以外ではタスクの追加を行わない等、ルールを徹底する必要があります

**3.正直であれ**
　予定より先にタスクが完了したら、そのことをお客さんに伝えましょう



#感想
今のイテレーションで対応しているタスクと、マスターストーリーを分けて管理すると、基本的には対応中のタスクに関して仕様追加が発生しないので、リリーススケジュールに影響しなくなります。
（導入後、１０回以上リリースをしましたが、直前に稼働が上がったことは一度もないです）

アジャイルの導入にあたっては、開発手法の理解はもちろん、**やったこと**に書いた**２**と**３**が結構大事かなと思います。

開発チームだけが関わることではないので当たり前ですね。
MATLAB: fliplr() > Numpy:実装 > 1次元とN(>1)次元で別処理が必要 | np.flipud(), np.fliplr(), [::-1], ascontiguousarray

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

## MATLAB

https://jp.mathworks.com/help/matlab/ref/fliplr.html

```matlab
>> xs = [3 1 4]

xs =

     3     1     4

>> fliplr(xs)

ans =

     4     1     3

>> xs = [3 1 4; 1 5 9]

xs =

     3     1     4
     1     5     9

>> fliplr(xs)

ans =

     4     1     3
     9     5     1
```

## Numpy

関連: [Numpy: fliplr() > ValueError: Input must be >= 2-d. > １次元のarrayにはエラーを出す](https://qiita.com/7of9/items/2d247a87b7be9727c7d4)

1次元arrayに対してはfliplr()は上記のリンクのようにエラーを出す。
1次元arrayだけ別処理が必要になる。

反転方法として以下の情報がある。
https://stackoverflow.com/questions/6771428/most-efficient-way-to-reverse-a-numpy-array

以下の実装とした。

https://ideone.com/dZJLGr (Python 3.5)

```py3
import numpy as np


def get_fliplr(xs):
    xs = np.array(xs)
    if xs.ndim == 1:
        return np.flipud(xs)
    return np.fliplr(xs)

res = get_fliplr([3, 1, 4])
print(res)
res = get_fliplr([[3, 1, 4], [1, 5, 9]])
print(res)

```

```txt:run
Success	#stdin #stdout 0.12s 24844KB
[4 1 3]
[[4 1 3]
 [9 5 1]]
```

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.flipud.html
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.fliplr.html

### 備考

https://stackoverflow.com/questions/6771428/most-efficient-way-to-reverse-a-numpy-array

に記載の`[::-1]`や`ascontiguousarray`も興味を引いた。
代入なしでローカル変数を宣言するトリビア


## はじめに

この記事は書籍「[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7)」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの3日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。

今回は代入なしでローカル変数を宣言するトリビアを紹介します。

### 必要な前提知識

「プロを目指す人のためのRuby入門」の第2章まで読み終わっていること。

## 代入なしでローカル変数を宣言するトリビア

2.2.8項でも説明したとおり、ローカル変数は事前に何かしらの値を代入する必要があります。

```ruby
# 変数を宣言する目的で変数名だけ書くと、エラーになる
x #=> NameError: undefined local variable or method `x' for main:Object

# 変数を宣言するには何かしらの値を代入する必要がある
x = nil
```

ただし、厳密に言うと、必ずしも代入が行われている必要はありません。次のコードを見てください。

```ruby
if false
  # このコードは絶対に実行されない
  x = 123
end

# 代入は実行されていないが、xを参照してもエラーにはならない
x #=> nil
```

ご覧のとおり、代入は実行されていませんが、`x`を参照してもエラーにはなりません。

なので、厳密に言えば、

Rubyでは実際に代入が実行されるかどうかにかかわらず、代入を行うコードが存在すれば、その時点でローカル変数を宣言したことになる（代入が実行されなかった場合の初期値は`nil`）

ということになります。

ですが、上で示したようなコードは実際に使うと混乱の元になるので、通常は使うべきではありません。ローカル変数には必ず明示的に値を設定するようにしましょう。

### 参考文献

[ローカル変数 | docs.ruby-lang.org](https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#local)

## 次回予告

次回は自分が書いたRubyプログラムをirb上で読み込む方法を紹介します。