OmniAICreator/Qiita-1.07M huggingface dataset:
Oh my zshにcondaをインストールしてzsh conda not found の場合


#というわけでcondaをインストール！

zsh command conda not found
え、、

まぁ大した話ではないし、stackoverflowにも載っている話ですが、

おそらくbashの方にpathを通したpathが有効になっていない可能性があるので
~/.zshrcをいじっていきます。
好みのエディターで
~/.zshrcを開きUser configurationのところに、先ほどインストールしたminiconda2 or 3のパスを通します。
```
export PATH="/Users/username/miniconda2 or 3/bin:$PATH"
```
コピーはしないでください！！
usernameとインストールした方を選択して書き換えればOK

"#"はコメントアウトなので付け加えてはいけません。
新しいターミナルで
`conda list` 
が通れば完了です。
Windows 7 64bit に JUMAN/KNP（構文解析器）を導入しました

#はじめに
研究でKNPが必要になったので、現在使用しているWindows 7 64bit環境に導入してみました。
備忘録として残します。

[KNP](http://nlp.ist.i.kyoto-u.ac.jp/index.php?KNP)は京都大学の黒橋・河原研究室で開発された日本語構文・格・照応解析システムのことです。
文を入れると単語同士の関係性を下の画像のように表示してくれます。
![knp.png](https://qiita-image-store.s3.amazonaws.com/0/89402/32f823bc-4bd4-4425-d940-e3c206bc7e58.png)

JumanはKNPで構文解析する前に行われる形態素解析器です。
参考にした情報は以下です（ありがとうございました！）：

- 導入時　[JUMAN/KNPを用いた 形態素解析・構文解析 実習](http://exploredoc.com/doc/6538450/juman-knp%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F-%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90%E3%83%BB%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90-%E5%AE%9F%E7%BF%92)

- pythonでの使用時（英語） [PyKNP: KNP/JUMAN for Python](http://lotus.kuee.kyoto-u.ac.jp/~john/pyknp.html)
#必要なもの
- [KNP Ver.4.11 (Windows 64bit版）](http://nlp.ist.i.kyoto-u.ac.jp/index.php?KNP#tae6acce)
- [Juman Ver 7.0 (Windows 64bit版）](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN#t6ce0811)
- pythonのバインディング： [pyknp](http://nlp.ist.i.kyoto-u.ac.jp/index.php?PyKNP)（pyknp-0.22.tar.gz をダウンロード）

#導入手順
<ol><li> KNP, Juman, pyknp　をインストールする
<ul><li> KNP Ver.4.11を実行する。フォルダは何も指定しなければ```C:\Program Files\knp```になります。
</li><li> Juman Ver 7.0も同じように実行し、インストールする。
フォルダは何も指定しなければ```C:\Program Files\juman```になります。
</li><li> pyknp-0.22.tar.gz を解凍する。
コマンドプロンプトでpyknp-0.22フォルダ下に入り、下記のようにインストールすれば完了。

```
python setup.py install
```
</li></ul>
<li> 環境設定を行う
<ul><li>＜スタート＞→＜マイコンピュータ＞右クリック→＜プロパティ＞→＜システム詳細設定＞→＜環境変数＞と進み、
システム環境変数のPathに以下を追加。
※knpをjumanのフォルダが存在するPathを指定してください。

```
C:\Program Files\knp;C:\Program Files\juman
```
</li></ul>

</ol>これでKNP, Juman, pyknpの導入は完了。

#Jumanを使ってみる

<ol><li> コマンドプロンプトを開き、```juman```と入力。特に何も表示されなかったら正しく起動しています。

```
> juman
```
</li><li> 適当に文を入力。"横須賀の海は最高です。"と入力してみました。結果は下の画像です。

 ![juman.png](https://qiita-image-store.s3.amazonaws.com/0/89402/27b7dacb-32aa-2d5d-52ba-633758c2d068.png)

</li><li> ```ctrl-z``` で終了。

#KNPを使ってみる
<ol><li> コマンドプロンプトを開き、```juman | knp```と入力。特に何も表示されなかったら正しく起動しています。

```
> juman | knp
```

</li><li>適当に文を入力。"横須賀の海は最高です。"と入力してみました。結果は下の画像です。
![knp2.png](https://qiita-image-store.s3.amazonaws.com/0/89402/af0267af-2a48-cc0e-243d-61001d318270.png)

</li><li>もっと詳しく見たい場合は、下記のように入力して下さい。結果は下の画像です。

```
> juman | knp -tab
```
![knp3.png](https://qiita-image-store.s3.amazonaws.com/0/89402/0874f32e-d0b0-2985-06da-dc8f8365dec6.png)

#おわりに

Windows 7にKNP, JUMAN, pyknpを導入しました。
pythonを使ったKNPは途中なので後ほどまとめます。
WatchFaceのsetWatchFaceStyleについてのメモ


#この記事について
環境：MacOS、Android Studio2.1.2

WatchFaceを作成していて、setWatchFaceStyleの設定がいまいちよくわからなかったので、自分のためのメモ程度でまとめてます。

経緯としては、「[Android Wear How to make watchface project abc2014W](http://www.slideshare.net/hashimotohiroshi1981/android-wear-how-to-make-watchface-project-abc2014w)」このスライドシェアの実装方法を自分で調べ直し、新たに分かったことや分かりにくかった箇所をメモにしたような内容です。スライドシェアの方はスクリーンショットが豊富なので、全体的に私の記事より見やすいです。

#setWatchFaceStyleについて

公式ドキュメントのリンク
[WatchFaceStyle](https://developer.android.com/reference/android/support/wearable/watchface/WatchFaceStyle.html)
[WatchFaceStyle.Builder](https://developer.android.com/reference/android/support/wearable/watchface/WatchFaceStyle.Builder.html?hl=pl)

自分好みに設定するとこんな感じになりました。
それぞれの紹介していない引数についての説明は割愛しています。すみません。


       public void onCreate(SurfaceHolder holder) {
            int gravity = Gravity.TOP| Gravity.CENTER;

            setWatchFaceStyle(new WatchFaceStyle.Builder(MyWatchFace.this)
                    //通知カードの高さを調整。全部表示
                    .setCardPeekMode(WatchFaceStyle.PEEK_MODE_VARIABLE)
                    //アンビエントでは通知を非表示
                    .setAmbientPeekMode(WatchFaceStyle.AMBIENT_PEEK_MODE_HIDDEN)
                    //通知カードを半透明に
                    .setPeekOpacityMode(WatchFaceStyle.PEEK_OPACITY_MODE_TRANSLUCENT)
                    //通知カードの背景を表示しない
                    .setBackgroundVisibility(WatchFaceStyle.BACKGROUND_VISIBILITY_INTERRUPTIVE)
                    //デフォルトのデジタル時計を表示しない
                    .setShowSystemUiTime(false)
                    //充電中マークなどのステータスアイコンの表示位置
                    .setStatusBarGravity(gravity)
                    //"OK Google"を非表示
                    .setHideHotwordIndicator(false)
                    //ステータスアイコンに背景をつける
                    .setViewProtectionMode(WatchFaceStyle.PROTECT_STATUS_BAR)
                    .build());
       }

#参考にしたサイトなど
[Android Wear How to make watchface project abc2014W](http://www.slideshare.net/hashimotohiroshi1981/android-wear-how-to-make-watchface-project-abc2014w)(日本語のSlideShare)

[公式ドキュメント](https://developer.android.com/training/wearables/watch-faces/drawing.html)(英語)
[WatchFaceStyle](https://developer.android.com/reference/android/support/wearable/watchface/WatchFaceStyle.html)
[WatchFaceStyle.Builder](https://developer.android.com/reference/android/support/wearable/watchface/WatchFaceStyle.Builder.html?hl=pl)

#あとがき
>setAmbientPeekMode(WatchFaceStyle.AMBIENT_PEEK_MODE_HIDDEN)

が神。
アンビエントモードで通知カードを非表示にするだけなんですが、アンビエント状態だと他人に見られることもありますし、自分は見てないことが多いはずなので、必須だと思いました。
WatchFaceを作る方は是非これだけでも追加して設定して頂けると私が喜びます。

あとsetWatchFaceStyleとは関係ないんですが、通知カード関連。
「getPeekCardPosition()」で、通知カードの高さなどが取得できるので、
>//通知カードの座標分上に表示する。
>int yPos = (int)((canvas.getHeight()*0.85) - getPeekCardPosition().height();

こんな感じで、通知カードが表示された時に隠れてしまうような要素を通知カードが出ている時だけ上にずらす事が可能です。
このあたりも考えて実装されてると嬉しいですね。
Xperia Z5でUSBメモリを認識する

Androidスマートフォンで撮影した写真や動画を他人にシェアするときにUSBメモリは便利です。
ところがXperia Z5ではUSBメモリを本体に挿しただけでは認識せず利用することができません。
この記事ではXperia Z5でUSBメモリを認識するための方法を記載します。

#手順
1. 設定メニューを開いて、「機器接続」→「USB接続設定」を開く
2. 「USB機器を検出」をタップする
3. 検出中のトーストが表示されるので、その間にUSBメモリを本体に挿す
4. ステータスバーにUSBアイコンが表示されたら認識に成功
依存モジュールのクラスもまとめてテストカバレッジを計測する

# 概要

プロジェクト内に複数のモジュールが存在する時、アプリケーションのメインとなるモジュールでテストを動かすと、JaCoCo のカバレッジ計測ではメインのモジュールにあるクラスのみが計測対象となります。特に、以下のようなコードがビルドスクリプトにある場合は、依存しているライブラリモジュールのクラスのカバレッジが計測できません。

```groovy:app/build.gradle

task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) {
    reports {
        xml.enabled true
        csv.enabled false
        xml.destination "${buildDir}/reports/jacoco/test/jacocoTestReport.xml"
        html.destination "${buildDir}/reports/coverage"
        classDirectories = fileTree(
                dir: "${buildDir}/intermediates/classes/debug",
                exclude: ['**/R.class', '**/R$*.class'])
    }

    // ...
}
```

# 依存モジュールのクラスも計測対象に含めるには

肝心なのは、カバレッジ計測のレポートを生成するタスクの宣言にある report の最後、`classDirectories`の部分です。
ここでカバレッジの計測対象となるクラスがどこにあるかを指定していますが、上述のような記述では、メインとなるモジュールのクラスしか含まれません。

`classDirectories`とある通り、複数のファイルパスを放り込むことができるので、以下のように書き換えてみます。


```groovy:app/build.gradle

task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) {
    reports {
        xml.enabled true
        csv.enabled false
        xml.destination "${buildDir}/reports/jacoco/test/jacocoTestReport.xml"
        html.destination "${buildDir}/reports/coverage"
        classDirectories = files(
            fileTree(
                dir: "${buildDir}/intermediates/classes/debug",
                exclude: ['**/R.class', '**/R$*.class']),
            fileTree(
                dir: "${rootDir}/depModule/build/intermediates/classes/release",
                exclude: ['**/R.class', '**/R$*.class']))
    }

    // ...
}
```

`files()`は複数のファイルパスを渡すことができ、`fileTree()`の戻り値も指定できます。ということで、`fileTree()`で指定したパスを`files()`に渡してその戻り値を`classDirectories`に投げ込んでやることで、依存モジュールのクラスもカバレッジの計測対象になります。
sparkでhdfs上のdataを削除するには



```
def deleteFile(filepath: String, uri: String = "hdfs://localhost:9000") {

    val hadoopConf = new org.apache.hadoop.conf.Configuration()
    val hdfs = org.apache.hadoop.fs.FileSystem.get(new java.net.URI(uri), hadoopConf)
    try { 
        hdfs.delete(new org.apache.hadoop.fs.Path(filepath), true) 
    } catch { 
      case e : Throwable => e.printStackTrace
    }
}
```

みたいな感じで、

- dateframeを使えば、overwrite optionでsaveできる


http://stackoverflow.com/questions/27033823/how-to-overwrite-the-output-directory-in-spark
devise_token_auth導入時、ユーザ登録確認メールが送られない事象の対応方法

## 現象
- devise_token_authのバージョン「0.1.39」を導入し、下記のように設定を行ったが、ユーザ登録の確認メールが届かなくなる
- ちなみに`include DeviseTokenAuth::Concerns::User`を削除すると届くようになる

```rb
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :confirmable, :omniauthable
  include DeviseTokenAuth::Concerns::User
```

## 解決方法
- 下記の記述を足してやることで、確認メール送信のトリガーを無理やり発生させることが出来る
- 参考：[Rails - devise with devise_token_auth not sending confirmation email](https://stackoverflow.com/questions/38491644/rails-devise-with-devise-token-auth-not-sending-confirmation-email)

```rb
  after_create :send_confirmation_email, if: -> { User.devise_modules.include?(:confirmable) }
  private
  def send_confirmation_email
    self.send_confirmation_instructions
  end
```

## まとめ
- バグなのか分かりませんが、正式な対応方法をご存知の方いらっしゃいましたら教えていただけると嬉しいです。
c++ builder XE4 > TeeChart > AddXY() とDelete()の繰り返し > メモリ使用量の変化調査

```txt:動作環境
C++ Builder XE4
```

関連 http://qiita.com/7of9/items/973ecac73c16b0740e36

TeeChartのSeriesのAddXY()をして、余分なデータをDelete()する、という処理を繰り返した時にメモリリークが発生しないか調べた。

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <VCLTee.Chart.hpp>
#include <VCLTee.Series.hpp>
#include <VCLTee.TeEngine.hpp>
#include <VCLTee.TeeProcs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TChart *Chart1;
	TFastLineSeries *Series1;
	TButton *Button1;
	void __fastcall FormShow(TObject *Sender);
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
	void __fastcall addData();
	void __fastcall removeData();
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

static const int kNumData = 200000;

void __fastcall TForm1::FormShow(TObject *Sender)
{
	Chart1->Series[0]->XValues->DateTime = true;
	Chart1->BottomAxis->DateTimeFormat = L"nn:ss";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::addData()
{
	TDateTime dt;

	dt = Now();

	double yval;

	for (int idx=0; idx < kNumData; idx++) {
		yval = (1+ idx) % 2;
		Series1->AddXY(dt, yval, "", clRed);
		dt = IncSecond(dt, 1);
	}
}

void __fastcall TForm1::removeData()
{
	for (int idx=0; idx < kNumData; idx++) {
		if (Series1->Count() == 0) {
			break;
		}
		Series1->Delete(0);
    }
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Screen->Cursor = crHourGlass;

	removeData();
	addData();

	Screen->Cursor = crArrow;
}
//---------------------------------------------------------------------------
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e44f0014-f6fe-f2d8-76ed-64c59f6b9eb8.png)

[TeeChartで使えるデー多数は20万件](http://qiita.com/7of9/items/348c23e4ade4afe872f8)なので、20万件のデータをremove, addしてみた。

メモリリークしてなかった。8332KBから変化なし。
ゼロから始めるWeb Accessibility入門：概要

# なぜアクセシビリティと向き合うのか
「アクセシビリティ」という言葉からは、障害者への対応というイメージを持たれることが多いですが、それだけではありません。

## アクセスできる人を増やすため
アクセシビリティが向上すれば、アクセスできる人の母数が増えます。
アクセシビリティへの配慮を行う事は、障害者や高齢者だけでなく、あらゆる人に恩恵をもたらす可能性があります。

## さまざまなデバイスに対応するため
デバイスの進化は早い上、この先どのようなデバイスがでるのか予想することは困難です。ウェアラブルデバイス、画面が極めて小さいデバイス、画面を持たないデバイスが登場する可能性もあります。

以前より見落とされている典型例は「印刷」です。モノクロで印刷されることも考慮し対応していくことが必要になります。

特定のデバイスしか想定せずに構築していくと、多用なデバイスに対応できません。アクセシビリティへの配慮を行うと、さまざまなデバイスに対応でき、この先のデバイスへの対応も容易になります。

### デバイスの特性でアクセスできないケース
* 情報にアクセスできない
    * 通信速度が遅くて画像が表示されない、動画が再生されない
    * モノクロで印刷したら、色分けされたグラフの意味がわからなくなった
    * 周囲が騒がしくて音声がはっきり聞こえない
    * 音声の解説があるが、音がだせないためわからない
* 操作できない
    * 画面の小さい端末で、小さなボタンがうまく押せない
    * タッチパネルで「マウスポインタを重ねる」という操作ができない
* 環境が対応していない
    * iPhoneやiPadでアクセスしたら、Flashコンテンツが表示されない
    * 「プラグインが必要」と表示がでたが、インストールが禁止されている

## SEOのため
### サーチエンジンのクローラーがコンテンツにアクセスできるようになる
画像だけで構成されたページがあったとき、その画像に適切な代替テキストが指定されていなければ、サーチエンジンのクローラーはその画像を「読む」ことが困難になります。サーチエンジンのクローラーは、全盲のユーザと同じような環境に置かれていることになる。
### コンテンツの意味が伝わるようになる
サーチエンジンはコンテンツを解析して、キーワードの重みづけを行なっています。
ページタイトルや見出し、リンク、強調箇所などがサーチエンジンに伝わらないと、適切な重みづけができなくなり、うまく検索できなる可能性があります。
実際、SEOの基本的な部分は、アクセシビリティ向上の施策と重なります。

## ユーザビリティの向上、改善のため
ある人にとっては「使いにくいが、何とか使える」という状況が、他の方にとっては「全く使えない」という状況になっていることがあります。アクセシビリティの向上で「全く使えない」という状況を解消すると、他のユーザにとっての「使いにくい」状況も改善されることになります。

アクセシビリティ向上の施策は、ほとんどの場合、ユーザビリティも向上させます。両者は重なる部分が多く、ある施策がアクセシビリティのためのものなのか、ユーザビリティのためのものなのかは区別できないこともあります。
ただし、アクセシビリティの向上だけを行えば十分にユーザビリティを確保できるわけではありません。

## ユーザ体験の向上、改善のため
アクセスできなかった。というのもひとつの体験です。
情報が得られなかった、操作できなかった、理解できなかったというのはユーザ体験としては最悪です。アクセシビリティが向上すれば、最悪の体験を回避し、それを成功体験に変えられる可能性があります。

## 規格への対応のため
2016年4月に施行された「障害者差別解消法」では、民間の事業者に対しても、対応を求める努力規定があります。
諸外国においても、国や公共団体に対するアクセシビリティガイドラインの尊重義務を課しているケースは多数あります。
2000年のシドニーオリンピックでは、全盲のユーザが公式サイトにアクセスできなかったため、オーストラリアの障害者差別禁止法に違反しているとして裁判となりました。

## 取り組みをアピールするため
アクセシビリティに配慮していない企業より、配慮している企業に良い印象を持つ人は多い。また、サイトのアクセシビリティを第三者に評価され、ランキングという形で公開されることもあります。
アクセシビリティに配慮したサイト作りは、ユーザや第三者の印象を向上することにも繋がります。
取り組みをアピールするための適切な方法は、アクセシビリティ方針や試験結果を公開することです。実際にアクセシビリティを確保した上で、きちんと情報を公開することがアピールに繋がります。

# 次回
[ゼロから始めるWeb Accessibility：誤解](http://qiita.com/toshinori/items/b94f3ae3f26893490624)
metric_fuで測定した複雑度のグレード別件数を出力するスクリプト

この文書は
===

* Railsアプリの循環的複雑度を測定した際の個人メモ＋スニペットです

問題と対処
===

* [metric_fu](https://github.com/metricfu/metric_fu)のsaikuroで複雑度を測定しました
* するとhtmlのレポートが作成されます
* しかし複雑度順にずらーっとメソッド・クラスが並ぶのみで集計値がありません
* metric_fuの出力はhtmlだけでなくyamlもあったので、読み込んでグレード別に集計するスニペットを書きました

グレードの定義
===

* 複雑度のグレードは若干の揺れがありつつおおむね下記のような基準が多く用いられているみたいなので、今回はこれで行きます。

|グレード|循環的複雑度   |複雑さの状態   |
|:-:|:-:|:-:|
|A|10以下   |非常に良い構造   |
|B|11以上   |普通   |
|C|30以上   |構造的なリスクあり   |
|D|50以上   |テスト不可能   |
|E|75以上   |いかなる変更も誤修正を生む   |

メトリクスの出力
===

* metric_fuをGemfileに追記します。

```Gemfile
gem 'metric_fu'
```

* インストール、実行します。

```sh
bundle install
bundle exec rake metrics:saikuro
```

* ```Rails.root/tmp/metric_fu/report.yml```yamlファイルにメトリクス情報が出力されます

メトリクスの集計
===

集計の実施
---

* 下記のスニペットをrails runner経由などで実行します
* *.rbファイルの全メソッドを複雑度のグレード別に分類しています

```snippet.rb
d = YAML.load_file('tmp/metric_fu/report.yml')

all_complexity = []
d[:saikuro][:files].each do |file|
  file[:classes].each do |klass|
    # ここでは.rbファイルだけとする
    if file[:filename] =~ /\.rb$/
      klass[:methods].each do |m|
        all_complexity << m[:complexity]
      end
    end
  end
end

grade_a = 0
grade_b = 0
grade_c = 0
grade_d = 0
grade_e = 0

all_complexity.each do |c|
  if c <= 10
    grade_a += 1
  elsif c <= 29
    grade_b += 1
  elsif c <= 49
    grade_c += 1
  elsif c <= 74
    grade_d += 1
  else
    grade_e += 1
  end
end

total = all_complexity.length
puts "total   ：#{total}"
puts "total   : %5d %6.2f%" % [total, 100]
puts "A(-10)  : %5d %6.2f%" % [grade_a, grade_a.fdiv(total) * 100]
puts "B(11-29): %5d %6.2f%" % [grade_b, grade_b.fdiv(total) * 100]
puts "C(30-49): %5d %6.2f%" % [grade_c, grade_c.fdiv(total) * 100]
puts "D(50-74): %5d %6.2f%" % [grade_d, grade_d.fdiv(total) * 100]
puts "E(75-)  : %5d %6.2f%" % [grade_e, grade_e.fdiv(total) * 100]
```

集計結果
---

* 下記のように出力されます。

```
total   :  1300 100.00%
A(-10)  :  1250  96.15%
B(11-29):    47   3.62%
C(30-49):     3   0.23%
D(50-74):     0   0.00%
E(75-)  :     0   0.00%
```

* 今回の分析対象は複雑度にはあまり問題はなさそうです

終わりに
===

* その適当スニペットの複雑度をどうにかしろよという突っ込みはなしでお願いします
ubuntu 14.04にpythonパッケージのlxmlを入れるときのメモ

```
pip install lxml
```
でこんなエラーが。。

```
error: libxml/xmlversion.h: No such file or directory

compilation terminated.

error: command 'gcc' failed with exit status 1
```

なんかgcc的なのが入ってないみたいなので、↓的なコマンドを実行する。

```
$ sudo apt-get install -y libxml2-dev libxslt1-dev
```

このあと

```
pip install lxml
```
で無事パッケージがはいる。
プログラマー歴、半年未満でもわかるpay.jp導入(rails)

・書いてあること

文系の大学生がrailsを勉強して調子乗ってwebpayを導入して([プログラマー1ヶ月目でもわかるwebpayの導入1(rails)](http://qiita.com/nekononeko_53/items/3ae3856aa0f1a9ddfb5c))から4ヶ月。

今度はBASE社のPAY.JPの導入にチャレンジしてみたって話。

基本的にはコードをそのままコピペすれば実際に動くように書いてます。。

webpay同様、簡単にできるなぁって感じでした。。


・PAY.JPとは

雑に書くとクレジットカード決済のアレ

https://pay.jp/

pay.jpはvisa・masterの手数料がwebpayよりも低いですね。

webpayのスタータープランは

VISA・masterが3.25%

JCB・ダイナース・アメックスが3.40%
https://webpay.jp/pricing

payjpは

VISA・masterが3.0%

JCB・ダイナイース・アメックが3.6%

では実際に導入してみましょう!!

今回も怖いのでいきなり作ってあるappに導入する前に別appを作りました。

1.とりあえずpayjpってのを作ってみる

```ruby:ターミナル
$ rails new payjp 
$ cd payjp
```

2.pay.jpのgemをインストール

```ruby:Gemfile
  gem 'payjp'
```

```ruby:ターミナル
$ bundle install
```

3.ルーティング

```ruby:config/ro
root 'products#index'
get 'products' => 'products#index'
post 'products/pay' => 'products#pay'
```

4.コントローラー

```ruby:ターミナル
bundle exec rails g controller products
```

```ruby:app/controllers/products_controller.rb
def index
end

def pay
    Payjp.api_key = '秘密キー'
    charge = Payjp::Charge.create(
    :amount => 3500,
    :card => params['payjp-token'],
    :currency => 'jpy',
)
end
```

秘密キーとか公開キーはログインしてダッシュボードの右上の方の歯車のアイコンを押すと「ユーザー設定」ってのがあってその中の「API KEY」ってところに書いてあるよ。

webpayのときも書いた気がするけど「amount」ってのが金額だよ。

5.view

```ruby:app/views/products/index.html.erb
<%= form_tag(action: :pay, method: :post) do %>
   <script type="text/javascript" src="https://checkout.pay.jp" class="payjp-button" data-key="公開キー"></script>
<% end %>
```

```ruby:app/views/products/pay.html.erb
支払い完了
```

localhost:3000で確認してみると

<img width="1280" alt="スクリーンショット 2016-08-18 13.44.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/117128/12a21c51-8f43-9218-6955-fc7f9386fd51.png">


こんな感じの画面になっているはずで

決済も試せて

テストカードで決済すると

ダッシュボードに3500円の売り上げがあったことになるはずなんですよ。

とても簡単ですね。

一回導入を試してみて成功してから

すぐには書いてるんですけどもしかしたら書き忘れてるところとかあるかもしれないので

もし試してみて

「おい、動かねーじゃねーか。ふざけんな。時間返せ。」

みたいな感じになったら、コメントに書いていただければ問題の箇所を探して訂正します。
(*神様ではないので時間は返せそうにないのでその辺は許してください。)
c++ builder / TeeChart > Link > Memory Usage keep increasing when auto scrolling chart

```txt:動作環境
C++ Builder XE4
```

TeeChartを使ってグラフ描画するソフトでメモリリークが発生している。その一因としてTeeChartの情報を調べてみた。

http://www.teechart.net/support/viewtopic.php?f=4&t=13014

TeeChartのバージョンは違うかもしれないが、同様の症状があるかもしれない。

page2に以下の記載がある。

> by jdsu » Sat Apr 07, 2012 3:54 pm
> Using your code together with the GetAxisLabel event, there was no memory leak.
However, I'm unable to access the e.Series and e.ValueIndex.

別途、page2の記載

> by Sandra » Thu Apr 05, 2012 2:24 pm
> As I explain in previous message your Memory Usage increase because you use AddLabels().

AddLabels()はこちらでは使っていない。

こちらで使っているのはAddXY()のみ。

AddXY()を繰り返す処理に対して、余分な旧データは適宜Delete()している。これによるメモリリークはないと思っているが、TeeChartの不具合があるかは不明。
MechanizeでTwitterアナリティクスのデータエクスポートを自動化する

## 本記事の目的 
RubyのMechanizeを使ってTwitterアナリティクス上で閲覧できるツイートアクティビティデータのエクスポートを自動化するスクリプトを作成する。

## Twitterアナリティクス
[Twitterアナリティクス](https://analytics.twitter.com/)

![twiana.png](https://qiita-image-store.s3.amazonaws.com/0/126784/66a1420d-81df-547b-e69b-c53d74ca8921.png)


- Twitter公式が提供している分析ツールで、日々のツイートインプレッションのグラフやツイート毎のインプレッション数、リンクのクリック数、お気に入り数などを見ることが出来る
- アナリティクス自体には簡単な分析機能しか無く、複雑な分析をしたい場合はデータをエクスポートして自前で頑張る必要がある

今回は、Twitterアナリティクスへのログインから指定期間のツイートアクティビティデータのエクスポートまでをスクリプトで自動化する。

## Mechanize
Webページの遷移やログインを補助してくれるRubyのgem。
以下を参考にさせて頂いた。
[Rails スクレイピング手法 Mechanizeの使い方](http://qiita.com/shizuma/items/d04facaa732f606f00ff)
[[Ruby]Mechanizeでログイン機能があるサイトにログインする](http://qiita.com/jun1_0803/items/9d3b26176b399e21fd61)

## 実装

### 1. MechanizeでのTwitterアナリティクスへのログイン
TwitterアナリティクスにMechanizeを使ってログイン出来ることを確認する。
【ID】【パスワード】は自分のTwitterアカウントのもの。
rubyのバージョンは 2.0.0p598 

```ruby:login.rb
require 'mechanize'

agent = Mechanize.new
agent.user_agent_alias = 'Windows Mozilla'
url = "https://analytics.twitter.com/user/【ID】/tweets"

page = agent.get(url)
form = page.form_with(action: 'https://twitter.com/sessions')
form.fields[0].value = '【ID】'
form.fields[1].value = '【パスワード】'
p form.submit.title
```
ログインに成功していれば上記のコードで以下の出力結果が得られる。
`"【ID】に関するツイートアクティビティアナリティクス"`

### 2. データのエクスポート
MechanizeではJavascriptが動作しないため、Javascriptを前提として作られているエクスポートボタンから直接ファイルのダウンロードを行うことが出来ない。
この場合、Mechanizeのエージェントが取得しているセッション情報を再利用して、エクスポート操作時のHTTPリクエストをエミュレートすることでファイルのダウンロードを実行できる。
今回エミュレートすべきHTTPリクエストの内容は、ChromeのDeveloper Tool等で調査した。

### 3. 1,2を合わせて
最終的なスクリプトのコードは以下のようになった。

```ruby:getTwitterActivity.rb
require 'mechanize'
require 'time'

ITERATE = (Time.parse(ARGV[1]).to_i - Time.parse(ARGV[0]).to_i ) / (60 * 60 * 24) + 1
START_DATE = (Time.parse(ARGV[0]).to_i).to_s + "000"
END_DATE = (Time.parse(ARGV[1]).to_i + (60 * 60 * 24 - 1)).to_s + "999"

agent = Mechanize.new
agent.user_agent_alias = 'Windows Mozilla'
url = "https://analytics.twitter.com/user/【ID】/tweets"
export_url = "https://analytics.twitter.com/user/【ID】/tweets/export.json?start_time=" + START_DATE + "&end_time=" + END_DATE + "&lang=ja"
bundle_url = "https://analytics.twitter.com/user/【ID】/tweets/bundle?start_time=" + START_DATE + "&end_time=" + END_DATE + "&lang=ja"

page = agent.get(url)
form = page.form_with(action: 'https://twitter.com/sessions')
form.fields[0].value = '【ID】'
form.fields[1].value = '【パスワード】'
form.submit

for i in 1..ITERATE do
     agent.post(export_url ,"")
     sleep(10)
end

file = agent.get(bundle_url)
file.save
```

`ruby getTwitterActivity.rb 2016-08-01 2016-08-02`
取得したい期間の開始日と終了日を引数として与えて実行すると、実行ファイルのディレクトリにcsvファイルが保存される。
あとはcronで定期的に実行し、csvをデータベースに保存するなりすればよい。
csvは時刻のタイムゾーンがUTCなので分析の際は注意

## その他
長期間データの一括取得とかをやりすぎるとアカウントが凍結されるかもしれないので注意したい
z/OS Tips：USS上のファイルをPDSのメンバーへコピーする

#背景
z/OSのUSS上で作成したファイルをPDSのメンバーとしてコピーできれば、USS上で実行したスクリプトの実行結果の管理やJCLの編集をviエディターとかでできたりと、なにかと便利かもと思い、以下にコピー方法を記載。

#実行方法
```
#cp filename.txt "//'zos.pds.name(MemberName)'"
```
##実行例　
USS上の*hoge.txt*をSOUMEI.ZOS.JCLLIB(*HOGE*)としてコピー
※ちなみに、*hoge.txt*の中身はこんな感じ

```
# cat hoge.txt
AAAAAA
```
コピーの実施

```
# cp hoge.txt "//'SOUMEI.ZOS.JCLLIB(HOGE)'"
```
#結果確認
Copy先に*HOGE*というメンバーができた

```
  Menu  Functions  Confirm  Utilities  Help                                    
------------------------------------------------------------------------------ 
VIEW              SOUMEI.ZOS.JCLLIB                         CHARS 'HOGE' found 
           Name     Prompt       Size   Created          Changed          ID   
_________ HOGE                                                                 

```
一応中身も確認


```
VIEW       SOUMEI.ZOS.JCLLIB(HOGE) - 01.00                 Columns 00001 00072 
****** ***************************** Top of Data ******************************
000001 AAAAAA                                                                  
****** **************************** Bottom of Data ****************************
```
できたできた。
尚、今回はz/OS V2.1で実施しました。

###補足
再度Copyするときは、z/OS側のPDSメンバーを削除、別のメンバー名でコピーするなりの対応が必要そう。。。
上書きコピーとかオプションでできたりするかもですが、とりあえず、コピー方法のみ記載しています。
電子部品 > 在庫管理 > mindmup > My Mindの方がiPad mini4上で軽い

増え続ける電子部品。店舗に行った時に在庫数が少ないものを知りたい。

自作ソフトを用意するのも検討したが、SQLとか考えると面倒な気がする。

とりあえずmindmupで作ってみた。これをiPad miniでキャプチャすればオフラインでも在庫情報を知ることができそうか。
https://atlas.mindmup.com/2016/08/7c71fb40472501346c5b03ba9eef99d0/ic_20160818/index.html

この5倍の種類になった時にグループ化をうまくしないと破綻するかもしれない。

オンラインの場合はFキーで子ノードのcollapse/expandができる。ただし、collapseした場合はCtrl+Fで検索できない。
キャプチャした場合は画像になるので、自分で部品の位置を探すことになる。

<hr>
(追記 2016/08/19)

ミルクコーヒーの箱に整理している抵抗などの棚卸をした。

https://atlas.mindmup.com/2016/08/de9478e047bf0134f4fb338a6149a680/ic_20160818/index.html

<hr>
(追記 2016/08/20)

2016年8月20日の棚卸をした。

https://atlas.mindmup.com/2016/08/e3b924f0489a01346a457f9e181ea5c5/ic_20160818/index.html

- ストレートピンヘッダ買いすぎ
- はんだこて買ってから1年くらいで部品増えすぎ
- 閲覧性の点では破たんしている
  - 整理を検討
  - Ctrl+Fでの検索性は悪くない
- iPad mini4で上記のマップページ閲覧時、スクロールが遅すぎる
  - キャプチャ作業そのものが時間がかかる (誤算)
 
@uzero さんに教えていただいたMy Mindで開いてみた。
http://my-mind.github.io/?b=gdrive&id=0B-b9m8ugUmdlZnpneHk0bmdabms

- iPad mini4でのスクロールがmindmupより軽い
- オフラインにしてもキャッシュが残っていて、マップ閲覧ができる

@uzero さん
情報感謝。
これはいいです。
ActiveRecord使用時のインデックス張り忘れとその対策


Rails AntiPatternsを読んでいたら、ActiveRecord使用時のインデックス張り忘れについてチートシート的にまとまっていたのでメモ。

#### Rails AntiPatternsとは

Railsの開発におけるノウハウをアンチパターン/解決策という構成でまとめた書籍。
内容は少し古めだが基本は押さえられている。

残念ながら日本語に翻訳されていないが、下記のサイトでpdfの無料ダウンロードが可能。

[Rails AntiPatterns \- Free Download eBook \- pdf](http://it-ebooks.info/book/1504/)

## プライマリキー

Railsの規約に沿っていれば `id` としてインデックスまで自動的に設定されるため考慮する必要なし。

## 外部キー

`has_many/belongs_to` の子側に設定された外部キーなど。
たとえば、下の例では `comments.post_id` にインデックスが必要。

```
class Post < ApplicationRecord
  has_many :comments
end

class Comment < ApplicationRecord
  belongs_to :post
end
```

インデックスの必要性が事前にわかっていればモデルのジェネレート時に設定してしまうのがよい。

```
$ rails g model Comment post_id:integer:index
```

## ポリモーフィック関連で使われるカラム

下記の例の場合、`post.taggings` で、`SELECT "taggings".* FROM "taggings" WHERE "taggings"."taggable_id" = ? AND "taggings"."taggable_type" = ?` というクエリが走るので、`taggings.taggable_id` と `taggings.taggable_type` の複合インデックスが必要になる。

```
class Tag < ApplicationRecord
  has_many :taggings
end

class Tagging < ApplicationRecord
  belongs_to :tag
  belongs_to :taggable, :polymorphic => true
end

class Post < ApplicationRecord
  has_many :taggings, :as => :taggable
end
```

## ユニーク制約の対象カラム

下記の場合、 `users.email` にユニークインデックスが必要。

```
class User < ActiveRecord::Base
   validates :email, :unique => true
end
```

ジェネレート時に設定してもよい。

```
$ rails g model DummyUser email:string:unique
```

## STI(単一テーブル継承)で使っているカラム

下の例だと `UpdateNotification` でSELECTした際にWHERE句に `"notifications"."type" IN ('UpdateNotification')` がついてくるため、 `notifications.type` にインデックスが必要。

```
class Notification < ApplicationRecord
end

class UpdateNotification < Notification
end
```

## `to_param` で使われているカラム

`/users/1` の代わりに `/users/Jake` といったアクセスを可能にする `to_param`。
たとえばユーザ名でアクセスさせる場合は `users.name` にインデックスが必要になる。

[to\_param \- リファレンス \- \- Railsドキュメント](http://railsdoc.com/references/to_param)

## WHERE句で使われるカラム

- ステータス管理のカラム等
  - `user_id` など別のカラムと組み合わせて使うことが多いため、複合インデックスもチェック
- booleanのインデックス
  - 値がtrue/falseのどちらかに極端に偏っていない限り不要
- datetimeのカラム(`created_at` など)
  - 通常`order`で使われることが多いが、`where` でも使われているのであればインデックスの作成を検討する

## その他

### 注意点

- 大量のデータを保持して稼働している本番環境でインデックスを張らない
- むやみやたらにインデックスを張らない。使われないインデックスはINSERT/UPDATEのコストを増加させるだけ

### ボトルネックの発見

- インデックスが必要なカラムを抽出
  - [lol_dba](https://github.com/plentz/lol_dba)の `db:find_indexes` などを使う
- スロークエリーログを追う
- EXPLAINを読む
  - `ActiveRecord::Relation` の `explain` を使う(`User.all.explain` のように使う)
- 各種プロファイラを使う
  - [dejan/rails\_panel: Chrome extension for Rails development](https://github.com/dejan/rails_panel)
  - [josevalim/rails\-footnotes: Every Rails page has footnotes that gives information about your application and links back to your editor](https://github.com/josevalim/rails-footnotes)
oFを書くためのc++メモ


クソ初心者がメモしてゆきます。
0.9.3で確認してます。

##ofApp.cpp
* まず最初に処理を書くクラス
* ofBaseApp を継承している
* 便利メソッドがあらかじめ定義されてる
* setup() 初期化
* update() // 毎フレーム更新
* draw() //毎フレーム更新, updateの後に呼ばれる。


##ログを出す
```cpp
ofLog(OF_LOG_NOTICE, ofToString(10));
ofLogNotice() << "hoge" << 10;//hoge10
```
参考：変数の値を見る
http://openframeworks.cc/ja/learning/01_basics/how_to_view_value/


##for文
```cpp
//for文で画面中心を始点にし、画面上にランダムな線を書く。
for(int i=0;i<1000;i++){     
	ofDrawLine(
       ofGetWidth()/2,
       ofGetHeight()/2,
    	ofGetWidth() * ofRandom(0, 1),//ofGetWidth() で画面幅
    	ofGetHeight()* ofRandom(0, 1)//ofGetHeight() で画面高
    );
}
```


##配列
静的と動的なのがある。

```cpp
/**静的配列**/
int ary[4] = {1,2,3,4};
```


```cpp
/**動的配列**/
vector<int> ary;//定義
ary.push_back(3);//push
ary.push_back(2);//push
ary.push_back(1);//push
//size()でlength
for(int i=0;i<ary.size();i++){
	ofLogNotice() << ofToString(ary[i]);
}
ary.clear();//データがクリアされる？

```


##乱数
```cpp
float r1 = ofRandomf();//return between -1 and 1 
float r2 = ofRandom(startVal,endVal);
```

##定数

ヘッダファイルにこんな感じで定義

```cpp
#define HOST "localhost" // 受信側のIPアドレス
#define PORT 6666 // 受信側のポート番号
```


##演算子・記号
見慣れないやつが多々ある・・。

```cpp
std::find(); //std名前空間のfindを呼び出し
Test::hoge(); //Testクラスのスタティックなメソッド呼び出しhoge()
p->append("hello");//ポインタを経由して変数へアクセス
ofLogNotice() << "hoge" << 100;//log に hoge100 と表示。左シフト演算子
```

参考 : http://d.hatena.ne.jp/gununu/20131012/1381578689


##math関係
math.h

```cpp
sin(M_PI);//M_PI==3.14..
abs(-10);
ceil(3.14);
floor(3.14);
round(3.14);
max(0,10);
fmod(3.14,1);//==0.14 余剰の計算
//などなど・・
```
参考 : http://www.c-tipsref.com/reference/math.html


##インスタンス化について
* c++では変数宣言したら、コンストラクタが呼ばれ、インスタンス化される。
* newもあるけど、意味が違う。delete と対で使う。http://ameblo.jp/blueskyame/entry-10047378401.html


##スタティックなメソッド
```cpp:test.h
class test {
public:
   static void hogehoge();//static method
};
```

```cpp:tect.cpp
#include "test.h"
#include "ofApp.h"

void test::hogehoge(){
    ofLogNotice() << "hoge";
    //test::hogehoge(); のように呼び出す。
}
```

##継承する
スーパークラスのメソッドにvirtual をつけるらしい。


##シングルトン
http://qiita.com/kikuuuty/items/fcf5f7df2f0493c437dc

##ポインタについて
http://qiita.com/yoppa/items/d9705449478d50263b46



#addon memo

##addon解説
http://mizutanikirin.net/of-addons

##optical flowを使う
https://note.mu/loveandsheep/n/n3181ff47a47e

##OSCを使う
osc アドオンがデフォで入っている。Unityと通信するときは以下を注意。
Unity x oFの注意点
http://qiita.com/yohki/items/496d9ad345fdd1c9b779

##websocket を使う
https://framesynthesis.jp/tech/2015/07/unitysocketio/

##datguiを使う
https://braitsch.github.io/ofxDatGui/

##kinect2　を使う
http://tech.kayac.com/archive/mackinect_v22015.html

##OpenCV
http://www.slideshare.net/tado/media-art-ii-2013-6openframeworks-addon-2-ofxopencv-ofxcv

##json
http://qiita.com/sa-k0/items/5c7248dff540f3288630#ofxjson


#資料
* http://r-dimension.xsrv.jp/classes_j/openframeworks_1/
* http://yoppa.org/ma2_14
* https://sites.google.com/site/ofauckland/


#おまけ：xcodeのショートカット
* Cmd + R ビルドしてラン
* Cmd + . ラン終了
* Cmd + Q シミュレータ終了
* Cmd + Shift + K クリーン。
* Ctrl + Space コードヒントを表示する
[Rails]レコードの数を制限する

Railsでレコードの数を制限する方法。

```
class Company < ActiveRecord::Base

 has_many :employees

end
```

```
class Employee < ActiveRecord::Base

 belongs_to :company

end
```

上記のようなケースで、Companyのemployeesの数にValidationをかけたい場合。

```
class Employee < ActiveRecord::Base

 belongs_to :company

 validate :check_number_of_employees

 def check_number_of_employees
  if company && company.employees.count > 10
   errors.add(:company, "人数OVER")
  end
 end

end
```

このようにかけます。
上流工程における要注意事項

ウォーターフォール型システム開発の上流工程における要注意事項についてお話します。


#1.ウォーターフォール型システム開発に対する簡単な説明

　ウォーターフォール型では、概ね以下のフェーズに分けて段階的にシステム開発を行います。
　※細かい部分は開発案件による違いがありますが、だいたいこんな感じという程度に捉えてください
　
　　　　　　　　　　　開発側　　ユーザー
　(1)要件定義　　　　　 ○　　　　○
　(2)基本設計　　　　　 ○　　　　○
　(3)詳細設計　　　　　 ○　　　　－
　(4)プログラム製造　　 ○　　　　－
　(5)単体テスト　　　　 ○　　　　－
　(6)結合テスト　　　　 ○　　　　－
　(7)総合テスト　　　　 ○　　　　△
　(8)運用テスト　　　　 △　　　　○
　
　上記のうち(1)(2)がこの記事で取り上げる上流工程にあたり、この２つのフェーズはユーザー（システムの使用者）と打合せをして、どのようなシステムを開発するかについて、設計書上で具体的なかたちに起こしていきます。

　(3)～(6)のフェーズについては、基本的にはユーザーとは関係しない開発側だけの作業となり、(7)(8)のフェーズにて再びユーザーとの共同作業となります。（実際にこのように綺麗にいくかは別ですが、定義としては・・・という話です）

#2.上流工程におけるスケジュール管理
　
　システム開発に対する進捗管理はマスタスケジュール表（ユーザーと共有）を作成することで行いますが、上流工程で管理されるスケジュールの単位は開発するシステムの機能であり、ユーザーがシステムの完成品をイメージできる設計書になります。
　
　この上流工程のスケジュールに遅れが発生することは（基本的には）絶対に許されず、とにかくこの上流工程の期間はユーザーとの打合せおよびマスタスケジュールの遵守が最優先事項となります。
　
#3.上流工程における要注意事項

　さて、この上流工程においてユーザーとの合意を取りながらマスタスケジュールを死守していく一方で、その裏側（水面下）ではもう一つの最重要課題があります。
　
　それは、他でもない詳細設計（上記1(3)）とプログラム製造（上記1(4)）に対する準備です。
　
　具体的には、テーブル項目とその使い方、根幹となる機能や処理に対する内部処理フローなどになるのですが、これらの設計書はユーザーに対しては必ずしもそのすべてを説明する必要はなく、ユーザーと共有するマスタスケジュールにも基本的には登場しないことが多いです。

　このため、これらの作業に対する優先度は自ずと下がってしまう傾向にあり、結果として詳細設計以降に開発メンバーが合流した時点でプロジェクト内部は一気に混乱し、ある日突如として大幅なスケジュール遅延が発生（といよりは、発覚）してしまうことになります。
　
#4.回避策

　これは相当に難しいです。
　
　理論上は[WBS](http://mngmnt.jp/2015/04/17/about-wbs/)を導入することで回避可能なのでしょうが、いろいろな意味において、その難易度は極めて高いと思っています。
　
　そういう意味で、私自身としても明確な回避策はないのですが、ある日突然プロジェクト内部を破綻させないためにも、詳細設計以降の開発を十分に意識したうえで上流工程を進めることが大切です。。。
　
　
以上
IBM Hadoop (BigInsights/IOP)のデータ暗号化機能の比較

# IBM Hadoop(BigInsights/IOP)のデータ暗号化


Hadoopからのセットアップ方法や利用手順、パフォーマンス結果などの詳細な結果が[IBM BigInsights 4.1 - HDFS暗号化検証レポート](http://www.ibm.com/developerworks/jp/data/products/bigdata/)としてアップされている。
これを見ると、これまではHDFSデータの暗号化としてはLinuxのディスク暗号化（LUKS暗号化）を使っていたが、今後はHDFS暗号化が暗号化のメインになっていくのではないかと思う。HDFS暗号化はRangerによるKey管理もできるし。


レポートでは暗号化利用時に気になるパフォーマンスへの影響に関してもテストされている。以下はBigInsights 4.1 (Hadoop2.7.1)でのHdbenchによる性能テスト結果の抜粋。
暗号化なし/HDFS暗号化/LUKS暗号化で、データノード数4,8,12で1GBのファイル入出力の結果を表すパフォーマンスグラフが以下。
![スクリーンショット 2016-08-17 14.42.15.png](https://qiita-image-store.s3.amazonaws.com/0/137326/7a9c5da4-d088-f2ce-dadc-5336211ecc4b.png)

青いバーが各ノードごとの処理能力を示していて、同じデータノード数同士で比較することでパフォーマンスへの影響を読み取ることができる。
読み込み性能はメモリの影響を受けることによりどれもほぼ劣化がないという結果を示しているが、書き込み性能はHDFS暗号化が数%程度の劣化であるのに対して、Linuxディスク暗号化(LUKS)が30%程度の性能劣化を示している。

それ以外にHDFS暗号化の特徴はこんな感じ：
- ユーザー/プログラム側で変更の必要なし
- 対象ディレクトリの指定が可能(影響を最小限にする)
- 暗号化の設定と解除がいつでも可能
- keyを別システム管理にすることでセキュリティアップ
などなど。

レポートではインストール・設定やパフォーマンス結果の詳細も分かるので是非一読を。

## ==============
私の発言は私自身の見解であり、必ずしも所属する会社での立場、戦略、意見を代表するものではありません。
tmux で複数pane使って複数のコマンドを実行する(標準入力バージョン)

複数のコマンドを実行してその結果を観察したい場合に、tmuxを使ってできれば良さそうだと思ったので作ってみた。

## 使いかた

複数のコマンドをecho するだけのスクリプトを作る. (何を実行したのかの記録、コマンドの引数をループで作成して大量実行したいという理由)

```bash:commands.sh
for i in *
do
  echo "ls $i"
done
```
```
sh commands.sh | sh multi_pane.sh
```


## スクリプト
```bash:multi_pane.sh
SESSION_NAME=$1
SESSION_NAME=${SESSIONNAME:-multi-session}
echo start session: $SESSION_NAME;
tmux new-session -d -s $SESSION_NAME

f=0
while read n
do
  tmux split-window
  if [ $f -lt 1 ];then
    # 始めのpaneは不要なので削除
    tmux kill-pane -t 0
    f=1
  fi
  tmux select-layout tiled
  tmux send-keys "$n" C-m
done

tmux select-pane -t 0
echo "attach"
tmux attach-session -t $SESSION_NAME
```
Emacs の window が横に分割されるのを防ぐ

## 問題点: window が横に分割されると見づらい

Emacs で何か処理を実行して出力が別の window に表示されるとき、 ```split-window-sensibly``` が内部で実行されている。これは window に合わせて自動的に最適に window を分割してくれる関数。つまり横幅が長いなら垂直に分割して、縦が長いなら水平に分割する。

最近のPCは横長のディスプレイが多いので横に分割される事が多いが、行の長い出力を読む時は折り返されてしまうので私は **常に水平に分割して欲しい。**

## 解決策: split-width-threshold に nil を設定する
```split-width-threshold``` のヘルプを見ると、

>  If this is nil, ‘split-window-sensibly’ is not allowed to split a window horizontally.

との事。

つまり下記で解決した。

```lisp
(setq split-width-threshold nil)
```

## 参考

挙動がいまいち不明だったので、ついでにもう少し調べる。

[How display-buffer works(GNU Emacs Manual)](https://www.gnu.org/software/emacs/manual/html_node/emacs/Window-Choice.html) によると


>If split-height-threshold is smaller than the selected window’s height, the split puts the new window below.

split-height-threshold  の値が選択したウィンドウより小さい場合は、下側にウィンドウが分割されます。

> Otherwise, if split-width-threshold is smaller than the window’s width, the split puts the new window on the right.

そうでない場合、 split-width-threshold がウィンドウの横幅より小さい場合は、右側に分割されます。

> If neither condition holds, Emacs tries to split so that the new window is below—but only if the window was not split before

どちらも満たさず、既にウィンドウが分割されてない場合は、下側にウィンドウを表示します。


先に split-height-threshold が評価されるらしい。
アラートのOK、Cancelボタンは右と左、どちらにおくべきか？

# はじめに
皆様は、アラートのOKボタンとCancelボタンの配置は
どういった基準で決めていますか？
(右か、左か？）

勿論、スマートフォンを右手で操作する人、
左手で操作する人で、変わってくると思いますが、、、

## 基準はどうすべきか？
ちなみに、押しやすいのは、右か、左か？

右手で操作する人を想定した場合
押しやすいのは、右側だと思います。
単純に親指からの距離が近いためです。

逆に左側は、親指からの距離が遠いため、
押しにくいです。
（当たり前ですね。）

こういうときは、各プラットフォームのガイドラインに準拠するのがベターだと思います。

「郷に入っては郷に従え」ではないですが、
iOSの場合はヒューマンインタフェースガイドライン、
Androidの場合は、Google Material designに準拠すべきだと思います。

## iOSヒューマンインタフェースガイドラインの存在
存在を知っているが、軽視している方もいらっしゃるかもしれませんが、
なんとなく設計や実装をしている方は、今一度読見直されるとよいかもしれませんね。

ちなみに、本件についてガイドラインから抜粋すると、下記のように書かれています。

・最も自然なボタンのアクションが非破壊的であれば、2つボタン型アラートの右側に置いてください。アクションを取り消すボタンは左側にします。
・最も自然なボタンのアクションが破壊的であれば、2つボタン型アラートの左側に置いてください。アクションを取り消すボタンは右側にします。

翻訳なので、分かりづらいですね。。。

### 非破壊的なアラートの場合
<img width="261" alt="スクリーンショット 2016-08-18 11.21.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/e582852a-280b-029f-d353-a02b1817bc27.png">

### 破壊的なアラートの場合
<img width="262" alt="スクリーンショット 2016-08-18 11.19.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/3584ca08-8266-a797-0be8-19c1281e0f40.png">

要約すると、
・基本的には、OKを右、Cancelを左に配置する
・誤ってタップすると困るようなアラートは、OKを左、Cancelを右に配置する

ちなみにAndroidは、Material designによると、
肯定的なボタンは右、否定的なボタンは左に配置すると記載されているようです。

## その他　アラート関連のガイドラインについて（一部抜粋）

### アラートについて
+ タイトル（必須）
 - タイトルは1行で十分表示できる短さにすること。
 - 「エラー」、「警告」など、有用な情報を提供しない一語のタイトルは避けること。
+ メッセージ（任意）　
+ ボタンを幾つか配置する
 -  3つ以上のボタンを含む場合は、アクションシートを使用すること。

### 選択するアクションについて
+ 選択するアクションは、「タップ(tap)」という単語を使用すること。
+ 「タッチ(Touch)」、「クリック(Click)」、「選ぶ(Choose)」は、使用しないこと。

### ボタンタイトルについて
+ タイトル形式の大文字化を使用し、句点は使用しない。（英語の場合）
+ アラートに直接関連する動詞を使用すること。
+ 単純な受け入れを示す選択肢として、ほかに適切な候補がなければ「OK」を使用する。
 - 「はい(Yes)」や「いいえ(No)」の使用は避けること。

# まとめ
今回お話したかったことは、
どちらでも大差ないという考え方もあると思いますが、

なんとなく設計や実装するのではなく、
こうあるべきだというべき論（ポリシー）をもって
ものづくりをしていきたいという自分への戒めです。

基本を知ったうえで崩すのと、
基本を知らないで崩すのは、
結果が同じでも、得るものは違うと思います。
（守破離！）

勿論、ユーザビリティ向上には、
パフォーマンスが大事！ということも
十分理解しております。

長文乱文失礼しました。

## 参考
iOSヒューマンインタフェースガイドライン
https://developer.apple.com/jp/documentation/UserExperience/Conceptual/MobileHIG/Alerts/Alerts.html#//apple_ref/doc/uid/TP40006556-CH14-SW1
Deviseで認証失敗したときにApartmentでのDB切り替えが機能せず意図したDBを参照してくれない問題


が発生したが、middleware の順番の問題だった

以下のように、Deviseが使用している middleware Warden::Manager より先に HogeElevator (ApartmentのカスタムElevator） を登録すると解決。 


```
Rails.application.config.middleware.insert_before 'Warden::Manager', 'HogeElevator'
```

変更前の `rake middleware`

```
use Rack::Sendfile
use ActionDispatch::Static
(snip)
use Rack::ETag
use Warden::Manager      <==== Devise
use I18n::JS::Middleware
use Apartment::Reloader
use Bullet::Rack
use HogeElevator         <==== テナント切り替え
run HogeServer::Application.routes
```

上記のように Devise(Wardern) の後にテナント切り替えのmiddlewareが登録されている。


変更後

```
use Rack::Sendfile
use ActionDispatch::Static
(snip)
use Rack::ETag
use HogeElevator         <==== テナント切り替え
use Warden::Manager      <==== Devise
use I18n::JS::Middleware
use Apartment::Reloader
use Bullet::Rack
run HogeServer::Application.routes
```

変更後は、Apartmentでのテナント切り替えの動作後にDevise(Warden)が動作するようになった。


## 参考

* [influitive/apartment: Database multi-tenancy for Rack (and Rails) applications](https://github.com/influitive/apartment#middleware-considerations)
* [web console (better_errors + binding_of_caller) uses public tenant with generic elevator · Issue #349 · influitive/apartment](https://github.com/influitive/apartment/issues/349)
AWSの請求書におけるS3の明細の見方

AWSコンソールの[請求とコスト管理]＞[料金明細]＞[Simple Storage Service]の中身を確認した時のメモです。自分が管理している分だけしか見ていませんので、S3のサービス全体を網羅できているとは限らないことをご了承ください。

# サービス体系
- Amazon S3 標準（汎用）
  - 低レイテンシーと高スループット
- Amazon S3 標準 - 低頻度アクセス
  - 耐久性はそのままで、SLA を少し下げることで料金を下げたオプション
- Amazon S3 低冗長化ストレージ
  - オブジェクトの複製回数を減らすことで料金を下げたオプション
- Amazon Glacier - アーカイブ
  - 取り出しに数時間かかるが最も低価格

# 用語集
- APN1 : ap-northeast-1（アジアパシフィック 東京 リージョン）
- TimedStorage : ストレージ（時間課金分）
- ByteHrs : バイト数／時間
- Tier : S3のリクエストタイプを分類する階層
  - Tier1 : PUT, COPY, POST, LIST
  - Tier2 : GET その他
  - Tier3 : Glacier のアーカイブとリストア
- monthly global free tier : 毎月の無料利用枠（最初の１年間）
- Reduced Redundancy Storage(RRS) : 低冗長化ストレージ
- SIA(Standard - Infrequent Access) : 標準 – 低頻度アクセス

# 明細の中身（例）
- Amazon Simple Storage Service APN1-Requests-Tier1 : リクエストに対する課金
  - $0.00 per request - PUT, COPY, POST, or LIST requests under the monthly global free tier : 無料利用枠
  - $0.0047 per 1,000 PUT, COPY, POST, or LIST requests : 無料利用枠を超えた部分
- Amazon Simple Storage Service APN1-Requests-Tier2 : リクエストに対する課金
  - $0.00 per request - GET and all other requests under the monthly global free tier : 無料利用枠
- Amazon Simple Storage Service APN1-TimedStorage-ByteHrs : ディスク容量に対する課金
  - $0.0264 per GB - first 1 TB / month of storage used - Reduced Redundancy Storage : 低冗長化ストレージについて、最初の 1TB
- Amazon Simple Storage Service APN1-TimedStorage-SIA-ByteHrs : 標準 – 低頻度アクセスの従量課金（容量）
  - $0.019 per GB-Month of storage used in Standard-Infrequent Access : 標準 – 低頻度アクセスについて、最初の 1TB

# 参考資料
- [AWSご利用明細のUsageType：日本語参考訳（クラスメソッド版）](http://dev.classmethod.jp/cloud/aws/aws-billing-usagetype-ja/)
- [S3 Detailed Cost Reporting](https://support.cloudability.com/hc/en-us/articles/205340938-S3-Detailed-Cost-Reporting)
- [Amazon S3 - 料金](https://aws.amazon.com/jp/s3/pricing/)
- [Amazon S3 低冗長化ストレージ - 料金](https://aws.amazon.com/jp/s3/reduced-redundancy/)
- [Amazon Glacier - 料金](https://aws.amazon.com/jp/glacier/pricing/)
Python 那些事儿 (三)



Try to deploy a flask demo app 

this is the app structure:

```
.
├── flaskdemo1
│   ├── flaskr.py
│   ├── flaskr_tests.py
│   ├── __init__.py
│   ├── README
│   ├── schema.sql
│   ├── static
│   │   └── style.css
│   └── templates
│       ├── layout.html
│       ├── login.html
│       └── show_entries.html
└── flaskdemo1.wsgi

```

so the file `flaskdemp1.wsgi` is the entry point for this app.
let us check what says in this script file:

```
#!/home/matt/env1/bin/python2.7
import sys
import os
import site
import logging
logging.basicConfig(stream=sys.stderr)

site.addsitedir('~/env1/lib/python2.7/site-packages')
sys.path.insert(0,"/var/www/flaskdemo1/")
# above lines they just prepare the environments.

# this line is to load flaskr app as a entrypoint
from flaskdemo1.flaskr import app as application
```

```
.
├── flaskdemo1
│   ├── flaskr.py
│   ├── flaskr_tests.py
│   ├── __init__.py
│   ├── README
│   ├── schema.sql
│   ├── static
│   │   └── style.css
│   └── templates
│       ├── layout.html
│       ├── login.html
│       └── show_entries.html
```

here, this is a complete flask app, firstly let add a `__init__.py` file to make this folder as a module. so that we can load this app as a module in the `wsgi` file:

```
from flaskdemo1.flaskr import app as application
```

so, at here, we can start this flask app rightly with apache+mod_wsgi.
but, when we do open the domain of this app in browser, what's happening in the app internal? let us dig this point.
Docker 的基础



Linux namespace 和 Linux CGroup 的定义作用.


Linux 是所谓虚拟技术

- 环境
- 资源

Linux namespace

>一种内核级别环境隔离的方法


Linux CGroup:
>一个进程组群对于资源（如CPU、内存、磁盘输入输出等控制;
Google的工程师在2006年发起（主要是Paul Menage和Rohit Seth），最早的名称为进程容器（process containers）


主要提供了如下功能：


- Resource limitation: 限制资源使用，比如内存使用上限以及文件系统的缓存限制。
- Prioritization: 优先级控制，比如：CPU利用和磁盘IO吞吐。
- Accounting: 一些审计或一些统计，主要目的是为了计费。
- Control: 挂起进程，恢复执行进程。
Docker(二)

#docker 镜像是如何工作的
之前说过 Docker 的镜像其实就是一个只读的模板用来启动 docker 容器的. 每一个镜像都是有一系列的层来组成. Dokcer 通过使用 linux 的` union file sysrems` 技术来打包这些层文件到一个镜像文件中.`union file system`允许文件或者文件夹来自不同的文件系统的打包到一起.

为什么 docker 这么轻量其中之一就是这些层,例如当你需要更新一个 app 你只需要替换一个层,而非整个镜像. 每一个镜像都是从一个基础的镜像如` ubuntu` 来创建的,一个基本的` ubuntu` 镜像或者` fedora`, 每一个 docker 的镜像都是通过这些基础的镜像创建而来,通过一些简单的指令来一步步完成,我们称之为` instructions` 每一个构建都创建一个新的 layer 层来完成, 所谓的构建指令也就是

- 执行一个命令
- 添加文件或者文件夹
- 创建一个环境变量
- 从一个镜像创建容器之后执行什么程序 等

这些指令保存在一个名为`Dockfile` 的文件里.一个` Dokcerfile` 就是基于文本的脚本, 包含了很多的构建指令用来构建一个镜像从一个基础的镜像. Docker 通过读这个文件来都建镜像.

#Docker注册是如何工作

Docker 注册就是用来保持镜像的.一旦你构建了一个镜像而且把它推到了一个注册,如` Docker Hub`或者自己私有的 hub. 通过 docker 的 client 就可以搜索并下载自己想要的镜像.

#docker 容器是如何工作的

一个容器包含了一个操作系统,用户添加的文件,还有一些元数据,我们说每一个容器都是来自于一个镜像,这些镜像会告诉 docker 它含有什么内容, 执行什么样的出现在启动这个容器之后.还有很多的配置等. docker 的镜像是只读的,当 docker 从一个镜像跑一个容器的时候,它追加了一个只读的层到这个镜像上.

#当跑一个容器的时候会发生什么

不管是通过 client 还是 api 告诉 docker 的 daemon 来启动一个容器:

> $docker run -i -t ubuntu /bin/bash

敲入并运行上面的命令, 会发生什么呢?

- 拉去ubuntu 这个镜像,会检查当前本地是否有` ubuntu` 这个镜像,
- 创建一个容器
- 创建文件系统并且挂载一个只读的层
- 创建网络桥接接口
- 创建 ip
- 执行设定的命令
- 拿到应用的输出.


Docker 用到的背后的技术

- namespace

docker 使用了` namespaces` 的技术来提供一个高度隔离的环境,我们称之为`容器`.当创建了一个容器, docker 创建了一系列的` namespaces` 给这个容器. 提供了一个隔离层, 容器通过使用不同类型的 namespace 来实现完全隔离的环境.

- The `pid namespace`: Process isolation (PID: Process ID).
The `net namespace`: Managing network interfaces (NET: Networking).
The `ipc namespace`: Managing access to IPC resources (IPC: InterProcess Communication).
The `mnt namespace`: Managing mount-points (MNT: Mount).
The `uts namespace`: Isolating kernel and version identifiers. (UTS: Unix Timesharing System).


- control groups

通过使用这个技术,可以控制隔离的容器中应用可以使用的资源

- union file systems

Union file systems, or UnionFS, are file systems that operate by creating layers, making them very lightweight and fast. Docker Engine uses union file systems to provide the building blocks for containers. Docker Engine can make use of several union file system variants including: AUFS, btrfs, vfs, and DeviceMapper.


- container format
Docker(一)


#提到`Docker`它是干什么的呢?
通过使用内核的容器技术来帮助你管理部署 app. 一个开源的平台, 开发, 交付还有运行 app. 能够让你的交付程序更方便快捷. 

Docker 平台又是什么? 提供了一种完全隔离应用的容器, 这种隔离和安全性能够让你在一个宿主上很流畅得执行多个容器.

- 让应用包装到 docker 容器里.
- 部署交付这些容器让小组人员一起测试
- 部署 app 到生产环境,不管是本地数据中心还是云.

#docker engine 是什么

`Docker Engine` 是一个客服端-服务器端架构的程序.包含:

- 一个服务器端, 作为一个常驻进程一直运行.
- 一个 REST API, 能够让应用通过接口和这个常驻进程进行通信
- 一个命令行交互客户端.

![](https://docs.docker.com/engine/article-img/engine-components-flow.png)

同样 CLi 也是通过 REST API 和常驻进程通信, 其他的 app 都是通过底层的 API 或者 CLI 来完成通信控制. 而常驻进程就创建和管理 Docke 的对象, 这个` Docker 对象`就包括了镜像,容器, 网络, 数据存储等.

用 Docker 能干什么呢?

- 快速交付
- 部署,扩展
- 它轻量级快速,能够有效的完成任务,高强度工作,有效利用资源等


#Docker 的架构

Docker 是一个 CS 架构的设计, 客户端通过 socket 或者 RESTFul 的 API 和常驻进程通信, 实现构建,运行部署dcoker 容器. 客户端和服务端可以跑在同一个宿主上或者通过网络来实现异地的通信.

![](https://docs.docker.com/engine/article-img/architecture.svg)

#Docker 常驻进程

从上面的图看出它运行与宿主之上. 用户不会和他直接交互,而是通过` Docker client`

#docker client

`docker client`也就是一个打包为` docker` 的二进制包,是 docker 的最主要的用户界面.它接受来自用户的请求然后再和 daemon 交互.

#docker内部

- Docker images
- Dokcer registries
- Docker containers

##docker 镜像

docker 的镜像是一个只读的模板,例如一个镜像包含了一个 ubuntu 的系统还有 apache 以及你的 web 应用. 镜像是用来创建` docker 容器` 的. docker 提供了一个简单的方式;唉创建新的镜像或者更新已经有的镜像, 或者你可以下载已经有的别人创建号的的镜像, docker 镜像可以视作docker 的`构建`组件

##docker 注册

docker 注册拥有很多镜像,这些共有和私有的都是你用来上传或者下载镜像使用的. 注册可以视作 docker 的`发布`组件.

## docker 容器

docker 容器可以简单的立即为一个目录, 一个 docker 的容器包含了所有的东西用来支持一个 app 的运行.每一个容器创建自某个 docker 镜像. docker 的容器可以被执行,开启,停止,移动或者删除. 每一个容器都可以视作完全隔离安全的应用平台, docker 容器是一个docker 的`运行`组件
docker vs vagrant


> http://stackoverflow.com/questions/16647069/should-i-use-vagrant-or-docker-for-creating-an-isolated-environment


If your purpose is the isolation, I think docker is what you want.


###vagrant
`Vagrant is a virtual machine manager`, it allows you to script the virtual machine configuration as well as the provisioning. However, `it is still a virtual machine depending on Virtual Box (or others) with a huge overhead`. It requires you to have a hard drive file that can be huge, it takes a lot of ram, and performance may be not very good.


###docker

`Docker on the other hand uses kernel cgroup and namespacing via lxc`. 
It means that you are using the same kernel as the host and the same file system. You can use Dockerfile with the docker build command in order to handle the provisioning and configuration of your container. You have example at docs.docker.com on how to make your Dockerfile, it is very intuitive.

The only reason you could want to use vagrant is if you need to do BSD, Windows or other non-linux development on your ubuntu box. Otherwise, go for Docker.