OmniAICreator/Qiita-1.07M huggingface dataset:
他者管理のRedmine通知をSlackに転送する

Slack便利ですね。本来色んなところで通知される通知を一本化できます。さてそんなSlackに、Redmineのチケット更新通知を飛ばしてみます。

本来RedmineにSlack通知機能を追加する場合は、「Slack chat Plugin」というものを使うそうです。

ただし、自分が管理していないRedmineの場合、これをインストールすることはできません。そこで標準機能であるメール通知機能を使って、Slackに通知を飛ばします。

他のメール通知のみサポートのサービスでも応用できますので、気になる方はどうぞお試しください。

# 使うもの
Slackだけでは完結しません。以下のサービスを連携させて使います

 * Slack(基本ですね)
 * IFTTT
 * GMail

リンクはしないので気になる場合は各自ググってください。

# やること
さて、上記で割と察しがついたかもしれませんが、ここでやることは大雑把に次のようになります。

 1. 通知専用のメールアカウントを作る（自分の場合は通知用に常用ドメインのアドレスを作成し、Gmailに転送するようにしましたが、Gmailは「[既存アカウント]+[追加文字列]@gmail.com」という別のアドレスを作ることができるので、それでもいいかもしれません）
 2. Redmineの連絡用メールアドレスに、1で作成したメールアドレスを設定する
 3. Gmailで、1で作ったメールアドレスに届いたメールに特定のラベルを付ける(例:notify)
 4. IFTTTで、「Gmailにnotifyというメールが届いたときに、Slackに通知する」というレシピを作成する 

## 通知専用のメールアドレスを作る
とりあえず通知専用のメールアドレスを作ります。やり方はたぶんサービスによって違うので割愛しますが、とりあえずどんなモノでもかまいません。
自分の場合、常用ドメインのメールアドレスを作成しましたので、メールアドレスからGmailに転送するように処理をかいておきます。

## Redmineの連絡用メールアドレスに、1で作成したメールアドレスを設定する
とくに説明は不要ですね。Redmineの個人設定より、メールアドレスを設定します。
![スクリーンショット 2015-02-25 15.16.55.png](https://qiita-image-store.s3.amazonaws.com/0/14499/856ebada-1490-5d6a-f5af-cfc7b7b994df.png)

## Gmailで、1で作ったメールアドレスに届いたメールに特定のラベルを付ける
次にGmailです。上記メールアドレスから転送されてきたメールに、notifyというラベルを設定します。
![スクリーンショット 2015-02-25 15.24.41.png](https://qiita-image-store.s3.amazonaws.com/0/14499/3f3212de-fd5c-5f67-329a-eb3d38bb50cb.png)

## IFTTTで、「Gmailにnotifyというメールが届いたときに、Slackに通知する」というレシピを作成する

最後にIFTTTです。Create Recipeより、「Gmailにnotifyというラベルのメールが届いたとき」に、「Slackに通知」を行います。英語ですがそんなに難しくないので、操作は問題なくできるはず。
![スクリーンショット 2015-02-25 15.30.09.png](https://qiita-image-store.s3.amazonaws.com/0/14499/3952951f-98a9-632c-7ad9-3a45bf7b6f82.png)

とりあえずレシピを公開しておいたので、良ければどうぞ。

 * https://ifttt.com/recipes/263500-slack

はいできあがり。Redmineにチケットが飛ぶと、以下のようにSlackに通知が飛んできます。
![2015-02-25_15h32_48.png](https://qiita-image-store.s3.amazonaws.com/0/14499/ffc58c2c-cc61-3b86-41e4-23a42adcd524.png)

ただし、若干通知が届くまでにタイムラグがあるようですので、いちおうご注意ください。
HARK の伝達関数ファイル中の .mat ファイルのインパルス応答表現

# やりたいこと

HARK の伝達関数は zip になっていて、その中の .mat ファイルには
場所ごとの定位 / 分離の伝達関数が入っている。
その伝達関数は FFT された後の表現なので、インパルス応答表現に変換したい。

# 問題

IFFT とか色々しないといけない

# 解決方法

1. zip ファイルの解凍
```unzip foobar.zip``` で、 transferFunction/ ディレクトリができる。
ここの、 localization/, separation/ に定位・分離の伝達関数ファイルがある。

2. .mat ファイルの .csv への変換
harktool の cli を使う。 mat2csv は mat を csv に変えてくれる。
```harktoolcli-mat2csv tf00000.mat -o tf00000.csv```

3. インパルス応答表現にして plot 
.csv を読み込んで、実：虚の順で並んでいるので複素数行列に変換して、
対象になるよにくっつけて、直流成分を除去して、 ifft する。

``` python
import csv
import numpy
import sys
import pylab

dat = numpy.loadtxt(sys.argv[1], delimiter=",")
datcomp = dat[:, ::2] + 1j * dat[:, 1::2]
datfull = numpy.c_[numpy.fliplr(datcomp), datcomp]
datfull = datfull[:, :-1]

# datfull
# 0Hz, fs/nfft Hz, 2*fs/nfft Hz, ..., nfft Hz, nfftHz, ..., fs/nfft Hz

flt = pylab.ifft2(datfull)[:, :datfull.shape[1]/2]

for nch in range(flt.shape[0]):
    pylab.subplot(flt.shape[0], 1, nch+1)
    pylab.plot(flt[nch, :])
pylab.show()
```
Backbone.Collection データごとに異なるModelを生成したい。

下記のようなJSONをCollectionにsetして配列要素からモデルをつくりたい。
ただそれぞれBackbone.Modelを拡張したxxxModelというモデルで生成したい。

```json
[
  {"name":"nekoModel"},
  {"name":"inuModel"},
  {"name":"usagiModel"}
]
```


こんな要件があったのでやってみた。要素のなかに生成したいclass名を定義しておく。

```json
[
  {"name":"nekoModel",  "class":"NekoModel"},
  {"name":"inuModel",   "class":"InuModel"},
  {"name":"usagiModel", "class":"UsagiModel"}
]
```

## 新案

modelを関数にしたらもっとスマートに対応できると指摘頂きました。ありがとうございます。

http://backbonejs.org/#Collection-model


これをうけての新案です。sampleではコンストラクタを書いてその中でmodel型を状況に応じて変更するようにしていました。
これでも十分対応可能なのですが、typescriptだとあつかいずらいので別classとして定義します。

modelプロパティにattrsからmodelのclass名を取得して返すModelSelectorを指定します。

```js
(function (Backbone) {
    Backbone.ModelSelector = Backbone.Model.extend(
      constructor(attrs, options){
         var modelClass;

         Backbone.Model.apply(this, arguments);
         modelClass =this.get("class");

         return modelClass;
      }
    );
}(Backbone));


var Library = Backbone.Collection.extend({

  model: ModelSelector

});

```

やっていることは旧案と同じですが、強引なオーバライドをしてない、
collection毎にオーバライドするか否かを選択できるようになったので
扱いづらくなったと思います。



## 旧案

attrにclassが定義されていればそのclassでnewするようにオーバライド。

```js
(function (Backbone) {
    _.extend(Backbone.Collection.prototype, {
        _prepareModel: function (attrs, options) {
            if (attrs instanceof Backbone.Model) {
                if (!attrs.collection) attrs.collection = this;
                return attrs;
            }
            options || (options = {});
            options.collection = this;
            var model;
            var myClass = attrs["class"];

            if (myClass) {
                model = new myClass(attrs, options);

            }else{
                model = new this.model(attrs, options);
            }

            if (!model._validate(attrs, options)) {
                this.trigger('invalid', this, attrs, options);
                return false;
            }
            return model;
        }
    });
}(Backbone));
```

ただそんなに必要になるケースはないと思う・・
Laravel5 で毎回毎回 \Auth::user() とか $request::all() とかするのめんどくさい

```ArticleController.php
public function postStore (Request $request)
{
    // とてもめんどくさい
    $data = $request->all();
    // あるいは Input::all();

    // とてもめんどくさい
    $user = \Auth::user();

    Article::create([
        'title' => $data['title'],
        'body' => $data['body'],
        'user_id' => $user->id
    ]);
}
```

```LazyController.php
class LazyController extends Controller {

    var $me;

    var $input;

    public function __construct()
    {
        $this->middleware('auth');

        $this->me = \Auth::user();

        $this->input = Input::all();
    }
} 
```

```ArticleController.php
class ArticleController extends LazyController {

    public function __construct () {
        parent::__construct();

        // ここに書いてもいいけど
        // それはそれでコントローラごとにかかなあかんからめんどくさい
    }

    public function postStore (Request $request)
    {
        // らくちん
        Article::create([
            'title' => $this->input->['title'],
            'body' => $this->input->['body'],
            'user_id' => $this->me->id
        ]);
    }
}
```
もっとかっこいい方法あったらおしえてください
忘れがちなgit stashをコマンドから実行する際のメモ書き

SourceTreeでgit stashすると、重かったりして面倒なのでよくやる処理をすべてコマンドから行えるようにまとめました。

## 一時退避

```
git stash
```

## 退避内容を一覧表示

```
git stash list
```

```js
stash@{0}: hoge0
stash@{1}: hoge1
stash@{2}: hoge2
```

## 最新の退避内容を戻す

```
git stash pop
```

## 退避対象のファイルの一覧を表示する

```
git stash show stash@{0}
```

## 退避対象の変更内容を表示する

```
git stash show -p stash@{0}
```

```diff
-  $user = '1'; // 削除した行
-
+  $add = 'hoge'; // ここが追加した行
```

## 指定の退避内容を戻す

```
git stash pop stash@{0}
```

## 退避内容を全削除する

```
git stash clear
```

## 指定の退避内容を削除する

```
git stash drop stash@{0}
```
Angular.jsのServiceとFactoryの違いを考える


前回[valueとfactoryの違いを考えた](http://qiita.com/daei/items/1026f27b5ccfe00ed618)ので、今回は`Service`と`Factory`の違いを考えたいと思う。

## 違いはある？ない？ ##
とりあえず`Factory`を使っているという声も聞かれるが、例えば `angular-ui/ng-grid`の[GitHubのソース](https://github.com/angular-ui/ng-grid)を見ると、下記のようなフォルダ構成になっていて、明示的に用途を分けている。

![ng-grid_src_js_core_at_master_·_angular-ui_ng-grid_·_GitHub.png](https://qiita-image-store.s3.amazonaws.com/0/55938/d716a956-f876-4328-2d7b-28b6e8224d42.png "ng-grid_src_js_core_at_master_·_angular-ui_ng-grid_·_GitHub.png")

どういう意図で分けているのか、まず、[What is the difference between module.factory and module.service and how might both be applied?](https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/HuZsOsMvKv4J)のスレッドに書かれてることを意訳したい。

## Service

>**Services**
*Syntax*: module.service( 'serviceName', function );
*Result*: When declaring serviceName as an injectable argument you will get an instance of the function. In other words new FunctionYouPassedToService().
*Usage*: Could be useful for sharing utility functions that are useful to invoke by simply appending () to the injected function reference. 

**Services**
*表記*: module.service( 'serviceName', function );
*結果*: serviceNameを宣言した時点で、関数のインスタンスが生成される。別の書き方をするなら new FunctionYouPassedToService(); 
*用法*: 括弧"()"を付けるだけで参照したい共通関数などを共有する場合に適している。

## Factory
> **Factories**
*Syntax*: module.factory('factoryName', function);
*Result*: When declaring factoryName as an injectable argument you will be provided the value that is returned by invoking the function reference passed to module.factory.
*Usage*: Could be useful for returning a 'class' function that can then be new'ed to create instances.

**Factories**
*表記*: module.factory('factoryName', function);
*結果*: factoryNameを宣言した時点で、module.factoryに渡している関数がreturnしている値が提供される。
*用法*: newでインスタンス化したいクラスがある場合に適している。

## つまり
クラス化せずに、共通関数の束として使いたい場合は`Service`。クラス化した方が便利なのであれば`Factory`ということらしい。

## サンプルソース
足し算と引き算をする簡単な例を作ってみる。

```index.html
<!doctype html>
<html lang="jp" ng-app="App">
<head>
  <meta charset="utf-8">
  <script src="bower_components/angular/angular.js"></script>
  <script src="app.js"></script>
</head>
<body>
<div ng-controller="Ctrl">
  3+2-1={{answer_service}}<br/>
  3+2-1={{answer_factory}}
</div>
</body>
</html>
```

```app.js
angular.module('App',[])
  .service('MyUtils', function(){
    var service = {
      add: function(a,b){ return a+b; },
      sub: function(a,b){ return a-b; }
    };
    return service;
  })
  .factory('MyMath', function(){
    function MyKlass(n){ this.n = n; }
    MyKlass.prototype.add = function(a){ this.n += a; return this; };
    MyKlass.prototype.minus = function(a){ this.n -= a; return this; };
    return MyKlass;
  })
  .controller('Ctrl',
    ["$scope", "MyUtils", "MyMath",
      function($scope, MyUtils, MyMath){
        // 関数群として呼び出す - Service
        $scope.answer_service = MyUtils.sub(MyUtils.add(3,2),1);
        // クラスとして呼び出す - Factory
        $scope.answer_factory = (new MyMath(3)).add(2).minus(1).n;
      }
    ]
  );
```
Laravel5 で URL末尾のIDをチェックしたい

```
/article/edit/123
```

とか

```
/article/destroy/456
```

とか、ログインユーザの閲覧・操作権限チェックしたい

暗黙のコントローラ使ってると基本的に末尾のIDが操作対象やろ

```ArticleController.php
class ArticleController extends Controller {

    /**
     * @var 操作対象
     */
    var $article;

    /**
     * Create a new authentication controller instance.
     *
     * @return void
     */
    public function __construct(Request $request)
    {
        parent::__construct();

        // もちろん middleware でやってもええねんけど

        //$this->middleware('article');

        // ['article', 'edit', '123']
        $segments = $request->segments();

        // 123
        $id = array_pop($segments);

        // indeとかcreateとか末尾にIDつかないのもある
        if (is_numeric($id)) {

            $article = Article::find($id);

            if ( ! $article) {
                return response('Unauthorized.', 401);
            }

            if ($article->user_id != $this->me->id) {
                return response('Unauthorized.', 401);
            }

            // あとで再利用するやで
            $this->article = $article;
        }
    }

```

もっとかっこいい方法あったらおしえてください
Consulをfpmでrpm化する

* https://github.com/udzura/consul-rpm-builder

公式にはバイナリのみを提供しているみたいなので、もう少し楽なように各種ディレクトリや展開済のWeb UIをrpm化しておいた。Puppet/Chefのコード数が減って便利。

サードパーティのrpmは他にもあるのだが、個人的に

```
config-dirは /etc/consul.d
data-dirは   /var/consul/data
ui-dirは     /var/consul/web_ui
```

でやっていきたいので自分で雑に書いた。

### `fpm` が便利

`fpm` は各プラットフォームのパッケージを簡単に作成できるコマンド。Rubyのgemで提供されている。

* 適当なrootfsにディレクトリとファイル構成を構築する
* そこを指定して、後は適当にメンテナ名などの設定を入れつつコマンドを放つ

Goの場合、バイナリ一発＋設定のディレクトリやファイル ぐらいしか必要ないのでこれだけでできる（rpmを作る場合は別途 `rpm-builder` が必要だった）。

```bash
fpm -s dir -t rpm -n consul-web_ui -v ${CONSUL_VERSION} -p /var/tmp/consul-web_ui.rpm \
    --rpm-compression bzip2 --rpm-os linux \
    --force \
    --iteration $(date +%s) \
    --epoch $RPM_EPOCH \
    --url https://www.consul.io/ \
    --description "Consul Web UI - Consul is a tool for service discovery and configuration. Consul is distributed, highly available, and extremely scalable." \
    --maintainer "Uchio KONDO <udzura@udzura.jp>" \
    --license "MPLv2.0" \
    --vendor "hashicorp" -a amd64 \
    /rootfs/=/
```

こんな感じで、まあ一つ一つ項目を埋めていけば良い。メンテナは当然自分だが、なんかくすぐったいですね...。

あと、今回は consul agent のサービス化はやってなくて、適当に自分で設定を書いて supervisord などを使えば良いかなと思った。サービスを入れたりするとpost-installやpre-uninstallなどのフックでサービスをどうこうする必要が出てくるが、fpmはそれも対応してるんで便利感がある。

というか、 [Drone の Makefile](https://github.com/drone/drone/blob/master/Makefile#L77-L91) が参考になる。ぼくもほとんどこれをコピペしただけです...。

### Dockerでビルドしてる

* http://yuuki.hatenablog.com/entry/docker-package-ci

こちらの話の通り、クリーンな環境を毎回作ってビルドできるのは安心感があるので採用した。
【メモ】Dropwizardのmigrationでカラムにcharasetを指定する

# 概要
createtable時にcharasetを指定するには？

# migrationファイル

## SQLタグでALTER TABLE文を書いてあげる

元ネタのstackoverflow
[Liquibase: How to set Charset UTF-8 on MySQL database tables?](http://stackoverflow.com/questions/23750292/liquibase-how-to-set-charset-utf-8-on-mysql-database-tables)

```xml
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd">
	<changeSet id="1" author="y.hoge">
		<createTable tableName="hoges">
			<column name="id" type="int(11)" autoIncrement="true">
				<constraints primaryKey="true" nullable="false" />
			</column>
			<column name="message_text" type="text">
				<constraints nullable="false" />
			</column>
		</createTable>
		<sql>ALTER TABLE hoges MODIFY hoge_text text CHARACTER SET utf8
			COLLATE utf8_unicode_ci;
		</sql>
	</changeSet>
</databaseChangeLog>
```
なんだかなぁ
Eclipse 上で ssh 経由の remote host ファイル同期

開発は、手元の Eclipse で行いたいが、実行／デバック場所は遠隔サーバということは多いと思います。deploy 環境が整っている場合は、なにも困ることはないのでしょうが、HPC cluster に並列プログラムを持っていって確認したいときなど、手作業でコピーなどというのは間違いが入りやすくて困ってしまいます。

でも、Windows 端末などをつかっていると、rsync を install するのも面倒。

で、Eclipse のプロジェクトに Remote System Explorer というのがあり、手軽に ssh 経由の Team Synchronization もできて便利です。
eclipse + rsync などのキーワードで検索しても、あまりすぐに情報にたどり着けなかったので、こちらに載せておきます。

以下、作業手順です。
確認したのは、Kepler です。

* TCF Remote System Expolorer add-in を導入
    * Help->Install New Software->Eclipse (今回はKepler)で、remote とかキーワードを入れてフィルタすれば、みつかります。
    * PTP (Parallel Tools Platform)　や Remote Development Tools も、上記を含んでいるみたいなので、そちらを導入するのでもよい。

* Perspective に、Remote System Explorer が現れるので、選択
* New->Connection で、接続対象を指定
    * 公開鍵登録などは、Preferences->General->Netowrk Connections->SSH2 に登録する。version 管理システムなどと共通

* Sftp Files で、相手先のファイルをブラウズ可能

* Export From Project で、Eclipse Project を Sftp 先に配置可能
    * その際、Review/Synchronize を選ぶと、以後の Synchronize を行うことが可能

* Synchronize の際は、Team Synchronizing Perspective に移行
    * 差分を閲覧可能
    * 対象を選んで Put すれば、同期できる


* 但し、ssh ベースの Team Sync を行いながら、git を用いたバージョン管理を行いたい場合に、どうすべきなのかは、良く分かっていない。
第４回 vvvv 勉強会（交流会？）のレポート

![______original.jpg](https://qiita-image-store.s3.amazonaws.com/0/59912/557d4566-ed4f-f6b3-9119-9b99bdd57bea.jpeg)

## はじめに
そもそも vvvv ってなに？って人はこちらをどうぞ。
[ビジュアルプログラミング言語「vvvv」をはじめよう！](http://yhy.hatenablog.com/entry/2014/11/17/120013)

## VVVV Japan Meetup vol.4
みなさん、こんにちは。

月一回で vvvv オフ会をやっていこうと決めてから、はや４回目です。

今回はワークショップ形式ではなく、雑談メインで、触ったことない人には個別でゆるく教えたり、ほんとみんな好き勝手交流して楽しましょう、という感じでした。
ちなみに今回の ATND ページは [こちら](https://atnd.org/events/62623)。

##やったこと

みんなで、「今こうゆうことやってるよー」とか、「こういうのやりたいんだけどー」みたいなもろもろの質問とか、会話が弾みました。

ワークショップ形式以外でも、こういう交流会的な会も結構いいなあと思いました。

これからも月１ペースくらいで継続的に行っていくので、興味ある人はぜひ参加してみてください。

##個人的な感想
個人的に楽しかったところとして、TouchDesigner 使いの人にいろいろ話を聞いたり、僕の今やってることの応用アイデアをいろいろ聞けたのが面白かったなーと。
あとは、やっぱり vvvv ユーザとがっつり交流できるのは純粋に楽しいですね。

##おしまい
![sDSC05041.jpg](https://qiita-image-store.s3.amazonaws.com/0/59912/f51f384d-1321-01db-0ed5-0175781604b4.jpeg)
Project Euler 1をワンライナーで書いてみた。

Project Euler problem 1をワンライナーで書いてみた。

回答案1 
`print sum([i for i in range(1,1000) if i%3*i%5==0])`

回答案2
`print sum(set(range(3,1000,3)+range(5,1000,5)))`

とりあえず思いついたのは以上。
HTMLとCSSのみでつくるボタン集

HTMLとCSSのみを使ってインタラクティブなボタン集を作っていきます。


##ホバーした時に押せる（ボタンが凹む）ような挙動をするボタンの実装


~~言葉で説明しても伝えきる自信が無いので、スクリーンショットを見てください。~~
→GIF画像を作りました


![button01.gif](https://qiita-image-store.s3.amazonaws.com/0/63056/1680654d-68e2-fa54-0158-59e0bac96c75.gif)


以下コードです。  
  
HTML

```html

<div class="button">
	<a href="#">button</a>
</div>

```


CSS

```css

.button {
	width: 300px;
	font-size: 19px;
	font-weight: bold;
	text-align: center;
}
.button a {
	padding: 11px 10px 8px;
	display: block;
	background: #e7ae00;
	-webkit-border-radius: 10px;
	-moz-border-radius: 10px;
	border-radius: 10px;
	box-shadow: 0 6px 0 #b48800,0 12px 0 rgba(0,0,0,0.2);
	-webkit-transition: color 0.3s, background-color 0.3s, box-shadow 0.3s, -webkit-transform 0.3s;
	transition: color 0.3s, background-color 0.3s, box-shadow 0.3s, transform 0.3s;
	text-shadow: 0px -1px 0px rgba(0,0,0,0.25);
	color: #fff;
	text-decoration: none;
}
.button a:hover {
	box-shadow: 0 3px 0 #ce9b00,0 6px 0px rgba(0,0,0,0.2);
	-webkit-transform: translateY(3px);
	transform: translateY(3px);
	background: #ffc71b;
}

```




##上から背景がするりと降りてくるボタン

ちょっと画像が荒いですが、、、
gif画像作りました

![button02.gif](https://qiita-image-store.s3.amazonaws.com/0/63056/9b7a2374-2897-178a-691b-51330ea33c03.gif)

HTML

```html

<a class="button" href="#">Button</a>

```

CSS

```css

.button {
	display: inline-block;
	width: 200px;
	height: 54px;
	text-align: center;
	text-decoration: none;
	line-height: 54px;
	outline: none;
	position: relative;
	z-index: 2;
	background-color: #587ed3;
	border: 2px solid #333;
	color: #333;
	line-height: 50px;
	overflow: hidden;
}
.button:before,
.button:after {
	position: absolute;
	z-index: -1;
	display: block;
	content: '';
}
.button:after {
	top: -100%;
	width: 100%;
	height: 100%;
}
.button,
.button:before,
.button:after {
	-webkit-transition: all .3s;
	transition: all .3s;
}

.button:hover {
	color: #4b68aa;
	border: 2px solid #4b68aa;
}
.button:hover:after {
	top: 0;
	background-color: #fff;
}

```


##ふわっと背景が変わるボタン
内側に白のbox−shadowを入れているところがポイントです。

HTML

```html

<a href="#" class="button">ボタン</a>

```

CSS

 ```css

.button {
	padding: 6px 0;
	text-align: center;
	display: block;
	width: 150px;
	font-weight: bold;
	color: #eb5503;
	border: 1px solid #eb5503;
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
	background: #fff;
	font-size: 13px;
	-moz-box-shadow: 0px 3px 0px #eb5403,inset 0px 0px 2px #fff;
	-webkit-box-shadow: 0px 3px 0px #eb5403,inset 0px 0px 2px #fff;
	box-shadow: 0px 3px 0px #eb5403,inset 0px 0px 2px #fff;
	-webkit-transition: all 0.3s linear;
	-webkit-transform-origin: 50% 50%;
	-moz-transition: all 0.3s linear;
	-mox-transform-origin: 50% 50%;
}
.button:hover {
	background: #eb5503;
	color: #fff;
	text-decoration: none;
}


```


注） IE8,IE9ではうまく動かないものが多いです。


--------------------------------------

CSS3の登場でCSSのみで実装できるボタンの幅がかなり広がったようです。
今度いろいろなボタンをまとめてみようと思います。

-------------------------------------------------

簡単に作れるGIF画像であまり荒くならない方法を教えていただけるとうれしいです。
現在はCloudAppってやつで作ってます。
Laravelのインストール

# Laravelの導入

Laravelには、プロジェクトのテンプレートを作成するためのツールが用意されています。
このツールを使えば、コマンド一つでプロジェクトを作成することができます。
こんな感じに。

```
laravel new blog
```


ではさっそく、laravelコマンドを使えるようにしてみましょう。  
laravelコマンドは、composerを使うことで簡単にインストールできます。

```sh
composer global require "laravel/installer=~1.1"
```

インストールが完了したら以下のディレクトリパスを確認してください。

```
~/.composer/vendor/bin
```

に、laravelというシンボリックリンクが存在していればインストールは成功です。

インストールが完了したので試しにプロジェクトを作成してみましょう。

```
laravel new first_app
```

Oops!!  
laravelコマンドが見つからないと怒られてしまいました…。
```
laravel: コマンドが見つかりません
```

でも慌てない。インストールしたlaravelコマンドにパスが通っていないだけ。  
パスを通して

```
export PATH="~/.composer/vendor/bin:$PATH" 
```

もう一度、laravelコマンドを実行してみます。

```
laravel new first_app
```

プロジェクトが作成できた！！

```
Crafting application...
Application ready! Build something amazing.
```
Ruby2.2のtrue/false/nilがfreezeされているように見えない


[Feature #8923: Frozen nil/true/false - Ruby trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/8923)

Ruby2.2からtrue/false/nilが `frozen? #=> true` になったんだけどホント? 以下の動作が解せない

![2015-02-25 at 1.13 PM.png](https://qiita-image-store.s3.amazonaws.com/0/682/01c03b2d-7c03-34c8-99c9-646578925d53.png "2015-02-25 at 1.13 PM.png")


freezeされているオブジェクトには特異メソッドを定義できない

![2015-02-25 at 1.15 PM.png](https://qiita-image-store.s3.amazonaws.com/0/682/f8466422-a9af-a124-9105-73f69fea3fd4.png "2015-02-25 at 1.15 PM.png")

上に貼り付けたIssueをもっと読んでみるか...
検索フィールド[input type="search"]でキャンセルボタンを押した時のイベントも'search'


検索フィールドでキャンセルボタンを押した時もsearchイベントが起きるようです。

![cancel.png](https://qiita-image-store.s3.amazonaws.com/0/51116/2a30ee23-ca91-9b2a-552b-e032066610c6.png "cancel.png")

なので、キャンセルボタンを押されたのか、リターンキーなどで検索処理をしたいのかは判別した方が良さそうですね。


```html
<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<title>search</title>

	<style>
		#search_box {
			font-size: 2em;
			-webkit-appearance: none;
		}
	</style>

	<script>
		window.addEventListener('load', function() {

			document.getElementById('search_box').addEventListener('search', function(e) {
				console.log('value:[' + this.value + ']');
				if ( this.value.length === 0 ) {
					console.log('[cancel]');
					return;
				}
				/*
					search procedure
				*/
			}, false);

		}, false);
	</script>
</head>

<body>
	<h1>検索フィールドのキャンセルボタンイベント</h1>
	<input type="search" id="search_box" placeholder="search word">
</body>

</html>

```
Babel に JSX は要らない

6to5（現: [Babel][]） で作っていたプロダクトにビューが必要になり、ここ最近日本語圏でも増えてきた [React][] を調べてみたら、掲題の通りらしく、試してみたのでメモ。

JSX と Babel を一緒に使う場合、どっちを先に処理にするのがいいのかなーと調べていたら、Babel のブログにこんなことが書かれていた:

* [Babel <3 React · Babel](http://babeljs.io/blog/2015/02/23/babel-loves-react/)

Babel が JSX を理解してくれるらしい。

試してみる。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bash:端末
$ mkdir babel-jsx
$ cd babel-jsx
$ npm install babel
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

[React のトップページ][React] のサンプルを ES6 っぽく書く:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~index.js
const HelloMessage = React.createClass({
  render() {
    return <div>Hello {this.props.name}</div>;
  }
});

React.render(<HelloMessage name="John" />, mountNode);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Babel に掛けてみる:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~bash:端末
$ ./node_modules/.bin/babel index.js
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~js:babelの出力
"use strict";

var HelloMessage = React.createClass({
  displayName: "HelloMessage",

  render: function render() {
    return React.createElement(
      "div",
      null,
      "Hello ",
      this.props.name
    );
  }
});

React.render(React.createElement(HelloMessage, { name: "John" }), mountNode);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

動いてる。

babel の依存関係見ても JSX パーサが見当たらないんだけど、babel がパーサ持ってるんだろうか。

[Babel]: https://babeljs.io/
[React]: http://facebook.github.io/react/
TinyTDS 0.6.2を使ってSQL Serverに接続しようとしたらrb_thread_blocking_regionとか出てハマった時のメモ


TinyTDS 0.6.2を使ってRailsからSQL Serverに接続しようとしたら下記エラーが発生した。

	tiny_tds.so: undefined symbol: rb_thread_blocking_region

調べてみると0.6.3で修正されてるみたいなのでそれを使うことで解決した。

https://github.com/rails-sqlserver/tiny_tds/issues/176
https://github.com/rails-sqlserver/tiny_tds/issues/188

master branchのを使えということなのでGemfileはこんな感じ。

	gem 'tiny_tds', :github => 'rails-sqlserver/tiny_tds'
.map を利用して let でランダム数列を作る

たまに乱数の数列を作ることがありますが、数列作るときはランタイムで乱数を作っているので var でとりあえず仮の数列をつくって、その後 for ループで乱数作りながら仮数列に入れていく人もいるかもしれませんが、まあ目的は達成できますが一旦つくったら定数として扱いたいときは var で作るのは気持ち悪いですよね…というわけで、実は .map を使えば一発で let で乱数の数列が作れちゃうのです♪

やり方はとても簡単です。例えば -50 ..< 50 の範囲で10個の乱数を作りたいときは、以下のように書けば作れます：

```swift
let randomIntArray = [Int](count: 10, repeatedValue: 0).map { (some: Int) -> Int in
	let randomUInt = arc4random_uniform(100) // 0 ..< 100 の乱数を作る
	return Int(randomUInt) - 50
}
```

ソースコードでもうお分かりかと思いますが、やってることはとりあえず一旦10個の要素がある [Int] の配列を一旦つくって、その後 .map で同じ要素数の新しい配列を作って中身を乱数で代入するという単純なことです。まあぶっちゃけ一旦 var と for ループで仮数列を作ってその後本数列を let で仮数列と同じ中身で作るのと一緒ですけど、書き方としてはかなりシンプルになります。

（ちなみにお分かりかと思いますが .map は元の配列の中身を弄らずに新しい配列を作る関数です。mutating func ではありません）

ところが乱数はいいんですけど、逆に等差数列、たとえば [0, 1, 2, 3...] の数列を let で作りたいときはどうすればいいだろ…

========= 追記 =========

いやー俺アホだった… [0, 1, 2, 3...]の数列は

```swift
[Int](0 ..< 10)
```

で作れるじゃん…
MacOSXで「Error: This Java instance does not support a 32-bit JVM.」出たときの対処法

MacOSXにJRubyインストールしようとしたらタイトルのエラーが出てしまった。

```bash 
$ rbenv install jruby-1.7.19
:
Error: This Java instance does not support a 32-bit JVM.
Please install the desired version.
```

そんな時の対処法。

## `/usr/libexec/java_home`の`-d`オプション

MacOSXにある`/usr/libexec/java_home`を利用すればインストールされているJavaの中で条件に合うJVMの`JAVA_HOME`を教えてくれる。今回は`-d`オプションを利用する。

```
[-d/--datamodel <datamodel>]     Filter JVMs capable of -d32 or -d64
```

デフォルトで`1.7.0_75`インストールしていたわけだが、

```bash 
$ java -version
java version "1.7.0_75"
Java(TM) SE Runtime Environment (build 1.7.0_75-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode)
```

32-bitをサポートしているJVMを探す。

```bash  
$ /usr/libexec/java_home -d32
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
```

あったので、こいつを`JAVA_HOME`にぶっ込めばOK。

```bash
$ export JAVA_HOME=$(/usr/libexec/java_home -d32)
$ rbenv install jruby-1.7.19
```

無事インストールできましたと。
AWS::Record::Hashmodelのプライマリーキーを変更

# 概要
`AWS::Record::Hashmodel`は DynamoDB 用の Model クラスです。これを使用することで簡単にモデルを実装できますが、プライマリーキーは常に `id` が自動で設定されてしまいます。これを別の属性へ変更してみました。

# 問題点
プライマリーキーを`user_id`と想定して、以下のようなモデルを実装しました。

```ruby:user.rb
class User < AWS::Record::HashModel
  set_shard_name "users"
  string_attr :user_id
  string_attr :email
end
```

このままでは以下の通り、プライマリーキー`id`が自動的に追加されてしまい、`user_id`で`find`や`find_by_id`を実行することができません。

```ruby:rails_console
pry(main)> user = User.new(user_id: 1, email: "foobar@hoge.com")
=> #<User:0x00000008448bf0
 @_data={"id"=>nil, "user_id"=>1, "email"=>"foobar@hoge.com"},
 @_ignore_changes=false,
 @_orig_values={"user_id"=>nil, "email"=>nil},
 @_shard="users">
```

# 対応策
`AWS::Record::Hashmodel`では、`inherited`メソッドが以下の通り定義されており、サブクラスが作成された際、自動的に`id`属性がプライマリーキーとして生成されるように実装されていました。

```ruby:lib/aws/record/hash_model.rb
def self.inherited(sub_class)
  sub_class.string_attr :id,
    :hash_key => true,
    :default_hash_key_attribute => true
end
```

この`inherited`を消し去り、`user_id`に正しいオプションを渡せば問題が解決しそうです。

```ruby:user.rb
class User < AWS::Record::HashModel
  def self.inherited(subclass)
  end

  set_shard_name "users"
  string_attr :user_id, hash_key: true, default_hashkey_attribute: true
  string_attr :email
end
```

メソッドをオーバーライドし、何も実行しないように変更しました。また、`user_id`に必要そうなオプションも追加してみました。

```ruby:rails_console
pry(main)> user = User.new(user_id: 1, email: "foobar@hoge.com")
=> #<User:0x00000009db4e90
 @_data={"user_id"=>1, "email"=>"foobar@hoge.com"},
 @_ignore_changes=false,
 @_orig_values={"user_id"=>nil, "email"=>nil},
 @_shard="users">

pry(main)> user.save
=> true
```

これで`id`が自動生成されないようになりました。

次に、`find`や`find_by_id`を使用して正しく取得できる試してみます。

```ruby:rails_console
pry(main)> User.find("1")
=> #<User:0x0000000879a6c8
 @_data={"user_id"=>"1", "email"=>"foobar@hoge.com"},
 @_ignore_changes=false,
 @_persisted=true,
 @_shard="users">

pry(main)> User.find_by_id("1")
=> #<User:0x00000006246408
 @_data={"user_id"=>"1", "email"=>"foobar@hoge.com"},
 @_ignore_changes=false,
 @_persisted=true,
 @_shard="users">
```

どうやら問題なさそうです。

# 懸念点
`AWS::Record::Hashmodel`は AWS SDK for Ruby Version 2 (最新) では存在してないので、正直使わないほうが良いと思います。

代わりに何を使えば捗るのだろう。
Laravel5 で中間テーブルが絡むと paginate で ID がとれずハマる

```
$group = Group::find($id);
$users = $group->users()->get();
```
```
<ul>
  @foreach ($users as $user)
    <li>
      <input type="checkbox" name="user_id" value="{{ $user->id }}">
    </li>
  @endforeach
</ul>
```

社員一覧とってきてリスト出したりするじゃないですか

```
$users = $group->users()->paginate(10);
```

でも件数増えるとページングしたくなるよね
Laravelのページネート最高や〜〜〜

なんか挙動がおかしい

detach()とかが実行されない

IDが正しくとれてない

なんでやー

```
var_dump($group->users()->get()[0]);
```
```
["id"]=>
int(1)
["name"]=>
string(10) "堀川 涼"
["email"]=>
string(25) "horikawa_ryou@example.com"
["password"]=>
string(60) "$2y$10$kFvj1P7MVKbgQoiiUxu1H.xNsm4HKFa.ikIt4KEkR2Eduqb8uNeTG"
["company_id"]=>
int(2)
["tel"]=>
string(12) "013-547-8337"
["auth_login"]=>
int(0)
["deleted_at"]=>
NULL
["remember_token"]=>
NULL
["created_at"]=>
string(19) "2015-02-24 19:10:26"
["updated_at"]=>
string(19) "2015-02-24 19:10:26"
```
（データはダミーデータです）

```
var_dump($group->users()->paginate(10)[0]);
```
```
["id"]=>
int(26)
["name"]=>
string(10) "堀川 涼"
["email"]=>
string(25) "horikawa_ryou@example.com"
["password"]=>
string(60) "$2y$10$kFvj1P7MVKbgQoiiUxu1H.xNsm4HKFa.ikIt4KEkR2Eduqb8uNeTG"
["company_id"]=>
int(2)
["tel"]=>
string(12) "013-547-8337"
["auth_login"]=>
int(0)
["deleted_at"]=>
NULL
["remember_token"]=>
NULL
["created_at"]=>
string(19) "0000-00-00 00:00:00"
["updated_at"]=>
string(19) "0000-00-00 00:00:00"
["group_id"]=>
int(37)
["user_id"]=>
int(1)

```

paginateのほうはIDが中間テーブルのIDになっとる

get()とpaginate()は戻り値の型が違うので、ぱっと見で挙動が同じでも注意
WebAPIを作る前に考えること - LSUDsとSSKDs、オーケストレーション層

# 概要
- スマホアプリ時代のAPI戦略としてオーケストレーションという層を設けることがポイントになっています。

# LSUDsとは
- Large Set of Unknown Developers
- 大多数向けの未知の外部開発者に向けたAPI（自分でコントロールできない人たち）
- 誰にでも合うフリーサイズの服にちなんで one-size-fits-all API とも言う

# SSKDsとは
- Small Set of Known Developers
- 利用者が自分が知っている開発者向けのAPI（自分でコントロールできる人たち）

## LSUDsなAPIに求められるもの
- 汎用的
- 様々なユースケースを満たす
- 簡単、わかりやすい
- 機能の単位が小さい
- リソース指向 RESTful

## SSKDsなAPIに求められるもの
- クライアント（デバイス）に寄った実装
- クライアントごとに最適化されたAPI
- 画面を作るためのおまとめAPIみたいなもの
- 必要であればRESTfulを捨ててクエリベースなAPIにする
- SSKDs単体でリリースサイクルが回せる（後述のオーケストレーション層参照

# オーケストレーション層
- LSUDsなAPIを色々叩いたり処理してSSKDsなAPIに変換する層
- クライアントの要求を満たすような実装をここにいれる
- アプリ開発者がオーケストレーション層を触ってAPI開発もする
- LSUDsとは別の、アプリに合わせた高速なリリースサイクルで回せるようにする

## オーケストレーション層を挟むことのメリット
- クライアントごとに最適化したAPIを実装できる
- 複数クライアントで書かなければいけないロジックをオーケストレーション層に集約できる
- A/Bテストしやすい
- バックエンドの開発完了を待たずにAPIスタブを作れるので、クライアントの開発を妨げない
- APIリリースサイクルをバックエンド本体側から分離できる
- バックエンドの仕組みを知らなくてもクライアント開発者がAPI開発することも可能

## デメリット 
- APIの数が爆増する
- バックエンドのAPIが増えると、オーケストレーション層でも対応しないといけない
- 一段レイヤーが増えるのでネットワークコストも増える（実装次第）

# イメージ
![](http://3.bp.blogspot.com/-ISPfN3AVxQA/T_Tai9NJReI/AAAAAAAAAEE/qQDFuxiIlWM/s1600/Slide04.jpg)

# 参考
- netflix社の事例
 - http://techblog.netflix.com/2012/07/embracing-differences-inside-netflix.html
 - http://thenextweb.com/dd/2013/12/17/future-api-design-orchestration-layer/
DBD::DB2でVARGRAPHICがtruncateされた場合の一時対処

# 説明
DB2のデータ型VARGRAPHICで文字列長が設定値を下回っていても切り捨てが発生。

# 対処
DBD::DB2モジュールを編集してバッファを4倍?確保

# 手順
```shell-session

cpanm --look DBD::DB2
# dbdimp.c編集
vi dbdimp.c
perl Makefile.PL
make
make install
exit
```

編集箇所　dbdimp.c: 1321行目

```c

 + fbh->rlen = bufferSizeRequired = (4*fbh->dsize)+1;/* +1: STRING null terminator */
 - fbh->rlen = bufferSizeRequired = fbh->dsize+1;/* +1: STRING null terminator */
```

-
管理者権限付き「Windowsコマンドプロセッサ」ショートカットの作成

http://qiita.com/YamasakiKenta/items/0ed5f2ba9bd8a5cd5e79
をフォーク

1. デスクトップを右クリック
2. 新規作成＞ショートカット
3. cmd
4. ショートカットを右クリック＞プロパティ
5. 詳細設定タブの詳細設定ボタン
6. 「管理者として～」チェックをＯＮ
7. ＯＫを押して閉じる

アイコンにシールドが出ないけど管理者権限で起動を試みます。
VagrantにJenkinsを入れてみた

# VagrantにCentOS6.5を構築
[Vagrant環境構築方法はこちら](http://qiita.com/kurun/items/41725e31b8e13d2151dd)
# Jenkinsの構築
## rootユーザになる
vagrantユーザはパスワードなしでsudoコマンドが使えます

```
[vagrant@localhost ~]$ sudo su -
[root@localhost ~]# ←ここが「#」になればOK！
```
## wgetのインストール
```
[root@localhost ~]# yum -y install wget
```
## Javaのインストール
javaをインストール

```
[root@localhost ~]# yum -y install java-1.8.0-openjdk
```
Javaのバージョンを確認

```
[root@localhost ~]# java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
```
## Jenkinsのインストール
yumのレポジトリにjenkinsを追加

```
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key 
```
Jenkinsをインストール

```
yum -y install jenkins
```
## Jenkinsの起動
```
service jenkins start
```

## Jenkinsにアクセス
[http://192.168.33.10:8080/](http://192.168.33.10:8080/)
↑このURLは初期設定のURLです。(Vagrantfileの設定次第)
CloudWatchLogsをFuelPHPで使ってみた


# tl;dr

- FuelPHP と CloudWatchLogs を組み合わせた時にハマったのでメモ
- 導入までのあれこれは[公式ドキュメント](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/QuickStartEC2Instance.html)とかを参照

# 起きたこと

## 都内某日
「CloudWatch Logs が Tokyo にも来たし、遊んでみるぜー」
「FuelPHPでログは fuel/app/logs に日付単位で生成されるので、ワイルドカードを使ってfileを指定すればいいよなー」

```/etc/awslogs/awslogs.conf
[/fuelphp/logs]
datetime_format = %b %d %H:%M:%S
file = /path/to/fuel/app/logs/20*/*/*
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /fuelphp/logs
```

awslogsをstartして、AWSマネージメントコンソールで確認
「よしよし、上手くうごいてる♪」

## 一夜明けて
「あれ？今日の分のログがとれてない？」
「再起動してもダメポ...」
「/var/log/awslogs.log になんか変なエラー出てるお...」
 (ノ`Д´)ノ彡┻━┻ 

# 原因
- ユニークであるべきsequenceTokenが重複した状態でPutLogEventsしてるのが原因
	- (要出典というかちゃんとは追ってないけど、)どうもこのsequenceTokenのジェネリ方がline単位でのハッシュ値(?)的な感じっぽげ 
- FuelPHPの[Logクラスの罠](https://github.com/fuel/core/blob/1.8/develop/classes/log.php#L94)のせいで、ログファイル最初の1行目が重複しちゃう
	- その結果、sequenceTokenが重複しちゃってあぼーん

## 解決方法
- Logクラスをオーバライドしちゃう
	- そもそもFuelPHPのLogクラス使いにくいと思ったり...
- FuelPHPを使わない
	- 混ぜるな危険...
- agent を自作する
	- 本家のもpythonスクリプトだし...
Herokuのアプリを別のアカウントに移管する方法

## 概説
Herokuの自分のアカウントで運用していたアプリを別のアカウントに移行（権限を移動）する方法がないものかとTwitterにつぶやいたところ、Herokuエバンジェリストの @ayumin さんから「この方法でできるよ」と教えていただき、実際にやってみてうまくいったので記録を残しておきます。
![herokuのアプリ移管.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/12286648-3494-e873-f7fd-9baec4607e3f.png)


Herokuはアプリケーションの![権限画面.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/0ec88e4c-709c-2c4f-332c-0020fe17adf8.png)の画面から![コラボレーターの追加.PNG](https://qiita-image-store.s3.amazonaws.com/0/23093/a8002132-00e4-a3f2-93ad-05392bb8f7bf.png)を追加することで、共同開発が可能ですが、アプリの移行はこれの応用になります。

## 移行元アカウントでログイン

```コマンド:コマンド
$ heroku login
```

## 移行したいアプリのディレクトリに移動

```コマンド:コマンド
$ heroku git:clone -a <移行したいアプリ>
$ cd <移行したいアプリ>
```

## コラボレーターを追加

```コマンド:コマンド
$ heroku sharing:add <移行先アカウント>
```

## アプリのオーナーを移行

```コマンド:コマンド
$ heroku sharing:transfer <移行先アカウント> --app <移行したいアプリ>
```

## コラボレーターを削除

「heroku sharing:transfer」を実行すると、移行元アカウントがアプリのオーナーからコラボレーターになるので、コラボレーターとしての権限が不要であれば、移行先アカウントのDashboardのAccessの画面から削除するか、もしくは、移行先アカウントでログインし、以下のコマンドでコラボレーターを削除します。

```コマンド:コマンド
$ heroku sharing:remove <移行元アカウント>
```

 - 参考URL
   - [Getting Started as a Collaborator](https://devcenter.heroku.com/articles/collab)
   - [Collaborating With Other Developers on Your App](https://devcenter.heroku.com/articles/sharing)
フィボナッチをFPGAで書いてみた

とんぷーさんが書いた[Goで再帰使うと遅くなりますがそれが何だ](http://ymotongpoo.hatenablog.com/entry/2015/02/23/165341)がとてもためになった。これを読んでたら、FPGAでフィボナッチを書いてみたくなったのでやってみた。再帰ではなくてループを使ったので比較はできないけれど、50MHzクロックのFPGAで、fib(42)は**5.5us**で計算できた。

![IMG_20150225_082628.jpg](https://qiita-image-store.s3.amazonaws.com/0/38290/b1a38ff3-18f7-fa99-abea-fa0b7b21b698.jpeg)
ステッカーは中身とあんまり関係ないのだ

## JavaでFibを書く

今回は手っ取り早くJavaで書いて、[Synthesijer](http://qiita.com/kazunori279/items/4951ca5f6164040878ce) (sjr)でHDLに落とすことにした。こんなコード：

```Fib.java
public class Fib {

	public int result;
	
	private int fib(int n) {
		int cur = 0, next = 1;
		for (int i = 0; i < n; ++i) {
			int tmp = cur;
			cur = next;
			next += tmp;
		}
		return cur;
	}

	public void run() {
		result = fib(42);
	}
}
```

まずはJava上でこれを実行して動作確認。その後、sjrにかけると[Fib.v](https://github.com/kazunori279/hdllesson/blob/master/Fib/src/com/example/fib/com_example_fib_Fib.v)という長いVerilog HDLファイルが生成される。これで本体は完成。

## 実行時間の計測

でも、これ一体どの程度の速さで動くのだろう？ それを確かめるため、フィボナッチ計算に何クロックかかったかを計測してLEDに表示する簡単なコードをVerilog HDLで書いた。こんな具合：

```Top.v
reg [31:0] timer;

always @(posedge clk or posedge reset) begin
  if (reset) begin;
    timer <= 32'd0;
  end else if (result != 32'd267914296) begin // fib(42) = 267914296
	   timer <= timer + 32'd1;
  end
end
```

Fibの出力結果が267914296になるまでクロックの数を数えて、LED表示する仕組み。

## 回路合成・実行

こうしてHDLファイルがひと通り用意できたら、Altera Quartus IIを使って回路合成し、FPGAボードのDE0にロードする。フィボナッチ数の計算がすぐに始まって、上記写真のようにLED上に「191」と表示された。10進数で401クロック。1クロックは50MHz = 20nsなので、401 x 20 = 8020ns つまり8usで計算できたことになる。

### 3/9追記

みよしさんがsjrの最適化をアップデートしてくれたので、最新版（20150307）で試してみたら、273クロック＝5.46usに短縮された！

## まとめ

ハード開発のプロの人が生HDLで書いてクロック上限を追い込めば、もっと速くなるはず。でもまあ、ハード素人がJavaでさくっと書いて遊べるsjrはあいかわらずすばらしいと思った。

今回のコードは[こちら](https://github.com/kazunori279/hdllesson/tree/master/Fib/src/com/example/fib)。
Solr で検索位置 (Offset) を出力する

# Solr で検索位置 (Offset) を出力する

全文検索エンジン Solr の検索結果に検索ワードの出現位置を含ませたいと思ったことはないでしょうか？
結論から言うと、これを実現するには query をどんなにいじっても無理です。

出現位置を出力させるには次の方法があります。
1. 手元で再検索する
2. Plugin を作成して、Formatter を指定する
3. Term Vector Component を使って算出する
4. あきらめる

ここでは２を選択します。

# Plugin を作る

標準の機能として query に hl パラメータを渡してやることで、ヒットした前後にタグを挿入することができます。
この機能は SimpleHTMLFormatter によって実現されていますが、これを自前で実装してタグ中に開始オフセットと終了オフセットを出力させます。

自前の Plugin を実装するのは大変に感じるかもしれませんが、意外と簡単でした。
まず次の二つのクラスを実装します。

* Formatter を実装したクラス
* HighlightingPluginBase を継承し、SolrFormatter を実装したクラス

継承元となる各クラスは次の jar に格納されています。
これらの jar は配布されている solr 内にあります。

* solr-core-*.jar
* solr-solrj-*.jar
* lucene-highlighter-*.jar

## Formatter の実装

lucene の SimpleHTMLFormatter を参考に Formatter を実装したクラスを作成します。
このインターフェースは次のメソッドのみなのでそれほど難しくありません。

[SimpleHTMLFormatter](http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/highlighter/src/java/org/apache/lucene/search/highlight/SimpleHTMLFormatter.java?view=markup)

### highlightTerm

引数の originalText はヒットした文字列ではないことに注意してください。
第二引数の TokenGroup の getTotalScore の値が０以下の場合は無視したほうが良いです。
この TokenGroup の次の二つの値がそのままほしい開始/終了位置のオフセットです。

* getStartOffset
* getEndOffset

この情報を originalText を挟む形で文字列を組み立てます。

## SolrFormatter の実装

こちらは Solr の HtmlFormatter の実装を参考に次の二つのメソッドを実装します。

[HtmlFormatter](http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/highlight/HtmlFormatter.java?view=markup)

### getFormatter

実装した Formatter クラスのインスタンスを返すだけす。

### getDescription

このクラスの名前を開始ます。

# 実装した Plugin を Solr で使用する

Plugin を Solr に使用するには次の手順で Solr に読み込ませてやります。
1. jar 作成し、配置する
2. solrconf.xml を編集する
3. hl パラメーターで指定する

### jar の作成と配置

1. 各クラスを jar にまとめる
2. exmple/solr に lib ディレクトリを作成する
3. lib に作成した jar を配置する

### solrconf.xml の編集

searchComponent の highlighing 要素内に次の要素を追加します。

```lang:solrconf.xml
<formatter name="(hl.formatterで指定する名前)" class="(実装した SolrFormatter のクラスパス)" />
```

### hl パラメーターの指定

solrconfl.xml を編集したら solr を再起動して jar と solrconf.xml を読み込ませてやります。

再起動が完了したら、クエリに次のパラメーターを追加します。
```hl=true&hl.formatter=(solrconf.xml で指定した名前)
```

これでレスポンスの中に、オフセットが埋め込まれていると思います。
Apacheへのアクセスで、リダイレクトしてwwwの有無を統一する

Webサイトアクセス時に、`http://www.hoge.unicast.ne.jp/`や`http://hoge.unicast.ne.jp/`で、どちらでもアクセスできたりできなかったりして、統一させたいことがあると思います。その設定手順です（個人的にはwwwは過去の慣例的な気がするので、wwwなしで統一させています）。

# 方法
Apacheの`mod_rewrite`モジュールの機能を使います。正規表現でアクセスURLを書き換えることができます。

[mod_rewrite](http://tech.bayashi.net/svr/doc/apache/mod_rewrite.html)

## 1. wwwなしに統一

```httpd.conf
<VirtualHost *:80>
    ...

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.hoge\.unicast\.ne\.jp$
    RewriteRule ^/(.*) http://hoge.unicast.ne.jp/$1 [R=301,L]
</VirtualHost>
```

## 2. wwwありに統一

```httpd.conf
<VirtualHost *:80>
    ...

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^hoge\.unicast\.ne\.jp$
    RewriteRule ^/(.*) http://www.hoge.unicast.ne.jp/$1 [R=301,L]
</VirtualHost>
```

# 参考URL

- [名前ベースのバーチャルホスト - Apache HTTP サーバ バージョン 2.2](http://httpd.apache.org/docs/2.2/ja/vhosts/name-based.html)
- [さくらVPSでwwwありドメインを設定＆wwwなしにリダイレクト](http://plusblog.jp/6437/)
- [301リダイレクトを使った「WWWあり」と「WWWなし」の統一 | 海外SEO情報ブログ](https://www.suzukikenichi.com/blog/integrating-www-and-non-www-by-301-redirect/)
Swift の ?? ってなんだっけ


Xcode6.3 beta2 のリリースノートを見たら、こんなことができるようになるみたいでした。

```Swift
var allowEmpty = true
var items:[Int]? = [ 0, 1, 2 ]
var emptyItems:[Int]? = [Int]()
if allowEmpty || items?.count ?? 0 > 0 {
    println("do this")
}
if allowEmpty || emptyItems?.count ?? 0 > 0 {
    println("do this") // not executed
}
```

~~?? は三項演算子を簡単に書けるようにしたような感じ。~~
?? は変数がnilかどうかの分岐を簡単に書けるようにしたような感じ。
```(a != nil) ? a! : b``` を ```a ?? b``` で書ける。

Swift本の Nil Coalescing Operator という項で説明されていますね。

この場合これでもいけます。

```Swift
var allowEmpty = true
var items:[Int]? = [ 0, 1, 2 ]
var emptyItems:[Int]? = [Int]()
if allowEmpty, let i = items where i.count > 0 {
    println("do this")
}
if allowEmpty, let i = emptyItems where i.count > 0 {
    println("do this") // not executed
}

```
jolokiaを使うときはj4pshが便利問題

# なにがいいの

jolokiaでJMXのメトリクス取りたい
でも、何をどうやって取るんだ？さっくと知りたい
そんな時に使える、と思う


# 一旦使える所まで

```bash
$ sudo yum -y groupinstall 'Development tools' 
$ sudo yum -y install cpan libyaml-devel expat-devel libxml2-devel
$ sudo yum -y install gcc gcc-c++ glibc-devel.x86_64 
$ perl -MCPAN -e shell
cpan[1]> o conf prerequisites_policy follow
cpan[2]> o conf commit
cpan[3]> upgrade
cpan[4]> YAML
cpan[4]> install JMX::Jmx4Perl
jmx4perl
========

jmx4perl is a command line utility for accessing Jolokia agents
(www.jolokia.org). It can be used for script based exploration 
and easy inspection of the JMX space.

Install 'jmx4perl' ? (y/n) [y ]y
j4psh
=====

j4psh is an interactive JMX shell with context sensitive command line
completion. It uses JMX::Jmx4Perl for connecting to the JMX backend
and has quite some Perl module dependencies.

Install 'j4psh' ? (y/n) [y ]

# それ以外はいらんし全部noにした
```

# 使う

```bash
$ j4psh http://localhost:8778/jolokia/
[localhost:8778] : help
                  cd -- Enter a domain
             connect -- Connect to a server by its URL or symbolic name
               error -- Show last error (if any)
                help -- Print online help
             history -- Command History
                  ls -- List MBean Domains
                quit -- Quit
             servers -- Show all configured servers
[localhost:8778] : cd java.lang
[localhost:8778 java.lang] : ls
java.lang:
    name=Code Cache,type=MemoryPool
    name=CodeCacheManager,type=MemoryManager
    name=Compressed Class Space,type=MemoryPool
    name=Metaspace Manager,type=MemoryManager
    name=Metaspace,type=MemoryPool
    name=PS Eden Space,type=MemoryPool
    name=PS MarkSweep,type=GarbageCollector
    name=PS Old Gen,type=MemoryPool
    name=PS Scavenge,type=GarbageCollector
    name=PS Survivor Space,type=MemoryPool
    type=ClassLoading
    type=Compilation
    type=Memory
    type=OperatingSystem
    type=Runtime
    type=Threading

[localhost:8778 java.lang] : cd type=Memory
[localhost:8778 java.lang:type=Memory] : ls
[localhost:8778 java.lang:type=Memory] : cat NonHeapMemoryUsage
    {
      committed => 56852480,
      init => 2555904,
      max => -1,
      used => 55591880
    }

```

はー便利

色ついてるしなんかオシャレ
![スクリーンショット 2015-02-25 11.13.35.png](https://qiita-image-store.s3.amazonaws.com/0/41727/5ce4741e-dd71-068d-cd3d-2e399cccf594.png)

参考：http://www.jolokia.org/tutorial.html

おしまい
linux > 大文字小文字関係なく検索 > find . -iname hoge.txt

ファイル検索したいのだが、hoge.txtだったかhoGe.txtだったかHoge.txtだったか覚えていない場合。


    find . -iname hoge.txt

でcase insensitive(大文字、小文字の区別なく)での検索ができる。
Rails4 erbでdata-toggleとかdata-roleとかclassとかをlink_toに記載する方法

```html
<a href="#myModal" data-role="tab" data-toggle="modal">
  ほげほげ
</a>
```

↓↓↓

```erb
<%= link_to "#myModal", :data => {:toggle=>"modal", :role => "tab"},
:class=>"btn" do %>
  ほげほげ
<% end %>
```
Gameテンプレートを使用せず、横向きゲームアプリを作成する

## アプリの準備
- Single View Applicationで新規Projectを作成する
- ViewControllerを修正する

```swift:ViewController.swift
import UIKit
import SpriteKit

class ViewController: UIViewController {
    override func viewWillAppear(animated: Bool){
        let skView = self.view as SKView
        let scene = GameScene(size: skView.bounds.size)
        
        skView.presentScene(scene)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let skView = self.view as SKView
        skView.showsFPS = true
        skView.showsNodeCount = true
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
} 
```

- GameScene作成

```swift:GameScene.swift
import SpriteKit

class GameScene: SKScene{
    
}
```

- storyboardのインスペクタからSKViewクラスに設定する
- 実行して、FPSとノード数が表示されていることを確認する

![iphone.png](https://qiita-image-store.s3.amazonaws.com/0/70446/cdf723a6-1c25-8e24-e3a8-eb69b7404eb0.png)


## 横向き対応
- 設定を横向きにする（Portraitのチェックを外す）
![portrait.png](https://qiita-image-store.s3.amazonaws.com/0/70446/f1c23d51-7ff5-a5e9-d138-dd1dabc363e7.png)
- 上記設定を変更するだけでは、縦向きの状態でシーンが生成されてしまっているため、viewDidLoadからviewWillLayoutSubviewsに修正する

```swift:ViewController.swift
import UIKit
import SpriteKit

class ViewController: UIViewController {
    var viewInitiated: Bool = false
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillLayoutSubviews() {
        if(!viewInitiated){
            super.viewWillLayoutSubviews()
            let skView = self.view as SKView
            skView.showsFPS = true
            skView.showsNodeCount = true
            let scene = GameScene(size: skView.bounds.size)

            skView.presentScene(scene)
            self.viewInitiated = true
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }
}
```

![iphone_yoko.png](https://qiita-image-store.s3.amazonaws.com/0/70446/94b51945-1112-b31a-3e9e-1f14f93f9be6.png)


## 参考
- [SingleViewControllerにSpriteKitを組み込んで、タッチイベントや物理演算を実装してみた](http://qiita.com/soymsk/items/17ea8c6dc7349a81873b)
- [【Xcode5】Xcodeの使い方 SpriteKit 編 Vol6 〜 横画面表示について〜](http://blog.oneworld-inc.com/entry/2014/01/03/023701)
- [メモリ管理・レイアウトの観点からみた UIViewController の view の扱い](http://blog.jarinosuke.com/entry/uiviewcontroller_view_coding_pattern)
SLF4Jでjava.lang.NoSuchMethodError


ハマった時のメモです.

# Story

JavaでロギングにSLF4J + Logbackを使って開発をしていたが、ある日突然、以下のErrorが出てテストが通らなくなった

```
java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder;
```

Errorが出始めたのは、mavenのpom.xmlにmaven-javadoc-pluginを新しく追加した時だった.

# 原因

原因は、maven-javadoc-pluginが依存している以下のSLF4Jとロギング実装へのバインディングが、Logback (SLF4Jバインディングを標準で含む) とConflictしてしまった事だった...

* org.slf4j:slf4j-jdk14
* org.slf4j:slf4j-nop

どれか一つのみが、Classpathに含まれる...という状態にしないと、実行時にSLF4Jがどの実装を使えばいよいか、判断できない.

# 環境

* Java8
* maven3
* NetBeans
* Mac OS 10.10.1

# 依存関係を調べる

``` mvn dependency:tree ``` を使って、Projectと.jarの依存関係を調べる事が出来る.

```
$ mvn dependency:tree -Dverbose

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] -------------------------------------------------
[INFO] Building Foo-Bar-Project 1.0-SNAPSHOT
[INFO] -------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.10:tree (default-cli) @ Foo-Bar-Project ---
[WARNING] Using Maven 2 dependency tree to get verbose output, which may be inconsistent with actual Maven 3 resolution
[INFO] com.foo.bar:Foo-Bar-Project:war:1.0-SNAPSHOT
[INFO] +- javax:javaee-web-api:jar:7.0:provided
...
[INFO] |  +- org.apache.maven.plugins:maven-javadoc-plugin:jar:2.10.1:compile
...
[INFO] |  |  |  |  +- org.slf4j:slf4j-nop:jar:1.5.3:runtime
...
[INFO] |  |  |  +- org.slf4j:slf4j-jdk14:jar:1.5.6:runtime
...

```

``` mvn dependency:tree ``` を使うには、たぶんpom.xmlに以下の記述が必要.

```
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.10</version>
        </plugin>
    </plugins>
</build>
```

# 余計なSLF4実装を取り除く

maven-dependency-pluginが以下の2つの.jarを取り込んでしまう事が分かったので、これらを依存から外したい.

* org.slf4j:slf4j-jdk14
* org.slf4j:slf4j-nop

pom.xmlにこう書く.

```
<dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.10.1</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
        </exclusion>
    </exclusions>
</dependency>
```

> .jar毎にいちいち書かないといけないらしい...

# お世話になったサイト

こちらのサイトのおかげで解決できました。ありがとうございます！

* [javaのロガーが多すぎて訳が解らないので整理してみました](http://treeapps.hatenablog.com/entry/2012/10/20/java%E3%81%AE%E3%83%AD%E3%82%AC%E3%83%BC%E3%81%8C%E5%A4%9A%E3%81%99%E3%81%8E%E3%81%A6%E8%A8%B3%E3%81%8C%E8%A7%A3%E3%82%89%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E6%95%B4%E7%90%86%E3%81%97%E3%81%A6)