OmniAICreator/Qiita-1.07M huggingface dataset:
ピカチュウと会話する系のアシスタントを作ってみる #dialogflow

#ピカチュウと会話する系のアシスタント
Google homeのお持ちの方は今すぐ、Google homeに向かって「OK Google ピカチュウとおしゃべり」と言ってみてください。するとこちらの動画の用にピカチュウと会話（！？）することができます。

[![Google home + IRKit ](http://img.youtube.com/vi/5L1PFx1WA2U/0.jpg)](https://www.youtube.com/watch?v=5L1PFx1WA2U)

#ピカチュウと会話する系のアシスタントを作ってみよう
動画にあったようなアシスタントはDialogflowを使えば簡単に作成することができるので紹介したいと思います。ピカチュウの音声だと著作権的にやばいので、犬とか猫のフリー音声素材で試したいと思います。※友人の声を録画したものを使うと忘年会で盛り上がるかも

##準備
- 再生したい音声ファイルを準備する
    - wavとかoggとか
    - 私は[こちらのサイト](https://soundeffect-lab.info/sound/animal/)から拾いました。
- 音声ファイルをサーバーにアップロードする
    - 今回はGCSを使います
    - **https**が使えればサーバーはどこでもOK
- [Dialogflow](https://dialogflow.com)の登録
    - 新しいAgentをjaで作成

##音声ファイルをサーバーに設置
既に音声ファイルアップ済の方は飛ばして大丈夫です！

###GCSに音声ファイルをアップロード
[GCS](https://console.cloud.google.com/storage)にバケットを作成し音声ファイルをアップロードします。

<img width="500" alt="Screen Shot 0029-12-11 at 9.28.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/b6b5c26e-b9a6-43e6-7a37-91e9a270c73b.png">

一般公開にチェックを入れURLを取得します
<img width="500" alt="Screen Shot 0029-12-11 at 9.29.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/3a004477-8e33-8ed5-6457-c23ca7076072.png">


##Intentの作成
Intentにトリガーのワードやレスポンス内容を入力します。

###User saysの登録
User saysにトリガーにしたいワードをどんどん入れていきます。Intentの名前はDogにしました。

<img width="500" alt="Screen Shot 0029-12-11 at 8.42.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/30d462f1-d3c7-a3a2-3b94-b8d5e00ed8c5.png">

### 再生したい音声ファイルを指定
音声ファイルのURLをText Responseに入力します。複数登録することも可能です。記入する時は以下の様なタグで囲う必要があります。**また、<speak>タグの中にドットでもいいので何か文字を入れてください。**入れないとエラーになります。音声ファイルと同じテキストをいれるといいです。


```text:TextResponse
<speak>
    <audio src="https://YOUR_AUDIO_URL"></audio> .
</speak>
```

## テスト
IntegrationsのGoogle Assistantからシュミレータを起動しテストします。デフォルトの場合「テストアプリにつないで」と言うと、テストが実行されます。呼び出しキーワードは、Actions on Google のOverviewから変更可能です。

<img width="313" alt="Screen Shot 0029-12-11 at 9.33.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/126fb964-058e-5a93-dc45-4a1691c13849.png">

スクリーンショットだと分かりにくいですが、ちゃんと「わん！」と鳴いてくれてます:grin:

##会話終了用のIntentを作成
ユーザーが会話から抜けれないとストレスになってしまうので、会話終了用のワードを用意しましょう。

###終了ワードを準備
<img width="500" alt="Screen Shot 0029-12-11 at 9.43.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/1a01e483-acd9-54ad-7018-d5d2d254e0e5.png">

###End conversationにチェック
<img width="849" alt="Screen Shot 0029-12-11 at 9.43.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/514b717d-9d3e-aacb-7396-56272de8c44a.png">

###補足
終了方法や利用方法をDefault Welcome IntentのText Responseに入れておくといいかも。

<img width="400" alt="Screen Shot 0029-12-11 at 9.48.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/9832498a-3de1-c5e7-7a87-116168b1d318.png">

##おわりに
Dialogflowを使えば簡単に会話アプリを作成することができるので、ぜひ一度試してみてください。面白い会話アプリを作れば、忘年会や新年会で盛り上がるかも！？
PostgreSQL での CSV からのインポート、平均、メディアン、相関係数の計算

# はじめに
PostgreSQL ではデータサイエンスに適用できるような機能を次々とリリースしています。

PostgreSQL 9.4 で導入された最頻値やメディアンを取得できるような集約関数、
PostgreSQL 9.5 では `GROUPING SETS` のようなグループ化関数、
PostgreSQL 9.6 でのパラレルクエリ導入によって、統計処理・データサイエンス関係の SQL の高速化が行われています。

本稿では、ボストンの住宅価格のデータを使って、簡単な平均、メディアンなどの計算の例を取り上げます。

# ボストンデータセットとは
1978年に取得された米国ボストン市郊外における地域別の住宅価格のデータセットです。
`scikit-learn` や　`R` にも添付されているデータサイエンスでよく使われるデータセットです。

## ボストンデータセットのダウンロード
まずはボストンデータセットをダウンロードします。

```shell-session
wget https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data
```

## ボストンデータセットのテーブルを作成します。

```sql
create table boston (
  "crim" real,
  "zn" real,
  "indus" real,
  "chas" integer,
  "nox" real,
  "rm" real,       -- 部屋の数の平均
  "age" real,
  "dis" real,
  "rad" integer,
  "tax" real,
  "ptratio" real,  -- 町毎の児童と教師の比率
  "black" real,
  "lstat" real,    -- 給与の低い職業に従事する人口の割合 (%)
  "medv" real      -- 住宅価格のメディアン（ 1,000USD 単位）
);
```

## ボストンデータセットをインポート

なお、このコマンドを実行するときは、事前に `PGUSER` 等の環境変数が適切に設定されている必要があります。

```shell-session
cat housing.data | psql -c 'COPY boston FROM STDIN;'
```

# 統計分析する。

## 前提
* medv が 50.0 のデータが 16個ありますが、これは外れ値と考えられるので除きます。
* 同様に部屋の数が 8つ以上あるデータも外れ値と考えられるので除きます。
* 最小値、最大値、25%パーセンタイル、メディアン、75%パーセンタイル、特徴量との相関係数を表示します。

## 作ったSQL
```sql
WITH
  preprocessed AS (
    SELECT
      medv AS price,
      rm AS room_number,
      lstat AS lower_status_percentage,
      ptratio AS student_teacher_ratio
    FROM
      boston
    WHERE
      medv != 50 AND rm < 8
  )
SELECT
  COUNT(1),
  AVG(price),
  MIN(price),
  MAX(price),
  PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER by price) AS median_price,
  STDDEV_SAMP(price) AS stddev_price,
  PERCENTILE_CONT(0.25) WITHIN GROUP(ORDER by price) AS first_quartile,
  PERCENTILE_CONT(0.75) WITHIN GROUP(ORDER by price) AS third_quartile,
  PERCENTILE_CONT(0.75) WITHIN GROUP(ORDER by price) -
    PERCENTILE_CONT(0.25) WITHIN GROUP(ORDER by price) AS inter_quartile,
  CORR(price, room_number) AS corr_rm,
  CORR(price, lower_status_percentage) AS corr_lstat,
  CORR(price, student_teacher_ratio) AS corr_ptratio
FROM
  preprocessed;
```

|列名|値|
|:--|--:|
|count          | 482|
|avg            | 21.3215768109713|
|min            | 5|
|max            | 48.5|
|median_price   | 20.75|
|stddev_price   | 7.46736990320816|
|first_quartile | 16.6000003814697|
|third_quartile | 24.4749999046326|
|inter_quartile | 7.87499952316284|
|corr_rm        | 0.655629871072213|
|corr_lstat     | -0.763613751990255|
|corr_ptratio   | -0.523482478209307|

これから、部屋の数が多くなれば住宅価格は高くなること、低所得者層の割合が大きくなれば住宅価格は安くなること、が分かります。


異常値を省く前処理は、`WITH` 句を使った Common Table Expression で行っています。

```
PERCENTILE_CONT(fraction) WITHIN GROUP (ORDER BY sort_expression)
```
というのは 指定された割合に対応するパーセンタイルの値を返します。
順序集合を指定する必要があります。

CORR は相関係数を返す関数です。

## おわりに

PostgreSQL は行指向のデータベースなので、データ分析には不向きといわれることもありますが、。
データベースからアプリケーションサーバにデータを転送するのにも一定のコストがかかりますし、多くの環境ではデータベースサーバに有用な情報が多く蓄積されていることでしょう。

今回は単一テーブルなので、あまり恩恵はありませんでしたが、複数のテーブルのデータなどを組み合わせて、データ分析する場合などは特にふだん使い慣れた SQL を使えることには利点があります。

Foreign Data Wrapper の機能も年々充実されており、データマートとしても利用可能な基盤となっています。
合意形成アルゴリズムの種類と特徴

# 合意形成とは
合意形成とは

>ステークホルダー（多様な利害関係者）の意見の一致を図ること。特に議論などを通じて、関係者の根底にある多様な価値を顕在化させ、意思決定において相互の意見の一致を図る過程のことをいう。コンセンサスともいう。特に国民全体の合意形成をはかることをナショナル・コンセンサス、合意形成を図る過程のことを合意形成過程ともいう。

という一般的な意味がありブロックチェーン上では、参加者が次のブロックを作る際正しいブロックはどれか、ネットワーク全体として正しいかを参加者全員で決めることを指しています。

# PoW(proof of work)

これはBitcoinなどで使われているものでハッシュ計算などを行い指定された問題を最初に解いた人に次のブロックを作る権利を与えるといったものです。

## 特徴

参加者が少ないとき・問題の難易度が低い場合・ネットワークが始まったばかりでは比較的他者に悪意のある攻撃を受けやすいですが成熟してくるとブロック全体の値を改ざんすると言った行為が難しくなるといった特徴があります。
また、問題の難易度が低すぎても意味が無いため平均すると次のブロック作成までに１０〜２０分程度で解ける問題難易度に設定していることが多いです。
参加者が増えれば増えるほどネットワークが強固になっていくのが特徴です。

# PoS (proof of stake)

最近Ethereumで用いられているアルゴリズムで所持しているコイン以下の値が計算できたらブロック作成の権利を与えると言ったものです。これはコインを多く所持しているユーザーは自分のコインの価値を下げるような行為をしないといった考えからできたものです。

## 特徴
PoWの場合５１％以上悪意のあるユーザが参加してしまうとネットワークが乗っ取られてしまうという問題点が存在します。その問題点を解決するために考えられたのがPoSです。
また、PoWの計算にはコストがかかりすぎるのでそれを改善するために考えられた方法でもあります。
多くのコインを持つユーザーがマイニングをしやすいと言った特徴とそれほど電力を消費させないという特徴があります。

# PBFT
こちらはHyperledger Fabricで用いられている（用いられる予定）のアルゴリズムです。
こちらは単純で全ネットワークの合意形成を決めるリーダーを決めておき、リーダーの言ったとおりに合意形成を行うと言ったものです。

## 特徴
リーダーが全合意形成を決定するため合意形成にかかる時間が圧倒的に少ないこと、ファイナリティが高いといった特徴があります。
ただし、リーダーが信用出来ないとネットワーク全体が信用できなくなってしまいます。

# 最後に

合意形成の方法は様々で利用するネットワークで今後どのようにしていきたいかで使われるものが変わっていくかと思います。
合意形成をしっかりとしたものにしたいと思ったらPoWやPoSを使い、次のブロックを早く作成したいなどと思った場合はPBFTを使うと言った形です。
SubversionにソースコードがコミットされたときにJenkinsでビルドする

# やりたいこと
フックスクリプトでJenkinsのビルドを実行するURLにリクエストすればいいのですが、今回、同一リポジトリでドキュメント類とソースコードを管理しています。
そのため、ソースコードがコミットされた時だけ、Jenkinsのビルドジョブを実行したいです。

フックスクリプトの中で、更新のあったファイルを調査し、ソースコードの場合だけJenkinsのジョブを実行するように作成します。

# リポジトリの構成
今回は以下のような構成でファイルを配置しています。

/svn/repo/
　├ branches
　├ tags
　└ trunk
　　　├ doc
　　　│ 　└ ドキュメント類
　　　└ src
　　　　　└ ソースコード

# フックスクリプトを書く
今回はコミットが完了した後に実行される、post-commitを利用します。
post-commitでは、第1引数にリポジトリのパス、第2引数にリビジョン番号が渡されます。
この情報と、svnlookコマンドを利用して、変更があったファイル一覧を取得できます。この実行結果をgrepして、ソースコードが含まれている場合には、Jenkinsのビルドジョブをcurlで実行します。

```shell:post-commit
#!/bin/sh

REPOS="$1"
REV="$2"

svnlook changed "$REPOS" -r "$REV" | grep "/trunk/src/"

if [ $? -eq 0 ]; then
  curl [Jenkinsのビルドを実行するためのURL]
fi

```
Android機種依存動作まとめ

この記事はRetty Advent Calendar 2017 における 11日目の記事です。
昨日は @tkngue の[データベースレス で サーバーレス な 社内図書システムをGoogle App Script (GAS) で作ってみる]( https://qiita.com/tkngue/items/82e39fa1f977ecf92e9f#%E3%82%B9%E3%83%A9%E3%83%83%E3%82%AF%E3%81%8B%E3%82%89%E6%93%8D%E4%BD%9C) でした。

# はじめに
RettyでAndroidエンジニアをやっている[福井](https://twitter.com/muumuumuumuu)です。

Android開発をしていている皆様、いかがお過ごしでしょうか？2017年も終わろうとしていますが相変わらず機種依存と戦っていることだと思います。私は戦っています :crossed_swords: 
機種依存はAndroid開発をする以上避けて通れない問題かと思いますが、なかなか一覧でまとめられている記事を見かけない気がしたので作りました。Rettyに入社してからの2年半で私が出会った機種依存のあれこれです。それではどうぞ。

# 機種依存挙動

## AQUOS かつ OS ver 4.1.2
### `android:windowTranslucentStatus`
[windowTranslucentStatus](https://developer.android.com/reference/android/R.attr.html#windowTranslucentStatus) はAPI Level 19から追加されたattributeです。ほとんどのAPI Level 19以下のOSバージョンの端末でこのattributeはスルーされますが、AQUOS かつ OS ver 4.1.2 (API Level 16) の場合は **クラッシュが発生します。**（なぜか同じ端末でも `4.0.1` の時は問題が発生せず、 `4.1.2` にアップデートしたらクラッシュするようになりました :thinking: ）
バージョンに応じたリソースディレクトリ (`values-v19/`など) を作成し、この中でのみ該当attributeを使うことでクラッシュを回避することができます。サボらずちゃんとやりましょうってことですね。


## AQUOS かつ OS ver 4.0.1
### Unicode
Unicode `e640`〜`e760`まで端末側の定義が存在しているようです。アプリでアイコンフォントを設定してもそちら側が参照されず **必ず端末側が優先されるようです。** ちなみにこの辺りは星座の絵文字:pisces: :virgo: が登録されていました。該当機種だけweb viewのある画面が星占いみたいになっていました :innocent: 
アプリでunicodeを設定する場合は `e640` 〜`e760`を避けたほうが良さそうです。

## Fujitsu (F-02E)
### shapeのデフォルト色が透過ではなく黒
xmlで `shape` タグを用いてdrawableを作成するときにデフォルト色が透過ではなく黒でした。

例えば枠線だけの画像を記述するときに、何色で塗りつぶすか指定を忘れると「真っ黒の塗りつぶしに枠線がついた画像になっています。
（他の機種で見た時は枠線だけが見える画像になります。）

```xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke android:width="1dp"
            android:color="@color/my_color" />
</shape>
```

忘れずに透過で塗りつぶす記載をすることで回避できます。

```xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/transparent" />
    <stroke android:width="1dp"
            android:color="@color/font_color_sm" />
</shape>
```

## Fujitsu (F-01F)
### `ListView#addFooterView()`
ListViewにfooterを設定する際に、 **adapterをセットした後にfooterをセットすると無視されます。**

```kotlin
// これは動かないけど
this.listView.adapter = adapter
this.listView.addFooterView(footerView)

// これなら動く
this.listView.addFooterView(footerView)
this.listView.adapter = adapter
```

## Xperia (D5803)
### String.trim()
通常こちらのメソッドは全角空白文字はtrimの対象外かと思いますが、なぜか全角空白文字もtrimされちゃいました。AndroidっていうかJavaじゃん…嘘だろ…
最近のXperiaはちゃんと半角のみtrimしてくれます。確かZ3 Compactくらいまではこのような挙動になっていた記憶があります。

# おわりに
いかがでししたか？最近発売された端末ではだんだん機種依存動作を見なくなりましたが、多くのサービスで数年前に発売された端末もサポートしていると思います。共に機種依存と戦うみなさまの一助になれば幸いです。それではHappy Coding!

明日は @yongyu-li の「ReactNativeのFlatList vs ListView」です。お楽しみに！
emscriptenのメモ・parcelでどうしようか

# 概要

https://github.com/taktod/emscripten-webpack-loader
これをparcelのpluginとしたい。

つくりたかったものができました。
https://qiita.com/taktod/items/f2be7e2cfd9fcbc96722


## なぜこんなものが必要か

例として
emscriptenでvp8変換とopus変換したいとする
vp8処理をする動作用のjsをvp8.c -> vp8.jsとして作成
opus処理をする動作用のjsをopus.c -> opus.jsとして作成

htmlファイルからscriptタグでこれら２つのjsファイルを読み込んで処理させようとすると

「動作しません」

なんかメモリー用のデータ部が干渉するらしい。

なのでうまく動作させたい場合は

vp8.c opus.c -> enc.jsとして作成する
emscriptenの出力のjsは1つにまとめる必要があります。

# emscripten-webpack-loaderではどうやったか

まずソースファイルとして以下のemc.tsとemc.jsを定義した。

https://github.com/taktod/ttLibJsEmc_next/blob/c84d3e081b698fbeed352a1ad62d286077921096/src/emcts/encoder/opusEncoder.emc.ts

こんな感じ

ソースコードの先頭にjsで矛盾がない形で
コンパイルの元になるsource
js側から利用したいfunc
コンパイル時に必要になるcflagsとldflags
を定義することにした。

あとはwebpackのpluginの動作で
webpackの結合時にすべてのemc.ts、emc.jsを検索してこれら４つの情報をすべて収集
収集したデータを元にコンパイル実行

できたデータをwebpackの次のpluginに通常のjsとして渡すことで解決しています。

# parcelでどうしようか

https://parceljs.org/getting_started.html
ここのadavancedによると

parcelのpluginをつくるとAssetとPackagerの２つが定義できるみたいですね。

## 動作はざっくりこんな感じ

pluginを書くと・・・
拡張子(１文字目を排除する)とMyAssetを紐づける
Assetでの定義typeとMyPackagerを紐づける
という動作になる模様

ファイルが更新や追加されると拡張子から対応するAssetに処理を託す
https://parceljs.org/asset_types.html

基本的にgenerateの応答のjsはjs packager cssはcss packagerといったふうに渡される
対応するものがない場合はraw packagerに渡されるらしい

## 処理順メモ

まずはasset

Apretransform
Aparse
AcollectDependencies
Atransform
Agenerate

これをそれぞれのファイルについて実施

assetの結果は.cacheに記録される模様
元になるファイルを更新しないとcacheは更新されないみたい。
pluginが更新されても、そのままな模様


cacheのデータは
dependencies 依存しているファイル記録 jsで別のjsをrequireしてるとか
generated 作成したデータのjsonの形かな？
hash hash値

次にpackager

Pstart
PaddAsset
Pend

startでhead情報を書き出し
addAssetでassetをベースに１つづつデータを書き出す。
endでtailの情報を書き出し

packagerはparcelでコードを書き直す場合に毎回callされる

というイメージ

# ということからするとparcelでの動作はこんな感じにすべきかな。

.emc.ts
.emc.js
と独自assetを紐付け(*1)
assetの処理でsourceと紐付け

通常のjsとおなじように出力を実施しつつ
emscripten用の情報をgeneratedに登録しておく

js -> jsPackagerで処理
emc -> 独自packagerでemscriptenのコンパイルを実施しておく
html -> htmlPackagerでコンパイルしてemc.jsを読み込めるようにしとく

webpackとはちがいmem.jsつかえそうですね。

さて、プログラミングしてみるか・・・

*1: この拡張子を.emc.tsとかにするとtypescriptと判定されて処理するみたいですね。
処理pluginとしてはちゃんと登録されるけど、マッチ検索のときに.tsが優先される模様。
この動作になる原因はpath.extnameの挙動による模様。
path.extnameの動作を書き換えて.emc.js .emc.tsの場合は・・・というのを書けばよさげだな。
-> だめっぽい。packagerの動作の部分でawait asyncを使っている部分があるもようだが、この部分でpath.extnameの動作が戻されてしまう模様。うーん。
tsとMyAssetを紐づければオリジナルの動作をオーバーライドできるみたいなので
そうやってから、拡張子がemc.tsならこうして、tsならこうして・・・というコードを各方向でいってみよう。
-> この方法を使うと別のpluginが同じことをしているとどっちかのライブラリが無効になる可能性があるわけか・・・
これは困るな・・・
-> この方法だとダメなこと、その２：pluginのロードが本家のロードの後になるとは限らないみたいですね。こりゃ困ったわ
emcjsとemctsを定義して、プラグイン自体はtsやjsで書いてそのなかで特殊データとしてemcという拡張子のデータを読み込むみたいなことにしておくといいかな。

assetのループで処理してくれるのって、 dependenciesで紐づいているもののみっぽいですね。
手元の動作テストだと
index.html -> index.ts -> hogehoge.ext
という依存関係になってて、独自のデータがある場合にindex.htmlにscriptタグをかかせようとしてもうまくいかないみたい。
どうしたものか・・・

.cacheの中身のjsonをみてみたところ、cacheをさぐっていってindex.htmlに依存データを書き込む・・・ということはできないもよう。
index.htmlにいい感じにscriptタグを自動で挿入したいけど・・・うーん。

あ、そうか、 scriptタグを動的につくって、追加するようにすればいいかな。
emscriptenの動作でのmem.jsの読み込みってどうやってるのかな。

emscriptenのjs.memはみてみたところXMLHttpRequestで取得してりようしてる模様。
今回の動作では、js側でrequire(import)したときにscriptタグをつくって追記するのが一番かな。と思った。
pythonでデータ処理（ファイルから読み込んだり、mongoDBに保存したり）

データを扱う作業を行う場合、pythonだとかなりシンプルに実現できるので、まとめます。

大体は下記のケースが多いと思います。
1.ファイルに出力されたデータを読み込む
2.データベースに保存する
3.データベースから読み込む

ここでは、mongoDBの例を挙げます。

ごちゃごちゃ言わずに、まずソースを見たい方は[こちらを利用ください](https://github.com/matsu0228/pymongo-example)

## 1.ファイルに出力されたデータを読み込む

普通にやると、openして1行ずつ読み込んで、delimiter(区切り文字)で区切って、、と地味に面倒です。
pythonでは、`pandas.read_csv`ライブラリを活用することで非常に簡単に実現できます。（TSVでも他形式でも。`sep=**`でdelimiter指定します）

```python
import pandas as pd

def save_data_from_file(file_name, delimiter, flg_have_header):
    if flg_have_header:
        pd_dic = pd.read_csv(file_name, sep=delimiter)
    else:
        pd_dic = pd.read_csv(file_name, sep=delimiter, header=None)
    final_dict = [dic for index, dic in pd_dic.to_dict(orient="index").items() if index!=0]
    # 下記は後ほど説明
    save_dict("your collection", final_dict)
```

- これだけで、ファイル内容が取得できます（pd_dic: Pandas.DataFrame型）。
- たとえば、ヘッダーがないファイルを読むこむ場合は、`header=None`をつけます。その他オプションについても細かく指定できます。[ドキュメントはこちら](
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)

- 上記は、Dictionary型に変換して利用する例です(final_dict)


## 2.データベースに保存する

- 前準備として、mongoDBのインストールがされていることを想定します。（ターミナルで`$ mongo`で接続できる状態）
- `pymongo`というライブラリを利用し、mongoDBへの接続をします。
- データベース接続情報を用意（セキュリティ的問題から、`.gitignore`に追記すべき）

```./conf.ini
[mongo]
id=**
password=**
```

- pymongo接続関数を作成（configparserでパスワードなどを読み込む）

```database.py
import os, sys, configparser
PYMONGO_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))

def get_db(db_name):
    config = configparser.ConfigParser()
    config.read(PYMONGO_DIR + '/config.ini')
    client = MongoClient('localhost')
    client['admin'].authenticate(config.get('mongo', 'id'), config.get('mongo', 'password'))
    db = client[db_name]
    return db
```

- いよいよデータの保存です
- `upsert=True`で、すでに`column_name`に一致するドキュメントがあれば更新、なければinsertできます。
- 上記で説明した、`get_db()`でDB接続します

```database.py
from pymongo import MongoClient,  DESCENDING

def save_dict(collection_name, dict_objs):
    db = get_db(DICTIONARY_DB)
    coll = db[collection_name]
    for dict_obj in dict_objs:
        coll.update({
            "column_name": dict_obj['column_name']
        },
        dict_obj, upsert=True)
    return
```

## 3.データベースから読み込む

- 例として、特定のcollectionを全件読み込み、pandas.Dataframeにして取得する例です。

```database.py
def load_your_dic(collection_name):
    db = get_db(YOUR_DB)
    cursor = db[collection_name].find()
    df = pd.DataFrame.from_dict(list(cursor)).astype(object)
    return df
```

## ソースはこちら

https://github.com/matsu0228/pymongo-example

- ファイルからmongoDBにインストールする場合は、下記のコマンドで実現できます

```
python init_collections_from_file.py -d"\t" -f **.dic --HEADER Y

[sample]何回も処理する場合はシェルで書くと捗ります
init_politely_dic.sh
```
cesiumでタイルを理解

#概要
cesiumでWebMercatorTilingSchemeを表示してみた。
「L3X3Y3」は、たぶん、レベル3のｘが3でYが3の意味。


#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/52b6d940-1963-2cc4-338c-02b5d883190f.png)

#サンプルコード

```
var widget = new Cesium.CesiumWidget('cesiumContainer', {
    imageryProvider: new Cesium.TileCoordinatesImageryProvider({
    	tilingScheme: new Cesium.WebMercatorTilingScheme()
    })
});

```

#成果物
http://jsdo.it/ohisama1/oCO6


以上。
金銭感覚を大事にする Chrome 拡張を作っている話

年末は、何かと Amazon や楽天で買い物する機会が増えます。

これ、便利だからついつい買っちゃうというのもあるんですけど、**お金を使う感覚が薄い** ってのもあると思うんです。

# お金の感覚

クレジットカードや電子マネーも、現金を直接授受した取引に比べ、**お金を使った感覚が薄い** とよく言われます。

しかし逆に、現金だと財布を見て『まだあるぞ』と安心して紐が緩んでしまう感覚もあります。

お金の感覚って、なんだろう。

# MoneySence

ということで、実験としてこんな拡張を作りました。

![money.gif](https://qiita-image-store.s3.amazonaws.com/0/20198/f06ad1c4-cf88-8d3a-3793-85183831809f.gif)


何をしているかというと、**金額の下に、紙幣・硬貨で支払った場合どうなるのか** を表示しているだけ。

ちなみに、楽天も対応してます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/fcfc0f46-1346-2cd5-d4a9-94bc93f51b44.png)

# 使ってみてどうだったか

## 数字の魔術が解ける

数字とは感覚が明らかに変わります。
数字の持つ連続性みたいなものが無くなって、非連続な感覚になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/06a97c24-d06f-0070-fe9d-82ad06850c22.png)

## 5 の凄さ

数字だけの場合、パッと見で桁がいくつなのかが大きな影響力を持ちます。
その為、真ん中の 4 ~ 7 辺りの間隔が少し狭く感じるような錯覚に陥ります。

しかし、5000円, 500円があることで、0 ~ 4 までの感覚で比較できるため、金額の中だるみがありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/f02ab735-bcad-1bb7-ed02-2dc30ed1c4cb.png)

## 1 万円の特別感

完全に見ている品物によるんですが、**諭吉さん** の存在感を大きく感じます。
30,000 円と諭吉三枚だと、諭吉三枚の方が高く感じます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/f6c1c287-e313-ef92-f53a-ec2f7d6ef36c.png)

# 感想

とりあえず、感覚が面白かったのでもう少し使ってみます。
現金主義かそうでないかでも、感じ方は違いそう。

また、人様のサイトに手を加えている関係上、検証をしっかりしたいということもあり、ストアへの登録は行っていません。

Github にはソース置いておくので、試したい人は自己の責任のもとで試してみてください。

https://github.com/kentork/moneysense

# 謝辞

この適度に抽象化された紙幣・貨幣のイメージは以下から頂きました。
この場を借りて御礼申し上げます。

[ILLUST BOX](https://www.illust-box.jp/)
[作者: 上田 ひろ子さん](https://www.illust-box.jp/member/view/157574/)

---

以上、今年外せない FinTech に関する記事でした。
文字の変換にはstr.translate()が便利

この記事は [Pythonのコードを短く簡潔に書くテクニック Advent Calendar 2017](https://qiita.com/advent-calendar/2017/python-short-code) の11日目です。

# はじめに

文字列内の文字を変換したり削除したい時、1文字だけなら`str.replace()`を使ってもいいのですが、複数の文字を変換したいときは面倒です。
こんなときには[str.translate()]を使うのが便利です。

[str.translate()]は変換テーブルを使って文字列を変換する関数です。

尚、[str.translate()]はPython2、Python3の両方で使用できますが、Python2ではstr型とunicode型での違いがあり複雑になるため、ここではPython3での使用方法のみ説明します。


[str.translate()]:https://docs.python.jp/3/library/stdtypes.html#str.translate
[str.maketrans()]:https://docs.python.jp/3/library/stdtypes.html#str.maketrans

# 例題

例えばこんな変換をしたい場合を考えてみます。

|変換前|変換後|
|---|---|
|、|,|
|。|.|
|・|削除|

```:変換前の文字列
Qiitaは、プログラミングに関する知識を記録・共有するためのサービスです。
```
```:変換後の文字列
Qiitaは,プログラミングに関する知識を記録共有するためのサービスです.
```

# `str.translate()`を使わずに書いた場合

`str.translate()`を使わない場合は次のような手順になります。

1. 変換テーブルとして変換前の文字と変換後の文字のマップを定義する
2. 対象テキストを1文字ずつ取得して変換テーブルを使って文字を変換していく

```py3
table = {
    '、': ',',
    '。': '.',
    '・': '',
}
result = ''.join(table.get(c, c) for c in text)
```

# str.translate()を使って書いた場合

[str.translate()]を使う場合は次のような手順になります。

1. [str.maketrans()]で[str.translate()]に使える変換テーブルを作成する
2. [str.translate()]で文字列内の文字を変換する

1.の[str.maketrans()]は引数の指定方法が2通りあります。

- 変換テーブルをdictで指定する
- 変換前文字、変換後文字、削除対象文字(省略可)を指定する

## 変換テーブルをdictで指定する

```py3
table = str.maketrans({
    '、': ',',
    '。': '.',
    '・': '',
})
result = text.translate(table)
```

2.の処理がスッキリしました。

## 変換前文字列、変換後文字列、削除対象文字列を指定する

```py3
table = str.maketrans('、。', ',.', '・')
result = text.translate(table)
```

1.の処理がだいぶスッキリしました。

# 処理時間の比較

2.を１００万回繰り返した時の処理時間を比較してみました。


|方法|処理時間　(s)|
|---|--:|
|`str.translate()`を使わずに書いた場合|13.511|
|変換テーブルをdictで指定する|4.575|
|変換前文字列、変換後文字列、削除対象文字列を指定する|4.507|

# 結論

`str.translate()`を使いましょう。

# 参考

- Python3 ドキュメント
    - ライブラリーリファレンス
        - [str.maketrans()]
        - [str.translate()]
冬だけど花火がみたい？？なら実装すればいい

冬です！寒いです！

寒いから、温かい気分を味わうために花火が見たくなってきませんか？

ということで、花火を実装してしまおう！

#花火の作り方
## 準備
[Processing](https://processing.org/)をインストールしてください！

Processingとはプログラマブルなベクタードローツールです。中身はJavaでできていて、文法もJavaです。

## Particleクラスを作る
花火のあの火花？の部分として、Particleクラスを作りましょう。実装したい機能はこちらです。

- 火花？が放物線を描いて動いてほしい。ようは物理法則

とりあえず、Particleクラスを作ります。

```java
class Particle {
}
```

次に、物理法則が欲しいので、必要なメンバーとして、位置、速度、加速度を定義します。

```java
class Particle {
  PVector location;
  PVector velocity;
  PVector acceleration;

  Particle (float xpos, float ypos, float xsp, float ysp) {
    this.location = new PVector(xpos, ypos); // 初期位置
    this.velocity = new PVector(xsp, ysp); // 初速
    this.acceleration = new PVector(0, 0.001); //　重力加速度的なやつ
  }
}
```
さて、次は物理法則に従って動かすためのメソッドです。中身は簡単です。あの有名な物理法則を定義しただけです。

$$a = \frac{dv}{dt}, v = \frac{dx}{dt} $$

```java
class Particle {
  //...
  void update () {
    this.velocity.add(this.acceleration);
    this.location.add(this.velocity);
  }
}
```

そして、火花？の描画のためのメソッドを書きます。

```java
class Particle {
  //...
  void display () {
    pushMatrix();
    resetMatrix();
    translate(this.location.x, this.location.y);
    ellipse(0, 0, 10, 10); // 円を描画
    popMatrix();
  }
}
```

## Fireworkクラスを作る
火花？を撒き散らすクラスです。必要なのは以下の機能！

- 火花？を３６０度に無作為に散らす

```java
class Firework {
}
```

火花？と花火の位置をメンバーに持たせましょう。

```java
class Firework {
  PVector location;
  ArrayList<Particle> particles;
  
  Firework (float xpos, float ypos) {
    this.location = new PVector(xpos, ypos);
    this.particles = new ArrayList<Particle>();
  }
}
```

後は、火花？を撒き散らすメソッドを書きましょう。ついでに、描画までも。

```java
class Firework {
  //...

  //　撒き散らす
  void explode () {
    for (int i = 0; i < 400; i++) {
      float theta = random(0, TWO_PI);
      particles.add(new Particle(
        this.location.x, this.location.y, // 花火の位置に火花を設置
        cos(theta), sin(theta) // ３６０度のどれかに初速を設定
      ));
    }
  }
  
  // 火花の物理計算
  void update () {
    for (int i = 0; i < 400; i++) {
      particles.get(i).update();
    }
  }
  
  // 火花たちの描画
  void display () {
    fill(255); // 火花を白色にしてみた
    for (int i = 0; i < 400; i++) {
      particles.get(i).display();
    }
  }
}
```

##さて、準備完了！
花火を打ち上げる？ために以下の用に準備！終わったら実行だ！

```java
Firework firework;

void setup () {
  size(600, 600); // 600x600のキャンパスを作る

  firework = new Firework(width/2, height/2); // 花火をセットアップ
  
  firework.explode(); // 火花を撒き散らす
}

void draw () {
  background(0); // 背景はBlack
  firework.update();　花火の計算
  firework.display(); // 花火の描画
}
```

え？しょぼいって？こんなの花火じゃないって？

しょうがないな〜

##最後に、ちょこっと花火っぽさだすと
こうなりました！

![firework.gif](https://qiita-image-store.s3.amazonaws.com/0/183627/f59cd1f3-7dad-b33e-3d01-2eb2db791614.gif)

##最後に
これは、大学１年生のときに作ったプログラムです。二年ぐらい前かな？
大学に入ってからはじめてプログラミングに触れて、プログラミング超楽しいじゃん！って思いながらとにかくコード書いてた時期です。もちろん今も書いてますが。

ネタが思いつかなかったので、これにしてみました。

ソースコードは汚いですが、こちらになります。
https://github.com/RyosukeCla/fireworks
[ios]UIPageViewControllerの使い方

UIPageViewControllerを使ったので、メモ。
ようやく、storyboardでVCを扱わず、コードのみで処理を行う感覚が掴めてきた気がする。
余談だが、12月からアウトプットする習慣をつけたいと考えて、毎日投稿するようにしているのだが、なかなか難しい。けど、アウトプットすることを意識してコードを書くだけで、いつもの２、３倍知識を吸収できている気がする。








```swift:SlideViewController.swift
import UIKit

class SlideViewController: UIPageViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setViewControllers([getChat()], direction: .forward, animated: true, completion: nil)
        self.dataSource = self as! UIPageViewControllerDataSource
        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func getChat() -> ChatViewController {
        return storyboard!.instantiateViewController(withIdentifier: "chat") as! ChatViewController
    }
    
    func getDetail() -> GroupDetailViewController {
        return storyboard!.instantiateViewController(withIdentifier: "detail") as! GroupDetailViewController
    }
    
}

extension SlideViewController: UIPageViewControllerDataSource {
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        if viewController.isKind(of:GroupDetailViewController.self) {
            return getChat()
        }  else {
            return nil
        }
        
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        if viewController.isKind(of:ChatViewController.self) {
            return getDetail()
        }  else {
            return nil
        }
        
    }
    
}
```
Jenkins Multibranch Pipeline で変更がないのにビルドが実行される場合の対処法

何回か同じことを調べている気がするので、書き出し。

# 環境
- Jenkins 2.73.2 + Mercurial Plugin 2.2
- Mercurial 4.0
- Mercurial リポジトリに対して Jenkins で Multibranch Pipeline を実行している

# 事象
- ブランチに対して何も変更コミットがないはずなのに、そのブランチに対するビルドが何回も trigger されてしまう

# 原因
- Mercurial リポジトリに対して Multibranch Pipeline が scan する時の挙動は以下のような流れで動いている
    1. `hg heads --template "{node} {branch}\n"` でブランチとそのブランチの head コミット ID 一覧を取得する
    2. 各コミットに対して `hg locate -I path:Jenkinsfile` して、Jenkinsfile が存在するかチェックする
    3. head コミットが、前回 Jenkins がビルドしたブランチのコミットと違う場合、変更があったと検知してビルドを trigger する
        - 前回ビルドしたコミットは、ジョブディレクトリ内の `branches/<ブランチ名を略した名前>/scm-revision-hash.xml` というファイルに書かれている 
- あるブランチに対して複数の head コミットが存在する場合、↑の3. でそのブランチは常に変更があったとみなされてしまうのが原因

# 対処方法
1. 同じブランチ名で head コミットが複数ないか `hg heads` で確認する
2. どちらかのコミットをマージするなりクローズするなりして、double head を解消する
    - そもそも、double head を拒否するように hook を書けばいいじゃん、という話もありますが…

# 余談
- Git だと double head は起こり得ない雰囲気がする
    - Mercurial はコミットごとにブランチ名が記録されるが、Git の場合はブランチはあくまでもコミットを指し示すポインタでしかないので
- Multi-branch Pipeline のビルドが動く度に、ログが2つ出て来るとか、ビルドが2つ走っちゃうとかいう問題も別にある
    - https://issues.jenkins-ci.org/browse/JENKINS-37384
        - Git では Git Plugin 側で修正しているというお話だそうです
    - Multibranch Pipeline 周りの実装は大変そう…
アプリ監視

開発技術メインと言いながらも
メモ第一号は運用より

サーバー監視だけじゃなくてアプリケーションのログ監視に使うサービスとして
zabbixというものがある。

自分で設定をしたことがないのでまだ詳細は理解してないが

zabbixを動作している監視サーバから
監視対象のサーバで動かしているアプリケーションのログを監視してERRORログやWARNINGログを検知したらアラートやメールを飛ばすなどの動作で監視者へ伝えることが可能

設定は簡単で、gui形式で
監視対象のサーバアドレス
ログファイルのフルパス
警告対象キーワード(正規表現の設定可)
検知時の動作をってい出来る

あるアプリケーションでERRORログ出力時に、ERRORという文字をキーワードに
指定のメールアドレスへ定型のメールを送信して通知するなど

influxdbというものを使って監視もできるらしいが
そっちはまだ調査中なのでわかったら後ほどメモ記載予定
初投稿

初投稿

まずはqiitaの投稿に慣れるために
技術メモ(メモにもならないレベルかも)で
適当に新しい知識とかを書いていこうと思う。


基本的には開発技術メイン
だけど、ネットワークやインフラ、運用と幅広く関わる機会があるので
多分野ながらも、それぞれの技術やツールの知識とかをメモしていきたい。
fluentdがプラグイン依存関係で最新versionにあがりハマった

書こうと思ったら既に書いてる人いた、、

* [fluent-plugin-ping-messageプラグインを最新のを入れるとtd-agentがunstable versionになるためバージョン指定する話](http://t-suzuki.hatenablog.jp/entry/2017/05/18/201117)

fluentdの公式ドキュメントにも書かれていた

* [Plugin version management](https://docs.fluentd.org/v0.12/articles/plugin-management#plugin-version-management)

fluentd自体もバージョン指定しておくとよさげ。
つねにlatest入り、色々なプラグイン使ってるとほぼ挙動に影響が出るので、、

* [td-agent(Fluentd)をバージョン指定でインストールする](https://qiita.com/saicologic/items/affbb4799b4a696d490f#rpm)
クローラー開発エッセンス

#クローラー開発エッセンス
## はじめに

[クローラー／Webスクレイピング Advent Calendar 2017 - Qiita](https://qiita.com/advent-calendar/2017/crawler)

「クローラー／Webスクレイピング Advent Calendar 2017」（上記リンク参照）に参加しています。

クローラーは、個々の技術は難しくないものの、用いられる技術が多岐に渡ります。そこで、開発のアイディアやノウハウを集めました。前半は入門、後半は、クローラーを運用する際のポイントを取り上げます。

なるべくコンパクトにエッセンスだけまとめるため、浅く広く箇条書きの記事になってしまいましたが、もし参考になれば幸いです。


***
## クローラーを簡単に作る方法

まず、軽く小手調べというか、入門的な方法から書いていきましょう。
すでにバリバリ組んでいる読者の方は、ここを読み飛ばしてください。

### ノンプログラミングコース
- 一番簡単！
- RSSリーダやWeb更新チェッカを使う
- すでに完成したクローラーと見れなくもない
- 自分で組まなくて済むコスパを考えると楽。とくにGUIがあるのが良い
- 個人レベルでの運用や、実験的に少しデータを集めたい場合などに向く
- とはいえ、取得ページが大量や定期的になるなら、やはり自動化したい
- OPMLファイルをインポート／エクスポートすると、半自動化に使える

### エクセル（VBA）コース
- オフィスのエクセルでおなじみVBA
- ExcelのVBAには「Webクエリ」という機能があり、Webにアクセスできる
- だから、VBAでもクローラーが作れてしまう
- じつは、エンジニアだと、VBAはかえって面倒に感じる（かも）
- しかし、非エンジニアがVBAを習得しているケースで有効
- 株価のように、結果を表に落とし込んで表計算する用途には相性が良い

### シェル（スクリプト）コース
- Linuxコマンドの「wget」を使う
- Windowsでは？
- PowerShellの「Invoke-WebRequest」がそれに相当する
- もし、取ってくるページ数が少ない場合、小回りが利く
- 大量のページを取得するなら、P言語で書きたい

### P言語コース
- メジャーな言語なら何でも、クローラーは作れる
- ただあえて言えば、クローラー作成にはP言語がオススメ
- P言語とは、Perl、PHP、Python、Rubyの4つ
- Webとの親和性が高く、LLなので入門もしやすい
- クローラー用ライブラリ／フレームワークがあって組むのが楽
- 最近ではJavaScript（Node.js）のクローラーも有力になってきた様子

### Ruby & RSSコース
- 筆者がRubyを使用しているので、Rubyでの入門を解説する
- Ruby標準ライブラリの「open-uri」と「rss」を使う
- RSSはクロールするためにあるような規格なので楽
- 構造が変わらない点で、HTMLを直接クロールするよりメンテが楽
- だから、クローラーはRSSから入るのがオススメ
- RSSの次は？
- （Web）APIの取得がオススメ
- APIを覚える必要はあるが、やはり構造が変わりにくいので楽
- 本格的なクローラー制作には？
- Rubyの場合、「Anemone」「Nokogiri」が定番ライブラリ
- 『Rubyによるクローラー開発技法』がオススメの書籍（Rubyの場合）


***
## クローラーの巡回戦略
後半は、クローラーの運用方法を書いていきます。

クロール規模が大きくなると、時間がかかって終わらなくなったりするため、
大量にクローリングする必要がある場合の巡回戦略から紹介します。

### アクセスの複数同時化
- まず、法的リスクからも「1秒ルール」は守るべきなので、待機時間の短縮には限界がある
- そこで、別サイトに複数同時アクセスし、単位時間あたりの取得ページを増やす
- その際、ドメインをリスト化して、同一ドメインの複数同時アクセスを禁止する
- しかし、見落としがちだが、別ドメインでも、バックエンドのサーバは同一の場合もある
- よって、別ドメインでも、同IPなら複数同時アクセスを禁止する方が、より無難


### 更新頻度のチェック
- 巡回時に、ページが更新されているかどうかをチェックする
- そして、ページの更新頻度の高さに比例してクロールする
- すると、更新頻度が低いページを飛ばせるのでムダが少ない
- 更新頻度を判定する具体的なアルゴリズムは？
- たとえば、「2ちゃんねる」型のスレッドフロート掲示板がイメージしやすい
- 更新されるたびにリストの先頭に追加していくと、更新頻度の高いものが浮上する
- そこで、そのリスト前半のクロール頻度を高くし、後半を低くする
- より正確にするなら、更新数と期間から「勢い」のような値を算出する
- 難しくなるが、確率的モデルを追求すれば、さらに最適化できるかも（？）


***
## 並列処理と分散処理
ここでは、クローリング処理の並列化、分散化について書きます。
そもそもインターネットが分散型システムなので、
クローラーの処理を分散させるのも有効でしょう。

### 並列処理
- クローラーの処理時間は、相手サーバとの通信にかなり割かれる
- すると、CPUが遊んでしまうので、並列処理が有効
- たとえば、クロールと、取得したページの解析処理を並行して進める
- 取得するページが多ければ、マシン（と回線）を複数でクロールする
- しかし、小規模だと複数のサーバを用意するのが大変
- そこで、「AWS Lambda」のようなクラウドを利用する手もある

### P2Pクローラー
- 複数台の場合、ネットワークをP2Pの通信方式で並列化する手法もある
- P2P共有ソフトがファイルを共有するのに対して、ページを共有するイメージ
- サーバ／クライアント式のようなボトルネックができないのがメリット
- 安価なマシンで台数が多い構成が取れるのもメリット
- デメリットはプログラムが難しくなること
- たとえば、各ノードが自律協調的にAIで判断し、ページを取得、選別するとか
- 技術的には面白いが、難しい
- 小規模にP2Pはちょっと大げさ過ぎる
- 大規模なら選択肢としてアリかも（？）
独自ドメインでRailsアプリを公開するには？はじめの一歩を踏み出そう！

# はじめに
　はじめて触ったプログラミング言語はRuby。Ruby on RailsでWebアプリケーションを作ったことがある！という方は多いのではないでしょうか？実際、TECH::CAMPをはじめ、多くのプログラミングスクールでRubyやRuby on Railsが採用されていたり、入門書がたくさん出版されていたりする学びやすい言語と言えます。
　ただ、せっかく作ったRailsアプリ。自分のパソコンの中だけにとどめておくのはもったいないですよね。何も知識のない初心者からすると小難しい領域に見えて、なかなか手を出しづらいものですが、実際に挑戦し始めてみると案外簡単に公開できてしまいます。
　今回は、独自ドメインでRailsアプリを公開するにはどんな選択肢があるのか？Railsアプリを公開するはじめの一歩として、その概要をまとめてみました！

# Railsアプリを公開できるサーバーの種類
　サーバーと聞くと何を思い浮かべますか？
　企業であれば物理的なサーバールームを所有していたり、個人であればさくらサーバーやロリポップサーバーなどの共有サーバーをレンタルしたり、最近はAWSなど従量課金制の`クラウド`が主流になってきたりしていますね。
　そんな「サーバー」ですが、サーバーであればどんなものでもRailsアプリを公開できるかというと、そうではありません。私自身もつまづいてしまったのですが、中にはRailsアプリを公開できないものがあったり、たとえ公開はできても、パフォーマンスが悪いことがあります。
　以下にRailsアプリを公開する、3つの選択肢をまとめました。

## PaaS（パース）
　アプリ公開用のプラットフォームを用意してくれているので、初心者でも簡単に利用することができます。
　RailsならHeroku（https://www.heroku.com） が有名で、アクセス時間など制約はありながらも無料で使えるため、「とにかく今すぐ公開したい！！」という方にはとてもオススメです。無料であればURLの末尾に「herokuapp.com」がついてしまうのですが、有料で独自ドメインを設定することもできます。
　従量課金制という料金体系がわかりづらいのですが、こちらの記事にわかりやすくまとまっていました
→https://qiita.com/RYT/items/77b77e3b0e4f88774ef3

Rails×MySQL×Heroku公開参考URL：https://qiita.com/htakahashi/items/8d210d7f65e8b64be6a6

## VPS
　共用サーバーが一部切り出されて、仮想的に専用サーバーとして自由に使うことができます。自分が管理者権限を持つことになるので、そこにローカルのRailsアプリで使っているRubyやRailsのバージョンを入れるなどその他必要な環境を整えて、Railsアプリを公開することができるのですね。こちらはさくらVPS（https://vps.sakura.ad.jp） が有名です。
　ちなみに単なる共有サーバーであるさくらサーバー（https://www.sakura.ne.jp） だと管理者権限がないなどの要因によりRailsアプリを公開することができないor厳しいので、注意してください。

　さくらVPSは月額定額制のサービスなので従量課金制に比べるとわかりやすい料金体系ではありますが、アプリを設置しているだけであまり使われない月でもお金がかかってしまいます。無料のお試し期間があるので、試してみる場合にはぜひそちらを利用してみてください！

公開参考URL：https://qiita.com/kinokosan/items/4e4dc0e6cfbfa41b3685
公開参考動画URL：https://dotinstall.com/lessons/basic_sakura_vps/8017

## IaaS（アイアースorイアース）
　こちらはAWSのEC2というサービスが有名です。サーバーのセットアップや公開の設定など、全て自分で用意する必要があり、AWS独特のルールやネットワーク関連の設定など、うまく運用するためには幅広い知識と経験が必要です。
　ただ、本格的にサービスとしてRailsアプリを運用していくことを考えているのなら、勉強しながら使っていくことをオススメします。従量課金制でサービスのスケールアップに対応しやすく、現状多くのサービスでも使われており、これからもクラウドの発展に合わせて伸びていくことが予想されるからです。

　初年度は無料利用枠があるので、試しておいて損はありません。
　少しハードルの高い公開手段ですが、こちらの記事に素晴らしく良くまとまっているので、ぜひ参考にしながらやってみてください→https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce

# ドメインの取得
　ドメインの取得にもさまざまサービスがありますが、お名前.com（https://www.onamae.com） というサービスの名前は耳にしたことがあるかもしれませんね。
.comや.orgなど、企業や団体で公式に使われるドメインは初年度1,000円やそれ以上することもありますが、マイナーなドメインであれば最安1円で取得することもできます。自分のRailsアプリを独自ドメインで公開してみたい！というような目的であれば、1円のドメインで十分ですね。

　ドメインを取得した後は、Railsアプリのサーバーに割り当てたいドメインの設定をする必要があります。こちらはドメインを取得したサービスの名前と、Railsアプリを設置しているサーバーの名前で調べればすぐにでてくるので、とりあえず勇気を出して取得してみましょう！

# まとめ
　いかがでしたか？
　・デモアプリとしてさくっと簡単に公開したいなら難しい知識不要で公開できるPaasのHeroku
　・本格的にサービスとしての運用も考えているなら、自由度が高く、スケールアップにも柔軟に対応できるIaasのAWS
　・従量課金制やクラウドに不安を感じるなら、まずはさくらVPSから触ってみるのがオススメです。

　ぜひ、Railsアプリ公開に向けてはじめの一歩を踏み出してみてください！
HTML(CSS)+JavascriptでできることをUnity2Dで実現する

## はじめに
Webよりのフロントエンドエンジニアが初めてUnity案件に携わり、得られた知見をまとめてみました。
なお、今回制作したものはunity2Dをメインとした実装となったため、3Dへの言及はありませんのであしからず。

## この記事の対象者
- Webエンジニア
- HTMLコーダー
- Unity初心者

## 筆者技術スペック
- Unityは初心者本で操作したのみ
- Javascript & HTMLが主戦場のフロントエンドがメインのエンジニア


## ケース別対応方法
当然ですがWebフロントエンドとお作法が全く違うので、これ簡単にできるだろー、と思っていた機能の実装が容易ではありません。
細かいことを言えばいくらでもありますが、ここでは代表的なものを取り上げます。
なお、この記事では**[DOTween Pro](https://www.assetstore.unity3d.com/jp/#!/content/32416)**と[**TextMesh Pro**](https://www.assetstore.unity3d.com/jp/#!/content/84126)という2つのプラグインを使った書き方で記述しています。

### HexColorで色を指定したい
Unityでのカラー指定は通常「RGBA」値で (0, 1, 1, 1)のような記述となりますが、HexColorに慣れている場合、指定がしにくく感じます。そんな時には**ColorUtility.TryParseHtmlString**を使うと指定が楽になります。

````C#
Color ChangeHexColor (string hexColor) { // hexColorに#FFFFFFなどを指定
  Color color = default(Color);
  ColorUtility.TryParseHtmlString(hexColor, out color);
  return color;
}
````

#### 参考
[ColorUtility.TryParseHtmlString（Unity公式）](https://docs.unity3d.com/ScriptReference/ColorUtility.TryParseHtmlString.html)


### 平面オブジェクトを角丸にしたい
CSSではborder-radiusの値を調整することで対応可能ですが、Unity2DではSpriteとゲームオブジェクトを丸くすることはできないので、Sprite Editorで**9x9スライス**というものを作る必要があります。

#### 参考
["9x9 Slice" Spriteを作成する](http://unitygeek.hatenablog.com/entry/2015/03/07/182606)


### 親子関係について

#### 子から親を取得したい
````C#
gameObject.transform.parent.gameObject;
````

#### 子からルートのオブジェクトを取得したい
````C#
gameObject.transform.root
````

#### 親に子を配置したい
````C#
childObject.transform.SetParent(GameObject.Find("ParentObject").transform, false);
````

#### 参考
[オブジェクトの親子関係のまとめ - Unity](https://qiita.com/hiroyuki7/items/95c66aee26115cf24a19)


### フェードアウト、フェードインをしたい
AssetStoreで販売配布されている「DOTween」や「iTween」を使えば簡単に対応可能ですが、HTMLのように親子関係にある親に対してフェードをかけても子には反映されません。そんな時はforeachでgameObject.transformから子オブジェクトを探索して一括して操作を行います。SpriteRendererが存在していないGameObjectに処理をするのは無意味なので、if文で有無をチェックして実行させます。

````C#
foreach (Transform child in parentObject.transform){
  if(child.GetComponent<SpriteRenderer>()) {
    child.GetComponent<SpriteRenderer>().DOFade(0f, 0.8f);
  }
}
````

#### テキストに対してもフェードをかけたい（TextMesh Pro）
「DOTween」は大変便利ですが、TextMeshProへのフェードアウト・フェードインには対応していません。しかし有料の「DOTween Pro」ではTextMeshProの操作に対応しています。他のライブラリやプリミティブな実装も調べましたが、これを使った実装が最もシンプルでした。

````C#
foreach (Transform child in parentObject.transform){
  if(child.GetComponent<TextMeshPro>()) {
    child.GetComponent<TextMeshPro>().DOFade(0f, 0.8f);
  }else if(child.GetComponent<SpriteRenderer>()) {
    child.GetComponent<SpriteRenderer>().DOFade(0f, 0.8f);
  }
}
````

### テキストエリアの高さを取得したい（TextMesh Pro）
テキストエリアの高さや横幅を動的に設定・取得したい場合は、**preferredHeight**プロパティを使うことで対応可能です。
この値はテキストが入力された後に取得できます（テキスト入力前は0）
幅を取得する場合でも、同様に**preferredWidth**プロパティが用意されています。

````C#
targetObject.GetComponent<TextMeshProUGUI> ().text = "dummyText";
float fixHeight = targetObject.GetComponent<TextMeshProUGUI>().preferredHeight;
````

以下加筆中...
[fastlane] increment_build_numberを初期化

# increment_build_numberが初期化されない

`General`タブの`Build`を書き換えても、`increment_build_number`実行時に反映されない問題がある。
<img width="560" alt="スクリーンショット 2017-12-11 2.10.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/111677/905353d4-274f-ad5f-c43b-1e1a340e1efc.png">
例えば、`Build`を0にしてもfastlaneで`increment_build_number`を実行すると`Build`は3になってしまう。

# 解決策
`Build Settings`タブ　> `Versioning` > `Current Project Version`を書き換えると`increment_build_number`実行時にも反映される。
<img width="669" alt="スクリーンショット 2017-12-11 2.17.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/111677/a9c5a57f-402a-fe27-f3c1-e73c31bcf8d1.png">
ちょっとずつ読むドメイン駆動設計 第三部 第十三章 より深い洞察へ向かうリファクタリング 

１３章は第三部の落ち葉拾い的なトピックですが、ドメイン駆動設計の**「より深い洞察へ向かうリファクタリング」あるある**が詰めこられていて、これが出来ていると実感できれば、良い設計になっている基準とすることもできそう。

## リファクタリングのきっかけはさまざま

- 問題の根源がドメインモデルにあると感じる
- ドメインエキスパートと切り離されているように見える
- 新しい要求が自然には適合せず、ドメインモデルが間違っている
- 学習の結果リファクタリングが必要となる


## 探求チーム

新しいモデルを模索する方法。
開発者数人でのブレインストーミングを行う。UMLのスケッチやオブジェクトを使用してシナリオのウォークスルーも効果的。
その後、数日寝かして、自信を持って結論に至る。

この数日寝かしてというのがミソですよね。一度にやることで行き詰まることもある。寝かして新たな気付きがあることは多いですよね。

## タイミング

> 変更を完全に正当化できるまで待つのは、待ちすぎというものである。(第三部・第十三章より)

継続的なリファクタリングに関して、依然としてほとんどのプロジェクトで慎重過ぎるとEvansは言っています。実感としても、そのように感じますね。
この本が書かれたのは2003年と10年以上前ですが、現在でも変わりませんね。

プロジェクトが落ち着いてからリファクタリングしようとかいうチームは未だ多いのではないでしょうか。
コードを変更するリスクと、変更にかかる開発者の時間のコストとそれに見合ったリターンがあるかなどを考慮しているのでしょうが、ソフトウェア開発はそのようなコスト・利益を予測できるプロセスではないとEvansも言っていますし、そう思います。

### リファクタリングするタイミング
> - 設計が、ドメインに関するチームの現在の理解を表現していない
> - 重要な概念が設計で暗黙的になっている(かつそれを明示的にする方法がわかっている)
> - 設計において重要な部分を、よりしなやかにする好機がある。
> (第三部・第十三章より)

## リファクタリングしないとき
- リリース前日
- 技術的なリファクタリングしかしないとき(Evansはこれを**括弧つきの「しなやかな設計」**と呼んでいます)

例えば、[第十ニ章 デザインパターンをモデルに関係づける](https://qiita.com/YasuhiroKimesawa/items/9ebac8cbdacec13f08af)で 紹介したドメインの概念に合わせることを考えずに複雑なデザインパターンを適用するようなケース。これは、結局ソースコードが複雑になるだけですよね。

## ブレイクスルーがおきるとき

継続的なリファクタリングは少しずつ改良していくのがセオリーであり、それは変わらないのですが、リファクタリングの途中で、突然ある洞察へと導かれ、あらゆるものが刷新されるようなブレイクスルーが起きる時があります。
深いモデルとしなやかな設計につながる変更の大部分はそこから現れるといいます。

はっきりこの時だ！と説明できる例がないのですが、なんとなく経験あります。リファクタリングした結果、これってこうした方がいいんじゃない？ということが起こり、そこからあちこちモデルがはっきりしていくということが確かにあります。

そうした状況は好機に見えないとEvansが言っているのは、今のモデルがはっきりと間違っていると分かった状況だからですね。

プロジェクト進行中にこうしたブレイクスルーが起こったことが自覚できたとき（もちろん毎日起こることではないです)、今のやり方が合っているんだと思える瞬間ではないでしょうか。

明日からは最終第四部！！！(ここからが大変)
EmacsでCodicを使う

## 概要
[Codic](https://codic.jp/)というプログラマ向けの翻訳サービスを良く使っているのですが、Emacsでも使えないのかと思い調べてみたところ、作ってくださった人がいたので導入してみます。

[codic.elが MELPAからインストールできるようになりました - syohex’s diary](http://syohex.hatenablog.com/entry/20140819/1408461366)

## 手順
MELPAに登録されているため、`M-x package-install codic`、もしくはCask等でインストールできます。

codicのAPIトークンが必要なので、公式サイトから取得します。
`init.el`に以下のように書きます。

```init.el
(setq codic-api-token "取得したAPIトークン")
```

とりあえずはこれで、

- `M-x codic`で英語->日本語
- `M-x codic-translate`で日本語->英語（要API）

が出来るようになります。

ちなみに私は次のようにしています。

```init.el
(use-package codic
  :config
  (setq codic-api-token (my-lisp-load "codic-api-token"))
  (push '("*Codic Result*") popwin:special-display-config))
```

githubでinit.elを管理している場合、そのままだとAPIが晒されてしまうため以下を参考に別ファイルから読み込ませています。
[init.el にパスワードやアクセストークンを書かずに済む方法 / マスタカの ChangeLog メモ](https://masutaka.net/chalow/2016-05-06-2.html)

また、[popwin.el](https://github.com/m2ym/popwin-el)を使って`*Codic Result*`バッファをポップアップにしています。
こうすると`C-g`でバッファが消せるので楽です。

（書き方が悪いのか、実は起動後1回だけpopwinが適用されません、2回目以降は適用されます）
【Symfony4】Doctrineマイグレーションコマンドまとめ

# 前置き

* _インストールやDB接続設定はSymfony4を想定_
* _DoctrineコマンドはSymfony4でなくても使用可能_
* _Symfony2では `bin/console` ではなく `app/console`_

# Doctrineのインストール

```
$ composer require doctrine
```

# DB接続設定

```shell:.env
# この行を環境に合わせて修正する
DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name"
```

# DBの作成
以下のコマンドを使うと `.env` の接続設定で指定した `db_name` のデータベースを作成する。

```
$ php bin/console doctrine:database:create
```

# Doctrineコマンド一覧表示

```
$ php bin/console list doctrine
```

# コマンドごとのヘルプを表示

```
$ php bin/console doctrine:database:create --help
```

# Entityクラスを作成
例えば、以下のようにすると `src/Entity/Product.php` が作成される。

```
$ php bin/console make:entity Product
```

`src/Entity/Product.php` の中身はこのような感じ。

```php:src/Entity/Product.php
// 一部のみ記載
// ...

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    // add your own fields
}
```

# Entityクラスからマイグレーションファイルを作成

`src/Entity/Product.php` にプロパティを追加、それをベースにマイグレーションファイルを作成する。

まずは例として、 `$name` プロパティを追加する。

```php:src/Entity/Product.php
// 一部のみ記載
// ...

class Product
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=100)
     */
    private $name;
}
```

プロパティを追加したら以下のコマンドでマイグレーションファイルを作成する。

```
$ php bin/console doctrine:migrations:diff
```

コマンドが成功すると `src/Migrations/` にマイグレーションファイルが作成される。

# マイグレーションを実行する

```
$ php bin/console doctrine:migrations:migrate
```

これで `product` テーブルがDBに作成される。

また、Entityクラスにプロパティを追加するたびに、`diff` を叩いてマイグレーションファイルを作成し、 `migrate` でマイグレーションを実行すれば、プロパティに対応したカラムを追加することができる。

なお、マイグレーション実行後は、DBに `migration_versions` テーブルが作成される。

# マイグレーション前の状態に戻す

```
$ php bin/console doctrine:migrations:execute 20171210142949 --down
```

バージョンは、後述する `doctrine:migrations:status` でも確認可能。

# マイグレーションの状態を確認する

```
$ php bin/console doctrine:migrations:status
```

適用済み・未適用のマイグレーションなどが確認できる。
マイグレーションがおかしくなったときの確認にも役立つ。

# 空のマイグレーションファイルを作成する

```
$ php bin/console doctrine:migrations:generate
```

Entityクラスから作成せずに、空のマイグレーションファイルを作成して、適用するテーブル操作を直接書き込むこともできる。

マイグレーションファイルには `up` メソッドと `down` メソッドが用意されており、この中にテーブル操作処理を記述することになる。
`up` メソッドは `doctrine:migrations:migrate` したときに実行され、 `down` メソッドは `doctrine:migrations:execute --down` したときに実行される。

# マイグレーション実行をテストしてみる

`--dry-run` オプションを付与することで、マイグレーションを実行すると適用されるSQLを確認できる。
マイグレーション自体は行われない。

```
$ php bin/console doctrine:migrations:migrate --dry-run
```

# 実行確認されないようにする

`--no-interaction` オプションを付与すると、実行前に確認されることなくマイグレーションが始まる。
自動化する際に便利。

```
$ php bin/console doctrine:migrations:migrate --no-interaction
```

# マイグレーションの履歴を削除する

```
$ php bin/console doctrine:migrations:version 20171210142949 --delete
```

マイグレーションがおかしくなってしまった場合などに試してみると良い。

# ドキュメント

- [Symfony: Databases and the Doctrine ORM](https://symfony.com/doc/current/doctrine.html)
- [doctrine: 3. Managing Migrations](http://docs.doctrine-project.org/projects/doctrine-migrations/en/latest/reference/managing_migrations.html)
New Relic はアプリ開発チームとインフラチームの架け橋

New Relic Advent Calendar 2017 12日目。

今日は、実践的な内容ではなく、アプリエンジニアとインフラエンジニアにおけるコミュニケーションの話。

New Relic APM を組織で使うことで、アプリエンジニアとインフラエンジニアのコミュニケーションが促進され、よりよい関係を築けるようになるよという、ちょっとエモい話。

サービスを開発している組織では、(サーバーサイド)アプリ開発とインフラでチームが分かれていることがよくあると思う。特に規模が大きくなればなるほど。最近は DevOps とかの関係もあって昔ほどは両者の分断はなくなった気がするけど、チームが分かれていれば、多少は壁はある。役割が違うからね。これはしょうがない。

で、どういうときにコミュニケーションが必要かというと、例えば、本番サービスのパフォーマンスが低下してきたときに、それが、サーバーリソースの問題なのか、アプリコードのロジックや SQL の問題なのか調べてなくはいけない。大概パフォーマンス低下や監視の責務はインフラチームにある。でもインフラチームは当たり前だけど、そんなにアプリ自体の細かいコードについては詳しくない。で、パフォーマンス低下したとき、サーバーリソースには問題なさそうだと分かり、どうやらアプリの何かがおかしいのでは？とあたりを付けたとする。でも、アプリの細かいところまでは知らないので、調査はアプリチームに依頼することになるよね。で、アプリチームはほんとかなぁ。とか思いつつ調べたりする。で、最終的に、アプリには問題が見当たらず、サーバーの問題だっとわかったとする。これは気まずいよね。一回くらいならしょうがないと思うかもしれないけど、数ヶ月、数年運用してたら、それはそれなりに起こるよね。すると、段々、インフラチームも頼みづらくなるし、両者の関係も良くなくなっていく。ホントは協力して解決すべき問題なんだけどね。（そんなことはみんな分かってはいると思うけど）

こういったことが起こる原因の一つは、両者が情報を共有する場がないこと。同じ情報を見て、議論できれば、そこまでギスギスしないかもしれない。情報が一方方向で行ったり来たりするのが問題。この情報を共有できる場が、New Relic APM なんです。New Relic APM があれば、アプリの状態SQL レベルまで、ウェブ UI 上で見ることができる。アプリのどの処理にどれくらい時間がかかっているかは、インフラチームでも知ることができる。そのため、パフォーマンス低下の原因になってそうな処理はインフラチームが New Relic APM を見て、あたりをつけ、具体的にどの処理が、何秒掛かっていて、遅いから原因を調べてみて、とアプリチームに依頼できる。アプリチームも、具体的に情報がわかっているから、納得できるし、調査もスムーズにできる。で、修正した結果、パフォーマンスが改善したかも、New Relic APM を見れば知ることができる。こんな感じで、New Relic APM がアプリチームとインフラチームの情報共有の場となって円滑なコミュニケーションが行えるようになる。

さらに、SQL までわかるので、インフラチームだけでも、SQL を見て、Index がないので遅くなっているとか、SQL の組み方が悪いから遅いとかまであたりを付けることができる。

こういった感じで、コミュニケーションをしていくと、本番でのパフォーマンスにそこまで意識してなかったアプリチームも、パフォーマンスを意識せずにはいられないし、ブラウザで、New Relic にアクセスすればすぐにパフォーマンスわかるので、開発時にもパフォーマンスを意識するようになっていく。そうると、パフォーマンス品質は上がっていき、そもそもパフォーマンスに関する問題が減って行くというサイクルになる。

このように、New Relic APM を導入することで、インフラチームとアプリチームのコミュニケーションの場にもなるし、ただそこにあってパフォーマンスが可視化されているだけで、パフォーマンス向上に役立つという状況にもなり得るのだと知ってもらえたと思う。(なんでみんな New Relic APM 使おう)

## 番宣

ここでした話はどこの企業にも起き得ると思うけど、そんな話をしてくれたのが[クラウド名刺管理サービスの Sansan](https://jp.corp-sansan.com/) さんの Sansan チーム。New Relic の Sansan さんの事例紹介は [New Relic のケーススタディページ](https://newrelic.com/case-studies/sansan-jp) にあるので是非、ご覧ください。
社内ゲームジャム（12/8-12/9）の振り返り

## はじめに
   
こんにちは。CYBIRDエンジニア Advent Calendar(http://qiita.com/advent-calendar/2017/cybird)
11日目の @garyumaru です。10日目は @crystal_geyser さんの　[数多あるWebサービスをつなげて遊ぼう]( https://qiita.com/crystal_geyser/items/200d5e5a0b42c70b3f6f )　でした。

12月８日（金）から12月９日（土）の２日間にかけて、行われたサイバードゲームジャム2017Winterを振り返ります。

## イベント開催の経緯
株式会社サイバードでは、これまでもCCC(Cybird Creative Carnival)という、社内アイデアソン＆ハッカソンが行われてきたのですが、今年はまだ開催されていないということで、急遽、装いも新たに社内ゲームジャム（Cybird Game Jam）を開催することになりました。

## Cybird Game Jamとは
これまでのCCC（社内アイデアソン＆ハッカソン）と何が違うのかと言われると、CCCは「サービス」を作るイベントだったのに対して、CGJは「ゲーム」を作るイベントになったことでしょうか。

ゲームジャムとは、参加者でチームを作り、お題として出されたテーマを元に、企画から開発までの工程を約１日から２日間の短い期間で遊べるゲームとして作り上げるイベントです。

今回のサイバードゲームジャムは、２日間の中で開発に使える時間は次の通りです。
DAY1 (20:00-23:00) 3H 企画、企画発表、開発準備
DAY2 (10:00-19:00) 9H 開発

たった12時間しかない。。。

## イベント開催までの道のり
各部署から運営担当者（企画２名、デザイン２名、エンジニア２名）を確保し、ランチミーティングを実施。
どういうイベントなのかをマインドセットしつつ、当日までは、チャットワークで連絡を取り合い、できるだけ業務に支障がないように準備を進めてきました。
社内メールでの約一ヶ月前の告知（正確には一ヶ月切ってた）、開催週頭の告知（月曜日）を実施。
最終的に12名（運営担当者含む）からの参加登録があり、２チームに分かれて開発することができました。

当日、参加者の職種内訳は次の通り。
プランナー：４名
デザイン：２名
エンジニア：6名

## DAY1(12/8) 振り返り
18:30 会場準備
19:00 開場、集合
19:30 チーム分け、テーマ発表
テーマは「Jump」
20:00 企画ミーティング開始
「パー」チーム：マンダラートからキーワード抽出、メンバー全員が企画出し、良かった企画を採用
「グー」チーム：マインドマップからキーワード抽出、メンバー全員で企画出し、良かった企画を採用
22:30 各チーム企画発表
「パー」チーム：チーム名「PAR」、タイトル「KATSUAGE」
「グー」チーム：チーム名「コロぴょん」、タイトル「つんでとんでココロぴょんぴょん」
23:00 撤収、帰宅

## DAY2(12/9) 振り返り
 8:00 開場
 9:00 会場に参加者が集まり始める
10:00 開発開始
13:00 ランチタイム
お昼休みの時間などなく、コンビニ弁当などを買いに行って、開発継続
15:00 残り4時間
18:00 残り１時間
19:00
「グー」チームから10分延長の申し出あり。「パー」チームがこれを受諾して、19:10まで開発延長
19:10 開発終了
19:15 発表会（各チーム発表：15-20分）
19:55 懇親会＆試遊会（アフターパーティ）
22:30 後片付け
23:00 帰宅

## 完成した作品
「パー」チーム：チーム名「PAR」、タイトル「KATSUAGE」
採用ゲームエンジン：Unity
通りかかるキャラを路地裏に連れ込み、飛び跳ねさせて、落とすお金を奪うゲーム。１０秒間にどれだけ稼げるかを競う。

「グー」チーム：チーム名「コロぴょん」、タイトル「つんでとんでココロぴょんぴょん」
採用ゲームエンジン：Unity
籠で捕獲したキャラを積み上げて宇宙へ飛び立つゲーム。どれだけ遠くまで行けるかを競う。


## 用意しておくと便利なもの（次の運営担当への引き継ぎメモ）
チームに１つ
・ホワイトボード（必須）
・液晶モニタ（画面を共有して、確認したり）

ひとりに１つ
・スケッチブック、筆記用具（必須）
・付箋紙

そのほか
・お菓子
・予算があるなら、軽食（サンドイッチ、おにぎり）、開発している参加者は、お昼に外へ食べに行く余裕はない
・ありがたい上司の方々の差し入れ（１日目のピザ・出張のお土産、２日目のドーナツ）
・懇親会の飲食物、紙皿の確保
・大きなゴミ袋の確保、懇親会やイベント後に出る大量のゴミの捨て先確認
・１ヶ月以上前からの告知（できるだけ早くから）

## 最後に

正直、約１２時間で遊べる状態にまで完成させるのは厳しいんじゃないかなと思っていたのですが、
ほぼゲームジャム初心者で構成されたチームにも関わらず、２チームとも、ちゃんと遊べる状態まで到達して完成させることができて良かったです。

これがサイバードで働く人たちの技術力の高さや底力ということか！？

アフターパーティは、試遊会も兼ねる予定でしたが、思いの外、みんなトークが弾んで、22:30まで食って喋って終わっちゃいました。
後日、あらためて試遊会を開催したいと思いますので、社内の方は、続報をお待ちください。

何より、参加者のみなさんから「楽しかった」という声が聞けて良かった。
普段はやらないことにチャレンジしたり、自分の実力に向き合ったり、刺激を受けて成長したり、本来の能力を発揮したり、参加者それぞれに業務に活かせる何か気付きや自信を得るキッカケになってもらえたらと思います。
この経験を生かして、今日からの仕事も楽しみながら、新しいことへもどんどん挑戦を続けてね！

次回は、俺もチームメンバーとして参加したいので、誰か運営責任者をやってくださいw
   
   CYBIRD エンジニア Advent Calendar(http://qiita.com/advent-calendar/2017/cybird) 明日は、 @yurika_fukai さんの　[【恐怖】サイバードの企画職の実態]( https://qiita.com/yurika_fukai/items/ac64bd3f2f69fa3be282 )　です！楽しみですね！
SlackのShared Channels（共有チャンネル）が便利だった件

[BRIGHT VIE Advent Calendar 2017 - Qiita](https://qiita.com/advent-calendar/2017/brightvie) の10日目です！

今日は弊社のコミュニケーションツールとしてメインで利用しているSlackの機能の紹介です。

# 「Shared Channels（共有チャンネル）」とは

2017年9月12日に公開された「Shared Channels（共有チャンネル）」は、
自社のSlackのワークスペースと他社のSlackのワークスペースをつなげることが出来る機能で、現在はβ版として公開されています。
（利用するためには「課金しているユーザー同士」である必要なため、その点は注意が必要です。）

# 何が便利なの？

これまでは、他社と協力したり外部の方と情報を共有する際には、
新しいワークスペースを作成するか、プライベートチャンネルでやりとりするかを
情報共有の目的や関係性に応じて工夫して運用していましたが、
数が増えてくるとやはり運用や管理が大変とうことがありました。

そのような課題の中ワークスペースを共有チャンネルとして扱えることで同じワークスペースの1つのチャンネルを他社の方と共有して情報交換ができるため、
新しくやりとりを始める際にもワークスペースのオーナーまたは管理者以上のユーザ情報さえ共有すれば
共有チャンネルを扱えるようになるため、コミュニケーションツールのセットアップもとてもスムーズに行うことが出来ます！


- 参考
   - [ワークスペースで共有チャンネルを作成する (ベータ版) - Slack](https://get.slack.help/hc/ja/articles/115004151203-%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%A7%E5%85%B1%E6%9C%89%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-%E3%83%99%E3%83%BC%E3%82%BF%E7%89%88-)
   - [Slack の共有チャンネル (ベータ版) に参加する - Slack](https://get.slack.help/hc/ja/articles/115004151183)
   - [【速報】Slack新機能「Shared Channels（共有チャンネル）」は、企業の壁も飛び越える！ - seleck](https://seleck.cc/1079)

# ちなみに

弊社では、コミュニケーションツールにSlack、タスク管理にTrelloを活用しているのですが、
少人数で複数の案件をまわしている状況もあり、各人ごとにボードを分割して細かいタスク管理を行う方法をとっています。
（大きなタスク（いわゆるプロダクトバックログなど）は、現状はスプレッドシート上で管理しています）


このTrelloも個人ボードのひとつのリストを他の人のリストと共有出来れば、
依頼されたタスクを個人のタスクに追加した後、その作業の完了と同時に共有リストに移動してタスク状況を確認できれば、1つのボードで他人とのやりとりも管理できて便利だなぁと少し感じました。
（まぁ解決手段は色々な方法があると思いますが...;;）