OmniAICreator/Qiita-1.07M huggingface dataset:
Retrolambda+RobolectricでUnitTestするときのメモ

# Androidアプリ開発でラムダ式使いたいよね

インデント量が減らせるし、慣れれば可読性が保てるので導入したいよね。

# Retrolambdaを導入してみた

JDK1.8入れて、Pluginを導入するだけなので簡単に導入できる。

```groovy
// build.gradle
buildscript {
    dependencies {
        classpath 'me.tatarka:gradle-retrolambda:3.2.5' // support Lambda
    }
}

apply plugin: 'me.tatarka.retrolambda' /* Android Lambda Support */
```

# assembleはできたけどUnitTestビルドが行えない

ビルドしようとしたらいつものエラーが出てビルドできない
<pre>
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
:app:compileGoogleplayDebugUnitTestJavaWithJavac
javacTask: ターゲット・リリース1.7がデフォルトのソース・リリース1.8と競合しています
Error:Execution failed for task ':app:compileGoogleplayDebugUnitTestJavaWithJavac'.
> Compilation failed; see the compiler error output for details.
</pre>

# ネットの海を探したがダメだった

[八木さんの情報](http://sys1yagi.hatenablog.com/entry/2015/04/12/144949)をbuild.gradleを修正したけど、やっぱりビルドできない。

```groovy
tasks.withType(Test) {
    project.tasks
            .findAll {
        task -> (task.name ==~ /compile.*?TestJava/)
    }
    .each { task ->
        task.doFirst {
            def buildPath = "$project.buildDir/retrolambda"
            def jarPath = "$buildPath/$project.android.compileSdkVersion"
            def javac = "${project.retrolambda.tryGetJdk()}/bin/javac"

            sourceCompatibility = JavaVersion.VERSION_1_8
            targetCompatibility = JavaVersion.VERSION_1_8

            options.fork = true
            options.compilerArgs += ["-bootclasspath", "$jarPath/android.jar"]
            options.forkOptions.executable = javac
        }
    }
}
```

# ちょっとイジッて解決した

タスク名をよく見たら${compile}${flavor名}DebugUnitTestJava"WithJavac"というタスク名になっていた。タスク名が微妙に変わっていたので、それに追従して正規表現パターンとやることをちょっと変えた。

これで無事にUnitTestが通るようになった。

```groovy
tasks.withType(Test) {
    project.tasks
            .findAll {
        task -> (task.name ==~ /compile.*?TestJava.*?/)
    }
    .each { task ->
        task.doFirst {
            sourceCompatibility = JavaVersion.VERSION_1_8
            targetCompatibility = JavaVersion.VERSION_1_8
        }
    }
}

```

# 最後に

きっとこの情報は1年以内に使えなくなるんだろうな・・・（AS2.0を眺めながら）
不小心在github上传了带密码的文件的删除方法


# 介绍

如果我们不小心在GitHub上Push了带密码的文件，那么就算删掉文件，commit历史还是残留的。

怎样删除commit历史呢？

办法还是有的。官网的帮助页面有写

[Remove sensitive data](https://help.github.com/articles/remove-sensitive-data/)

# 方法

使用 `git filter-branch` 替换历史，然后 `--force` push。

比如把写有密码的Rakefile不小心push到Github上的话，做以下操作即可。

```bash
$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch Rakefile' --prune-empty --tag-name-filter cat -- --all
$ git push origin master --force
```
環境変数について

# さきにまとめ
- シェル変数は別プロセスには引き継げない
- 環境変数は親プロセスから子プロセスへ引き継げる
- 子プロセスから親プロセスへ引継ぐ場合は、親プロセス側で「source」コマンドを実施する


# 親プロセスから子プロセスへの引継ぎ
親プロセスでシェル変数 hoge 作成

```bash
$ hoge='hoge'
$ echo $hoge
hoge
```

こういうシェルがあるとして、

```bash
$ cat child.sh
#!/bin/sh
echo $hoge
```

実行してもシェル変数は子プロセスでは表示されない

```bash
$ ./child.sh
# 何も表示されない
```

そのかわりシェル変数を環境変数にすると、

```bash
$ export hoge
```

子プロセスでも表示される

```bash
$ ./child.sh
hoge # 表示される
```

# 子プロセスから親プロセスへの引継ぎ

子プロセスで環境変数 fuga を作成

```bash
$ cat child.sh
#!/bin/sh
echo $hoge

fuga='fuga'
export fuga
```

そのままだと親プロセスでは表示されない

```bash
$ echo $fuga
# 何も表示されない
```

そこで source コマンドを実行

```bash
$ source child.sh
hoge
```

~~子プロセスで作成した環境変数が親プロセスでも表示される~~
source コマンドを実行することで、child.sh の内容が同じプロセス上で実行されることになるので、ただしく表示される

```bash
$ echo $fuga
fuga
```
echonest の python client で API をたたいてみた


#echonest とは
The Echo Nest は、音楽情報のデータベースを扱う企業で、2014 年に Spotify に買収されたようです。
音楽情報の API を公開しています。
http://the.echonest.com/

#echonest の公開しているライブラリ
http://developer.echonest.com/client_libraries.html

#試した環境
Centos 7.2
Python 2.7
今回は Pyechonest を使ってみました

#Pyechonest のインストール
`easy_install -U pyechonest`

#API key の取得
http://developer.echonest.com/
こちらからフリーのアカウントを作成します。
メールにてアカウント有効化の確認が届きます。

Your Profile のページに `Your API Key:` が表示されます
https://developer.echonest.com/account/profile

#Examples をベースにして python ファイルを作成します
Bikini Kill ではなく Duke Ellington に似たアーティストを表示させます。

`vi echotest.py`

```python:echotest1.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

from pyechonest import config
config.ECHO_NEST_API_KEY="YOURAPIKEY"

from pyechonest import artist
de = artist.Artist('duke ellington')
print "Artists similar to: %s:" % (de.name,)
for similar_artist in de.similar: print "\t%s" % (similar_artist.name,)

```

#結果


```
Artists similar to: Duke Ellington:
	Count Basie
	The Duke Ellington Band
	Earl Hines
	Woody Herman
	Count Basie Orchestra
	Stan Kenton
	Benny Carter
	Lionel Hampton
	Benny Goodman
	Teddy Wilson
	Johnny Hodges
	Fletcher Henderson
	Buddy Rich
	Duke Ellington Orchestra
	Harry James
```

年代的な相関を重視しているような結果に見えます。


#アーティスト ID を表示します

```python:echotest2.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

from pyechonest import config
config.ECHO_NEST_API_KEY="YOURAPIKEY"

from pyechonest import artist
a = artist.Artist('duke ellington')
print a.id
```

#結果
```
ARMI36C1187B99A462
```

#Duke Ellington の アーティストの出身地および Perdido という曲のテンポ、曲の長さを表示します
```python:echotest3.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

from pyechonest import config
config.ECHO_NEST_API_KEY="YOURAPIKEY"

from pyechonest import song
de_results = song.search(artist='duke ellington', title='perdido')
perdido = de_results[0]
print perdido.artist_location
print 'tempo:',perdido.audio_summary['tempo'],'duration:',perdido.audio_summary['duration']
```

#結果
```
{u'latitude': 47.3917, u'location': u'Washington D.C. ', u'longitude': -121.5708}
tempo: 129.606 duration: 188.4
```

#さいごに
もっと音楽 API の記事が増えてほしいなと思って書きました。
http://qiita.com/hideyuki/items/8b5c6b02d0784aa25fd2
【朗報】OnsenUI2.0beta6での仕様変更について

OnsenUI2.0 beta6で一部仕様変更がありましたのでご報告申し上げます。

##統廃合の整理
【廃止】ons-material-input
【新設】ons-input

##詳細
Onsenui-betaではinputタグに対応させるため、ons-material-inputがありました。
ところが、beta6にて使えなくなったため、onsenui.cssを除いた所、ons-inputなるものがありました。記述を見ると、どうもMaterialDesignは継承しているっぽい。

##記述
```Onsenui2.0bate6
 <ons-input label="Username"></ons-input>
```

と書きますが、これでは従来通りのものしか表示されません。
そこで、

```Onsenui2.0bate6
 <ons-input label="Username" modifier="material"></ons-input>
```

と書きます。あら不思議。フローティングします。
当然、

```Onsenui2.0bate6
 <ons-input label="Password" type="passoword" modifier="material"></ons-input>
```

と書けば、"・・・・"となります。

フローティングを止めたければ

```Onsenui2.0bate6
 <ons-input label="Password" type="passoword" no-float modifier="material"></ons-input>
```

となりますし、入力をさせたくなければ、

```Onsenui2.0bate6
 <ons-input label="Password" type="passoword" disabled modifier="material"></ons-input>
```

となります。
フリー記述以外では

```Onsenui2.0bate6
 <ons-input label="Age" type="number" min="13" max="99" modifier="material"></ons-input>
```

などと記述することも出来ます。なので基本的に、非常に簡単に記述することが出来るようになったと、いうことです。この他にもタグで変更があったものがありそうなので何かありましたら、追記します。
UICollectionViewで動的にマージンを変更したいとき、cellのサイズをstoryboardの設定値から取ってくる

- UICollectionViewFlowLayoutを利用していて、セルごとのマージンをデバイスによって変えたりしたい場合の話です。

- この方法で、厳密にはstoryboardで設定した値というか、現在のレイアウトで指定されている値が取得できます。

- なにげにハマってしまったのでメモです。

- 下のようなデリゲートメソッドでセルごとの最小マージンを指定するのですが

```
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {

    guard let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout else {
            return 100 //テキトー
        }

    print(flowLayout.itemSize.width, flowLayout.sectionInset.left)
    return 1000 //テキトー
}
```

- UICollectionViewLayout を UICollectionViewFlowLayout にキャストした flowLayout のなかに色々入ってました。これを使って正しいマージンを計算するとデバイスごとに異なるマージンで出力できますね。
Sublime Text3にLorem ipsumの日本語版を！

# Lorem ipsumとは

有名なダミーテキストですね。

> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Sublime Text 3では `lorem` と打ってからTabキーを押すと上記文章が現れます。

# 日本語版もほしい…

なぜだか忘れましたが、欲しくなった時がありました。
スニペット登録しましょう。

Tools -> new Snippet... を選択するとスニペット用テンプレートファイルが開きますので、内容を以下の通りに。

```xml:jlorem.sublime-snippet
<snippet>
    <content><![CDATA[
ルイズ！ルイズ！ルイズ！ルイズぅぅうううわぁああああああああああああああああああああああん！！！
あぁああああ…ああ…あっあっー！あぁああああああ！！！ルイズルイズルイズぅううぁわぁああああ！！！
あぁクンカクンカ！クンカクンカ！スーハースーハー！スーハースーハー！いい匂いだなぁ…くんくん
んはぁっ！ルイズ・フランソワーズたんの桃色ブロンドの髪をクンカクンカしたいお！クンカクンカ！あぁあ！！
間違えた！モフモフしたいお！モフモフ！モフモフ！髪髪モフモフ！カリカリモフモフ…きゅんきゅんきゅい！！
小説11巻のルイズたんかわいかったよぅ！！あぁぁああ…あああ…あっあぁああああ！！ふぁぁあああんんっ！！
]]></content>
    <tabTrigger>jlorem</tabTrigger>
</snippet>
```

保存する際に拡張子を `.sublime-snippet` にするのをお忘れなく。
`jlorem` と打ってTabキーを押すとダミーテキストが出てくるようになります。
便利ですね。
FuelPHPのRestでJSONを返した時にはまるなど

#JSON形式で返ってきてるはずなのに。
うけとったJavaScript側でふたたび`JSON.parse`するハメに。
処理がダサい。原因もダサい。ただのパラメータ不足だった。

#修正前

```js:JavaScript&#32;(jQuery)
function update_hoge() {
    var params = {foo: "bar"};
    $.ajax({
        type: "POST",
        url: "/index/update_hoge",
        data: params,
    }).then(function(data){
        console.log(JSON.parse(data).text); // <- この一行がダサい
    });
}
```

```php:PHP&#32;(FuelPHP)
class Controller_Index extends Controller_Rest {

    public function update_hoge() {
        $this->format = 'json';
        $json = ['text' => 'いろいろ'];
        return $this->response($json);
    }

}
```

#修正後

`$.ajax()`のオプションに `dataType:"json"` を書き忘れてた。

```js:JavaScript&#32;(jQuery)
function update_hoge() {
    var params = {foo: "bar"};
    $.ajax({
        type: "POST",
        url: "/index/update_hoge",
        data: params,
        dataType: "json",
    }).then(function(data){
        console.log(data.text); // <- すぐとれる
    });
}
```

#FuelPHPのRestについて

- [Rest コントローラ - 概要 - FuelPHP ドキュメント](http://fuelphp.jp/docs/1.8/general/controllers/rest.html)
HTTPSのWordpressでGravatarのアバター画像を表示する

http通信であれば下記のコードで表示されるのですが、サイト全体をHTTPS通信にするとMixed Contentとなりアバター画像が表示されなくなってしまいます。

```php
<?php echo get_avatar(get_the_author_id(), 30); ?>
```

こう書いたら解決しました。

```php
<img src="https://secure.gravatar.com/avatar/<?php echo md5(strtolower(trim(get_the_author_meta('user_email')))); ?>?s=30">
```

ユーザーのEメールを取得、`trim`でスペースを削除、`strtolower`で小文字化、表記のゆれをなくしてからmd5でハッシュ化します。

`30`の数字は画像サイズです。調整して使ってください。

## 参考文献

[Image Requests](https://ja.gravatar.com/site/implement/images/)

[Creating the Hash](https://ja.gravatar.com/site/implement/hash/)

もっとスマートな書き方があれば教えていただけると嬉しいです！
forEachの中で進捗を表示したい時ってあるよね


java8のstreamを使っていて、一定間隔ごとに進捗を出力するときにふと手が止まったのでメモ。

リスト`list`を処理して`PRINT_STEP`個ごとに進捗表示することを想定。

## レガシーな書き方

```java
for (int i = 0; i > list.size(); i++) {
  proc(list.get(i));
  if (i % PRINT_STEP == 0) {
    out.println(i + "/" + list.size());
  }
}
```

そんなに見づらくないと感じてしまうのは古い人間だからだろうか。。。

## レガシーその２

```java
int count=0;
for (Elem e : list) {
  proc(e);
  
  if (count++ % PRINT_STEP == 0) {
    out.println(count + "/" + list.size());
  }
}
```

`count`がとってもダサい。前の方がまだ良い。

## streamで書いてみる

初めに書きなおしたらこんなのになった。

```java
list.forEach(e -> {
  proc(e);
  int i = list.indexOf(e);
  if (i % PRINT_STEP == 0) {
    out.println(i + "/" + list.size());
  }
});
```

ひどい点：
* `indexOf`で性能劣化
* リストに重複要素が入っていたら意図通りに動かない
* リスト要素`Elem`のequalsが正しく実装されていないと動かない
* forEach内が長くて読みにくい

## indexOfを使わない

論外なところからなんとかします。
欲しいのはリストの序数なので、IntStreamを使えばなんとかなりそう。恥ずかしがら思いつくのに時間がかかった。。。

```java
IntStreasm.range(0, list.size())
    .forEach(i -> {
      proc(list.get(i));
      if (i % PRINT_STEP == 0) {
        out.println(i + "/" + list.size());
      }
    });
```


## streamっぽくする

java8の何がいいって、簡潔に書けるところだと思います。簡潔に書けないから無理して使わないほうがマシ。
ということで、まずforEach内を分割してキレイにする。

```java
IntStreasm.range(0, list.size())
    .peek(i -> proc(list.get(i)))
    .filter(i -> i % PRINT_STEP == 0)
    .forEach(i -> out.println(i + "/" + list.size()));
```

これくらいになるならレガシーじゃなくjava8記法を使う意味もあるかと。
stream内のラムダ式は、returnはもちろんブロックすらできれば書かないべきと思っています。

## まとめ

* stream中にリストの序数にアクセスしたいならIntStreamで始める
* ラムダは太らせるな

さあ次はparallelStreamだ。。。
Javaを用いたソケット通信　後編

# How can we implement in client?

それでは[前回](https://qiita.com/akatsubaki/items/aaca7664c5b881415bf5)に引き続きJavaを用いたソケット通信プログラミングを見ていこうと思います。
今回はクライアント側のソースコードです．

クライアント側でソケット通信を実現するには

- ソケットの生成
- スレッドクラスのインスタンスを生成し実行

の2項目をメインに実装します．

```java:client.java
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;


public class client extends JFrame implements Runnable
{
    //接続先ホスト名(今回はローカルホスト)
    //ここにサーバのIPアドレスを指定します．普通はハードコーディングせずに外部入力から設定します．
    //例)　192.xxx.yyy.z --> "192.xxx.yyy.z"
	public static final String HOST = "localhost";
    //接続先ポート番号(サーバー側で設定したものと同じもの)
    //ポート番号をクライアントとサーバ間で一致させてないと通信できませんよ！
	public static final int PORT    = 10000;

    //今回はGUIアプリを作ったので，ソケット通信に関係ないメンバ変数も含んでます．
	private JTextField tf;
	private JTextArea  ta;
	private JScrollPane sp;
	private JPanel pn;
	private JButton bt;

    //ソケット通信用の変数です．サーバ側と同じくソケットクラス，バッファへの読み書きクラスです．
	private Socket sc;
	private BufferedReader br;
	private PrintWriter pw;

	public static void main(String[] args)
	{
		client cl = new client();
	}

	public client()
	{
        //親クラスのコンストラクタを呼び出し
		super("Client Field");

		tf = new JTextField();
		ta = new JTextArea();
		sp = new JScrollPane(ta);
		pn = new JPanel();
		bt = new JButton("Send");

        //以下、GUIレイアウトとコンポーネントのイベント設定
		pn.add(bt);
		add(tf, BorderLayout.NORTH);
		add(sp, BorderLayout.CENTER);
		add(pn, BorderLayout.SOUTH);

		bt.addActionListener(new SampleActionListener());
		addWindowListener(new SampleWindowListener());

		setSize(400,300);
		setVisible(true);

        //Threadクラスのインスタンスを作成・実行
        //ここからソケット通信用のスレッドが作成され，通信が開始します．
		Thread th = new Thread(this);
		th.start();
	}

    //Runメソッドの実装
	public void run()
	{
		try{
            //ここでサーバへ接続されます
			sc = new Socket(HOST,PORT);
			br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
			pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sc.getOutputStream())));

            //サーバから受け取ったデータをGUI表示させているのですが，スレッドが終了しないように無限ループさせてます
			while(true){
				try{
					String str = br.readLine();
					ta.append(str + "\n");
				}
				catch(Exception e){
					br.close();
					pw.close();
					sc.close();
					break;
				}
			}
		}
		catch(Exception ex){
			ex.printStackTrace();
		}
	}

	public class SampleActionListener implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
			try{
                //今回のGUIアプリはテキストをボックスに入力　→　送信ボタンで送信というシンプルな構造になってます．
                //ボタンにリスナーを登録し，押下時に送信バッファからデータを送信するようにしてます．
				String str = tf.getText();
				pw.println(str);
				ta.append(str + "\n");
				pw.flush();
				tf.setText("");
			}
			catch(Exception ex){
				ex.printStackTrace();
			}
		}
	}

	class SampleWindowListener extends WindowAdapter
	{
		public void windowClosing(WindowEvent e)
		{
			System.exit(0);
		}
	}
}

```

# Conclusion

少々簡単すぎたかもしれません．最近ではIoTとかAI，ビッグデータなどの技術用語がバズっていますが，どれもネットワーク技術は切り離せない存在だと思っています．情報系の学生さんは機械学習や画像処理などに興味が湧くと思いますが，ぜひネットワークプログラミングも経験してみてください．
zabbix-serverプロセスが起動しない場合の対処（cacheメモリ問題）

zabbix-serverプロセスをスタートしても落ちる症状
色々と症状はあると思いますが、とある一つのパターン
Cacheメモリサイズ問題編

#環境
・Redhat系OS
・zabbix2.4系 rpm版

#zabbix serverの起動をしてみる

```
# /etc/init.d/zabbix-server status
zabbix_server は停止しています
#
# /etc/init.d/zabbix-server start
Starting Zabbix server:                                    [  OK  ]
# /etc/init.d/zabbix-server status
zabbix_server は停止しています
```

#ログを確認してみる

```
# tail -f /var/log/zabbix/zabbix_server.log
　　　　　　　↓スタートしたタイミングのログ↓
 47072:20151021:142301.651 Starting Zabbix Server. Zabbix 2.4.1 (revision 49643).
 47072:20151021:142301.651 ****** Enabled features ******
 47072:20151021:142301.651 SNMP monitoring:           YES
 47072:20151021:142301.651 IPMI monitoring:           YES
 47072:20151021:142301.651 WEB monitoring:            YES
 47072:20151021:142301.651 VMware monitoring:         YES
 47072:20151021:142301.651 Jabber notifications:      YES
 47072:20151021:142301.651 Ez Texting notifications:  YES
 47072:20151021:142301.651 ODBC:                      YES
 47072:20151021:142301.651 SSH2 support:              YES
 47072:20151021:142301.651 IPv6 support:              YES
 47072:20151021:142301.651 ******************************
 47072:20151021:142301.651 using configuration file: /etc/zabbix/zabbix_server.conf
 47072:20151021:142301.659 current database version (mandatory/optional): 02040000/02040000
 47072:20151021:142301.659 required mandatory version: 02040000
 47072:20151021:142301.968 __mem_malloc: skipped 2 asked 313832 skip_min 8016 skip_max 123472
 47072:20151021:142301.968 [file:dbconfig.c,line:445] zbx_mem_realloc(): out of memory (requested 313832 bytes)
 47072:20151021:142301.968 [file:dbconfig.c,line:445] zbx_mem_realloc(): please increase CacheSize configuration parameter
```

#ログのメッセージを元に設定を修正
・increase CacheSize configuration parameterってログに出てるので
　zabbix server configurationのcachesizeをチューニングする
　defaultは8M　装着メモリやkernelパラメータのshared memoryで使用できる容量に注意する
　*取り急ぎ起動したかったのでdefaultの倍の値をここでは設定

```
# diff /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf.2015102101
319d318
< CacheSize=16M
```

```:configの該当行:
### Option: CacheSize
#       Size of configuration cache, in bytes.
#       Shared memory size for storing host, item and trigger data.
#
# Mandatory: no
# Range: 128K-8G
# Default:
# CacheSize=8M
CacheSize=16M
```


#公式ドキュメントの情報
>設定キャッシュのサイズ（バイト単位）。
>ホスト、アイテム、トリガーデータを保存するための共有メモリサイズ。
>Zabbix 2.2.3より前のバージョンの上限は、2GBでした。

#その他
監視項目数などにも左右される部分であり、
初期で含まれているtemplaeの「Template App Zabbix Server」にzabbix serverのCacheSizeを
取得する監視項目が存在するのでその辺りも参考にチューニングすると良さそう。
「Zabbix configuration cache」の部分など。
CacheSizeの設定だけで改善しない場合は、その他historyに関するCache等も調整すると良いと思う
git svn で特定ブランチだけをcloneする

全体をcloneするにはリポジトリが大きすぎるとか、一時的な作業なのでリポジトリ全体はいらないとかがあるので特定ブランチだけをcloneしてみる。

```
git svn clone "https://svn.example.com/svn/repos/branches/feature/foo "C:/example/foo" --prefix=origin/
```

--prifix オプションがないと"not a git repository" とか言われて終了する。
gitで履歴を変えずに特定のファイルを過去の状態に戻す方法

履歴を変えずに過去の状態に戻す方法はrevertを使ったコマンドがあるだろうと調べてみたら
特定のファイルのときはやっぱりcheckoutで良かった話

```
git checkout 特定のコミットハッシュ 特定のファイル
```
タスクの自動化をするためのGitHubアカウント(machine user)

以前、[RedmineとGitHubを連携](http://qiita.com/n_slender/items/54cd282c140fadbbb322)させたとき、最初はdeploy keyを使っていたのですが、複数リポジトリを扱うために、それらにアクセスできるアカウントに紐付けたSSH keyを使う形に変更しました。

複数アカウントを持つのはどうなのという話題もあって、[アカウントの利用規約](https://help.github.com/articles/github-terms-of-service/#a-account-terms) を見ていたら、上記のようなケースについての説明が見つかりました。


https://developer.github.com/guides/managing-deploy-keys/#machine-users

以下は説明文の抜粋です。

>Machine users

>If your server needs to access multiple repositories, you can choose to create a new GitHub account and attach an SSH key that will be used exclusively for automation. Since this GitHub account won't be used by a human, it's called a machine user. You can then add the machine user as collaborator or add the machine user to a team with access to the repositories it needs to manipulate. NOTE: Adding a machine user as a collaborator always grants read/write access. Adding a machine user to a team grants the permissions of the team.

Redmineと連携させるには、Redmineサーバ上に、リポジトリのミラーをつくるようなものなので、webhookで自動でgit pullするためのアカウントが必要なので、そのものずばりですね。

それでは、がんがんこういうアカウントを作っていいかというと、そうでもなさそうです。

直ぐ後にあるtipsで釘をさされています。botなどで、自動的にアカウントを作るのはだめということです。

>Tip: Our terms of service state:

>Accounts registered by "bots" or other automated methods are not permitted.

>This means that you cannot automate the creation of accounts. But if you want to create a single machine user for automating tasks such as deploy scripts in your project or organization, that is totally cool.


また、アカウント利用規約では、machine userはひとつまでと書いてあります。

>One person or legal entity may not maintain more than one free account, and one machine user account that is used exclusively for performing automated tasks.


何かの自動化のためであれば、サーバ毎にSSH keyを用意すれば、そのためのアカウントがひとつあれば事足りるので、そういうものかなという気がします。
proxmox4のLXCでdebian8->9に更新

* [LXCのubuntu 15.10 -> 16.04の更新が失敗する](https://bugs.launchpad.net/ubuntu/+source/ubuntu-release-upgrader/+bug/1511875)のでdebianで実施。

## sources.list

```bash:
sed -i -e 's/jessie/stretch/g' /etc/apt/sources.list
apt-get update
apt-get upgrade
reboot
```

```
apt-get dist-upgrade
```
Link > Pi Zero contest 2016 > Winners of the 10 Pi Zeros / 落選

[Adafruit Pi Zero Contest](https://hackaday.io/contest/9326-adafruit-pi-zero-contest)の10名のPiZero Winnersが公表された。
(10 Winners of PiZero has been announced)

[Winners of the 10 Pi Zeros](https://hackaday.io/contest/9326-adafruit-pi-zero-contest/log/32973-winners-of-the-10-pi-zeros)

落選した。
(I was not selected).
とりあえず、プロジェクトの最後まで実装を終わらせよう。
(Anyway, I will complete implementing all the features for my project).

上記のページはリンクが見れないのがほとんどなので、こちらでリンクを作っておく。
(The above link now has some problems, I made link as below).


- [RPi WiFi](https://hackaday.io/project/8678-rpi-wifi)
- [IQ Zero: Evolving Stupid, Imperfect Robots](https://hackaday.io/project/9848-iq-zero-evolving-unprogrammed-robots)
- [$5 Graphics Card For Homebrew Z80](https://hackaday.io/project/9567-5-graphics-card-for-homebrew-z80)
- [PiGrrl-Zero](https://hackaday.io/project/9467-pigrrl-zero)
- [LiFePO4wered/Pi](https://hackaday.io/project/9461-lifepo4weredpi)
- [Pi Chart](https://hackaday.io/project/9471-pi-chart)
- [Monitoring washing machines](
https://hackaday.io/project/9432-monitoring-washing-machines)
- [piStudio](https://hackaday.io/project/9530-pistudio)
- [TextEye: Raspberry Pi (Zero) Mobile Textreader](https://hackaday.io/project/9669-texteye-raspberry-pi-zero-mobile-textreader)
- [Mr. Gibbs](https://hackaday.io/project/9438-mr-gibbs)


<hr>
(追記 2016/03/03)
本家のリンクがきちんとなったようだ。
配列、ハッシュ、シンボル

配列を用いると複数の値を変数に保存することができる。

`names = ["Sato","Yamada","Tanaka"]`

names変数の中には３つのオブジェクトが保存してある。
配列のデータには、先頭から0,1,2...と順に「インデックス番号」というものが割り振られている。


`puts names[1]`

とすると、２番目にある

`Yamada`

が出力される。



ハッシュは配列と同じで、複数のデータをまとめて管理することができるオブジェクトだが、
配列との違いは、個々の要素を管理するのに、インデックス番号ではなく、「キー」と呼ばれる、文字列などの値を指定することができるところ。

`ハッシュ名 = {
"キー" => "値１",
"キー" => "値2",
"キー" => "値3"
}`

というようにキーと値をセットする。


`user = {
"name" = "Tanaka",
"age" = "18" ,
"gender" = "male"
}`


これで、 `puts user["name"]`

とすると、

`Tanaka`

と出力される。



シンボルとは、「"」や「'」で囲むかわりに頭に「:」をつけたもののことを言う。

シンボルはほとんど文字列と同様に使うことができる(厳密には違うがここではスルー。)。


例えば、配列

`names = ["Sato","Yamada","Tanaka"]`

を、シンボルを使うと、

`names = [:Sato, :Yamada, :Tanaka]`

とすることができる。



またハッシュでは、

{"key" => "value",...}

を、シンボルを用いれば、

{:key => "value",...}

{:key => :value,...}

このように書くことができる。

そこで、シンボルをキーとして用いる特別な記法として、

**{:key => :value,...}**を


**{key: :value,...}**と書くことができる。
vagrant statusしたらnot createdになった場合はvagrant upとかしないでこうしよう

# 背景

![image](https://qiita-image-store.s3.amazonaws.com/0/38292/0c4aae26-8366-03e7-794e-f76065593187.png)


あるとき、`Vagrantfile`を編集したらこんなエラーになった。言われるがままに`vagrant up`したら今まで作った環境を捨ててCreateしちゃうのでせっかく作った開発環境をやりなおしってなことになりかねません。あと、`vagrant halt`とか`vagrant reload`もやめといたほうがいいっぽい。

```
toki-mac:my_vagrant tokifuji$ vagrant status
Current machine states:

default                   not created (virtualbox)

The environment has not yet been created. Run `vagrant up` to
create the environment. If a machine is not created, only the
default provider will be shown. So if a provider is not listed,
then the machine is not created for that environment.
toki-mac:my_vagrant tokifuji$
```

# `.vagrant/machines/default/virtualbox/id`がいるか？

いないお(´；ω；｀)ﾌﾞﾜｯ

```
toki-mac:my_vagrant tokifuji$ ll .vagrant/machines/default/virtualbox   
total 0
drwxr-xr-x  2 tokifuji  staff   68 Mar  1 14:35 .
drwxr-xr-x  3 tokifuji  staff  102 Feb 29 16:36 ..
```

# UUIDを調べる

慌てるなって。

```
toki-mac:my_vagrant tokifuji$ vboxmanage list vms
"my_vagrant_default_*************_*****" {********-****-****-****-************}
```

この`********-****-****-****-************`をコピーしておく。

# `.vagrant/machines/default/virtualbox/id`を作る

```
toki-mac:my_vagrant tokifuji$ vim .vagrant/machines/default/virtualbox/id
```

vimで作って先ほどコピったUUIDをペーストして保存。

```file:.vagrant/machines/default/virtualbox/id
********-****-****-****-************
```

# `vagrant status`で確認

![image](https://qiita-image-store.s3.amazonaws.com/0/38292/12b49229-8369-d6d9-14e4-98f63e50b744.png)


```
toki-mac:my_vagrant tokifuji$ vagrant status
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
toki-mac:my_vagrant tokifuji$
```

# 参考リンク

* [備忘録: vagrantからVirtualBoxが起動出来なくなる問題の解決方法](http://gyagya1111.blogspot.jp/2015/05/vagrantvirtualbox.html)
vvvv OSCのメッセージを整理する

# OSCのメッセージを整理する

## 受信と送信が増えるにつれて同じようなノード郡が拡大する

![sendMultiOSC.png](https://qiita-image-store.s3.amazonaws.com/0/111261/55633802-5e64-7c54-6274-d55945374db6.png)



## 受信と送信を整理する

![sendMultiOSCRe.png](https://qiita-image-store.s3.amazonaws.com/0/111261/1d7e0f7c-420d-610b-6b49-6d23744ec5cf.png)

### 送信側
Consノードで配列を統合することが出来る。
OSCEncoderのType TagsでConsノードで作成した配列をアドレスに分配する
すっきりするが、送信側は変更する度にメッセージが２つ送られてしまう

### 受信側
Unzipノードを使うことで、メッセージを切り分けることが出来る

## 参考
girlpower\IO\Networking\2_Advanced (OSC)\00_OSC_Examples_1.v4p
Windows7のAtomでrubocopを使えるようになるまで

## はじめに
WindowsのAtomでjavascriptなどをBeautifyで自動楽ちんコードフォーマットをしていました。
しかしrubyのファイルでは"rubocop"が見つからないなど言われてだめだったのでできるようにしました。
これの統合された情報が見つからず、rubyのインストールからやったので共有します。
MacやLinuxだともっと簡単なはずです。

## ATOMのプラグイン
- atom-beautify
- linter-rubocop
- 関係無いですが
 - japanese-menu
を入れてメニューを日本語化しています。

## プラグインを入れた後

### 1. windowsにruby環境を入れる必要  
http://rubyinstaller.org/downloads/
からrubyの2.3.0のバイナリをインストールしました。
  * このとき管理者権限でインストールになりました。
  * コマンドラインでrubyが実行できるか確認

### 3. rubucopのインストール  
```
gem install rubocop --no-ri --no-rdoc
```  
のようにgemインストールするだけなのですが、コマンドプロンプトを開くとき"管理者として実行"で  
やらないとgem installが権限の問題で失敗したことがありました。

```
>gem install rubocop --no-ri --no-rdoc
ERROR:  While executing gem ... (Errno::EACCES)
    Permission denied @ rb_sysopen - C:/Program Files/Ruby-2.3-x64/lib/ruby/gems
/2.3.0/gems/rubocop-0.37.2/LICENSE.txt
```

### 4. ATOMのconfig.cson  
ファイルメニューから個人設定で開き、  
```
    ruby:
      rubocop_path: "C:\\Ruby23-x64\\bin\\rubocop.bat"
```  
　　　　　　　　　　↑rubucop.batというファイルがあるパスを設定する

### 5. ATOM再起動  
ようやく、*.rbでコードフォーマットができるようになりました。

## まとめ

* このためだけにWindowsにrubyを入れました。
  * 今後の管理が面倒なのでできればATOMで完結してほしい
HikariCPとcom.mysql.jdbc.ReplicationDriverを併用する


# 前置き

関連するjarのバージョンは以下

* HikariCP (2.4.1)
* mysql-connector-java (5.1.36)

# 使い方

HikariDataSourceのsetDriverClassNameで`com.mysql.jdbc.ReplicationDriver`を指定すれば良い。

```
HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setDriverClassName("com.mysql.jdbc.ReplicationDriver");
```

その他オプション(username, password, etc)もHikariDataSourceに指定可能。

# 使ってみて気になったこと

これでアプリケーションを作成して、起動すると、以下の様なログが出ると思う。

```
2016-03-01 11:11:35 WARN DriverDataSource - Registered driver with driverClassName=com.mysql.jdbc.ReplicationDriver was not found, trying direct instantiation. (DriverDataSource.java:68)
```

ちゃんとReplicationDriver使われてるのか気になったのでちょっと調べてみた。
以下はそのメモ。

# 調べたこと

ログに記載されてる`DriverDataSource`の該当箇所はこんな感じ。

```java:DriverDataSource.java
if (driverClassName != null) {
    Enumeration<Driver> drivers = DriverManager.getDrivers();
    while (drivers.hasMoreElements()) {
        Driver d = drivers.nextElement();
        if (d.getClass().getName().equals(driverClassName)) {
            driver = d;
            break;
        }
    }

    if (driver == null) {
        LOGGER.warn("Registered driver with driverClassName={} was not found, trying direct instantiation.", driverClassName);
        try {
            Class<?> driverClass = this.getClass().getClassLoader().loadClass(driverClassName);
            driver = (Driver) driverClass.newInstance();
        }
        catch (Exception e) {
            LOGGER.warn("Could not instantiate instance of driver class {}, trying JDBC URL resolution", driverClassName, e);
        }
    }
}
```
DriverManagerから取得したDriverの一覧に期待するものが無ければ、クラス情報からnewInstanceする感じ。

ここで、MySQL側の[公式ドキュメント](https://dev.mysql.com/doc/connector-j/en/connector-j-master-slave-replication-connection.html)を見ると、
> To enable this functionality, use the com.mysql.jdbc.ReplicationDriver class when configuring your application server's connection pool or when creating an instance of a JDBC driver for your standalone application. Because it accepts the same URL format as the standard MySQL JDBC driver, ReplicationDriver does not currently work with java.sql.DriverManager-based connection creation unless it is the only MySQL JDBC driver registered with the DriverManager .

と、ある。java.sql.DriverManagerベースでは動かないと。。

なので先のwarnのログが出るのはソースからも分かるし、その後newInstanceでReplicationDriverが生成されて利用できるので、動作に問題は無さそう。
なおHikariCPのこの辺りの挙動は、2.3.6, 2.3.7で修正が入っている模様。

一旦使ってみてまた何かあったら記録しよう。

cf. 
http://stackoverflow.com/questions/29391693/squeryl-hikaricp-mysql-distributing-read-traffic-to-slaves
https://github.com/brettwooldridge/HikariCP/blob/dev/CHANGES
WordPressCodex 私用ショートカット

###WordPress について
[WordPress バージョン一覧](http://wpdocs.osdn.jp/WordPress_Versions)

###データベース・開発
[DB テーブルと項目一覧](https://wpdocs.osdn.jp/データベース構造)
[WordPress コーディング基準](http://wpdocs.osdn.jp/WordPress_コーディング基準)
[関数リファレンス](http://wpdocs.osdn.jp/関数リファレンス)

###デザインとレイアウト
[テンプレート階層](http://wpdocs.osdn.jp/テンプレート階層)
[テンプレートタグ](http://wpdocs.osdn.jp/テンプレートタグ)

###プラグイン API
[アクションフック一覧](http://wpdocs.osdn.jp/プラグイン_API/アクションフック一覧)
[フィルターフック一覧](http://wpdocs.osdn.jp/プラグイン_API/フィルターフック一覧)
Rails UserAgentの設定の仕方 PCとSmartPhoneの表示するViewを切り替える

PCとSmartPhoneの表示するViewを切り替えるための設定をします。
便利なgemがあるのでそちらを活用します。

[k0kubun/rack-user_agent](https://github.com/k0kubun/rack-user_agent)

まずはgemのinstall

```rb:Gemfile
gem 'rack-user_agent'
```

これでbundle install。

以下のような感じにapplicationコントローラー内で設定します。

```rb:/app/controller/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :set_request_variant

  private

  def set_request_variant
    if from_smartphone?
      request.variant = :smartphone
    end
  end

  def from_smartphone?
    request.from_android? || request.from_iphone? || request.from_ipod? || request.from_windows_phone? 
  end
end
```

あとは、```index.html.haml``` と ```index.html+smartphone.haml``` を作成すればデバイスによって使用するViewのファイルを切り分けてくれます。
PCで開くと通常のViewファイルが表示され、smartphoneで開くと```smartphone```がついたファイルが表示されます。
python3をbrewでinstallしたときのErrorを解決

言わずと知れたパッケージ管理システムHomebrewでpython3をinstallしてみた。

install完了したと思って

```
which python3
```

python3がないと言われた。
Homebrewの処理を確認したら、brew link stepで問題発生とのこと。

pyhon3はシンボリックリンクが自動的に作成されないパッケージだと言うことか。

素直に

```
brew link python3 --force
```

これで/usr/local/bin/配下にpython3シンボリックリンクが作成される。ちなみにhomebrewがinstallしたパッケージは、/usr/local/Cellar/に置かれるので、そこを参照している。
spark-shellで処理をfile指定して実行させるには


```
#!/bin/sh                                                                                                               
cur=$(dirname $0)

spark_home=/opt/spark
hadoop_home=/opt/hadoop

file=$1

if [ -s $file ] ; then
    $spark_home/bin/spark-shell --num-executors 18 --executor-cores 2 --master yarn --deploy-mode client -i $file
else
    $spark_home/bin/spark-shell --num-executors 18 --executor-cores 2 --master yarn --deploy-mode client
fi

```
Dockerの日本語ドキュメント

![logo.png](https://qiita-image-store.s3.amazonaws.com/0/73580/05457de1-bf61-6140-83e8-11aa83426c55.png)ドキュメント

Dockerの日本語ドキュメントの存在を知りませんでした。

日本語ドキュメントはこちら⇒ [**Dockerの日本語ドキュメント**](http://docs.docker.jp/index.html "Dockerの日本語ドキュメント")

[Docker Docs Ja Project](https://github.com/zembutsu/docs.docker.jp "Docker Docs Ja Project")に感謝。

ドキュメントの参照は下のリンクから。
    
## 目次

### [Docker Engine (エンジン)](http://docs.docker.jp/engine/toc.html) 
Docker イメージの作成と Docker コンテナの実行に必要なコア機能を提供します。

### [Docker Swarm (スウォーム) ](http://docs.docker.jp/swarm/toc.html) 
ホストのクラスタリングとコンテナのスケジューリングに使われます。

### [Docker Compose (コンポーズ)](http://docs.docker.jp/compose/toc.html) 
複数のコンテナを使うアプリケーションを定義します。

### [Docker Hub (ハブ) ](http://docs.docker.jp/docker-hub/toc.html) 
イメージを管理するためのホステッド・レジストリ・サービスです。

### [Docker Machine (マシン) ](http://docs.docker.jp/machine/index.html) 
自分のネットワークやクラウド上に、自動的にコンテナをデプロイします。

### [Kitematic（カイトマティック）](http://docs.docker.jp/kitematic/toc.html)
MacやWindows上で、Dockerを簡単に利用できるグラフィカル・ユーザ・インターフェース(GUI)。

### [Docker Registry (レジストリ)](http://docs.docker.jp/registry/toc.html) 
オープンソースの Docker イメージ配布を提供します。
テンプレートに設定された見出しを無効化

テンプレートに設定された見出しを無効化する方法について書きます。

はてなブログのテンプレートをインストールしたのはいいけど、見出しのCSSは自分のお気に入りのものを使いたいと思う方も多いと思います。

そんな時は以下の手順で場所を特定し、CSSのコードを書けば無効化できます。

グーグルChromeの使用を前提に説明していきます。
はてなブログProを利用している人が対象です。

1　場所を特定する
・CSSを無効化したい部分を右クリックし、その中の「検証」を選択する。
・下の方にコードが表示される画面が出てくる。
・その右にcssのコードが表示されるので、削除対象のCSSを見つけコピーする。
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/89483/e8bbffb0-048c-61b4-8769-76bc47732433.png)


2　CSSを書く
・はてなブログのダッシュボードを開き、「デザイン」メニューを選択。
・下の方の「デザインCSS」を選択。
・フォームが表示されるので、そこに、さっきコピーしたコードを貼り付ける。
・貼り付けたコードの「：」コロンの後を削除する。
・「：」コロンの後に、「none ;」と入力する。
↓見出しのデザインが変更されました！
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/89483/d1fa4950-3053-92ee-f3ca-11bd99ac683a.png)
Oracle 外部表 を VSモデルブラウザーで表示する方法

# 概要
VS2013 で Oracle 外部表を モデルブラウザーで表示できなかった。
※手動での追加以外のやりかた (手動では可能)

# 環境その他
VS2013
VB.net
Oracle11g
MVC

# 手順

1.[Oracle]データファイル上にあるテーブルを View/マテビューで作成する。
2.[VS2013]Ado.net EDMを追加(1.で作成したViewを追加)
3.[VS2013]Controll/Viewを作成
4.[VS2013]Viewフォルダ内の Index.vbhtmlを修正(テーブル項目が1カラムの場合 反映されないので)
5.[Oracle]1で作成した ViewをREPLACEし、FROM句を 外部表に変更

EDMのウイザード上では オブジェクトとして認識されているが、
ダイアグラムとしては オブジェクトとして認識されないもよう。
credoを使ってElixirでRuboCopみたいにlintチェックをしよう！

## 1. やりたいこと

Elixirというか、プログラミングをしていると構文チェックとかコーディング規約は気になりますね。

Elixirではどうやるのかな、とtwitterで探していたら
authorの[rrrene](https://github.com/rrrene)さんから、[credo](https://github.com/rrrene/credo)という構文チェックツールを紹介いただきました！

[RuboCop](https://github.com/bbatsov/rubocop)みたいだよ、とのことでした。

## 2. 利用してみたリポジトリ

* https://github.com/letusfly85/github_stalking


## 3. 実施したこと

### 3-1. mix.exsに依存を追加

```mix.exs
defp deps do
  [
    {:credo, "~> 0.3", only: [:dev, :test]}
  ]
end
```

### 3-2. `mix deps.get`を実施

### 3-3. `mix credo`を実行

`credo`タスクを実施すると下記のようにカラフルにチェックの結果が返ってきました。

![スクリーンショット 2016-03-01 14.01.48.png](https://qiita-image-store.s3.amazonaws.com/0/49547/619a8eb0-7a79-91d1-dc5a-fd4f380f6cec.png)

便利！

## 4. 所感

便利！、と言いつつ、うわ。。。私のコード。。となりますね。。
credoのルールを確認しながらリファクタしようと思います。

## 5. おまけ

前回の投稿「[ElixirでもRubyのguardみたいにファイル変更時に自動でテストが走らせたい！そんな時は、mix-test.watchを使ってみよう！](../../letusfly85/items/d7387e0a0453762fbd37)」で紹介させていただきましたが、config/config.exsで以下のように設定すると、testとcredoが両方動く環境を作れます。

```config/config.exs
config :mix_test_watch,
  tasks: [
      "test",
      "credo",
  ]
```

構文チェックもしつつ、テストも回せるようになるので、いい感じに開発ができそうです＾＾

[dogma](https://github.com/lpil/dogma)も時間を見つけて使ってみたいですね！

---

本日はここまでとなります。
Jupyter Notebookを動的に使ってみる

# 現在の環境

- ASUS C300
- Chrome OS(linux-64)
- miniconda3-3.18.3
- python 3.5.1
- jupyter 4.0.6
- [chromebrew+gitインストール済み](http://qiita.com/y__sama/items/7684654a51e79566cdbc)


# RISE

- 以前から[live_revealを使って](http://qiita.com/ssh0/items/a67b84110c5d9e0adeda)動的なHTMLが生成できたが、最近はRISEというプロジェクトが良い様子
- ipython 3.x+live_revealの時はなぜか環境構築できなかったが、今回はさくっと入った

```
git clone https://github.com/damianavila/RISE
cd RISE
python setup.py install
```

- これでlocalhostのjupyterにスライドショーボタンが追加される
- 動的なHTMLでプレゼンできて、中のコードまで書き換えられる
- とういうところまで書いて、すでに素晴らしい[Qiitaの記事](http://qiita.com/antimon2/items/a8cd98257219773b9ef3)があったのに気づいた。

# pivottablejs
[参考URL](http://esu-ko.hatenablog.com/entry/2016/03/04/Python%E3%81%A7%E6%8E%A2%E7%B4%A2%E7%9A%84%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%A7pivottablejs%E3%82%92%E4%BD%BF%E3%81%86)

```
conda install pivottablejs
```
- pandasのグラフ描画を拡張して、動的にテーブルから散布図に切り替えたり、散布図の軸などを変えることができる。
![pvjs.png](https://qiita-image-store.s3.amazonaws.com/0/52875/f8173b2c-54e9-358f-660e-165f3e2901dc.png)


# ipywidgets.interact
- こちらも素晴らしい[Qiitaの記事](http://qiita.com/tanemaki/items/e965cd9c25acbeed860c)がある。
- Jupyter 4.xではIPython.html.widgetsは非推奨になり[ipywidgets](https://github.com/ipython/ipywidgets)になった。
- インストール
```
conda install ipywidgets
```

![Screenshot 2016-03-01 at 13.20.30.png](https://qiita-image-store.s3.amazonaws.com/0/52875/5f22fc3a-72d3-1cba-c0bb-4c4864f16122.png)

interactに関数とパラメータを渡すと、パラメータを変化させるwidgetが生成します。
![Screenshot 2016-03-01 at 13.22.01.png](https://qiita-image-store.s3.amazonaws.com/0/52875/b1e8d41c-5ec6-4fc3-47bd-d0a5a081328e.png)

interactを関数のデコレータとして使うこともできて、
こちらの方法もかなりスマートです。

![Screenshot 2016-03-01 at 13.26.30.png](https://qiita-image-store.s3.amazonaws.com/0/52875/c3988cac-7628-0e37-06d5-7d018c266f39.png)

# bokeh
- まだバージョンアップが頻繁でAPIが安定していないが、[bokeh](http://bokeh.pydata.org/en/latest/docs/gallery.html#gallery)というヴィジュアライズの拡大縮小などができるライブラリがある。
- [参考](http://qiita.com/kshigeru/items/fdf54a251f36fcb8ac6c)
- interectにパラメータの指定をさせて、bokehで描画するとspotfireとかtableauとかを使っている気分になる。

```
conda install bokeh
```

#### 使用例

```py3
from sklearn.datasets import load_breast_cancer
import pandas as pd
cancer=load_breast_cancer()
data=pd.DataFrame(cancer.data,columns=cancer.feature_names)
data["target"]=[cancer.target_names[i] for i in cancer.target]
```

```py3
def interactivebokeh(x_axis,y_axis):
    fig=bplt.figure(plot_width=640, plot_height=320)
    fig.circle(
                data[data.target=="malignant"][x_axis],
                data[data.target=="malignant"][y_axis],
                line_color="red",fill_color="red"
                )
    fig.square(
                data[data.target=="benign"][x_axis],
                data[data.target=="benign"][y_axis],
                line_color="blue",fill_color="blue"
                )
    bplt.show(fig)
```

![Screenshot 2016-03-01 at 14.02.40.png](https://qiita-image-store.s3.amazonaws.com/0/52875/80410996-21b4-d137-3d6e-141c893b8015.png)
CS-Cart:商品リスト形式のテンプレートまとめ

CS-Cartの商品リスト形式のテンプレートの一覧です。テンプレート名を忘れた時にご活用ください。

## 商品(products_list.tpl)

<img width="1229" src="https://qiita-image-store.s3.amazonaws.com/0/889/07b64fda-8983-c5f1-0fe4-5cd0cc1c2b01.png" class="img-thumbnail">

## リンク付きサムネイル(links_thumb.tpl)

<img width="307" src="https://qiita-image-store.s3.amazonaws.com/0/889/b063535c-0a1f-0d37-e3f9-a3554b9f863d.png" class="img-thumbnail">

## グリッド(grid_list.tpl)

<img width="989" src="https://qiita-image-store.s3.amazonaws.com/0/889/9e1de548-fd95-56b0-9812-bcd14a2ed95f.png" class="img-thumbnail">

## スクローラー(blocks/products/products_scroller.tpl)

<img width="1005" src="https://qiita-image-store.s3.amazonaws.com/0/889/18e6a948-75e3-b4b5-c364-0e7e69a46ee2.png" class="img-thumbnail">

## サムネイル小(small_items.tpl)

<img width="380" src="https://qiita-image-store.s3.amazonaws.com/0/889/094e66b4-2efc-3ffb-b1e7-9ec8aef35077.png" class="img-thumbnail">

## テキストリンク(blocks/products/products_text_links.tpl)

<img width="306" src="https://qiita-image-store.s3.amazonaws.com/0/889/5c1b3a33-9f17-928e-fa26-f48a11544876.png" class="img-thumbnail">

## ショートリスト(compact_list.tpl)

<img width="674" src="https://qiita-image-store.s3.amazonaws.com/0/889/e393b696-de54-8be7-be80-597473b823c3.png" class="img-thumbnail">
脆弱性に対するアップデートが公開されたのでtomcatのバージョンだけを変えたいが、SpringBootのバージョンは変えたくない

# SpringBootで起動するtomcatのバージョンを変える

## はじめに

* 超小ネタです。
* SpringBootで開発をしていて、リリース前に大きな脆弱性などが発見されたときはSpringBootのバージョンは変えたくないが、tomcatのマイナーバージョンは脆弱性に対応したものに上げておきたい。というのはわりと需要がある話なのかなと思っています。
* 先日、[JVNVU#94679988 Apache Tomcat の複数の脆弱性に対するアップデート](http://jvn.jp/vu/JVNVU94679988/)を読んでいて、あれ？そういえばSpringBootでTomcatのバージョンってどうやってあげるんだろうと思って調べたのでメモしておきます。
* これはなぜか公式サイトには載っていないようでした。Jettyに変更する。tomcat7に変更する。などは[70. Embedded servlet containers](https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html)に載っていますのでそちらを参考にしてください。

## pomの変更だけでOK

* tomcatのバージョンを指定する
* making@githubさんに教えていただき以下を変えるだけで変更できました。

```pom.xml
	<properties>
		<tomcat.version>8.0.32</tomcat.version>
	</properties>
```

* うまくいかなかったら、pomにspring-boot-starter-parentが入っているかを確認してみてください。これが入っていないとプロパティが効きません。

```
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.3.3.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
```

* 起動するとこんなログが残ります

```
2016-03-01 13:31:51.891  INFO 2349 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2016-03-01 13:31:51.893  INFO 2349 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.0.32
2016-03-01 13:31:52.027  INFO 2349 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/app]    : Initializing Spring embedded WebApplicationContext
```
ggplot2をGUIで操作し作図するggraptR	



いつも[からだにいいもの](https://www.karada-good.net/analyticsr/r-414/)さんにはお世話になっておりはべりいまそがり。
ggplot2で作図することは面倒ですが、データさえ作ればGUIで作図してくれるggraptRが素敵すぎて僕も記事を書きます。



[shiny](http://shiny.rstudio.com)を使っているので、必要なものをinstallする。


```
install.packages("devtools")
devtools::install_github("cargomoose/raptR")

```

install logには、

```
** help
*** installing help indices
** building package indices
** installing vignettes
** testing if installed package can be loaded
* DONE (ggraptR)

```

とあるので、新しいpackage名はggraptRのようです。


```
> library("raptR")
 library("raptR") でエラー: 
   ‘raptR’ という名前のパッケージはありません 
> library("ggraptR")
 要求されたパッケージ ggplot2 をロード中です 
 要求されたパッケージ ggthemes をロード中です 
 要求されたパッケージ shinyjs をロード中です 
```


体にいいものさんのtest dataを拝借

```

> n <- 300
> test <- data.frame(Group= sample(paste0("Group",1:5)),n,
Data1 =rnorm(n),
Data2 =rnorm(n) + rnorm(n) + rnorm(n),
Data3 =sample(0:1,n,replace =TRUE),
Data4 =sample(LETTERS[1:26],n,replace=TRUE)
)

```

データが作成できたらggraptRを起動する

>ggraptR()



[![https://gyazo.com/86af95ef9de3f01ab6b9da84c42c776d](https://i.gyazo.com/86af95ef9de3f01ab6b9da84c42c776d.png)](https://gyazo.com/86af95ef9de3f01ab6b9da84c42c776d)

起動させるとコントロールはサーバー(localにshinyサーバが立つ)へ移り、あとからデータを作成することはできない。あらかじめデータを作っておく。


[![https://gyazo.com/0968fd1d5b6af5a043ffa50c83a33c15](https://i.gyazo.com/0968fd1d5b6af5a043ffa50c83a33c15.png)](https://gyazo.com/0968fd1d5b6af5a043ffa50c83a33c15)

importタブをクリックし、choose a datasetで今回作成したtestというデータを読み込む
すでに出力データなどがある場合は、choose datasetを選ぶ。


[![https://gyazo.com/1ea395115bf8fc2400e6c34d570c7995](https://i.gyazo.com/1ea395115bf8fc2400e6c34d570c7995.png)](https://gyazo.com/1ea395115bf8fc2400e6c34d570c7995)


あとは、optionを設定するだけ。グループ、サンプル、色の濃さ、point 大きさまで自由にかえられ、出力のpdfのサイズも指定できる
[GAS]Spreadsheetの日付がシリアル値に変わる

Google Spreadsheetで作成したシフト表スケジュールをGoogle Calendarに登録するGAS(Google Apps Script)を作って運用していたのだが、年が変わったタイミングでSpreadsheet側のシフト表レイアウトデザインを変更したら、日付の値が日付文字列からシリアル値に変わってしまって、GASがうまく動かなかった。

どうも日付セルの表示形式を変えるとExeclのようなシリアル値になってしまうようで、結構ハマってしまった。

## レイアウト変更前
日付の表示形式(MM/DD)
![date0201.png](https://qiita-image-store.s3.amazonaws.com/0/49022/c0979129-2acb-0993-a528-b6faf2f072a2.png)

```js
Logger.log(values[row][col]); //Mon Feb 01 00:00:00 GMT+09:00 2016
var d = new Date(values[row][col]);
var yy  = d.getYear();
var mm  = d.getMonth() + 1;
var dd  = d.getDate();
var ymd = yy + "/" + mm + "/" + dd;
Logger.log(ymd); //2016/2/1 (正常)
```

## レイアウト変更後
日付の表示形式(d)
![date123.png](https://qiita-image-store.s3.amazonaws.com/0/49022/127eb994-e413-57b3-e19f-eb4e6f0d31ae.png)

```js
Logger.log(values[row][col]); //42401.0　シリアル値！
var d = new Date(values[row][col]);
var yy  = d.getYear();
var mm  = d.getMonth() + 1;
var dd  = d.getDate();
var ymd = yy + "/" + mm + "/" + dd;
Logger.log(ymd); // 70/1/1 (異常)
```

## シリアル値とは
シリアル値は「1899年12月30日午前0時」からの経過日数です。Excelで使われている形式のようです。

## シリアル値→UnixTimeStamp
↓で、GAS側は結局このように修正しました。

```js
Logger.log(values[row][col]); //42401.0　シリアル値！
// excel_date_no(1900から加算日数)からUnixTime(1970からのmsec)に変換
var uxtime = (values[row][col] - 25569) * 86400000;
//日付セルから
var d   = new Date(uxtime);
var yy  = d.getYear();
var mm  = d.getMonth() + 1;
var dd  = d.getDate();
var ymd = yy + "/" + mm + "/" + dd;
Logger.log(ymd); //2016/2/1 (正常)
```

### 【参考】
GoogleスプレッドシートとGoogle Apps Scriptの日付
http://stabucky.com/wp/archives/7442
Kodiのaddonを作る（１）

オープンソースのメディアプレーヤーアプリケーション Kodiは以前xbmcといっていたやつです。
Qiitaにもほんの少しだけども情報がある。自分だけじゃないと確認してこの記事を書くことにした。

Kodiの機能追加をおこなうaddonは
OSXの16.0の場合 ユーザー名がhogeとすると
/Users/hoge/Library/Application\ Support/Kodi/addons/
に置く。

映画情報をYahoo映画から取得するaddonを作ってみた。

metadaba.blueknight611jp.yahoomovie
というフォルダを作り、中に
icon.png
addon.xml
yahoomovie.xml
と３つのファイルを作る。

icon.pngはこのaddonを選択するときに表示されるタイトルのような図形。適当なものでOK。

addon.xmlは以下の様な内容。

```
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="metadata.blueknight611jp.yahoomovie"
	name="Yahoo Movie Scraper"
	version="0.0"
	provider-name="blueknight611jp">
	<requires>
		<import addon="xbmc.metadata" version="1.0"/>
	</requires>
	<extension point="xbmc.metadata.scraper.movies"
		library="yahoomovie.xml"/>
	<extension point="xbmc.addon.metadata">
		<summary lang="en">Yahoo Moview Scraper</summary>
		<description lang="en">Download metadata and thumbnail from Yahoo Movie for Japanese movies</description>
		<platform>all</platform>
	</extension>
</addon>

```
ここはほとんどいじらない。

本体はaddon.xmlで指定したyahoomovie.xml

次はこの内容を説明する。
が、その前にKodiでこのscraper addonを使用した状況を貼っておく。
![Kodi-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/85156/43abdc95-79e1-b358-90d7-2bf43e969134.jpeg)

![Kodi-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/85156/ab6e9edf-276a-c4c3-5d8c-f081bc20dc10.jpeg)

![Kodi-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/85156/ad36f1b5-12b7-f1f5-7fc8-8480a3108a3e.jpeg)
Unityのインスペクターで子供も含めて描画する法

いやはや、なんだかんだでインスペクターとSerializedFieldわかんないなーとかおもっていろいろ探してもどうやったら同じように描画できるかわからなかったのでさくりとやってみました。

こんな感じでどうでしょうか・・・？

```c#
		serializedObject.Update();
		SerializedProperty iterator = serializedObject.GetIterator();
		int currentDepth = 0;
		while (iterator.NextVisible(true))
		{
			if(currentDepth < iterator.depth)
			{
				continue;
			}

			EditorGUI.indentLevel = iterator.depth;
			EditorGUILayout.PropertyField(iterator, false);
			if(iterator.isExpanded)
			{
				currentDepth = iterator.depth + 1;
			}
			else
			{
				currentDepth = iterator.depth;
			}
		}
		serializedObject.ApplyModifiedProperties();
```

ポイントはdepthとisExpandのしょりです
bashで変数から部分文字列を取得する

bashで変数から部分文字列を取得する方法まとめ

# パラメータ展開を利用して部分文字列を取得する
## オフセットと長さを指定して文字列を取得する
```bash:指定方法
${パラメータ:オフセット:長さ}
```

```bash:部分文字列抽出
#!/bin/bash

HOGE="abcdef"

# オフセット位置から長さ分を取得
echo ${HOGE:0:2}
# -> ab

echo ${HOGE:2:2}
# -> cd

echo ${HOGE:4:2}
# -> ef

# 長さを省略した場合はオフセットから最後まで出力
echo ${HOGE:2}
# -> cdef

# 長さにマイナスを指定した場合は最後からマイナス分引いた位置までの長さになる
echo ${HOGE:0:-2}
# -> abcd

# オフセットの位置にマイナスを指定した場合は文法として別のパラメータ展開になる(デフォルト値の指定)
# 指定した変数が空文字列の場合は右に指定した文字が入る
echo ${HOGE:-2}
# -> abcdef
HOGE=
echo ${HOGE:-2}
# -> 2
```

## `%`, `%%` 右端からの(最短の|最長の)パターン一致までを除外
```bash:右端からのパターン一致除外
#!/bin/bash

HOGE=hoge.tar.bz2

echo ${HOGE}
# -> hoge.tar.bz2

# 最短除外
echo ${HOGE%.*}
# -> hoge.tar

# 最長除外
echo ${HOGE%%.*}
# -> hoge
```

## `#`, `##` 左端からの(最短の|最長の)パターン一致までを除外
```bash:左端からのパターン一致除外
#!/bin/bash

HOGE=/home/user/hoge

echo ${HOGE}
# -> /home/user/hoge

# 最短除外
echo ${HOGE#*/}
# -> home/user/hoge

# 最長除外
echo ${HOGE##*/}
# -> hoge
```

# 参考
[シェルスクリプトの変数を部分的に抜き出す！ | 我が社を有名にするブログ](http://at-j.co.jp/blog/?p=4872)
python > 部分文字列の取得 > print serial[5:10] / print serial[5:-1]

文字列の一部を取りたい

参考 http://www.mwsoft.jp/programming/python/str.html#substring
関連 http://qiita.com/7of9/items/62051d106c031e0f5b96

https://ideone.com/DpzMwn

```py
serial="123456789012345678901234567890"

print "{0}", serial

print "{0:5>9}", serial

print "{0}", serial[5:10]

print "{0}", serial[5:-1]
```

```txt:結果
Success	time: 0.01 memory: 8968 signal:0
{0} 123456789012345678901234567890
{0:5>9} 123456789012345678901234567890
{0} 67890
{0} 678901234567890123456789
```

前に"{0}"は不要か。

Pi Zeroのシリアル番号を固有番号に使おうと考えていたが、全文字を保持するのはセキュリティ上問題なのではと思い始めた。
一部の文字列にしてしまえば、番号の衝突をある程度回避でき、かつ固有の番号として使えそうだ。
capistranoでデプロイする時のssh-key周りのTips

今までサーバー内に入ってgit pullしてデプロイメントをしていたんだけれど、とても21世紀とは思えないのでcapistranoを導入しました。ついでにロードバランサーを設けてアプリケーションサーバー2台の構成にしてみたんですがssh-key周りが気になりました。

これまでサーバ内でssh-keygenして公開鍵をgithubのdeploy_keyに置いていたんだけどこの方法だとサーバ台数が増える度にgithub上の公開鍵の数も増えていくし管理もクソもあったもんではないと思いググっていたらどうやらssh-agentという方法があるらしい。

ssh-agentを使用すると、capistranoコマンドを叩く開発者のssh-keyを使ってデプロイをしてくれる。
まずcapistranoのコードは以下のようになる。

```lang:deploy/production.rb
 server '○○○.×××.○○.××',
  user: "hogehoge",
  roles: %w{web app},
  port: 12345
set :rails_env, 'production'
set :stage, :production
set :branch, :master
set :unicorn_rack_env, "production"
set :ssh_options, {
  # capistranoコマンド実行者の秘密鍵
  keys: %w(~/.ssh/id_rsa),
  forward_agent: true,
  auth_methods: %w(publickey)
}
```

これでcapistranoはコマンド実行者のssh-keyを使ってデプロイをしてくれる。
でもこれだけだとgithubからソースコードを取ってこれないのでgithubの方にも自分の公開鍵を置く必要がある。さらに自分のssh-keyをssh-agentで使用する場合は以下のコマンドをローカル環境で実行する必要がある。

```
ssh-add ~/.ssh/id_rsa
```

ssh-agent用に鍵が登録されているかどうかは以下のコマンドで確認することができる。

```
ssh-add -l
```

githubに公開鍵が置いてあって、サーバ内のauthorized_keysのpermmisionも600になっているのに、capistranoがgit ls-remoteとかでストップした時にはssh-agentに登録されていない可能性がデカい気がする。この方法ならサーバー台数が数十とかあってもgithubにデプロイ担当者の公開鍵を1度置けば良いので楽だと思った。

ただしデプロイする人が複数人いる場合は、各々の秘密鍵のディレクトリや名称を合わせる必要がありそうなのと、全てのサーバのauthorized_keysにそれぞれの公開鍵をchefなどのプロビジョニングツールで配布する必要がありそう。