OmniAICreator/Qiita-1.07M huggingface dataset:
rspecでcreateやsaveで落ちる場合

超初心者記事

#起きたこと
rails consoleとかでは普通に保存できるのに、テストを書くと保存できない！
しかもデータベースのテーブルが無いとか言われてる！

#原因
test用のテーブルが必要
そういえばいたるところでproductionとdevelopとtestって別れてましたね…。

#解決手順
`rake db:test:prepare`
`rake db:migrate RAILS_ENV=test`
無名関数（lambda）を簡潔にするリードマクロ

On Lispとか有名な本に載っていそう

引数は１つしか取れませんが引数を返す無名関数など短い無名関数を書くときに役立つと思います．

```cl:
(defun special-lambda-expression (stream char &optional (arg (gensym)))
  (let* ((el (read stream))
         (rec (labels ((self (x)
                         (cond
                           ((consp x) (mapcar #'self x))
                           ((symbolp x) (if (eq x '_) arg x))
                           (t x))))
                #'self))
         (body (funcall rec el)))
    `(lambda (,arg) ,body)))
(set-macro-character #\! #'special-lambda-expression)
```

実行例

```cl:
!_ ; -> (lambda (#G:1501) #G:1501)
!(* 2 _) ; -> (lambda (#G:1502) (* 2 #G:1502))
!(* 2 (+ 1 _)) ; -> (lambda (#G:1503) (* 2 (+ 1 #G:1503)))
```

 多引数対応に拡張したほうが実用的そうですね．
Windows 環境に戻るために必要そうなモノたち (ポエム)


Ubuntu で UNIX 環境を学び、Windows 環境を脱却したのは何年前だったか。その後 OS X に移行し、NIX 互換シェル環境を快適に利用してきた。しかし今 Windows にしかない、ほしい環境がある。この際 Windows 10 を境に真面目に舞い戻ってみる試みのためのノート。

今のところ、全部妄想です。


# 開発環境

- [Visual Studio - Microsoft Developer Tools](https://www.visualstudio.com/)

Microsoft がオープンソースに肩入れし始めたのも今は昔。かつては高級有償開発環境であった Visual Studio も、今では無償で利用できる!

**Visual Studio Community 2015** で快適な IntelliSense 環境をフリーで利用できる!!

- [VsVim extension](https://visualstudiogallery.msdn.microsoft.com/59ca71b3-a4a3-46ca-8fe1-0e90e3f79329)

Visual Studio 用の優秀な Vim エミュレーションプラグインもあるので、慣れ親しんだ Vim 操作を Visual Studio でも利用できる!

- [OneGet/oneget](https://oneget.org)

~~Perl, PHP, Python, Ruby, Node.js に見られるような各言語環境向けライブラリパッケージ管理の仕組みを、Windows の C# 環境に提供してくれるのが、NuGet だ。~~

~~C# 用と言っておきながら、Ubuntu の APT や OS X の Homebrew のように、言語非依存のパッケージも大量に登録されている。開発用という意味では、Windows 環境に置けるデファクトスタンダードのパッケージ管理システムと言えるのかも知れない。~~

~~Node.js の NPM のように、ライブラリの展開先がプロジェクト単位というのも環境をむやみに汚さず素敵だ!~~

[OneGet が間違いなさそう!](http://qiita.com/japboy/items/451cf30fd0d763d98ae6)

- [cmder | Console Emulator](http://cmder.net/)

Ubuntu では [Guake](https://github.com/Guake/guake)、OS X では [TotalTerminal](http://totalterminal.binaryage.com/) を CLI として利用してきた。Windows でも Quake スタイルの CLI がほしい。

~~PoshConsole は PowerShell を同じ感覚で扱えそうなターミナルだ!~~

[ConEmu](https://conemu.github.io/) と [Clink](https://mridgers.github.io/clink/) をベースにした POSIX 互換ターミナルの [Cmder](http://cmder.net/) が最近 PowerShell へ力を入れ出している模様。画面も他のターミナルアプリケーションと比較して美しいし、ConEmu から引き継いた Quake mode もあるみたい!

- [Windows - PowerShell 使い方メモ - Qiita](http://qiita.com/opengl-8080/items/bb0f5e4f1c7ce045cc57)

NIX 互換環境の魅力といえば、その美しく宣言的で、幅広い互換性をもった強力なシェル環境だと思う。Windows にはそれら全てを担うだけのシェルは無いが、 **十分に強力な** シェル環境は既にある。

PowerShell は .NET 技術を軸としているので、慣れればプログラミングでもシナジーを発揮してくれるだろうというモチベーションで覚えられそう!

- [Trackpad++ Project [Home Page]](http://trackpad.powerplan7.com/)

OS X ユーザーなら有無を言わさず Mac ユーザーだ。トラックパッドの魅力に囚われた Mac ユーザーは OS X から脱却できないのだろうか。

否。BootCamp の Windows 環境でも OS X と同等のトラックパッド操作性を提供してくれるソフトウェアが Touchpad++ だ。

**マルウェアなのにこれが唯一の選択肢** という、究極の選択肢だ。


# サービス

- [Microsoft account – A single login to services and devices](http://www.microsoft.com/en-us/account)

兎にも角にも Microsoft アカウントだ。大昔から死蔵している Hotmail アカウントも `@outlook.com` ドメインで任意のエイリアスを付けてリニューアルできる。気持ちは新たに、過去は捨てずに、Windows 用ポータルアカウントを準備できる!

- [CodePlex - Open Source Project Hosting](https://www.codeplex.com/)

オープンソースプロジェクトのホスト先と言ったら [GitHub](https://github.com/) だが、Windows 向けのプロジェクトでは意外と利用率が高そうな CodePlex も Microsoft アカウントでアカウントを取っておく。


# 日本語入力

- [SKK日本語入力FEP](http://coexe.web.fc2.com/skkfep.html)
- [CorvusSKK](https://github.com/nathancorvussolis/corvusskk)
- [SKK - 日本語を書くなら絶対に導入したい! 私が10年で厳選した超おすすめ入力メソッド10選 - Qiita](http://qiita.com/tadsan/items/8f9f5c458451167399ae)

ミーハー心で手を出してしまって、中途半端に慣れてしまった SKK だが、Windows にも魅力的な実装があるようで一安心だ。

OS X では [AquaSKK (本家)](https://github.com/t-suwa/aquaskk) こと [AquaSKK (フォーク)](https://github.com/codefirst/aquaskk) にお世話になりました。


妄想が膨らんだら、また追記する。
[ハマリネタ]Entityクラスの中でJava 8 lambda式を使用すると、Entityクラスが読み込まれない

# 背景

Entityクラスの中でlambda式を使用していました。

例えばこんな風に。
```java:
  myCollection.stream().forEach(i -> i.setDate(now));
```

そうすると、そのEntityクラスは読み込まれず、リレーションシップなどで使用していると、次のようなエラーが出ます。

```text:
[class com.example.Hoge] uses a non-entity [class com.example.fuga] as target entity in the relationship attribute [field hoge]
```

# 環境

 - Glassfish 4
 - Java 8

# 原因

Eclipselinkのバグでしたー。 :sob: :sob: :sob: 

[Bug 429992 - EclipseLink silently ignores Entity classes with lambda expressions](https://bugs.eclipse.org/bugs/show_bug.cgi?id=429992)

# 回避策

lambda式を使うのをやめましょー。 :sweat:
実機では動くのにiOSシミュレータではクラッシュするとき

All Exceptionsブレイクポイント（下図）を消す。

![All Exceptions](https://qiita-image-store.s3.amazonaws.com/0/4691/0b58a32e-0d36-3c87-5628-eb2cd9c3136e.png)

参考：[ios - AVPlayer causes Simulator to crash but runs fine on device - Stack Overflow](http://stackoverflow.com/questions/25801844/avplayer-causes-simulator-to-crash-but-runs-fine-on-device)
PythonでCSVからC#のコンテナクラスを生成するジェネレータを作ってみた

CSVのコンテナクラスを手動で作成するのが面倒なので
CSVの型等を自動で解析してC#のコンテナクラスを作成する
ジェネレータを作成してみました。
CSVの形式に簡単な規約があるのでご注意を。

ちなみにPythonは勉強し始めたばかりなので
コードがおかしい所があるかもしれません。
その場合はご指摘いただけると非常に助かります。

#元となるCSV
こんな感じになります。

```lang:test_csv.csv
id,key1,key2,key3
1,テスト1,1.0,1,
2,テスト2,2.0,2,
3,テスト3,3.0,3,
```

一番上の行がkeyの名前。これが変数名となります。
あとは２番目の行からはcsvのデータの中身を入れてください。


#ジェネレート結果


```lang:CSVContainerTestCsv.cs
using System.Collections;
using System.Collections.Generic;

namespace CSVContainer
{
	//コンテナの実データ
	public class TestCsv
	{
		public int		 id{ get; private set;}
		public string	 key1{ get; private set;}
		public float	 key2{ get; private set;}
		public int		 key3{ get; private set;}
	}

}
```

こんな感じになります。
色々と便利なのでnamespaceで囲ってあります。

クラス名はCSVのファイル名をキャメルケースにしたものに、
.cs名は「CSVContainer」+クラス名にしています。


#Pythonコード
```lang:CSVContainerGenerator.py
# -*- coding: utf-8 -*-

import glob
import os.path

def convert(file):
	count = 0
	culam = ""
	val = ""

	for line in open(file, 'r'):
		if count == 0:
			culam = line
			count += 1
		else:
			val = line
			break

	out_put(file, culam, val)


def out_put(file, culam, val):
	file_name = os.path.basename(file)
	base_name = file_name.replace(".csv","")
	cs_name = "CSVContainer" + to_camel_case(base_name) + ".cs"
	f = create_file(cs_name, base_name)
	create_class(culam, val, f, to_camel_case(base_name))
	# print file_name


def create_file(file, base_name):
	f = open(file, 'w')
	f.write("using System.Collections;\n")
	f.write("using System.Collections.Generic;\n")
	f.write("\n")
	f.write("namespace CSVContainer\n")
	f.write("{\n")
	f.write("\t//コンテナの実データ\n")
	f.write("\tpublic class "+to_camel_case(base_name)+"\n")

	return f

def create_class(culam, val, f, base_name):
	f.write("\t{\n")
	culams = culam.split(",")
	vals = val.split(",")
	for i, v in enumerate(culams):
		type_str = ""

		if vals[i].find('.') != -1:
			type_str = "float\t"
		elif vals[i].isdigit():
			type_str = "int\t\t"
		else :
			type_str = "string\t"

		v = v.replace("\n", "")
		v = v.replace("¥n", "")


		f.write("\t\tpublic " + type_str + " " + v + "{ get; private set;}\n")

	f.write("\t}\n")
	f.write("\n")
	f.write("}\n")

def to_camel_case(text):
	text = text.lower()
	text = text.capitalize()

	while '_' in text:
		ix = text.index('_')
		next = text[ix + 1].upper()
		text = text[0:ix] + next + text[ix + 2:]
	return text


for file in glob.glob('CSV/*.csv'):
	print "conv  " , file
	convert(file)

```

現状はCSVディレクトリにあるCSVを見に行くようにしています。
出力先はpyコードと同階層です。
この辺りは、適度にいじっていただければと。
ディレクトリを直値にしているのは、正直怠けです。


以上
Chefでsudoersをいじったらsudoできなくなったの巻

結論を先に。根本的な原因はsudoersファイルの構文エラー。

元の状態。

```
file '/etc/sudoers.d/dev' do
  owner 'root'
  group 'root'
  mode 0440
  content '%dev ALL=(ALL) NOPASSWD: ALL'
end
```

opsを追加したかったので、コードを追加してこんな感じ。で、cook。

```
file '/etc/sudoers.d/dev' do
  owner 'root'
  group 'root'
  mode 0440
  content '%dev ALL=(ALL) NOPASSWD: ALL'
end

file '/etc/sudoers.d/ops' do
  owner 'root'
  group 'root'
  mode 0440
  content '%ops ALL=(ALL) NOPASSWD: ALL'
end
```

そしたらsudoできなくなりました。

```
$ sudo su -
sudo: >>> /etc/sudoers.d/dev: syntax error near line 1 <<<
sudo: parse error in /etc/sudoers.d/dev near line 1
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
$
```

sudoersは終端に改行がないとエラーになるみたいです。有名みたいです。というわけでそれぞれ

```
content "%ops ALL=(ALL) NOPASSWD: ALL\n"
```

みたいに改行を入れておけばOK。


## おまけのvisudo -cf

```
 visudo -cf ファイル
```

で、構文チェックできる。しらなかた。でも、今回の問題は指摘されない。


## おまけのpkexec

一旦、シンタックスエラーのまま保存するともうsudoできないので素直にシングルユーザなんとかでごにょごにょしたりすればいいんですが、このサイトによると ```pkexec visudo``` とかやってなんとかなるそうです。

http://askubuntu.com/questions/73864/how-to-modify-a-invalid-etc-sudoers-file-it-throws-out-an-error-and-not-allowi

全部ちゃんと読んでないし、入ってなかったし。未検証。
pkexecは、polkitってパッケージらしいのであらかじめ入れといたらいいかも。


## おまけの/etc/sudoers

```
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
```

includedirの左の#はコメントアウトじゃないのね。すぐ上に書いてあった。
難しいYO！

Chefはあんまり関係ないね。
【BIG-IP】設定の中身をSSHログインで確認する方法

BIG-IPでは、SSHログインして設定ファイルの中身を確認することができるので、これでサクッと設定状況の一覧を取得可能です。

まずはBIG-IPにSSHログインします。

```bash
$ ssh root@[BIG-IPのアドレス]
```

設定ファイルは ``/config/bigip.conf`` になるのでこちらを cat コマンドで表示。これで中身を確認できます。

```bash
[root@LB1:Active:Changes Pending] config # cat /config/bigip.conf
```

設定の確認や変更後の差異確認（差分確認ソフトなどで確認したり）などに便利です。
JSで当日日付〜数日前を計算して Y/m/d H:i:s で出力したい

何かもっとスマートな方法は無いのかな？と思いつつも下記を書いて`render`の前にぶっこみました。

```js:
_calcDatetime: function(past_day) {
    var today = new Date();
    today.setDate(today.getDate() - past_day)
    var year = today.getFullYear();
    var month = ((today.getMonth() + 1) < 10) ? '0' + (today.getMonth() + 1) : (today.getMonth() + 1);
    var day = (today.getDate() < 10) ? '0' + today.getDate() : today.getDate();
    var hour = (today.getHours() < 10)  ? '0' + today.getHours() : today.getHours();
    var min = (today.getMinutes() < 10) ? '0' + today.getMinutes() : today.getMinutes();
    var sec = (today.getSeconds() < 10) ? '0' + today.getSeconds() : today.getSeconds();
    return year + '/' + month + '/' + day + ' ' + hour + ':' + min + ':' sec;
},
```

ただのJavaScriptです。
他に良い書き方があったら教えて欲しいです。
crontab -eは危険かもしれない

今日初めてcronでスケジュール起動を行おうとして書式を見たら
`crontab [ -u ユーザ名 ] { -l | -r | -e }`

`crontab -e`→crontabファイル編集（スケジュールの編集）
`crontab -r`→crontabファイル削除（いままでのスケジュールが全部消える）

これ危険すぎじゃないですかね・・。
「e」と「r」って隣りあわせだし、うちはよくタイプミスをする。

そんなわけで、「cron.cnf」ファイルを作ってそこにcrontabの内容を入れることにした。
このファイルをどこかで世代管理をしておくのもいいかも。

あとは以下で設定完了。
`crontab cron.cnf`

これで~~いくら削除しても~~cron.cnfさえ残っていれば安心！

少し調べてたらやはり同じことを考えている人がいました。
http://d.hatena.ne.jp/ozuma/20120711/1342014448

メールが飛ぶのが嫌な人は`MAILTO=""`にしておくと飛ばないみたい。
Swiftのサブスクリプトで割と汎用的な多次元配列を作る

Swiftではこんな感じにサブスクリプトを使うことで多次元配列っぽい構造体を作れる。
これをさらに汎用的にして多次元配列の機能を再現させてみたい。
(それなら多次元配列を使えばいいじゃないかという声が聞こえてきそう。)

```swift:board.swift
struct Board{
   
    var size:[Int]
    var data: [Float]
    
    init(x:Int ,y:Int){
        size=[Int](count: 2, repeatedValue: 0)
        size[0]=x
        size[1]=y
        data = [Float](count: x * y, repeatedValue: 0.0)
    }
    
    func indexIsValid(x:Int, y:Int) -> Bool{
        return x>=0 && x<size[0] && y>=0 && y<size[1]
    }
    
    subscript(x:Int,y:Int) -> Float{
        get{
            assert(indexIsValid(x,y: y),"index out of range")
            return data[x + y * size[0]]
        }
        set{
            assert(indexIsValid(x,y:y),"index out of range")
            data[x + y * size[0]] = newValue
        }
    }
}

var b = Board(x: 3,y: 3)
b[1,1] = 1
```

上の2次元配列っぽいものを3次元配列に拡張してみる。
ジェネリクスで型指定も可能にしてみた。
これなら3次元グリッドを表現する場合に実際に使えそうだ。
あと一般化するための規則性も見えてきた。

```swift:grid.swift
struct Grid<T>{
    
    var size:[Int]
    var data: [T?]
    
    init(x:Int ,y:Int, z:Int){
        size=[Int](count: 3, repeatedValue: 0)
        size[0]=x
        size[1]=y
        size[2]=z
        data = [T?](count: x * y * z, repeatedValue: nil)
    }
    
    func indexIsValid(x:Int, y:Int, z:Int) -> Bool{
        return x>=0 && x<size[0] &&
               y>=0 && y<size[1] &&
               z>=0 && z<size[2]
    }
    
    subscript(x:Int,y:Int,z:Int) -> T{
        get{
            assert(indexIsValid(x,y:y,z:z),"index out of range")
            return data[x + y * size[0] + z * size[0] * size[1]]!
        }
        set{
            assert(indexIsValid(x,y:y,z:z),"index out of range")
            data[x + y * size[0] + z * size[0] * size[1]] = newValue
        }
    }
}

var g = Grid<Float>(x: 10, y: 10, z: 10)
g[1,1,1] = 1
```

上を元にしてさらに汎用的にして多次元配列っぽくしてみる。
これならIntの範囲の大きさで任意の次元の配列も扱うことができるはずだ。
いつ役に立つか分からないけど、いつか役立つことを信じてみます。

```swift:MultiArray.swift
class MultiArray<T>{
    
    var size:[Int]
    var data: [T?]
    
    init(size:Int...){
        self.size = size
        let multiply = { (a:Int, b:Int) -> Int in a * b}
        data = [T?](count: size.reduce(1,combine: multiply), repeatedValue: nil)
    }
   
    func indexIsValid(indeces:[Int]) -> Bool{
        var v:Bool = true
        for (i,index) in indeces.enumerate() {
           v = v && index>=0 && index<size[i]
        }
        return v
    }

    func createIndex(n:[Int]) -> Int{
        var index:Int = 0
        for (i,v) in n.enumerate(){
            var s:Int = 1
            for j in 0..<i{
               s *= size[j]
            }
           index += v * s
        }
        return index
    }
    
    subscript(n:Int...) -> T{
        get{
            assert(indexIsValid(n),"index out of range")
            return data[createIndex(n)]!
        }
        set{
            assert(indexIsValid(n),"index out of range")
            data[createIndex(n)] = newValue
        }
    }
}

var mf = MultiArray<Float>(size:10,10,10)
mf[1,1,1] = 1
var ms = MultiArray<String>(size:1,2,3,4)
ms[1,1,1,1]="a"
```
※createIndexの所はもう少し関数型っぽく書けそう。
JsonWorldでrootがarrayなjson schemaを作る

`as_json_schema`をoverrideして無理矢理作れる。

```rb
module Api
  module Resources
    class User
      include JsonWorld::DSL

      property(
        :id,
        type: Integer,
      )
      property(
        :screen_name,
        type: String,
      )
    end
    class Users
      include JsonWorld::DSL

      property(
        :users,
        type: Array,
        items: {
          type: Api::Resources::User
        }
      )

      attr_reader :users

      # @param [Api::Resources::User] users
      def initialize(users)
        @users = users
      end

      def self.as_json_schema
        super[:properties][:users]
      end

      def as_json(options = {})
        super(options)["users"]
      end
    end
  end
end

puts Api::Resources::User.to_json_schema
# =>
#{
#  "properties": {
#    "id": {
#      "type": "integer"
#    },
#    "screen_name": {
#      "type": "string"
#    }
#  },
#  "required": [
#    "id",
#    "screen_name"
#  ]
#}

puts Api::Resources::Users.to_json_schema
# =>
#{
#  "items": {
#    "properties": {
#      "id": {
#        "type": "integer"
#      },
#      "screen_name": {
#        "type": "string"
#      }
#    },
#    "required": [
#      "id",
#      "screen_name"
#    ]
#  },
#  "type": "array"
#}

```

:tada: 

# 参考
[JsonWorldでモデルからJSON Schemaを生成する - Qiita](http://qiita.com/r7kamura/items/722c5c612e432b2c4246)

json_worldの全体的な使い方はこれを見る
cordova build androidでError: Please install Android target: "android-xxが出た時の対策

# はじめに
以前自分で書いた[CordovaでiOS,Androidハイブリッドアプリ開発環境を整える](http://qiita.com/snoguchi/items/270df0dab9766fd2664e)を再度試していたところタイトルのようなエラーが表示されたので、回避策を書いていきます。

# 発生したエラー内容
```
cordova build android
```
をしたところ以下のエラーが発生

```
Running command: /Users/sbnoguchi/dev/study/sample-project/platforms/android/cordova/build 
[Error: Please install Android target: "android-22".

Hint: Open the SDK manager by running: /Users/sbnoguchi/Library/Android/sdk/tools/android
You will require:
1. "SDK Platform" for android-22
2. "Android SDK Platform-tools (latest)
3. "Android SDK Build-tools" (latest)]
```

要は、cordovaでセットされたsdkターゲット番号と実際にAndroid SDKでセットされているSDKのバージョンが違いますよという趣旨のエラーです。

# 回避策

Crodovaの設定ファイルをAndroid SDKのバージョンに合わせます。

## 1 Android sdkのバージョンを確認
* Android Studioを開いて、Preferenceを選択
* Appearance & Behavior > System Settings > Android SDK

以下の画面が表示されます。

![スクリーンショット 2015-10-08 16.27.30.png](https://qiita-image-store.s3.amazonaws.com/0/65968/e117eeec-885c-0a55-bd35-74236c17f529.png)

**Android 6.0**が選択されている事が分かります。
ここのAPI Levelの数値をメモしておいてください。
今回の場合**23**です

API Level = Cordovaの設定ファイルに記載するSDKのターゲットバージョン
になります。

## 2 AndroidManifest.xmlの変更
以下のファイルを変更します。
/Cordovaのプロジェクトフォルダ/platforms/android/AndroidManifest.xml

Cordovaのプロジェクトフォルダはcordova createで作成済みのフォルダになります。

現状

```
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="22" />
```

targetSdkVersionを23に変更

```
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="23" />
```


## 3 project.propertiesの変更
以下のファイルを変更します。
/Cordovaのプロジェクトフォルダ/platforms/android/project.properties

現状

```
target=android-22
```

target=androidを23に変更

```
target=android-23
```

これで再ビルドすればCordovaのターゲットSDKのバージョンとセットされているAndroid SDKのバージョンが同じになるのでビルドに成功するはずです。
NodeJSのRedisClientメモ

よくわからなくなるのでメモする。
色々足りてないけどとりあえず公開

## 基本操作

### クライアントの作成

```js
var client = require('redis').createClient(port, host);
```

### トランザクション

repliesにはそれぞれの処理の結果が入っている。

```js
var multiClient = client.multi();
multi.llen(...);
multi.lpush(...);
multi.exec(callback(err, replies));
```



## リスト型の処理

### LPUSH, RPUSH

LPUSHは一番前にPUSHする(つまり、最新は一番前にくる)
RPUSHは一番最後にPUSHする。

```js
client.lpush(key, '内容文字列', callback(err));
```

### LLEN

件数を調べる。

```js
client.llen(key, callback(err, length));
```

### LRANGE

範囲を指定して取得する
開始位置(begin)と終了位置(end)を指定する。(数値)
なお、-1を指定することでリストの最後を取得することが出来る。

```js
client.lrange(key, begin, end, callback(err, messages));
```

### LREM

同じ値のレコードを削除します。件数を指定することができ、0の場合は全て削除します。(なお、マイナス値で指定すると逆から削除します)

```js
client.lrem(key, num, value);
```
連続量データに対するグラデーションのある色付け

ちょっとハマったのでメモ。

色々やってみたけど、smoothPaletteが楽だった。


# 方法1 : 値の並び順に色を対応させる

```r
# 一様分布の乱数
test_unif <- runif(1000)
# 正規分布の乱数
test_norm <- rnorm(1000)

color_unif1 <- cm.colors(length(test_unif))
color_unif1 <- color_unif1[rank(test_unif)]

color_norm1 <- cm.colors(length(test_norm))
color_norm1 <- color_norm1[rank(test_norm)]

# 一様分布
png(file="Unif1.png")
plot(test_unif, col=color_unif1, pch=16, ann=F)
dev.off()
# 正規分布
png(file="Norm1.png")
plot(test_norm, col=color_norm1, pch=16, ann=F)
dev.off()
```
![Unif1.png](https://qiita-image-store.s3.amazonaws.com/0/17038/45901e4a-90b0-5e69-a55b-a62699585235.png)
![Norm1.png](https://qiita-image-store.s3.amazonaws.com/0/17038/3aeca267-8ce4-f8db-33a9-4b67b28970f9.png)

一様分布しているようなデータなら、このやり方でもいいかもしれないが、山なりの分布になるようなデータの場合、山の部分に中間色が集中して、それ以外は強い色になってしまう。

並び順ではなく値の大小と色を対応させたい。

# 方法2 : smoothPaletteで値の大小と色を対応させる

```r
library("tagcloud")

color_unif2 <- smoothPalette(-test_unif, pal="RdBu")
color_norm2 <- smoothPalette(-test_norm, pal="RdBu")

# 一様分布
png(file="Unif2.png")
plot(test_unif, col=color_unif2, pch=16, ann=F)
dev.off()
# 正規分布
png(file="Norm2.png")
plot(test_norm, col=color_norm2, pch=16, ann=F)
dev.off()
```
![Unif2.png](https://qiita-image-store.s3.amazonaws.com/0/17038/61ad0306-5790-3e94-dca6-f63295625a77.png)
![Norm2.png](https://qiita-image-store.s3.amazonaws.com/0/17038/88a53aa7-a972-b268-ef83-95ab56c1bcce.png)

このやり方だと、簡単に値と色が対応する。

ただし、smoothPaletteが対応しているpal（例 : YlOrRdとかSpectralとか）しか対応していない。

例えば、RdBuは小さい値が赤、大きい値が青で、感覚と逆で気持ち悪い（smoothPalette(-test_unif, pal="RdBu")で逆転させたが）。

どの色からどの色へと変化させるかも自分で自由に定義したい。

# 方法3 : palfuncを指定する（colorRampPaletteの返り値を渡す）

```r
color_unif3 <- smoothPalette(test_unif, palfunc=colorRampPalette(c("skyblue", "gray", "pink")))
color_norm3 <- smoothPalette(test_norm, palfunc=colorRampPalette(c("skyblue", "gray", "pink")))

color_unif4 <- smoothPalette(test_unif, palfunc=colorRampPalette(cm.colors(12), alpha=TRUE))
color_norm4 <- smoothPalette(test_norm, palfunc=colorRampPalette(cm.colors(12), alpha=TRUE))

# 一様分布
png(file="Unif3.png")
plot(test_unif, col=color_unif3, pch=16, ann=F)
dev.off()
# 正規分布
png(file="Norm3.png")
plot(test_norm, col=color_norm3, pch=16, ann=F)
dev.off()

# 一様分布
png(file="Unif4.png")
plot(test_unif, col=color_unif4, pch=16, ann=F)
dev.off()
# 正規分布
png(file="Norm4.png")
plot(test_norm, col=color_norm4, pch=16, ann=F)
dev.off()
```

![Unif3.png](https://qiita-image-store.s3.amazonaws.com/0/17038/7be8857b-d009-48d6-6ba0-1a5dee9c295d.png)
![Norm3.png](https://qiita-image-store.s3.amazonaws.com/0/17038/e5e3d7e9-1c05-8acb-1222-f34681266b2b.png)

![Unif4.png](https://qiita-image-store.s3.amazonaws.com/0/17038/feb019e8-ba86-982e-fdce-8f5f63201ebf.png)
![Norm4.png](https://qiita-image-store.s3.amazonaws.com/0/17038/c4ed0408-486a-01a4-9b4c-b57977ac0422.png)


これなら、自分な好きな色を始点、中間点、終点に指定して書ける。



参考
http://www.inside-r.org/packages/cran/tagcloud/docs/smoothPalette
http://stat.biopapyrus.net/graph/rcolorbrewer.html
http://www.slideshare.net/takehisayamakita/rainbowrcolorbrewercolorramppalette
Dockerでvolumesに指定したNFSのディレクトリがマウント出来ない時のTips

## 問題

NFSでマウントしてるディレクトリをDockerのvolumesに指定してもコンテナ内に入るとマウントされていない。
また、エラー表示も特にない。

```shell-session
[root@dev ~]$ mount
192.0.2.1:/exports/share on /exports type nfs (rw,vers=4,addr=192.0.2.1,clientaddr=192.0.2.2)
[root@dev ~]$ ls /exports
aaa  bbb  ccc
[root@dev ~]$ docker run -it --name test -v /exports:/exports centos:latest bash
[root@00cb9276b6d2 /]# ls /exports
[root@00cb9276b6d2 /]# ls /exports/aaa
ls: cannot access /exports/aaa: No such file or directory
```

## 関連Issue, forum, stackoverflow
* issue: [NFS shares and volumes don't mix](https://github.com/docker/docker/issues/4213)
* forum: [NFS or mounting shares with docker](https://forums.docker.com/t/docker-fails-to-mount-v-volume-from-nfs-mounted-directory/582)
* stackoverflow: [NFS or mounting shares with docker](http://stackoverflow.com/questions/28034995/nfs-or-mounting-shares-with-docker)

## 解決策

dockerのサービス起動前に、mountしてあればいい。
逆に言えば、dockerのサービス起動後にmountしたものは認識しない。[^1]

```shell-session
# /etc/fstabに設定記載済みの想定
[root@dev ~]$ mount /exports
[root@dev ~]$ service docker restart
[root@dev ~]$ docker run -it --name test -v /exports:/exports centos:latest bash
[root@1942aa4640d1 /]# ls /exports
aaa  bbb  ccc
```

[^1]: NFSに限らず、cdromやusb-hddなどでも発生するかもしれない。
$ git commit --amend の短縮形はこれだ！

`$ git commit --am`

3文字も短い！
（環境によって違ったらごめんなさい）

---

ちなみに。

`$ git commit --amend`
`$ git commit --amen`
`$ git commit --ame`
`$ git commit --am`

なぜか、どれでも動く。

---

他にもたまに、短縮できるオプションがあるみたいだ。

`$ git branch --all`
↓
`$ git branch --al`

`git branch --contain`
↓
`git branch --con`




<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Ubuntu 14.04 に gcc、gdb などの開発ツールをインストールする

Ubuntu 14.04 に gcc, gdb ...などの開発ツールをインストールするための備忘録です。

# インストール
以下の通り、build-essential をいつも忘れてしまうのでした。
```
sudo apt-get install build-essential
```

ざっくりと以下のパッケージがインストールされると思います。

```
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  binutils cpp cpp-4.8 dpkg-dev fakeroot g++ g++-4.8 gcc gcc-4.8
  libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl
  libasan0 libatomic1 libc-dev-bin libc6-dev libcloog-isl4 libdpkg-perl
  libfakeroot libfile-fcntllock-perl libgcc-4.8-dev libisl10 libitm1 libmpc3
  libmpfr4 libquadmath0 libstdc++-4.8-dev libtsan0 linux-libc-dev make
  manpages-dev
Suggested packages:
  binutils-doc cpp-doc gcc-4.8-locales debian-keyring g++-multilib
  g++-4.8-multilib gcc-4.8-doc libstdc++6-4.8-dbg gcc-multilib autoconf
  automake1.9 libtool flex bison gdb gcc-doc gcc-4.8-multilib libgcc1-dbg
  libgomp1-dbg libitm1-dbg libatomic1-dbg libasan0-dbg libtsan0-dbg
  libquadmath0-dbg glibc-doc libstdc++-4.8-doc make-doc
The following NEW packages will be installed:
  binutils build-essential cpp cpp-4.8 dpkg-dev fakeroot g++ g++-4.8 gcc
  gcc-4.8 libalgorithm-diff-perl libalgorithm-diff-xs-perl
  libalgorithm-merge-perl libasan0 libatomic1 libc-dev-bin libc6-dev
  libcloog-isl4 libdpkg-perl libfakeroot libfile-fcntllock-perl libgcc-4.8-dev
  libisl10 libitm1 libmpc3 libmpfr4 libquadmath0 libstdc++-4.8-dev libtsan0
  linux-libc-dev make manpages-dev
0 upgraded, 32 newly installed, 0 to remove and 40 not upgraded.
Need to get 36.3 MB of archives.
After this operation, 111 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
```

以上
phantomjsでssl認証エラーによりabout:blankと表示されてしまう

些細な事ですが、phantomjsのwebdriverでhttpsにアクセスした時に証明書不正でアクセスエラーが起こってしまい、
about:blankとなってしまう場合の対処法です。

phantomjsを起動するときにパラメータignore-ssl-errorsを有効にしましょう。

```bash
phantomjs --webdriver=8643 --ignore-ssl-errors=yes
```

これでおっけい！
BigQueryでUPDATE?? その２

データが更新される度にタイムスタンプを追加したデータをBigQueryに貯めておいて、参照したい時に最新のデータだけを取得したいなー。と思って探したら@satoru_magさんの以下の記事をみつけました。

http://qiita.com/satoru_mag/items/fb233c188dd63f1aafff

# で、やってみた

## データ

データは引用元に合わせてこんな感じ。

```
shohin_name     shohin_code     shohin_price    update_date
shohin_1        1       1000    2015-10-05 20:15:10 UTC
shohin_2        2       1420    2015-10-05 20:15:10 UTC
shohin_3        3       980     2015-10-05 20:15:10 UTC
renamed_shohin_1        1       1000    2015-10-07 12:30:42 UTC
shohin_2        2       1280    2015-10-07 12:30:42 UTC
```

- shohin_code:1 のアイテムは名前(shohin_name)をアップデート
- shohin_code:2 のアイテムは価格(shohin_price)をアップデート
- shohin_code:3 は変更なし

## クエリ実行

引用元にあるクエリを実行してみた結果が以下。

```json
[
  {
    "shohin_name": "shohin_2",
    "shohin_code": "2",
    "shohin_price": "1420",
    "f0_": "2015-10-05 20:15:10 UTC"
  },
  {
    "shohin_name": "shohin_3",
    "shohin_code": "3",
    "shohin_price": "980",
    "f0_": "2015-10-05 20:15:10 UTC"
  },
  {
    "shohin_name": "shohin_1",
    "shohin_code": "1",
    "shohin_price": "1000",
    "f0_": "2015-10-05 20:15:10 UTC"
  },
  {
    "shohin_name": "renamed_shohin_1",
    "shohin_code": "1",
    "shohin_price": "1000",
    "f0_": "2015-10-07 12:30:42 UTC"
  },
  {
    "shohin_name": "shohin_2",
    "shohin_code": "2",
    "shohin_price": "1280",
    "f0_": "2015-10-07 12:30:42 UTC"
  }
]
```

**最新データだけになってない！！！**

アップデートされた`shohin_name`、 `shohin_price`を`GROUP EACH BY`でまとめてしまってるので期待する結果にはなりませんでした。

# 別のクエリを考えてみた

## クエリ

考えた結果以下の様なクエリにしてみました。

```sql
SELECT
 a.shohin_name AS shohin_name,
 a.shohin_code AS shohin_code,
 a.shohin_price AS shohin_price,
 a.update_date AS update_date
FROM
 [hoge.shohin_master] AS a
RIGHT JOIN EACH
(
  SELECT shohin_code, MAX(update_date) AS latest
  FROM [hoge.shohin_master]
  GROUP EACH BY shohin_code
) AS b ON a.shohin_code = b.shohin_code AND a.update_date = b.latest 
```

## 実行結果

```json
[
  {
    "shohin_name": "shohin_3",
    "shohin_code": "3",
    "shohin_price": "980",
    "update_date": "2015-10-05 20:15:10 UTC"
  },
  {
    "shohin_name": "renamed_shohin_1",
    "shohin_code": "1",
    "shohin_price": "1000",
    "update_date": "2015-10-07 12:30:42 UTC"
  },
  {
    "shohin_name": "shohin_2",
    "shohin_code": "2",
    "shohin_price": "1280",
    "update_date": "2015-10-07 12:30:42 UTC"
  }
]
```

これを引用元の記事のようにViewに保存しておけば簡単にアクセスできるかなと。
めでたしめでたし。
nginxのキャッシュが勝手に消える（[crit] 8250#0: unlink() "FILE NAME" failed (2: No such file or directory)



nginxで勝手にproxy_cacheのファイルが消えてました。
そして、キャッシュファイルを複数サーバーで共有（同期）していたことが原因で、以下のエラーにぶち当たりました。

```
[crit] 8250#0: unlink() "FILE NAME" failed (2: No such file or directory)
```



## unlink() "FILE NAME" failed (2: No such file or directory)

「キャッシュ消そう(unlinkしよう）と思ったけど、そんなファイルないよ」って言ってます。
これは、以下の流れで発生したと思われます。

1. サーバーAでキャッシュ消す
2. キャッシュ同期
3. サーバーBでキャッシュ消そうとする
4. unlink failedエラー

## 対応方法

そもそもキャッシュが消えるのがおかしい。なぜだ？と思ったら、キャッシュファイルの上限値を超えてたのが原因でした。
`proxy_cache_path`の`max_size`を引き上げることで対応できました。
この時`df`などで空容量を把握しておかないと、数時間後に「ディスク容量がない」系のエラーで怒られます

```
proxy_cache_path  /var/cache/nginx/proxy_cache levels=1:2 keys_zone=ゾーン名:ゾーン上限 max_size=キャッシュ上限;
```
JavaでOSコマンド実行時のメモ

## JavaでOSコマンド実行方法

java.lang.Runtimeのexecでコマンド実行する。

            String Command = "wget -D http://hogehoge.com/ --random-wait";
            Process p = Runtime.getRuntime().exec(Command);
            p.waitFor();

## Javaでリダイレクトを含むOSコマンド実行方法

Runtime.execはリダイレクトの入ったコマンドを実行してくれないらしい。
なぜか知ってる人コメントほしいっす :sweat_smile: 
そのため、shやcmdをコマンドを用いて実行する。

            String[] Command = {
                    "sh",
                    "-c",
                    "grep http://hogehoge.com hogehoge.log >grep.txt"
            };

            // Windowsの場合はcmd /cをたたきます
            if( SystemUtils.IS_OS_WINDOWS ) {
            	Command[0] = "cmd";
            	Command[1] = "/c";
            }

            Process p = Runtime.getRuntime().exec(Command);
            p.waitFor();
curlでhttps通信が失敗する

curlでhttps通信をしようとすると

```
curl: (1) Protocol "https" not supported or disabled in libcurl
```
というエラーが出て失敗する。

```
curl -V
```
で有効なプロトコルを調べてみるとhttpsが入っていないことに気づく。

```
./configure --with-ssl=/usr/local/ssl
make
sudo make install
```
こんな感じでOpenSSLの場所を指定してconfigureしてあげるとhttpsが有効になったcurlがインストールされるらしい。

# 参考サイト
- [How to build curl with the latest openssl?](http://askubuntu.com/questions/475670/how-to-build-curl-with-the-latest-openssl)
C#でOption<T>型（再考）

以前C#でOption\<T\>型を作りました。

* [C#でOption\<T\>型](http://qiita.com/pizyumi/items/0151c70fa79bf07288a7)

しかし、これでは↓のような使い方ができません。

```csharp
var v = from x in 1.ToOption()
        from y in 3.ToOption()
        select x + y;
```

そこで、↓のような拡張関数を追加します。

```csharp
        //任意の型の実体を随意型の実体に変換する
        public static Option<T> ToOption<T>(this T self)
        {
            return Option.Return(self);
        }

        //随意型の実体から新しい随意型の実体を作成し、返す
        public static Option<S> SelectMany<T, S>(this Option<T> self, Func<T, Option<S>> f)
        {
            return self.Bind(f);
        }

        //随意型の実体から新しい随意型の実体を作成し、新しい随意型の実体から更に新しい随意型の実体を作成し、返す
        public static Option<R> SelectMany<T, S, R>(this Option<T> self, Func<T, Option<S>> f, Func<T, S, R> g)
        {
            return self.Bind((x) => f(x).Bind((y) => g(x, y).ToOption()));
        }
```

これでfromやselectが使えるようになりました。

わぁいOption\<T\>型プログラミングが捗るOption\<T\>型大好き。
WindowsのvimでScalaのシンタックスハイライティング


1. KaoriYaからvimをダウンロードしてインストール
    http://www.kaoriya.net/

2. (要Cygwin) wgetでプラグインをダウンロード
<code>
mkdir -p ~/.vim/{ftdetect,indent,syntax} && for d in ftdetect indent syntax ; do wget --no-check-certificate -O ~/.vim/$d/scala.vim https://raw.githubusercontent.com/derekwyatt/vim-scala/master/$d/scala.vim; done
</code>
参考URL: https://github.com/derekwyatt/vim-scala

3. vimをインストールしたディレクトリのpluginsフォルダ以下にvim-scalaフォルダを作成し、 その中にwgetで取得したftdetect、indent、syntaxの3フォルダをコピー

備考: Cygwinがなければ、githubからプロジェクトをzipアーカイブでダウンロードして、ftdetect、indent、syntaxを取り出しても大丈夫かも
Fabric Engine 2 ライセンス体系


2015/09/30 リリースされたFabricEngine2 ではそれ以前からライセンス体系が一新された。ここに簡単にまとめておこう。 なお、２未満の旧ライセンスでは２を動かすことはできない。

ライセンス一覧: http://fabricengine.com/get-fabric/
EULA: http://fabricengine.com/eula/



## 無償版

申請受理より1年間利用可能,申請により延長可能
基本的にFabricによるサポートは受けられない。（ただしバグ報告は受け付けてくれる）
かわりにコミュニティベースのフォーラムが用意されている。

#### 個人利用

    * 一人１台のノードロックライセンス
    * 個人での、評価や商用利用が可能
    
#### スタジオ （FABRIC50）
    １社１ライセンス
    組織に所属していないと申請できない
    10インタラクティブライセンス[^1]
    40ヘッドレスライセンス[^2]
    商用利用可能

ライセンス取得後でも追加の評価ライセンスが必要であれば、申請受け付けてくれるらしい。（用交渉）

#### 教育目的
    商用利用不可


## 有償版

無償版には収まらない場合、もしくは特殊なサポートを必要とする場合はこっち。

おおまかに２種。レンタル版と買い切り（+サポートに年額）があり、さらに規模に応じて４段階。unlimited 以外のライセンスは 1ライセンスで1拠点（半径5Km ―さすが海外―）にかぎり運用できる。`人間`（＝`Interactive license`): 操作可能状態でのライセンス。スタンドアロン版CanvasやDCCからの利用に必要,  `バッチ`（＝`Headless license`):kl.exe 直で叩くなど操作が介入しない状態で実行する時に必要


|            | 人間   | バッチ | 位置制限   | レンタル(年)   | 買いきり             + メンテ価格[^6] (年) |
|:-----------|:---------|:---------|:----------:|--------------:|------------------------:|-------------------------------:|
| indivisual | 1        | 5[^3]    |     O      | 1,200$     |  2,000＄    ＋ 500$ |
| Team       | 10       | 無制限[^3]   |     O      | 10,000$    | 20,000＄    ＋ 5,000$ |
| Studio     | 無制限   | 無制限[^4]   |     O      | 45,000$    | 90,000＄    ＋ 22,500$ |
| Unlimited  | 無制限   | 無制限[^5]   |     X      | 価格応談       |   価格応談          |




2015/10/09 現在の為替を代入すると

|            | 人間   | バッチ | 位置制限   | レンタル(年)   | 買いきり             + メンテ価格[^6] (年) |
|:-----------|:---------|:---------|:----------:|--------------:|------------------------:|-------------------------------:|
|indivisual | 1        | 5[^3]    |     O      | 14万円    |  23万円    + 6万円 |
| Team       | 10       | 無制限[^3]   |     O      | 120万円    | 240万円    + 60万円 |
| Studio     | 無制限   | 無制限[^4]   |     O      | 540万円    |   1080万円  + 270万円 |
| Unlimited  | 無制限   | 無制限[^5]   |     X      | 価格応談       |   価格応談          |



[^1]: ユーザとのやりとりが可能なライセンス。
[^2]: データの処理のみすることができるライセンス,レンダリング等
[^3]: AWSなどクラウドホスティングサービスには使用不可
[^4]: AWSなどクラウドホスティングサービスでも使用可能。1拠点からの使用に限定
[^5]: AWSなどクラウドホスティングサービスでも使用可能。複数拠点可能
[^6]: 初年度無料
rubocopで修正ファイルだけを確認するコマンド


自分用のメモ


[bbatsov/rubocop](https://github.com/bbatsov/rubocop) というコーディング規約確認ツールがあって、自分が編集したファイルだけを確認したい時には以下のコマンドで確認する

`git status -s | awk '{print $2}' | egrep "*.rb" | xargs bundle exec rubocop -D -c .rubocop.yml`

- 毎回全ファイルチェックだと重すぎたのでこうなった
- 最初はprecommitに入れようと思ったけど、めんどくさくなったので手動で気になったら叩いてる
次の月曜日の午後三時を取得する

#次の月曜日の午後三時が取得したい
あるあるですね。

#手順
* 次の月曜日のNSDateを取得する
* 時間を午後三時にセットしたNSDateを取得する

 # Code

```swift
//現在時刻
        var date = NSDate()
        var calendar = NSCalendar.currentCalendar()
        let baseComps = calendar.components(.CalendarUnitWeekday, fromDate: date)
        let addingComps = NSDateComponents()
//日曜日の時はこのようにすれば2-1で1日足せば良いことになる
        var addingDay = 2 - baseComps.weekday
//月曜日以降の場合は、今週の月曜になってしまうため+7する
        if addingDay<=0 { addingDay += 7 }
        addingComps.day = addingDay
//現在時刻から次の月曜日まで時間を進める
        let res = calendar.dateByAddingComponents(addingComps, toDate: date, options: nil)

//次に時刻を指定
        var comps = calendar.components(NSCalendarUnit.CalendarUnitWeekday|NSCalendarUnit.CalendarUnitYear|NSCalendarUnit.CalendarUnitMonth|NSCalendarUnit.CalendarUnitDay|NSCalendarUnit.CalendarUnitHour|NSCalendarUnit.CalendarUnitMinute|NSCalendarUnit.CalendarUnitSecond, fromDate: res!)
//15:00にセットする
        comps.hour    = 15
        comps.minute  = 0
        comps.second  = 0
//NSDateを吐き出して終わり
        let nextLimit = calendar.dateFromComponents(comps)

```

加算とセットで二回NSDateを吐き出すのがちょっとカッコ悪いけどこれで大丈夫です。
ShinobiLayer: VLANに名前を付けて注文時のミスをなくす

#はじめに
SoftLayerでは複数のVLANを取得して、注文時にどのVLANにプロビジョニングするかを選択可能です。でも、VLAN番号だけでは混乱しますよね・・・？　ということで、これを分かりやすく判別するためのTipsを紹介します。

#VLANに名前を付ける方法
Customer Portalから、Network -> IP Management -> VLANと選択し、VLAN一覧の画面にて、"Name"欄を好きな名前に変更して下さい。デフォルトでは空になっています。
![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/697f191c-5e0d-304e-e222-2ab053e039d2.jpeg)

#注文画面での確認
注文時に、VLANの画面で**Auto Assigned**ではなく手動でVLANを選択してみて下さい。ちゃんと上述で設定した名前が出てきています！番号だけじゃないから分かりやすいですね。
![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/7e40fc66-a9a6-9166-ee1b-8af2edbd12f9.jpeg)
rubyで簡単並列処理（Parallel）

rubyで並列処理を書く場合、Parallelが簡単でおすすめです。

#インストール

```
gem install parallel
```

#実装例

マルチスレッドの例

```rb
list = ["A", "B", "C", "D"]
Parallel.each(list, in_thread: 2) do |name|
  puts name
end
```

マルチプロセスの例

```rb
list = ["A", "B", "C", "D"]
Parallel.each(list, in_process: 2) do |name|
  puts name
end
```

forkなどの処理をParallelが隠ぺいしてくれるので楽に書けますね。
in_thread, in_processの値を増やすことで並列度変更することもできます。
GitHubに突然現われたorthographic-pedantの謎を追え!!


## ある日突然PRをもらった

自分がOwnerになってる[CyberAgent/beezlib](https://github.com/CyberAgent/beezlib)で昨日突然こんなPull Requestが来ました。

[Fix typographical error(s) by orthographic-pedant · Pull Request #17 · CyberAgent/beezlib](https://github.com/CyberAgent/beezlib/pull/17)

![Fix_typographical_error_s__by_orthographic-pedant_·_Pull_Request__17_·_CyberAgent_beezlib.png](https://qiita-image-store.s3.amazonaws.com/0/1008/a6cdcd93-e568-5bcd-9dc6-f1609f6486c7.png "Fix_typographical_error_s__by_orthographic-pedant_·_Pull_Request__17_·_CyberAgent_beezlib.png")

PRの中身は単純な **README** のtypoを直してくれたものでした。コメント通り即mergeしたわけですが…。

## orthographic-pedantって何者?

なんだか、コメントとかもやたら丁寧だし、これ何やってる人なんだろうかな?と興味本位で[プロフィール](https://github.com/orthographic-pedant)見てみました。

![orthographic-pedant.png](https://qiita-image-store.s3.amazonaws.com/0/1008/bfcb3596-591e-4f9c-c2a3-cd684edd9070.png "orthographic-pedant.png")

**…?!**

![orthographic-pedant2.png](https://qiita-image-store.s3.amazonaws.com/0/1008/8dd6054a-49d4-8a00-f32d-15fe662b0195.png "orthographic-pedant2.png")

ナニコレ…。

アカウント作ったのはつい先日なのに、Contributionが1882?

ヒゲの長さも尋常じゃない。

## 解決編

これはどう見ても、オカシイと思いちょっとググったところ。さくっと疑問は解決しました。

![Cyrille_RossantさんはTwitterを使っています___Orthographic_Pedant__a_GitHub_bot_that_scans_popular_repos_for_common_typos_and_will_correct_them_with_pull_requests_https___t_co_NzGHWAwHKr_.png](https://qiita-image-store.s3.amazonaws.com/0/1008/42187f05-2a10-d451-5407-03009dd9731f.png "Cyrille_RossantさんはTwitterを使っています___Orthographic_Pedant__a_GitHub_bot_that_scans_popular_repos_for_common_typos_and_will_correct_them_with_pull_requests_https___t_co_NzGHWAwHKr_.png")

["Orthographic Pedant: a GitHub bot that scans popular repos for common typos and will correct them with pull requests https://t.co/NzGHWAwHKr"](https://twitter.com/cyrillerossant/status/649541028467249153)

まあ大体の人は分かったでしょうが、Botでした。

プロジェクトはこちらです。

[thoppe/orthographic-pedant](https://github.com/thoppe/orthographic-pedant)

GitHubにあるリポジトリを勝手にさらって、よくある英語の単語のtypoを直してくれるというBotでした。これは便利ですね。

どのリポジトリのどの間違いを直したかの[ログ](https://github.com/thoppe/orthographic-pedant/blob/master/logs/submitted.log)もあったんで、覗いてみるとちょっと面白いです。

## 結論

もしかしたら自分のリポジトリに同じようなPRくるかもしれませんが、Botなんで返答とかしないで良いと思います!

自分は返信してちょっと恥かしい思いをしました!!!
Ubuntu ユーザのパスワード設定（変更）

Ubutuのインストール初期では、rootユーザにパスワードが設定されていない。
以下の手順に従い、パスワードを設定する。

$ sudo su -
Pssword:hogehoge（自分のパスワード）
\# passwd
[rootのパスワードを設定]
[uGUI]Prefabに余計なSpritePackが入っていないか調べる

### uGUIではSpriteにPackingTagを設定するだけで自動的にAtlas化してくれてとっても便利ですよね。

しかしながらAtlasがspriteを明示的に表示してくれないがゆえに、そのPrefab用でないspriteを使ってしまうというミスも起きがちです。

例えば
CharaStatus.prefabには
・common
・charaStatus
を使う想定でいたのに、charaStatusAtlasに入っていないSpriteを一つ混入しただけで、1024×1024だかの余計なメモリを読み込むことになってしまいます。
これを人力でチェックするのは結構大変。。。ということでエディタスクリプトで対応しました。

## Editorスクリプトでの対応
```CheckPackingTag.cs
	[MenuItem("Hoge/CheckPackingTag")]
	private static void CheckPackingTag()
	{
		Dictionary<string, int> tagDic = new Dictionary<string, int> ();
		tagDic.Add ("notPacked", 0);

		Selection.objects = Selection.activeGameObject.GetComponentsInChildren<Image>();

		foreach (Image img in Selection.objects) {
			if (img.sprite != null){
				//Debug.Log(img.sprite.name);
				string path = AssetDatabase.GetAssetPath(img.sprite.texture);
				TextureImporter imp = AssetImporter.GetAtPath(path) as TextureImporter;
				if (imp != null){
					if (string.IsNullOrEmpty(imp.spritePackingTag)){
						tagDic["notPacked"] = tagDic["notPacked"] + 1;
					}else{
						if (tagDic.ContainsKey(imp.spritePackingTag) == false){
							tagDic.Add(imp.spritePackingTag, 0);
						}
						tagDic[imp.spritePackingTag] = tagDic[imp.spritePackingTag] + 1;
					}
				}
			}
		}
　　　　　　　　　Debug.Log("Summary");
		foreach (var key in tagDic.Keys) {
			Debug.Log(key + ":" + tagDic[key].ToString());
		}
	}
```
やっていることは
1. 触っているPrefabの中のImageを全て舐める
2. SpriteからTextureImporterを生成
3. packingTagを集計
4. 仲間外れを探せ！

こんな感じで、幸せになれるかと思います。
util.isXxx is deprecated

https://nodejs.org/api/util.html を読んでいたら`util.isXxx`系のメソッドがdeprecatedになっていてびっくりした。

## 経緯

@yosuke_furukawa さんに経緯を教えてもらった。

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/sasaplus1">@sasaplus1</a> 経緯を説明すると、 util.isObject が functionに対してtrueと判定されない =&gt; functionはobjectとして仕様に明記されてるし、underscoreもそう判定する=&gt;そもそもisXxxいらなくない？=&gt;deprecated</p>&mdash; Yosuke FURUKAWA (@yosuke_furukawa) <a href="https://twitter.com/yosuke_furukawa/status/651959190534000640">2015, 10月 8</a></blockquote>

https://twitter.com/yosuke_furukawa/status/651959190534000640

---

調べたらちゃんと[CHANGELOG.md](https://github.com/nodejs/node/blob/master/CHANGELOG.md#2015-09-08-version-400-stable-rvagg)に書いてあった。

> util: The util.is\*() functions have been deprecated, beginning with deprecation warnings in the documentation for this release, users are encouraged to seek more robust alternatives in the npm registry, (Sakthipriyan Vairamani) #2447.

- https://github.com/nodejs/node/blob/master/CHANGELOG.md#2015-09-08-version-400-stable-rvagg
- https://github.com/nodejs/node/pull/2715
- https://github.com/nodejs/node/pull/2447
- https://github.com/nodejs/node/pull/1301

## util.isXxxを使いたいとき

https://github.com/nodejs/node/pull/1301#issuecomment-88178570 には

> core-util-is package is a suitable replacement in user-land IMO

とあるので`core-util-is`を使えば良いっぽい。このライブラリには`isXxx`系のメソッドだけが入っている。

---

何も考えずに「あ、新しいの出てる」と`nodebrew install-binary`するのもいいけど、ちゃんと変更点も読もうと思いました( ˘ω˘)
特定のプロセスを監視して、落ちてたら Slack に通知するシェルスクリプト書いてみた

# はじめに

Rails でメール送信等を sidekiq のキューに入れて処理させていたが、sidekiq が落ちてしまって、
メール送信が行われなくなってしまうことが、たびたびあったので、監視の必要性が出てきた。

監視で引っかかった際の通知の方法としては、メールはあんまり見ないので、どうせならいつも開いていて、
プッシュ通知も来る Slack に投稿してやろう思い、プロセスを監視して、Slack に通知するシェルスクリプトを書いてみた。

使用方法は、サーバーにシェルスクリプトを設置し、crontab に下記のよう追加する。
今回は、sidekiq を監視したいので、引数は sidekiq。

```:crontab
*/1   *  *  *  *  cd /home/yutackall/work && ./process_watch.sh sidekiq
```

色々雑だけど、暫定対応としては動いてくれるので、いいのかなと。

# サンプルソース

```bash:process_watch.sh
#!/bin/sh
# Incoming WebHooks URL
WEBHOOKURL="https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
# slack channel
CHANNEL="#general"
# user name for direct message
USER="@yutackall"
# slack user name
BOTNAME="process_watch_bot"
# slack icon
FACEICON=":ghost:"

if [ $# -ne 1 ]; then
  echo "Usage: $0 process_name" 1>&2
  exit 1
fi
PROCESS_NAME=$1
MESSAGE="Process Not Found!! process_name: ${PROCESS_NAME}"

COUNT=`ps -ef | grep ${PROCESS_NAME} | grep -v grep | grep -v $0 | wc -l`
if [ ${COUNT} = 0 ]; then
  # channel へ通知
  curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${MESSAGE}\" }" ${WEBHOOKURL} >/dev/null
  # 自分へもダイレクトメッセージを送信
  curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${USER}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${MESSAGE}\" }" ${WEBHOOKURL} >/dev/null
fi

```

channel や、user 等を引数から取ることも考えたけど、最低限で十分だと判断した。

# Slack の設定
Slack には [Incoming Webhooks](https://api.slack.com/incoming-webhooks) という、外部から Slack で発行した URL に POST すれば、
そのまま channel や user への direct message が送信できる機能があるので、それを利用した。

Incoming Webhooks の設定は下記記事を参考にした。

[[10分で出来る]シェルスクリプトの結果をslackに投稿](http://qiita.com/tt2004d/items/50d79d1569c0ace118d6)
Apache PDFBox


http://pdfbox.apache.org/

PDFBoxはJavaでPDFを扱えるOSSです。
（コマンドラインからも使えるそうです）
2015年10月現在、最新バージョンは1.8.10。
ライセンスはApache License v2.0。

公式サイトのトップページによると、代表的な機能は以下の通り。

- テキスト抽出
PDFファイルからテキストを抽出

- 分割＆マージ
1つのPDFファイルを複数ファイルに分割したり、複数のファイルをマージしたりできる

- Form
formsからデータを抽出したり、埋めたりできる。

- Validation
PDF/A-1b標準に準拠しているかチェックできる

- 印刷
Java標準の印刷APIを使ってのPDF印刷

- 画像として保存
PDFをPNGやJPEG形式で保存可能。

- PDF生成
formや画像を埋め込んでのPDF作成が可能

- 署名
電子署名を扱える


### インストール

公式サイトからJarをダウンロードするか、Mavenで。

``` XML:pom.xml
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>1.8.10</version>
</dependency>
```
### Hello World

とりあえずHello Worldしてみます。

```Java:HelloWorld.java
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

import java.io.IOException;

public class HelloWorld {
    public static void main(String... args) {
        try {
            // PDDocumentオブジェクトを生成して、Pageも設定しておく
            PDDocument document = new PDDocument();
            PDPage page = new PDPage();
            document.addPage(page);

            // コンテンツを設定するStreamオブジェクトを生成する
            PDPageContentStream contentStream = new PDPageContentStream(document, page);

            // フォントとポジションを指定してコンテンツを書き込む
            contentStream.beginText();
            contentStream.setFont(PDType1Font.HELVETICA, 20);
            contentStream.moveTextPositionByAmount(100, 700);
            contentStream.drawString("Hello World");
            contentStream.endText();

            // Streamオブジェクトを閉じる
            contentStream.close();

            // ファイルを保存して閉じる
            document.save("helloWorld.pdf");
            document.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (COSVisitorException e) {
            e.printStackTrace();
        }

    }
}
```
$.DeferredとPromiseの使い方コードメモ

何か入門記事読んだ後の
書いて確認用です

```js:hoge

var dfd = $.Deferred();
    dfd.done(function(){
      console.log('成功');
})
.fail(function(){
    console.log('失敗');
})
.then(function(){
    console.log('thenだよ！');
});

dfd.resolve();   // 成功とthenが呼ばれる
//dfd.reject();    // 失敗が呼ばれる

// ----------------------------------------------------- //

var dfd = $.Deferred(function(dfd) {
    setTimeout(function(){
    // 処理が完了したら resolve して処理をコールバックに移す
        dfd.resolve('２秒経過');
    }, 2000);
});
         
// 結果を受けて処理をする
dfd.done(function(result) {
    alert(result);
});

// ----------------------------------------------------- //

// jQueryアニメーションで使う時
// コールバック多発なこれをどうにかする
/*
        $('#img1').animate({'marginLeft': '500px'}, function(){
            $('#img2').animate({'marginLeft': '500px'}, function(){
                $('#img1').animate({'marginLeft': '0px'}, function(){
                    alert('終了');
                });
            });
        });
*/

var animation = function(){
    var dfd = $.Deferred();
    $('#img1').animate({'marginLeft': '500px'}, function(){
        dfd.resolve();
    });
    return dfd.promise();  // リターンしないとthen以降の処理が動かない
};
        
animation().then(function(){
     return $('#img2').animate({'marginLeft': '500px'});
})
.then(function(){
     return $('#img1').animate({'marginLeft': '0px'});
})
.then(function(){
     return $('#img2').animate({'marginLeft': '0px'});
})
.then(function(){
     alert('終了');
});

```
Pythonで総和を実装

# 総和の式を実装してみる

```math
\sum_{i=m}^{n} f(x) = f(m) + f(m+1) + \cdots + f(n) \\
```

```lang:sigma.py
def sigma(m, n, func, s = 0) :
    if m > n: return s
    return sigma(m + 1, n, func, s + func(m))
```
#使用例
```lang:sigma_test.py
print(sigma(1, 10, lambda x : x))
55

print(sigma(1, 3, lambda x : 3 * 5 ** (x - 1)))
93
```
Webで適当な問題見つけて入力したけどちゃんと動いてそう。
もっと効率のいい書き方とか、もっとオサレな書き方とか、もうそれ用意されてるしとかもあるのかも。
##追記
NumPyという数学関数ライブラリがあるので大抵の式は揃っていそう。。。
>Pythonの数値計算ライブラリ NumPy入門
>http://rest-term.com/archives/2999/
iOS, Android で SMS アプリを起動する a タグを調べてみた

HTML から sms アプリを起動する方法がないか調べてみた
基本的には、`sms::` で起動可能

```html
<a href="sms:09000000000">SMS 起動</a>
```

ただし、メッセージを入れる方法が、iOS、Android で異なっていた

# iOS
iOS の場合は、番号に続けて `&body=メッセージ` の形式で追加

```html
<a href="sms:09000000000&body=testMessage">SMS 起動テスト</a>
```
<a href="sms:09000000000&body=testMessage">SMS 起動テスト</a>

# Android
Android の場合は、番号に続けて `?body=メッセージ` の形式で追加

```html
<a href="sms:09000000000?body=testMessage">SMS 起動テスト</a>
```

<a href="sms:09000000000?body=testMessage">SMS 起動テスト</a>
plistファイルの構文チェック

短いメモですが、XCodeのビルド時にInfo.plistがエラーになった場合、あまり詳しい事を教えてくれません。
そういう時は以下のようにコマンドラインから指定して詳細を確認しましょう。

```
% plutil -lint Info.plist
Info.plist: Encountered unexpected character [ on line 2 while parsing inline DTD
```

plistファイルでおかしい箇所を教えてくれます。

``` xml:Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"[]>
```
末尾の[]がおかしいわけですね