OmniAICreator/Qiita-1.07M huggingface dataset:
JINS MEMEのデータをsocket.ioで出力 with RxSwift

# What's JINS MEME
一言でいうと、外ではなく内を見ることのできるメガネです。詳細については以前まとめたものがありますので、そちらをご参考ください。
http://qiita.com/mito_log/items/020a87996ed2b9d793e6

# Background
前々回は[POSTで出力](http://qiita.com/mito_log/items/09df58a6deb926bb58ea)。前回は[tcpソケット通信で出力](http://qiita.com/mito_log/items/86cfc55741bc141cddf6)。ときて、ここまできたらsocket.ioでも出力してしまおうということで、今回はsocket.ioでJINS MEMEのデータを出力してやります。これで大抵の外部連携はできるのではないでしょうか。外堀埋めまくりです。

# What to cover
今回は2部構成の1部目の記事、という体裁にしています。各部の内容は以下：

1. **ローカルに立ち上げたsocket.ioサーバを介してデータをリアルタイムにmac PCに出力する** (← 本記事)
2. mac側では受け取ったデータを使って、PCを離れると自動的に画面ロックがかかる

## Network Diagram
![networkDiagram.png](https://qiita-image-store.s3.amazonaws.com/0/46489/466b5361-ba1b-a64a-172a-70a5552fb7a3.png)

# Screenshots
mac app
![](https://i.gyazo.com/cba0d7138d1b6c7cb0627a370be547d0.gif)

ios
![autolockscreen_ios.png](https://qiita-image-store.s3.amazonaws.com/0/46489/de4bfff1-20f0-e30e-9bd2-da2372561694.png)

# Github
https://github.com/mitolog/JINSMEMESampler
今回のサンプル部分は[こちら](https://github.com/mitolog/JINSMEMESampler/tree/master/JINSMEMESampler/AutoLockScreen(socketio))

# How to use

1. app.jsのあるフォルダで 必要に応じて `npm install socket.io`
2. ios app, mac appを両方立ち上げてホストを指定してつなげる

※ 注意点

 - 毎秒約20サンプルデータがはいってくるので、できるだけネット環境のいい場所がいいです
 - disconnectボタンを押しても実際にサーバ側でdisconnectが呼ばれるまで少しラグが発生します

# Recap
ちょっとしたことなのですが、RxSwiftでメソッドチェーン作っていくと、クロージャで `[unowned self]`をよく入れる機会があるのですが、毎回書くのを忘れてしまいそうになってヒヤヒヤします。予めRxSwift側のauto completeの一部として登録したいです。

# Next...

今回のサンプルで、webを介した通信も(概ね)対応することができました。次回はJINS MEMEの記事として6つめでついに(！)アプリらしきものを作りますよ。既にネタバレしていますが、

> 2. mac側では受け取ったデータを使って、PCを離れると自動的に画面ロックがかかる

を作ってみます。だいぶ [JINS MEME Advent Calendar 15日目の記事](http://kyoro353.hatenablog.com/entry/2015/12/15/061208)に近い気もしますが、コンプライアンス的にはいんじゃないでしょうか。できるかわかんないですが、とりあえずやってみます！(※ というかMQTTなんかよさ気ですね。ちょっと調べてみよ)

# References
[socket.ioの公式クライアントについて](http://socket.io/blog/socket-io-on-ios/)

[Socket.ioとは何か?リアルタイムWebアプリケーションを実現する技術をまとめてみた](http://qiita.com/masarufuruya/items/2bd5dfe03096057af63f)
Wordpressにgistを貼り付けると行番号がずれて、文字と重なってしまう


ブログにログを貼り付ける際にgistを使用したのですが、行番号がずれてしまいました。使用しているテーマはWordpressのTwenty Fifteenです。

![wrong_gist_number_lint_01_151003.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/8dac346d-3629-41c0-a31f-16bd93032002.jpeg "wrong_gist_number_lint_01_151003.jpg")

下記の記事によると、cssの競合が起こっているようです。

[CSS Conflict between WordPress Twenty Fifteen and embedded Github Gists | Gordon Lesti](https://gordonlesti.com/css-conflict-wordpress-twenty-fifteen-and-embedded-gists/)

テーマの編集からstyle.cssを選び、次を末尾に追加したら直りました。

```css
.gist-file table { table-layout: auto; }
```
gitでコミットを取り消す方法を、初心者向けにログで解説


<p>gitでさっきのコミットを取り消して、変更したい時がありますよね。その実演を初心者向けにログとして残しておきます。今回は、gistを使いましたが長いログを残すのには便利かなと思いました。gistを整理できる<a href="http://www.gistboxapp.com/">GistBox</a>というのがあるのですが、タグ機能は公式でつけて欲しいです。</p>

```zsh
# zshにて確認。
# 前回のコミットを取り消す方法を試します。

# gitリポジトリを作成します。		
% git init

# ファイルa,b,c.txtを作り別々にコミットします。
% touch a.txt
% git add .
% git commit -m "first"
% touch b.txt
% git add .
% touch c.txt
% git add .
% git commit -m "add c.txt"
% git commit -m "add b.txt"

# 3回のコミットに分かれていることを確認します。
% git log --oneline
77b5e50 add c.txt
1bc5988 add b.txt
6067116 first

# softは編集結果を削除しない、コミットの取り消しです。
% git reset --soft HEAD
# HEADを指定した場合は何も発生しませんね。
% git log --oneline
77b5e50 add c.txt
1bc5988 add b.txt
6067116 first

# 現在、ステージングエリアに何もないことを確認して次の実験をしていきます。
% git status           
On branch master
nothing to commit, working directory clean

# d.txtを作成した直後は、まだトラッキング（監視）されていません。
# つまりgitの管理対象にd.txtは含まれていないということです。
% touch d.txt
% git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	d.txt

nothing added to commit but untracked files present (use "git add" to track)

# もう一度soft resetしますが、何も置きません。
% git reset --soft HEAD
% git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	d.txt

nothing added to commit but untracked files present (use "git add" to track)

# 今度はd.txtをステージングエリアにあげてから試します。
% git add d.txt
% git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   d.txt
% git reset --soft HEAD
% git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   d.txt

# 何も変わりはありませんでした。
# ステージングエリアにあげたファイルを、取り消すことをアンステージといいますが、
# その方法は上記のgit statusのログに記述されていますね。
# > use "git reset HEAD <file>..." to unstage

# softオプションをつけるとエラーになってしまいます。
% git reset --soft HEAD d.txt
fatal: Cannot do soft reset with paths.

# softを外してみましょう。アンステージされましたね。
% git reset HEAD d.txt 
% git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	d.txt

nothing added to commit but untracked files present (use "git add" to track)

# ちなみにHEADは省略できます。次の通りでもOKです。
# git reset d.txt 
# 全てのファイルを一括でアンステージする場合は「.」を指定すればいいです。
# git reset .

# HEADとは現在の作業場所を指しています。なので、HEADだけだとステージングエリアが対象になるわけです。
# 次は、本題のコミットの取り消しを行います。
# まずhard resetで前回のコミットの状態まで戻します。
# softと違い、編集内容を全て削除します。
# ただし、先にトラッキングして置かないといけないのでaddします。
# リセットの対象はaddされたものです。
% git add .
% git reset --hard
HEAD is now at 77b5e50 add c.txt
% git log --oneline
77b5e50 add c.txt
1bc5988 add b.txt
6067116 first

# では最初のコミットfirstまで戻ってみます。
# HEADに^（ハット）をつけるとその数だけ前のコミットを指します。
# 今回は2つつけるので「b.txt」を指します。
% git reset --soft HEAD^^
% git log --oneline
6067116 first

# firstまで戻っていますね。
# 先ほどのresetコマンドは「add b.txt」までのコミットを取り消すという意味でした。
# hardではなｋsoftなので、編集内容は削除されていません。
% git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   b.txt
	new file:   c.txt
# 今度はb,c.txtを一緒にコミットしたりすることができます。
```
bowerパッケージ登録時にFailed to readとエラーが出る


bowerパッケージを作成する際に`Filed to read`というエラーが出ました。これは他にbower.jsonのフォーマットに問題がある場合に発生します。今回は、行末尾にカンマのつけ忘れでした。修正後はGithubにpushしてバージョンのタグを修正後のコミットに付け直せば、パッケージを登録することができます。

```shell-session
$ bower register model-object-js https://github.com/mitsuru793/model-object-js
bower convert       Converted https://github.com/mitsuru793/model-object-js to git://github.com/mitsuru793/model-object-js.git
bower resolve       git://github.com/mitsuru793/model-object-js.git#*
bower download      https://github.com/mitsuru793/model-object-js/archive/v0.0.1.tar.gz
bower extract       model-object-js#* archive.tar.gz
bower EMALFORMED    Failed to read /var/folders/4s/5nw37tss5qx05r8x1r3sqx2h0000gn/T/mitsuru/bower/model-object-js-28357-hpkPaT/bower.json
```
OSS版droneでRailsプロジェクトをCIしてみた


社内でdrone&dockerが盛り上がってきました！


今回は既存のdockerイメージを使うのではなく、dockerイメージを1からつくってみてます。

## dockerイメージ内容

Centos6.7+Ruby2.2.3+Postgres9.4

rspecの単体テストはもちろん、turnip+capybara+poltergeistでのE2Eテストにも対応してます。

## Dockerfile

https://github.com/kawahiro311/drone-rails

```
FROM centos:6.7

# Install packages for building ruby
RUN yum -y update
RUN yum install -y git gcc gcc-c++ make tar wget openssl-devel readline-devel sqlite-devel zlib zlib-devel file
RUN yum install -y libcurl-devel libyaml-devel libffi-devel bzip2 autoconf automake libtool bison libxml2-devel libxslt-devel
RUN yum clean all

# Install rbenv and ruby-build
RUN git clone https://github.com/sstephenson/rbenv.git /root/.rbenv
RUN git clone https://github.com/sstephenson/ruby-build.git /root/.rbenv/plugins/ruby-build
RUN ./root/.rbenv/plugins/ruby-build/install.sh
ENV PATH /root/.rbenv/bin:$PATH
RUN echo 'export PATH=/root/.rbenv/bin:$PATH' >> /root/.bashrc
RUN echo 'eval "$(rbenv init -)"' >> /root/.bashrc

# Install ruby
ENV CONFIGURE_OPTS --disable-install-doc
RUN rbenv install 2.2.3
RUN rbenv global 2.2.3

# Install Bundler for ruby
RUN echo 'gem: --no-rdoc --no-ri' >> /.gemrc
RUN rbenv exec gem install bundler

# Install node.js
RUN rpm -ivh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
RUN yum -y install nodejs npm --enablerepo=epel
RUN yum clean all
RUN npm install -g bower

# Install postgres
RUN rpm -ivh http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.noarch.rpm
RUN yum -y install postgresql94 postgresql94-devel postgresql94-server
RUN yum clean all
RUN ./etc/init.d/postgresql-9.4 initdb -E UNICODE --no-locale
COPY pg_hba.conf /var/lib/pgsql/9.4/data/pg_hba.conf
RUN echo "listen_addresses = '*'" >> /var/lib/pgsql/9.4/data/postgresql.conf

# Install packages for ImageMagick
RUN yum -y install libjpeg-devel libpng-devel
RUN yum -y install ImageMagick ImageMagick-devel
RUN yum clean all

# Install packages for poltergeist
RUN cd /usr/local/src/ && wget https://phantomjs.googlecode.com/files/phantomjs-1.9.2-linux-x86_64.tar.bz2
RUN tar jxfv /usr/local/src/phantomjs-1.9.2-linux-x86_64.tar.bz2
RUN cp phantomjs-1.9.2-linux-x86_64/bin/phantomjs /usr/bin/
```

## サンプル .drone.yml

```
build:
  image: kawahiro311/centos6.7-ruby2.3-postgres9.4
  commands:
    - service postgresql-9.4 start
    - export PATH=$PATH:/root/.rbenv/shims
    - bundle config build.nokogiri --use-system-libraries
    - bundle config build.pg --with-pg-config=/usr/pgsql-9.4/bin/pg_config
    - bundle install -j4
    - RAILS_ENV=test bundle exec rake db:create db:migrate
    - bundle exec rspec
notify:
  slack:
    webhook_url: https://hooks.slack.com/services/YOUR WEBHOOK URL
    channel: YOUR CHANNEL
    username: drone
```

## GitLab&Slack連携

:blush: :blush: :blush:

![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/19035/e480efb6-81b0-8353-c6bb-8457970d3098.png)


![_WIP__bootstrapのデザインあて___5____Merge_Requests___mikaidoku___mikaidoku___GitLab.png](https://qiita-image-store.s3.amazonaws.com/0/19035/1e6faad9-151f-9e3b-b9a1-149007bc90b0.png)

## まとめ

droneいいっすな
初docker&droneなので、もっと良い書き方等あれば教えてください！
Node.js 学習帳-失敗事項　〜socket.io websocket.ioを使う何かを作ってみる〜

Node.js の環境を用意した後での学習メモ

[環境構築の参考：macでNode.jsの環境設定](http://qiita.com/tagosaku324/items/bf1fe149c38c99728c72)
失敗：[iBeaconを使う何かを作ってみる](http://qiita.com/tagosaku324/items/1e3597d701720d89934e)


#socket.io か websocket.io を使ってチャットアプリを作ってみる

まずはインストールってとこだけど、両方共パッケージインストールは失敗に終わった。

```title:socket.ioインストール
$ npm install socket.io

> bufferutil@1.2.1 install /Users/*****/NodeSampleTmp/node_modules/bufferutil
> node-gyp rebuild

^C
・・・・応答なし　強制終了させた・・・・
```
```title:websocket.ioインストール
$ npm install -g websocket.io

> ws@0.4.20 install /Users/*****/.nvm/versions/node/v0.12.8/lib/node_modules/websocket.io/node_modules/ws
> node install.js

[ws v0.4.20] Attempting to compile blazing fast native extensions.

^C
・・・・応答なし　強制終了させた・・・・
```

ちなみに、途中までインストールされたんだろうなと思ってアンインストールもしてみた

```title:socket.ioアンインストール
 npm uninstall soket.io
fetch                     ▄ ╢█████████████████████████████████████████████░░░░░░░░░░░░░░░░░░░╟
^C
・・・・応答なし　強制終了させた・・・・
```
```title:websocket.ioアンインストール
a$ npm uninstall websocket.io
npm WARN enoent ENOENT, open '/Users/*****/NodeSampleTmp/package.json'
npm WARN NodeSampleTmp No description
npm WARN NodeSampleTmp No repository field.
npm WARN NodeSampleTmp No README data
npm WARN NodeSampleTmp No license field.
$
```
websocket.ioアンインストール、一見うまく言ったかに見えたが、node_modulesは消えていなかった・・・
rm で削除

なんでパッケージインストールがうまくいかないのか？
iBeacon　の失敗と同じなんだろうか？

全く謎のまま。。。未解決
Singletonパターン 

普通：

```java
public class Singleton1 {
    public final static Singleton1 INSTANCE = new Singleton1 ();
    private Singleton1 () { }
   
}
```

進化バージョン：リフレクションでインスタンス作成防止

```java
public class Singleton2 {
    private static boolean INSTANCE_CREATED;
    public final static Singleton2 INSTANCE = new Singleton2 ();
    private Singleton2 () {
        if (INSTANCE_CREATED) {
            throw new IllegalStateException("Singletonパターン です");
        } else {
            INSTANCE_CREATED = true;
        }
    }
```

Static Factoryバージョン：static factory

```java
public class Singleton3 {
    public final static Singleton3 INSTANCE = new Singleton3 ();
    private Singleton3 () { }
    public static Singleton3 getInstance() { return INSTANCE; }
   
}
```

Lazy Initialization（遅延初期化）:

```java
public class Singleton4 {
    private Singleton4() {
    }
    public static Singleton4 getInstance() {
        return Singleton4Holder.INSTANCE;
    }
    private static class Singleton4Holder{
        private static final Singleton4 INSTANCE = new Singleton4 ();
    }
}
```

Enum使用

```java
public enum EnumSingleton {
    INSTANCE;
    public static EnumSingleton getInstance() { return INSTANCE; }

}
```

EnumはSingletonに一番いいです。
理由は下記となっています。
１、クーロンできない
２、シリアライズしても、データコピー取得でいない
３、リフレクションもできない
https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9
Effective javaに記載があります
Intel Edison用に電池ボックスをつくってみた。



Edisonに外部電源つけたいなと思ったので、電池ボックスなるものを作ってみました。


# 必要な電力
* Intel Edisonに必要な電力は7vから15v
* 今回は単3でやりたかったので、
* 1.5vの単3アルカリ8本で12V

参考サイト  
<a href="http://www.intel.co.jp/content/www/jp/ja/do-it-yourself/edison.html" target="_blank"> http://www.intel.co.jp/content/www/jp/ja/do-it-yourself/edison.html </a>  

※ちなみにエネループだとエネループ1.25vなので少し電力おちて9.6vになります。  

#　準備するもの
* 電池ボックス
* カプラー
* ケーブル

### 電池ボックス
![電池ボックス](https://i.gyazo.com/52fd386ec82bf25fb938768e419ad548.png)

### カプラー（白いやつ）
![カプラー](https://i.gyazo.com/979d94cce494f290501e853cc164b180.png)
これはEdisonのJ21につなげるためのものです。

### ケーブル
![ケーブル](https://i.gyazo.com/21d64890ff93bb07f5d2a259d80ab249.png)

# 作り方
ニッパー等で赤黒の線の銅線の部分をむき出しにして、ケーブルとぎゅっと繋いでビニテでぐるぐる巻きにします
もう一方も同じく、ビニテで巻きます。  

赤がプラス、黒がマイナスを間違えないように巻きましょう！  

![作り方](https://i.gyazo.com/9436d7bbe01f6f1381d85e0598f26369.png)

**完成。**
![完成](https://i.gyazo.com/776f65d0ea2d180bcc5be42e6f8fa3fd.png)  


# まとめ
電気がすこーしわかった気がしました！
herokuを始めたらherokuコマンドが動かなかった話。

# Heroku始めました。
herkuちゃんすごうそうだったんです。(情弱)
# Qiitaを見て始めたんです。
Heroku Toolbelt入れてGitも入れてpath通して`heroku create`したら、

```(´・ω・｀)
D:\foo>heroku create
'MySQL' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'MySQL' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
 !    Git must be installed to use the Heroku Toolbelt.
 !    See instructions here: http://git-scm.com

D:\foo>
```
##**えええええ？**

## 入れたのに(´・ω・｀)

Google先生に聞いたところ
https://discussion.heroku.com/t/heroku-installation-error/1149/2
>I was currently facing the same problem. I addition to what eugene​489 says A better solution in this case is to escape the ampersand with a caret (^)

>So you get something like this:

>`C:\Program Files (x86)\MySQL\MySQL Fabric 1.5.4 ^& MySQL Utilities 1.5.4 1.5\;`

どうやらMySQLのPATHが悪さをしていたみたい。。

`C:\Program Files (x86)\MySQL\MySQL Fabric 1.5 & MySQL Utilities 1.5\`

となっているところを

`C:\Program Files (x86)\MySQL\MySQL Fabric 1.5 ^& MySQL Utilities 1.5\`

に変えたあげたら、無事`heroku create`できました。

# 頑張ってお勉強します( ･ㅂ･)و ̑̑
FuelPHPでcomposer.pharでsmarty 3.1.28で動かなかったので

Fuelphpで新しくリポジトリを生成してSmartyのパッケージをインストールしようとしました。
すると、なぜか mkdir() でエラーを吐くようになっていました。

どうやらsmartyのバージョンが昨日上がったようです。
3.1.27 → 3.1.28

#バージョンを3.1.27に戻す
3.1.28の削除
`php composer.phar remove smarty/smarty`

3.1.27のインストール

```composer.json
    "require": {
        "php": ">=5.3.3",
        "composer/installers": "~1.0",
        "fuel/docs": "dev-1.7/master",
        "fuel/core": "dev-1.7/master",
        "fuel/auth": "dev-1.7/master",
        "fuel/email": "dev-1.7/master",
        "fuel/oil": "dev-1.7/master",
        "fuel/orm": "dev-1.7/master",
        "fuel/parser": "dev-1.7/master",
        "fuelphp/upload": "2.0.2",
        "monolog/monolog": "1.5.*",
        "michelf/php-markdown": "1.4.0",
        "smarty/smarty" : "3.1.27"
    },
```

`php composer.phar update`
【メモ】WordPressのカテゴリー編集画面にフォームを追加する

WordPressのバージョンも4.4になったことなので、新しく追加された`add_term_meta`などのタームにメタ情報を扱えるようになったので、フォームを追加しようとしたら、追加の仕方が中々分からなかったので、メモしておきます。

ものすごく単純に追加して確認したい！って感じなので、詳しいことは書きません。
書くと物凄い量になりそうですし、こうやって追加できるんだって思っていただけるだけで構いません。

## カテゴリー一覧画面での追加
```php:functions.php
// 要素を追加するための関数
function my_add_term_field() {
	echo '<input type="text" name="sample" value="">';
}

// 要素を追加するためのアクションフック
add_action( 'category_add_form_fields', 'my_add_term_field');

```

これだけで、一先ず管理画面のカテゴリー一覧画面にて、フォームのフィールドを追加することができます。
「要素を追加するための関数 `my_add_term_field()`」にフォームとなるHTMLを作り、
「要素を追加するためのアクション `add_action()`」で動作させるためにアクションを登録する

このアクションフックで追加させることが可能なので、比較的には簡単でした。

`add_action( 'category_add_form_fields', 'my_add_term_field');`のアクションフックですが、
第1引数の`category_add_form_fields`で一覧画面でのフックになっています。
もっと噛み砕くと`{taxonomy}_add_form_fields`となっており、`{taxonomy}`の部分をタクソノミー名で指定することで、各タクソノミーで追加が行えるといった感じ。

詳細の編集画面でも上記で書いたコードとほぼほぼ同じでアクションフックの指定が違うということ。

## カテゴリー詳細画面での追加
```php:functions.php
// 要素を追加するための関数
function my_add_term_field() {
	echo '<input type="text" name="sample" value="">';
}

// 要素を追加するためのアクションフック
add_action( 'category_edit_form', 'my_add_term_field');
```

これで管理画面のカテゴリー詳細画面に追加が可能になります。
`add_action( '{taxonomy}_edit_form', 'my_add_term_field');`　一覧画面のときと同じように`{taxonomy}`の部分にタクソノミー名を入れることで、それぞれ対応したタクソノミーに追加が行えます。

カテゴリー画面への追加自体は、至って簡単ということが何となく分かるかと思います。
追加自体は簡単ではあるが、ここから画面を作っていくというのが大変なんでしょうね。
レイアウトなどは、WordPress自体のコードを見ながら作れば、間違いないと思う。


`add_settings_field()`みたいな物が見つけられなかったので、保存処理は自力でやるしかないですが・・・。
まあ、新しい関数もありますし以前よりは楽に作れるのではないでしょうか。
Akka ActorのonReceiveをJavaの多態性を使って実装

# きっかけ
定期実行や分散処理のために、[Akka](http://akka.io/)のactorを使うのが、playを使っていたらよくあると思います。

Scalaなら、パターンマッチを使ってActorのonReceiveがきれいにかけるのですが、javaならどうしたものかと、試行錯誤した結果です。結論は多態性（ポリモーフィズム）を使おうですが、変遷もこみでまとめてみました。

# scalaの場合

例えば、型に応じて処理を分けた場合は、下記のような型のパターンマッチです。

```
class SampleActor extends Actor {

  def receive = {
    case msg: HogeA =>
    case msg: HogeB => 
    case msg: HogeC =>
　　case _ => 　
}
```

あるいは下記のようにcase objectを用意して、それとパターンマッチさせて、処理を振り分けるですね。
（最近、scalaを書いていないので、適当です。まちがってる気がしますが、雰囲気を感じとってもらえれば）

```
abstract class Status
case object ENABLE extends Status
case object DISABLE extends Status
case object SUSPEND extends Status

class SampleActor extends Actor {

  def receive = {
    case ENABLE  =>
    case DISABLE => 
    case SUSPEND =>
　　case _ => 　
}
  
```

# javaの場合

## switch文

case objectを使ったやり方を触発されて、enumを作成して、それのswitch文を使っての処理の振り分けを、最初はやってみました。

```
enum Status {
   ENABLE,
   DISABLE,
   SUSPEND
   ; 
}

class Sample1Actor extends UntypedActor {

  @Override
  public void onReceive(Object message) {

      if (message instanceof Status) {
         Status status = (Status) message;
         switch(message) {
            case ENABLE:
                 ...
                 break;
            case DISABLE:
                 ...
                 break;
            case SUSPEND:
                 ...
                 break;

            default:
                 ....  
         } 
        
      } else {
        unhandled(message);  
      } 
  } 

}

```

悪くはないですが、パターンごとに処理をするインスタンスを生成したり、staticメソッドを呼び出したりするのが面倒くさくなってきます。特に、後からパターンを追加するときが、

* enumに追加
* 処理するクラスを追加
* switch文にパターンを追加
* アクターへのメッセージ送信パターンを追加

となるので、げんなりしてきます。

そこで、多態性の出番です。
「java switch リファクタリング」でぐぐったり、[ポリモーフィズムで条件分岐をなくす](http://iwa4.hatenablog.com/entry/2013/03/04/180521) などのように、switch文は多態性で書き直すのが、セオリーのみたいです。

## 多態性

今回はインターフェースを使った形でいきます。

```lang:IReceiver.java

public interface IReceiver {

  /**
   * アクターで実行する処理.
   */
  pubic void apply();
}
```

これを実装した、HogeA|HogeB|HogeCReceiverというクラスを作成します。

```lang:HogeAReceiver.java
public class HogeAReceiver implements IReceiver {

  /* 以下略 */
}
```

アクターでは下記のようにして、メッセージを受け取ります。

```SampleActor.java

class SampleActor extends UntypedActor {

  @Override
  public void onReceive(Object message) {

      if (message instanceof IReceiver) {
         IReceiver receiver = (IReceiver) message;
         receiver.apply();
      } else {
        unhandled(message);  
      } 
  } 

}

```

メッセージの送り方は、実装したクラスのインスタンスを下記のようにしておくればよいです。
（ActorRefの作り方は適当です、状況にあわせて用意しましょう。）
これで、HogeA,B,Cのパターンに応じて処理をやってくれます。

```
  ActorSystem system = ActorSystem.create("MySystem");
  ActorRef actorRef = system.actorOf(Props.create(SampleActor .class),"SampleActor ");
  actorRef.tell(new HogeAReceiver(), null);
  actorRef.tell(new HogeBReceiver(), null);
  actorRef.tell(new HogeCReceiver(), null);
```

こうすると、新規追加で必要なことは次の2つだけになり、これが本質的なところだったということですね。

* 新しいクラスの実装
* そのインスタンスのアクターへの送信

# 注意

アクターの中で実行する処理で、アクターの状態(ActorContext)に依存したもの（behavior？）をメッセージでやりとりするのは、意図した結果にならない可能性があるので、バッドプラクティスのようです。ななめ読みなので詳細が追い切れていないですが。

http://www.slideshare.net/shinolajla/effective-actors-jaxconf2012-14472247
うっかり起動してしまった時間のかかるプロセスをtmux上に付け替えたい

うっかり生のシェル上で時間がかかるプログラムを起動してしまって困ったこと、ありませんか。
こういう時に使えるコマンドに、reptyrがあります。

# インストール

Debianなら

```bash
$ sudo aptitude install reptyr
```

多分ubuntuでもこれでおｋです。

# 使い方

```bash
$ ps aux|grep hoge
```

でPIDを調べて、

```bash:
$ tmux
$ reptyr ほげ
```

でptyを付け替えられます。

# その他

sshが落ちてそのままになったviとかもこれでつけ変わるっぽいです。

# 追記

## ubuntuの場合

```bash
$ sudo echo 0 > /proc/sys/kernel/yama/ptrace_scope
```

しないとptraceシステムコールがうまく動かないって書いてありましたが確かめていません

## gdbでttyを付け替える

gdbでデバッグしている時、gdbの出力とコマンドの出力がごっちゃになって鬱陶しいことがままあります。
gdbserverを使うのも一つの手ですが、reptyrでも出力先を変えられるようです。
gdbとは別のターミナルで

```bash
$ reptyr -l
Opened a new pty: /dev/pts/ほげ
```

して新しいptyを開き、gdb上で

```
$ set inferior-tty /dev/pts/ほげ
```

とかすると入出力先が変わります。gdbを終了するとreptyrも終了します。
実はこちらもかなり便利でした。（特にpedaとか入れていると出力が長いですし）
Windows使用者の為のmacアプリ対比表


今の会社はほぼ100％Macなのですが、これまで僕は開発ではWindowsを主に使用してきたのでやっぱり慣れが必要でした。

特にFinderは慣れるよりextraFinderを使用してWindowsのExplorerに寄せるよう対応してきたので、El CapitanのSIPでextraFinderが標準設定で使えなくなったことがかなりの痛手です。

そんな訳でWinでいうこれはMacでこれ使ってます系の表です。
参考にしてください。

## どっちかのOSしかないので別アプリが必要なもの

| 機能 | Windows | Mac | 備考 |
| --- | --- | --- | --- |
| IDE | Visual Studio | - |  |
| IDE | - | XCode | iPhoneシュミレータも素晴らしい |
| テキストエディタ | sakura editor | mi | 日本語に強いエディタ |
| SCPクライアント | WinSCP | transmit :moneybag:  |  |
| DIFFツール | WinMerge | meld |  |
| 画像編集 | MSPaint | preview | リサイズや簡単な編集程度ならイケる |
| MySQL クライアント | HeidiSQL | Sequel Pro |  |
| ターミナル | rlogin / git bash | iterm / terminal |  |
| Jabber/XMPPクライアント | Pidgin | iMessage |  |


※ :moneybag: シェアウェア


## その他

- 最近のは大体マルチプラットフォームでそんなに困らない
- - IntelliJ IDEA
- - Sublime Text2 / ATOM / VS Code
- - Virtualbox / Vagrant
- - Chrome/ Firefox
- - Wunderlist
- - MS Office
- - Evernote / OneNote
- - Dropbox
- - etc
- Winユーザお得意のとりあえず右クリック→ファイル新規作成からのダブルクリックでアプリ起動がextraFinderが（SIPを無効にしないと）使えなくなってからなくなってしまい辛い
- Mac版のMS Office（2011）は辛い。2016は良い感じなのだろうか
hubot-slack で特定ユーザーに DM を送る方法

## 対象
* hubot-slack ver 3.4.2
* node-slack-client ver 1.4.0

https://github.com/slackhq/hubot-slack


## 事象

hubot-slack では、room にユーザー名（@hoge の場合 "hoge"）を渡してやると、特定ユーザーに DM を送信することができる。

```
robot.send {room: userName}, message
=> userName に 内容が message の DM が送信される。
```


ただし、hubot-slack の ver 3.4.2（2015/12/15 時点の最新）では、
DMインスタンスが生成されていない場合は、ユーザーにDMを送信することができない。

```
robot.send {room: userName}, message
=> userName の DM がオープンされていない場合は送信されない。
```

## 原因
ユーザーのDMインスタンスが生成されていない。

## 解決方法

robot.adapter.client.openDM(userId, callback) により、送信前に DM をオープンしておく。

```
sendDM = (userName, message) ->
  # userName は slack のユーザー名（@hoge の場合は "hoge"）
  # slack の userID を取得
  userId = robot.adapter.client.getUserByName(userName)?.id
  return unless userId?

  robot.adapter.client.openDM userId, (data) ->
    robot.send {room: userName}, message
```
まだ git push origin するときに current branch 名を入力して消耗しているの?

# あらすじ
remote の内容を clone して、手元で branch を切って、そのカレントブランチの内容を remote に push したい時、下記のように

```bash
git push origin BRANCH_NAME
```

毎回 BRANCH_NAME を指定する作業をしていると、日に何回も push する時は、とても多くの時間がかかってしまうことがあるかもしれません。

あと、タイトルは単に消耗しているの?って言いたかっただけです。


# git push origin HEAD

下記を実行することで、カレントブランチ (git st で確認)の内容を origin に対して push できます。

```bash
git push origin HEAD
```

# 詳しく

git document によると[^1]
> git push origin HEAD
> A handy way to push the current branch to the same name on the remote

カレントブランチを同じ名前でリモートに対して push する便利な方法です。
とあります。

同様の stackoverflow [^2]によると
> If you want to push a different branch than the current one the command will not work.

カレントブランチではないブランチを push したいときは HEAD 指定は無効。push したい branch を checkout するか、branch 名を指定する必要があります。

※ 本投稿は [http://d.hatena.ne.jp/mabots/20151023/1445584754](http://d.hatena.ne.jp/mabots/20151023/1445584754) を [Coubic Advent Calendar 2015](http://qiita.com/advent-calendar/2015/coubic) に向けて、大幅に加筆・再編したものです。

[^1]: http://git-scm.com/docs/git-push
[^2]: http://stackoverflow.com/questions/23241052/git-push-origin-head
c++ builder XE4, 10.2 Tokyo | teechart > design > zoom時の枠線の色設定

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

TeeChartで背景色を白色にした時に、ズームの枠線が元々白色なので見えなくなる。

デザインで以下の部分の色を変更する。

### XE4

デフォルト色は白色。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/340ad3d5-c2b9-52bc-2788-c3f9f43fc30d.png)

### 10.2 Tokyo

デフォルト色は灰色。
下記のColorを設定する。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8bd6a4af-9b4f-7f24-0cad-f003403b2d72.png)

TeeChartのバージョンも変わっているので、上記のデフォルト値の違いがどれによるものかは明確ではない。
Vue.jsでBootstrapのProgress Barを制御するサンプル

vue.jsの勉強を兼ねて、BootstrapのProgress Barを制御するサンプルを作ってみました。

```HTML
<div class="container" id="simple">

  <div class="progress progress-striped active">
    <div class="progress-bar" :style=" progressWidth">
    <span>{{ progress }}%</span>
    </div>
  </div>
  <button class="btn btn-default" v-on:click="start" type="submit">Button</button>
</div>
```

```JavaScript
var app = new Vue({
  el: '#simple',
  data: {
    progress: 15,
  },
  computed: {
        progressWidth: function(){
             return "width:" + this.progress + "%";
        }
  },
  created: function(){
  },
  methods: {
    start: function() {
      this.progress = 75
    }
 
  }
})
```

ボタンをクリックするとProgress Barのゲージが15%から75%に増加します。
jsfddileでのサンプルはこちら。 http://jsfiddle.net/Hiroshi_Obata/dgxavvgj/embedded/result/


vue.jsを始めるにあたり、いくつかのサイトを参考にしたのですが、v-attrを使っていたり、v-onのイベントの書き方が違っていたりとちょっと苦労しました。v 1.0.0が出た2015/10/26以前の記事は参考にしない方がよさそう。
C言語の宣言、なぜそう書くのか？

## 動機

C言語での変数宣言に、**一貫性**を発見したので書きたいと思います
宣言の一貫した規則を示すために、いくつかの種類の変数宣言を見ていきたいと思います

## 変数宣言の一貫性

その発見とは***「変数の宣言」は「その変数の特有のアクセス方法」に似せた構文***になっているということです


### 配列

```c:配列の宣言
int array[10];
```

```c:配列特有のアクセス方法
printf("%d\n", array[2]);
```

まとめると、

|宣言|アクセス方法|
|:--:|:--:|
|`array[10]`|`array[2]`|

宣言とアクセス方法が似ていることが分かります。

### ポインタ

```c:ポインタの宣言
int *p;
```


```c:ポインタ特有のアクセス方法
printf("%d\n", *p);
```

ポインタの特有の使い方は「*」を使ってポインタの指している値にアクセスすることだと思います。このアクセス方法がポインタの宣言に反映されていると考えられます

以前の私は`int* p`と書いて`intポインタ型のp`と解釈していましたが、これでは以下の結果の説明がつかないです。

```c:
/* qはただのint型でintのポインタ型ではない */
int* p, q;
```


まとめると、

|宣言|アクセス方法|
|:--:|:--:|
|`*p`|`*p`|


---- 


「配列」と「ポインタ」だけでは「***「変数の宣言」は「その変数の特有のアクセス方法」に似せた構文***」と言い切れないので、「配列へのポインタ」と「関数へのポインタ」見てみます



## 配列へのポインタ


```c:要素数10個の配列へのポインタ
int (*arp)[10];
```

アドレスを入れるときは以下のように入れます。

```c
int array_ten[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
arp = &array_ten;
```

以下の書き方でarray_ten[3]と同じ要素にアクセスします

```c:特有のアクセス方法
printf("%d\n", (*arp)[3]); // 4
```

まとめると、

|宣言|アクセス方法|
|:--:|:--:|
|`(*arp)[10]`|`(*arp)[3]`|

宣言とアクセス方法、似ていませんか？


## 関数ポインタ

```c:2つのintを引数にとり、戻り値がintの関数へのポインタ
int (*funp)(int, int);
```

アドレスを入れるときは以下のようにします

```c:
// a + bをしてintで返す
int add(int a, int b){
    return a + b;
}
// addのアドレスを代入できる
funp = &add;
```

```c:特有のアクセス方法
printf("%d\n", (*funp)(1, 2)); // 3
```

まとめると、

|宣言|アクセス方法|
|:--:|:--:|
|`(*funp)(int,int)`|`(*funp)(1,2)`|


### まとめ

以上を踏まえるとC言語の変数の宣言とアクセス方法はとても良く似ています。私の憶測ではありますが、アクセス方法に似せた宣言というのが、C言語にある一貫した宣言の記法なのだと思います。

今までできた宣言に勢揃いしてもらうと、以下みたいになります

```c
int *p, array[10], (*arp)[10], (*funp)(int, int);
```

上のC言語の宣言の`p`, `array`, `arp`, `funp`の解釈が前より変わって見えませんか？
JavaScriptでPrintscreenによる画面キャプチャを無理やり無効にする方法

```html:disprintscreen.js
<script type="text/javascript" src="js/clipboard.js"></script>
<span style="display:none;"><button id="btnfake">Copy</button></span><div id="fake">　</div>
<script type="text/javascript">
window.addEventListener("keyup",kPress,false);
function kPress(e)
{ 
var c=e.keyCode||e.charCode; 
if (c==44)
changeBoard();
}
function changeBoard(){
	document.getElementById('btnfake').click();
};
</script>
<script>
    var clipboard = new Clipboard('#btnfake', {
        target: function() {
            return document.querySelector('#fake');
        }
    });
</script>
```
検索しても見つからなかったので無理やり自作しました。
前提条件としてclipboard.jsを利用しますのでご注意ください。
nodejsで大量のEntityを生成するときには class や prototypeベースで作成する方がコストが低い


はじめに
===========

Javascriptで、単純な値やFunctionをもつEntityを作成する場合、いくつか書き方があると思います。
下記 検証スクリプトの`EntityFunction` のような書き方は、「Objectが生成される度に関数スコープが作られるので遅い」と聞いたので検証してみました。結論として全くそのとおりでした。

version
---------

* nodejs: v4.2.1
* babel-core: 6.1.2



検証
============

下記のように

* `EntityClass`のようにES6 の class を使う
	* 今回は babelでES5に変換しているので、そうでない場合にどうかはまた別ですが
* `EntityFunction` のような書き方
* `EntityFunction2` のような書き方

で、10万回Objectを生成して、それぞれMethodを呼んでみた時間を測りました。

検証スクリプト
-----------

```javascript:bench.js
require('babel-core/register');
require('./bench.es6');
```

```javascript:bench.es6
class EntityClass {
  constructor(name, age, prop) {
    this.name = name;
    this.age = age;
    this.prop = prop;
  }

  getName() {
    return this.name;
  }

  getProp() {
    return this.prop;
  }

  getHoge() {
    return this.prop.hoge + this.age;
  }
}

const EntityFunction = function(name, age, prop) {
  const self = {};

  self.getName = () => name;
  self.getProp = () => prop;
  self.getHoge = () => prop.hoge + age;

  return self;
};

// 関数スコープを毎回作らない、関数だけを使っている書き方
const EntityFunction2 = function(name, age, prop) {
  const self = {};
  self.name = name;
  self.age = age;
  self.prop = prop;

  self.getName = getName;
  self.getProp = getProp;
  self.getHoge = getHoge;

  return self;
};

function getName() { return this.name }
function getProp() { return this.prop }
function getHoge() { return this.prop.hoge + this.age }


function bench(name, proc) {
  const startTime = new Date();
  proc();
  const endTime = new Date();
  console.log(`${name}: ${endTime - startTime} ms`);
}

const loopNum = 100000;
bench('EntityClass', function() {
  let entity;
  for (let i=0; i<loopNum; i++) {
    entity = new EntityClass('name', 100, {hoge: 100});
    [entity.getName(), entity.getName(), entity.getHoge()];
  }
  // console.log([entity.getName(), entity.getName(), entity.getHoge()]);
});

bench('EntityFunction', function() {
  let entity;
  for (let i=0; i<loopNum; i++) {
    entity = EntityFunction('name', 100, {hoge: 100});
    [entity.getName(), entity.getName(), entity.getHoge()];
  }
  // console.log([entity.getName(), entity.getName(), entity.getHoge()]);
});

bench('EntityFunction2', function() {
  let entity;
  for (let i=0; i<loopNum; i++) {
    entity = EntityFunction2('name', 100, {hoge: 100});
    [entity.getName(), entity.getName(), entity.getHoge()];
  }
  // console.log([entity.getName(), entity.getName(), entity.getHoge()]);
});

```


検証結果
---------

```
% node bench.js
EntityClass: 7 ms
EntityFunction: 642 ms
EntityFunction2: 30 ms
```

差は歴然でした。class的な書き方の方が無駄な関数スコープが作られないからか速いんですね。
まあ、10万回生成実行した時のコストですので、100回くらいなら効率悪い書き方でも1msくらいですね。


さいごに
--------

私は結構 `EntityFunction` な書き方をしていたので、今後は気をつけよう、、と思いました。
Visual Studio コメント・タスク一覧の検索・検索文字のカスタマイズ

参照ページは
　https://msdn.microsoft.com/ja-jp/library/txtwdysk.aspx

##■タスク一覧・コメント一覧の表示

　メニュー【表示】→【タスク一覧】

　検索内容をコメントにしてTODOなどを選べば指定した文言を含むコメント一覧を表示する。

##■タスク一覧・コメント一覧に表示させるカスタムタスクやカスタムコメントの追加・編集

　メニュー【ツール】→【オプション】→環境→タスク一覧→名前に入力→追加

　メニュー【ツール】→【オプション】→環境→タスク一覧→項目を選択→編集or削除
ページ評価に関するタグ

Googleのパンダアップデート対策として、低品質ページにnoindexを挿入したり、重複ページにcanonical、301リダイレクトを挿入したい場面が出てくると思いますが、WordPressなどのCMSを使っている場合、特定の記事にのみこういったタグを挿入するのは意外と難しいものです。

noindex：そのページをインデックスさせない（サイト評価に含めない）
canonical：そのページの評価を他のページに渡す
301リダイレクト：自動転送＋そのページの評価を他のページに渡す
使い分けが難しいかもしれませんが、重複ページがあり転送させたい場合は301で、転送はしないが評価は渡したい場合はcanonical、評価を渡す必要がない場合にはnoindexと言った感じになります。

canonicalは301リダイレクト並に強力ですし、必要なページにnoindexを付けてしまうことで、サイト評価を落とすことになります。「パンダアップデート対策 – 質の低いページをインデックスさせない」という記事の中で、不要なページの見つけ方を解説していますが、良く分からない場合には今回の記事に書かれている事は実行しない方が良いかもしれません。
masterが更新された場合に、トピックブランチにその更新を取り込んで作業する方法


特定のコミットの内容を再編集するために`git rebase -i`を使っていましたが、ただrebaseがどういうものなのかは知りませんでした。次のような状況で使うといい教えてもらったのでシェアします。rebaseが何に使うのかわからない方には役立ちます。

**やりたいこと** 
トピックブランチで作業していたら、masterが更新されていた。この新しい更新分を自分のトピックブランチに取り込みたい

```shell-session
# リモートにないブランチがあったらローカルから削除
$ git fetch -p

# masterを更新
$ git checkout master
$ git pull

# 新しいmasterの更新分を取り込んでtopic_branchを再構成
$ git checkout topic_branch
$ git rebase master

# プルリクエストを出す場合は必要ない
$ git checkout master
$ git merge topic_branch`
```

これでコミットが時系列に沿って再構成されます。新しいmasterのコミット以降にあるtopic_branchのコミットは新しいコミットになりますので、コミット日時とidが変わります。

gitではコミットに2つの日時を所持しています。これによりコミットの日時が変わっても、author dateというので本来のコミット日時がわかります。

今回のrebaseの使い方はOSSに参加する際には必要になるとのことです。
railsでrake db:createをするとCan't connect to local MySQL server through socket '/tmp/mysql.sock'と表示される


dbを作成しようにも`Can't connect to local MySQL server through socket '/tmp/mysql.sock'`というエラーが起きて作成することができませんでした。brewでmysqlをインストールしたのでmysql.sockというファイルが違う場所にあって見つからないのかなと思ったら単にmysql.serverが立ち上がっていないだけのようでした。`mysql.server`というコマンドを初めて知りました。

```
$ rails new sinope -d mysql
$ cd sinope
$ rake db:create
#<Mysql2::Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)>
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost", "database"=>"sinope_development"}, {:charset=>"utf8", :collation=>"utf8_unicode_ci"}
(If you set the charset manually, make sure you have a matching collation)
#<Mysql2::Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)>
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost", "database"=>"sinope_test"}, {:charset=>"utf8", :collation=>"utf8_unicode_ci"}
(If you set the charset manually, make sure you have a matching collation)

$ mysql.server start
Starting MySQL
. SUCCESS!
```
rails newがrun bundle installで止まってしまう


`rails new myappname -d mysql`を実行するとlogがたくさん出て`run bundle install`でずっと止まっていました。`rails newmyappname`では完了しました。どうやらmysqlが入っていなかったようで`brew install mysql`でインストールすれば、無事railsをプロジェクトを作成することができました。エラーが表示されない時があるのですね。
pythonと同じだと思い、rubyのインタプリタが起動しない問題にハマってしまった


pythonだとコマンド`python`で2.xが、`python3`で3.xのpythonインタプリタが起動します。rubyも同じだと思い,  
rubyコマンドを引数なしで実行していました。そうしたら次の行に改行されるけどプロンプトが表示されず処理が終わらない状態になりました。

原因はコマンドを間違えていました。rubyのインタプリタは`irb`でした。スクリプトファイルや-eオプションで文字列をrubyとして評価する場合に`ruby`コマンドを使います。
究極のIT系最新技術情報収集用Slackチーム公開 - モヒカンSlack -

# tl;dr
- コンピュータ系の情報収集用のSlack公開グループ（モヒカンSlack）を作ってみたよ。
- 皆さんで協力して育てていく共同RSSリーダーみたいなものだよ。
- このSlackグループの情報を追っていればオッケーなので、情報取集が格段に楽になったよ。
- 誰でも無料で参加オッケーよ。下のどっちかからメールアドレスを入力して参加できるよ。
    - [Invite people to mohikan](https://join.slack.com/t/mohikan/shared_invite/zt-210dal9lc-0BYJufeKMYd_VvGCV09B6g)
    - ~~[Slackin](https://mohikan-slackin.herokuapp.com/)~~
    - ~~[Google Forms](http://goo.gl/forms/P5Zh1z2Qqw )~~
- 参加者数 
    - ~~1,694名 (2016/10/7 時点)~~
    - ~~4,077名~~ (2017/1/25 時点)
    - ~~7,000名~~ (2017/8/25 時点)
    - 11,747名 (2018/12/1 時点)
- チャネルのリストは「[Gist](https://gist.github.com/kotakanbe/e4232407b75e1ec584e7)」にあるよ。148チャネル(2017/1/25時点）
    - 分野ごとにチャネルが別れていて、追いたい分野のものに参加すると良いよ
        - プログラミング言語系(毎朝GitHub Trendingが流れてくるので毎日見るといいよ）
        - クラウド系
        - Qiitaランキング
        - Slideshareランキング
        - IT勉強会の資料ランキング
- 気に入ったらいいねしてね<(＿ ＿)>

# 記事更新メモ
- [startup geeks #1](http://startupgeeks.connpass.com/event/24126/)でLTしました。[スライド](http://pt.slideshare.net/kotakanbe/mohikan-slack)
- 9/28追記 slackinからも登録できるようにしました

# モヒカンを目指すエンジニャーにとって日々の情報収集は重要
日々の情報収集を止めたその瞬間から老害化が始まります。
インプットがないと今までの知識や経験のみで判断することになり、新たな技術でより効率的なやり方を発想できなくなります。その結果、敏感な若者からは老害認定され、殉職。そのまま老後を迎えます。

老害なんて言われたくない！
というわけで、日々の情報収集は必須なわけですが、正直面倒でした。

# お前らの情報収集の効率の悪さは異常
お前らというか、今までのボクの話ですけど、

- 複数のアプリを使うのが面倒
    - TwitterやRSSリーダ、キュレーション系アプリなど複数のアプリを切り替えるのが面倒
    - そのうちどれか決まったアプリしか見なくなる
- ノイズが多過ぎる
    - 通勤電車でSmartN〇〇sで技術情報見始めてもいつの間にか「サイゾータブ」見てる。煩悩多い。
    - Twitterはノイズ大杉
- キュレーション系サービスは広くて浅い
    - 概要押さえるだけの分野ならいいけど、深く追いたい分野に関しては浅い情報が多い

という点に怒りを感じてました。

# Slackに集めるようにしたら楽になった
- Slack開けばそこに情報が集まっている状態。
- ここさえ追っておけば大体オッケーという安心感。
- PC, SmartPhoneのSlackアプリがあるので会社PCでも電車でもトイレでも、いつでもどこでも。
- Slackの機能で前回読んだところからすぐに再開できる。
- スクロールでサクサク読み飛ばせて効率的。
- 「サイゾータブ」の誘惑がない(サイゾーチャネルはまだ作っていない)
![hatebu___mohikan_Slack_-_Vimperator.png](https://qiita-image-store.s3.amazonaws.com/0/22462/94ddb8b5-7f9f-48f8-ed3b-86c47ae87936.png)

# で、どんなチャネルがあるの？
最新のチャネルリストは [Gist](https://gist.github.com/kotakanbe/e4232407b75e1ec584e7) を参照
チャネルによって情報ソースの充実さに差があるのが現状です（私の興味のない分野は手薄）

# チャネルを増やしたしたいんだけど？
自由にチャネル作ってもらってオッケーです。
RSS feedなども追加してオッケーです。
また、この情報をこう加工してつぶやたら面白くね？というアイデアもウェルカムです。試しに、#-general で言ってみてください。面白いアイデアなら代わりに実装しまっせ！！

# 誰でも参加オッケーっす！
- Slack無料プランでやるので無料（今後も有料プランにはしない）
- Slackグループ名は、「mohikan」（mohicanはすでにあったw）
- 誰でも無料で参加オッケーよ。下のどっちかからメールアドレスを入力して参加できるよ。

    - [Invite people to mohikan](https://join.slack.com/t/mohikan/shared_invite/zt-210dal9lc-0BYJufeKMYd_VvGCV09B6g)
    - ~~[Slackin](https://mohikan-slackin.herokuapp.com/)~~
    - ~~[Google Forms](http://goo.gl/forms/P5Zh1z2Qqw )~~

# モヒカンSlack参加後
最新のチャネルリスト [Gist](https://gist.github.com/kotakanbe/e4232407b75e1ec584e7) を参考にしてお好きなチャネルに参加すればいいと思うよ。
では、モヒカンSlackでお会いしましょー
railsでsidekiqのQue（キュー）が実行されない


作成したrubyスクリプトを定期的に実行させるために、sidekiqというgemを使うといいと教えてもらいました。下記の記事を参考にしていたのですが、かなりつまづいてしまいました。その際に必要だったことをメモしておきます。

[Rails - sidekiqの使い方 - Qiita](http://qiita.com/nysalor/items/94ecd53c2141d1c27d1f)

### perform_async()でエラーが出て、sidekiqが終了する

必要なターミナルは3つでした。railsコンソール、sidekiqとredis-serverです。brewでredisをインストールすると、`redis-server`コマンドでPort6379にサーバが立ち上がります。sidekiqを立ち上げるだけではダメでredis-serverも平行して起動していないとダメでした。

### redisって何？

> メモリ上にKey-Valueストア(KVS)を構築することができるソフトウェアの一つ。 KVSは任意の保存したいデータ(値：value)に対し，対応する一意の標識(キー：key)を設定し，これらをペアで保存するデータベースの一種で，Redisはコンピュータのメインメモリ上にKVSを構築し，外部のプログラムからデータの保存と読み出しができる。 保存する値(value)として様々なデータ構造を利用することができ，文字列，バイナリデータ，リスト，集合(セット)，ハッシュなどを保存することができる。
>
> <cite><a href="http://promamo.com/?p=3358">Redisの使い方 ‹ 技術の犬小屋</a></cite>

WebStorageみたいなものかと思います。ここにsidekiqのタスクが登録されていくのかと。

### Workerのputsがどこに出力されるのか？

下記のようにファイルのWorkerで文字列を出力するようにしました。この場合の出力先は、railsのコンソールなのかと思っていましたが、sidekiqの方に出力されました。

```ruby
# app/workers/event_worker.rb
class EventWorker
  include Sidekiq::Worker
  sidekiq_options queue: :event

  def perform()
    puts "perform"
  end
end
```

### いつタスクが実行されるのか？

`rails c`でコンソールを立ち上げて、`EventWorker.perform_async()`で"cd8512e529e90aec643a433d"と文字列が返ってきます。おそらく実行されたタスクIDかと思います。sidekiqを立ち上げているターミナルを見ると、"perform"と表示されていました。
.keepファイルは何のために存在するの？


railsで.keepというファイルを見かけました。これはgitで空ディレクトリを管理対象に含めるために、作成するらしいです。.gitkeepというのもあるみたいです。

gitでは空のディレクトリは管理対象に含まれないので、.keepなどのダミーファイルを置くことで対策しています。
watchifyとbrowserifyで、jqueryとbootstrapをrequireしても依存関係が解決できない


watchify, browserifyを使ってjquery, bootstrap, handlebarsをrequireしたのですが、泥沼にハマりました。私は下記のように読み込む順番にだけ気をつけてrequireすればいいのかと思っていました。

```coffeescript
require './jquery'
require './bootstrap'
require './handlebars'
```

しかし、`Uncaught Error: Bootstrap's JavaScript requires jQuery`とchromeのコンソールに表示されます。なのでrequireしたものをグローバルオブジェクトに代入しました。

```coffeescript
window.jQuery = $ = require './jquery'
require './bootstrap'
require './handlebars'
```

すると今度は、`Uncaught ReferenceError: Handlebars is not defined`とエラーが。次は定義されていないと言われているHandlebarsという変数を作り、そこにrequireしたものを入れてみました。

```coffeescript
window.jQuery = $ = require './jquery'
require './bootstrap'
Handlebars = require './handlebars'
```

これでエラーがなくなり依存関係も解決しました。おそらく、bundleされたものが無名関数にラッピングされていたので、bootstrapからjqueryが参照できなかったのだと思います。また、Handlebarsはわざわざ変数を自前で用意する必要がありました。requireしただけではダメなようです。

今回はかなり時間がかかってしまいショックです。nodejsのrequireについて先に把握する必要がありますね。ですが、毎回泥沼にハマるたびに海外サイトを漁るようになってきたので、英語力がついてきたかと思います。
npm自体のバージョンアップ、インストールに失敗するとコマンドが消えて使えなくなる


npmのバージョンアップはnpmからnpmをインストールします。ちょっと変わっていますね。

```shell-session
$ npm install -g npm
npm ERR! Darwin 14.3.0
npm ERR! argv "node" "/usr/local/bin/npm" "install" "-g" "npm"
npm ERR! node v0.12.7
npm ERR! npm  v2.11.3
npm ERR! path /usr/local/lib/node_modules/npm
npm ERR! code EACCES
npm ERR! errno -13

npm ERR! Error: EACCES, rmdir '/usr/local/lib/node_modules/npm'
npm ERR!     at Error (native)
npm ERR!  { [Error: EACCES, rmdir '/usr/local/lib/node_modules/npm']
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/usr/local/lib/node_modules/npm' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.
npm ERR! error rolling back Error: EACCES, rmdir '/usr/local/lib/node_modules/npm'
npm ERR! error rolling back     at Error (native)
npm ERR! error rolling back  { [Error: EACCES, rmdir '/usr/local/lib/node_modules/npm']
npm ERR! error rolling back   errno: -13,
npm ERR! error rolling back   code: 'EACCES',
npm ERR! error rolling back   path: '/usr/local/lib/node_modules/npm' }

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/mitsuru/npm-debug.log
```

管理者権限で再度トライしてみてと表示されました。ですが、もう一度同コマンドを打っても動きません。tabの補完でもわかるのですが、npmコマンド自体が消えてしまっています。どうやらnpmはバージョンアップ（インストール）に失敗するとコマンドが消えてしまうようです。

[Node.jsの公式サイト](https://nodejs.org/)からインストーラーを落として、Node.jsを再インストールしましょう。そうするとnpmも一緒にインストールされます。そしてsudoで実行すれば完了です。

```shell-session
$ sudo npm install -g npm
Password:
/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
npm@2.13.2 /usr/local/lib/node_modules/npm
```

またnpmのバージョンアップを失敗しても何度も上記の方法で修復することができます。
VimにRust開発用の設定入れる

想定してるのはMacかLinux。

やりたいことは

* シンタックスハイライト
* コード補完
* オートフォーマット

あたりなので、とりあえずこのあたりを出来るようにする。
インストールするのは4つ。

コマンドとして

* phildawes/racer
* rust-lang-nursery/rustfmt

Vim Pluginとして

* rust-lang/rust.vim
* racer-rust/vim-racer

それぞれ2つずつ。

まずはracerとrustfmtをインストールする。どちらもcargoでインストール出来るので

```
cargo install --git 'https://github.com/phildawes/racer.git'
cargo install --git https://github.com/rust-lang-nursery/rustfmt
```
としてあげる。
とくに設定していなければ$HOME/.cargo/binにracerとrustfmtが入っているはず。
必要ならPATHを通しておくのがいいと思うけどVimからしか使わないなら通さなくてもいいかもしれない。

racerの設定でソースファイルが必要になるので、もし無いなら
[ここ](https://www.rust-lang.org/downloads.html)からダウンロードしてきて、展開したものを適当な場所に置いておく。

Vimの設定に移って、2つのプラグインをインストールしておく。
まず保存したときに自動整形してほしいので

```
let g:rustfmt_autosave = 1
let g:rustfmt_command = '$HOME/.cargo/bin/rustfmt'
```

としてあげる。g:rustfmt_autosaveが0の場合は保存するときに自動整形しない。
g:rustfmt_commandはrustfmtの場所を指定。

racer用の設定は公式ページの通りだけど

```
set hidden
let g:racer_cmd = '$HOME/.cargo/bin/racer'
let $RUST_SRC_PATH="/usr/local/src/rustc-1.5.0/src"
```

こちらはracerの場所とさっきダウンロードしてきたソースコードの中のsrcディレクトリの場所を指定してあげる。

これらの設定をしておくとシンタックスハイライトがついたりコード補完が出来たりオートフォーマットができたりする。
ついでに:RustRunってやるとVimからプログラムを実行することができる。

他にももう少しできることはあるみたいだけど、これだけあれば勉強するには十分かなと。
gulpでwatchifyを使うと、require出来ないモジュールがある


下記のjs:bundleタスクでwatchifyでjsを監視するようにしてたのですが、どうにもうまくいかない。最初はうまく動いていたのに、突然taskが`Starting 'js:bundle'...`と表示されてからFinishedにならずにbundle.jsが吐出されなくなりました。watchifyはbrowserifyのラッパーなので、browserifyでも同じ症状が出るかもしれません。

reuiqreの記述を外していく、どうやらhandlebarsだけ読み込めていなかったようです。jqueryとbootstrapだけだとbundleができます。ただ、一つ謎なのがhandlebars.jsではなくhandlebars.min.jsを置いて、`require 'handlebars.min'`とすると何故かbundleできます。

そこでwatchifyでエラーログを出すようにして、再度トライ。

```coffeescript
# src.~ ,destPathにはパスの文字列が入っている

gulp.task 'js:bundle', ->
  bundler = watchify browserify(cache: {}, packageCache: {})
  bundler.add(src.js + '/app.js')
  bundle = ->
    bundler.bundle()
      .on 'error', (err) ->
        console.log err.message
        @.emit 'end'
      .pipe source('bundle.js')
      .pipe buffer()
      .pipe $.uglify()
      .pipe $.rename 'app.min.js'
      .pipe gulp.dest(destPath + '/js/')
  bundler.on 'update', bundle
  bundle()
```

```shell-session
$ gulp js:bundle
[02:22:53] Requiring external module coffee-script/register
[02:22:54] Using gulpfile ~/repo/table_generetor_2/gulpfile.coffee
[02:22:54] Starting 'js:bundle'...
Cannot find module 'source-map' from '/Users/mitsuru/repo/table_generetor_2/src/js'
[02:22:54] Finished 'js:bundle' after 644 ms
```

source-mapというモジュールが見つからないと出るので`npm install --save-dev source-map`を叩いて、gulpfileは何もいじらずに再度タスクを走らせると今度はbundle出来ました。圧縮版の.min.jsならsrouce-mapがいらないとはどういうことだろう？

ちなみに下記のようにerrorのイベントハンドラの記述場所を変えたらエラーが出なくなりました。どうやらbundle()の直後に記述しないといけないようです。

```coffeescript
gulp.task 'js:bundle', ->
  bundler = watchify browserify(cache: {}, packageCache: {})
  bundler.add(src.js + '/app.js')
  bundle = ->
    bundler.bundle()
      .pipe source('bundle.js')
      .pipe buffer()
      .pipe $.uglify()
      .pipe $.rename 'app.min.js'
      .pipe gulp.dest(destPath + '/js/')
  bundler.on 'update', bundle
  bundler.on 'error', (err) ->
        console.log err.message
        @.emit 'end'
  bundle()
```
【備忘録】ffmpegを利用した動画ファイルフォーマット変換

Macで、動画のファイルフォーマットをmp4へ変換するコマンドラインツールffmpegの簡単な紹介です。

## ffmpegのインストール

ffmpegのインストールですが、手軽な方法はhomebrewを利用することだと思います。

```
brew install ffmpeg
```

## ffmpegの基本的な使い方

ffmpegの基本な使い方は、

```
ffmpeg -i 元動画ファイル　[オプション] 変換後動画ファイル
```

です。オプションを何もつけない場合、動画、音声ともデフォルトのパラメータが適用され、変換後動画ファイルの拡張子から決まる形式で保存されます。
例えば、

```
ffmpeg -i source.avi dest.mp4
ffmpeg -i source.mp4 dest.wmv
```

といった感じです。

この方法で、動画ファイルをmp4フォーマットに変換すると、MacのQuickTimeでは開くことができません。MacのQuickTimeでも開くことので出来るmp4ファイルとするためには、"-pix_fmt yuv420p"などのオプションをつけて変換する必要があります。例えば、

```
ffmpeg -i source.avi -pix_fmt yuv420p dest.mp4
```

とします。これで、MacのQuickTimeでも再生することのできるmp4ファイルが生成されます。

* -pix_fmtに関しては、http://qiita.com/NaokiOgawa/items/ce94e972992b63b87043
を参考にしました。

ところで、ffmpegでは、連番の静止画像（pngファイルなど）から動画ファイルを生成することも出来ます。例えば、
```
ffmpeg -i sample%03d.png -pix_fmt yuv420p dest.mp4
```
とします。この場合は、元となる静止画ファイルはsample001.png、sample002.pngなどの連番ファイルとなっており、dest.mp4という動画ファイルが出力されます。

*  連番ファイルからの動画ファイルの作成に関しては、
http://qiita.com/riocampos/items/2f4fe927b5cf99aff767
で、詳しく紹介されています。
gulpのmain-bower-filesでbootstrapが認識されずに抽出できない


bowerでbootstrapをインストールして、main-bower-filesで抽出しようとしたのですが認識されませんでした。他のライブラリは抽出されて、エラーも出ないので原因がわからず。

調べてみるとgulpfileには問題はなく、bowerでインストールの仕方でした。どうやら、main-bower-filesはdevDependenciesは読み込まないそうです。なのでbower.jsonからdevDependenciesを削除して`bower install --save bootstrap`で再インストールしたら抽出に成功しました。`--save-dev`をつけるのが間違いだったようです。
CoffeeScriptでクラスを作り、コンパイル後のjsファイルを読み解く


CoffeeScriptで手続き的に記述していたプログラムを抽象的にするために、いくつか関数化を試みていました。ですが、関数名に悩むのでクラスにすることに。けど、JavaScriptでのクラスも経験が全然ないので、CoffeeScriptをコンパイルしてできたjsファイルを読み込んでみました。とりあえず、これだけわかれば作業には取り掛かれます。

```coffeescript
class Person
```

コンパイルすると次のとおりになります。

```js
(function() {
  var Person;

  Person = (function() {
    function Person() {}

    return Person;

  })();

}).call(this);
```

### 全体を覆う無名関数

全体を無名関数で囲っています。これは何をしているのでしょうか？

```js
(function() {
}).call(this);
```

次のコードを実行するとWindowと表示されます。無名関数の外でthisを表示してもWindowと表示されます。無名関数にcallを使うことによって、無名関数の中のthisをグローバルオブジェクトと結びつけているのです。もしグローバルオブジェクトがWindowじゃない場合にも対応できます。もしくはグローバルオブジェクトではなく、また何かの関数の中で使われるかもしれませんね。

```js
console.log(this);
(function() {
  console.log(this);
}).call(this);

// ->
// Window {top: Window,…}
// Window {top: Window,…}
```

上記はcallの使う目的についてでした。では、無名関数自体は何に使われているのでしょうか？その答えは次のコードでわかります。

```js
var hoge = 'outer_hoge';
(function() {
  var hoge = 'inner_hoge';
}).call(this);
console.log(hoge);

// -> outer_hoge
```

JavaScriptは関数によって新しい内側のスコープが作成されます。なので無名関数の外と中では同じ変数名でも別々のを指すわけです。ただし、これは無名関数で最初に変数を使う際にvarが必須です。varがないと変数の宣言にならずに外側のスコープを見に行きます。（厳密にはローカルスコープの宣言にはならないがグローバルスコープの宣言にはなる。）

全体を無名関数でラッピングすることによって、ライブラリを作ったり、複数人で作業する際にお互いが同じ変数名を使っていないか気にする必要がなくなるということです。隠蔽するわけですね。

### classには即時実行関数が使われる

```coffeescript
class Person
  name = "taro"
  console.log "innser Person class"
```

classを使うと即時実行関数がクラス名の変数に代入されています。この関数はクラス名の関数オブジェクトを返すのですが、一緒にnameとconsole.logというのは変数Personには格納されません。しかし、実行はされます。これを利用することでクラス読込時に準備の処理を実行させることができます。他にも色々な応用があるでしょう。

```js
(function() {
  var Person;

  Person = (function() {
    var name;

    function Person() {}

    name = "taro";

    console.log("innser Person class");

    return Person;

  })();

}).call(this);
```

### thisを表す@

```coffeescript
class Person
  name = "taro"
  @age = 17

  constructor: (sex)->
    @sex = sex
```

CoffeeScriptではthisは@と書くことが出来ます。`@age`は`this.age`と同じです。constructorの中で使うとインスタンス変数。外で使うとクラス変数として扱われます。

```js
(function() {
  var Person;

  Person = (function() {
    var name;

    name = "taro";

    Person.age = 17;

    function Person(sex) {
      this.sex = sex;
    }

    return Person;

  })();

}).call(this);
```