OmniAICreator/Qiita-1.07M huggingface dataset:
Node.jsでTwitterのタイムラインを取得する前に考える2つのこと


# **概要**

Node.jsでTwitterのタイムラインを取得するときにいくつかの方法があったのでメモ。

使うAPIの種類（**REST APIかStreaming APIか**）と、Node.jsライブラリ（**ntwitterかnode-twitterか**）を簡単にまとめました（認証は<a href="https://github.com/jaredhanson/passport-twitter" target="_blank">passport-twitter</a>を使いました）。


# **REST APIかStreaming APIか**

Twitter APIの種類です。特にリアルタイムで取得する大きな理由もなかったので、シンプルなREST APIを選びました。

## <a href="https://dev.twitter.com/rest/public" target="_blank">REST API</a>

### 特徴
* シンプル
* RESTなだけあってわかりやすい（↓もRESTですが）

## <a href="https://dev.twitter.com/streaming/overview" target="_blank">The Streaming API</a>

### 特徴
* リアルタイムでツイートを取得できる
* Public APIの情報は多かったが、home_timelineを表示する情報が少なかった（というよりできないかも？経験のある方がいれば教えて下さい）。



# **ntwitterかnode-twitterか**

Node.jsでTwitter APIを扱うライブラリです。

どちらも問題なくhome_timelineが取得できますが、最終更新が3年前はさすがに不安なので、node-twitterを選びました。Star数は少ないですが、そもそも普通に取得できれば問題はないと考えました。

## <a href="https://github.com/AvianFlu/ntwitter" target="_blank">ntwitter</a>

### 特徴
* Star数が１番人気。
* 更新が２年前とかで不安。
* ドキュメントに書いていないことがある。

## <a href="https://github.com/desmondmorris/node-twitter" target="_blank">node-twitter</a>

### 特徴
* ドキュメントがわかりやすい
* 使い方がシンプル
* 更新が活発（2015/3/21現在）



# **参考記事**
* <a href="http://barutangne.hatenablog.com/entry/2014/01/31/192200" target="_blank">Node.jsでTwitter API v1.1 を叩くには?</a>
* <a href="http://www.slideshare.net/hecomi/nodejs-twitter-14407305" target="_blank">モテる！ Node.js でつくる twitter ボット制作</a>
* <a href="http://sekkan.soragoto.net/via148.html" target="_blank">node.js ntwitter</a> - 古い情報だが、ちゃんと調べてある。
* <a href="http://www.slideshare.net/yusukey/3twitter-api-api" target="_blank">第3回Twitter API勉強会 - ストリーミングAPI</a>
* <a href="http://dx.24-7.co.jp/twitterapi1-1-rest-api/" target="_blank">【保存版】TwitterAPI1.1 REST API 全項目解説</a>
Seasar2 [No.2] プロジェクト作成

プロジェクト作成手順
=

##1. Eclipseプラグインのインストール

(1)Eclipseの「ヘルプ」⇒「新規ソフトウェアのインストール」
(2)「インストールWindow」の右側にある「追加」ボタンをクリック
(3)「リポジトリーの追加Window」の①名前に適当な名前 ②ロケーションに「 http://eclipse.seasar.org/updates/3.2/ 」を入力して「OK」ボタンをクリック。
(4)「すべて選択(S)」ボタンをクリック⇒「完了(F)」

※(3)で行ったリポジトリーの追加をロケーション→「 http://eclipse.seasar.org/updates/3.3/ 」で再度追加する

##2. Tomcatのインストールと「サーバー」ビューへの登録
(1)Tomcatをインストール(インストール済みの場合は飛ばす) ※ここでは手順は飛ばします。
(2)Eclipseの下部にある「サーバー」ビューで右クリック→「新規」
(3)「新規サーバーWindow」で「サーバーのタイプを選択(S)」でApacheフォルダ内にある「Tomcatサーバー」を選択⇒「完了(F)」


##3. SAStratsプロジェクトの作成
**Dolteng**を使えばSeasar2を使用するJavaプロジェクトを簡単に作成できる。
(1)「新規プロジェクトWindow」で「Doltengプロジェクト」を選択。
(2)①アプリケーション・タイプ(A):「Webアプリケーション」
　 ②表示:SASｔrats
　 ③永続化:S2JDBC(S2JDBCを利用するため)
   ④サーバー管理:WTP(Servlet2.5)
(3)作成したプロジェクトをTomcatにデプロイするための設定を行う
アプリケーションサーバにデプロイするプロジェクトを選択する意味
　 ①「サーバー」ビューでサーバを選択して右クリ「Add and Remove」で登録する

## Dolteng##
seasar関連プロダクトの開発効率を向上させるEclipseプラグイン
Jupyterがすごい勢いでやってくるからお前ら備えとけ（IPython Notebook + R）


今までIPython Notebook上でRを動かそうとすると[rpy2](http://rpy.sourceforge.net/)やらをごにょごにょやるとかいう方法がありましたが、いちいち%%を打ったりといろいろ不便でした。

が、先月末（2015/02/27）のIPython 3.0のリリースでIPython Notebookが大きく変わり、（まだ開発版ですが）Rとの連携もかなり楽になりました！というか今後はRだけでなく、Juliaや他の言語もカバーする方向に進むそうで、特定の言語に依存しない部分を[Jupyter](http://jupyter.org/)という別プロジェクトでやっていくそうです。

代表的な言語のJupyterカーネルとしては以下のようなものが存在する模様。

* Python (https://github.com/ipython/ipython)
* Julia (https://github.com/JuliaLang/IJulia.jl)
* R (https://github.com/takluyver/IRkernel)
* Ruby (https://github.com/minrk/iruby)
* Haskell (https://github.com/gibiansky/IHaskell)
* Scala (https://github.com/Bridgewater/scala-notebook)
* Lua (https://github.com/neomantra/lua_ipython_kernel)
* LuaJIT/Torch (https://github.com/facebook/iTorch)
* Go (https://github.com/takluyver/igo)
* Erlang (https://github.com/robbielynch/ierlang)
* OCaml (https://github.com/andrewray/iocaml)
* Perl (https://metacpan.org/release/Devel-IPerl)
* Perl6 (https://github.com/timo/iperl6kernel)
* JavaScript (https://www.npmjs.com/package/ijavascript)
* node.js (https://gist.github.com/Carreau/4279371)
* Bash (https://github.com/takluyver/bash_kernel)
* その他もろもろ

現時点で使える全てのJupyterカーネルは以下のページを参照。
[IPython kernels for other languages](https://github.com/ipython/ipython/wiki/IPython%20kernels%20for%20other%20languages)

他言語カーネルを使ったノートブックの実例は以下のページを参照。

* [A gallery of interesting IPython Notebooks](https://github.com/ipython/ipython/wiki/A-gallery-of-interesting-IPython-Notebooks)
* [nbviewer: A simple way to share Jupyter Notebooks](http://nbviewer.ipython.org/)

んで、今回の主題でもあるIPython Notebook (Jupyter) + Rはこんな感じ。基本的には[Native R kernel for IPython](https://github.com/takluyver/IRkernel)にある通りやると吉。OSX Yosemite (10.10.2)+MacPortsで環境構築したら途中でエラーを吐かれましたが、`cppzmq`をMacPortsで追加したらなおりました。

Rに最初から含まれているirisデータセットで線形回帰をするとこんな感じ。こりゃイイや！

![jupyter_with_r.png](https://qiita-image-store.s3.amazonaws.com/0/16310/f2be26f9-428c-d431-3d7d-4df4e3523cb1.png "jupyter_with_r.png")
Force.com Migration Toolでbuild.propertiesを複数利用するためのスクリプト

# はじめに
Force.com Migration Tool (Force.com 移行ツール) を使っている時、開発用の組織が複数あると
**`build.properties` を複数用意してデプロイ先を簡単に切り替えたい**
というニーズが個人的にあります。

具体的には、

1. デプロイ時、**デプロイ先の組織** を引数で変更可能にしたい
    - `build.properties` を毎回書き換えるのは嫌なので複数用意しておきたい
2. デプロイ時、**デプロイ対象のディレクトリ** も引数で変更可能にしたい
    - git とかでソースを管理する際、作ったものの内容ごとにディレクトリを分けたりしたいので

これを簡単にできるようにデフォルトの `build.xml` を修正＆シェルスクリプトを作ってみました。


# GitHub

シェルスクリプトも含めて、Force.com Migration Tool を簡単に使い始めるためのファイル群を GitHub で公開してます。

https://github.com/zaki-yama/force-com-migration-tool-template


# コード

まず、`build.xml`。
こんな感じでプロパティファイル名とデプロイ対象ディレクトリ名を ant の property として定義しておきます。

```xml:build.xml
<project name="Salesforce Ant tasks" default="deployCode" basedir="." xmlns:sf="antlib:com.salesforce">

    <!-- デフォルトで使用する
        - .properties ファイル
        - deploy 対象ディレクトリ -->
    <property name="property" value="build.properties"/>
    <property name="deployTarget" value="codepkg"/>

    <property file="${property}"/>
    <property environment="env"/>

    <!-- コードを組織にデプロイ -->
    <target name="deployCode">
        <sf:deploy
            username="${sf.username}"
            password="${sf.password}"
            serverurl="${sf.serverurl}"
            maxPoll="${sf.maxPoll}"
            deployRoot="${deployTarget}">
        </sf:deploy>
    </target>
```

次に、シェルスクリプト。

```zsh:deploy.sh
#!/bin/bash

while getopts p:t: OPT
do
  case $OPT in
    p)  PROPERTY=$OPTARG
      ;;
    t)  TARGET=$OPTARG
      ;;
  esac
done

if [ -n "$PROPERTY" ]; then
  OPT_PROPERTY="-Dproperty=$PROPERTY"
fi

if [ -n "$TARGET" ]; then
  OPT_TARGET="-DdeployTarget=$TARGET"
fi

ant deployCode $OPT_PROPERTY $OPT_TARGET
```

# シェルスクリプトの使い方

こんな感じで、プロパティファイルを指定する時は `-p` オプションを、デプロイ対象のディレクトリを指定する時は `-t` オプションをつけて `deploy.sh` を実行します。

```zsh
$ ls
build.properties
my_org1.properties
my_org2.properties
pkg1
pkg2

# my_org1 で定義した組織に pkg1 の内容をデプロイ
$ ./deploy.sh -p my_org1.properties -t pkg1
```

それぞれのオプションは省略が可能で、省略した場合は `build.xml` で定義したデフォルト値が使用されます。

# おわりに

見ていただけると分かるように、シェルスクリプトでやっていることは
引数を指定して ant コマンドを実行しているだけです。
なので、直接実行してもいいんですが...
`-Dproperty=` とか毎回書きたくないなあーという心情からです。

また、そう頻繁に組織を切り替えることが無い場合でも、`build.xml` を上記のように記述しておくことで
「自分が使っている組織情報は全部 `*.properties` ファイルを作成しておき、 `build.xml` だけ編集する」
といったことができるのでいいと思います。

もっと便利な方法で管理されてる方がいたらぜひ教えていただきたいです。
ScalaとSlickで複雑なクエリを"Composable" にしてデータベースと仲良くしたい

データベースは便利なものですが、クエリ処理は分割や汎用化が難しく、ORMを素朴に使うだけでは地獄を呼ぶ事もあります。



そしてScalaとSlickがそれを救うというお話です。


名前と職業を属性に持つPersonテーブルへの検索を例に考えます。


#古のJDBCプログラミング風味

```scala

        val query = new StringBuilder("select * from person where ")

        if (なまえをあいまいけんさく) {

          query.append(" name  like '%さん'")

        } else {

          query.append(" name  = 'はなこさん'")

        }

        query.append(" and ")

        if (職業は複数ある) {

          query.append(" job  in ('忍者','犬')")

        } else {

          query.append(" job  = '侍'")

        }

        invokeQuery(query)


```

この方法の場合、SQL文法に関する配慮（この後にはandが要るぞ！あ！カンマで区切らないと、、あ！エラーでこけたぞ!みたいなヤツ）が必要で、if文が多くなり複雑な処理になりがちです。

SQL文字列をプログラムで組み立てるのに疲れた頃にORMが台頭してきましたが、静的なクエリを必要な数だけ多数書くタイプのモノが多かったように思います。
動的に文字列クエリを作る事に皆疲れていたのでしょうが、少しずつ違うクエリを何本も書く事も同じぐらい寂しいものです。


ScalaにはSlickという良いものがあり、SQL文法への配慮が不要でクエリっぽいものを記述する事ができます。
#ベタなSlick風味

```scala

      Persons.where { p =>
        if (なまえをあいまいけんさく) {

          p.name like "%さん"

        } else {

          p.name === "はなこさん"

        }
      }.where { p =>

        if (職業は複数ある) {

          p.job inSet List("忍者", "犬")

        } else {

          p.job === "侍"

        }
      }.list

```

静的に記述できるので嬉しいですが、この路線でもやりたい事が複雑になると手に負えなくなる気配がします。

プログラマであれば**複雑なものは処理を分けて書きたい**と思いますよね。やってみましょう。

#"Composable"なSlick

名前を扱う関数オブジェクトの生成

```scala
      val nameWhereSection = (p: Persons.type) => if (なまえをあいまいけんさく) {
        p.name like "%さん"

      } else {
        p.name === "はなこさん"
      }
```
職業を扱う関数オブジェクトの生成

```scala
      val jobWhereSection = (p: Persons.type) => if (職業は複数ある) {
        p.job inSet List("忍者", "犬")
      } else {
        p.job === "侍"
      }
```


リストに関数オブジェクトを入れて、クエリにfoldで適用する

```scala
      List(nameWhereSection, jobWhereSection).foldLeft(personsQuery)((q, w) => q.where(w)).list
```

slickはQueryオブジェクトのメソッドに関数オブジェクトを渡すことで処理を行うので、関数オブジェクトの生成と処理の実行を完全に分けることが可能です。

Query#whereの引数はこのような型を持ちますのでこれを実装するわけです。

```scala
     (Persons.type)=>(Column[Boolean])
```

このような**「クエリの一部分」を表した小さく再利用しやすい関数オブジェクトを複数組み合わせる事で大きなクエリ処理を実現することがSlickでは可能**です。

つまり"Composable"なクエリ処理の実現です！！！


この方法は、オブジェクト指向による抽象化と相性が良いので複雑な設計も破綻する事がなく、データベースと仲良くする事ができます。
Node.js 環境構築

自宅仮想サーバにてNode.jsの開発環境を作ったので簡単にメモしておきます。

環境：
CentOS release 6.4 (Final)
node.js v0.12.0


<h1>NVM</h1>

NVM(Node Version Manager)はその名の通りNodeのバージョン管理ツールです。

<h2>インストール</h2>

```
git clone git://github.com/creationix/nvm.git ~/.nvm
```

<h2>設定ファイル読み込み</h2>

```
source ~/.nvm/nvm.sh
```

そしてnvmと打っていろいろ出てくればOK

```
[root@localhost nodetest]# nvm

Node Version Manager

Usage:
  nvm help                              Show this message
(以下省略)
```

<h2>バージョン指定でインストール</h2>

```
nvm ls-remote
```

でバージョンがいろいろ出てくるので

```
nvm install 0.12.0
```

こんな感じでバージョン指定でインストールしてあげる。

```
node -v
```

でバージョンが表示されたらOK

```
[root@localhost ~]# nvm ls-remote
        v0.1.14
        v0.1.15
        v0.1.16
        v0.1.17
        v0.1.18
(以下省略)

[root@localhost ~]# nvm install 0.12.0
(いろいろ出てくるけど省略)

[root@localhost ~]# node -v
v0.12.0
```

<h2>でも</h2>

このままだとサーバ起動時に今やったことをまた繰り返さないといけません。

サーバを落として再度入ってNodeのバージョンを見ようとすると、

```
[root@localhost ~]# node -v
-bash: node: command not found
```

........ また同じ設定をしなくてはならない... 面倒です。

ということでデフォルト設定をしてあげます。

<h2>nvmのデフォルト設定</h2>

```
[root@localhost ~]# nvm alias default v0.12.0
default -> v0.12.0
```

としてあげます。そしてサーバ起動時にこの設定が読み込まれるように、

.bash_profileを編集します。

.bash_profileの末尾に

```
if [[ -s ~/.nvm/nvm.sh ]];
 then source ~/.nvm/nvm.sh
fi
```

を追加することで、サーバ起動時にnvmの設定ファイルが読み込まれます。

<h2>テスト</h2>

本当に環境ができたかテストします。
任意の場所にserver.jsというファイルを作ります。
中身は：

```
var http = require('http');

http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(8080);
```

とします。これはブラウザで接続すると「Hello World」と表示するだけです。

```
[root@localhost nodetest]# node server.js 
```

と打つとサーバが起動します。

ブラウザでポート8080指定で接続してHello Worldが出ればOKです。


以上、簡単ではありますがNode.jsの開発環境構築まとめでした。
自然言語と機械学習で使用される英語の私的まとめ

# 説明
自然言語処理と機械学習で見つけた英語の私的まとめ

# 自然言語処理

- corpus（コーパス）:
品詞情報が付与された大量の文章のまとまり。
または、品詞情報が含まれない文章のまとまりをさす。

- The Curse of Dimensionality(次元ののろい)
計算処理されるベクトルの行数、または列数の増加によって
処理時間とメモリ消費が増大すること。
（しばしば指数関数的に増大する）

 - Latent Semantic Indexing(LSI): 次元削減に使用される
 - Singular Value Decomposition(SVD): 次元削減に使用される

- lemma（レマ）:
見出し語, 辞書に載っている形式の単語

- lemmatization:
見出し語に変換すること。
例 meet, meeting)
I'll attend meeting. 変換後 - meeting
I met him last night. 変換後 - meet

- punctuation:
ピリオド、カンマ、括弧などの記号, ?, ", =, ~, $, %, /, \

- stem: 語幹、動詞の基本形のこと。　例）went のstem（語幹）はgo
- stop word: 処理の対象にならない除外される単語のこと。

# 機械学習

# その他
- square matrix: 行数と列数が同じ行列。
行列の形が四角形です。

例) 行数3, 列数3のsquare matrix

```math
\begin{aligned}
A = \left(
    \begin{array}{ccc}
      a & b & c \\
      d & e & f \\
      g & h & i
    \end{array}
  \right)
\end{aligned}
```



- Hermitian matrix: square matrixであり、self-adjointである行列。
- self-adjoint:  以下をみたすとき、行列Aはself-adjointと呼ばれる。

```math
A^{H} = \overline{A^{T}} = A
```
行列Aをtransposeしてcomplex conjugateしたら、もとの行列Aと同じになる。

A^H　のHはAをエルミート化することを指す。
また、Tと上部のバーはAを転値(transpose)した後に複素共役(complex  conjugate)を取ることを示している。

-complex conjugate: 虚数部の符号を逆にすること。
例1） 2 + j のcomplex conjugateは2 - j
例2）

```math
\begin{aligned}
A &=& \left(
    \begin{array}{ccc}
      1 & 2-j & 3j \\
      0 & 5+2j & j
    \end{array}
  \right)\\
\overline{A} &=& \left(
    \begin{array}{ccc}
      1 & 2+j & -3j \\
      0 & 5-2j & -j
    \end{array}
  \right)
\end{aligned}
```
ifort > デバッグオプションの利用 > .F90ファイル

動作確認

    CentOS6.5
    ifort 14.0.1 20131008

Intel Fortranでデバッグオプションを使いたい

```fortran:sample.F90
      implicit none

#ifdef DEBUG      
      print *, "debug"
#else
      print *, "release"   
#endif
      end
```

ファイル名は`*.F90`とすること。
`*.f`や`*.f90`としてコンパイルしようとすると`Bad # preprocessor line`となってしまう。

    $ifort -DDEBUG sample.F90
とすると`#ifdef DEBUG`が有効となり、外すと`else`の部分が有効となる。
また、ソース内に"#define DEBUG"を付けても良い。

[参考](http://www.sci.hokudai.ac.jp/grp/poc/top/old/software/other/fortran_tips/#SEC34)
クラスとメソッド、プロパティと継承、、、、

やはり、このクラスとプロパティと継承がよくわからん。
この壁が結構たかいんだよな。

これはUITableViewに値aaaaをセットする方法。
自分ように復習するためのメモも兼ねています。


````swift:ViewController

    //データのセット
    var cellItems = NSMutableArray()
    
    func MydataSet() -> NSArray{

        for var i = 0; i < 4; i++ {
            self.cellItems[i] = "aaaaa"
            println(i)
        }
        return cellItems
        
    }
````
ここでは、大元の「ViewController」の中に、cellItemsというマルチな配列をまず宣言しています。
そして、MydataSetというメソッドで、マルチな配列（cellItems）の中に、"aaaaa"という文字列を追加させます。
そしてMydataSet()という値を最終的にcellItemsとします。
（return cellItems　がその部分）
    
````swift:ViewController
    
    //セクションを設定している
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        var cellItemsCount:Int = MydataSet().count
        
        return cellItemsCount
    }
    
    //cellを設定している
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
        var cellItemsContent = MydataSet()
        
        var cell = tableView.dequeueReusableCellWithIdentifier("titlecell") as UITableViewCell
        cell.textLabel?.text = cellItemsContent[indexPath.row] as? String
        return cell
    }
````
そして、セクション（テーブルの行）を設定しているパーツとその一行の中身を設定しているパーツでMydataSetを呼び出します。それぞれ、varで新しく値を作り、その中にメソッド自体を呼び出す感じ。
なんとなく、わかってきた気がする。
iPython上でPillowを使ってみる（その1）

## Pillowの作業フロー（その1）

1. Image.new で画像を作成する
2. ImageDraw等で画像をゴニョゴニョする
3. Image.save で編集した画像を保存する

### 実例

![sc-20150321.PNG](https://qiita-image-store.s3.amazonaws.com/0/26107/63650ccb-909e-9c67-204d-b48570a57f1c.png)

```py3:
%pylab inline
from PIL import Image,ImageDraw,ImageFont

# 画像を作成
img = Image.new('RGB', (800,200),(255,255,255)) # 800*200の白背景

# 画像を編集
draw = ImageDraw.Draw(img) 
draw.line((0, 0, 799, 199),fill='green') # 緑の直線

pl_img = np.array(img) ; plt.imshow( pl_img ) # 表示

FONTPATH = '/usr/share/fonts/truetype/fonts-japanese-gothic.ttf'
font = ImageFont.truetype(FONTPATH, 24, encoding='utf-8')
draw.text((40,80),'Test テスト test 試験',font=font, fill='black') 

pl_img = np.array(img) ; plt.imshow( pl_img ) # 表示

# 画像を保存
img.save('test_draw.png') 
```
自分で言うのもなんだが、あんまりおもしろくないな。

↓ノートブックをこっちに上げてみました
[nbviewer.ipython.org/github/suto3/git-public/blob/master/python/notebook/Pillow-workflow01.ipynb](http://nbviewer.ipython.org/github/suto3/git-public/blob/master/python/notebook/Pillow-workflow01.ipynb "nbviewer.ipython.org/github/suto3/git-public/blob/master/python/notebook/Pillow-workflow01.ipynb")

↓作業環境については、こちら
[Pillow環境構築 -- virtualenvによる仮想環境、iPythonによるインタラクティブ環境 - Qiita](http://qiita.com/suto3/items/ab506c238d4b58cdfd88 "Pillow環境構築 -- virtualenvによる仮想環境、iPythonによるインタラクティブ環境 - Qiita")

[iPython上でPillowを使ってみる（その2） - Qiita](http://qiita.com/suto3/items/4ac51a91b28fc5092eaf "iPython上でPillowを使ってみる（その2） - Qiita")

[iPython上でPillowを使ってみる（その3） - Qiita](http://qiita.com/suto3/items/a1770423514b4875bc09 "iPython上でPillowを使ってみる（その3） - Qiita")
sublime text > fortran > 関数のcollapse/expandを行う

動作確認

    CentOS 6.5
    Sublime Text 2

Sublime Textでは関数などの構造の中身を隠す機能がある。左側の行数の所にマウスカーソルを持って行くと、下向き三角が現れるので、それをクリックすることで現在の関数を隠したり(collapse)、展開したり(expand)できる。

Fortranでも関数のcollapse/expandをしたい。

以下のようにする。

1. 関数定義文の前に1桁目からのコメントを追加する。関数名をつけるのがオススメ (例: !--- lgnrm_fu2009 ---)
2. 関数の終わりのendの次に1桁目からのコメントを追加する (例: !----------)
3. 上記の1と2の間の行に1桁目からのコメントを入れない。コメントを入れる場合は、6桁目から"!"を入れるなどして記載する。
4. 行数の所の下向き三角をクリックすることで、上記1から上記2の部分をcollapseできる

```fortran:expanded
!--- lgnrm_fu2009 ----------------------------------
      function lgnrm_fu2009(r_v, sigma, r_mode)
      implicit none
      real*8 d0, d1, d2

      d0 = r_v
      d1 = sigma
      d2 = r_mode

      ! this comment is ok

      lgnrm_fu2009 = d0 + d1 + d2

      end
!-----------------------
```

```fortran:collapsed
!--- lgnrm_fu2009 ----------------------------------

!-----------------------
```

ちなみにdo whileループはこういうことをしなくてもcollapse/expandできる。
簡易HMDを使ったVRハンズオンセミナー

## ユニティちゃんCandy Rock Star をダウンロードしよう！
 
http://unity-chan.com

以下のファイルをダウンロード

- ユニティちゃんライブステージ！ -Candy Rock Star-
- ユニティちゃんシェーダー（修正パッチ）
- ユニティちゃんスクリプト（Unity 5 修正パッチ）
 
## ヘッドトラッキングアセットを持ってくる
 
Unity5でうまく動くアセット
 
#### Durovis Dive SDK
- https://www.durovis.com/sdk.html
- ドリフトあり、追従性良、iOS/Android
- 無料
 
#### Google Cardboard SDK for Unity
- https://developers.google.com/cardboard/unity/download
- ドリフトなし、追従性良、Android
- 無料
 
#### Head Tracking Camera for Smart Phone
- AssetStore
- ドリフトなし、追従性並、iOS/Android
- 有料
 
今回は「Durovis Dive SDK」を使用
 
## 簡易HMDで見れるようにしよう
 
1. CRSプロジェクトを開く
1. 二つのパッチをあてる
1. Assets/UnityChan/Models/UnityChanShader/Shader　を
Assets/UnityChan/CandyRockStar/Shader　にExplorer/Finder上で上書きコピー
1. Mainを開く
1. UnityChan/Prefabs/CharacterLight の Intensity を0.6に
 
重い？
 
## HMDで見る

1. Stage Directorの Main Camear Rig Prefabに Assets/Dive/Dive_Camera を D&D
1. プレイしてみる
1. 二眼で動くことを確認
1. Assets/Dive/Dive_Camera Prefabで場所を適当(0, 1.2, 1.2)に変更。Zoomを0.05 Znearを0.01
 
## Durovis Dive SDKを修正

OpenDiveSensor.cs:L45

```
	AndroidJavaObject mConfig;
	AndroidJavaObject mWindowManager;
``` 

を以下のように変更 

```
#if UNITY_ANDROID
	AndroidJavaObject mConfig;
	AndroidJavaObject mWindowManager;
#endif
``` 
 
## 軽量化
Stage Directorの設定を画像の通りに
![Main2_unity_-_unitychan-crs-master_-_iPhone__iPod_Touch_and_iPad_と_Facebook.png](https://qiita-image-store.s3.amazonaws.com/0/72960/9385e558-c05e-d1b5-669d-6e6ac1f8b8b0.png)

プレイしてみる
 
## Android設定
http://docs.unity3d.com/ja/current/Manual/android-sdksetup.html
を見ながらSDKダウンロード
 
## iOS設定
http://docs.unity3d.com/ja/current/Manual/iphone-accountsetup.html
 
## こちらを向いてもらおう
### UnityChanLookAt.cs を ドラッグアンドドロップ
![UnitychanLookAtAttach.gif](https://qiita-image-store.s3.amazonaws.com/0/72960/22c41fe3-2cd9-e11e-35de-b4b0e7106e9a.gif)

## パラメータ設定
![Curve_と_Main_unity_-_unitychan-crs-master_-_iPhone__iPod_Touch_and_iPad.png](https://qiita-image-store.s3.amazonaws.com/0/72960/0b76f6fb-927e-22a7-b23a-198f280eb730.png)


## IK設定
![UnitychanIKSetting.gif](https://qiita-image-store.s3.amazonaws.com/0/72960/053495fd-c217-2988-0ed3-ee818acb5aed.gif)

 
## MMDを動かしてみよう
- MMD4Mecanimをインストール
- http://stereoarts.jp
 
#### MMD（モデルファイル）
- https://bowlroll.net
- 注意事項を確認のこと
 
#### VMD（アニメーションファイル）
- https://bowlroll.net
- 注意事項を確認のこと
 
MMD4Mecanimに
 
## ゆれものを付けてみよう

1. UnityChanを見てゆれものがどうなっているのか調べる
1. テラシュールブログ [
ユニティちゃんのおっぱいとか髪とかを揺らす仕組みの設定方法について](http://tsubakit1.hateblo.jp/entry/2014/11/08/233000)を参考に
1. SprintBone.csを ゆれる部位にD&D
1. SpringBoneManager.cs をルートにD&D
1. 向きを設定
1. 子をセット
1. Managerに登録
1. プレイしてゆれるか確認？
1. これらを簡単にするために Assets/MyGame/Editor/SpringBoneCreator.cs があります
 
#### 音楽
http://supercell.sc/music/3melt.zip
http://supercell.sc/music/wim.zip
 
#### 部屋やアセットをDLして豪華にしてみよう
初心者エンジニアがより効率的にコードを書くために必要な三つの力

# 1. 適切な方法でググる力
エンジニアとしてググり力は大事！人に聞いてばっかじゃなくてググれ！とよく言われますが、本当にその通り。
しかし、ググってもでてこないわ..！(泣)という初心者は少なくないでしょう。それは**ググり方が悪い**です。
例えば、Pという問題(Problem)を抱えていて、Gというゴール(Goal)に向かいたいとしましょう。

初心者エンジニアはだいたいこうググります。
「P 防ぐ 方法」
「Rails G やり方」
一発で解決してくれるソースを見つけようとするとハマります。
もちろん簡単なケースや頻出ケースはこれでうまくいくこともありますが、これでは、PやGが多少複雑になった場合、ユニークなケースだった場合、いつまでたっても自分の環境に合う解決策が見つからずさまよい続けるなんてことになりかねません。

良いググり方とは何か。

#### ① P -> Gまでの道のりを細かいパーツに分解しましょう
道のりのパーツの中で、自分が確信を持てない、問題を引き起こしている容疑者をマークします。最終的にすべての容疑者を調べ終えたら犯人がはっきりしていて、ゴールに到達しているように洗い出しましょう。
#### ② 細かい問題毎にググる
細かく汎用的な問題に落とし込めていれば、解決策は大抵くそ簡単に見つかります。これで、一つ一つ確信を持てる状態にして潰していきます。
#### ③ 細かい問題毎にデバッグする
常に、ゴールの状態になったか最後を見るのではなく、細かく潰していくために、細かい問題毎の状態を常にデバッグするようにしましょう。分からなければデバッグ方法も都度調べます。

この細かい問題に分解する意識があるかないかで、ググりによる問題解決能力が飛躍的に変わります。


# 2. 設計図を描く力
ある程度規模が大きかったり、複雑なアプリを書くときにいきなりコードを書き始めるのは止めましょう。**絶対に書き直す事になります。時間がもったいない。**

①  仕様をまとめましょう。それをどう描くか、をある程度頭なり紙にまとめます。
②  仕様側の人にそれを持って行ってすり合わせる。
③  コードを書く。
④  コードを書いている最中に生まれる仕様/設計の変更等は①にまとめる。→②からくりかえす。

仕様とその設計図をまとめておくと、大きいイシューになったときに全体感が掴みやすくなります。そうすると例えば、あとで変更点が出てきたときに、変更すべき点を見つけるのがすごく簡単になります。あとは、全体感をつかめているので、あらかじめリファクタを意識したコードを書きやすくなります。

## [設計図] Taskを細かく分解+時間の見積もり

設計図に関して具体的にすべきこととして、あるイシューに対するコードを書き始める前に、そのイシューを突破するためにすべきtaskを細かく分割して把握しましょう。

想定不足でいきなりコードを書き始めると、書いてる最中に気づいたパターンへの対応などで、これまで書いたコードがゴミになったりすることが多々ある。Task分解による、想定でその無駄を省けます。
また、想定不足で当初の予定以上にだらだら時間をかけてしまうとともに働く人の信頼を失いかねないので、時間の見積もりもしておきます。

# 3. 不確定要素を把握する力
設計図を書きたいとはいえ、コードを書き始める前にはなかなか想定しきれないこともあるでしょう。
そういう場合は、「〜〜には地雷がありそうだから、ここ不確定」というようにどこが不確定で、どこが確定(作業ゲー)なのか、はっきりさせておきましょう。
そして、確定の作業ゲーをやるのは、気持ちいのですが、先に不確定要素に関する調査をして、不確定度合いを下げましょう。そうすることで、無駄にコードを書くことを避けます。
それは、使えるかわからない技術かもしれないし、仲間との仕様のすり合わせかもしれません。
rmd

#最初の投稿
初めての投稿です。

#mathの試験
$ x^2 $　おおおお！変換した！
#plot
math見たいに、グラフコンポーネントをスクリプトで書けるようにならないですかねえ？
[Rsutadio](http://www.rstudio.com/)にはあるみたいですけど、Rはちょっとなあ
CentOS 6.* | Ubuntu 16.04 LTS > 画像ビューワ > eog (Eye of GNOME Image Viewer) | gthumb

動作確認

    CentOS 6.5


画像ファイルを見たい。
CentOSで標準で入っているものとしては以下のものがあるようだ (他にもあるかもしれないが、今の所必要ないので調べていない)。

#eogコマンド

    $eog tmp2.png
のようにして画像を見ることができる。

あとは[右カーソル]と[左カーソル]で次の画像へ表示を切り替えることができる。ちょっとしたスライドショーに便利。

#gthumb

    $gthumb .
とすることでサムネイルを表示できる。
サムネイルの画像を選択して、またサムネイルに戻る時は[Close]を押す。
こちらはマウスのスクロール機能で画像の表示切替をできる。

サムネイル表示以外にも色々機能があるが、今の所使う予定はない。

(追記 2016/10/21)
pngファイルだけのサムネイルを見たい場合は以下。

```
$gthubm *.png
```
 
### Eye of GNOME
(追記 2018/02/16)

eogとは何か。Ubuntuでも使用できた。
https://help.gnome.org/users/eog/stable/index.html.ja
> Eye of GNOME Image Viewer

GNOME環境でインストールされていそうだ。

### link

- [bash (Matplotlib ) + eog > リアルタイム画像表示処理](https://qiita.com/7of9/items/42a0c5e352bd69146177)
Swift（UIKit）の画面遷移


## 画面遷移とは

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/14262/e46dfeff-3d04-241a-ac68-6fdd196c677a.gif)


基本的な画面遷移として、

階層的なアプリを作りたい・NavigationBarをいい感じに付けて表示したいって時はよく使うのが **show**

![スクリーンショット 2015-03-15 23.38.44.png](https://qiita-image-store.s3.amazonaws.com/0/14262/a5db6351-3ed5-c306-f08f-3238e09da7b5.png "スクリーンショット 2015-03-15 23.38.44.png")

下から上にノレンを開けるような画面遷移として **present modally**
を使う

### 1. MainStoryboardでoption + Drag&Drop でくっつける
始めに覚えるやり方ですね

### 2. UIStroyboardSegueでの画面遷移
- Segueのidentifierで分岐とか、unwindSegueなど

[swiftで画面遷移：UINavigationController](http://qiita.com/nofrmm/items/a1378b49751ebedd94d8)

### 3. 遷移先のViewControllerのインスタンスを作成しての画面遷移
画面間で値を渡せる

![スクリーンショット 2015-03-21 8.36.18.png](https://qiita-image-store.s3.amazonaws.com/0/14262/378cd5c5-7b27-2809-6318-03e4f7efea14.png "スクリーンショット 2015-03-21 8.36.18.png")

```swift
    @IBAction func onClickMyButton(sender: UIButton){
        // 遷移するViewを定義する.このas!はswift1.2では as?だったかと。
        let secondViewController: SecondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("secondVC") as! SecondViewController
        // アニメーションを設定する.
        //secondViewController.modalTransitionStyle = UIModalTransitionStyle.PartialCurl
        // 値渡ししたい時 hoge -> piyo
        //secondViewController.piyo = self.hoge
        // Viewの移動する.
        self.presentViewController(secondViewController, animated: true, completion: nil)
    }
```

#### 実は、この画面遷移のアニメーションは非表示に出来ちゃう(Stroyboardでやると確か非表示に出来なかったと思う)
##### animatedをfalseにするだけ 
	self.presentViewController(secondViewController, animated: false, completion: nil)

# 【まとめ】コードで画面遷移！

## **present modally** 戻る
	self.dismissViewControllerAnimated(true, completion: nil)

## **present modally** 2個前の画面に戻る
	self.presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
	
## **show** をコードで
	self.navigationController?.pushViewController(secondViewController, animated: true)

## **show** 戻る
	self.navigationController?.popViewControllerAnimated(true)

## **show** 初めの画面に戻る
	self.navigationController?.popToRootViewControllerAnimated(true)
	
### 【注意！】showはnavigationControllerがnilになってないコトが必要
下記のような操作をして
-> NavigationViewController ->(rootViewController)-> FirstViewController のようにしてあげましょう

![スクリーンショット 2015-03-21 23.39.48.png](https://qiita-image-store.s3.amazonaws.com/0/14262/7c577d49-b069-4632-a59c-357cb5984e39.png "スクリーンショット 2015-03-21 23.39.48.png")

## SwiftUI

[SwiftUI時代の画面遷移](https://qiita.com/H_Crane/items/eb847ca7fb7a0b9e8073#%E7%94%BB%E9%9D%A2%E9%81%B7%E7%A7%BB)

---

# 参考記事
## Objective-Cです
[iOSメモ - コードで画面遷移と値渡し](http://qiita.com/omatty198/items/8db7e1d732c5ef2b445d)

---

####  次回)UILabelやUIViewをコードで生成するか、MainStoryboardでIBOutletで生成するなど
Ubuntu14.04にEmacs24.4を管理者権限（sudo）なしでインストールしたときのメモ

あまり需要がないかもしれないが、ソースから普通にインストールしようとしたら、ncursesがないと怒られたので、メモしておく。GUI版を起動しない人向け。
元ネタは[こちら](https://sordidfellow.wordpress.com/2012/12/20/emacs-24-x-compiling-requires-tputs-issue/)。
インストール先は`$HOME/.local`とし、ここには`PATH`および、`LD_LIBRARY_PATH`は設定済みとする。

```shell
export PATH=$HOME/.local/bin:$PATH
export LD_LIBRARY_PATH=$HOME/.local/lib:$LD_LIBRARY_PATH
```

## ncurses 5.9のインストール
```shell
# Install ncurses
wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz
tar xvf ncurses-5.9.tar.gz
cd ncurses-5.9
./configure --prefix=$HOME/.local --without-install-prefix --with-termlib --enable-termcap --enable-getcap --enable-tcap-names --with-shared --with-widec
make && make install
```
必要か不明だがいろいろオプションをつけた。追記：Pythonのreadlineを使うときにwide-character対応が必要っぽかったので`--enable-widec`を追加。

## Emacs 24.4のインストール
```shell
# install emacs
wget http://open-source-box.org/emacs/emacs-24.4.tar.xz
tar xvf emacs-24.4.tar.xz
cd emacs-24.4
./configure --prefix=$HOME/.local LDFLAGS=-L$HOME/.local/lib --without-pop --without-kerberos --without-mmdf --without-sound --without-wide-int --without-xpm --without-jpeg --without-tiff --without-gif --without-png --without-rsvg --without-xml2 --without-imagemagick --without-xft --without-libotf --without-m17n-flt --without-xaw3d --without-xim --without-ns --without-gpm --without-dbus --without-gconf --without-gsettings --without-selinux --without-gnutls --without-x
make && make install
```
`configure`のときにいろいろと`--without-*`オプションがついているのはGUIの機能を消すため。つけなくてもインストールできるかも。ここで、どうもこの`configure`はライブラリへのパスを見つけてくれないようで、`LDFLAGS=-L$HOME/.local/lib`をなしでビルドしようとすると、またncursesがないと怒られてしまうので注意。

Gistに[Shellスクリプト](https://gist.github.com/tnarihi/6054dfa7b4ad2564819b)を置いておいた。
nslookupは通るのにpingは通らない場合の対処

## 参考

* [かたくのひと nslookupは通るのにpingは通らない](http://chimaki.blog.shinobi.jp/%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3/nslookup%E3%81%AF%E9%80%9A%E3%82%8B%E3%81%AE%E3%81%ABping%E3%81%AF%E9%80%9A%E3%82%89%E3%81%AA%E3%81%84)

> ブラウザとpingは名前解決にリゾルバを使用する
> nslookupはネームサーバーを指定して名前解決を行う。

## DNSキャッシュのクリア

```bash:
ipconfig /flushdns
```

これでpingが通るようになりました。
MEAN.JSに依存モジュールを追加する場所

MEAN.JSベースで作るアプリケーションに対して新たに依存モジュールを追加するときの記述場所のメモ。

例えば、MEAN.JSベースのアプリケーションに対してangular-native-pickerを追加しようとします。

まずは、bowerでインストールします。

```shell:shell-command
% bower install --save angular-native-picker
```

次にconfig/env/all.jsのassetsプロパティのjsの中にこの1行を追加します。

```js
'public/lib/angular-native-picker/build/angular-datepicker.js'
```

最後に、public/config.jsのapplicationModuleVendorDependencies配列に、'angular-datepicker'を追加します。
Web側から特定アプリがインストールされているか判定・処理する方法 #魔法のランプ編 

![](http://i.imgur.com/avoqLTv.jpg)
## 概要
- Web側からオリジナルアプリ(スキーマ)がインストールされているか判定し、その判定結果によって処理を分岐させる。

## 前提
- `myapp://`というオリジナルスキーマからアプリが起動できること
- スマホからのアクセスのみ対象。PC からのアクセスはアプリ紹介ページに遷移させる。
- アプリ未インストールの場合、各 OS(iOS、Android) のオリジナルアプリのマーケットに遷移させる
- アプリインストール済みの場合、アプリを起動する

## 目的
### Web 側からオリジナルアプリがインストールされているか判定する。
#### アプリ非対応デバイス
- アプリ紹介ページに遷移

#### アプリ対応デバイスである
- インストール済み
    - アプリを起動
- 未インストール
    - アクセスしている OS に沿ったアプリのマーケットに遷移

## 問題点
### iOS と Android では標準ブラウザで特定のスキーマに対する遷移方法が異なる
#### iOS
- 認識できないスキーマには遷移前にアラートが表示される
    - スクリプト実行元ページにとどまる

#### Android
- 認識できないスキーマに遷移後、エラーページが表示される
    - スクリプト実行元ページから離脱

```javascript:sample.js
var checkedAt = (new Date()).getTime();
window.setTimeout(function() {
    var lagtime = (new Date()).getTime() - checkedAt;
    if (lagtime > LAG_TIME) {
        window.location = useragent ? IOS_STORE_URL : ANDROID_STORE_URL;
        return;
    }
}, TIMEOUT);
window.location = MY_APP_SCHEMA;
```

- 上記の問題として、Android の場合スクリプト実行元から離脱したタイミングで残りのスクリプトが止まる
    - `setTimeout()`が実行されない
        - 常にアプリインストール済みの挙動になる

## 解決方法
- iframe(魔法のランプ)を使いスクリプト実行元のページから離脱しないようにする
    - スクリプト実行元のページ内部で擬似的にスキーマ遷移させる

### useragent を判定
```javascript:useragent.js
window.MY_APP = window.MY_APP || {};

MY_APP.UserAgent = (function() {
    var ua = navigator.userAgent;
    if ((ua.indexOf('Android') > 0 && ua.indexOf('Mobile') == -1)) {
        return 0;
    } else if ((ua.indexOf('Android') > 0 && ua.indexOf('Mobile') > 0)) {
        return 0;
    } else if (ua.indexOf('iPhone') > 0) {
        return 1;
    } else if (ua.indexOf('iPad') > 0) {
        return 1;
    } else if (ua.indexOf('iPod') > 0) {
        return 1;
    } else {
        return -1;
    }
});
```

### 認識可能スキーマか判定

```html:index.html
<!DOCTYPE html>
<html>
<head>
    <title>MY APP</title>
    <script type="text/javascript" src="js/jquery-1.9.0.min.js"></script>
    <script type="text/javascript" src="js/useragent.js"></script>
</head>
<body>
<script>
    const IOS_STORE_URL = "https://itunes.apple.com/jp/app/hoge/";
    const ANDROID_STORE_URL = "https://play.google.com/store/apps/details?id=hoge";
    const MY_WEB_PAGE_URL = "https://example.com";
    const MY_APP_SCHEMA = "myapp://";
    const USER_AGENT_NOT_SMART_PHONE = -1
    const LAG_TIME = 400;
    const TIMEOUT = 1000;

    $(function() {
        if (MY_APP.UserAgent() === USER_AGENT_NOT_SMART_PHONE) {
            window.location = MY_WEB_PAGE_URL;
            return false;
        }

        $("body").append("<iframe src='" + MY_APP_SCHEMA  + "' style='display:none'/>");
        var checkedAt = (new Date()).getTime();
        window.setTimeout(function() {
            var lagtime = (new Date()).getTime() - checkedAt;
            $("iframe").remove();
            if (lagtime > LAG_TIME) {
                window.location = useragent ? IOS_STORE_URL : ANDROID_STORE_URL;
                return;
            }
        }, TIMEOUT);
    });
</script>
</body>
</html>
```
(Windows)マウスのスクロール方向を変える

# ケース

Windowsにて、マウスのスクロール方向をMacの設定「ナチュラル」に合わせたい。

# 手順

* レジストリから下記のキーをすべて探し、値を「1」に設定する。

> FlipFlopWheel

* PCを再起動する。
docker pullでゆるい冪等性を実現する方法

docker pullでゆるい冪等性を担保する方法を研究してみました。
「ゆるい」というのは、「既に同名のイメージがローカルに存在する場合は実行しない」という意味です。

# docker inspectでイメージの存在の有無をチェックできる

結論から言うと、`debian:latest`の存在チェックをしたい場合は`docker inspect debian:latest`を実行して、終了ステータスをチェックすればよいです。

シェルスクリプトでやるならこう

```bash
docker inspect debian:latest ||docker pull debian:latest
```

Chefでやるならこんな感じで。

```
image_fullname="debian:latest"

bash "docker pull #{image_fullname}" do
  code "docker pull #{image_fullname}"
  not_if "docker inspect #{image_fullname}"
end
```

# 雑感

docker pull,buildみたいなことをするのに、Docker Compose(旧fig)とか Swarm? fleet? Terraform? みたいなツールがいろいろありすぎて頭が混乱しています。

手元でビルドしてイメージを送りつければいい的なな意見を見たこともありますが、「手元でビルド」が職人の手作業になっちゃうじゃないかと思ったり。

とりあえずChef-Soloでやることにしました。

DockerでImmutable Infraを実現するはずが、何故か冪等性を研究してるという...
Estimote iOS SDKのメジャーアップデートに関するまとめ


Estimote iOS SDKがバージョン2.4から3.0にメジャーアップデートしたようなので情報をメモ。

## 情報源

* [Estimote iOS SDK 3.0 @ GitHub](https://github.com/Estimote/iOS-SDK)
* [Estimoteの公式発表](https://community.estimote.com/hc/en-us/articles/205135797-New-SDK-and-firmware-to-make-iBeacon-development-much-easier)
* [Estimote オフィシャルブログの記事](http://blog.estimote.com/post/113970052930/ibeacon-development-just-got-easier-with)
* [Version 2.4からVersion 3.0への移行方法](https://github.com/Estimote/iOS-SDK/blob/master/SDK_3_0_MIGRATION_GUIDE.md)


## ざっくりメモ（2015/03/21現在）

* 後方互換なし
* アップデートはiOS SDKだけ。Androidはもうちょっと待つべし
* ファームウェアもバージョン(3.0.1)にアップデートできる。これによりconditional broadcasting（後述）ができるようになる。現時点ではSDKを使ったアップデートのみがサポートされており、Estimoteの提供するアプリからのアップデートは後日サポートされる予定
* 新たに導入されたクラス
	* [ESTBeaconConnection](http://estimote.github.io/iOS-SDK/Classes/ESTBeaconConnection.html)
	* [ESTUtilityManager](http://estimote.github.io/iOS-SDK/Classes/ESTUtilityManager.html) 
	* [ESTCloudManager](http://estimote.github.io/iOS-SDK/Classes/ESTCloudManager.html)
	* [ESTNearableManager](http://estimote.github.io/iOS-SDK/Classes/ESTNearableManager.html)
	* [ESTTriggerManager](http://estimote.github.io/iOS-SDK/Classes/ESTTriggerManager.html)
* conditional broadcastingという新機能
	* motion only mode：動いている時だけ信号発信
	* flip to sleep mode：ビーコンをひっくり返すと信号発信をストップ。ビーコンを元に戻すと信号発信をスタート。
* ファームウェアを3.0にあげるとビーコンの認証キーが変更されるので、3.0より前のSDKを使ったアプリからアクセスできなくなる模様
Node.jsのLoopback-facebookで躓いたはなし


思えばEasyな問題だったんだけど、つまづいたもんはメモ。

# そもそもやろうとしたこと
私はこんな感じのことがしたかった。

* 外部からはhttpsで独自取得してるドメイン宛にアクセスされる。（例：https://example.com ）
* nginxでリバースプロキシ。外部からのアクセスはまずここに着く。（※別のドメインも運用してたので。）
* Node.js上で動くLoopback-facebook-passportを使って、Facebookログイン認証でログインする。

これを試すべく、サンプルプログラムを下記からゲットして動かしてみた。
https://github.com/strongloop/loopback-example-passport

この時、満足に設定もせずFacebookログインをしようとして困ったことから学んだ話をメモします。

# 困ったこと：CallbackアドレスがうまくFacebookに渡らない
しれっとつなぎにかかった時に、下記のようなエラーが出た。
> 指定されたURLは、アプリケーションの設定で許可されていません。: 指定されたURLの中にアプリの設定で認められないものが含まれています。ウェブサイトまたはキャンバスのURLと一致しているか、ドメインがアプリのドメインのサブドメインである必要があります。

![スクリーンショット 2015-03-20 1.00.51.png](https://qiita-image-store.s3.amazonaws.com/0/19870/312eadb0-98f6-2987-c3a0-a383773db1de.png)

回避策については、調べればいくつか出てきたけど、結局のところ、
Callbackアドレスがnginxで指定した宛先URL( http://192.168.0.1:3000 )になって返されていることに気づいた。

> ...redirect_uri=**http%3A%2F%2F192.168.0.1%3A3000**%2Fauth%2Ffacebook%2Fcallback...

期待するところは下記である。
> ...redirect_uri=**https%3A%2F%2Fexample.com**%2Fauth%2Ffacebook%2Fcallback...

# Try①：nginxのリバースプロキシ設定の変更
もともとは下記のような設定をしていた

```
 server {
    listen 443 ssl;
    server_name example.com;
    
    ssl_certificate CERT_FILE;
    ssl_certificate_key KEY_FILE;

    access_log ACCESS_LOG;
    error_log  ERROR_LOG;

    location / {
          proxy_pass http://192.168.0.1:3000;
   }
}
```

このうち、Location部分を下記の通り変更する。

```
    location / {
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-HTTPS on;
          proxy_set_header X-Forwarded-SSL on;
          proxy_set_header HTTPS on;
          proxy_set_header SSL on;
          proxy_set_header X-Forwarded-Proto https;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

          proxy_pass http://192.168.0.1:3000;
   }
```

※時間を見つけて、設定に追加したいろいろの意味も書いておきたいけど、今は省略

これにより、Callbackアドレスは下記のようになった。
> ...redirect_uri=**http%3A%2F%2Fexample.com**%2Fauth%2Ffacebook%2Fcallback...

Oh... 「https」じゃなく「http」じゃないか。。。
でも、そりゃそうだ。httpで繋いでるんだもんね。

# 最終的な対応：providers.jsonの変更

そりゃそうだ。もともと、ホスト部分は設定変更できないのかなって思ってたんですが、
下記のとおり、callbackURLの部分をアドレスフルパス指定すればよい。

```
  "facebook-login": {
    "provider": "facebook",
    "module": "passport-facebook",
    "clientID": "CLIENT_ID",
    "clientSecret": "CLIENT_SECRET",
    "callbackURL": "https://example.com/auth/facebook/callback",
    "authPath": "/auth/facebook",
    "callbackPath": "/auth/facebook/callback",
    "successRedirect": "/auth/account",
    "failureRedirect": "/login",
    "scope": ["email"],
    "failureFlash": true
```

これやっちゃえば、nginxの設定しなくてもよかった、というオチでした。
これに長く時間をかけちゃったことを反省したいと思います。。。
reduceの使い方

前回は「[filterの使い方](http://qiita.com/arthur87/items/e6e243687b15607dbb14)」「[mapの使い方](http://qiita.com/arthur87/items/2853fe72b421c09d8cba)」を書きました。

今回はreduceの使い方を書きます。

reduceは配列の各要素に次々に関数を適用して、最後に得られた値を返す関数です。

`[1, 2, 3, 4, 5]`という配列の合計を求めるコードを書いていきます。

`for in`文を使った場合です。

```swift:sample1.swift
var result = 0
for n in [1, 2, 3, 4, 5] {
  result += n
}
        
println(result)
```

実行結果は`15`となります。

次にreduceを使った場合です。
ドキュメントを読むと、`func reduce<U>(initial: U, combine: (U, T) -> U) -> U`とあります。
`initial`つまり初期値を指定するということがわかります。`for in`文の例の`result = 0`にあたります。
UとTを与えてUを返せばいいということがわかります。

このとおり書き換えると次のようになります。

```swift:sample2.swift
println([1, 2, 3, 4, 5].reduce(0, combine: {(n, m) -> Int in return n + m}))
```

1行になりました。

これもfilterやmapのときと同様に短く書くことができます。今回は`(U, T)`の2つの引数をとるため`$0`と`$1`となります。

```swift:sample3.swift
println([1, 2, 3, 4, 5].reduce(0){$0 + $1})
```

文字列の配列でも同様の処理ができます。

```swift:sample4.swift
println(["w", "o", "r", "l", "d"].reduce("Hello "){$0 + $1}) // Hello world
```

最後にfilter、map、reduceを使ったコードを示します。

> 税抜き価格の配列`[300, 400, 1000, 200, 4000, 3000, 100]`から、税抜き価格が1000円以上のものを選んだときの税込み価格の合計は何円か。ただし消費税は8%とする。

```swift:sample5.swift
println([300, 400, 1000, 200, 4000, 3000, 100].filter{$0 >= 1000}.map{$0 * 1.08}.reduce(0){$0 + $1}) // 8640.0
```

filter、map、reduceを使ったコードになりました。
分解してみてみます。

はじめにfilterです。1000以上のときtrueを返すようにしています。
`[300, 400, 1000, 200, 4000, 3000, 100].filter{$0 >= 1000}`
この実行結果は、`[1000, 4000, 3000]`です。

次にmapです。それぞれの要素に1.08をかけます。
`[300, 400, 1000, 200, 4000, 3000, 100].filter{$0 >= 1000}.map{$0 * 1.08}`
この実行結果は、`[1080.0, 4320.0, 3240.0]`です。

最後にreduceで、それぞれの要素の合計を求めます。
`[300, 400, 1000, 200, 4000, 3000, 100].filter{$0 >= 1000}.map{$0 * 1.08}.reduce(0){$0 + $1}`
この実行結果は`8640.0`になります。

このようにメソッドチェインを使って処理をつなげて書くことができます。
JitPack.io を使えば簡単に自作 Android ライブラリを配布できてとても便利だった


今まで自作した Android のライブラリを公開してみようとしたものの、MavenCentralRepository などを使用して公開できるまでの手順がとても面倒そうで躊躇していました。

ですが、以下の記事を読んで、Jitpack.io を使えば GitHub 上の自作 Android ライブラリを簡単に配布できることを知ったので試してみました。

[JitPack.ioでGitHub上のJavaプロジェクトを簡単にライブラリとして参照する](http://stormcat.hatenablog.com/entry/2015/02/17/100000)

## 自作 Android ライブラリの変更箇所

build.gradle の dependencies に
`classpath 'com.github.dcendents:android-maven-plugin:1.2'`
を追加します

```
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.1.0'
        classpath 'com.github.dcendents:android-maven-plugin:1.2'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}
```

次に、`library/build.gradle` に
`apply plugin: 'android-maven'`
を追加します

```
apply plugin: 'com.android.library'
apply plugin: 'android-maven'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
}

```

変更は以上で、GitHub に push した後にタグを打っておきます。

## 自作 Android ライブラリを使用するとき

[Jitpack.io 公式サイト](https://jitpack.io/) で GitHub に登録した自作 Android ライブラリ の URL を入力して Lookup ボタンを押下すると、打ち込んだタグが表示されます。

![capture.png](https://qiita-image-store.s3.amazonaws.com/0/35834/14c9c5a4-ef4c-7c60-82e7-36292ed4b4a1.png "capture.png")


使用したいバージョンのタグの横にある Get it ボタンを押下すると、自作 Android ライブラリを使用するためのコードが表示されるので、`app/build.gradle` に挿入します。

```
apply plugin: 'com.android.application'

repositories {
    maven {
        url "https://jitpack.io"
    }
}

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.mosn.testusejitpacklibrary"
        minSdkVersion 9
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'com.github.ShogoMizumoto:TestUseJitpack:1.0.1'
}
```

たったこれだけで完了です！便利ですねー。

## さいごに

Jitpack.io を試してみたときのリポジトリは以下です。ご参考までに。

[ライブラリ](https://github.com/ShogoMizumoto/TestUseJitpack)

[ライブラリを使用しているリポジトリ](https://github.com/ShogoMizumoto/TestUseJitpackLibrary)
私がMongoLabを使うことで解決せぬエラーはなかった。

herokuのアドオン（MongoLab）を使ってみたので色々メモ。


* アドオンの導入とかはググるがままに、でOK。
* デプロイの前に落ち着くこと。前回、bottleを試してみたときのデプロイからpymongoを追加したので、``pip freeze > requirements.txt`でrequirements.txtを更新した。
* mongoLabはherokuのダッシュボード>Add-ons>MongoLabからアクセスできるし、親切設計になっている。
* コマンドとかは記載されているのでコピペでOK。
* データベースは作成されているものを使う。コレクションはブラウザのダッシュボードから作ってみた。
* 嵌ったのは、geolocationデータを使っていたドキュメントを扱うところ。ローカルで作業している時にやった操作をすっかり忘れていて、エラー検証に時間かけてしまった。正解は、「地理空間インデックスを作成する」。以下、作業手順。

ブラウザからでもできそうな感じだったけど、とりあえずターミナルからmongoする。
mongoLabに"To connect using the shell:"コマンドが載っているので、それを使う。
``%mongo <my path> -u <user> -p <password>``

接続したら、
``db.myCollectionName.ensureIndex({myKey: "2d"})``
でインデックスができる。他のコレクションはいけてるみたい。



* herokuとローカルでデータベースを使い分けれるように、こういう感じにすると良いとみんな言ってるし実際にそんな感じ。

```
MONGOLAB_URI = os.environ.get('MONGOLAB_URI')
if MONGOLAB_URI:
    conn = pymongo.Connection(MONGOLAB_URI)
    db=conn.<dbName in mongoLab>
else:
    conn = pymongo.Connection()
    db = conn.<dbName in local>

```

実行の条件にもする。

```

if __name__=='__main__':

  if MONGOLAB_URI:       
      run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))
  else:
      app.run(host='localhost', port=8080, reloader=True)

```

* 常に``heroku logs``でチェックしておくこと！
Gitで今のブランチの派生元ブランチを特定する

Gitを使ったスクリプトなどを書くときに、カレントブランチがどこから派生したかを特定したい時があります。

```
--+--+--+--+   master
      \
       +--+--+--+  parent branch
              \
               +--+--+  current branch
```

例えばこういうケースで、parent branchが何かを特定したい。

こんなとき、

```bash
$ git show-branch | grep '*' | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -1 | awk -F'[]~^[]' '{print $2}'
```

と実行するとなんとか取れます。


## 何をしているのか

> `git show-branch`

`show-branch`は、各ブランチとコミットを一覧して見ることができる便利なコマンドです。

[Git - git-show-branch Documentation](http://git-scm.com/docs/git-show-branch)

例を引用します。

```bash
$ git show-branch master fixes mhf
* [master] Add 'git show-branch'.
 ! [fixes] Introduce "reset type" flag to "git reset"
  ! [mhf] Allow "+remote:local" refspec to cause --force when fetching.
---
  + [mhf] Allow "+remote:local" refspec to cause --force when fetching.
  + [mhf~1] Use git-octopus when pulling more than one heads.
 +  [fixes] Introduce "reset type" flag to "git reset"
  + [mhf~2] "git fetch --force".
  + [mhf~3] Use .git/remote/origin, not .git/branches/origin.
  + [mhf~4] Make "git pull" and "git fetch" default to origin
  + [mhf~5] Infamous 'octopus merge'
  + [mhf~6] Retire git-parse-remote.
  + [mhf~7] Multi-head fetch.
  + [mhf~8] Start adding the $GIT_DIR/remotes/ support.
*++ [master] Add 'git show-branch'.
```

`---`の上にあるのがブランチの一覧です。
左側の記号のうち、`*`が現在のブランチ、`!`がその他のブランチを表し、ブランチごとの最新コミットが右側に表示されます。

`---`の下にあるのがコミットの一覧です。
こちらも左側に記号がありますが、この記号が上部ブランチ一覧の記号の位置と対応しています。
`*`が現在のブランチに属するコミット、`+`がその他のブランチに属するコミットを表します。

なお、`git show-branch branch_A branch_B`といったようにブランチ名を与えると、与えたブランチが交わる根本まで表示します。
`git show-branch --sha1-name branch_A branch_B | tail -1`として、ブランチの分岐点のコミットハッシュを取得することもできます。

参考: [gitで2つのブランチの分岐点を表示 - QA@IT](http://qa.atmarkit.co.jp/q/2148)

本記事は片方のブランチが分からないという前提なので、ブランチ名を与えず、すべてのローカルブランチを出しています。


> `grep '*'`

`show-branch`で出力した一覧から、現在のブランチに属するコミットの行で絞っています。
ここでもう一度上の例で表すと、`*`が付くコミットはこんな感じになるはずです。

```
--*--*--+--+  master
      \
       *--*--*--+  parent branch
              \
               *--*--*  current branch
```

※ `'*'` がカレントディレクトリの展開になる環境では、`"*"`に置き換えて実行してみてください

> `grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -1`

`git rev-parse --abbrev-ref HEAD`でカレントブランチを特定しています。
カレントブランチを含まない行をgrepし、その一番上の行を取り出します。


> awk -F'[]~^[]' '{print $2}'

```
  + [mhf~3] Use .git/remote/origin, not .git/branches/origin.
```

例えば、これまでの操作によってこんな行が取り出されたとします。欲しいのは、`mhf`というブランチ名のみです。
なのでawkの`-F`オプションで区切り文字を指定し、切り分けられた2番目の値のみ出力します。
※このとき区切り文字は正規表現として扱われるので、文字`]`の置き場所はメタ`[`の直後に置きます。


以上のような流れで派生元ブランチを特定することが出来ました！
Google choremで拡大・縮小するとスタイルと違う幅になる


現象を記録します。
拡大・縮小表示時の見た目がたまに変でも、特に困りません。
解決策はありません。

## バージョン
41.0.2272.101

## 現象

1. スタイルで幅12pxを指定したdivを、横に並べる
1. 110%に拡大
1. いくつかのdivが幅13pxで描かれる
1. offsetWidthの値も13px

## 動くデモ
http://jsfiddle.net/ajyqckLu/4/

## ソース
### html
20個のdiv

```html
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
```

### css
幅を指定して、横に並べます。

```css
div {
    background-color: blue;
    box-sizing: border-box;
    float:left;
    height: 1px;
    width: 12px;
}
```

### JavaScript
divの幅を三つの方法で取得します。

1. [HTMLElement.offsetWidth](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetWidth)
2. [jQuery.outerWidth](http://api.jquery.com/outerwidth/)
3. [window.getComputedStyle](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle)


```js
Array.prototype.forEach.call(
document.body.children,

function (e) {
    console.log(
    e.offsetWidth, // HTMLElement.offsetWidth
    $(e).outerWidth(), // jQuery.outerWidth
    window.getComputedStyle(e).width); // window.getComputedStyle
});
```

### 結果
window.getComputedStyleは拡大しても縮小しても同じです。
offsetWidthの値は異なります。

#### 拡大時
12pxと13pxが取れます。

![スクリーンショット 2015-03-20 22.59.21.png](https://qiita-image-store.s3.amazonaws.com/0/15964/5533c74c-8d23-fc89-ff56-bf5022f1249e.png "拡大時の結果")

#### 縮小時
11pxと12pxが取れます。

![スクリーンショット 2015-03-20 23.09.43.png](https://qiita-image-store.s3.amazonaws.com/0/15964/42f51c72-9e50-2a67-f36e-997a8831fa2e.png "縮小時の結果")

たぶん12pxとのズレを埋めるために、13pxか11pxのdivを描いているのでしょうね。

## おまけ
jQeuryは内部で[offsetWidthを使っています](https://github.com/jquery/jquery/blob/10399ddcf8a239acc27bdec9231b996b178224d3/src/dimensions.js#L35)。
Swift 簡単覚え書き


```
import UIKit

//変数宣言
var str1 = "Hello, "
var str2:String = "たぢさん"
var int1:Int = 2
var int2:Int = 3

println(str1 + str2)
println(int1 + int2)
println(String(int1) + String(int2))

//配列
var strArr = [str1, str2, int1, int2]

//配列のfor文 その1
for obj in strArr{
    println(obj)
}

//配列のfor文 その2
for(var i = 0; i < strArr.count; i++){
    println(strArr[i])
}

//構造体
struct MyStruct{
    var name:String
    var age:Int
}

//クラス
class MyClass {
    var name: String
    var age: Int
    //コンストラクタ
    init(name:String, age:Int){
        self.name = name
        self.age = age
    }
}

//構造体生成
var myStruct = MyStruct(name: "クラス", age: 20)
//クラス生成
var myClass = MyClass(name: "構造体", age: 21)

//AnyObject型(構造体の格納不可)
var objAnyObjArr:[AnyObject] = [str1, str2, int1, int2, myClass]

//Any型(構造体の格納可能)
var objAnyArr:[Any] = [str1, str2, int1, int2, myStruct]
```
mapの使い方

前回は「[filterの使い方](http://qiita.com/arthur87/items/e6e243687b15607dbb14)」を書きました。
今回はmapの使い方を書きます。

mapは配列の各要素に関数を適用し、その結果からなる新しい配列を返す関数です。

`["鳥", "花", "車"]`という文字列の配列から`青い鳥と青い花と青い車`という文字列を組み立てるコードを書いていきます。

`for in`文を使った場合です。

```swift:sample1.swift
var result = ""
for element in ["鳥", "花", "車"] {
  if result != "" {
    result += "と"
  }
  result += "青い" + element
}
println(result)
```

実行結果は`青い鳥と青い花と青い車`となります。

次にmapを使います。
ドキュメントを読むと、`func map<U>(transform: (T) -> U) -> [U]`とあります。
TとUは型を示します。今回の場合はどちらともStringとなります。

このとおり書き換えると次のようになります。

```swift:sample2.swift
println(join("と", ["鳥", "花", "車"].map({(element:String) -> String in return "青い" + element})))
```

1行になりました。

コードを分解してみてみます。
`["鳥", "花", "車"].map({(element:String) -> String in return "青い" + element})`
この実行結果は、`[青い鳥, 青い花, 青い車]`となります。次に`join`で配列を連結します。

filterのときと同様に$0を使って短く書くことができます。

```swift:sample3.swift
println(join("と", ["鳥", "花", "車"].map{ "青い" + $0}))
```

数値の配列でも同様の処理ができます。

```swift:sample4.swift
println([100, 200, 300].map{Int($0 * 1.08)}) // [108, 216, 324]
```


最後にTとUの型が異なる場合、例えばStringからIntに変換するコードを書いてみます。
男性だったら1に、女性だったら2に変換する例です。
このような文字列から定義された数値に変換する場面はよくあると思います。

```swift:sample5.swift
println(["男性", "女性", "女性", "男性", "男性"].map{$0 == "男性" ? 1 : 2}) // [1, 2, 2, 1, 1]
```