OmniAICreator/Qiita-1.07M huggingface dataset:
配列やハッシュで合計値を求める時の書き方まとめ

Rubyで配列やハッシュで合計値を求めたい時の書き方たち

# 配列
## 配列に入っている値すべてを合計したい時

```ruby
# 配列に入っている値すべてを合計したい時
array = [1,2,3,4,5,6,7,8,9,10]
array.inject(:+)
```

- Railsだと以下のようにも書けます

```ruby
# 配列に入っている値すべてを合計したい
array = [1,2,3,4,5,6,7,8,9,10]
array.sum
```

## 条件を満たすものだけを合計したい

```ruby
# 偶数のものだけを合計したい
array = [1,2,3,4,5,6,7,8,9,10]
array.select{ |num| num %2 == 0 }.inject(:+)
```
selectは、条件に合う要素だけで新しく配列を作ります。
新しく作られた配列に対して、合計します。
http://ref.xaio.jp/ruby/classes/array/select

Ruby2.4からはsumが使えるようになったのでsumを使って書いたほうが簡潔でわかりやすくかけます。

```ruby
# 偶数のものだけを合計したい
array = [1,2,3,4,5,6,7,8,9,10]
array.sum{ |num| num %2 == 0 }
```

# Hash
## Hashに入っているすべてのvalueを合計したい

```ruby
# すべてのvalueを合計したい
hash = {a: 10, b: 20, c: 30, d: 40, f: 50}
hash.values.inject(:+)
```


# 配列内のハッシュ
## 特定のkeyのvalueだけ合計したい

```rb
# keyがnumberのvalueを合計したい
scores = [{ id: 1, number: 20 }, { id: 2, number: 30}, { id: 3, number: 40}]
scores.inject(0) {|sum, hash| sum + hash[:number]}
```

- Railsだと以下のようにも書けます

```ruby
# keyがnumberのvalueを合計したい
scores = [{ id: 1, number: 20 }, { id: 2, number: 30}, { id: 3, number: 40}]
scores.sum { |hash| hash[:number]}
```
任意に並び替えができる機能(ranked-model)でElasticsearchを使ったらハマった


# 背景

私が開発しているサービスに、いわゆる「Trello的な」並び替え機能があります。

これと Elasticsearch を使った全文検索を併用しようとして若干ハマったので記事にしました。

主に Ruby on Rails の話になります。

![formrun-drag.gif](https://qiita-image-store.s3.amazonaws.com/0/10272/5878c046-8c40-0acf-5c93-9b6ec92510bb.gif)



# 並び替えの仕組み


並び替えには、 [ranked-model](https://github.com/mixonic/ranked-model) という gem を利用しています。

これは、 データに `row_order` というカラムを持たせて、それによってソートをするのですが、差し込んだ時の全体の再配置やリバランスを自動的に行なってくれるものです。

差し込む場所は、ちょうど中間地点にくるように計算されます。

ちなみに、開発はそんなにアクティブではありません。

![ボード | formrun.zwe9m.2016-12-21.午後8時-42-10.png](https://qiita-image-store.s3.amazonaws.com/0/10272/cc9a1882-0679-ffeb-09a0-643dc6ae0656.png)



# 並び替えの難点

`row_order` というカラムは MySQLで言う `Integer` に保存されるのですが、ご存知の通りいろいろと問題があります。

- 隣接した整数の間に差し込むことができない（例: 100と101の間に整数はない）
- 最大値と最小値があるのでそれより外側に配置できない（例: 2147483647より大きい整数はない）

これを解決するために、ranked-modelは、差し込もうとしている位置に *無理* がある場合に、全体を1つずつ移動させたり、差し込めるように両側の値を外側に移動させたりしてくれるヘルパーを持っています。

この gem の価値はここのロジックにあります。これをライブラリ中では `rearrange` や `rebalance` と呼んでいます。
以降、この動作のことを記事では「リバランス」と呼びます。



# リバランスの問題点

ところが、このリバランスはElasticsearchと併用しようとすると、問題点が出てきます。

それは、リバランスの動作が `update_all` で行われているので、コールバックを指定できないという点です。

その為、リバランス後の値をElasticsearchに反映させるタイミングがわからなくなります。

しかも、リバランスは常に行われるわけでは無いので、「変更があれば全てElasticsearchに変更を送る」というのは無駄が多すぎます。



# パッチで対応

そこで、リバランスを行うメソッドにコールバックを設定できるようなパッチを当てることで対応しました。

これを利用すると、モデルに `after_rearrange_ranks` と `after_rebalance_ranks` というメソッドがある時に、コールバックとして実行してくれるようになります。


```rb:ranked-model-patch.rb
module RankedModel::MapperExtensions
  private

  def rearrange_ranks
    super
    if instance.respond_to?(:after_rearrange_ranks)
      instance.after_rearrange_ranks
    end
  end

  def rebalance_ranks
    super
    if instance.respond_to?(:after_rebalance_ranks)
      instance.after_rebalance_ranks
    end
  end
end

class RankedModel::Ranker::Mapper
  prepend RankedModel::MapperExtensions
end
```


```rb:model.rb
class Model < ActiveRecord::Base
  # Sidekiqなどでテキトウに更新させる
  def after_rearrange_ranks
    Model::RebalanceRanksWorker.perform_async(...)
  end

  def after_rebalance_ranks
    after_rearrange_ranks
  end
end
```


# 考察


Trelloはどうやって解決しているのかいろいろ試してみましたが、そもそも検索結果と並び替えは併用していませんでした。
しかも、検索の反映まで数秒以上はかかるみたいです。
やっぱり、こういった検索・フィルタリングの精度とリアルタイム性はトレードオフの関係にあるのかなぁ

### ▼Trelloの検索はあくまでも「検索結果」で、ボードのフィルタリングとしては作用しない

![* テスト | Trello.yiimy.2016-12-21.午後9時-07-48.png](https://qiita-image-store.s3.amazonaws.com/0/10272/24d8427a-4613-c647-5d47-6f1a625ef9ff.png)

### ▼自分のサービスは「フィルタリング」として作用する
![ボード | formrun.kfcrt.2016-12-21.午後9時-10-50.png](https://qiita-image-store.s3.amazonaws.com/0/10272/99ca7a02-b7e2-5516-9669-59607441e4f8.png)
はじめてのofxPDF

この記事はクリエイティブコーディング Advent Calendar 2016の21日目のものです!

ofxPDFへの憧れを実装しました。
温かく見守ってください。

#よくわからないけどやってみる


[こちら](https://github.com/satoruhiga/ofws20014/blob/master/oFws.md)と[こちら](https://github.com/satoruhiga/ofws20014/blob/master/oFws.md)を参考にとにかく触ってみます。

# いざ
まずは、[ここ](https://github.com/satoruhiga/ofxPDF)からDownload zipしてきます。
![satoruhiga_ofxPDF_ PDF file loader. same interface with ofxSvg.jpg](https://qiita-image-store.s3.amazonaws.com/0/139948/4871fd40-7519-17d4-5934-2674fd149efd.jpeg)

それから、of_v0.9.x・・・・・/addonsの下に解凍。(解凍すると-masterが付いてますが、-masterは消しました)
![ofxPDF.jpg](https://qiita-image-store.s3.amazonaws.com/0/139948/bd5f7e62-4fdd-8bce-f618-06b0b4dac3be.jpeg)

ｐrojectGeneratorを立ち上げて
![openFrameworks Project Generator.jpg](https://qiita-image-store.s3.amazonaws.com/0/139948/d65121c1-2c86-b4c8-59b5-c1ab2a3a354f.jpeg)
こんな感じです。からのGenerateを押します。
![openFrameworks Project Generator-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/139948/96b8fae4-0796-d6d8-12a0-3ad9232188f2.jpeg)

Open in IDE出来るようになったのが便利ですね！ということで、Open in IDE☆

# こっからが本番
まずは、![data-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/139948/a85e0147-451d-30cb-527e-2739b10f3721.jpeg)
bin/data の下に表示したいpdfファイルをおきました。

そして、コーディング＼(^o^)／

```openframeworks:ofApp.h
#pragma once

#include "ofMain.h"
#include "ofxPDF.h"

class ofApp : public ofBaseApp{

	public:
        ofxPDF pdf;
		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 mouseEntered(int x, int y);
		void mouseExited(int x, int y);
		void windowResized(int w, int h);
		void dragEvent(ofDragInfo dragInfo);
		void gotMessage(ofMessage msg);
    
		
};

```
```openframeworks:ofApp.cpp
//--------------------------------------------------------------
void ofApp::setup(){
    pdf.loadPDF("xmas.pdf");
}

//--------------------------------------------------------------
void ofApp::update(){

}

//--------------------------------------------------------------
void ofApp::draw(){
    pdf.draw();
}
```
pdfの表示だけなら、これだけです。

## できた！
![ofxPDF_XmasDebug.jpg](https://qiita-image-store.s3.amazonaws.com/0/139948/7350ca5b-dcd0-995b-6d57-b35812e25876.jpeg)

と思ったら、真っ白です。
**普通のｐｄｆだと表示されません。**

テキストや図形をアウトライン化したしたもの限定だそうです。

## 気を取り直して
テキストをアウトライン化したpdfをつくります。
通常はAdobeのIllustratorがあればいいんですが、ない方は
http://ipodtouchmtb.blogspot.jp/2012/06/illustrator.html
こちらを参考に。そしてようやく

# できた♡
![スクリーンショット 2016-12-21 20.22.32.png](https://qiita-image-store.s3.amazonaws.com/0/139948/679f288e-275b-2752-08a4-6b4c7677a7df.png)



温かく見守ってくださりありがとうございました。
幸せなクリスマスが来ますように♡
ご指摘あればお願いします。
pythonでfp-growthをやってみた

# そもそもの経緯
 - R使えない。てかなんか重くてつかたくない
 - 後々並列処理できたらいいなって思ってるし・・・
 - ということでむりやりpythonでやります

## fp-growth
 - ちょっと研究でパターンマイニングをして集計したく、使う
 - ぐぐってもまぁー日本語少ない
 - ライブラリ探しの旅
 - んで出てきたのがこれ
 - https://github.com/evandempsey/fp-growth

## READMEにあるやつをやる
まずはインストール

```
pip install pyfpgrowth
```

python起動して

```
>>> import pyfpgrowth                                                          
>>> transactions = [[1, 2, 5],                                                 
...                 [2, 4],                                                    
...                 [2, 3],                                                    
...                 [1, 2, 4],                                                 
...                 [1, 3],                                                    
...                 [2, 3],                                                    
...                 [1, 3],                                                    
...                 [1, 2, 3, 5],                                              
...                 [1, 2, 3]]                                                 
>>> patterns = pyfpgrowth.find_frequent_patterns(transactions, 2)              
>>> print patterns                                                             
{(1, 2): 4, (1, 2, 3): 2, (1, 3): 4, (1,): 6, (2,): 7, (2, 4): 2, (1, 5): 2, (5,): 2, (2, 3): 4, (2, 5): 2, (4,): 2, (1, 2, 5): 2} 
```

なんかぽいのでた。
でもなんか値がソートされてるのでてるし1→2と2→1を区別できないのかなぁって思った。
DevOpsの重要なポイントについて

###■初めに
こんにちは、ヘルスケア事業本部 技術統括部 開発部の馮晨です。
昔から、言語を問わずに、文書を書くのが大の苦手です。
今回DevOpsに関して、自分が理解していることや考えていることをできるだけまとめてみました。
長文になりましたが、どうぞよろしくお願いいたします。

###■DevOpsとは
Wikipediaでは、DevOpsを以下のように定義しています。
「DevOps（デブオプス）は、ソフトウェア開発手法の一つ。開発 (Development) と運用 (Operations) を組み合わせたかばん語であり、開発担当者と運用担当者が連携して協力する開発手法をさす。」
この定義でわかるものは、開発と運用を連携するというポイントがあります。しかし、なぜこのような「連携」が必要でしょうか？下記の問題点を見てください。

###■問題点
「連携」が必要となる原因はいろいろあります。最も重要な原因は、現場では開発作業と運用作業は「分断されている」という状態はよく発生します。開発と運用の間に起きるほとんどの問題は、上記の状態によるものだと考えています。

一つよくある例を挙げます。ある会社は新しいソフトウェア製品を出したいとします。

開発部門は最新の技術を利用し、新製品を開発しようとしています。この製品は最新のプラットフォームで実行することを想定し、しかもリリースまでの期間はとても短い。以上の状況よって、開発チームはたくさん残業してコーティングし、予定通り開発を完了させました。そして、彼らは自分の「傑作」を運用部門に渡しました。
しかし、運用部のメンバーはとても不安を感じています。運用部メンバーの不安は以下によるものです。

- 今回の製品は、現在運用中のプラットフォームでは実行できません。その理由として、既存のプラットフォームは①古すぎる。②キャパシティーが足りない。③ソフトウェアが使用しているライブラリのバージョンをサポートしない。
- 今回の製品の推奨環境は、既存の①データストア②ネットワーク③デプロイ④セキュリティなどの環境と異なる。
- 運用部はこの製品の①エラー報告②監視③バックアップなどの機能を理解しきれていないため、サービスとして提供できない。

運用部はいろんな努力を果たして、ようやく製品を運用し始めました。しかし、環境に配備するために、製品に想定外な改修を行ったため、運用中の製品はたくさんなエラーが発生しました。運用部は発生した問題を開発チームに問い合わせると、以下のような返事をもらいました。

- 開発部が作成したコードは完璧だ。
- 運用部は最新の技術を理解できていない。
- 製品は開発側の環境で問題なく実行できている。

やがて、両部門は製品を巡って言い争いとなり、会社や他のステークホルダーは多大な損失を与えました。結果、プロジェクトは「失敗」となりました。

###■DevOpsはどう違うのか
DevOpsは上記のような「失敗」を回避するための考え方となります。DevOpsでは、開発部と運用部の共同作業を主張し、そのためにいろいろな作業プロセスやツールを提供しています。DevOpsを導入すると、両部門コミュニケーション効果を向上し、自動化、監視、バックアップ、リストア、セキュリティなどいろんな方面にたいして改善することが可能となります。
「DevOpsは何ですか？」という質問に対して、仕事の経験によって様々な答えを得られます。私が考えているDevOps以下**四つのポイント**になります。

**・シンプルに作る**
KISS原則（Keep It Simple and Stupid）はとても大事です。簡単な設計・実装はコミュニケーションの速度を向上し、開発と運用時のミスを減らすことも可能になります。さらに、製品のリリース周期の短縮にも繋がります。

**・部門間の連携作業**
製品の開発において、運用部のメンバーをすべての開発フローに参与させることはとても重要だと思います。例えば、運用部のメンバーをスプリント計画会議や朝会に誘ったり、プロジェクトの計画や技術アイデアを共有したりすると、運用部のメンバーがプロジェクトに対する理解を深めることができます。運用部のメンバーがプロジェクトの構成や中核の部分を知れば知るほど、実際に問題発生時の対応時間は短縮ことが可能になります。
また、問題発生時に、運用側は開発部のメンバーを誘って一緒に解決すると、問題解決の効率は向上することができます。開発メンバーを運用部の会議に誘うことによって、運用計画を共有することができます。逆に、誘った開発メンバーから今後の開発方針や最新技術を運用側に共有し、開発側で採用されているアジャイル開発、看板管理、スクラムなどの手法を運用に導入することで、運用側の環境やプロセスの改善も可能だと考えています。

**・作業プロセス**
開発、運用において、いろいろな作業プロセスが存在しています。しかし、作業プロセスによくある問題点とは理想化し過ぎ：各ステップは前のステップが成功する前提で作られています。ただし、作業は必ず順序よく進めるとは限らない、作業途中で何かの問題が発生時の対応方法を考慮し、問題発生しても進めるように考える必要があります。
また、作業プロセスにできるだけ自動化ツールを使用することも大事です。人間はミスをします。作業中に起こるミスを最小限に抑えるには、手作業の代わりに自動ツールで作業を行うことだと考えています。適切な自動ツールを作業プロセスに加えることによって、作業を効率化も可能となり、新メンバーに対するトレーニングコストも削減できます。

**・継続的改善**
現在、技術は日々進化しています。ユーザーのリクエストも同様に進化しています。ユーザーのリクエストを満たすために、常に新しい技術を開発、運用プロセスに取り入れることは大切です。そして、開発途中においてコードの継続的改善もとても重要なポイントになります。コード分析ツールを導入できれば、障害の原因を迅速に突き止め、問題が発生する前にリスクを解消することも可能です。
問題発生時、運用チームと開発チームは協力し、一緒に問題の解決に取り掛かったほうがいいと考えています。ときに開発側の小さなリファクタリングで大きな問題を防ぎ、運用チームの負担を減らすことが可能になります。

###■終わりに
今回はDevOpsの基本概念と自分が理解したDevOpsについて話しました。
実際に担当しているルナルナサイトの開発・運用プロセスを振り返ると、DevOpsの思想ややり方と相違する部分は多々あります。実際に現場で発生した問題をDevOpsの知識に当てはまると、いろいろと納得しました。
今後、DevOpsの勉強を続き、開発現場の問題点を改善できるツールやプロセスを導入していきたいと思います。
Serverlessとは何なのかと言われて答えられなかったため調べた。

#問い

Serverlessとは何か？

#答え

すみません、よくわかっていませんでした。

という経験をしたので、反省の意味も込めて調べてみました。

#サーバーレスとは
まず、Qiitaで検索してみたところ[サーバーレスアーキテクチャという技術分野についての簡単な調査](http://qiita.com/zerobase/items/3bc0d15980b472af841d)という記事が見つかりました。

この記事によるとサーバレスについて以下のような記述がありました。

>アプリケーションサーバーが「常駐型プロセス」を実行するインフラストラクチャだとすれば、サーバーレスアーキテクチャは「非常駐型プロセス」をイベントによってトリガーするインフラストラクチャだといえるだろう。

ちょっと難しいですが、非常駐のプロセスがイベント駆動するとサーバーレスという事になるみたいです。
という話を、元の質問者に返したところ「それはCGIとはどう違うの？」となりました。

それでは、という事でCGIとサーバーレスの違いをググってみたところ、[伊藤直也氏が語る、サーバーレスアーキテクチャの性質を解剖する（中編）。QCon Tokyo 2016](http://www.publickey1.jp/blog/16/qcon_tokyo_2016_1.html)という記事を見つけました。

こちらによると・・・

>CGIはリクエスト毎に実行、終わったら破棄

とあります。また、

>しかし問題だったのは、起動するたびにアプリ全体がフォークされていたので、実行の効率がとても悪くて、以前はホスティングサービスでみんながCGIを動かしているとすごくサーバが遅くなったと。

と書いてあるように、CGIとの違いはどうやらアプリケーション全体をフォークするかどうかという点にありそうです。

なんとなくわかってきたのでもう少しググってみました。ずばり[Serverless Architectures](http://martinfowler.com/articles/serverless.html)というアーティクルがあったので、拙い英語力で読んでみました。

ポイントは、たぶん「FaaS（Function as a Service)」ということなんだと思います。
前述のCGIとからめると、単機能なCGIであればほぼサーバーレスと言っていいのかな？と思いつつ読み進めてみましたが、中段のところで、PaaSとの大きな違いはスケールについて考慮する必要が無い事だ、と書いてあるような気がします。

#まとめ

ということでサーバーレスの私なりの理解としては、こうなりました。

* 機能単位に分割された部品を
* 勝手にスケールする所に配置して使う
* それらを使ってマイクロサービスを運用する


#ところで・・・

ちょっと寄り道して、Amazonで書籍を検索してみました。

https://www.amazon.co.jp/s/field-keywords=Serverless

ん？AWS Lambdaの本しか無いぞ・・・
Python > 個人メモ > PEP-0008要約 > Programming Recommendations節のみ / PEP8チェックツールの試用

[Python_PEP-0008要約_161121 @ mindmup](https://atlas.mindmup.com/yasokada/python_pep_0008_161221/index.html)

- 個人メモです
- 原書(2016/12/21)の和訳、要約です
- Python入門者の理解です
- 記載内容間違いがあるかもです

Unity(C#), C, C++, Python, R, bash script, Fortran 77, Fortran90それぞれ異なるCoding規約を眺めて幾星霜。
記憶力の良くない7of9には、各言語実装時にそれぞれのコーディング規約を思い出すというのが難しい。

こういう資料が将来の自分に役立つかどうか。

Linterなどでcoding ruleチェックも面倒見てくれればいいなぁ。

<hr>
(追記 2016/12/23)

http://qiita.com/clarinet758/items/312e95ee1513560dfdd1
> pyflakesの方は動作がエラーになるような部分の文法チェックや使ってないモジュールを教えてくれる。
pep8の方はpep8のコーディングルール通りかのチェックを行う。

すでにありましたか。

情報感謝です。

使用してみました。

```
$ pep8 read_chpoint.py
read_chpoint.py:7:1: W191 indentation contains tabs
read_chpoint.py:9:1: W191 indentation contains tabs
read_chpoint.py:10:1: W191 indentation contains tabs
read_chpoint.py:12:1: W191 indentation contains tabs
read_chpoint.py:13:1: W191 indentation contains tabs
...
```

86個のルール違反が見つかりました。
すごくいいですね!
Graphite + Ceres の環境構築

#はじめに

Graphite には標準のストレージエンジンのWhisperがありますが、Ceresという別のストレージエンジンもサポートしています。
Whisperは固定長のデータファイルを使用しますが、Ceresはツリー型のデータ構造となっており、必要以上のデータを持たないので、ディスクの節約になる場合があります。

# Graphiteのインストール

まずは最新のGraphiteをインストールしましょう。CentOS 7を想定しています。

rootでの作業：

```
yum install python-virtualenv
yum install libffi-devel
```

一般ユーザでの作業：

```
virtualenv env
source env/bin/activate

pip install cffi
pip install cairocffi
pip install incremental
pip install Django==1.9.12 django-tagging==0.4.3
pip install constantly fadvise gunicorn mocker
pip install pycparser pyparsing==2.0.7 pytz python-memcached
pip install simplejson txAMQP uWSGI whitenoise zope.interface Twisted

pip install https://github.com/graphite-project/ceres/tarball/master
pip install https://github.com/graphite-project/whisper/tarball/master
git clone https://github.com/graphite-project/graphite-web.git

python setup.py install 
   --install-data=~/var/data/ \
   --install-lib=~/usr/graphite/webapp \
   --install-scripts=~/usr/graphite/bin
```

初期設定：

```
cd ~/usr/graphite/webapp/graphite
mv local_settings.py.example local_settings.py
vi local_settings.py
  # GRAPHITE_ROOTの修正（~/var/data/をフルパスで指定）

# DBの初期化
PYTHONPATH=~/usr/graphite/webapp django-admin.py migrate \
  --run-syncdb --settings=graphite.settings
```

ストレージエンジンの変更（Whisper->Ceres）：
~/usr/graphite/webapp/graphite/settings.pyを以下のように修正

```
STORAGE_FINDERS = (
    'graphite.finders.ceres.CeresFinder',
)
```

# Graphiteの起動


```
PYTHONPATH=~/usr/graphite/webapp uwsgi --http :8080 \
   --wsgi-file ~/usr/graphite/webapp/graphite/wsgi.py \
   --static-map=/static=$(pwd)/var/data/webapp/content/
```

# テストデータの登録

`ceres-node-create`, `ceres-node-write` などのコマンドが使用できます。
 
```
# ツリーの作成
cd ~/var/data/storage/ceres/
ceres-tree-create test

# ノードの作成
ceres-node-create test/node1 
ceres-node-create test/node2 --step 60  (解像度を60秒に設定)

# データの登録
ceres-node-write test/node1 N:1
ceres-node-write test/node2 N:1
（Nを指定すると現在時刻になります）

# ランダムにいれてみる
ceres-node-write test/node1 1482304620:$RANDOM
ceres-node-write test/node1 1482304680:$RANDOM
ceres-node-write test/node1 1482304740:$RANDOM
```

# Graphite-webからの確認

うまくデータが入っていれば、このように表示されるでしょう。

![graphite.png](https://qiita-image-store.s3.amazonaws.com/0/130972/c7c0c14e-1402-dbd2-021c-d64c4f4ccec0.png)

# 総括

Ceresはデータサイズの抑制には効果があり、パフォーマンスアップも期待できますが、（Whisperにもある）スケールアウトの問題は解決できません。ですがメトリックスが多い場合、それなりにメリットはあるでしょう。

一つ問題は、細かいファイルが大量に生成されるため、ディスクのブロックサイズの影響をうけて、特に実データが多い場合、Whisperと比較して何倍もディスクを消費する場合があります。
`convert-wsp-to-ceres`という付属ツールで変換もできるので、実際に検証したほうがいいでしょう。
フォルダを削除するコード。

フォルダが空になったときに、フォルダを削除したいことはよくある。
でも、一見フォルダが空でも、じつはフォルダを削除できないことはある。
隠蔽ファイルがあるためだ。
そこで、キャッシュ系の隠蔽ファイルを削除して、ファイルが0ならフォルダを削除するコード。


```
List<string> folders = new List<string>(Directory.GetDirectories(dataroot, "*", SearchOption.AllDirectories));
folders.Reverse();
string[] notneedfiles = new string[] {"DS_Store", //MacOSXのフォルダ情報ファイル
"Desktop.ini", //Windowsのフォルダ情報ファイル
"Thumbs.db", //Windowsのサムネイルのキャッシュ
"folder$", //WindowsXPの偽フォルダファイル
"_CATALOG.VIX", //VIXのサムネイルのキャッシュ
"_THUMBS_.DVI", //Linarのサムネイルのキャッシュ
"_THUMBNL.SUE", //Susieのサムネイルのキャッシュ
"PREVIEW.PIX", //Painterのサムネイルのキャッシュ
"^folder.jpg$",
"albumart*.jpg",
"ini$"};
string notneeds = "(" + string.Join("|", notneedfiles).ToLower() + ")";
foreach (string folder in folders) {
	List<string> files = new List<string>( Directory.GetFiles(folder, "*"));
	foreach (string file in files)
		//隠しファイルを削除する。
		if (Regex.Match(Path.GetFileName(file).ToLower(), notneeds).Success)
			File.Delete(file);
	files = new List<string>(Directory.GetFiles(folder, "*"));
	files.AddRange(Directory.GetDirectories(folder, "*"));
	if (files.Count == 0)
		Directory.Delete(folder);
}
```
Google app script + REST API v2でファイルを完全削除またはゴミ箱を空にする

# この記事は？
Google Apps Script Advent Calendar 2016の１２月２１日の記事です。
Google app scriptのDrive API には、ファイルをゴミ箱に移動することはできても、
ファイルを完全に削除することやゴミ箱を空にすることはできません。
[リファレンス](https://developers.google.com/apps-script/reference/drive/)を見ても探しても見つからないので、出来ないように思えますが、
Google Drive APIs REST v2を使用することで可能です。

<img width="962" alt="スクリーンショット 2016-12-21 20.12.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/95460/f1abe03b-272c-cda7-3339-a16920b59531.png">
# Google Drive APIs REST v2 とは
Google Drive を外部のアプリケーションから操作するためのAPIです。
公式ページは[こちら](https://developers.google.com/drive/v2/reference/)です。
他のサービスからは認証が大変なのですが、Google App Scriptからは、
とても簡単に操作ができます。
（すでに認証済みの状態でなければGoogle App Scriptを操作できないため）

こちらの[emptyTrashリファレンス](https://developers.google.com/drive/v2/reference/files/emptyTrash)からその効果を試すことが出来ます。
下記の画像の「EXECUTE」のボタンを押してください。
なんと自分のGoogle Driveのゴミ箱が空になります！（間違って押すと大変）

<img width="1276" alt="スクリーンショット 2016-12-21 19.45.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/95460/136cd4fe-2c8c-fbfb-8b21-8ada659c6cd8.png">
#準備
REST API を使用するためには準備が必要です。
##準備１：Google App Script側
**Google App Scriptのメニューにある「リソース＞Googleの拡張サービス…」を選択**

<img width="241" alt="スクリーンショット 2016-12-21 19.55.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/95460/a640ddd1-56b3-3e3d-f308-18abba9e6882.png">

**Drive API (v2)をONにし、OK**

<img width="630" alt="スクリーンショット 2016-12-21 19.56.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/95460/534fe9ef-a559-b063-8780-9b5ce957912b.png">

##準備２：Google APIsでの認証
**Google App Scriptのメニューにある「リソース＞Developers Console プロジェクト…」を選択**

<img width="242" alt="スクリーンショット 2016-12-21 20.11.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/95460/65eb5293-4ae0-3403-e117-9b6838d8a1a5.png">

**関係づけられているプロジェクトの部分をクリック（赤く囲んでいるところ）**

<img width="767" alt="スクリーンショット 2016-12-21 20.10.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/95460/1da65a04-7a1a-5335-e15d-448d76840fcb.png">

**Drive API を有効にする**

<img width="789" alt="スクリーンショット 2016-12-21 20.08.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/95460/3adb50c7-12f0-ff00-90c4-c7345b5577ac.png">
↑driveを検索するとすぐに見つかります。このあと、有効にすかどうかの確認画面が現れます。

#ソースコード
```
//ゴミ箱を完全に空にする
Drive.Files.emptyTrash();

//特定ファイルを削除する（ゴミ箱に入らず完全削除）
Drive.Files.remove("ID");
```
（これだけなので、ビックリしました。）
#補足
なお、特定ファイル完全削除が、deleteではなくremoveなのは
Google App Scriptの予約語でdeleteがあるための処置だと思われます。
#参考記事
[導入ガイド]
https://developers.google.com/drive/v2/web/quickstart/apps-script
[ゴミ箱完全削除のリファレンス]
https://developers.google.com/drive/v2/reference/files/emptyTrash
[特定ファイル削除のリファレンス]
https://developers.google.com/drive/v2/reference/files/delete
さくらのVPSの新しい、標準OS「CentOS 6 x86_64」イメージにマインクラフトサーバを入れるときに iptables でマインクラフトの通信を通すためのコマンド

さくらのVPSの新しい、標準OS「CentOS 6 x86_64」イメージは、2016.12.20より、iptables がデフォルトで有効の設定になったので、そのままではマインクラフトの通信ができない状態になっています。

（参考）[さくらのVPS、標準OS「CentOS 6 x86_64」イメージの仕様変更のご連絡 – さくらのVPSニュース]( http://vps-news.sakura.ad.jp/2016/12/20/centos6update/?_ga=1.151207929.1531166117.1472216710 )

それを通すためのコマンドは以下の通り

```
iptables -I INPUT 6 -p tcp -m state --state NEW -m tcp --dport 25565 -j ACCEPT
service iptables save
service iptables restart
```
ESP8266トレーニングボード「ESXAR」を NeoPixelとかのストリップLEDで遊ぶ

# はじめに設定

「スケッチ」-「ライブラリをインクルード」-「ライブラリを管理」で、「検索をフィルタ」で
NeoPixel　と入力すると、 Adafruit NeoPixel by Adafruitというのが出てくるので選んでインストールボタンを押す。

「ファイル」-「スケッチの例」 に、 Adafruit NeoPixel が出てくるようになる

# 動作確認

NeoPixel。中華製のパチモンを使います。


ESCARの接続ピンは5であるので、
 #define PIN 6
を
 #define PIN 5
に変更する。

ファイル」-「スケッチの例」 に、 Adafruit NeoPixel にサンプルプログラムがある
まずは、simpleでチェック。
緑がつく。



うまくいったら、
srandtest などで遊んでみる

MAXPIXELSをあまり大きくし過ぎると
電圧降下でおかしくなる。
MAXPIXELSを大きくする場合は一度にいっぱい光らせないように工夫。

以下は簡単なデモプログラムです

```
#include <Adafruit_NeoPixel.h>

#define PIN            5
#define NUMPIXELS      16

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int counter=0;
int R=0;
int G=0;
int B=0;
int dR=10;
int dG=10;
int dB=10;

void setup() {
  pixels.begin();
}
void loop() {
    pixels.setPixelColor(counter, pixels.Color(R,G,B));
    pixels.show();
    counter++;
    if ( counter>NUMPIXELS ){
      counter=0;
    }
    R=R+dR;
    if ( R > 255 ){
        R=0;
        dR=random(1,20);
      }
    G=G+dG;
    if ( G > 255 ){
        G=0;
        dG=random(1,20);
      }
    B=B+dB;
    if ( B > 255 ){
        B=0;
        dB=random(1,20);
      }
   
    delay(5);
}
```

なお、NeoPixelのデーターシートはここから辿って下さい
https://www.adafruit.com/products/1138
RaspberryPi初心者がとりあえず設定をしてみる。

ここ最近、謎にRasberryPiを触ることになりました。
やり始めると、、、試して観たくものですね。

今回は簡単初期構築手順を記述します。

パソコン： Mac Book Pro OSX sierra
PaspberryPi : PaspberryPi 3 Model B 
(wifiがデフォ、2.4GHz帯で接続できます。)

## 準備

SDを刺したら、以下のようにボリュームをチェックします。

```
[mac]
$df -h 
/dev/disk2s1    63Mi   21Mi   42Mi    34%     512          0  100%   /Volumes/boot
```

初期化します。
この際、パソコン本体を消さないように注意してください。

```
[mac]
$ diskutil eraseDisk FAT32 RPI  /dev/disk2
Started erase on disk2
Unmounting disk
Creating the partition map
Waiting for partitions to activate
Formatting disk2s2 as MS-DOS (FAT32) with name RPI
512 bytes per physical sector
/dev/rdisk2s2: 61518464 sectors in 1922452 FAT32 clusters (16384 bytes/cluster)
bps=512 spc=32 res=32 nft=2 mid=0xf8 spt=32 hds=255 hid=411648 drv=0x80 bsec=61548544 bspf=15020 rdcl=2 infs=1 bkbs=6
Mounting disk
Finished erase on disk2
```

unmountします。

```
[mac]
$ diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
```


## OSイメージ

### ダウンロード

SDカードへ追加します。

男は黙ってコンソール。
ということでLiteを選択してダウンロードします。

```
$ wget https://downloads.raspberrypi.org/raspbian_lite_latest
### いつもブラウザからやってるので多分こんな感じ
```

HPはこちらから https://www.raspberrypi.org/downloads/raspbian/

### イメージ追加

```
[mac]
$ sudo dd bs=1024m if=2016-11-25-raspbian-jessie-lite.img of=/dev/disk2
Password:
1+1 records in
1+1 records out
1390411776 bytes transferred in 606.236164 secs (2293515 bytes/sec)
```

## PaspberryPi設定

### SDセット

イメージを焼き付けたSDをPaspberryPiにセットします。

### 電源を入れる。

デフォルトは
- ID pi
- PW raspberry
らしいです。

好きなタイミングで変更してください。

### Wifiに接続する

Wifi環境に応じて異なります。

パスフレーズがある場合は
以下のようなコマンドを実行します。

SSID は MohumohuAir
PASSWORD は PASSPHRASE 
としています。

```
[RaspberryPi]
$ #sudo sh -c 'wpa_passphrase MohumohuAir PASSPHRASE >> /etc/wpa_supplicant/wpa_supplicant.conf'
```

パスワードが不要な場合は、
以下のファイルのkey_mgmtをNONEにしてください。

```
[RaspberryPi]
$ sudo cat /etc/wpa_supplicant/wpa_supplicant.conf
country=GB
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
	ssid="MohumohuAir"
	key_mgmt=NONE
}
```

### SSH chkconfig

chkconfigじゃないのか。
まあいいや。
ということでRunLevel3以上がONになる状態にしてください。

```
[RaspberryPi]
$ sudo systemctl enable ssh.service
```

## パッケージ追加・更新

必要に応じてパッケージ追加・更新をしてください。
apt-getの更新は気長にやってください。

```
[RaspberryPi]
### 更新
$ sudo apt-get update
$ sudo apt-get upgrade
```

個人的にvimがないと無能なのでインストールします。

```
### vim の設定 
$ sudo apt-get install vim
```

最低限
ファイヤーウォールぐらいつけます。

```
### インストール
$ sudo apt-get install ufw
###  IPV6を変更します。
$ sudo vi /etc/default/ufw
-   IPV6=yes
+   IPV6=no
### ポートを開ける
$ sudo ufw allow 22
$ sudo ufw allow 80
$ sudo ufw allow 443
### それ以外はイラン！
$ sudo ufw default deny
### 有効化
$ sudo ufw enable
### 確認しよう
$ sudo ufw status
```

### イメージバックアップ
一通り満足したら、逆に吸い出してイメージ化しましょう。

```
$ sudo dd bs=1024m if=/dev/disk2 of=2016-11-25-raspbian-jessie-lite-2.img
```

まあだいたいこれぐらいでしょうか。
Windows + fluentd → CloudWatch Logs を諦めた話

この記事は2016年2月ぐらいに書いて、ずっと下書きのまま放置されてたものです。
確かあとでログとかキャプチャとかを貼ろうとしてて・・・。
現時点で Windows + fluentd → CloudWatch Logs が快適に使えるかどうかは分かりませんが、誰かがコメントくれたりする僅かな可能性もあるかと思い公開します。

- - - - 

AWSのEC2のWindowsにはEC2ConfigというServiceがあり、それを使うとEventLogやIISのログ、任意のアプリケーションログなどをCloudWatch Logsに送ることができます。
しかし現時点では、送信時の形式など柔軟性がいまひとつといった印象です。
Linuxではデータコレクタのfluentd(td-agent)を使ってCloudWatch Logsに送るということもよくやられてるようです。
2015年10月8日にfluentdがWindowsに正式対応したとのことなので、WindowsでもLinuxと同じようにできるか試してみました。
ちなみに僕はfluentdに初めて触りました。

## Windowsへfluentdインストール

使用したのはAWSのWindows Server 2012 R2（EC2, Amazon AMI, 英語版）です。
基本的にはこのサイトに書かれている手順で行いました。
【参考】[Fluentd が Windows を正式サポートしたので動かした](http://sqlazure.jp/r/tool/665/)
検証時のRubyバージョンは2.2.4でした。
起動して標準出力にログがポロポロ出てくるのが確認できました。

「お、なんかいい感じじゃん」

## fluentdプラグインインストール

### fluent-plugin-winevtlog

EventLogの収集もしたかったので[fluent-plugin-winevtlog](https://rubygems.org/gems/fluent-plugin-winevtlog/versions/0.0.3)も試しました。
`gem install fluent-plugin-winevtlog`でインストール。configにEventLogを収集するsourceディレクティブを書いて実行してみるとエラーになりました。

うーむ。なんだかエラー文の中のファイルパスがLinuxっぽい。
どうやらプラグインのインストールと同時にfluentdの別バージョンを参照するようになってしまったらしい。
【参考】[人生楽しまなきゃもったいない！: fluentdをWindowsで使う](http://hayachi617.blogspot.jp/2015/12/fkuentdwindows.html)
こちらの記事を参考にfluentdをアンインストールして再度実行すると無事EventLogを収集することができました。

「まぁ、うん。いいだろ」

### fluent-plugin-cloudwatch-logs

CloudWatch Logsにデータを送るのが最終的な目的です。
[fluent-plugin-cloudwatch-logs](https://rubygems.org/gems/fluent-plugin-cloudwatch-logs/versions/0.0.7)をインストールしました。
案の定、別バーションがインストールされてしまうのでアンインストール。
configにCloudWatch Logsへ送るmatchディレクティブを書いて実行！
エラーです。

僕はRubyはよくわかりません。
`Fluent::SetTimeKeyMixin`が初期化できないっぽいです。
僕はRubyはよくわかりません。
モジュールが足りてないっぽいです。
僕はRubyは(ry

いろいろ調べたりして最終的には`fluent-plugin-cloudwatch-logs-0.2.0\lib\fluent\plugin\out_cloudwatch_logs.rb`の1行目に以下を追記すると起動することができました。

```rb:out_cloudwatch_logs.rb
require 'fluent/mixin'
```
「ここまで手を加えないといけないもんか！？」

## さらなるエラー、そして諦念

起動はできるようになったものの、肝心のCloudWatch Logsへの送信がうまくいってないようでエラーです。
fluentdもRubyも経験値が足りなすぎてここまで来るのに結構時間かかってしまったこともあり、もう調べる気力がなくなりました。

「もうEC2Configでいいかなー」

## まとめ

サクッと「Windows + fluentd → CloudWatch Logs」をやるにはいろいろ時期尚早なのかも。
F# fold,scanの使い方について

#始めに
F#のfold,scanについての覚書をアップします
ついでに、関数のシグネチャの読み方もアップします

#関数のシグネチャの読み方の自分なりのポイントについて
- T,U :イミュータブルな値
- ():リストをトラバースするときに適用する関数、またはラムダ式
- State : ミュータブルな状態を表す。すなわち、関数やラムダ式の適用によって値が変化する値を格納する変数みたいなもの

#ソース
```fsharp
module File4
//fold , scanをつかう
let list = [1;2;3;4;5]
//foldを実行する
List.fold(fun acc b -> acc+b)  0 list |> printfn "%d"  
///foldのシグネチャは以下の通り
///List.fold : ('State -> 'T -> 'State) -> 'State -> 'T list -> 'State
///例として「リストの3番目の要素、3に対して処理を実行するとき 」を取り上げる
///第1引数:('State -> 'T -> 'State) はリストをトラバースするときに適用するラムダ式を渡す
///ラムダ式の引数の内容は以下の通り
   ///第1引数
   ///'State：foldが実行される前の状態が渡される
   ///今回の例では(1+2)が渡される
   ///第2引数
   ///'T：今回の演算対象が渡される 。今回の例では3が渡される
   ///戻り値
   ///'State：リストをトラバースするときに適用した関数の実行結果が設定される
   ///今回の例では第一引数と第二引数の演算結果、すなわち(1+2) + 3が適用される
///第2引数:'State  foldを実行する前の状態を渡す。今回の例では0が設定される
///第3引数:'T list foldの演算対象となるlistを渡すlistの型はリストに格納されている値に依存する
///戻り値 State　第3引数で指定したlistに対して第1引数で渡したラムダ式を適用した結果をを返す
///今回の例では(1+2+3+4+5)、つまり15が返却される


///scanを実行する
///scanのシグネチャは以下の通り
///('State -> 'T -> 'State) -> 'State -> 'T list -> 'State list
///基本的にfoldと使い方は同じだが、最後の戻り値が違う
///戻り値にはscanの0回目～n回目までの実行結果が格納されている
List.scan(fun acc b -> acc+b)  0 list |> printfn "%A"  
```
Vimを使ってapiaryのapibファイルを快適に編集できるようにする

今回はじめてapiaryを使ってAPIドキュメントの作成をやっています。
[API Blueprint 記法を学びながら](https://github.com/apiaryio/api-blueprint/blob/master/API%20Blueprint%20Specification.md#def-uriparameters-section)わりと快適に作業していたのですが、問題発生。

## 発生した問題
- 途中からapiraryのオンラインエディタのvalidationが遅すぎて死んだ
- apiaryの一時的な接続問題か、ブラウザの問題かはわからないが
- しかし、編集するたびにvalidateされるのはうっとうしい
- apiaryのvalidationをdisableする手段が現状ない
- ので、ローカルで編集してpushする方法に切り替えることにした

## [apiblueprint.vim](https://github.com/kylef/apiblueprint.vim)導入
API Blueprintのシンタックスハイライトとlintチェックをやってくださるプラグイン。

### 依存関係の[syntastic](https://github.com/vim-syntastic/syntastic)をインスコ
Vim周りのいろんなシンタックスチェックをがんばってくれるプラグイン。

```.vimrc
call dein#add('vim-syntastic/syntastic')

set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0
```

### 依存関係の[drafter](https://github.com/apiaryio/drafter#install)をインスコ
API Blueprintのvalidationを手伝ってくれるコマンドラインツール。

```
$ brew install --HEAD \
  https://raw.github.com/apiaryio/drafter/master/tools/homebrew/drafter.rb
```

### おまちかねの[apiblueprint.vim](https://github.com/kylef/apiblueprint.vim)をインスコ
```.vimrc
call dein#add('kylef/apiblueprint.vim')
```

### 便利な[Tagbar](https://github.com/majutsushi/tagbar)もインスコ
クラスとか関数のoutlineを表示してくれるプラグイン。

依存関係の[Exuberant ctags 5.5](http://ctags.sourceforge.net/)をインスコ

```
$ brew install ctags-exuberant
```

```.vimrc
call dein#add('majutsushi/tagbar')

nmap <F8> :TagbarToggle<CR>
nmap <F9> :TagbarShowTag<CR>
```

### apiblueprint.vimはjsonの構文チェックしてくれないので[vim-json](https://github.com/elzr/vim-json)もインスコ
jsonのシンタックスハイライト、構文チェックしてくれる。jsonの可読性をあげる`concealing`機能が超いい。

```
call dein#add('elzr/vim-json')
```

以上。

ごにょごにょ作業に時間食ったが、快適に過ごせそう〜
React Nativeの設計を考えるシードプロジェクトまとめ

## 概要

Swiftで遊ぼうと思い、最近のアプリエンジニアはどうやって開発してるのかなーと調べたら、どうもReact Nativeがちょいちょいでてくる。

* React Nativeのチームは、React Nativeの採用理由について、`ビルド時間の短縮やデバッグツールによる開発の効率化のため`とも述べている
* Facebookは全てのアプリにReact Nativeを採用すると言い切っている
* Airbnb、Microsoftなどが積極的に開発にコミットしている
* ネイティブでバリバリやってたiOS developerも、開発効率の良さからReact Nativeに乗り換え始めている

昔見たときと印象が変わっているように感じたので、React Nativeのプロジェクト構成を考えるためのシード一覧をこちらにまとめてみた。

## 一覧

* [Ignite ★3281](https://github.com/infinitered/ignite)
    * The unfair starting CLI, Generator, and more for React Native
* [react-native-router-flux ★3007](https://github.com/aksonov/react-native-router-flux)
    * React Native Router based on new React Native Navigation API
* [pepperoni-app-kit ★2828](https://github.com/futurice/pepperoni-app-kit)
    * React Native App Starter Kit for Android and iOS
* [Snowflake ★2755](https://github.com/bartonhammond/snowflake)
    * A React-Native Android iOS Starter App/ BoilerPlate / Example with Redux, RN Router, & Jest with the Snowflake Hapi Server running locally or on RedHat OpenShift for the backend, or a Parse Server running locally or remotely on Heroku
* [react-native-webpack-starter-kit ★801](https://github.com/jhabdas/react-native-webpack-starter-kit)
    * Build your React Native app with Webpack and Babel
* [native-starter-kit ★461](https://github.com/start-react/native-starter-kit)
    * React Native Starter App with NativeBase + CodePush + Redux
* [react-native-router-redux ★443](https://github.com/Qwikly/react-native-router-redux)
    * Router component to be used in your React Native redux applications. Packed with Nav and TabBar support.
* [UniversalRelayBoilerplate ★325](https://github.com/codefoundries/UniversalRelayBoilerplate)
    * Boilerplate + examples for React Native (iOS, Android), React (isomorphic, Material-UI), Relay, GraphQL, JWT, Node.js, Apache Cassandra, DynamoDB, waterline
* [react-native-starter-app ★287](https://github.com/mcnamee/react-native-starter-app)
    * A React Native starter/boilerplate app to get started with Redux, a sidebar menu, navigation, a custom navbar, data persistence, data validation and more.
* [formidable-react-native-app-boilerplate ★270](https://github.com/FormidableLabs/formidable-react-native-app-boilerplate)
    * React Native / Redux / Babel boilerplate.
* [react-native-es6-reflux ★145](https://github.com/filp/react-native-es6-reflux)
    * Boilerplate for iOS app development with React Native, ES6 and Reflux
* [LeoLeBras/react-native-redux-starter-kit ★185](https://github.com/LeoLeBras/react-native-redux-starter-kit)
    * A starter boilerplate for a mobile app using React Native and Redux
* [mrpatiwi/ReactNativeTS ★129](https://github.com/mrpatiwi/ReactNativeTS)
    * Boilerplate of a React Native project in Typescript.

## まとめ

* 基本的にはFluxベースのObserverパターンがよさそう
* Reduxを大きく採用しているものもいくつか
* ビルドやデプロイなども一緒に請け負おうとしている
* FlowやNuclideなど、開発環境もセットでシードと言えそう
* TypeScriptが役割的にいらないのがすごい
* Universal JavaScriptはReact Nativeの世界でも積極的に取り入れられていているよう
* Relay, GraphQLはちょっと一般人には勇気が出ない...
Net-SNMP で大量の GETBULK を受けつける

snmpd はデフォルトでは 100 件までしか対応していない（snmpbulkget -Cr500としても100件）。
もっと大量の GETBULK を受けるには snmpd.conf に、以下のような設定を追加する。
```maxGetbulkResponse  -1```
keyhac を使って英数入力モード時のみ Ctrl-J で日本語入力モードにする

SKKFEP を使っていて、Ctrl-J で日本語入力モードに変更したかった。
常に [全/半] キーにしてしまうと、日本語入力モード時の Ctrl-J が効かないので、以下を試す。
<pre>
def zenhan_unless_zen():
  if ( keymap.wnd.getImeStatus() ):
    # pass-through
    keymap.InputKeyCommand( "C-J" )()
  else:
    # zen-han
    keymap.InputKeyCommand( "(243)" )()
keymap_global = keymap.defineWindowKeymap()
keymap_global[ "C-J" ] = zenhan_unless_zen
</pre>

`"(243)"` は [全/半] キーのキーコード。
右クリックメニューに「ディスク イメージの書き込み」が出ないとき

Windows で ISO イメージを光ディスクに書き込もうとイメージファイルを右クリックしても
「ディスク イメージの書き込み」メニューが出ない。そんなときは、イメージファイルの
右クリックメニューにて「プログラムから開く」→「別のプログラムを選択」として
「C:\Windows\System32\isoburn.exe」を選択するとよい。
追い込まれないと動かない自分を、いつでも動かせるようになった画期的な方法

いつもはCognosというビジネスインテリジェンスの製品の記事ばっかり投稿していますが、ちょっと息抜きで「仕事のコツ」のネタでの投稿です。

##はじめに

突然ですが皆様は、小学校の時の夏休みの宿題を7月中からコツコツやったタイプでしょうか？
それとも8月31日に泣きながら一挙にやったタイプでしょうか？

私はと言えば・・・、もちろん後者の**「831型」**で、下手をすれば小学生のくせに徹夜さえして、9月1日の朝ぎりぎりになんとか終わらして、一睡もせずにそのまま宿題を提出に学校に行ったりしてました。

そういう831型人間の習慣というのは、どうやら遺伝子レベルで決められているようで、大人になっても、社会に出て十数年働いても一向に改善する事はありませんでした。
追い込まれると自然にすごく頑張れるのですが、追い込まれる前にやろうと思うと、同じ事をやっていても何故かすごく苦痛なんですよね。

##転機

しかしながら、数年前にある仕事で**「ものすごい面倒くさい大量の文書を、2ヶ月後までに、空いている時間で書かないといけない」**という事をやらねばいけなくなった時に、**「時間が凄くかかるのは分かってるけど、まだ2ヶ月もあるのでやる気が出ないわ～」**という例の心理状況になり、さすがに自分で客観的に見ていても**これはまずい**と思い、何とか自分を動かす方法を色々と研究し、ついに**こうやれば自分を動かせる**という方法を見つけました。

一言でいうと**「追い込まれ状態を利用し、追い込まれてない事をやる」**です。


##説明
どういう事かご説明します。

誰でもやっていると思いますが、仕事のタスクリストというものを作って、タスク毎の優先順位を付けて管理してますよね。

例えば以下のタスクがあったとします。
**・お客様からお怒りメールを頂き返信しないといけない**
**・Qiitaに何かネタを投稿してみる**

さて、これに優先順位を付けてみると、当然こうなりますよね。
**優先度 高** → お客様からお怒りメールを頂き返信しないといけない
**優先度 低** → Qiitaに何かネタを投稿してみる　

優先度の高いものから仕事を片付ける、というのはどこのハウツー本にも書いているので、普通に考えると、この順でやりますよね。
**① お客様に釈明メールを打ってお怒りを静める**
**② Qiitaに何か投稿する**

しかしながら、これこそが831型人間の自分にとっては大きな間違いだと、ある日ついに気が付いたのでした。


つまり、この順で仕事を片付けようとすると、831型は**必ず**こうなるのです。

**お客様に釈明メールを打ってお怒りを静める**
　　　　　　　　　↓
**なんとか理解してもらえたので安心する**
　　　　　　　　　↓
**安心するとやる気がなくなり、Qiitaの投稿は明日でも良いだろうと思い、結局やらなくなる**


##結論

結論はもうお分かりになると思いますが、発想を逆転して、以下の様にすれば良いという事です。

**お客様にメールを打ちたければ、Qiitaに一件投稿しないと駄目、と勝手な制限を作る**
　　　　　　　　　↓
**冗談じゃないよ！という焦った心理の中、最高速でQiitaに投稿する**
　　　　　　　　　↓
**やっとできるよ！と思い、超速攻でお客様に釈明メールを打つ**
　　　　　　　　　↓
**なんとか理解してもらえたので安心して、やる気が無くなる**

これでいいんです。
二つの仕事がアッと言う間に片付きました。

実際にここ数年、私はこうやって**「優先度の高いものを人質にして、優先度の低い事もやってしまう」**を実践していて、トータルで見て仕事の成果が格段に上がっているように感じています。
本来自分の様な人間にできるはずが無い、Qiitaへの投稿という地道な作業を、この2ヶ月で50件もできてしまったのは、実はこのやり方のおかげです。

とは言え、注意点として、以下はもちろんお願いします。
・831型と自認している人のみに有効と思います
・新人とかでまだ図太さが無い人はお勧めできません
・本当の本当に追い込まれている人もお勧めできません

という事で、今回のお話は終わりになりますが、いかがだったでしょうか？
追い込まれないと動けない、**831型の人間**は私以外にも大勢いらっしゃると思いますので、同族のかたのお役に立つ事ができれば、この上ない幸せです。


#効果の証明（2年後の2019年1月に追記）
その後このやり方を継続し、Qiitaの投稿を2年続けた結果、どうなったかと言うと。。。
2018年末に投稿されたこちらの記事で知りましたが、Qiita記事投稿数ランキングで18位(30万アカウント中)に入る事ができました！

**Qiitaのいろいろランキング2018**
https://qiita.com/t_nakayama0714/items/865da4afde5e0600187c

大した才能もエネルギーも無い自分がここまでできた理由はたった一つ、この記事で書いたやり方を続けているだけで、人間ってつくづく面白いもんだな～と思う今日この頃です。
Operationを継承したクラスでのisFinishedのKVOの仕方

日本語でパッと見つからなかったのと、忘れそうなのでメモ。一応、動きはするけれども、もっといいやり方がある気がする。

### 結論

```swift
class testOpertion: Operation {
    private var isFinishedFlg: Bool
    override var isFinished: Bool {
        get { return super.isFinishedFlg }
        set {
            willChangeValue(forKey: "isFinished")
            self.isFinishedFlg = newValue
            didChangeValue(forKey: "isFinished")
        }
    }
    func init {
        self.isFinishingFlg = false
        super.init()
    }
    func start {
        //何らかの処理
        self.isFinished = true    
    }
```

isExecutingも同様の書き方でいけると思われる

### 推測
>The NSOperation class is key-value coding (KVC) and key-value observing (KVO) compliant for several of its properties. As needed, you can observe these properties to control other parts of your application. To observe the properties, use the following key paths:
isFinished - read-only

isFinishedでKVO出来るよと書かれているのですが、isFinishedの値はread-Onlyのため、直接変更はできない

別の箇所に

> If you are creating a concurrent operation, you need to override the following methods and properties at a minimum:
isFinished

Operationで並列する場合は、isFinishedをオーバーライドしろと書いてあるので、Overrideする必要がある

ただし、isFinished自体は変更不可能なので、isFinished別の書き換え可能なBoolを保持させて、自分自身でisFinishedを書き換えたと通知する必要があると思われる。

swiftというか、iOSは良くわからない

### 参考
https://developer.apple.com/reference/foundation/operation
http://stackoverflow.com/questions/24109701/nsoperation-property-overrides-isexecuting-isfinished
アイデア発想法まとめ

「アイデアとは既存の要素の新しい組み合わせ以外の何ものでもない」

さて、アイデア発想法をまとめていきます。（参考図書「カール教授のビジネス集中講義」）

①水平思考
思考の対象を決める（例えば「本」）
→それの特性を考えてから変化させる（本だったら「重い」「かさばる」「知識がつまってる」）
変化のさせ方は、「逆転」「代用」「結合」「強調」「除去」「並べ替え」（「かさばる」を逆転させて「かさばらない」）
→その変化させたあとの特性を、もとの思考対象物にくっつける。（かさばらない本）
そしてこれを実現する方法を考える（かさばらない本→文庫本、デジタル本）

②マトリックス思考
自分が作りたいものとそれの本源的な価値を組み合わせる、というやり方です。
例えばディズニーのような娯楽施設を作りたい場合。
そのような娯楽施設の本源的価値は「悩みの解消」「優越感」「楽しい」などがあげられます。
娯楽施設×「悩みの解消」→さまざまな占いができるテーマパーク
娯楽施設×「優越感」→1日10組限定のテーマパーク
娯楽施設×「楽しい」→芸人のコントをたくさん観れるテーマパーク

③オズボーンのチェックリスト
・他の使い方をしたらどうか？
・応用したらどうなるか？
・変更したらどうか（色、形、音、様式）
・拡大したらどうなるか？
・縮小・削除したらどうなるか？
・代用したらどうなるか？
・アレンジし直したらどうか
・逆転させてみたらどうか？
・結合してみたらどうか？

④シックスハット法
６つの帽子のうち、「いずれかの帽子をかぶった」という意識で発想します。
白い帽子、、客観的・中立的な視点
赤い帽子、、感情的な視点
黒い帽子、、批判的・消極的な視点
青い帽子、、分析的・冷静な視点
黄色い帽子、、積極的・希望的な視点
緑の帽子、、革新的・創造的な視点

⑤特性列挙法
まず、思考対象のものを三つの特性に分解
・名詞的特性（花、車）
・形容詞的特性（重い、大きい）
・動詞的特性（走る、切る）
→次に、その問題点を探して解決策を考える
（例えば、車→大きい→1人用の車を作る。）

⑥プレップ法
アイデアを具体化するための方法。
以下の質問に答える。
・アイデアのポイント
・そのアイデアがよい理由
・アイデアの具体例
・そのアイデアを別の言葉で言い換えると？

これが起業アイデアの助けになれば幸い！
以上、ジーズアカデミー四期生の小尾でした！
ContentProviderのセキュリティについて

JSSECが公開している『Androidアプリのセキュア設計・セキュアコーディングガイド』の2016-09-01版を共有用にまとめているもののうち、「4.3. Content Provider を作る・利用する」のものとなります
詳細やサンプルコードについては原著の方を参考ください

## チェックポイント
 - [ ] 常時サービスを提供しない場合、一時許可Content Providerを使用している
 - [ ] アプリ内のみで利用する場合は、非公開設定している
 - [ ] 返送先アプリからの結果情報漏洩に注意している
     * updateやdelete等の対象となったレコード数が結果情報として返送されるため、それらがセンシティブな意味を持つ場合は特に注意する必要があります
 - [ ] Permissionの再委譲問題を起こしていない
 - [ ] 作成側はリクエストとのパラメーターの安全性を確認している
 - [ ] 利用側は受信データの安全性を確認している

### 非公開Content Provider
* 作成側
- [ ] Android2.2以前で使用していない(実装できない)
  * Android2.2以前では非公開設定は機能しません。DB等へ直接アクセスすることで代用できます
- [ ] exported="false"により、明示的に非公開設定している

### 公開Content Provider
* 作成側
- [ ] exported="true"により、明示的に公開設定している
- [ ] センシティブな情報を返送していない
- [ ] 不特定多数に利用されるため、データの抜き取りや、改竄される可能性を考慮している
* 利用側
- [ ] センシティブな情報をリクエストに含めていない
- [ ] 独自作成のContentProviderを利用する場合、成りすましたマルウェアにリクエストパラメーターを受信されたり、攻撃結果データを受け取る可能性を考慮している
 * AndroidOS既定のものに関しては成りすまされることはありません

### パートナー限定Content Provider
* 作成側
- [ ] exported="true"により、明示的に公開設定をしている
- [ ] 利用元アプリの証明書がホワイトリストに登録されていることを確認している
- [ ] 開示して良い情報のみ返送している
* 利用側
- [ ] 利用先アプリの証明書がホワイトリストに登録されていることを確認している
- [ ] パートナーに開示してよい情報のみリクエストに含まれている

### 自社限定Content Provider
* 作成側
- [ ] 独自定義Signature Permission を定義している
- [ ] 独自定義Signature Permission を要求宣言している
- [ ] exported="true"により、明示的に公開設定している
- [ ] 独自定義Signature Permission が自社アプリにより定義されていることを確認している
- [ ] 利用元アプリと同じ開発者鍵でAPK を署名している
* 利用側
- [ ] 独自定義Signature Permission を利用宣言している
- [ ] 独自定義Signature Permission が自社アプリにより定義されていることを確認している
- [ ] 利用先Content Provider アプリの証明書が自社の証明書であることを確認している
- [ ] 利用先アプリと同じ開発者鍵でAPK を署名している

### 一時許可Content Provider
基本的には非公開のContentProviderですが、特定のアプリに対して、一時的に特定URIへのアクセスを許可するContentProviderです
Content Provider 側アプリが能動的に他のアプリに、または、アクセス許可を求めてきた他アプリに受動的に、一時的なアクセス許可を与えることができます

* 作成側
- [ ] Android 2.2（API Level 8）以前では実装しない
- [ ] exported="false”により、一時許可するPath 以外を非公開設定している
- [ ] grant-uri-permission により、一時許可するPath を指定している
- [ ] 開示してよい情報のみ返送している
- [ ] 一時的にアクセスを許可するURI をIntent に指定している
- [ ] 一時的に許可するアクセス権限をIntent に指定している
- [ ] 一時的にアクセスを許可するアプリに明示的Intent を送信している
- [ ] 一時許可の要求元アプリにIntent を返信している
* 利用側
- [ ] センシティブな情報をリクエストに含めていない

## 参考

『Android アプリのセキュア設計・セキュアコーディングガイド』【2016年9月1日版】
https://www.jssec.org/dl/android_securecoding.pdf
Railsにparameter層を導入する

controllerに渡ってくるparamsを加工するためのラッパークラスです。
modelやqueryといったドメイン層に処理を渡す前にparamsを綺麗に加工することでドメイン層に無駄なロジックを書くことを防ぎます。

## parameterのメリット

### paramsで渡ってくる値の型の調整をすることができる
例えば

```sample_controller.rb
params[:id]
```

とした場合にidは文字列`'1'`であるため、アプリケーション層で

```sample_model.rb
params[:id].to_i
```

みたいな処理を書くことは多いですが、そういったロジックを書かなくてよくなります。

### paramsに初期値を設定することができる 
例えば

```sample_controller.rb
params[:id]

```

仮に`params[:id]`にnilが渡ってくるを想定して

```sample_model.rb
params[id] ||= 1
```

みたいな処理を書くことは多いですが、そういったロジックもドメイン層に書かなくてよくなります。

## 参考コード

```rooms_parameter.rb
class RoomsParameter

  def initialize(current_account, params={})
    params.assert_valid_keys("room_name", "room_number", "candidate_ids")
    @current_account = current_account
    @room_name       = params[:room_name] ? params[:room_name] : '部屋名未定'
    @room_number     = params[:room_number] ? params[:room_number].to_i : nil
    @candidate_ids   = define_candidate_ids(params[:candidate_ids])
  end

  def define_params
    return {
      id:          @current_account.id,
      room_name:   @room_name,
      room_number: @room_number,
      candidate:   @candidate_ids
    }.with_indifferent_access.freeze
  end

  private

  def define_candidate_ids(candidate_ids_params)
    return [] if candidate_ids_params.nil?
    candidate_ids_params << 1 if @current_account.candidate?
    return candidate_ids_params
  end
end

```

Roomモデルには検索メソッドが実装されているとします。
上記をコントローラー側でnewして、モデルに渡します。

```rooms_controller.rb
def index
  parameters = RoomsParameter.new(@current_account, params).define_params
  @rooms = Room.search_rooms(parameters)
end

```

### まとめ
アプリケーション層にあるべきparamsをparameterクラスで予め加工してしまうことで、ドメイン層でやるべきことをドメイン層で集中してやることができますが、最大のメリットはparameter層で加工済な分より安定したparamsをドメインに渡すことができるところではないでしょうか。

### 追記

paramsに対してhash.fetch(key, default)すると綺麗にまとまるかも。

## 参考文献
[中規模Web開発のためのMVC分割とレイヤアーキテクチャ](http://qiita.com/yuku_t/items/961194a5443b618a4cac)
[rails で params に対して複雑な処理をするときのベストプラクティスは？](http://qa.atmarkit.co.jp/q/3005)
回文を列挙する

これは「[文字列アルゴリズム Advent Calendar 2016](http://qiita.com/advent-calendar/2016/str)」２１日目の記事です。

# はじめに
この記事では、文字列中に出現する回文について記述します。
回文とは、右から読んでも左から読んでも同じ、アレです。
## 定義
文字列 $w$ が回文であるとは、文字列 $w$ の逆文字列 $w^R$ が文字列$w$と一致することである。
以上の定義から、この記事では１文字も回文であると定義します。
### 回文の例
- I
<dd>定義より、１文字も回文であるとしました。最も短く"狭い"回文はこれではないでしょうか。
- 142+382×567=765×283+241
<dd>式が成り立っているところが、かっこいいです。

# 文字列中の回文
文字列中に出現する回文について考えましょう。
例えば、「しましまのしまうま」という長さ９の文字列中に回文はいくつ出現するでしょうか。
１文字も回文としているので、長さ１の文字列、し、ま、し、ま、の、し、ま、う、ま、は回文です。更に、しまし、ましま、まうま、も回文です。この例には、長さ１の回文が９つ長さ３の回文が３つの計12個の出現があります。
では、長さ$n$の文字列の中に回文は最大でいくつ出現するでしょう。
答えは$\frac{1}{2}n(n+1)$個です。同一の文字のみからなる長さ$n$の文字列の例を想像すれば任意の部分文字列が回文になるので、$\frac{1}{2}n(n+1)$個出現しますね。

#回文の列挙
長さ$n$の文字列には最大で$O(n^2)$個の回文が出現すると言いました。では、これらの回文全てを列挙するためにかかる時間はどれくらいでしょう。
１つ１つ調べていくと、最低でも$O(n^2)$時間はかかってしまいます。
1975年、Manacherが、$O(n)$時間で文字列中の回文を列挙するアルゴリズムを提案しました。以下、このアルゴリズムについて記述します。
※RMQや接尾辞配列、接尾辞木等を用いた$O(n)$時間のアルゴリズムも存在しますが、文字列アルゴリズムの観点から、それらを用いないManacherのアルゴリズムのみ紹介します。
## 極大回文
ここで回文とはどういうものかについて少し考えます。
長さ$x$の回文があるとしましょう。回文の性質より、両端を$t$文字ずつ削った長さ$x-2t$の文字列も全て回文になります。つまり、「たけやぶやけた」という回文があったとき、１文字ずつ削った「けやぶやけ」も２文字ずつ削った「やぶや」も３文字ずつ削った「ぶ」も回文になっているというわけです。
文字列中の回文に関しても同じことが言えるので、各位置を中心とする最長の回文さえ計算できれば、実質全ての回文を計算したことになります。
長さ$n$の文字列は、文字列長$n$と文字と文字の間$n-1$により、中心を$2n-1$個持ちます。よって、この$2n-1$個の中心に対してそれぞれ最長の回文を計算すれば、全て列挙したと言えます。以下、位置$i$を中心とする最長の回文を、位置$i$の極大回文と呼ぶこととします。
## Manacherのアルゴリズム
文字列中の全ての極大回文を列挙します。簡単のため、長さが偶数の回文のみを列挙するアルゴリズムを記述しますが、長さが奇数のものについても同様に計算できます。記述を容易にするため、文字列$w$に出現する極大回文の集合を$MPal(w)$とし、$c$を中心とする長さ$2r$の回文を$(c,r)$とします。
アルゴリズムに必要な補題を記します。
補題
<bb>任意の$(c,r)\in MPal(w), 0 < d \leq r$に対して、（１）〜（３）のいずれかを満たす。ここで、$(c-d,r_l), (c+d,r_r) \in MPal(w)$。
（１）$r_l < r-d$ ならば $r_r = r_l$
（２）$r_l = r-d$ ならば $r_r \geq r-d$
（３）$r_l > r-d$ ならば $r_r = r-d$![Mpals.png](https://qiita-image-store.s3.amazonaws.com/0/153222/131d10b3-f360-97d4-8b32-8b15cb35c52d.png)


中心$c$を左から右に移動して、計算を行います。
上記の図で$c$を中心とする極大回文を計算したとし、その半径が$r$だったとしましょう。左から右に計算しているので、$c$の左側を中心とする極大回文は計算が終わっています。
補題より、$c$から$c+r$までを中心とする極大回文は、（１）〜（３）のどれかに分類できます。
（１）〜（３）に分類し、$c$の左で計算した結果をコピーし応用することで計算します。
上記の図で説明します。
$c$を中心とする極大回文を求め、長さが$2r$だったとします。
次に、$c+d$を中心とする長さ２以上の極大回文を計算していきます。
$c$の左側は計算が終わっているので、（１）もしくは（３）を満たすとき、$r_r$は$r_l$をコピーするだけで計算できます。（２）の場合、新たな極大回文の中心から左右にのばして極大回文を計算します。$r_r$を計算したら、$c$を$c+d$、$r$を$r_r$に置き換えて同じ計算を繰り返します。
$d$を１から順に大きくして計算を行い、$r$以下の全ての$d$について$c+d$を中心とする長さ2以上の極大回文がなかった場合、$c$を$c+r$に置き換えて同様の計算を行います。
以下、擬似コードです。
![code.png](https://qiita-image-store.s3.amazonaws.com/0/153222/56ed16b1-6192-b36a-425f-ee2bb514c82f.png)

これにより、$O(n)$時間で極大回文を列挙できました。
# おわりに
なぜ今日、回文についての記事を書いたのかについては、カレンダーを見て頂くと容易に想像がつくかと思います。
この記事は研究室の偉大な先輩方の資料を参考にさせていただきました。
拙い文章ではありますが、少しでも文字列アルゴリズム、回文について知るきっかけとなりましたら幸いです。

# 参考文献
- Glenn K. Manacher:
A New Linear-Time ``On-Line'' Algorithm for Finding the Smallest Initial Palindrome of a String. J. ACM 22(3): 346-351 (1975)
HoloLensで地球を見てみよう #アセットアドカレ

この記事は [Unity Assets Advent Calendar 2016](http://qiita.com/advent-calendar/2016/unity-asset) 18日目の記事になります。

なかなかWindows Store、UWP10に対応したHoloLens実機で動くアセットが少ない中で、割と業務用アプリで使えそうな地球サイズのMapアセットをご紹介します。

## World Political Map - Globe Edition 7.2.1 (Dec 16, 2016)
[![image](https://qiita-image-store.s3.amazonaws.com/0/32347/ae01af32-c92d-f816-f923-7ead8fb035ce.png)](https://www.assetstore.unity3d.com/jp/#!/content/41890)

### 以下引用

特長： 
- 241の国、4000以上の県、州の境界、および世界の1249の最も大きな、または人口の多い都市の位置をプロシージャルに描画します！
- インタラクティブマップ： 国、県／州の領域、および都市の領域が、マウスを上に持ってくるとハイライトされます。
- 自動的に国ラベルを描画します。配置オプションが指定できます。
- 国、県／州あるいは国土全体を色分けできます！
- 任意の国、州、または都市の名前を指定すると、現在位置からそこへスムーズに探索および飛行して行くことが可能です。
- 2個の都市カタログが付属します。人口および／またはサイズで都市をフィルターできます。
- 100.00.000:1および50.000.000:1スケールの2つの詳細度の境界。
- 仮想的な線：緯線、経線、カーソル線を描画します。
- 多くのカスタマイズオプション：境界色、ハイライト色、都市／境界／地球、ラベル、...6つの地球のスタイルが付属します。
- コードによりインスタンス化およびコントロールできます（API およびドキュメンテーションが提供されています）。
- カスタムエディターインスペクター。
- インターネットアクセスは不要です！ 地理データはアセット中に含まれており、Google Mapsや他のいかなるマッププロバイダーも使用しません。これにより非常に高速にオフラインで動作します！


こんな感じの飛行機の航路っぽい線もアニメーションで描画できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/32347/8b0228e4-f7b7-6cb7-406f-8e33cf9985bf.png)


## HoloLensに対応してみる

- \WorldPoliticalMapGlobeEdition\Demos\01 GeneralDemo\GlobeDemo.unity を開く
- いつものMain Cameraの設定を行う
![image](https://qiita-image-store.s3.amazonaws.com/0/32347/36394700-1986-49a0-11d9-82e438acd6c5.png)
- Holographic Remoting Playerでつなぎ、地球の位置やスケールを調整する
 ![image](https://qiita-image-store.s3.amazonaws.com/0/32347/dbc08ccc-ba00-edcb-3a28-46f966974e4b.png)


完成！とする前に、HoloLensでは重たいので、軽量化の設定を行います。

## World Political Map軽量化の設定をする
設定はWorldMapGlobeコンポーネントの設定から行います。
てきめんに効果があるのは中段のテクスチャの解像度設定
Labelなど必要に応じて表示していきます。
![image](https://qiita-image-store.s3.amazonaws.com/0/32347/7279b960-3b6b-8fda-1283-a84ea689fffe.png)

これでカクツキなく行けるはず。

## おまけ

現状のHoloLensのスペックでは厳しいが、上段にあるEarth Styleから16Kのテクスチャを選ぶと息をのむような美しい地球が目の前に現れる。
![image](https://qiita-image-store.s3.amazonaws.com/0/32347/34591cdd-31a6-fd7d-fe64-8a44809bc829.png)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">HoloEarth <a href="https://t.co/3MTgLbFaAC">https://t.co/3MTgLbFaAC</a> <a href="https://twitter.com/YouTube">@YouTube</a>さんから</p>&mdash; ゆーじ (@yuujii) <a href="https://twitter.com/yuujii/status/811509879110107136">2016年12月21日</a></blockquote>
Laravel のマイグレーションで複合インデックスにしつつインデックス名を指定する方法

##環境
- CentOS 7
- PHP 7
- Laravel 5.3
- MySQL 5.7

## 複合インデックスにしつつインデックス名を指定する方法
- 第一引数を配列にすればできる
>$table->index(['カラム名1', 'カラム名2'], 'インデックス名')

- ユニークキーも同じようにできる
>$table->unique(['カラム名1', 'カラム名2'], 'ユニークキー名');

## 通常インデックス作成方法
> $table->index('カラム名');

## 複合インデックス作成方法
> $table->index(['カラム名1', 'カラム名2']);

## インデックス名を指定する方法
> $table->index('カラム名', 'インデックス名');
PocketWifi設定

## Pocketwifi GL04Pの設定
###### 定期的に発生する作業だけど毎度忘れるので備忘録

課題
* システム設定をしたいけど有線でPC（windows/Mad）につないでもブラウザからアクセスできない．たぶんドライバが原因．
* SIMのプロファイル設定（APN設定）はPocketwifi端末にアクセスして行う必要がある．

解決方法
* GL04PとパソコンをWifiで接続する．
* WPSボタンを２回押下すると接続可能なSSIDとパスワードが端末の液晶画面に表示される．
* ブラウザ（macの場合はサファリ）で<http://poketwifi.home>に接続
* あとは適宜設定