OmniAICreator/Qiita-1.07M huggingface dataset:
openFrameworks 軌跡を描く

##概要
openFrameworksを使って以下のgifのように軌跡を描く方法を紹介します。

![gif](https://media.giphy.com/media/3o6ZtqerZFT5jfOCDS/giphy.gif)

##仕組み
今回紹介する方法はProcessingでも定石になっているそうな、薄い透明度をかけた画面いっぱいの長方形をフィルターとして重ねる方法です。
ただし、塗りをリセットしないように`ofSetBackgroundAuto(false);`を呼び出す必要があります。
また、フィルターとして使う薄い透明度をかけた画面いっぱいの長方形は`OF_BLENDMODE_MULTIPLY`で軌跡を描きたいものは`OF_BLENDMODE_ADD`で描画すると綺麗になります。(`ofEnableBlendMode(OF_BLENDMODE_ALPHA);`だけでも問題無いです)

軌跡とは関係無いですが、軌跡をつける対象として例えば今回はofBoxPrimitiveを使いたいので100個くらい配列として宣言しておきます。

##ソースコード

```ofApp.h
#pragma once

#include "ofMain.h"
class ofApp : public ofBaseApp{
public:
    void setup();
    void update();
    void draw();
    void keyPressed(int key);
    void keyReleased(int key);
    void mouseMoved(int x, int y );
    void mouseDragged(int x, int y, int button);
    void mousePressed(int x, int y, int button);
    void mouseReleased(int x, int y, int button);
    void windowResized(int w, int h);
    void dragEvent(ofDragInfo dragInfo);
    void gotMessage(ofMessage msg);
    ofBoxPrimitive mBox[100];
};
```



```ofApp.cpp
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
    ofSetBackgroundAuto(false);
    ofBackground(0, 0, 0);
    ofSetFrameRate(60);
    ofSetVerticalSync(true);
    
    int boxSize = 3;
    for(int i=0; i<100;i++) {
        mBox[i].setPosition(ofRandom(-300,300),ofRandom(-300,300),ofRandom(-300,300));
        mBox[i].set(boxSize);
    }
}
//--------------------------------------------------------------
void ofApp::update(){

}

//--------------------------------------------------------------
void ofApp::draw(){
    ofSetColor(0,0,0,20);//透明度のある、黒っぽい長方形を描画

    //方法１(こっちの方が明るさの差が出て綺麗っぽい)
    ofEnableBlendMode(OF_BLENDMODE_MULTIPLY);//重なりあった色の暗い部分を強調する
    ofDrawRectangle(0,0,ofGetWidth(),ofGetHeight());
    ofEnableBlendMode(OF_BLENDMODE_ADD);//色を重ねるほど明るくなる

    //方法２(そんなに差は無いが、透明度そのままって感じ)
    /*
    ofEnableBlendMode(OF_BLENDMODE_ALPHA);//透明の表現を与えるときに使う
    ofDrawRectangle(0,0,ofGetWidth(),ofGetHeight());
     */

    ofTranslate(ofGetWidth()/2, ofGetHeight()/2);

    ofRotateY(ofGetFrameNum());
    ofSetColor(ofColor::fromHsb(ofGetFrameNum()%225,225,225),175);
    for(int i=0; i<100; i++){
        mBox[i].draw();
    }
}
//------------------------以下略--------------------------
```

###BlendModeによる違い

gifの右上に、`OF_BLENDMODE_ALPHA`なのか`OF_BLENDMODE_MULTIPLY`&`OF_BLENDMODE_ADD`なのかを表示しています、違いはこんな感じです。
![gif](https://media.giphy.com/media/l46CCtahD302M0IkU/giphy.gif)
CentOS6.にJavaをインストール


```js
[root@localhost]# lscpu
Architecture:          i686
CPU op-mode(s):        32-bit, 64-bit
```

i686は32bit
X86_64だったら64bit

```js
cd /tmp

wget --no-check-certificate --no-cookies - --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/jdk-8u191-linux-x64.rpm

rpm -ivh jdk-8u191-linux-x64.rpm

```


rpmのアンインストール

```js

rpm -qa | grep jdk 
rpm -e jdk1.8.0_101-1.8.0_101-fcs.i586
```
MSC-MOD20 > I2C > SD Init > SD unmounted時の応答を確認

```txt:環境
microSD module: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
  - ALFAT SoC
microSD: 2GB SD (not SDHC) 
Analog Discovery 2 (以下AD2)
```

MSC-MOD20のSD Initについて。

SD unmount時、応答まで3.3秒かかる。I2C通信の場合、3.3秒の応答までの間、0x00を受信し続けて、ようやく!11などの受信ができるようだ。
( !11は「初期化に失敗しました。SDカードのCD信号がHまたはフローティングしている」というエラーでSDがunmountの状態を示すエラー番号。)

## code v0.9

[v0.9 @ github](https://github.com/yasokada/esp8266_160730_MSC-MOD20p1/releases/tag/v0.9)

- SD Init実行時にretry追加
- retry回数分だけ、余分にI2C読込処理を行う
- Power on boot直後のSD Initはretry=0とした
   - 応答がないと考えられるため

上記の変更をして、SD Init実行後に3.3秒以上余分な読込をしながら波形をAD2で取り込み!11を受信できるか試した。

## 結果

SD Initコマンドを送信後、しばらく以下の0x00受信が続く。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/27d2ef77-942b-1602-4fd9-a6314b79e2e5.png)


そして、3.3秒程度の経過時間で以下の!11が受信できることを確認した。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/82c58793-a137-9b9d-f254-c218165246ec.png)

応答までの待ち時間が長い場合も適宜delay処理などで待ちを入れながら応答を受信することになりそうだ。
応答がない場合の対策としてはタイムアウト時間を設定し、タイムアウトしたら処理を抜ける。
iOSプロジェクトでApple風ドキュメントを自動生成する - jazzy - 

先日、UIAlertControllerを便利に使うライブラリ[ALRT](https://github.com/mshrwtnb/ALRT)を公開しました！

[【Swift】UIAlertControllerをもっと便利にするALRTを作りました](http://qiita.com/mshrwtnb/items/4c12c1eaacc7ce96bb4e)

ドキュメントもしっかり作ってみようと、Realm製のiOSプロジェクト向けドキュメント自動生成ツール [jazzy](https://github.com/realm/jazzy)を試してみたところ、かなりお手軽に**それらしい**ドキュメントを作ることができました。

コメント入りの自作ライブラリをCocoapodsにPushすると、Cocoadocsというドキュメントページが自動作成されますが、**その裏ではjazzyが動いています**。

この記事では、Cocoapodsに自作ライブラリを投稿しない人でも、iOSプロジェクトでドキュメントを自動作成できるよう流れを共有します。

<img width =400" src="https://raw.githubusercontent.com/realm/jazzy/master/logo.jpg">

## 完成図
まず、肝心のどんなドキュメントができるかについてですが、以下のようなApple風ドキュメントを作ることができます。

Cocoadocsになりますが、有名ライブラリだと、[APIKit](http://cocoadocs.org/docsets/APIKit/2.0.4/)や[Alamofire](http://cocoadocs.org/docsets/Alamofire/3.4.1/)のドキュメントページもjazzyで作られています。

<img width=400 src="https://qiita-image-store.s3.amazonaws.com/0/119686/0f6ab22c-cbe6-c903-75f8-09cf23664b1f.png">

## 手順

### 1. Xcodeプラグイン Alcatrazをインストール
Xcodeプラグインマネージャー Alcatrazをインストールします。
以下のInstallコマンドをterminalで入力すればOKです。終了したら、Xcodeを再起動してください。

[Alcatraz公式サイト](http://alcatraz.io/)

```
curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
```

### 2. VVDocumenterをインストール
コメント入力を劇的に楽にしてくれるプラグイン[VVDocumenter](https://github.com/onevcat/VVDocumenter-Xcode)をここでは使います。まずは、Xcode -> Window -> Package Managerで、Alcatrazを起動します。

<img width="300" alt="Screen Shot 2016-08-08 at 22.39.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/119686/86694905-0794-41b9-2b69-5a527d427543.png">

次に、Alcatrazで`VVDocumenter`を検索し、インストールします。終わったらXcodeを起動してください。再起動時にプラグインを読み込むか聞かれるので、`Load Bundle`を選んでください。

<img width="300" alt="Screen Shot 2016-08-08 at 22.39.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/119686/b918f91a-6237-3520-83da-456ae7189fde.png">

### 3. コメントを入れる
VVDocumenterを使って、コメントを入れていきましょう。
クラス宣言や、メソッドの上で`///`と入力すると、自動でコメントフォーマットを補完してくれます。
あとは、自分でパラメーターや、返り値の説明や型などを入力していきます。
クラスやメソッドは、publicにしないと、後々ドキュメントに反映されないので注意が必要です。

```swift
import UIKit

/// 普通のViewControllerです

public class ViewController: UIViewController {
    /**
     至って普通のViewDidLoadです
     */
    override public func viewDidLoad() {
        super.viewDidLoad()
    }
    
    /**
     2つのIntを足し算します。
     
     - parameter x: Int型の値
     - parameter y: Int型の値
     
     - returns: Int
     */
    
    public func addTwoInts(x: Int, y: Int) -> Int {
        return x + y
    }
}

```

### 4. Gemでjazzyをインストール
jazzyをGem経由でインストールします。
一応、Gemをアップデートしておきましょう。

```
gem update
gem install jazzy
```

### 5. jazzyを使ってみる！
Xcodeプロジェクトのルートで、以下のようなjazzyコマンドを入力すると、ドキュメントファイルが生成されます。

```
jazzy --author 作者名 --author_url 作者URL -o 出力パス
```

その中のindex.htmlをブラウザなどで開いてみると先ほどのコメントが反映されたドキュメントページができあがっているのがわかります。

<img width= 500 src="https://qiita-image-store.s3.amazonaws.com/0/119686/b48ba5f5-fc97-9e5d-db0a-2c4549ebb058.png">

### 番外編：公開
できあがったファイルはGithub Pagesに置くと、ドキュメントサイトとして公開可能です。もちろん自前でホストしても構いません。
技術英語 > [halfway between] Oceana and Cherry Point. / No, I won't give in, but I'll meet you halfway

@ LOE > July 4, 2003
http://www.loe.org/shows/shows.html?programID=03-P13-00027
>  in the northeast corner of the state—<font color=red>halfway between</font> Oceana and Cherry Point.

OceanaとCherry Pointの中間地点

<hr>
halfway in the middleなどで検索していると以下を見つけた。

http://idioms.thefreedictionary.com/meet+halfway
> <font color=red>meet someone halfway</font>
> to compromise with someone

使用例
>  No, I won't give in, but I'll meet you halfway

妥協するという意味になる。

5年ほど前に覚えたはずだが、まったく使わずに忘れていた。
Riot.jsでMilkocoaを使うサンプル

# 概要
Riot.jsとBaaSのMilkcocoaを組み合わせたチャットのサンプルです。

# 前提
エディタにBrackets使っています。.tagファイルのコンパイルはローカルサーバーを立てないといけないので。

# 手順

1. 下記ソースをコピー
2. プロジェクトルートの下にjsフォルダをつくってそこにriot.jsのriot+compilerを置く
3. MilkcocoaのDataStoreを作成、idをchat.tagの中のMilkcocoa()に書く
4. MilkcocoaのDataStoreのchatのセキュリティルールを設定する
5. ローカルサーバーを立ち上げてindex.htmlを開く

``` index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Chat</title>
</head>
<body>
    <chat></chat>

    <script type="riot/tag" src="chat.tag"></script>
    <script src="https://cdn.mlkcca.com/v0.6.0/milkcocoa.js"></script>
    <script src="./js/riot+compiler.min.js"></script>
    <script>
        riot.mount('*');
    </script>
</body>
</html>
```

``` chat.tag
<chat>
    <input type="text" id="chat_message_box">
    <button id="send_button" onclick='{send_message}'>send</button>
    <div each="{key in logs}">{key}</div>

    var milkcocoa = new MilkCocoa('{your datastore id}'),
        ds = milkcocoa.dataStore('chat');

    this.logs = [];

    var self = this;

    // 初期表示
    this.on('mount', function(){
        ds.stream().next(function(err, data){
            data.forEach(function(datum){
                self.logs.push(datum.value.message);
            });
            self.update();
        });
    });

    // 受信
    ds.on('push',function(data){
        self.logs.push(data.value.message);
        self.update();
    });

    // 送信
    this.send_message = function () {
        ds.push({"message": self.chat_message_box.value}, function(){
            self.chat_message_box.value = "";
        });
    }

</chat>
```

# あとがき
受信部分がMilkcocoaまんまですやん。Riot.js、少しつかめました。
Unity - Cameraの向きに沿ってTargetを進めるスクリプト



```lang:Move.cs
using UnityEngine;
using System.Collections;

public class Move : MonoBehaviour
{
	public float m_speed = 5f;
	
	// Update is called once per frame
	void Update ()
	{
		var h = Input.GetAxisRaw ("Horizontal");
		var v = Input.GetAxisRaw ("Vertical");

		if (h != 0 || v != 0) {
			var position = transform.position;
			var cameraTransform = Camera.main.transform;
			var addValue = (cameraTransform.forward * v + cameraTransform.right * h).normalized * Time.deltaTime * m_speed;
			addValue.y = 0;
			position += addValue;
			transform.position = position;
		}
	}
}

```
StartupVRに参加した記録

# 今回のメモのお詫び

今回は私がスタッフとして参加し、買い出しに出ていたため、参加できた途中からのセッションのメモしかないです…。


# cluster スタートアップした時のこと 加藤さん

### 人を雇う必要性って？

+ 雇うほうが良いとは言い切れない
+ スタートアップメンバーだけで粘って開発する人もいる。
+ 雇うと会社のお金が減っていくので、精神的にツライ

### 何か作った時

+ プロダクトは作ってる最中から見せていったほうが良い
+ おれない心で見せ続けよう


### スタンス

+ 成功談は聞かない
+ 失敗談を戒しめにして噛みしめる
+ 「いま」頑張っている人の近くに行く（VR界隈はそんな人ばかりなので楽しい）


# SKYLANDからの一言

## Start Up Acceleration

+ StartUpのサポート
+ 様々なメンタリング
+ すでに3社の実績あり!!

# Wizapply（しのびや.com） 『西の』加藤さん

## 社内ベンチャーの話

+ アイディアを低コストで具現化して実行できる時代の変化
+ アミューズメント向けのVRコンテンツの作成
+ VRヘッドセットとモーションチェアで作成
+ スタートアップで模索してもよい
+ 社内ベンチャーで上司を説得してチャレンジすることもできる

### **「ネット通販」を生業にしながら別の業界に簡単に殴りこむことができる「大変ありがたい時代」になった**

## 大事なこと
+ 商品棚に商品を並べること
+ 明日喰うためのお金稼ぎ
+ 新卒・アルバイトの立場だろうが、会社からの信頼を勝ち取る

# スタディドットVR 竹永さん

## スタディドットVRって？

+ 中高生の科学への興味促進
+ 科学+遊び+VR = 学び
+ 中高生も実験が好き
+ 実験を行うには多大な労力やお金など、様々な問題がある
+ そこでVR

## スマホVRアプリ

+ ダンジョン形式でゲーム内で科学の知識を集めていくゲーム
+ VRには未対応

Twitter: ‎@Study_dotVR
Page: http://kir794705.kir.jp/


# Pittari レノさん

## VRやゲームコンテンツを作る会社

+ いろんなVRコンテンツやコンシューマ向けゲームを作ったり
+ 誰でもGoogle先生にいろいろ聞いたりしてスタートアップできるよ！

## バーチャル・サミット関西

+ 毎月第４金曜日
+ VR開発者が集まるイベント

## Piitariについて
+ Unityプログラマ大歓迎
+ VRの波に乗ってプロジェクトに携われるよ！
jQueryでJsonデータをファイルから読み込み画面表示する

「[Webページを一部自動更新にする](http://qiita.com/momo298/items/f90c4ef4c6bff7fe7ca2)」という記事を書いたので、
今度はその応用としてJsonデータを定期的に読み込んでそれを画面表示するコードを実装する。

# Jsonデータ
読み込むためのjsonファイルを作成する。

```
[
    {
        "name": "Tanaka",
        "age": 69
    },
    {
        "name": "Yoshida",
        "age": 24
    }
]
```

# 定期的に読み込む
前回までのおさらいを含めてざっと作成。
とりあえず問題ないかな？

```
<html>
  <head>
    <title>test</title>
    <script type="text/javascript" src="js/jquery-3.1.0.min.js"></script>
    <script type="text/javascript" src="js/jquery.periodicalupdater.js"></script>
    <script type="text/javascript">
      $(function(){
        var $label = [];
        $label.push($( "#Tanaka" ));
        $label.push($( "#Yoshida" ));

        $.PeriodicalUpdater('./data.json',{
          method: 'get',
          minTimeout: 1000,
          type: 'json',
          multiplier:1,
          maxCalls: 0
        },

        function(data){
          var len_data = data.length;

          for( var i = 0; i < len_data; i++ ){
            if( data[i].name == "Tanaka" ){
              $label[0].text( data[i].name + " : " + data[i].age );
            }else if( data[i].name == "Yoshida" ){
              $label[1].text( data[i].name + " : " + data[i].age );
            }
          }
        });
      });
    </script>
  </head>
  <body>
    <div id="Tanaka"></div>
    <div id="Yoshida"></div>
  </body>
</html>
```

# 改良計画
下記部分はまだ簡略化できるはず。
特に label への処理にほぼ変更はないため積極的に処理をまとめたい。

```
          for( var i = 0; i < len_data; i++ ){
            if( data[i].name == "Tanaka" ){
              $label[0].text( data[i].name + " : " + data[i].age );
            }else if( data[i].name == "Yoshida" ){
              $label[1].text( data[i].name + " : " + data[i].age );
            }
          }
```

ちょっと考え中。。
[CodeIQ]「【100名限定】変進小数の足し算【手動採点】」をRuby解いてみた

CodeIQで@Nabetani さんが出題されていた[【100名限定】変進小数の足し算【手動採点】](https://codeiq.jp/q/2924)をRubyで解いてみました。
テストデータおよびソースコードのリビジョンは[ここ](https://bitbucket.org/snippets/cia_rana/GEMRp)からご確認できます。

## 解き方
小数の最下位から最上位に向かって1桁づつ順に足し算と繰り上げ処理をします。
足し算と繰り上げはNumeric#divmodを使えばシンプルに記述できると思います。

```rb
class Enumerator::Lazy
  def filter_map
    Lazy.new(self) do |yielder, *values|
      result = yield *values
      yielder << result if result
    end
  end
end

def add_var(v1, v2)
  int1, fra1 = v1.split(?.)
  int2, fra2 = v2.split(?.)
  fra1, fra2 = [fra1, fra2].sort_by(&:size).map { |fra| fra.chars.map(&:to_i) }
  fra3 = [*Array.new(fra1.size + 1, 0), *fra2[fra1.size..-1]]
  fra1.size.downto(1) { |i| fra3[i-1], fra3[i] = (fra1[i-1] + fra2[i-1] + fra3[i]).divmod(11 - i) }
  ("%s.%s" % [int1.to_i + int2.to_i + fra3.shift, fra3.join]).to_r
end

def calc_formula formula
  var = add_var(*formula.split(?+))
  var.denominator == 1 ? var.numerator : var.to_f
end

def list_nonmatching_ids
  File.foreach('data.txt').lazy.filter_map { |line|
    id, formula, candidate = line.split("\t")
    id unless candidate.to_r == calc_formula(formula)
  }.force.join(?,)
end

puts ARGV[0] == "-d" ? list_nonmatching_ids : calc_formula(gets)
```
Bash on Windows でJavaコマンドを使いたい


"Windows Subsystem for Linux"でジャバジャバしたくて頑張った話


## まずはapt-getでインストールしてみる
```
$ sudo apt-get install openjdk-7-jre-headless
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 openjdk-7-jre-headless : 依存: ca-certificates-java しかし、インストールすることができません
                          依存: java-common (>= 0.28) しかし、インストールすることができません
                          依存: libjpeg8 (>= 8c) しかし、インストールすることができません
                          依存: libfontconfig1 (>= 2.9.0) しかし、インストールされようとしていません
                          依存: libpcsclite1 (>= 1.3.0) しかし、インストールすることができません
                          依存: libpulse0 (>= 1:0.99.1) しかし、インストールされようとしていません
                          依存: libsctp1 (>= 1.0.10+dfsg) しかし、インストールすることができません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
```

(´・ω・｀)ちーん

## Windowsにインストールしたjava.exeを実行してみる
```
$ /mnt/c/Program\ Files/Java/jdk1.8.0_51/bin/java.exe -version
-bash: ./java.exe: cannot execute binary file: 実行形式エラー
```

＼(^o^)／

## ソースからビルドしてみる

[じゅくちょーさんの記事](http://tech.furyu.jp/blog/?p=4647)を参考にやろうとしたら、そもそもbootにjdkが必要な模様。。。

## Oracle JDKをインストールしてみる

[@TsutomuNakamuraさんの記事](http://qiita.com/TsutomuNakamura/items/f12fdf0a8502e634584d)を参考に。

```
$ add-apt-repository ppa:webupd8team/java -y
$ apt-get update
$ apt-get install oracle-java7-installer
```

何回かライセンスの同意を求められる。
終わったら試してみる。

```
$ java -version
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
```

**できたやんけ！**
なおJava 8は動きませんでした。

## 余談

なんでBash on WindowsでJavaコマンド使いたいかって？特に意味はないよ！

## 参考
http://tech.furyu.jp/blog/?p=4647
http://qiita.com/TsutomuNakamura/items/f12fdf0a8502e634584d
Shell Bang (シェバング)について

**shebang**とも書くらしい。
####用途
<DIV ALIGN=CENTER><HR WIDTH=100%></DIV>
ファイルの一行目に書いて、ファイル内のスクリプトを読み込むインタプリタを指定する。

####例
<DIV ALIGN=CENTER><HR WIDTH=100%></DIV>
・phpファイルを実行するときに、わざわざ行頭に**php**と書くのがめんどくさい場合
  ->ファイルの一行目にphpへのパス*1を`#!`の後ろに書く

僕の場合
`#!/usr/local/bin/php`

すると、今までindex.phpを実行するのに`php index.php`としてたのを`./index.php`でできるようになる
（あんまり変わってねぇ。。。）

*1phpへのパス
`whereis php`
`where php`
`which php`
などで探してください
Slackに書いた分報をrubyでまとめる、少しは雑じゃないコード

[Slackに書いた分報をjqでまとめる雑なワンライナー](http://qiita.com/skuroki@github/items/c0eeddea49c1ae6834c0) の続きです

```ruby:matome.rb
#! /usr/bin/env ruby
require 'slack'

Slack.configure do |config|
  config.token = ENV['SLACK_TOKEN']
end
client = Slack::Client.new

channel_name = ARGV[0]
if channel_name.nil?
  puts 'no channel name'
  exit 1
end

channel = client.channels_list(exclude_archived: 1)["channels"].find { |c| c["name"] == channel_name }
history = client.channels_history(channel: channel['id'], oldest: (Time.now - (60 * 60 * 24)).to_i, count: 1000)['messages'].reverse
users = {}
history.each do |message|
  next unless message['user']
  said_at = Time.at(message['ts'].to_i).strftime('%T')
  user = (users[message['user']] ||= client.users_info(user: message['user'])['user']['name'] )
  text = message['text'].gsub('|', '\\|').gsub("\n", '<br>').gsub('```', '')
  puts [said_at, user, text].join(' | ')
end
```

## 雑な解説

* [slack-api-gem](https://github.com/aki017/slack-ruby-gem) を使っています
* 環境変数でトークンを、引数でチャンネル名を渡します
* 文字列加工部分は多分に個人都合です（markdownのtbodyにあたる部分にコピペで貼り付けるための加工をしている）
* user名を1行毎に取りに行くとすごい量のAPIアクセスになるので、キャッシュしてます
Solr で統計関数


何か色々すっ飛ばしてますが、数値フィールドで統計関数を使う事情があったので備忘録的に書いておきます。

# まとめ
- `stats=true&stats.field=hoge ` で、フィールド `hoge` に対する最小値、最大値、件数、空白数、合計、平方和、平均、標準偏差が出力できる

# やりかた
リクエストパラメータに `stats=true` と `stats.field=hoge` をつけると、 `.stats.stats_fields.hoge` に検索結果の範囲内で統計情報がついて帰ってきます。何に使うかはその人次第です。検索結果の最大値に応じてレスポンスを変化させたい、みたいな場合に使ったりできますね。


```
$ curl 'http://localhost:8983/solr/core1/select?q=*:*&wt=json&rows=0&fl=unique_key&stats=true&stats.field=price&wt=json'
```

```
{
    "responseHeader": {
        "status": 0,
        "QTime": 6,
        "params": {
            "fl": "unique_key",
            "stats.field": "price",
            "stats": "true",
            "q": "*:*",
            "wt": "json",
            "rows": "0"
        }
    },
    "response": {
        "numFound": 104472,
        "start": 0,
        "docs": []
    },
    "stats": {
        "stats_fields": {
            "price": {
                "min": 20.0,
                "max": 2618200.0,
                "count": 104472,
                "missing": 0,
                "sum": 1.730519678E9,
                "sumOfSquares": 2.64303182063568E14,
                "mean": 16564.435236235546,
                "stddev": 47492.48356305639
            }
        }
    }
}
```

Solr 1.4 以降で動くと思います。
Solr 6系で追加された新機能については検証中です。
GASでGoogle Formの入力をSlackにポストする


# GAS -> Slackに投げる
Google Formからの入力をSlackにポストしたかったのだが、
良さげなサンプルが見つからなかったのでゴニョゴニョして自作。


```javascript:SendToSlack
function onFormSubmit(e) {

  var itemResponses = e.response.getItemResponses();
  var message = '';

  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();
    message += (i + 1).toString() + '. ' + question + ': ' + answer + '\n';
  }

  var url = 'ここにIncoming Webhookのアドレスを入力';
  var data = { "text" : message};
  var payload = JSON.stringify(data);
  var options = {
    "method" : "POST",
    "contentType" : "application/json",
    "payload" : payload
  };

  //slackにポスト
  var response = UrlFetchApp.fetch(url, options);

}
```
EC2にすばやくnginx+PHP56+mysql56の環境を作る


基本設定
-----
[これ](http://qiita.com/master-of-sugar/items/18fd684fa3938cdfe930)をやる



nginxをいれる
-----

```
sudo yum install -y nginx
```

#####設定

`sudo vim /etc/nginx/nginx.conf`

```
location ~ \.php$ {
  if (!-f $document_root$fastcgi_script_name) {
    return 404;
  }
            
  fastcgi_split_path_info ^(.+\.php)(/.+)$;
  fastcgi_pass   unix:/var/run/php-fpm.sock;
  fastcgi_index  index.php;
            
  include        fastcgi_params; 
  fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_param  PATH_INFO $fastcgi_path_info;
  fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_path_info;
}
```

`sudo vim /etc/nginx/conf.d/php-fpm.conf-5.6`

```
upstream php-fpm {
    server unix:/var/run/php-fpm.sock;
}
```


PHPとエクステンションをいれる
-----

```
sudo yum install -y nginx php56 php56-fpm php56-mbstring php56-mysqlnd php56-gd php56-pdo
```

#####確認

```
php -v
```

```
PHP 5.6.24 (cli) (built: Jul 28 2016 22:15:42) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
```

#####FPM設定
`sudo vim /etc/php-fpm-5.6.d/www.conf`

```
user = myuser
group = myuser
listen = /var/run/php-fpm.sock
listen.owner = myuser
listen.group = myuser
listen.mode = 0666
catch_workers_output = yes

```


mysqlをいれる
-----

```
sudo yum install -y mysql56 mysql56-server
```

#####セキュリティ設定

`mysql_secure_installation` を実行して各種設定を行う

自動起動設定
-----

```
chkconfig nginx on
chkconfig mysqld on
chkconfig php-fpm on
```


#####確認

```
chkconfig --list nginx
chkconfig --list mysqld
chkconfig --list php-fpm
```

起動
-----

```
sudo service nginx start
```

```
sudo service mysqld start
```

```
sudo service php-fpm start
```


こんな感じで完成。
Bash on Ubuntu on Windowsの設定

自分が何を設定したのかのメモ。（20161121、aptの設定を少し追加）

# ConEmu向け
日本語入力、あとシェルをさくっと出したい関係で、ConEmu上で動かしたい。
Setting -> StartUp -> Tasks で
`{Bash::Bash on Ubuntu on Windows}`という項目を追加し、コマンドを以下に設定。


```
C:\Windows\System32\bash.exe ~ -new_console:t:"Bash"
```

何も設定しないでbashとだけすると、起動時のディレクトリがWindowsのホームになるので、
Bash on Ubuntu on Windowsのホームにするために、波ダッシュ（~）をつける[^conemu]。
さらに、これをConEmuのデフォルトに設定しておく。

[^conemu]: https://github.com/Maximus5/ConEmu/issues/629

# `/etc/hosts`設定
`sudo`でホスト名を名前解決できないと怒られるので、`/etc/hosts`に追記。

```bash
sudo echo "127.0.0.1 $NAME" >> /etc/hosts
```

# apt の設定
デフォルトだとアメリカから持ってくるのでアップデート等が非常に遅い。
日本のサーバからパッケージを持ってくるようにする。[^aptsource]

[^aptsource]: http://qiita.com/fkshom/items/53de3a9b9278cd524099

```bash
sudo vim /etc/apt/sources.list
```

で、以下のように変更する。（[お好みのサーバをどうぞ](http://www.ubuntulinux.jp/ubuntu/mirrors)。）

```
deb http://jp.archive.ubuntu.com/ubuntu trusty main restricted universe multiverse
deb http://jp.archive.ubuntu.com/ubuntu trusty-updates main restricted universe multiverse
deb http://jp.archive.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
```

# いろいろビルド
## git

```bash
sudo apt install git
```

各種設定

```bash
git config --global user.name "Hoge Fuga"
git config --global user.email "hoge@fuga.jp"
git config --global core.editor "vim"
```

## screen
インストールされていたが、`/var/run/screen`が作れないとPermission deniedが出て終了する。
以下を実行[^screen]

```bash
sudo /etc/init.d/screen-cleanup start
```

しかし、実行直後にscreen is terminating・・・ → まだ動かないみたい？：[2016年4月1日号　“Running Bash on Ubuntu on Windows”, Windows Subsystem for Linux・UWN#460](http://gihyo.jp/admin/clip/01/ubuntu-topics/201604/01)

[^screen]: https://bugs.launchpad.net/ubuntu/+source/screen/+bug/574773

## gcc
```bash
sudo apt install gcc
```
インストール。

```bash
cat << _END_ > hw.c
#include<stdio.h>
int main() {
    printf("Hello, World!\n");
    return 0;
}
_END_
gcc hw.c
./a.out
> Hello, World!
```
わぁい。

# 所感
Windows側のファイルを見に行きにくいので、もうちょっと自由になればいいなー。
【Rust】リンクに失敗した原因と対策

# 当初の環境
OS：`Windows7`
Rust：`rustc 1.10.0 (cfcb716cf 2016-07-03)`(**MSVC ABI 64bit版**)
Cargo：`cargo 0.11.0-nightly (259324c 2016-05-20)`
VS：`visual studio 2010`，`visual studio 2013`

# エラー内容
```
error: could not exec the linker `link.exe`: 
指定されたファイルが見つかりません。 (os error 2)
```
# 原因
必要なMSVCのリンカー(link.exe)が入っていなかった．

# 対策
`visual C++ 2015`(64bit版)を入れた．

# 経緯

##cargo buildが通らない
上記エラーが出てビルドが通らず，Cargoが原因と思って手動で入れ直したがダメ．
内容的にはリンカーがないって怒られてるよなぁ，と思った所で，
そもそもどのバージョンのMSVCが入っていればいいだろうと疑問に思う．

##RustのREADME.mdを読んでみる
以下のような記述が．

```
#### MSVC

MSVC builds of Rust additionally require an installation of Visual Studio 2013
(or later) so `rustc` can use its linker. Make sure to check the “C++ tools”
option. In addition, `cmake` needs to be installed to build LLVM.
```
英語が読めないのでアレだが，なんとなしに
『VS2013以降のリンカーを使うからね！』
というようなことなんだろうなぁと推察．

##Rust(MSVC ABI 32bit版)を入れてみる
VS2013入っているやんけ！って思ったが，
もしかして入っているリンカーが32bit版？ということに思い至り，
Rust(MSVC ABI 64bit版)をアンインストールして，
Rust(MSVC ABI 32bit版)を入れてみた所，ビルドに成功．

##確認してみる
`C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin`直下に，
`amd64`フォルダがないため，やはり32bit版リンカーしか入っていないっぽい.

##色々入れ直して解決
VS2015を入れて，VC++2015(64bit版)を取得.
そして，Rust(MSVC ABI 64bit版)を入れ直した所，無事ビルドに成功．
Prophecyのスタブでn回目に呼ばれた時の戻り値を指定する

最初に呼ばれた時は1, 2度目に呼ばれた時は2を返却するメソッドのスタブが欲しい場合。

`$stub->method()->willReturn($value)` は `$stub->method()->will(new ReturnPromise([$value]))` と同じ意味だけれど、ReturnPromiseのコンストラクタの引数は配列になっていて、複数の値を渡すことができる。これがそれぞれn回目に呼ばれた時の戻り値となるようだ(Mockeryの`andReturn(value1, value2, value3)`と同様)。

```php
interface Sequence {
    public function getValue();
}

class ReturnPromiseTest extends PHPUnit_Framework_TestCase
{
    public function test()
    {
        $stub = $this->prophesize(Sequence::class);
        $stub->getValue()->will(new \Prophecy\Promise\ReturnPromise([1, 2, 3]));

        $this->assertEquals(1, $stub->reveal()->getValue());
        $this->assertEquals(2, $stub->reveal()->getValue());
        $this->assertEquals(3, $stub->reveal()->getValue());
    }
}
```

https://github.com/phpspec/prophecy/blob/master/src/Prophecy/Promise/ReturnPromise.php


追記

`ReturnPromise`使わずに`willReturn`に複数の引数を渡すだけでよかった。

```php
        $stub->getValue()->willReturn(1, 2, 3);
```
メタプログラミングRubyメモ

## 5章 クラス定義

## クラスはすぐに実行される
* rubyは定義文と実行文という定義が無い

```ruby
class Hoge
  puts 'hoge'
end
```

* クラスを定義したと同時に中身が実行される
* 既に定義しているクラスの場合はそのクラスをオープンにし使うことが出来る
* defの中は定義時点では実行されない
* すぐに実行されるので、rubyではコンストラクタは不要

## 既存のクラスを拡張

* 既存のクラスもオープンにして拡張できる

```ruby
class String
  def test
    puts 'test'
  end
end

'ruby'.test

test

=> nil
```

```
pluralizeはオープンクラスの機能を使って、railsがStringクラスを拡張して定義しているメソッド
```

* class_evalを使うとクラスの参照を受け取ると、動的にクラスをオープンにして拡張することも出来る
Rails + Heroku + Postgres で日本語の order がうまくいかない対処法

* Rails 5.0.0
* Ruby 2.3.0

## ActiveRecord

`'カラム名 COLLATE "C" ASC'` と書けばいける。
scope で定義しちゃうと楽。

```
class Anime < ApplicationRecord
  scope :order_title, -> { order('title COLLATE "C" ASC') }
end
```

## 呼び出し

```
@animes = Anime.all.order_title
```

## 参考

* [PostgreSQLで正しく文字列ソート出来ない時の解決方法 \- Qiita](http://qiita.com/anoworl/items/af9f12f915b8969ea40d)
* [HerokuのPostgresqlで日本語ソートにハマった \| count0\.org](http://count0.org/2012/11/21/heroku-postgresql-japanese-sort.html)
Promiseさん

ES6でPromiseを使ったコードをさくっと書けなかったので使い方を確認しとく。

```js
// 後処理はrequestが終わった後に呼び出したいが、
// reqeustが非同期なので処理順序が前後する

var request = require('request');
url = 'http://jsonplaceholder.typicode.com/posts/1';

request(url, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(JSON.parse(body).id);
  } else {
    console.error('error: '+ error);
  }
})

console.log('後処理')
```

```js
// Promiseをつかって順序良く処理する

var request = require('request');
url = 'http://jsonplaceholder.typicode.com/posts/1';

new Promise((resolve, reject) => {
  request(url, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      console.log(JSON.parse(body).id);
      resolve() // 200 ok なら次へ
    } else {
      console.error('error: '+ error);
      reject() // エラーだったら終わる
    }
  })
})
.then(() => {
  console.log('後処理')
})
```
Promiseさん！

（Promiseサイコーって人ならMonadとか似たようなものの気がするし、すぐ好きになりそうな気がするけどどうなんだろう）
Google Playアプリ内課金テストで認証エラーが出てしまうケースについて


課金テストの際に、課金画面に行ったかとおもいきや、「認証が必要です。Googleアカウントにログインしてください。」と言われることが良くあると思うのですが、今回はそのうちの1ケースについて書きます。

# 「定期購入」のアイテムに対して、launchPurchaseFlowを呼んでしまった場合

課金のアイテムには「アプリ内管理アイテム」と「サブスクリプションアイテム」の2種類があり、アイテムの種類によって購入の際に呼び出すメソッドが変わります。

| アイテムの種類 |呼び出すメソッド|
|:---|:---|
|アプリ内管理アイテム| launchPurchaseFlow |
|サブスクリプションアイテム|launchSubscriptionPurchaseFlow|

これを間違えてしまった場合、認証エラーというくくりになってしまうので、定期購入のアイテムを設定していて認証エラーになった場合に確認してみてください。

##　参考サイト

[Androidで課金テストをするために必要な事](http://qiita.com/ShirakawaYoshimaru/items/3e0f3ce1d49f473d1cee)
[アプリ内課金の実機テストのワナ](http://gadget-f.hateblo.jp/entry/2014/08/24/192301)
2016年版 1年間無料のStartSSLの証明書を更新する方法


来年になったら絶対やり方忘れてるのでメモしておきます！
StartSSLを使っている人のお役に立てれば！

# 導入する（1年目）
導入に関しては2015年に「[無料のSSL証明書StartSSLを活用する](http://qiita.com/k-shogo/items/870b6d3939dd08da2de4)」の通りにやりました。
2016年現在少しStartSSLのサイトのUIが変わっていたりしてますが、問題なくできると思います。

# 更新する（2年目以降）
StartSSLは1年間だけ無料なので、期限が近付くとお知らせのメールが届くようになります。
僕は放ったらかしにして自分のサイトにアクセスできないことに気付いて慌てて直しましたがｗ

ということでやり方をメモしておきます。

## 1. メールのリンクからログインページへ
Authenticateを選択します。

![スクリーンショット 2016-08-06 2.00.49.png](https://qiita-image-store.s3.amazonaws.com/0/2609/8af02a19-51e8-e9c0-b246-02a2e1db655b.png "スクリーンショット 2016-08-06 2.00.49.png")

## 2. メールアドレスで認証してログイン
導入時に入れたメールアドレスを入れてワンタイムパスワードを発行します。

![スクリーンショット 2016-08-06 2.04.28.png](https://qiita-image-store.s3.amazonaws.com/0/2609/543b5b4e-a078-c0c9-3254-eb653c0993f6.png "スクリーンショット 2016-08-06 2.04.28.png")

発行されたワンタイムパスワードを入れます。

![3-2.png](https://qiita-image-store.s3.amazonaws.com/0/2609/e5247758-fe47-f8ce-9196-b941b41b1e59.png "3-2.png")

## 3. CSRを生成する
「Web Server SSL/TLS Certificate」を選びます。

![スクリーンショット 2016-08-04 2.08.14.png](https://qiita-image-store.s3.amazonaws.com/0/2609/4abfb4c9-29fe-4cd9-9a6f-9cce19a2de2c.png "スクリーンショット 2016-08-04 2.08.14.png")

ドメインを入力します。
例えば「hogehoge.com」と「www.hogehoge.com」があった場合は、画像のように改行区切りで2つ入力します。

![スクリーンショット_2016-08-04_2_09_26.png](https://qiita-image-store.s3.amazonaws.com/0/2609/2103b30b-1134-831e-0b6f-54a492d4aa1b.png "スクリーンショット_2016-08-04_2_09_26.png")

下にスクロールするとCSRの生成コマンドが表示されているので、それをSSLを更新するサーバー上で生成します。
いろいろ情報の入力を促されると思うので、入力できる部分は入力して進めます。
このコマンドではyourname.csrとyourname.keyが生成されるので、生成したらyourname.csrをcatとかで表示して中身をコピーして画像のようにペーストします。

![スクリーンショット_2016-08-04_2_18_41.png](https://qiita-image-store.s3.amazonaws.com/0/2609/69870d49-15aa-f962-b143-e9a0f8461ea0.png "スクリーンショット_2016-08-04_2_18_41.png")

## 4. crtファイルをダウンロード
そのまま進みます。

![スクリーンショット 2016-08-04 2.19.22.png](https://qiita-image-store.s3.amazonaws.com/0/2609/417fabf4-f80c-0c45-1198-29b5bea4e2c7.png "スクリーンショット 2016-08-04 2.19.22.png")

この画面まで来たらあと少し！
「Retrieve」を押すとcrtファイルがzipされた状態でダウンロードできます。
今回はnginxを使っているので「NginxServer.zip」を解凍してターミナルとかでcatして中身をコピーします。

![11-2.png](https://qiita-image-store.s3.amazonaws.com/0/2609/6875e59f-758d-1db6-1d07-2df005a8648e.png "11-2.png")

## 5. nginxのconfで指定しているcrtファイルとkeyファイルを更新する
「[無料のSSL証明書StartSSLを活用する](http://qiita.com/k-shogo/items/870b6d3939dd08da2de4)」の通りやっていれば以下のような感じでnginxのconfに設定していると思います。

```
ssl_certificate      /etc/pki/tls/certs/startssl.crt;
ssl_certificate_key  /etc/pki/tls/certs/startssl.key;
```

この指定しているcrtファイルとkeyファイルを更新します。
（更新前に念のため既存のファイルは別名で保存しておくと良いと思います）

サーバー上で以下のコマンドを実行し、

```
$ sudo vim /etc/pki/tls/certs/startssl.crt
```

先ほどダウンロードしてコピーしたcrtファイルの中身をペーストします。

keyファイルの方は3のopensslコマンドで生成したyourname.keyの中身をコピーして、同じくサーバー上で以下のコマンドを実行し、

```
$ sudo vim /etc/pki/tls/certs/startssl.key
```

ペーストします。

そして最後にnginxを再起動すれば完了です。

```
$ sudo service nginx restart
```

# おわりに
はい、とても簡単でしたね。
こういうのはたまにしかやらないのですぐに忘れてしまいます。
StartSSLユーザーのお役に立てれば！
ファイルのバックアップ作成を効率化してみた

```
$ ls -l
-rw-rw-r--. 1 chooyan chooyan 0  8月  8 06:55 server_settings.conf
```

この設定ファイルを編集したいから先に時間をファイル名に含めたバックアップを取っておきたい、という場合の操作を考えてみます。

# パターン1: 普通にcpする
```
$ cp -a server_settings.conf server_settings.conf.20160808

$ ls -l
-rw-rw-r--. 1 chooyan chooyan 0  8月  8 06:55 server_settings.conf
-rw-rw-r--. 1 chooyan chooyan 0  8月  8 06:55 server_settings.conf.20160808
```

はい、バックアップ取れました。
取れましたが、、、ファイル名を２度タイプしたり、日付をカレンダー見て自分で入力したりと、なんか効率悪い！

というわけで、これを改善します。

# パターン2: ブレース展開を利用する
```
$ cp -a server_settings.conf{,.20160808}

$ ls -l
-rw-rw-r--. 1 chooyan chooyan 0  8月  8 06:55 server_settings.conf
-rw-rw-r--. 1 chooyan chooyan 0  8月  8 06:55 server_settings.conf.20160808
```

これでファイル名を2度タイプする手間が省けました。
次に日付の入力をなんとかします。

なお、ブレース展開については以下の記事がとても参考になりました。

## 参考
[bashのブレース展開についてまとめ](http://qiita.com/ine1127/items/6e5fe80f4a9c64509558)

# パターン3: dateコマンドを利用する
```
$ cp -a server_settings.conf{,.`date '+%Y%m%d'`}

$ ls -l
-rw-rw-r--. 1 chooyan chooyan 0  8月  8 06:55 server_settings.conf
-rw-rw-r--. 1 chooyan chooyan 0  8月  8 06:55 server_settings.conf.20160808
```

なかなかいい感じです。
が、dateコマンド自体のタイプがとても面倒臭い！特にフォーマットの部分！（僕は記号のタイプがとても苦手です）

# パターン4: alias を利用する
```bash:.bashrc
alias bkdate='date "+%Y%m%d"'
```

```
$ source ~/.bashrc
```

```
$ cp -a server_settings.conf{,.`bkdate`}

$ ls -l
-rw-rw-r--. 1 chooyan chooyan 0  8月  8 06:55 server_settings.conf
-rw-rw-r--. 1 chooyan chooyan 0  8月  8 06:55 server_settings.conf.20160808
```

だいぶ楽になりました。
これなら日付を調べる必要もなく、タイプミスによるファイル名の間違いもなく、多少は楽にバックアップファイルが作れそうです。

また、本筋からは外れますが、日付でフォルダを作りたい場合も

```
$ mkdir `bkdate`
```

で簡単に作ることができたりします。

# まとめ
書いてみて、タブキーの補完も考慮すると実際のタイプ量はあまり最初と最後で変わっていないような気がしてきましたが、正確性や「今日何日だっけ？」と考えなくて良い分、楽になったのではないかと思います。
なによりブレース展開や長めのコマンドをaliasに登録し、出力を使い回せるようにする、といった工夫ができることを学べたので、今後何か他の工夫に使えそうな気がしています。

---
前回、[カレントディレクトリの一部分を変更してcdするのを効率化してみた](http://qiita.com/chooyan_eng/items/88751896259526b1e574)という記事を書いたのですが、

> zshはビルトインのcdがこの機能を最初から持っていますね．

というコメントを@mpywさんより速攻でいただいてしまいました。（ありがとうございます！）

今回の工夫ももしかしたら二番煎じにすらなっていないかもしれませんが、その場合はコメントいただければ幸いです。とっても勉強になります。
フォーム上のロード時にControlにフォーカスを設定する方法

Windowsアプリケーションで、フォーム上のコントロールにフォーカスを設定する場合のお話。

フォームをロードする時に、コントロールにフォーカスを設定しようと思いコードを記述。
 
テキストボックスにフォーカスを当てたかったので、こう書いた。
`this.TextBox.Focus();`

当たらない…(・・;)


調べてみると、これではダメなコードらしい。

正しくは、フォームのActiveControlプロパティにコントロールを設定する。
`this.ActiveControl = this.TextBox;`

当たった！(´ω｀*)

コントロールのFocus()に惑わされてしまった。
android 2.3系でmithril.jsの描画がうまくいかない時の対応

そんな端末を使うなよ、言うコメントは今回流します。
結論から言うと、<b>諦めてconfig+jQueryを使う</b>です。
動作環境

|  | バージョン |
|:-:|:-:|
| mithril.js | 0.2.5 |
| android(AQUOS PHONE SH-12C) | 2.3 |
| android(XPERIA SO-02H) | 6.0 |

## そもそもどういうことが起きるのか
### selectがうまく描画されない
```
<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>mithril</title>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/mithril/0.2.5/mithril.min.js"></script>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.26/vue.min.js"></script>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
	<script>
		$(function() {
			var hoge = m.prop(1);
			var select = {
			  view: function() {
			    return m('select', {
			        onchange: m.withAttr('value', hoge),
			      }, [1,2,3].map(function(v) {
			        return m('option', {value: v, selected: hoge() == v}, 'hoge' + v),
			      })
			    );
			  }
			};
			m.mount($('#select').get(0), select);
		});
	</script>
</head>
<body>
	<h2>テスト</h2>
	<div id="select">
	</div>
</body>
</html>
```
上記のように書いた場合、想定としては以下のようになるはずが
![6-0_select.png](https://qiita-image-store.s3.amazonaws.com/0/75299/ff96d62c-e081-9c27-5ac8-7dc2e7bf8ce8.png)

古い端末(2.3)だと、selectにならず、かつoptionのhoge1、hoge2が消える。この時点でワケガワカラナイヨと唸り
![2-3_select.png](https://qiita-image-store.s3.amazonaws.com/0/75299/2274c33a-5315-7015-1ae6-3bc4428c741d.png)

### inputも同様に表示されない
```
var input = {
  view: function() {
    return m('div', [
      // ホントはmapで(ry
      m('input', {value: 'hoge1'}),
      m('input', {value: 'hoge2'}),
      m('input', {value: 'hoge3'})
    ]);
  }
};
```
こっちはなぜか３つのうち２つしか表示されないとな。（数を増やしても同じ)そして、白目を向いた。

![2-3_input.png](https://qiita-image-store.s3.amazonaws.com/0/75299/e5e3ef10-1266-60cf-5b4a-39d92ff69d06.png)


## じゃあどうするか
先にも言ったとおり、config+jQueryをつかう
selectなら以下のとおりです

```
var select = {
  view: function() {
    return m('select', {
      config: function(e, isInitialized) {
        if (isInitialized) {
          return ;
        }
        $(e).on('change', function() {
            hoge($(this).val());
          })
          .append($('<option>').attr('value', 1).prop('selected', hoge() == 1).text('hoge1'))
          .append($('<option>').attr('value', 2).prop('selected', hoge() == 2).text('hoge2'))
          .append($('<option>').attr('value', 3).prop('selected', hoge() == 3).text('hoge3'));
      }
    });
  }
};
```

![2-3_select_up.png](https://qiita-image-store.s3.amazonaws.com/0/75299/f2923a15-fd88-82ae-68bf-946fd1ac7583.png)

なんとかできた

## まとめ
とりあえず、要件を満たすならjqueryを無理やり使う形になりそうです。(仮想DOMの恩恵など無い
~~そもそもそんな古い端末使うな~~
推測ですが、おそらく仮想DOMに耐えられていないjsのバグかなと思います。about:debugとしても、何も出ないから余計にたちが悪い……
Railsで楽天APIを使って商品検索をする(楽天APIの導入からRailsに組み込むまで)

##Rakuten Web Service APIについて
[Rakuten Web Service APIs.](http://webservice.rakuten.co.jp/)

##商品検索APIについて
[楽天商品検索API (version:2014-02-22)](http://webservice.rakuten.co.jp/api/ichibaitemsearch/)

##token取得
API利用にtokenが必須
[新規アプリ登録](https://webservice.rakuten.co.jp/app/create)

##Ruby関連
- [Ruby SDK](http://webservice.rakuten.co.jp/sdk/ruby.html)
- [rakuten-ws/rws-ruby-sdk](https://github.com/rakuten-ws/rws-ruby-sdk)

##API形式

```
https://app.rakuten.co.jp/services/api/IchibaItem/Search/20140222?format=json&keyword=(エンコードしたキーワード)&applicationId=(アプリID/デベロッパーID)
```

最低限以下の2つがあれば商品検索できる
- アプリID
- 検索キーワード、ジャンルID、商品コード、ショップコードのどれか



###**本題のRailsでgem(rws-ruby-sdk)使用の例**
##Gemfile

[rakuten-ws/rws-ruby-sdk](https://github.com/rakuten-ws/rws-ruby-sdk)

```
gem 'rakuten_web_service'
```

##rakuten.rb

config/initializers/rakuten.rb

```rb:config/initializers/rakuten.rb
RakutenWebService.configuration do |c|
    c.application_id = 'アプリケーションID'
    c.affiliate_id = 'アフィリエイトID'#任意
end
```
(注)下のコメントも参考にしてください

##controller

使いたいコントローラーにメソッド追加

```rb
def search_rakuten_api(keyword)
  items = RakutenWebService::Ichiba::Item.search(keyword: keyword)
  images_arr = []
  items.each do |item|

  # したい処理
  puts item['itemName'] #商品名
  puts item['itemPrice'] #価格
  puts item['itemUrl'] #商品のURL

  end
end
```

複数条件で検索したい場合は

```rb
items = RakutenWebService::Ichiba::Item.search(keyword: keyword, hits: 10, ....)
```
みたいにすればOK

##まとめ
githubみたら

```rb
class RakutenController < ApplicationController
  def search
    RakutenWebService.configuration do |c|
      c.application_id = ENV["APPID"]
      c.affiliate_id = ENV["AFID"]
    end
    result = RakutenWebService::Ichiba::Item.search(keyword: params[:jan]).first
    render json: result
  end
end
```
みたいにcontrollerにすべて書いている人もいた
どっちがいいかはわからない。

##参考サイト
[rakuten-ws/rws-ruby-sdk](https://github.com/rakuten-ws/rws-ruby-sdk)
[Ruby SDK](http://webservice.rakuten.co.jp/sdk/ruby.html)
djangoのclass-based views APIのクラス図

# class-based viewsに関して

djangoのviewは単なる関数ベースでの記述方法とクラスベースでの記述方法がある。djangoのドキュメントによれば、最初は関数ベースの規約があるのみだったがVIEW開発の経験がたまるにつれてパターンや共通のイディオムが存在することが認識され、抽象化されるに至った、らしい。

開発者はそれらの成果を「generic view」として利用することができる。genericという英語は日本語にすると「汎用的」などという意味になる。ドキュメントを一瞥してsampleをちょっと利用するぐらいでも使えないことはないが、正直どう動いているのかがわかりづらかった。
めんどくさいと思いつつ調べてみたら意外とキレイにコンパクトにまとまっていたので、そこまで時間もかからなかった。伊達に「汎用的」な構造になっているわけではなかった。class-baseなviewを書いていて、どこにどのロジックを入れればよいのか迷ったときはこのクラス図を見れば大体アタリがつくようになった気もしている。


下記の画像のクラス図はdjango.views.generic以下に収まっているクラスの関連を書き出しています。
フィールドやメソッドは端折って書いていないものもある。

![django_class_base_view_api.png](https://qiita-image-store.s3.amazonaws.com/0/105926/56fc7eaa-d085-1dbe-e5bf-5cfb6ac38f03.png)


クラスの依存関係はPyCharmの機能を使って楽に調べることができました。該当ファイルを開いてAlt-7で下記のようにクラスのみを左側に表示させる事ができました。（コードの折りたたみも別途できる。）
![pycharm.PNG](https://qiita-image-store.s3.amazonaws.com/0/105926/f28bbc47-afd8-5ad3-4e9d-6807c329c829.png)


クラス図の作成は[Enterprise Architect](http://www.sparxsystems.jp/)使った。
Rubyの引数の基本中の基本

メソッドは指定した処理を行った後に何かの値を返してくれる（返り値|戻り値）ものである。

変数は使える範囲が決まっており（スコープ）通常は同じメソッド内でしか利用ができない。

そこで他のメソッド内でも利用できるようにするのが引数というもの。

引数は
**"メソッドを呼び出す部分"**
**"メソッドを定義している部分"**
に両方書く必要がある。
メソッドを呼び出している方を「本引数」と呼びメソッドを定義している部分を「仮引数」と呼ぶ。


```rb
def multi(karihiki) #左の(karihiki)が仮引数
  puts karihiki * karihiki
end

puts "数字を入力してください。"
number = gets.to_i

multi(number) #左の(number)が本引数
カレントディレクトリと一部分だけが違うディレクトリに cd するのを効率化してみた


例えば以下のようなディレクトリ構成があって

```
$ tree

├── android
│   └── resource
│       └── images
│           └── webview
└── iphone
    └── resource
        └── images
            └── webview
```

今、 android/resource/images/webview にいて、

androidの作業が終わったからiphoneの方の resource/images/webview ディレクトリに移動したい、

という場合に効率的に移動できる方法を考えてみました。

# パターン1: ../ って打ちまくる
```
$ pwd
/pass/to/some/directory/android/resource/images/webview

$ cd ../../../../iphone/resource/images/webview

$ pwd
/pass/to/some/directory/iphone/resource/images/webview
```

・・・あまりイケてないですね。。。
まだ4階層くらいならタイプする気にもなりますが、深くなればなるほど何回 ../ って打たなきゃいけないのかよく分からなくなり、非効率です。

# パターン2: pwd と sed を使う
```
$ pwd
/pass/to/some/directory/android/resource/images/webview

$ cd `pwd | sed -e "s/android/iphone/g"`

$ pwd
/pass/to/some/directory/iphone/resource/images/webview
```

ちょっと楽になりました。これなら階層に関係なく簡単に移動ができます。
が、いちいち　コーテーションやパイプ等の記号をタイプするのが面倒です。もう少し楽にしたいところです。

# パターン3: bashrc に関数を登録する。
今回の本題です。パターン2で作ったコマンドを、関数登録することでさらに使いやすくします。

```bash:.bashrc
function cdsed() {
  cd `pwd | sed -e "s/$1/$2/g"`
}
```

```
$ source ~/.bashrc
```

```
$ pwd
/pass/to/some/directory/android/resource/images/webview

$ cdsed android iphone

$ pwd
/pass/to/some/directory/iphone/resource/images/webview
```

だいぶ楽になりました！
これなら変更したい文字列をタイプするだけで済みますね。

# まとめ
ちょっとしたことではありますが、マルチプラットフォームのサービスを開発・運用していると、プラットフォームでディレクトリが区切られていて、さらにその下の深い階層で作業して、戻って別のプラットフォームの同じディレクトリで同じ作業して、ということが少なからずあったりします。

そんなときに、なんとか ../ をタイプしまくらなくて良い方法はないかな、と思って考えついたのが上記の工夫です。

「こんなことしなくてももっと良い方法があるよ！」という情報がありましたら、コメントいただけるととても嬉しいです！

---

ちなみに、上記のコマンドはパスの中に変換したい文字列が２回以上出てくると全て置換してしまいます。
あまりそのようなパターンに出会ったことがなく、両方置換してしまうのが良いのか、何番目を置換する、みたいに選択できた方が良いのか判断つかなかったので、この記事に載せる段階では一旦「全て置換する」ように作っています（それが一番シンプルなので）。

そのあたりは用途に応じて関数の中身を書き換えていただければ、と思います。
lambdaでローカル変数をbindしたい


## 期待したのと違う...

```pycon
>>> funcs = []
>>> for fruit in [ 'apple', 'orange', 'banana' ]:
...     funcs.append(lambda: 'I like ' + fruit)
... 
>>> for f in funcs:
...     print f()
... 
I like banana
I like banana
I like banana
```

Pythonのlambdaは呼び出しの時点で変数の名前解決をするので、実行時点での "fruit" (='banana') になります。

## 解決編

``lambda: 'I like ' + fruit`` を ``lambda fruit=fruit: 'I like ' + fruit`` にする。

> 高階関数でfunctionalに解決するのが定番だと思いますが、↑ですとone-linerでいけてイイです。 （＾◇＾）

```pycon
>>> funcs = []
>>> for fruit in [ 'apple', 'orange', 'banana' ]:
...     funcs.append(lambda fruit=fruit: 'I like ' + fruit)
... 
>>> for f in funcs:
...     print f()
... 
I like apple
I like orange
I like banana
```
モデルから取ってきた結果が空のとき、rablでnilではなく空配列が返るようにする

```some.rabl
child(@users, object_root: false) do
```
とrablで書いてあるときに、

```
@users = User.where(user_id: params[:user_ids]).includes(:partner_organization_branches)の
```
結果が

```
@users = []
```
となる時、

jsonの結果はusers: nil
となってしまい、普通は配列[]で帰ってくるのにも関わらず、(何故こんな仕様になってるのか謎ですが)nilで返ってくる...

返り値を揃えるために以下のようにrablを変更すればok。


```api_response.rabl
if @users.present?
  child() do
    honya_honya
  end
else
  node(:users) { [] }
end
```
画像を遅延ロードする


モバイル向けWebアプリではレスポンススピードがものすごく重要だ。なかなか開かないWebサイトってイライラするもんね・・・。
レスポンスが遅くなる要因は色々あるが、その中のひとつに画像関連がある。

 - 画像サイズをキッチリ決め打つ
 - 画像の最適化をする
 - 画像を遅延ロードする


今回は画像の遅延ロードをやってみた。

遅延ロードってどういうことだっけ？
-----

「初期表示で必要なところ以外はあとでロードする」
つまり、スクロールしないと見えない画像はその部分が表示されるタイミングで表示して、初期表示時に余計な読み込みをしないですばやく表示しようということ。

jQuery Lazyload
-----

[jQuery Lazyload](https://github.com/tuupola/jquery_lazyload)を使うとものすごく簡単にできる。

```
<img src="image1.png" alt="画像だよ" />
```

これを

```
<img class="lazy" src="dummy.gif" data-original="image1.png" alt="画像だよ" />
```

こうして

```
$("img.lazy").lazyload();
```

こうするだけで遅延ロードが実現できる。

Rails用ヘルパーを作る
-----

`Rails` の場合

```
= image_tag 'image1.png', alt: '画像だよ'
```

こんな感じになっていると思う。
同じノリでヘルパーを作ってみる

```
def lazy_image_tag(source, options={})
  options['data-original'] = asset_path(source)
  if options[:class].blank?
    options[:class] = 'lazy'
  else
    options[:class] = "lazy #{options[:class]}"
  end

  image_tag('dummy.gif', options)
end
```

```
= lazy_image_tag 'image1.png', alt: '画像だよ'
```

という具合に同じノリで使える。

まとめ
-----

 - 遅延ロード簡単
 - 調子に乗って全部の画像やると初期表示が死ぬほどダサくなったりする
 - ダミー画像はものすごくサイズが小さい画像かくるくる画像が素敵
Guest Introspectionが正常に導入されない時に確認すべき事項

#目的
Guest Introspectionを正常に導入すること

#Guest Introspectionを再起動してみる
「Succeeded」と表示されているのにも関わらず、「Warning」が表示されている場合は、Guest Introspectionを再起動してみると直ることがあるようです。
ゲストOSの再起動を実施してみましょう。

![alt](https://communities.vmware.com/servlet/JiveServlet/downloadImage/2-2537596-53189/screenshot_462.png)

#ネットワーク周りを確認してみる
「ネットワークの構成中にエラー」となった場合は、仮想スイッチやvmkernelの確認をしてみてください。
正しくは、Guest Introspection用のvmkernelが「**vmservice-vmknic-pg**」に配置されている必要があります。
異なる場所にvmkernelがあった際は、ポートグループを削除して、再度デプロイをしてみましょう。
また、Guest Introspectionの仮想NICの片方（eth1）が「**vmservice-vshield-pg**」にささっている必要があるかと思います。
念のため、こちらも確認した方が良いでしょう。

#参考
[Error after deploying vShield Endpoints (Guest ... | VMware Communities](https://communities.vmware.com/thread/519426?start=0&tstart=0)

[VMware NSX Guest Introspection Service not readyと表示される : 派遣社員からフリーランスへ！英語×ITスキル×海外投資=至高の経済的自由を手にするブログ](http://forfreeworld2020.blog.jp/archives/45821357.html)
Raspberry Pi 環境 2016-08 版

# Raspbian jessie-lite
golang, node を普段使う用途としては、現在 jessie は outdate している。debian 的には stretch を使うべきな状況。

## influxdb
influxdata が deb package を配布しているので、それを入れる。https://influxdata.com/downloads/#influxdb

## grafana
https://github.com/fg2it/grafana-on-raspberry から deb package を `dpkg -i` で入れるのが良さそう。`fontconfig1` をあらかじめ入れておくと、apt の闇を見なくて済む。

## golang
golang.org 的にビルド済みアーカイブファイル `go1.6.3.linux-armv6l.tar.gz` を配布しているので、それを使う。https://golang.org/dl/

## /boot/config

```
echo usb_max_current=1 >> /boot/config.txt
```

## udev rules

```bash
apt-get install sg3-utils eject
```

```/etc/udev/rules.d/75-modem.rules
# L-02C
ATTRS{idVendor}=="1004", ATTRS{idProduct}=="61dd", RUN+="/usr/bin/eject /dev/sr0"
ATTRS{idVendor}=="1004", ATTRS{idProduct}=="618f", RUN+="/sbin/modprobe -b qcserial"
SUBSYSTEM=="drivers", ENV{DEVPATH}=="/bus/usb-serial/drivers/qcserial", ATTR{new_id}="1004 618f 0000 05c6 9212"
SUBSYSTEM=="usb", ATTRS{idVendor}=="1004", ATTRS{idProduct}=="618f", RUN+="/sbin/modprobe -b qmi_wwan"
SUBSYSTEM=="drivers", ENV{DEVPATH}=="/bus/usb/drivers/qmi_wwan", ATTR{new_id}="1004 618f"

# UX302NC
SUBSYSTEMS=="scsi", ATTRS{vendor}=="USBModem", KERNEL=="sg*", RUN+="/bin/sleep 1", RUN+="/usr/bin/sg_raw /dev/%k 06 f5 04 02 52 70"
SUBSYSTEM=="usb", ATTR{idVendor}=="11f6", ATTR{idProduct}=="1034", RUN+="/sbin/modprobe -b qmi_wwan"
SUBSYSTEM=="drivers", ENV{DEVPATH}=="/bus/usb/drivers/qmi_wwan", ATTR{new_id}="11f6 1034"
SUBSYSTEM=="usb", ATTR{idVendor}=="11f6", ATTR{idProduct}=="1034", RUN+="/sbin/modprobe -b qcserial"
SUBSYSTEM=="drivers", ENV{DEVPATH}=="/bus/usb-serial/drivers/qcserial", ATTR{new_id}="11f6 1034 0000 05c6 9212"
```

`modemmanager` で操作する
(2016/8) Docker 1.12 proxy設定(systemd)

Dockerのプロキシ設定が1.12から変わったようです。

私のおすすめはドロップインフォルダを作成して、そこにファイルを置きます。

```sh
mkdir /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/docker.conf
```

※docker.service.dに.confで配置したファイルはドロップインファイルとして読み込まれます。

* **docker 1.11**

```sh
mkdir -p /etc/systemd/system/docker.service.d/
vim /etc/systemd/system/docker.service.d/docker.conf
[Service]
Environment="HTTP_PROXY=http://${proxy_server}:8080/"
Environment="HTTPS_PROXY=http://${proxy_server}:8080/"
Environment="NO_PROXY=localhost,127.0.0.1"
Environment=TMPDIR=/var/tmp
Environment="DOCKER_OPTS=--insecure-registry ${private_repo}:5000" 
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// $DOCKER_OPTS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY
```

* **docker 1.12**

```sh
mkdir -p /etc/systemd/system/docker.service.d/
vim /etc/systemd/system/docker.service.d/docker.conf
[Service]
Environment="HTTP_PROXY=http://${proxy_server}:8080/"
Environment="HTTPS_PROXY=http://${proxy_server}:8080/"
Environment="NO_PROXY=localhost,127.0.0.1"
Environment=TMPDIR=/var/tmp
Environment="DOCKER_OPTS=--insecure-registry ${private_repo}:5000" 
ExecStart=
ExecStart=/usr/bin/dockerd $DOCKER_OPTS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY
```

しかもこれ docker upgradeしても自動的に/usr/bin/dockerdに書き換えてくれないのでupgradeする際にはご注意を。
Circle CI でPHPの自動ビルド・テスト始める


まぁとりあえず諸々流れとか、せっかくなのでまとめておく

## 始めるにあたって

結構面倒な作業が多い

- CircleCIにリポジトリ登録
- circle.yml 書く
- 通知の設定周りとか
- バッチの登録


## リポジトリ登録

そのまま

## Circle.ymlを書く

今回はLaravel Project のテストをしたかっただけなので、凄くシンプルにこんな感じでまとまった

````
machine:
  php:
    version: 7.0.4
  environment:
    DB_CONNECTION: sqlite

database:
  override:
    - "php artisan migrate --force"

test:
  override:
    - make test
````

circle.yml にガリガリ書くのはあんまり気持ちよくないので、Makefileとかcomposer.jsonに逃がす形で対応

## 通知の設定

プロジェクトごとに設定が必要っぽい。

設定画面 Notification > Chat Notification から設定可能

今回はSlackに飛ばした。

## バッチの設定

設定画面 Notification > Status Badges から設定可能

つけとくと何かと安心。
【Realm】RLMObjectがstandaloneオブジェクトかどうかを判断する方法

Realmには**Standalone Object**というRealmの管理化に置かれていない状態と、そうでない状態がある。
判定する方法は簡単で、`RLMObject`の`realm`プロパティを参照すればよい。

Realm Objective-Cのコードだがこのようにメソッド生やしておけば役に立つ。

```swift
extension RLMObject {
    var isStandalone: Bool {
        return self.realm == nil
    }
}
```


ユースケース
キャッシュ（Realm）から取得されたのか、ネットワーク上からStandalone Objectにマッピングされたのかを判断するのに使える。