OmniAICreator/Qiita-1.07M huggingface dataset:
Excelファイル同士をdiffするための方法


誰かしらの役に立つであろう、ExcelファイルのDiff比較をQiitaの記事にまとめてみました。

## Excelファイルを比較するための方法

### WinMergeとxdocdiffのPluginを利用する  

[WinMerge](http://winmerge.org/?lang=ja)は通常、テキストファイル同士（しかも、フォルダ単位でも可能）を比較するためのソフトウェアです。
そんなWinMergeでExcelのテキストの内容を比較しようというのが今回の記事の主目的となります。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/13837/64553af6-7327-d985-9c74-0d554ace69fc.png "01.png")

#### WinMergeの動作環境
Windows 7以降のOS
（Wineなどを利用するとLinux、Macでも動作すると思いますが、保証できません）

#### Excelファイルを比較するために利用するプラグインのインストール手順

1.[xdocdiff](http://freemind.s57.xrea.com/xdocdiffPlugin/) をダウンロードします。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/13837/f6d906ad-b704-6884-d488-f26ecfb6fe08.png "02.png")


2.ダウンロードしたファイルを解凍します。
3.下記画像の赤枠の通り、ファイルをWinMergeのインストールディレクトリ(C:¥Program Files¥WinMerge¥)に置く

![03.png](https://qiita-image-store.s3.amazonaws.com/0/13837/184abcad-ac0f-a1ae-ebb0-7fb8c42db863.png "03.png")

4.WinMergeを起動し、プラグインをクリックし、プラグインの設定を開きます。
下記画像の赤枠の通りになっていれば、プラグインの導入までできています。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/13837/34418a93-08ce-6d4a-8759-60b0de03d17a.png "04.png")


これで準備完了です。

#### 実際にファイルを比較する手順

1.WinMergeを起動し、比較したいExcelファイルを選択します。

![05.png](https://qiita-image-store.s3.amazonaws.com/0/13837/2b190495-95a4-03a5-e2d9-c4e6140ac117.png "05.png")


2.エラーが出ますが「はい」を押して消します。

![06.png](https://qiita-image-store.s3.amazonaws.com/0/13837/0d431f91-118b-3bc4-933e-83af0ad8c3c8.png "06.png")

3.「展開プラグイン」で開くをクリックします

![07.png](https://qiita-image-store.s3.amazonaws.com/0/13837/b5cb95d8-d2bb-eab1-544d-4839bef9c71c.png "07.png")

4.先ほど追加したプラグインを選択して、OKを押します。

![08.png](https://qiita-image-store.s3.amazonaws.com/0/13837/79311dac-3c43-8a8b-1d78-603b5c7dbbac.png "08.png")

5.Diffがある例ですが、こんな感じになります。

![09.png](https://qiita-image-store.s3.amazonaws.com/0/13837/f0df9dec-775b-da2b-29b0-feeb55e27447.png "09.png")
Robolectric + Dagger2 + Mockito を使ってテストを書くハンズオン# Android_Testing_BC

## 自己紹介

 - [@numa08](https://twitter.com/numa08)
 - スマホアプリつくるようじょ

---

## おしながき

 - Android の2つのテスト
 - Robolectric って何?
 - テストの無いアプリにテストを追加していこう

---

## Android の2つのテスト

gradle のタスク名から名前を取りました

 - AndroidTest
   - 本物のデバイスやエミュレータで動くテスト
   - Androidフレームワークの機能をそのまま使える

---

## Android の2つのテスト

 - Unit Test
   - JVM上で実行されるテスト
   - AndroidフレームワークのコードはJVMでは動かないのでモックが必要
   - AndroidTestより動作が速い

---

## おしながき

 - Android の2つのテスト
 - **Robolectric って何?**
 - テストの無いアプリにテストを追加していこう

---

## Robolectric って何？

 - Androidフレームワークをモックしてくれるライブラリ
 - JVM上でAndroidフレームワークのコードを動かすことができる
 - JVM上でAndroidフレームワークに依存するテストを書くことができる

---

## Robolectric が無いとき :cry: 

 - `Context`や`Activity`などはJVM上では動作をしないので自分でテストコード内部で実装をする
   - MockitやPoerMock でモックは作れるがメンテナンスのコストはある
 - 巨大なフレームワークを全てモックし管理するのは現実的じゃない

---

## Robolectric があるとき :smile: 

 - テスト実行時にロードをするクラスをRobolectricが用意したモックに自動的に変更してくれる
 - 自分でモックを用意することも可能

---

## おしながき

 - Android の2つのテスト
 - Robolectric って何?
 - **テストの無いアプリにテストを追加していこう**

---

## サンプルアプリ

 - [numa08/Android-testing-bootcamp-3](https://github.com/numa08/Android-testing-bootcamp-3)
 - [テストを追加した Pull Request](https://github.com/numa08/Android-testing-bootcamp-3/pull/1)
Scrapy 1.1.1, Python 3.5.0 でNo module named 'twisted.enterprise'

Python 2.7.11で動いていたSpiderをPython 3.5.0で走らせたらモジュールが参照できなかった。
`ImportError: No module named 'twisted.enterprise'`

Twistedの問題で解決はされてるっぽい
https://twistedmatrix.com/trac/ticket/8303

けどTwisted 16.3.0(2016/8/4時点で最新)には入ってないっぽい
https://pypi.python.org/pypi/Twisted/16.3.0

とりあえずソースをチェックアウトして使う。
```
$ pip list | grep Twisted
Twisted (16.3.0)
$ pip uninstall twisted
$ git clone -b trunk https://github.com/twisted/twisted.git
$ cd twisted
$ python setup.py install
```

>Using /Users/nishikaw/.pyenv/versions/3.5.0/lib/python3.5/site-packages
>Finished processing dependencies for Twisted==16.3.0

見た目は16.3.0のままだけどtwisted.enterpriseが参照できるようになった。
とりあえず次のバージョンがリリースされるまで。
output exception


```objectivec
void exceptionHandler(NSException *exception) {
    /*
     LOG関数は コンソールログを出力する関数 DEBUG時にとても有効です。
     別エントリーで解説します。
     */
    // 不正終了した箇所を示す スタックトレースをコンソールログに出力する
    NSLog(@"stackSymbols:%@", [exception callStackSymbols]);
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    NSSetUncaughtExceptionHandler(&exceptionHandler);
	return YES;    
}

```
Datadog にカスタムメトリクスを追加して Jenkins のジョブ生存期間監視を導入



# 背景

社内の Jenkins サーバで回しているテストが最近不調で、よく途中で止まってしまうので監視の導入を決意。
（もちろんテストが止まってしまう根本原因の解決が優先ですが、少々時間のかかる問題なので）

- しかし Datadog の Jenkins Integration では「ビルドが完了したジョブ」の duration は取れても「ビルド中のジョブが何分生き残ってるか」は取れなさそうだった
- テスト自体に時間がかかることもあるのでタイムアウトを設定はできない
- ビルド開始後一定時間経ってもジョブが終了していなければ確認のための通知を出す

という対処を実施
なお、Jenkins サーバは Datadog インストール済み＆インテグレーション設定済み


# やったこと

## 前準備

Datadog の[カスタムメトリクス](http://docs.datadoghq.com/ja/guides/metrics/)でも作ってジョブの生存時間確認してアラート出せばいいかなーと思ったら、python がデフォの 2.6.6。
`pyenv` 入れようと思ったら色々足りない。

というわけで時々思い出したかのようにやるセットアップ

```bash
$ sudo yum groupinstall "Development Tools"`
$ sudo yum install zlib zlib-devel
$ sudo yum install openssl openssl-devel
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
```

`.bash_profile` あたりに↓追記して `$ source ~/.bash_profile` しておく。

```bash
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
fi
```

あとは pyenv から python インストールして `pip install`

```bash
$ sudo pyenv install 2.7.12
$ sudo pip install datadog
```

準備完了

## カスタムメトリクスの送信

以下のようなスクリプトを作成

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

from datadog import statsd
import time
import datetime as dt
import jenkins


PRJ_NAME = "Enter Your Project Name on Jenkins"

def get_building_jobs():
    server = jenkins.Jenkins("http://localhost:8080")
    builds = server.get_job_info(PRJ_NAME,depth=1)["builds"]

    return [x for x in builds if x['building'] == True]

def get_lifetime(timestamp=""):
    # return minutes
    now = int(dt.datetime.now().strftime('%s'))
    return (now - (timestamp / 1000)) / 60


while True:
    for job in get_building_jobs():
        statsd.gauge("jenkins.job.lifetime", get_lifetime(timestamp=job["timestamp"]))
    time.sleep(10)
```

ちょろっと自分の備忘録メモがてら解説

```py
def get_building_jobs():
    server = jenkins.Jenkins("http://localhost:8080")
    builds = server.get_job_info(PRJ_NAME,depth=1)["builds"]

    return [x for x in builds if x['building'] == True]
```

ここでは `get_job_info` で得られたジョブの中から `"builds"`（ビルド履歴）を引いて、 `latSuccess` やら `lastFailure` やらを除外した後、ステータス `building` が True のもののみを取得して返しています。
これで **現在実行中のジョブ** を取得できます。

```py
def get_lifetime(timestamp=""):
    # return minutes
    now = int(dt.datetime.now().strftime('%s'))
    return (now - (timestamp / 1000)) / 60
```

これは単純に、各ジョブの持っている `timestamp`（ジョブ開始時刻の UNIX タイムスタンプ）を元に、生存期間を分に直して返しています。
Jenkins の `timestamp` はミリ秒まで入ってて面倒なので雑に `timestamp / 1000` とかやってます。
良い子は真似してはいけない感じの雑さですね。

```py
while True:
    for job in get_building_jobs():
        statsd.gauge("jenkins.job.lifetime", get_lifetime(timestamp=job["timestamp"]))
    time.sleep(10)
```

そして後はひたすら「実行中のジョブの生存期間（分）」を `jenkins.job.lifetime` という名前で Datadog に送り続けています。

```bash
$ python ./custom_metrics.py &
```

とか雑にバックグラウンド実行して放置です。
ちゃんとやるならデーモンとして起動させるとかプロセスにも監視入れるとかしたほうがいいと思います。

あとはこの `jenkins.job.lifetime` をモニタリング・アラートを作成すれば「いつの間にか止まっている」という状況を防ぐことができます。

それにしても、Datadog 便利ですねぇ。
Unity-ProfilerのログをクリアするEditor拡張作った

Start関数の中で試しに処理を計測したい場合に、何度もClearボタンを押すのが面倒なので作ってみました。

##検証環境
Unity5.3.2f1 (Pro版で検証したけど、フリー版でも動くはず・・・)
Mac 10.11.4

##使い方
1. ソースコードをコピペしてEditorフォルダ以下に保存
2. ショートカット(Command + i) またはTools/Profiler/ProfilerClearを実行
3. Profilerのログが消える



##ソースコード
```lang:ソースコード
using UnityEditor;
using UnityEditorInternal;

public class ProfilerClear
{
	[MenuItem ("Tools/Profiler/ProfilerClear %i")]
	static void Clear ()
	{
		ProfilerDriver.ClearAllFrames ();
	}
}
```

![8月-04-2016 15-54-55.gif](https://qiita-image-store.s3.amazonaws.com/0/67575/54b5cec7-993a-7441-1b43-1e146c808dab.gif)
Python TornadoをSentryでロギングして、Slackに流す時の設定メモ


SentryからSlackに繋ぐと、Slackでエラー監視できるので結構便利。
Sentryを使っていれば、SentryHandlerがあるのでそれをLoggingのハンドラに登録するだけで良いので、簡単。以下、サンプル。

```pythonサンプル
import logging
from raven import Client
from raven.handlers.logging import SentryHandler

if __name__ == "__main__":
	# Sentryに繋ぐ
	sentry_client = Client(SENTRY_API_ENDPOINT)

	# Sentryのロギング用のハンドラを生成
	handler = SentryHandler(sentry_client)

	# 取得するログのレベルを指定
	handler.setLevel(logging.ERROR)

	# loggerハンドラにSentryロギングハンドラを登録
	logger = logging.getLogger()
	logger.addHandler(handler)

	# Tornadoを起動
	http_server = tornado.httpserver.HTTPServer(Application())
	http_server.listen(80)
	tornado.ioloop.IOLoop.instance().start()
```

SentryからSlackは、以下を参照。
https://github.com/getsentry/sentry-slack
brew link openssl --force ができなくて phpenv & php-build で PHP がビルドできない

## 問題

`phpenv install` でビルドが OpenSSL が無いエラーでこける

[Mac OS X El CapitanにNginx + phpenv + php-build + php-fpmの環境を構築する手順](http://qiita.com/jshimazu0820/items/09be38be00a5863acc08)
と同様の状況。
brew で OpenSSL はインストール済みだけど OSX のものを使うようになっていて、OSX (El Capitan) の OpenSSL には ヘッダファイルがない
参考: [Mac OS X El CapitanからOpenSSLのヘッダファイルが消えた話](http://qiita.com/hnw/items/ac83e3ac8f9aa930b934)

brew で入れた OpenSSL を使うようにしたく、
`brew link openssl --force`
と実行したが下記のメッセージが出力される

```bash
$ brew link openssl --force
Warning: Refusing to link: openssl
Linking keg-only openssl means you may end up linking against the insecure,
deprecated system OpenSSL while using the headers from Homebrew's openssl.
Instead, pass the full include/library paths to your compiler e.g.:
  -I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib
```

brew で openssl をリンクできなくしたようで、コンパイラにパスを渡してねって言ってる
(Homebrew/brew [link: don't link openssl. #597](https://github.com/Homebrew/brew/pull/597))

なんか .NET Core の話してる…なんとなく察した

## 解決

参考: [Mac OS X El Capitan上でphp-buildするメモ](http://qiita.com/hnw/items/62380e713d318906f0cd)

```bash
PHP_BUILD_CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl) --with-libxml-dir=$(brew --prefix libxml2)"
```
と、環境変数を渡すことでビルドできた

```bash
$ phpenv install 7.0.2
[Info]: Loaded extension plugin
[Info]: Loaded apc Plugin.
[Info]: Loaded composer Plugin.
[Info]: Loaded github Plugin.
[Info]: Loaded uprofiler Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: php.ini-production gets used as php.ini
[Info]: Building 7.0.2 into /Users/chatii/.phpenv/versions/7.0.2
[Skipping]: Already downloaded and extracted https://secure.php.net/distributions/php-7.0.2.tar.bz2
[Preparing]: /var/tmp/php-build/source/7.0.2
[Compiling]: /var/tmp/php-build/source/7.0.2
[xdebug]: Installing version 2.4.0
[xdebug]: Compiling xdebug in /var/tmp/php-build/source/xdebug-2.4.0
[xdebug]: Installing xdebug configuration in /Users/chatii/.phpenv/versions/7.0.2/etc/conf.d/xdebug.ini
[xdebug]: Cleaning up.
[Info]: Enabling Opcache...
[Info]: Done
[Info]: The Log File is not empty, but the Build did not fail. Maybe just warnings got logged. You can review the log in /tmp/php-build.7.0.2.20160804145836.log
[Success]: Built 7.0.2 successfully.
```

めでたしめでたし
BotkitでSlack Botを作って特定の発言に反応させる

* BotをSlackに登録する https://my.slack.com/services/new/bot
* そのページでTokenをコピーする
* Terminalで、コードを書く場所にBotkitを落とす

```
git clone git@github.com:howdyai/botkit.git
cd botkit
sudo npm install

// サンプルを実行。チャンネルにBotをinviteする必要がある
token=YOURTOKEN node slack_bot.js
```

slack_bot.jsの必要な場所だけ残して書き換える

```js
if (!process.env.token) {
    console.log('Error: Specify token in environment');
    process.exit(1);
}

var Botkit = require('./lib/Botkit.js');
var os = require('os');

var controller = Botkit.slackbot({
    debug: true
});

var bot = controller.spawn({
    token: process.env.token
}).startRTM();

// 置換例：PerforceのパスをSwarmのパスに置き換える
controller.hears(['//depot'], 'ambient', function(bot, message) {
    var swarm_url = message.text.replace('//depot', 'http://xxxxxxxxx:1234/files/depot')
    bot.reply(message, swarm_url);
});
```
書き換えたらCtrl+Cで一度Botを落として再度実行すると、キーワード（今回は"//depot"）に反応する
RDPでMacとWindowsのキー配列を切り替えたくない


# 前提条件
MacとWindowsが英字配列

## バージョン情報
Mac：10.11.16
Windows : 7
RDP : 8.0.33
Karabiner : 10.21.0

---

# やりたいこと

1. Macを操作する際は、Mac用のショートカットをそのまま使いたい
2. RDPでWindowsを操作する際は、US配列のキーボード操作のように使いたい
3. MacのFnとCtlの位置が気に食わないので逆転したい
4. Macで誤ってCommand+`した時に全角・半角を切り替えたい

## 設定内容
まず、RDPの場合に意識せずにWindows用のUS配列みたいに動くように設定します。


基本的にKarabiner → Preferencesでチェックを付けるだけです。

- 普段Macで利用する英数/かなの切り替え
	- コマンドキーの動作を優先モード （★おすすめ）〜以降省略〜


- Fnと左Ctrlの入れ替え
	- Controle_L to Fn
	- Fn+letter to Control+letter Fn+Escape,Space,Tab to Control+Escape,Space,Tab 〜以降省略〜
	- Fn to Control_L


- RDPの場合にWindowsUS配列をエミュレート
	 - Command_L to Option_L (Only in virtual machine, RDC)
	- Option_L to Command_L (only in virtual machine, RDC)
	- Option_R to Control_R (only in virtual machine, RDC)

### ここまでで

基本的な欲求は満たせましたが、2つだけ残ってしまいました。

__残り__：
- 右CommandをOption（Altの役割）にしたい
- Command+`の時に全角・半角を切り替えたい

## 設定内容＋α

右CommandをRDPの際にOptionにする設定とCommand+`で全角・半角を切り替えてくれる設定がありません。（2016/08/04現在）

なので、自前で用意する必要があります。

1. Karabinerの「Misc & Uninstall」のタブを選択
2. Open private.xml をクリック
3. RDPを利用している場合、右Commandを右Optionにする設定を追記（次の箇所で説明）
4. Karabinerを再起動、または「Use prepared settings」のチェックを外して付け直す
5. 「Change Key」のタブの「Command_R to Option_R (only RDC)」という項目が追加されているのでチェックを付ける
6. 「Change Key」のタブの「Command_L+` to Eisuu/Kana (toggle)」という項目が追加されているのでチェックを付ける

### private.xml への追記

```xml:private.xml（修正前）
<?xml version="1.0"?>
<root>
</root>
```

```xml:private.xml（修正後）
<?xml version="1.0"?>
<root>
  <!-- RDPを指し示す設定 -->
  <appdef>
    <appname>RDC</appname>
    <equal>com.microsoft.rdc.mac</equal>
  </appdef>

  <!-- 右CommandをRDPの時に切り替える設定 -->
  <item>
    <name>Command_R to Option_R (only RDC)</name>
    <identifier>private.for rdc</identifier>
    <only>RDC</only>
    <autogen>
      __KeyToKey__
      KeyCode::COMMAND_R,
      KeyCode::OPTION_R
    </autogen>
  </item>

  <!-- 全角・半角切り替え -->
  <item>
    <name>Command_L+` to Eisuu/Kana (toggle)</name>
    <identifier>private.for_command_l_backquote_to_toggle</identifier>
    <not>RDC</not>
    <autogen>
      __KeyToKey__
      KeyCode::BACKQUOTE, ModifierFlag::COMMAND_L | ModifierFlag::NONE,
      KeyCode::VK_JIS_TOGGLE_EISUU_KANA
    </autogen>
  </item>
</root>
```

---

# まとめ

## 切り替え一覧

ここまで設定すると、設定を切り替えることなく両者のショートカットをそのまま使えるはずです。

`※RDPでCommandを利用したい場合は左Optionが担うので、そこだけ注意が必要`

- Mac → RDP(Windows)
	- 左Control → Ctrlキー
	- Fn → Fn
	- 左Option → Windowsキー（※Commandを兼ねる）
	- 左Command → Altキー
	- 右Command → Altキー
	- 左Option → Ctrlキー
	- 左Command+` → Altキー+` （※元の挙動）

## さいごに

右Commandがデフォルトだと、好みの挙動にならなかったので暫くの間カチカチ切り替えて作業をしていました。

この設定を入れたことで、Karabinerの設定を変えなくてすむようになったので、少しだけストレスが減りました。

---

# 参考文献

[Karabiner の private.xml 設定方法](http://qiita.com/altitude3190/items/bbef986ff8dd288b2641)
Laravel もとい Lumenと Vue.jsでSSRする


昨晩勢いで、[Laravel Vue.js のSSR](http://qiita.com/mikakane/items/926fcf5f0d656d3286ca)について記事を投稿したのですが、大きな失敗でした。

そもそも誰もLaravelでJSなんて必要としてない。きっとJS使いたい人はLumenを使っているはずなんです。

今回は、Lumenを使ったAPI + 静的なHTML の構成にSSRをねじ込むための方法を考えます。

## そもそもPHPでHTMLページ作らない

[前回書いたLaravel Vue.js のSSR]の記事は、何故か`view`関数とかbladeとかを使っていて、ちょっと気がどうにかしていたんだと思う。

フロントエンドエンジニアは多分bladeとか使わないし、htmlとかjadeとかそういうのを愛しているはず。

なので今回はJadeで構築したテンプレートの中にPHPをねじ込んで…という方向性で考えてみる。

### jadeの構成

````
doctype html
html
  head
    ....
  body
    .container
      include ./include/ssr.php
      #app // Vue.jsのアプリになる部分
        .title {{message}}
        ...
````

ポイントはPHPのinclude。書き間違いではなく普通に`include ./include/ssr.php`します。

includeするPHPは以下の様なシンプルな形でOK。PHP拡張子なのでエディタも動く

```
<?php
$app = require(__DIR__."/../bootstrap/app.php");
echo app("ssr"); // SSRの結果が帰ってくる
?>
```

要はLumenをルーティングとして使うのではなく、ルート自体はファイルに着地させて、あくまでDIコンテナとしてのみ使いましょうという試み。

あとはサービス・プロバイダなりでSSR描画処理を登録してあげればOK

````
$app->singleton("ssr",function(){
    $command = "node ".app()->basePath("ssr.js");
    $ssr = new \Symfony\Component\Process\Process($command);
    // Input読んだり値を渡したりとかそういう処理
    $ssr->run();
    return $ssr->getOutput();
});
````

OGPとかもやる場合はHEADとかもコレで部分HTML記述する形で。

普通にjadeコンパイルすると拡張子は.htmlになると思うので、`gulp-rename`とかで`.php`に修正するか、Apacheの設定をよしなにするか。

## Lumen の運用について

こんな感じで運用してみると、ルートにHTML吐くものがなくなるのでレスポンスの処理がすっきりする。

ControllerはReponse返さなくて良くなるので、エラー系はThrowableでErrorHandlerにResponse生成させて、正常系のResponse生成はMiddlewareで対応みたいな処理が取れる。

ルートの`index.php`以外でLumen使ったりすると意図しない挙動になるケース多かったりするので、redirectとかurl関係の関数使う時には注意。
個人的にこれまで見て「いいな！」と思ったサイト集

会社の休み時間とかに見てて「あ、これいいな！」と思ったサイト集です。
「cocos2d-xでなんかアプリ出したい」と思ったので、それに関わりそうな記事やスライドがメインです。

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
※当然古い記事もあるので、閲覧の際はその記事が書かれた日とかに注意してください。
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

<a href="http://qiita.com/kyokomi/items/29cd1d44eb35c0068df4">CocoStudioのAnimationEditorを使って簡単なアニメーションを実装する</a>


<a href="http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10156406775">音ゲー作るときのノーツの表示間隔のアイディアのひとつ</a>

<a href="http://qiita.com/KUMAN/items/a4cde6a1e6fe7b712859">cocos2d-x入門　頻繁に使うであろう内容が書かれているので便利かも。</a>

<a href="http://gigazine.net/news/20160621-game-design-method/">ゲームデザインプロセスにおける「100：10：1」の方法</a>

<a href="http://www.slideshare.net/infinite_loop/20140801-trait">Traitのお話</a>

~ 2016/08/10 追記 ~

<a href="http://studio.cretia.net/blog/344">Cocos2d-x 3.5 AdMobのバナー広告を実装する</a>

~ 2016/10/05 追記 ~

<a href="http://befool.co.jp/blog/poowww/cocos-gesture/">Cocos2d-x ロングタップやスワイプなどを実装するときに役立った</a>
行列積・内積がディープラーニングのどこで使われているか

#行列積・内積について
数学の勉強をしていると、「内積」という単語が出てきました。
この「内積」がニューラルネットワークでどのように使われているか調べました。
なお、内積はベクトルについての積ですが、行列積は行列についての積です。
内積は、「ドット積」とも呼ぶようです。

#内積とは
- [内積の意味](http://naop.jp/topics/topics14.html)
- [【数学】「内積」の意味をグラフィカルに理解すると色々見えてくる その１](http://qiita.com/kenmatsu4/items/a144047c1b49aa8c7eb0)
- [ドット積](https://ja.wikipedia.org/wiki/ドット積)

#行列積とは
- [行列の積の定義とその理由](http://mathtrain.jp/matrixproduct)


#例
下記のような２層のニューラルネットワークを考えてみます。

![Unknown-2.tiff](https://qiita-image-store.s3.amazonaws.com/0/128193/f035d35f-a43a-1668-4443-58f87eedd47f.tiff)




##行列積の式

上記のニュラールネットワークの出力を、行列積の式に置き換えると、こんな感じになります。

```math
\begin{bmatrix}
w_{11} & w_{12} & w_{13}\\
w_{21} & w_{22} & w_{23}
\end{bmatrix}

\cdot 

\begin{bmatrix}
x_{1} \\
x_{2} \\
x_{3} \\
\end{bmatrix}
```


##手計算
具体的に数字を当てはめて

```math
\begin{bmatrix}
1 & 2 & 3\\
4 & 5 & 6
\end{bmatrix}

\cdot 

\begin{bmatrix}
1 \\
2 \\
3 \\
\end{bmatrix}
```

手計算すると

```math
\begin{bmatrix}
1 \times 1 + 2 \times 2 + 3 \times 3  \\
4 \times 1 + 5 \times 2 + 6 \times 3  \\
\end{bmatrix}

=

\begin{bmatrix}
14  \\
32  \\
\end{bmatrix}
 
```



##Numpyでは

```
import numpy as np
w = np.array([[1,2,3],[4,5,6]])
x = np.array([[1],[2],[3]])
```

`w.dot(x)  #=> array([[14],[32]])`

`w.dot(x)`はwとxの行列積を表します。
ちなみに、「dot product（ドット積）」から`dot`というメソッド名になっています。

##Tensorflowでは

```
import tensorflow as tf
w = tf.get_variable("weight" , initializer=tf.constant(np.array([[1,2,3],[4,5,6]]).astype("int32")))
x = tf.get_variable("x" , initializer=tf.constant(np.array([[1],[2],[3]]).astype("int32")))
```
セッション初期化

```
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
```
```
sess.run(tf.matmul(w, x))  #=> array([[14],[32]])
```
`tf.matmul(w, x)`はwとxの行列積を表します。
ちなみに、「matrix multiplication（行列積）」から`matmul`というメソッド名になっています。
「'AutoMapper' にはすでに 'NETStandard.Library' に対して定義された依存関係があります。」の解決方法

プロジェクトでAutoMapperを使用するために、Nugetでインストールしようとしたらタイトルのエラーメッセージが出た。

# 解決方法
Nugetのバージョンが古いため、最新にする。
自分は拡張機能を使っているため、

「ツール → 拡張機能と更新プログラム → 更新プログラム → Visual Studio ギャラリー」 から 「Nuget パッケージ マネージャー」を選択し、更新ボタンを押す。

## 拡張機能以外の解決方法
[When running the NuGet pack command I get the error: 'AutoMapper' already has a dependency defined for 'NETStandard.Library'](http://stackoverflow.com/questions/38277654/when-running-the-nuget-pack-command-i-get-the-error-automapper-already-has-a)

に記載されてる方法では、

```ps1
$sourceNugetExe = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
$targetNugetExe = "$(build.sourcesdirectory)/nuget.exe"
Invoke-WebRequest $sourceNugetExe -OutFile $targetNugetExe
Set-Alias nuget $targetNugetExe -Scope Global -Verbose
nuget
```

でいけるらしい。ようはNuget置き換えろって話。

# 余談
ちなみに、.NETStandard.Libraryってのは、
.NET Core や .NET Framework や Windows Phone 等の.NET APIを共通化するAPIらしい。.NETStandard使えば、プラットフォーム気にしなくてすむよとの事(よくわかってないがたぶんそゆこと)

詳しくは、[.NET Standard Library
](https://docs.microsoft.com/en-us/dotnet/articles/standard/library)に載ってるので読んでください。
コマンド一発でAWSのECRにログインしてみた

aws-cliからECRにログインするのがめんどくさかったのでちょっと楽してみました。

# 一般的な手順

`aws ecr get-login`と打つと
```
docker login -u AWS -p (めっちゃ長いトークン) -e none (ECRのURL)
```
と帰ってくるのでそれをコピペして実行します。


# めんどくさいのでまとめてみた

`aws ecr get-login | sh`

`docker login`のあたりをシェルスクリプトとして実行する感じです。

コピペするより速くて楽で確実かと思います。
あとトークンが一瞬たりとも画面に表示されないのでなんだか安心感があります。
モジュールバンドラー


 * browserify
 * webpack
 * rollup

---

# なんぞ

---

# 前提認識

* モジュール化されてないプログラムはつらい
* JSにはモジュール化の仕組みはない


---

話はNode.js界に遡る

---

# 経緯

 * Node.jsは、モジュール化の仕組みとしてrequireを用意している
 * 外部のJSをモジュールとして読み込める

---

# 使い方１

 * `node_modules/`下にインストールした「Standard Modules」を読み込む

```js
var Vue = require("vue");

//もう使えるぞ
new Vue({})
```

---

#　使い方２

mylib.js

```js
module.exports = function(a, b){
  return a + b
}
```


```js
var myLib = require("./mylib");

var result = myLib(1, 1);
// -> 2
```

---

# module.exports？

 * ここにオブジェクトを突っ込むと外部に公開される
 * それ以外の変数は隠蔽される

---

# シングルトンとして使う

ストアオブジェクトなんかを作れる

```js
var a = require("./mylib");
var b = require("./mylib");

a.message = "hoge";

console.log(a.message);
console.log(b.message);
```

```sh
hoge
hoge
```

---

# Node.jsだけじゃなくてブラウザでも使いたい

 * npmエコシステムに乗りたい

---

# require()はブラウザにはない

 * ない
 * evalを使うと無限に脆弱性が生まれる
 * あと、fsとかhttpみたいなNode.jsにしかないAPIを使ってるモジュールは当然動かない

---

# browserify

 * ブラウザにJSから外部JSを読み込む仕組みはない
 * じゃあrequireで呼ばれた全JSをくっつけて一枚にしようぜ
 * Node.jsのAPIも一応ブラウザで動くようにする

---

# bundle.js

---

```sh
$ browserify main.js -o bundle.js
```

 * requireをすべてconcatで解決（力技）
 * bundle.jsができる（でかい）

---

# 多少でかくても最近の人は気にしない

---

# webpackも大体いっしょ

---

# ES6 Import

---

# ES6 Import

 * requireみたいなやつを標準化しようとしてできた
 * 非同期読み込みの効率化、内部の隠蔽など…
 * 静的解析に強くなるらしい
  * TypeScriptの型チェックやrollupのTree shakingでは重要
 * 詳しくはよくわからん

---

Nodeのrequire互換の書き方

```js
var lib = require("./lib");
```

ES6

```js
import * as lib from "./lib"
```

---

ES6 Classと使う

```js
import {MyClass} from "./lib"

new MyClass().hello();
```

```js
export class MyClass{
  hello(){
    console.log("hey");
  }
}
```

---

# 問題点：Edge以外誰も対応してない

---

# requireにコンバートすればとりあえず動くのでは…

---

 * Babel, TypeScriptはES6 Importをrequireに変換できる
 * requireに変換したあとはbrowserifyかwebpackでconcatすればブラウザで動く
   * 単体でもbundle化可能だったかも？やったことはないが・・・

---

# ここまでする必要あんの

 * 「JSをビルドする」のが常態化
 * モジュールバンドラ使わなくてもscriptタグで読みこめばええやん的な話はある
 * scriptタグで読み込んだものはすべてグローバルなので、その辺が許せればいいんでは
 * 自分の立場：TypeScriptみたいに、ビルドついでに型チェックのようなオマケがつくなら積極的にやりたい


---

# 各ブラウザがES6 Module対応するまでとりあえずこれで…

---

# おわり
[rvm] rvm バージョンアップする方法  ~ 0から始めるRails編 ~

[rvm] rvm バージョンアップ方法

bundle install をした際に以下のようなエラーが表示されたのですが,
rvm 1.26.11ver ではruby 2.2.3ver　までしかインストールできないので,
これを機会にrvmをバージョンアップしようと思います。


```:error
gem install ruby_dep -v '1.4.0'
Gem::InstallError: ruby_dep requires Ruby version >= 2.2.5, ~> 2.2.
```

## 環境
rvm 1.26.11
ruby 2.2.3
CentOS 6系

## バージョンアップ後
rvm 1.27.0

## バージョンアップ

1.gpgの署名

```:terminal
curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
```

2.rvmインストール

###安定板
```:terminal
rvm get stable
```
ちなみに最新版を入れたい方はこちら
###最新版
```:terminal
rvm get latest
```

3.確認

```:terminal
rvm -v
> rvm 1.27.0ならOK
```

## おまけ


```:error
gem install ruby_dep -v '1.4.0'
Gem::InstallError: ruby_dep requires Ruby version >= 2.2.5, ~> 2.2.
```

このエラーを治すにはRubyのバージョンアップも必要なので,ついでに記載します。

1.Ruby 2.3.0 インストール

```:terminal
rvm install 2.3.0
```

2.デフォルトで指定

```:terminal
rvm --default use 2.3.0
```

3.bundler インストール
初期だと入っていないので, インストールします

```
gem install bunder
```

これで通常通りに開発できるようになりました。
brew update で エラー /usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory

## エラーメッセージ

`brew update` をしたら、次のようなエラーが (全文)

```bash
$ brew update
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
Error: update-report should not be called directly!
```

## 解決方法

`brew prune` を実行する

```bash
$ brew prune
$ brew update
Updated 6 taps (caskroom/cask, homebrew/brewdler, homebrew/core, homebrew/dupes, homebrew/php, homebrew/services).
==> New Formulae
...(以下略)
```

rbenv と phpenv を同居させようと、いろいろ `.zshrc` をいじっていたからかな…？
Webプログラマ向けハードウェア自動設計ツールmille-feuille（ミルフィーユ）～回路図自動生成ツールとは～

↓動画です
[![youtubeにアクセスしてください](http://img.youtube.com/vi/unjAE7fYMFo/0.jpg)](http://www.youtube.com/watch?v=unjAE7fYMFo)

#コンセプト

ミルフィーユ基板（mille-feuille board）はWebプログラマ向けの回路図自動生成ツールです。
Webプログラマがハードウェアの試作から量産用の回路図生成までを素早く簡単に作ることが可能です。
回路図があれば、量産用の基板を作ることもできますし、オリジナル基板としてロボットに組み込むこともできます。
ハードウェアの知識、半田付けは必要ありません！
ユーザーがハードのプログラミングをすることもありません！
プログラマがハードも作れるようになれば、ものづくりの幅がもっと広がりますね。

#ミルフィーユ基板を使った設計の流れ

ミルフィーユを使ってオリジナル基板ができるまでの流れです。

Step1 : ミルフィーユを使って試作
Step2 : 回路図自動生成ツールを使って回路図とファームウェアを生成
Step3 : アートワークをして、基板製造業者に依頼
☆オリジナル基板の完成！

ミルフィーユができるのはStep2までです。
生成された回路図は仕様書としても利用できますよ。

###Step:1 試作　

はじめに、ミルフィーユを使って試作をしましょう。
ミルフィーユはRaspberry Pi、ベースボード、モジュールボード、フレキシブルケーブル、デバイスボードを重ねたり、つなげたりすることで使用することができます。

![HardAll.jpg](https://qiita-image-store.s3.amazonaws.com/0/96369/1c0789be-ea7d-035f-aa2e-c81f72f790f7.jpeg)

ミルフィーユには自動配線機能が搭載されています。
通常は、ブレッドボード、デバイス、Raspberry Piに手で配線していた作業を、ミルフィーユはコネクタを重ねるだけで何のデバイスが差し込まれたかを認識し、自動で配線します。配線作業のわずらわしさがありません。
現状は2個のデバイスボードを同時に接続・制御することが可能です。

####自動配線機能
デバイスボードには1つ1つアドレスが割り振られています。
モジュールとデバイスボードをフレキシブルケーブルでつなげると、モジュールがデバイスボードのアドレスを読み取り、プログラムからアクセスできるようになります。
ユーザーが実行したプログラムに対して、ミルフィーユがどのように配線するかを自動で判断し、デジタルスイッチ群を介して自動で配線してくれます。

####ライブラリ
デバイスの難しい制御はすべてライブラリに入っているため、ユーザーはread(  )などで簡単な関数を呼び出すだけでセンサーの値を読んだり、モーターを動かすことができます。

###Step:2　回路図とファームウェアの自動生成

Step1で試作したデバイス構成を元に回路図とファームウェアを生成します。
ここで生成される回路図とファームウェアには、自動配線機能などミルフィーユに関する配線データは含まれていません。
従来通り手で配線した場合と同じ回路図とファームウェアが生成されます。

####回路図とファームウェアの自動生成機能
はじめに、ミルフィーユから回路構成のデータを取り出します。
Pythonから“detect.py”を実行すると、ミルフィーユにつながっている回路構成を取りまとめ、1つのファイルが作られます。
そのファイルをサーバーにアップロードするとオリジナルの回路図と、その配線に関するファームウェアのみ生成されます。

####Eagle CADへの取り込み
生成された回路図はEagle CADのスクリプトです。スクリプトを実行すると自動で回路が書かれていきます。

![schematic.png](https://qiita-image-store.s3.amazonaws.com/0/96369/bdf28c31-79c7-4079-a92a-dfa8c02eae18.png)

###Step:3　アートワークと基板の発注

ここからはオリジナル基板を作るための作業であり、ミルフィーユではできない作業です。
回路図だけでも基板屋さんに発注をすることが可能です。

####アートワーク
回路図が出来上がったら自分の作りたい基板サイズに合わせてアートワークしていきます。
自分でアートワークをする場合は、どのように配線すればよいかというガイド線が部品ごとに表示されていますので、基板に合わせて部品を配置してください。
アートワークに自信がない場合はEagle CADのオートルーター（自動アートワーク機能）を使うか、業者さんや友人に依頼してください。

####ガーバー出力と発注
基板を作り出すためには、機械で基板を加工するためのデータであるガーバーデータが必要です。
アートワーク後にガーバーデータと部品リストをEagle CADから出力することができます。
そのデータを基板屋さんに渡せば、オリジナルの基板を作ってもらうことができます。部品の実装までできる業者さんだとより楽チンです。

基板屋さんなどの業者さんの情報も随時アップしたいと思います。

####プログラムの移行
Step:1で試作したプログラムをオリジナル基板に移行します。
Step:2で生成された配線に関するファームウェアをStep:1のファームウェアと差し替えます。この作業を行うことでミルフィーユの配線データを抜いたものと差し替わり、配線に関するデータ以外のプログラムもオリジナル基板で使えるようになります。


####オリジナル基板の動作確認
オリジナル基板が完成したら、必ず動作確認を行ってください。基板はアートワーク次第でノイズが入ってしまうなどの不具合が生じるものです。プログラムと同じで絶対に1回でうまくいくとは限らないと思っていてください。

![KIMG0918.jpg](https://qiita-image-store.s3.amazonaws.com/0/96369/8d2786f3-13c2-694d-971d-1f9c7d7d3f3c.jpeg)

###おまけ　小ロット量産
量産の方法もいろいろありますが、基本的には業者さんに大量発注すると安いです。
アートワークから動作確認まで行ってくれるような業者さんに任せると便利ですね。
生成された回路の仕組みを理解できない場合は、回路に慣れるまでは小ロット生産した方が安全です。
CensOS6.8にgcsfuseをインストールしてGCSをマウント

##概要
Google Cloud StorageをCentOS6.8にマウントする

##gcsfuseをインストールする
###Configure the gcsfuse repo:

```
$ sudo tee /etc/yum.repos.d/gcsfuse.repo > /dev/null <<EOF
[gcsfuse]
name=gcsfuse (packages.cloud.google.com)
baseurl=https://packages.cloud.google.com/yum/repos/gcsfuse-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
       https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
```

###Install gcsfuse:
```
$ sudo yum install gcsfuse
```

##マウントする
###GCPへログインする
`$ gcloud auth login`

###プロジェクトを指定する
`$  gcloud config set project [プロジェクトID]`

###バケット作成
バケットを作成していない場合は作成する
`$ gsutil mb -c S -l ASIA gs://my_baquet_name`

###マウントする
`$ gcsfuse my_baquet_name /path/to/mount`


##確認
```
$ cd /path/to/mount
##5Gのダミーファイルを作成
$ dd if=/dev/zero of=tempfile5G bs=1G count=5
$ ll
-rw-r--r--. 1 admin admin 5.0G Aug  4 06:17 tempfile1G
```

コンソールでも確認
![2016-08-04 15_26_27-baqet03 バケット - My First Project.png](https://qiita-image-store.s3.amazonaws.com/0/76278/4f4e3249-1123-338e-23f2-6b47021a467c.png)

##起動時にマウントする
↓fstabに記述する方法がわからなかったのでとりあえず
追記する

```/etc/rc.local
su - [実行するユーザ名] -c "gcsfuse my_baquet_name /path/to/mount" 
```
↑rootで実行されるため`su - [実行するユーザ名]`で実行ユーザを指定するようにしている

##マウントを外す場合

```bash
$ fusermount -u /path/to/mount`
```

busy状態でアンマウントできない場合`-z`オプションを加える

```bash
$ fusermount -zu /mnt/dirb01/
```

##参考
[gcsfuse/docs/installing.md](https://github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/installing.md)
[GoogleCloudPlatform/gcsfuse](https://github.com/GoogleCloudPlatform/gcsfuse)
まだベータ版品質だと思って使用したほうがよいらしい。
Eloquentのデータ取得について


#複数の結果を取得

##全部：all()

```
$user_id = 10;
$trips = Trip::all();
```

##条件で絞込：where(whereNameとか)->get()

###where('プロパティ名','符号','比較内容')->get()

```
$trips = Trip::where('account_id', '=', $user_id)->get();
```

###whereName('比較内容')->get()も可

whereとプロパティ名をキャメルケースでつなげる

```
$trips = Trip::whereName('田中太郎')->get();
```
&nbsp;

##複数の結果を返すメソッドではforeachが可能

```
foreach ($trips as $trip) {
	echo $trip->title;
```

#１つの結果を取得

##idを使う場合

```
$trip = Trip::find(10);
```

##それ以外をキーとして使う場合

```
$trip = Trip::where('account_id', '=', $user_id)->first();
```

##get()でも取ったら結果が１つでも配列になる

```
$trips = Trip::where('account_id', '=', $user_id)->get();
$trip = $trips[0]; // この手間が増えてめんどう
```
AWS Cognito User Pools のサインアップ時に NotAuthorizedException が出る (JavaScript)

# 現象
User Pool を作成した後に、[aws/amazon-cognito-identity-js の Usage1](https://github.com/aws/amazon-cognito-identity-js#usage)を参考にサインアップしようとしたところ、下記のエラーが出て失敗してしまいました。

```
NotAuthorizedException:Unable to verify secret hash for client ***
```
(`***` は Client ID)

# 解決策
ばっちりのケースがありました。
[AWS Cognito Identity NotAuthorizedException](http://stackoverflow.com/questions/37603822/aws-cognito-identity-notauthorizedexception)

JavaScriptで実装する場合、secret key を使わない設定にする必要があったみたいです。

`User Pools > Apps` でキーを作り直します。`Add another app`をクリックして、今度は `Generate client secret` のチェックを外して作成します。

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/43328/d8ab4f4c-93d1-5a12-b939-d94a534045c6.png)
gulpビルドしたあとに差分ファイルを書き出すMakefileとシェル



webサイトをつくる開発環境をMiddlemanをよく使ってたんですがv4になって
色々変更があり、Middlemanのいいところが少なくなってきた気がしたので
結局gulpに戻ってきた。

Middleman、ビルドした時にターミナルに変更ファイルとか出て
なんとなく気に入ってたのでgulpもビルドした時にそういうの出したいな〜〜〜
なんなら差分ファイルまで抽出してくれたらもっと嬉しいな〜〜〜〜
と思ったのでやってみた。

#できたやつ
gulpビルドしたあとにターミナルで無理矢理いろいろしてる。
ほとんど初めてシェル的なやつを調べながら書いたので
確実にもっといい方法があるはず。誰かおしえて下さい。

```
# ./tmp以下にバックアップ
cp -r ./build ./.tmp
# ./ビルドと前回のdiffをけす
rm -rf build/ diff/ diff.txt
# gulpビルド
gulp build #各々ご自由に(ビルドファイルは build/に出すこと)
# tmp/ と buildのdiffを出す
diff -qr ./build/ ./.tmp/ > diff.txt; [ $$? -eq 1 ] || exit 0
# diff.txtを整理
sed -i '' -e 's/Only in .\/build/+add    .\/build/' ./diff.txt
sed -i '' -e 's/Only in .\/.tmp/-remove .\/build/' ./diff.txt
sed -i '' -e 's/Files/Update /' ./diff.txt
sed -i '' -e 's/: /\//' ./diff.txt
sed -i '' -e 's/and.*//' ./diff.txt
# .tmpは削除、
rm -rf .tmp/
# 一時的にフォルダつくって差分ファイルを出す
mkdir -p diff_files/build || exit 0
# diff吐き出しますよーなシェル
sh diff.sh
rsync -ar diff_files/build/ diff/ || exit 0
# 一時フォルダは消す
rm -rf diff_files/ .tmp/
#################################
####### build complete!!! #######
#################################
```

```diff.sh
cat ./diff.txt | while read line
do
  IFS=' '
  set -- $line
  if [ `echo "$1" | grep "+add"` ] ; then
    echo "\033[0;31m$line\033[0;39m"
    rsync -R "$2" diff_files/
  fi

  if [ `echo "$1" | grep "\-remove"` ] ; then
    echo "\033[0;35m$line\033[0;39m"
  fi

  if [ `echo "$1" | grep "Update"` ] ; then
    echo "\033[0;34m$line\033[0;39m"
    rsync -R "$2" diff_files/
  fi
done
```

#かいせつ

`cp -r ./build ./.tmp`
前回ビルドしたやつがbuild以下に残ってるはずなので比較するために
一旦tmpへ移動

---

`rm -rf build/ diff/ diff.txt`
前のdiffファイルとかbuildとかは消す

---


`gulp build #以下、ご自由に(ビルドファイルは build/に出すこと)`
各々ご自由にgulpビルドする(別にgulpじゃなくてもいい)

---

`diff -qr ./build/ ./.tmp/ > diff.txt; [ $$? -eq 1 ] || exit 0`
diffコマンドで tmp と build のdiffをとって結果をdiff.txtに出力

---

```
sed -i '' -e 's/Only in .\/build/+add    .\/build/' ./diff.txt
sed -i '' -e 's/Only in .\/.tmp/-remove .\/build/' ./diff.txt
sed -i '' -e 's/Files/Update /' ./diff.txt
sed -i '' -e 's/: /\//' ./diff.txt
sed -i '' -e 's/and.*//' ./diff.txt
```

diff.txtの中身は生のままだとこの後の処理がしづらかったので無理矢理
テキストの中身をいじる。上から、

- "Only ~ ./build"は追加されたファイルなので "+add~"に置換
- "Only ~ ./tmp"は削除されたファイルなので "-remove~"に置換
- "Files~"は更新ファイルなので "Update"に置換
- 邪魔な": "の文字は"/"に
- 変更ファイルのand以降の文字列いらないので削除

最終的にはこんなファイルにする

```diff.txt
+add    ./build/img/_bg.png
-remove ./build/img/bg.png
Update  ./build/sp/css/page.css 

```

---

`mkdir -p diff_files/build || exit 0`
次にする処理の準備。これがあると差分がなかった時にrsyncでエラーでない

---

`sh diff.sh`
ここまでやったらターミナルにも表示したいよねっていうシェル
やってることは各行の文頭の文字列を判別して
色分けしてechoする。
色分け重要。みやすい。
ついでに、diff_files以下に差分ファイルをコピーする。

---

`rsync -ar diff_files/build/ diff/ || exit 0`
build以下のファイルを対象にrsyncすると一番上のディレクトリにbuildがついて
diff_files/build/img/bg.png
みたいな階層構造になる。理想は
diff_files/img/bg.png

1回でこうしたかったんだけど無理そうだったので
diff_files/build　以下を diff/ 以下にrsyncしなおす。

---

`rm -rf diff_files/ .tmp/`
diff_filesと.tmpは一時ファイルなので消す。

#おわりに

80%くらい自己満足のためにがんばった。

こうすれば一発でできるじゃん！みたいなの教えて下さい。
こういうシェルとかmakefileとかさらっと書けるようになったら
結構業務効率が上がるし、うまくいったとき少し気持ちがいいきがするので
少しずつ覚えたい。
Mac で .icns ファイルから Xcode 向けのアイコンにバラす方法

# これは何か

既存の ICNS ファイルを Xcode に追加する方法になります。

# 手順

icns ファイルがあるディレクトリで、以下のコマンドを実行します。 

```bash
iconutil --convert iconset AppIcon.icns
```

変換後はドラッグ＆ドロップで Xcode の Assets に追加していきます。

# 参考
[Creating OS X document icons or: how to convert an icns file to png files - blach.io](http://blach.io/2013/03/11/creating-os-x-document-icons-or-how-to-convert-an-icns-file-to-png-files/)
AWS Management Console のカスタムメニューを復元する

AWS Management Console では、上部によく使うプロダクトのカスタムショートカットメニューを設定できて便利です。ですがその設定はブラウザのクッキーに保存されているのみでIAMユーザに紐付けて保存などはしてくれない為、マルチプロファイルやシークレットウィンドウを駆使して複数アカウントのコンソールの同時利用とかをしているとウィンドウ毎にメニューがまちまちだったりリセットされて空だったりして毎回設定し直すのも微妙に不便です。

そこで一つのウィンドウで行った設定を Javascript スニペットとしてエクスポートして、コピペで他ウィンドウ上に復元出来るようにしてみました。とりあえずはデベロッパーコンソールに貼り付けての利用で間に合ってるけど、お好みでブックマークレットとかにしておいても良いと思います。

# Export script

使い方は以下の通りです。

1. マネージメントコンソールを開いた状態でデベロッパーコンソールを開き、下記コードをコピペして実行
2. プロンプトが出てきて復元用コードスニペットが表示される
3. メニューを復元したい別ウィンドウでマネージメントコンソールを開き、2.のコードをコピペして実行

```javascript:export_custom_menu.js
!function(){
  const name = 'noflush_awscnm';
  const value = document.cookie.split(/;\s*/)
    .map(kv=>kv.split(/=/))
    .reduce((p,c)=>Object.assign(p,{[c[0]]:c[1]}), {})
    [name];
  const domain = 'console.aws.amazon.com';
  const path = '/';
  const maxAge = 365*24*3600
  const cookie = `${name}=${value}; domain=${domain}; max-age=${maxAge}; path=${path}; secure`;
  const snipet = `(document.cookie='${cookie}')&&location.reload()`;
  window.prompt("Snipet of AWS Custom Menu", snipet);
}();
```

やってることは `noflush_awscnm` という名前のクッキーを取得＆セットしてるだけです。

ところで最近はブラウザでも普通に ES2016 でコードが書けて快適ですね。ちなみに僕は PC ではほぼ Chrome しか使ってないので上記コードが他ブラウザで動くかどうかの確認まではしてませんがあしからず。
Eloquentのソート（並び替え）


#ポイント

- `orderBy` で並び替え
- `get()` の呼び出し忘れずに
- descは小さくなっていく
- ascは大きくなっていく

```
$trip_contents = TripContents::orderBy('recruitment_end_date', 'asc')->get();
```

絞込操作とつなげたり。

```
$trips = Trip::where('is_pending', '=', false)
    ->orderBy('created_date', 'asc')
    ->lists('trip_id');
```

##ちなみにDBファザードの場合は

```
DB::table('book')->orderBy('published', 'asc')->orderBy('price', 'desc')->toSql();
```
Spark2.0をEMRで試す

## 概要

一週間前くらいにSpark2.0が出ました。そして、今日確認したらEMR5.0が既にSpark2.0対応されていました。さすがAWSさんです！

ということで、Spark2.0でイマドキのSpark実行を簡単にメモしておきます。

## ゴール

- Spark2.0が動く
- Scala2.11ビルドしたjarが動く
- Java8で動く
- YARN分散環境上で動く

## EMR設定

Software Configurationにて以下のように設定

- emr-5.0.0
- hadoop2.7.2
- Spark2.0.0
- configurationに以下のjsonを追加
  - Java8の設定と、sparkに最適化する設定を行っています。

```json
[
  {
    "classification": "spark",
    "properties": {
      "maximizeResourceAllocation": "true"
    }
  },
  {
    "Classification": "hadoop-env",
    "Configurations": [
      {
        "Classification": "export",
        "Configurations": [],
        "Properties": {
          "JAVA_HOME": "/usr/lib/jvm/java-1.8.0"
        }
      }
    ],
    "Properties": {}
  },
  {
    "Classification": "spark-env",
    "Configurations": [
      {
        "Classification": "export",
        "Configurations": [],
        "Properties": {
          "JAVA_HOME": "/usr/lib/jvm/java-1.8.0"
        }
      }
    ],
    "Properties": {}
  }
]
```

## Sparkアプリ

```scala:build.sbt
//nameとかは省略
//sbt-assemblyが入ってる前提

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "2.0.0" % "provided"
)

assemblyOption in assembly := (assemblyOption in assembly).value.copy(includeScala = false)
```

```scala:Main.scala
import org.apache.spark.{SparkConf, SparkContext}

object Main {
  def main(args: Array[String]): Unit = {

    val conf = new SparkConf().setAppName("Simple Application")
    val sc = new SparkContext(conf)
    val rdd = sc.range(1, 100000, 1, 10)
    println("----Start----")

    //check for using scala-library_2.11
    //if using 2.10, this method cause Exception.
    println("hello" -> "world")

    rdd.map(i => i*2)
      .foreach(i => println(i))
  }
}
```

こんな感じで書いて、sbt assemblyすればOK

## EMRからアプリを実行

assemblyしたjarをS3にアップロードします。

後はEMRクラスタを構築して、起動オプションを以下のように設定すればOK

```
# この2つは、MasterNode上で任意のshellコマンドを叩くことを示しています。
JAR location: command-runner.jar
Main class: None

# spark-submitコマンド
Arguments: spark-submit --deploy-mode cluster 
--class com.github.uryyyyyyy.Main 
--master yarn 
--num-executors 2 
--driver-memory 1g 
--executor-memory 1g 
--executor-cores 1 
s3://<your-s3-bucket>/jars/<your-assembly-0.1.0.jar> <起動オプション>

# 実行中に失敗したらクラスタをどうするか
Action on failure: Continue
```

こんな感じで実行できます。

もしくは、Master Nodeにsshで入って`spark-submit ~~~` を実行しても動きます。

## まとめ

これだけで上記のゴールが達成できます。
Spark2系はデフォルトでscala2.11ビルドなのが嬉しいですね。

https://aws.amazon.com/blogs/aws/amazon-emr-5-0-0-major-app-updates-ui-improvements-better-debugging-and-more/

> It also updates Spark (an engine for large-scale data processing) from 1.6.2 to 2.0, with a similar move to Scala 2.11.
[iOS] XCodeのPlaygroundでシングルトンを試す

デザインパターンとして多様されるシングルトン。
超基本だけど、ほんとにシングルトンとして機能しているか自信なかったのでXcodeのPlaygroundで試してみました。
何かご指摘があればコメントいただけると幸いです。

```swift:SingletonPlayground.playground
/*
 シングルトンを保証する検証。
 
 Singletonクラスのobjクラス変数を複数回呼び出して、
 Objectクラスのvalueクラス変数が1のままならシングルトンとして正しい。
 */
class Singleton {
    static var obj = Object()
    var obj2 = Object()
}

class Object {
    static var value = 0
    init() {
        Object.value += 1
    }
    func get() -> Int {
        return Object.value
    }
}

print(Singleton.obj.get())
print(Singleton.obj.get())    // シングルトンでなければ2になっているはず
print(Singleton().obj2.get()) // シングルトンではないので初期化されカウントアップ
print(Singleton().obj2.get())
print(Singleton.obj.get())

//  結果
// "1"
// "1"
// "2"
// "3"
// "3"
```
Xeon > 性能リスト > コア数 / TDP / 1CPUのピーク性能(倍精度)

Xeon E5には色々な型番があり、どのような性能なのか不明だった。

以下のリストが分かりやすかった。
http://www.hpc.co.jp/compare_intel_processors.html

例として

- E5-2620v3 : 201.6Gflops
- E5-2650v3 : 320.0Gflops
- E5-2650v4 : 345.6Gflops

選択する指標としては、コア数、TDP、1CPUのピーク性能(倍精度)あたりが気になる。

E5-2687W v4という1つだけ「W」付きのものがある。TDPが160Wなどでその点は要注意。
Wの意味は見つかっていないが、WorkstationのWなのだろうか。
cakephpデータを取得する


```php
http://book.cakephp.org/1.2/ja/The-Manual/Developing-with-CakePHP/Models.html#id8
<?php
array(
    'conditions' => array('Model.field' => $thisValue), //条件の配列
    'recursive' => 1, //int
    'fields' => array('Model.field1', 'DISTINCT Model.field2'), //フィールド名の配列
    'order' => array('Model.created', 'Model.field3 DESC'), //文字列か配列でのorder定義
    'group' => array('Model.field'), //GROUP BYするためのフィールド
    'limit' => n, //int
    'page' => n, //int
    'offset' => n, //int
    'callbacks' => true //false, 'before', 'after'が指定できます。
)
```
Windows 10 Redstone 2 14894ダウンロード＆アップデート

<strong>アップデートする前システムと大事なデータをバックアップしておく</strong>

Windows 10 Redstone 2 14894にアップデートする前、システムと大事なデータをバックアップしておくことで、データの紛失には至りません。バックアップソフト<a href="http://jp.easeus.com/backup-software/home-edition.html">EaseUS Todo Backup</a>を薦めます。システムと大事なデータをワンクリックでバックアップできます。無料版で体験することはできますので、一度試してみればと思います。

<strong>Windowsトラブルシューターでシステムエラーを修復する</strong>

１．サーチで「troubleshooting」と検索して、「System and Security」にて「Fix problems with Windows Update」とタップします。
２．「Advanced」にて「Apply repairs automatically」をチェック入れます。
３．「Run as administrator」とタップして、「Next」をクリックしてプロセスを終了させます。

<strong>安心しながらWindows 10 Redstone 2 14894にアップデートする</strong>

１．「Settings」→「Update & security」→「Windows Update」。
２．アップデートが検索されなかった場合、「Check for updates」をクリックして、アップデートが見つかったら、「Download now」をタップします。
３．Windowsシステムが自動的に新しいビルドにアップデートします。
また、ダウンロードリンクをご提供いたしますので、直接にISOファイルをダウンロードしてからインストールすることもいいです。
ansibleコマンドで特定のホストに対してyum updateを行う

ansible 2.1.0.0にて動作確認。

### hosts

```sh
$ cat hosts
[app]
app01 ansible_host=xxx.xxx.xxx.xxx
[log]
log01 ansible_host=xxx.xxx.xxx.xxx
[vagrant]
localvm ansible_host=localvm ansible_user=vagrant
```

上記架空のhostsに於いて、log01にのみ`sudo yum -y update`を実行したい場合を例として記述します

#### shellコマンドを直接入力する方法

```sh
$ ansible log01 -b -a 'yum -y update'
log01 | SUCCESS | rc=0 >>
読み込んだプラグイン:changelog, fastestmirror, security
更新処理の設定をしています
Loading mirror speeds from cached hostfile
 * base: mirrors.cug.edu.cn
 * epel: mirrors.ustc.edu.cn
 * extras: mirrors.cqu.edu.cn
 * updates: centos.ustc.edu.cn
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package elasticsearch.noarch 0:2.3.4-1 will be 更新
---> Package elasticsearch.noarch 0:2.3.5-1 will be an update
---> Package kibana.x86_64 0:4.5.3-1 will be 更新
---> Package kibana.x86_64 0:4.5.4-1 will be an update
--> 依存性解決を終了しました。

依存性を解決しました
```

`-b`はbecomeオプション。sudo用です。

log01をlogとすればグループに対して実行可能です。

#### yumモジュールを使う方法

```sh
$ ansible log01 -b -m yum -a "name=* state=latest"
log01 | SUCCESS => {
    "changed": false,
    "msg": "",
    "rc": 0,
    "results": [
        "Nothing to do here, all packages are up to date"
    ]
}
```

こんな感じになります。

### 私は限定的に利用しています

本番サーバーのパッケージを確認無しでアップデートするのは危ないので。

[CVE情報からサーバーの脆弱性をスキャンできるツールVuls（バルス） \- ログってなんぼ＠新館](http://okisanjp.hatenablog.jp/entry/2016/06/30/192321)

vulsで脆弱性チェックを行って、アップデートの必要があるhostとパッケージをちゃんと把握できている場合には積極的に使っています。楽です。

[※この記事は個人blogエントリの校正版です](http://okisanjp.hatenablog.jp/entry/ansible_host_yum_y_update)
Docker で /etc/cron.d を使って cron を実行する

docker で /etc/cron.d 以下にファイルを置いて cron を実行した際にハマったのでメモ。

# 環境

docker バージョン : 

```shell-session:shell
$ docker -v
Docker version 1.10.3, build 3cd164c
```

イメージのベースは、debian :

```dockerfile:Dockerfile
FROM debian:wheezy
```


# 手順

## 1. cron をインストールする

```dockerfile:Dockerfile
RUN apt-get update
RUN apt-get install -y cron
```

## 2. /etc/cron.d 以下に cron の設定ファイルを置く

```cron:simple-cron
* * * * * root /script.sh
# An empty line is required at the end of this file for a valid cron file.
```

```dockerfile:Dockerfile
ADD simple-cron /etc/cron.d/simple-cron
RUN chmod 0644 /etc/cron.d/simple-cron
```

## 3. cron から呼び出されるスクリプトを置く

```bash:script.sh
echo "$(date): executed script" >> /var/log/cron.log 2>&1
```

```dockerfile:Dockerfile
ADD script.sh /script.sh
RUN chmod +x /script.sh
```

## 4. cron を起動する

```dockerfile:Dockerfile
CMD cron && touch /etc/cron.d/simple-cron && tail -f /dev/null
```

cron 起動後に、/etc/cron.d/simple-cron のタイムスタンプを更新しないと、実行されなかった。


# 使用例
- https://github.com/ars096/docker-cron-backup-mongodb

# 参考

- https://github.com/cheyer/docker-cron
- http://qiita.com/rerofumi/items/fc0126c4e985b78f769b
【Unity拡張】Unityエディタでおみくじが引きたい【ネタ】

#はじめに
Unityでおみくじが引きたかったので作ってみました

#作ったものについて
あらゆるウィンドウにおみくじが表示されます。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/ed2f7624-5625-fbd5-83ef-5284d4f0edff.png">

#ソースコード
テキスト表示まわりの処理は大草原クラス(https://gist.github.com/anchan828/7970330) を参考にさせていただきました。

```EditorOmikuji.cs
﻿using UnityEngine;
using UnityEditor;
using System.Collections;

public class EditorOmikuji
{
	static EditorWindow[] windows;
	static string text;

	[MenuItem("Omikuji/Omikuji")]
	static void Omikuji()
	{
		text = texts[Random.Range(0, texts.Length)];
		windows = Resources.FindObjectsOfTypeAll<EditorWindow> ();
		EditorApplication.update += () => {
			if (windows.Length != 0) {
				try {
					windows [0].Focus ();
					windows [0].ShowNotification (new GUIContent (text));
					ArrayUtility.RemoveAt (ref windows, 0);
				} catch (System.NullReferenceException) {
				}
			}
		};
	}

	static readonly string[] texts = new string []
	{
		"大吉",
		"中吉",
		"小吉",
		"吉",
		"末吉",
		"凶",
		"大凶"
	};
}
```

<br>
大凶が出るとちょっとショック...
<img height = 600 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/847f12bc-632b-1f20-988d-edd98e916e6c.png">