OmniAICreator/Qiita-1.07M huggingface dataset:
Juliaでテキスト分析をしてみる

Juliaアドベントカレンダーの記事です。
先日のJuliaTokyoでLTした内容を記事にさせていただきました．

# やること

- 日本語のテキスト分析をJuliaでやる
- TextAnalysisというイブラリがあるので, それに日本語文書を投入して分析する
  - 分かち書きすれば日本語も使えるので，@chezouさんのMecab.jlを使う
- TextAnalysisが夢見がちなライブラリであることをみんなに伝える

# 使うパッケージ

- TextAnalysis.jl

johnmyleswhite先生のライブラリ
テキスト分析でやりたいこと大体できるようにREADMEみたら思えるけど、大体は願望

- MeCab.jl

形態素解析の日本語バインディング


# TextAnalysisのCorpusに放り込む

```jl
using TextAnalysis
using MeCab

mecab = Mecab()

lines = readlines("titles.txt")
documents = [TokenDocument(parse_surface(mecab, title)) for line in lines]
crps = Corpus(documents)
update_lexicon!(crps)
update_inverse_index!(crps)
```

# TFIDFする

```
m = DocumentTermMatrix(crps)
tfidfs = tf_idf(m)
```

- SparseMatrixで帰ってくる
- 各indexの語はDocumentTermMatrixから得ることができる
- READMEに書いてあるkmeansの例は動かないよ！

# まだ使えないメソッドたち

## LSA

<img width="482" alt="lsa_github.png" src="https://qiita-image-store.s3.amazonaws.com/0/2238/64741804-a280-7430-e700-c615b4a9e735.png">

- SVDしてるだけだから次元数減らしとかはやってくれない
- DocumentTermMatrixをtfidfするとSparseMatrixが帰ってくる．現状svdにSparseMatrixを受け取るのはないので落ちる(悲しい


## LDA(Latenr Dirclet Allocation)

<img width="543" alt="lda_github.png" src="https://qiita-image-store.s3.amazonaws.com/0/2238/cf9ec8aa-3613-60b2-f5d9-90c46499fa5c.png">


まだ未実装だよ！！！！！

[TopicModels.jl](https://github.com/slycoder/TopicModels.jl)というライブラリもある

# まとめ

- Juliaでテキスト分析はまだプレイヤーがそんなにいないので発展途上だけど実装するのはやりやすそう
- TextAnalysisみんなで貢献しましょう！（次はそれでLTしたい)
iOS 向けに libyuv をビルドする


libyuv をビルドするのに分かりにくかったのでメモ。

# セットアップ

libyuv のビルドに chromium のツール(depot tool)が必要です。

depot tool を clone してきてパスを通します。

```
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=`pwd`/depot_tools:"$PATH"
```

参考：
https://www.chromium.org/developers/how-tos/install-depot-tools

# libyuv ソースコードのダウンロード

下記コマンドを実行します。

```
gclient config https://chromium.googlesource.com/libyuv/libyuv
```

すると .gclient というファイルができているので.gclient の末尾に target_os=['ios'] を追加。

```
solutions = [
  { "name"        : "libyuv",
    "url"         : "https://chromium.googlesource.com/libyuv/libyuv",
    "deps_file"   : "DEPS",
    "managed"     : True,
    "custom_deps" : {
    },
    "safesync_url": "",
  },
]
cache_dir = None
target_os=['ios']
```

その後下記コマンドを実行するとダウンロードできます。

```
GYP_DEFINES="OS=ios" gclient sync
```

# ビルド
libyuv ディレクトリに入って下記コマンドを実行、テストを走らせます。
＃だいたい fat バイナリを使うことが多いと思うので↓を実行。
＃ armv7 用だけが必要、などの場合はページ下部の参考リンクを参照

```
GYP_DEFINES="OS=ios target_arch=armv7 target_subarch=both" GYP_CROSSCOMPILE=1 GYP_GENERATOR_FLAGS="output_dir=out_ios" ./gyp_libyuv
ninja -j7 -C out_ios/Release-iphoneos libyuv_unittest
```

これで libyuv.a ができます。あとは iOS のプロジェクトに D&D して、ヘッダファイルを追加すると API を呼べるようになります。

参考：
https://code.google.com/p/libyuv/wiki/GettingStarted
ROMAの今年1年を振り返る

最終日何を書いたらいいか迷ったので、この1年のROMAを振り返りたいと思います
# ROMA年表
## December(2014)
### Ruby World Conference
![ruby_world_conf_speakers.jpg](https://qiita-image-store.s3.amazonaws.com/0/103558/aded4cd0-9a69-dd89-568e-7b6701e0d655.jpeg)

- ROMAチームの開発手法や、新しく開発したGUIツールであるGladiatorに関して発表させていただきました

## January
### Groonga Storageに対応

![groonga_logo.png](https://qiita-image-store.s3.amazonaws.com/0/103558/05de539f-0e71-d552-6631-826c2c524aa1.png)

- クリアコードの須藤さんからプルリクエストを頂き、バックエンドに今までのTokyoCabinetやmemoryモードに加えてカラムストア機能付き全文検索エンジンであるgroongaを選択できるようになりました

## April
### <font color="red">ROMA version 1.1.0をリリース</font>
### <font color="red">Gladiator version 1.1.0をリリースしました</font>
![gladiator_connglaph_3.png](https://qiita-image-store.s3.amazonaws.com/0/103558/cfd47397-bbf2-516b-1725-ffcfabd34e2f.png)

- http://roma-kvs.org/gladiator.html
- Gladiator紹介SlideShare
  - http://www.slideshare.net/rakutentech/gladiator-introduction-slideshare-2
  - (Most Viewed slide of Rakuten, Inc. account)

### ROMAのDockerをリリース
![63102bca-140a-25bb-0f49-c1971bd50b0d.png](https://qiita-image-store.s3.amazonaws.com/0/103558/72b74c9a-7a1a-881e-db14-818c501308c8.png)

- http://roma-kvs.org/blogs/blog-entry-7.html

## June
### RedDotRuby Conference
![reddotruby_attendees.jpg](https://qiita-image-store.s3.amazonaws.com/0/103558/6cca5cdc-f369-e451-44db-56590a225b0b.jpeg)

- シンガポールで行われたRedDotRuby2015にLTとして参加させていただきました

## August
### <font color="red">ROMA version 1.2.0をリリース</font>

## September
### Try ROMAをリリース
![vc_top1.png](https://qiita-image-store.s3.amazonaws.com/0/103558/a1ed7074-bacb-6749-f22c-d9774da8c2b5.png)

- http://roma-kvs.org/tryroma

### Ruby Conf Taiwan
![taiwan_top.jpg](https://qiita-image-store.s3.amazonaws.com/0/103558/cf844fd0-d9df-5f1c-c0b1-64cb574c9498.jpeg)

- 台北で開催されたRuby Conf Taiwan2015にLTとして参加させていただきました

## October
### <font color="red">Gladiator version 1.2.0をリリースしました</font>

## November
### <font color="red">ROMA version v1.3.0(RC1)をリリース</font>


# これから
ROMAはリリース以降、楽天内で20以上のサービスで利用されてきました。
最近では社外も含めてcommiterも少しずつ増えてきて大変ありがたいかぎりです。

Rubyコミュニティでよく見る言葉として「多様性は善」という言葉がありますが、ROMAも同じように色々な方からの意見やプルリクエストをこれからもお待ちしております。
![IMG_8206.JPG](https://qiita-image-store.s3.amazonaws.com/0/103558/ae72e728-a1b6-cf73-a0fc-bd4581dda3d6.jpeg)
Tableauでデータ加工をしてみよう

# はじめに
http://qiita.com/advent-calendar/2015/dots_girls
の17日目投稿です！大遅刻すみません…

本題です。

Tableauは本来はダッシュボードを作成したりデータを分析するツールなのですが、
それ以外にもジョインやピボットなどのデータ加工が簡単に行えます。
本記事ではTableauで行えるいくつかのデータ加工機能をご紹介します。
（http://www.tableau.com/ja-jp）


#使用するデータ
総務省のデータカタログ DATA GO JAPANで配布されている「インターネット利用人口の推移」のデータを使用します。
http://www.data.go.jp/data/dataset/soumu_20140909_0695

※データ選定は適当です。すみません。



続きます…
SSH接続でgit pushしたときに警告が出るやつへの対処法


## <i class="fa fa-leaf"></i> 経緯
少し前にbitbucketのIPアドレスが変わった影響で（？）、SSH接続するときに次の警告が出るようになった。

>Warning: Permanently added the RSA host key for IP address '104.192.143.1' to the list of known hosts.

`git push` とか `git fetch` とかできなくなる訳ではないので困る話ではないんだけど、警告出てるのは気分が良くないのでその対処。

## <i class="fa fa-check"></i> 対処法
次のコマンドを実行する。

```bash
ssh-keygen -R 104.192.143.1
```

IPアドレスの部分は適宜状況に応じて変えてください。
これで~/.ssh/known_hostsの更新が行われて警告が出なくなる。


<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
vagrantなvirtual boxからprivateなgithubリポジトリをcloneしようとしてpermission denied

sshキーがアレしてるのはわかるけどvagrantで完結して解決したい。。。。

```
Fetching git@github.com:giftee/ruby-openid.git
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
```

こうするらしい

```name:Vagrantfile
  # 仮想環境がhostの秘密キーを使えるようになる
  config.ssh.forward_agent = true
```
セオリー通りの方法でErlang（とElixir）をインストール（追記：Elixirのアップデート）

Erlang/Elixir 環境を用意した時の個人用の手順メモです。

ディストリビューション付属の Erlang はかなり古いので、tarball からビルドして最新版をつっこんでいます。Erlang は特殊なライブラリを使ってないので、普通のディストリビューションなら同じ手順でインストールできるかと思います。手元では CentOS 6.4, 6.7 と Ubuntu 11.04 で確認できています。

# 前提ファイルを準備
もし入ってなかったら yum や aptitude などで下記をインストールしておきます。

- gcc
- gcc-c++
- glibc-devel
- make
- ncurses-devel
- openssl-devel
- autoconf


# Erlang をインストール



Erlang のソース管理は [kerl](https://github.com/yrashk/kerl) を使うのが定石らしいので、curl でもらってきます。

```
$ cd tmp
$ curl -O https://raw.githubusercontent.com/spawngrid/kerl/master/kerl
$ chmod +x kerl

$ ./kerl list releases
R10B-0 R10B-10 R10B-1a R10B-2 R10B-3 R10B-4 R10B-5 R10B-6 R10B-7 R10B-8 R10B-9 R11B-0 R11B-1 R11B-2 R11B-3 R11B-4 R11B-5 R12B-0 R12B-1 R12B-2 R12B-3 R12B-4 R12B-5 R13A R13B01 R13B02-1 R13B02 R13B03 R13B04 R13B R14A R14B01 R14B02 R14B03 R14B04 R14B R14B_erts-5.8.1.1 R15B01 R15B02 R15B02_with_MSVCR100_installer_fix R15B03-1 R15B03 R15B R16A_RELEASE_CANDIDATE R16B01 R16B02 R16B03-1 R16B03 R16B 17.0-rc1 17.0-rc2 17.0 17.1 17.3 17.4 17.5 18.0 18.1 18.2 18.2.1
Run "./kerl update releases" to update this list from erlang.org
```

最新版（18.2.1)を入れることにします。

```bash
$ ./kerl build 18.2.1 build18.2.1

$ sudo mkdir -p /usr/local/erl/18.2.1
$ sudo ./kerl install build18.2.1 /usr/local/erl/18.2.1

$ . /usr/local/erl/18.2.1/activate
```

## 動作確認
```
$ erl
1> crypto:start().
ok
```

.bashrc に下記行を追加して、ログイン時に activate されるようにして、Erlang の準備は完了です。

```bash:~/.bashrc
source /usr/local/erl/18.2.1/activate
```

# Elixir をインストール
```
$ cd ~/tmp
$ git clone https://github.com/elixir-lang/elixir.git
$ cd elixir
```

バージョン(tag)を確認

```bash
$ git tag
　・
　・
　・
v1.1.0
v1.1.0-rc.0
v1.1.1
v1.2.0-rc.0
```

```bash
$ git checkout -b v1.1.1 refs/tags/v1.1.1
$ make clean test
```

Elixir の実行アカウント（ここでは someuser）の権限でファイル一式を移動します。

```bash
$ sudo mv elixir /usr/local/
$ sudo chown -R someuser /usr/local/elixir
```

~/.bashrc で elixir/bin にパスを通して終了

```~/.bashrc
PATH="/usr/local/elixir/bin:${PATH}"
```

## 追記：Elixir をアップデート
単にタグ切り替えするだけだと古いバージョンを使い続けてしまうため、make し直す必要があります。例えば 1.1.1 から 1.2 にアップデートする場合、下記でいけました。

```bash
$ git co -b v1.2.0 refs/tags/v1.2.0
$ make clean test
```


# 参考
- [ErlangとElixirの最新バージョンをソースコードビルド](http://qiita.com/massn-san/items/7c7a02f09abf43d68275)
- [CentOS6 に Erlang / Elixir のインストール](http://qiita.com/sonots/items/335a1cff003d70feff96)
すごく見えるGitHub垢の作り方

この記事は[ ❤️ち→む⭐️びずり→みん❤️ Advent Calendar 2015 ](http://qiita.com/advent-calendar/2015/team_bizreamin)の 25日目の記事です。

みなさん、クリスマス、そして年末をいかがお過ごしでしょうか。

今日は「すごく見えるGitHub垢の作り方」として、GitHubのプロフィールページにある「Contributions calendar」について説明していきたいと思います。

こちらです。
<img width="745" alt="スクリーンショット 2015-12-24 20.53.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/45771/13ff87d2-b1a9-a0e5-d66a-e0f7bc70d673.png">

「すごく見える」というのは、だいたいすごいエンジニアというのはこのグラフがぐわーと緑に染まっていて、すごいエンジニアのこのグラフが緑に染まっているということは、ここが緑に染まっていればすごいエンジニアに見えるということです。

っということで説明していきますが、だいたいは[こちら](https://help.github.com/articles/why-are-my-contributions-not-showing-up-on-my-profile/)の記事の翻訳みたいな形になると思います。

# カレンダーの見方について

- 1つ1つのセルが1日
- 左から古い順
- 1番上が日曜、1番下が土曜
- 左上が古く（1年前）、右下が新しい（今日）のコントリビューション
- セルの色は、その日にコントリビュートした数（灰色が0で多くなるとだんだんと濃くなる）

# 下部の3つの数字について
- Contributions in the last year
 - 1年間で何回コントリビュートを行ったか
- Longest streak
 - 何日連続でコントリビュートを行ったか（下に表示されている日付がその期間）
- Currect streak
 - 今日まで何日連続でコントリビュートしているか

# どうすればコントリビュートとしてカウントされるか
- Issueを投げる、PRを投げる
 - forkでなく、独立したリポジトリであること。
- Commitする
 - commitの際に使用したemailアドレスがGitHubアカウントに登録したものと同じであること。
 - forkでなく、独立したリポジトリであること。
 - デフォルトブランチ（だいたいは `master`）か `gh-pages` ブランチへのコミットであること

# 注意点
 - プライベートなリポジトリに対するコントリビュートはそのリポジトリにアクセスする権限がある人だけしか見られない。

# まとめ
  思ったより短くてアレって感じになっていますが、「芝が生えない！」ってなったときに確認するところをまとめると、

 - localでcommitしたemailアドレスをGitHubにも登録しておくこと
 - デフォルトブランチか `gh-pages` ブランチへのコミットであること
 - forkでなく、独立したリポジトリであること

みたいなところだと思います。それではみなさんよいお年を！
Emacsから Cの関数をつかう -> はやい

C言語で書いた関数を Emacsから呼び出したら速いかどうか検証してみた.

この機能は Emacs 25で搭載される予定の Dynamic module機能を使って実現しています. Dynamic module機能については以下の記事を参考にしてみてください

- [Emacsに mrubyを組み込んでみた](http://qiita.com/syohex/items/fa71f1c61107b5e30c43)
- [ejectで学ぶ Dynamic module機能](http://syohex.hatenablog.com/entry/2015/12/16/185458)

## リポジトリ

https://github.com/syohex/emacs-fib


## 比較対象

フィボナッチ数の計算を以下のそれぞれで実装しました. C言語版 GCC 5.2.1でコンパイルし, 最適化オプションは `-O2`です. Emacs Lisp版は Emacs 25.0.50.1でバイトコンパイルしたものを利用しました.

- Emacs Lisp再帰版
- Emacs Lispループ版
- C再帰版
- Cループ版

```lisp
(defun fib-elisp (n)
  (if (<= n 1)
      n
    (+ (fib-elisp (1- n)) (fib-elisp (- n 2)))))
```

```lisp
(defun fib-elisp-loop (n)
  (cl-loop for a = 0 then b
           and b = 1 then (+ a b)
           repeat n
           finally return a))
```

```c
static intmax_t
fib(intmax_t n)
{
	if (n <= 1)
		return n;

	return fib(n - 1) + fib(n - 2);
}
```

```c
static intmax_t
fib_loop(intmax_t n)
{
	int a = 0, b = 1;
	for (int i = 0; i < n; ++i) {
		int tmp = a;
		a = b;
		b = tmp + b;
	}

	return a;
}
```

## ベンチマーク

### 環境

- Ubuntu 15.10 x86_64 64bit
- CPU: Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
- Memory: 8GB
- Emacs: 25.0.50.1(2015年 12月 25日ビルド)
- GCC version 5.2.1 20151010 (Ubuntu 5.2.1-22ubuntu2) 最適化オプション `-O2`のみ


### ベンチマークコード

以下のベンチマーク関数を `n = 30`, `count=100`で実行しました. 表示されるものは 100回実行したときの実行時間になります.

```lisp
(defun fib-bench (n count)
  (interactive
   (list (read-number "Fibonacci number: ")
         (read-number "Benchmark count: ")))
  (benchmark count `(fib-elisp ,n))
  (benchmark count `(fib-elisp-loop ,n))
  (benchmark count `(fib-c ,n))
  (benchmark count `(fib-c-loop ,n)))

(fib-bench 30 100)
```

## 結果

|                  |実行時間(秒)  | 比率(EmacsLisp再帰版との)|
|:-----------------|---------|:-----------------------|
| Emacs Lisp再帰   |58.033767| 1                       |
| Emacs Lispループ |0.001959| 29624                   |
| C再帰            |0.338148| 172                     |
| Cループ          |0.000044| 1318949                 |

題材が悪いというのもあるけど, Emacs Lispもアルゴリズムを適切に選べばそこまで遅くないという印象. 再帰版は論外レベルで遅いが.... Cでちゃんと書けば最も速そうだが, そこまで Cで書くのにこだわる必要もないように思えます. まだいろいろ試せてなさすぎなので, もっといろいろ見ていく必要はありますが...


## その他

https://github.com/syohex/emacs-parson

[parson](https://github.com/kgabis/parson)という JSONパーサのバインディングを書いて見ました. これと標準パッケージの json.elとベンチマークを行ってみたのですが, 短い入力だと decodeはともかく encodeは遅いという結果が得られました. 大きめの入力だと両方とも Cが速いという結果が得られたのですが, 見極めにはもう少し時間がかかりそうです.

## おわりに

本当は golangで使った shared libraryでいろいろ試すということを検討していたのですが, golangのランタイムで Segmentation faultが出る問題が解決できなかったのでこのような簡易な内容になってしまったことをお詫び申し上げます.

また [mrubyネタ](http://qiita.com/syohex/items/fa71f1c61107b5e30c43)の拡張を行おうかとも思っていたのですが, 現状の私の mrubyの知識が乏しすぎて実現することができませんでした. これはお正月に勉強してなんとかしようと思いますが, こちらについても合わせてお詫び申し上げます.
petalinux / microzed > D. 作ったアプリを起動時に自動実行する方法

[このページ](http://www.xilinx.com/support/answers/55998.htm)の「PetaLinux 2013.10 (and later)」を参照した。
ランレベル5で起動する例。


[1] <project-root>/components/apps/<APP>/に起動scriptファイル(mystartupとする)を作る

```
起動script : mystartupの例
nohup /bin/myapp &
# この例ではnohupを使ってバックグラウンドで動かすようにしている
```
[2] <project-root>/components/apps/<APP>/のMakefileを以下のように変更する

```.c
all: build install
 
build: $(APP)
 
clean:
 
.PHONY: install image
 
install: $(APP)
 $(TARGETINST) -d -p 0755 mystartup /etc/init.d/mystartup
 $(TARGETINST) -s /etc/init.d/mystartup /etc/rc5.d/S99mystartup
```

[3] [項目C](http://qiita.com/7of9/items/025446735fec16f6a56a)の手順3を参照して、アプリをビルドする。
[4] BOOT.binを作成してimage.ubと一緒にmicroSDに入れて、MicroZedをmicroSDで起動するとアプリが動き出す。
zynq > zybo > Adept USB deviceドライバのインストール

自分の過去のメモより


Windows8.1の環境にZYBOをUSBケーブルで接続したが、AdeptのUSB deviceは認識しなかった。
以下の手順で認識するようになった。

1. [http://www.ftdichip.com/Products/ICs/FT2232H.htm](http://www.ftdichip.com/Products/ICs/FT2232H.htm) にて「D2XX Drivers」をクリック
2. Windowsの項目にある「setup executable」をクリック
3. 取得したファイル (CDM v2.12.00....exe)を実行する
 
上記によりが追加される。
USB Serial Converter A
USB Serial Converter B

このうち、Converter Bの方のプロパティ > 詳細設定 にて 「VCPをロードする」にチェックをつけることで、UART入出力をPCのterminalでできるようになる。
2015-12-25 zynq / zybo > ZyboにてPetalinuxでEthernetを使うまでの手順

自分の過去のメモより

1. [Hardnet](http://www.hardent.com/electronic-FPGA-design-consulting-services/petalinux-zybo-bsp-now-available-to-download/) から ZyboのBSPを取得
2. BSPをもとにPetalinuxのプロジェクトを作成
3. petalinux-config -c kernel を実行し、[Device Drivers]-[Network Device Support]-[PHY Device Support] にて 「Drivers for Realtek PHYs」のチェックをつける
4. 下の「system-conf.dtsiの変更」のように&gem0の部分を変更する
5. petalinux-buildする
6. 下の「Boot.binの作成」のようにしてBoot.binとimage.ubを作成する
7. Boot.binとimage.ubをmicroSDにコピーしてmicroSD起動する
Ethernetを接続したまま起動するとIPを自動取得してくれる

(上記3を実行しなくてもEthernetを認識した。 他のドライバで動いているのだろうか?)

system-conf.dtsiの変更

```.c
/*
&gem0 {
    local-mac-address = [00 0a 35 00 29 39];
};
*/
&gem0 {
    #address-cells = <1>;
    phy-handle = <&phy0>;
    phy-mode = "rgmii-id";
    reg = <0xe000b000 0x1000>;
    xlnx,eth-mode = <0x1>;
    xlnx,has-mdio = <0x1>;
    xlnx,ptp-enet-clock = <108333336>;
    mdio {
        #address-cells = <1>;
        #size-cells = <0>;
        phy0: phy@1 {
            compatible = "realtek,RTL8211E";
            device_type = "ethernet-phy";
            reg = <1>;
        } ;
    } ;
};
```

### Boot.binの作成

```bash
$petalinux-package --boot --force --fsbl images/linux/zynq_fsbl.elf --uboot --fpga pre-built/linux/implementation/download.bit
```
zynq / petalinux > Ethernet PHYの設定場所

自分の過去のメモより

[How to change ethernet PHY PetaLinux 2014.2?](http://forums.xilinx.com/t5/Embedded-Linux/How-to-change-ethernet-PHY-Petalinux-2014-2/td-p/501536)

```bash
$ petalinux-config -c kernel
```
を実行して、
.[Device Drivers]-[Network Device Support]-[PHY Device Support] を選択すると表示される。

[hardnet.com > PetaLinux ZYBO BSP Now Available To Download](http://www.hardent.com/electronic-FPGA-design-consulting-services/petalinux-zybo-bsp-now-available-to-download/) – 2014.4 Board Support Package / lab files
から作成したプロジェクトで上記を確認したところ、「Drivers for Realtek PHYs」のチェックが外れている。
ZYBOが到着してからEthernetが認識できない場合は、このチェックをつけてみるのがいいだろう。
Githubで複数アカウントを使うときの設定


何度も調べててだるいので自分へのショートカット


``` ~/.ssh/config
Host github.com
	User git
	HostName github.com
	IdentityFile ~/.ssh/id_rsa
	IdentitiesOnly yes

Host account2.github.com
	User git
	HostName github.com
	IdentityFile ~/.ssh/secondary_id_rsa
	IdentitiesOnly yes
```

secondary_id_rsaを設定したアカウントで接続したい時はこう書く

``` path/to/project/.git/config
[remote "origin"]
	url = git@account2.github.com:user/repository.git
```
考察 > Add() | Clear() > コーディングは早い | リーディングは?

## コーディング

STLなどの関数はきちんと考えられているというのを何かの本(Effective C++? / 101 rules?)で読んだ。
コンテナなどでは異なるコンテナに対して同じ関数で実装できるという設計らしい。

確かに１つのコンテナで覚えた場合(例: Add()やClear()）、他のコンテナでも実装が早い。
学習コストも低くなる。

自分でクラスを設計する場合、Add()のような一般的な名前の関数にするのがいいのか、AddXXX()のようなユニークな名前の関数にするのがいいのか迷っている。

## ソースリーディング

```
xxxList->Add();
```

上記のようなsnippetがある場合、それをどうやって検索するのか? 
xxxListというキーワードは半年後には忘れているので、それを検索キーワードにはできない。

```
xxxList->AddDataPlotToGraph()
```

上記のような場合、AddDataPlotToGraph()はヘッダファイルを読めばわかる。検索でも探しやすい。


## 検索の流れ
### AddDataPlotToGraph()の場合
1. グラフへデータプロットしている処理の見直し開始
2. 関連処理はGraphXXXでやっているというめぼしをつける
2. GraphXXX.h の中に AddDataPlotToGraph()があるのを見つける
3. AddDataPlotToGraph()で検索
4. 関連処理が見つかる。

### Add()の場合
1. グラフへデータプロットしている処理の見直し開始
2. 関連処理はGraphXXXでやっているというめぼしをつける
2. GraphXXX.h の中に Add()があるのを見つける
3. Add()で検索
4. 関係ない処理含めて膨大な検索結果が見つかる。

## どちらがいいか

まだ悩んでいる。

ユニークな関数名の場合、コーディング時にその関数名を記憶してないといけないかというと、最近のIntelliSenseや類似の入力補完機能を使えば解決する。
一方で、IDEを使わず大半がエディタで実装している場合は状況が変わるが、僕がよく使うSublimeTextの場合は１つでも関数が書かれていたら入力補完が効く。

ただし、ユニークな関数名は名前を考えるのに時間を取られるのと、ちょっとユニークな名前の場合、ソース数が４０とかになってくるとそれらに同じ名前の関数がやはりできて、全然ユニークではなくなる。

フォルダ分けなど、別の仕組みを使うのも検討した方がいいのかもしれない。
git で 「warning: CRLF will be replaced by LF in X」が直るかも知れない方法


あくまで"直るかも"というざっくりとした記事なので過度な期待はしないでください。

時々起こるgitの改行コード問題ですが、いろいろな方法で修正する方法がありますが、よくあるのが修正してコミットし直すという方法があります。

ですが、そのファイルがフレームワークのコアファイルだったり、外部のプラグインだったりした場合、修正するわけにもいきません。

なので、"直るかも"知れない方法を書いておきます。

## 犯人は.gitattributesの"* text=auto"かもしれない
この問題に当たったときよく以下のようなコードがある場合があります。

```.gitattributes
* text=auto
```

それでは、一度この行をコメントアウトして保存します。
もちろん.gitattributesの差分は表示されると思いますが、原因になっていたファイルの差分は消えていると思います。

その編集した.gitattributesをcheckoutして元に戻します。
そうすると.gitattributesのファイルは元に戻り、問題になっていたファイルの差分はなくなっていると思います。

ちなみに、フォントやsvgなどのファイルで起こる場合は、こちらを参考にしてください。
[`git add .` でfatal: CRLF would be replaced by LF in /fonts/FontAwesome.otf. がでる問題](http://qiita.com/suzutan/items/f7acb7cb136da2fda41f)
Ruby関連で脆弱性の情報の収集に用いているサイト・MLのまとめ

結構ダブりが多いと思われるので、無理に全部購読する必要はないでしょう。
お好みに合わせて選べばよいかと。

- [ruby-advisory-db](https://github.com/rubysec/ruby-advisory-db)
    - gemやRubyの処理系の脆弱性情報を集めるGitHubのリポジトリです。watchしましょう。
- [Ruby公式サイトの「最近のニュース」](https://www.ruby-lang.org/ja/news/)
    - 日本語で分かりやすいし、詳しい。更新できない場合に自前でパッチを当てる方法も教えてくれたりします。
    - もちろん脆弱性以外の情報も流れますが、まぁそんなに頻繁に更新するわけではないのでよいのではないかと。
- [Ruby on Rails: Security - Google グループ](https://groups.google.com/forum/#!forum/rubyonrails-security)
- [ruby-security-ann - Google グループ](https://groups.google.com/forum/#!forum/ruby-security-ann)
    - :arrow_up: 2つは最近知ったのでまだ新しい情報はキャッチしてません。

また、[devise](https://github.com/plataformatec/devise)や[doorkeeper](https://github.com/doorkeeper-gem/doorkeeper)など、セキュリティ上重要性の高そうなgemのリポジトリをwatchするのもよいかもしれません。

# 合わせて読みたい

[Security - 購読しているセキュリティ関連メーリングリスト情報 - Qiita](http://qiita.com/harukasan/items/4f11dce5db8cd62b7126)
IIS+ARRでRailsを動かす

WindowsServer上でRailsアプリをIIS経由で実行させる。
ARR(Application Request Routing)でURL書き換えてやる。

使ったバージョン
WindowsServer 2012
IIS 8.5
ARR 3.0

-- 1,Railsを起動する。
今回は3000番で起動

- 2,ARR(Application Request Routing)をインストールする
Web PIからインストールする

- 3,書き換えルール追加
IISマネージャからURL書き換えを選択
受信規則の追加　：空の規則
要求されたURL : パターンに一致する
使用 : ワイルドカード
パターン : prefix/*
アクション : 書き換え
URLの書き換え : http://localhost:3000/{R:1}

これで、 http://ドメイン/prefix/controller/action
が http://localhost:3000/controller/action
で実行される。

assetsはIISの適当なフォルダに置いておく
プログラムでアニメーションを作る【基礎編 ランダム】


この投稿は[Quad incアドベントカレンダー](http://qiita.com/advent-calendar/2015/quad-inc)の最終日です。

### ランダムについて
ちょっとしたスケッチなどで何か動くものを作りたいと思った時、ランダムを利用することが多いと思います。
ブラウン運動と呼ばれることもあるようです。

例えばこんな感じのもの。

<iframe src="https://player.vimeo.com/video/5856346" width="500" height="375" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
<p><a href="https://vimeo.com/5856346">brownian motion</a> from <a href="https://vimeo.com/objecte">dimitris gourdoukis</a> on <a href="https://vimeo.com">Vimeo</a>.</p>

これはランダムにポジションを設定してラインを描画していますね。

ランダムにxとy座標を生成し、オブジェクトを動かすコードは大体こんな感じでしょうか

```javascript
var vx = Math.random(-1, 1); // -1 ~ 1 
var vy = Math.random(-1, 1); // -1 ~ 1

obj.x += vx;
obj.y += vy;
```

確かにこれでランダムに動きます。
しかし先ほどの動画をみると、動きはかなり固い感じがしますね。これはvx、vyの値に連続性がないのが問題です。
もっとなめらかに動くものは作れないのか？
そこでよく利用されているのが<b>noise</b>(Perlin noise)です。

### パーリンノイズとは

>パーリンノイズ（英: Perlin noise）とは、コンピュータグラフィックスのリアリティを増すために使われるテクスチャ作成技法。

[パーリンノイズのついてはこちらで](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%BC%E3%83%AA%E3%83%B3%E3%83%8E%E3%82%A4%E3%82%BA)

もともとはテクスチャの作成方法の一つでしたが、これをモーションに利用できます。

### パーリンノイズとアニメーションの関係

パーリンノイズを使うと、下記のようなテクスチャ画像が作れます。

![PerlinExample.png](https://qiita-image-store.s3.amazonaws.com/0/15535/394f7b81-4122-eea9-57b8-4549e1cb0b69.png "PerlinExample.png")

これ、よく見るとうねうねしるところと、黒いところありますね。黒以外の箇所は、白からグレーに<b>微妙に明度が変化</b>してますよね。

この微妙に変化しているが重要です。これは緩やかに変化しているのです、つまり連続性があるのです。
確信に近づいていますね。

これをアニメーションに利用するにはどうするのか？やり方はいろいろあります。

今回は上の画像を利用してみます。(これから紹介するコードは完全にダミーですのでご注意ください。)
画像の適当な1pxを選択し、そこから色情報を抜き取ります。
例えばこんな感じ(あくまでもサンプルです)

```javascript
// サンプルです。
var color = noise(100, 100, 100);
var r = (color >> 16) & 0xff;
var g = (color >> 8) & 0xff;
var b = color & 0xff;
```
ピンときた人がいるかもしれませんが、このr、g、bを下記のように置き換えたら

```javascript
// サンプルです。
var color = noise(100, 100, 100);
var vx = (color >> 16) & 0xff;
var vy = (color >> 8) & 0xff;
var vz = color & 0xff;
```
これは！！  そしれこれをこんな感じにすると

```javascript
// サンプルです。
obj.x += vx;
obj.y += vy;
obj.z += vz
```
動きを作ることができました！気がついたら3次元のランダムモーションができていました。2次元にするなら、単純にzの値を使用しなければOKです。
objが移動させた場所の1pxを取得し、同じ処理を実行します。
テクスチャマップは緩やかに色が変化しているので、モーションは有機的になります。

こんな感じ

<iframe src="https://player.vimeo.com/video/14764877" width="500" height="281" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
<p><a href="https://vimeo.com/14764877">Starlings Study 01</a> from <a href="https://vimeo.com/pedernorrby">Peder Norrby</a> on <a href="https://vimeo.com">Vimeo</a>.</p>

ノイズを使うだけで、Web上でよく見られる有機的な動きを自分で作ることができます。
実際に動くサンプルがあったほうがよいので、後日追記します。おまちください...

動くものをつくるのは楽しいですね。

Advent Calenderは今日で終わりですが、継続して投稿できるように頑張ります！
Unityの特殊フォルダ関連のリンクメモ((φ(･д･｡)

いつもググっているのでメモ

[Unity - マニュアル:  特殊なフォルダー名](http://tsubakit1.hateblo.jp/entry/20131028/1382965930)

[Unity - マニュアル: 特殊フォルダーとスクリプトコンパイル順](http://docs.unity3d.com/ja/current/Manual/ScriptCompileOrderFolders.html)

[Unityの特殊フォルダと各々の役割（追記版） - テラシュールブログ](http://tsubakit1.hateblo.jp/entry/20131028/1382965930)
MySQLのクエリーのログを取る設定。


あんまりこういうのは取りたくないもんだが。。
以下はOSXでhomebrewで入れたmysqlの場合です。

とりあえず設定ファイル開いて、

```bash
sudo vim /etc/my.cnf
```

ログの設定を追記する。

```mysql
[mysqld]
general_log = ON
general_log_file=/var/log/mysqld_query.log
```

mysqlを停止する。


```bash
sudo /usr/local/opt/mysql/bin/mysql.server stop
```

以下でもよい。

```bash
mysql.server stop
```


mysqlを起動する。

```bash
sudo /usr/local/opt/mysql/bin/mysql.server start
```

エラーが出る。

```bash
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/mymac.local.pid).
```


所有者を変える。

```bash
sudo chown mymac /usr/local/var/mysql/mymac.local.err 
```


mysqlを起動する。


```bash
sudo /usr/local/opt/mysql/bin/mysql.server start
```

ログを見る。

```bash
tail -f /var/log/mysqld_query.log
```
Apache (アパッチ) ログ 解析

##combined Log形式の確認と設定

```LogFormat
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
```

apache公式ドキュメント
https://httpd.apache.org/docs/2.2/ja/mod/mod_log_config.html


##エラーとなったアクセスを抜き出す
logファイルへ移動

```bash
$ cd /var/log/httpd/logs
```

error 404のエラーを抜き出す

```bash
$ grep "HTTP/1.1\" 404" access_log
```

出力個数を確認する時

```bash
$ grep "HTTP/1.1\" 404" access_log | wc -l
```

検索条件にマッチしないものを数える

```bash
$ grep "HTTP/1.1\" 404" access_log | grep -c -v "favicon.ico"
```

##集約して数える
#### 毎時のリクエスト数を数える

```bash
$ grep -o '[0-9]\{2\}/.../2015:[0-9]\{2\}' access_log | uniq -c
```

grep option [o]はマッチ部を取り出す。
つまりあるキーワードを含む「行」ではなく「マッチ部分」を取り出す。
uniq ソート済みのファイルから重複した行を削除


##ProcessSubstitutionを使用してみる。
###ProcessSubstitutionとは
簡単に言うと、コマンドの実行結果をファイルとして扱うことができる。

ProcessSubstitutionを使わない例

```bash
$ sort file1 > file1.sorted
$ sort file2 > file2.sorted
$ diff file1.sorted file2.sorted
```

ProcessSubstitutionを用いると

```bash
$ diff <(sort file1) <(sort file2)
```
上記のように「<(コマンド)」という記法で、コマンドの実行結果をファイルとして他のコマンドに渡すことができる。

###実用例
ProcessSubstitutionを使用すると、2つのクライアントのリクエストの差分が取得できる。

```bash
$ diff -u <(grep "00.00.0.0" access_log | grep -o "\(GET\|POST\) [^ ]*" | sort | uniq) <(grep "127.0.0.1" access_log | grep -o "\(GET\|POST\) [^ ]*" | sort | uniq)
```
YosemiteでADBを改善する方法

# 概要
去年の年末か今年の夏頃までYosemite上でのadb installのクソ遅さには悩まされたのですが、色々対応策を試してみて下記の方法が【神】だったので、記しておきます。

参考リンク
http://stackoverflow.com/questions/28314131/adb-transfers-file-with-a-very-slow-speed

リンク先が消えたりすると困るので、こちらにも同じ方法を記述します。

## 引用

ターミナルを立ち上げて、/etc/sysctl.confに下記のシェルを記述します。
その後、再起動してください。

```
kern.ipc.somaxconn=2048
net.inet.tcp.rfc1323=1
net.inet.tcp.win_scale_factor=4
net.inet.tcp.sendspace=1042560
net.inet.tcp.recvspace=1042560
net.inet.tcp.mssdflt=1448
net.inet.tcp.v6mssdflt=1412
net.inet.tcp.msl=15000
net.inet.tcp.always_keepalive=0
net.inet.tcp.delayed_ack=3
net.inet.tcp.slowstart_flightsize=20
net.inet.tcp.local_slowstart_flightsize=9
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
net.inet.icmp.icmplim=50
```
jQuery チェックしたチェックボックスの背景の色を変更する

```js:checkbox.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="robots" content="noindex">
<title>jQuery 1.6 チェックしたチェックボックスの背景の色を変更する</title>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">google.load("jquery", "1.6");</script>
<script language="JavaScript" type="text/javascript">
<!--
$(window).load(function(){
    var bgcolor = 'red';
	$(":checked").closest('td').css('background', bgcolor);
	$("input[type='checkbox']").change(function(){
	    if($(this).is(":checked")){
          $(this).closest('td').css('background', bgcolor);
	    }else{
          $(this).closest('td').css('background', '');
	    }
	});
});
//-->
</script>
</head>
<body>
<table border=1>
    <tr>
        <td>
            <input type="checkbox" name="checkbox1">a
        </td>
        <td>
            <input type="checkbox" name="checkbox2" checked>b
        </td>
    </tr>
       <tr>
        <td>
            <input type="checkbox" name="checkbox3">c
        </td>
        <td>
            <input type="checkbox" name="checkbox4">d
        </td>
    </tr>
</table>
</body>
</html>
```

# 注意すべきこと
jQueryのバージョンによっては、動かなくなる場合あり

# 参考にしたページ
http://www.finefinefine.jp/jquery/kiji1420
http://kachibito.net/snippets/change-check-box-bg-color
http://www.detelu.com/blog/sample/jQuery/checkbox/index.html
http://jsfiddle.net/uJcB7/
http://tech.ironhearts.com/blog/archives/148
http://nob-log.info/2012/08/17/jquery-closest/
プログラミング言語と自然言語

これは [【その2】ドリコム Advent Calendar 2015](http://www.adventar.org/calendars/1044) 25日目（最終日）の記事です。
24日目の記事は tiger さんの [Firewall を貫くツールを自作してみた](http://cctiger36.github.io/blog/2015/12/23/self-made-socks-tunnel/)です。
[【その1】ドリコム Advent Calendar 2015](http://www.adventar.org/calendars/1043) もあわせてどうぞ。

#自己紹介 

こんにちは、バードです。顔がアングリーバードに似ているのでバードです。

中国の遼寧省から来ました。三国志で言うと公孫瓚の領土です。袁紹の領土にもなりました。

![talk_with_ko_yuan_new.jpg](https://qiita-image-store.s3.amazonaws.com/0/38404/b97c4b54-247c-a9e3-9016-c02fa6cc4786.jpeg)


ドリコムに新卒として入社しました。今年4年目です。普段の仕事はサーバーサイドのエンジニアです。趣味はダイビング、言語学習、旅行などです。彼女はいません。好きなタイプは蒼井そらです。餃子はそんなに食べません。

そして、今日はサーバーの話はしまへん。
言語の話をしまっせ。

#いま興味を持って取り組んでいること

ワシは言語学習という周りから理解されない趣味を持っています。

今まで、世界各国の言語とパソコンの言語を勉強する機会が多かったので、最近私はこう思うのです。*「人間の言語とパソコンの言語の違いは一体なんなんだろう？」*

#まず言語の目的なんなんだろ

>人間の言語はNatural Language（自然言語）と呼ばれます。
パソコンの言語はProgramming Language（プログラミング言語）と呼ばれます。

自然言語もプログラミング言語も基本的な目的は一緒です。それは、コミュニケーションです。自然言語は人間と人間のコミュニケーション、プログラミング言語は人間とパソコンのコミュニケーションです。

#同類の言語を学習しやすい

プログラミング言語は見た目はわかりにくいかも知れませんが、似てるところが非常に多いのです。一つのプログラミング言語を上手く学習できれば、他のプログラミング言語を上手に使えるようになります。最初の1つ目、二つ目の言語は結構苦しく勉強しましたが、三つ目から勉強の苦しみがなくなります。4つ目からは楽勝やねん。

自然言語にも同じことがあります。英語が分かれば、ラテン系言語は結構簡単に学習出来ます。例えばフランス語とスペイン語です。しかし、非ラテン系言語、例えヒンディー語や日本語はそうはいきまへん。全く違うのです。

私が最初に学んだ言語はCです。次は、C++,C#,MATALAB,Rubyです。全部手続き型プログラミング言語です。異なる箇所だけを勉強するだけで、言語の学ぶことができるのは気持ちよろしゅうおます。
でも、関数型言語のLISP/Schemeはヒンディー語や日本語みたいに難しいです。

#文法も一緒？

文法は、プログラミング言語に、expressionとsyntaxは大事です。例えばif, then, else, while, for, foreach, break, continue, blocks, yieldsなどを把握できれば、複雑なアイデアでもパソコンに通じます。プログラミング言語をうまく自分のアイデアをプログラムにフローコントロールで表現できることです。

自然言語のフローコントロールは日常に我々はよく使ってる名詞、動詞、数量詞、形容詞など。自然言語を上手く表現できるのは、うまく自分のアイデアを色々な単語で表現できることです。

でもね、プログラミング言語の中にも、変わらないことがあるアルヨ。それはアルゴリズムです。各プログラミング言語によって見た目は違うかも知れませんが、メインのアルゴリズムは一緒です。
一方、自然言語も、言語にとらわれず、アイデアは同じです。

![same_idea_talk.jpg](https://qiita-image-store.s3.amazonaws.com/0/38404/7db2490c-21cc-b4be-6da8-1d8d21f9a98a.jpeg)

文字全然違うけど、意味は一緒です。

#エンジニアとしてのメリットあるんじゃ！！

そして私は次のように考えるようになりました。
自然言語を勉強した経験は新たなプログラミング言語を勉強することに役立てるのでは？


*そう考えましたが実は違いました。*
今のプログラミング言語はほとんどアメリカで生まれたから、文法は英語の文法っぽい感じました。つまり、プログラミング言語はラテン系の言語になりました。

![human_pc_talk.jpg](https://qiita-image-store.s3.amazonaws.com/0/38404/bb5d4c0a-f4e2-f5ca-9c97-eb863bc9d0b2.jpeg)

英語が分かれば、プログラミング言語を勉強しやすくなりますが、残念ながら中国語か日本語のみを覚えてもプログラミング言語には全く役に立たないじゃないか！
**WHY JAPANESE PEOPLE!!**

![jason.png](https://qiita-image-store.s3.amazonaws.com/0/38404/6ca05e0b-9b44-9413-9e94-afc3aed5b1db.png)
(c) http://www.nissin-ufo.jp/recipe/


#まとめ

プログラミング言語と自然言語は皆様が思ってるよりは近いです。将来、自然言語とプログラミング言語が統一されるかもしれませんね。人間とパソコンの会話は自然にできるかもしれませんね。日本語と中国語がなくなるかもしれませんね。
でも、目の前は、安心してください。日本語と中国語まだいけます。

#おかず
最後、この度に、この場を借りて、一つのソングを送ります。
>Single boy,single boy, 
single all the way . 
Online game, mobile game, 
we go all the way ,hey! 

以上
2016年 関西フロントエンドUGのお知らせ

関西フロントエンドUGアドベントカレンダー最後の記事です。

2016年の関西フロントエンドUGの動きについてざっくりとお知らせしていきます。

## 1月の勉強会の予定

1月の勉強会はサイボウズさんの大阪新オフィスをお借りして、UI周りの勉強会を実施します。
http://kfug.connpass.com/event/24182/

参加枠はもういっぱいですが、発表者枠にまだ若干の余裕がありますので、
何か発表してみたい!!という方は是非お気軽にお申し込みください。


もくもく会、もしゃもしゃ会は合同で月末に開催です。

http://kfug.connpass.com/event/24183/

各自テーマを持ち寄って、もくもく課題をこなしたり、相談質問したりする会です。
関西フロントエンドUGってどんなところだろう…という初めての方でも参加しやすいイベントとなっていますので是非お気軽にご参加ください!!

## 2月以降の勉強会

2月以降の勉強会の日程はまだ未定ですが、とりあえず月３回ペースのイベント運営は継続していく予定です。

もくもく会とデザインワーク寄りのもしゃもしゃ会、あと月一何かテーマを決めての勉強会の３本構成で、勉強会はデザイン寄り、エンジニア寄りを交互に実施していく予定です。

勉強会のネタとか運営スタッフ(特に勉強会幹事さん)を募集しておりますので、興味があると言う方は是非お気軽にお声掛け下さい。

## frontend conference 2016

いろいろありましたが、マジでヤります!!

2016年 03月 05日 大阪梅田の新梅田研修センターにて。

フロントエンドをテーマにしたカンファレンスイベントとしては関西最大級の規模となります。

これまで関西フロントエンドUGの勉強会等でもテーマとして取り扱ってきたJSフレームワークの話や、UI・UX、デザインワークなどのテーマを中心に、
デザイナもエンジニアも楽しめるセッション構成を企画中です。

何より注目なのは、ハンズオンブース!!
gulpや黒い画面、gitなどフロントエンドの界隈でよく耳にするけどなかなか踏み出せない…といった苦手意識持たれがちな技術を中心に
各種ハンズオン企画を計画し、終日ブースとして開放する予定です。

エンジニアもデザイナも、初心者もベテランも、Webに生きる全ての人が楽しめるイベントを目指して絶賛企画中です!!
更新情報等は下記Facebookページなどで更新していきますので是非「いいね」を押してチェックよろしくお願いします。

現在若干名ですが、スタッフとスピーカを引き続き募集中です。ご興味のあるかたはFacebookページ等からお声掛けお願いします!!
優先参加チケット付きのスポンサーチケットも募集開始しました!! 会場費等で何かと費用のかさむイベントですのでご協力のほどよろしくお願いいたします!!

ティザーサイト
http://frontconf2016.webflow.io/

Facebookページ
https://www.facebook.com/frontconf2016/ 

個人/法人スポンサー募集中(優先参加チケット付き)
http://the-frontend-conference-2016.peatix.com

## One more thing

2015年をなんか凄い勢いで駆け抜けてきた関西フロントエンドUGですが、
2016年も負けないくらいの勢いで頑張っていきたいと思います。

体力的にもネタ的にもそのうち限界が来そうなので、一部のイベントでも運営代行してくださる方が出てきてくれると非常に助かります。

そんな2016年の関西フロントエンドUGを支える、新しいロゴができました!!

![スクリーンショット 2015-12-25 10.46.01.png](https://qiita-image-store.s3.amazonaws.com/0/27973/48642338-bac8-08a7-338d-bd4197019fce.png)

2016年からの動きに向けて、新しいロゴとか作れないかなぁ…とか悩んでいた所、
UI系の勉強会などでお世話になっている[山下さん](http://ykazu.com/about/)がご厚意で作ってくださいました!!

3月の frontend conference ではステッカーも配布すると思いますので、
是非是非皆様ご参加のほどよろしくお願いいたします!!



まぁ2015年色々とありましたが、2016年も関西フロントエンドUGをよろしくお願いします。
(参加ブログ等の投稿もよろしくお願いします。)
シェルスクリプトで桁数を揃えた連番を作成


フォルダを作成して、その中に何か入れるとかする場合、普通に1〜20とかを指定すると
1,10,2,20,3,4〜
というように並んじゃったり、見た目があまりよろしくない場合があります。

seqを使ったfor文だとそうなっちゃいますよね。

~~~
for FIGURE in `seq 1 10`
do
	echo "${FIGURE}"
done
~~~

そこで、１桁でも、01〜09と、0を付けて桁を揃えるようにします。
方法は、seqに-fオプションを付けて、指定をちょっと変えるだけ

~~~
seq -f  %[桁数]g [最初の数] [最後の数]
~~~

例えば、2桁で1から10までの数字を生成する時は、こう。

~~~
seq -f %02g 1 10
~~~

こんな感じで書きます。

~~~
#!/bin/bash

# 普通seqを使ったfor文
echo "seq 1 10を使った普通のfor文"
for FIGURE in `seq 1 10`
do
	echo "${FIGURE}"
done


# seq -fで2桁数字を作って、forで回していく
echo "seq -fで2桁数字を作って、forで回していく"
for _3FIGURE in `seq -f %02g 1 10`

do
	echo "${_3FIGURE}"
done
~~~

これを実行すると、こうなる

~~~
seq 1 10を使った普通のfor文
1
2
3
4
5
6
7
8
9
10
seq -fで2桁数字を作って、forで回していく
01
02
03
04
05
06
07
08
09
10
~~~

このシーズン、来年に向けて1月から12月まで、2桁でそろったフォルダとかを作る時に便利。
スターウォーズ公開記念、bottleで作るスターウォーズ風TLアプリ

思いつくままに手を動かしたのでスクリプトの中身は汚いし、.tplファイル１つだしで工夫も何もない。TLをストリーミングで取得したり、検索機能をつけたり色々遊べるのでどうぞ。

```index.py

#!/user/bin/env python
# -*- coding: utf-8 -*-
from bottle import route, run, template, request, static_file, url, get, post, response, error
from requests_oauthlib import OAuth1Session
import json
import requests
import time, calendar
import datetime
from datetime import timedelta
from datetime import datetime
import pytz
today = datetime.now(pytz.timezone('Asia/Tokyo'))
import sys, codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)

@route("/")
def title():

	C_KEY = "＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊"
	C_SECRET = "＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊"
	A_KEY = "＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊"
	A_SECRET = "＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊"

	search_words = u"クリスマス"

	url = "https://api.twitter.com/1.1/search/tweets.json?"
	params = {
				"q": (search_words, "utf-8"),
				"lang": "ja",
				"result_type": "recent",
				"count": "100"
				}
	tw = OAuth1Session(C_KEY,C_SECRET,A_KEY,A_SECRET)
	req = tw.get(url, params = params)
	tweets = json.loads(req.text)
	for tweet in tweets["statuses"]:
		Created_at = YmdHMS(tweet["created_at"])
		User = (tweet["user"]["screen_name"].encode("utf-8"))
		Name = (tweet["user"]["name"].encode("utf-8"))
		Text = (tweet["text"].encode("utf-8"))
		U_img = (tweet["user"]["profile_image_url"])

	return template("main", Created_at=Created_at, User=User, Name=Name, Text=Text)


def YmdHMS(created_at):
    time_utc = time.strptime(created_at, '%a %b %d %H:%M:%S +0000 %Y')
    unix_time = calendar.timegm(time_utc)
    time_local = time.localtime(unix_time)
    return int(time.strftime("%Y%m%d%H%M%S", time_local))


run(host='localhost', port=8000, debug=True, reloader=True)
```

```main.tpl

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">

<title>StarTwit</title>
</head>

<body>



  <style>
  body{
      background: #000;
  }
  #titles{
      position: absolute;
      width: 18em;
      height: 50em;
      bottom: 0;
      left: 50%;
      margin-left: -9em;
      font-size: 350%;
      font-weight: bold;
      text-align: justify;
      overflow: hidden;
      color: #fff;
      transform-origin: 50% 100%;
      transform: perspective(300px) rotateX(25deg);
  }
  #titles:after{
      position: absolute;
      content: ' ';
      left: 0;
      right: 0;
      top: 0;
      bottom: 60%;
      background-image: linear-gradient(top, rgba(0,0,0,1) 0%, transparent 100%);
      pointer-events: none;
  }
  #titlecontent{
      position: absolute;
      top: 100%;
      color: #fff;
      animation: scroll 100s linear 4s infinite;
  }
  @keyframes scroll {
      0% { top: 100%; }
      100% { top: -170%; }
  }
  </style>
  <div id="titles"><div id="titlecontent">
    <ul>
      <li>{{Created_at}}</li>
      <li>{{User}}:{{Name}}</li>
      <li>{{Text}}</li>
    </ul>

  </div></div>
  </body>
  </html>
```

![img.jpg](https://qiita-image-store.s3.amazonaws.com/0/71585/60ecfa83-ff15-d3c2-8740-685400fcf5a2.jpeg)


こんな感じに実装されます。プライバシーに配慮しました。
Pythonでのget,post通信メモ

Pythonでの通信方法のメモ代わりにまとめます

# get通信

サンプルコードはこんな感じ

```py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib

#送信先URL
url = "http://test.test"
#getパラメータ
param = [
    ( "id", 0),
    ( "param", "dammy"),
]

url += "?{0}".format( urllib.urlencode( param ) )

#API実行
result = None
try :
    result = urllib.urlopen( url ).read()
except ValueError :
    print "アクセスに失敗しました。"
```

見ればわかるかと思うけども、
urlに送信するurlを
paramにgetパラメータを設定しています。

`urllib.urlencode( param )`

でurlのパラメータの形に変換しており結果

`http://test.test?id=0&param=dammy`

こんな感じに変換されます。


# post通信

初めはrequestsを使用する予定だったのですが、
うまく動作しなかったので、urllib、urllib2を使用することにしました。

サンプルコード

```py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib
import urllib2

url = "http://test.test"
params = {"id":0, "param" : "dammy" }
params = urllib.urlencode(params)

req = urllib2.Request(url)
# ヘッダ設定
req.add_header('test', 'application/x-www-form-urlencoded')
# パラメータ設定
req.add_data(params)


res = urllib2.urlopen(req)
r = res.read()
print r

```


パラメータを
`urllib.urlencode( param )`
で変換させるところは変わらないですね。
`req.add_header('test', 'application/x-www-form-urlencoded')`
`req.add_data(params)`
でヘッダーとパラメータを設定しています。

~~ちなみにrequestsで行うとすると以下の様になるようです。
自分の環境ではCakePHPのwebサーバーに送ったのですが、
post通信になりませんでした。~~

mursts様のご指摘で正常にpost通信ができる様になりました。
ありがとうございます！

post通信をさせる場合は

`r =  s.post(url, params=params)`

部分でdetaに渡さなくてはなりません。
なので上記の部分を以下の通りに修正しました

`r =  s.post(url, data=params)`

重ね重ねになりますが、ご指摘ありがとうございました！


ちなみにparamsの場合はget通信になる様です。

```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests

url = "http://test.test"
s = requests.session()
params = {"id":0, "param" : "dammy" }
r =  s.post(url, data=params)
print r.text.encode("utf-8");

```

こちらの方が簡単に実装できるので、使えるならこっちの方が
よかったですね。
あ、requestsはインストールする必要があるので使う場合は以下のコマンドで
インストールしてください。
`pip install requests`


以上です。
【サラリーマン10年史】文系学部生が営業を経て、業務アプリ→SAP→webとエンジニアをやってるよって話

気がついたら社会人になって10年経っていて、最近採用関連の仕事でやたらとタイトルのような話をすることが多くなってきたので、まとめといたらカンペとしても使えるんじゃないかと思ったりしたのでまとめてみようという試み。

あと、こんなんでも職業エンジニアになれるよっていう、誰かのモデルケースにでもなったら嬉しいかな〜というのも。

※クソ長くなってしまったのでお気をつけて

# 大学時代

経済学部で、民俗学のゼミに入って、博物館行ったり、海苔作りしたりしてました。
プログラムとか興味なく、PCはレポート提出に使う程度。あと就職活動。


# 新卒時代〜求人広告営業〜

ドラマとかで「外回り行ってきます！」というシーンが結構あってそれに憧れて営業になる。あと、大学で就活イベント的なのによく出張ってくる人材コンサルみたいな職業いいなってなってて、求人広告にしようという安直さ。

この時点でプログラムとか相変わらず興味なし。

1年ぐらい経過したときに、売っても売ってもお客さんからは「反響ない！」って怒られ続け、上司からは「ワンランク上のなら反響ありますよって売ってこい！」って怒られ続けるのが辛くなって退職。

原稿をPCで書いてるのが結構楽しかったのと、父親がSIerでエンジニアしてたので、試しに買ってみた「やさしいJava」を1週間ぐらい読んで試して、「なんかこれならやれそうじゃね？」ってなって、未経験OKなエンジニア職の募集を探して応募。

晴れてエンジニアに転職！
当時同僚は元パチプロとか落語とかボクサーとか、割とカオスな職歴の方々が多かった気がする、、、

# 業務アプリエンジニア時代

入社した会社は独立系のソフトウェアハウスで、平たく言うと大手SIerにSESでエンジニア出してお金を稼ぐビジネスモデルの会社だった。

1ヶ月の研修を経て、Javaの新規案件にアサインされる。
あとから聞いた話だと、Java経験1ヶ月強（＝プログラミング歴）にして、Javaのプロフェッショナルとして売られたらしい。

結局5年ほどその会社でお世話になり退職。
その間で使ってた言語は、JavaとVB5〜6、VB.NET、javascriptあたり。

退職理由はだいたい以下の感じ。

```
1. 金融系がメインの取引先だったので、とかくセキュリティに厳しく、10年ぐらい前の技術しか扱えない。もっと新しい技術を使えばユーザーにストレスなく使ってもらえるのに。
2. UIとかUXは1円にもならないのでwebでも大体VBライクなUI。
3. 途中からほぼプログラム書くことなく、ひたすらexcelとwordな日々に不安を覚える。
4. 5年で月収ベースで1万円ちょいしか増えない給料。
```

で、割と10年目ぐらいでもプログラム平気で書いてると噂のweb業界に行ってみようと思い至り、web業界へ転職。


# webの会社からSESでSAPヘ

webへ来ても相変わらずSES生活は変わらず、なんとなくソシャゲってトラフィックとかDB負荷とかすごそう！と思ってたのと、小学生ぐらいの頃にゲーム会社で働く夢を持っていたのを思い出したので、SAPに行ってみることに。

それまで基本的にWEBサーバー*1、APサーバー兼DBサーバー*1、コールドスタンバイのDBサーバー*1みたいな構成がほぼだったので、いきなりWEBもDBも二桁台数とかの構成に圧倒される。

ひたすらいろんな人の仕事を勝手に巻き取って、徹夜してるうちに、チーム移動になって、サブリーダーになり、気がついたらリードエンジニアになる。

家に帰れなかったり、夜中に叩き起こされたりを繰り返しているうちに家庭環境に不安を覚えていたところに、自社でプロジェクトがいくつか立ち上がるという話になったので、SAP業界を去る決意をする。

一応その間に仕事で使用した言語を洗い出してみたら、

php, perl, python, java, objective-c, c++, lua, javascript

結構ちゃんぽんしてた。

後にも先にも、これほどユーザビリティについて考えてた時期はなかった気がします。


# 〜現在（WEBエンジニア）

スケジュール管理したり、仕様決めたり、ソースレビューしたりしながらプログラム書いてます。
一人で大体のフェーズに絡めるので、WEB屋が性に合ってるなと思う今日この頃。

---
長くなりましたが、そんなこんなでエンジニアとしてだけでも、もう10年目。
35歳が目の前に迫ってきた感ありますが、定年はしなくてよさそうです、今の所。
[備忘録] Laravel Composerとかartisanコマンドが動かないときの対処法

laravelで開発をしていて、何らかの理由でcomposerやartisanコマンドが、動かなくなってしまうことがたまにあります。なので、動くようになった時の対処法をまとめてみます。

#composer dump-autoload
artisan db:seedとかして「class not ....」って言われたら試してみる。 

ちなみにcomposer dumpautoloadでも動く謎エイリアス。


#bootstrap/cache/compiled.php を削除
composer updateが動かないときに試したら動くようになった。

削除しても、正常にコマンドが実行された後、artisan optimizeを実行すればまた作成されます。

#実行ユーザとかパーミッションを確認してみる
これで、後輩がはまってた。phpの問題という訳ではないが、初心者あるある。

#最終手段
プロジェクトをgit管理してるなら、削除してcloneし直す。
後は、composerを再インストールしたりしてみる。

動かない原因を突き詰めるべきだとは思うが、どうしても急ぎの時の最終手段。
ろご

redshift
![rs.png](https://qiita-image-store.s3.amazonaws.com/0/16327/979a2364-fe47-f28a-db1f-aa317d5a8100.png)
ruby
![r.png](https://qiita-image-store.s3.amazonaws.com/0/16327/d270b8f2-96f0-5f4d-d722-bcc1cebea212.png)
hadoop
![hd.png](https://qiita-image-store.s3.amazonaws.com/0/16327/31b74465-c740-f352-7789-fe261d1176c6.png)
perl6
![p6.png](https://qiita-image-store.s3.amazonaws.com/0/16327/5c6ce57e-f194-59c5-852b-dea5f05277d5.png)
react.js
![react.png](https://qiita-image-store.s3.amazonaws.com/0/16327/82f84057-1d40-36df-1468-863da55b13b2.png)
freeコマンドの結果を見やすくする

freeコマンドはしょっちゅう使うけれど、個人的に視認性がいまいちだと思っていたので、perlのワンライナーで見やすく表示できるようにしてみました。
ちなみに、ワンライナーにこだわったのは、IMEに登録してどのマシンでも即実行できるようにしたかったからです。

# 環境
CentOS5, CentOS6
※CentOS6.7以上の freeは -h オプションが使えるので適宜書き換えてください。

# 実行結果
```
$ free -m|perl -a0pe'@a=map{$_>1024?sprintf"%.1fG",$_/1024:$_.M}@F[7,15,16];$_="@a\n"'
2.0G 151M 1.8G
```
左から、total, buffers/cacheのused, buffers/cacheのfreeです。

# 謝辞
[terateil](https://teratail.com/questions/23156) にて素晴らしい回答を下さったcrhg さん、arguis さんに感謝いたします。
TypeProviderによるプリキュア型の生成

## はじめに

この記事は、[第2のドワンゴ Advent Calendar 2015](http://qiita.com/advent-calendar/2015/dwango2)最終日の記事です。

私が今年の4月にドワンゴへ中途入社して8ヵ月が経過したらしいです。
仕事とプライベートでやっていることが相変わらずバラバラですが、これはこれで面白いのでいいんじゃないでしょうか。

さて、今回は F# ネタです。
いつもさんざんやってますけど、まードワンゴ社員の中で数少ない（要出典）Microsoft MVPなので、たまには 社員の方々も見そうな場所で F# をアピールしたいんですよ……。

## 今回のお題

この世にはプリキュアという有名なアニメが存在します[^oops]。
詳細は皆さんのほうが詳しいと思うので割愛します。

このプリキュアというアニメの特徴として、一部のユーザがライブラリを開発していることが挙げられます。
有名どころはたぶん下記の3つでしょう。

* Acme::PrettyCure
* [pycure](https://github.com/drillbits/pycure)
* [rubicure](https://github.com/sue445/rubicure) 

さて、これらの存在を知っていた当初から感じていたことが1つ。
なぜこのプリキュアライブラリは動的型付き言語ばかりなのだろう、と。

というわけで作りましょう、F# で。

## TypeProvider

F# には TypeProvider という機能があります。
TypeProviderがどういったものかというと、簡単に書くと

* コンパイル時にコード生成に頼らずに型を生成する仕組み

です。
基本戦略としては何かしらのデータなどを用いて型を構築することが多いみたいですね。

今回、幸いなことに先人の方々が[RubicureApi](https://rubicure.herokuapp.com/)というAPIを提供して下っているので、このデータをもとに型を生成していきます。

## 成果物、使い方

成果物は下記リポジトリにあります。

https://github.com/pocketberserker/FCure

使い方は以下の通り。

```fsharp
open Precure.TypeProviders

// プリキュアのデータが置かれている場所を指定する
type プリキュア = Precure<...>

// シリーズから
let go = プリキュア.``Go!プリンセスプリキュア``

// キャラをとってきて
let towa = go.紅城トワ

// 変身！
let scarlet = towa.``プリキュア！プリンセスエンゲージ！``
```

時間が足りなかったのでオブジェクトを生成しまくっていますが気にしないでください……。

## 型はどうなっているの？

今回はプロパティごとに別の型を生成しています。
つまり、"Go!プリンセスプリキュア"というプロパティで取得できるオブジェクトの型は`Go!プリンセスプリキュア`型です。`キュアスカーレット`も型です。

<img width="371" alt="p1.png" src="https://qiita-image-store.s3.amazonaws.com/0/63039/c86303e5-3dc2-6a65-5fb6-93ec23c48791.png">

変身用のプロパティ（メソッドにするつもりだけど時間がなかったのであきらめた）もシリーズごとに異なります。

<img width="573" alt="p2.png" src="https://qiita-image-store.s3.amazonaws.com/0/63039/ebc3e550-cee7-747c-e938-a4c5aca05f18.png">

あと、地味に型ごとのドキュメントとかもつけてます。

というわけで、型が無事生成できたことが確認できたかと思います。

## 今後の展望

* HListと組み合わせることでシリーズごとの人数をだしたり
* 誕生日の設定があるキャラには誕生日プロパティをはやしたり
* やよいにだけぴかりんじゃんけんを実装したり
* nugetで公開したり

などがあります。
やるかどうかはわかりませんが……。

## まとめ

* コンパイル時に型を生成しましょう
* 次の目標は型レベルプログラミングかな？
* 担当日二日前に実装始めたけど間に合ってよかった

[^oops]: 私はほとんど見ていませんが……
CustomViewをStoryboard、xib、コード上で使用する方法

Objective-cでxibを使って作成したカスタムViewを
Storyboard、xib、コード上から使えるようにする方法

```objc:カスタムView.m

// OverRide(xibやStoryboardから呼び出された時に呼ばれる)
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self commonInit];
    }
    return self;
}

// OverRide(コードから生成時に呼ばれる)
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self commonInit];
    }
    return self;
}

/**
 *  共通初期化
 */
- (void)commonInit
{
    UIView *view = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil] objectAtIndex:0];
    view.frame = self.bounds;
    view.translatesAutoresizingMaskIntoConstraints = YES;
    view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
    [self addSubview:view];
}
```

これでStoryboard、xib、コードのどれから呼び出してもカスタムViewが使用できます。
サンプルを作成しているのでよかったら見てください。

GitHub - [SampleCustomViewProject](https://github.com/ShinTanaka/SampleCustomViewProject)
開発環境 - Xcode7.2
neovimでクリップボード（ubuntu）

neovimの噂を聞きつけ、インストールして、neobundleを拾ってきて、vimrcを`~/.config/nvim/init.vim`にコピーして少し修正して、いざneovim生活というところで・・・

クリップボードツールがないといわれた。
`clipboard: No clipboard tool available. See :help nvim-clipboardd`
という警告がでる。

ヘルプ従いクリップボードツールを入れれば解決。
`sudo apt-get install xsel`
無事に警告はなくなりました。

neovimの情報、もっとでてこないかなー
PhoenixのControllerのパラメータについて


Phoenixを勉強しはじめているのですが、ちょっと疑問に思ってたことに対する答えが見つかったので

```
// hello_controller.ex
def world(conn, %{"name" => name}) do
	render conn, "world.html", name: name
end
```

パラメータを`%{"name" => name}`のようの文字列のキーを使うのが一般的なようなのですが、
他の処理ではAtomとか使っているのだけど、ここだけなんでなんだろう？


Programming Phoenixの中のコラムAtom keys vs. string keys?では以下のように書いてあります。
> In the world action in our controllers, the external parameters have string keys, "name" => name, while internally we use name: name. That’s a convention followed throughout Phoenix. External data is unsafe, so we explicitly match on the string keys, and then our application boundaries like controllers and channels will convert them into atoms keys which we will rely on everywhere else inside Phoenix.

英語苦手なので正しく読めてるかわかりませんが、こう理解しました。
Phoenixの内部処理ではAtomを使うが、外部とのやり取りではStringのパラメータの使っているのはデータの安全性を考慮してのこと。

### 文字列のかわりにAtomを使うとなぜ安全じゃないのか？

ちょうど、stackoverflowに質問している人がいました。
http://stackoverflow.com/questions/34446221/atom-keys-vs-string-keys-in-phoenix

Atomの上限が関係しているんですね。
1048576が上限のようで、そういえばE本で読んだことがあったような気がします。
Hubot は従業員の夢を見るか？


本エントリは、[ChatOps Advent Calendar](http://qiita.com/advent-calendar/2015/chatops) の 25日目の記事です。昨日の記事は、@TasukuNakanoさんで「[Rubotyが殺されるところを見届けた話をします](http://task-blog.net/2015/12/24/ray-killed-by-dark/)」でした。

メリークリスマス！今年も残すところあと少しになりました。私はこの一年 bot に関わる仕事をしてきました。これまで取り組んできたことの反省と、これから取り組んでいきたいことについてまとめたいと思います。

# hubot への期待と現実

私の所属する L is B では、ビジネス向けメッセンジャー [direct](https://direct4b.com/ja/) を提供しています。チャットを通して業務の効率化を目指しています。この目標にとって hubot は魅力的かつ現実的なツールだったので、お客さまからの要望を反映しつつ hubot をベースにした SDK を提供してきました。

これまで、日報作成、案件管理、議事録代行、スケジュール管理、TODO管理、勤怠管理といったいろいろな業務用ボットを作成してきました。最近は [blog](http://blog.lisb.direct/) で[RaspberryPiでの動作](http://blog.lisb.direct/entry/2015/12/21/100000)なども紹介しています。

最初の評価は高いものがあります。しかし、なかなか継続利用されません。ちょうど @kotatsu360 さんが「[ChatOpsのバッドノウハウ](http://qiita.com/kotatsu360/items/4fd049de3a9137981e6a)」を公開されていますが、まさにそんな感じで非常に共感できます。

それでも負けずに挑戦してきた、いくつかの取り組みを紹介したいと思います。

# 仮説1： 業務に沿った bot が作りにくい？

最初に考えていたのは、継続利用されないのは、ユーザの期待するような bot がないからで、誰でも bot を作りやすくすれば、もっと利用されるのではないか、というものでした。

![スクリーンショット 2015-12-25 9.03.53.png](https://qiita-image-store.s3.amazonaws.com/0/21189/7ff5280b-8fbe-a339-b047-cef65f4dac28.png)

オンラインで簡単に bot を作ることができるプロトタイプを作ったりもしました。でも、ちょっと考えればわかることですが、bot の内部がどのように作られているかなんて、bot を利用する人にとっては関係ないことです。むしろ、現場に合った細かい調整が効かないと使い勝手はよくなりません。

# 仮説2： チャットのコマンドは覚えるのが大変？

次に考えたのは、コマンドの入力が大変だから bot に何と話しかければいいかわからなくなって、めんどくさくなって話しかけなくなり、継続利用されないというものです。

![スクリーンショット 2015-12-25 9.16.28.png](https://qiita-image-store.s3.amazonaws.com/0/21189/94770262-52f9-1b71-21cc-daa46e563921.png)

そこで、hubot 内蔵の httpd を利用して、hubot の操作をチャット経由だけではなく、Webアプリからできるようにしたこともありました。しかし、これも「前より便利になったね」との声は頂きましたが、継続利用という点に関してはなかなか改善されません。

# 仮説3： 業務が自動化されていない？

そもそも hubot は、何ができるのでしょうか。何でもできるフレームワークですが、その範囲は hubot が動作するサーバや、そこからつながるインターネットの「世界」に限定されます。実際の業務は、もしかしたらまだオンラインではなかったり、オンラインだとしても接続できる環境ではないのかもしれません。

### 限定された「世界」でジョブを実行する人工知能

一般的な会話をする bot として、[ELIZA](https://ja.wikipedia.org/wiki/ELIZA) が有名です。Twitter の bot のような人工無能と呼ばれる会話プログラムの基礎といえます。

その一方で、特定のことしか知らず・できないけれども、指示を受けつけて実際の行動に移せるタイプの bot があります。1971年に発表された[SHRDLU](https://ja.wikipedia.org/wiki/SHRDLU) はその代表で、積み木の世界に閉じていますが、指示を受けとって積み木を操作できました。hubot の起源ともいえるでしょう。

> Person: PICK UP A BIG RED BLOCK.
> Computer: OK. (does it)

![shrdlu-original.gif](https://qiita-image-store.s3.amazonaws.com/0/21189/9db39d5b-803c-b87b-2cac-3a0d10c87999.gif)

### hubot を業務利用するためには

下の図は [DEIS](http://docs.deis.io/en/latest/) と呼ばれる、オープンソースの PaaS プロジェクトからの引用です。上の図と似てないでしょうか？

<img width="350" alt="deis-graphic.png" src="https://qiita-image-store.s3.amazonaws.com/0/21189/15d56114-966b-473c-2353-adc3eb3107f6.png">

docker が登場し、ソフトウェアはコンテナ化されて、サービスは積み木を組み立てるように構成することができるようになってきました。そんな DevOps が普及してきたからこそ、hubot はチャットを通して業務代行ができて、非常に賢い bot として振る舞うことができると考えるようになってきました。つまり、業務フローが自動化できた後こそ、hubot が活躍できるということです。この仮説が正しいのかはまだ検討中で、来年にかけて取り組んでいきたいと思います。

# さいごに

来年は、ビッグデータや Deep Learning といった技術を基盤にしたサービスがさらに普及して、業務プロセスの自動化が進むんじゃないかと考えています。LisB では、データサイエンティスト、ロボティクスなどに興味を持つ[メンバーを募集しています](https://www.wantedly.com/projects/33511)！