OmniAICreator/Qiita-1.07M huggingface dataset:
テーブル参照を用いた三角関数値出力アルゴリズム

だいぶ前にFPGAで作ったアルゴリズムをメモとして書いておきます。

#概要
入力角度をテーブル参照を使って求めています。
テーブル参照というのは、メモリ内にsin値、cos値をあらかじめテーブルとして用意しておいて、角度が入力されたときに、テーブルからsin値、cos値を返す方法です。

下記のようにメリット・デメリットがあります。

###メリット
・演算がないため処理が高速
・簡単に作れる
###デメリット
・精度を高めるほどメモリを食う

#テーブルを分割しよう
上のデメリットはテーブルを分割することで緩和できます。
テーブルを分割すると、参照した値を結合するための演算が増える代わりに、必要なデータ数を大幅に削ることができます。


``データ量＝2^(入力のビット幅)×出力のビット幅``

入力、出力を2Byteとすると、テーブルのサイズは128kByteになります。大きいですね。

分割した場合のデータサイズは下記のようになります。

``データ量＝2^（入力のビット幅/分割数)×出力のビット幅*分割数``

例えば、テーブルを4分割するとテーブルのサイズは128Byteまで縮小します。
精度をほぼ落とさずに1/1024に縮小できます！

#データの結合しよう

上で少し触れましたがテーブルを分割するとテーブルから参照したデータを結合する必要があります。
なぜなら、分割したテーブルから参照した値は元々の入力値の三角関数値ではないからです。
それぞれのテーブルから参照した値を結合する必要があります。

![kahou.jpg](https://qiita-image-store.s3.amazonaws.com/0/156008/a98b69a4-572d-79a2-457a-d801a7267daa.jpeg)

結合には加法定理を使います。

``・sin(α+β)=sin(α)cos(β)+cos(α)sin(β)
・cos(α+β)=cos(α)cos(β)-sin(α)sin(β)``

加法定理を使って、それぞれの参照値を結合していきます。
結合回数はテーブルを分割するほど増えるので注意です。
FPGAで掛け算しようとすると結構処理数が増えるので、あまりテーブルを分割するのも考え物です。

ちなみに、4分割すると結合数は3回になります。

#まとめ
テーブル参照を使うことで、処理の軽い三角関数値アルゴリズムを作ることができます。
ですが、精度を高めるほどに使用するメモリが指数関数的に増えていくので、
テーブル分割などのサイズを縮小する対策を考える必要があると思います。

実際には、分割によるデータサイズの削減と結合回数の増加を天秤にかけながら、分割数を決めることになります。
ArchLinuxのtopをclassicにする

Ubuntu使いがArchLinuxに移行すると「topが違う」と気付くわけですが原因と直すtips。

原因はtopが入っているprocpsのコンパイル時に--enable-modern-topというoptionが入ってることらしいです。コンパイル時Optionだと設定ファイルじゃどうしようもないですね。

という訳で直したい人はAURに入ってる`procps-ng-classic`をインストールすればいいです。まぁぼくは素直にhtopに移行しましたが。

ぶっちゃけるとmodernデザインが嫌だったというより、操作方法がさっぱり分からんかったという方が大きいので、ちゃんとドキュメント読める人なら読んだ方がいいかも。あとmodern designならマウスで操作できるhtopの方が便利(ぉ
PD制御のCartPoleで学ぶOpenAI Gym

OpenAI GymのCartPole-v0をPD制御で動かしたら上手く行ったので投稿。用途が違いすぎるけれど、使い方を学ぶためのデモとしては十分かなと。

制御アルゴリズムは正負でクラップした(つまり-1か+1の)PD制御。

コードは以下。
細かい解説は全部コードに記述してます。
また、[github](https://github.com/Matchlab314/CartPole)にもあげています。

```python:cart_pole_pd.py
# coding : utf-8

# 正負でクラップしたPD制御のエージェントを使ったCartPole-v0のデモンストレーション

# 値の意味
#  observation : [カートの位置(単位不明), カートの速度(単位不明), ポールの角度(ラジアン), ポールの角速度(単位不明)]
#  action : 0->-1, 1->+1
#  step : 100step = 1秒
# 終了条件 : 15度以上傾く or 2.4(単位不明)以上中心から移動 or 200ステップ

import agents
import gym
from gym import wrappers

video_path = './video' # ビデオを保存するパス
n_episode = 1 # エピソード数
n_step = 200 # ステップ数
# PD制御パラメータ(ちなみP制御だけだと上手く行かない)
# ※正負でクラップしているので、比しか意味ない
kp = 0.1
kd = 0.01

myagent = agents.PDAgent(kp, kd) # 正負でクラップしたPD制御のエージェント
env = gym.make('CartPole-v0') # 環境作成
# 指定のディレクトリにビデオを保存する環境のラップクラス
# force=True：以前のモニタファイルを自動的にクリア
env = wrappers.Monitor(env, video_path, force=True)
for i_episode in range(n_episode):
    observation = env.reset() # 環境初期化＆初期観察取得
    for t in range(n_step):
        env.render() # 環境を表示(でもMonitorを使うとなくても表示される)
        print(observation)
        action = myagent.action(observation) # エージェントクラスから行動を取得
        observation, reward, done, info = env.step(action) # １ステップ進める
        if done: # 終了フラグ
            print('Episode finished after {} timesteps'.format(t+1))
            break
```

```python:agents.py
# coding: utf-8

import random

# ランダムなエージェント
class RandomAgent():
    def action(self):
        return random.randint(0, 1) # ０以上１以下の範囲の整数の乱数を返す

# 正負でクラップしたPD制御のエージェント
class PDAgent():
    def __init__(self, kp, kd):
        self.kp = kp
        self.kd = kd

    def action(self, observation):
        m = self.kp * observation[2] + self.kd * observation[3] # 操作量を計算
        if m >= 0:
            return 1
        if m < 0:
            return 0
```
マウスポインターがボタンの上にくると、ボタンが大きくなったり小さくなったりするAnimation

```xml:MainWindow.xaml
 <Window.Resources>
        <Style TargetType="Button" x:Key="BigAndSmallStyle">
            <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
            <Setter Property="RenderTransform">
                <Setter.Value>
                    <ScaleTransform ScaleX="1" ScaleY="1"/>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard RepeatBehavior="Forever" AutoReverse="True">
                                <DoubleAnimation To="1.3" Duration="0:0:0.5" Storyboard.TargetProperty="RenderTransform.ScaleX"/>
                                <DoubleAnimation To="1.3" Duration="0:0:0.5" Storyboard.TargetProperty="RenderTransform.ScaleY"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                    <Trigger.ExitActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Duration="0:0:0.1" Storyboard.TargetProperty="RenderTransform.ScaleX"/>
                                <DoubleAnimation Duration="0:0:0.1" Storyboard.TargetProperty="RenderTransform.ScaleY"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.ExitActions>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <Button Content="logo" Margin="100" Style="{StaticResource BigAndSmallStyle}" Width="100" Height="100"/> 
    </Grid>
```
VirtualHostでのApacheダイジェスト認証

OS: CentOS 7


追加する場合はオプションなし

```
# htdigest -c /etc/httpd/.htdigestpw "<認可領域名>" <ユーザー名>
```

ユーザ指定の場合はRequre user [ユーザ名]

```
# vim /etc/httpd/conf.d/vhost/<ファイル名>
<VirtualHost 111.111.111.111:80>
        ServerName XXXXX.jp
        .
        .
        .

        <Location />
            AuthType Digest
            AuthName "<認可領域名>"
            AuthUserFile "/etc/httpd/.htdigestpw"
            Require valid-user
        </Location>

        <Directory /home/some/web/>
            .
            .
            .
        </Directory>
</VirtualHost>
```
中心極限定理について

# 中心極限定理とは
## wikiによると・・・
- 中心極限定理は、確率論・統計学における極限定理の一つ。
- 大数の法則によると、ある母集団から無作為抽出された標本平均はサンプルのサイズを大きくすると真の平均に近づく。これに対し中心極限定理は標本平均と真の平均との誤差を論ずるものである。多くの場合、母集団の分布がどんな分布であっても、その誤差はサンプルのサイズを大きくしたとき近似的に正規分布に従う。
- なお、標本の分布に分散が存在しないときには、極限が正規分布と異なる場合もある。
- 統計学における基本定理であり、例えば世論調査における必要サンプルのサイズの算出等に用いられる。

##まとめると
- 母集団の分布がどんな分布であっても、その誤差はサンプルのサイズを大きくしたとき近似的に正規分布に従う。
- 例えば、 n 個のサイコロを振って出た目の合計数の分布をとった時に、1個のサイコロでは、各目が出る確率はそれぞれ 1／6 、平均は 7／2 、分散は 35／12。サイコロの数 n が大きくなると，合計数の分布は正規分布に近づいていく。

# R を使って試してみる
## サイコロをN個投げて、その目の和がSとなる確率を求める。
```
> #サイコロ作成
> dice <- 1:6

> #データ表示 
> dice
[1] 1 2 3 4 5 6

> #サイコロを2個投げることを100000回繰り返す
> dice_two_sum <- foreach(1:100000,.combine = "rbind") %do% {
> +   sum(sample(dice,2,replace = TRUE))
> + }

> #ヒストグラム
> hist(dice_two_sum,breaks = 30)
```

![alt](http://~![Cannot read property 'type' of null]()![image](https://qiita-image-store.s3.amazonaws.com/0/151919/06ea3874-1da1-638a-52ce-8228dcc0d03d.png)
)
Ubuntu 16.04 LTSにPyCharmを入れてみた(PPA使えない事件）

geditに耐えかねて、VirtualBox上のUbuntuにeclipseは重いので、PyCharmを導入。PyCharmは英語なのが残念だけれど。

#JDKを入れる
`$ sudo add-apt-repository ppa:webupd8team/java`
`$ sudo apt-get update`
`$ sudo apt-get install oracle-java8-installer`
これでPCを再起動すれば、環境変数も自動的に設定されている。
(参考サイトと違って、oracle-java8-installerと一緒にoracle-java8-set-defaultもインストールされた。)
参考：[Ubuntu にOracle Java 8 (PPA)をインストールする(ubuntu)](http://qiita.com/TsutomuNakamura/items/f12fdf0a8502e634584d)

#PyCharmを入れる
[ここ](http://ubuntuhandbook.org/index.php/2016/07/latest-pycharm-ubuntu-16-04-ppa/)を見てPPA使おうとしたら、注意書きが…
[mystic-mirage/pycharm](https://launchpad.net/~mystic-mirage/+archive/ubuntu/pycharm)というPPAがあったのに、「No more updates here.(これ以上の更新はありません)」と、宣言されてしまった…orz
仕方ないので、[公式サイト](https://www.jetbrains.com/pycharm/download/#section=linux)からダウンロードして来ることに。


#PyCharmを実行
`$ pycharm`
機械学習・深層学習（Deep-Learning）に触れてみた感想

# はじめに
今年に入って，機械学習・深層学習について勉強を進めてます．
現在，それぞれ1冊づつ読み終えた感じなので，整理の一環で記事を書くことにしました．
偏った見解や誤った情報を載せてしまっているかもしれないので，それを念頭に読んでいただけると幸いです．

極力カタカナ表記をしないようにする．もしくは，合わせて英語表記を入れることにしてます．
そのキーワードの意味が見えなくなることを避けるためです．

# 両技術に共通して言えること
両技術ともに，インプットのデータを解析して分類・回帰予測すると言う流れになっているというもの．
この**解析**の部分が，機械学習と深層学習で大きく違うことになる．
似たようなものにAI（人工知能）があるが，これについてはこの記事では一切触れないことにする．
（と言うよりAIの知識が皆無のため）

# 基礎・関連している分野

## 情報処理
これは，コンピュータを使っている以上，基礎スキルとして，身につけておくべきものだろうと考えてる．
機械学習・深層学習に於いては，特に，データがアンケートやテキストのような1次元データや画像のような2次元データのもの，更に，時系列を加えたストリーミングデータ・動画像など様々ある．これらをプログラムで処理するので，取り扱いたいデータがどんな性質があるかを知っておく必要があるだろう．

## 微積分
結果から得られる理想値と実測値との誤差の最小化や観測データの累積，最適化問題を解くために，微積分の知見やテクニックが必要となる．

## 線形代数学
一度に多くのパラメータを取り扱うため，ベクトル・行列の計算テクニックを利用する．
また，膨大な計算量を少しでも減らすためのテクニックが線形代数学に知見があるため，大いに活用する．
スカラー・ベクトル・行列を更に一般化したテンソル（Tensor）は，名前は知ってる程度なので触れないでおく．

## 統計学
機械学習・深層学習は分類・回帰予測が得意分野となる．この分野は統計学で様々な知見がある．
主に，観測されたデータを元に，理想値と実測値の誤差を最小にするために，モデルを最適化するときに活用できる．

# 最後に
機械学習・深層学習の中で，モデルを組み立てて，内部変数（重みパラメータ）を決定させるための最適化問題がある．
この問題を解くために最も使われるのが最小二乗法（Least Squares Method）が上記の分野の寄せ集めのようなものだと思う．
これ以外にも，損失関数やLagrange未定乗数法，サポートベクターマシン（SVM），パーセプトロンPerceptron，
ニューラルネットワーク(Neural-Network)やボルツマンマシンなど次々と難しい理論や仕組みが出てくる．

これを基に1つづつ記事に出来れば良いなと思ってます．
IntelliJ IDEA（PyCharm）でPythonプロジェクトのパッケージの参照解決のメモ

IntelliJ（またはPyCharm）でPythonプログラムを開くとデフォルトでは自動でパッケージの参照解決をしてくれません。

![screenshot-2017-02-12-123023.png](https://qiita-image-store.s3.amazonaws.com/0/7885/373c172a-3b42-0c0b-87f7-38211694f09b.png "screenshot-2017-02-12-123023.png")

公式みたのですがちょっとわかりにくかったのでここにまとめます。

- IntelliJ IDEA 2016.3
- Python 3.5.2 :: Anaconda custom (x86_64)


メニューの`File` > `Project Structure` or `⌘+;` で Project Structure画面を開く。


![スクリーンショット 2017-02-12 12.33.39.png](https://qiita-image-store.s3.amazonaws.com/0/7885/a045f1be-453e-434b-c268-64a24738a94b.png "スクリーンショット 2017-02-12 12.33.39.png")

Project SDKのところにSDKがセットされていません。

`New`から`Python SDK` ⇛ `Add Local`を選択。


自分の環境ではAnacondaを利用しているため、下記バスを指定してあげます。

```
$ which python
/Users/username/anaconda/bin/python
```
![スクリーンショット 2017-02-12 12.37.34.png](https://qiita-image-store.s3.amazonaws.com/0/7885/2a2ea1bb-98a8-c258-7ee5-62cfe1190c5e.png "スクリーンショット 2017-02-12 12.37.34.png")


SDKをセットできたので、そのまま`OK`。


あとはIDEが自動でインデックスを貼ってくれます。

![スクリーンショット 2017-02-12 12.40.10.png](https://qiita-image-store.s3.amazonaws.com/0/7885/ff027cf0-36d0-a2f8-5a21-348341a3d5c4.png "スクリーンショット 2017-02-12 12.40.10.png")



参考：
http://stackoverflow.com/questions/24769117/how-do-i-configure-a-python-interpreter-in-intellij-idea-with-the-pycharm-plugin
プロジェクトごとに CocoaPods のバージョンを合わせる

プロジェクトごとに CocoaPods のバージョンを管理するための備忘録。
Bundler を使用して、各プロジェクトごとに CocoaPods をインストールする方法です。

# こんなときに便利

- 複数人での開発で、バージョンを揃えたい
- プロジェクトで使用しているライブラリが、CocoaPods の特定のバージョンである必要がある
（このライブラリはCocoaPodsの0.35.0でしかうまく動かないとか・・・あったんですよ。）

# 環境というか前提

Ruby が必要です。
が、CocoaPods 使ってるということは Mac の環境だと思われるので、標準で入っているから問題ないでしょう。
Ruby のバージョンも揃えたいとか変えたいとかいう場合は、rbenv などを入れると幸せになれるかもしれません。

# Bundler のインストール

インストール済みの場合は無視して次へ

```
$ sudo gem install bundler
```

# Bundler の初期化

```
$ cd プロジェクトファイル(.xcodeproj)のディレクトリ
$ bundle init
```

これで上記の場所に Gemfile が出来上がる。
すっとばして、別プロジェクトから Gemfile を持ってきてもいい。

# Gem の編集

Gemfile を開いて、以下のように編集(不要なものを消して CocoaPods を追記)。
ここでは CocoaPods の 1.1.1 をインストールする想定。

```
source "https://rubygems.org"
gem 'cocoapods', '1.1.1'
```

# CocoaPods のインストール

Gemfile のあるディレクトリで以下のコマンド実行。

```
$ bundle install --path vendor/bundle
```
「--path 〜〜〜」の指定がないと、プロジェクトと関係ない場所にインストールされてしまうので注意！！

これで CocoaPods のインストールが完了。
あとは普通に CocoaPods を使用する。
・・・のだが、一つ注意。

Bundler を使って CocoaPods をインストールしているので、CocoaPods のコマンドを使用するときは、以下のように「**bundle exec**」と打ってから、コマンドを書く必要がある。

```
$ bundle exec pod update
```

一人で開発していても、何かのときのために環境を作っておくと便利かなと思います。
共有せずに他の人に引き継いじゃうと、その人が悲しい目にあうかもしれませんが・・・。
Updated Hospital_dashboard to ver.2.0

https://github.com/riow1983/Hospital_dashboard/tree/ver2.0/Hospital_Dashboard_ver2.0


Added: 
・pandas.DataFrame 
・connection to PostgreSQL 
・ajax for automatic update

Improved: 
・html layouts.

Required versions: 
・Bokeh: 0.12.2 (Please do not upgrade over 0.12.2.) 
・PostgreSQL: 9.4
第 27 回シェル芸勉強会 参加しました

とても勉強になって面白いことがいっぱいあったけど、特に印象に残ったことを覚え書き

- 端末制御
  - stty
    標準入力に紐付けられている端末の情報を得られる
  - tput
    標準出力に紐付けられている端末の情報を得られる
- 日常会話
  - ssh + tee テクニック
    `cat ~/.ssh/authorized_keys | ssh <target_host> tee -a ~/.ssh/authorized_keys`
    ssh でリモードコマンドを実行しようとすると、リダイレクトの扱いが面倒 (ローカルのシェルで解釈される)
    この時、tee が便利になる。また、目視できる。
    ssh は標準入力をリモートコマンドの標準入力に流す機能がある。
- sed こわい
  - ; で区切れる
  - パターンスペース、ホールドスペース
  - **ストリームエディタ** なので、範囲指定した操作も 1 行づつマッチして、操作を実行する
    `seq 10 | sed '1,3d;2,5p` の結果など
  - ラベル
  - sed での順次 `;` 反復 `:LABEL` 分岐 `b` or `t`

sed でサクッと FizzBuzz 書いてしまえるあたりにシェル芸は愛せると再認識した。

---

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">sed がチューリング完全と聞いて、丸括弧の開きと閉じの数が一致している文脈自由言語の Acceptor on sed 作った<a href="https://twitter.com/hashtag/%E3%82%B7%E3%82%A7%E3%83%AB%E8%8A%B8?src=hash">#シェル芸</a> ではないけど成果物</p>&mdash; 小原　一哉 (@KoharaKazuya) <a href="https://twitter.com/KoharaKazuya/status/830333643453181953">2017年2月11日</a></blockquote>

```
:FIRST
/^)/b BRAC_STOP;
/^(/b BRAC_START;
/^./b SEQ;
b STOP;

:BRAC_START
x;
s/^/BRAC_START\n/;
x;
b SEQ;

:BRAC_STOP
x;
/^BRAC_START\n/b BRAC_ACCEPT;
s/^/BRAC_STOP\n/;
x;
b SEQ;

:BRAC_ACCEPT
s/^BRAC_START\n//;
x;
b SEQ;

:SEQ
s/^.//g;
b FIRST;

:ERROR
d;

:STOP
x;
/./b ERROR;
s/^/ACCEPT/;
p;
d;
```
[WPF] TabControlのタブを左に配置する

WPFのTabControlでタブの表示位置を変えたかったのでやり方を調査したまとめ。

# TL;DR

今回は左側に文字列も回転させた状態で表示したかったため、以下のようになりました。

![tab_exsample.png](https://qiita-image-store.s3.amazonaws.com/0/37721/36473a01-0458-a5b0-236d-234f05078297.png)

```xml:実装例
<TabControl TabStripPlacement="Left">
    <TabControl.Resources>
        <Style TargetType="{x:Type TabItem}">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <TransformGroup>
                        <RotateTransform Angle="90"/>
                    </TransformGroup>
                </Setter.Value>
            </Setter>
        </Style>
    </TabControl.Resources>
    <TabItem Header="Header1"></TabItem>
    <TabItem Header="Header2"></TabItem>
    <TabItem Header="Header3"></TabItem>
    <TabItem Header="Header4"></TabItem>
    <TabItem Header="Header5"></TabItem>
    <TabItem Header="Header6"></TabItem>
    <TabItem Header="Header7"></TabItem>
</TabControl>
```

# 説明（詳細）
## WPFのデフォルトレイアウト
WPFでのデフォルトのTabControlは以下のように上側に表示されます。

![tab1.png](https://qiita-image-store.s3.amazonaws.com/0/37721/cf28cf92-8f87-6f54-9b2a-6d9475d4606c.png)

## タブの表示位置を変更する
タブの表示位置を変更するには `TabControl` の `TabStripPlacement` を変更します。今回は `Left` を指定してます。

![tab2.png](https://qiita-image-store.s3.amazonaws.com/0/37721/acdac752-5790-d05e-053d-10cc0e648b0c.png)

## タブの文字の向きを変更する
タブのヘッダーの文字の向きを変更するには、`LayoutTransform` を変更します。
(`RenderTransform` だとレイアウトに反映されないため、`LayoutTransform` を使用する）
タブの一つ一つに指定するのは大変なので、`Style` 設定で `TabItem` 全てに適用します。
以下は、文字の向きを90度回転させた例になります。

![tab3.png](https://qiita-image-store.s3.amazonaws.com/0/37721/11b3262b-d508-a2e7-880e-c6020418b3fc.png)

特定のテーマ等を事前に読み込んでいる場合は、Styleの箇所に該当のものを `BaseOn` で継承してください。

# 関連
## DragablzのTabablzControlでの方法

![dragablz.png](https://qiita-image-store.s3.amazonaws.com/0/37721/9c99380f-138a-3771-949f-4bb0123f74df.png)


マテリアルデザインでタブコントロールを使いたい場合に、同作者のDragablzを使う場合で文字を回転させたい場合は以下を参照すればいいです。`SidePanels` のサンプルがそのままつかえるはずです。

[c# - WPF :Material Design + dragablz tabItem header style - Stack Overflow](http://stackoverflow.com/questions/34830946/wpf-material-design-dragablz-tabitem-header-style)
[DragablzSamplez/MainWindow.xaml at master · ButchersBoy/DragablzSamplez](https://github.com/ButchersBoy/DragablzSamplez/blob/master/SidePanels/MainWindow.xaml)


# 参考
[TabControl rotate to 90 degree](https://social.msdn.microsoft.com/Forums/vstudio/en-US/c5ad0f19-dd40-435f-9227-e14ee638eefb/tabcontrol-rotate-to-90-degree?forum=wpf)
[RenderTransformプロパティとLayoutTransformプロパティの違い - Yuya Yamaki’s blog](http://d.hatena.ne.jp/Yamaki/20070222/1172107092)
rails: rvmを使ったワークフロー備忘録

railsやrubyそしてgemの管理をできる便利なrvmですが、rails初心者なためか毎度毎度rvmを使ったワークフローを忘れてしまうので備忘録として書き留めていこうと思う。以下は<a href="http://www.rakeroutes.com/blog/rvm-workflow-for-a-new-rails-app/" target="_blank">こちらのサイト</a>よりコピーしてきたものなので筆者オリジナルではありません。

```
# create and use the new RVM gemset
$ rvm use --create 1.9.3@awesome_rails_project

# install rails into the blank gemset
$ gem install rails

# generate the new rails project
$ rails new awesome_rails_project

# go into the new project directory and create an .rvmrc for the gemset
$ cd awesome_rails_project
$ rvm --rvmrc 1.9.3@awesome_rails_project

# verify the rvmrc
$ cd ..; cd -
```
JavaScriptとHTMLで、Unicodeのサロゲートペアを表示する練習

(2015-04-27 の練習メモからこちらに移転)

文字コードの復習をちょっとしてたら、Unicodeのサロゲートペアって今まで気にしたこと無かったことに気が付きました。
ということで、お仕事でも扱うJavaScriptとHTMLで、まずはサロゲートペアを「表示」してみる練習です。(2015-04時点のES5対応迄)

* http://jsfiddle.net/msakamoto_sf/xp9mzzxb/

<!-- more -->

簡単にまとめると以下のようになります。

* HTMLなら・・・
    * `&#x20BB7;` や `&#x20B9F;` のような数値文字参照を使って、Unicodeコードポイントをそのまま16進数で表記すればOK.
* JavaScript(ES5まで)とJSONなら・・・
    * サロゲートペア対象外の文字なら、`\u(コードポイント16進数表現)` をリテラルとして使える。
    * サロゲートペア対象の文字なら、サロゲートペアに分割し、`\u(上位サロゲートの16進数表現)\u(下位サロゲートの16進数表現)` とする。
* ES6での予定(上記jsfiddleには組み込んでません)
    * サロゲートペア対象の文字でも、分割せずにそのまま `\u{20BB7}` (土吉) と表記できる。
    * String.codePointAt() によりサロゲートペアを分割せずにコードポイントを取り出せる。
    * RegExpで `/u` フラグが追加され、サロゲートペアを分割せずに1文字として処理できる。

今回は表示しか練習しませんでした。文字数のカウントなど、より実践的なテクニックについては以下の参考URLの一部で詳しく解説されてます。

* HTML Document Representation
    * http://www.w3.org/TR/html4/charset.html
    * "5.3 Character references" で数値文字参照や文字実体参照の記法が解説されてます。
* Grammar and types - JavaScript | MDN
    * https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Grammar_and_types
    * "Unicode"のところで、Unicode エスケープシーケンスについて解説されてます。
* サロゲートペア入門：CodeZine
    * http://codezine.jp/article/detail/1592
* JavaScript Stringでサロゲートペアを扱う - teppeis blog
    * http://teppeis.hatenablog.com/entry/2014/01/surrogate-pair-in-javascript
    * JSでの文字数カウントでサロゲートペアを考慮したやり方について解説されてます。
* JavaScriptでのサロゲートペア文字列のメモ - Qiita
    * http://qiita.com/YusukeHirao/items/2f0fb8d5bbb981101be0
    * これもJSでの文字数処理での実践的なテクニックについて解説されてます。ES5とES6とで異なってくる？
* JSONのエスケープ | yohgaki's blog
    * http://blog.ohgaki.net/json-escape
    * JSONでのエスケープについて詳細に解説されてます。PHPでの注意点も詳しいです。

また、ES6でのUnicodeサポートについては以下を参考にしました。

* lukehoban/es6features
    * https://github.com/lukehoban/es6features#unicode
* Mozilla における ECMAScript 6 のサポート - JavaScript | MDN
    * https://developer.mozilla.org/ja/docs/Web/JavaScript/ECMAScript_6_support_in_Mozilla
* ECMAScript 6 compatibility table
    * http://kangax.github.io/compat-table/es6/

※hatena id:jser さんからのコメントをきっかけに、ES6でのUnicodeサポートについて追記
JavaでUnicodeのサロゲートペアを扱う練習

文字コードの復習をちょっとしてたら、Unicodeのサロゲートペアって今まで気にしたこと無かったことに気が付きました。
ということで、お仕事でも扱うJavaで、サロゲートペアの文字列を組み立てたり、文字数をカウントしたりする練習をしました。

* https://github.com/msakamoto-sf/javasnack/blob/master/src/test/java/javasnack/langspecs/TestUnicodeSurrogatePairs.java

Java 1.4まではサロゲートペアは考慮されてませんでしたが、1.5になり、サロゲートペアを考慮したAPIが追加されました。そこで、上記テストコードでは1.4系までのAPIと、1.5で追加されたAPIを呼び出してみて、挙動を比べてます。

まず char 型でサロゲートペアを表現してみます。上位サロゲート、下位サロゲートをそれぞれ別のchar型変数として分け、配列に組み込んでます。

```java
char c1 = '\u3042'; // HIRAGANA LETTER A, cp=12354
char c2 = '\uD842'; // tuchi-yoshi (high), cp=134071
char c3 = '\uDFB7'; // tuchi-yoshi (low), cp=134071
char c4 = '\u30D5'; // katakana fu, cp=12501
char c5 = '\u309A'; // handakuten, cp=12442
char c6 = '\uD842'; // kuchi + shichi (high), cp=134047
char c7 = '\uDF9F'; // kuchi + shichi (low), cp=134047
String s = new String(new char[] { c1, c2, c3, c4, c5, c6, c7 });
assertEquals(s, "\u3042\uD842\uDFB7\u30D5\u309A\uD842\uDF9F");
```

続いてサロゲートペアを考慮しない `String.length()` や `String.charAt()` を使って文字列をコピーしてみます。最後の `assertEquals()` を見ると、サロゲートペアが分割された状態の `int[]` から生成した文字列と一致しています。上位サロゲート・下位サロゲートをそれぞれ独立した一文字として扱い、コピーしている様子が確認できます。

```java
int len = s.length();
assertEquals(len, 7); // ignores surrogate pair :P
int[] actualCps = new int[len];
for (int i = 0; i < len; i++) {
    char c = s.charAt(i);
    actualCps[i] = (int) c;
}
// Ignores surrogate pairs... :(
// BUT JavaScript unicode escape in browser accepts this format...:(
assertEquals(actualCps, new int[] { 0x3042, 0xD842, 0xDFB7, 0x30D5, 0x309A, 0xD842, 0xDF9F });
```

今度はサロゲートペアを考慮する `String.codePointCount()` や `String.codePointAt()` を使ってみます。最後の `assertEquals()` を見ると、サロゲートペア対象文字をUnicodeコードポイントの16進数で表現した文字列と同じになります。サロゲートペアを1文字としてカウントし、扱えている様子が確認できます。

```java
int countOfCp = s.codePointCount(0, len);
assertEquals(countOfCp, 5); // GOOD.

actualCps = new int[countOfCp];
for (int i = 0, j = 0, cp; i < len; i += Character.charCount(cp)) {
    cp = s.codePointAt(i);
    actualCps[j++] = cp;
}
// GOOD.
assertEquals(actualCps, new int[] { 0x3042, 0x20BB7, 0x30D5, 0x309A, 0x20B9F });
```

参考：

* Java による Unicode サロゲートプログラミング
    * https://www.ibm.com/developerworks/jp/ysl/library/java/j-unicode_surrogate/
    * これがJavaでのUnicodeの扱いや追加されたAPIについて非常に詳しい。実行速度への検討もされている。
* サロゲートペア入門：CodeZine
    * http://codezine.jp/article/detail/1592
* JIS2004に含まれるサロゲートペア。Javaでの文字列操作を検証してみた | 株式会社メイプルシステムズ
    * http://maplesystems.co.jp/blog/all/programming/4709.html
PlantUML+Atomで環境構築(Mac版)

#始めに
・メモ用に記入

##Graphvizダウンロード
http://www.graphviz.org/Download..php
"Stable and development Mac OS Install packages"でダウンロード


##Javaインストール
公式からダウンロード
・https://www.java.com/ja/
　（すでに入れていたのでスキップしました。）

##Atomインストール
インストール
・https://atom.io/

<img width="925" alt="スクリーンショット 2017-02-12 11.25.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/141761/8064f678-a4bf-5aa7-cc14-96a34934a95e.png">

##plantuml-viewerをインストール
①Atomを開く
②Install a Package>OpenInstallを選択
③検索窓に"plantuml"と入れればplantuml-viewerが出るのでインストールする
<img width="636" alt="スクリーンショット 2017-02-12 11.28.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/141761/3cc6b22c-dff1-3884-86f2-588298db9f9f.png">

##動作確認
テキストエリアに確認用コードを記入
class ClassA { 
  Init()
}
class ClassB {
  Init()
}
ClassA -> ClassB

control+option+pで正しく表示されれば完了
NSLogで数値を扱うとき

とりあえず登録したら、何か投稿しないとということで・・・。
ありきたりなNSLogのことでも。
今更書くことでもないわ、ってネタですが。

NSInteger だったり CGFloat だったり、数値をログに出したいことはしょっちゅうあることで。

だいたいは

```objc:
NSInteger foo = 12345;
NSLog(@"foo:%d", foo);

CGFloat bar = 123.45f;
NSLog(@"bar:%f", bar);
```

とかでしょうか。
32ビットの端末だとこれで問題ないです。

でも64ビットの端末だと

```objc:
NSInteger foo = 12345;
NSLog(@"foo:%ld", foo);

CGFloat bar = 123.45f;
NSLog(@"bar:%lf", bar);
```

のようにしないと警告が出ます。

いちいちめんどくさいですよね。・・・めんどくさいですよね？
そこで、以下のようにすればどっちでも問題なくなります。

```objc:
NSInteger foo = 12345;
NSLog(@"foo:%@", @(foo));

CGFloat bar = 123.45f;
NSLog(@"bar:%@", @(bar));
```

同じ書き方でいけるので楽です。



そろそろ32ビットも切られちゃうそうですね。（[9to5mac](https://9to5mac.com/2017/01/31/ios-10-3-beta-32-bit-app-warning/)）
そうなると上記の話もまぁ、どうでもいいことになっちゃいますが。
そんなことよりテスト端末どうしよう・・・。
4sと5cしか持ってないよ・・・。

参考：
[https://9to5mac.com/2017/01/31/ios-10-3-beta-32-bit-app-warning/](https://9to5mac.com/2017/01/31/ios-10-3-beta-32-bit-app-warning/);
[Swift] デバッグ時だけ出力

おそらく、もう何度目だと言われそうなものですが、DEBUGマクロが有効な時のみコンソールに出力する関数群です。

Swift.print などをオーバーライドする方法があったりしますが、リリース時にも出力したい場合、`Swift.print`としなければならないのが面倒臭いため、クラスにまとめました。（Swiftは任意のネームスペースが持てないので）

また、DebugクラスにまとめたことでDubegで検索するだけですぐ見つかります。

`Debug.debugPrint`の出力は`Swift.debugPrint`の出力とは完全には一致していません。

```swift
class Debug {
    private struct Args: CustomStringConvertible, CustomDebugStringConvertible {
        let args: [Any]
        let separator: String
        var description: String {
            return args.map { "\($0)" }.joined(separator: separator)
        }
        var debugDescription: String {
            return args
                .map { ($0 as? CustomDebugStringConvertible)?.debugDescription ?? "\($0)" }
                .joined(separator: separator)
        }
    }
    
    class func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
        #if DEBUG
            Swift.print(Args(args: items, separator: separator), separator: separator, terminator: terminator)
        #endif
    }
    
    class func debugPrint(_ items: Any..., separator: String = " ", terminator: String = "\n") {
        #if DEBUG
            Swift.debugPrint(Args(args: items, separator: separator), separator: separator, terminator: terminator)
        #endif
    }
    
    class func dump<T>(_ value: T, name: String? = nil, indent: Int = 0, maxDepth: Int = Int.max, maxItems: Int = Int.max) -> T {
        #if DEBUG
        return Swift.dump(value, name: name, indent: indent, maxDepth: maxDepth, maxItems: maxItems)
        #else
        return value
        #endif
    }
}

```
調査メモ/Selenium, PhantomJS などWebDriver経由でのスクレイピングについてググった(2015-10-08時点)

HTMLのパーサで、変化の激しいW3Cの世界で、互換性や新機能に追従していくのは難しそう。
そこで、いっそのこと実際のブラウザのパーサ機能だけは使えないか？つまり、ヘッドレスブラウザならどうか、JSを動かす必要は無くて、HTMLのパーサ機能だけ欲しい。

ということで、ヘッドレスブラウザのレンダリング機能を扱えるアプローチを探るため、SeleniumやWebDriver系でどう扱えそうかかるくググったメモです。

* Linux環境で使えそうなOSSのレンダリングエンジンの実装で、一番追従が激しいのは、Chromeか。
  * http://www.chromium.org/blink
* c++ - How to use Google Blink/Webkit to render HTML code - Stack Overflow
  * http://stackoverflow.com/questions/22775753/how-to-use-google-blink-webkit-to-render-html-code
* Any way to start Google Chrome in headless mode? - Stack Overflow
  * http://stackoverflow.com/questions/9210765/any-way-to-start-google-chrome-in-headless-mode
* webkit - Headless browser automation using blink - Stack Overflow
  * http://stackoverflow.com/questions/32429626/headless-browser-automation-using-blink

Chrome用 + Chrome自身の開発速度が速いこともあり、簡単にパース機能「だけ」使える状況では無さそう。

PhantomJS + WebDriverのアプローチはどうか？軽くググッてみる。xpathで要素取り出せたりとかができれば便利だろう。

* PhantomJSと各ブラウザのJavascriptエンジンまとめ | tsuchikazu blog
  * http://tsuchikazu.net/phantomjs-browser-javascript-engine/
* Selenium 使いのための PhantomJS 解説 - Qiita
  * http://qiita.com/okitan/items/00b677df1a941a1e0ba0
* php - how do i disable javascript while running headless selenium server and using firefox? - Stack Overflow
  * http://stackoverflow.com/questions/17570076/how-do-i-disable-javascript-while-running-headless-selenium-server-and-using-fir
* Disabling Javascript · Issue #253 · detro/ghostdriver · GitHub
  * https://github.com/detro/ghostdriver/issues/253
* selenium - Why is not possible to disable JavaScript in GhostDriver / PhantomJSDriver? - Stack Overflow
  * http://stackoverflow.com/questions/27785320/why-is-not-possible-to-disable-javascript-in-ghostdriver-phantomjsdriver
* Disable JavaScript using Selenium WebDriver - Yi Zeng
  * http://yizeng.me/2014/01/08/disable-javascript-using-selenium-webdriver/
* python - How to disable JavaScript in PhantomJS through Selenium WebDriver - Stack Overflow
  * http://stackoverflow.com/questions/32115673/how-to-disable-javascript-in-phantomjs-through-selenium-webdriver

結論 : PhantomJSのWebDriverは、結局内部的にJSが動く。そのため、JSをdisabledにしたらODM要素の取り出しなど全部動かなくなるので今回の観点からはナンセンス。

どうも、HtmlUnitをWebDriverでラップしたHtmlUnitDriverが最速らしい。これならJSも動かさずにいけるかも？

* HtmlUnitDriverを使ってHTMLスクレイピング in Scala - Qiita
  * http://qiita.com/rkaneko/items/96588cf31b1ce3d41c79
* HtmlUnit – Welcome to HtmlUnit
  * http://htmlunit.sourceforge.net/
* HtmlUnit賛歌 - uehaj's blog
  * http://uehaj.hatenablog.com/entry/20101011/1286807271
* HtmlUnit vs JSoup: html parsing in Java | Krishna's Blog
  * http://krishnasblog.com/2012/12/19/htmlunit-vs-jsoup/
  * HTMLパーサであるJSoupとの比較記事。

とりあえずメモなので結論は出せません。ただ、以前IEのconditional comments で躓いたことがありますが、JSoupの方はissueがopenなまま ( https://github.com/jhy/jsoup/issues/360 ) で、HtmlUnit の方も多少対応はされてるようですがどこまで耐えられるのかちょっと心配です。
KivyアプリケーションをGoole Play Storeで公開する為に #5 python3でもAPKを作る(結果は失敗 -> その後成功)

# はじめに

　[#2の記事](http://qiita.com/gotta_dive_into_python/items/f3a6a2c83ed96366bc2f)にてPython2とKivyを使ったアプリケーションをAndroidのAPKにするやり方を書いたのですが、Python3でも実験段階ですができるようなので試してみます。尚、Python2の場合と重複する部分が多いので差分のみを書いていきます。

参考文献

 - https://python-for-android.readthedocs.io/en/latest/buildoptions/
 - https://github.com/kivy/buildozer

# ~~AndroidNDKの代わりにCrystaX NDK~~

~~[公式サイト](https://www.crystax.net/)よりCrystaX NDKのver10.3.2を落とします。~~
~~落とした物を解凍すると総File数約9万、総サイズ8GBとかなり重たいので注意してください。~~

現在はAndroidNDKでもできるようです。[ここ](https://github.com/kivy/kivy/wiki/Android-SDK-NDK-Information)を参考に適切なversionのAndroidNDKを選んで下さい。

# buildozer.specを書き換える

 まずはandroid.ndk_pathの値を落としたCrystaXへのパスに変えます。

```
android.ndk_path = /somewhere/crystax-ndk-10.3.2
```

次にrequirementsの値にpython3crystaxを加えます。仮に元が

```
requirements = kivy
```

だったら

```
requirements = kivy,python3crystax
```

になります。

# Build

```
$ buildozer android debug
```

実行すると以下のErrorがでました。

```上記のErrorを見る限りkivyとは関係ないアプリケーションの初期化の段階でErrorが出ているようです。
sh.CommandNotFound: python3.5
```

なのでpython3.5を入れて再度コマンドを打ったところ見事APKができました。しかし

# アプリがクラッシュ

実機にInstallして起動すると即クラッシュしてしまいます。
以下が手がかりになりそうなlogcatの出力

```
D/dalvikvm( 5624): Trying to load lib /data/app-lib/jp.gottadiveintopython.mostx-1/libSDL2.so 0x41bc4870
E/dalvikvm( 5624): dlopen("/data/app-lib/jp.gottadiveintopython.mostx-1/libSDL2.so") failed: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libcrystax.so" needed by "libSDL2.so"; caused by load_library(linker.cpp:745): library "libcrystax.so" not found
W/System.err( 5624): Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libcrystax.so" needed by "libSDL2.so"; caused by load_library(linker.cpp:745): library "libcrystax.so" not found
```

APKを解凍して中身を見たところ確かにlibcrystax.soは入っているのですが...。

# 2017/12/14(追記)

久々にPackagingを試してみた所、成功しました。以前試した時との違いは

1. buildozerやpython-for-androidのversionが上がっている
2. jdk7とjdk8が混在していない

しか思いあたらないので、原因は2だったんじゃないかと思います。

# 記事一覧

[#1 Kivy Launcherで動作確認](http://qiita.com/gotta_dive_into_python/items/5296ae8fef86751c238d)
[#2 APKを作成](http://qiita.com/gotta_dive_into_python/items/f3a6a2c83ed96366bc2f)
\#3は削除(GooglePlayの開発者登録をするだけの記事)
[#4 APKをリリース用にビルド、署名、公開](http://qiita.com/gotta_dive_into_python/items/7f790243bf2c16039691)
\#5 Python3でもAPKを作る(結果は失敗 -> その後成功)
Fabric beta で配信した ipa をダウンロードする

Fabric beta から配信済みの ipa をダウンロードだけすることが可能です。
力技なので、おそらく推奨されている方法ではありません。

試していませんが、 Android も同じ方法で apk が取得できるのではと思います。

## 前提

ダウンロードするためにはすでに beta 配信を受け取ることが可能な iOS 端末が必要。

# ダウンロードする

## 1. 配信されたアプリのインストール画面を表示する

`Install` ってボタンがある画面です。この `Install` ボタンを長押しします。
そうすると、リンクがコピーできる状態になるので、このリンクをコピーし PC に送ります。

<img width="375" alt="60764980-D68B-4519-9DE6-638DC164A90B.png" src="https://qiita-image-store.s3.amazonaws.com/0/5678/7e5ff824-9e55-33b0-69f4-ff9aa3b02d45.png">

## 2. PC でリンクを開いてダウンロード

PC でリンクを開くと、 xml が表示されます。

```

... 

<dict>
  <key>kind</key>
  <string>software-package</string>
  <key>url</key>
  <string>
  https://apps.crashlytics.com/projects/xxxxxxx/releases/1111111/download?device_id=11111&device_token=11111111111&payload_token=11111111111111
  </string>
</dict>

...

```

その中の url の string を開くと ipa がダウンロードされます。

ダウンロードされた　ipa ファイルを iTunes で開いて直接端末にインストールもできました。

あまり用途はないかもしれませんが、 beta 配布した後に ipa 本体が必要になった時などに利用できると思います。

## 参考

[android \- Download IPA / APK from Crashlytics \- Stack Overflow](http://stackoverflow.com/questions/28834832/download-ipa-apk-from-crashlytics)
VBAのSleepとVBSCriptのWscript.Sleepの共用関数Use This Function , You don't need WScript.Sleep or Sleep

Use This Function , You don't need WScript.Sleep or Sleep
##Windows Vista以降のTimeoutコマンドを使用する
[Windowsのtimeout／sleepコマンドで実行を一時停止する]
(http://www.atmarkit.co.jp/ait/articles/1206/08/news137.html)
Windows Vista／Windows Server 2003以降のWindows OSには、timeout.exeというコマンドが用意されている。ということでこれを使います。
これで秒単位は制御できます。
VBA VBS
WaitForVistaLater(integer)
integer には正の整数をいれてください

```WaitForVistaLater.vbs
Function WaitForVistaLater(i)
'By QiiQ from Qiita
Dim wsh: Set wsh = CreateObject("Wscript.Shell")
wsh.Run "timeout " & int(abs(i)), 0, True
End Function
```


##Powershellでミリセカンド
VBA　VBS
WaitForps(integer)
integer には正の整数をいれてください

```WaitForPs.vbs
Function WaitForps(imillisec)
'By QiiQ from Qiita
Dim str, Cmd , i
Dim wsh: Set wsh = CreateObject("Wscript.Shell")
i = int(abs(imillisec))
Cmd = "PowerShell -nologo  -Command  " & """" & """" & " set-executionpolicy remotesigned -scope process -force;Start-Sleep -milliseconds " & i & ";" & """"""
CreateObject("WScript.Shell").Run Cmd, 0, True
End Function
```

##accuracy　正確性
ただし、たぶんPowershellを起動して戻る分、正確な時間ではないです。
とはいうもののDeclarareとかWscript.Sleepでもめることはこれを使う限りは発生しないです。
正確性は
Sleep or wscript.sleep > WaitForVistaLater > WaitForPs
と体感ではなりました。
このため、秒単位であればWaitForVistaLateを使う意味があります。

##可読性 readability; legibility
ただし、２つの関数は
1. VBA,VBScriptいずれでも使用できる
2. Declareが不要
3. このためオフィス64Bit 32Bitを問わない
4. XpでもWscript.Shell runとPowershell使えればWaitForPsが使える
5. 正確性はWaitforVistaLater,汎用性はWaitForPs

このような長所を持っています。
Check! Azure Functions で Node.js で書いてるのに .NET Framework のエラーが発生するときのヒント（出力バインド）

こんにちは、 @dz_ こと大平かづみです。

Prologue - はじめに
====
[Azure Functions](https://azure.microsoft.com/ja-jp/services/functions/ "Azure Functions—サーバーレス アーキテクチャ | Microsoft Azure") で、Node.js で書いたコードを再び動かしたところ、以下のエラーで動かなくなってしまいました。

ファンクションの実行自体は終わってるようなのに、 `mscorlib: Buffer cannot be null. Parameter name: buffer.` という見慣れないエラーが発生しています。

途方に暮れていましたが、原因と解決方法がわかったので記録します。

### エラー内容

```
2017-02-08T10:30:00.005 Function started (Id=ebc259da-f172-4c93-a58f-f83605cd1df8)
2017-02-08T10:30:27.857 Function completed (Failure, Id=ebc259da-f172-4c93-a58f-f83605cd1df8)
2017-02-08T10:30:27.857 Exception while executing function: Functions.TimerTriggerJS1. mscorlib: Buffer cannot be null.
Parameter name: buffer.
```

### 発生環境

- Azure Functions
    - Node.js
    - [Storage BLOB の出力バインド](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-blob#a-namestorage-blob-output-bindingastorage-blob-の出力バインド "Azure Functions における Storage BLOB のバインド | Microsoft Docs")

関数の処理は、データベースから読み出した JSON データを [Azure Blob Storage](https://azure.microsoft.com/ja-jp/services/storage/blobs/ "Azure Blob Storage | Microsoft Azure") に保存するものです。

調査結果
====

この `mscorlib: Buffer cannot be null. Parameter name: buffer.` は、どうやら .NET Framework の環境で発生する汎用的なエラーメッセージのようで、なかなか原因を特定できませんでした。

しかし、ファンクションの処理自体は終わっていることに着目すると、どうやら Node.js の処理ではなく、 Azure Functions 側で起こってるようです。

- 参考: [Scripting the Azure WebJobs SDK](https://github.com/Azure/azure-webjobs-sdk-script "Azure/azure-webjobs-sdk-script: Scripting the Azure WebJobs SDK"): Runtime of Azure Functions, a light-weight scripting model for Azure WebJobs SDK.
- 参考: [Azure WebJobs SDK](https://github.com/Azure/azure-webjobs-sdk "Azure/azure-webjobs-sdk: Azure WebJobs SDK")

ファンクション実行完了後に処理されるのは… 私が設定していた「**出力バインド**」。

これだ！

結論
====

私の処理では、Storage BLOB の出力バインドに **JSONオブジェクト** を渡していました。

Azure Functions は、Storage BLOB にオブジェクトを出力すると、シリアル化してテキストファイルとして保存してくれます。

どうやら、渡した JSONデータが膨大すぎて、シリアル化でコケていたようです。

```js:サンプル
module.exports = function(context) {
    // 出力する JSONデータを取得する
    var jsonData = getJsonData();

    // ★ BLOB 出力バインドに渡す (※だがしかし、オブジェクトが大きすぎた)
    context.bindings.myOutputBlob = jsonData;
    context.done();
};
```

そこで試しに、先に `JSON.stringify()` で文字列化してから渡してあげると、無事出力されるようになりましたとさ♪

```js:改良後のサンプル
module.exports = function(context) {
    // 出力する JSONデータを取得する
    var jsonData = getJsonData();

    // ★ 文字列型に変換してから、 BLOB 出力バインドに渡す
    context.bindings.myOutputBlob = JSON.stringify(jsonData);
    context.done();
};
```

ちなみに、当初はデータの少ない状態だったため発生しなかったが、しばらくしてデータが増えた後に実行したことにより発覚ということでした。（実運用前でよかったｗ）

めでたしめでたし (｡･ω･)ﾉ

Epilogue - おわりに
====
このエラー、わかってしまえば簡単なことだったんですが、数日悩んでました。無事解決してほっとしてます。

今回は、BLOB でしたが、別の出力でも同様の状況がありそうです。プラットフォームやフレームワーク側に負担をかけない処理を心がけねばなりませんね！
Dockerfile: ubuntu-nginx-phpfpm-redis-mysql


## ○[Dockerfileは、こちら(GitHub)](https://github.com/maemori/accon/blob/master/docker/ubuntu-nginx-phpfpm-redis-mysql/Dockerfile)

## ○[Dockerfile一式は、こちらからダウンロード](https://kurobuta.jp/download/get/15)

-----

## 1. 概要

PHP・Webアプリケーションに特化したローカル開発環境。  
ローカルPCの開発用ディレクトリをDockerコンテナと共有し、そのUbuntu上で実行・開発・デバッグを行うための環境。

## 2. 構成バージョン

 * Ubuntu: 16.10 LTS (日本語対応)
 * Nginx: 1.10
 * PHP: 7.0
 * MySQL: 5.7
 * PHP-FPM: 7.0
 * xdebug: 2.4
 * Redis: 3.2

## 3. 利用方法

### 3.1. ローカルPCにDockerコンテナと共有するディレクトリを作成

``` bash:
mkdir -p ~/public/data-volume/workspace
mkdir ~/public/data-volume/www
```

 * data-volumeディレクトリ(配置場所はHOMEディレクトリ配下の任意の場所)  
  Dockerコンテナの/developディレクトリにマウントされます。

 * data-volume/workspaceディレクトリ  
  Webアプリケーションのプロジェクトを配置します。

 * data-volume/wwwディレクトリ  
  Webアプリケーションの公開ファイルを配置します。  

### 3.2. Dockerコンテナの取得と起動

```bash:
docker run -d \
 -v ~/public/data-volume:/develop:rw \
 -p 80:80 \
 -p 443:443 \
 -p 3901:3306 \
 -p 9901:9001 \
 -t -i \
 -h develop-server-01 \
 --name develop-server-01 \
 accon/ubuntu-nginx-phpfpm-redis-mysql
```

### 3.4. 動作確認用ファイルの設置

~/public/data-volume/wwwディレクリ配下にindex.phpファイルを配置。

* index.phpの内容

    ```php
    <?php phpinfo();
    ```

#### 3.5. 動作確認

下のURLにアクセスしPHPの情報が表示されればOK。

* [http://127.0.0.1](http://127.0.0.1)
* [https://127.0.0.1](https://127.0.0.1)

## 4. よく使うDockerコンテナを制御するコマンド

* コンテナのコンソールに接続
```bash:
docker exec -it develop-server-01 bash
```

* コンテナのスタート
```bash:
docker start develop-server-01
```

* コンテナのストップ
```bash:
docker stop develop-server-01
```

* コンテナの削除
```bash:
docker rm develop-server-01
```

* 起動中コンテナの確認
```bash:
docker ps
```
* 全てのコンテナの確認
```bash:
docker ps -a
```
[Swift] Builderパターンを例にPhantom Typeでメソッドの事前実行を強制する

あるメソッドの実行の前にそれ以外のメソッドを必ず実行したい場合にPhantom Typeを利用して実装することができます。例えばBuilderパターンでビルドを行う前に必ず値を設定するメソッドを実行しておきたいといった時です。

以下のコードではageとjobを設定しなければbuildメソッドが呼べません。

```Swift
class BuilderState {}
class Buildable: BuilderState {}
class Unbuildable: BuilderState {}

class UserBuilder<Age: BuilderState, Job: BuilderState> {
    fileprivate let age: UInt
    fileprivate let job: String

    fileprivate init(age: UInt, job: String) {
        self.age = age
        self.job = job
    }
    
    static var builder: UserBuilder<Unbuildable, Unbuildable> {
        return UserBuilder<Unbuildable, Unbuildable>(age: 0, job: "")
    }

    func set(age: UInt) -> UserBuilder<Buildable, Job> {
        return UserBuilder<Buildable, Job>(age: age, job: job)
    }
    
    func set(job: String) -> UserBuilder<Age, Buildable> {
        return UserBuilder<Age, Buildable>(age: age , job: job)
    }
}

extension UserBuilder where Age: Buildable, Job: Buildable {
    func build() -> User {
        return User(age: age, job: job)
    }
}

struct User {
    let age: UInt
    let job: String
}

let user = UserBuilder.builder.set(age: 39).set(job: "Programmer").build()
```

BuildStateクラスを基底とするBuildable・UnbuildableクラスはBuilderの状態を表します。Userを作成するためのUserBuilderはAgeとJobという状態を持っています。UserBuilder.builder()でインスタンスを取得するとそのインスタンスはAge・JobともUnbuildableなのでbuildメソッドは実行できません。set(age:)を実行するとAgeはBuildableになります。しかしJobは依然Unbuildableなのでまだbuild()メソッドを実行することはできません。さらにset(job:)メソッドを実行するとAge・JobともBuildableになりbuild()メソッドを実行することができるようになります。

以上のように、Phantom Typeを使うとメソッドの事前実行を強制することが可能です。
Slack経由でRaspberryPiのIPアドレスを取得する

# Slack経由でRaspberryPiのIPアドレスを取得する
## 1. はじめに
どうもISAOXです。
今回もSlack経由でRaspberryPiに何かやらせるシリーズです。
以下の投稿記事でSlack上でBOTに命令を出せば遠隔のRaspberryPi(以下RPi)のスクリプトを実行できるようになりました。
この記事の環境もこれをベースにしてます。参考下さい。

* [GitHub + Slack + RaspberryPiを用いたHUBOT開発環境の構築](http://qiita.com/IsaoNakamura/items/c6be85cf99d93c8d50a2)

今回はRPiのIPアドレスをSlackにメッセージを送信させます。
IPアドレスはちょっとした時に知りたい情報です。
これができれば、sshでネットワーク経由でRPiに接続できたりできます。

## 2. 前提条件
この記事の前提条件は以下です。

* インターネットに接続したRaspberryPi(Raspbian)がある。
* RPi上でHUBOTを起動できる環境にしている
* Slackを利用している + Slack上でHUBOT用のBOTを追加している。

## 3. RPiにIPアドレスを取得させる道具の準備
RPi上でのIPアドレス取得は以下のコマンドを使います。
`ifconfig`

なので、ifconfigを実行するShellスクリプトを用意してRPi上に配置します。
コマンドオプションも渡せる仕様です。

```ifconfig_cmd.sh
#!/bin/sh

ifconfig $@
```

## 4. RPi上のHUBOTがShellスクリプトを呼ぶ準備
RPi上のHUBOTが読み込むcoffeeスクリプトに『ifconfig』という文字列が来たら上記Shellスクリプトを呼び出す命令を追記します。
追記したらRPiを再起動するなどしてHUBOTが最新のcoffeeスクリプトを読み込んでおくようにしておきましょう。

```test.coffee
  robot.respond /ifconfig (.*)|ifconfig/i, (msg) ->
    # msg.send "match[0]: #{msg.match[0]}"
    # msg.send "match[1]: #{msg.match[1]}"
    arg = msg.match[1]
    @exec = require('child_process').exec
    command = "sudo -u pi sh /home/pi/GitHub/StudyRPi/Hubot/iotbot/my_exec/ifconfig_cmd.sh"
    command = "#{command} #{arg}" if arg?
    msg.send "Command: #{command}"
    @exec command, (error, stdout, stderr) ->
    msg.send error if error?
    msg.send stdout if stdout?
    msg.send stderr if stderr?
```

## 5. Slack上のBOTにIPアドレスを取得するように命令する
Slack上でBOTに以下のようにしてIPアドレスを取得するよう命令します。
するとBOTが反応しRPiのShellスクリプトを実行してくれました！
![Picture](https://github.com/IsaoNakamura/StudyRPi/blob/master/Hubot/image/sc_ifconfig.png?raw=true)
※上のスクリーンショットはSlack上の『DIRECT MESSAGES』上で入力しているので頭に指定するBOT名は省略してます。
【Git】Gitを使ったことがないけど、Gitを使用しているプロジェクトへ参加した方へ

この記事では、Gitの使い方を知らないけれども、Gitを使用しているプロジェクトに参加した方を対象に書いています。また、Gitはインストールされていることを前提としておりますので、インストール後に本記事を参考にしてください。
ブランチってなに？マージってなに？マージの手順は？要望ありましたら書きますが、長ったらしくなるので検索してください…
ブランチ：http://www.backlog.jp/git-guide/stepup/stepup1_1.html
#git clone から　git push まで
1. git clone [remote-name]
+ git status
+ git checkout -b [topic-branch-name]
+ git add [file-name]
+ git commit
+ git push origin [topic-branch-name]

##1. git clone [remote-name]
クローンすると、ローカルにリポジトリが作成されます。
`git clone [remote-name]`

##2. git status
現在ローカルリポジトリで変更されたファイルが表示されます。
`git status`

##3. git checkout -b [topic-branch-name]
**master**ブランチで作業することはとても危険です。
基本的に、**master**ブランチが本番環境で使用されるためです。
デプロイで**git pull origin master**すると、不完全なファイルが反映される可能性があるためです。
`git checkout -b [topic-branch-name]`

適宜ブランチを作成して、作業してください。


##4. git add [file-name]
これからコミットするファイルを、コミット対象に追加します。

**git status**大事です。
表示されたファイルを見て、ファイルをコミット対象に追加します。
`git add [file-name]`

本当にあなたのコミットしたいファイルですか？
よく、
`git add .`
`git commit`

なんてする人いますけど、やめてください。
**.gitignore**に入れ忘れているものがあったり、余計な一時ファイルがあると一緒に**git add**されます。
**git status**を行い、コミットしたいファイルのみ**git add**されたことを確認してください。

##5. git commit
コミットメッセージは、わかりやすい内容で。
`git commit -m '[commit-message]'`

##6. git push origin [branch-name]
ほとんどの場合は、**master**ブランチですがトピックブランチを切ることをおすすめします。
`git branch`

で、今いるブランチを確認できます。
**master**ではないことを確認してください。

`git push origin [topic-branch-name]`

**※master一本運用というプロジェクトがあるかもしれませんが、トピックブランチの作成をおすすめします。**
技術英語 > I won't [go into much more detail] about tuples here. / Bobby Bascomb [has more].

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1476 / 12833)

> I won't **go into much more detail** about tuples here.

<hr>
関連して思い出したのは

ニュース放送などで、TV局の人が使う「（外に待機している）レポーターが詳しく説明してくれます」という意味での has more

http://www.loe.org/shows/segments.html?programID=14-P13-00019&segmentID=3
> Living on Earth’s Bobby Bascomb **has more**.
iOS Audioタグで曲の長さが取得できない問題

# はじめに
音声配信サービスを開発中でHTML5で追加されたAudioタグを使ってプレイヤーの実装を行っていたが一部で曲の長さが取得できない問題に遭遇した。

# 曲の長さの取得方法
コピペしても動かないけど、曲の長さの取得方法はこんな感じ。

```html:index.html
<!doctype html>
<html>
<body>
  <audio id="audio" src="sample.mp3"></audio>
</body>
</html>
```

```js:app.js
var $audio = document.getElementById("audio");
$audio.addEventListener("loadedmetadata", function() {
  console.log( $audio.duration );
});
```

こんな感じのコードを実行する。
メタデータが取得できる状態になるとイベントが発火、コンソールに曲の長さが表示される。

# 問題
最新のiOSを含めたiOSでdurationが上手く取得できず`infinity`が返ってくる。
しかも、ある環境では問題なく取得できて、ある環境では取得できない。
取得できない環境でも、1度最後まで再生すると取得できる。

# 原因
サーバーのレスポンスが`Content-Range`に対応していない。
`Content-Range`の詳しいことはRFC読んでください。
[RFC 7233 — HTTP/1.1: Range Requests （日本語訳](https://triple-underscore.github.io/RFC7233-ja.html#section-4.2)

# 解決法
クライアントではどうしようもないのでサーバー側で`Content-Range`に対応する。

# 注意
この問題すべての解決法がこの原因かはわからないという事です。

# あとがき
曲の長さが取得できない場合があるという記事は多く見かけましたが、`Content-Range`に対応していないからという記事が日本語では見つからなかったので書いてみました。
何か他の情報をお持ちの方はぜひコメントなどいただけると幸いです。

ちなみに、`Content-Range`に対応していなくて手持ちのAndroid、およびPCブラウザでは曲の長さが取得できていたのでiOS固有の問題っぽいです。
Vim 初心者におすすめしたいもの（ディストリビューション）

# 注意
この記事は vim 初心者が書いています。
あまり信じないでください。

# 対象
vimtutor などを通して基本操作を覚え、これから vim でコーディングしていくぞという人。
いろんな便利機能がほしいけどプラグインの導入や設定が面倒だと思ってしまう人。

# 対象でない人
時間をかけてでも自分に最適な vim を構築していきたいひと。
vimrc を育てることに快感や興奮を感じる人。

# プラグインの設定が面倒
vim の基本操作を覚えた時点で、 vim を使ってコーディングができます。
しかし、きっとすぐに欲しい機能が出てくることになるでしょう。
ディレクトリツリーがほしい、スニペット機能がほしい、文法チェックしてほしいなどなど。
これらの欲求を満たすためにはプラグインを導入する必要があります。
vundle や neobundle のようなプラグインマネージャーを導入し、欲しい機能を持つプラグインを調べ、導入する。
この過程は楽しくもありますが、一方で大量の時間を消費することになるでしょう。
vim は時間をかければかけるほど素敵でセクシーに成長していくものの、もっと手軽に一通りの機能が揃っている環境が欲しい人もいるかと思います。
この記事で紹介するものはそんな人たちにおすすめしたいものです。

# ディストリビューション
簡単にいうと便利なプラグインたちの導入や設定がすでにされている設定ファイル群です。
つまり vim がインストールされている状態が前提となります。
これを使えばプラグインの選定や設定をするフェイズをスキップすることで、コーディングまでの時間を短縮することができます。
また、ディストリビューションはあくまでもプラグインをまとめているものなので、各プラグインの詳しい操作や設定方法はそのプラグインのホームページで見ると良いでしょう。

## [spf13-vim](https://github.com/spf13/spf13-vim)
私が今使用しているものです。

### インストール
内部で使用されているプラグインのために vim の lua を有効にする必要があります（方法はグーグル先生が教えてくれます）。
自分の ~/.vimrc のバックアップをちゃんととったうえで、
`curl https://j.mp/spf13-vim3 -L > spf13-vim.sh && sh spf13-vim.sh && rm spf13-vim.sh`
とコマンドを入力するとインストールが始まります。
プラグインのダウンロードが始まると途中で github の username と password を求められますが、無視してエンターを二回押すとスキップできます（入力しても何も起こりません。なぜかいま存在しないプラグインを clone しようとしているためです）。

### 簡単な機能紹介（ほんのごく一部です）
Ctrl + hjkl でウィンドウ移動  。
C-e で左側にディレクトリツリーをだす [[NERDTree](https://github.com/scrooloose/nerdtree)] 。
C-p で vim のルートディレクトリからファイル名で検索をかける [[ctrlp](http://kien.github.io/ctrlp.vim/)] 。
git コマンドを vim から叩ける [Fugitive] 。
\<leader> キー（デフォルトでは , ）を二回 を押して j, k, w, b などのモーションキーを押すと、画面上の任意な場所に簡単に飛べるようになる [[EasyMotion](https://github.com/easymotion/vim-easymotion)] 。
これ以外にもたくさんの機能があるので詳しくは[公式サイト](http://vim.spf13.com/)をどうぞ。

### 自分の設定を追加したい
自分独自の設定は ~/.vimrc.local に書くと読み込んでくれます。
他のプラグインを導入することも可能で、それについてはまだ試していないため、[公式サイト](http://vim.spf13.com/)を見てください。

### 不具合
2017/2/11 現在、私の環境では補完の決定の挙動がおかしくなっています。
もしも同じ問題が起きた場合は、 https://github.com/spf13/spf13-vim/issues/819 にかかれているように、
`inoremap <expr><CR> neosnippet#expandable() ? neosnippet#mappings#expand_or_jump_impl() : pumvisible() ? neocomplete#close_popup() : "\<CR>"`
を ~/.vimrc.local に追加してください。


## [janus](https://github.com/carlhuda/janus)
使ったことないので名前だけ紹介します。
なんかいい感じらしいです。

## [Cream](http://cream.sourceforge.net/)
こちらも使ったことがないので名前だけ紹介します。

# 番外編
## [Spacemacs](https://github.com/syl20bnr/spacemacs)
vim ではなく emacs のディストリビューションですが、 vim と同じように（ 100% 再現できてるわけではないらしいが）操作できるので最後に軽く紹介します。
space から始まる魔法が強力な emacs の設定ファイル群です。
個人的には一番衝撃だったエディタ（の設定ファイル群）なので、一度試してみることをおすすめします。
デメリットとしては今まで育ててきた vimrc を生かせないことと、 vim のプラグインを使用できないことでしょう。
とはいっても Spacemacs はとても多くの機能を含んでいるので、困ることはあまりないかと。
誰か Spacevim を作ってください。

# P.S
こういう文章を書くのは初めてなので読みづらさには多少目をつぶってください。
あと間違っているところがあればぜひ教えてください。
【Vagrant】default: Warning: Authentication failure. Retrying...

鍵を置き換える方法が解決策としてあがっていますけれども、そもそもパーミッションが間違っている場合があります。
これは、そもそもinit したboxイメージがおかしいからでしょうね…
vagrant ssh　はできるけれども、
>default: Warning: Authentication failure. Retrying...

これがvagrant up で出るときは…

>[vagrant@localhost ~]$ ls -la | grep .ssh
drwx------. 2 vagrant root    4096 Feb 11 19:57 .ssh
[vagrant@localhost ~]$ ls -la .ssh/ | grep auth
-rw-rw-r--. 1 vagrant vagrant  389 Feb 11 19:57 authorized_keys
[vagrant@localhost ~]$

パーミッションを確認してみてください。
とか、どうでもいいと思うので解決するには、

`cd /home/vagrant && chmod 700 .ssh/ && chmod 600 .ssh/authorized_keys`

実行してください。
UnityのiOSビルドで出力されるXcodeプロジェクトのEnable Bitcodeを自動でNoにする

# Xcodeプロジェクトの設定変更を自動化する
UnityのXcodeプロジェクト出力時に、Enable BitcodeをNoにするのが糞ダルいので自動化した。
[PBXProject](https://docs.unity3d.com/ScriptReference/iOS.Xcode.PBXProject.html)を使えばiOSビルド時にXcodeプロジェクトの設定を書き換えられる。

```csharp
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
#if UNITY_IOS
using UnityEditor.iOS.Xcode;
#endif

public static class MyBuildPostprocess
{
	[PostProcessBuild(999)]
	public static void OnPostProcessBuild( BuildTarget buildTarget, string path)
	{
		if(buildTarget == BuildTarget.iOS) {
			string projectPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";

			PBXProject pbxProject = new PBXProject();
			pbxProject.ReadFromFile(projectPath);

			string target = pbxProject.TargetGuidByName("Unity-iPhone");
			pbxProject.SetBuildProperty(target, "ENABLE_BITCODE", "NO");

			pbxProject.WriteToFile (projectPath);
		}
	}
}
```
同じ要領でコンパイルフラグ等も追加できる。そのあたりの話は別記事で。
[ファイル毎のARC無効設定を追加する](http://qiita.com/unsoluble_sugar/items/c459352af2bef8a4699e)
# 参考
[Unity - Scripting API: PBXProject](https://docs.unity3d.com/ScriptReference/iOS.Xcode.PBXProject.html)
【ev3dev】pythonを使ってLCD(画面)をキャプチャーするプログラムを作る

## はじめに
この記事は、EV3にev3devをインストールし、SSH接続できている状態であることを前提にしています。環境構築ができていない方はこちらの記事を参考にしてください。
>
[mindstorm-EV3をLinuxで制御しよう! ev3dev OSのインストールとSSH接続](http://qiita.com/murotani/items/46f905bec33b1673c41a)

## つくるもの
mindstorm-EV3のインテリジェントブロックの画面(LCD)をキャプチャーし、画像として保存するプログラムをつくります。Pythonのev3devAPIである[ev3dev-lang-python](https://github.com/rhempel/ev3dev-lang-python)を使います。

ev3dev-lang-pythonの環境構築についてはこちらを参考にして下さい。
>
[PythonでEV3のモータとセンサを制御してみよう](http://qiita.com/haneuma/items/a301186d832beee639d0)

## プログラム

```py:screenshot.py
#!/usr/bin/env python3


import sys
from subprocess import call
# 画像データを扱うためのライブラリ
from PIL import Image

# 保存する画像名、デフォルトでは"screenshot.png"
out_name = sys.argv[1] if len(sys.argv) > 1 else "screenshot.png"

# フレームバッファーをキャプチャし、PNG イメージに変換する
call(["fbgrab", out_name]);

# スクリーンショットした画像を読み込む
image = Image.open(out_name)

# RGB形式に画像を変換
image = image.convert("RGB")

# 画像を整形
image = image.resize(tuple(i * 2 for i in image.size), Image.NEAREST)


pixel_data = image.load()

# 画像の色変換
for y in range(image.size[1]):
    for x in range(image.size[0]):
        if pixel_data[x, y] == (255, 255, 255):
            pixel_data[x, y] = (173, 181, 120)

# Save the image again
image.save(out_name);
```

```call(["fbgrab", out_name])```によって得られるスクリーンショット画像は白黒の画像になっているので、本当のスクリーンの色を表現するために白色のピクセルを薄緑色に変換する必要があります。
その処理を実現するのがプログラム中の以下の部分です。

```py
for y in range(image.size[1]):
    for x in range(image.size[0]):
        if pixel_data[x, y] == (255, 255, 255):
            pixel_data[x, y] = (173, 181, 120)
```

## 実行
第一引数に保存先の画像ファイルを指定できます。

```
robot@ev3dev:$ python screenshot.py test.png
```

このような画像が得られました
![test.png](https://qiita-image-store.s3.amazonaws.com/0/149019/39b4d087-92e0-df2c-b038-b331d7907fe7.png)