OmniAICreator/Qiita-1.07M huggingface dataset:
[JavaScript] String#contains で正規表現マッチができればいいのに

### `RegExp#test` はあるけど、文字列レシーバで単純正規表現テストしたいなー

え？ `String#search` があるって？ Boolean 返してくれよ

ということで `String#contains` に上書き実装

```js
(function(){
  let _contains = String.prototype.contains;
  Object.defineProperty(String.prototype, 'contains', {
    enumerable: false,
    configurable: true,
    writable: true,
    value: function contains(...args){
      let [searchString, position] = args;
      if(searchString != undefined && searchString.constructor === RegExp){
        return searchString.test(this.slice(position));
      }else{
        return _contains.call(this, ...args);
      }
    },
  });
})();
```

```js:example
'foo'.contains('o'); //=> true
'foo'.contains(/o/); //=> true
```
Python ファイル処理

###ファイルを開く

open()関数
`open(ファイル名[, モード[, エンコード[, エラー処理]]])`

###ファイルを閉じる

close()関数
`F.close`

###ファイルを読み込む

read()関数
`F.read([整数のサイズ])`
整数のサイズがオプションとして指定されていると、サイズ分だけ読み込みを行います。

readline()関数
`F.readline([整数のサイズ])`
ファイルから1行を読み込み、文字列として返します。

readlines()関数
`F.readlines([整数のサイズ])`
ファイルから複数行を読み込みます。

**ファイルから1行ずつ読み込んで処理をする**
```
f = open("test.txt", 'r', encoding='utf-8')
for line in f:
    print(line, end= " ")
```
他にreadlines()メソッドを使う方法もありますが、大きなファイルを扱う場合などに問題が発生することがあります。特別な理由がない限り、ファイルオブジェクトをそのままfor文に添えたほうがよいでしょう。

###ファイルに書き出す

write()関数
`F.write(文字列)`
**モードを指定してファイルを開き、書き出す**
```f = open("newfile.txt", "w", encodint="UTF-8") ← ファイルをモードwで開く
f.write(s) ← 変数sの文字列をファイルに書き出す
f.close ← ファイルを閉じる
```
TwitterのTweetボタンのURLを動的に変える


SPA(シングルページアプリケーション)なんかだと、hash bang(#!)を使ってページを変えるパターンがある。
そのとき、TwitterのTweetボタンのURLにhash bangを含めたい。
つまり、動的に変えたい。
それが結構たいへんだった。
答えは以下のURLのとおり。

http://stackoverflow.com/questions/9215806/how-to-update-the-twitter-share-button-url-with-dynamic-content

# コードの説明

htmlに次のように、テンプレートと空の領域を用意しておく。
テンプレートのclassは`twitter-share-button`以外にし、`display:none;`で非表示にする。

```html
<a href="https://twitter.com/share" class="twitter-share-button-template" data-url="http://dummy.com" data-hashtags="hashtag" style="display:none;">Tweet</a>
<div id="tweet-area"></div>
```

1. 前につくったTweetボタンを削除
2. テンプレートをclone
3. cloneしたものから`display:none;`を外して表示
4. `data-url`を新しいURLにする（この例では今のURLにしている）
5. `twitter-share-button`にする
6. 空の領域に作ったTweetボタンを配置
7. scriptを読み込み、Tweetボタンを設定する

```js
function setTweet(){
	// remove any previous clone
	$('#tweet-area').empty()

	// create a clone of the twitter share button template
	var clone = $('.twitter-share-button-template').clone()

	// fix up our clone
	clone.removeAttr('style'); // unhide the clone
	clone.attr('data-url', location.href);
	clone.attr('class', 'twitter-share-button'); 

	// copy cloned button into div that we can clear later
	$('#tweet-area').append(clone);

	// reload twitter scripts to force them to run, converting a to iframe
	$.getScript('http://platform.twitter.com/widgets.js');
}
```

# 原理

うーん、よくわからなかった。
上記サイトで。。。
CIrcleCI で Go のプロジェクトを gox でビルドして GitHub にリリースする

# なぜこんな事を？
Windows のパッケージマネージャ Chocolatey 向けにパッケージを作ったりしてるわけなんですが、パッケージは一度作ったらバージョン番号を変えるだけの定型作業になります。これが面倒なので golang で定型作業をやってくれるツールを作りました。
Windows 向けのツールですが、 x86/x64 向けにビルドする必要があるので、 gox を使おうとしたわけです。ところが Windows では gox を使えるようにするのも一筋縄ではいきません。 Vagrant 等で linux 環境を整えれば簡単ですが、 Windows 向けツールをビルドするためにそれはあまりにアホらしい。そこで CI ツールで楽にできないか検討してみました。

# 参考URL
- [Wercker で Go のプロジェクトをクロスコンパイルし、GitHub にリリースする - 詩と創作・思索のひろば](http://motemen.hatenablog.com/entry/2014/06/27/xcompile-go-and-release-to-github-with-wercker)
- [シェルスクリプトでGo言語のツールをクロスコンパイルしてGithubにリリースする | SOTA](http://deeeet.com/writing/2014/07/23/github-release/)
- [高速に自作パッケージをGithubにリリースするghrというツールをつくった | SOTA](http://deeeet.com/writing/2014/07/29/ghr/)
- [tcnksm/ghr](https://github.com/tcnksm/ghr)
- [mitchellh/gox](https://github.com/mitchellh/gox)

# 事前準備
GitHub と CircleCI にアカウントを作りましょう。

## GitHub 設定
API 経由で GitHub にリリースするために [Authorized applications](https://github.com/settings/applications)
 で GitHub TOKEN を生成しておきます。
![Authorized applications.png](https://qiita-image-store.s3.amazonaws.com/0/13046/a0615779-59ce-4118-06e2-15df390fea8e.png)


## CircleCI 設定
まず目的の GitHub リポジトリを監視するように設定します。
次に CircleCI で ```Project settings``` -> ```Environment variables``` を開きます。以下のように環境変数を２つ定義します。

- GITHUB_TOKEN
  上記のように GitHub で取得したトークンです。
  ![circle01.png](https://qiita-image-store.s3.amazonaws.com/0/13046/3512ca3f-1ec4-2a7a-e3ff-53e781142d19.png)


- USERNAME
  GitHub のユーザー名です。
  ![circle02.png](https://qiita-image-store.s3.amazonaws.com/0/13046/63a704a2-f7ac-1cc0-c81d-d0912236bf12.png)


# リポジトリに追加するファイル

## release_tag
GitHub にリリースするときは [tcnksm/ghr](https://github.com/tcnksm/ghr) を使います。
CircleCI では１行毎にシェルを起動するため、環境変数を持ち回ることができません。
ghr ではリリースするタグを指定しなければなりませんが、これを動的に指定できるようにするため、ファイルに記述しておきます。
ここでは ```release_tag``` に指定し、リポジトリに追加しておきます。今後リリースするバージョンを変更したい場合はこのファイルを変更します。

```txt:release_tag
v1.0
```

## circle.yml
次に CircleCI の設定ファイルを追加します。 
この設定ファイルでは、 gox でビルドするときに ```--output "dist/{{.Dir}}_{{.OS}}_{{.Arch}}"``` と指定して、 ```dist``` 以下に配置されるようにしてあります。
そして ghr でタグを指定して ```dist``` 以下のファイルを GitHub にリリースします。

```yaml:circle.yml
machine:
  timezone:
    Asia/Tokyo
deployment:
  release:
    branch: master
    commands:
      - go get github.com/mitchellh/gox
      - go get github.com/tcnksm/ghr
      - gox --osarch "windows/386 windows/amd64" --output "dist/{{.Dir}}_{{.OS}}_{{.Arch}}"
      - ghr -t $GITHUB_TOKEN -u $USERNAME -r $CIRCLE_PROJECT_REPONAME --replace `cat release_tag` dist/
```

これで master ブランチにコミットされる度に、ビルドしたバイナリが GitHub にリリースされます。
[GitHub 時代のデプロイ戦略 - naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20140502/1399027655) のように Pull Request を作ってリリースするようにしてもよいでしょう。

# ビルドステータス表示
せっかく CircleCI でビルドしているので、ステータスを GitHub の README に表示しておきます。

ユーザー名とリポジトリ名をそれぞれに応じて変えておきましょう。

![toruuetani Cacao.png](https://qiita-image-store.s3.amazonaws.com/0/13046/b53f263b-93b4-b0b5-4df1-8ffc9e27da15.png)


```md:README.md
[![Circle CI](https://circleci.com/gh/:user/:repo/tree/master.svg?style=shield)](https://circleci.com/gh/:user/:repo/tree/master)

```
Underscore.jsの代表的なメソッドをメモメモ

## Underscore.jsの代表的なメソッド

関数型プログラミングを学ぶにあたって、どうやらUnderscore.jsを知っておいた方がいいとのことなので代表的なメソッドとその動きをメモメモ


### _.map
```javascript

        var nums = [1,2,3,4,5];
        function doubleAll(array){
            return _.map(array,function(n){
            return n* 2
            });
        }
        doubleAll(nums)
        // [2, 4, 6, 8, 10]

```
### _.reduce
        function average(array){
         var sum = _.reduce(array,function(a,b){return a + b});
         return sum / _.size(array);//_.size(list)はlistの要素の数を返す
        };
        average(nums);
        // 3

### _.filter
```js

        function onlyEven(array){
            return _.filter(array, function(n){
            return (n % 2) === 0;
            });
        }
        onlyEven(nums);
        // [2, 4]
```
### _.find
 
```js
        _.find(['a','b','3','d'], _.isNumber);
        //コレクションとプレディケートを引数にとり、プレディケート関数がtrueを返す最初の値を返す
        //3


```
参照　OREILLY ｢関数型プログラミング｣
browserify - jqueryと依存するプラグインをどうにかしたい

[こないだこういう記事書いたんですが、](http://qiita.com/tkdn/items/a29db5b0f30e28018952)まったくなってない、完全に間違ってたので見直しました。

## window.$ に exports するための browserify-shim

完全に勘違っていたんですが、browserify-shim は`require('hoge')`するためにシンボリックリンクを張るためのものじゃなかった。

なんというか、グローバルに外出し exports できるもんと認識しなおした。

package.json の`dependencies`, `devDependencies`に書いてあるものであれば、まったく問題なくrequireできる。

```js:hoge.js
var $ = require('jquery'); // もしnpmで入れてれば特にbrowserify系の記述は必要ない
```

生のjquery使うんならこれだけでいいっぽいけど、ただjqueryプラグイン使うなら結局exportsしないと使えなさそう。そこでbrowserify-shim。

```js:package.json
{
  "browserify": {
    "transform": [
      "browserify-shim",
    ]
  },
  "browserify-shim": {
    "jquery": "$"
  }
}
```

jqueryの$をグローバルオブジェクトととして使えるようexportsしてよ、とpackage.json内にbrowserify用に記載しておけば、

```js:hoge.js
require('jquery'); // var $ = require('jquery'); しなくてもexportされる
```

これで自由にjquery使える。ブラウザでアクセス、コンソールにjquery構文打ってデバッグも出来る。（ちなみに最初のほうだと、`$('p')` みたいなセレクタまではおっかけられるけど、`$('p').addClass('hoge')`みたいなのはコンソール上でできない。exportsしてないから当然なんだけど、なんとなく分かるような分からないような。）

## jQueryプラグインどうしよう問題

上のから引き続き、

```js:hoge.js
require('jquery');
require('jquery.plugin01');
require('jquery.plugin02');
```

みたいなことがしたかったら、npmでjqueryプラグインも入れてしまおう。package.jsonの`dependencies`, `devDependencies` に入っている名称がrequireできる。もうこの際bowerとかやめてnpm一本でいいじゃねーか。

## カスタムしたjqueryのシンボリックをpackage.jsonで定義

して、`require('jquery');`もやりたい。
ajax省いたり、animation省いたりしてカスタムビルドしたjqueryを使いたい（npmで入れるとそれらを可能にするGruntfile.jsとかなしで落ちてくるのはなんでか気になってるんだけど [※jqueryカスタムビルド参考](http://qiita.com/setzz/items/ed7ce8a443d5245f41a1)）、そんなとき`node_modules`にもpackage.json にもjqueryなんかなくても、シンボリックをはることが出来る。

```js:package.jspn
  "browser": {
    "jquery": "./vendor/jquery/dist/jquery.js" //カスタムjqueryを置いたとこ
  }
```

この時、package.jsonにjqueryがあったとしてもこちらが優先される様子。

## AMD commonJS とかに対応してる jQueryプラグイン

[この辺](https://github.com/carhartl/jquery-cookie/blob/master/src/jquery.cookie.js#L8-L19)見てもらうと分かるんですが、こういった記載があると依存関係解決しようとしてプラグイン側で定義したjqueryもさらにbundleされたりするので、この辺のところもう少し調べておこうと思った。

----

[少しgithubにもまとめた。](https://github.com/tkdn/browserify-demo)本日は以上です。
お名前.com で取ったドメインを使う

# お名前.com で取ったドメインを使う

ググればさんざん出てくるノウハウですが、作業メモとして。

## 前提
* お名前.com でドメインを取った
* そのドメインでさくらVPSのサーバーにアクセスできるようにしたい

## 手順
### お名前.com の設定画面を開く
* [ドメインNavi](https://www.onamae.com/domain/navi/domain) にアクセス。
* 「ドメイン設定」をクリック。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/66421/919ef828-26d5-f134-9c39-bb62168f6047.png)

* 「DNS関連機能の設定」をクリック。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/66421/f533bcc9-2f07-5e84-9f12-1b41ae9924dd.png)

* 設定するドメインを選択して「次へ進む」をクリック。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/66421/f203e56d-cafb-aad4-9da5-03cd50a2509f.png)

* 少し下がって「DNSレコード設定を利用する」欄の「設定する」をクリック。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/66421/21e2c6b3-dca3-bdaa-6f1f-4b3a21a5e073.png)

### 設定する

* ホスト名: 使用したいサブドメイン or 空欄
* TYPE:
    * A: サブドメインの付かない URL (ネイキッドドメイン) をIPアドレスに紐付ける
    * CNAME: サブドメイン付きの URL を別の URL に紐付ける 
        * ネイキッドドメインを CNAME に使うと色々不具合が出る！
        * Heroku アプリのIPアドレスに直接向けた A レコードを作ることは許可されていない！
* VALUE: 紐付けるIPアドレス or URL
* ほか: いじらない
* 入力したら「追加」をクリック

![5.png](https://qiita-image-store.s3.amazonaws.com/0/66421/34a18235-eac0-3a23-486f-ba5ba01a2f0d.png)

* 1番下の「DNSレコード設定用ネームサーバー変更確認」はチェックを入れる
* 「確認画面へ進む」をクリックしてあとは道なりに

![6.png](https://qiita-image-store.s3.amazonaws.com/0/66421/a08f5514-0899-562d-7af1-8a2cc97d42d7.png)

### 登録完了

* 完了するとさっきの設定画面にこんなんが追加される

![7.png](https://qiita-image-store.s3.amazonaws.com/0/66421/9d47a0ff-bed1-f5fe-ba20-830a0ae4b90d.png)

* 一瞬で反映された
* さくらVPS側では特に何もする必要なし
    * もちろんWebサーバー側でバーチャルホストの設定などはする必要あり
    * なにかする必要があるものもあるらしい
        * 例: [Heroku](https://devcenter.heroku.com/articles/custom-domains)

## 参考サイト
* http://blog.jnito.com/entry/2013/04/17/082858

## 追伸
Skitch 有能
JavaからAkkaを使う


みなさん、Akka使ってますか。AkkaはActorモデルを使った並行処理を簡単に書くためのScalaのライブラリです。
でも私はScalaがあまり好きではないので、Javaから使っています。
AkkaはJava用のインターフェイスとドキュメントもしっかり揃っており、使い勝手はかなり異なりますが、Javaでもほぼ全ての機能を使うことができます。

## 準備

AkkaのドキュメントGetting startedに則って、SBTを使って必要なライブラリを集めます。SBTのインストール方法や使い方はここでは説明しません。
(http://doc.akka.io/docs/akka/snapshot/intro/getting-started.html)

```build.sbt
name := "akka"

version := "1.0"

scalaVersion := "2.11.5"

resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies ++=
  Seq("com.typesafe.akka" % "akka-actor_2.11" % "2.3.9")
```

## Actorの実装


```EchoActor.java
public class EchoActor extends UntypedActor {
    public EchoActor() {
        System.out.println("constructor");
    }

    @Override
    public void onReceive(Object message) throws Exception {
        if (message instanceof String) {
            System.out.println("Got message. " + message);
            getSender().tell(message, getSender());
        } else {
            System.out.println("Got unknown type message.");
            unhandled(message);
        }
    }
}

```

まずActorを作ります。akka.actorパッケージのUntypedActorというクラスを継承して、onReceiveというメソッドを実装します。
"Untyped"はOnReceiveメソッドで受け取れるメッセージの型はなんでも良い（Object）であることを示しています。
onReceiveメソッドは、メッセージ（Object）を別のActor等から受け取った時に呼ばれるコールバックメソッドです。
メッセージを受け取っていない時は、特に何もしません。

onReceiveはどんな型のメッセージでも受け取れてしまうため、メッセージの型や中身を見て処理を分岐してあげる必要があります。
Javaにはパターンマッチがないため、このあたりの処理がやや煩雑になりがちです・・・。


```Main.java
public class Main {

    public static void main(String[] args) {
        ActorSystem system = ActorSystem.create("EchoSystem");
        ActorRef echoActorRef = system.actorOf(Props.create(EchoActor.class), "EchoActor");
        echoActorRef.tell("Hello world", ActorRef.noSender());
        system.stop(echoActorRef);
        system.shutdown();
    }
}
```

次に、EchoActorの実体を生成して、Actorにメッセージを送る部分を実装します。今回は安易にmainに実装しました。

ActorSystemは、Actorを管理するためのオブジェクトです。どんなActorもどこかのActorSystemに所属することになります。
ActorSystemは、到来したメッセージを振り分けたり、Actorを動かすためのスレッドプールの管理等をやっているようです。


ActorSystemを生成したあとは、ActorSystemのメソッドであるactorOfを経由してEchoActorの実体を生成し、その参照であるActorRefを得ます。
ActorRef自身はActorの実体を持っておらず、Actorへのアドレスだけを持っています。なぜ参照なのかは色々と事情があります。（今回は説明しません）

3行目で、tellメソッドを使ってEchoActorへメッセージを送信します。tellメソッドは非同期に実行されます。今回はメッセージを送った結果を確認する方法を実装していないので、EchoActorに何が起こったかをmainメソッドの中では知ることはできません。

4,5行目は、Actorの停止とActorSystemの停止処理です。
stopメソッドはActorがメッセージを処理している最中の場合には、それが終わるまで待ってから停止を試みます。（ちゃんとした理由がありますが、今回は説明しません）
また、ActorSystemの停止をするshutdownメソッドはSystemに所属している全てのActorがメッセージを処理し終わるまで待ってから停止を試みます。
seleniumでUnable to connect to host 127.0.0.1 on port 7055エラー

seleniumでFirefoxDriverの実行時に下記エラーが起こりました。

`Unable to connect to host 127.0.0.1 on port 7055`

環境は以下。

windows8
eclipse　Kepler Service Release 2
Maven
Firefox 33.1
selenium 2.44.0

**対応１**
上記のエラーを検索し一番多くヒットした解決方法が、**Firefoxとseleniumのバージョンを最新にする**というもの。
そこでFirefoxを36に、seleniumを2.45.0にバージョンアップ。
しかし解決せず。

**対応２**
次に見つけたのが**C:\Users以下のホームディレクトリが全角の名前になっているため**というもの。
結果的にはこれが原因でした。
ホームディレクトリ名は変えられないため、別アカウントを作って対応しました。
***参考***
https://groups.google.com/forum/#!topic/seleniumjp/WnG-re-G2WA
Vimでダミーデータ作成

CSV形式の大量のダミーデータが必要なとき、Vimのマクロなど使い作成してみます。

```html
ID,name
1,選手1
2,選手2
・
・
・
```

例えば上記みたいな大量のデータが必要な場合は

* コマンドモードでカーソルを3行目(IDが2から始まる行)のところに合わせる
* コマンドモードでqaでマクロの記録開始
* yyで行ヤンク
* pでペースト

```html
ID,name
1,選手1
2,選手2
2,選手2
・
・
・
```

* 4行目のID2のところにカーソルを置き、コマンドモードでCtrl + a
* 4行目の選手2のところにカーソルを置き、コマンドモードでCtrl + a

```html
ID,name
1,選手1
2,選手2
3,選手3
・
・
・
```

* qでマクロ終了

これでマクロaに操作手順が格納されました。あとはそれを何回も繰り返すだけです。
ここでは3回繰り返してみます。

* コマンドモードで3@a

```html
ID,name
1,選手1
2,選手2
3,選手3
4,選手4
5,選手5
6,選手6
```

多分、GOLFとがVim戦闘力が高い人はもっと効率的な方法を思いつくはずです。。。
【JavaScript】複雑なif else文を省略して書く

JavaScriptのif else文は、```(条件)?真の処理:偽の処理;```と省略して書くことができます。しかし、いくつか検索してみてもシンプルなif文のコードしか紹介されていませんでした。そこで、シンプルなif文に加えて、複雑なif文の省略方法を紹介します。

##シンプルなif else文

```javascript
var m = 20;
    if(m < 10){
   document.write("mは10より小さい");
} else {
    document.write("mは10より大きい");
}
```

###シンプルなif else 文の省略

```javascript
var m = 20;
    (m < 10)?document.write("mは10より小さい"):document.write("mは10より大きい");
```

##複雑なif else文

```js
var m = 20;
    if(m == 5){
   document.write("mは5です。");
} else if(m == 10){
    document.write("mは10です");
} else if(m == 15){
    document.write("mは15です");
} else {
    document.write("mは、5、10、15のどれでもありません。");
}
```

###複雑なif else文の省略

```js
var m = 20;
    (m == 5)?document.write("mは5です。"):(m == 10)?document.write("mは10です"):
    (m == 15)?document.write("mは15です"):document.write("mは、5、10、15のどれでもありません。");
```

このように、基本形の```(条件)?真の処理:偽の処理;```を応用して、```(条件)?真の処理:（次の条件）?真の処理:偽の処理;```と書いていくことで、複雑なif文も省略することができます。


参考サイト
[[Javascript]if構文の省略形について](http://codaholic.org/?p=585)
redmine:load_default_dataの言語指定


Redmineの初期設定のロード用のRakeTask`redmine:load_default_data`に言語選択がありますが、環境変数`REDMINE_LANG`で指定することが出来ます。
Ansibleなどで実行する場合に有効です。

# 指定しない場合

```
$ bundle exec rake redmine:load_default_data RAILS_ENV=production

Select language: ar, az, bg, bs, ca, cs, da, de, el, en, en-GB, es, et, eu, fa, fi, fr, gl, he, hr, hu, id, it, ja, ko, lt, lv, mk, mn, nl, no, pl, pt, pt-BR, ro, ru, sk, sl, sq, sr, sr-YU, sv, th, tr, uk, vi, zh, zh-TW [en] ja
====================================
Default configuration data loaded.
```

# 指定する場合
```
$ bundle exec rake redmine:load_default_data RAILS_ENV=production REDMINE_LANG=ja
Default configuration data loaded.
```

# 参考
```lib/tasks/load_default_data.rake 
desc 'Load Redmine default configuration data. Language is chosen interactively or by setting REDMINE_LANG environment variable.'
```
AndroidでBitmapを画像のバイトサイズを指定してリサイズする

画像の縦横のサイズを指定したリサイズは結構見つかったのですが、画像のバイトサイズを指定してリサイズする方法があまりないようなので紹介します。

バイトサイズに応じて縦横のスケールを変更してリサイズします。
下記のような実装になります。

```java
public static Bitmap resizeImage(Bitmap img, float toSize) {
    int size = img.getByteCount(); // Android 3.1以降でしか使用できない。getRowBytes() * getHeight() と同じ
    float scale = (float)Math.sqrt(toSize / (float)size);

    Matrix matrix = new Matrix();
    matrix.postScale(scale, scale);

    return Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true);
}
```

例えば、100バイトの画像を、25バイトにリサイズしたい場合(1/4にリサイズ)は、縦横の長さをそれぞれ半分にしています。
さくらのレンタルサーバーでRocketeerを使う

##概要
PHPのデプロイツールであるRocketeerを使ってさくらのレンタルサーバーにデプロイする流れです。VPSやAWSなど贅沢な環境が使えずレンサバしかないけど、FTPとかあれだしなーって時に。
同じデプロイツールだとCapistranoがありますが、Rubyをごにょごにょするには敷居が高い場合もありますよね。でもPHPなら！ってことで 　[Rocketeer](http://rocketeer.autopergamene.eu/) 　です。

ここでは、さくらのレンタルサーバーにデプロイすることを想定します。

##必要なもの
* さくらのレンタルサーバー（スタンダード以上）
* GitHubかBitbucketのリポジトリ
* SSHの知識
* PHPの知識
* Rocketeerの最低限の知識

###手順1.ローカルPCでの作業
普通のRocketeer設定と同じです。 
参考になるサイトが他にあるので、そちらを。

http://maplesystems.co.jp/blog/all/programming/8037.html
http://madroom-project.blogspot.jp/2013/12/fac20131221.html
http://qiita.com/ken_hikita/items/87780d953ac9445d160f
http://maplesystems.co.jp/blog/all/programming/8037.html


　  
###手順2.デプロイ先サーバーでの作業 [Git]

1 SSHでサーバーに入ります。
2 Gitをインストールします。

```
$ cd ~/
$ mkdir ./src
$ mkdir ./src/git
$ cd ./src/git
```

3 Gitをダウンロード、インストールします

```
$ wget https://github.com/git/git/archive/master.zip --no-check-certificate
$ unzip master.zip
$ cd git-master
$ autoconf
$ ./configure --enable-pthreads=-pthread --prefix=$HOME/git
$ gmake all install
```

4 確認。もしうまくいかない場合は、パスを通します。

```
$ git -version
```
　  

###手順3.デプロイ先サーバーでの作業 [composer]
1 composerをインストール

```
$ cd ~/src/
$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar
$ mv composer.phar ~/bin/composer
```

2 確認。

```
$ composer -version
```

###手順4.ローカルPCでデプロイ
まずはチェックします。

```$ ./Vendor/bin/rocketeer check```

もんだいなければデプロイ！

```$ ./Vendor/bin/rocketeer deploy```

###手順5.シンボリックリンクを貼る
デプロイ先はパブリックスペースの上にデプロイすることです。
シンボリックリンクを貼ることでアクセスするようにします。

``` 例　$ /home/アカウント/プロジェクト/ /home/アカウント/www/プロジェクトリンク名```
　

###ハマりポイント
* composerのバージョンが古いと、FreeBSDとかはうまくいかないかもしれません。
* サーバーのパーミッションによってはうまく入らないかもしれません。remote.phpでパーミッションを指定してあげます。


###参考にさせて頂いたURL
http://maplesystems.co.jp/blog/all/programming/8037.html
http://madroom-project.blogspot.jp/2013/12/fac20131221.html
http://qiita.com/ken_hikita/items/87780d953ac9445d160f
Rのパッケージのヘルプを日本語で書く

Rパッケージの作成方法は以下を参照してください。
[東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法](http://www.slideshare.net/teramonagi/r-38511360)

Macではencodingの指定をするだけで問題なく日本語が使えるが、Windowsでは問題があるのでメモ。

1. 今のところWindows環境では roxygen2 (4.1.0) を使って日本語ヘルプ（*.Rd）は生成できないようだ。Windowsで日本語ヘルプを利用するには自分で *.Rd を書く必要がある。
2. 重要な点は**ヘルプの title には日本語は使わない方が良い**ということ、使えないわけではないが使えない漢字がある。しかし title では使えない漢字も、description　内では使えるという（何故に？）。

encodingの指定は下のようにする。

DESCRIPTIONファイルに以下の文を追加する。
`Encoding: UTF-8`


roxygen2でヘルプを生成する場合は Rのソースコード（R/*.R）に以下の文を追加する。
`#'@encoding UTF-8`


ヘルプの元ファイル(man/*.Rd)に以下の文を追加する。
`\encoding{UTF-8}`

man/*.RdがShift-JISで`\encoding{Shift-JIS}`を指定すると、RのヘルプファイルはUTF-8に変換されるようだ。

#Rstudio利用時の不具合
この設定でビルドすればヘルプが日本語のパッケージが完成する。オリジナルのRではこれで問題は発生しない。しかし、WindowsのRstudioではまだ問題があり解決できていない。「?関数名」などでヘルプを表示させると正常に表示される。RStudioでは、コンソールで関数名の途中まで入力しタブを押すと残りが補完され、さらに、ヘルプの内容がポップアップする。ここでエラーが出る。おそらく問題はWindows版RStudioのコンソールの文字コードがShift-JISになっているためと考えられる。試しに、man/*.RdをSHIFT-JISで作成し、`\encoding{UTF-8}`と記述すると、タブで補完した時にポップアップで日本語が表示されるが、?関数名で表示されるヘルプは文字化けする。コンソールの文字コードを変えるにはロケールを変える必要があるが。Sys.setlocale("LC_ALL", "ja_JP.UTF-8")としてもロケール変更が拒否される。

WindowsではJapanese_Japan.932以外の日本語のロケールの設定が拒否される。どうやらこれはWindowsのCのライブラリがShift-JIS以外に対応していないためのようだ。[参考](http://lets.postgresql.jp/documents/technical/text-processing/2)

Sys.setlocale(locale="C")とすると関数名の補完時のエラーは発生しない。しかし、ポップアップに日本語は表示されない。

932はShift-JISのこと、codepageというらしい。utf-8は65001 [参考](https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd317756%28v=vs.85%29.aspx)
MySQL/データマッチング時に、半角全角とかをいい感じにするストアドファンクション


## 概要

他のDBからデータを移管した際に、移管データが正しく登録されているかチェックする時のメモ。
元データをそのまま移行していれば苦労なくマッチングはできますが、元データをフォーマットなり何なりをしている時に面倒が起きます。

* 元データとインポート先で全角、半角が違う  
全角英語、半角英語、全角数字、半角数字、半角カナ、全角カナなど
* 半角スペース、全角スペースやその位置など
* 全角ハイフン、半角ハイフン、全角ダッシュ、全角記号など

これらをマッチングさせるのはなかなか骨が折れるので、 **差分になりそうな文字を置換するファンクション**を作りました。
ベースは[MySQL 半角カタカナを全角に変換するストアドファンクション](http://makizou.com/2833/)を参考にさせてもらいました。

## 詳細

### ストアドファンクション

```sql:multibyte2cv
CREATE DEFINER = CURRENT_USER FUNCTION `multibyte2cv`(`str` text)
 RETURNS text(0) CHARSET utf8
BEGIN
  -- 全角英語、半角英語
  DECLARE eng_len INT(2);
  DECLARE eng_z VARCHAR(52) DEFAULT 'ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ';
  DECLARE eng_h VARCHAR(52) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

  -- 半角カナ、全角カナ
  DECLARE kana1_len, kana2_len INT(2);
  DECLARE kana1_h VARCHAR(61) DEFAULT 'ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝｯｬｭｮｧｨｩｪｫｰ｡｢｣､･';
  DECLARE kana1_z VARCHAR(61) DEFAULT 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッャュョァィゥェォー。「」、・';
  DECLARE kana2_h VARCHAR(52) DEFAULT 'ｶﾞｷﾞｸﾞｹﾞｺﾞｻﾞｼﾞｽﾞｾﾞｿﾞﾀﾞﾁﾞﾂﾞﾃﾞﾄﾞﾊﾞﾋﾞﾌﾞﾍﾞﾎﾞﾊﾟﾋﾟﾌﾟﾍﾟﾎﾟｳﾞ';
  DECLARE kana2_z VARCHAR(26) DEFAULT 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴ';

  -- 全角数字、半角数字
  DECLARE int_len INT(2);
  DECLARE int_z VARCHAR(10) DEFAULT '１２３４５６７８９０';
  DECLARE int_h VARCHAR(10) DEFAULT '1234567890';

  -- 全角記号、半角記号（お好みで調整）
  DECLARE symbol_len INT (2);
  DECLARE symbol_z VARCHAR(10) DEFAULT 'ー―－，．：；（）＆';
  DECLARE symbol_h VARCHAR(10) DEFAULT '---,.:;()&';

  -- 全角英語から半角英語に変換
  SET eng_len = CHAR_LENGTH(eng_h);
  WHILE eng_len > 0 DO
    SET str = REPLACE(str, SUBSTRING(eng_z,eng_len,1), SUBSTRING(eng_h,eng_len,1));
    SET eng_len = eng_len - 1;
  END WHILE;

  -- 半角カナから全角カナに変換
  SET kana1_len = CHAR_LENGTH(kana1_z);
  SET kana2_len = CHAR_LENGTH(kana2_z);
  WHILE kana2_len > 0 DO
    SET str = REPLACE(str, SUBSTRING(kana2_h,kana2_len*2-1,2), SUBSTRING(kana2_z,kana2_len,1));
    SET kana2_len = kana2_len - 1;
  END WHILE;
  WHILE kana1_len > 0 DO
    SET str = REPLACE(str, SUBSTRING(kana1_h,kana1_len,1), SUBSTRING(kana1_z,kana1_len,1));
    SET kana1_len = kana1_len - 1;
  END WHILE;

  -- 全角数字から半角数字に変換
  SET int_len = CHAR_LENGTH(int_z);
  WHILE int_len > 0 DO
    SET str = REPLACE(str, SUBSTRING(int_z,int_len,1), SUBSTRING(int_h,int_len,1));
    SET int_len = int_len - 1;
  END WHILE;

  -- 全角ハイフン系を半角ハイフンに変換
  SET symbol_len = CHAR_LENGTH(symbol_z);
  WHILE symbol_len > 0 DO
    SET str = REPLACE(str, SUBSTRING(symbol_z,symbol_len,1), SUBSTRING(symbol_h,symbol_len,1));
    SET symbol_len = symbol_len - 1;
  END WHILE;

  -- 半角スペース、全角スペース、改行を削除
  SET str = REPLACE(REPLACE(REPLACE(REPLACE(str, '　', ''), ' ', ''), CHAR(13), ''), CHAR(10), '');

  RETURN str;
END;
```

### やっていること

* 半角カナは全角に変換
* 全角英数は半角に変換
* 全角ハイフン系は全部半角ハイフンに変換
お好みで記号追加で変換
* 半角スペース、全角スペース、改行は削除

### 使い方

ストアドファンクションを登録して、対象のカラムをSELECTする時に使用します。
例えば住所データとかはいろんなデータがあるので、以下のようにやるととても楽にマッチングできます。

```sql
SELECT
  multibyte2cv(`オリジナルの住所`) AS addr_org,
  multibyte2cv(`インポートした住所`) AS addr
FROM
  example_table
HAVING
  addr_org <> addr;
```

### 補足

* **パフォーマンスは非常に悪いです**  
ローカルDBで実行する用と思っていただければと。
* 記号系の置換はお好みでカスタマイズしてください
* 文字コードなどの調整は適宜してください
RedmineとPostgreSQLをUnixドメインソケットで接続する。



RedmineとPostgreSQL間の通信をUnixドメインソケットにすることが出来ます。
PostgreSQLの初期設定(`pg_hba.conf`)では、Unixドメインソケットの通信はpeer認証となっています。
redmine実行ユーザとPosgreSQLのユーザが同じ場合は、この初期設定(`pg_hba.conf`)を変更せずに使用できます。

# 環境

```
PostgreSQL v9.4.1
Redmine v3.0.0
```

# 設定

```/var/lib/pgsql/9.4/data/pg_hba.conf 
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident
```

hostを`/tmp`にすると、PostgreSQLのソケットファイル`/tmp/.s.PGSQL.5432`経由で通信します。
もしソケットファイルの場所を変更している場合は、変更先のディレクトリ名を設定します。

```/home/redmine/redmine/config/database.yml
# PostgreSQL configuration
production:
  adapter: postgresql
  database: redmine
  host: /tmp
  username: redmine
  encoding: utf8
```


# 参考
[Can not connect to local PostgreSQL](http://stackoverflow.com/questions/8465508/can-not-connect-to-local-postgresql)
main-bower-filesのオプション使用例をメモ


これを見れば終わり
https://github.com/ck86/main-bower-files#options

# main-bower-filesとは

bowerでダウンロードしてきたjsライブラリたちへの参照をまとめて取ってくることができるgulpプラグイン。

これとgulp-concatなどを使い、複数のライブラリを一つのjsファイルにまとめ上げることができる。

# オプションの例

```
js:gulpfile.js	gulp.src(mainBowerFiles({debugging:true,checkExistence:true}))
		.pipe(concat('app.js'))
		.pipe(jsmin())
		.pipe(gulp.dest('./app/scripts'));
```

##  debugging

`gulp`を実行中、プラグインがどんな処理をしてるか表示してくれる。

## 

## checkExistence

`bower_components`フォルダとかの一覧からプラグインファイルがちゃんと存在しているか確認し、見つけられなかったらエラーを吐いてくれる。

これを指定しないと、プラグインファイルが見つからなくても成功したかのような感じになる。でもプラグインファイルは見つかってないのでdest先の`app.js`にはプラグインファイルが含まれておらず、ブラウザでウェブアプリを起動するとエラーをだす。いやいや、bower_componentsにはたしかにあるんだけどなあ、なんでだろう。。と困る。

私も↑で困ってました。

なので、checkExistenceはオススメ。

## Overrides Option

なぜbower_componentsには該当ライブラリのフォルダが存在しているのに、checkExistenceで落ちるのか。

ディレクトリ構成が独自だったりするのが大抵の原因。のはず。

なので、この○○というプラグインのmainファイルはここにあるよ、とどこかで明記する必要があります。

https://github.com/ck86/main-bower-files#overrides-options

ここに書いてることが全てなんですが、最初見たときよく分からなかった。

bower.jsonにcheckExistenceで落ちたプラグインのmainファイルの居場所を上書きしてやればOKです。

たとえば`modernizr.js`
bowerでダウンロードしてきたjsはdistという名前のフォルダの中に格納されてるのですが、modernizrに関してはmodernizrという名前のディレクトリ直下に存在しています。

なので、main-bower-filesが見つけられなくてエラーを吐くのです。

```
Error: Main property of package "modernizr" is missing.
```

こんな感じに。

じゃあ、どうすればいいか。
bower.jsonを下記を追記すればOK

```json:bower.json
  "overrides": {
    "modernizr": {
      "main": "modernizr.js"
    }
  }
```

これでmodernizr.jsの位置を上書き指定しました。
この状態でもう一度`gulp`を実行するとエラーを吐かずに終了するはず。
ArduinoでGroveアルコールセンサSEN21723Pを試す

# Precondition

* 環境
 * HW
     * Windows 7 Pro 64bit
     * Arduino Uno
     * [GroveベースシールドV2 SLD01099P](http://www.seeedstudio.com/depot/Base-Shield-V2-p-1378.html)
         * 千石電商 秋葉原店で購入
     * [Groveアルコールセンサ SEN21723P](http://www.seeedstudio.com/depot/grove-alcohol-sensor-p-764.html)
         * 千石電商 秋葉原店で購入
         * 裏面に『 Alcohol Sensor v1.2 』の表記あり
 * SW
     * Arduino IDE 1.6.0

# 簡単に動作するハズだった…

Groveシステムを使えば、簡単に試せるハズだったのです…。
しかし、私の環境では、上手く動作せず、いろいろ試したことをまとめておきます。

まず、動作しなかった手順は以下です。

1. センサをGroveベースシールドの A0 端子に接続する
2. [Grove - Alcohol Sensor](http://www.seeedstudio.com/wiki/index.php?title=Twig_-_Alcohol_Sensor)からコードをコピペする
3. Arduino IDE にてコンパイル＆書き込み
4. Arduino IDE のシリアルモニタにてログを確認する

ここで、

* シリアルモニタに何も表示されない
* Arduino の電源を切り入り
* PC に接続したところでシリアル (COM5) が認識しない
* PC 再起動で何とか認識し、原因究明を始める
* Arduino本体, Groveベースシールド, ケーブルに問題はなさそう
* センサ自体が壊れている可能性もあるが、そうそうハズレに当たるとは思えない (思いたくない)
* そもそもセンサの仕様を分かっていなかったため、仕様を調査する
 * 手元の品とネット上での品が若干違う…バージョンが違うのか…？

『[Intel Edisonでアルコールセンサーを使ってみた](http://dev.classmethod.jp/hardware/edison/intel-edison-use-alcohol-sensor/)』から以下だと思った。

* SEN21723P
 * 内蔵ヒーターを熱する必要があり、電源投入後 5 分～ 10 分は正確に測定できない
 * Grove ベースシールドの A0 端子に接続した場合、下表の様なピンアサインになる
     * A0 ピンがアナログ入力のセンサ部
     * A1 ピンがデジタル出力のヒータースイッチ部
         * HIGH (1) : OFF
         * LOW (0) : ON
 * 表示する値は 1023 からセンサの値を引く
     * 空気中にあるアルコールによりセンサの抵抗値が下がる仕組み

| Arduino | Sensor | Color |
|:-:|:-:|:-:|
| A0 | DAT | Yellow |
| A1 | SCL | White |
| 5V | VCC | Red |
| GND | GND | Black |

VCC と GND は怪しくない。DAT もセンサ部でアナログ入力なので A0 ピンで良さそう。SCL の A1 ピンから漂ってくる怪しさ…。

そこで、仕様から SCL は内蔵ヒーターで、使用する際に ON になれば良さそうなので、 LOW となるよう GND ピンに直結して、起動と同時に内蔵ヒーター ON でどうだろう、と。

# Grove ベースシールドを使用せず Arduino に直結する

次の写真のように直結してみた。

![002-01-light.jpg](https://qiita-image-store.s3.amazonaws.com/0/68547/4b5ed7b0-2a50-ec8d-b3af-19db481b9ac0.jpeg)

ピンアサインは、以下です。

| Arduino | Sensor | Color |
|:-:|:-:|:-:|
| A0 | DAT | Yellow |
| GND | SCL | White |
| 5V | VCC | Red |
| GND | GND | Black |

# 

SCL ピンに関係するコード部分 (例えば、内蔵ヒーターを OFF, ON するなど) を除去して簡単化しました。

```lang:AlcoholSen.ino
//Alcohol Sensor DAT Pin is connected to Analog Input Pin 0 (A0)
#define analogInDatPin 0

int sensorValue = 0;

void setup()
{
    Serial.begin( 9600 );                 // open the serial port at 9600 bps
    Serial.println( "setup done.\n" );
}

void loop()
{
    sensorValue = analogRead( analogInDatPin );    // read the analog value
    Serial.print( "sensor test value = " );     // Disply the results in serial monitor.
    Serial.println( 1023-sensorValue );         // sensorValue goes down when alcohol is detected.
    delay(1000);
}
```

# 動作を確認する

1. Arduino IDE にてコンパイル＆書き込み
2. シリアルモニタを起動し、ログを確認する  
[ツール] → [シリアルモニタ]  
![002-02.png](https://qiita-image-store.s3.amazonaws.com/0/68547/5f975263-9b21-0af4-6dbf-8b5e072b8393.png)

途中、314 → 343 → 581 → 874 → 914 と急激に上昇している部分があります。
このタイミングで、日本酒を入れたお椀の直上にセンサを持ってきました。とても分かりやすいです。

# 感想

* すぐに試してみるって目的のために Grobe システムを導入したのですが、上手くいかない事もあると体感しました
* センサの仕様を理解しておく事の重要性も再認識です
* アルコールセンサを使った面白いネタは、思い付かなかった
手軽で、伝わる。gif動画を3分で作る方法 ~ CloudApp/mac

###1.以下URLで、CloudAppにSignUp
http://www.getcloudapp.com/ 

![Screen Recording 2015-03-01 at 08.45 午後.gif](https://qiita-image-store.s3.amazonaws.com/0/61340/ad4f4566-1696-6b5b-60b9-b57d08c7bf93.gif "Screen Recording 2015-03-01 at 08.45 午後.gif")

###2. 自動でダウンロードが開始されるCloudApp.dmgをApplicationsへドラッグアンドドロップ
![Screen Recording 2015-03-01 at 08.59 午後.gif](https://qiita-image-store.s3.amazonaws.com/0/61340/f078613e-d39f-8524-40d9-c39ebf5aca08.gif "Screen Recording 2015-03-01 at 08.59 午後.gif")

###3. CloudAppを起動
起動などの確認後、チュートリアル
![kobito.1425203184.663297.png](https://qiita-image-store.s3.amazonaws.com/0/61340/bb156170-c659-2417-665c-5a69d9e69997.png "kobito.1425203184.663297.png")

###4. メールアドレス確認後、macスクリーン上部のCloudAppアイコンをクリックして、ログイン

![Screen Recording 2015-03-01 at 09.07 午後.gif](https://qiita-image-store.s3.amazonaws.com/0/61340/1fa5df57-83a5-15cb-500c-956a8d8801ef.gif "Screen Recording 2015-03-01 at 09.07 午後.gif")
  
###5. 便利なショートカットを活用しましょう！
⌘ + ⇧ + 6　⇒　gif撮影
自分で設定も可能です。

![Screen Recording 2015-03-01 at 09.19 午後.gif](https://qiita-image-store.s3.amazonaws.com/0/61340/8510ebc7-206a-b31d-7cd9-003941a76adc.gif "Screen Recording 2015-03-01 at 09.19 午後.gif")



#楽しいgif生活を！！！

何かあればお気軽にコメントください。
IntelliJ IDEAでeclipseのコードフォーマッターを使用する

IntelliJ IDEAでeclipseのコードフォーマッターを使用する方法を紹介します。

まずはeclipseからコードフォーマッターのプロファイルをエクスポートします。
![WS000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/43869/44c29729-0352-f4d8-4cb2-d6b6f14f70f5.jpeg)


File > Settings > Pligins を選択し、「Browse Respositories」ボタンをクリック。「formatter」で検索し、表示されるリストにある「Eclipse code formatter」をダブルクリックし、インストールします。
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/43869/febadcb8-78cd-ba13-2f46-b0f0f8fb1553.jpeg)

ダウンロード、インストールしたら、IntellJ IDEAを再起動します。

![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/43869/11e2a0a8-d0d8-23db-a852-0f19448fc371.jpeg)


フォーマットする対象を選択し、Ctrl + Alt + L (または Code > Reformat Code)をクリックします。
![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/43869/684b5d04-47e7-4365-61cb-b468b00c6c56.jpeg)





以下のように、eclipseのフォーマットプロファイルでソースコードが整形されます。

![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/43869/63a25aed-7da6-4d57-a4c8-7a1d70acb5b2.jpeg)
ボールカウント:野球


```Source.cpp
#include "Header.h"

void BallCount::initNowCountInfo()
{
	for(int i=0; i<COUNTINFONUMBER; i++){
		m_nowCountInfo[i] = 0;
	}
}

void BallCount::ballStrikeOutRenew()
{
	if(m_nowCountInfo[2] == 4){
		m_nowCountInfo[2] = 0;
		m_nowCountInfo[1] = 0;
	}
	if(m_nowCountInfo[1] == 3){
		m_nowCountInfo[2] = 0;
		m_nowCountInfo[1] = 0;
		m_nowCountInfo[0]++;
	}
	if(m_nowCountInfo[0] == 3){
		m_nowCountInfo[2] = 0;
		m_nowCountInfo[1] = 0;
		m_nowCountInfo[0] = 0;
	}
}

void BallCount::s_process()
{
	m_nowCountInfo[1]++;
}

void BallCount::b_process()
{
	m_nowCountInfo[2]++;
}

void BallCount::f_process()
{
	if(m_nowCountInfo[1] != 2)
		m_nowCountInfo[1]++;
}

void BallCount::h_process()
{
	m_nowCountInfo[2] = 4;
}

void BallCount::p_process()
{
	m_nowCountInfo[1] = 3;
}

void BallCount::nowCountInfoRenew(const char& addChar)
{
	std::string result = "";
	if(addChar == 's'){
		s_process();
	}
	if(addChar == 'b'){
		b_process();
	}
	if(addChar == 'f'){
		f_process();
	}
	if(addChar == 'h'){
		h_process();
	}
	if(addChar == 'p'){
		p_process();
	}
	ballStrikeOutRenew();
}

const std::string BallCount::changeString()
{
	std::string result = "";
	for(int i=0; i<COUNTINFONUMBER; i++){
		result += std::to_string(m_nowCountInfo[i]);
	}
	result += ",";
	return result;
}

const std::string BallCount::solve(const std::string& input)
{
	initNowCountInfo();
	std::string result;
	for(int i=0; i<input.size(); i++){
		nowCountInfoRenew(input.at(i));
		result += changeString();
	}
	result.erase(--result.end());
	return result;
}

void  BallCount::test(const std::string& inputStr)
{
	std::string input, output;
	int index = inputStr.find("-", 0);
	input = inputStr.substr(0,index-1);
	output = inputStr.substr(index+3);

	std::string result = solve(input);
	std::cout << result << std::endl;
	if(result == output){
		std::cout << "test is OK!" << std::endl;
	}else{
		std::cout << "test is NG!" << std::endl;
	}
}

int main()
{
	BallCount bc;
	bc.test("s -> 010");
	bc.test("sss -> 010,020,100");
	bc.test("bbbb -> 001,002,003,000");
	bc.test("ssbbbb -> 010,020,021,022,023,000");
	bc.test("hsbhfhbh -> 000,010,011,000,010,000,001,000");
	bc.test("psbpfpbp -> 100,110,111,200,210,000,001,100");
	bc.test("ppp -> 100,200,000");
	bc.test("ffffs -> 010,020,020,020,100");
	bc.test("ssspfffs -> 010,020,100,200,210,220,220,000");
	bc.test("bbbsfbppp -> 001,002,003,013,023,000,100,200,000");
	bc.test("sssbbbbsbhsbppp -> 010,020,100,101,102,103,100,110,111,100,110,111,200,000,100");
	bc.test("ssffpffssp -> 010,020,020,020,100,110,120,200,210,000");
	return 0;
}
```

```Header.h
#ifndef _HEADER_H
#define _HEADER_H

#include <string>
#include <iostream>

#define COUNTINFONUMBER 3

class BallCount
{
public:
	void test(const std::string& inputStr);
	int m_nowCountInfo[COUNTINFONUMBER];
private:
	void initNowCountInfo();
	const std::string solve(const std::string& input);
	const std::string changeString();
	void nowCountInfoRenew(const char& addChar);
	void ballStrikeOutRenew();
	void s_process();
	void b_process();
	void f_process();
	void h_process();
	void p_process();
};

#endif
```
go の日時比較 timeパケージで「以上」「以下」はどうやって比較するの？



http://play.golang.org/p/7nxlW1YS6X

```go:たぶんこう
	old := time.Now().Add(-time.Second)
	now := time.Now()

	if old.Equal(now) || old.Before(now) {  // old <= now 
	}
	if now.Equal(old) || now.After(old) {   // now >= old
	}
```

たぶんこれなんだろうけど、なんかイマイチですよね。。    

コメントで正解を頂きました。

```go:これが正解

	if !old.After(now) {    // old <= now --- ! old > now
	}
	if !now.Before(old) {   // now >= old --- ! now < old
	}

```

しかし、頭が悪い私には直感的ではないのは変わらないので、
Unix timeに変換してから比較する案もありかなと。

```go:unixTimeにしてみる
	if now.Unix() >= old.Unix() {
	}
	if old.Unix() <= now.Unix() {
	}
```
もう日時比較は常にunix timeでいいじゃ？
nano秒単位で比較したい場合は、```UnixNano()```を使えばいいし。

というわけでベンチしてみました。

https://gist.github.com/masahide/16cd0e60c1b57e8ffff0


```bash:
MacBook Pro (Retina, Mid 2012)

$ go version
go version go1.4.1 darwin/amd64
$ go test -bench .
testing: warning: no tests to run
PASS
BenchmarkTimeAfter	2000000000	         1.10 ns/op
BenchmarkTimeBefore	2000000000	         1.07 ns/op
BenchmarkTimeUnixAfter	2000000000	         1.22 ns/op
BenchmarkTimeUnixBefore	2000000000	         1.23 ns/op
BenchmarkTimeUnixNanoAfter	2000000000	         1.86 ns/op
BenchmarkTimeUnixNanoBefore	2000000000	         1.87 ns/op
BenchmarkTimeEqualAfter	1000000000	         2.11 ns/op
BenchmarkTimeEqualBefore	1000000000	         2.15 ns/op
BenchmarkTimeAfterEqual	2000000000	         1.25 ns/op
BenchmarkTimeBeforeEqual	2000000000	         1.20 ns/op
BenchmarkTimeUnixAfterEqual	2000000000	         1.21 ns/op
BenchmarkTimeUnixBeforeEqual	2000000000	         1.22 ns/op
BenchmarkTimeUnixNanoAfterEqual	2000000000	         1.80 ns/op
BenchmarkTimeUnixNanoBeforeEqual	2000000000	         1.85 ns/op
ok  	github.com/masahide/test/t	40.183s
```

やっぱりAfter(),Before()が最速です。
~~しかし「以上」「以下」になると、 
比較順によりますが、Unix()をつかった比較と同じぐらいになりますね。
というわけで、time.Second精度での比較であれば
Unix()で比較演算子を使うのもありな気がしました。~~
あとでベンチやり直します。。
驚き！HHVMはPHPより最大13倍演算処理速度が早い。

仕事でバッチ処理の開発をする必要があり、HHVMを使ってバッチサーバーの負荷を軽減させたいと思っています。
その前にHHVMはPHPより、どれくらい早いのか検証してみました。
※ まずは演算処理能力から、、

### 環境及びバージョン
CentOS 6.5 (vagrant上)
PHP 5.3.3
PHP 5.6.6
HHVM 3.2.0

### 処理内容

1 + 2 + 3 + 4 + 5 ...... 10億 = ?
HACK言語は使用していません。

```php
$start_date = microtime(true);
$count = 0;
for ($i=0; $i<1000000000; $i++) {
        $count = $count + $i;
}
$end_date = microtime(true);
$total_date = $end_date - $start_date;

echo $total_date. " seconds \n";
echo $count. " count \n";
```

### 比較結果
|  | 1回目 | 2回目 | 3回目 | 平均処理時間
|:-----------|------------:|:------------:|:------------:|:------------:|
| PHP 5.3.3       | 49.27 s| 55.99 s| 49.33 s| 51.53 s|
| PHP 5.6.6       | 30.54 s| 31.16 s| 31.73 s| 31.14 s|
| HHVM     | 4.05 s| 3.80 s| 3.83 s| 3.89 s|

驚きの結果！
演算処理の比較ではHHVMがPHP5.3.3より約13倍、PHP5.6.6より約8倍早いことが判明。Facebookすごい！

今後、別の視点からも比較しますのでお楽しみに〜
Python で stdout/stderr のバッファを無効にするオプション

たまに忘れて痛い目をみるので記事にした。

シェルでそのまま実行すると、次のコマンドは書いてあるとおり、予想通りに動くと思う。
1 を出力して、 3 秒待ち、 2 を出力。

```shell-session
$ python -c 'import time; print(1); time.sleep(3); print(2)'
1
2
$
```

これにパイプを通すとパイプの持つバッファサイズ分が貯まらないと出てこれない。

上の例で示すと、

```shell-session
$ python -c 'import time; print(1); time.sleep(3); print(2)' | cat
1
2
$
```

単に ```cat``` にパイプしただけなのだけど 1 と 2 の行は同じ 3 秒後のタイミングで出てくる。
それっぽく言うと "パイプが詰まってる” というやつ。ファイルに書き出しても同様に遅れて書き出される。

このような挙動を抑止したければ、 ```-u``` オプションを使う。

```shell-session
$ python -u -c 'import time; print(1); time.sleep(3); print(2)' | cat
1
2
$
```

↑  1 が出てから 3 秒待ち、その後 2 が出てくる。

http://docs.python.jp/3/using/cmdline.html#cmdoption-u

```PYTHONUNBUFFERED``` 環境変数に空でない文字列を入れても同じ効果が得られる。
swift勉強しててふむふむ思った事６【Generics】

引数の型を定義しないでも使えるようにする機能
でも、柔軟すぎてXcodeさんが理解できないので、プロトコル経由で使い道を教えてやるんだ。
プロトコルは3種類、Equatable/Comparable/Printableがある。

```

func bigger<T: Comparable>(val1: T, val2: T) -> T {
    return val1 > val2 ? val1 : val2
}


func check<T: Equatable>(val1:T, val2:T)->Bool
{
    return val1 == val2
}


func print<T: Printable>(val:T)
{
    println(val)
}
```
[Equatable](https://developer.apple.com/library/ios/documentation/General/Reference/SwiftStandardLibraryReference/Equatable.html#//apple_ref/doc/uid/TP40014608-CH17-SW1)
 == and != を使えるようにする

[Comparable](https://developer.apple.com/library/ios/documentation/General/Reference/SwiftStandardLibraryReference/Comparable.html#//apple_ref/doc/uid/TP40014608-CH16-SW1)
 <, >, <=, and >=　が使えるようにする

[Printable](https://developer.apple.com/library/ios/documentation/General/Reference/SwiftStandardLibraryReference/Printable.html#//apple_ref/doc/uid/TP40014608-CH11-SW1)
printできるようにする
Redmineでメールからチケットを作成するときに添付ファイルをエンコード変換せずに保存する

Redmineには指定のアドレスに送ったメールからチケットを作ったり、チケットコメントを追記したりする機能があります。そのメールに添付ファイルがある場合は、チケットの添付ファイルにも追加されます。

問題
-----

この添付ファイルがテキストファイルである場合に、文字コードが変わってしまう問題があります。
具体的には、メールにSJISのテキストファイルを添付してRedmineで取り込み、作成されたチケットのページからそのファイルをダウンロードするとファイルのエンコードがUTF-8に変わってしまうことがあります。
添付ファイルは元々のバイナリを維持したままのファイルを保存してほしいところなのですが、この挙動は困ってしまいます。

なお、この問題は必ず起きるわけではありません。メールの生データ中で添付ファイル部分のContent-Typeで「charset」を指定していると、この問題が発生します。
charsetが明記されているために、エンコードができてしまっていることが原因のようです。
メーラによってはここにcharsetを明記しないらしく、Outlookから送ったメールでは問題がおきず、Gmailから送ったメールでは問題がおきました。

```
問題が起きるメールの添付ファイル部分

--f46d040714391fef6a0510328cb4
Content-Type: text/plain; charset=Shift_JIS; name="text.sjis.txt"
Content-Disposition: attachment; filename="text.sjis.txt"
Content-Transfer-Encoding: base64

CoNUg5ODdoOLg3SDQINDg4tzamlzCgo=
```

この問題は結構困りそうなのですが、ググった限りではいまいちこの現状について書かれているものがありませんでした。



原因
-----

この問題は、Redmineのメールからチケットを生成する以下の箇所で、attachment.decodedを使っているのが原因のようです。

https://github.com/redmine/redmine/blob/3.0.0/app/models/mail_handler.rb#L282

```ruby
  def add_attachments(obj)
    if email.attachments && email.attachments.any?
      email.attachments.each do |attachment|
        next unless accept_attachment?(attachment)
        obj.attachments << Attachment.create(:container => obj,
                          :file => attachment.decoded,
                          :filename => attachment.filename,
                          :author => user,
                          :content_type => attachment.mime_type)
      end
    end
  end
```

ここのdecodedメソッドは、[Mailモジュール](https://github.com/mikel/mail)のMessage#decodedメソッドで、内容がテキストファイルの場合にはエンコード変換済みの内容を返してしまいます。
このメソッドの代わりにMessage#readメソッドを使えば、元々のバイナリをそのまま取得できそうです。


対処
-----

修正方法が分かったので、そのモンキーパッチをプラグイン形式にして作成しました。

https://github.com/namutaka/mail-attachments-as-binary


おまけ
------

ちなみに、Redmineのプラグインは初めて作ったのですが、モンキーパッチをプラグイン化する方法の説明が中々みつからず苦労しました...
以下に公式っぽい文書があるのですが、どうも内容が古いようです。

http://www.redmine.org/projects/redmine/wiki/Plugin_Internals

上記のページで紹介されているinit.rbではDispatcher#to_prepareを使っているのですが、試してみると"dispacher"をrequireできずに使えませんでした。

```
require 'dispatcher'

Dispatcher.to_prepare :redmine_kanban do
　# パッチ設定
end
```

その代わりに、Rails.configuration.to_prepareを使っている例があったので、それを参考にしています。
Qiita:Teamの投稿をMarkdownファイルでエクスポート

# 目的 :bulb: 

Qiitaの有料クローズド版[Qiita:Team](https://teams.qiita.com/)では、チームの全投稿データを一つのJSONファイルとして、オーナ権限付きユーザがエクスポートできます。退会時も安心ですね。
ただ、JSONファイルのままだと人間が読みにくいので、投稿ごとにMarkdownファイルとして分割することにします。
体裁が必要であれば、そのあと[Pandoc](http://sky-y.github.io/site-pandoc-jp/users-guide/)でPDFなどに変換しましょう。

# 入力 :speech_balloon: 

とりあえず投稿のタイトルとユーザ名と本文のみに着目すると、投稿ごとに下記リストのような構造になっています。
Qiitaと共通の[API v2](http://qiita.com/api/v2/docs)で取得できるJSONとはキー名など異なるようなので注意が必要です。

* title
* user
    * url_name
    * ...
* raw_baody
* ...

省略しましたが、JSONファイルにはタグやコメントなどの情報も含まれています。

# コード :sparkles: 

ScalaのJSONライブラリ[json4s](https://github.com/json4s/json4s)を使うことにします。実行環境はWindowsです。

```scala:Main.scala
case class QiitaTeamUser(url_name: String)

case class QiitaTeamPost(title: String, user: QiitaTeamUser, raw_body: String)

object Main extends App {

  splitQiitaTeamJson("C:\\TEMP\\123456789.json") // エクスポートしたJSONファイルのパス

  def splitQiitaTeamJson(file: String) {
    using(scala.io.Source.fromFile(file, "UTF-8")) { source =>
      // JSONパース
      implicit val formats = org.json4s.DefaultFormats
      val json = org.json4s.native.JsonMethods.parse(source.mkString)
      val posts = json.children.map(_.extract[QiitaTeamPost])

      // Markdownファイル出力
      posts.foreach { post =>
        val dir = "out\\" + post.user.url_name
        val file = post.title.replaceAll("[\\/:*?\"<>|]", "_") + ".md" // Windowsのパス禁止文字を置換
        new java.io.File(dir).mkdirs()
        writeFile(dir + "\\" + file)(_.print(post.raw_body))
      }
    }

    // 簡易loanパターン
    def using[A <: {def close() : Unit}](s: A)(f: A => Any) {
      try f(s)
      finally s.close()
    }

    def writeFile(file: String)(f: java.io.PrintWriter => Unit) {
      import java.io._
      try using(new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")))(f)
      catch {
        case e: FileNotFoundException => println(e)
      }
    }
  }
}
```

```scala:build.sbt
name := "splitQiitaTeamJson"

version := "1.0"

scalaVersion := "2.11.4"

libraryDependencies += "org.json4s" %% "json4s-native" % "3.2.11"
```

```scala:build.properties
sbt.version=0.13.7
```

# 出力 :white_flower: 

下記のようなフォルダ構造で出力します。

```
> tree /F
├─piyo7
│      boost__optionalにモナドのbindを.md
│      ICML 2014 Best Paper斜め読み.md
│      Qiita_Teamの更新をChatWorkに通知する.md
...
├─piyo8
...
```
Arduinoを買ったのでLチカさせた


開発環境をインストールする。まずはhomebrewでインストール。

```
$ brew cask install arduino
```

実行するとこんな感じのエラーが出る。![kobito.1418214132.850846.png](https://qiita-image-store.s3.amazonaws.com/0/41266/bdc3608f-ceb0-7b7a-0841-c7efe8420f59.png "kobito.1418214132.850846.png")

慌てずに「詳しい情報」をクリックするとJava SE 6のランタイムのインストールページに飛びます
インストールしてあげると無事立ち上がります

![kobito.1418215845.893394.png](https://qiita-image-store.s3.amazonaws.com/0/41266/4524fb9d-b223-42d1-8fcb-a3cf225c051f.png "kobito.1418215845.893394.png")

あとはblinkするとLEDがちかちかします！

とりあえずここまで。

***
参考資料

* [電子回路を作る基礎を学びNode.jsでボードを操ろう](http://www.atmarkit.co.jp/ait/articles/1406/23/news026.html)
Apache POIでWordのファイルを読み込む

# 前書き
Apache POI を使って Excel のデータを読み込むことはよくある（？）ことだと思うけれど、先日今度は悲しくも
 Word のデータを読み込む必要が生じたので、ここにメモを残す。

[Apache POIによるWordファイルの編集 - M12i.](http://m12i.hatenablog.com/entry/20120826/1345991887)によると、Word 内のデータは Range > Section > Paragraph > CharacterRun の階層構造で取得できるらしい。

というわけで、とりあえずどういう構造になっているのか全体を表示してみる。


# ソースコード
```groovy:build.gradle
...
repositories {
  mavenCentral()
}

dependencies {
  compile 'org.apache.poi:poi-scratchpad:3.11'
}
```

これは 2003 形式の Word ファイルを読み取っている。

```Main.java
package com.example;

import java.util.stream.IntStream;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.CharacterRun;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.hwpf.usermodel.Section;

public class Main {

  public static void main(String[] args) throws Exception {
    // クラスパス上に配置したWordファイルを読み込む。
    HWPFDocument document =
        new HWPFDocument(Main.class.getResourceAsStream("/sample.doc"));

    // ドキュメント全体を読み込む。
    Range text = document.getRange();

    IntStream.range(0, text.numSections()).forEach(sNo -> {
      Section section = text.getSection(sNo);

      IntStream.range(0, section.numParagraphs()).forEach(pNo -> {
        Paragraph paragraph = section.getParagraph(pNo);

        IntStream.range(0, paragraph.numCharacterRuns()).forEach(cNo -> {
          CharacterRun characterRun = paragraph.getCharacterRun(cNo);

          System.out.printf("%d:%d:%d:%s", sNo, pNo, cNo, characterRun.text());
          System.out.println();

        });
      });
    });

  }

}
```

Java 8 使いこなせてる感があまりないけれど、これでとりあえず全文 CharacterRun に分解した状態で表示できる。

![word.PNG](https://qiita-image-store.s3.amazonaws.com/0/43205/f2174faf-ca19-b287-7007-b0da803143b1.png)

残念ながら、謎の文字が紛れていてなかなか辛みある。
Dynmap,クライアント側プレイヤー位置情報出力テスト

dynmapを実装しているマインクラフトマルチサーバーから、全プレイヤーの位置情報を取得するテスト。（実験中）

#手法
１．dynmap以下のすべてのファイルをローカルに保存（保存先のフォルダをdynmapフォルダとする。）
いらないファイルもあると思う。
これのやり方は 項目:ローカル保存方法　を見る。

２．dynmap/config.jsを次のように変える。

```js:config.js
var config={
 url : {
  configuration: '(dynmapのURL)/up/configuration',
  update: '(dynmapのURL)/up/world/{world}/{timestamp}',
  sendmessage: '(dynmapのURL)/up/sendmessage',
  login: '(dynmapのURL)/up/login',
  register: '(dynmapのURL)/up/register',
  tiles: '(dynmapのURL)/tiles/',
  markers: '(dynmapのURL)/tiles/'
 }
};
```

３．これでdynmap/index.htmlを開けばdynmapが見れる。
すなわち、あとはjavascriptをいじるだけ。

追記:jqueryのクロスドメインサポートをONにしなければなりません。
書き忘れてました。
やり方は、dynmap/index.htmlのscriptタグ内の最初の行に以下の文を足すだけです。

``` index.html
//追加するコード
jQuery.support.cors = true;
```
４a．map.js の　Dynmap関数内のupdatePlayer関数が、playerのUpdate時に読み込まれる。（予測）
よって、

``` map.js 
//(map.js/Dynmap.prototype.updatePlayerの最後らへんに追加する)
console.log("PlayerLocation["+player.name+"]=" +player.location.x+","+player.location.y+","+player.location.z);
```

とすればプレイヤーの名前と位置情報のペアが出力できる。

#ローカル保存方法
1. まず、サイト内の関連付けられたファイルをすべて取得するソフトウェアを用いてdynmap以下のファイルを全部ダウンロードする。一応フォルダ名はdynmapにする。私はCompleteGetterを使った。
2. これだけだとjavascriptで動的に生成されるURLによるファイルなどを取得できないので、以下のファイルを自前でダウンロードする。

>dynmap/up/configuration
dynmap/js/index.html内に定義されているjsファイルすべて
(js/chat.js,js/chatballoon.js,...)

これで完了。



#注意
・このコードが正しいかどうかはわかりません。

・これはdynmapのソースコードを私的使用のために改変したものです。
アプリ内部のリンクを端末のブラウザで開く


デフォルトの場合、htmlのリンクをクリックすると、アプリ内でページ遷移されてしまうため、端末のブラウザを利用する


## プラグイン追加
```bash
$ cd cordova
$ cordova plugin add org.apache.cordova.inappbrowser
```


## 使い方
```javascript
window.open(url, '_system');
```


## 実装済みアプリ
* [FXAlert - 外為のアラート通知アプリ](http://www.itmarlin.com/page-fx-alert.html) : [各種設定]-[アプリ情報画面]
まいなす

```c

unsinged int n = 1;

while(n) {
  n *= 2;
  printf("%d\n", n);
}

```

・・・マイナスになるやないか！
せっかくだからマイナスつくってみよう。


```c

unsigned char c = 0xff;
unsigned char range = 0xff-0x80;

char i;
for(i=range; i>0; --i) {
  printf("%d\n", ~c+i+range);
}

```

うーん(´・ω・`)
いいんかこれ。

だいたい printf("%d\" ...) ってなにもの？
フォーマット指定子ってなにしてるかわからん。

1の補数はあふれたビットが下位のビットにまわってくるらしい。
よく tcp/ip プロトコルでみるね！
[openFrameworks]ofSetVerticalSync(bool)って？


##始めに

###※この記事の信憑性については保証しません。
あくまで「そんな感じ」程度で

ある問題を調べてる過程で学んだので残しておく。



##ofSetVerticalSync(bool)

垂直同期を適用する関数。



##垂直同期って？

垂直同期とはフレーム数と実際の描画回数を同期させるもの。例えば処理としては100fps(一秒間に100フレーム)あるのに対し、実際にはモニターには60fpsでしか描画できないとする。この時モニタに描画されない余るフレームが出てきてしまうので100枚がバラバラに描画されるということになってしまう(次の描画が処理の3,4フレーム後の描画など)。なので描画を安定させるために、処理としてのフレームと描画できるフレームを同期させる（同じfpsにする）のが垂直同期ということになる。

	ofSetVerticalSync(true);

とすることで垂直同期を適用させることが出来る。ただこれをすると60fps以上は出なくなってしまうようなので注意しよう。