OmniAICreator/Qiita-1.07M huggingface dataset:
cmderでカーソル位置が一文字ずれたときの対処法

## 現象

cmderでコマンド履歴を戻り続けると行頭に一文字入ってしまって、編集すると一文字ズレて入力される。
カーソル位置と実際の位置がずれるので、誤入力してしまっておこ。

![cmder01.png](https://qiita-image-store.s3.amazonaws.com/0/36728/18ddafc8-10ac-5e14-bac6-69d4cbaed7cd.png)

ほんとは`cd dev/src/bitbucket.org/`という履歴なんですけど、なぜか頭に一文字入ってしまう。。

環境は、

* windows10
* cmder version1.3.0 (full version)

です。
cmderは宗教上の理由からbashで使用。

## 対処法

bashの起動時に、cmderのgit for windowsは使わずに、別途インストールしたgitを使う。
具体的には、設定画面を開いて、[Startup]－[Tasks]で新しいタスク(custom bash)を作成して、起動コマンドを`cmd /c "C:\PROGRA~1\Git\bin\bash --login -i" -new_console:d:%USERPROFILE% `とする。
ついでに、[Default task for new console]にもチェック。

![SnapCrab_NoName_2016-7-30_21-49-22_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/36728/7e8bfaf4-903a-58c3-dde8-0c4ce6835ae5.png)

## 原因

cmderのbashは、ソフトに内包されているgit for windowsをつかっているんですけども、プロンプトの表示が`$`じゃなくて、`λ`を使っているのが悪さをしているようです。
`vendor\git-for-windows\etc\profile`を書き換えてもいんですけど、別途インストールしたgitを使いたいので今回は起動コマンドを変更しました。

## その他

cmderって便利ですね。
https://github.com/cmderdev/cmder

これを使えば`peco`でヒストリー検索やディレクトリ移動も簡単にできますよー

![SnapCrab_NoName_2016-7-30_22-1-52_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/36728/6c7b5424-8ea3-f1ce-a056-9a7531436dc4.png)

`.bashrc`はこんな感じですー
https://gist.github.com/kenji0x02/96fb75c031ab9bca8750bd47f89da584

あとは、上で作成したタスクで起動するように設定。
[Startup]－[Startup options]で[Specified named task]にチェックを入れて、上で作成したタスク`{custom bash}`を指定。

![SnapCrab_NoName_2016-7-30_21-48-49_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/36728/75f62d04-65e4-9d14-3283-689b5dd58b31.png)

これでWindowsでの最強のシェル環境が完成した（と思いたい笑）。
PS3コントローラ (DUALSHOCK3; SIXAXIS)をROSに接続する（無線編）

## 導入
以下の「2.ペアリング」の手順１〜１２を行う。

[PS3を使ったTurtlebotのテレオペレーション](http://wiki.ros.org/ja/turtlebot_teleop/Tutorials/PS3%20Joystick%20Teleop)

## 動作確認
ターミナルで
```
$ roscore
```

コントローラのPSボタンを長押しする。振動したらPCへの接続が完了。
別のターミナルで
```
$ rosrun joy joy_node
```

更に別のターミナルでTopicを確認してみる。
```
$ rostopic echo -c /joy
header: 
  seq: 1449
  stamp: 
    secs: 1469884038
    nsecs: 749963493
  frame_id: ''
axes: [0.0, 0.0, -0.0, -0.0, -0.04303591698408127, 0.11965344101190567, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.0, -0.0, -0.0, -0.0, 0.0, -0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
```

## Rasberry Pi3 (Ubuntu Mate)の場合
sixadのリポジトリが利用できないため以下の「For older versions of RetroPie」のように自力ビルドが必要
[Setting up a PS3 controller](https://github.com/retropie/retropie-setup/wiki/Setting-up-a-PS3-controller)
Eclipseにソースコードをアタッチするビルド設定


SpringBootにおいて、Spring Initializr(http://start.spring.io/) で設定を変更しながらいろいろなプロジェクトを作って試しています。
アノテーションのソースコードを見ようとして、F3を押してところ、ソースコードがないことが判明。
Spring Initializrでは、ソースコードをアタッチする設定を入れてくれない模様。残念ですが自分で追加すればいいだけ。

しかし、テンプレートを使って使いまわしていたので設定を覚えておらず毎回検索するのもどうかと思って、ここに備忘しておこうと思います。

基本的にはEclipseの設定では

* downloadSources
* downloadJavadocs

を扱います。downloadSourcesがソースコードをアタッチし、downloadJavadocsがJavaDocをアタッチする設定です。

## Mavenの場合

```xml:pom.xml

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-eclipse-plugin</artifactId>
				<configuration>
					<downloadSources>true</downloadSources>
					<downloadJavadocs>true</downloadJavadocs>
				</configuration>
			</plugin>
		</plugins>
	</build>
```

上記の例は、SpringBootのプラグインの設定もしてあります。

pom.xmlのbuildのpluginとして、maven-eclipse-pluginを追加し、このプラグインに対して、設定すればよいことになります。

## Gradleの場合

```build.gradle
eclipse {
    classpath {
       downloadSources=true
       downloadJavadoc=true
    }
}
```

Gradleの場合、eclipse pluginのclasspath設定に設定すればいいのですが、JavaDocの設定は英語の複数形のsがないことに注意する必要があります。
CircleCIでトピックブランチのビルドは失敗/復旧時だけ通知、デプロイするブランチのビルドは全通知する

# 概要

circleciの設定で、失敗/復旧時だけビルド結果をslackに通知することができる。程よい通知量になってとてもよいが、 デプロイ時の通知は毎回来て欲しい。
設定だけだと、両立させるのが難しそうだったので、Google Apps Scriptで動くAPIを書いた。

# 前提

- developブランチにpushするとstaging環境にデプロイ。masterブランチにpushすると本番環境にデプロイされるとする
- slackのapiトークンが必要
- [Slack BotをGASでいい感じで書くためのライブラリを作った](http://qiita.com/soundTricker/items/43267609a870fc9c7453)のライブラリーを使用

# コード

[Circle CIのビルド結果をHubotで通知](http://shokai.org/blog/archives/10011) を参考にGoogle Apps Script上で動くようにした。


GAS上で以下スクリプトをWebAPI公開する
スクリプトのプロパティ「token」にslackのAPIトークを設定

```js

function postMessage(room, message) {
  var prop = PropertiesService.getScriptProperties().getProperties();

  //slackApp インスタンスの取得
  var slackApp = SlackApp.create(prop.token);
  var channels = slackApp.channelsList().channels;
  var channelId = 0;
  for(var i = 0; i < channels.length; i++) {
    if(channels[i].name == room) {
      channelId = channels[i].id;
      break;
    }
  }
  
  //投稿
  slackApp.postMessage(channelId, message, {
    username : "circleci"
  });
}

function doPost(e) {
  var room = e.parameter.room
  var req = JSON.parse(e.postData.contents);
  
  var status    = req.payload.status;
  var subject   = req.payload.subject;
  var build_url = req.payload.build_url;
  var branch    = req.payload.branch;
  var reponame  = req.payload.reponame;
  var username  = req.payload.username;

  var deploy_branch = {"master":1,"develop":1};
  
  var header = (status == 'failed')?':no_good:':':ok_hand:';
  
  var message = [
    [header,"[",status.toUpperCase(),"]", subject, "["+username+"/"+reponame+"#"+branch+"]"].join(" "),
    build_url
  ].join('\n');
  
  if(branch in deploy_branch) {
    postMessage(room, message);
  }else {
    if(status == "failed" || status == "fixed") postMessage(room, message); 
  }
}
```

circle.ymlのwebhookに公開したAPIを指定する。

```yaml
machine:
  timezone:
    Asia/Tokyo
  ruby:
    version: 2.2.3
dependencies:
  cache_directories:
    - "vendor/bundle"
  override:
    - bundle -j4 --path=vendor/bundle

test:
  override:
    - bundle exec rake test
deployment:
  staging:
    branch: develop
    commands:
      - sh script/deploy-staging.sh
  production:
    branch: master
    commands:
      - sh script/deploy-production.sh
notify:
  webhooks:
    - url: https://script.google.com/macros/s/{公開したAPIのID}/exec?room={部屋の名前}
```
ロストテクノロジーの再活用 採番テーブル

SQLServerやPostgreSQLを使うことしかなくなって
（なぜか僕の案件ではMySQLの遭遇が少ない）、
AutoIncrementやらSerialをユニークキーにする設計が当たり前になっていて
RealmでSerial使えないことがちょっと不便に感じていた。

純粋に個人のデータとして設計する場合わざわざSerialのような値を持つ必要がなかったりするので、設計上Serialの必要性を排除できることが多いんだけど、それでもあると便利な時がある。
これを解決する方法の一つとして考えられるのが、
1997年くらいのときまで僕が先輩のテーブル設計でよく見かけていた

**採番テーブル**

構造は簡単で

| 列名 | 型 |
|:-----------------|:------------------:|
| シーケンスのオブジェクト名に当たるユニークな名称 |String|
| 現在のシーケンス値 | Integer |

というシンプルな構造で、このデータにアクセスすることで擬似的にシーケンスを作り出していた。
みただけで「あ。。。（察し）」なんだけど、ポイントがあるとすると
同一更新を排除するためにレコードロックをかけて更新すること。
くらいか。昔のクラサバとかだと、同時更新されることもあるからね。

どこかで誰かの役に立つことがあれば。
デモやプロトタイプで自由に使えるJSONデータが欲しいので作った

#考えたきっかけ

新しいウェブのアプリケーションやライブラリのアイディアを思いついたとき、人に説明するためにプロトタイプを作ることがある。

CSSを書かずにブラウザのデフォルトスタイルのままにして、画像は全部グレーの四角で、テキストは「○○○」や「ダミーダミーダミー」なら簡単だけど、やっぱり興味を引きにくい。

こんなときは、デザインにBootstrapなどを使い、画像はフリー素材から選べばあまり時間をかけずにいい感じのプロトタイプが作れる。

しかし、短い文章が100個欲しいとか、名前が100個欲しいとか、住所が100個欲しいなどのときはダミーデータを自動生成するか、どこかからデータを見つけてくるか、全部手打ちしていた。データを見つけてきてもそのままでは使いにくく加工が必要なことが多い。

こんなことが続いたのでデータのフリー素材があればいいのにと思うようになった。

#作ってみた

念のためにもう一回探してみたけど使いやすそうなデータのフリー素材が見つからなかったので、とにかくやってみようと思って作ってみた。

データの形式は統一されていたほうがいいと思い、どんな言語でも読み込みやすいJSONにした。登録する場所はどこかのサービスを使おうと思ったが、手ごろな場所が見つからなかったのでサイトを立てた。

FreeJSON.net - 無料で自由に使えるJSONデータ
http://freejson.net

手始めに、人名としてちょっと面白いかなと思って宝塚の現役生徒（いわゆるタカラジェンヌは生徒と呼ばれる）のデータや、投稿サイトのテキストデータとしていいかなと思って青空文庫の各作品の冒頭400文字を集めたデータなどを登録してみた。

#作った感想

実際にデータを作ってみると意外と面白い。プロトタイプを作るときは目的とは違うことなのでいやいや作る感じだが、データを作るのが目的になると気分も変わる。

また、宝塚の生徒のデータや青空文庫のデータなどは眺めるだけでも面白い。しばらくはコツコツデータをためていくつもり。データを更新したらハッシュタグ#FreeJSONでTweetする予定。

1人で作れるデータはたかが知れているので、このようなデータを集めるライブラリ的な仕組みが作れるといいのかもしれない。

#更新情報

2016-08-06 抹茶の銘の一覧を追加
2016-08-06 カフェにありそうなドリンクメニューを追加
2016-08-02 深呼吸する言葉・後藤裕文を追加（深呼吸する言葉プロジェクト http://shin-kokyu.jp から）
2016-08-01 常用漢字一覧を追加（@wakufactoryさんのご提供）
2016-08-01 日本の美術館の情報を追加（緯度経度情報あり）
Numba使用を前提とした単純移動平均のPythonコードについて


テクニカル指標で最も基本的な移動平均、そのなかでも単純移動平均(SMA)はただ平均を取るだけ、といってもSMA以外の多くのテクニカル指標の計算に使われています。実際、[GitHub](https://github.com/toyolab/MT5IndicatorsPy)に掲載している30個あまりのテクニカル指標のうち、SMAを使っているものは４割にのぼります。

今回は、そのSMAに特化して、いくつかのPythonコードを比較してみたいと思います。

# 準備
Pythonのパッケージ一式をアップデートしたので、Pythonおよび、使用したパッケージのバージョンは以下の通りです。

* Python 3.5.2
* numpy 1.11.1
* pandas 0.18.1
* numba 0.26.0
* scipy 0.17.1

まずは、
[Pythonでランダムウォーク](http://qiita.com/toyolab/items/6535420f5ef637a4d2e8)
を参考に100,000サンプルのランダムウォークを作っておきます。これをSMAの入力データとします。

````py
import numpy as np
import pandas as pd
from numba import jit

dn = np.random.randint(2, size=100000)*2-1
gwalk = np.cumprod(np.exp(dn*0.01))*100
````

# pandasのrolling,meanによる実装

SMAの一番簡単な実装は、pandasを使ったものです。Seriesのメソッドrolling,meanを使って簡単に書けます。

````py
def SMA1(x, period):
    return pd.Series(x).rolling(period).mean()
````

共通の仕様として、引数に入力時系列とSMAの期間を入れます。期間の違いによる比較も行いため、period=20,200で計測しておきます。

````py
%timeit y1_20 = SMA1(gwalk, 20)
%timeit y1_200 = SMA1(gwalk, 200)
````
````
100 loops, best of 3: 6.02 ms per loop
100 loops, best of 3: 6.01 ms per loop
````
pandasの場合、期間による実行速度の違いはないようです。

# scipyのlfilterによる実装

[Pythonで書いた移動平均の計算時間を比較してみた](http://qiita.com/toyolab/items/215a943c5cb0c677fa5a)
を参考に、scipyのフィルタ関数lfilterを使って実装してみます。

````py
from scipy.signal import lfilter
def SMA2(x, period):
    return lfilter(np.ones(period), 1, x)/period
````

同じように実行時間を計測してみます。

````py
%timeit y2_20 = SMA2(gwalk, 20)
%timeit y2_200 = SMA2(gwalk, 200)
````
````
100 loops, best of 3: 5.53 ms per loop
100 loops, best of 3: 10.4 ms per loop
````

lfilterはSMA専用でなく汎用的なフィルタ関数なので、期間によって実行時間が変わるようです。期間が短ければpandasより速いですが、期間が長くなると遅くなります。

# for文による実装(1)

SMAの計算式をfor文を使って直接書いてみます。当然、そのままだと遅くなることは目に見えているので、タイトルにもあるようにnumbaを使って高速化します。

````py
@jit
def SMA3(x, period):
    y = np.zeros(len(x))
    for i in range(len(y)):
        for j in range(period):
            y[i] += x[i-j]
    return y/period
````

````py
%timeit y3_20 = SMA3(gwalk, 20)
%timeit y3_200 = SMA3(gwalk, 200)
````
````
100 loops, best of 3: 3.07 ms per loop
10 loops, best of 3: 32.3 ms per loop
````

for文を使っていますが、numbaの高速化の効果があって期間が20の場合、これまでで最速です。ただ、期間に比例するので、200だと10倍遅くなってしまい、最遅となってしまいます。

# for文による実装(2)

最後の実装は、SMAの特徴を利用した方法です。SMAはサンプルを単純に加算するだけなので、１サンプル前の計算結果を使って、古いサンプル値を引いて、新しいサンプル値を足す計算だけを行います。

````py
@jit
def SMA4(x, period):
    y = np.empty(len(x))
    y[:period-1] = np.nan
    y[period-1] = np.sum(x[:period])
    for i in range(period, len(x)):
        y[i] = y[i-1]+x[i]-x[i-period]
    return y/period
````
サンプルが期間分揃うまで足していきますが、その後は３つのデータを加算するだけです。実行速度は以下のようになりました。

````py
%timeit y4_20 = SMA4(gwalk, 20)
%timeit y4_200 = SMA4(gwalk, 200)
````
````
1 loop, best of 3: 727 µs per loop
1000 loops, best of 3: 780 µs per loop
````
これまでの実装のなかで最速の結果が出ました。さらに期間が長くなってもほとんど変わらない結果となりました。

以上のように、numbaによる高速化を前提とすれば、SMAに関しては、for文を使っても結構高速になることがわかりました。
jquery ContextMenuライブラリで、項目を切り替える方法


jQuery contextMenuライブラリで、コンテキストメニュを作っています。
http://swisnl.github.io/jQuery-contextMenu/index.html

# コンテキストメニュの項目のラベルを切り替える方法、Disabledにする方法

下記のソースで実現できます。
Firefox46で確認しました。
参考サイト: https://swisnl.github.io/jQuery-contextMenu/demo/html5-polyfill-firefox8.html

```html:test.html
<!DOCTYPE html>
<head>
<meta charset="UTF-8">

<script src="jquery1.11.3.min.js"></script>
<script src="jquery.contextMenu.min.js"></script>
<script src="jquery.ui.position.min.js"></script>
<script src="test.js"></script>
<link rel="stylesheet" href="jquery.contextMenu.min.css">
</head>
<body>

<div id="contextMenuArea" style="width:100px;height:100px; border:solid 1px">コンテキストメニュ領域</div>

<button onclick="changeItemLabel();">項目を[resize]に変更</button>
<button onclick="disableItem();">項目をDisabledにする</button>

<!-- コンテキストメニュのテンプレート -->
<menu id="contextMenuTemplate" type="context" style="display:none;" >
  <menuitem id="menuItem" label="rotate"  ></menuitem>
</menu>
</body>
</html>
```

```js:test.js
$(function(){
	//初期化
	createContextMenu();
});

/** 
 * コンテキストメニュの初期化
 */
function createContextMenu() {
	$.contextMenu( 'destroy' );
    $.contextMenu({
    	selector:"#contextMenuArea"
    	,items: $.contextMenu.fromMenu($("#contextMenuTemplate"))
    });
}

/**
 * コンテキストメニュのラベルを、リサイズに変更する。
 */
function changeItemLabel() {
	var menuItem = document.getElementById("menuItem"); //コンテキストメニュの項目
	menuItem.label = "resize";
	createContextMenu();
}

/**
 * コンテキストメニュの項目をDisabledにする。
 */
function disableItem() {
	var menuItem = document.getElementById("menuItem"); //コンテキストメニュの項目
	menuItem.disabled = true;
	createContextMenu();
}
```

# IE11でラベルが変更されない問題
IE11だと、ラベルが変更されませんでした。

IE11では`menuitem`要素が認識されていないことが、原因のようです。
デバッガで確認すると、HTMLUnknowElementと表示されました。

![menuitem.png](https://qiita-image-store.s3.amazonaws.com/0/37903/352118b5-acc7-1138-4150-9f0760fe0b72.png)

menuitem要素はFirefoxのみサポートされています。
https://developer.mozilla.org/ja/docs/Web/HTML/Element/menuitem

ブラウザが認識していない要素だから、`label`「プロパティ」も認識できていないようです。

したがって、`setAttribute`メソッドで直接`label`「属性」の値を書き換える様、変更しました。

```js
//menuItem.label = "resize";
menuItem.setAttribute("label", "resize");
```


# IE11で項目がDisabledされた理由
上記の理屈だとDisabledされないはずですが、Disabledされました。
disabledプロパティは、認識しないHTML要素でも使えるプロパティなのでしょうか？
どなたか、理由をご存知でしたら教えてください。
忘れそうなUNIXコマンドメモ

## 入力の再利用
### history
コマンドの履歴を表示

### !!
直前のコマンドを再実行

### !str
strを先頭文字列に持つ最新コマンドを再実行


## ワイルドカード
| 記号   | 意味                                  |
|--------|---------------------------------------|
| ?      | 任意の1文字                           |
| *      | 0文字以上の文字列                     |
| a-z    | 小文字のアルファベットすべて          |
| [...]  | [ ]内の任意の１文字.                  |
| [^...] | []内の文字以外の任意の1文字           |
| {...}  | { }内の任意の文字列. カンマで区切る． |

## 種々のUNIXコマンド
### head, tail
ファイルの先頭(最後)を見る

### cat, less, vi etc...
テキストファイルの中身を表示する

### grep
ファイルの中身を検索する．基本的には，

```
grep [オプション...] パターン [ファイル...]
```
と記述する．

#### 例

printfという文字列を含んだ行をカレントディレクトリのすべてのCソースプログラムから検索し表示

```
grep printf *.c
```

ディレクトリliteracyにあるファイルすべてを対象にgrep

```
grep test literacy/*
```

tesに加えて，任意の1文字がくる文字列を検索

```
grep 'tes.' literacy/*
```

0個以上のｓの繰り返し

```
grep 'tes*' literacy/*
```

### find

```
find [オプション] [起点ディレクトリ] [判別方法] [検索後の処理]
```

ファイルやディレクトリを検索する	
#### 例

```
find ~ -name test -print
```

ホームディレクトリの下を名前で探し，一致したファイルのパス名を表示する
`-name [文字列]`は該当する文字列で検索する判別方法のオプション
`-print`は標準出力に出力する検索後の処理のオプション

### du
ディスクの利用状況を出力

### wc

ファイルの行数，ワード数，単語数を表示

### diff


```
diff [ファイル1] [ファイル2]
```

2つのファイルの差異を出力する

### uniq

連続する同一行を削除する

### who
利用者名，端末名，ログイン時間を表示する

### finger
利用者名，フルネーム，端末名，アイドル時間，ログイン時刻，ログイン場所を表示する
オプションにアカウント名を表示すると該当ユーザーの情報を表示する

### sort
入力ファイルの内容を行単位で並べ替える．`-r`オプションで逆順に並び替える



## プロセスとジョブ

### Ctrl-Z
一時停止

### Ctrl-C
強制終了

### Ctrl-D
終了シグナル(EOF)を送信

### jobs
ジョブの一覧を表示する

### ps
プロセスの一覧を表示する

### bg

```
bg %ジョブ番号
```

フォアグラウンドジョブをバックグラウンドジョブに切り替える

### fg

```
fg %ジョブ番号
```

バックグラウンドジョブをフォアグラウンドジョブに切り替える

### kill

```
kill %ジョブ番号
kill プロセス番号
```

ジョブやプロセスに終了させるシグナルを送る

```
kill -KILL %ジョブ番号
```

で暴走しているジョブを強制終了させる
NEW GAME! Ops実現に向けてSlack Botサンプルを作成するぞい

最近[Slack](https://slack.com)を使い始めたり、[「Slack入門」刊行記念LT大会](http://connpass.com/event/34246/)に参加させていただいたこともあり、Slack Bot作成に興味が湧いてきました。

調べてみたところ、簡単なBot作成まで行えたので、忘れないように手順をメモしておこうと思います。

## Slack Botの動作環境＋開発環境

Slack Botの動作環境はUbuntu Server 16.04 LTS、開発環境はRubyとslack-api gemを利用しています。

```shell-session
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"
```

### 開発環境の準備

以下の手順で必要なパッケージをインストールします。

```shell-session
$ which ruby
$ ruby --version
ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]
$ sudo gem install bundle
```

gemのslack-apiをインストールする際に必要となるパッケージをインストールします。

```shell-session
$ sudo apt-get install gcc g++ ruby-dev libssl-dev
```

Gemfileには以下の内容を記載します。

```ruby:Gemfile
source 'https://rubygems.org'
gem 'slack-api'
```

bundle経由で必要なgemをインストールします。

```shell-session
$ bundle install --path vender/bundle
$ bundle list 
Gems included by the bundle:
  * bundler (1.12.5)
  * eventmachine (1.2.0.1)
  * faraday (0.9.2)
  * faraday_middleware (0.10.0)
  * faye-websocket (0.9.2)
  * multi_json (1.12.1)
  * multipart-post (2.0.0)
  * slack-api (1.2.3)
  * websocket-driver (0.6.4)
  * websocket-extensions (0.1.2)
```

これで準備完了です。

## 簡単なBotを作成する

今回は[NEW GAME!](http://newgame-anime.com/)をモチーフにして簡単なBotのサンプルを作成してみます。

コードは以下のような感じになります。また、あらかじめSlack API用のトークンを取得し、環境変数SLACK_TOKENに設定しておきます。

```rb
#!/usr/bin/env ruby
# coding: utf-8

require 'slack'

Slack.configure {|config|
  config.token = ENV['SLACK_TOKEN']
}
client = Slack.realtime

start_time = Time.now.to_i
client.on :message do |data|
  post_time = data["ts"].sub(/\..*$/, "").to_i
  next if post_time < start_time

  msg = data["text"]
  if msg =~ /^今日も一日/
    param = { 
      token:   ENV['SLACK_TOKEN'],
      channel: data["channel"],
      text:    'がんばるぞい! ',
      username: '涼風青葉＠イーグルジャンプ',
      icon_url: 'http://newgame-anime.com/assets/special/twticon/ng_icon_1.jpg'
    }   
    Slack.chat_postMessage(param)
  end 
end
client.start
```

上記のスクリプトを実行します。

```shell-session
$ bundle exec ruby ./SlackBotSample.rb
```

この状態でSlackから「今日も一日」と入力すると、涼風さん(Bot)が「がんばるぞい！」と応答してくれます。

![newgame_ops001.png](https://qiita-image-store.s3.amazonaws.com/0/61137/60ee7acf-2f35-25f0-fd67-dc4de0e0f7a8.png)

## まとめ

Slack Botを作成するための環境構築手順、基本的なBotのコード作成を行ってみました。基本的なBotの動作の流れは把握できた感じなので、これを発展させてNEW GAME! Opsを実現したいと思います。

## 参考URL

 * [slack-api(RubyGem.org)](https://rubygems.org/gems/slack-api/versions/1.1.6)
   * [ドキュメント(slack-api 1.2.3)](http://www.rubydoc.info/gems/slack-api)
   * [Module: Slack::Endpoint::Chat](http://www.rubydoc.info/gems/slack-api/Slack/Endpoint/Chat#chat_postMessage-instance_method)
 * [Slack API](https://api.slack.com/)
   * [APIMethods](https://api.slack.com/methods)
   * [char.postMessage](https://api.slack.com/methods/chat.postMessage)
【Unity】スマホ向けタッチ判定（マルチタップ対応）

Unityで作成したモバイル向けゲームでのタッチ判定の簡単な実装。
以下のスクリプトを、タップされたときに何かを実行したいオブジェクトに付けてあげればOKです。
（標準で用意されているOnMouseDownでは同時押しの際にうまく反応してくれません）

```csharp:TouchTest.cs
using UnityEngine;
using System.Collections;

public class TouchTest : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
		if(OnTouchDown()){
			Debug.Log("タップされました");
		}
	}

	//スマホ向け そのオブジェクトがタッチされていたらtrue（マルチタップ対応）
	bool OnTouchDown() {
		// タッチされているとき
		if( 0 < Input.touchCount){
			// タッチされている指の数だけ処理
			for(int i = 0; i < Input.touchCount; i++){
				// タッチ情報をコピー
				Touch t = Input.GetTouch(i);
				// タッチしたときかどうか
				if(t.phase == TouchPhase.Began ){
					//タッチした位置からRayを飛ばす
					Ray ray = Camera.main.ScreenPointToRay(t.position);
					RaycastHit hit = new RaycastHit();
					if (Physics.Raycast(ray, out hit)){
						//Rayを飛ばしてあたったオブジェクトが自分自身だったら
						if (hit.collider.gameObject == this.gameObject){
							return true;
						}
					}
				}
			}
		}
		return false; //タッチされてなかったらfalse
	}
}
```

注意：PC上のエディタでは反応しないので、実機もしくはunity remote等で試す必要があります。

http://docs.unity3d.com/jp/current/ScriptReference/Touch.html
http://docs.unity3d.com/jp/current/ScriptReference/Input.GetTouch.html
rex0220 グラフ印刷プラグイン

# kintone のグラフ印刷プラグイン(販売停止)

kintoneアプリでは、なぜかグラフ印刷機能がありませんので、プラグインを作成しました。

- 保存されたグラフ、動的に作成したグラフとも印刷可能
- グラフのダウンロード可能
- アプリにプラグインを追加するだけの簡単設定
- 新旧デザイン対応
- ブラウザは、Google Chrome 限定

※2016/8/1 グラフダウンロード機能追加

[rex0220 stores](https://rex0220.stores.jp/) で、販売中です。


Chrome でのグラフ印刷例

![gprint01.png](https://qiita-image-store.s3.amazonaws.com/0/100572/afafd5f8-07c9-bbe3-40b4-7c11d81a6ac0.png)


# 動的にグラフを変更した場合

棒グラフを円グラフに変更後、印刷した例

![gprint02.png](https://qiita-image-store.s3.amazonaws.com/0/100572/eca7026f-a501-a568-cd9d-112b9d5c6335.png)


# グラフのダウンロード機能

表示中のグラフをダウンロードできます。

![gprint03.png](https://qiita-image-store.s3.amazonaws.com/0/100572/952add8f-5e3e-f780-78c1-93af90e4fdcf.png)


# 旧デザイン画面でのグラフ印刷

旧デザイン画面でもグラフ印刷可能です。

![gprint04.png](https://qiita-image-store.s3.amazonaws.com/0/100572/5c78b2a6-fa86-7fdd-04ce-10498db8ce71.png)


# プラグインの追加

![gprint11.png](https://qiita-image-store.s3.amazonaws.com/0/100572/3a4fd28b-bfd2-36f7-cbb8-d379f17f92cb.png)


# プラグインの設定

グラフ印刷プラグインの詳細設定は、ありません。

![gprint12.png](https://qiita-image-store.s3.amazonaws.com/0/100572/4677da46-6b27-2848-cb0e-4c41b0495d19.png)

# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- IE、EGDE、Fiewfox では、使用できません。（グラフ印刷・ダウンロードボタンが表示されません）
フラッシュ暗算、javascript

~~~~

<!DOCTYPE html>

<head>
<title>flash_anzan</title>
</head>

<body>

<script>
<!--

var img = new Array();

img[0] = new Image();
img[0].src = "http://www.onlyonehappy.top/1.JPG";
img[1] = new Image();
img[1].src = "http://www.onlyonehappy.top/2.JPG";
img[2] = new Image();
img[2].src = "http://www.onlyonehappy.top/3.JPG";
img[3] = new Image();
img[3].src = "http://www.onlyonehappy.top/null.JPG";
img[4] = new Image();
img[4].src = "http://www.onlyonehappy.top/0.JPG";

var id=0;
var s=0;


function appear_f1(){

document.getElementById("IMG1").src = img[0].src;
s += 1;
}

function appear_f2(){

document.getElementById("IMG1").src = img[1].src;
s += 2;

}

function appear_f3(){

document.getElementById("IMG1").src = img[2].src;
s += 3;

}

function appear_f4(){

id++;

var timer = window.setTimeout("appear_f4()", 1000);

var rand = Math.floor(Math.random()*3);

if (rand==0){
   appear_f7();}
else if(rand==1){
   appear_f8();}
else{
   appear_f9();}

if(id==5){
clearTimeout(timer);
id=0;}

}

function appear_f5(){

alert("合計は、"+s+"です。");
s=0;

}

function appear_f6(){

document.getElementById("IMG1").src = img[3].src;

}



function appear_f7(){

timerID = window.setTimeout("appear_f1()", 800);
appear_f6();

}

function appear_f8(){

timerID = window.setTimeout("appear_f2()", 800);
appear_f6();

}

function appear_f9(){

timerID = window.setTimeout("appear_f3()", 800);
appear_f6();

}




// -->
</script>

<form>

<IMG id="IMG1" name="num1" alt="" src="0.JPG">

<input type ="button" style = "position: absolute; left:50%; top: 50%"/ name = "b4" value = "start" onclick = "appear_f4()">

<INPUT id="Button2" style = "position: absolute; left:65%; top: 50%"/ onclick="appear_f5()" value="sum" type="button" name="sum">


 
</form>


</body>

</html>

~~~~
RailsのモデルをVisitorパターンで辿る説明

Railsで開発していると親子/兄弟の関係にあるモデルをノードのように扱って辿りたくなる時がありますよね。

そんなときに使うと便利なVisitorパターンの説明、Rails版です。

プロジェクト管理ツールの開発を行っているとして、以下3つのモデルが親子関係になっているとします。

- プロジェクト (Project)
  - タスク (Task)
      - ステップ (Step)

まずモデルでビジターを受け入れるモジュールを作ります。

```rb:models/concerns/visitor_acceptance.rb
module VisitorAcceptance
  def accept(visitor)
    visitor.visit(self)
  end
end
```

各モデルはVisitorを受け入れるためにVisitorAcceptanceをincludeします。継承しているのがApplicationRecordなのはRails5をベースにしているためです。

```rb:models/project.rb
class Project < ApplicationRecord
  has_many :tasks
  include VisitorAcceptance
end
```

```rb:models/task.rb
class Task < ApplicationRecord
  belongs_to :project
  has_many :steps
  include VisitorAcceptance
end
```

```rb:models/step.rb
class Step < ApplicationRecord
  belongs_to :task
  include VisitorAcceptance
  def complete?
    actual_hours > 0 && estimation_hours > 0
  end
end
```

次にモデルを辿って処理をするVisitorの実装です。#visitで処理を振り分けます。

```rb
class ProjectVisitor

  attr_reader :completion_steps, :estimation_hours, :actual_hours

  def initialize
    @completion_steps = 0
    @estimation_hours  = 0
    @actual_hours = 0
  end

  def visit(object)
    if object.is_a?(Task)
      task(object)
    elsif object.is_a?(Step)
      step(object)
    elsif object.is_a?(Project)
      project(object)
    end
  end

  private

  def step(step)
    @completion_steps += step.complete?? 1 : 0
    @estimation_hours += step.estimation_hours
    @actual_hours += step.complete?? step.actual_hours : 0
  end

  def task(task)
    task.steps.each{|step|
      step.accept(self)
    }
  end

  def project(project)
    project.tasks.each{|task|
      task.accept(self)
    }
  end
end
```

最後に呼び出すときはModel#accept(visitor)を呼び出します。Project#acceptならtasks -> stepsと辿ります。Task#acceptならstepsを辿ります。

```rb
visitor = ProjectVisitor.new
project.accept(visitor) # task -> stepと辿る
p visitor.completion_steps
p visitor.estimation_hours
p visitor.actual_hours

visitor = ProjectVisitor.new
task.accept(visitor) # stepを辿る
p visitor.completion_steps
p visitor.estimation_hours
p visitor.actual_hours
```

モデルのデータ構造を辿って集計する処理がキレイにVisitorの中にまとまりましたね。

すっきり。

Visitorを使わないコードは以下のようになります。今回のように各ノードが一方向ならこれでも十分わかりやすいですね。

```rb
@completion_steps = 0
@estimation_hours  = 0
@actual_hours = 0
project.tasks.each{|task|
 task.steps.each{|step|
  @completion_steps += step.complete?? 1 : 0
  @estimation_hours += step.estimation_hours
  @actual_hours += step.complete?? step.actual_hours : 0
 }
}
```

ノードが循環したり入れ子になったりと複雑になって、それぞれで別の処理をするとなると、この記事のように独立したVisitorが欲しくなってきます。

質問などありましたらコメントかTwitter宛にお願いします。
JetBrains 製 IDE の設定・プラグイン


最近 JetBrains 製の IDE を利用する機会[^1]が増えてきたので、All Products ライセンスに切り替えました。

[^1]: Android Studio も含めて

# カラースキーム

**Sunset** を使っています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/17936/a625cf5b-e867-d835-659e-02c155383334.png" witch="480" />

AppCode を本格的に触れるようになったのですが、「Xcode からの (カラースキーム) 取り込み」なんていう機能があったんですね。

<img src="https://qiita-image-store.s3.amazonaws.com/0/17936/a917bf8a-b9c3-0f40-d894-4ecea2093465.png" witch="480" />


以前から Xcode の「Sunset」というテーマが好きで、Sunset に準じるテーマがない場合などには Solarized Light で代用していましたが[^2]、この機能を利用すれば JetBrains 製 IDE で Sunset が利用できるようになります。

[^2]: Solarized Light をベースに Sunset 風にカスタマイズしたり。

取り込んだカラースキームは JetBrains 製の IDE なら共通して利用できます。AppCode で取り込んだ Sunset を IntelliJ IDEA や Android Studio にも適用して利用することが可能です。

OS X (macOS) なら

```
~/Library/Preferences/[IDE 名 + バージョン]/colors/
```

Windows なら

```
C:\Users\[ユーザ名]\.[IDE 名 + バージョン]\config\colors
```

Linux なら

```
~/.[IDE 名 + バージョン]/config/colors
```

にある `.icls` ファイルをコピーして、アプリケーションを再起動すると認識されると思います。

# Project ペインの設定

Xcode に慣れていると、Project のファイルツリーで選択したファイルはワンクリックでそのままエディタで開いて欲しい。幸い JetBrains 製の IDE では「Autoscroll」という設定で、その挙動をサポートしています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/17936/8a0125c3-bd95-8f1c-a597-82da001759c6.png" width="200" />
 
Project 上部にある歯車アイコンからアクセスできるツール設定で Autoscroll をオンにします。

# プラグイン

## Color Ide

Sunset や Solarized Light など背景色が標準と異なるカラースキームを適用すると、Project ペインなどの背景色が標準のままなのが気になります。

Color Ide はエディタの背景色をエディタ以外のペインにも適用してくれるプラグインです。

## Dash (OS X / macOS のみ)

OS X / macOS ではドキュメントリーダに Dash を利用しています。JetBrains 製 IDE からも Dash が簡単に開けるようにしてくれるプラグインが Dash です。

## Perl (WebStorm / PhpStorm)

WebStorm / PhpStorm で Perl/CGI なスクリプトを開発する機会があったので、とりあえず。

## BashSupport

シェルスクリプトは開発アプリに関わりなく、一般的によく利用します。
TeXでA3用紙のpdfを作成する

# 1. はじめに
数ヶ月か前にTeXでA3出力ができることを知りました．

ここで示した事例は，12枚のpng画像をA3横用紙に表示するものです．出力として並べて表示し比較する場合などに便利です．
画像出力が思った通り行かず修正した場合にも，同じ名前で同じフォルダにいれておけば，すぐに修正版が見られるので，とても便利です．

本当は報告書もTeXで作りたいのですが，会社の報告書はwordで「作らなければならない」ので，最終的にはWordでA3用紙に表を作成し，一枚一枚画像を挿入・貼り付けていきます．この作業のなんと虚しいことか．．．


# 2. 準備
ここ [http://www.ctan.org/tex-archive/macros/latex/contrib/geometry](http://www.ctan.org/tex-archive/macros/latex/contrib/geometry) から，geometry.zipをダウンロードして展開．

```
platex geometry.ins
```

により，geometry.sty を作成し，スタイルファイルを格納しているフォルダにコピー． 
私の場合は，
/usr/local/texlive/2015basic/texmf-local/tex/mytool
というディレクトリに入れています．mytool は自分でインストールしたスタイルファイルを入れておくところです．

# 3. TeXのソース
以下の事例では，A3横用紙 (a3paper, landscape) に，12枚の画像を貼り付けています．

```tex:tex_fig.tex
\documentclass[english]{jsarticle}
\usepackage[a3paper,landscape,top=25mm,bottom=25mm,left=25mm,right=25mm]{geometry}
\usepackage[dvipdfmx]{graphicx}
\pagestyle{empty}

\begin{document}

\begin{center}
\begin{tabular}{|c|c|c|c|c|}\hline
Case & Axial Force & Bending Moment & Shearing Force & Displacement Mode \\ \hline

\begin{minipage}{1.5cm}Usual\end{minipage}&
\begin{minipage}{8.0cm}\vspace{0.2zh}\includegraphics[width=8.0cm,bb={0 0 1983 1588}]{fig_01_axi.png}\end{minipage}&
\begin{minipage}{8.0cm}\vspace{0.2zh}\includegraphics[width=8.0cm,bb={0 0 1983 1588}]{fig_01_mom.png}\end{minipage}&
\begin{minipage}{8.0cm}\vspace{0.2zh}\includegraphics[width=8.0cm,bb={0 0 1983 1588}]{fig_01_she.png}\end{minipage}&
\begin{minipage}{8.0cm}\vspace{0.2zh}\includegraphics[width=8.0cm,bb={0 0 1983 1588}]{fig_01_dis.png}\end{minipage}\\ \hline

\begin{minipage}{1.5cm}Un-usual\\(Trailer)\end{minipage}&
\begin{minipage}{8.0cm}\vspace{0.2zh}\includegraphics[width=8.0cm,bb={0 0 1983 1588}]{fig_02_axi.png}\end{minipage}&
\begin{minipage}{8.0cm}\vspace{0.2zh}\includegraphics[width=8.0cm,bb={0 0 1983 1588}]{fig_02_mom.png}\end{minipage}&
\begin{minipage}{8.0cm}\vspace{0.2zh}\includegraphics[width=8.0cm,bb={0 0 1983 1588}]{fig_02_she.png}\end{minipage}&
\begin{minipage}{8.0cm}\vspace{0.2zh}\includegraphics[width=8.0cm,bb={0 0 1983 1588}]{fig_02_dis.png}\end{minipage}\\ \hline

\begin{minipage}{1.5cm}Un-usual\\(OBE)\end{minipage}&
\begin{minipage}{8.0cm}\vspace{0.2zh}\includegraphics[width=8.0cm,bb={0 0 1983 1588}]{fig_03_axi.png}\end{minipage}&
\begin{minipage}{8.0cm}\vspace{0.2zh}\includegraphics[width=8.0cm,bb={0 0 1983 1588}]{fig_03_mom.png}\end{minipage}&
\begin{minipage}{8.0cm}\vspace{0.2zh}\includegraphics[width=8.0cm,bb={0 0 1983 1588}]{fig_03_she.png}\end{minipage}&
\begin{minipage}{8.0cm}\vspace{0.2zh}\includegraphics[width=8.0cm,bb={0 0 1983 1588}]{fig_03_dis.png}\end{minipage}\\ \hline
\end{tabular}
\end{center}

\centerline{\LARGE \textsf{Fig-A Section Force Diagrams}}

\end{document}
```
# 4. 実行
実行のコマンドの実行により，tex_fig.pdf が作成されます．dvipdfmxでオプションを付けるのを忘れずに．

```
platex tex_fig.tex
dvipdfmx -p a3 tex_fig.dvi
```

以上
Rasberry Pi 3にROS(Kinetic Kame)を導入

## Ubuntu Mate (Ubuntu 16.04)をRasberry Piに導入する．

[Ubuntu MATE for the Raspberry Pi 2 and Raspberry Pi 3](https://ubuntu-mate.org/raspberry-pi/)の「Download」リンクと「Making a microSDHC」と「Re-size file system」を参考にする。
筆者がやった時には、openssh-serverは既にインストール済みだったので、これ以降は他のPCからsshを通して作業。

## （オプション）Ubuntu Mate起動時にGUIを立ち上げない。(CLI)

```
$ systemctl set-default multi-user.target --force
$ systemctl disable lightdm.service --force
$ systemctl disable graphical.target --force
$ systemctl disable plymouth.service --force
```

ref: [Boot Raspberry Pi 2 Image directly to Terminal Console](https://ubuntu-mate.community/t/solved-boot-raspberry-pi-2-image-directly-to-terminal-console/1569)

## ROSのインストール

以下の記事を参考にインストール
[RaspberryPi2でROSを使う一番楽な方法(多分)](http://qiita.com/raucha/items/c39d92a6b201eda33cca)
[Ubuntu ARM install of ROS Indigo](http://wiki.ros.org/indigo/Installation/UbuntuARM)
Railsでconfig/database.ymlをいくら書き換えても接続するデータベースが固定になる

- 蓋を開けて見れば非常に下らないのですが、検索方法が分からずハマってしまったので自分用にメモ書きしておきます

## 概要
- Railsでconfig/database.ymlで接続するデータベースやホストを指定してもrails dbで接続したときにいつも固定のデータベースに接続してしまう

## 環境
- windows10
- rails 4.2.5

## 解決法
- [Rails guides](http://guides.rubyonrails.org/configuring.html#configuring-a-database)に普通に書いてました...

```
3.14 Configuring a Database
Just about every Rails application will interact with a database. You can connect to the database by setting an environment variable ENV['DATABASE_URL'] or by using a configuration file called config/database.yml.
```

- 環境変数のDATABASE_URLかconfig/database.ymlの設定を見るよ
 - 環境変数を見てみると...いつ登録したのか分からないDATABASE_URL...これか...

- 環境変数を変更したら忘れずにシェルを再起動してください
- 終わりです。貴重な土曜日が...
[ue4] 私的お勧めアセット　その３


#【前提】
__・Unreal Engine 11.2 or 12.5の使用を前提に記述しています__
__・うそを書くつもりはありませんが、私のアセット使用経験に基づいて記述しているため、間違いが多分にある可能性があります__
__・アセットのレビューでも批評でもありません、単純に「これいいよ？」的な感覚で書いてます__
__・私の環境がWindowsなのでWindows環境前提です__
__・有料アセット前提です、無料ものはご自分でお試しください__
__・実際のアセット購入にはEPICさんのフォーラムのマーケットプレイスのカテゴリの意見を参考する等ご自分の判断でどうぞ__

#【目的】
私の購入したアセットの中から
私的にこれなら人にお勧めできるかなぁ、と思ったアセットを幾つか書いていきます。


#【Customizable Deadly Traps】

https://www.unrealengine.com/marketplace/item/a778bbb5b57547e09db33c4f577525ce
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/845dd4a3-4fc3-b260-ad84-84e0e6f29bd4.jpeg)

最初にオススメするのはこれです。
最近、私はこのアセットのトラップをue4のGAME JAMで多用しております。

BP自体もここにダメージを与える処理を書けばいいよ？的に親切に書いてあるので
すぐに実装できます。

プラットフォーマーなどでギミックがほしい方などにオススメします。

当然、処理を確認して改造もOKです。



#【Fantasy Dungeon】
https://www.unrealengine.com/marketplace/fantasy-dungeon
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/70f1a58a-3261-f988-9b87-e8e9ec93f023.jpeg)

このアセット、オススメ理由はとにかくアセットの雰囲気とクオリティでしょうか。
ファンタジー系のダンジョンを作ろうと思ったらこれがあればある程度一通りそろうところです。

残念なのは値段がちょっとお高いので、セールなどがやっていたら購入されてみてはいかがでしょうか？

私はActionRPGを個人で作成している関係でひと目見て惚れ込んで購入しました。


#【Smart Spline Generator】
https://www.unrealengine.com/marketplace/smart-spline-generator
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/9fd43b59-6fa0-cc9e-b1c6-47d8c100cb02.jpeg)

最近発売されたアセットですね。

へばりつく草などの表現に重宝します。
レベルの細かいエッセンス表現にいかがでしょうか？

ただ岩があるよりも、こんな表現をしたいときに重宝します。
![ColyWxgXgAAgs9b.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/5ec3e6c0-5dd4-3ba1-fefa-a74b077f69c0.jpeg)


#【Multiplayer First Person Shooter Kit】
https://www.unrealengine.com/marketplace/multiplayer-first-person-shooter-kit

![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/6acebdc2-4d48-bf60-a0f4-37bd7ae2557e.jpeg)

マルチプレイヤーのFPSを作成するために作られたアセットですね。
これは凄く良いです。

使いこなせば多分、大げさに言えばAAAクオリティのFPSゲームがお手軽に作れます。
ですが

問題が幾つか、、、

１）導入のハードルが高い
ほとんどの処理がC++で書かれています。ue4のアセットでは珍しくBPはあまり使用していません。
その為、C++の知識が必要になります。
C++はue4のバージョンが変わると結構いろいろ変わるのでその辺りをご自分で解決できる方には向いていると思います。
２）ue4.10以外のバージョンでは今のところまともに動作しない
１）にも絡みますが。
マニュアルにはue4.12対応と書かれていますが。
ue4.12ではダウンロードしてインストールしただけではまったく動きません。
その辺りの問題を解決できる方でないとちょっときついかも

３）武器の付属がないので別にアセットを購入の必要あり
FPS Weapon Pack
https://www.unrealengine.com/marketplace/item/40d1f3ab15944a6db997e7e528bb4805
このアセットを持っているか、追加で購入しないと全く動きません。

とまあ、色々書きましたが
条件さえそろえば、マルチプレイヤーのFPSを作成するにはこのアセットはとても重宝します。
BPではなくC++で作成されているので処理も軽いですし。


#【The Perfect Tile System】
https://www.unrealengine.com/marketplace/the-perfect-tile-system
![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/9cd9b4be-1673-a9d9-ef59-fbceb85661fd.jpeg)

今流行の？parallax occlusionをue4に標準実装前から実装していたアセットです。
平らな平面にこのアセットのマテリアルを貼るだけで凸凹表現ができます。

タイルのマテリアルもプリセットで用意されているものだけでも結構色々入っているので
すぐに使えます。

私もGame jamで多用しております。



#【最後に】

ここにあげたアセットはあくまで私個人が購入したアセットの中で「良かったら使ってみたら？」レベルで紹介しているものです。
私の主観が多分に入っていますから場合によっては見当違いのことを言っている可能性があります。
そのあたりはご了承ください。
あくまでUE4のアセット購入の参考程度によろしくお願いします。

最後まで読んで頂いてありがとうございました。
RealmでPrimaryKeyのインクリメントをする


Realmにはどうやらインクリメントをする機能は備わっていないらしい。
しかし私たちにはPrimaryKeyにidを設定してそれでアクセスするというニーズがあったりする！

なのでMySQLとかすっごい強そうなDBのインクリメント技術には負けるけどとりあえずの実装は可能なのでした。

とりあえずTODOリストを例にサンプルコードを並べて行こう！

## サンプルコード

### テーブル設計

```swift:TrToDo.swift
import Foundation
import RealmSwift

class TrTodo: Object {
    dynamic var todoId = 0
    dynamic var todoTitle = ""
    dynamic var todoCreated = NSDate()
    dynamic var limitDate = NSDate()
    dynamic var completed = NSDate()
    
    override static func primaryKey() -> String? {
        return "todoId"
    }
}
```

テーブル設計はこんな感じにしておこう

### インサート

```swift:DatabaseAccesser.swift
func insertWithData(title: String, contents: String) -> Void {
    do {
        let realm = try Realm()
        realm.beginWrite()
        
        let todo = TrTodo()
        todo.todoId = getLatestId() + 1
        todo.todoTitle = title
        todo.todoCreated = NSDate()
            
        realm.add(todo, update: true)
        try realm.commitWrite()
    } catch {
        NSLog("Error")
    }
}
    
private func getLatestId() -> Int {
    return try! Realm().objects(TrTodo).sorted("todoId").last?.todoId ?? 0
}
```

`todoId` を設定するところで現在のテーブルの中の1番最後の `todoId` を引っ張ってそれに `+1` をすると強くなることができました。
MySQLみたいな強いデータベース様と同じようにしたかったら他にテーブルを作って上手くRDBをしてテーブル名によって `id` が今までにいくつ追加されてきたのかを数えれば簡単に実装できそうだ！

### インクリメントを強くする

```swift:Increment.swift
import Foundation
import RealmSwift

class Increment: Object {
    dynamic var modelId = 0
    dynamic var tableName = ""
    
    override static func primaryKey() -> String? {
        return "modelId"
    }
}
```

```swift:DatabaseAccesser.swift
func insertWithData(title: String, contents: String) -> Void {
    do {
        let realm = try Realm()
        realm.beginWrite()
        
        let todo = TrTodo()
        todo.todoId = getLatestId() + 1
        todo.todoTitle = title
        todo.todoCreated = NSDate()
            
        realm.add(todo, update: true)
        try realm.commitWrite()
    } catch {
        NSLog("Error")
    }
}
    
private func getLatestId() -> Int {
    return try! Realm().objects(Increment).filter("tableName = TrTodo").first ?? 0
}
```

検証はしていないけどだいたいこんな感じに実装したらいけそうである！
glTF データを C++ アプリで読み込む

漢だったら JSON ベースのシーン記述フォーマット glTF ですね!

https://github.com/KhronosGroup/glTF

仕様が結構 OpenGL べったりなのが残念ですが... 適当に解釈変えたりすれば自前レイトレーサーのシーンフォーマットにも使えますね!

glTF データを C++ アプリで読みたいですね!

やりましょう!

できました.

https://github.com/syoyo/tinygltfloader

ヘッダーファイルオンリーでいつでもどこでも glTF 読めます!

OpenGL でのサンプルビューアもあります.

https://github.com/syoyo/tinygltfloader/tree/master/examples/glview

レイトレーサーでのビューアも作りました.

https://github.com/lighttransport/nanort/tree/master/examples/gltfrender

## TODO

* glTF の JSON Schema から C++ パーサコードを自動生成することで, よりロバストなパーサをつくる.
* **優秀な glTF 若人を育成することで, 優秀な若人が glTF を極めてくれるスキームを確立したい**
SeleniumでCookie Clickerを自動化


Seleniumの勉強をかねて、ブラウザゲーム「Cookie Clicker」を自動化してみました。


# Cookie Clickerについて
クッキーをひたすらクリックしてクッキーを増やす、ブラウザゲームです。
Flashが使われていないので、Seleniumでの自動化が簡単にできます。
[http://orteil.dashnet.org/cookieclicker/]()

# Cookie Clickerの自動化

## 自動化の処理の流れ
1. セーブファイルをインポートする
  1. [Options]ボタンをクリックする
  2. [Import Save]ボタンをクリックする ⇒ [Import Save]ダイアログが開く
  3. セーブファイルの中身を、テキストボックスに入力する
  4. [Load]ボタンを押す。
2. クッキーをひたすらクリックする
3. セーブファイルをエクスポートする
  1. [Save to file]ボタンを押す ⇒ セーブファイルがダウンロードされる


![Cookie Clicker_全体像.png](https://qiita-image-store.s3.amazonaws.com/0/37903/e8196941-4702-00e4-e067-32ce61a86a7e.png)
![Import Saveダイアログ.png](https://qiita-image-store.s3.amazonaws.com/0/37903/bedf27c1-fdf9-c423-3707-bc7ac79e004f.png)

## 環境
* Firefox 46.0
* Selenium 2.53.0
* Cookie Clicker 2016/07/24版

## ソース

```java:CookieClickerTest.java
package mytest.gui;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;

public class CookieClickerTest {
	/** Cookie ClickerのImport File. 自動クリックさせる前に読み込ませる */
	private static String importFile = "E:/workspace/mytest/input/cookieclicker/import.txt";
	
	/** クッキーをクリックする回数 */
	private static int countOfClick = 10;
	
	public static void main(String[] args) {
		//初期処理
		FirefoxProfile profile = new FirefoxProfile();
		//Downloadディレクトリにダウンロードする
		profile.setPreference("browser.download.folderList",1); 
		//textファイルのダウンロード時に確認ダイアログを表示しない
		profile.setPreference("browser.helperApps.neverAsk.saveToDisk","text/plain");
		FirefoxDriver driver = new FirefoxDriver(profile);
		
		// Cookie Clickerを開く
		driver.get("http://orteil.dashnet.org/cookieclicker/");

		//ファイルを読み込みSave用のCode値を取得する
		try {
			//Optionsボタンをクリック
			driver.findElement(By.id("prefsButton")).click();
			
			//Import Saveボタンをクリックする
			driver.findElement(By.linkText("Import save")).click();
			
			//Import Fileを読み込む
			String saveCode = FileUtils.readFileToString(new File(importFile), "UTF-8");
			
			//Save用Codeを入力する
			driver.findElement(By.id("textareaPrompt")).sendKeys(saveCode);
			
			//Loadボタンをクリックする。
			driver.findElement(By.id("promptOption0")).click();
			
		} catch (IOException e) {
			e.printStackTrace();
		}

		//クッキーを指定回数分クリックする
		for (int i=0; i<countOfClick; i++) {
			driver.findElement(By.id("bigCookie")).click();
		}
		
		//Save to fileボタンをクリックする ⇒ ファイルがダウンロードされる
		driver.findElement(By.linkText("Save to file")).click();
		
		//ブラウザを終了する
		driver.quit();
	}
}
```

### ファイルのダウンロードについて
ダウンロード確認ダイアログが表示されると、次の処理に進みません。
ダウンロードダイアログが表示されないよう、FirefoxProfileで設定しました。
[https://developer.mozilla.org/ja/docs/Download_Manager_preferences]()

# まとめ
* セーブファイルのインポートは、[Load from file]ボタンを押して、ファイルアップロードする予定でした。しかしうまく自動化できなかったので、[Import Save]ボタンでセーブコードを入力する方法に変更しました。

* Cookie Clickerには、クッキーを効率良く増やすアイテムがあります。それらのアイテムも自動化に取り入れ、さらに効率よくクッキーが取得できるでしょう。
プログラミング教室で iOS アプリの作り方を説明しました. その5

[前回](http://qiita.com/mironal/items/517408e66a0ee3eeae05)

---

## 概要

2週間ぶりです。

今回は Autolayout を使った画面レイアウトの応用編です。

同一の課題に取り組んだ生徒数は2名でした。

## やったこと(1.5時間)

AutoLayout を使って色々な画面を作り様々な画面サイズ、デバイスの向き(縦横)を変えても正しく表示されるようにレイアウトできるようになるテクニックを幾つか習得することを目標とする。

### その 1 (基本)

画面を3つの領域に分ける。 

画面サイズに応じて、中央の緑の領域の高さは変わらず上下のピンクと水色の高さが変わる。

```
UIView
 |- UIView ピンク
 |- UIView 緑
 |- UIView 水色
```

![image](https://qiita-image-store.s3.amazonaws.com/0/17704/fe3488e4-594c-11ca-73dd-500225d66705.png)

### その 2 (レイアウト用の見えない View を置く)

画面を4つの領域に分ける。 画面サイズが変わってもそれぞれ同じ面積を保つ。

```
UIView
 |- UIView ピンク
 |- UIView 緑
 |- UIView 水色
 |- UIView 薄赤
```

![image](https://qiita-image-store.s3.amazonaws.com/0/17704/56c05514-1604-d09e-e83b-f8b6bbc76f7f.png)

- 画面中央にサイズゼロの見えない View を置いてそれを起点にするのがﾐｿ
- Multiplier を使った方法も教えました

### その 3 (Multiplier を使う)

画面全体を覆う緑色の View の中央に半分のサイズのピンクの View がある。

```
UIView
 |- UIView 緑
     |- UIView ピンク
```

![image](https://qiita-image-store.s3.amazonaws.com/0/17704/88e5cd37-1480-4a53-bef3-629668d209c8.png)

※ Multiplier を 0.5 にすると親に対して半分のサイズになる

### その 4

応用編。

- 左上のピンクの View は画面の横幅に対して 1/3 の幅を持つ。 縦横比は 1:1
- 余った領域に水色の View が表示される。 高さはピンクと同じ。
- ピンクと水色の View の下には緑の View がある。
- 緑の View の中央に半分の高さと幅を持つ 淡赤 のView がある

```
UIView
 |- UIView ピンク
 |- UIView 水色
 |- UIView 緑
     |- UIView 薄赤
```

![image](https://qiita-image-store.s3.amazonaws.com/0/17704/a843b818-0e62-29c4-6cee-bbb43d02eb6d.png)

## まとめ

- Autolayout を使用した iOS アプリのレイアウト方法を学びました
- デバイスの画面サイズや画面の向きに応じて柔軟にレイアウトする方法を学びました
- 想定した課題を時間内に終えることができたので課題のレベル感もちょうどよかったと思われます

Swift を使って自分で考えたアプリを作りたいという要望が出てきたので良い方向に向かっていると思います。

## ソースコード

解答例のソースコードを github に公開しています。

https://github.com/mironal/AutoLayoutSample


## 授業風景

![IMG_8850.jpg](https://qiita-image-store.s3.amazonaws.com/0/17704/256c0c53-f49b-5ac8-4486-168385f39ddd.jpeg)

開催場所: TENTO さいたま
AVPlayerの再生状態をKVOで監視する


動画が外部要因(バックグランド移動)によって停止されたりなんだりしたりした時にキー監視をする機会があったので
また、動画が再生されているかどうかは `rate` で判断されているとのこと

```swift
player.addObserver(self, forKeyPath: "rate", options: .New, context: nil)
```

まずは、KVOを設定

```swift
override func observeValueForKeyPath(keyPath: String?,
                                         ofObject object: AnyObject?,
                                                  change: [String : AnyObject]?,
                                                  context: UnsafeMutablePointer<Void>) {
        if keyPath == "rate" {
            if player?.rate = 0.0 {
                print("Pause")
            } else if player.?rate = 1.0 {
                print("Play")
            } else {
                print("Unknown")
            }
        }
    }
```

あとはViewControllerから脱出するときにKVOを削除する

```swift
player.removeObserver(self, forKeyPath: "rate")
```
FuelPHPのORMのメソッド利用時に、データ取得の結果が想定通りにならない時の対処法


fuelphpのORMが提供するメソッドを利用していてハマりました。

はまった内容としては
ORMのfindメソッドを利用して指定したidが一致するレコードを取得する際、検索結果をfuelがキャッシュし、次回以降同じidのレコード検索を行った時、SQLクエリが実行されず、キャッシュしたデータが返されるということ。
このせいでユニットテストが思うように動作してくれず、どハマりしました。

#結論
fuelphpのORMにはデータのキャッシュ機能があるようで、テスト実行によるデータのキャッシュ履歴が、次のテストケースに影響を与えてしまっていました。

#動作確認(ORMメソッド利用)

例えば次の処理を実行させます。

```
$user = Model_Users::find(1);
$user->name = 'name';
$user->save();
$user = Model_Users::find(1);
```


この処理を実行させた時にMySQLでは実際にどのようなクエリが実行されているかを確認してみます。

MySQLの実行クエリログを見る方法は
my.cnfのgeneral_logのフラグを1にしてやればOK
general_log_fileに指定されたファイルに実行クエリのログが吐き出されます。

では実際の結果を確認してみましょう。

```
Connect	root@localhost on fuel_dev
Query	SET NAMES 'utf8'
Query	SELECT `t0`.`id` AS `t0_c0`, `t0`.`name` AS `t0_c1` FROM `users` AS `t0` WHERE `t0`.`id` = 1 LIMIT 1
Query	UPDATE `users` SET `name` = 'hoge' WHERE `id` = '1'
Quit
```

ログを見てみると最後のfind文がクエリとして実行されていないことがわかります。

#動作確認(クエリビルダ利用)

次にORMのメソッドではなく、クエリビルダを利用して実行してみます。

```
$user = Model_Users::find(1);
$user->name = 'name';
$user->save();
DB::select()->from('users')->where('id', '=', 1)->execute();
```

この場合のクエリ実行結果は以下の通りです。

```
Connect	root@localhost on fuel_dev
Query	SET NAMES 'utf8'
Query	SELECT `t0`.`id` AS `t0_c0`, `t0`.`name` AS `t0_c1` FROM `users` AS `t0` WHERE `t0`.`id` = 1 LIMIT 1
Query	UPDATE `users` SET `name` = 'hoge' WHERE `id` = '1'
Query	SELECT * FROM `users` WHERE `id` = 1
Quit
```

クエリビルダを利用して実行すると、クエリがちゃんと実行されるようです。
よってクエリビルダを利用することで、キャッシュを使わず、DBにアクセスしデータを取得してくるようにできます。

#まとめ
fuelphpのORMにはデータのキャッシュ機能があるので気を付けましょう。
NumpyのrandintとRandomのrandintの違い


```python
import numpy as np
import random as rd

np.random.randint(0, 10)
rd.randint(0,10)
```

`Numpy` を使用した場合の `randint` は上記の場合だと `0~9`
`Random` を使用した場合の `randint` は上記の場合だと `0~10`

`Numpy` の `numpy.random.randint(a, b)` -> `a から b-1`
`Random` の `random.randint(a, b)` -> `a から b`

`Numpy` は `range(a, b)` と同じだから違和感なかったけど、
始めの頃は `Random` を多用していたのでこの仕様には驚かされた
LaTeX 自前スタイルファイルの配置を自動化する

<!-- LaTeX 自前スタイルファイルの配置を自動化する -->
#概要
LaTeXのユーザー定義スタイルファイルは人生を豊かにしてくれます．
パスの通ったディレクトリにスタイルファイルを配置する作業を自動化すると，少し幸せになれるかもしれないという話です．

#前提
以下のディレクトリ構造を考えます．

```
styles
|-- hoge -- hoge.sty
|-- piyo -- piyo.sty
```

LaTeXのスタイルファイルはこのように同名のディレクトリに格納します．
ディレクトリにはREADMEなどを入れるといいでしょう．

#実装
まず，styles内に設定ファイルutilize.jsonを作成します．

```json:utilize.json
{
    "from": [
        "hoge",
        "piyo"
    ],
    "to": "/home/fuga/texmf/tex/latex"
}
```

fromはスタイル名のリスト，toはスタイルファイルの配置先です．
続いて，同じくstyles内にutilize.pyを作成します．

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

import os
import sys
import subprocess
import json

full_this_dirname = os.path.dirname(os.path.abspath(__file__))
config_file = "utilize.json"

def copy(pkgname, to_dirname):
    u"""
    ディレクトリ内の特定のパッケージをコピーする関数
    """
    # ディレクトリコピー
    # 元のパッケージのフルパス
    full_org_pkgpath = os.path.join(full_this_dirname, pkgname)
    # パッケージの作成
    subprocess.call('sh -c "sudo cp -r {pkgname} {to_dirname}"'.format(pkgname=full_org_pkgpath, to_dirname=to_dirname), shell=True)

def main():
    with open(config_file) as fin:
        config = json.load(fin)
    for pkgname in config["from"]:
        copy(pkgname, config["to"])
    subprocess.call('sh -c "sudo mktexlsr"', shell=True)

if __name__ == "__main__":
    main()
```

utilize.pyを直接実行すると，設定ファイルを読み込んでディレクトリをコピーし，mktexlsrしてくれます．
あとは`chmod u+x utilize.py`で実行可能にすれば，`./utilize.py`でスタイルファイルを使えるようにしてくれます．
幸せ．
めも　systemスコープのlocal jar fileをwarに含めるとき

めも


- maven system scopeで指定したプロジェクトディレクトリ内の保存したjarはmvn packageしてもpackage内に入れてくれない
- 自分でコピーするか、pluginにお願いする

こんなかんじ

```maven
<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <includeScope>system</includeScope>
                    <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory>
                </configuration>
            </plugin>
```

```bash

// コピー
$ mvn dependency:copy-dependencies
```
ESLint v3.2.0

前 [v3.1.0] | 次 [v3.3.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v3.2.0 released: <a href="https://t.co/QbVIzV6MIH">https://t.co/QbVIzV6MIH</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/759088874907770881">2016年7月29日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 3.2.0 がリリースされました。
小さな機能追加といくつかのバグ修正が行われています。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

- :globe_with_meridians: [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
- :speech_balloon: [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
- :globe_with_meridians: [本家リポジトリ](https://github.com/eslint/eslint)
- :speech_balloon: [本家サポート チャット](https://gitter.im/eslint/eslint)

----

# :bulb: 新しいルール

## [#6079]: [no-tabs]

![JSCS](http://jscs.info/favicon.ico) JSCS 互換ルールです。
ソースコード中でタブを利用することを禁止します。

インデント、コメント、文字列など例外なく禁止するアグレッシブなやつです。

# :wrench: オプションが追加されたルール

## [#1801]: [indent]

プロパティアクセスに関するインデントを矯正するようになりました。

```js
/*eslint indent: [error, 2, {MemberExpression: 1}]*/

// ✔ GOOD
foo
  .bar()
  .baz()

// ✘ BAD
foo
.bar()
.baz()
```

> 3.2.0 ではデフォルトの挙動が変更されましたが、それは Semver 違反なので 3.2.1 でオプションの裏に隠すよう修正しました。

## [#6355]: [no-underscore-dangle]

`super` に続くアンダースコアを持つプロパティを許可するオプションが追加されました。
もともと `this` に続くアンダースコアを持つプロパティを許可するオプションは存在しました。これはその拡張になります。

```js
/*eslint no-underscore-dangle: [error, {allowAfterThis: true, allowAfterSuper: true}]*/

// ✔ GOOD
class A {
    constructor() {
        this._value1 = 1  // OK
    }
}
class B extends A {
    constructor() {
        super()
        this._value2 = super._value1 + 1  // OK
    }
}

// ✘ BAD
var obj = new A()

console.log(obj._value1)  //ERROR: Unexpected dangling '_' in '_value1'.
```

[v3.1.0]: http://qiita.com/mysticatea/items/723a467a4eb47e4913e2
[v3.3.0]: http://qiita.com/mysticatea/items/adf6ef3c63b35c01fc05
[#1801]: https://github.com/eslint/eslint/issues/1801
[#6079]: https://github.com/eslint/eslint/issues/6079
[#6355]: https://github.com/eslint/eslint/issues/6355
[indent]: http://eslint.org/docs/rules/indent
[no-tabs]: http://eslint.org/docs/rules/no-tabs
[no-underscore-dangle]: http://eslint.org/docs/rules/no-underscore-dangle