OmniAICreator/Qiita-1.07M huggingface dataset:
JavaからSolr5.4.0のインデクスを追加、検索する

###はじめに
Apache SolrはOSSの検索システムですが、非常にパワフルな検索システムです。また、頻繁にアップデートされています。

以前から仕事でSolrを使っていて、Solr4.0くらいからSolrCloudが使えるようになりましたがちょっと億劫で使っていませんでした。
（Zookeeperの設定とか、Zookeeperの設定とか）

Solr5.0からは完全に放置していましたが、今回勉強がてらにSolr5.4使ってみたらだいぶ使いやすくなっていました。
（Zookeeperの設定いらなくなってた）

合わせて、Solrの起動方法も変わっていて、solrconfig.xmlやschema.xmlの設定をしなくても簡単に使えるようになっていて、感動しました。

当然、日本語のインデクスをkuromojiでやりたい場合は、以前と同様にschema.xmlの設定が必要です。個人的にはkuromoji使わなくてもデフォルトの文字Nグラムである程度なんとかなると思ってます。

だいぶタイトルから脱線しましたが、肝心の内容についてはGithubにプロジェクトを作ったのでそっちを見て下さい。

#####サンプルコード
[https://github.com/keigohtr/Solr-sample]
(https://github.com/keigohtr/Solr-sample)


（さすがに不親切すぎるので、少しコードを載せます）
#####インデクスの追加
```
  public static void addApis(String zkHost, String collection, List<DocApi> list){
    LOG.info("Update solr index start.");
    try {
      CloudSolrClient server = new CloudSolrClient(zkHost);
      server.setDefaultCollection(collection);
      Collection<SolrInputDocument> sdocs = new ArrayList<SolrInputDocument>();
      for (DocApi doc: list) {
        SolrInputDocument sdoc = new SolrInputDocument();
        sdoc.addField("id", doc.getId());
        sdoc.addField("title", doc.getTitle());
        sdoc.addField("description", doc.getDescription());
        sdoc.addField("categoryList", doc.getCategoryList().toArray());
        sdoc.addField("enabled", doc.getEnabled());
        sdoc.addField("solrRegisteredAt", new Date());
        sdocs.add(sdoc);
      }
      server.add( sdocs );
      server.commit();
      server.close();
    } catch (SolrServerException e) {
      LOG.error("SolrServerException",e);
    } catch (IOException e) {
      LOG.error("IOException",e);
    }
    LOG.info("Update solr index end.");
  }
```
これはSolrCloudへの接続です。ポイントはSolrのURLではなくZookeeperのURLとcollection名を入力する点です。

インデクスの追加はSolrInputDocumentを作って、serverに投げればOKです。この例のように複数のドキュメントを一括でコミットできます。

以前のSolrではschema.xmlを設定してやらないといけませんでしたが、Solr5.4では特にこだわりがなければschema.xmlを設定しなくてもSolr側で勝手にfieldの設定をしてくれます。この例ではStringとBooleanとListとDateを扱いました。

#####インデクスの検索
```
  public static List<String> searchApis(String zkHost, String collection, SolrQuery query) {
    LOG.info("Search solr start.");
    List<String> apiIds = new ArrayList<String>();
    try {
      CloudSolrClient server = new CloudSolrClient(zkHost);
      server.setDefaultCollection(collection);
      QueryResponse response = server.query(query);
      SolrDocumentList list = response.getResults();
      LOG.debug(list.getNumFound() + " hits.");
      for (SolrDocument doc : list) {
        apiIds.add((String)doc.get("id"));
      }
      server.close();
    } catch (SolrServerException e) {
      LOG.error("SolrServerException",e);
    } catch (IOException e) {
      LOG.error("IOException",e);
    }
    LOG.info("Search solr end.");
    return apiIds;
  }
```
検索もインデクスの追加と同様です。QueryResponseにSolrQueryを与えて、ServerからSolrDocumentListを受け取ります。

###終わりに
本件は私がQiitaとgithubデビューをするための第一歩としてやりました。ググれば出てくる情報ですが、誰かの役に立てば幸いです。
[golang]GoでbitFlyerのAPIへアクセスしてみた


仮想通過ビットコインの取引所であるbitFlyerが提供するAPIを試してみました。
今回試すのは、こちらにあるbitFlyer LightningのAPIです。

bitFlyer Lightning API
[Documentation](https://lightning.bitflyer.jp/docs)

ドキュメントにいくつかプログラムのサンプルがありますが、Goのサンプルは無かったので他言語を参考に、Goで実装しました。

## 環境
Mac OSX 10.9.5
Go 1.5

## 概要
APIは基本的に指定されたエンドポイント（URI）へGET or POSTでアクセスすればokで、JSONのレスポンスが取得できます。
APIにはざっくりと認証不要なPublic APIと、認証必要なPrivate APIの2種あります。

## 認証不要なPublic APIの実装
こちらの実装は非常に単純で、単に指定されたエンドポイントへHTTPリクエストするだけです。
Goの場合は標準パッケージの"net/http"を利用すれば簡単にアクセスできます。
今回は例として、Public APIの「取引所の状態」へアクセスしてみます。

[取引所の状態](https://lightning.bitflyer.jp/docs#取引所の状態)
エンドポイント
GET /v1/gethealth

```go:gethealth.go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	uri := "https://api.bitflyer.jp/v1/gethealth"
	req, _ := http.NewRequest("GET", uri, nil)

	client := new(http.Client)
	resp, _ := client.Do(req)
	defer resp.Body.Close()

	byteArray, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(byteArray))
}
```

上記のプログラムをターミナルから実行すると、きちんとJSONのレスポンスが取得できたました。

```bash:ターミナル
go run gethealth.go
{"status":"NORMAL"}
```
Public APIは特に認証などが無いので、簡単にAPIへアクセスできます。
便利ですね。ちなみに"NORMAL"は「取引所は稼動しています。」です。

## 認証必要なPrivate APIの実装
次に、認証をしないとアクセスできない（情報が取得できない）APIを実装します。
上記のPublic APIよりは認証情報をセットする分、実装が難しくなります。

まずPrivate APIへアクセスするため、bitFlyer Lightningにアカウントを作成します。
[bitFlyer Lightning](https://lightning.bitflyer.jp/)

アカウントを作成したら開発者画面へ遷移して、新しいAPIキーを発行して新しいAPI KeyとAPI Secretを取得しておきます。
[bitFlyer Lightning developer](https://lightning.bitflyer.jp/developer)

ここまで出来たら、早速プログラムを実装します。
Private APIへアクセスするには、先ほど取得したAPI KeyとAPI Secretを利用して、HTTPのリクエストヘッダへ指定された情報をセットします。
リクエストヘッダへセットする情報はAPIドキュメントの[認証](https://lightning.bitflyer.jp/docs#認証)に記載されてます。

上記ドキュメントの内容を実装してAPIへアクセスします。
今回は例として、Private APIの「資産残高を取得」へアクセスしてみます。

[資産残高を取得](https://lightning.bitflyer.jp/docs#資産残高を取得)
エンドポイント
GET /v1/me/getbalance

```go:getbalance.go
package main

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"io/ioutil"
	"net/http"
	"strconv"
	"time"
)

func main() {
	key    := "=== your api key ==="
	secret := "=== your api secret ==="
	method := "GET"

	uri  := "https://api.bitflyer.jp"
	path := "/v1/me/getbalance"

	ts   := strconv.FormatInt(time.Now().Unix(), 10)
	text := ts + method + path

	// API secretでSHA256 署名を生成する
	hash := hmac.New(sha256.New, []byte(secret))
	hash.Write([]byte(text))
	sign := hex.EncodeToString(hash.Sum(nil))

	req, err := http.NewRequest(method, uri+path, nil)
	if err != nil {
		// TODO 例外処理
	}

	req.Header.Set("content-type", "application/json; charset=UTF-8")
	req.Header.Set("ACCESS-KEY", key)
	req.Header.Set("ACCESS-TIMESTAMP", ts)
	req.Header.Set("ACCESS-SIGN", sign)

	client := new(http.Client)
	resp, _ := client.Do(req)
	defer resp.Body.Close()

	byteArray, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(byteArray))
}
```

上記のプログラムをターミナルから実行する、きちんとJSONのレスポンスが取得できます。

## さいごに
Private APIの実装途中でリクエストヘッダの生成処理でハマったが、チャットで聞いたら祝日でも管理人からすぐ返事があり、解決できて嬉しかったです（かのうさん、ありがとうございました！）。
bitFlyerさんのサポートや取り組みには、真摯な態度が感じられてとても好印象です。

日本ではMt.GOX事件の影響や、小難しい専門用語が出てくるビットコイン取引所に対して悪印象を持っている人が多いですが、個人的にはビットコイン（ブロックチェーン）は素晴しい発想だと思うし、今後の動向にとても興味があります。
まだまだ日本での普及は遠いと思いますが、引き続き影ながら応援していきたいと思います。

以上です。
AngularJS: イベントテーブルの年、月をrowspanでブレークさせる


- 今日からAngularJS始めたのですがむずかしい。こんなんでいいのだろうか。
- 年度件数、年度+月件数をカウントしてレンダリングの時の`rowspan`にする
- Django のテンプレート

~~~html

<!doctype html>
<html>
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/angular-i18n/1.2.15/angular-locale_ja-jp.js"></script> {# 日本語曜日 #}
    <script>

    var myApp = angular.module('myApp', []);

    myApp.controller('EventListController', function($scope, $http) {
      $http.get('{{ data }}')       //  {# JSONのURL #}
      .success(function(data, status, headers, config) {
        month_count = [];
        year_count = [];
        for(var i in data){
          var d = new Date(data[i].opening_on)              // {# 日付 #}
            var y = d.getFullYear().toString() + '年' ;
            var m = (1 + d.getMonth()).toString() + '月' ;

			data[i].year = y;
            data[i].month = m;

            if( y in month_count == false ){
                month_count[y] = []; 
            }   

            if( y in year_count == false ){
                year_count[y] = 0;
            }   

            if( m in month_count[y] == false ){
                month_count[y][m] = 0;
            }   
            month_count[y][m] = month_count[y][m] + 1;
            year_count[y] =  year_count[y] + 1;
        }   


        $scope.events = data;
        $scope.month_count = month_count;
        $scope.year_count = year_count;
        
      })
      .error(function(data, status, headers, config) {
        // log error
      });
    });

    </script>
  </head>
  <body>

  {# Django テンプレート展開させない #}
  {% verbatim %}
  <div ng-app="myApp" ng-controller="EventListController">
    <table  border="1">
      <tr ng-repeat="ev in events"> 
        <th ng-show="events[$index-1].year != events[$index].year" rowspan="{{ year_count[ev.year] }}"> {{ ev.year }}</th>
        <th ng-show="events[$index-1].month != events[$index].month" rowspan="{{ month_count[ev.year][ev.month]}}"> {{ ev.month}}</th>
      <td>({{ ev.opening_on|date:'EEE'}})</td>
      <td>{{ ev.title }} {{ ev.presenter }}</td>
    </tr>
    </table>
  </div>
  {% endverbatim %}
  
  </body>
</html>
~~~
Webサーバ構築〜Apacheインストール・Basic認証

> [目的]
Apacheをインストールし、開発のためにBasic認証を追加する

# Apacheインストール

```bash:パッケージインストール
sudo yum install httpd
```
```bash:Apacheのバージョン確認
apachectl -version
```
```shell-session
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov 19 2015 21:43:13
```
```bash:Apache起動
service httpd start
 or
apachectl start
```

http://IPアドレス/ にアクセスするとApache HTTP Server Test Pageが表示される

# WebページにBasic認証をかける
開発中の画面を非公開にするためにBasic認証を追加する

```bash:認証用のアカウント・パスワード生成
sudo htpasswd -c -b /etc/httpd/conf/.htpasswd user1 password
```
```shell-session
[sudo] password for user1: 
Adding password for user user1
```

```bash:basic認証の設定追加
sudo vim /etc/httpd/conf/httpd.conf
```
```shell-session:以下を追加
<Directory "/var/www/html/">
    AuthUserFile /etc/httpd/conf/.htpasswd
    AuthGroupFile /dev/null
    AuthName "Basic Auth"
    AuthType Basic
    Require valid-user
</Directory>
```

```bash:Apache再起動で設定反映
service httpd restart
 or
apachectl restart
```

# Apacheの自動起動設定
```bash:自動起動ON
chkconfig httpd on
```
```bash:確認
systemctl is-enabled httpd
```
```shell-session
enabled
```

※PHPの実行は [こちら](http://qiita.com/ikenyal/items/4c8e8e9b0fa19d251899) も参照
CentOS初期セットアップ〜アカウント追加・SSH設定・sudo権限

> [前提条件]
サーバ・インスタンスの準備ができ、SSHログインできる状態

> [目的]
rootのSSHを禁止し、作業用アカウントのみSSHログインできるようにする

# パッケージ最新化
脆弱性対策のためにもパッケージを最新化する

```bash:yumでインストール済みのパッケージを最新化する
yum update
```
```shell-session
...
総ダウンロード容量: XXX M
Is this ok [y/d/N]: y
...
```
```bash:反映のために再起動
reboot
```

# ユーザ追加
作業用のユーザを追加する。
rootではなく、この作業用ユーザを使うために作成。

```bash:アカウント追加
useradd user1
```
```bash:パスワード設定
passwd user1
```
```shell-session
ユーザー user1 のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
```

# 追加したユーザの公開鍵配置
作成した作業用ユーザでSSHログインするために、公開鍵を配置する。


```bash:.sshディレクトリをパーミッション700で作成
mkdir -m 700 /home/user1/.ssh
```
```bash:公開鍵を配置
vim /home/user1/.ssh/authorized_keys
```
```bash:公開鍵のパーミッションを600に
chmod 600 /home/user1/.ssh/authorized_keys 
```
```bash:.ssh配下の所有者を変更
chown -R user1:user1 /home/user1/.ssh/
```

この状態で追加したアカウントでSSHログインして接続できることを確認

```bash:ログインしているアカウントの確認
whoami
```
```shell-session
user1
```

# sudoユーザを追加
root以外のアカウントでsudoを使えないので使えるようにする

```bash:wheelグループにsudo権限をつける
visudo
```
```shell-session:以下の行のコメントアウトを外して有効化
%wheel  ALL=(ALL)       ALL
```

```bash:user1をwheelグループに追加(sudoを許可するアカウントのみwheelに所属させる)
usermod -G wheel user1
```

この状態で追加したユーザでログインし、sudoが使えるか確認

```bash:ログインしているアカウントを確認
whoami 
```
```shell-session
user1
```
```bash:sudoが使えるか確認
sudo pwd
```
```shell-session
[sudo] password for user1: 
/home/user1
```

> ここからは作業用アカウントで作業

#rootでのSSHを禁止
セキュリティ面からrootでのSSH接続を禁止する

```bash:SSHの設定を変更
sudo vim /etc/ssh/sshd_config 
```
```shell-session:PermitRootLoginをnoに変更
#PermitRootLogin yes
PermitRootLogin no
```
```bash:sshdを再起動して設定反映
sudo service sshd restart
```
```shell-session
Redirecting to /bin/systemctl restart  sshd.service
```

この段階でrootでSSHしようとすると`Permission denied (publickey,gssapi-keyex,gssapi-with-mic).`で接続拒否される

※続きのWebサーバ構築は [こちら](http://qiita.com/ikenyal/items/598e9972636f7a28e648)
[Node.js][Babel] import文は他のいかなる文よりも先に実行される


# TL;DR
Babelでは以下のコードは、

```javascript
global.foo = 42;
import bar from "bar";
```

以下のコードと同じ意味。

```javascript
import bar from "bar";
global.foo = 42;
```

# 検証
本記事執筆時点での最新版である`babel-cli@6.5.1`と`babel-preset-es2015@6.5.0`を検証に使う。
Babelはimport文に相当する処理を一番最初に持っていくのかを確認するために、以下のファイルをBabelで変換したコードがどうなるかを調べる。

```javascript:test.js
global.foo = 42;
import bar from "bar";
```

次のコマンドを実行する。

```bash
npm install babel-cli@6.5.1 babel-preset-es2015@6.5.0
"$(npm bin)"/babel --presets es2015 test.js
```

結果はこうなる。

```javascript
"use strict";

var _bar = require("bar");

var _bar2 = _interopRequireDefault(_bar);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

global.foo = 42;
```

確かにimport文に相当する機能を持つ`require("bar")`が一番最初に実行されるコードが出力されていることが分かる。

# 何故こうなるのか
import文はモジュールのロードを静的に行うためのものなので、他の処理よりも実行順が早くなる。
その仕様をES5の範囲で表現しようとするとBabelのような実装になる。

# 補足: 細かい話
Babelは、

```javascript
global.foo = 42;
import bar from "bar";
```

と

```javascript
import bar from "bar";
global.foo = 42;
```

で同じコードを出力するが、ES2015の仕様としてこの両者が本当に厳密に同じ意味を持つのかは、仕様書を斜め読みしたもののよく分からなかった。
なので念のため、この記事は全体的にES2015でなくBabelに限定した書き方にしている。
AtomでPuppetの予約語に色をつける


GitHub製のテキストエディタAtomで、Puppetのシンタックスハイライトする方法です。去年あたりからMacのエディタとして、Atomが流行っているみたいで今更ながら使ってみました。

# Puppetのシンタックスハイライト
Atomのデフォルトでは、Puppetの予約語とかに色がつかないです。
が、Packageを追加することによって色付けできるので、その設定方法です。設定方法は、Macの場合なので、その他のOSについては読み替えてください。

## 設定前
インストール前の表示は、こんな感じに一色です。

![スクリーンショット 2016-01-09 10.22.10.png](https://qiita-image-store.s3.amazonaws.com/0/95528/7667c29f-cdcf-d5c1-5282-66ae5c1782bc.png)


## 設定後
設定をすると、こんな感じにカラフルになります。

![スクリーンショット 2016-01-09 10.30.56.png](https://qiita-image-store.s3.amazonaws.com/0/95528/08e809fa-b0a4-2099-f1dc-815365eaa91a.png)

## 設定方法
### language-puppetパッケージのインストール
Puppetのシンタックスハイライトは、language-puppetでできます。

メニューバーのAtom -> Preferences..からAtomの設定画面を開きます。
設定画面のサイドバーのInstallを選んで、Packageの検索欄にlanguage-puppetで検索します。（キャプチャだとpuppetになっていますが…）

![スクリーンショット 2016-01-09 10.24.18.png](https://qiita-image-store.s3.amazonaws.com/0/95528/be8d0ca2-63f8-d2bc-e4bd-71a50f0ce4ec.png)

language-puppetのInstallボタンを押して、インストール。
これでPuppetのマニフェストファイルに色がつくようになりました。
 
### puppet-lintとの連携
puppet-lintを使うと、マニフェストがPuppetのスタイルガイドにそっているかチェックできます。Atomとpuppet-lintを連携させるためのPackageもあります。
puppet-lintと連携させたい場合、以降の設定も参考にしてください。

### puppet-lintのインストール
※Macの場合は元からRuby入っていますが、Windowsの場合はRubyが入っていないので、事前にインストールが必要です。RubyGemsも利用できるように設定も必要。

Macのターミナルから、puppet-lintを下記コマンドでインストール。

```
gem install puppet-lint
```

これで、チェッカー本体のインストール完了です。

### linterパッケージのインストール
以降はAtomでの操作に戻ります。
language-puppetパッケージのインストールと同じ方法で、linterパッケージをインストール。キャプチャはインストール後の状態。

![スクリーンショット 2016-01-09 10.25.47.png](https://qiita-image-store.s3.amazonaws.com/0/95528/778c6d32-c01b-8a92-9aa6-939db1ddb0b8.png)

### linter-puppet-lintパッケージのインストール
さらに、linter-puppet-lintをインストール。

![スクリーンショット 2016-01-09 10.26.29.png](https://qiita-image-store.s3.amazonaws.com/0/95528/12db04c1-e09d-013c-38a0-65f9d0df7e5a.png)

インストール直後は、puppet-lintの実行パスが設定されていないみたいで、左上にエラー表示と、なぜか右側にデバック画面が出ますが、落ち着いてAtomを一旦閉じます。

### linter-puppet-lintパッケージの設定
Packagesからlinter-puppet-lintを見つけて、Settingsを押します。

SettingsのExcutable pathの欄に、puppet-lintの実行パスを設定します。
下記画像は、実行パスが/user/local/bin/puppet-lintの場合です。

![スクリーンショット 2016-01-09 10.28.48.png](https://qiita-image-store.s3.amazonaws.com/0/95528/5d86bff5-ef1b-c8d5-ce3d-de9c24eb5cc9.png)

これで、Atomとpuppet-lintの連携設定が完了です。

## 設定後の表示
デフォルト設定では、マニフェストファイルを保存するタイミングでpuppet-lintでのチェックがされるようです。スタイルガイドにそっているかのチェックなので、シンタックスエラーは警告されないようです。

![スクリーンショット 2016-01-09 10.30.56.png](https://qiita-image-store.s3.amazonaws.com/0/95528/08e809fa-b0a4-2099-f1dc-815365eaa91a.png)

puppet-lintの結果、どの行で注意されているかが下にでます。また注意されている行の該当箇所付近にカーソルを移動させると、吹き出しも出ます。

どちらかというと、シンタックスエラーを表示してほしいのですが、上記設定までだとシンタックスエラーまでは見てくれないようです。
rsync (リモートLinux間でのファイル転送・同期)

# ０．基本（コピー）

```
rsync -navz 元 先
```
-n : dry-run（テストだけ。実際にコピーはしない）。（実際にコピー開始する時は、はずす） 
-a : お約束
-v : verbose
-z : 転送時に圧縮する。

* ほぼほぼ cp -r と同じイメージ。
* 転送先に同一ファイルがあったら転送しない。
* 転送先の方が新しくても、転送元で上書く。

## テンプレート
```
rsync -navz -e "ssh -p 22" suzuki@hostname:source destination
```

* 元ディレクトリ末尾にスラッシュ(/)を付けると中身だけコピーする。付けないとディレクトリ自身をコピーする。
* コピー先はスラッシュを付けても付けなくても同じ。
* source, destination は、絶対パスも相対パスも可。

# １．完全同期（削除も含む）
```
rsync -navz --delete 元 先
```
* 転送元に無いファイルは、削除される。
* 転送元ファイルで上書かれる。

# ２．最新化
```
rsync -navz --update 元 先
```
* 転送先が新しければ、転送しない。

# ３．１＋２
```
rsync -navz --update --delete 元 先
```
* 転送元に無いファイルは、削除される。
* 転送先が新しければ、転送しない。
Syntactic Categories, Adjoint Functors and Monads.

# 概要
　プログラマ向けのモナドに関する解説。そもそもモナド則って、なんであの形になってるのって思っている方向け。圏の間の”同型”とは何なのか、そこら辺、つまり随伴関手の理論周りから解説する。まあ半分備忘録。
パスワードのバリデーションをする `password_strength_validator` を作った

「パスワードは12文字以上、大文字小文字、3つ以上の数字と記号を含む」みたいなバリデーションをするgemがありそうで見つからなかったので作ってみた。

https://github.com/kwappa/password_strength_validator

意外と便利だと思うのだけどいかがでしょう。
AWS IoTにmqtt-spyを使って接続する際の注意点

MacでAWS IoTにつなごうとしたらはまったのでメモ。
（この記事を書いた時の状況です。後ほど改善される可能性は大いにあります。）

#構成
- Mac OSX ElCapitan 10.11.3
- Mqtt-spy 0.4.0

#手順
1. Mqtt-spyでAWS IoTのURLやら証明書の設定をします。
2. "Client key in PEM format"のチェックボックスをONにします。（地味にこれが0.3.0との差分）
3. 以下のエラーが発生します。どうも0.4.0をMacで使うとこのエラーで手詰まりらしい。

```
pl.baczkowicz.spy.exceptions.ConfigurationException: Invalid configuration parameters
	at pl.baczkowicz.mqttspy.connectivity.MqttConnectionDetailsWithOptions.<init>(MqttConnectionDetailsWithOptions.java:91)
	at pl.baczkowicz.mqttspy.connectivity.RuntimeConnectionProperties.<init>(RuntimeConnectionProperties.java:34)
	at pl.baczkowicz.mqttspy.ui.connections.ConnectionManager.openConnection(ConnectionManager.java:160)
	at pl.baczkowicz.mqttspy.ui.EditConnectionController$6.run(EditConnectionController.java:447)
	at com.sun.javafx.application.PlatformImpl.lambda$null$156(PlatformImpl.java:295)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$157(PlatformImpl.java:294)
	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
Caused by: pl.baczkowicz.spy.exceptions.SpyException: Cannot create TLS/SSL connection
	at pl.baczkowicz.spy.security.SecureSocketFactoryBuilder.getSocketFactory(SecureSocketFactoryBuilder.java:100)
	at pl.baczkowicz.mqttspy.connectivity.MqttConnectionDetailsWithOptions.populateMqttConnectOptions(MqttConnectionDetailsWithOptions.java:175)
	at pl.baczkowicz.mqttspy.connectivity.MqttConnectionDetailsWithOptions.<init>(MqttConnectionDetailsWithOptions.java:87)
	... 7 more
Caused by: java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
	at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:217)
	at java.security.KeyFactory.generatePrivate(KeyFactory.java:379)
	at pl.baczkowicz.spy.security.SecureSocketUtils.loadPrivateKeyFromPemFile(SecureSocketUtils.java:96)
	at pl.baczkowicz.spy.security.SecureSocketUtils.getKeyManagerFactory(SecureSocketUtils.java:185)
	at pl.baczkowicz.spy.security.SecureSocketFactoryBuilder.getSocketFactory(SecureSocketFactoryBuilder.java:93)
	... 9 more
Caused by: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
	at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:351)
	at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:356)
	at sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(RSAPrivateCrtKeyImpl.java:91)
	at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(RSAPrivateCrtKeyImpl.java:75)
	at sun.security.rsa.RSAKeyFactory.generatePrivate(RSAKeyFactory.java:316)
	at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:213)
	... 13 more
```

#解決策
0.5.0を使ってください。（betaでも大丈夫）
同じ設定で接続すればつながります。


こんなん嵌るわ。0.4.0でBugFixされることを願います。
unity入門　その4

#　今回のゴール
　- ページ遷移を作る

-------------------------------------------

ゲームプログラムで必須のページの切り替えの部分を作ります。

今回は、練習用なのでタイトルとか作りこむつもりはないので、
単純に何もないタイトルページにボタン配置するだけ。

押したら、今まで作ってた画面を表示

-------------------------------------------

## タイトル用のシーンを新規作成
　まずは、今までのシーンを保存します。
![スクリーンショット 2016-02-11 15.58.06.png](https://qiita-image-store.s3.amazonaws.com/0/98558/d757048d-5745-6904-3e19-8082c1f4af40.png)



![スクリーンショット 2016-02-11 15.56.02.png](https://qiita-image-store.s3.amazonaws.com/0/98558/f6980d88-c7be-ac47-567a-3f1c929ae24e.png)

新しいシーンを生成します。
Save Sceneで新しいシーンも保存します。
名前は、「titleScene」にしました。

titleシーン用のスクリプトを作成します。

```cpp:titleScene
using UnityEngine;
using System.Collections;

public class TitleScenenCtrl : MonoBehaviour {
    void OnGUI()
    {
        // ボタンを作成。
        if (GUI.Button(new Rect(327, 290, 200, 54), "Start"))
        {
            // シーンの切り替え
            Application.LoadLevel("orignal");
        }
    }
}
```

orignalは、前回までのゲーム画面を保存したシーンの名前になります。

画面遷移を登録するために、空のObjectを生成

![スクリーンショット 2016-02-11 16.06.00.png](https://qiita-image-store.s3.amazonaws.com/0/98558/cd6e1a98-0b6b-d7cc-d527-0710c36d4322.png)

GameObjectを選択し、Inspectorに登録します。

![スクリーンショット 2016-02-11 16.07.15.png](https://qiita-image-store.s3.amazonaws.com/0/98558/33081f45-eb97-9820-0d57-5e2c8cf5f914.png)

こんな感じになります。

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/98558/33493110-aaff-efbb-2c4a-71c37acc4973.gif)

スタートボタンがあって、押すとゲーム画面へ遷移。

今回は以上。
Kivyのmapviewを試してみた

# あらまし
Kivy Garden というKivyのアドオンを管理するプロジェクトの中に地図を表示するアドオン(MapView)があったので試してみました。
Gardenの詳細は以下より
https://kivy.org/docs/api-kivy.garden.html
pipでインストールできます。
```pip install kivy-garden```

# 準備
とりあえず、GithubのREADMEを読んで準備。
https://github.com/kivy-garden/garden.mapview
まず、必要な環境をインストール。
``` pip install futures requests ```
つぎにmapviewをインストール。
``` garden install mapview ```

これで、準備は完了。

# MapViewを使ってみる
とりあえず、東京駅を中心とした地図を表示してみます。

```python:main.py
from kivy.garden.mapview import MapView
from kivy.app import App

class MapViewApp(App):
    def build(self):
        mapview = MapView(zoom=15, lat=35.681382, lon=139.766084)
        return mapview
    
MapViewApp().run()
```

実行結果は以下の通り。東京駅中心にした地図が表示されました。
![image](https://qiita-image-store.s3.amazonaws.com/0/98851/571e3d7e-b1e2-c542-4906-b78a8b6f5f86.png)

ついでに、東京駅の場所にマーカー(目印)を表示してみる。以下のようにコード書き換えます。

``` python:main.py 
from kivy.garden.mapview import MapView, MapMarkerPopup
from kivy.app import App

class MapViewApp(App):
    def build(self):
        mapview = MapView(zoom=15, lat=35.681382, lon=139.766084)
        marker1 = MapMarkerPopup(lat=35.681382, lon=139.766084) 
        mapview.add_marker(marker1)
        return mapview
    
MapViewApp().run()
```

実行結果を見るとマーカーがうまく表示されました。
![image](https://qiita-image-store.s3.amazonaws.com/0/98851/9be8efd5-349e-7de0-ea6d-5f5e98e4f093.png)

というわけで、非常に簡単に地図を表示することができました。
ちなみに、MapViewで呼ばれている地図はOpenStreetMapのものです。(http://www.openstreetmap.org/)
起動時に、他のクラスから呼び出されることなく処理を行いたい時

ObjCのクラスには、loadというクラスメソッドがある。

これは、起動後にクラスがロードされるタイミングで呼び出される。

起動直後なので、以下のような制限がある。
・他のクラスがまだロードされていないかもしれないので、自クラスだけで完結する処理しか書けない
・NSAutoReleasePoolの準備ができていないので、autoreleaseは使えない（or 自分でNSAutoReleasePoolを管理する必要がある）

以上のようなことを考慮しなくていいような場合は、
メインスレッドで実行させるようにしちゃう手がある。


+ (void)load
{
    [self performSelectorOnMainThread:@selector(load_inner) withObject:nil waitUntilDone:NO];
}

（load_innerが、実際の処理を記述してあるクラスメソッド名とする）

こうすると、他のクラスもNSAutoReleasePoolも普通に使える状態になってる。
便利。



これを使うと、ライブラリの呼び出し処理などを書かずとも、裏でライブラリが起動してくれたりとかいう使い方もできる。

なお、似たメソッドに
initialize
というものもあり、こちらは「初めてそのクラスが使用されるタイミング」で呼び出される。
これは、NSAutoReleasePoolはそのまま使うことができる。
itunesのトップ無料アプリ順位及びReview情報取得方法

#今日は簡単にitunesのトップ無料アプリデータとReview情報を取得してみます

## itunesからトップ無料アプリデータをRSS情報として取得して、そのアプリのReview情報の取得ができます。

## topfreeapplications : トップ無料アプリの順位情報取得API
　　　limit:取得したい件数、type:jsonかxmlどちらを指定

## customerreviews : アプリのReview情報取得API
　　　id: アプリのID、type:jsonかxmlどちら指定

##　実際やってみましょう。
```lang:filename
	//トップ無料アプリデータ取得
	$url = "https://itunes.apple.com/jp/rss/topfreeapplications/limit=" . $appCnt . "/" . $type;

	$json = file_get_contents($url,true);

	$rank = json_decode($json,true);

	$jsonData = new JsonData();

	$rankNum = 1;

	foreach ($rank['feed']['entry'] as $row) {

		$appInfo = new App();
		$id = $row["id"]['attributes']['im:id']; 		//APPID
		$appInfo->app_rank = $rankNum;			 		//ランキング
		$appInfo->app_id = $id;
		$appInfo->app_name = $row["im:name"]['label'];  //アプリ名
		$appInfo->summary = $row["summary"]['label'];  //アプリ説明
		$appInfo->app_imgUrl = $row["im:image"];		//アプリのScreenShortイメージリンク

		//Review情報取得
		$reviewUrl = "http://itunes.apple.com/jp/rss/customerreviews/id=" . $id . "/sortby=mostrecent/" . $type;

		$reviewJson = file_get_contents($reviewUrl,true);
		$reviewInfo = json_decode($reviewJson,true);
		$reviewData = $reviewInfo['feed']['entry'];

		for($i=0; $i < count($reviewData); $i++) {

			if($i==0){
				continue;
			}

			$rev = new AppReview();
			$rev->name =$reviewData[$i]["author"]["name"]['label'];		//作成者名
			$rev->title = $reviewData[$i]["title"]['label'];		//Reviewタイトル
			$rev->content = $reviewData[$i]["content"]['label'];		//Review内容
			$rev->content_url = $reviewData[$i]["author"]['uri']['label'];	//Review URL
			$rev->rating = $reviewData[$i]["im:rating"]['label'];		//Review評価
			$rev->version = $reviewData[$i]["im:version"]['label'];		//Version情報
			array_push($appInfo->appreviews,$rev);
		}
		array_push($jsonData->reviews, $appInfo);

		$rankNum++;
	}
```
[WebGL] 浮動小数点テクスチャの扱いでハマった件

# 必要な拡張機能それで合ってますか?

最近、WebGLで遅延シェーディングしたりすると、モバイルでG-Bufferが描かれないなんてことがあった。
いや、でも`OES_texture_float`は確かに正常にgetExtensionできる。

## CPUで書き込み、GPUで読み出すというケース

あくまで、GPU側ではRenderTargetとして使わず、tetxture2Dで読み出すと言う場合には確かに`OES_texture_float`のみで問題ない。
ただし、フィルタにLINEARをかけるのであれば、`OES_texture_float_linear`が必要だ。

half floatテクスチャを用いたい場合は、`OES_texture_half_float`,`OES_texture_half_float_linear`をそれぞれ用いれば良い。

ここまでは常識的な範囲だろう。

## GPU側で書き込みが必要なケース

シャドウマップのための深度を記録する目的や、遅延シェーディングで法線情報を記録しようとしたりして浮動小数点テクスチャが必要になると、FrameBufferに対して浮動小数点テクスチャを登録して、そこに対して利用する。つまりは、RenderTargetとして利用する場合は、少し様子が異なる。

実は、GPU側からの書き出しでは、`OES_texture_float`だけでは足りない。
加えて、`WEBGL_color_buffer_float`が必要となる。特に、モバイル環境では、`OES_texture_float`はサポートしているが、`WEBGL_color_buffer_float`はサポートしていないなどあり色々めんどくさい。

さらにめんどくさいのは、これが一筋縄に`getExtension`すればいいんだろ。というわけにもいかないというところだ。

実はこの`WEBGL_color_buffer_float`、ブラウザがサポートしていてもgetExtensionでnullが返ってくることがある。
だから、別に今まで動いてたって人がいたとしたら、getExtensionしなくても使えたっていうわけだ。

じゃあ、どうやって使用可否を判断するかというと、試しにFrameBufferとくっつけてみるしかない。

```js
let isSupported;
    if (gl.getExtension("WEBGL_color_buffer_float") === null) {
      const fbo = gl.createFramebuffer();
      const tex = gl.createTexture();
      gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
      gl.bindTexture(gl.TEXTURE_2D, tex);
      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.FLOAT, null);
      gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);
      if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {
        isSupported = false;
      } else {
        isSupported = true;
      }
      gl.deleteTexture(tex);
      gl.deleteFramebuffer(fbo);
    } else {
      isSupported = true;
    }
```

## CPU側で読み込みたいってケース

readPixelsを使ってfloat値を読み込みたいって場合は、さらに注意が必要。
これはそれ用の仕様があるわけでもなく、なぜか`WEBGL_color_buffer_float`がサポートされていれば、FLOATかつ、RGBAの読み込みができるようになっている。
Android ユニットテストとUIテストの自動化プラクティス


## 環境
 * Mac OSX
 * IntelliJ IDEA 15
 * JUnit 4.x
  * Hamcrest
  * Mockito 1.10.19 
  * Espresso 2.2.1

## 概要  
JUnitは、Javaのテスティングフレームワークです。
テストの実行、期待値と実測値の検証、テストケースのフォーマット（アノテーションなど）の機能を持ちますが、実際のテストでは、拡張APIを利用することの方が多いと思います。
JUnit4から、Android SDKに公式サポートされているので、特定のディレクトリにテストコードを配置すれば、意識せずに実行することができてしまいます。（拡張APIもGradleでインストールできるので、こちらも意識せずに利用できてしまいます）
そして、実際にテストコードを書く段階になって、どの機能を誰が提供してくれているのか、わからなくなります。

## JUnitと拡張API
* [JUnit](http://junit.org)
 * テスティングフレームワーク
 * テストが全て成功すると、グリーンバーを表示してくれる。失敗するとレッドバー。（テスト進捗状況に一喜一憂させられる）
 * 比較検証を行う『assertThat()』メソッドは、JUnitの機能
 * hasItem(), hasItems()は、JUnitMatchersが提供しているが、is()は別ライブラリの機能

```Java:
String actual = "Hello" + " " + "World";
assertThat(actual, is("Hello World"));

List<String> actual = sut.getList();
assertThat(actual, hasItem("World"))

List<String> actual = sut.getList();
assertThat(actual, hasItems("World"))
```

* [Hamcrest](http://hamcrest.org/JavaHamcrest/)
 * Matcherライブラリ
 * もともと拡張ライブラリ、JUnit4.4から組み込まれる
 * 『is()』メソッドは、HamcrestのMatcherメソッド。その他に以下のメソッドがある

```Java:
assertThat(actual, is("Hello World"));
assertThat(actual, is(nullValue()));
assertThat(actual, is(not(0)));
assertThat(actual, is(notNullValue()));
assertThat(actual, is(sameInstance(expected)));
assertThat(actual, is(instanceOf(Serializable.class)));
```

* [Mockito](http://mockito.org)
 * モック用ライブラリ
 * 任意のクラスを指定して、『もし○○だったら、××を返す』と文章的にわかりやすい
 * リフレクションを利用して、動的にクラスの内容を書き換えているのだろうけど、使えば使うほど、どうやっているのか不思議なライブラリ

```Java:
List<String> stub = mock(List.class);
when(stub.get(0).thenReturn("Hello"));
assartThat(stub.get(0), is("Hello"));
```


* [Espresso](https://google.github.io/android-testing-support-library/docs/espresso/setup/)
 * Viewに何が表示されているかのテストが出来る

  
```Java:
// TextViewに、my_viewというリソースIDが定義されていて、内容が"Hello!"の場合に成功
onView(allOf(withId(R.id.my_view), withText("Hello!")));

// Viewに対して、クリックなどの操作も出来る
onView(...).perform(typeText("Hello"), click());

// ListView, GridViewの場合には、onView()ではなくonData()を利用する
onData(allOf(is(instanceOf(String.class)), is("Americano"))).perform(click());

```


## Tips
 * Espressoでの比較検証の注意点
  * 画面上に表示されている要素（R.id.xx）しか取得や比較ができない。
  * テストを行う際、画面サイズが異なると、テスト対象になっている要素があったりなかったりする。これがテストの観点（全ての端末で、ある文字列が表示されていること、など）になったりします。
  * 同様に、ListView, GridViewなどの後ろの要素の判別は、『perform(scrollTo())』などを利用して、スクロールさせてから判別する必要があります。
  * 例えば、ImageViewで任意の画像を表示している場合、ImageViewがあるか、ないかの判別や、Src, Backgroundにセットされているかの判別はできますが、その画像がどういう内容かは判別できません。


## Android ユニットテストに関するその他の記事
 * [Android ユニットテストとUIテストの自動化プラクティス](http://qiita.com/m1takahashi/items/abfd86f37e25dc6122a8)
 * [Android エミュレーターでのユニットテスト 画面サイズとAPIレベルのマトリクス](http://qiita.com/m1takahashi/items/218b49b76e588dcbda27)
 * Android ユニットテストとUIテスト
AllWinner系開発ボード

# AllWinner系のプロセッサー

## Cortex-A8系

| 名前 |Core数|Core|
|:--|:--|:--|
| A10 | 1 | Cortex-A8 |
| A10s | 1 | Cortex-A8 |
| A13 | 1 |Cortex-A8 |
| R8 | 1 | Cortex-A8 |

## Cortex-A7系

| 名前 |Core数|Core|
|:--|:--|:--|
| A20 | 2 | Cortex-A7 |
| A23 | 2 | Cortex-A7 |
| A31 | 4 |Cortex-A7 |
| A31S | 4 |Cortex-A7 |
| A34 | 4 |Cortex-A7 |
| A80 Octa | 8 |  Cortex-A15 + Cortex-A7 |
| A83T | 8 | Cortex-A7 |
| H3 | 4 | Cortex-A7 |
| H8 | 8 |  Cortex-A7 |
| R16 | 4 | Cortex-A7 |
| R58 | 8 |  Cortex-A7 |

## Cortex-A53系

| 名前 |Core数|Core|
|:--|:--|:--|
| A64 | 4 | Cortex-A53 |
| H64 | 4 | Cortex-A53 |
| R18 | 4 | Cortex-A53 |

# 開発ボード

## A64系搭載

- [PINE64](http://pine64.com/)
- [A64-OLinuXino](https://olimex.wordpress.com/2016/01/22/a64-olinuxino-routing-completed-but-we-still-have-to-final-touch-this-and-that/)

## A20搭載

- [A20-OLinuXino-MICRO](https://www.olimex.com/Products/OLinuXino/A20/A20-OLinuXino-MICRO-4GB/open-source-hardware)
- [CubieBoard2](https://en.wikipedia.org/wiki/Cubieboard)
- [MarsBoard](http://www.marsboard.com/new_marsboard_a20_feature.html)
- [pcDuino3](http://www.linksprite.com/linksprite-pcduino3/)

## R8搭載

- [CHIP](https://www.kickstarter.com/projects/1598272670/chip-the-worlds-first-9-computer/posts/1355196)

## H3搭載

- [OrangePI](http://www.orangepi.org/)

## H8搭載

- [pcDuino8](http://www.linksprite.com/pcduino8-uno/)

## A80搭載

- [CubieBoard8](http://cubieboard.org/2014/05/04/cubietech-will-promote-a80-high-performance-mini-pc/)

# 他の64bit CPU

|Chip名 | メーカー | 備考|
|:--|:--|:--|
|RK3368|Rockchip| ARM Cortex-A53(1.5GHz) 4コア | 
|S905|Amlogic|ARM Cortex A53(2.02GHz) 4コア |
|Snapdragon™ 410| Qualcomm |ARM Cortex-A53(1.2GHz) 4コア | 
|Sanpdragon 810 | Qualcomm | Cortex-A5(1.5GHz)7 x4+ Cortex-A53(2.0GHz) x4 |
| Kirin6220 | Hisilicon | ARM Cortex-A53(1.2GHz) 8コア |
| Exynos7 | Samsung |ARM Cortex-A53(1.5GHz) x4 + ARM Cortex-A57(2.1GHz) x4 |
Qiita初投稿（Kobitoから）でハマったポイントをまとめてみた


## はじめに
Qiitaへの初投稿「[Arduinoのコーディングルールと命名規則を調べてみた](http://qiita.com/loonaifactory/items/1ddf0ec394ed42285b1b)」をKobito for Windows v1.5.0からアップしようとしたところ、投稿と手直しでハマって1時間くらいかかってしまいました。
これから初投稿する方への手助け and Kobitの改善を願って、ハマりポイントをまとめてみました。

## 目次
1. 投稿はチーム「Qiita」から
2. 使えるタグは5つまで
3. Kobitoのプレビューと投稿結果は異なる

## 1. 投稿はチーム「Qiita」から
KobitoからQiitaにアップロードしようとしたが、まず「アップロード」ボタンが見つからない。
何とか探し出し…
* 投稿したい記事を右クリックして「アップロード」しても、反応なし。
* 記事メニューから「アップロード」しても、反応なし。

途方に暮れていたところ、[Kobito(Window版)でアップロードではまった](http://qiita.com/suppy193/items/1faadc70ad32d4f0c132)の記事を発見！
>そうか、「Qiita」にして新規作成すればいいのか。

__チーム「Inbox」で書いた記事は、チーム「Qiita」へ移動しないとアップロードできません。__

以下のように、右上の移動ボタンで記事をチーム「Qiita」に移動して、「アップロード」ボタンが押せる状態になりました。
![image](https://qiita-image-store.s3.amazonaws.com/0/107123/067dd878-88d1-7114-7bad-462db1664470.png)

⇒ Kobito上では、チーム「Inbox」からアップロードしようとしたとき、「Inboxからはアップロードできません。」のようなコメント表示がほしいところです。

### 2. 使えるタグは5つまで
その後「アップロード」ボタンを押したところ、今度は「アップロードに失敗しました」という表示。
…ネットで検索してみても、さっぱり原因がわからない。
頭を抱えたまま ふとWeb上の新規作成画面を覗いたところ、以下のような記載が。
![image](https://qiita-image-store.s3.amazonaws.com/0/107123/d536872c-adea-c66f-a582-96f6d717d305.png)

欲張りなことに、タグを6つも入力していました…。
タグを5つにして再度「アップロード」したら、無事 記事が反映されました！（祝）
⇒ Kobito上でタグを6つ以上入力したら、「タグの入力は5つまでです。」のようなコメント表示がほしいところです。

### 3. Kobitoのプレビューと投稿結果は異なる
#### 「\#define」は見出しと認識される
Kobito上のプレビューでは問題なく表示された「\#define」。Qiita上の記事ではH1タグの見出しと認識されてしまいます。
「\\：バックスラッシュ」を用いることにより、Markdownをエスケープ(無効化)しましょう。
ちなみにKobitoのプレビュー上では、バックスラッシュ(エンマーク)・シャープ（\\\#）としても「(小文字の)￥」と表示されます。

#### コードブロックの上下に空行を挿入する

```cpp
if (somethingIsTrue) doSomething;
```

↑こんなことをやりたいとき、Kobito上のプレビューでは、コードブロック上下に空行がなくても正しく表示されていました。
実際に投稿したところ、表示がめちゃくちゃ(^^;)
コードブロックには、必ず上下に空行を入れましょう。[Markdown記法 チートシート](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)にもしっかり記載されています。

⇒ Kobitoのプレビューを、できるだけ投稿結果と合わせてほしいところです。とりあえずの対策としては、Kobitoから投稿した後のアップされた記事を確認し、__WebのQiita上で「投稿を編集」__しましょう。

### 最後に
* 投稿はチーム「Qiita」から行いましょう。
* 使うタグは5つまでにしましょう。
* Kobitoのプレビューと投稿結果は異なります。アップされた記事を確認し、WebのQiita上で「投稿を編集」しましょう。

…とはいうものの、Markdown 結構気持ちいい！
KobitoをGithubのREADME.md用のエディタとして使ってみようかな。
ESP8266 > UART1 TXを使う > Serial1.begin()

http://qiita.com/7of9/items/570f78a09539641a1c0f
で出てきたアイデア。UART1 TXを使う。

実装としては
https://github.com/esp8266/Arduino/blob/master/doc/reference.md

> To use Serial1, call Serial1.begin(baudrate).

とある。

今度時間ができたときに試してみよう。
le.shでSSL証明書作成


オフィシャルのLetsencryptクライアントだと、CentOS5でちゃんと動かなくて、それじゃあとgetssl使おうとしたら、sedの-Eオプションないじゃんってことで、le.shに行き着いたのでメモ。

# インストール
```bash:
$ git clone https://github.com/Neilpang/le.git
$ cd le
$ ./le.sh install
```
これで、自分のホームディレクトリ配下に.leディレクトリができて、alias切ったりしてくれる。
なんか、crontabも勝手に登録してくれるのでとりあえずコメントアウト。

# issueしてみる
apacheが動いてる環境であれば、Webrootモードで実行する。

```bash:
$ le issue /var/www/html example.com www.exapmle.com
```

/vaw/www/htmlはドキュメントルートのディレクトリ。ここにleがACME用のファイルとか置いてくれる（実行後は削除される）
ドキュメントルートに、.well-known/acme-challengeディレクトリを作成、応答ファイルをつくっているようだ。

# 何気にはまる
この、.well-known/acme-challengeディレクトリがなぜか

```
couldn't perform authentication. AuthType not set
```
とか言ってアクセスできなかった。
httpd.confでこのディレクトリを明示的にAllow from allしてあげた(apache 2.4未満の設定)

```apache:httpd.conf
<Directory /var/www/html/.well-known/acme-challenge>
    Allow from all
</Directory>
```


# 証明書配置

以下のようにして、証明書の置き場所を指定してあげる。

```bash:
$ le installcert fujiba.net /etc/httpd/conf/ssl.crt/fujiba.net.crt /etc/httpd/conf/ssl.crt/fujiba.net.key /etc/httpd/conf/ssl.crt/cacert.cer
```
あとは、apacheでこの証明書ファイル群を指定してあげればオレオレ証明書を使わずにssl有効になる。

あとは、定期的なアップデートだな。
ResizableCollectionViewを作成してみた

UICollectionViewで表示するセルの数を、ピンチイン・ピンチアウトで変更できるようにしたライブラリを作成しました。

[GitHub - ResizableCollectionView](https://github.com/chidori-app/ResizableCollectionView)

実装は [pamingさんの記事](http://qiita.com/paming/items/685b63d0ed20aaf124e4) を参考にさせていただきました。

![Screen Shot](https://raw.githubusercontent.com/chidori-app/ResizableCollectionView/master/imgs/ResizableCollectionView.gif)

# 要件

iOS 8.0 以上

# 使い方

## インストール

### Carthageを使用する場合

`github "chidori-app/ResizableCollectionView"`

### CocoaPodsを使用する場合

`pod 'ResizableCollectionView'`

### 手動の場合

CarthageやCocoaPodsを使用していない場合は、[GitHub](https://github.com/chidori-app/ResizableCollectionView)より
`ResizableCollectionView.swift` をダウンロードしてください。


## 設定手順

1. StoryBoardに `Collection View` を追加します。
  ![Screen Shot](https://raw.githubusercontent.com/chidori-app/ResizableCollectionView/master/imgs/storyboard1.png)
1. これのクラスを `ResizableCollectionView` に設定します。
  ![Screen Shot](https://raw.githubusercontent.com/chidori-app/ResizableCollectionView/master/imgs/storyboard2.png)
  * Carthageを使用してインストールした場合は、Moduleに `ResizableCollectionView` を設定します。
1. ResizableCollectionViewのdataSourceを設定します。
1. ResizableCollectionViewDataSource を実装します。
  (ResizableCollectionViewDataSourceの継承元であるUICollectionViewDataSourceの実装は必須です。)

  ```swift
  //MARK: - ResizableCollectionViewDataSource
  extension ViewController: ResizableCollectionViewDataSource {
      // optional
      func minNumberOfCellsInLine(collectionView: ResizableCollectionView) -> Int {
          return 2
      }
      // optional
      func maxNumberOfCellsInLine(collectionView: ResizableCollectionView) -> Int {
          return 6
      }
      // optional
      func marginOfCells(collectionView: ResizableCollectionView) -> CGFloat {
          return CGFloat(5)
      }
      // optional
      func thresholdOfZoom(collectionView: ResizableCollectionView) -> CGFloat {
          return CGFloat(0.6)
      }

      // MARK: - UICollectionViewDataSource
      func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
          return 1
      }
      func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
          return 100
      }
      func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
          return collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath)
      }

  }
  ```

## デリゲート

* `func willPinchIn(collectionView: ResizableCollectionView)`
* `func willPinchOut(collectionView: ResizableCollectionView)`
* `func didPinchIn(collectionView: ResizableCollectionView)`
* `func didPinchOut(collectionView: ResizableCollectionView)`
unsigned型の引き算

unsigned型の引き算について危ないということは知りつつよく理解していなかったので調査。

## コード

```cpp
#include <string>
#include <iostream>
#include <chrono>
#include <cstdint>
#include <cmath>
using namespace std;


void checkDiff(uint32_t l, uint32_t r, bool isLeftBigger)
{
	int a = l - r;
	int b = r - l;
	if (a < b && isLeftBigger)
	{
		cout << a << " is smaller than " << b << endl;
	}
	else if (a > b && !isLeftBigger)
	{
		cout << a << " is larger than " << b << endl;
	}
	else
	{
		cout << "OK" << endl;

	}
}

int main(int argv, char* argc[])
{
	checkDiff(UINT_MAX, UINT_MAX - 1, true);
	checkDiff(UINT_MAX - 1, UINT_MAX, false);
	checkDiff(UINT_MAX, 0, true);
	checkDiff(UINT_MAX, 1, true);
	checkDiff(0x7FFFFFFFU, 0xFFFFFFFFU, false);
	return 0;
}
```

## 結果

```
OK
OK
-1 is smaller than 1
-2 is smaller than 2
OK
続行するには何かキーを押してください . . .
```

## 考察

引く側と引かれる側をひっくり返したら符号が逆になるだけ。よく考えてみたらそりゃそうだ。
減算の結果が0x80000000以上になる場合にintで受けてたりしたらバグるし、素直にどちらが大きいか判定してから引き算しよう。
node.jsでファイル監視して、変更があったらSFTPして、さらにその機能をデーモン化？する。


##やりたいこと

特定のファイルの変更を監視し、変更があればSFTPで他のサーバにアップロードしたい。
別にscpでもいいのですが、ある案件の要望がSFTPなので、SFTPで試します。

##方針

PHPとかでも[inotify](http://php.net/manual/ja/book.inotify.php) を利用すると目的の機能を実装できるようでしたが、linuxカーネルのバージョンに依存したり、WindowsやMacでは少しやり方を変える必要があったりするようなので、プラットフォーム依存を無くすためにここではnode.jsを利用することにしました。

なお、node.jsの場合は、基本的に実行するconsoleを閉じるとプロセスも終了してしまうので、consoleを閉じたり、ログアウトしても継続的に実行されるようにデーモン化？します。

##必要なツールのインストール

今回は、下記のツール、パッケージ等を利用しました。

* [node 4.3.0](https://nodejs.org/en/)(npm 2.14,12)
* [chokidar](https://github.com/paulmillr/chokidar)（ファイルの状態監視）
* [ssh2](https://github.com/mscdex/ssh2)（SFTP clientとして利用）
* fs（ファイルシステムの利用）
* [forever](https://github.com/foreverjs/forever)（デーモン化）

###インストール

node.js本体のインストールは[こちら](http://qiita.com/zaburo/items/a69ab94f707454a5bbe7)をご覧下さい。
その他のツールは、以下の通りです。

```bash
npm install --save chokidar
npm install ssh2
npm install fs
npm install -g forever
```

##実装

下記の様にしました。基本的には、ファイルの状態監視機能と、その中で呼び出すSFTP機能の実装に大きく別れます。

個別にメモした記事が下記になります（参考まで）。

* [node.jsでファイル変更監視](http://qiita.com/zaburo/items/0280807fe5e59026e41b)
* [node.jsでSFTP](http://qiita.com/zaburo/items/46736a6d1f8c93eecca2)

いろいろ書いていますが、そんなに難しくはありません。
ファイル名はwatch.jsとしました。

```js
//require
var chokidar = require("chokidar");

//chokidarの初期化
var watcher = chokidar.watch('./data/',{
	ignored:/[\/\\]\./,
	persistent:true
});

//イベント定義
watcher.on('ready',function(){

	//ready
	console.log("ready watching...");

	//ファイルの追加
	watcher.on('add',function(path){
		console.log(path + " added.");
	});

	//ファイルの編集
	watcher.on('change',function(path){
		console.log(path + " changed.");
		//upload
		uploadFile(); //下で実装
	});
});

/* uploadFileの実装 ======================================================= */

//Function upload by sftp
var uploadFile = function(){

	var Client = require('ssh2').Client;

	var conn = new Client();
	conn.on('ready',function(){

		//ready
		console.log("ready sftp...");

		//sftp
		conn.sftp(function(err,sftp){

			//throw if error
			if(err) throw err;

			//file path
			var local = "./data/test.txt";
			var remote = "./test_up.txt";
			
			//upload
			sftp.fastPut(local,remote,{},function(err){
				if(err){
					console.log("upload error.");
				}else{
					console.log("uploaded.");
				}
			});
		});

	//connection
	}).connect({
		host: 'servername',
		port:22,
		username:'hoge',
		privateKey:require('fs').readFileSync('/Users/hoge/.ssh/id_rsa'),
		passphrase:'hoge'
	});

}
```

スクリプができたら、デーモン化する前に動作を確認しておきましょう。

```bash
node watch.js
```
とし、指定したフォルダ内のファイルを変更してみます（ここではdata/test.txt）。
アップロードが確認出来たら、デーモン化してみます。

##デーモン化する

デーモン化するためにはforeverライブラリを使えばよいようです。
インストールがまだならインストールします。任意の場所で利用するので-gをつけておきます。

```bash
npm install -g forever
```

foreverのインストールができたなら、スクリプトを登録します。

```bash
forever start watch.js
```

実際に登録されたかは、

```bash
forever list
```

で確認出来ます。
デーモン化を止めたい場合は、

```bash
forever stop watch.js
```
とします。その他、restartというのもあるようです。
Swift2、Btnは接続できるが、LabelのOutletが接続できない

こんな下らない内容で申し訳ないが、ググっても答えがなかなか記述がなかったため、投稿しようと思う。

現在Swift勉強１週間の初心者開発者です。本を見ながら、サンプルプログラムを作成しています。ある時、ButtonのOutlet接続(control+ドラッグ)は問題無く矢印が出てViewControllerに@IBOutletの記述が出来たのだが、LabelのOutlet接続を行おうとすると、矢印は出るのだがViewController上では反応せず、落とすことができない。

ここから、「swift2 label　接続できない」など30分程Google先生に尋ねていたが、なかなか解決策が見つからない。

その後、自力で解決できたので記載します↓↓↓↓
原因は本当にしょうもなかった。

アプリケーションの画面全体が収まるように、storyboardの画面を縮小していた影響で、LabelからOutlet接続の矢印を出していたつもりが、縮小しすぎていたせいでアプリケーション全体からの矢印が出ていることになっていて、ViewController上にドロップ出来なかった。

**つまり解決策は、storyboardの画面を拡大し、部品部品からしっかりと矢印が出ているのかを確認することが重要でした。**


初心者の悩みとは、思いもよらぬところがあって、誰かがプログラムを諦めない手助けになればいいなと思います。
bash > 日付がおかしな部分を探す > $ diff <(sort file.dat) <(cat file.dat)

```txt:動作環境
CentOS 6.5 (64bit)
bash
```

### データ

dd/mm/yyyy hh:nn:ss形式の日時とデータがあるとする。

以下のファイルに１行おかしなものがある。それを見つけたい。
(日時に重複がある)

```file.dat
10/02/2016 22:02:46 3.141592
10/02/2016 22:02:48 3.141592
10/02/2016 22:02:50 3.141592
10/02/2016 22:02:52 3.141592
10/02/2016 22:02:54 3.141592
10/02/2016 22:02:56 3.141592
10/02/2016 22:02:58 3.141592
10/02/2016 22:03:00 3.141592
10/02/2016 22:03:02 3.141592
10/02/2016 22:03:04 3.141592
10/02/2016 22:03:06 3.141592
10/02/2016 22:03:08 3.141592
10/02/2016 22:03:10 3.141592
10/02/2016 22:03:12 3.141592
10/02/2016 22:03:14 3.141592
10/02/2016 22:03:16 3.141592
10/02/2016 22:03:18 3.141592
10/02/2016 22:03:20 3.141592
10/03/2016 22:03:20 3.141592
10/02/2016 22:03:22 3.141592
10/02/2016 22:03:24 3.141592
10/02/2016 22:03:26 3.141592
10/02/2016 22:03:28 3.141592
10/02/2016 22:03:30 3.141592
10/02/2016 22:03:32 3.141592
10/02/2016 22:03:34 3.141592
10/02/2016 22:03:36 3.141592
10/02/2016 22:03:38 3.141592
10/02/2016 22:03:40 3.141592
10/02/2016 22:03:42 3.141592
10/02/2016 22:03:44 3.141592
10/02/2016 22:03:46 3.141592
10/02/2016 22:03:48 3.141592
10/02/2016 22:03:50 3.141592
10/02/2016 22:03:52 3.141592
10/02/2016 22:03:54 3.141592
10/02/2016 22:03:56 3.141592
10/02/2016 22:03:58 3.141592
10/02/2016 22:04:00 3.141592
10/02/2016 22:04:02 3.141592
10/02/2016 22:04:04 3.141592
10/02/2016 22:04:06 3.141592
10/02/2016 22:04:08 3.141592
```

### 方法

```
$ diff <(sort file.dat) <(cat file.dat)
```

### 結果

```
18a19
> 10/03/2016 22:03:20 3.141592
43d43
< 10/03/2016 22:03:20 3.141592
```

ちなみに`<`と`(`の間に空白を入れると失敗する。
`bash: 期待してない token `sort' のあたりにシンタックスエラー`
というエラーが出た。

参考: http://shibainu55.blog137.fc2.com/blog-entry-22.html
参考: http://qiita.com/y_310/items/d1822d31a8685dd46202
サービス名に「code」が付くプログラミングサービスまとめ

# Code.org
https://code.org/

# Codecademy
https://www.codecademy.com/

# CodeCamp
https://codecamp.jp/

# CodeStudy
http://jeek.jp/study/exp

# CodeStart
http://codestart.me

# CodeiQ
https://codeiq.jp/

# CodeShare
https://codeshare.io/

# CodeLearn
http://www.codelearn.org/

# CodeWrite
http://codewrite.cs.auckland.ac.nz/
Goでディレクトリ&ファイル名を指定してビルド

# 背景
go buildしたらワーキングディレクトリ直下に実行ファイルが生成された
⇒ここじゃやだ、毎回移動するのめんどい

ってのが背景です。
調べた・・・

「-o」ってオプションでできそうです。


# やってみる
[コチラ](http://qiita.com/kanuma1984/items/e01e67539a9f630a6475)のプロジェクトを使ってやってみます。


```bash
# 出力先はsrcと同階層のbinディレクトリの下
$ go build -o ../../bin/v1

# treeで見てみる
$ cd /tmp/vendor-test
$ tree
.
├── bin
│   └── v1
└── src
    └── v1
        ├── glide.lock
        ├── glide.yaml
        ├── main.go
```
できてる！
いいね！

だが待て・・・動かなければ意味がない

```bash
# 移動
$ cd /tmp/vendor-test/bin

# 実行
$ ./v1
2016/02/11 14:31:30.470609 Starting Goji on [::]:8000
```
起動できてる！
node.jsでSFTP(SSH)する


node.jsのスクリプト中でSFTP(SSH)したい。どうやらssh2というライブラリで簡単にできるようなのでそれを利用してみます。

>他にもいろいろパッケージがあるようでしたが、認証にkeyが使えることなどから、ssh2をチョイスしました。

##環境

* node.jsはこの機会にLTSの4.3.0を利用しました。
* テストはMac上で、本番はCentOS6.x(6.7)です。

##インストール

* ssh2のインストール
* sshのkeyを指定するのに必要なのでfsもインストールします。

```bash
npm install chokidar --save
npm install fs
```

##実装

sftp.jsというファイルを用意し、下記のように記述しました。
とりあえずローカルからリモートへのアップロードがしたいので、それをテストしてみました。

```js
var Client = require('ssh2').Client;

var conn = new Client();
conn.on('ready',function(){

	//ready
	console.log('ready sftp...');

	//sftp
	conn.sftp(function(err,sftp){

		//throw if error
		if(err) throw err;

		//file path
		var local = "./test.txt";
		var remote = "./test_up.txt";
		
		//upload
		sftp.fastPut(local,remote,{},function(err){
			if(err){
				console.log("upload error.");
			}else{
				console.log("uploaded.");
			}
		});
	});

//connection
}).connect({
	host: 'servername',
	port:22,
	username:'hoge',
	privateKey:require('fs').readFileSync('/Users/hoge/.ssh/id_rsa'),
	passphrase:'hoge'
});
```

##実行

下記のように実行します。

```bash
node sftp.js
```

リモートサーバーにtest_up.txtというファイルがアップロードされていればOKです。
node.jsでファイルの変更を検出して何かする


「ファイルの変更を監視してUpdateされたら、そのファイルをSFTPする」という要件が出てきたのでどう実現しようかと考え、最初Gulp使おうかなと思ったのですが、そもそもnode.jsでやったほうが汎用性が高いかな・・・と思い、node.jsでやることにしました。

SFTPであれ、なんであれ、まずはファイル変更のイベントを拾えないと行けないので、そこまでを書きます。

##方針

いくつかのやり方があるようですが、その用途に特化したchokidarというライブラリがあるようなのでそれを利用しました。

##環境

* node.jsはこの機会にLTSの4.3.0を利用しました。
* テストはMac上で、本番はCentOS6.x(6.7)です。

##インストール

* chokidarのインストール
* sshのkeyを指定するのに必要なのでfsもインストールします。

```bash
npm install chokidar --save
npm install fs
```

##実装

watch.jsとして下記のようにしました。on().on().on()というようにチェーンメソッドで繋げることも出来うようですが、ここでは、on('ready',function(){});のクロージャの中に定義することにしました。

カレントにdataというフォルダを作成し、その中を監視します。

```js
//require
var chokidar = require("chokidar");

//chokidarの初期化
var watcher = chokidar.watch('./data/',{
	ignored:/[\/\\]\./,
	persistent:true
});

//イベント定義
watcher.on('ready',function(){

	//準備完了
	console.log("ready watching...");

	//ファイルの追加
	watcher.on('add',function(path){
		console.log(path + " added.");
	});

	//ファイルの編集
	watcher.on('change',function(path){
		console.log(path + " changed.");
		uploadFile();
	});
});
```

##実行

下記のように実行します。

```bash
node watch.js
```

dataフォルダに対して、test2.txtを追加し、さらに、変更すると下記のように表示されます。
どうやら無事、イベントが拾えているようです。

```bash
ready watching...
data/test2.txt added.
data/test2.txt changed.
```

ファイルの変更監視としては以上です。
block要素をcssだけで簡単に上下中央揃えにする

背景のブロックに画像を入れて、その上に上下中央揃えで何かしら要素を置くのに一番いいと思う方法。

"display: table-cell" も使いませんし、"top: 50%; left: 50%" として margin にマイナスの値を設定するということでもないのが便利です。

```sample.html
<div class="wrapper">
	<img class="bg" src="/img/dummy.jpg" alt="">
	<ul class="menu">
		<li><a href="#"><img src="menu1.png" alt="menu1">
		<li><a href="#"><img src="menu2.png" alt="menu2">
		<li><a href="#"><img src="menu3.png" alt="menu3">
		<li><a href="#"><img src="menu4.png" alt="menu4">
	</ul>
</div>
```

```sample.css
.wrapper {
	position: relative;
}
.bg {
	width: 100%; /* 比率を変えずに全画面に置く */
	height: auto;
}
.menu {
	position: absolute;
	top: 0;
	bottom: 0;
	left: 0;
	right: 0;
	margin:auto;
	width: 100px; /* 任意のサイズ */
	height: 100px; /* 任意のサイズ */
}
```

これだけで上下中央揃いになります。

縦長のページ構成で、各ブロックに背景画像を設定する様な最近はやりのレイアウトで利用できます。