OmniAICreator/Qiita-1.07M huggingface dataset:
Udemy Learning : Unity 3D迷路ゲーム開発入門

## Udemy Learning : [Unity 3D迷路ゲーム開発入門](https://www.udemy.com/unity3d-maze/)

### Interest points

- 10.whileによってプログラムを何度も実行しよう (How to control numbers of execution by using While)
    - Attach to Unity, Insert Breakpoint.

- 18.配列変数のすべての要素を対象としたLINQ処理を使おう (LINQ that is like SQL)
    - How to use LINQ, ラムダ式。

- 21.変数の値型と参照型を使い分けよう (Two types of variable: value and reference)
    - 値型・参照型変数の考え方。引数で渡した先で値を変更した際の動き。

- 23.メソッドとの情報のやり取りについてまとめよう (interface between caller and callee of a method)
    - 参照渡しref, out.
    - 名前付き引数・省略可能な引数。

- 28.ロボットを配置しよう (Arrangement of robots)
    - ワールド座標：三次元空間内の座標
    - スクリーン座標：カメラ写像面の**左下原点**の座標。**上限は不定**（画面解像度）
    - ビューポート座標：カメラ写像面の**左下原点**の座標。**画面右上が(1, 1)となる**（相対値）→0.5f, 0.5fで必ず画面の真ん中となる。

- 30.RobotMotionクラスを作成しよう (RobotMotion class that is used for animation)
    - Actionクラス
    - 無名関数・ラムダ式

- 31.マウスクリックの動作を作成しよう (How to make an interface using mouse click)
    - 参照型をコピーして渡す
    - 二重コンストラクタ(同一クラス内コンストラクタからコンストラクタの呼び出し)

- 39.セルを作って迷路をつくろう（その2）(Maze creation based on lattice cells (2))
    - LINQによる配列全体への処理インデックス（ForEach使用時の配列各要素へのアクセス）
 
- Total
    - Static Function = そのクラスのインスタンスを生成しなくても呼び出せる関数。
Sublime text3 での Python のシンタックスハイライト

# 前略
Sublime text3 で Python の開発環境を整える上で、
シンタックスハイライトをデフォルトから変更しようと思いました。

# この記事でわかること
- シンタックスハイライトの変更方法
- カラースキーマの変更方法

# シンタックスハイライト一覧
- Sublime text3 デフォルト
- [Python3](https://packagecontrol.io/packages/Python%203)
- [Python Improved](https://packagecontrol.io/packages/Python%20Improved)

# シンタックスの変更方法
- メニューで`"View > Syntax -> Open all with current extension as..."`を選択。
- 変更したいシンタックス名を選択して変更可能です。

# カラースキーマの変更方法
- メニューで`"Sublime Text > Preferences > Color Scheme..."`をクリック。
- 検索用のターミナルが表示されるので変更したいカラースキーマ名を選択して変更可能です。

# 各シンタックスハイライト & カラースキーマ参考
## Sublime text3 デフォルト & Monokai

<img width="1435" alt="Python.png" src="https://qiita-image-store.s3.amazonaws.com/0/66429/ff684298-314c-18a3-2d2e-d599d428802e.png">

## Python3 & Gloom

<img width="1437" alt="Python3.png" src="https://qiita-image-store.s3.amazonaws.com/0/66429/0131ac86-0ac6-c606-c007-6c02e7f4f879.png">

## Python Improved & Neon

<img width="1439" alt="Improved.png" src="https://qiita-image-store.s3.amazonaws.com/0/66429/50e287d6-f218-a13c-324c-99918e56f5e9.png">

# あとがき
- まずはざっと見た目から判断です。
- TODO: それぞれの特徴について整理。
Parcel触ってみた（React編）

Parcelがめちゃめちゃ便利かもしれない。

# Parcelとは
詳しくは[急上昇のこれ](https://qiita.com/bitrinjani/items/b08876e0a2618745f54a) を見てみると良いかも。

Reactを使っていたのでWebpackは当然使ってたんですが、ちょっと開発するにはどうしても面倒で自分用にboilerplate用意したりしていました。それでもWebpackのバージョンが上がったら使えなくなったりするし、出回ってる情報も古くなっていたして、、割とハードルがある気がしています。

Parcelでは、設定ファイルも不要。Webpackであったようなloaderなどのpluginとかも基本は不要。開発用の配信サーバーも含まれているオールインワン。

内容チラ裏的な感じですが、ちょっと感動したので書いてみる。

## boilerplate的なあれ
https://github.com/haradakunihiko/parcel-boilerplate に、いくつか作って見たので、触って見たい方はこちらを見てもらえれば！

- js
- ts
- react (HMR)
- react (ts × HMR)
- vue (js)
- vue (ts)

らへんがあります。vueは基本的にビルドツールなくても書けるものなんですが、シングルファイルコンポーネントを使ったり、テンプレートを使うためにはやはりビルドツールが必要になってきます。今の所シングルファイルコンポーネントには対応していないのでhtmlを別ファイルに切り出したりして import するなどしてみましたが、htmlファイルのimportにも少し癖があるようで、正直まだ使えないかな、、、

# Reactを書いてみる

ということで、React書くための準備を追ってみるとこんな感じ。
まずparcelインストールします。

```
npm install -g parcel
```


React周りのモジュールインストールして、

```
npm install --save react react-dom
npm install --save-dev babel-preset-react-app
```

.babelrc書いて、

```json:.babelrc
{
  "presets": ["react-app"]
}
```

index.htmlとindex.js書いて、

```html:index.html
<html>
    <body>
      <div id="app"></div>
      <script src="./index.js"></script>
    </body>
  </html>  
```

```js:index.js
import React from 'react';
import ReactDOM from 'react-dom';
const Application = () => {
  return <h1>Hello world!</h1>
}
ReactDOM.render(<Application />, document.getElementById('app'));
```

parcelを実行する。

```
parcel index.html
```

デフォルトだと、 `localhost:1234` にアクセスできるようになります。

なんとこれで終わり。。 `index.html` をビルドするってのが少し風変わりですが、割とこれが便利な気がしています。
さて、ビルドされると、

```
 - dist
   - index.html
   - f6db8e4a9e4ad2bca9f441b0f7e3d3e6.js
```
のようなファイルが生成されます。index.htmlに書いていた `src="index.html"` が上記のjsファイルのパスに変更される感じ。ちなみにjsをビルドしたいだけだったら `index.js` を指定すればOKです。

これだけでいわゆるdev server(js/htmlの配信サーバー)が起動するので、jsを変更すればリロードがかかって便利。

あと、ReactをHMRに対応するには、babelのpluginの `react-hot-loader` を入れる必要があります。

```
npm install --save-dev react-hot-loader
```

```json:.babelrc
{
  "presets": ["react-app"],
  "plugins": ["react-hot-loader/babel"]
}
```

```js:index.js
import 'react-hot-loader/patch';
import React from 'react';
import ReactDOM from 'react-dom';
import { AppContainer } from 'react-hot-loader'

const Application = () => {
  return <h1>Hello world!</h1>
}

ReactDOM.render(<AppContainer><Application /></AppContainer>, document.getElementById('app'));
```

これだけでできるなんて、便利な世の中だ。。
最近のWebpack事情はわからないけど、当初は (これ)[https://qiita.com/haradakunihiko/items/40486ec2b6b9aea119bb]
Circe de JSON for Scala

## はじめに
みなさんScalaでJSON扱うとき何を使っていますか。ぼくは最近までjson4sを使っていたのですが、コア部分でアクロバティックなことをした結果としてメンテが難しい状況になっていると聞いて、割と近しい代替手段を探していましたが、Circeが良さそうなので新プロジェクトはこちらに移行してます。

Circeの特徴は

- case classの自動フォーマット(case class用のフォーマッタが不要
- Scala2.12以降でないとマトモに動かない
- cats依存

https://circe.github.io/circe/

## どんな感じよ
とりあえず公式サイトからのコピペ。まずbuild.sbtに以下の依存を追加。

```scala
val circeVersion = "0.8.0"

libraryDependencies ++= Seq(
  "io.circe" %% "circe-core",
  "io.circe" %% "circe-generic",
  "io.circe" %% "circe-parser"
).map(_ % circeVersion)
```

基本的な使い方

```scala
import io.circe._
import io.circe.generic.auto._
import io.circe.parser._
import io.circe.syntax._

sealed trait Foo
// defined trait Foo

case class Bar(xs: List[String]) extends Foo
// defined class Bar

case class Qux(i: Int, d: Option[Double]) extends Foo
// defined class Qux

val foo: Foo = Qux(13, Some(14.0))
// foo: Foo = Qux(13,Some(14.0))

foo.asJson.noSpaces
// res0: String = {"Qux":{"i":13,"d":14.0}}

decode[Foo](foo.asJson.spaces4)
// res1: Either[io.circe.Error,Foo] = Right(Qux(13,Some(14.0)))
```

発展的に自前でScala的enum型のEncoderを書いてみようとしましたが、もっと詳しい記事があったのでそっちを参照。

https://qiita.com/shinharad/items/6b9258257d4ada3f3029

## Playframeworkとの連携
play-circeでいいんじゃないかな。

https://github.com/jilen/play-circe

controllerはこんな感じに

```scala
package controllers

import javax.inject.{Inject, Singleton}

import io.circe.generic.auto._
import io.circe.syntax._

@Singleton
class LogController @Inject()(val cc: ControllerComponents) extends AbstractController(cc) with Circe {
  def show(id: Long) = Action {
    Log.findById(id).fold(NotFound(s"Not found id=${id}")) { log => Ok(log.asJson) }
  }

  def create() = Action(circe.tolerantJson[CreateLog]) { req =>
    if(Log.create(req.body) > 0) Success else SQLError
  }
}
```

OkにcirceのJSON型を突っ込めば返り値として使えるし、tolerantJsonとかで型を指定してやればPOSTメソッドでJSONを受け取るようにできます。play-json4sより新しいだけあってシンプルかなと。

## 最後に
Circe割と気に入ったので布教したくて色々書こうとしたけどコピペとリンクだけになってしまいましたという酷い話です。本当にすみません。みんなCirceで快適なScalaライフを!
Python / ループでリストやデータフレームを作成

自分用のメモですが、少し検索した感じ日本語の記事はすぐには見つからなかったので、公開しておきます。ループでリストやデータフレームを作る方法です。stack overflowのこの質問に答えがありました。
[stack ovreflow : Create multiple dataframes in loop](https://stackoverflow.com/questions/30635145/create-multiple-dataframes-in-loop)



質問にあるように、安直に以下のようなループを回してもデータフレームはできません。（リストも同じ）

```py:In[1]
import pandas as pd
list = ['a', 'b', 'c']
for i in list:
    i = pd.DataFrame()
print(a, b, c)
```

```py:Out[1]
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-2-8a28fab34b93> in <module>()
      3 for i in list:
      4     i = pd.DataFrame()
----> 5 print(a, b, c)

NameError: name 'a' is not defined
```


ということで、こういう場合下のように辞書に収める方法が良いらしいです。

```py:In[2]
list = ['a', 'b', 'c']
d = {}
for i in list:
    d[i] = pd.DataFrame()
```

```py:In[3]
for i, df in d.items():
    print(i, df)
```

```py:Out[3]
a Empty DataFrame
Columns: []
Index: []
c Empty DataFrame
Columns: []
Index: []
b Empty DataFrame
Columns: []
Index: []
```

`list`の要素をキーとしてデータフレームができています。

参照は`In[3]`のようにキーと値（データフレーム）を指定したループではシンプルに`df`でよく、`In[2]`のようにキーだけのループになると、以下のような参照の仕方になります。

```py:In[4]
for i in list:
    d[i]['column1'] = [1, 2, 3]
    print(i, d[i])
```

```py:Out[4]
a    column1
0        1
1        2
2        3
b    column1
0        1
1        2
2        3
c    column1
0        1
1        2
2        3
```
GASでGoogle DocumentにGoogle Calendarのイベントを表示させる

この記事はCPS Lab Advent Calendarの10日目です。

僕達の研究室では毎週ミーティングの度にGoogle Documentで議事録を取っています。しかし、毎回その日の議事録をテンプレートから生成している手間や、ミーティングの度にDocumentとは別にカレンダーを開いて予定を確認する手間が鬱陶しくなってきました。
そこで今回は議事録改善の第一歩としてカレンダーのイベント情報を取得し、Google Documentで表示できるようにしてみました。以下がその方法です。

# Google Apps Scriptを開く
![doc.png](https://qiita-image-store.s3.amazonaws.com/0/109752/8e246d36-ea9b-ff62-2c04-069e12537d06.png)
Google Documentで空白のDocumentを作成し、[ツール]から[スクリプトエディタ]を選択します。

# Google CalendarのIDを取得する
![cal.png](https://qiita-image-store.s3.amazonaws.com/0/109752/565f2bd1-7cd1-87cd-109f-c2da1661d01a.png)
Google CalendarのIDはマイカレンダーに表示してあるカレンダーの設定から取得することができます。設定を開くとカレンダーIDが表示してある部分があるのでそのIDをコピーして控えておきます。

![cal2.png](https://qiita-image-store.s3.amazonaws.com/0/109752/46c70bf0-87ab-c0bb-acd6-489c485d74fd.png)

ちなみに今回登録している予定は上の画像のとおりです。(予定は架空のものです)

# Google App Scriptにコードを記述する
``` 
function getCalendar(){
  
  var body = DocumentApp.getActiveDocument().getBody();
  var calendar = CalendarApp.getCalendarById("your Calendar ID");
  var now = new Date();
  var twoWeeksFromNow = new Date(now.getYear(), now.getMonth(), now.getDate() + 14);
  var event = calendar.getEvents(now, twoWeeksFromNow);
  var day = ["日", "月", "火", "水", "木", "金", "土"] 

  body.appendListItem("スケジュールリスト").setGlyphType(DocumentApp.GlyphType.HOLLOW_BULLET);

  for(var i = 0; i < event.length; i++){
    var time = event[i].getStartTime();
    body.appendListItem(time.getMonth() + "/" + time.getDate() + "("+day[time.getDay()] +")" + " " +　event[i].getTitle()).setNestingLevel(1).setIndentStart(72)
      .setGlyphType(DocumentApp.GlyphType.HOLLOW_BULLET);
  }
}
``` 
CalendarAppクラスのgetCalendarByIdメソッドの括弧内に先程取得したCalendar IDを貼り付けることでカレンダーの情報を取得することができます。上記のコードでは現在の日付から2週間後までの予定を取得してリスト形式で表示させています。

# 関数を実行する
コード記入欄の上部にある[関数を選択]を押し、getCalendarメソッドを選択する。その後、実行ボタン(▷)を押して実行する。

# 出力結果
実行すると承認を許可するか聞かれるので[許可を確認]ボタンを押すとDocumentにこのように出力される。
![doc2.png](https://qiita-image-store.s3.amazonaws.com/0/109752/72f24b3f-5fc9-8ae2-d042-d3c9f1e262f9.png)
(※承認時に「このアプリは確認されていません」と表示される場合は、そのメッセージの下の詳細から「(プロジェクト名)に移動」というリンクをたどって承認を許可する)

# 最後に
研究室の議事録にはまだこのカレンダーのスクリプトは導入していないですが、近々導入する予定です。カレンダーの他にも名簿のGoogle　SpreadSheetからメンバーの名前を取ってきたり、毎週議事録を自動生成してslackに通知飛ばしたりと拡張していこうと思ってます。(コードの書き方等ツッコミがある方は気兼ねなくツッコんでください)
MacBook Pro (touch barあり)が、フリーズしてこの世の終わりかと思った

結構使わず嫌いな人が多い、touch barありのMacBook Pro。
使ってみると、そこまで不便じゃないし、逆にtouch barにお世話になったこともあるので...

そんなMacBook Proがこちら。

![macos-sierra-macbook-pro-touch-bar-animation-hero.gif](https://qiita-image-store.s3.amazonaws.com/0/9094/e4645fc4-4546-83c5-1970-0a6d8cee97de.gif)

そう！！ **電源ボタンがない**のです。

購入後に気づいて、半年くらいたったけど。フリーズしたことがないからいいか...とずっと放置。
本日フリーズを初体験しました。

この世の終わりかと思った。
電源が切れるまで待つしかないのかと。
サポートに連絡しても結局解決しない系なのかと。

でも、調べたら。解決した。

https://support.apple.com/ja-jp/HT201150

> MacBook Pro (15-inch, 2016) 以降および MacBook Pro (13-inch, 2016, Four Thunderbolt 3 Ports) 以降：電源ボタンは Touch Bar の隣にあり、Touch ID センサーが統合されています。Touch ID (電源ボタン) を押せば Mac の電源が入ります。

一番右、siriのアイコンの隣の黒いところがTouch ID。

いやいや、そんなわけないじゃん
今日までたくさんTouchしてきましたよ。
そんなの使ってたらさすがに気づくがな！！

_ρ(・ω・｡)ﾎﾟﾁっ

電源落ちたぁ！！

**完**
parcel使ってみたけど require is not defined が出ちゃって動かない対処法


https://qiita.com/bitrinjani/items/b08876e0a2618745f54a

この記事みて、早速parcel使ってみたんですが、、、

ブラウザでlocalhost:1234を動かしても動作しない、、

# 原因

同じ症状で詰まっている人がいた模様
https://github.com/parcel-bundler/parcel/issues/40

私もlocalのnodeのバージョンが**v6.11.1**でした。

# 対策
nodebrewで**v9.2.0**にupdateしたら治りました。

めでたしめでたし。
parcelでバンドルしてみた & そのとき出会ったハマりどころまとめ

# parceでバンドルしてみた そしてwebpack(1.1)との比較

## 背景
フロントエンド、ファイルバンドル界に彗星のごとく現れたparcel、とにかく速いを売りにしているこれは本当に速いのかを検証してみようとwebpackでバンドルしていた200ファイル近いソースコードを使い検証してみた

### 構成モジュール
```
200ファイルくらい(ほとんどtypescript)
typescriptファイル
javascriptファイル
fontファイル
jsonファイル
cssファイル
stylファイル
```

### 環境
```
node 9.2.0
npm 5.5.1
parcel 1.1.0 (1.1.0でtypescriptサポートだよやったね)
```

### webpackでのバンドルスピード

build -> 60000ms
incremental build -> 10601ms

```
sourcemap出力はparcelだと今のとこできないため、offに。
sourcemapはそのうち対応しそう
```
-> https://github.com/parcel-bundler/parcel/issues/68



## バンドルしてみた
### バンドルするためにしたソースコードの変更
なし
### parcelの基本
- parcel [filename]
	- 開発時に使う用のコマンド、webpackでいうとdev-serverを起動してビルドする。変更されたファイルがあると再ビルドをしてくれる
- parcel build [filename]
	- productionビルド用と称されている実行するとバンドルされたファイルが出力されて終了する
	- minifyもデフォルトで兼ねて行う
	  - *parcel v1.1* だとうまいこと動かない
		- https://github.com/parcel-bundler/parcel/issues/8
		- --no-minify オプションをつけると動く。。
	- 紹介したけど比較に出さない
		- minifyできないし、、watchとhmrがoffになってるだけということだ。

### スピード
- parcel entry.js
	- 16.45s
	- incremental build 113ms.
	- cacheあり 5.28s.

## まとめと(個人の)感想
- 速い。
	- 開発時ビルドだと初回が 1/3時間でビルドできる
	- incrementalだと 10601ms -> 113ms ..圧倒的
	- ビルドサーバーを1度落としてもcacheのおかげで バンドルは 5sec
	
- ほんとに no configで動く
	- webpack.conf職人としてこんなに嬉しい職の失い方は他にない。 
	- hmrとかwebpackだと設定だけで日が暮れるというのに
- production buildのminifyが今壊れてたりでプロダクトに今突っ込むのは悩ましい
- dev buildに関してはsource mapが提供されておらずでそこだけが厳しめ。
	- しかし希望はある　https://github.com/parcel-bundler/parcel/issues/68`
- parcelのスピードはマシンのコアの数だけ速くなる(っぽい)ので筆者のマシンだと感動スピードだっただけの可能性はある

# 速度まとめ
- ソースコードは200ファイル,34000行くらい

|コマンド|速度(ms)|
|:---|:---|
|webpack| 60000|
|webpack -watch (差分ビルド時)| 10601|
|parcel (初回キャッシュなし)| 16450|
|parcel (初回キャッシュあり)| 5000|
|parcel (差分ビルド時)| 113|

	
## ハマりポイント
- parcel build はminifyが有効だと動かない
	- 実行すると`Cannot read property 'start' of undefined` 
	-  parcel build --no-minify を使う
	-  `https://github.com/parcel-bundler/parcel/issues/94`

- node_modules以下にある.babelrcにも反応する
	- `Unknown plugin "プラグイン名" specified in "ライブラリへのパス/.babelrc"`
	- node_modules以下にあるモジュールが要求してくるbabelのpluginを片っ端から入れる
	- ためしてないけど node_modules以下の.babelrc全部消してやってもいけそう？ 
	- もっと賢い避け方あったら教えてください

- nodejsのバージョン
	- ``require is not defined`が起きるものがある
	- 9.2にしよう
	- `https://github.com/parcel-bundler/parcel/issues/40`
FileMakerでFTPにアップロード

# はじめに
[前回](https://qiita.com/manabuuuuun/items/517c973281805768ddf3)、JSONの文字列を作成しました。
あとは作成したJSON文字列をFTPでファイルでアップロードできれば、
データの作成からアップロードまでをFileMakerだけで完結できて、
少し幸せになれそうです♪

そこで今回は、作成したJSON文字列をファイルでFTPにアップロードしたいと思います。

ちなみに、環境はFileMaker 16 (またはAdvanced)です。

# 今までのやり方
パッと思いつくところでこんな感じですが、
みなさん、どうされていますでしょうか？

- プラグインを使う。
- AppleScriptまたはバッチ(PowerShell)を使う。
- いったんファイルを出力して、別プログラムでFTPにアップロードする。

ちなみに私は、プラグインがなんか苦手 ＆ AppleScriptやバッチは両方対応しようとすると、
開発環境が2ついる事から、いったんファイル出力→別プログラムでUPすることが多いです。
でも、**どれも面倒**ですよね。。。

# FileMaker16から追加されたcURLオプション
`URLから挿入`は、FileMaker12で追加されたときから、
FTPプロトコルがサポートされていました。
が、大体FTPって認証があるので、上手く使えない状態でした。

ところが、FileMaker16から追加されたcURLオプションで
ユーザ情報も送れるみたいなので、実際にやってみましょう！
(httpプロトコルならヘッダ情報が送れるのも夢が広がりますよねっ！)

# JSONファイルをアップしてみた
ここではSSLの不要なFTPサーバにアップロードしてみます。
スクリプトは以下になります。


![定義.jpg](https://qiita-image-store.s3.amazonaws.com/0/130476/81200bf1-717a-cb95-7771-650e11924d82.jpeg)


ポイントとしては2つあり、
ひとつは、`URLから挿入`の`URLを指定`では、
ftpプロトコル + アップしたい**ファイルパス**を記載します。
ちなみに、既に同じ名前のファイルが存在するときは上書きされました。

もうひとつは、cURLオプションでJSONの内容を渡すとき、一度変数に入れて
`"-T $MakeJSON"` のように、変数名を文字の中に入れることです。
この、変数名を文字の中に入れるのがちょっと違和感あるのですが。。。
FileMakerの独自仕様なんでしょうか？

ここをいつもの感じで `"-T " & $MakeJSON` としてしまうと、
ファイルがアップロードされないので、注意してください。

# まとめ
ぜひ一度、みなさんの環境でチャレンジしてみてください。

あと試せていないですが、SSLが必要なFTPは、
ftps://～というURLに変更して、cURLオプションに`--tlsv1.2`など、
サーバにあったSSLのバージョンを指定すればできそうな気がします。
(また試してみたいと思います。)

あと今回JSONをUPしたんですが、cURLにJSONの文字列を渡しているだけなので
ExecuteSQLなどでCSVの形式で渡しても、FTPにCSVもアップロードできそうです！
(これも試してみたいー！)

ほんとにFileMaker16になって、外部とのやり取りがだいぶ楽になりました！
go1.9から追加されたsync.Mapを使う

# 概要

golang 1.9から[sync.Map](https://golang.org/pkg/sync/#Map)が導入されました。

この[スライド](https://github.com/gophercon/2017-talks/blob/master/lightningtalks/BryanCMills-AnOverviewOfSyncMap/An%20Overview%20of%20sync.Map.pdf)によると,導入のモチベーションとしてはCPUのCore数が上昇すると,同期にコストがかかる(cache-contentionの問題と呼ばれている)ので,
内部ではこれをなんとかするために色々やってるっぽいです。（コード読んでもよくわからなかった）

# 使ってみる

とりあえず今まででは、`sync.Map`っぽいものを実装しようとすると

```go:

type Target struct {
	foo int
	bar string
}

type OldSyncMap struct {
	mu sync.Mutex
	m  map[int]Target
}

func NewOldSyncMap() OldSyncMap {
	return OldSyncMap{m: map[int]Target{}}
}

func (s *OldSyncMap) Store(key int, value Target) {
	s.mu.Lock()
	defer s.mu.Unlock()

	s.m[key] = value
}

func (s *OldSyncMap) Load(key int) (Target, error) {
	s.mu.Lock()
	defer s.mu.Unlock()

	t, ok := s.m[key]
	if !ok {
		return Target{}, errors.New("not found")
	}
	return t, nil
}


func main() {
	s := NewOldSyncMap()
	s.Store(1, Target{
		foo: 1,
		bar: "bar",
	})

	t, err := s.Load(1)
	fmt.Println(t, err)  // => {1 bar} <nil>
}

```

みたいな感じだと思うが、`sync.Map`使うと

```go:

type Target struct {
	foo int
	bar string
}

type SyncMap struct {
	s sync.Map
}

func NewSyncMap() SyncMap {
	return SyncMap{}
}

func (s *SyncMap) Store(key int, value Target) {
	s.s.Store(key, value)
}

func (s *SyncMap) Load(key int) (Target, error) {
	v, ok := s.s.Load(key)
	if !ok {
		return Target{}, errors.New("not found")
	}

	t, ok := v.(Target)
	if !ok {
		return Target{}, errors.New("stored type is invalid")
	}

	return t, nil
}

func main() {
	s := NewSyncMap()
	s.Store(1, Target{
		foo: 1,
		bar: "bar",
	})

	t, err := s.Load(1)
	fmt.Println(t, err) // => {1 bar} <nil>
}

```

こんな感じで書ける。

# 実際に測定すると

雑に書いたベンチマークで測定してみる
Intel Core i5-6200U(Core 2, Thread 4), Memory 8GB, Ubuntu 16.04で

```go:


func BenchmarkOldSyncMap(b *testing.B) {
	for j := 0; j < b.N; j++ {
		m := NewOldSyncMap()
		wg := sync.WaitGroup{}
		for i := 0; i < 1000000; i++ {
			wg.Add(1)
			go func(i int) {
				m.Store(i, Target{
					foo: i,
				})

				_, err := m.Load(i)
				if err != nil {
					b.Errorf("in %d, %s", i, err)
				}
				wg.Done()
			}(i)
		}
		wg.Wait()
	}
}

func BenchmarkNewSyncMap(b *testing.B) {
	for j := 0; j < b.N; j++ {
		m := NewSyncMap()
		wg := sync.WaitGroup{}

		for i := 0; i < 1000000; i++ {
			wg.Add(1)
			go func(i int) {
				m.Store(i, Target{
					foo: i,
				})

				_, err := m.Load(i)
				if err != nil {
					b.Errorf("in %d, %s", i, err)
				}
				wg.Done()
			}(i)
		}
		wg.Wait()
	}
}

```

```sh:

goos: linux
goarch: amd64
pkg: test
BenchmarkOldSyncMap-4   	       1	5575385714 ns/op
BenchmarkNewSyncMap-4   	       1	3358420579 ns/op
PASS
ok  	test	9.298s

```

若干早い。
openssl 1.1.0 or later対応の話

このエントリは https://qiita.com/advent-calendar/2017/mruby の10日目です。

# あらすじ
趣味で、openssl 1.1.0をリンクしたとき、影響の出るmrbgemを調べていたのでそのことについて書きます。

# depricate asn1_mac.h

mruby-acme-clientはOpenSSLを用いているのですが、asn1_mac.hが廃止され error プラグマが仕込まれたことにより、
ビルドが出来なくなる問題が起こりました。

解決策として、mruby-acme-clientがasn1_mac.hを直接使っていないため、削除するPRを出しています。

# mruby-polarsslとmruby-base64

mruby-acme-clientのテストを実行するとmrbtestがSEGVする問題がありました。
これはOpenSSL 1.0.x系をリンクした時には発生しません。

詳細な再現手順はいまだ不明ですが、
mruby-polarsslが利用しているembedSSLが提供する`base64_encode`と
mruby-base64が実装している`base64_encode`の解釈をランタイムで呼び間違えてしまう現象が起こったためです。

mruby-base64のbase64_encodeをstaticにすることによってSEGVが起こらないようになりました。

根本的な原因はまた別にありそうなのでちょっと調べてみます。

# mruby 関係ない話

tlsextをdisableに出来なくなった関係でenable-tlsextというbuild optionがなくなります。
なのでtls拡張を用いるmrbgemでCIがfailするようになります。

# まとめ

主にlinuxで試したので次はwindows系のmrbgemを試したいと思います。


# P.S
library resolvのAPI設計とDNS formatの複雑さがやばくてresolvの進捗は霞に消えた。
LambdaでDynamoDB操作

備忘録ようです。

## DynamoDB
1. DynamoDBでテーブル作成
2. 項目 >> 項目の作成　で何か適当に値をつけてあげる
3. 概要の下の方の「Amazon リソースネーム（ARN」をコピー

## Lmabda
1. 関数の作成
2. 名前とかは適当にして、カスタムロールは「カスタムロールの新規作成」を選択して適当な名前のを作成

## IAM
1. IAM >> ロール　にいってさっき作成したロールを選択する
2. 「インラインポリシーの追加」を選択
3. 「選択」を選択
4. AWSサービスは「Amazon DynamoDB」を選択し、アクションの選択は「scan」「updateitem」にチェックをいれ、AWSリソースネームにさっきコピーした 「Amazon リソースネーム（ARN」をペースト
5. あとは次にどんどん行くだけ。

## Lambdaサンプルコード

```
var AWS = require("aws-sdk");
var dynamo = new AWS.DynamoDB.DocumentClient();

exports.handler = function(event, context) {
    var param = {
        TableName : "Test",
        FilterExpression : "key1 = :val",
        ExpressionAttributeValues : {":val" : "aaa"}
    };
    dynamo.scan(param, function(err, data) {
        if (err) {
            console.log("エラー = " + err);
            context.fail(err); // エラー時
        } else {
            console.log("成功 = " + data);
            context.succeed(data); // 正常時
        }
    });
};
```

```
var AWS = require("aws-sdk");
var dynamo = new AWS.DynamoDB.DocumentClient();

exports.handler = function(event, context) {
    var params = {
        TableName: 'Test',
        Key: {
            "key1": "aaa" // Hashキー
        },
        AttributeUpdates: {
            "key2": {
                'Action': 'PUT',       // 置き換え
                'Value': "moji" // 文字列
            }
        }
    };
    dynamo.update(params, function (err, data) {
        if (err) {
            console.log("失敗" + err);
        } else {
            console.log("成功");
        }
    });
};
```
EV3way ETロボコンで使用している倒立振子APIパラメーターの再計算手順

[ETロボコン](http://www.etrobo.jp/)で使用している倒立振子APIのパラメーターの再計算手順について簡単に説明します。
いただいたもの、見つけたもの等々いくつかの情報の寄せ集めになります。

走行体の形状・重量に変更があった場合に、最適なパラメーターを再計算することができます。
ここで再計算するのは次のパラメーターになります。

```balancer_param.c
float K_F[4] = {-0.870303F, -31.9978F, -1.1566F*0.6, -2.78873F};
```

#モデルの入手
[MathWorks社のサイト](http://www.mathworks.com/matlabcentral/fileexchange/19147)からnxtway_gsのモデルをダウンロードします。

#計算ツールの入手
[Octave](https://ftp.gnu.org/gnu/octave/windows/)または、[MATLAB](https://jp.mathworks.com/products/matlab.html)を使用します。
ここでは、Octaveを使用する場合の手順を説明します。

##controlパッケージのインストール
Octaveを起動したら、再計算に必要なパッケージのインストールを行います。※初回のみ

\>\> pkg install -forge control <font color="DarkGray">[ENTER]</font>

#物理パラメーターの設定

```param_plant.m
% NXTway-GS Parameters
m = 0.03;	% wheel weight [kg]
R = 0.04;	% wheel radius [m]
M = 0.6;	% body weight [kg]
W = 0.14;	% body width [m]
D = 0.04;	% body depth [m]
H = 0.144;	% body height [m]
```
各パラメーターの示す距離が具体的に何処から何処までなのかは、nxtway_gs\docs フォルダーのドキュメントを参照してください。
EV3way-ET2018年試作走行体では次の値を使用しています。 ※2017/11/24時点

```param_plant.m
% EV3way-ET2018 Parameters
m = 0.050;	% wheel weight [kg]
R = 0.05;	% wheel radius [m]
M = 0.80;	% body weight [kg]
W = 0.180;	% body width [m]
D = 0.08;	% body depth [m]
H = 0.180;	% body height [m]
```

#計算
Octaveを起動し、ホームパスを nxtway_gs\models にします。
controlパッケージをロードします。※Octave起動の都度

\>\> pkg load control <font color="DarkGray">[ENTER]</font>

param_nxtway_gs で再計算を行います。

\>\> param_nxtway_gs <font color="DarkGray">[ENTER]</font>

求まった。k_f の値を確認します。

\>\> k_f <font color="DarkGray">[ENTER]</font>

-0.86242 -33.97778 -1.14361 -3.02191

表示された4つの値が K_F[] の値になります。

##車輪回転角速度係数について
K_F[2]は最終段階で別途係数処理されています。
実際にパラメーターを再計算する際はこの K_F[2] の値を、走行体の挙動を確認しながら微調整する必要があります。

```param_controller.m
% suppress velocity gain because it fluctuates NXTway-GS
k_f(3) = k_f(3) * 0.85;
```

> 速度ゲインkf(3)が大きいと倒立状態を維持するための振動が大きくなるため、param_controller.mでは速度ゲインの計算値を適当に調節しています。
Solarized設定でシェルの表示色を変更する

#環境
Ubuntu16.04 Server (macOS High SierraのParallels13上に作成）

#なんで変更するのか
ParallelsでUbuntu Serverをインストールして、MacからSSHでゴニョゴニョするんですが、lsでディレクトリを表示させた時、背景黒が好みのワタクシとしてはデフォルトのディレクトリ表示である青が非常に見にくい。
色々調べた結果、Solarizedを設定すればいいことがわかりました。

#ダウンロード
cdでユーザーホームに移動してから、
gitからclone。以下のコマンドで.dircolors-solarizedディレクトリが作られる。

```
git clone https://github.com/seebi/dircolors-solarized.git .dircolors-solarized
```
.dircolors-solarizedには

```
dircolors.256dark    dircolors.ansi-light
dircolors.ansi-dark  dircolors.ansi-universal
```
の４つの設定ファイルがあります。

gitのReadmeにも書いてあるけど、Ubuntuは.bashrcにevalしなさいとあります。

```
For Ubuntu 14.04 it is sufficient to copy or link database file to ~/.dircolors. Statement in ~/.bashrc will take care about triggering eval command
```
###.bashrcを編集
ansi-lightがディレクトリの色がシアンになるっぽいのでこれを採用。
できるだけ最後の行に（途中でdircolorsを設定している箇所があるので）以下を追記
(自分の環境に合わせて、dircolors.256darkとか好みのにする）

```
eval `dircolors .dircolors-solarized/dircolors.ansi-light`
```
一旦exitしてから再度ログインする。

#Mac本体のシェルをSolarizedにしたい場合
Mac本体のシェルの色を変えたい場合はこちら
[いろいろ Solarized設定](https://qiita.com/HeRo/items/363b2aa18e7f225a8069)

以上です。
【備忘録】MeCabをUbuntuにインストールしてPython3系で使う。

#はじめに
今回、改めてUbuntuにMeCabを入れ直す必要に迫られました。
かなり時間を使ってしまったので、忘れた時ようにメモします。

#実行環境
Ubuntu 16.04 LTS
Python 3.6.3
Jupyter Notebook 1.0.0

#インストール方法
公式ホームページから、ダウンロードしてmakeして、、、　とやって文字化けでハマっていましたが、以下のようにapt-get と　pipで簡単に環境構築できました。

```
sudo apt-get install mecab libmecab-dev mecab-ipadic mecab-ipadic-utf8
pip install mecab-python3
```

また、さらに最近の言葉まで対応している辞書であるNEologdを導入します。
何と週2回以上更新されているそうです。

```
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
 ./bin/install-mecab-ipadic-neologd -n -a
mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/
```

#テストコード

```python
from io import StringIO
import pandas as pd

import MeCab

m = MeCab.Tagger('-Ochasen')
analyzed = m.parse('我輩は猫である。名前はまだ無い。')

df_analyzed = pd.read_csv(StringIO(analyzed), delimiter='\t', names=['単語', '読み','原形', '品詞', '活用', '活用形'])

df_analyzed
```




<div>

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>単語</th>
      <th>読み</th>
      <th>原形</th>
      <th>品詞</th>
      <th>活用</th>
      <th>活用形</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>我輩は猫である</td>
      <td>ワガハイハネコデアル</td>
      <td>我輩は猫である</td>
      <td>名詞-固有名詞-一般</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>1</th>
      <td>。</td>
      <td>。</td>
      <td>。</td>
      <td>記号-句点</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>2</th>
      <td>名前</td>
      <td>ナマエ</td>
      <td>名前</td>
      <td>名詞-一般</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>3</th>
      <td>は</td>
      <td>ハ</td>
      <td>は</td>
      <td>助詞-係助詞</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>4</th>
      <td>まだ</td>
      <td>マダ</td>
      <td>まだ</td>
      <td>副詞-助詞類接続</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>5</th>
      <td>無い</td>
      <td>ナイ</td>
      <td>無い</td>
      <td>形容詞-自立</td>
      <td>形容詞・アウオ段</td>
      <td>基本形</td>
    </tr>
    <tr>
      <th>6</th>
      <td>。</td>
      <td>。</td>
      <td>。</td>
      <td>記号-句点</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>7</th>
      <td>EOS</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
  </tbody>
</table>
</div>




```python
df_analyzed['単語']
```




    0    我輩は猫である
    1          。
    2         名前
    3          は
    4         まだ
    5         無い
    6          。
    7        EOS
    Name: 単語, dtype: object

#　参考資料
[MecabをUbuntu14.0.4にインストールして実行してみる](https://foolean.net/p/22)
[新語・固有表現に強い「mecab-ipadic-NEologd」の効果を調べてみた](https://engineering.linecorp.com/ja/blog/detail/109)
[mecab-ipadic-NEologd : Neologism dictionary for MeCab](https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md)
JenkinsのSlackプラグイン拡張してすべてのジョブで自動的に通知できるようにしてみた


# JenkinsのSlackプラグイン拡張してみた話

## 動機

Jenkinsの全部のジョブにSlackの設定するのがめんどくさかった…
ので久々のJavaを使ってせっせこ作ってみました。

今のところ順調に動いてくれています。
特にgitがおかしくなったりするとpipelineプラグインだと絶対に通知が飛ばなくなるのでそのあたりも含めてまぁまぁ便利かなと

## url

https://wiki.jenkins.io/display/JENKINS/Global+Slack+Notifier+Plugin

## 使い方

このChatwork Pluginを
パク
参考にしたデザイン
すでにSlack Pluginの設定が終わっていれば基本的には通知が欲しいビルド結果にチェックを入れてそれを通知する部屋を設定してあげればOKです。
Slack Pluginのデフォルトのメッセージは飛んできます。

![globalslackmessage.png](https://qiita-image-store.s3.amazonaws.com/0/77177/53e2524f-4fbb-eb76-0fe0-a8e01b025c29.png)


## 参考

詰まったところはここに愚痴ってます。

https://qiita.com/Marimoiro/items/7710d98ab457eef266d6

## その他

わりとこの手の任意のジョブがXXした時に何かするプラグインって少ないんですけれど、結構簡単に作れました。
(保存版&随時更新) 大学教養数学理解のために便利なサイトリスト (統計/微分積分/線形代数)

#はじめに
Team AIでは2018年数学の研究に力を入れようとしています。
基礎となる大学教養レベルの数学理解のために、評判の良いマセマ社の演習書履修を始めました。
こちらの記事では重要キーワードと解説ブログのリストを随時更新していきたいと思います。

#統計学

##1)離散型確率分布

離散型の確率変数とは？離散確率分布と確率関数の性質
https://atarimae.biz/archives/11665

###ベイズの定理

ベイズの定理
https://bellcurve.jp/statistics/course/6444.html

ベイズの定理の使い方
https://bellcurve.jp/statistics/course/6448.html

ベイズの定理  Wiki
https://ja.wikipedia.org/wiki/%E3%83%99%E3%82%A4%E3%82%BA%E3%81%AE%E5%AE%9A%E7%90%86

ベイズの定理の基本的な解説
https://mathtrain.jp/bayes

###事象の独立

事象の独立
http://examist.jp/mathematics/probability/jisyou-dokuritu/

独立 (確率論)
https://ja.wikipedia.org/wiki/%E7%8B%AC%E7%AB%8B_(%E7%A2%BA%E7%8E%87%E8%AB%96)

###確率関数Pの性質

###分布関数F(x)の性質

###二項分布(離散型)

###期待値・分散・標準偏差

###期待値・分散のモーメント母関数M(x)

###B(n,p)の期待値・分散
Parcel+VueJS環境づくりまで

# もう古いので
https://qiita.com/rururu3/items/ba58f5538804186a6d76
こっちみてね

---

# **parcel時代が始まるらしい記事を見たのでVueJS動くかなって思って環境構築までしてみた**

※vueファイル使用の記事は
https://qiita.com/rururu3/items/1eb8f64976810d97f37b
こちらに記載しました

# parcelとは
https://parceljs.org/
コンフィグ無しでウェブアプリケーション作ろうぜ・・・って言う感じのビルドツール

# 環境構築
npm install --save-dev babel-preset-env parcel-bundler babel-preset-vue vue

# 各種ソース
```".babelrc"
{
    "presets": ["env", "vue"]
}
```

```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>A test</title>
  </head>
  <body>
    <div id="app"></div>
    <script src="./src/index.js" charset="utf-8"></script>
  </body>
</html>
```
```package.json
一部抜粋
  "scripts": {
    "start": "parcel index.html",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "devDependencies": {
    "babel-preset-env": "^1.6.1",
    "babel-preset-vue": "^2.0.0",
    "parcel-bundler": "^1.1.0",
    "vue": "^2.5.9"
  }
```
```src/index.js
import Vue from 'vue/dist/vue.esm.js';
import app from './app.jsx';

new Vue({
  el: '#app',
  template: '<app />',
});
```
```src/app.jsx
import Vue from 'vue/dist/vue.esm.js';

Vue.component('app', {
  methods: {
    method () {
      console.log('clicked')
    }
  },
  render () {
    return (
      <div>
        <a href="/" onClick:prevent={this.method}>
        テスト
        </a>
      </div>
    )
  }
})
```
※コンパイラ入りパッケージ利用してるのでちょい手抜き

# 結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142784/b0077efc-7b3a-2aae-6864-0bfbfcbd07bf.png)

# 感想
本当にgulpやらwebpackと戦う必要がない感じがする・・・けど、単一ファイルコンポーネント(.vue)使いたい・・・1時間ぐらい調べてとりあえず挫折したので、そのうち本格導入する際に再度調べたい

# 参考記事
https://qiita.com/bitrinjani/items/b08876e0a2618745f54a
これだけでイイ、Rails5でAPIサーバを作るときのCORS設定

RailsでAPIサーバを作るときにフロントエンド・アプリケーションとの連携で出てきがちなCORSの設定。

毎回調べるのがめんどくさいので、セキュリティ要件的にもテキトウにするわけにはいかないこのCORSの**「とりあえずこれだけやっておけばOK」**な設定をRailsとJavaScriptの実装と一緒に説明します。

# CORSとは？
CORSは日本語ではHTTPアクセス制御のことで、簡単に言うと**許可されていないウェブサイトからのアクセスをブロックすることで悪意のあるアクセスを防ぐための機構**です。

# `rack-cors`を導入
この記事では、デフォルトでRailsのアプリケーションの中に生成される`config/initializers/cors.rb`というファイルに従って、[rack-cors](https://github.com/cyu/rack-cors)を使います。

まずはGemfileに以下を追記して、rack-corsをインストール

```ruby:Gemfile
gem 'rack-cors'
```

# 環境変数でAllowed Originを指定できるようにする
本番環境と開発環境でそれぞれ許容するドメインを柔軟に変更できるよう、`CORS_ALLOWED_ORIGINS`の環境変数を指定する形で、APIへのアクセスを許容するドメインを指定します。

```ruby:config/application.rb
config.x.cors_allowed_origins = ENV.fetch('CORS_ALLOWED_ORIGINS', 'http://localhost:8000')
```
`ENV.fetch`のフォールバック（ここでは`localhost:8000`）は適宜指定してください。

# CORSの設定
上で設定した`config.x.cors_allowed_origins`を、許可するドメインとして指定します。

```ruby:config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins Rails.application.config.x.cors_allowed_origins

    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head],
      credentials: true
  end
end
```

# JavaScript側の実装
とりあえず下のコードを使えばOK

ここでは[Fetch API](https://developer.mozilla.org/ja/docs/Web/API/Fetch_API)を使った、Railsで実装されたAPIサーバとは異なるSPAなどのフロントエンド・アプリケーションからのアクセスを想定しています。

```js:fetchを使ったAPIアクセス
fetch('http://your-api-server.net', {
  mode: 'cors',
  credentials: 'include',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  }
})
.then((res) => ...)
```
大事なのは`credentials: 'include'`のところで、たとえばSPAなどで認証情報をクッキーなどで渡すために`Set-Cookie`などを使うためには、必ずこの指定が必要になります。

# アプリケーションの起動
上で触れたように、今回のRailsアプリケーションは`CORS_ALLOWED_ORIGINS`で指定されたドメインのみを許可します。なので、例えばAPIサーバを開発用にローカルで起動する際には、そのAPIサーバへアクセスするフロントエンド・アプリケーションのドメインとポートの指定が必要です。

たとえば、`localhost:8000`でローカルにフロントエンド・アプリケーションが起動しているのであれば

```bash
$ CORS_ALLOWED_ORIGINS=http://localhost:8000 bundle exec rails server
```
とすることで、ローカル上でフロントエンド・アプリケーションからAPIサーバへのアクセスがCORSを有効にしながら行えるようになります。

本番でも`CORS_ALLOED_ORIGINS`の環境変数をセットしてやることで、APIサーバへのアクセス制御を行えるようになります。

以上です。
見積書をハックする（その１：フィボナッチで行こう！）

# 誰？
もともとエンジニアでIT畑に入るも社内のやんごとなき理由により営業畑と技術畑を何往復も行ったり来たり。
それを１０年ほど繰り返した後、成り行きで独立起業してしまい８年経った成り行き系エンジニア兼営業です。
自身も開発案件をこなしながら、営業としても活動してます。

営業に費やす作業も馬鹿にならないのでツール化して営業活動をハック、作業にかかる時間をどんどん短縮していくことを生きがい？にしています。営業活動は面談と移動時間以外ほとんど自動化できてるくらいに。。したいなあと。（願望）

ちなみにこの記事で話題にしている見積書はだいたい年間80から120くらい作っている感じです。

# "見積り"こそ会社運営の生命線

なんのかんの言いつつも、見積りが大事。

どれだけプレゼンが素晴らしくとも、どんな大企業と取引ができるチャンスに恵まれたとしても、見積が甘すぎて赤字になってしまっては目もあてられません。

- 「やっぱり思ってたより時間がかかりました！」
- 「このリスクを考慮していませんでした！」

では通りません。この時間で出来ますっていうのが見積書ですから。。

見積ミスがたてこんでくると、会社も傾いてきたり、社内社外の信用を失ったりと色々マズイことになっちゃいますね。

# (残念ながら)見積作業はお金にはなりません
いや受注すれば売上につながるんじゃというツッコミは置いといて、時間を掛けてみっちりと見積をすれば精度はあがります。
しかしながらお客さんの方でも「予算編成のために、明日中に概算額だけ知りたい！」等突発イベントが発生する場合も割りとあります。（そもそものんびり見積りしてる暇なんて無いですし。。）

どんな手段を使っても、ささっと精度のいい見積りを叩き出してスピーディーに受注するぞというのがこのシリーズのコンセプトです。

# 本題：工数内訳にはフィボナッチ数列を使う

というわけで、この記事で伝えたいことはこの一つだけです。
「工数内訳にはフィボナッチ数列を使う」

ご存知でしょうか、フィボナッチ数列を。。私も数年前にこの見積方法を知った時に思い出せず焦りました。
すなわち、「1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89…」の数列ですね。

これら数列を使って工数見積を行います。

# 例：イケてない見積り

| 作業名       |       工数(日) |
|:-----------------|------------------:|
| 要件定義         |              3|
| 基本設計（テーブル定義）|              4|
| 基本設計（画面遷移図）   |              4 |
| 製造（プログラムA）          |              5 |
| 製造（プログラムB）          |              6 |

至って普通っぽい工数表で何がいけないんだろう？とお思いかもしれませんが、例えば製造（プログラムA）と（プログラムB）について1日差の理由を質問された場合、明確な理由を述べられるでしょうか？
まだ１日と２日という見積工数では比較してほぼ２倍等と説明できると思いますが、５日と６日では１日の差を説明できる明確な理由は出ないと思います。

- 「頑張ればプログラムBもAと同じく５日で行けるでしょう？」
- 「そもそも基本設計も何で４日なんです？」

など木を見て森を見ず的に全ての項目を再レビューする必要に迫られる可能性も。。見積やりなおしたくないですよね。。

# 例：そこでフィボナッチ登場

| 作業名       |       工数(日) |
|:-----------------|------------------:|
| 要件定義         |              3|
| 基本設計（テーブル定義）|              5|
| 基本設計（画面遷移図）   |              5 |
| 製造（プログラムA）          |              5 |
| 製造（プログラムB）          |              8 |

工数の算出に使う日数を「1, 1, 2, 3, 5, 8…」のフィボナッチ数列から割り当てます。
フィボナッチ数列の特性として、数字が大きくなるほど数と数との間隔がだんだん大きくなり、割り当てる工数の数字が差別化できます。

- 「ああ、プログラムAとBは難易度が違うんだな」
- 「テーブル定義と画面遷移については大体同じなんだな」

より直感的に把握できる工数リストになっていると思いませんか？

よくよく見ると、表している工数のパターンが3，5，8だけの３パターンになっていることにも気づかれたのでは無いかと思います。悪い例では3,4,5,6と少しだけ複雑ですよね。

数字で表現するパターンを少なくする事は商談を進めていく上、メリットでもあります。
人が記憶として理解できる限界値として「マジックナンバー７（±2）」というものがあるからです。

記憶力の高い人でも、7＋2＝9程度しか記憶できない。
少ない人なら、7-2＝5つ程度しか認識できないということです。

だから何？これは意外に重要で、見積のレビューをお客さんにしてもらう中で情報量をシンプルに減らせるというメリットがあります。また、フィボナッチ数列は「1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89…」と続いていきますが、システム開発において日数で見積もる場合13以降の見積日数はざっくり大きくとりすぎているのでせめて1,2,3,5,8の5パターンに収まるよう工程を切り分け直したほうがスッキリするかと私の経験上考えます。

レビューの際に見積り工数を細かくチェックしすぎて、

- 「一度持ち帰って検討します」
- 「根拠となる補足資料を追加で出してもらえますか？」

となったら更に見積作業に時間を費やすことになります。困りますよね。お互いに。
丁寧で分厚い資料がついてる豪華な見積書も結構ですが、ファストかつスマートな見積りが私は好きです＾＾；

と、いうわけでフィボナッチ配列でわかりやすい見積工数を提示する、というちょろっとハックでございました！
ts-actionを使ってRedux (@ngrx) のActionを簡潔に記述する

Reduxでの開発では、しばしばAction定義の肥大化に悩まされます。

冗長な記述をなくすライブラリが色々あるようですが、TypeScriptベースの[ts-action](https://github.com/cartant/ts-action)がとても良さそうだったので、「Angular + [@ngrx](https://github.com/ngrx/platform)」での使い心地を見てみました。


通常のコード

```ts
// Action
enum BookActionTypes {
  SEARCH = "[Books] Search",
  SEARCH_COMPLETE = "[Books] Search Complete",
  SEARCH_ERROR = "[Books] Search Error"
}

class Search implements Action {
  readonly type = BookActionTypes.SEARCH;
  constructor(public payload: string) {}
}

class SearchComplete implements Action {
  readonly type = BookActionTypes.SEARCH_COMPLETE;
  constructor(public payload: Book[]) {}
}

class SearchError implements Action {
  readonly type = BookActionTypes.SEARCH_ERROR;
  constructor(public payload: string) {}
}

type All = Search | SearchComplete | SearchError;

// Dispatch
store.dispatch(new Search("hello"));

// Reducer
function reducer(state: State = initialState, action: All): State {
  switch (action.type) {
  case BookActionTypes.SEARCH:
    return { ...state, query: action.payload };
  case BookActionTypes.SEARCH_COMPLETE:
    return { ...state, books: action.payload };
  case BookActionTypes.SEARCH_ERROR:
    return { ...state, error: action.payload };
  default:
    return state;
  }
}
```

ts-actionを使用したコード

```ts
// Action
const Search = action("[Books] Search", payload<string>());
const SearchComplete = action("[Books] Search Complete", payload<Book[]>());
const SearchError = action("[Books] Search Error", payload<string>());
const All = union(Search, SearchComplete, SearchError);

// Dispatch
store.dispatch(new Search("hello"));

// Reducer
function reducer(state: State = initialState, action: typeof All): State {
  switch (action.type) {
  case Search.type:
    return { ...state, query: action.payload };
  case SearchComplete.type:
    return { ...state, books: action.payload };
  case SearchError.type:
    return { ...state, error: action.payload };
  default:
    return state;
  }
}
```

なかなか良さそうです。

P.S. @ngrx本家にFeature requestを送ったようですが、残念ながら良い返答は得られなかったようです。（https://github.com/ngrx/platform/issues/584）
GoでHTTPクライアントを書く時のURLの組み立て方

この記事は、Go2 Advent Calendar 2017 の10日目の記事です。

外部API用のHTTPクライアント/HTTPリクエストを書いていて、URLの組み立て方で気付いた細かいこと。

## サンプル

- [yyoshiki41/go-instagram-profile](https://github.com/yyoshiki41/go-instagram-profile)

本題の前に instagram には、
https://www.instagram.com/natgeo/?__a=1
のようにユーザーのプロフィール情報が `json`で返ってくるエンドポイントがあります。

```bash
# example
$ curl "https://www.instagram.com/natgeo/?__a=1" | jq .user.biography
"Experience the world through the eyes of National Geographic photographers."
```

（ドキュメントに載っていない為変更になる可能性はありますが、instagram app の登録も必要ないので知っておくと便利！）

## URLの組み立て方

ここから本題。
HTTP クライアントを書いていて、

```go
url := fmt.Sprintf("%s/%s", endpoint, username)
```

```go
url := endpoint + "/" + username
```

このようなコードで、下のようなミスに気付かず時間を費やしたことが何度かあります。。

- 「エラーが返ってくると思ったら、 `https://api.instagram.com/v1/username` が、 `/`抜けて
 `https://api.instagram.com/v1username` になってた.. :cry: 」
- 「あれ、コンフィグのURLホスト名に `/` ついてる.. 
　`https://www.instagram.com/` or `https://www.instagram.com` :thinking:」

## 標準パッケージで楽に

標準パッケージを使って書くように統一しています。

```go
var endpoint = "https://www.instagram.com"

// endpoint のスキームでミスがあったら、ここでチェックできる。
u, err := url.Parse(endpoint)
if err != nil {
	return err
}

// 複数のエンドポイントもこの書き方で統一して、 `/` の処理を任せる。
u.Path = path.Join(u.Path, username)

// 元のURLにクエリパラメータがついていた場合の上書きを防げる。
q := u.Query()
q.Set("__a", "1")
u.RawQuery = q.Encode()

req, err := http.Get(u.String())
...
```

稀に `path/filepath` が使われているものを見ますが、改めて `path`, `path/filepath` パッケージの使い方の違いを把握しておくと良いと思います。

`path` パッケージのディスクリプションにあることが全てですが、一応。

> Package path implements utility routines for manipulating slash-separated paths.
> 
The path package should only be used for paths separated by forward slashes, such as the paths in URLs. This package does not deal with Windows paths with drive letters or backslashes; to manipulate operating system paths, use the path/filepath package.

ref.
- [golang.org/pkg/path/](https://golang.org/pkg/path/)
- [Golang で物理ファイルの操作に path/filepath でなく path を使うと爆発します。](https://mattn.kaoriya.net/software/lang/go/20171024130616.htm)

他にも外部API用のHTTPクライアントを幾つか書いています。

- [yyoshiki41/go-pushwoosh](https://github.com/yyoshiki41/go-pushwoosh)
- [yyoshiki41/go-radiko](https://github.com/yyoshiki41/go-radiko)

GoでのAPIクライアントの実装パターン等については、
公開されているパッケージが official / unofficial 含め一通りあると思うので、いくつか見てみると良いと思います！
FileMakerでJSONを作ってみよう

# はじめに
FileMakerに入っているデータを他システムで使うときに、
バックエンドのシステムにはCSVかODBCを使って連携し、
フロントエンドにはJSONを使ってJavaScriptでいい感じに調理してもらっています。

そこで、今までは文字列で作っていたJSONファイルを、
FileMaker16から追加されたJSON関数を使って、
注目されがちな「使う」側ではなく「作って」みたいなと思います。

# 作成したいJSONの形
今回は練習がてら、FileMakerのヘルプにある、
[JSON データの例](https://fmhelp.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help/json-functions.html#ww1155222)を作成してみたいなと思います。
もちろん、環境はFileMaker 16 (またはAdvanced)

# 作ってみた
何はともあれ、テーブルを作成します。
JSON データの例で言うと、製品の下の内容ですね。

![定義.jpg](https://qiita-image-store.s3.amazonaws.com/0/130476/c95be153-0316-447a-fedc-3cf700d490d3.jpeg)

こんな感じです。
各フィールドに適当な値を入れて、複数レコード作成しておきます。

![定義.jpg](https://qiita-image-store.s3.amazonaws.com/0/130476/b4f44567-26e1-3271-a479-6f89b4df1c13.jpeg)

で、Loopで回しながらデータを作って行くのですが、
初めて`JSONSetElement`使うときに、ヘルプの内容が分かりにくかったので。。。
分かりやすい(？)ようにかなり丁寧に書いてみました。

![定義.jpg](https://qiita-image-store.s3.amazonaws.com/0/130476/97fa042d-771a-95ab-8c14-fc8655446dd5.jpeg)

いかがでしょうか？
実行すれば、次のような結果になると思います。

![定義.jpg](https://qiita-image-store.s3.amazonaws.com/0/130476/7afb2cf4-8e5f-9255-69c9-d7ef7947dad0.jpeg)

`JSONSetElement`で追加すると、ソートがかかるんでしょうか？
全く例と同じとまではいきませんが、内容的には同じJSONが作れたと思います。

実際はここまで丁寧にしなくても、
例えば1～6行目は無くても同じ結果が出ます。
が、どういうことをするんだろう？ということが
イメージして頂けたらありがたいです。


## ヘルプの解説？
JSON データの例に、コメントを追加してみました。

```
# 「$NewProduct」という変数に、「製品」配列に追加する子要素を作成する
# Substituteみたいに、[]で複数まとめてセットできるみたいです。
# 最初の「"{}"」はよく分からない。。。「""」でも同じでした。
# -----ここから-----
変数を設定 [ $NewProduct ; 値 : 
   JSONSetElement ( "{}" ;
      [ "ID" ; "FB4" ; JSONString ] ; 
      [ "名前" ; "バニラケーキ" ; JSONString ] ; 
      [ "価格" ; 17.5 ; JSONNumber ] ; 
      [ "在庫" ; 12 ; JSONNumber ] ; 
      [ "カテゴリ" ; "ケーキ" ; JSONString ] ; 
      [ "特売" ; true ; JSONBoolean ] 
   ) ]
# -----ここまで-----

# ベーカリー.製品が配列なので、「JSONListKeys」の結果を「ValueCount」することで
# 既に何個登録されているか？を取得しています。
# -----ここから-----
変数を設定 [ $NextIndex ; 値 : 
   ValueCount ( 
      JSONListKeys ( $$JSON ; "ベーカリー.製品" ) 
   ) ] 
# -----ここまで-----

# 配列は0始まりなので、個数-1が配列の最大になる。
# ここでは個数($NextIndex)を入れることで、最大+1の位置に、
# 作成した$NewProductの内容を追記しようとしています。
# -----ここから-----
変数を設定 [ $$JSON ; 値 : 
   JSONSetElement ( 
      $$JSON ; "ベーカリー.製品[" & $NextIndex & "]" ; $NewProduct ; 
      JSONObject 
   ) ]
# -----ここまで-----
```

余計にごちゃっとして見にくくなってしまいましたが＾＾；
先ほどの内容に比べると、すごくスマートにしていますよね！

#まとめ
無事に思っている形のJSONが作成できました。
初め、ヘルプを理解するまでいろいろ調べましたが、
あまり`JSONSetElement`している人がいなかったのは、需要が少ないんでしょうかね？

それにしても、FileMakerのヘルプの例が分かりにくいと思うのは私だけでしょうか・・・？  

次回は作成したJSONをFTPにアップしてみたいと思います！
CodeBuildの実行結果をslackに通知する

# はじめに
[Globis Advent Calendar](https://qiita.com/advent-calendar/2017/globis)10日目は、[弊社のエンジニアチーム](https://www.wantedly.com/companies/globis/post_articles/85756)を支えるインフラ技術をお伝えいたします。
開発スピードをさらに促進するために、[Blue Green Deployment](http://www.publickey1.jp/blog/14/blue-green_deployment.html), [Infrastrucure as Code](https://www.oreilly.co.jp/books/9784873117966/), [ChatOps](https://qiita.com/suemoc/items/1d990b0081d2546ca36a) など新しい運用思想を積極的に取り入れて、手動でのオペレーションを極力なくしています。
今回は、弊社で実運用しているChatOpsの一例として、[CodeBuild](https://aws.amazon.com/jp/codebuild/)の実行結果を[slack](https://slack.com/intl/ja-jp)に通知する方法を、可能な範囲で具体的にお伝えいたします。

# 設定方法
## AWS Lambdaの設定

<img src="https://qiita-image-store.s3.amazonaws.com/0/199923/456c8c0e-d174-f329-9d34-a8eacb32d063.png">


### コード
```py
import os
import json
import urllib.request

URL = os.environ['WEBHOOK_URL']


def send_slack(obj):  ## slackに通知
    method = "POST"
    headers = {"Content-Type" : "application/json"}
    js = json.dumps(obj).encode("utf-8")
    request = urllib.request.Request(URL, data=js, method=method, headers=headers)
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode("utf-8")


def check_status(status):
    fail = False
    if status == 'IN_PROGRESS':
        color = '#008000'  ## green
    elif status == 'SUCCEEDED':
        color = '#00BFFF'  ## deepskyblue
    else:
        color = '#FF00FF'  ## magenta
        fail = True
    return color, fail


def parse_event(event):  ## cloudwatch event から渡された event(dict型)をパース、slackに渡すobjectを生成。
    detail = event['detail']
    status = detail['build-status']
    initiator = detail['additional-information']['initiator']
    log = detail.get('additional-information', {}).get('logs', {}).get('deep-link', 'Not Exist')
    color, fail = check_status(status)
    fields = [{'title': 'Initiator', 'value': initiator, 'short': False},
              {'title': 'Status', 'value': status, 'short': False},
              {'title': 'LogLink', 'value': log, 'short': False}]
    obj = {'attachments': [{'color': color, 'fields': fields}]}
#    if fail == True:  ## Fail時にチャンネルメンション飛ばしたい時はコメントを外す。
#        obj['attachments'][0]['text'] = '<!channel>'
    return obj


def lambda_handler(event, context):  ## lambdaから最初にcallされる関数。
    obj = parse_event(event)
    send_slack(obj)
    return
```


### 環境変数の設定
<img src="https://qiita-image-store.s3.amazonaws.com/0/199923/16259c18-8851-e8ea-830e-e2e268db50fd.png">


## CloudWatch Event の設定
<img src="https://qiita-image-store.s3.amazonaws.com/0/199923/1fc6937a-d2d9-2cbc-6cf2-7291c6d33171.png">

## slackでの通知結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/199923/b643eba6-026d-2413-5895-99672eea92d9.png">

- ワンクリックでビルドログを眺めることができます。



# 運用事例のご紹介
- AWS Athenaのテーブルにクエリを実行し、中間テーブルを生成するETL処理のバッチ
- Ruby on Rails アプリケーションデプロイ時の db:migrate 処理
- 最近はCodeBuildをVPC内で実行できるようになったので、利用できる幅が広がっています！


# おわりに
いかがでしたでしょうか。python初心者(僕)でもChatOpsに貢献できます。
グロービスでは[SREエンジニア](https://www.wantedly.com/projects/167197)を募集しています！
インフラの運用担当だけど手作業を自動化したいと考えている方、開発者だけどインフラも含めてコードで管理したい方、一緒に理想のインフラを作ってみませんか？
個人的なRailsアプリケーションの開発スタイルver2017

[前回](https://qiita.com/f96q@github/items/61f8b1862ff5cb1477b7)から2年ぶりに変わった部分を書きました。

## バックエンド

### API

GraphQL

### データベースの文字コード

utf8mb4

utf8だと保存できない絵文字が出てくるため。

### テスト

* rspec-rails
* factory_bot_rails
* capybara
* poltergeist
* database_rewinder

### 設計

やるべきではない

* 論理削除 
 * https://speakerdeck.com/moro/do-not-delete-softly
* 全部の例外を補足
 * https://www.slideshare.net/t_wada/exception-design-by-contract
* メタプログラミングの乱用

## フロントエンド

### JavaScript

ES2017 + Flowtype + React + Redux

Reactの場合直接、DOMの要素を取るということをしないで済むようになったのでjsプレフィックスはほぼ使わなくなった。

TypeScriptでも良いとは思うが

* 標準はあくまでもECMAScript
* 将来的にECMAScriptに型が入ってくるという予想

### テスト

* enzyme
* expect
* jest
* jsdom
* mocha
* react-addons-test-util
* sinon

テストで使うセレクタはdata-test属性を付けて、productionビルドする時はdata-test属性を消す。

## サーバー

### Amazon ECS

* Elastic Beanstalkは勝手にセキュリテグループその他の設定が自動生成されるのとなんか設定を変えると反映されるまで使いづらかった
* ECSのタスク定義などの設定などはTerraformで管理する
* 今後は東京リージョンで使えるようになれば、AWS Fargateに移行するという予想

### CI環境

CircleCI
dockerとは何か

# __当記事の目的__
2017年現在、ブームというより必須スキルとなったdockerを勉強して時代遅れエンジニアにならないようにする
dockerを含めた、アプリケーションの基盤（アプリそのものではなく）を構築することによって、低レイヤの部分も意識できるエンジニアになる

# __dockerの概要__
## __コンテナ型仮想環境__
Linuxカーネルが持つ「コンテナ」機能などを使用して実行環境を他のプロセスから隔離し、その中でアプリケーションを動作させる。
コンテナはLinuxの通常のプロセスとほぼ同じものだが、利用できる名前空間やリソースが他のプロセスやコンテナからは隔離され、それぞれ固有の設定を持てるようになっている。そのためコンテナ内のアプリケーションから見ると、独立したコンピュータ上で動作しているように振る舞う。
そして、コンテナはLinuxカーネルが持つ次の機能を利用して実現している。
### __名前空間の隔離機能__
ファイルシステムやコンピュータ名、ユーザ名（ユーザID）、グループ名（グループID）、プロセスID、ネットワーク機能などをコンテナごとに独自に設定できる。
### __リソースの隔離機能__
CPUやメモリ、ディスクI/Oなどをコンテナ内で利用するリソースをほかのコンテナから隔離したり、設定に基づいて振り分けたりする機能。
### __ハイパーバイザ型（VMwareなどの従来の仮想環境）との違い__ 
図1
![Untitled Diagram-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/222267/95595c6f-8d68-4a55-f39b-cd37827c5ccc.jpeg)

図１を見るとコンテナだけでなくdocker(コンテナの管理プロセス)自体もホスト上のアプリケーションレベルで動作している。docker自体はLinuxにもともとある仮想化関連の技術を組み合わせるとともに、それらを管理する機能を提供している。

# __まとめ__
従来のハイパーバイザ型と比べて軽いこと（動作だけでなく、持ち運びも）が読み取れる。
次回、もう一回だけ座学をして、その次に実際に動かしてみよう。

[__次号__](https://qiita.com/kkkkkkkkkk1005/items/ebacbd2e6545a9db0e60)
初めて後輩の面倒をみる先輩１年生へ

半分は自分に向けて。半分はドキドキしているどこかの誰かへ。

# 最初に後輩にかける言葉
<font color="#FF0099"><b>なにかあれば声をかけてください、わかる人を探してきます。</b></font>

年齢・技術的な後輩はもちろん、案件の新メンバーという、ゆるーい感じ。
とりあえず「既存のグループに新しく加わるメンバー」に対して・・・って感じで、話を進めます:sweat_drops: 

# 既存のグループに加わる時に不安なこと
- チーム内のローカルルールってあるの？（ex：お昼休みとかってどんなルールなの？）
- メンバーの顔と名前が覚えられない。
- リーダーの次に偉い人って誰だろう？
- このシステムって何をするの？
- どこに資料があるの？

などなど、小さなことから、案件にかかわる大事なことまで、とりあえず「困った:bangbang:」ばっかり。
けど、どれもこれも根っこは **「誰に質問すればいいんだろう？」** ってことじゃないかと。

# だったら自分が「質問受付窓口」になればいいじゃない
あくまでも「受付」です:sweat_drops:
私が解決できるかどうかはわかりません。
でも、初めてで緊張してる人からすれば、「とりあえずこの人に声をかけたらいいのかな？」っていうのは、それだけで少しほっとできる何かになるんじゃないかと思うのです。

あと、たいていリーダーさんって忙しいから、席にいないことが多いしね！
そういう時のための予備として頼ってもらえるなら、「後輩に頼られてます」って自己アピール用のネタにもなるしね:arrow_left:おい！

・・・ってことで
# <font color="#FF0099">なにかあれば声をかけてください</font>
私でわかることなら答えますし、私で無理なら、答えてくれる人を紹介します:smile:
プレゼン研究会に参加して。

# プレゼン研究会に参加して
## プレゼン研究会とは。 
情報は、下記にまとまっています。
https://infrapre.connpass.com/
不定期的？にさくらインターネットのお二人で共催で実施されている
参加者は必ず発表をする勉強会です。

### 参加者は必ず発表をする
　色々勉強会には参加しておりますが、このルールがある勉強会は、なかなかないと思います。
　発表する時間は主催のお二人次第ではあると思いますが、自由です。
　事前に相談すれば、30分お話することも可能かと思います（内容次第ではあると思いますが）

### 発表する内容について
　発表する内容については、毎回（ゆるめの？）テーマはありますが、詳細な技術的な内容にまではフォーカスされていません。
　その為、新しい技術等について話す必要はなく、自身の考え等を話すことも可能です。
　なので、仮に、自身が実施してる技術や取り組みが新しいものでなかったとしても、
　そこで得たものや、経験を話す場にする事も可能です。
　
## 最近は、頑張って毎回参加してます！
　参加時の目標を発表する機会があり、毎回、参加をすることを目標にしております！
　第9回には、「自分のアイデアを発表して上司の承認を得るには？」というテーマだったことがあり、実は結構内容については、考えましたが、無事発表する内容を考え、参加する事ができて、本当に良かったと思っています。
　毎回発表をすることになるため、当日までスライドを作るつらさを、経験する事になるのですが、それを乗り越えられた時に、大きな自信を手に入れる事ができます。

# 得たもの
　エンジニアとして、というよりは、一人の社会人として、プレゼン、発表をする機会を得て、そこで発表する経験をする事で、大きな自信を手にする事が出来ると思います！

###ぜひ皆さんも、プレゼンする機会はあると思いますので、参加してみては、いかがでしょうか？
### 参加者はエンジニア限定ではないので、ぜひどなたでも参加してみてください！