OmniAICreator/Qiita-1.07M huggingface dataset:
バージョニングが億劫なので、Gitのコミットハッシュ値を埋めこむ

# 目的

[AWS Lambda](https://aws.amazon.com/jp/lambda/)で動いてMarkdown記法のテキストを出力する、小さな社内サービスを開発しています。
きちんとバージョニングするほどでもないのですが、デバッグのために出力時のコードは特定できるようにする必要があります。
そこでGitのコミットハッシュ値、せっかくなのでGitHubのリンクまで出力するようにしてみました。

# 出力イメージ

> （本文）
>
> ---
> commit: [e83c516](https://github.com/git/git/commit/e83c5163316f89bfbde7d9ab23ca2e25604af290) [modified]
> log: （ログストリームへのリンク）

# 仕組み

Scalaで開発しているため、ビルドツールはsbtを使っているのですが、探してみたところ[sbt-git-stamp](https://bitbucket.org/pkaeding/sbt-git-stamp)というプラグインがありました。
これは[JGit](https://eclipse.org/jgit/)を利用して、```sbt assembly```で生成されるJARのマニフェストファイルに、その時点のGit情報を埋めこむシンプルなプラグインです。あとはその情報を実行時に読みだせばOKというわけです。
他の言語でも同様のことができると思います。まぁ何となれば、ビルド時に直接Gitコマンド叩いて、それをよしなに埋めこめばいいですしね。そういえばSubversionを使っていた頃、```svnversion```で取得したリビジョン番号をソースに直接書きこむリリース用スクリプトを見かけた記憶が……。

# コード

次のようなシングルトンを書いてみました。
```"manifest-reader"```は、build.sbtで設定したプロジェクト名です。

```scala:src/main/scala/ManifestReader.scala
import java.util.jar.Manifest

import scala.collection.JavaConversions._
import scala.util.control.Exception.allCatch

/** 自身のマニフェストファイル読みこみ */
object ManifestReader {
  // クラスパスにあるマニフェスト列
  private[this] val manifests = getClass.getClassLoader.
    getResources("META-INF/MANIFEST.MF").toSeq.
    map(mu => new Manifest(mu.openStream()))

  // プロジェクト名で自身のマニフェストファイルを検索
  private[this] val mainAttributes = manifests.
    map(_.getMainAttributes).
    find(_.getValue("Implementation-Title") == "manifest-reader")

  def value(key: String): Option[String] = mainAttributes.
    flatMap(as => Option(as.getValue(key)))

  /** sbt-git-stampが埋めこむGitのローカル状態 */
  def gitClean: Option[Boolean] = value("Git-Repo-Is-Clean").
    flatMap(s => allCatch.opt(s.toBoolean))

  /** sbt-git-stampが埋めこむGitのハッシュ値 */
  def gitRev: Option[String] = value("Git-Head-Rev")
}
```

これを利用してテキスト出力するところは、こんな感じ。

```scala:src/main/scala/Main.scala
object Main extends App {
  val githubUrl = "https://github.com/git/git"
  val text = "commit: " +
    ManifestReader.gitRev.map(r =>
      "[" + r.take(7) + "](" + githubUrl + "/commit/" + r + ")"
    ).getOrElse("?") + " " +
    ManifestReader.gitClean.map {
      case false => "[modified]"
      case true => ""
    }.getOrElse("")

  println(text)
}
```

なお仕組み上、```sbt run```による実行では、JARファイルを経由しないためGit情報を取得できません。
```sbt assembly```で生成したJARファイルを、```scala target/scala-2.11/manifest-reader-assembly-0.0.0.jar```のようにして実行する必要があります。

# 確認環境

```scala:build.sbt
name := "manifest-reader"
version := "0.0.0"
scalaVersion := "2.11.7"

Seq(com.atlassian.labs.gitstamp.GitStampPlugin.gitStampSettings: _*)
```

```scala:project/plugins.sbt
addSbtPlugin("com.atlassian.labs" % "sbt-git-stamp" % "0.1.2")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.1")
```

```scala:project/build.properties
sbt.version=0.13.9
```
ベトナムでオフショア開発をしてみる(1)

GYAOの窓際エンジニア　玉利です。
 
最近はベトナム漬けの日々が続いております。とりあえず、飯がうまいというのがいいですね。一緒に働く女の子も可愛いです。なんで私がベトナム漬けになったかというと、オフショア開発担当になってしまったからです。
 
 <img width="768" alt="IMG_0020.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/113049/957c1b98-9501-0349-7523-fc16255ea457.jpeg">

 
_ホーチミンの定番朝食　道端の屋台のフォー。毎日外食してたらホテルのマネージャーに「なにかうちの朝食サービスに不満があるのか」とクレームを受けました（笑）_
 
簡単なシステムを開発したいが、優先順位の関係でエンジニアが足りないというお悩みをお持ちの会社は少なく無いと思います。仕事というのはエントロピー増大の法則で、ある閾値を上下すると雪だるま式に増えたり、むちゃくちゃ楽になったり。

少しのお金で解決できるのに、それができずにエンジニアがサービス残業でがんばって本業まで成果が出ないほど辛いものはないです。


ちょっと自慢ですが、私のチームではオフショア開発がうまくいっています。

 
ここで、オフショア開発の現実と、成功するコツをちょっとだけお見せしたいと思います。古くは中国、最近ではあちこちの会社でベトナムオフショアを利用しています。私も10年前は中国は深センにあるITチームの先生をしておりました。「9割方は失敗する」というのがオフショア開発の様式美なのですが（笑）株式投資だって9割は損すると言われて、1割は理論をベースにしっかり儲けているわけで、その1割に入ればいいのです。

 
日本のエンジニアの業務環境は個人の能力に依存することが多く、「この仕事は誰ならできる」というアサインをされることがほとんどなのです。よくあるのが一部のできる人に大量の仕事が集中して体を壊すとか精神を病むとか、彼が異動転職してだれも触れないシステムができるとか。

またつまらない仕事をアサインされて成果が目立たず、不当に低い評価を受けるので転職していくなど、エンジニア飲み会の話はだいたいコレにつきると思います。ところが、つまらない仕事というのは、発展途上国のエンジニアに言わせればまだまだ夢の仕事のチャンスだったりするわけです。
 
ここで、私が製造業の海外生産をモデルにしたオフショアのノウハウを包み隠さず公開します。たぶん自分のできることだけでいい気になっている自称腕自慢エンジニアにはマネはできないことなので、一切合切さらけだしてしまいます。トヨタ式も完全公開されてますが、誰もトヨタになることはできません。

会社の仕事は、会社間の競争なので、開発パワーの大きい小さいでだいたいの勝負が決まります。個人の開発能力をあげていく、というのがエンジニアの一般的なアプローチですが、「自分の弟子を増やしていきチーム総力で勝負する」というエンジニアのアプローチもあります。外国で自分の思想を十分に理解して手足になる弟子を育て、システム的に開発していく、というのが海外オフショア開発の真髄だとおもっています。
凄腕ハッカー思想とは対局に位置するアプローチですね。

シリコンバレーの会社は優雅にエンジニアが働いてるように見えますが、実は工数のかかる仕事はインドで製造してとか、ざらにあるんです。彼らと日本人エンジニアの能力に大きな差は無いのですが、他力を使う部分で大きく水をあけられています。
 
私の悩みは、日本中国で教えたかつての弟子たちが私よりも偉くなってしまってて、たぶん収入的にボロ負けしていること。。。です。
React-NativeをiOS実機でビルドしたら，node binaryが見つからないとエラーが出た件


備忘録です．

環境
---
- Xcode 7.2.1
- react-native-cli 0.1.10

エラー
-----
React-NativeでInitしたプロジェクトに対し，OS実機を対象にビルドすると以下のnodeのエラーがでてきました．
PATH通ってるはずなのになと思いつつ解決方法を探ってみました

```
error: Can't find 'node' binary to build React Native bundle
If you have non-standard nodejs installation, select your project in Xcode,
find 'Build Phases' - 'Bundle React Native code and images'
and change NODE_BINARY to absolute path to your node executable
(you can find it by invoking 'which node' in the terminal)
```

解決方法
-------
Projectファイルを選択 -> TARGETS -> APP Name -> Build Phases -> Bundle React Native code and image
にある以下のNODE_BINARY部分を変更します


```
export NODE_BINARY=node
../node_modules/react-native/packager/react-native-xcode.sh
```

homebrewを/opt以下にインストールしている場合，以下のようになります

```
export NODE_BINARY=/opt/homebrew/bin/node
../node_modules/react-native/packager/react-native-xcode.sh
```

mobileでアプリ名を作った時の画像です．
![スクリーンショット 2016-02-19 16.11.30.png](https://qiita-image-store.s3.amazonaws.com/0/65007/f7bd01ef-2730-1ea5-1ff7-5f3572faf7b2.png "スクリーンショット 2016-02-19 16.11.30.png")
laravel5ビルダー一覧

#laravel5のメモとして書きます。(自分用のメモ)#

- get: select構文としてクエリを実行
- select: 選択する列を設定
- distinct: 重複を取り除く
- join: JOINを追加
- pluck: データベースから単一列（カラム）を抽出
- where: WHEREを追加
- orWhere: OR WHEREを追加
- whereNotIn: WHERE NOT INを追加
- whereIn: WHERE INを追加
- Raw: クエリに生のsqlを追加
- orderBy: ORDER BYを追加
- groupBy: GROUP BYを追加
- find: 指定したIDの単一レコードを取得
- first: クエリを実行し、最初の結果を取得
- paginate: ページネーションを取得
- sum: 合計を取得
- toSql: クエリのSQL表現（文字列？）を取得
- exists: 現在のクエリに任意の行が存在するかどうかを判断
- update: UPDATEを追加
- insert: INSERTを追加
- rawurlencode: エンコード
- withTrashed: ソフトデリートされたモデルも結果に含めるように強制する
- onlyTrashed: ソフトデリートされたモデルのみに対しクエリーしたい場合

今後も忘れないように追加していきます。
追加したのがいい便利なビルダー・メソッドがあれば教えてください！

## 参考にしたサイト

[http://laravel4.winroad.jp/2013/05/22/query%E3%83%93%E3%83%AB%E3%83%80%E3%83%BC%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E4%B8%80%E8%A6%A7/](http://laravel4.winroad.jp/2013/05/22/query%E3%83%93%E3%83%AB%E3%83%80%E3%83%BC%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E4%B8%80%E8%A6%A7/)
Debian Wheezy (Apache2.2)で Let's Encrypt が自動設定できるようになっていた

前に試したときのSSLで、期限切れ間近の通知がメールで来ていた。

[Let's Encryptを試したログ](http://qiita.com/nishimura/items/ad1e978ca0a9ff7af6a1)


letsencryptはgitで入れていたので、おもむろにpullする。

```
git pull

./letsencrypt-auto --apache
Checking for new version...
Upgrading letsencrypt-auto 0.5.0.dev0 to 0.4.0...
Replacing letsencrypt-auto...
   cp /tmp/tmp.f13SOawKz6/letsencrypt-auto ./letsencrypt-auto
Creating virtual environment...
Installing Python packages...
Requesting root privileges to run letsencrypt...
   /root/.local/share/letsencrypt/bin/letsencrypt --no-self-upgrade --apache
The apache plugin is not working; there may be problems with your existing configuration.
The error was: NotSupportedError('Apache plugin support requires libaugeas0 and augeas-lenses version 1.2.0 or higher, please make sure you have you have those installed.',)
```

ライブラリのバージョンがダメらしい。

https://github.com/letsencrypt/letsencrypt/pull/1961
この辺ではpassと出ているのになあと思いつつ、またまたおもむろにgit grepしたら書いてあった。

```
git log --grep=wheezy

commit 9ea3dc313697f52889a6bf3d89edefb9132a618c
Author: Peter Eckersley <pde@eff.org>
Date:   Mon Nov 30 22:12:02 2015 -0800

    Hackishly add wheezy backports libaugeas0 where required
```

なるほど。
「Hackishly add」が若干気になるが…。

sources.listに

```
deb http://ftp.jp.debian.org/debian/ wheezy-backports main contrib non-free
```

を追記。

```
apt-get install -t wheezy-backports libaugeas0
```

backportsのものをインストールして、letsencrypt-autoを実行。

```
./letsencrypt-auto --apache
```

いけた。
これで古いテストサーバーもかなり楽になる気がする。

ただどこが編集されたのか分からない。
設定が消えたりすることは無かったが無駄な設定が残ることがあるので、先にバーチャルホスト設定ファイルのバックアップを取っておいた方が良さそう。
Finagleでのエラー処理の一例


- Finagle 6.28.+で確認。ClientBuilderを使う方法は現在は古い方法になっている

- どこかのサーバに問い合わせに行く処理。エラーが発生した時は例外を投げたりせずにNOT_FOUNDの結果を返す

```
def query(param:String) :Future[HttpResponse] = {
	val retVal = new Promice[HttpResponse]
	
	val client: Service[HttpRequest, HttpResponse] = ClientBuilder().codec(http.Http()).
      hostConnectionLimit(32).hosts("hoge.com:8080").        
      tcpConnectTimeout(100.milliseconds).timeout(50.milliseconds).build()
    val request = RequestBuilder.safeBuildGet(RequestBuilder.create().url(s"http://hoge.com:8080?url=${java.net.URLEncoder.encode(param, "UTF-8")}"))
 
 	val f1 = client(request).onSuccess{ f =>
      retVal.setValue(f)
    } onFailure { exc =>
      log.ifWarning(s"エラー発生: $param")
      val response = Response()
      response.setStatus(HttpResponseStatus.NOT_FOUND)
      retVal.setValue(response)
    }

    Await.ready(f1)
    retVal
}
```
logstashの設定:fileプラグインのpathはStringではなくArrayで


logstashのfileプラグインのpathの指定ではまりました。 確かにTypeはArrayとは書いてあるが、
ドキュメントには文字列でも大丈夫と読み取れる(私は読み取ってしまった)サンプルコードがの記述がある。
指定ディレクトリが一つだけだったので、サンプルコードのやり方を参考に文字列で記述した。

#Logstash
- version 2.1.3

#公式ドキュメント
公式ドキュメントから引用しています。
このサンプルコードを見て文字列で記述してしまうの普通ではない???

##[Structrue of a Config File](https://www.elastic.co/guide/en/logstash/2.1/configuration-file-structure.html#configuration-file-structure)

###Plugin Configuration
The configuration of a plugin consists of the plugin name followed by a block of settings for that
plugin. For example, this input section configures two file inputs:

```
input {
  file {
    path => "/var/log/messages"
    type => "syslog"
  }

  file {
    path => "/var/log/apache/access.log"
    type => "apache"
  }
}
```
(省略)

###Value Types
A plugin can require that the value for a setting be a certain type, such as boolean or hash. The
following value types are supported.
 
[Array](https://www.elastic.co/guide/en/logstash/2.1/configuration-file-structure.html#array)

An array can be a single string value or multiplvalues. If you specify the same setting multiple
times, it appends to the array.

Example:

```
  path => [ "/var/log/messages", "/var/log/*.log" ]
  path => "/data/mysql/mysql.log"
```

#学んだこと
- 公式ドキュメントも注意深く見ることが重要
- 可能性が２つあるならどちらも試す
NodejsからYahoo Wallet Fastpay APIを使う

# 概要
  
　トークンを使ってチャージをしますが、NodejsのAPIライブラリは用意されていません。
　[FastPay APIライブラリ](https://fastpay.yahoo.co.jp/docs/library) ※PHP,Ruby,Pythonのみ（2016.2現在）

  そこで、cURLのパラメータを参考にして、nodejsからAPIを呼ぶ実装を作ってみました。

# 準備
## express
- 今回はexpressjsを使います。express-generatorでテンプレを作成します。

```
npm install express-generator -g
```

## request
- APIへPOSTするのに、requestモジュールを使います。

```
npm install request 
```

# 実装

FastPay.jsのaction：遷移先の実装（部分）です。router.postが呼ばれる想定です。 


```
router.post('fastpay_complete', function (req, res, next) {
    var fastpayToken = req.body.fastpayToken;   // req.bodyで渡されてきます
    var amount = req.body.amount;  //  req.body.amount;
    var yUser = 'yahooFastpay.secret';  // fastpay secret keyです。
    var fastpayApiUrl = 'https://fastpay.yahooapis.jp/v1/charges';
    var fastpayApiProxy = '';  // プロキシがある場合は設定します
    
    request({
        method: 'POST',
        proxy: fastpayApiProxy,
        url: fastpayApiUrl,
        auth: {
            user: yUser,
            pass: ''
        },
        form: {
            amount: amount,
            card: fastpayToken,
            capture: false
        },
        json: true
    }, function (error, response) {
        if ( error ) {
            console.log(error);
        }
        else {
            if( resonse.body.error ){   // fastpay APIからのエラーの場合
                //HTTPステータスコード、Types、Codeなどを見て処理     
            }
            else{
                // 正常系処理
            }
        }
    });
  
});

```

# まとめ
- 上記のような実装で、NodeJs(Express)で使えるようになりました。
- 間違いなどありましたらご指摘ください。
PostgreSQL9.4.5をWindows7にインストールする手順

# やりたいこと
* PostgreSQL9.4.5をWindows7にインストールする。

## 前提環境
* OS: Microsoft Windows 7 Professional 6.1.7601 Service Pack 1 (SP1) ビルド 7601 x64

## インストールするソフトウェア
* PostgreSQL: 9.4.5

## 手順
### インストーラをダウンロード

[Enterprise DB](http://www.enterprisedb.com/products-services-training/pgdownload) で **Installer version Version 9.4.5** と記載されている項目から **Win x86-64** を選択し、インストーラをダウンロードします。
※バージョンは9.4.5に拘らずに最新を選択します。

### インストール

**postgresql-9.4.5-2-windows-x64.exe** をダブルクリックしてインストールを実行します。

#### Microsoft Visual C++ 2013 Redistributable (x64) - 12.0.21005

自動的にインストールされます。

#### PostgreSQL - Setup

1. Installation Directory: C:\PostgreSQL\9.4.1
* Data Directory: C:\PostgreSQL\9.4.1\data
* Password: 任意
* Retype password: 任意
* Port: 5432
* Locale: Japanese, Japan
* Stack Builder may be used to download and install additional tools, drivers and applications to complement your PostgreSQL installation.: OFF

スタートメニューから『pgAdmin III』が起動できるようになります。
C:\PostgreSQL\9.4.5\bin\pgAdmin3.exe

### 完了
EC2のスナップショット2000個くらい一気に削除したコマンド

# AWS EC2のsnapshotを一気に削除するコマンド

某サービスのクローズに伴い諸々撤収作業をしているのだがEC2のスナップショットが2000個くらいあった、
（台数もあり定期スナップショットもしてたからしょうがないっちゃーしょうがないけど放置しすぎｗ）
AWSのコンソールだと５０個ずつしか削除できない40回、怠惰が取り柄のプログラマとしてはそんなことはやってられない。
ということでスクリプトでやっつける！　AWS-CLI！

## 今回登場するAWS-CLIコマンド

``` aws ec2 describe-snapshots```
snapshotの一覧を取得する
http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-snapshots.html

```aws ec2 delete-snapshot --snapshot-id```
snapshotを削除する
http://docs.aws.amazon.com/cli/latest/reference/ec2/delete-snapshot.html

## やりたいこと
スナップショットを一括で削除したい

## 最終的なコマンド
```
aws ec2 describe-snapshots --owner-ids <1234567890>  --filter Name="description",Values="" |grep SnapshotId  | awk '{print $2}' | sed -e 's/[",]//g'|xargs -I{}  aws ec2 delete-snapshot --snapshot-id {}
```

日付とかで絞り込もーと思いましたがで、うまい感じのがなかった・・・
帰ってくるJSONをパースすればいいんだけどそこまでやってるのは面倒だったので、
とりあえずオーナー指定とデスクリプションが空のやつだけ一斉削除

ちなみに
aws ec2 describe-snapshots 
だと

```
        {
            "Description": "",
            "Encrypted": false,
            "VolumeId": "vol-1234567",
            "State": "completed",
            "VolumeSize": 10,
            "Progress": "100%",
            "StartTime": "2015-10-15T09:51:14.000Z",
            "SnapshotId": "snap-987654",
            "OwnerId": "1234567890"
        }
```

このようなJSONが帰ってくるので必要になるSnapshotIDだけ抜き出しました
base::merge()とdplyr::*_join()


対応表 おおむねこんな感じ？


|merge|dplyr|
|:--|--:|
|merge (x, y)|inner_join(x, y)|
|merge (x, y, all.x = TRUE)|left_join(x, y)|
|merge (x, y, all.y = TRUE)| right_join(x,y)|
| merge (x, y, all = TRUE) |full_join(x,y)|

実行例

```
> (x <- data.frame (a = 1:3, b = c ("A", "B", "C"), x1 = 11:13))
  a b x1
1 1 A 11
2 2 B 12
3 3 C 13
> (y <- data.frame (a = 2:4, b = c ("B", "C", "D"), y1 = 21:23))
  a b y1
1 2 B 21
2 3 C 22
3 4 D 23
> # デフォルトでは重複する要素のある行のみ出力
> merge (x, y)
  a b x1 y1
1 2 B 12 21
2 3 C 13 22
> dplyr::inner_join(x, y, by = c("a", "b"))#に相当
  a b x1 y1
1 2 B 12 21
2 3 C 13 22
Warning message:
In inner_join_impl(x, y, by$x, by$y) :
  joining factors with different levels, coercing to character vector
```

ただしb列は、それぞれの水準が異なるので文字列化されている

「x」列を基準に結合

```
> merge (x, y, all.x = TRUE)
  a b x1 y1
1 1 A 11 NA
2 2 B 12 21
3 3 C 13 22
> dplyr::left_join(x, y, by = c("a", "b"))#に相当
  a b x1 y1
1 1 A 11 NA
2 2 B 12 21
3 3 C 13 22
Warning message:
In left_join_impl(x, y, by$x, by$y) :
  joining factors with different levels, coercing to character vector
```

 「y」列を基準に結合

```
> merge (x, y, all.y = TRUE)
  a b x1 y1
1 2 B 12 21
2 3 C 13 22
3 4 D NA 23
> dplyr::right_join(x, y, by = c("a", "b"))#に相当
  a b x1 y1
1 2 B 12 21
2 3 C 13 22
3 4 D NA 23
Warning message:
In right_join_impl(x, y, by$x, by$y) :
  joining factors with different levels, coercing to character vector
```

両方の列要素を網羅した結合

```
> merge (x, y, all = TRUE)
  a b x1 y1
1 1 A 11 NA
2 2 B 12 21
3 3 C 13 22
4 4 D NA 23
> dplyr::full_join(x, y, by = c("a", "b"))#に相当
  a b x1 y1
1 1 A 11 NA
2 2 B 12 21
3 3 C 13 22
4 4 D NA 23
Warning message:
In outer_join_impl(x, y, by$x, by$y) :
  joining factors with different levels, coercing to character vector
```
FileZillaの転送スピードをあげる

#FileZillaの転送スピードをあげたい
仮想サーバーに接続するときなどFileZillaで沢山あげようとするとき転送スピードをあげる方法が2つあるので紹介しておきます。
他にもいい方法をご存知の方いたら教えてください!

##転送するファイルを設定する
.gitファイルなど送りたくないファイルを設定
「メニューバー」→「表示」→「ファイル名のフィルタ」
![スクリーンショット 2016-02-19 13.56.01.png](https://qiita-image-store.s3.amazonaws.com/0/99622/ea2ff558-dfa4-89f0-30b9-f42357b5004e.png "スクリーンショット 2016-02-19 13.56.01.png")

左下の「フィルタルールを編集」から詳細決定画面へ
![スクリーンショット 2016-02-19 13.56.11.png](https://qiita-image-store.s3.amazonaws.com/0/99622/d2d0d64d-3d5d-61e6-2389-aca49ef9a91e.png "スクリーンショット 2016-02-19 13.56.11.png")

「新規」から転送しないファイルを設定
ここでは「.git」ファイルについて紹介するのですが、「ファイル名」、「部分一致」、「git」としてやれば「.git」ファイルは転送しなくてすむようになります。
![スクリーンショット 2016-02-19 14.07.26.png](https://qiita-image-store.s3.amazonaws.com/0/99622/861ef734-8e70-3434-9eb2-7fb6cf8d6552.png "スクリーンショット 2016-02-19 14.07.26.png")

##転送ファイル数を設定
「Filezilla」→「設定」→「転送」から最大同時転送数で10までできるのでこれを10にすることで気持ち、転送スピードが早くなる気がします。
![スクリーンショット 2016-02-19 14.24.13.png](https://qiita-image-store.s3.amazonaws.com/0/99622/02acbebf-e91b-56fa-5b58-637ceaef450d.png "スクリーンショット 2016-02-19 14.24.13.png")
RMeCabでデータフレームのテキスト列を読み込む


docDF() 関数は、ファイル、ファイルフォルダ、データフレームを対象に、文字ないし単語頻度、Ngram頻度などを出力します。
参考 [http://rmecab.jp/wiki/index.php?RMeCabFunctions#icae4377](http://rmecab.jp/wiki/index.php?RMeCabFunctions#icae4377)


```
> library(RMeCab)
> target <- read.csv(text ='
+ ID,Sex,Reply
+ 1,M,写真とってくれよ
+ 2,F,写真とってください
+ 3,M,大きい写真とってね
+ 4,F,写真とってください
+ 5,M,写真とってっす
+ ')

> res <- docDF(target, col = 3, type=1, N=2,pos = c("名詞","動詞"),   Genkei = 1, nDF = 1)
number of extracted terms = 3
now making a data frame. wait a while!

> res
    N1       N2      POS1        POS2 Row1 Row2 Row3 Row4 Row5
1 とっ ください 動詞-動詞 自立-非自立    0    1    0    1    0
2 とっ     くれ 動詞-動詞 自立-非自立    1    0    0    0    0
3 写真     とっ 名詞-動詞   一般-自立    1    1    1    1    1
> library(RMeCab)
> target <- read.csv(text ='
+ ID,Sex,Reply
+ 1,M,写真とってくれよ
+ 2,F,写真とってください
+ 3,M,大きい写真とってね
+ 4,F,写真とってください
+ 5,M,写真とってっす
+ ')


> #おまけ
> #おまけ
>  (res <- docDF(target, col = 3, type=1, N=2,pos = c("名詞","動詞"), nDF = 2))
number of extracted terms = 3
now making a data frame. wait a while!

           TERM      POS1        POS2 Row1 Row2 Row3 Row4 Row5
1 とる-くださる 動詞-動詞 自立-非自立    0    1    0    1    0
2   とる-くれる 動詞-動詞 自立-非自立    1    0    0    0    0
3     写真-とる 名詞-動詞   一般-自立    1    1    1    1    1
> 
```
Git LFSが動かなかった場合の対処

# Git LFSって？

Git Large File Storageの略。
デザインデータなど巨大なファイルを効率よく管理するためのGit拡張。
昨年10月からGitHubも[正式対応した](http://www.publickey1.jp/blog/15/git_lfs.html)ため、手軽に使えるようになった。

ダウンロードはこちら。
https://git-lfs.github.com/

有効化するための手順はこちらを参考にすると分かりやすかった。
http://wp.graphact.com/2015/10/04/setup-git-lfs

# 問題点

基本的に上記URL通りの手順でOK。
ただバイナリパッケージからインストールすると、gitコマンドが`/usr/bin`にいるにもかかわらず、git-lfsが`/usr/local/bin`にインストールされるため、正しくgit-lfsが認識されずにエラーになる模様。

https://github.com/github/git-lfs/issues/846
とかでも話題になってた。

# 対処

El Capitan環境だと`/usr/bin`配下にファイルを配置することはSIPの無効化などが必要で面倒なので、`/usr/bin/git`を`/usr/local/bin/git`にシンボリックリンクを張るのが一番楽かと。

```
$ ln -s /usr/bin/git /usr/local/bin/git

$ which git
/usr/local/bin/git
```

gitの場所が`/usr/bin/git`を指してる場合は、PATHで`/usr/local/bin`より先に`/usr/bin`が設定されてるので、`~/.bash_profile`などを変更して対応する。
簡単な透かしを除去できるソフトを作りました

# 概要
　タイトルの通りです。**「適当な単一色の画像を同じアルファ値でアルファブレンドしただけだと容易に突破される」**ということを警告するために作りました。
　**言うまでもありませんが**、悪用厳禁でお願いいたします。

# 動作原理
　アルファブレンドは、元の色を$X$、重ねあわせるマスクの色を$Y$、マスクを重ねた結果を$Z$、アルファ値(1で不透過)を$A$とした際、$Z=(1-A)X+AY$といった式で表されます。ここで、未知の変数は$A$と$Y$ですので、$[X,Z]$の組を2つ用意すれば逆算できてしまいます。また、これを利用すれば、$[A,Y,Z]$から$X$を算出することも可能です。後は……**お分かりですね？**

# 実装
　とりあえずJavaで書きました。理由は[この記事](http://qiita.com/YSRKEN/items/46b96587268fe59e3dac)と同じく、「画像もGUIもイケるし**HSPで書かなくてもいいから**」といった感じです。

# 結果
　[プロ生ちゃん](http://pronama.azurewebsites.net/pronama/)をサンプルにしたところこんな感じ。もちろん推定に失敗することも多いので、上手くサンプルとなる色の組を考えるのがコツかと(あまり画素値が0や255に近いと推定しづらい)。
**元画像**
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/29802/280dc979-62f3-50ef-4392-d3aaee3021c9.png)
**マスク位置**
![mask.png](https://qiita-image-store.s3.amazonaws.com/0/29802/d136f978-6e5c-b5e9-0060-532fc6dfd44a.png)
**処理成功例**
![output.png](https://qiita-image-store.s3.amazonaws.com/0/29802/c1938e03-eb2c-12e2-486b-303f2b36d8e7.png)
**処理失敗例**
![output2.png](https://qiita-image-store.s3.amazonaws.com/0/29802/c94c45bf-949a-78f2-a898-e366d21f244e.png)

# 配布先URL
https://1drv.ms/u/s!Akwg08hkcP4mgbUz9lZBc1PZFXQAZQ?e=y3iLHM
Pythonを勉強しようかなと思ってるんだけど

Pythonを使う機会が出たので、とりあえず本を見繕おうと思ってます。もし鉄板書だったり、これ読んでないとモグリだろみたいな本があったら教えて欲しいです。

今のところ読もうと思ってる本リスト

+ [Pythonスタートブック](http://www.amazon.co.jp/gp/product/4774142298)
+ [初めてのPython 第3版](http://www.amazon.co.jp/gp/product/4873113938)
+ [ハイパフォーマンスPython](http://www.amazon.co.jp/gp/product/4873117402)
+ [Effective Python ―Pythonプログラムを改良する59項目](http://www.amazon.co.jp/gp/product/4873117569)
ミリオンライブのアイドル詳細情報を取って来る

#ミリオンライブのアイドル詳細情報を取って来る
##概要
アイドルマスターミリオンライブの中で、情報の管理シートを作っているのですが、
最大親愛度、肩書、ファン数など、アイドル詳細情報の更新が面倒だったので、
一括でどうにかできないかと思い作ってみました。

##使用方法
1.`javascript:(function(){var d=document;var s=d.createElement('script');s.src='https://kataoka-daithi.squarespace.com/scripts/million_idolchecker.js'; d.body.appendChild(s)})();`
をブックマークレットに登録
2. ユーザーエージェントを携帯に偽りアクセス(私はコレを使っています「https://goo.gl/HTZBdu」)
3. greeのミリオンライブのページへアクセス
4. 先ほど登録したブックマークレットを実行
5. 実行結果をコピーし、エクセルやgoogleスプレッドシートに貼り付け

##参考にさせていただいたサイト
https://github.com/imas/million-albumchecker

##感想
ほぼほぼ参考にさせていただいたサイトそのままです。
正規表現をもっと綺麗に書きたいですね。
今後もアイマスエンジニアをやっていきたいと思います。
DroidKaigi2016メモ：Support Library総復習

*公式のスライドが出るまでの参考にどうぞ*

## 発表者
* @androhi
* 下川 敬弘
* Zaim Inc.

## Support Libraryの復習
* 後方互換性を確保
* Support Libraryは現在18個
* 新しいOSのバージョンアップとともに増えていく傾向
* なぜSupport Libraryが必要か？
  - 異なるAPIレベルでアプリを実装するために必要
  - 参考) JellyBean, KitKat, Lolipopはほぼ同程度のシェアで存在している

## 今日話さないこと
* Testing周り
* Data Binding周り

## V series
#### v4 Support Library
* Android 1.6 ~
* たくさんAPIを持っている
* Nested Scrooll View
* Design Support Libraryの中で最近存在感を発揮

#### v7 Support Library
* Android 2.1 ~
* v7-appcompat
  - v4-supportに依存
  - マテリアルデザインのためのSupport Library
* v7-recyclerview
  - CalendarView
  - *やっぱカレンダーはどこでもRecylerViewで作るらしい*
* gridlayout
  - そこまで凝ったグリッドレイアウトでなればこちらで十分
* mediarouter
  - chromecastを使うとき使う

#### v8 Support Library
* RenderScriptをサポートするためのライブラリ
* GPUを使った高速描画を実現する

#### v13 Support Library
* Android 3.2 ~
* android.app.Fragmentの中でViewPagerを使うためのライブラリ

#### v14 Support Library
* android.app.Fragmentの中でPreferenceFragmentを使うためのライブラリ

#### v17 Support Library
* android TVのインターフェース用のライブラリ？

#### v17 Leanback Library
* android TVのインターフェース用のライブラリ
* android TV用のThemeが入ってる
* v4-support, v7-recyclerviewに依存

## Speciality series
#### Multidex Support Library
* メソッドの数制限
* v21未満でのビルドに時間が掛かることが公式でも周知されている
#### Annotation Support Library
* @NotNull
  - nullがセットされたときに教えてくれる
* @StringRes
* ...

## Design Support Library
* FloatingActionButton
* NavigationView
* Snackbar
* 新しいデザインパターン
  - CoordinatorLayout, AppBarLayout, NestedScrollView, FloatingActionButton
  - etc...

## Custom Tabs Support Library
* アプリの中にChromeの機能(セッション情報など)を組み込むことができる

## Percent Support Library
* レイアウトファイルを％指定で組むことが可能
* FrameLayout -> PercentFrameLayout
* LinearLayout -> PerccentLinearLayout

## Recommendation Support Library
* Android TV のホーム画面におすすめのコンテンツを表示する領域がある
* これを作るためののライブラリ

## まとめ
* v4, v7 support libraryを使いこなそう
* 必要に応じてspeciality seriesを組み込んでいこう
Jenkinsでクローンしてきたgitのブランチに名前を付ける

# やりたかったとこ

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/71836/e6e3996f-261a-6d5c-9ef7-aafb74b36e67.png)


gitlabにある特定のプロジェクトを、バックアップ先としてAWSのCodeCommitにもプッシュしたい。

なので方法としてはJenkins先生を使って、

1. Gitlabの変更を検知して、Jenkins先生がGitlabをクローンする
2. クローンしたworkspaceをCodeCommitにPush

そんなに難しくなさそうと思ったけど、はまった。

# ここではまった

Jenkins先生はdetached Headの状態でリモートレポジトリをcloneしてくる。
なので、workspaceに行ってブランチ名を確認すると…

```bash
$ git branch
* (detached from 62ehoge)
```
のようにブランチ名でなく(detached from "Commit ID")になってる。

当たり前だけど、これで他のレポジトリにmasterブランチとしてプッシュしても

```
$ git push <another-repo> master
error: src refspec master does not match any.
error: failed to push some refs to <another-repo>
```

ってかんじでmasterブランチなんてねーよ！と言われる。
cloneしてきたときにjenkins内でbranchの名前をつけるにはどうればいいのか。

いろいろ調べて、stackoverflowの[この投稿](http://stackoverflow.com/questions/11511390/jenkins-git-plugin-detached-head)で発見。日本語での記事は見つからなかったのでここに投稿します。

# Additional Behavioursで指定できる

jenkins先生のjobの設定画面でGitセクションの下の方、[Additional Behaviours] -> [Check out to specific local branch]とし、branchnameに好きな名前を入れる。
仮にリモートからmasterブランチしかcloneしないなら、jenkins内でもmasterで名前つけてしまっていいと思う。

Additional Behavioursは全部英語なので読み飛ばしてましたけど奥が深いですなあ。

これでjobを実行してcloneしてきたWorkspaceに行くと

```bash
$ git branch
* master
```

というかんじでmasterというブランチ名になっている。
あとはビルド後のジョブとかで「シェルの実行」で他のレポジトリにpushしてしまえばいい。
manのプレーンテキスト出力


manページがあります。

~~~
$ man bootpd
~~~

![man_bootpd-cap.png](https://qiita-image-store.s3.amazonaws.com/0/56853/6a434dd9-208c-97c5-012a-63cd1c3753c7.png "man_bootpd-cap.png")

※Macのプレビュー表示

社畜なので例えば帰りの電車の中とかでゆっくり読むため、テキストに書き出して読もうとすると…

~~~~
$ man bootpd > ~/Desktop/out_man_bootpd.txt
~~~~

![out_man_bootpd.png](https://qiita-image-store.s3.amazonaws.com/0/56853/cf9c7ce9-cfb0-5c38-5621-a97998eea0f8.png "out_man_bootpd.png")

※Macのプレビュー表示

読めない、てか読みづらい…
太字のところが2文字となっている。
エディタによっては化ける

そこで、いったんcolに渡して「-b」オプションを通して出力すると…

~~~~
$ man bootpd | col -b > ~/Desktop/man_bootpd.txt
~~~~

![man_bootpd.png](https://qiita-image-store.s3.amazonaws.com/0/56853/92b2f0ca-8133-8c22-35e7-2f57f609218b.png "man_bootpd.png")

※Macのプレビュー表示
あら素敵！
普通のテキストファイルになりやんした。
これでシェルスクリプトを書くためにmanを見ながらいつでもどこでも悩むことができるようになりました。
VBAによるIE自動制御


pearltrees
http://www.pearltrees.com/yuaisheng/tree/id9610952

ExcelVBA 逆引き大全 620の極意
http://www.shuwasystem.co.jp/support/7980html/2744.html

Windows Forms
https://en.wikipedia.org/wiki/Windows_Forms

IE Automation Library and Web Macro Recorder
http://codecentrix.blogspot.jp/
http://codecentrix.com/

VBAによるIE自動制御
http://vba-code.net/ie/click-an-image/

```vb

'日経平均のチャートをクリックする
Sub ClickNikkeiChart()
    Dim objIE As Object

    'IE起動
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True

    'Yahooファイナンスに接続
    objIE.navigate "http://finance.yahoo.co.jp/"

    'IEを待機
    Call IEWait(objIE)

    '5秒停止
    Call WaitFor(5)

    '日経平均株価のチャート画像をクリック
    Call IEImageClick(objIE, "s?s=998407.O")

    'IEを待機
    Call IEWait(objIE)

    '5秒停止
    Call WaitFor(5)

    'IE終了
    objIE.Quit

    Set objIE = Nothing
End Sub

'画像をクリックする関数
Public Function IEImageClick(ByRef objIE As Object, imageSrc As String)
    Dim objImage As Object
    For Each objImage In objIE.Document.getElementsByTagName("IMG")
        If InStr(objImage.src, imageSrc) &gt; 0 Then
            objImage.Click
            Exit For
        End If
    Next
End Function

'IEを待機する関数
Function IEWait(ByRef objIE As Object)
    Do While objIE.Busy = True Or objIE.readyState  4
        DoEvents
    Loop
End Function

'指定した秒だけ停止する関数
Function WaitFor(ByVal second As Integer)
    Dim futureTime As Date

    futureTime = DateAdd("s", second, Now)
    While Now &lt; futureTime
       DoEvents
    Wend
End Function
```

```pl
function WaitForLoad($ie)
{
    while($ie.Busy)
    {
        sleep -Milliseconds 50
    }
}

$ie = New-Object -COM InternetExplorer.Application
$ie.Navigate("http://www.google.com")
$ie.Visible = $true
WaitForLoad($ie)
$searchBox = $ie.Document.getElementById("q")
$searchBox.value = "Windows PowerShell"
$goButton = $ie.Document.getElementByID("btnG")
$goButton.click()

```

```pl
function NavigateIE($url)
{
    $ie = new-object -com "InternetExplorer.Application";
    $ie.navigate($url);
    #ie.visible=true;
    [System.Threading.Thread]::Sleep(2000);
    return $ie;
}

function FindTag($params)
{
    $ie = $params[0];
    $tagname = $params[1];
    $contain = $params[2];
    $doc = $ie.document;
    $tags = @($doc.getElementsByTagName($tagname));
    foreach($tag in $tags)
    {
        if($tag.outerHTML.contains($contain))
        {
            $sel = $tag;
            break;
        }
    }
    return $sel;
}

$ie = NavigateIE("http://weibo.com/12321");

$talk = FindTag($ie, "textarea", 'id=publish_editor');

$but = FindTag($ie, "span", 'class=bgColorB');

$talk.value = "test";
$but.click(); 
```
javascript 数値→文字列の変換は + '' が速い

数値を文字列にする。
当たり前のように `toString()` を使っていたら[神様](http://qiita.com/k0sukey)に言われました。
「数値を文字列にするだけなら空文字足した方が早いぞ小童」

１億回ずつ測定してみた。

```js
var num=123, i, times=100000000;

console.time('+ \'\'');
for (i = 0; i < times; i++) {
	num + '';
}
console.timeEnd('+ \'\'');

console.time('toString()');
for (i = 0; i < times; i++) {
	num.toString(10);
}
console.timeEnd('toString()');

console.time('String()');
for (i = 0; i < times; i++) {
	String(num);
}
console.timeEnd('String()');
```

結果：

```
+ '': 284ms
toString(): 843ms
String(): 1252ms
```

ほんとだ、はゃぁ！！ :flushed: 


真偽値（boolean型）でも同様の結果が出るかと思って、試してみた。

結果：

```
+ '': 3524ms
toString(): 1629ms
String(): 1288ms
```

逆転したっ！！？ :scream:
Google App Engine SDK for Goを使ってGAE上でアプリを動かすまで

# 環境
- MacOSX: 10.11.3 
- Python: 2.7.10 ※2.7系じゃないと動作しないっぽいので注意（検証はしていない）
- Google App Engine SDK for Go: 1.9.32 - 2016-02-02

# Google App Engine SDK for Go準備
※ホームディレクトリで作業をする

```shell-session:ターミナル.app
cd ~
```

## ダウンロード

```shell-session:ターミナル.app
curl -O https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_darwin_amd64-1.9.32.zip
```

## 解凍

```shell-session:ターミナル.app
unzip go_appengine_sdk_darwin_amd64-1.9.32.zip
```

※「go_appengine」というフォルダ名で解凍される

## 削除
go_appengine_sdk_darwin_amd64-1.9.32.zipを削除する

```shell-session:ターミナル.app
rm go_appengine_sdk_darwin_amd64-1.9.32.zip
```

## GOPATHの設定
以下の行を追記する

```shell-session:~/.bash_profile
export PATH="$HOME/go_appengine:$PATH"
```

パスの設定を反映

```shell-session:ターミナル.app
source ~/.bash_profile
```

## Go言語のワークスペースを作成
ワークスペース名は任意でOKです。

```shell-session:ターミナル.app
mkdir ~/go_ws
```

# アプリを動かしてみる
## helloworldアプリをコピー
ダウンロードしたフォルダ内にデモアプリが複数用意されているのでワークスペースにhelloworldアプリをコピーする。

```shell-session:ターミナル.app
cp -r ~/go_appengine/demos/helloworld ~/go_ws/
```

## helloworldアプリ ディレクトリに移動

```shell-session:ターミナル.app
cd ~/go_ws/helloworld
```

## helloworldアプリ をローカルで実行

```shell-session:ターミナル.app
goapp serve
```

上記コマンドを実行すると、ターミナル上に以下の情報がアウトプットされる。

```shell-session:ターミナル.app
# 〜省略〜

INFO     2016-02-19 02:29:39,327 dispatcher.py:197] Starting module "default" running at: http://localhost:8080

# 〜省略〜
```

Starting moduleの行のURLをブラウザからアクセスすると、

<img width="243" alt="スクリーンショット 2016-02-19 11.39.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/104056/57e4266d-96b0-04a7-288f-288b9f781b38.png">
上記のように表示される。

ちなみに、goapp serveで起動中にgoファイルを修正すると、自動で再コンパイルしてくれるので、ファイル修正後、ブラウザをリロードすると修正内容が適用されている。

# helloworldアプリ をGAE上で実行
## 事前準備
- Googleアカウントを作成していること

## プロジェクトを作成する
[My console](https://console.cloud.google.com)にログイン後、プロジェクトを作成する。
<img width="357" alt="スクリーンショット_2016-02-19_11_49_37.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/104056/8dba86f1-6c3a-ac39-0459-deeb9f61694b.jpeg">
　　　　　　　　　↓↓↓
<img width="496" alt="スクリーンショット_2016-02-19_11_50_37.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/104056/ec4f90d0-d137-2576-b1e2-0c2037a88a24.jpeg">

## GAEにアップ
プロジェクトを作成した時に発行されたプロジェクトID（\<YOUR_PROJECT_ID_\>）を以下のコマンドにセットし、コマンドを実行します。

```shell-session:ターミナル.app
appcfg.py -A <YOUR_PROJECT_ID_> update ~/go_ws/helloworld/
```

※「\<\>」は必要ありません

## ブラウザ上で実行確認
以下のURLにアクセスすると、「Hello, World!」が表示される。
http://\<YOUR_PROJECT_ID_\>.appspot.com/
<img width="353" alt="スクリーンショット_2016-02-19_13_32_34.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/104056/0e9606b0-0630-fc8b-a55c-e8b0c17c7a6a.jpeg">

# 補足
GAEは、すべてのアプリケーションを対象に、一定の無料枠（毎日リセットされます）が設けられているのでコストは抑えられると思います。

# 参考サイト
- [https://cloud.google.com/appengine/downloads#Google_App_Engine_SDK_for_Go](https://cloud.google.com/appengine/downloads#Google_App_Engine_SDK_for_Go)
- [https://cloud.google.com/appengine/docs/go/](https://cloud.google.com/appengine/docs/go/)
select2 Tips メモ

jQueryライブラリのselect2 https://select2.github.io/ は便利ですが、
ググっても古い情報か英語だったりするのでメモ。
# 値を設定する
普通に設定してもプルダウンが連動しないので、**change** を呼び出す。

```js
var $select = $('.hoge').select2({});
// 値を設定する
$select.val("1").trigger('change');
```
http://stackoverflow.com/questions/19639951/how-do-i-change-selected-value-of-select2-dropdown-with-jqgrid

# フォーカス時にプルダウンを開く

```js
var $select = $('.hoge').select2({});
// フォーカス時にプルダウンを開く
var select2Focus = function(){
  $(this).closest('.select2').prev('select').select2('open');
};   
$select.next('.select2').find('.select2-selection')
.one('focus', select2Focus).on("blur", function () {
  $(this).one('focus', select2Focus)
});

```
http://stackoverflow.com/questions/20989458/select2-open-dropdown-on-focus

# keypressイベントを付け替える(追記 20170826)
ver4.0.0で確認

```js
var $select = $('.hoge').select2({});
// Select2のデータオブジェクトは 以下のように取得する
var select2 = $select.data('select2');
// 元々のkeypressイベント
var keypress = select2.listeners.keypress[0];
							
// 現在のイベントを消す
select2.listeners.keypress=[];
// select2イベント登録。jQueryのものとは若干動作が異なるので注意
select2
.on('keypress', function(evt) {
  // 例えば Enterキーで開くを無効にする
  if (evt.which==13) {
    if (!select2.isOpen()){ 
      return;
    }									
  }
  // それ以外なら元々のイベントを呼び出してみる
　keypress.apply(this, [evt]);
});
```

# keyupイベントを追加してみる(追記 20170826)
ver4.0.0で確認。
定義されているイベント(keypress)とそうでないもの(keyup)がある。

```js
var $select = $('.hoge').select2({});
// Select2のデータオブジェクトは 以下のように取得する
var select2 = $select.data('select2');
// select2には幾つかjQueryオブジェクトがある。$selectionはそれの一つ。
select2.$selection.on('keyup',function(evt){
　　if (evt.which==13) {
　　　　if (!select2.isOpen()){
　　　　　　// 例えば、開いていないとき、Enterキーで何かする
　　　　　　return;
　　　　}
　　}
});						
```
Ubuntuの入力モード切り替えのキーバインドを変更してMac風にする

UbuntuのキーバインドはWindows風なので普段Macを使ってる~~おしゃれ~~ピーポー :triumph:には使いにくい。

Macの日本語キーボードのように「かな」キーと「英数」キーで入力モードを切り替えできるようにしよう。
従来の**「半角/全角」キーによる切り替えもそのまま残す**こともできる。


#環境
Ubuntu 15.04 
IME:Mozc（おそらく大体何でも可能）

#方法

1.メニューバー右上のIMEのロゴをクリック。「**設定**」を開く


![メニューバー.png](https://qiita-image-store.s3.amazonaws.com/0/94774/492f19ee-c36e-7b93-e8f1-b811b954a58a.png)



2.入力メソッドの設定というウインドウが開くので、「**全体の設定**」をクリックするとこんな感じのメニューが出てくる。


![入力メソッドの設定.png](https://qiita-image-store.s3.amazonaws.com/0/94774/61f5ee4b-0619-343f-bf88-16bab4cdca81.png)



3.左下の「**拡張オプションの表示**」を選択。


4.「**ホットキー**」タブの「**入力メソッドをオンに**」の「空」と書いてあるところをクリックすると入力モードになる。


![入力メソッドオンorオフ.png](https://qiita-image-store.s3.amazonaws.com/0/94774/ff18dc61-d5c3-25c8-f447-7962c1e811d9.png)



5.Mac風にしたい方は**変換**キーを、俺流にしたい方は好きなところを押す。


6.こんな感じになれば成功！　簡単。


![成功.png](https://qiita-image-store.s3.amazonaws.com/0/94774/9c4a6845-a69e-c7e0-46ac-a2e65fdd9439.png)


7.「**入力メソッドをオフに**」も同様に、**無変換**キーをバインドする。


####おまけ


「**入力メソッドのオンオフ**」の、**全角/半角**キーを残したままにすれば従来型の入力モード切り替え方法も維持できる。自分はそれに加えて**カタカナ・ひらがな・ローマ字**キーも追加して使っている。



おわり。
これで普段Mac使いの人もUbuntuでの入力にイライラすることがなくなるはず。 :+1:
EntityFramework 6で接続文字列から規定のスキーマ名を設定する

DbModelBuilderクラスのHasDefaultSchemaメソッドにスキーマ名を指定することで、TableAttributeでSchemaを指定しない場合の規定のスキーマを設定できますが、環境ごとにスキーマを分けたいときに困るので、接続文字列から規定のスキーマ名を設定するようにしました。

DbContextを継承したクラスで、HasDefaultSchemaメソッドに接続文字列から取得したUSER IDの値を与えます。
スキーマ名は、大文字でないとOracleにテーブルが無いと怒られるため、ToUpperメソッドで大文字にしています。

```vbnet
Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
    Dim schema = ""
    If ParseConnectionString(Me.Database.Connection.ConnectionString).TryGetValue("USER ID", schema) Then
        modelBuilder.HasDefaultSchema(schema.ToUpper())
    End If
End Sub

Private Shared Function ParseConnectionString(connectionString As String) As IDictionary(Of String, String)
    Return connectionString.Split(";"c).
        Select(Function(item As String) item.Split("="c)).
        ToDictionary(
            Function(itemArray) itemArray.First.ToUpper(),
            Function(itemArray) itemArray.ElementAtOrDefault(1)
        )
End Function
```
HTML5のVideo/AudioをモバイルOSで自動再生する

iOSやAndroidのモバイルブラウザでは、VideoやAudioのautoplayをすることはできないという制約があります。

（この制約について、詳しく知りたい方はこちらさんを参照ください）
[iOS/Android で HTML5 の audio/video を任意のタイミングで再生する方法](http://dsuket.hatenablog.com/entry/2013/05/05/101430)

しかしどうしても自動再生したい場合は、iOSもAndroidもアプリ化してWebViewの設定を変えてあげればできるようになってます。

```swift:iOS
webView.mediaPlaybackRequiresUserAction = false;
```

```Java:Android
webView.getSettings().setMediaPlaybackRequiresUserGesture(false);
```

どちらも似たようなメソッド名ですね。
docker-machineがHost only adapterのエラーで死亡

## ERROR

> server$ docker-machine start
Starting "default"...
(default) Check network to re-create if needed...
Error setting up host only network on machine start: VirtualBox is configured with multiple host-only adapters with the same IP "192.168.99.1". Please remove one.

## 解決
VBoxManage hostonlyif remove [adaptername]

hostonlyのアダプタを削除したら良い

### メモ
Docker-machineでdefaultを一旦removeして，その後またcreateしたけどその必要はなかったと思う．
CentOSにElasticSearchをインストールする



#Javaをインストール

Javaが必要なのでインストールする

```
yum -y install java-1.8.0-openjdk-devel.x86_64
```


#yumレポジトリの追加

```
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
```

```
vim /etc/yum.repos.d/elasticsearch.repo
```

```repo:elasticsearch.repo
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
```

#インストール

```
yum install elasticsearch
```

起動

```
/etc/init.d/elasticsearch start
```



#確認

```
curl localhost:9200
```

```
[root@b1d204be4849 /]# curl localhost:9200
{
  "name" : "Kilmer",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.2.0",
    "build_hash" : "8ff36d139e16f8720f2947ef62c8167a888992fe",
    "build_timestamp" : "2016-01-27T13:32:39Z",
    "build_snapshot" : false,
    "lucene_version" : "5.4.1"
  },
  "tagline" : "You Know, for Search"
}
```



#kuromojiインストール

```
/usr/share/elasticsearch/bin/plugin install analysis-kuromoji
```


##インストールされているか確認

```
curl -X GET localhost:9200/_nodes/plugins?pretty
```

```
{
  "cluster_name" : "elasticsearch",
  "nodes" : {
    "ZbA9wH8NSaKORP0o-mR1Pg" : {
      "name" : "Kilmer",
      "transport_address" : "127.0.0.1:9300",
      "host" : "127.0.0.1",
      "ip" : "127.0.0.1",
      "version" : "2.2.0",
      "build" : "8ff36d1",
      "http_address" : "127.0.0.1:9200",
      "plugins" : [ {
        "name" : "analysis-kuromoji",
        "version" : "2.2.0",
        "description" : "The Japanese (kuromoji) Analysis plugin integrates Lucene kuromoji analysis module into elasticsearch.",
        "jvm" : true,
        "classname" : "org.elasticsearch.plugin.analysis.kuromoji.AnalysisKuromojiPlugin",
        "isolated" : true,
        "site" : false
      } ],
      "modules" : [ {
        "name" : "lang-expression",
        "version" : "2.2.0",
        "description" : "Lucene expressions integration for Elasticsearch",
        "jvm" : true,
        "classname" : "org.elasticsearch.script.expression.ExpressionPlugin",
        "isolated" : true,
        "site" : false
      }, {
        "name" : "lang-groovy",
        "version" : "2.2.0",
        "description" : "Groovy scripting integration for Elasticsearch",
        "jvm" : true,
        "classname" : "org.elasticsearch.script.groovy.GroovyPlugin",
        "isolated" : true,
        "site" : false
      } ]
    }
  }
}
```



メモ代わりに



#参考資料
[Elasticsearch を yumでインストール (CentOS)](http://qiita.com/inouet/items/6276c5a08c4fe5eecdb5 "Elasticsearch を yumでインストール (CentOS)")
CodeIQの問題をScalaで解く :『プラス・マイナス・ゼロ』問題

ちゃきちゃきのJavaプログラマですが、ここ最近Scalaを勉強中です。（２、３年前にもチャレンジしましたがその時は挫折しました。。。）
Scalaの本当の力を引き出すには関数型プログラミングを深く知る必要があるようなのですが、その辺はまだまだ修行不足です。
とりあえずScalaのコーディングに慣れるためCodeIQの問題に挑戦して行きたいと思います。
今回の問題はこちら。
[数学の問題をプログラミングで解こう！「プラス・マイナス・ゼロ」問題解説](https://codeiq.jp/magazine/2016/02/37963/)

```
import java.util.Scanner

import scala.collection.mutable

object Main {
  def main(args: Array[String]) = {
    val n = new Scanner(System.in).nextLine().toInt
    val memo = mutable.Map[(Int,Int), Long]().empty

    def g(n:Int, s:Int):Long = {
      memo.get((n, s)) match {
        case Some(v) => v
        case None if n == 1 => if(s == 1 || s == -1) 1 else 0
        case _ => memo((n, s)) = g(n-1, s - n) + g(n-1, s + n); memo((n,s))
      }
    }

    println(g(n, 0))
  }
}

```

解法の詳しい解説は先程のページに任せるとして、実は上記コードは提出したものとは別ものです。。。
解説ページや[他の人が公開したコード](http://togetter.com/li/933510)を見て自分の書いたものの稚拙さを反省して書き直しました。

ホントに提出したコードはこちら。

```
import java.util.Scanner

import scala.collection.mutable

object Main {
  def main(args: Array[String]): Unit = {
    val scanner = new Scanner(System.in)
    val n = scanner.nextLine().toInt
    val memo  = mutable.Map[String, Long]()

    /**
      * 1からnまでの数字をプラスマイナスして0になるパターンを再帰的に求める。
      * @param currentSum 現在の和
      * @param currentNum 現在の数字
      * @return パターン数
      */
    def countZerosum(currentSum:Int, currentNum:Int):Long = {
      val memoKey = currentSum + "-" + currentNum
      if(memo.contains(memoKey)) {
        return memo(memoKey)
      }

      if(currentNum > n) {
        if(currentSum == 0) {
          return 1
        }else{
          return 0
        }
      }

      val nextNum = currentNum + 1
      val count = countZerosum(currentSum + currentNum, nextNum) + countZerosum(currentSum - currentNum, nextNum)

      memo(memoKey) = count

      count
    }

    val result = countZerosum(0, 1)

    println(result)
  }
}
```

出力結果は間違ってないのですが、エレガントさに欠けますね。
単にJavaのコードをScalaで書き直しただけという感じです。
nginx で複数のサーバにリクエストを複製する

nginx で構築したリバースプロキシで、受け取ったリクエストを別のサーバへ複製する（L2SW のミラーポートの HTTP 版のようなイメージ）。

以下のように `post_action` を使います。この例だと `http://localhost:8000` がもともとのプロキシ先で、同じリクエストが `http://localhost:8001` に複製されます。

```
server {
    listen 8080 default_server;
    server_name _;

    location / {
        proxy_pass http://localhost:8000;
        post_action @mirror;
    }

    location @mirror {
        internal;
        proxy_pass http://localhost:8001;
    }
}
```

数珠つなぎにして、複数のサーバへ複製することもできます。

```
server {
    listen 8080 default_server;
    server_name _;

    location / {
        proxy_pass http://localhost:8000;
        post_action @mirror1;
    }

    location @mirror1 {
        internal;
        proxy_pass http://localhost:8001;
        post_action @mirror2;
    }

    location @mirror2 {
        internal;
        proxy_pass http://localhost:8002;
        post_action @mirror3;
    }

    location @mirror3 {
        internal;
        proxy_pass http://localhost:8003;
    }
}
```

- クライアントには `post_action` ではないプロキシの結果が返る
    - 上の例では `http://localhost:8000`
    - 仮にこのプロキシをメインプロキシと呼ぶ
    - メインプロキシが 500 とかで、他が 200 でも、クライアントへは 500 が返る
    - 逆に、メインプロキシが 200 で、他が 500 とかでも、クライアントへは 200 が返る
- メインプロキシが結果を返せばクライアントに結果が返される
    - その他のプロキシの応答が遅くてもクライアントへの応答速度は変わらない
- プロキシへのリクエストは順番に行われる
    - リクエストが終わったら次へ、それも終わったら次へ、のように
- アクセスログはすべての `post_action` が終わったときに書き込まれる
    - ステータスコードは最後の `post_action` の結果が書き込まれる
        - 上の例では `http://localhost:8003`
        - クライアントに応答したステータスコードとは異なることがある
    - レスポンスサイズにはメインプロキシの結果が書き込まれる
        - 上の例では `http://localhost:8000`
        - クライアントに応答したレスポンスサイズと同じ
    - ちぐはぐ？
- アンドキュメンテッド？
    - http://nginx.org/en/docs/dirindex.html

## 参考

- [Copy and deliver a request to another nginx server for real traffic testing - Server Fault](https://serverfault.com/questions/515284/copy-and-deliver-a-request-to-another-nginx-server-for-real-traffic-testing)
- [Any caveat in using post_action?](http://mailman.nginx.org/pipermail/nginx/2012-November/036199.html)
Ubuntuの端末内でCtrl+CやCtrl+Vを有効にしてコピーをペーする!

Macならデフォルトでターミナル内で、⌘+C,⌘+Vでコピペが出来るがUbuntuではなぜかそうはいかない。

快適なコピペライフを送るためにぱぱっと設定してしまおう。いちいち薬指と小指でShift+Ctrlを押したり逐一右クリックしたりするのは疲れる。

追記：
Ctrl+Cはプロセスの停止を行うコマンドと重複していて、コピーにバインドした際にプロセスの停止が出来なくなる。
~~**Superキーで代用**~~するほうがいいかも。
追記２:
Super+CやSuper+VがDashのコマンドと重複していたため、見たくもない画像や動画をおすすめしてくる(しかもコピペできない)という糞仕様であることが判明。


#環境
Ubuntu 15.04 


#方法
1. 端末を開く。
2. メニューバー「編集」から「設定」をクリックする。
3. 設定ウインドウが開くのでショートカットを選択。
![Screenshot from 2016-02-19 13:15:21.png](https://qiita-image-store.s3.amazonaws.com/0/94774/a1c799ba-e05c-2cf1-35a7-a72c6ecf2520.png)
4. 「編集」欄の「コピー」操作のショートカットキーをクリック。デフォルトだと「Shift+Ctrl+C」って書いてあるはず。
5. 「新しいアクセラレータ」という表示に変わるので、任意のキーを押す。普通はCtrl+C。
![Screenshot from 2016-02-19 13:15:55.png](https://qiita-image-store.s3.amazonaws.com/0/94774/dd4f8b35-d897-d573-98d8-87b55df2e203.png)


6. ショートカットキーの欄がCtrl+Cになったはず。ペーストも同様に4からやる。


検索なんかも設定し直すと快適。


おわり。


#追記
このままだと**プロセスを停止させることが出来なくなる**。
CtrlキーをSuperキーで代用することも考えたが、標準のUnity環境下だとdashが起動してしまう。

###対策
1. プロセスの停止を諦める。(Ctrl + Dで代用する)
2. コピーは右クリックで我慢する(/ω;)

ちょっと悔しいが、有効な解決策が見つかるまでとりあえず我慢。
John Carmack Interview 2

http://qiita.com/7of9/items/fdd457fdb5d959ccd5b2
の続き

John Carmack
https://www.youtube.com/watch?v=sWRctnQU2F4&index=55&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4

以下、INTはインタビューしている人。John(または無記名)はJohn Carmack。

(00:32-)
... you could do <font color=red>XXX</font> special effects, you can tell that <font color=blue>put hardware here</font>, just you could do, like bumpy shiny water, bumpy shiny spheres, things are gimmicks really, there's not a lot of <font color=red>XXX</font> to do that.

(00:42-)
So, what I've always pushed on is, trying to bring a fundamentally better level of everything in the world where <font color=blue>in set of saying</font>, well, we'll put the bump map on the some special thing, everything has the bump map, or you know, everything has the specular map...

赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。

やはり、結構細かい部分が聞き取れていない。

in set of saying は調べたが該当無し。
Arduino IDE > Link > インラインアセンブラを使う

Arduino IDEにてアセンブラが使えるのかどうか。

以下を見つけた。
http://d.hatena.ne.jp/pcm1723/20151202/1449061241

` __asm__ __volatile__([アセンブラ])`

上記は未検証。

以下はAVRにて使っている例 (`__asm__("nop\n\t"); `)
http://playground.arduino.cc/Main/AVR


no operationの最後にタブのコードを入れるのか。

なお、アセンブラは使ったことがない。
CASTLEというもので20年くらい前に出てきた気がする。
jquery-i18nとi18nextで画面メッセージを国際化する

# 概要
- 画面メッセージの国際化を行いたい。
- 画面はReactで一部作成してしまい、残りはjQueryなどで実装。

なんてことがありました。今後Reactに画面を置き換えることを考えても、コストをなるべく低く抑えたい。そんな時に取った手法。

# 解決法
jquery-i18n+i18nextを利用すると、以下の利点が得られる。
- メッセージリソースファイルをフルReact実装にしても使いまわせる。
　→メッセージをjsonで保持可能。React用のi18nコンポーネント「React-Intl」や「react-i18n」はjsonファイルをメッセージリソースファイルとして利用可能。

# 実装方針
以下のコードをjsとして定義しておく。（例です）

```
// ブラウザの設定を読み込んで言語設定を取得
var lang = navigator.languages ? navigator.languages[0] : (navigator.language || navigator.userLanguage);
lang = lang.split("-")[0];
i18next.use(i18nextXHRBackend).init({
    lng: lang,
    debug: false,
    fallbackLng : false,
    defaultLng : 'en',
    backend : {
        loadPath: '/system/locales/{{lng}}/{{ns}}.json'
        // http://<IPAddress>/system/locales/<lng>/<namespaces(default:translation)>.jsonにアクセスする。
    }
}, function(err, t) {
    i18nextJquery.init(i18next, $);
    $("[data-i18n]").localize();
});
```

画面側はこんな感じで実装すれば、切り替わる。

```
<th data-i18n="sample.component.name">Name</th>
<th data-i18n="sample.component.endpointurl">EndpointURL</th>
<th data-i18n="sample.component.address">Address</th>
```

jsonファイルは以下のように指定可能。
/system/locales/en/translation.json

```
{
"sample": {
    "component": {
        "name": "Name",
        "endpointurl": "EndpointURL",
        "address": "Address"
        }
    }
}
```

/system/locales/ja/translation.json

```
{
"sample": {
    "component": {
        "name": "名前",
        "endpointurl": "エンドポイントURL",
        "address": "アドレス"
        }
    }
}
```

jQueryのモーダルダイアログ内のメッセージ出力を国際化とか、実際にフルReactの画面に適用してみるとか、そういう話はまたおいおい。
[SQL]特定の文字コード領域を指定して文字の出現回数をランク付けする

人名外字の使用頻度をランク付けする方法をメモします。

##環境
SQL Server 2014

##目的
ある顧客情報が格納されているテーブル（仮にCUSTOMER_INFOとします）から、使用された人名外字の回数をランキングで取得する。
*人名外字は、特定の文字コード領域に割り当てられているものとする。
(例:0x8440～0x844F)*

##テーブル構成(仮)
必要カラムのみ抜き出して簡略化してますがだいたいこんな感じです。

```
[ORDER_NO] [char](13) NOT NULL,
[FAMILY_NAME] [varchar](20) NULL,  -- 姓
[FIRST_NAME] [varchar](20) NULL    -- 名
```

##期待する結果(例)
> 1 , 髙, 100
> 2 , 﨑, 99
> 3 , 邉, 80
> …
> 10, 齋, 20

##指定文字の出現数カウント
下記クエリで指定文字の出現数を数えることは可能ですが、この方法だと外字の個数分だけの行数を書くことになってしまい、SQL文の生成自体も大変だし、めちゃくちゃ重いクエリとなるのであまりよろしくないです。

```lang:SQL
--例「あ」～「お」までの出現数を数える
SELECT
	SUM(LEN(FAMILY_NAME) - LEN(REPLACE(FAMILY_NAME, 'あ', ''))) 
		+ SUM(LEN(FIRST_NAME) - LEN(REPLACE(FIRST_NAME, 'あ', ''))) AS 'あ',
	SUM(LEN(FAMILY_NAME) - LEN(REPLACE(FAMILY_NAME, 'い', ''))) 
		+ SUM(LEN(FIRST_NAME) - LEN(REPLACE(FIRST_NAME, 'い', '')))AS 'い',
	SUM(LEN(FAMILY_NAME) - LEN(REPLACE(FAMILY_NAME, 'う', ''))) 
		+ SUM(LEN(FIRST_NAME) - LEN(REPLACE(FIRST_NAME, 'う', ''))) AS 'う',
	SUM(LEN(FAMILY_NAME) - LEN(REPLACE(FAMILY_NAME, 'え', ''))) 
		+ SUM(LEN(FIRST_NAME) - LEN(REPLACE(FIRST_NAME, 'え', ''))) AS 'え',
	SUM(LEN(FAMILY_NAME) - LEN(REPLACE(FAMILY_NAME, 'お', ''))) 
		+ SUM(LEN(FIRST_NAME) - LEN(REPLACE(FIRST_NAME, 'お', ''))) AS 'お'
FROM CUSTOMER_INFO
```

##RANK()関数によるランク付け
すべての外字を格納するテーブルを別に作ることができるならば、以下のようにすれば期待する結果が得られます。

**外字格納用テーブル**

```lang:SQL
CREATE TABLE [dbo].[external_character] (
  chara varchar(2) NOT NULL ,
  CONSTRAINT [pk_external_character] PRIMARY KEY CLUSTERED 
  (
    chara
  )
);
```
あらかじめこのテーブルに集計対象の外字を流し込んでおきます。

**集計用クエリ**

```lang:SQL
SELECT
RANK() OVER(ORDER BY COUNT(*) DESC) AS ランキング,
external_character.chara AS 文字,
COUNT(*) AS 出現数
FROM external_character, CUSTOMER_INFO
WHERE (CUSTOMER_INFO.FAMILY_NAME + CUSTOMER_INFO.FIRST_NAME) LIKE ('%' + external_character.chara + '%')
GROUP BY external_character.chara
```

###注意点
- 一つのレコードに同じ外字が複数回入ってくることを考慮していません。 
- RANK()はSQL Server 2005以降で使用可能です。 
- レコード数次第で重たくなる可能性がありますので注意してください。