OmniAICreator/Qiita-1.07M huggingface dataset:
Using ES6 style {a, b, c} hash construct in Ruby


ES6 ships with a very handy syntax sugar to build Object(aka Hash in Ruby). 

```Javascript
var year = 2016;
var month = 3;
var day = 30;
var theDate = { year, month, day };
```

Can I use the syntax in ruby? calling something simple as ```HandyHash(:year, :month, :day)```?

To get the variable values, the method ```#HandyHash``` must be aware of the context who calls him. This is not recommend in Ruby.
If you pass bindin to the method, the paramaters become ```(binding, :year, :month, :day)```... Weird. Why I should call binding here.

Another approach to get the caller context binding is to pass a block defined in it. To get the hash keys, I decide to wrap an array in the block.

```Ruby
def HandyHash(&list_block)
  variables = yield.map(&:to_s)
  Hash[
    variables.map do |variable|
      [variable.to_sym, list_block.binding.local_variable_get(variable)]
    end
  ]
end
```

Suppose you have ```year, month, day = 2016, 3, 30```. Then you can build the Hash with ```HandyHash{[:year, :month, :day]}```.

I have wrapped the logic in to a gem called [simple_hash](https://rubygems.org/gems/simple_hash) (the Github repo is [here](https://github.com/karloku/simple_hash)).
Range<Int> に distance 作って Int に指定範囲で乱数を作成させる extension

まあよくありますよね皆さんも多分、例えば「0 から 256 までの乱数を作りたい」とかいう要望。

一応公式で教えてるやり方ですと `arc4random_uniform(_: UInt32)` と言う方法を使えとのことですが毎回毎回これやるのだるいじゃん？だってこいつだけ基本欲しいの `Int` 型だけどこいつだけ引数も戻り値も `UInt32` じゃん？毎回毎回こいつのために型変換するの面倒いしそれにこれは 0 から `uniform` される数字までの値しか生成されないから逆に言うと 0 からでないランダム数が欲しいときだとさらに面倒い記述が求められるから超絶にだるい。というわけで `extension` で楽に作る方法を実装してみます：

```swift
//普通に distanceTo を使うからこの方法やめる	
//extension Range where Element: IntegerType {
extension Range {
	
	//普通に distanceTo を使うからこの方法やめる	
	//var distance: Element {
	//	return self.endIndex - self.startIndex
	//}
	
	var distance: Element.Distance {
		return self.startIndex.distanceTo(self.endIndex)
	}
	
}

extension Int {
	
	static var random = {(range: Range<Int>) -> Int in
		let distance = {(distance: Int) -> UInt32 in
			guard distance <= Int(UInt32.max) else {
				return UInt32.max
			}
			return UInt32(distance)
		}(range.distance)
		let randomUInt = arc4random_uniform(distance)
		return Int(randomUInt) + range.startIndex
	}
	
}


let a = Int.random(-127 ..< 128)
let b = Int.random(-127 ..< 128)
```

説明は…要りますかね？まあ分からないことあったらコメントで教えてください

とりあえず一つだけ多分ちょっとわからない人が多そうなのは `extension Range where Element: IntergerType` のところかな？ここは要するに `Range` の要素の型を `IntegerType` に限定するジェネリックスエクステンションです。本当なら別に限定する必要はないはずだったんだけどまさか実は Swift では `-` って演算子はジェネリックス対応ではなかったとは…

そして使い方も上記のコードで分かるとおり `Int.random(範囲)` で作れば OK です。上記のサンプルコードだと `a` と `b` の `-127 ..< 128` までの範囲の乱数を二つ作ってることになります。`Range` 型なので非常に簡単に範囲指定ができちゃうからソースコードも結構読みやすいではないかと。

ただ当然ですが一つ気をつけないといけないのは `Range<Int>` の `distance` プロパティーは `endIndex - startIndex` で作ってるので、例えば `Int.min ..< Int.max` の `Range` の `distance` を求めるとオーバーフローでクラッシュします。
brew upgrade docker で失敗したので brew update しました。

brew upgradeしたときのエラーです(☝ ՞ਊ ՞)

# docker を brew でインストール

```
brew install docker docker-compose docker-machine
```

# dinghyをインストール

```
brew tap codekitchen/dinghy
brew install dinghy
```

しかし警告

```
dinghy create --provider=virtualbox
docker version 1.8.1 is too old, please upgrade to version 1.10.0
```
too old と言われています。

# brew update dockerが失敗

```
brew upgrade docker
Error: docker 1.8.1 already installed
```
だめっぽいのでbrewを上げないとだめかも

# brew を update

```
brew update
```

# brew upgrade docker

```
brew upgrade docker
```
今度はうまくいきました＼(^o^)／
ちょこっとIT系ブックマーク

ちょこっとIT系のリンク。
エンジニア、IT技術者、情報科学の学生あたりが若干参考になるかと。

# プログラミング
- [言語処理100本ノック2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/) → Python
- [チームラボオンラインスキルアップ課題](https://team-lab.github.io/skillup/)
- [Javaコーディング規約2004-電通国際情報サービス](http://objectclub.jp/community/codingstandard/JavaCodingStandard2004.pdf)
- [Dive Into Python 3 日本語版](http://diveintopython3-ja.rdy.jp/)
- [プログラミング学習サイト16個まとめました。](http://programming-study.com/trouble/programming-site/)

# 教科書
- [Linux標準教科書](https://www.lpi.or.jp/linuxtext/file/linuxtext_ver1.1.0.pdf)
- [安全なウェブサイトの作り方](https://www.ipa.go.jp/security/vuln/websecurity.html)
- [小悪魔女子大生のサーバエンジニア日記](https://co-akuma.directorz.jp/blog/)
- [IT eBook](http://www.itmedia.co.jp/keywords/atmarkit_ebook.html)
- [IPA SEC BOOKS](http://www.ipa.go.jp/sec/publish/index.html)

# 論文・学会
- [情報検索 (IR) 分野の国際会議と論文誌](http://d.hatena.ne.jp/sleepy_yoshi/20100207/p1)
- [論文英語ナビ](http://www.shiga-med.ac.jp/~koyama/eng/eng-index.html) → 英語論文の書き方
- [WikiCFP](http://www.wikicfp.com/cfp/)

# 便利系
- [Realtime Board](https://realtimeboard.com/)
- [Bluetooth4.0+LE対応 紛失防止タグ](http://www.ratocsystems.com/products/subpage/seek2.html)
- [Cu-hacker](https://cu-hacker.com/site) → スケジューリング専用カレンダーサービス
- [Brabio!](http://brabio.jp/) → プロジェクト管理ツール，ガントチャート
- [XMind](https://jp.xmind.net/) → マインドマップ
- [MindMaple](http://www.mindmaple.com/) → マインドマップ
- [Twitlistmanager](http://twitlistmanager.com/index.php)
- [Google Search Console - 古いコンテンツの削除](https://www.google.com/webmasters/tools/removals) → 検索インデックス削除申請が可能
- [Goolge Apps Toolbox](https://toolbox.googleapps.com/apps/main/) → DNSやメールヘッダーを確認できる
- [illumicap](http://www.illumicap.com/) →　光るボトルキャップ

# 情報サイト
- [マチノコト](http://machinokoto.net/)
- [TechCrunch Japan](http://jp.techcrunch.com/)
- [ITmedia](http://www.itmedia.co.jp/)

# セットアップメモ
- [gensim セットアップ](http://kakakazuma.hatenablog.com/entry/2015/10/29/134046)
- [MeCab セットアップ](http://wiki.javazuki.com/centos-mecab-install)
Facebook iOS SDK 3.23.0 で weak reference エラーが出るので手動で回避する

# より良い解決方法

[CocoaPodsの設定でビルドエラーを回避](http://qiita.com/horobetsu/items/d2cc0f1f94079ac5d77d)

以下は、上の回避方法を見つける以前の記事。

## エラー内容

CocoaPodsで依存管理している Facebook iOS SDK 3.23.0 でビルドエラーが発生。
メッセージ内容： Cannot create __weak reference in file using manual reference counting

## 対処方法

メッセージの通り、weakリファレンスを許可すれば良い。*Podsの*プロジェクト設定から行う。

1. Podsプロジェクトを選択
2. TargetをFacebook-iOS-SDKとする
3. Build Settings タブを選択する
4. weakで検索して、Weak References in Manual Retain Release を Yes にする

![一般用.png](https://qiita-image-store.s3.amazonaws.com/0/20160/a6244a4e-7ca1-906a-928d-bcd89a2bbbbd.png)

## APPENDIX：なぜこんな古いSDKを使っている？

~~メジャーアップデートをすると、Facebook連携を行った際にFacebookネイティブアプリで認証されず、Safariによって認証が行われるため、ユーザビリティが落ちると判断し、ぎりぎりまで粘って使っています。~~
検証してみたところ、Safari認証でもCVRは低下せず、ユーザビリティに影響はないことがわかったので、現在は最新版を用いています。FBの中の人も、Safari認証の方がCVRはむしろ良いのだと言っていました。
Python 2D plot で凡例の印を一つに表示する方法

Python初心者のメモ。内容の間違いなどご注意ください。

    import matplotlib.pyplot as plt
    import numpy as np
    
    def test():
        x = np.array([1,2,3,4,5])
        y = np.array([1,2,3,4,5])
        
        plt.plot(x, y, 'o', label="x and y")
        plt.legend()
        plt.show()
        
        plt.plot(x, y, 'o', label="x and y")
        plt.legend(numpoints=1) # numpointsを１に設定する
        plt.show()
        
    if __name__ == '__main__':
        test()


Before: 

<img width="631" alt="スクリーンショット 2016-03-30 20.05.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/108866/ddee5d44-e203-aa16-f173-a1785c020949.png">

After:

<img width="626" alt="スクリーンショット 2016-03-30 20.06.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/108866/1d111557-47ef-98b1-ecbd-9659b0d415a4.png">
Java の double を素直な String にしたい、E 要らない

Java でいろんな double を普通に文字列にするのが簡単にいかなかったのでメモ。限られた需要だと思うので今後参照するか微妙だが。

ゼロがいくら並んでもいいので、指数表記はやめて素直な文字列にして欲しい問題

最初に結論
----------

[`BigDecimal#toPlainString()`][1] を使う:

~~~~~~~~~~~~~~~~~~~~java
double d1 = 0.00000000000000000000000000000000000000000123456789012345678901234567890d;
double d2 = 1234567890123456789012345678900000000000000000000000000000000000000000000d;
double d3 = 1234567890.1234567890123456789d;

System.out.println(BigDecimal.valueOf(d1).toPlainString());
// 0.0000000000000000000000000000000000000000012345678901234568
System.out.println(BigDecimal.valueOf(d2).toPlainString());
// 1234567890123456800000000000000000000000000000000000000000000000000000000
System.out.println(BigDecimal.valueOf(d3).toPlainString());
// 1234567890.1234567
~~~~~~~~~~~~~~~~~~~~

注意点としては、コンストラクタ [`BigDecimal(double)`][2] は避けて、静的メソッドの [`BigDecimal.valueOf(double)`][4] を使う点。理由に関しては `BigDecimal(double)` のドキュメントを参照すること。

〜はダメなの？
---------------

↑に至るまでに試したこと

### `Double.toString(d)` はダメ

掲題や冒頭でも書いたとおり、特定の条件で指数表記になってしまう。その条件に関してはドキュメントをみること。

`Double.toString(double)` の仕様: http://docs.oracle.com/javase/jp/8/docs/api/java/lang/Double.html#toString-double-

~~~~~~~~~~~~~~~~~~~~~~java
double d1 = 0.00000000000000000000000000000000000000000123456789012345678901234567890d;
double d2 = 1234567890123456789012345678900000000000000000000000000000000000000000000d;
double d3 = 1234567890.1234567890123456789d;

System.out.println(Double.toString(d1));
// 1.2345678901234568E-42
System.out.println(Double.toString(d2));
// 1.2345678901234568E72
System.out.println(Double.toString(d3));
// 1.2345678901234567E9
~~~~~~~~~~~~~~~~~~~~~~

### `String.format("%f", d)` もダメ

double のすべての桁を出力するには [Formatter][3] で書いてあるところの、width と precision を導出する必要がある。それやるくらいだったら自分で頑張る。

[1]: http://docs.oracle.com/javase/jp/8/docs/api/java/math/BigDecimal.html#toPlainString--
[2]: http://docs.oracle.com/javase/jp/8/docs/api/java/math/BigDecimal.html#BigDecimal-double-
[3]: http://docs.oracle.com/javase/jp/8/docs/api/java/util/Formatter.html
[4]: http://docs.oracle.com/javase/jp/8/docs/api/java/math/BigDecimal.html#valueOf-double-
Bat(*.bat)で色々やる時のメモ

#概要
bat作成時の個人用メモ

## テンプレ

※テンプレ利用時の注意点
JenkinsのWindowsバッチコマンドの実行でこのbatファイルを利用すると
マルチバイト文字が入っている為エラーが発生します。
日本語部分を消してもらえれば使えます。

```bat:template.bat
@echo off

rem ------------------------------------
rem infomation
rem batの説明を記載

rem ------------------------------------
rem setting
rem 各種設定
set CurDir=%~dp0

call :CLEAR_SCREEN

rem ------------------------------------
rem 実装部
:EXEC


rem ------------------------------------
rem 終了処理
:END

:: pauseはデバッグ終了時に外す
pause

:: /B 呼び出し元へ戻る
exit /B

rem ------------------------------------
rem ログ消去
:CLEAR_SCREEN

cls
exit /B

rem ------------------------------------
rem EOF
```

## 引数表示

```bat
:: 引数1をそのまま表示
echo %1
:: フルパスにして表示
echo %~f1
:: 引数1をドライブ文字とパス
echo %~dp1
:: 引数2をファイル名のみにして表示
echo %~n2
:: 引数2をファイル名+拡張子のみにして表示
echo %~nx2

rem D:\tmpで引数1にhoge 引数2にfoo/poi.txtを入れて実行した結果
hoge
D:\tmp\hoge
D:\tmp
poi
poi.txt

```
## ドロップされたファイルを操作
```bat
:: 1ファイルのみドロップされた場合 %1にパスが入っています。
echo %1

:: 複数ファイルドロップされた場合
for %%f in (%*) do (
  echo %%f
)
```

## コマンド結果を変数に入れる
```bat
:: コマンド結果を%%iに入れて　表示
for /f "usebackq" %%i in (`コマンド`) do (
  echo %%i
)

:: 指定ディレクトリ以下の特定ファイル見つけてきて表示
for /f "usebackq" %%i in (`dir /b /s RomDir\*.zip`) do (
  echo %%i
)

:: 直下のディレクトリを見つけてきて表示
for /f "usebackq" %%i in (`dir /b /ad`) do (
  echo %%i
)

:: lsの結果を表示
for /f "usebackq" %%i in (`ls`) do (
  echo %%i
)

```

## アプリの起動/再起動
**何かを起動時にデバッグツールを起動したい時に使用**

```bat:startAppIfNeeded.bat
rem アプリが起動済みなら起動しない。起動してないなら起動する。
set AppFile=poi.exe
set AppPath=%CurDir%tool\%AppFile%
for /f %%i in ('tasklist /fi "imagename eq %AppFile%" 2^>^&1') do (
    if /i %%i==%AppFile% (
        goto END
    )
)
start %AppPath%
:END
exit /B
```

**下位互換性の無いデバッグツールを使う場合**
**すでに起動しているなら殺してから**
**使用可能なバージョンのデバッグツールを立ち上げる為に使用**

```bat:restartApp.bat
rem アプリが起動済みなら再起動する。
set AppFile=poi.exe
set AppPath=%CurDir%tool\%AppFile%
for /f %%i in ('tasklist /fi "imagename eq %AppFile%" 2^>^&1') do (
    if /i %%i==%AppFile% (
        taskkill /im %AppFile% /f
    )
)
start %AppPath%
:END
exit /B
```

## フォルダ作成

```bat
:: フォルダがあったら消してから作成
if exist %TargetDir% (
  rd /s /q %TargetDir%
)
mkdir %TargetDir%

```bat
:: フォルダが無ければ作成
if not exist %TargetDir% (
  mkdir %TargetDir%
)
```

## テキストファイルを1行ずつ読み込む

```bat
for /f "delims=" %%c in (poi.txt) do (
  echo %%c
)
```

### テキストファイルの読み込みを利用してVisualStudioプロジェクトをビルドする

slnファイルと同じディレクトリに配置して使用します。
別途記載したビルド対象ファイルを元にビルドを行います。

```bat:build.bat
@echo off

set ProjectRoot=%~dp0

rem ------------------------------ 
rem 設定
::1つ上のフォルダ名を取得してソリューション名として利用
for %%I in (.) do set SlnFileName=%%~nI%%~xI
::msbuild.exeへのパスを確保
set MicrosoftBinRoot="C:/Program Files (x86)/MSBuild/12.0/Bin/"
set MsBuildPath=%MicrosoftBinRoot%msbuild.exe

rem ------------------------------ 
rem 実装部

for /f "delims=" %%c in (configuration.txt) do (
	for /f "delims=" %%p in (platform.txt) do (
		%MsBuildPath% %SlnFileName%.sln /t:rebuild /p:PlatformToolset=v120 /p:Configuration=%%c /p:Platform=%%p
    )
)

rem EOF
```

```text:configuration.txt
Debug
Develop
Release
```

```text:platform.txt
Win32
X64
```
GateOne導入用のCloudFormation Template

GateOneはWebブラウザ上で動作するターミナルエミュレータで、OSSとして公開されています。
これを使うことで、外部へ直接SSH接続ができない環境であってもWebブラウザからHTTP通信でGateOneサーバに接続し、ブラウザ上からGateOneサーバ経由で他のサーバにSSH接続して操作を行うことができます。

公式サイトと公式のGitHubはこちら

- http://liftoffsoftware.com/Products/GateOne
- https://github.com/liftoff/GateOne

GateOneがどのようなものかはこちらの記事を読むと良くわかると思います。

- http://d.hatena.ne.jp/ike-dai/20130301/1362154439

SSHができない環境で使うためのGateOne serverを構築するためにSSH接続が必要になっては意味が無いので、
自動で構築できるようにCloudFormation Templateを作成しました。

- https://github.com/kz-takahashi/gateone_template

上記のリンク先からcfn_template.jsonをダウンロードし、
AWS CloudFormationでStackを作成すれば、GateOneが稼動した状態のサーバが立ち上がります。
Stackの状態がCreate Completeになった後に数分待てば(何らかの理由でエラーにならなければ)
ブラウザから接続できるようになると思います。
接続するとBasic認証を要求されるので、Parametersで指定したUserNameとUserPasswordを入力するとターミナル画面が表示されます。

その後の操作はGateOne公式のドキュメントを参照してください。

- https://liftoff.github.io/GateOne/UserGuide/index.html

その他の注意点としては、GateOne server経由でSSHをする場合、当然SSHの接続元IPはGateOne serverとなるので
接続先サーバのSecurityGroupやiptables等ではGateOne serverからのSSH接続を許可しておく必要があります。

HTTP/HTTPSでしか外に通信できない環境でなくとも、GateOne自体が色々と便利な機能を備えたプロダクトなので、試しに使ってみてはどうでしょうか。
PHPで配列から特定の要素を削除する


# 通常の配列
## Indexを指定して削除 : その1
**array_splice();**

+ 配列を切り取る機能を利用して対象から値を削除する
+ １つだけの値の削除や連続する値の削除に向いている

切り取られた値 = array_splice(削除対象配列, 切り取り開始Index, 切り取り数);

```php:array_splice使用例
$target = array('a', 'b', 'c');

//削除実行
$split = array_splice($target, 1, 1);

//削除結果
var_dump($target);/*array(2) { [0]=> string(1) "a" [1]=> string(1) "c" }*/

//引数で渡した値も変更されている
var_dump($split);/*array(1) { [0]=> string(1) "b" }*/
```

```php:array_splice使用例2(連続した値の削除)

$target = array('a', 'b', 'c', 'd');

//削除実行
$split = array_splice($target, 1, 2);//連続した２つの値の削除

//削除結果
var_dump($target);/*array(2) { [0]=> string(1) "a" [1]=> string(1) "d" }*/
```

## Indexを指定して削除 : その2
**unset();**
**array_values();**

+ 配列を指定して、unsetで削除するやり方
+ 複数の値の削除に向いている
+ unsetで削除するだけでindexが変更されない。array_valuesでindexを詰める

```php:indexを詰めるとは
$target = array('a', 'b', 'c');

//削除実行
unset($target[1]);

//実行結果
//indexの1を削除したため、indexが連番でなくなっている!
var_dump($target);/*array(2) { [0]=> string(1) "a" [2]=> string(1) "c" }*/

//indexを詰める
$target = array_values($target);

//indexの欠番が詰められて連番になった
var_dump($target);/*array(2) { [0]=> string(1) "a" [1]=> string(1) "c" }*/
```

```php:unset使用例
$target = array('a', 'b', 'c', 'd');

foreach ($target as $key => $val) {
  if(/*削除条件*/){

      //削除実行
      unset($target[$key]);
  }
}

//Indexを詰める
array_values($target);
```

## Indexを指定して削除のまとめ
１つ削除するだけなら、array_splice()が便利。
ただし、複数削除する場合にarray_splice()で削除を行うと、削除とIndexを詰める作業が同時に発生するため処理が重くなる。
unset();でまとめて削除した後に、array_valuesでIndexをすべて詰める方が処理が早くなる。

## 要素指定して配列を削除
**array_diff();**
**array_values();**

+ index値ではなく、要素そのものを指定して値の削除を行う
+ 削除後に、indexを詰める作業が必要

array_diffは第１引数の配列と第２引数以降の配列と比較し、 第１引数の要素の中で他の配列には存在しないものだけを返す。 

```php:array_diff使用例
$target = array('a', 'b', 'c', 'd', 'e');

//削除実行
$result = array_diff($target, array('c', 'e'));
//indexを詰める
$result = array_values($result);

//削除結果
var_dump($result);/*array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "d" }*/
```


# 連想配列
**unset();**

+ keyを用いて連想配列から削除する

```php:unset使用例
$target = array('key1' => 'a', 'key2' => 'b', 'key3' => 'c');

//削除実行
unset($target['key2']);

//削除結果
var_dump($target);/*array(2) { ["key1"]=> string(1) "a" ["key3"]=> string(1) "c" }*/
```
れっつこぐにてぃぶ Watson先生のCloudAPIデモサイト一覧

#Watson
本家日本語サイト
http://www.ibm.com/cognitive/jp-ja/outthink/

IBM Watson Developer Cloud
http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/

#デモ
##言語
|API|概要|デモ概要|デモURL|
|:--|:--|:--|:--|
|AlchemyLanguag|基礎的な自然言語の解析要素がいっぱい。|文章を解析して可視化してくれる|http://www.alchemyapi.com/products/demo/alchemylanguage|
|Concept Expansion|概念展開。非構造データからキーワードを拾って辞書化していくためのツール。|検索キーワードを元に関連キーワードが検索される。関連キーワードを検索キーワードに追加してさらに検索。| http://concept-expansion-demo.mybluemix.net/ |
|Concept Insights|概念洞察。古典的なキーワード検索できる。|Wikipediaを元にした関連ワード辞書で、TED Talksの記事を検索する。|https://concept-insights-demo.mybluemix.net/|
|Dialog|質疑。自然言語でエージェントが質問してユーザーが答える。ユーザーの回答を元にモデルを形成する。|会話しながらピザの注文を取る。|http://dialog-demo.mybluemix.net/|
|Document Conversion|文書変換。|html, docx, PDFからJSON, テキスト,HTML（修飾がないノーマル）へ変換する。|https://document-conversion-demo.mybluemix.net/|
|Language Translate|言語翻訳。|会話、ニュース、特許のドメインに合った単語で翻訳。 |http://language-translation-demo.mybluemix.net/|
|Natural Language Classifier| 入力された文章を予め定義したクラスに分類する。分類されたクラスに応じたアクションを実行できる。|予め定義した天気に関するクラスに分類。自信度も表示。|http://natural-language-classifier-demo.mybluemix.net/|
|Personality Insights|個性洞察。考え方、行動、感じ方を分析し、個性を評価する。|有名人Twitterアカウントから特性を分析する。|https://watson-pi-demo.mybluemix.net/|
|Relationship Extraction|関係抽出。非構造文章から、意味を与える単語を抽出|文章から意味のある単語を抽出して、何を意味づけるか（時間、人など）表示。|http://relationship-extraction-demo.mybluemix.net/|
|Retrieve and Rank|検索と順位。妥当な情報を見つけるためのシグナルを、検索と機械学習を組み合わせて見つける。|イギリスCranfield大学のデータコレクションから、エアロダイナミクスに関する質問に関係するデータを検索、ランク付けする。|http://retrieve-and-rank-demo.mybluemix.net/rnr-demo/dist/#/|

## スピーチ
|API|概要|デモ概要|デモURL|
|:--|:--|:--|:--|
|Speech to Text|音声からテキスト。音声認識。**日本語対応**|音声ファイル、マイク音声からテキスト文書を生成。|https://speech-to-text-demo.mybluemix.net/|
|Text to Speech|テキストから音声。音声リーダ。**日本語対応**|入力した文章を読み上げる。|https://text-to-speech-demo.mybluemix.net/|

## 視覚
|API|概要|デモ概要|デモURL|
|:--|:--|:--|:--|
|Alchemy Vision|基礎的な画像解析技術がいっぱい|写真から顔認識して名前特定|http://vision.alchemy.ai/|
|Visual Insights|視覚洞察。複数画像に共通する要素を解析。|画像コレクションから、関係性の高いキーワードのクラウドを表示する。|http://visual-insights-demo.mybluemix.net/|
|Visual Recognition|画像認識。|選択した画像がなんの画像か特定する。|https://visual-recognition-demo.mybluemix.net/|

## データ
|API|概要|デモ概要|デモURL|
|:--|:--|:--|:--|
|AlchemyData News|過去60日分のインデックスから動向を検索できる。|場所や時間などの条件をもとにニュース記事から風評を検索できる。|http://querybuilder.alchemyapi.com/builder|
|Tradeoff Analytics|トレードオフ分析。パレート効率性の条件下で、条件のすり合わせを行い、最も適切な選択をする。|最もベストな選択をする。（携帯、銘柄、薬物成分など）|http://tradeoff-analytics-demo.mybluemix.net/|
Ruby on Rails環境構築① - rbenv,ruby,mysqlのインストール

# Ruby on Rails環境構築メモ

**目次**
① rbenv,ruby,mysqlのインストール
② [ruby on railsのインストール](http://qiita.com/Esfahan/items/f4fc4679ef70ba353309)
***

## 環境
- CentOS 6 or 7

## Ruby on Rails環境構築メモ① - rbenv, ruby, mysqlのインストール

#### version
- rbenv 2.2.3
- ruby 2.2.3

以下がインストールされていることが条件。

```
$ sudo yum -y groupinstall "Development Tools"
$ sudo yum -y install git openssl-devel readline-devel zlib-devel
```

下記のみでもOK。

```
$ sudo yum install -y gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel bzip2 libxml2-devel libxslt-devel
```

## rbenv, rubyのインストール

```sh
$ ruby_install(){
  # skip installation when rbenv is already installed.
  if [ `rbenv --version > /dev/null 2>&1; echo $?` == 0 ]; then
    echo '.rbenv is already installed.(skipping...)'
    return
  fi

  # install rbenv
  RUBY_VER=$1
  git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
  echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
  echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
  git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
  source ~/.bash_profile

  # install ruby
  RUBY_BUILD_CURL_OPTS=--tlsv1.2 CONFIGURE_OPTS="--disable-install-rdoc" rbenv install ${RUBY_VER}
  rbenv versions
  rbenv global ${RUBY_VER}

  # install bundler
  gem install bundle
};

$ ruby_install 2.2.3
```

2.2.3の部分は、インストールしたいバージョンを指定。

### 2017/05/23追記
rbenv installで下記のエラーが出る。
`curl: (35) Peer reports incompatible or unsupported protocol version.`
`curl --tlsv1.2` にする必要がある。
参考：http://toihrk.hatenablog.jp/entry/2017/05/17/124424

## rubyをソースからビルドする場合
### rubyをダウンロード
こちらからダウンロード
https://www.ruby-lang.org/en/downloads/

例）ruby-2.3.1をインストールする場合

```
$ curl -O https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.2.tar.gz
$ tar zxfv ruby-2.4.2.tar.gz
```

### インストール

```
$ cd ruby-2.4.2
$ sudo ./configure
$ sudo make
$ sudo make install
```

### bundlerのインストール

```
$ sudo gem install bundle
```

## MySQLのインストール
CentOSのデフォルトのレポジトリのmysqlはバージョンが古いので、下記の手順でインストール。
[CentOS6 or 7にMySQL5.6 or 5.7のインストール](http://qiita.com/Esfahan/items/83200c64de8d826677b5)

---
[次項 ruby on railsのインストール](http://qiita.com/Esfahan/items/f4fc4679ef70ba353309)

## 参考
- [RedHatでgem時にzlib ERRORが発生する](http://qiita.com/Gin/items/99e4e92ac53fb3504471)
- [Ruby 2.0.0をsourceからインストール](http://qiita.com/taise/items/7dcad4d53de45625514b#zlib)
redis clusterで全てのサーバを一挙にmonitorする


redisには[monitor](http://redis.io/commands/MONITOR)（Redisサーバが受け取ったすべてのコマンドをリアルタイム表示する）という便利コマンドがありますが、１サーバしか指定できません。
redis clusterを組んでいて、全サーバのmonitorをまとめて見たいケースって多いにあると思います。
調べて作ったのでここに残します。


## ソース
```bash:redis-multi-monitor.sh
#!/bin/bash

trap 'eval "kill -KILL $(jobs -p|tr "\n" " ")"' EXIT
for f in "$@"; do
  IFS=':'
  set -- $f
  redis-cli -c -p $2 -h $1 monitor &
done
wait
```
※Ctrl+Cで抜けてもゴミプロセスを残しません。後味すっきり。

## 使い方
$ ./redis-multi-monitor.sh 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
1459331298.605642 [0 127.0.0.1:60922] "set" "aa" "bb"
1459331298.607053 [0 127.0.0.1:7000] "set" "aa" "bb"
↑クラスターはmaster slave構成で作ってあったので２つ出てきます


## 参考にさせていただいたもの
http://qiita.com/aDaichiOta/items/08696f4882ae6e09730c


ご指摘あればよろしくお願いいたし！
wkhtmltopdfで自動でしおりを追加されない方法

自分用備忘録。

ちなみにwkhtmltopdfの導入・使用法については[こちら](http://qiita.com/morisuke/items/b9c18dcba99ba6501d6e)の記事を参考にしました。

wkhtmltopdfを使用してPDFを作成すると、デフォルトの設定では見出しタグ（h1,h2...）ごとに自動でしおりが作成されてしまう。

自動でしおりを作成しないしないようにするにはno-outlineオプションを使用する。

```
$pdf->setOption('no-outline', true);
```



英語力が足りなくて、オプション一覧から見つけるのに結構時間を使ってしまった…
Javaでjson:api準拠のAPIサーバとやりとり

### 前提
[json:api](http://jsonapi.org/)の仕様に基づいたjsonを返すAPIサーバを持っていること。

### 経緯
json:apiを返すRailsサーバとAndroidアプリを通信させる必要があった。 json:apiとember-dataはお友達、でもJavaでどうすればいいのか分からなかったから調べた。

### 調査結果
retrofitとjsonapi-converterを使うといい感じに通信できる。

#### 1. google http clientを試した
httpクライアントとしてはJavaでは [apacheのもの](https://hc.apache.org/httpcomponents-client-ga/) が定番のようだったがサイトがとっつきづらかったので[google製のもの](https://github.com/google/google-http-java-client)を使ってみた。しかし、ネストしたプロパティへのマッピングができなかったので断念。

[こんな感じにマッピングできます](https://developers.google.com/api-client-library/java/google-http-java-client/json#example)。フラットなjsonならこれで十分ですね。

### 2. jsonの取得とdesrializationを別に考えようとして、desrializationライブラリを探したら取得のとこもちゃんとサポートしていた

json:apiのspecページでは、さまざまな実装をまとめています (http://jsonapi.org/implementations/) 。Javaの項目を見ると、["jsonapi-converter"](https://github.com/jasminb/jsonapi-converter)というライブラリを見つけました。名前からしてjsonの取得まではサポートしていなさそう・・・。 [retrofit](http://square.github.io/retrofit/)というhttpクライアントと連携できる・・・。

#### Retrofitの簡単な紹介とjsonapi-converterとどう連携するか

APIバックエンドサーバサービスをインターフェイスとして定義し、利用する形式のhttpクライアントです。下記のように使えます。さてサービスから返ってきたjsonのマッピングですが、これをjsonapi-converterで担います。

```java
public interface MyAwesomeBackendService {
  @get("/users")
  List<User> getUsers();
}

Retrofit retrofit = new Retrofit.builder().baseUrl("http://localhost:3000").build();
MyAwesomeBackendService service = retrofit.create(MyAwesomeBackendService.class);

service.getUsers();
```

#### jsonapi-converterでマッピング

ほとんど公式docです。今回呼び出し部分は全てjsonapi-converterに書いてあるので割愛します。

```java
ObjectMapper objectMapper = new ObjectMapper();
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://localhost:3000")
        .addConverterFactory(new JSONAPIConverterFactory(objectMapper, User.class))
        .build();
MyAwesomeBackendService service = retrofit.create(MyAwesomeBackendService.class);
```
##### TIPS: jsonのキーの形式を指定する (snake, camel, hyphenated)

今回バックエンドAPIサーバのライブラリの都合上、jsonのキーがスネークケースになっていました（json:api推奨はhyphenated)。ObjectMappterを生成するときにオプションが渡せるのでキーの形式がどのようなものか教えてあげるといいです。

`ObjectMapper objectMapper = new ObjectMapper().setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);`
[Unity]Android向けにビルドする



# JDKのインストール
以下からダウンロードしてインストール。
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

# Android Studioのインストール
http://developer.android.com/sdk/index.html

# Unityでビルドする前の準備
### プラットフォームでAndroidを選択
File > Build SettingsからAndroidを選択する。
このとき選択できないようであれば，同じバージョンのUnityを再びインストールし，
プラットフォーム選択場面でAndroidを選択しておく。

### Bundle Identifierの設定
Build Settingsのウィンドウからplayer Settingsを選択。
Company Name, Product Nameに適当な名前をつける。
そして，Bundle Identifier を com.CompanyName.ProductNameに従って変更する。
例えば，CompanyNameがtest, ProductNameがgameならcom.test.gameとなる。

![スクリーンショット 2016-03-30 18.40.15.png](https://qiita-image-store.s3.amazonaws.com/0/111912/ebd30a8e-eab4-1bab-0cd0-caef697020c8.png)


# ビルドする
Android端末をPCに接続する。
ドライバがインストールされてないようならインストールする。
接続したらBuild&Runを選択。
ビルドの途中でandroid sdkの場所を聞かれるので指定する。
わからない場合は以下のリンクを参考にAndroid Studioを起動して調べる。
http://www.vuzix.jp/dev/general-settings.html

ビルドが終了し，Android端末でUnityのアプリケーションが起動していれば成功。

# ビルドして端末に移す場合

Build&Runではなく，Buildを選択すると.apkファイルが生成される。
これをAndroid端末にインストールして，起動することでUnityのアプリケーションを動かすことが出来る。
手っ取り早いのが，gmailに.apkファイルを添付して自分宛てに送り，それを端末側で開いてインストールするという方法。
あとは通常のアプリのようにインストールされたUnityアプリケーションをタップして開けば起動する。
タブかスペースかで争うのはナンセンス。editorconfigを使って、コーディングスタイルを統一する

みなさんそれぞれ自分なりのコーディングスタイルがあると思います。タブを使う？スペース？インデント幅は4それとも2？

個人のプロジェクトなら好きなようにすればいいですが、問題は複数人で開発する場合です。エディタの設定が2スペースで、4スペースで書かれたファイルで改行するとき、オートインデントで2スペースになったりと困った経験はないでしょうか。開発者がそれぞれのエディタやIDEで開発すると、プロジェクトに自分の開発環境をあわせるのが面倒になります。

## editorconfig
そこで、editorconfigです。
editorconfigを使うことで、各々のエディタの設定がそのプロジェクト用に切り替わります。

[EditorConfig](http://editorconfig.org/)


## 使い方
プロジェクトのルートに.editorconfigを配置するだけです。
参考までにjs用の自分のeditorconfigの設定を載せておきます。自分はタブ派なので、自分がプロジェクトをつくるときは以下のように設定しています。

```.editorconfig
root = true

[*]
indent_style = tab
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[{package.json,*.yml}]
indent_style = space
indent_size = 2
```

多くのOSSのプロジェクトでも使われているので、githubを覗いて設定を参考にしてみるのがいいと思います。

## プラグインのインストール

ATOMやEmacs、Visual StudioやXcodeなど多くのエディタやIDEにプラグインがあるのでそれを利用しましょう。
自分はvimを使っているのでその設定を載せておきます。とはいってもプラグインをインストールするだけです。

```vimrc
NeoBundle 'editorconfig/editorconfig-vim'
```

## まとめ
Lintツールに加えて、editorconfigを使い、快適なコーディングをしていきましょう。

## 参考
[EditorConfig](http://editorconfig.org/)
インスタンスのメンバ関数のアドレスを取得するときは受け側の型に注意する（C++, gcc）

##エラー詳細
コンパイラにgccを使ってC++のコードを書いていた時にこんなエラーが出ました．
` ISO C++ forbids taking the address of a bound member function to form a pointer to member function.`

記事の結論から言うと，

- インスタンスを生成して呼ばれたメンバ関数のアドレスは、受け側の関数ボインタの型を意識して受け渡す．
- staticなメンバ関数のアドレスなら取得可能．

だそうです．C++の仕様で禁止されているらしい．

##関数ポインタに代入するところでエラーが発生

GSL科学技術計算ライブラリを使っている中でこのエラーと遭遇．

公式のリファレンスには
`int(* f)(const gsl_vector* x, void* params, gsl_vector* f)`
という関数ポインタに値を代入するように書いてあった．

なので別クラスで作った`int`型の関数のアドレスを代入しようと考え，

```cpp
/* このクラスのメンバ関数のアドレスを取得したい */
Class FooClass{
 public:
  int varFunc();
};

/* 実際に呼び出したmain処理が以下（イメージ） */
FooClass* foo = new FooClass();
f = &(foo->varFunc);
```

のような書き方をしてたんですね．
そしたら見事に，

```shell-session
 エラー: ISO C++ forbids taking the address of a bound member function to form a pointer to member function.  Say ‘&FooClass::varFunc’ [-fpermissive]
  f.f  = &(foo->varFunc);
```

と言われてしまいました．

そこで原因を調べたところ**静的メンバのアドレス**であれば取得できる模様．
助言に従い以下のように修正しました．

```cpp
/* このクラスのメンバ関数のアドレスを取得したい */
Class FooClass{
 public:
  static int varFunc();
};

/* 実際に呼び出したmain処理が以下（イメージ） */
f = &(FooClass::varFunc);
```

するとコンパイルはすんなり通りました。

修正自体はすごい簡単だったんですけど、もともと動的メンバとして作成した関数の修正は時間がかかりました．

##追記

（2016/03/31）
メンバ関数を無理にstaticに変更してコード全体に影響してしまう場合は、ラッパーを用意するなどして対応するのもあり！


##おまけ（GSLはもともとCのライブラリなので上記のエラーには注意する！）

GSLのWikiにも

>
GSL は C 言語ライブラリであるため、C++のクラスから利用できる。しかしメンバー関数へのポインタは、その型が関数へのポインタとは異なる[2]ため、利用できない。関数へのポインタは、静的に定義された関数 (C言語における一般的な関数定義によるもの) に対して利用する必要がある。

と書いてありました（汗）

##参考

[http://vipprog.net/wiki/prog_lang/c.html](http://vipprog.net/wiki/prog_lang/c.html)
安心してください。今のライセンスが切れるまでSubscriptionモデルになったJetBrainsプロダクトも使えます。

デオチ。
またはタイトルオンリー。
そのうえネタも古い。

大丈夫だとは思いつつ、一抹の不安があって、サブスクリプションモデルに切り替わる前のIntelliJ 15を使い続けていたのですが,思い切って2016.1に切り替えてみました。


![Screen Shot 2016-03-30 at 18.15.52.png](https://qiita-image-store.s3.amazonaws.com/0/74328/516b5d20-0115-3de9-1cb0-e344edc0cb2d.png)



もともとのライセンスの期限までは使える模様。ライセンスの切り替えは6月になってからでもいいな。
それまでSpecial Offerが続いていればいいんだけれど...


私のような小心者の助けになれば。
SharedPreferencesにDouble型のデータを保持する際のベストプラクティス


Androidアプリ作っててDouble型のデータ（緯度経度とか）をSharedPreferencesに保持したくなったのですが、`putDouble()`がなかったので調べたまとめです。

ここでは3種類の方法について、よりナイスな順に並べると以下のようになります。
- long型のビット表現として保持する
- String型にして保持する
- float型にして保持する

特に最後の「float型にする」のは情報が失われる可能性がありバッドプラクティスなので要注意です。


## long型のビット表現として保持する
詳しい説明は[Android API Document](http://developer.android.com/intl/ja/reference/java/lang/Double.html#doubleToRawLongBits(double))や、[Java API Document（日本語かつこちらの方が詳細）](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Double.html#doubleToRawLongBits-double-)を参照ください。（丸投げご免！）

そんなことよりサンプルコードです。

```
// 保存時
prefEditor.putLong(KEY_LATITUDE, Double.doubleToRawLongBits(location.getLatitude()));
// 取得時
latitude = Double.longBitsToDouble(preferences.getLong(KEY_LATITUDE, 0l));
```

## String型にして保持する
これはまぁ説明不要かと思いますが、「とりあえず文字列に変換してしまえっ」という方法ですね。
StringからDoubleへの変換なんてキモチワルイし、内部的には1文字ずつ処理してるだろうし、そもそも変換できない文字列が入ってるかも…なんて色々考えることが多いのでスマートな解決法ではないねってことです。

そんなことよりサンプルry

```
// 保存時
prefEditor.putString(KEY_LATITUDE, location.getLatitude().toString());
// 取得時
try{
	Double test = Double.parseDouble(preferences.getString(KEY_LATITUDE, "0"));
}catch(NumberFormatException e){
	// TODO error hundling...
}
```

## float型にして保持する
floatは4byteなのに対してDouble型は8byteあるので、単純に精度（precision）が欠落してしまう、という問題の他に、overflow/underflowなどの問題もあるので一見うまくいっているように見えても使わないほうがよいです。
[このへん](http://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html#double)を読むとわかりやすいです。

そんなことよりry

```
使うなって言ってんだ最後まで言わせんな恥ずかしい！
```


## まとめ
Double型ってそんなに使うことないと思いますが、思わぬ落とし穴に嵌らないように気をつけたいですね。

いじょ
今更ながらPhoenixでRedisをsessionに使う

今更ですが、PhoenixでRedisをsessionに使う手順をメモっておきます。

# 必要なライブラリのインストール

plug_session_redisを使います。

https://github.com/aposto/plug_session_redis

mix.exsにライブラリを追加。

```mix.exs
def application do
  [mod: {MyApp, []}
  applications: [
    # 省略
    :plug_session_redis, # これを追加
    ],
  ]
end

defp deps do
  [{:phoenix, "~> 1.1.4"},
   # 省略
   {:plug_session_redis, "~> 0.1"}, # これを追加
  ]
end
```

で、mix deps.getします

```bash
$ mix deps.get
```

# 設定周り

config.exsかdev.exsかprod.exsか、必要に応じて設定分けます。
今回は一旦config.exs

```config.exs
# 末尾に追加（末尾じゃなきゃいけないわけじゃないけど）
config :plug_session_redis, :config,
  name: :redis_sessions,
  pool: [size: 2, max_overflow: 5],
  redis: [host: '127.0.0.1', port: 6379]
```

そしてendpoint.exにplugを追加

```lib/my_app/endpoint.ex
# デフォルトのcookieをコメントアウト
# plug Plug.Session,
#   store: :cookie,
#   key: "_my_app_key",
#   signing_salt: "8hQFzwFb"

# 以下を追加
plug Plug.Session,
  store: PlugSessionRedis.Store,
  key: "_my_app_key",
  table: :redis_sessions,
  signing_salt: "8hQFzwFb",
  encryption_salt: "jefa7xG",
  ttl: 360
```

必要な設定は以上です！

# 試す

取り敢えず適当にpage_controller辺りで表示させてみます。

```page_controller.ex
defmodule MyApp.PageController do
  use MyApp.Web, :controller

  def index(conn, _param) do
    session = get_session(conn, :count) || 0

    conn = put_session(conn, :count, session + 1)

    render conn, "index.html", session: get_session(conn, :count)
  end
end
```

htmlはslimで書いてます

```web/templates/page/index.html.slim
/ 邪魔くさいのでjumbotron以外は消して出力
.jumbotron
 = @session
```

リロードするたびに数字がインクリメントされていることが確認できました！

![スクリーンショット 2016-03-30 18.18.40.png](https://qiita-image-store.s3.amazonaws.com/0/105934/2c32c2aa-ce3f-c4d7-bc57-23ce18c9b34d.png)

![スクリーンショット 2016-03-30 18.18.46.png](https://qiita-image-store.s3.amazonaws.com/0/105934/8ada0179-21d3-5d82-624b-60142fcaf40b.png)
githubで別ユーザーのPullRequestを取り込む

Twitter4Jの他の人のPullRequestを取り込みたかったのでやり方を調べてやってみた。

- [[Git] masterにpull requestされていない他人のCommitを自分のレポジトリに取り込む方法 - 脳汁portal](http://portaltan.hatenablog.com/entry/2014/05/28/102503)

上記を参考に、っつーかそのままなんだけど。


取り込みたいPRはコレ↓

- [fix fall through for quoted_tweet by akihito104 · Pull Request #223 · yusuke/twitter4j](https://github.com/yusuke/twitter4j/pull/223)

このPRに該当するbranchはコレ↓

- [akihito104/twitter4j at work](https://github.com/akihito104/twitter4j/tree/work)

# というわけで作業してみた

```bash
$ git remote -v
origin  git@github.com:takke/twitter4j.git (fetch)
origin  git@github.com:takke/twitter4j.git (push)
upstream        https://github.com/yusuke/twitter4j.git (fetch)
upstream        https://github.com/yusuke/twitter4j.git (push)

$ git remote add akihito104 git@github.com:akihito104/twitter4j.git

$ git remote -v
akihito104      git@github.com:akihito104/twitter4j.git (fetch)
akihito104      git@github.com:akihito104/twitter4j.git (push)
origin  git@github.com:takke/twitter4j.git (fetch)
origin  git@github.com:takke/twitter4j.git (push)
upstream        https://github.com/yusuke/twitter4j.git (fetch)
upstream        https://github.com/yusuke/twitter4j.git (push)

$ git fetch akihito104
remote: Counting objects: 8, done.
remote: Total 8 (delta 2), reused 2 (delta 2), pack-reused 6
Unpacking objects: 100% (8/8), done.
From github.com:akihito104/twitter4j
 * [new branch]      2.0.x      -> akihito104/2.0.x
 * [new branch]      2.1.x      -> akihito104/2.1.x
 * [new branch]      2.2.x      -> akihito104/2.2.x
 * [new branch]      TFJ-671    -> akihito104/TFJ-671
 * [new branch]      TFJ-679-api1.1 -> akihito104/TFJ-679-api1.1
 * [new branch]      master     -> akihito104/master
 * [new branch]      revert-171-TFJ-806 -> akihito104/revert-171-TFJ-806
 * [new branch]      work       -> akihito104/work

$ git merge --no-ff akihito104/work
Merge made by the 'recursive' strategy.
 twitter4j-stream/src/main/java/twitter4j/StatusStreamBase.java | 1 +
 1 file changed, 1 insertion(+)

$ git push
Counting objects: 10, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (10/10), 908 bytes | 0 bytes/s, done.
Total 10 (delta 4), reused 0 (delta 0)
To git@github.com:takke/twitter4j.git
   8a03113..5a0e5bd  master -> master
```

# 結果はこんな感じ
 
![](https://i.gyazo.com/664b9b85e0cef16734f134dacf39bfcb.png)
python virtualenvのpython versionに関してメモ書き

pythonの仮想環境のversionを2系から3系に切り替えようとして
少し時間を要してしまったのでメモ書きです。

結論から言うと、仮想環境作成時のコマンドにオプションが付いていなかったのが原因でした。

オプション無しのコマンド
```$ virtualenv env```
オプション有りのコマンド
```$ virtualenv env --python=/usr/bin/python3```

オプション無しのコマンドで仮想環境を作成してしまうと、
デフォルトでmacに入っているpythonバージョン(2系)で作られてしまい、
3系に切り替えるコマンドを実行しても、切り替えが出来ませんでした。
(変更できる方法はあるかもしれませんが、私は分かりませんでした。)
PowerShell でドラえもんのひみつ道具を取得する四次元スクリプト


テレ朝のHPをスクレイピングしていますが、手組みのHTMLのようで揺らぎがありますね。
※2016年3月30日時点で 952 個

```
$wc  = New-Object System.Net.WebClient
$tools = " kstnhmyrw"[0..9] | %{
    $Url      = ("http://www.tv-asahi.co.jp/" + "apps/page/back_number.php?P_ID=1575&TYPE=pc&CNT=2000&C_DIR=tool_{0}a" -f $_).Replace( " ", "")
    Write-Host $Url
    $binData  = $wc.DownloadData( $Url )
    $strHtml  = [System.Text.Encoding]::GetEncoding("SJIS").GetString( $binData )
    $idxStart = $strHtml.IndexOf( "<dl>" )
    $idxEnd   = $strHtml.LastIndexOf( "</div>" )
    $strXml   = [Regex]::Replace( $strHtml.Substring( $idxStart,$idxEnd - $idxStart), "<img .*>", "").Replace( "<br>", "" ).Replace( "</font>", "")
    $xmlDoc   = New-Object Xml
    $xmlDoc.LoadXml( $strXml )
    $xmlDoc.SelectNodes( "//li" ) | Select @{Name="ToolName";    Expression={$_.SelectSingleNode("dt")."#text".Trim()}}, `
                                           @{Name="Desctiption"; Expression={$_.SelectNodes("dd")."#text".Trim()}}
}
Write-Host ("Get {0} items." -F $tools.Length)
$tools | Out-GridView
```
Xamarin.Forms iOSでListView.PullToRefreshのインジケータの色を変える

これで替えることができました。

```csharp

    internal class CustomListViewRender : ListViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
        {
            base.OnElementChanged(e);
            var subview = Control?.Subviews;
            if (subview != null && subview.Any(x => x is UIRefreshControl))
            {
                var refresh = (UIRefreshControl)subview.First(x => x is UIRefreshControl);
                refresh.TintColor = UIColor.Black;
            }
        }
    }
```
民主党のHPをスクレイピングして国会議員がいなくなったことを30秒以内にメールで通知する PowerShell スクリプト


※公開してから気が付きましたが、すでに民進党のHPに一覧ページができてましたね。
※誰が最後に一人だけ残るのか、それだけが気がかりです。
※Office365でメールを送ります ←ココ大事


```
$ErrorActionPreference = [System.Management.Automation.ActionPreference]::Stop
$mycreds = Get-Credential -Message "Input your mail account and password."

$PageURLs = "https://www.dpj.or.jp/members/house/衆議院","https://www.dpj.or.jp/members/house/参議院"

function SendMail( $Message ) {
    Send-MailMessage -To $mycreds.UserName `
        -From $mycreds.UserName -Subject "DPJ parliaments number change."`
        -SmtpServer "smtp.office365.com" -Credential $mycreds -UseSsl -Port "587" `
        -Body $Message `
        -ErrorAction SilentlyContinue
}

while($true)
{
    foreach($PageURL in $PageURLs)
    {
        try {
            $secWait = 30 #(Get-Random -Minimum 60 -Maximum 90)

            Write-Host ("Get Page {0} after {1} sec." -f $PageURL, $secWait)
            for ($a = $secWait; $a -ge 0; $a-- ) {
                Write-Progress -Activity "Waiting..." -Status ("last {0} sec." -f $a)
                Start-Sleep -Seconds 1
            }
            Write-Progress -Activity "Waiting..." -Completed

            $HTML = Invoke-WebRequest -Uri $PageURL
            $ParsedHtml = $HTML.ParsedHtml
            $MemberCount = $ParsedHtml.getElementsByClassName("col-md-4").Length

            Write-Host ("Get {0} member at Page {1}." -f $MemberCount, $PageURL)

            if($MemberCount -ne 24)
            {
                SendMail -Message ("Member Count : {0} in {1}" -f $MemberCount, $PageURL)
                exit
            }
        } catch [Exception] {
            Write-Host ("Error at getting Page {0}." -f ($PageURL))
            Write-Error $Error[0]
            SendMail -Message ("Erroe at {0}\n\r{1}" -f $PageURL, $Error[0])
            Start-Sleep -Seconds (5 * 60)
            exit
        }
    }
}
 ```
Androidでメソッド数を増やさずにlambdaを実装する方法

[Proxy](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Proxy.html)と[InvokationHandler](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/InvocationHandler.html)をつかうと都度クラスを定義することなくSAMから特定のメソッドへの移譲を実現できます。

欠点はめちゃくちゃ遅いこと！ ふつうに `new Runnable() { ... }` するのにくらべて数百倍遅いです。

もうちょっと速ければ、RetroLambdaやJackの内部実装のオプションとして使うのもありかもしれないとおもっ検証してみたのですが、これはちょっと使いものにならなそうです。メソッド数を増やさないというのはそれなりには重要ですが、multidexがある今となってはそこまで優先すべきものでもないですし。

## 実装

たとえばこんなクラスを定義します。


```java
public class InvocationDelegator<T> implements InvocationHandler {

    final T receiver;

    final Method delegate;

    public static <U, F> F create(U receiver, Class<F> samClass, String delegate) {
        for (Method method : samClass.getMethods()) {
            if (Modifier.isAbstract(method.getModifiers())) {
                Class<?>[] interfaces = {samClass};
                InvocationHandler handler = new InvocationDelegator<>(receiver, delegate, method.getParameterTypes());
                return samClass.cast(Proxy.newProxyInstance(samClass.getClassLoader(), interfaces, handler));
            }
        }
        throw new RuntimeException("No method found in " + samClass.getCanonicalName());
    }

    public InvocationDelegator(T receiver, String delegate, Class<?>[] parameterTypes) {
        this.receiver = receiver;

        try {
            this.delegate = receiver.getClass().getDeclaredMethod(delegate, parameterTypes);
            this.delegate.setAccessible(true);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException("Missing " + delegate + "() in " + receiver.getClass().getCanonicalName(), e);
        }
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       return delegate.invoke(receiver, args);
    }
}
```

MainActivityに以下のメソッドがあるとして:

```java
private void doSomething() {
    Log.d("XXX", "Hello, world!");
}
```

これで `doSomething()` を呼び出す`Runnable`を生成できます。

```java
Runnable task = InvocationDelegator.create(this, Runnable.class, "doSomething");
task.run(); // this.doSomething() を呼び出す
```
ＤＮＳでズンドコ

[ズンドコウェーブ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)にのってインフラエンジニアらしくズンドコネームサーバを作ってみました。


#仕様
\*.zunの応答は127.0.0.1
\*.dokoの応答は
・直前の.zunドメインへの問い合わせが４回以上連続した場合CNAMEとして*.kiyosiを返す
・それ以外127.0.0.1


```
$ dig foo.zun
127.0.0.1

$ dig foo.doko
foo.kiyoshi
```

みたいな感じ



#準備
rubyの標準クラスではDNSサーバ機能がないためrubydnsを利用します。

```$ gem install rubydns```



コード

```ruby:zundokoNameSystem.rb
require 'resolv'
require 'rubydns'

Interfaces = [
    [:udp, "0.0.0.0", 5300],
    [:tcp, "0.0.0.0", 5300]
]
zun_counter = 0

RubyDNS::run_server(:listen =>Interfaces) do
  match(/\.zun$/, Resolv::DNS::Resource::IN::A) do |transaction|
    zun_counter += 1
    transaction.respond!("127.0.0.1", resource_class: Resolv::DNS::Resource::IN::A)
  end

  match(/.doko$/, Resolv::DNS::Resource::IN::A) do |transaction|
    cname= transaction.name.gsub(/doko$/, "kiyoshi")
    if zun_counter >= 4
       transaction.respond!(Resolv::DNS::Name.create(cname), resource_class: Resolv::DNS::Resource::IN::CNAME)
    else
       transaction.respond!("127.0.0.1", resource_class: Resolv::DNS::Resource::IN::A)
    end
    zun_counter = 0
  end

  otherwise do |transaction|
    transaction.fail!(:NXDomain)
    zun_counter = 0
  end
end
```


# 実行
サーバ起動

```$ ruby zundokoNameSystem.rb```

5300ポートで起動させているのでクライアント側でポートを指定してます。


```
$ dig @127.0.0.1 -p 5300 +short foo.zun
127.0.0.1
$ dig @127.0.0.1 -p 5300 +short foo.zun
127.0.0.1
$ dig @127.0.0.1 -p 5300 +short foo.zun
127.0.0.1
$ dig @127.0.0.1 -p 5300 +short foo.zun
127.0.0.1
$ dig @127.0.0.1 -p 5300 +short foo.zun
127.0.0.1
$ dig @127.0.0.1 -p 5300 +short foo.doko
foo.kiyoshi.
```


***
日本語ドメイン対応は春休みの宿題ですｗ
mysqldumpで生成したダンプファイルからのリストア時にYou can't use locks with log tablesと言われる問題

## 環境

バックアップを取得するサーバ(`mysqldump`を実行するクライアント側のサーバ)：
CentOS5.6
MySQL 5.0.95

## 現象
`mysqldump`でMySQLのDBをフルバックアップを行い、それをもとにリストアしようとした際、

```
ERROR 1556 (HY000) at line XXXX: You can't use locks with log tables.
```

と言われ、リストアできない。

### 詳細

バックアップ時は書き込みをロックし、全てのデータベースに対してバックアップをとる。

```
mysqldump -u{user} -p{password} --lock-all-tables --all-databases > ~/dumpfile
```

これをもとにリストアを行うと、先ほどのエラーが発生する。

```
mysql < ~/dumpfile

...
ERROR 1556 (HY000) at line XXXX: You can't use locks with log tables.
...
```

## 原因

ダンプファイルの中の指摘されている行を調べると、以下のような記述があった。

```sql:dumpfile
...
LOCK TABLES `general_log` WRITE;
...
```

上記の通り、`general_log`テーブルに対してロックをかけようとしている。

`mysql`データベースの`general_log`テーブルは、MySQLのコンフィグで一般クエリログをDBに保存する設定を行った際、ログが保存されるテーブルである。
このテーブルに対してはロックを行ったり、`INSERT`や`DELETE`などを行うことは出来ず、サーバ内部からのみ値が挿入される。

このように本来はユーザ側から明示的にアクセスはできないテーブルであるが、古いMySQLクライアントの場合、`mysqldump`を実行するとこのテーブルに対する操作まで発行されてしまう。

参考： https://bugs.mysql.com/bug.php?id=26121

上記URLによると、MySQL 5.1.18でこのバグは修正されたようである。
例えば古いサーバでダンプを取って新しいサーバに移行するなどの際には注意が必要である。
※ダンプファイルの問題なので、移行先が新しいバージョンのMySQL(あるいはMariaDB)でも問題は発生する。
この問題はMySQLのクライアント側の問題であるため、クライアント側のMySQLをバージョンアップを行うことで問題は解決する。別サーバの新しいMySQLクライアントからバックアップを取るなどして対処できる。


## 関連事象

同じように、リストア時に以下のようなエラーが発生する場合がある。

```
ERROR 1580 (HY000) at line XXXX: You cannot 'DROP' a log table if logging is enabled
```

ダンプファイルの該当の行を参照すると、以下のような記述があった。

```sql:dumpfile
...
DROP TABLE IF EXISTS `general_log`;
...
```

これはMySQLのコンフィグでクエリログを発行する設定にしている場合に起こる。
※すなわち、`my.cnf`で`general-log=1`にしている場合

これも同様に新しいバージョンのMySQLでダンプを行った場合は`general_log`テーブルに対する操作そのものが発行されないので、問題とならない。
Javascriptでrubyのmethod_missing的なことをして関数の引数を受け取る

[Direct Proxiesでmethod missing的なことをやる - Qiita](http://qiita.com/hokaccha/items/3a3ea6180e94e70bc335)にずばりな記事があるんですがJavascript初心者としては「あれ、関数の引数どうすれば受け取れるんだろう？」と思ったわけです。

それで検索してみたらずばりな質問がありました。
[javascript - How do I trap arguments to a target method when using a Proxy object? - Stack Overflow](http://stackoverflow.com/questions/25069023/how-do-i-trap-arguments-to-a-target-method-when-using-a-proxy-object)

2つの記事を参考にして書いてみたらできました。

```js
var proxyCore = {
  get: function( target, property ) {
    return !(property in target) && (typeof target.propertyMissing === 'function') ? target.propertyMissing(property) : target[property];
  }
}

var PEPPERCore = {
  propertyMissing: function(name) {
    service = new Proxy({
      propertyMissing: function(methodName) {
        return function() {
          console.log("service:", name.replace(/^al/, "AL"));
          console.log("method:", methodName);
          console.log("arguments:", arguments);
        }
      }
    }, proxyCore);
    return service;
  }
}


var PEPPER = new Proxy(PEPPERCore, proxyCore);
PEPPER.alAnimatedSpeech.say("test");
// =>
// service: ALAnimatedSpeech
// method: say
// arguments: ["test"]
```
ターミナルでよく移動するディレクトリに即移動する

まず```~/.bashrc```に設定を書き込む

```~/.bashrc
alias cdhoge="cd ~/hoge/piyo" #移動したいディレクトリ名を書く
```

次に```~/.bashrc```の設定を読み込む

```source ~/.bashrc```

これで```cdhoge```と打てば```cd ~/hoge/piyo```に飛ぶ。

## 参考リンク

・ターミナル起動時に.bashrcを読み込むようにする
http://blog.ruedap.com/2010/09/13/mac-bash-bashrc
・cdしたらlsする
http://qiita.com/b4b4r07/items/8cf5d1c8b3fbfcf01a5d
・z.shでよく行くディレクトリに手軽に移動する
http://qiita.com/yoshikaw/items/38d3008ac7d0b19b4805
PowerShell で SharePoint の リストの列


```
Add-PSSnapin Microsoft.SharePoint.PowerShell
$ErrorActionPreference = "Stop"

# リストの列の一覧（表示名、内部名、隠し属性、タイプ表示名）を取得
# 引数は、サイトURL($WebUrl), リスト表示名($ListDisplayName)
function getListFields( $WebUrl, $ListDisplayName ) {
    # サイト取得
    $web  = Get-SPWeb $WebUrl
    Write-Host "Web : $WebUrl"

    # リスト取得
    $list = $web.Lists | ?{ $_.title -eq $ListDisplayName }
    Write-Host "List : $($list.Title)"

    # 列の一覧を出力(表示名、内部名、隠し属性、タイプ表示名)
    $list.Fields | Select Title, InternalName, Hidden, TypeDisplayName
}
```

```
# 使用例 -----------------------------------------------------------------
$webUrl          = "http://hoge/my"
$listDisplayName = "ドキュメント"
```

```
# 例１）コンソールに出力
getListFields -webUrl $webUrl -listDisplayName $listDisplayName | Format-Table
```

```
# 例２）ポップアップビューに出力
getListFields -webUrl $webUrl -listDisplayName $listDisplayName | Out-GridView
```

```
# 例３）ファイルに出力
getListFields -webUrl $webUrl -listDisplayName $listDisplayName | Export-Csv -Path "(ファイルパス).csv" -Encoding UTF8 -NoTypeInformation
```
PowerShell で SharPoint のリストビューの表示列を設定する


```
Add-PSSnapin Microsoft.SharePoint.PowerShell
$ErrorActionPreference = "Stop"

# ビューの表示列を更新
# 引数は、サイトURL($WebUrl), リスト表示名($ListDisplayName)、ビュー表示名($ViewName)、ビューに表示する列の内部名の配列
function setViewFields( $WebUrl, $ListDisplayName, $ViewName, $ViewFields ) {
    # サイト取得
    $web  = Get-SPWeb $WebUrl
    Write-Host "Web : $($web.Title)"

    # リスト取得
    $list = $web.Lists | ?{ $_.title -eq $ListDisplayName }
    Write-Host "List : $($list.Title)"

    # ビュー取得
    $view = ($list.Views | ?{ $_.Title -eq $viewName} )[0]
    Write-Host "View :  $($view.Title)"

    # ビュー表示列取得
    $fields = $view.ViewFields
    # ビュー表示列初期化
    Write-Host ("{0} fields clear in view." -F $fields.Count)
    $fields.DeleteAll()
    
    # ビュー表示列追加
    foreach( $field in $ViewFields ) {
        $f = $list.Fields.GetFieldByInternalName($field)
        Write-Host ("Add [{0} ( {1} )] field" -F $f.Title, $field)
        $fields.Add( $field )
    }

    # ビュー更新
    Write-Host "View update."
    $view.Update()
}
```

```
# 使用例 -----------------------------------------------------------------
$webUrl          = "http://hoge/sites/honsya/shashi_hensan_shitsu"
$listDisplayName = "Ｘファイル置き場"
$viewName        = "未解決一覧"
$viewFields      = (
      "Title" `
    , "ID" `
    , "AssignTo" `
    , "IsUMO" `
    )

setViewFields -WebUrl $webUrl -ListDisplayName $listDisplayName -ViewName $viewName -ViewFields $ViewFields
```