OmniAICreator/Qiita-1.07M huggingface dataset:
whileのループ中にmilkcocoaでpushが効かなかった問題

先日、[myThings + milkcocoaで高齢者見守りデバイスを作ってみたという記事](http://qiita.com/takuya-andou/items/d7a8659d55da7c0070ba)を投稿したのですが
その過程で、**扉の開閉をチェックしつつmilkcocoaを使ってデータを送信する部分がうまく動かなくて困った**ので、問題と解決案をメモしておきます。

#問題があったプログラム
問題があったのはwhile(1)の中で特定の条件（今回は扉の開閉というイベント）があった時にpushするプログラムです。

プログラムの内容としてはシンプルで、扉の状態を[リードスイッチ](http://www.suzushoweb.com/pdf_file/47edee2639842.pdf)の値によって判断し、状態に変化があった時にデータを送信するというものです。

```js:ng_open_sensor.js
var fs = require('fs');

var MilkCocoa = require('milkcocoa');
var milkcocoa = new MilkCocoa('*********.mlkcca.com');
var ds = milkcocoa.dataStore('door');

fs.writeFileSync('/sys/class/gpio/export', 21);
fs.writeFileSync('/sys/class/gpio/gpio21/direction', 'in');

var value = 0;
var pre_value = 0;
while( 1 ) {
    value = fs.readFileSync('/sys/class/gpio/gpio21/value', 'ascii');

    if ( value != pre_value  ) {
        console.log(value);
        if (value == 1) {
                ds.push({DoorOpenFlag:'1'});
                pre_value = 1;
        }
        else{
                ds.push({DoorOpenFlag:'0'});
                pre_value = 0;
        };
    }
}
```

今回はこのwhileの中で**pushが行われず、エラーも出ない**という状態でした。
（ドキュメントには120回/分までの制限があると書いてありますが、今回は一つもデータが送信されないという状態になっていました。）

予想される原因としては、whileのループが早すぎてjsの処理のタイミングや通信のタイミングあたりが追いついてないとか…？
普段jsを触らないのでよくわかりませんでした。
#解決案
milkcocoaを提供している[株式会社Technical Rockstars](http://www.technicalrockstars.co.jp/)の方に相談した結果、最終的な解決案としては下記のようになりました。

根本的な原因の究明には至っていませんが、データ送信後に待機時間を置くことでなんとか送信がうまくできました。

```js:ok_open_sensor.js
var fs = require('fs');

var MilkCocoa = require('milkcocoa');
var milkcocoa = new MilkCocoa('*******.mlkcca.com');
var ds = milkcocoa.dataStore('door');

fs.writeFileSync('/sys/class/gpio/export', 21);
fs.writeFileSync('/sys/class/gpio/gpio21/direction', 'in');

var pre_value = 1;
loop();
function loop() {
    var value = parseInt(fs.readFileSync('/sys/class/gpio/gpio21/value', 'ascii'));
    if ( value != pre_value  ) {
        console.log(value);
        ds.push({DoorOpenFlag:value});
        pre_value = value;
    }
     setTimeout(loop, 1000/10);
}
```
AtomにTerm2じゃなくてTerm3を入れてみた話


##はじめに
Atomでターミナル画面を使いたいからTerm2を入れよう→エラーでインストール出来ない!!
色々調べてもインストール出来なく、諦めかけてた時に
Term2は開発が止まってるからTerm3を入れるといいよ！という話を見つけたので早速入れてみました。
使えそうだったのでTerm2が導入できずにモヤモヤされていた方、ぜひどうぞ！

##インストール

まずはターミナルで以下コマンドを入力してインストール。

```
$apm install term3
```

そしてpackageメニューから表示するようにすれば・・・おお！ターミナル画面が出た！
![スクリーンショット 2015-12-11 8.58.24.png](https://qiita-image-store.s3.amazonaws.com/0/58546/639bc03c-4fa0-0cb1-90ff-ee48be40f7d0.png "スクリーンショット 2015-12-11 8.58.24.png")

##キーバインド
|キーバインド|内容|
|:--:|:--:|
|ctrl+alt+t| 現在のペインに新しいタブでTerm起動|
|ctrl+alt+right(→キー)|現在のペインを左右分割した右側にTerm起動|
|ctrl+alt+left(←キー)|現在のペインを左右分割した左側にTerm起動|
|ctrl+alt+up(↑キー)|現在のペインを上下分割した上側にTerm起動|
|ctrl+alt+down(↓キー)|	現在のペインを上下分割した下側にTerm起動|



##使ってみる
起動直後は通常のTerminalと同じくホームディレクトリになってるようです。
![スクリーンショット 2015-12-11 9.04.38.png](https://qiita-image-store.s3.amazonaws.com/0/58546/0267cf4c-ba6d-7d8d-3d68-0a8ccd9ba8da.png "スクリーンショット 2015-12-11 9.04.38.png")

rails db.taでDBの確認
![スクリーンショット 2015-12-11 10.18.16.png](https://qiita-image-store.s3.amazonaws.com/0/58546/0ae78bcd-9471-7803-08a5-1c616c791f85.png "スクリーンショット 2015-12-11 10.18.16.png")


基本的にターミナルと同じ感覚で使えますが、一部動作が怪しい物もあります。
僕の環境だとVimの動作が怪しいです。(Vimのプラグインや設定に左右されるかも知れませんが)
ちなみにVimを使った後はターミナルの挙動が不安定になるのでVimを使いたいときはItermから起動するようにしています。
![test.gif](https://qiita-image-store.s3.amazonaws.com/0/58546/dc2c550a-9980-e494-683a-02cc1236a70e.gif "test.gif")


##発生したトラブルと解決方法
###command not foundになる
何回か使ってたら・・command not foundが表示されるようになりました。
iTermやTerminalだと大丈夫なんだけど・・・！？
![スクリーンショット 2015-12-11 9.32.36.png](https://qiita-image-store.s3.amazonaws.com/0/58546/c719c901-b83c-91ed-2667-68350da1fdd5.png "スクリーンショット 2015-12-11 9.32.36.png")

Term3のReadMeを読むと、Command not found発生時解決方法があったのでやってみました。

####1.~/.bashrcに以下の内容を追加する(zshを使ってる方は~/.zshrc)

```bashrc
export PATH=$(cat /etc/paths | xargs | tr " " :)
# or just hardcode your path like this
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
```


####2.ターミナル起動時にログインするようにする
Term3の環境設定のAuto Run Commandで以下を入力します。

```
login -f ユーザー名
```

ユーザー名はPCのユーザー名です。
(MacOSXならターミナルで$whoamiを入力すればユーザー名がわかります)

これで解決!。
![スクリーンショット 2015-12-11 11.00.55.png](https://qiita-image-store.s3.amazonaws.com/0/58546/906b8507-e984-4b8e-e29e-5744ea23c5b1.png "スクリーンショット 2015-12-11 11.00.55.png")





##まとめ
データベースの確認, Railsのgenerateを使ったモデルやコントロール作成に使う分には問題なさそうです。
これでいちいちAtom→Itermを切り替える必要がなくなりました！
ATOMおすすめパッケージ 2015年末版

この記事は[ATOM-editor Advent Calendar 2015](http://qiita.com/advent-calendar/2015/king_of_editors_atom)の11日目の記事です。
今回は自分が普段使ってるパッケージとかをご紹介します。
Webフロントの人間なので、偏りがあるかもしれませんがあしからず。


## 入れとかないと仕事捗らない系
- [emmet](https://atom.io/packages/emmet)
これ使ったらemmetなしではコード書けない

- [color-picker](https://atom.io/packages/color-picker)
文字通り、カラーピッカー
色の指定とか楽になる

- [pigments](https://atom.io/packages/pigments)
(主にCSSで使うと思うけど)カラーコードから色を読み取ってそれを表示してくれる。
いちいちカラーコードを調べなくてもいいのが嬉しい。
![color-picker.gif](https://qiita-image-store.s3.amazonaws.com/0/30448/e97dd367-26b1-74eb-572e-8b2b0d27720d.gif "color-picker.gif")


- autocomplete
- autocomplete-plus
- autocomplete-snippets
- [autocomplete-***](https://atom.io/packages/search?q=autocomplete)
autocompleteシリーズ。予測変換を出してくれる優秀なpackage。
![autocomplate-plus.gif](https://qiita-image-store.s3.amazonaws.com/0/30448/c8120104-1d97-d12d-4e63-4909d8da6cb0.gif "autocomplate-plus.gif")


## 入れといて損はない系
- [atom-beautify](https://atom.io/packages/atom-beautify)
よくあるインデントとか綺麗にしてくれるpackage。
言語ごとに細かい設定ができるのが嬉しい。
![atom-beautify.gif](https://qiita-image-store.s3.amazonaws.com/0/30448/11a50fff-f711-1c6a-9255-287a9a919b8f.gif "atom-beautify.gif")

- [file-icons](https://atom.io/packages/file-icons)
TreeViewのアイコンを変えてくれるpackage。
他にも色々ある。
![スクリーンショット 2015-12-10 14.07.36.png](https://qiita-image-store.s3.amazonaws.com/0/30448/8c6e5c9d-5d48-3e5d-4d6f-cfd845a17b56.png "スクリーンショット 2015-12-10 14.07.36.png")

- [git-puls](https://atom.io/packages/git-plus)
Atomからgitコマンドが叩ける優れもの。
![git-puls.gif](https://qiita-image-store.s3.amazonaws.com/0/30448/2e32fb16-6fab-9153-a7a8-0ed1f37565d0.gif "git-puls.gif")


- [merge-conflicts](https://atom.io/packages/merge-conflicts)
conflictしたところがわかりやすく表示されるだけでなく、その場で解決できてしまう優れもの

- [minimap](https://atom.io/packages/minimap)
他のエディタではよくある右側にコード全体の位置がわかるマップが出る。

## お好みで入れる系
- [language-***](https://atom.io/packages/search?utf8=%E2%9C%93&q=language)
Atomをインストールしただけだと、サポートされていない言語をインストールする。
***のところにお好きな言語名を入れるとだいたい出る。

- [angularjs](https://atom.io/packages/angularjs)
angularjsを使ってる人は是非入れておいて欲しいpackage。
angularjsで使うもののスニペットを追加してくれるので、捗る。

- [vim-mode](https://atom.io/packages/vim-mode)
vim好きの人は入れると良いと思います。
Atomをvimのキーバインドで動くようにしてくれる。

## おまけ　テーマとか面白いやつとか紹介
- [atom-material-ui](https://atom.io/themes/atom-material-ui)
AtomがMaterialUIにかわる。普段はこれ使ってます。

- [slack-ui](https://atom.io/themes/slack-ui)
Slack好きな人はいいかも。

- [activete-power-mode](https://atom.io/packages/activate-power-mode)
別日でも紹介されてたやつ。かっこ良くなる。
ただし、重くなる

- [editor-background](https://atom.io/packages/editor-background)
エディタの背景に画像とかを簡単に設定できるようになるやつ。
簡単に痛エディタを作れるけど、重くなる。
Youtubeの動画とかも引っ張ってこれる。

## まとめ
これ以外にも便利なやつだったり、面白いものはたくさんあるので、
色々使ってみて自分ごのみにカスタマイズしましょう！
IntelliJで実行可能なjarファイルをmavenプロジェクトで作る

# 概要
普段作る事の無いjarファイルをIntelliJから作る機会があり、すこしはまったのでログとして残しておきます。
※尚、僕のIntelliJはver15です。

## プロジェクトの作成
File > New > Project で New Project のウィンドウを出して、Mavenを指定してプロジェクトを作ります。

## ソースの記述
適当にソースを記述します。
src/main/java配下にとりあえず以下のようなクラスを作りました。
 
```
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("HelloWorld");
    }
}

```
また、ここで念のため実行して問題が無い事を確認しておきます。

## maven-assembly-pluginでjarファイルを作成出来るようにする

```
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>testjar</groupId>
    <artifactId>testjar</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- ここから -->
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <!-- mainクラスを指定する -->
                            <mainClass>HelloWorld</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <!-- ここまでコピペ -->
</project>
```

## mvn package
Maven Projects > ${yourprojectname} > Lifecycle > package の実行

実行後プロジェクトルートのtarget配下にjarファイルが作成されている事が確認出来ます。
考察 > 関数名の省略と正式表記記載



## 最近のスタイル

```test.cpp
int serIdx = 3;
int itmIdx = getItemIndex(serIdx);
...

XGT_axisProp_t *axsProp;
int majTck= axsProp.majorTickIncrement;
```

```xxxGraphType.h
typedef struct tag_XGT_axisProp  // 縦軸の設定
{
	bool visible;
	float minimumValue;
	float maximumValue;
	float majorTickIncrement; // 例: 0.05
	float minorTickIncrement; // 例: 0.01
	int numDecimalDigit; // 小数点の桁数
} XGT_axisProp_t;
```

最近のコーディングのスタイル。

- スコープの狭いものは省略形を使っていい (ローカル変数、関数の引数変数など)
- スコープの広いものは略語を極力使わない (クラスメンバ変数、構造体メンバ変数など)
- 関数名は略語を極力使わない > 例: getItemIndex()

このような書き方の意識をし始めたのは、2011年10月に以下を読んだ時。

http://0-9.tumblr.com/post/11440050289/javascript-code-format
> ・変数名の長さはスコープの長さに比例させる
変数名はその変数がどの位の範囲から参照されるかによって名前の長さを決める。
変数の参照される範囲が狭いのであれば変数名も短く、範囲が広いのであれば変数名は長くする。

## 利点

- 変数名を見たときに、スコープの広さがわかる
  - その変数関連の処理の広さがわかる
- 検索時に、狭いスコープと広いスコープを分けて検索できる。
  - 狭いスコープ : majTckで検索
  - 広いスコープ : majorTickIncrementで検索

itmIdxという略語定義の説明は関数名(getItemIndex())を見たときにすぐにわかる。itmIdxの使用範囲は1画面に収まるので、意味を知りたかったら関数からの代入を見たらすむ。

```
int itmIdx = getItemIndex(serIdx);
```
Ghostをカスタマイズしたい男たち

# オラ、少しカスタマイズしたくなったぞ

## デフォルトテンプレートをコピー
インストール直後はCasperというテンプレートあるので複製します。

```
$ cp -R content/themes/casper content/themes/custom
```
再起動すると複製したテンプレートが選択できるようになります。

基本的には、`screen.css` `defaults.hbs` `index.hbs` `post.hbs`あたりを編集すればよいです。  
`index.hbs``post.hbs`のふたつのファイルは必須とのことです。

## 日付の表示フォーマットを変更

```
{{date published_at format="YYYY年M月D日"}}
{{date published_at timeago="true"}}
```
Mechanizeでgetする時にhttp://を省略してはまった件

とあるサイトをスクレイピングしようとしてはまった。

単純にhttp://を省略するとエラーが発生する。

```irb
irb(main):004:0> require 'mechanize'
irb(main):005:0> agent = Mechanize.new
irb(main):006:0> p agent.get('google.co.jp')
ArgumentError: absolute URL needed (not google.co.jp)
        from /home/hogeuser/.rbenv/versions/2.2.0-rc1/lib/ruby/gems/2.2.0/gems/mechanize-2.7.3/lib/mechanize/http/agent.rb:651:in `resolve'
        from /home/hogeuser/.rbenv/versions/2.2.0-rc1/lib/ruby/gems/2.2.0/gems/mechanize-2.7.3/lib/mechanize/http/agent.rb:223:in `fetch'
        from /home/hogeuser/.rbenv/versions/2.2.0-rc1/lib/ruby/gems/2.2.0/gems/mechanize-2.7.3/lib/mechanize.rb:440:in `get'
        from (irb):6
        from /home/hogeuser/.rbenv/versions/2.2.0-rc1/bin/irb:11:in `<main>'
```

しかし、既に他のサイトをgetしていた場合、Mechanizeは相対パスを自動で補完しようとする。

```irb
irb(main):013:0> p agent.get('http://google.co.jp').uri
#<URI::HTTP http://www.google.co.jp/>
irb(main):014:0> p agent.get('google.co.jp').uri
Mechanize::ResponseCodeError: 404 => Net::HTTPNotFound for http://www.google.co.jp/google.co.jp -- unhandled response
        from /home/hogeuser/.rbenv/versions/2.2.0-rc1/lib/ruby/gems/2.2.0/gems/mechanize-2.7.3/lib/mechanize/http/agent.rb:308:in `fetch'
        from /home/hogeuser/.rbenv/versions/2.2.0-rc1/lib/ruby/gems/2.2.0/gems/mechanize-2.7.3/lib/mechanize.rb:440:in `get'
        from (irb):14
        from /home/hogeuser/.rbenv/versions/2.2.0-rc1/bin/irb:11:in `<main>'
```

この場合、
http://www.google.co.jp/google.co.jp
をgetしようとして404や403エラーになる。
livedoor Blogの脆弱性ではなかった話

[脆弱性&quot;&amp;&#39;&lt;&lt;&gt;\ Advent Calendar 2015](http://www.adventar.org/calendars/811) 11日目の記事です。

[livedoor Blog](http://blog.livedoor.com/)のブログ記事は「HTMLタグ編集」でスクリプトを書くことができる。例えば、`<script>alert(location)</script>`と書けば[alertが出る](http://kusano-k.blog.jp/archives/1047222111.html)し、`<script>location.href="calculator:"</script>`と書けば[電卓が起動する](http://kusano-k.blog.jp/archives/1047222195.html)。

<a target="_blank" href="https://qiita-image-store.s3.amazonaws.com/0/25276/3332716c-35da-bd2d-ad02-8509248ec11a.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/25276/3332716c-35da-bd2d-ad02-8509248ec11a.png" width="320"></a> <a target="_blank" href="https://qiita-image-store.s3.amazonaws.com/0/25276/45d14cf9-8aea-e021-7004-04a3875462ee.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/25276/45d14cf9-8aea-e021-7004-04a3875462ee.png" width="320"></a>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">ちなみに location.href=&quot;calculator:&quot;; でEdgeから電卓たちあがるので、XSS見つけるだけでこれからは電卓立ち上げられますね！</p>&mdash; Yosuke HASEGAWA (@hasegawayosuke) <a href="https://twitter.com/hasegawayosuke/status/636539871855665152">2015, 8月 26</a></blockquote>

ChromeでもIEでも電卓が立ち上がった。

これが脆弱性になるかというと、そんなことはない。livedoor Blogはユーザー別にサブドメインを作るようになっていて、livedoorのその他のサイトとは別になっているから。kusano-k.blog.jpでいくらスクリプトを動かしても、livedoor.comのセッション情報を盗んだりすることはできない。

ここで、livedoor Blogの設定画面を見てみると、サブドメインを使用する以外に、標準設定としてblog.livedoor.jpを選択することができた。さらに、標準設定を使用した場合でも、記事中のスクリプトがそのまま動いたので、脆弱性として報告した。

<a target="_blank" href="https://qiita-image-store.s3.amazonaws.com/0/25276/0c6a6697-14b6-46ac-3300-fe09fd8cba38.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/25276/0c6a6697-14b6-46ac-3300-fe09fd8cba38.png" width="480"></a>

そして、脆弱性ではないという返信があった。良く見ると、livedoorのサイトは、livedoor **.com** で、ブログの標準設定のURLは、blog.livedoor **.jp** だった。申し訳ありませんでした。
JenkinsのジョブをCLIからキックする(パラメータも渡してキック)。

##1. `This build is parameterized`にチェック入れる
![jenkins_kickwithparam.png](https://qiita-image-store.s3.amazonaws.com/0/98671/c8e85773-84ac-ac2e-e261-d5fd7db32e5e.png)

ここではStringタイプのパラメータを指定した。
`NAME`にパラメータ名を指定する。

##2. CLIからパラメータに値を渡してキック

```bash
curl http://<fqdn:port(任意)>/job/<job名>/buildWithParameters?SAMPLEPARAM=hoge

```

これで`SAMPLEPARAM`に`hoge`という値が渡り、Jenkinsのスクリプトで`${SAMPLEPARAM}`と書けばhogeを取り出すことが出来る。
Linux版VMWareのアンインストールが分かりづらかった

## アンインストール方法

```bash:プロダクト一覧表示
$ sudo ./VMware-Player-12.1.0-3272444.x86_64.bundle -l    
Extracting VMware Installer...done.
Product Name         Product Version     
==================== ====================
vmware-player        12.1.0.3272444
```

```bash:アンインストール実施
$ sudo ./VMware-Player-12.1.0-3272444.x86_64.bundle --uninstall-component=vmware-player
Extracting VMware Installer...done.
```

* `vmware-workstation`の場合もあり。

## help

```bash:help
$ sudo ./VMware-Player-12.1.0-3272444.x86_64.bundle --help
Extracting VMware Installer...done.
Usage: vmware-installer [options]

VMware Installer

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit

  Manage:
    Install or uninstall products

    -i FILE, --install-bundle=FILE
                        Install bundle from FILE
    --install-component=FILE
                        Install a component
    --uninstall-component=NAME
                        Force uninstallation of a component
    -u NAME, --uninstall-product=NAME
                        Uninstall a product
    -r, --resolve-system
                        Force the system to resolve the current state
    --register-file=COMPONENT_NAME (config|regular) FILE
                        Register a file in the database
    -x DIR, --extract=DIR
                        Extract the contents of the bundle into DIR
    -p DIR, --prefix=DIR
                        Set a custom install location

  Information:
    Look up information on installed products

    -l, --list-products
                        List installed products
    -t, --list-components
                        List the installed components
    -L COMPONENT, --list-files=COMPONENT
                        List files for a given component
    -S FILE, --find-file=FILE
                        List components and files matching the given pattern

  Settings:
    Set and retrieve settings

    -g COMPONENT KEY, --get-setting=COMPONENT KEY
                        Get setting
    -s COMPONENT KEY VALUE, --set-setting=COMPONENT KEY VALUE
                        Set setting
    -d COMPONENT KEY, --delete-setting=COMPONENT KEY
                        Delete setting

  Options:
    --gtk               Use the Gtk+ UI (Default)
    --console           Use the console UI
    --custom            Allow customization of the install, including file
                        locations.
    --regular           Displays questions that have no good defaults
                        (Default)
    --required          Displays only questions absolutely required
    -I, --ignore-errors
                        Ignore component script errors
    --eulas-agreed      Agree to the EULA
```
BEMを最短で書くためのMixin

BEMするの大変ですよね〜。

Jadeでこんな感じに書くと、

```jade:Jade
include jade-de-bem

+div(class="block --special")
  +ul(class="__items div")
    +li(class="__item --new div")
      +a(class="__link span")
        | Foo
```

こう変換される、

```html:HTML
<div class="block block--special">
  <ul class="block__items div">
    <li class="block__item block__item--new div">
      <a class="block__link span">Foo
      </a>
    </li>
  </ul>
</div>
```

Mixinを作りました。

```jade:Jade
mixin bem(boo)

  -
    var config = {}
    config.element  = '__'
    config.modifier = '--'

    function converted(str) {
      arr = str.split('')
      res = arr.join('\\')
      res = '^' + res
      return res
    }

    var elmExamStr = converted(config.element)
    var modExamStr = converted(config.modifier)

    var elmExam = new RegExp(elmExamStr)
    var modExam = new RegExp(modExamStr)

    var tag = attributes.tag ? attributes.tag : false
    var cls = attributes.class ? attributes.class + '' : ''

    attributes.tag = null
    attributes.class = ''

    bem = bem || []
    var elm = ''
    var mod = []
    var els = []
    var res = []
    var str = ''

    function hasLength(str) {
      return (str.length)
    }

    var names = cls.split(' ')
    names = names.filter(hasLength)

    for (var i=0; i<names.length; i++)
      if (elmExam.test(names[i]))
        elm = names[i]
      else if (modExam.test(names[i]))
        mod.push(names[i])
      else if (i === 0)
        bem.push(names[i])
      else
        els.push(names[i])

    if (boo === false)
      bem.pop()

    var len = bem.length - 1

    if (elm.length)
      res.push(bem[len] + elm)
    else
      res.push(bem[len])

    for (var i=0; i<mod.length; i++)
      if (elm.length)
        res.push(bem[len] + elm + mod[i])
      else
        res.push(bem[len] + mod[i])

    for (var i=0; i<els.length; i++)
      res.push(els[i])

    str = res.join(' ')
    attributes.class = str

  if (tag && boo !== false)
    #{tag}&attributes(attributes)
      block

  if (boo === true)
    block
```

https://github.com/internets-inc/jade-de-bem

Enjoy BEM Life!
CakePHP3のバリデーションは2度動く！

# CakePHP3のバリデーションは2度動く！

CakePHP2の時は `save` でバリデーションが実行されてましたね。  
もちろんCakePHP3でも `save` でバリデーションが実行されますが、
2種類のバリデーション実行タイミングがあります。

## どこで実行されるの？

1個目が以下のように `newEntity` と `patchEntity` にPOST値等のデータを与えて `Entity` を作ったタイミングでバリデーションが実行されます。

```
$entity = $table->newEntity($data);
$patchEntity = $table->patchEntity($entity, $data);
```

注意するポイントとしては、バリデーションに引っかかった項目は 戻り値の `Entityに反映されません` 

### バリデーションの記述場所

```
// src/Model/Table/HogeTable.php

// ここにEntity作成時のバリデーションを記述します。
public function validationDefault(Validator $validator)
{
    $validator
        ->add('id', 'valid', ['rule' => 'numeric'])
        ->allowEmpty('id', 'create');

    $validator
        ->allowEmpty('title');
}

```

### バリデーションに引っかかったかのチェック

以下のように `Entityのerrors` メソッドを実行することでエラーの一覧を取得できます  
※手動で実行しなくても、`save` 実行時に自動的に実行されます。

```
$entity = $table->newEntity($data);
$entity->errors();

    or 

$table->save($entity);  // <-- return false

```

## save時のバリデーションはどこに記述すればいいの？

以下のように `buildRules` にsave時のバリデーションを記述します。

```
// src/Model/Table/HogeTable.php

public function buildRules(RulesChecker $rules)
{
    // タイトルにテストという文字を許可しない
    $rules->add(function ($entity, $options) {
        if ($entity->title != 'テスト') {
            return true;
        } else {
            return false;
        }
    }, 'test', [
        'errorField' => 'title',
        'message' => '「テスト」は登録することが出来ません'
    ]);

    // HogeTableクラス内のcheckStatusメソッドを実行
    $rules->add([$this, 'checkStatus'], 'status', [
        'errorField' => 'status',
        'message' => 'ステータスが有効ではありません'
    ]);
}
```

### バリデーションに引っかかったかのチェック

バリデーションに引っかかった場合は、`save` メソッドがfalseを返します。  
バリデーションエラーの中身を確認したい場合は、 Entity作成時と同じ `Entityのerrors` を使用します。  

## まとめ

- POST入力値等の入力値チェックは `validationDefault` に記述する
- saveの入力値チェック(Entityチェック)は `buildRules` に記述する  
　  
CSVアップロードからのデータ登録のような状況であれば
 - `validationDefault` でCSVファイルのフォーマットチェック
 - `buildRules` でCSVから読み込ん文字列のバリデーション

というように明示的にバリデーションを切り分けることが出来るのでうまく使えば可読性を高めることが可能になります！
Lambda Scheduled Event + Goで GlobalIP監視

この投稿は [今年もやるよ！AWS Lambda縛り Advent Calendar 2015](http://qiita.com/advent-calendar/2015/lambda#day-3) の 11日目の記事です。
# LambdaがScheduled Eventに対応したので使ってみたい
だがしかし、

- 運用しているアプリがrubyなのでcronサーバーの代替としては辛い
- 何か色々と制限があるみたいよ [AWS Lambda のココが惜しい](http://blog.takus.me/2015/12/07/requests-for-aws-lambda/)

という事で、何か使い道が無いかなと考えていましたがGoでGlobalIP監視するには丁度使い勝手が良いのではと思い試してみました。

## GoならLinux用にコンパイルすればLambdaで動く
Amazon Linuxで動くようにコンパイルしてあげれば問題ない。kickするnode.jsとまとめてzipにしてlambdaにアップロードすれば完了。
参考) http://blog.0x82.com/2014/11/24/aws-lambda-functions-in-go/

## 以前、Goでhttp監視scriptを書いていた
前にこんな感じのhttp監視を作っていた。
[golangでhttpを監視するscriptを書いて結果をslackにpostする](http://qiita.com/kenjiszk/items/7ae842415ec392822612)

## VPC対応してないなら逆にGlobalIP監視をさせれば良いのでは
普通の監視の場合には、VPC内のEC2やらRDSやらにアクセスしたいところだが、GlobalIP監視では逆に外からアクセスしたい。
<b>そう、逆に都合が良い。</b>

# ということで、現段階では自分にとってはGlobalIP監視としての利用が一番しっくり来たので試してみた

## http監視をGoで用意
殆ど以前書いたQiitaのものを用意。
https://github.com/kenjiszk/go-scripts

## Lambdaで動かしてみる。
Linux用にコンパイルして、kickするjsファイルとともにzipをアップロード。

slackにちゃんと通知してくれた！
(ちなみにこれは5分間隔でgoogleの存在しないURLを監視してみた結果)

![スクリーンショット 2015-12-10 1.00.59.png](https://qiita-image-store.s3.amazonaws.com/0/62421/eff19c7d-7ea2-3f84-cc1e-61ad30070d8e.png "スクリーンショット 2015-12-10 1.00.59.png")

## アクセス元のIPはしっかりGIP
自分のサーバーに向けてみたところしっかりとGIPの52.193.72.170でアクセスが来ていた。予定通り！

```
time:[09/Dec/2015:13:32:07 +0000]       forwardedfor:52.193.72.170      host:172.31.30.183      req:GET /aaa HTTP/1.1   status:404      size:22507      referer:-       ua:Go 1.1 package http  reqtime_microsec:220268 cache:- runtime:-       vhost:test.co.jp
```

# 良いところ
GlobalIP監視って実は結構面倒なところがある。

- 複数拠点もっているようなデカい会社なら良いけど、1拠点しか無い場合どこからグローバル監視叩けば良いのだ？
- VPCをそれ用に立ててそこから監視をたたくとか、結構コスト。しかもそのサーバーの死活監視ってどうするんだ？
- クラウドサービスでいくつか出来そうだけどその為だけに導入するのってどうなの？有料だと辛い

で、その点、Lambdaでやらせれば基本解決。

# まとめ
かなり簡単に動いた。
エンジニアじゃない人でもURLを追加出来るインターフェースがあるともっと便利(Script側の問題ですが)。
タグ > ２項演算 / 二項演算 > どちらがいいのか不明 > タグ付けのルール

二項演算関連の記事について、タグ付けしている例をみたが、日本語でつけるときに以下のどちらが今後検索しやすいか不明だ。

- 二項演算
- 2項演算

http://stackoverflow.com/tags
で「operator」で検索すると以下が出てきた。

- binary-operator

stackoverflowではワードの間を"-(ハイフン)"でつなぐ例をよく見る。こういうルールがある場合、タグ付けには迷わないですむし、検索時も見つけたいものがすぐに見つかる。

> タグに数字を含めるときは、半角のアラビア数字(1,2,3,4,5,6,7,8,9,0)にしてください

のようなルールがあってもいいように思う。
Elasticsearchのcluster（クラスター）環境をEC2で構築する


# 構築手順
（１）Elasticsearchの設定ファイル（elasticsearch.yml）に以下を追記

host1とhost2でcluster環境を構築する場合、両方の設定ファイルを編集する

~~~
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: [host1,host2]
~~~

3つ以上のノードでcluster環境を組む場合は、こう書く。

~~~
discovery.zen.ping.unicast.hosts: [host1,host2,host3]
~~~


（２） EC2のセキュリティグループを更新、port：9300を許可する
※ポート9300はcluster間の内部通信用のポート

（３）双方のElasticsearchを再起動する

# 注意点
- elasticsearchは片方ずつ再起動する、双方いっぺんに再起動すると起動のタイムラグでお互いにclusterを組むnodeを探せなくなるため。
- セキュリティグループでport:9300を許可したのちに再起動する必要がある


# 確認方法
片方のElasticsearchのデータを更新してみる。もう片方のデータも更新されることを確認し、cluster間のsyncを確認する。
Githubリポジトリへpush時にSSHキーが原因でエラー


![スクリーンショット_2015-12-11_7_52_21.png](https://qiita-image-store.s3.amazonaws.com/0/39382/d8585af8-e894-1b86-9ea3-35e3bc2fc242.png "スクリーンショット_2015-12-11_7_52_21.png")

新しくOrganizationを作成し、リポジトリを作成してからいつものようにQuick setupの通りにpushをした際にエラーが起きました。

```
# % git push -u origin master
ERROR: Sorry, but @hoge has blocked access to SSH keys created by some third-party applications. Your key was created before GitHub tracked keys created by applications, so we need your help.

If you personally created this key, you can approve it at:

  https://github.com/settings/ssh/audit/xxxxxxx/policy

Otherwise, please upload a new key:

  https://github.com/settings/ssh

Fingerprint: 

[EPOLICYKEYAGE]

fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

？？？と思いつつ、提示されている `https://github.com/settings/ssh/audit/xxxxxxx/policy` へアクセスしました。

![スクリーンショット_2015-12-11_7_51_14.png](https://qiita-image-store.s3.amazonaws.com/0/39382/2a0d3f44-cef8-142e-6070-b205f270467b.png "スクリーンショット_2015-12-11_7_51_14.png")

```
Please audit your SSH key
One of your organizations has blocked access for SSH keys created by untrusted third-party applications. If you created and imported this key yourself, you can approve it for access to your organization repositories. If you have any doubts about this key, you should delete it and upload a new one.

Get help verifying fingerprints.
```

```Google翻訳
あなたのSSHキーを監査してください
あなたの組織の一つは、信頼されていないサードパーティ製のアプリケーションで作成されたSSHキーへのアクセスをブロックしました。あなたがあなた自身を作成し、このキーをインポートした場合、あなたはあなたの組織のリポジトリへのアクセスのためにそれを承認することができます。 このキーに疑問を持っている場合、あなたはそれを削除しなければならない新しいものをアップロード。

指紋を検証する助けを得ます。
```

信頼性の無いSSHキーからのアクセスなので、ブロックしましたよとのこと。
一旦、Approveをクリックする。

![スクリーンショット 2015-12-11 7.59.23.png](https://qiita-image-store.s3.amazonaws.com/0/39382/ba0d0065-e115-96a8-9da1-dcff43182425.png "スクリーンショット 2015-12-11 7.59.23.png")

```
 Please audit your SSH keys
For your protection and to prevent unauthorized access we have disabled your public keys. Please approve or reject the keys listed below before continuing to your account.

Get help verifying fingerprints.
```

```Google翻訳
あなたのSSHキーを監査してください
不正アクセスを防止するために、あなたの保護とのために我々はしているあなたの公開鍵を無効に。あなたのアカウントに進む前に、以下に記載されているキーを承認または拒否してください。

指紋を検証する助けを得ます。
```

ザッと今までに登録したSSHキーの一覧が表示され、「他に認証するSSHキーはある？」と聞かれました。

先ほどのSSHキーしか使わない予定なので、とりあえずpushしてみる。

```
# % git push -u origin master                                                                                                                                                                                      
Counting objects: 9, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (9/9), 1.37 KiB | 0 bytes/s, done.
Total 9 (delta 0), reused 0 (delta 0)
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
```

出来ました！
ファイル一括検索・置換系の便利コマンド集


よく忘れるので備忘録として記録しておく。

[参考ページ](http://uguisu.skr.jp/Windows/find_xargs.html)

## サブディレクトリ以下の特定の拡張子からのみ全文検索する

### 例: *.rb から hoge を検索する

```bash
find ./ -type f -name "*.rb" -print0 | xargs -0 grep hoge
```

## サブディレクトリ以下の特定の拡張子を全て置換する

### 例: css -> scss に置換

```bash
find ./ -type f -name "*.css" -print0 | while read -r -d '' file; do mv "$file" "${file%.*}.scss"; done
```

# rsync 便利コマンド集

## サーバから特定日時以降のファイルのみ取得する

### 例: example.com から 2016-01-01 以降に更新されたファイルを全て取得する

```bash
rsync -aR -e ssh example.com:'`find /var/log/httpd -type f -newermt "2016-01-01 00:00:00"`' ./
```
誰も教えてくれなかった、会社員として知っておくべきバッドノウハウ

コミュニケーションアドベントカレンダー11日目の記事です。

会社員となり、職業プログラマとして生きていくためには、その世界でうまくやる術を身につけなければいけません。
コードを書いているだけで幸せな人でも、それ以外のことで無駄な時間を費やすことになったり、不必要なコミュニケーションに翻弄されることが多々あると思います。
それらを回避するための心構えをまとめてみました。

私個人が思っていることなので、偏った見方もあるかと思いますが、参考になれば幸いです。


## 提案を通すには、定性的よりも定量的な理由を伝えると通りやすい

特に金銭的な費用がかかる場合、コストに対するメリットは金額で表すと承認者も判断しやすくなります。
プログラマにとって自明と思うようなメリットもなかなか伝えるのに苦労したけど、金額に換算できるとあっさり通ったという経験は誰しもあると思います。

## 自分がやりたいこと、理想を言い続ける

『引き寄せの法則』は実際にあります。
やりたいことをいい続けていれば、プロジェクトの立ち上げで人選を行う際に、「そういえばAさんが○○をやりたいと言ってたな」とあなたの顔を思い出します。
やりたかった役割があなたに来る可能性が、言わない場合よりも確実に高くなるでしょう。

## 組織の悪口は言わない。悪口を言う人と付き合わない

ネガティブな言葉は伝染して、他の人のモチベーションを削いでしまいます。
組織に問題点があるというのなら、悪口を言って満足するのではなく、改善策を提案するようにしましょう。
それもできないくらい嫌な組織なら、辞めたほうがお互いのためなのでさっさと辞めましょう。

逆に、悪口を言い続けるような同僚がいたなら、その人のためにも注意してあげてください。
それが難しいなら、あなたが毒されないように、その人と距離を置くようにしましょう。

## 年配者の昔話は聞き流すのが良い

武勇伝など、内容は聞いても無駄なことが多いです。ただし、喋る側はとても楽しいもので、それを聞いてくれる若者が大好きなことが多いです。笑い話として飲み会では大いに笑ってあげましょう。そしてすぐ忘れましょう。大丈夫、言った側も覚えてません。
時折本当に役に立つ話もありますが、5%くらいですし、どうせ半年もすればまた同じ話を聞くことになります。

## あなたがいなくても、組織は回ります

「自分がいなくなったらプロジェクトが回らなくなる」と思うことはよくあるでしょう。
特に少人数のプロジェクトだと一人ひとりの責任が大きいので、そう思う傾向にあります。
しかし、本当にそうでしょうか？意外となんとかなるものです。
本当に苦しくなった時、気を使って無理をしてしまうと、心が壊れてしまう危険性があります。

* 同僚・お客様に迷惑がかかる
* この仕事は自分にしか出来ない

そう思って無理をし過ぎないようにしましょう。
実際に迷惑はかかりますが、自分を大切にしましょう。

## 辞める際に、不誠実な辞め方は止めましょう

たとえどんな理不尽な仕打ちをされても、誠意を持って辞めましょう。
今の時代、Facebookで何らかのつながりがあります。
あなたの不誠実が次の職場の耳に届く可能性は、結構あります。

辞めることが決まったら、できるだけ早く上長に伝えましょう。
あなたの知らないところで、あなたがいる前提で話が進んでいる可能性があります。
「もうちょっと早く言ってくれればよかったのに」と思うことはあっても、
「もうちょっと遅く言ってくれればよかったのに」と思うことはまずあり得ません。


----

などなど、思うことをつらつらと書いてみました。
コメントいただけると幸いです。
技術英語 > My children [occupy a significant portion of my thoughts], now more than ever. / What do you have in mind? / That chair was very sturdy [, or so I thought].

@ Star Trek Voyager > ELOGIUM

子供を持つことについて迷っているNeelixがTuvokに相談して、Tuvokが言った言葉

> being a father can have infinite rewards -- far more than would seem possible. My children <font color=red>occupy a significant portion of my thoughts</font>, now more than ever.

<hr>
関連して思い出したのは

> What do you have in mind?
http://englishexpress.seesaa.net/article/113305465.html

<hr>
関連して思い出しのは

>, or so I thought
> That chair was very sturdy<font color=red>, or so I thought</font>.

http://english.stackexchange.com/questions/265076/alternatives-to-or-so-i-thought

> "Or so I thought" means the previous phrase is wrong after a while of consideration. (or something similar)
FileMakerワークショップに参加してきた

[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の11日目

# FileMakerワークショップに参加してきた
12/10に開催されたFileMakerワークショップ
「ソリューションから学ぼう。カンファレンス"直後"ワークショップ」
に参加してきたのでその概要を書いてみた

## FileMakerワークショップとは
![151211-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/d3b52662-53db-00bb-0dbf-243842f191fc.png)
[FileMaker ワークショップ](http://www.filemaker.com/jp/learning/workshop.html)
> ワークショップでは、ファシリテーターの進行のもと、ひとつのテーマについて他の参加者と意見交換をしながら、日頃抱いている疑問を解消したり、FileMakerソリューションの作成に役立つ知識を深めたり、実際に応用できるスキルやベストプラクティスを学んでいただけます。

## 参加したFileMakerワークショップ
株式会社ジュッポーワークスさん主催
「ソリューションから学ぼう。カンファレンス"直後"ワークショップ」
>11月25日〜27日に開催される「FileMaker カンファレンス 2015」の熱も冷めやらぬこのタイミングで復習の意味合いも含め、スキルアップワークショップを開催します。
題材は「FMC2Goスケジューラー（FMC2Go15.fmp12）」。
ファイルメーカー社のWebサイトでダウンロードのできる、「FileMaker カンファレンス 2015」のセッションスケジュールを閲覧できるツールで、カンファレンスの回を重ねるごとに機能が上がってきています。
インターフェイスの改善から、データの更新や検索ロジックに至るまで、初級〜上級の広い範囲で参考にするテクニックがちりばめられています。
今回はこのツールテクニックを、スキルレベルごとに割り当てられたテーマに基づき解析し、その解説と疑問点をグループごとにで整理、発表するという流れで進めていきます。

## FileMakerワークショップの流れ
今回参加したワークショップはこんな感じで進んでいきました

### 開場
13:30頃に開場
会場に入って受付をする
会場では4つの島に分かれた席があり、後で席替えをするので自由に座ってくださいとのこと

### ワークショップ スタート
まずはファシリテータの永井さんによるFileMakerワークショップの概要説明を聞いた後にテーマ別に席替え
今回のテーマは

- スケジュールの自動アップデート機能
- レスポンシブ・デザイン（デバイスごとのレイアウト）
- お気に入りのチェックとカレンダーAppへの登録
- 絞込み検索機能

で、おのおの興味のあるテーマの席に移動した
難しさ度合いでは
レスポンシブ・デザイン ＜ お気に入りのチェックとカレンダーAppへの登録 ＜ スケジュールの自動アップデート機能 ＝ 絞込み検索機能
のようなニュアンスでした

### 自己紹介
グループに分かれたらまずは簡単な自己紹介
その時に書記(記録係)と発表者(あとでグループごとに発表)も決めてくださいということなので決める

### テーマに関するディスカッション
自己紹介が済んだらテーマに関するディスカッションを始めました
途中で永井さんが順番にテーブルを巡回され、ディスカッションの内容に応じてピンポイントの解説をされて、それによってまたディスカッションが進んでいくという形になりました

### ディスカッションの締め
ディスカッションの締めは各グループによるディスカッションの内容の発表します
全員が各々のテーブルの近くに移動して発表を聞くスタイル
発表後に永井さんによるピンポイント解説

この発表によって今回のワークショップで他のグループがどういうことをしていたかが全員に共有されます
今回この発表の途中でカラオケボックスかのようなハプニングがあったり、発表内容より発表手法の方が聞いている人の食いつきがよかったり、4時間程でしたがFileMakerへの理解がより深まったような気がします
こわくないいまどきのフロントエンド開発の話 


今どきのフロントエンド開発の話をします。

## フロントエンドという現場

フロントエンドと言う現場はなかなかカオスなものです。

クラウドとかの技術でインフラも手軽にスケールできるようになってサーバサイドの技術も飽和的になってきて、
(宣言的に組んで、札束でしばく、超富豪プログラミング)
近年フロントの技術需要と言うのはめちゃくちゃ高まってきています。

まぁ今をときめくイケイケの「自社開発！」とかやってるトコとかはそうでも無いでしょうが、
世間一般の開発会社さんたちは結局そういう時代の最先端、にはついていけず、
なかなか苦労されている事が多いみたいです。

まぁ業界ってのは、あくまで人間が作るものですので。

## フロントエンドのイマドキ1：jQuery依存症

なかなかjQueryから抜けられないとかいう非常にありがちなケース。

もう今日日、Angularくらいはせめて使ってみればいいのに…と思うんですが、
一度手をつけて破綻してから、ショックで二度と触れなくなる、みたいなケースは多々有ります。

失敗から学んで進展する勇気って大事ですよね。

同じような形でAltJSとかJSのモジュールシステムとかの導入も遅れたまま。
永久に蓄積されるjQueryコードと共に、増えていく技術的負債…まぁ払わなくていい借金なら別に放っておいても良いんですが。

jQuery だろうが Angularだろうが、破綻する原因は主に設計的観点の欠如にあります。
とりあえずいろんなフレームワークに触れて、設計の重要性を身につける必要がありそうです。

## フロントエンドのイマドキ2：bootstrap嫌い

未だによくある Twitter Bootstrap 嫌い。

まぁ別にTwitter Bootstrapじゃなくても良いんですよ。
でもまぁCSSフレームワークはあったほうが良くないですか？

Style Guideとかしっかり整備してくれるんだったら良いんですけどね。

CSSフレームワークのポイントはモジュールデザインの設計にある、みたいな話もありますし、
今日日大抵のフレームワークはSCSSとかでカスタマイズにも対応しています。

セマンティックなCSSを…とかBEMが…とかそこまでの事は求めないので、
とりあえずCSS書くことの効率化、的な観点ちょっと進めてみるのはいかがでしょうか？

## フロントエンドのイマドキ3：ウォーターフォールデザイン

滝壺に居るコーダが、謎のpsdを頭上から叩きつけられるアレ。

「これ、Webでやるんスカ!?」
「この背景の微妙な模様ホントに重要!?」
「スマホでこれ、どうレンダリングするんですか？」

みたいなアレ。いい加減photoshopもWeb向けに進化してきているので、
HTML吐き出しとまでは言わないまでもコーディング難易度を数値化するくらいの機能はつけて欲しい

紙デザイン上がりのデザイナさんには、1回くらいCSSとかの勉強を踏んで欲しい。
[http://prog-8.com/](http://prog-8.com/)とかもあるんだしさ。

## フロントエンドのイマドキ4：黒い画面恐怖症

gitとかscssとかnodeとか、使ってみたいけどよくわかんない…っていうアレ

確かに何かとハードル高いです。
でも使ってみると実際色々世界は変わってきます。

SourceTree とか Koala とかの使い方覚えるくらいなら、
ちょっと勇気を振り絞って黒い画面挑戦してみましょう。

黒いのが嫌いなら、別の色にカスタマイズしてみればいいですよ。
青い画面とか。

## フロントエンドのイマドキ5：フルスタックフロントエンドエンジニア

フロントエンドって世界だけでも非常に業務範囲は広いものです。

ちょっと勉強熱心だからというだけの理由でも、色々とできるようになってしまうと
社内のニーズを一手に引き受けることになってしまいます。

Adobe系のソフトとJet Brains系のソフト同時に起動するようになったら要注意です。

まぁ技術を色々試せる機会があるってのは素敵なことですけどね。
フルスタックは器用貧乏になりがちなので、その幅を活かすというのは、
学ぶ事以上に大変な課題だったりします。

## フロントエンドの「イマドキ」の悩みはコミュニティまで

フロントエンドの「イマドキ」でお悩みの方は是非コミュニティにお越しください。

世の中数あるいろんなWeb制作の会社があって、社内だけでは見えなかったことなども色々学べる貴重な場です。

「私なんかが勉強会に行っても迷惑になるし…」みたいな事を考える人もたまに居るみたいですが、
むしろ「右も左もわからない」くらいの人が来てくれて、成長していってくれるのがコミュニティとしては一番の喜びです。

高尚なメンバーが集って、高尚な話をする場…とかでは全然無いので、
どうぞみなさんお気軽にお集まりください。
Google App Engineのスマートなバージョン管理

Google App Egnineには「バージョン」という概念があり、ひとつのアプリケーションに複数のバージョンを同時にデプロイしておくことができます。[^1] そのうちのひとつが「デフォルトバージョン」となり、そこへユーザがアクセスする仕組みになっています。[^2]
このバージョン機能はアプリケーションのバックアップとして使うこともできて便利です。例えば現在のバージョン「version1」に新機能を追加して「version2」をデプロイしてデフォルトバージョンと設定した。。。が、バグが見つかった…といった場合に、元々稼働していた「version1」をデフォルトバージョンに設定し直せばアプリケーションはこれまで通りになるわけです。

# デフォルトバージョンの切り替え方法

新しいバージョンをデプロイした後、管理コンソールからGUIから操作して特定のバージョンをデフォルトバージョンとして設定することもできますし、`appcfg`というCUIツールから`set_default_version`というコマンドを使ってデフォルトバージョンを切り替えることもできます。なおデフォルトバージョンを設定することを、以降「バージョンの切り替え」と表現します。

# デフォルトバージョンを切替えしている瞬間のリクエストはどうなる？

以前のGoogle App Engineでは、デフォルトバージョンを切り返している瞬間にリクエストを投げつけると、時々500エラーを返していた気がするのですが、この記事を書くために試したところ一度もエラーが返されませんでした。バージョン切り替え前後にかなーーり密度濃くリクエストし続けたんだけど、おかしいな。この記事は「スマートなデフォルバージョンの切り替え」を目標にしていたので困りました。まぁいいや、たぶんたまにはエラーが発生するのかもしれません？ということにして進めます。普通に考えると、デプロイしたばかりの新バージョンはインスタンスが存在していないはずで、急に頻度高くリクエストを受けても捌き切れないのはなんとなく理解できますね（この記事的には捌き切られてしまうとエラーにならず困りますが）。

そういう時のための対策がいくつかあります。

# スマートにバージョンを切り替えるには？

## warmup

特定のバージョンを狙ってリクエストを投げることもできるので、切り替え先のバージョンにリクエストを仕込んでおいて、インスタンスが増えるを待ちます。インスタンスが増えてきたところでバージョンを切り替えます。

## Traffic splitting

いきなりバージョンを切り替えるのではなく、リクエストの一部を別のバージョンに振り分ける機能です。切り替えたいバージョンに何％のリクエストを振り分けるかを設定できます。こちらも、インスタンスが増えてきたところでバージョンを切り替えます。

## Traffic migration

上記の「Traffic splitting」+「バージョン切り替え」を自動で行ってくれる機能です。。。と単純に考えていましたが、上記の場合は切り替え先のバージョンに対して、「管理者かユーザが」リクエストを送ることになるのですが、Traffic migration機能の場合は「Google App Engineが内部的に」warmupのためのリクエストを送り、確実にインスタンスを増やしてからバージョン切り替えをしてくれるようです。ユーザの利用状況も気にする必要が無くなかなか賢いです。

Traffic migrationが実行中の間は、バージョンの状態が default = YES|NO ではなく、切り替え元と切り替え先に「Traffic Source|Traffic Destination」となります。また、バージョン切替中はTraffic splittingの機能も同時に設定されます。

![Screen Shot 2015-12-11 at 00.20.34.png](https://qiita-image-store.s3.amazonaws.com/0/1387/3988b370-31c5-7fed-724f-455ef59e972f.png)

先ほど試したところ、33インスタンス起動しているバージョンから外部からのリクエストを一切遮断したままTraffic migrationを実行した場合、切り替え先のバージョンに19インスタンス立ち上がった後にバージョン切り替えが行われました。どのタイミングで切り替え完了とみなすのかは不明ですが、内部的なリクエストだけでもそこそこのインスタンスを立ち上げてくれるようです。

Traffic migrationを実行する手順も簡単で、管理コンソールのバージョン一覧画面からGUIで実施することもできますし、`appcfg`というCUIツールから`migrate_traffic`というコマンドを使うこともできます。[^3]

```
appcfg.sh --oauth2 -A $APPID -M $MODULE -V $VERSION migrate_traffic $APPDIR
```

# まとめ

便利な機能だと思うので、今後は `set_default_version` で切り替えるのではなく `migrate_traffic` でバージョン切り替えを行うようにしましょう。


[^1]: 実際には、Module ごと Version ごとにアプリケーションをデプロイできるため、Module数 * Version数のアプリケーションをデプロイできることになります。
[^2]: https://{version}-dot-{applicationId}.appspot.com のように、特定のバージョンのアプリケーションにアクセスすることもできます。
[^3]: Python版の`appcfg.py`ではなく`appcfg.sh`のhelpを見ると、`migrate_traffic`がコマンドとして表示されませんし、リファレンスでJava用の表示にしてにも`appcfg.py`しか書かれていませんが、実際には使用できます。
コミュニティ・デザイン・アンチパターン

![8226451812_88007f08df_z.jpg](https://qiita-image-store.s3.amazonaws.com/0/35320/b69d96eb-8355-dfec-93ee-e0e29da87eae.jpeg)


ここ数年、いろいろな地域のシビックテック的なコミュニティ活動のお手伝いに関わらせて頂いたり、話をお聞きしたりしてきました。その中で感じたコミュニティ立ち上げ時期のうまく行かないパターンを列挙してみます。総じてやり過ぎはよくないようです :smirk: 

#１．民主的にやりすぎる
- 民主的な運営は大事なことですが、あまりに関係者を広げすぎ、参加者を受け入れすぎ、みんなの意見を聞きすぎるとやりたいことが人の数だけ増える一方で、いつまでたってもオリエンテーションと勉強会から先に進めません。もちろん、それ自体を目的としている組織があっても良いと思いますが、通常は具体的なアクションに取り組まないと次第に求心力が薄れてきます。
- 少ない人数と凝縮された意志の方が行動を起こすという点においてはやりやすいと思います。

#２．大きな課題に取り組みすぎる
- 社会的な課題はいろいろありますが、課題を解決するにはまず誰にとっての課題を解決しようとしているのかを理解しておく必要があります。
- 例えば高齢化問題とひと口に言っても、自治体にとっての課題なのか、自分の肉親のことなのかで解決策の切り口は違ってくるはずです。
- シビックテック的な切り口として、自らの市民目線で共感したり検討できる身近で切実な課題に取り組んだほうが、良い結果が出やすいように思います。もちろん、専門的な知見をお持ちの方は、より大きな課題に取り組むことも可能だと思います。

#３．事例をとりあえず横展開してしまう
- 他地域でうまく行った事例を横展開するのは立ち上げ時期のコミュニティにとっては手軽に取り掛かれますし学べることもたくさんありますが、どういうところが良いのかをあまり考えずにやみくもに真似てしまうと、何のためにやったのかよく分からなくなることがあります。
- 例えば5374.jp の横展開は、とりあえず作ってみました、で終わらせるには勿体なさ過ぎます。グッドプラクティスのどういうところがグッドなのかをじっくり考えてみると良いと思います。
- ちなみに私の考える5374.jp の良いところは、githubを使ったことの無い人が「こんなに簡単に自分でもやれるんだ」と感動してシビックテックの楽しさに目覚めたり、オープンデータの考え方に触れてみたり、作ったアプリを自治体の方に見てもらって「わが町のゴミ出し情報をPDFではなくCSVで出してもらえればこんなことができますよ」といった具合に自治体とコミュニケーションを始められる（市民参画の第一歩になる）、といった点だと思います。
 
#４．組織を作り込みすぎる
- オレの組織を作ったり、とりあえず代表とか理事とか役職を決め/就きたがる場合がありますが、代表はよくも悪くも組織のカラーに大きな影響を与えますので、早い者勝ちではなく慎重に決めるべきです。まぁ、最初は勢いで決めても良いけど、民主的な手続きで選び直せるようにしておくべきだと思います。特定の代表をあえて決めていないCode for Aizu や代表月替り制のCode for Nagoya といった興味深い試みもあります。
- シビックテックとは何かという定義が現時点で明確にひとつ存在している訳ではありません。そういう状態では箱（組織）を作ることよりも目的意識を合わせたり、まずは何か活動をしてみることを優先した方が良いと思います。
自分たちのやりたい活動がどういうことなのかがある程度見えてきてから、その活動をやりやすい組織を後付けで作るくらいでも十分ではないかと思います。
- 新しい酒には新しい革袋と言いますが、前例のないことをやろうとしているところに既存の体制やスキームを持ち込んでもなかなかうまく行きません。いつもの枠組みで、今度はシビックテックやってみようか的な取り組みだと取り組みは始めやすい反面、何のためにやっているのか目的がぼやけてしまいだんだん活動を続けることが試練のようになってくる場合があります。
- 理念を共有するための組織の方針とかルールづくりも大事ですが、それも程度問題です。最初は必要最低限で良いのではないでしょうか。本当に重要なことはさほど多くは無いと思います。

#５．多様性を機械的に重視する
- 多様性を語る際によく男女比率を持ち出す人がいます。確かに明らかに違う属性を強制的にサンプリングするのは、平等性を担保する必要のある公共機関などでは意味があるかもしれません。
- しかし私たちは公平性を担保する必要のある公共機関などではありません。男女比率はある程度参考にはなるかもしれませんが、それが目的ではなく（たまたまの）結果だと思うのです。多様性が重要だとする意図は、様々な考え方やスキルやネットワークを持った人がいると活動に幅が出る、ということではないでしょうか。とりわけ異なるネットワークをつなぐハブとなる人物の存在が重要です。似たような人たちだけでなく、ネットワーク的に遠い距離にいる人たちが集まるとわくわく感も高まります。

#６．きっちりやろうとしすぎる
- 社会課題の解決とは言ってもその活動はストイックである必要は全くありません。お菓子を食べながらワイワイ議論して、ダメモトでわくわくすることにチャレンジしてもらいたいと思います。イノベーションは突拍子の無い組み合わせから生まれます。

#７．最後に
- この記事は、シビックテックをテーマにした、「[Civic Tech Advent Calendar 2015](http://qiita.com/advent-calendar/2015/civictech)」企画の7日目の原稿です。他の記事は一覧から見られるようになっており、日ごとに記事が増えていく予定です。ぜひ、ご覧ください。
- カレンダー7日目にエントリーしていながら、投稿が遅くなりました。内容がイマイチこなれておらず、的外れの内容もあるかもしれないと不安なのですがとりあえず公開してみます。
- 自分の経験などを元にしていますが、特定の組織や個人に対しての意見ではなく、抽象化した試論、私見です。

画像の出典：[Crossroads: Success or Failure](https://www.flickr.com/photos/86530412@N02/8226451812/)/[Chris Potter](https://www.flickr.com/photos/86530412@N02/)/[CC BY 2.0](https://creativecommons.org/licenses/by/2.0/)
Electron で IRKit クライアントを作ってみた

# Electron で IRKit クライアントを作ってみた

最近開催できていないですが、一時期 Electron もくもく会を主催していた @unok です。

このブログは Electron Advent Calendar 2015 の 11日目の記事です。

@unok です。主に Web の BtoB BtoC システムを作っています。
上流から下流までなんでもやります。
ただ、Javascript は、どっぷりすることもなく長年避けてきて浦島状態だったのですが、時代の流れから避けられなくなってきました。
そこで、勉強を兼ねて無駄に使ったこと無い技術を利用して簡単なアプリケーションを作ってみました。

作ってみた程度で参考になるものもなさそうですが公開します。
今後リファクタリングとソフトウエア系の技術要素を追加していく予定です。

http://github.com/unok/IRKitE

## IRKit とは

先日、 http://rebuild.fm/120/ で話題にでていた IRKit を購入しました。(クーポンを利用してw)
IRKit は、ネットワーク経由で赤外線信号を送受信する装置です。
簡単に説明すると、主にリモコンで使われている赤外線の信号を受信して信号のデータを http 経由で取得したり、取得したデータを http 経由で送信することができます。また、ローカルでの http だけでなく、internet 経由での操作にも対応しています。
詳しい説明は、 http://getirkit.com/ こちらをご覧ください。

## 概要

アプリケーションから以下のことが可能です。

 * IRKit が受信した赤外線信号の取得
 * 取得済みの赤外線信号を IRKit から送信
 * 受信済みの赤外線信号の管理


## 詳細

今回のアプリは、次の技術を使っています。

  * フレームワーク
    * Electron
  * 言語
    * Typescript
  * ライブラリ
    * HTMLの動的操作
      * jQuery
    * 日時関係
      * moment.js
  * ブラウザ
    * localStorage
  * UI (HTML & CSS)
    * Photon http://photonkit.com/

## はまったこと

### 環境の準備

まず、Electron の開発を開始する準備に時間がかかってしまいました。魅力的な Javascript のライブラリの選択やパッケージ管理やタスク管理になれていないことで試しているうちに時間がどんどん過ぎてしまいました。

### IRKit がうまく動かない

信号の受信が出来たけれども、送信に失敗してしまう。Internet経由だと動くので、試しにほぼ同じフォーマットでデータを送信したところ動くようになりました。たぶん、Web に出ている情報が古い模様。 @maaash さんに報告済みです。

## TODO

 * 登録信号の削除
 * HTML への双方向バインディング
 * インターネットからの操作
 * 登録信号のエクスポート
 * 登録信号のインポート
 * 各種サービスへの連携



明日は、 [@erukiti](http://qiita.com/erukiti) さんです。よろしくお願いします！
javascriptでPromiseを使ってみる。

``Promise``を使えばコールバック地獄から抜けれるという記事を読みまして、いくつかコードを書いてためしてみました。今まで知らずにコード書いてきたのが信じられません。私は今後``Promise``をたくさん使うことをヤクソクます。

## 参考サイト

[今更だけどPromise入門](http://qiita.com/koki_cheese/items/c559da338a3d307c9d88)
一年前の記事ですが、非常に参考になりました。

## Promiseを触ってみた、きっかけ
Vue.jsの勉強をしているのですが、公式サイトのサンプル[vue-hackernews](https://github.com/vuejs/vue-hackernews)でPromiseを使用しており、なんじゃこりゃ？ということで初めて知りました。

## とりあえず、このコードがどう動くか分かれば良いのでは

```js:
var d = [1,2,3,4,5]

Promise.all(d.map( (value) => {
	value++
	return Promise.resolve(value)
}))
.then( (result) => {
	console.log(result)
})
```

``Promise.all``に渡した配列の処理が全て終わってから、``then``が処理される。
これ、めちゃくちゃ便利じゃないですか！

## さいごに
``Promise``の使い方はもっとたくさんあります。また上記コードが正しい使い方かもわかりません。たくさん人のコード読んで成長することを。。。
std.containerを使ってみた

D言語には言語仕様に動的配列や連想配列が存在しており便利ですが、
もう少し色々なデータ構造を使いたいですよね。

DにはC++のSTLコンテナのような「std.container」が標準ライブラリに存在します。
調べつつ使ってみたものをいくつか紹介します。

#Array (std.container.array)
動的配列のコンテナ。C++のstd::vectorに相当します。
ランダムアクセスが可能で、Dの配列を置き換えることも可能です。

Dの動的配列と違うところは、このコンテナで確保されたメモリはGCに依存しないで独自に管理されます。
Array(T)構造体が破棄されるタイミングでメモリも一緒に解放されます。
ファイルや画像のバッファ等巨大なメモリを一時的に確保する際に使えそうですね。

```d:main.d
import std.container;
import std.stdio;

void main()
{
	Array!(int) c;

	// 末尾に5を追加
	c ~= 2;
	// 末尾に5を追加
	c.insertBack(5);
	
	writeln(c.length);	// => 2
	writeln(c[1]);		// => 5

	// 末尾の要素を1つ削除
	c.removeBack();
	
	writeln(c.length);	// => 1

	// 要素数を2000にする
	c.length = 2000;
	writeln(c.length);	// => 2000
}
```

#SList (std.container.slist)
単方向な連結リスト。
要素の追加にinsertFront、削除にremoveFront。
Rangeを使えば途中の追加、削除も高速に行えます。

```d:main.d
import std.container;
import std.stdio;
import std.range;

void main()
{
	SList!(int) c;
	// 要素を追加していく
	foreach (e; [5, 8, 3, 4, 1, 8, 9, 12]) {
		c.insertFront(e);
	}
	eachWriteln(c);		// 12,9,8,1,4,3,8,5

	// 2個取り出す
	c.removeFront(2);
	eachWriteln(c);		// 8,1,4,3,8,5
	
	// 列挙しつつ5以下の要素を削除
	for (auto r = c[]; !r.empty; ) {
		if (r.front <= 5) {
			r = c.linearRemove(r.take(1));
		} else {
			r.popFront();
		}
	}
	eachWriteln(c);		// 8,8
}

void eachWriteln(T)(T c)
{
	foreach (e; c) {
		write(e, ",");
	}
	writeln("");
}
```

#DList (std.container.dlist)
双方向な連結リスト。C++のstd::listに相当。
要素の追加にinsertBack,insertFront、削除にremoveBack,removeFront
Rangeを使えば途中の追加、削除も高速に行えます。

```d:main.d
import std.container;
import std.stdio;
import std.range;

void main()
{
	DList!(int) c;
	// 要素を追加していく
	foreach (e; [5, 8, 3, 4, 1, 8, 9, 12]) {
		c.insertBack(e);
	}
	eachWriteln(c);		// 5,8,3,4,1,8,9,12

	// 先頭から2個取り出す
	c.removeFront(2);
	eachWriteln(c);		// 3,4,1,8,9,12
	
	// 5以下の要素を2倍にする
	for (auto r = c[]; !r.empty; r.popFront()) {
		if (r.front <= 5) {
			r.front = r.front * 2;
		}
	}
	eachWriteln(c);		// 6,3,8,4,2,1,8,9,12
}

void eachWriteln(T)(T c)
{
	foreach (e; c) {
		write(e, ",");
	}
	writeln("");
}
```

#RedBlackTree (std.container.rbtree)
赤黒木アルゴリズムの二分木コンテナ。C++のstd::setに相当。
常にソートされており、検索、追加は高速に行うことができます。
こいつは他のコンテナとは違ってクラスなので、使う際にはnewする必要があります。

```d:main.d
import std.container;
import std.stdio;
import std.range;

void main()
{
	auto c = new RedBlackTree!(int);
	// 要素を追加していく
	foreach (e; [5, 8, 3, 4, 1, 8, 9, 12]) {
		c.insert(e);
	}
	eachWriteln(c);		// 1,3,4,5,8,9,12

	// 8の要素を削除
	c.removeKey(8);
	eachWriteln(c);		// 1,3,4,5,9,12
	
	// 5未満の要素を表示
	eachWriteln(c.lowerBound(5));	// 1,3,4
}

void eachWriteln(T)(T c)
{
	foreach (e; c) {
		write(e, ",");
	}
	writeln("");
}
```

#あとがき
この辺のコンテナは標準ライブラリに存在することを知らなくて、
自分で実装してしまうケースが結構あったりします（実際に実装してしまったことがある）

std.algorithm等はRangeに対して処理を行う機能が多いため、自分で実装するよりは
std.containerのものを使用したほうが後々楽ができると思います。

この記事はアドカレ用に調べて書いたものです。使う用途としては一例程度に留まっていますので、
極めたい方はググったりするなり、[std.containerのリファレンス](https://dlang.org/phobos/std_container.html)を見てください。
配列から重複要素を削除する

- ※*Swift 3* に対応しました
- ※`reduce` を使った場合も掲載しました。

配列中の重複要素を除く方法を。

いわゆる、Rubyとかでいう、uniqueの動作になります。
**例)** `[1, 2, 3, 2, 1, 1, 1, 4] => [1, 2, 3, 4]`

## 実装
```swift
// Swift2の頃の記事で書いていた方法
extension Array where Element: Equatable {
    var unique: [Element] {
        var r = [Element]()
        for i in self {
            r += !r.contains(i) ? [i] : []
        }
        return r
    }
}

// reduceを用いて取り除いた場合
extension Array where Element: Equatable {
    var unique: [Element] {
        return reduce([]) { $0.0.contains($0.1) ? $0.0 : $0.0 + [$0.1] }
    }
}
```

(以前の記事ではArrayのもつElementがHashableに適合しているか見ていましたが、Equatableでも問題ないようなのでそちらにしています)

## 使ってみる

```swift:Sample
let array1 = [5,8,1,2,5,2,7,8,3,5,7,3,4,9,2,1]
print(array1) // [5, 8, 1, 2, 5, 2, 7, 8, 3, 5, 7, 3, 4, 9, 2, 1]
print(array1.unique) // [5, 8, 1, 2, 7, 3, 4, 9]

let array2 = ["a","c","a","b","e","d","c"]
print(array2) // ["a", "c", "a", "b", "e", "d", "c"]
print(array2.unique) // ["a", "c", "b", "e", "d"]

// Enumも試してみる
enum SomeType{
    case A,B,C,D,E
}
var array3 = [SomeType.A,.C,.B,.D,.A,.C,.B]
print(array3) // [SomeType.A, SomeType.C, SomeType.B, SomeType.D, SomeType.A, SomeType.C, SomeType.B]
print(array3.unique) // [SomeType.A, SomeType.C, SomeType.B, SomeType.D]
```
Node v6.0.0-preでReactをビルドする


`npm install`するとfbjs内部スクリプトでNodeのバージョンが `4.x or 5.x` というバリデーションが入っているのでそのままだと失敗する。
この条件は実際にはReactリポジトリのpackage.jsonの`devEngines.node`を見ている。

ビルドするためにはReactの`postinstall`を殺しておけばいい。

```diff:
diff --git a/package.json b/package.json
index 0fd7f94..389e7c1 100644
--- a/package.json
+++ b/package.json
@@ -50,7 +50,6 @@
     "build": "grunt build",
     "linc": "git diff --name-only --diff-filter=ACMRTUB `git merge-base HEAD master` | grep '\\.js$' | xargs eslint --",
     "lint": "grunt lint",
-    "postinstall": "node node_modules/fbjs-scripts/node/check-dev-engines.js package.json",
     "test": "jest"
   },
   "jest": {
```

`npm run build` すると　`build/` 以下に成果物のファイルが吐かれる。

```bahs:
ls build/
modules                  react-dom-server.js      react-dom.js             react-with-addons.js     react.js
packages                 react-dom-server.min.js  react-dom.min.js         react-with-addons.min.js react.min.js
```
OSS いつもありがとう Access 無くても仕事はできる

## さあ、困りました
職場で MS Access 2000 あたりで作成したDBを参照する必要が発生しました。
しかし、職場のPC環境は MS Office のライセンス更新の話が出て、コストダウンを優先するならばと、Libre Office に変更しました。プライベートではすでに Libre Office を運用中で迷いはありませんでした。 
そうです。Access がないのです。

## そこで mdb-tools です。
軽快なコマンドライン・ツールです。MDB形式ファイルを参照して、スキーマを出力したり、エクスポートもできます。
ODBCドライバなんていりません。

[home](http://mdbtools.sourceforge.net/)
[source](https://github.com/brianb/mdbtools)

## さあ、インストール です
私は公私共に xubuntu を使っています。
インストールはとっても簡単です。
```
sudo apt-get install mdbtools
```

## スキーマの出力
ユーティリティの一つ mdb-schema を使います。
テーブル構造を確認したり、ドキュメント作成が楽です。

## エクスポート
ユーティリティの一つ mdb-export を使います。
utf-8 で出力してくれます。

## Access 無くても、Windowsでなくても
Access は不要ですし、Windowsで仕事をしなくてもいいわけです。

## Jet2 以前は無理な様子
Access 2.0 を利用している方は残念です。
Access 97 で変換しましょう。