OmniAICreator/Qiita-1.07M huggingface dataset:
NSLOOKUPの使い方

# CNAMEが効いているか調べたいときの技

$ nslookup -q=cname hoge.test.jp

サーバー:  UnKnown
Address:  192.168.1.1

権限のない回答:
hoge.test.jp  canonical name = hontono.amazonwebservice.com

test.jp nameserver = ns1.amazonwebservice.com
test.jp nameserver = ns1.amazonwebservice.com
ns1.value-domain.com    internet address = 54.65.150.1
ns2.value-domain.com    internet address = 54.64.110.166
pip install scikit-learn で Numerical Python (NumPy) is not installed. と表示されました。

scikit-learnをインストールしようとしたらエラーがでました。環境はUbuntu、Python2.7系です。

# scikit-learnのインストールでエラー
pip installしようとしました。

```bash:
pip install scikit-learn

略

ImportError: Numerical Python (NumPy) is not installed.
    scikit-learn requires NumPy >= 1.6.1.
    Installation instructions are available on the scikit-learn website: http://scikit-learn.org/stable/install.html

略
```

# pip install numpy を試しました
numpyは詳しくないのでとりあえずpipで入れようとしました。

```bash:
pip install numpy

Downloading/unpacking numpy
  Downloading numpy-1.11.1.zip (4.7MB): 4.7MB downloaded
  Running setup.py (path:/tmp/pip_build_vagrant/numpy/setup.py) egg_info for package numpy
    Running from numpy source directory.

略

Cleaning up...
Command /usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip_build_vagrant/numpy/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-RTxqgv-record/install-record.txt --single-version-externally-managed --compile failed with error code 1 in /tmp/pip_build_vagrant/numpy
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    load_entry_point('pip==1.5.4', 'console_scripts', 'pip')()
  File "/usr/lib/python2.7/dist-packages/pip/__init__.py", line 235, in main
    return command.main(cmd_args)
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 161, in main
    text = '\n'.join(complete_log)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 72: ordinal not in range(128)
```
asciiコーデックはデコードできないと言われました。

# apt-getでnumpyを入れる
numpyはapt-getで入れるといいようです。この後にちょうどTensorflowを入れたかったので参考サイトの通りに全て入れました。

```bash:python-numpyをインストール
sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose
```

# 再度pip install scikit-learn
今度はうまくいきました(☝ ՞ਊ ՞)☝

# 参考
http://www.elecafe.info/contents/20151116-tensorflow-trial/
VimでMarkdown編集


参考

* http://qiita.com/uedatakeshi/items/31761b87ba8ecbaf2c1e


プラグインを突っ込んで、デフォルト設定で使っているだけなので特筆して書くことはないだが、長い間使わないと自分の環境も忘れる(デフォルトであることすら忘れる。デフォルトがなんなのかも忘れる・・・)ので備忘録をのこしておく。手っ取り早く環境が欲しい人はtomlをコピペするとよい。

## deinのToml
プラグインは、Markdownファイルを開くまでロードしないようLazyにする。previmとopen-browserはlazyをやめてもいいけど、いまのところMarkdown編集でしか使用しないのでこうしておく。

```toml
# dein lazy.toml

################
### Markdown ###
################
[[plugins]]
repo = 'plasticboy/vim-markdown'
on_ft = ['markdown','mkd']

# quote内のプログラムをシンタックスハイライトする
[[plugins]]
repo = 'joker1007/vim-markdown-quote-syntax'
on_ft = ['markdown','mkd']

# 編集中のMarkdownファイルのプレビューを作成する
[[plugins]]
repo = 'kannokanno/previm'
on_ft = ['markdown','mkd']

# プレビューをブラウザで開いてくれる
[[plugins]]
repo = 'tyru/open-browser.vim'
on_ft = ['markdown','mkd']

```


## Fold, Unfold

vimの標準機能

* zo 折りたたみを一段階開く
* zO 折りたたみを全て開く
* zc 折りたたを一段階閉じる
* zC 折りたたみを全て閉じる

## プレビュー

書き込み保存すると、更新されていく。

```
:PrevimOpen
```
Snackbarのサンプル

# Snackbarってなんですか
toastみたいなの。それの新しいやつみたいなの。
↓からニュッと出てきて消えるの。

Designサポートライブラリ　com.android.support:design
をプロジェクトの設定で追加して使ってね。

# サンプル
メッセージと、右側に任意でAction文字列を設定できます。無くてもいいです。
文字色を設定する関数が用意されてます。
背景色はgetView()できるのでお好みで背景色を変えるとか。

```java:java
        final Snackbar snackbar = Snackbar.make(getView(), "エラー", Snackbar.LENGTH_SHORT);
        snackbar.getView().setBackgroundColor(Color.RED);
        snackbar.setActionTextColor(Color.WHITE);
        snackbar.setAction("更新", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // setActionしたテキストがタップされたらここが実行されます
            }
        });
        snackbar.show();

```

# 結果
![スクリーンショット 2016-08-25 18.50.47.png](https://qiita-image-store.s3.amazonaws.com/0/76483/525ef525-6dfc-cae7-71e0-db2d42966052.png)
Pythonで標準正規分布のグラフを作成

# 1. 標準正規分布とは

平均μ=0, 分散σ=1の正規分布、
すなわち以下の数式で表される関数のことです。

```math
f(x) =  \frac{1}{ \sqrt{2 \pi } } e^{-  \frac{x^2}{2} }
```

# 2. 自分で標準正規分布を作成


前述のf(x)を自分で定義して、試しに [-5.0, -4.999, -4.998, ... , 4.998, 4.999, 5.0] と~5.0 ~ 5.0の数列を入れてみると、
一般に正規分布と呼ばれる形のグラフが得られます。

```py3:norm_original.py
# coding: utf-8
import numpy as np
import math

# f(x)を自分で書く
f = lambda x: (math.exp(-x**2/2)) / math.sqrt(2*math.pi)

# ベクトルxを [-5.0, ..., 5.0] の区間で作成
n = np.linspace(-5.0, 5.0, 10000)

# f(x)の結果を得る
p = []
for i in range(len(n)):
    p.append(f(n[i]))

# グラフに表示
plt.scatter(n, p)
plt.show()
```

![plt_norm_orig.png](https://qiita-image-store.s3.amazonaws.com/0/127680/2ecb8708-ec91-199d-e954-1c832bbfe7a5.png)

綺麗な釣り鐘が得られましたが、一々自分で定義していくのは、少し面倒くさいです。
何より平均や分散を変えたくなった時に、手間がかかります。

# 3. scipyを使用

scipy.statsモジュールを利用すると、
上のコード（norm_original.py）ではラムダ式で定義した数式を、関数から呼び出すことができます。

```py3:norm_usescipy.py
# coding: utf-8
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm

# ベクトルxを [-5.0, ..., 5.0] の区間で作成
n = np.linspace(-5.0, 5.0, 10000)

# 平均0, 標準偏差1の正規分布における、xの確率を求める
p = []
for i in range(len(n)):
    p.append(norm.pdf(x=n[i], loc=0, scale=1))

# 乱数－確率 の特性を散布図で表し、標準正規分布のグラフを作成
plt.scatter(n, p)
plt.show()
```

![pdf_norm_scipy.png](https://qiita-image-store.s3.amazonaws.com/0/127680/889367f5-fd36-4a22-cb16-ae0b4038c1cc.png)


こちらは引数で平均と分散を指定できるので、簡単に違う形の正規分布を得ることが出来ます。

# 4. 累積分布関数から同時エントロピーを見てみる

前の章では、scipy.stats.norm.pdfから正規分布の確率密度関数を使いました。
今度は少しだけいじって、scipy.stats.norm.cdfから正規分布の累積分布関数を使ってみます。

Wikipediaの[結合エントロピー](https://ja.wikipedia.org/wiki/%E7%B5%90%E5%90%88%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC)の記述を参考に書いていきます。

同時エントロピー（結合エントロピー）H(X)は、確率変数Xの値の不確かさを表しています。
Xに属するイベントxが発生する確率がp(x)であるとき、Xのエントロピーは、

```math
H(X) = - \sum_{x} p_x log_2 (p_x)
```
で表されます。

ここでは確率が標準正規分布に乗ると考えて、エントロピーをグラフに表すと、

```git:norm_usescipy.py
---p.append(norm.pdf(x=n[i], loc=0, scale=1))
+++p.append(norm.cdf(x=n[i], loc=0, scale=1))
```

![cdf_norm.png](https://qiita-image-store.s3.amazonaws.com/0/127680/d62fda04-207a-9e85-7d86-89c540576df8.png)

このようなH(X)が得られます。
OmxplayerをPythonコードから停止させる

#概要
　PythonコードからOmxplayerで再生されている動画を停止させます。

#コード
```python:test.py
import subprocess
import time

#動画を再生する
command = 'omxplayer test.mov'
proc = subprocess.Popen(command,shell=True,stdin=subprocess.PIPE)

#-- なんからの処理(今回の例では10秒待機)  --
time.sleep(10)
#-------------------------------------

#終了処理
proc.stdin.write("q")
```

#原理
 Omxplayerがqキーの入力を受けることで終了することを利用しています。
mini toto の予想

##確率

|home|away|W|D|L|
|:-:|:-:|:-:|:-:|:-:|
|仙台|広島|0.2665|0.2335|0.4999|
|川崎|柏|0.4648|0.2382|0.2969|
|湘南|G大阪|0.2537|0.2647|0.4817|
|神戸|浦和|0.2982|0.2409|0.4609|
|鳥栖|新潟|0.3623|0.3013|0.3364|

##今週のポイント
広島のアウェイ勝利

|home|away|選択|結果|的中|
|:-:|:-:|:-:|:-:|:-:|
|仙台|広島|0|0|○|
|川崎|柏|3,0|0|○|
|湘南|G大阪|1,0|0|○|
|神戸|浦和|1,0|3|❌|
|鳥栖|新潟|3,1|3|○|

##結果発表
神戸浦和戦をはずしました。4/5


##購入
仙台～広島　0
それ以外の試合の選択範囲でランダム。
予想が大事だ。運も必要となる。
1000円で購入。
![mini_toto_867.png](https://qiita-image-store.s3.amazonaws.com/0/114190/b0736538-c9b8-5837-2120-b71d0c918643.png)

##コード
```
pred_1 <- c(0)
pred_2 <- c(3,0)
pred_3 <- c(1,0)
pred_4 <- c(1,0)
pred_5 <- c(3,1)

my_prediction <- expand.grid(No.1 = pred_1, No.2 = pred_2, No.3 = pred_3, No.4 = pred_4, No.5 = pred_5)

random <- runif( length(pred_1) * length(pred_2) * length(pred_3) * length(pred_4) * length(pred_5) , 0, 1 )

head( my_prediction[ order(random), ], 10 )
```
ffmpeg使い方


# できないこと(たぶん)
ノーマライズ -> soxで対応

# install

```
brew install ffmpeg
```

# 基礎

```
# -i　=> inputファイル指定
#
# e.g.
# input.mp3の情報が確認できる
$ ffmpeg -i input.mp3

# outputファイルを指定するとその拡張子にフォーマットして
# 出力される
# e.g.
# mp3をaiffに変換
$ ffmpeg -i input.mp3 output.aiff
```

# チャンネル指定

```
# -ac 1 => モノラル
# -ac 2 => ステレオ
#
# e.g.
# モノラルに変換
$ ffmepg -i input.mp3 -ac1 output.mp3
```

# 上書きで出力

```
# -y => 上書きオプション
#
# e.g.
# モノラルでファイルが上書きされる
$ ffmpeg -y -i input.mp3 -ac1 output.mp3

```

# サンプルレート変更

```
# -ar 22050 => サンプルレートを22050に設定
#
# e.g.
$ ffmpeg -i input.mp3 -ar 22050 output.mp3
```

# サンプルビットを変更

```
# -acodec pcm_s16le => 16bitに変更
# 16bitは　pcm_s16le
#  8bitは  pcm_u8　　を指定する
#
# e.g.
$ ffmpeg -i input.mp3 -acodec pcm_s16le output.mp3
```

# メタデータを付ける

これをつけておくとitunesで開いた時にアルバムにまとまっているので便利

と思ってるけど、itunesで開くとデータが反映されてない
key=valueで設定
key値は以下のリンクを確認
(http://jonhall.info/how_to/create_id3_tags_using_ffmpeg)

```
$ ffmepeg -i input.mp3-metadata album="album_name" -metadata airtist="test_airtist" output.mp3
```
rackアプリケーションをnginx+unicornで公開する時、redirect時にホスト名を保持できない

メモ。
アプリケーションサンプルはSinatra。

~~~
get '/' do
  redirect 'パス'
end
~~~

以下のnginxの設定の時、 `http://example.com/` にアクセスした場合
`http://unicorn/パス` へ遷移しようとしページが表示されない。

~~~
upstream unicorn {
  server localhost:3000;
}
server {
    (中略)
    location / {
        proxy_pass http://unicorn;
    }
}
~~~

以下のヘッダを設定することで、正常に
`http://example.com/パス` へ遷移する。

~~~
upstream unicorn {
  server localhost:3000;
}
server {
    (中略)
    location / {
        proxy_pass http://unicorn;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
~~~
最近のRuby

# 自己紹介

* 高橋征義
* 一般社団法人日本Rubyの会代表理事
* 株式会社達人出版会
    * 3FのUSPさんの隣のブース
* 13:50〜「Dynamic Typing再考」司会


---
# Ruby最新情報

---
# RubyKaigi 2016

https://rubykaigi.org/2016

![RubyKaigi2016](https://qiita-image-store.s3.amazonaws.com/0/4293/6de4f1f0-d39a-6d6a-758b-c8e0afbc7e4e.png)


---
# 現在のRuby

---
# Ruby 2.3.1

---

## 昨年紹介済み

---

# 現在開発中のRuby

---

# Ruby 2.4.0

---

# 2.4のステータス

---
# 2.4.0 preview 1がリリース (2016/06/20)

---
# Ruby 2.4.0 preview 1のインストール

---
# Ruby 2.4.0 preview 1のインストール

* ソースからインストールする
* rbenvのpreview用を使う

```
brew reinstall ruby-build --HEAD
rbenv install 2.4.0-preview1
rbenv local 2.4.0-preview1
```

---
# Ruby 2.4の変更点

---
# 基本的に地味
---
# 派手な奴は3.0に期待

---
# まだ決定ではない

---
# リリーススケジュールは後ほど

---
# Ruby 2.4の変更点

* FixnumとBignumがIntegerに統合
* String#{downcase,upcase,capitalize}のUnicode対応
* 後置rescueの構文
* Enumerable#sum, Array#sum
* Regexp#match? の導入
* CGI.unescape 高速化
* スレッド内で例外処理の向上

---
# FixnumとBignumがIntegerに統合

---
# FixnumとBignumがIntegerに統合

* 要するに内部実装の違い、という見せ方に変わる
* 普通に利用している分にはあまり問題にならない
* C拡張ライブラリが死ぬ
    * 現状では即死するようになっている
    * 2.4.0リリース時には？

---
# String#{downcase,upcase,capitalize}のUnicode対応

---
# String#{downcase,upcase,capitalize}のUnicode対応

* 今まではASCIIの範囲内では正しく動作
* 広くUnicodeに対応できるように

---
# 後置rescueの構文

---
# 後置rescueの構文

* a = Date.parse "foo"  rescue nil
* a = Date.parse("foo") rescue nil
* 構文のバグ？
* おそらく広く使われてないだろう、という想定による非互換

---
# Enumerable#sum, Array#sum
---
# Enumerable#sum, Array#sum

* 今までは各種ライブラリ側で実装
* 2.4で標準に
* 浮動小数点数の情報落ちが発生しないアルゴリズムを採用
    * Array#inject(:+)だと誤差がたまるので注意

---
# Regexp#match? の導入

---
# Regexp#match? の導入

* MatchDataを生成するのが案外重い
* true/falseのみ返すので軽い

---
# CGI.unescape 高速化

---
# CGI.unescape 高速化

* Cで再実装

---
# スレッド内での例外処理の向上

---
# スレッド内での例外処理の向上

* スレッドで例外が発生した場合
    * 無視
    * abort
    * 例外 :new: 

---
# 細かい高速化
---
# 細かい高速化

* 内部の実装の見直し
* lambdaが速くなったりとか

---
# 今後の予定

---
# 今後の予定

* 2016/9 Preview 2
* 2016/11 Preview 3
* 2016/12 Release Candidate
* 2016/12/25 Release

---
# CRuby以外のRuby
---
# CRuby以外のRuby

* JRuby
* Rubinius
* mruby
* Opal

---
# JRuby

* JVMで動作
* JRuby 9000 (9.1.2.0)
* JRuby on Rails
* JRuby + Truffle


---
# Rubinius

* Ruby + C++で実装
* Rubinius 3.56
* Rubinius X
* Rubinius. Inc.
* Rubinius Compute


---
# mruby

* 何かに組み込んで使う
* mruby 1.2.0 (2015/11/18)
* mrbgems
* mruby CLI
* H2O

---
# Opal

* AltJS
* Opal v0.10.1
* Playground / TryRuby v4
* Volt
* Menilite

---
# まとめ
---
# まとめ

* [RubyKaigi 2016](https://rubykaigi.org/2016)、ご参加お待ちしております

![RubyKaigi2016](https://qiita-image-store.s3.amazonaws.com/0/4293/6de4f1f0-d39a-6d6a-758b-c8e0afbc7e4e.png)


---
# 参考文献

* https://www.ruby-lang.org/en/news/2016/06/20/ruby-2-4-0-preview1-released/
* https://github.com/ruby/ruby/blob/v2_4_0_preview1/NEWS
* https://blog.blockscore.com/new-features-in-ruby-2-4/
* https://speakerdeck.com/hsbt/high-performance-tdiary
* https://bugs.ruby-lang.org/issues/12512
* https://github.com/rbenv/ruby-build/issues/972
* https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/ReleaseEngineering24
* http://jruby.org/
* http://rubinius.com/
* http://mruby.org/
* http://opalrb.org/
超基本的なdeviseの使い方

##導入手順
- `gem 'devise'`をGemfileに追記
- `bundle install` でgemの読み込み
- ローカルサーバーの再起動 `rails s`
- deviseを使用する為にはインストールに加えてdevise専用のコマンドを利用して設定ファイルを作成する必要がある。
`rails g devise:install`
- `rails g devise user` でログイン機能を持つUserクラスをもつモデルを作る。
その時にusersテーブルにカラムを追加するためのマイグレーションファイルができているので
`rake db:migrate` を実行。するとusersテーブルが出来る。
ちなみにuserのモデル名は任意なので何でもok

##deviseを使う事で利用できるメソッド
###user_signed_in?
ユーザーがサインインしているかどうかを検証するメソッド。サインインしている場合にはtrueを返し、そうでない場合はfalseを返す。

##ログインしている時とそうでない場合の使い方の例

```

      <% if user_signed_in? %>
        <div class="user_nav grid-6">
          <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
          <a class="post" href="/hoge/new">投稿する</a>
        </div>
      <% else %>
        <div class="grid-6">
          <%= link_to "ログイン", new_user_session_path, class: 'post' %>
          <%= link_to "新規登録", new_user_registration_path, class: 'post' %>
        </div>
      <% end %>

```

##devise用のviewファイルを作成する
`rails g devise:views`
とコマンドを打つとapp/views/deviseのファイルに各種viewファイルが作成される

**サインアップ画面のview**
app/views/devise/ragistrations/new.html.erb

**ログイン画面のview**
app/views/devise/sessions/new.html.erb

##deviseの各アクションへのパス
ターミナルで`rake routes`を実行して確認。

##configure_permitted_parametersメソッド
deviseではサインアップ時にメールアドレスとパスワードのみを受け取るようにストロングパラメーターで設定してあるのでキーを追加しても許可されません。

そこで登場するのがconfigure_permitted_parametersメソッド

configureは**設定する**
permittedは**許可**
parametersは**パラメーター**
という意味。
単純にdeviseで利用出来るパラメーターを設定しますよ。という意味。

パラメーターに追加したい場合は`application_controller`に
`before_action`で`configure_permitted_parametersメソッド`を設定する。

```

例
  class ApplicationController < ActionController::Base
    # Prevent CSRF attacks by raising an exception.
    # For APIs, you may want to use :null_session instead.
    protect_from_forgery with: :exception
    before_action :configure_permitted_parameters, if: :devise_controller?

    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
    end
  end

```
RailsのためのCurlコマンドの備忘録


Never forget to change application.rb like this.

```application.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :null_session
end
```

Http RequestのAcceptを変更する

jsonを指定する場合
This is for json

```bash
curl -v -H "Accept: application/json" http://localhost:3000/users
```

xmlを指定する場合
This is for xml

```bash
curl -v -H "Accept: application/xml" http://localhost:3000/users
```

Response headerのみを見たい時
When we see Response header

```
curl -I http://localhost:3000/users
```

Http methodを指定する場合
When we wanna specify HTTP verb

DELETE

```bash
curl -X DELETE http://localhost:3000/users/1
```

```bash
curl -v -H "Accept: application/json" -X DELETE http://localhost:3000/users/12
```

POST
こういうHashをRailsに送信したい場合
When we want to send hash like this.
"user"=>{"name"=>"test1", "email"=>"test1@gmail.com"}


```bash
curl -X POST http://localhost:3000/users -d 'user[name]=test1&user[email]=test1@gmail.com'
```

```bash
curl -v -H "Accept: application/json" -X POST http://localhost:3000/users -d 'user[name]=test1&user[email]=test1@gmail.com'
```

PUT

```bash
curl -X PUT http://localhost:3000/users/10 -d 'user[name]=test333&user[email]=test1@gmail.com'
```
OpenVPNに接続したときに、接続が不安定になる問題を解消する

OpenVPNに接続したときに、接続が不安定になる問題を解消する(かもしれない)方法

OpenVPNのVPNに接続するとなぜか接続が不安定になるときがありますよね。その原因の一つにMTUやMSSが影響している場合があります。

## 間違ったMTUの症状

* 通信速度が遅い
  * ブラウザがずっとぐるぐるで進まない
* HTTP経由のリソースがちゃんとダウンロードされない
  * CSSやJSが部分的にしか読み込まれない

## 正しいMTUを特定する

正しいMTUを発見するのは簡単で、下記の`ping`コマンドを使います。

MacOS

```bash
ping -D -v -s 1500 -c 1 www.example.com
```

Windows

```bash
ping -n 1 -l 1500 -f www.example.com
```

Linux

```bash
ping -M do -s 1500 -c 1 www.example.com
```

pingが成功するまで1500を10ずつ減らしてください。

### ping失敗例

packet lossに100%なります。

```console
❯ ping -D -v -s 1500 -c 1 www.example.com

PING www.example.com (93.184.216.34): 1500 data bytes
ping: sendto: Message too long
^C
--- www.example.com ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
```

```console
❯ ping -D -v -s 1450 -c 1 www.example.com

PING www.example.com (93.184.216.34): 1450 data bytes
556 bytes from ntt.setup (192.168.1.1): frag needed and DF set (MTU 1454)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 c605 dc0f   0 0000  40  01 61a1 192.168.1.3  93.184.216.34

^C
--- www.example.com ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
```

### ping成功例

packet lossが0%になります。

```console
❯ ping -D -v -s 1420 -c 1 www.example.com

PING www.example.com (93.184.216.34): 1420 data bytes
1428 bytes from 93.184.216.34: icmp_seq=0 ttl=57 time=112.735 ms

--- www.example.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 112.735/112.735/112.735/0.000 ms
```

## 

## OpenVPNのMSSの設定を修正する

OpenVPNでは、MSSと呼ばれる値を設定する必要があります。MSSは、MTUから40を引いた値です。

たとえば、MTUが1340の場合、MSSは1300です。

```
MSS = MTU  - 40
MSS = 1340 - 40
MSS = 1300
```

.ovpnファイルを開き、最後の行に下記設定を一行追加する。

```
mssfix 1300
```

で設定を再読み込みしてVPNに接続すると安定する(かもしれない)
ReactをAWS Lambdaの中でレンダリングさせて、API Gatewayから配信させてみた。


##要約
「AWS LambdaとAPI Gateway使ったらReactのServer Side Rendering(SSR)いい感じにできるんじゃね？」と思った
けど、世の中そんなに甘くはなかった
。
###追記
意外と簡単に解決した。
http://qiita.com/yoshidasts/items/d58c555aed2693e99ae6

##なぜやった

ついカッとなって

できるだけサーバ側の処理を考えずにReactをSSRしたいなーと思った結果、「Lambdaでレンダリングさせて、API GatewayからHTML配信すればええやん！」ってなった。

##参考記事
[手っ取り早く ES2015 で Lambda Function を書く](http://qiita.com/y13i/items/fb90858cdede3eb4dbdf)
Apexとかappex.jsとかbabel的な処理はここ参考にしてください。
##Lambdaファンクションを作る
###babelをReactに対応させる。
何はともあれコンパイル後のJSをLambdaで走らせるので、バベりましょう。
あとついでにReactも入れておきます。

```cmd
$ npm install --save react react-dom
$ npm install --save-dev babel-preset-react
```

```.babelrc
{
	"presets": [
		"es2015",
		"react"
	]
}
```

###いざSSR
ディレクトリとかは、[手っ取り早く ES2015 で Lambda Function を書く](http://qiita.com/y13i/items/fb90858cdede3eb4dbdf)準拠です。
基本的にこれのコード書き換えでやってます。

```functions/hello/src/index.js
import λ from 'apex.js';
import 'babel-polyfill';
import React, { Component } from 'react';
import { renderToString } from 'react-dom/server';

class App extends Component {
	render() {
		return (
			<div>
				<h1>hello React</h1>
				<p>This is a Example page rendered by AWS Lambda & React</p>
			</div>
		);
	};
}

function renderFullPage(renderedContent) {
  return `<!DOCTYPE html><html><head><meta charset="utf-8"></head><body><div id="container">${renderedContent}</div></body></html>`;
}

export default λ( (e, ctx) => {
	const renderedContent = renderToString( <App /> );
	const renderedPage = renderFullPage( renderedContent );
	return (renderedPage);
});
```

###デプロイ
```cmd
$ npm run deploy
```

##API Gatewayから配信する
![スクリーンショット 2016-08-25 17.34.17.png](https://qiita-image-store.s3.amazonaws.com/0/23936/672079af-b313-240b-4131-1ba0af537329.png "スクリーンショット 2016-08-25 17.34.17.png")
とりあえず細かいことはいいんだよ！ってことで、レスポンスのContent-Typeを`text/html`にしてさっき作ったLambdaを呼ぶようにします。

###Mapping Templateを変更する
http://qiita.com/yoshidasts/items/d58c555aed2693e99ae6#mapping-template%E3%81%AE%E8%A8%AD%E5%AE%9A
にあるように、Lambdakからの戻り値のContent-Typeをtext/htmlに設定しましょう。
そうしないと下の画像のようにエスケープされます。
![スクリーンショット 2016-08-25 17.33.10.png](https://qiita-image-store.s3.amazonaws.com/0/23936/f6d8ff24-8a50-6900-48b9-f75718eead2a.png "スクリーンショット 2016-08-25 17.33.10.png")

デプロイしたらURLが表示されるので、アクセスしてみましょう。

##動かした結果
![スクリーンショット 2016-08-25 18.08.02.png](https://qiita-image-store.s3.amazonaws.com/0/23936/6106fb8b-7faa-8435-8896-71aa0e501ea9.png "スクリーンショット 2016-08-25 18.08.02.png")
動きました。
API Gatewayからの引数を受け取る様にしたり、React RouterとかRedux組み込んでいくとすごく楽しいことになりそうな気がします。
BCPを使ってテーブルをCSVに吐き出すストアドプロシージャー

BCPコマンドを利用してパ指定したテーブルをCSVファイルに吐き出すストアドプロシージャーの作り方です。
ただしBCPコマンドではヘッダー行が出力されないので、SQLに工夫をしています。

BCPコマンドはコマンドプロンプトから実行できるコマンドで、これを利用するには先にxp_cmdshellを使えるようにしておきます。

```sql:xp_cmdshellサーバー構成オプション
-- To allow advanced options to be changed.  
EXEC sp_configure 'show advanced options', 1;  
GO  
-- To update the currently configured value for advanced options.  
RECONFIGURE;  
GO  
-- To enable the feature.  
EXEC sp_configure 'xp_cmdshell', 1;  
GO  
-- To update the currently configured value for this feature.  
RECONFIGURE;  
GO  
```

以下のストアドを作ります。

```sql:ExportCSV
USE [HOGEHOGE]
GO
/****** Object:  StoredProcedure [dbo].[ExportCSV]    Script Date: 2016/08/25 17:18:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[ExportCSV]
	-- Add the parameters for the stored procedure here
	@TableName NVARCHAR(100),
	@FilePath  NVARCHAR(255)
AS
BEGIN
	
	SET NOCOUNT ON;
	DECLARE @raw_sql nvarchar(4000)

	DECLARE @columnHeader VARCHAR(8000)
	SELECT @columnHeader = COALESCE(@columnHeader+',' ,'')+ ''''+column_name +'''' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName


	DECLARE @ColumnList VARCHAR(8000)
	SELECT @ColumnList = COALESCE(@ColumnList+',' ,'')+ 'CAST(['+column_name +'] AS VARCHAR)' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =@TableName

--	PRINT @ColumnList

	SELECT @raw_sql = 'SELECT '+ @columnHeader +' UNION ALL SELECT ' + @ColumnList + ' FROM [' + @TableName +']'

--	PRINT @raw_SQL
--	EXECUTE sp_executesql  @raw_sql


	DECLARE @sql VARCHAR(8000);
	SELECT  @sql = 'bcp "'+@raw_sql+ '" queryout '+@FilePath +' -c -t, -T -S' + @@servername + ' -d '+DB_NAME()	
	
	EXEC master..xp_cmdshell @sql
	
END

```


ストアドを呼び出すとCSVファイルが生成されます。

```sql:ストアドを呼び出す。
EXEC dbo.ExportCSV 'テーブル名','c:\tmp\test.csv'
```
アクセスでテーブル一覧を取得する方法

# 方法

新しくクエリを追加します。

```sql
SELECT MSysObjects.Type, MSysObjects.Name, MSysObjects.Flags
FROM MSysObjects
ORDER BY MSysObjects.Type, MSysObjects.Name;
```

# 参考
http://oshiete.goo.ne.jp/qa/4031460.html
Vagrant環境で開発中、omniauth-google-oauth2でInvalidIatErrorが出る問題の解決法

# tl;dr
仮想マシンの時刻がずれているから直そう

# 問題
タイトルの通り、Vagrantを使って仮想マシンでRailsアプリを開発中、`omniauth-google-oauth2`gemを使ってGoogle認証するとき、たまに（必ずではない）`InvalidIatError`という謎のエラーが出る。

# 解決法
どうやら、問題の原因は認証リクエストの送信側と受信側の時刻のずれらしい。よって、`nptd`をインストールして実行するとエラーが出なくなる。

# ぼやき
時刻のずれは割りとよくあることだと思うので、エラーの内容をもう少しわかりやすくしてほしいなあ…
gitで warning: ignoring broken ref refs/remotes/origin/HEAD ってエラーが出た時の対処法

最近はずっとsource treeで作業していたんですが、ある日 `push -f` する必要があってターミナルから実行しようとしてbranchをtabで補完しようとしたら、、、

```
warning: ignoring broken ref refs/remotes/origin/HEAD
```

なんて出てきて補完できない状態に😨

いろいろググってたら `git gc` がどうのこうのとか出てきたので実行しようとしたら

```
% git gc
(git)-[{yourDefaultBranch}]
fatal: bad object refs/remotes/origin/HEAD
error: failed to run repack
```

まじか。。。

もう1回上記エラーでググる。

`git pull origin master` で直るでみたいな記事を発見。

```
% git pull origin {yourDefaultBranch}                                                                                                                                                                                                                (git)-[{yourDefaultBranch}]
From github.com:Hoge/fuga
 * branch            {yourDefaultBranch} -> FETCH_HEAD
Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.
error: The last gc run reported the following. Please correct the root cause
and remove .git/gc.log.
Automatic cleanup will not be performed until the file is removed.

fatal: bad object refs/remotes/origin/HEAD
error: failed to run repack

Updating 2d391b0..df04d0f
Fast-forward
Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.
error: The last gc run reported the following. Please correct the root cause
and remove .git/gc.log.
Automatic cleanup will not be performed until the file is removed.

fatal: bad object refs/remotes/origin/HEAD
error: failed to run repack
```

直らない😨😨😨

## 解決方法
詰んだ。。。と思いましたが更に対処法を探してると以下の記事を発見！！
https://www.netroby.com/view/3864
記事通り以下のコマンドを実行

```
git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/{yourDefaultBranch}
git fetch --prune
git gc
```

僕の場合はこれで直りました！
よかったよかった！

### 参考URL
Fix bad object refs/remotes/origin/HEAD while execute git gc
https://www.netroby.com/view/3864
Firebaseの設定ファイルをスキーマ毎に切り替える

Firebaseの設定を切り替えたかったんですけどちょっと時間がかかったのでメモを残しておきます

スキーマで設定ファイル（GoogleService-Info.plist)を切り分けて読み込みたかったのですが、AndroidのFlavorで切り分けることはできないのでどうしようかとDocumentをあさって解決しました
尚、PreProcessorはスキーマ毎にPRODUCTION、STAGING、DEVELOPMENTといった感じに定義しています

```
#if PRODUCTION
let filePath = NSBundle.mainBundle().pathForResource("GoogleService-Info-pro", ofType: "plist")
#elseif STAGING
let filePath = NSBundle.mainBundle().pathForResource("GoogleService-Info-stg", ofType: "plist")
#else
let filePath = NSBundle.mainBundle().pathForResource("GoogleService-Info-dev", ofType: "plist")
#endif
let firebaseOption = FIROptions(contentsOfFile: filePath)
FIRApp.configureWithOptions(firebaseOption)
```

これでいい感じに設定ファイルを切り替えることができます
ただし、FirebaseのVersionが新しくないとダメっぽいです（検証環境version3.5.1)
cakephp 2.xのサイト移動（移行）時のチェックポイント

Cakephpで本番サーバーをセットアップする際に開発サーバーでセットアップした内容をそのままコピーして持って行けるんじゃないかと思いますね。phpなので設定ファイルくらい「/app/Config/」を調整すればいいんじゃないかと安易に考えがちです :smile: （私がですが）

そこで、別の（開発）サイトからコピーして一式持ってきた場合の調整個所を移行手順として、以下にまとめてみました。



## cakephpのサイト移行手順（チェックポイント :sunny: ）

- /直下の.htaccessファイルを編集する。
現在のパスに合わせる。

- /app/.htaccessファイルを編集する。
現在のパスに合わせる。

- /app/webroot/.htaccessファイルを編集する
現在のパスに合わせる。

- /app/Config/database.phpファイルを編集する


- DBをリストアする


- /app/tmp/以下のパーミッションを確認する
```
chmod -R 777 /app/tmp
```
上記コマンドでとにかくだれでもアクセスできるようにする。（ただしくは、apache(web server)がアクセスできるか確認する）



###以上
VirtualBoxで仮想マシンが瞑想中(システムエラー)になったら

# VirtualBoxで仮想マシンが瞑想中(システムエラー)になったら

Windows 7のVirtualBox 4.3.12で仮想マシンが瞑想中(システムエラー)となった。原因はメモリ不足と思われる。この状態からvagrant upできず、VirtualBoxのGUIから仮想マシンを停止することもできなかった。

```
C:\Users\ADMIN\MyVagrant\bpm857>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'bento/centos-6.7' is up to date...
==> default: Clearing any previously set forwarded ports...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["modifyvm", "2bfc1a24-ce63-4996-9bf9-92dac90a7086", "--natpf1", "delete", "ssh"]

Stderr: VBoxManage.exe: error: The machine 'bpm857_default_1463030780543_14826' is already locked for a session (or being unlocked)
VBoxManage.exe: error: Details: code VBOX_E_INVALID_OBJECT_STATE (0x80bb0007), component Machine, interface IMachine, callee IUnknown
VBoxManage.exe: error: Context: "LockMachine(a->session, LockType_Write)" at line 462 of file VBoxManageModifyVM.cpp

C:\Users\ADMIN\MyVagrant\bpm857>
```

以下コマンドで仮想マシンを停止することができた。

```
C:\Program Files\Oracle\VirtualBox>VBoxManage.exe controlvm <マシン名> poweroff
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

C:\Program Files\Oracle\VirtualBox>
```

## 参考リンク

[VirtualBox で仮想マシンが「瞑想中(システムエラー)」となってにっちもさっちも行かないとき](http://subtech.g.hatena.ne.jp/motemen/20101119/1290092905)
UbuntuでC言語ファイルの実行方法


<br>

###1.gcc.vimをインストール！！

<br>

　C言語ファイルを実行するにはコンパイラが必要になります。
　なのでgccコマンドを利用するので以下のコマンドでインストールしてください
　``` sudo apt-get install gcc ```

　次はファイルを作成するのに欠かせないVimもインストールします。
　``` sudo apt-get install vim ```

<br>

###2.ファイルをコンパイル

<br>

　Vimコマンドで作成したC言語ファイル
　をコンパイルしてエラーがないかを確認します。
　``` gcc hogehoge.c ```　

<br>

###3.実行

<br>

　上記のコマンドでコンパイルして、何も出てこなければエラーはないということです。
　エラーがないことを確認したら以下のコマンドで実行してください
　``` ./a.out  ```

<br>

###追記

<br>
　
　コメント欄でVimだけで出来る
　もっと便利な方法を教えていただいたので書いておきます。

　Vimコマンドでファイルを作成して、
　gccコマンドを利用しなくても以下のVimコマンド(コマンドモード)
　でコンパイル、実行ができます。

　```: !gcc```
　```: !./a.out```

　他のコンパイル方法（コメントから）
　```:make　hogehoge.c ```


<br>

<br>
Flux


我学 Flux

Flux 是 fb 用来开发客户端型的 web 应用的一种架构设计. 它组合了` React` 兼容的视图组件, 使用单向的数据流. 它更加趋向于一个架构设计而非框架.

Flux 主要有几个大部分组成

- dispatcher
- stores
- view(react components)

不同于更加常见的`MVC`, 在 flux 里没有我们所谓的` controller`, 而是一种叫做` controller-view` 的东西. 视图通常在顶部首先从` store` 哪里得到数据, 然后把这些数据再往下面分配, 另外, `动作创建者`还有`指派帮助方法`,他们通常用来支持一些语义话的 API 用来描述应用里有可能发生的动作.

Flux 使用一种单向的数据流 当一个用户和 React 的视图交互的时候, 视图传送一个动作到中央的指派器, 然后到达 store, 他们用来保存应用的数据和一些逻辑, 他们会更新所有相关的视图状态. 这个和 react 的指令编程方式很切合. 这个就允许 store 发送一些特定的更新操作来改变状态.

我们起初是在正确的搞定数据, 例如我们面对一个未读消息数的 case, 同时我们还在面对一个对话的 list case, 而我们需要高亮未读消息的时候,这个情况下 mvc 就比较困难处理起来,--当把某条对话标记为已读会去更新这个对话 model, 而这个时候就要附带的修改未读对话的 model. 像这样的侧层级附带更新操作在大型的 mvc 程序里会经常遇到. 结果不可预测.

在 flux 理我们把 controller 这个角色倒置给 stores, 这个` store` 它可以接受更新等操作, 而不取决于外部的更新.他们不会任意呗外界修改,通常只有注册给分配器的回调函数才可以更新数据的状态.

###结构和数据流

数据在 Flux 里是单向的

![Kobito.FTcLJF.png](https://qiita-image-store.s3.amazonaws.com/0/56713/c671b7e8-b804-ee7f-7227-c574eb7e5fe4.png "Kobito.FTcLJF.png")

这个是 Flux 的核心概念, dispatcher, stores, view 他们之间是独立的. 



![Kobito.2ooFRe.png](https://qiita-image-store.s3.amazonaws.com/0/56713/4e2f7f84-0178-d801-148e-3503d248b9e3.png "Kobito.2ooFRe.png")

视图会 对于用户的交互指定特定的动作来给 dispatcher, 然后找到对应的 store, 修改状态, 然后 store 会对于相关的视图做出同步动作.

![Kobito.N2yrnE.png](https://qiita-image-store.s3.amazonaws.com/0/56713/22c6f786-8cd7-02fd-ab5f-df8862f4a9e0.png "Kobito.N2yrnE.png")

- action creator 就是一些帮助类, 给他们指定类型,然后给 dispatcher 使用
- 每一个动作会被发送到所有的 stores 那些通过 `callback` 已经注册到 dispatcher 里的.
- 当 store 在完成数据状态更新之后,会触发 change 的事件. 而有一个特定的`视图`-> `controller-view` 他们会监视这些事件,然后一单有新数据就会拿新数据更新所有的视图.


>We found that two-way data bindings led to cascading updates, where changing one object led to another object changing, which could also trigger more updates. As applications grew, these cascading updates made it very difficult to predict what would change as the result of one user interaction. When updates can only change data within a single round, the system as a whole becomes more predictable.


我们发现双向数据绑定就引发层级更新,而程序越庞大层级更新的范围就不可控, 就无法知道预测一个用户的操作会诱发多少相关的更新, 当一个更新只有一个确定的更新范围这个系统就是可测的.


###单个 dispatch

这个分发器会管理整个flux 应用的数据流,作为一个中央处理器. 它本身没有什么含量在. 就是简单注册了各种视图回调到 `store`里. 当一个动作创建者触发一个新的动作,所有的有注册的 store 都会收到回调事件.

### stores
包含应用状态,逻辑. 他们的角色类似 `mvc`架构里的` model`. 但是他们管理很多对象的状态.-- 他们不会去对应到实际的比如 ORM 里的一条记录. 或者类似` backbone` 里的一个集合. 他们更像是在对应整个 ORM 里一系列的数据集合. 管理一个应用中特定的` domain` 的数据状态.



###视图和控制视图


`React` 给视图层提供了很多种可以组件化而且自由渲染的视图.在这里最接近视图树最上层,一种特殊的用来监听所有事件来广播给` store` 事件的,我们称之为` controller-view`. 其实它很简单,就是从` store` 里拿到数据,然后分发到后代的节点. 

当它从 store 哪里得到事件, 然后通过 store 里的公共方法拿到数据, 接着调用自己的` setState()`或者` forceUpdate()` 方法,接着通过` render()` 方法把事件传递给后代.



###动作

分发器暴露了一个方法, 它允许我们能够触发一个分发到` store`, 这个分发里包含请求的数据, 我们把这个分发称之为`动作`.如何创建这个动作,可能会封装到一个语义的帮助方法里, 用来发送动作到分发器, 如我们要修改已经添加到 list里的 item 的内容,我们就创建一个` updateText(todoId, newText)`的方法, 在 `TodoActions` 然后它就会在视图的事件处理器哪里被触发.我们可以触发它作为用户交互的响应. 这个动作创建也会添加一个` type` 到这个动作,所以当一个动作在` store` 里触发它就可以找出对应的,如我们把这个动作起名为`TODO_UPDATE_TEXT`.


to be continued---
Mac OS XでGRUB2のコマンドを使いたい

今[自作中のOS](https://github.com/yakawa/OS_x86_64)は、grubから起動させることを前提に書かれていて、なおかつ、GRUBのコマンドを使ってDiskImage(Bootable CD)を作っています。

使っていたLinux機を手放してしまったため、MacOSで作成せねばなりません。そこで、GRUB2をインストールします。

# GRUB2の入手

[GNU GRUB](http://www.gnu.org/software/grub/)のページから、落としてくるか、

```bash
$ git clone git://git.savannah.gnu.org/grub.git
```

# objconvのインストール

`configure: error: objconv not found which is required when building with apple compiler`
といわれてしまうので、

- http://www.agner.org/optimize/#objconv
- http://wiki.clean.cs.ru.nl/Clean_on_Mac_OS_X

この辺を参考にして、インストール。

```bash
$ curl http://www.agner.org/optimize/objconv.zip -o objconv.zip
$ mkdir objconv
$ cd objconv
$ mv ../objconv.zip .
$ unzip objconv.zip
$ unzip source.zip
$ sh build.sh
$ cp objconv /usr/local/bin/
```


# GRUB2のコンパイル

```bash
$ ./autogen.sh
$ ./configure
$ ./make
$ ./make install
```

これで無事にGRUB2関連コマンドが使えるようになりました。
AssumeRoleでAWSのS3アップロードをするコマンド

# はじめに

本稿ではAssumeRoleによる自動クレデンシャル取得を利用したS3アップロードの方法をご紹介します。

基本的には以下の記事の手法をコマンドに落とし込んだだけです。
（すべてを理解しているわけではないので無駄なコード等あるかもしれません！）

[AWS CLIがAssumeRoleによる自動クレデンシャル取得とMFAに対応しました！ ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/aws-cli-supports-assume-role-credentials-provider-and-mfa/)

# Gulpを用いたS3アップロード

普段の業務で、サーバーサイドの動的な要素がないサイトの公開をする方法として、S3にまるまる一式アップロード、という方法を使うことがあります。

GulpでS3アップロードを実行する場合、以下の辺りのnpmが有名なものとして挙げられます。

[gulp-awspublish](https://www.npmjs.com/package/gulp-awspublish)
[gulp-s3-upload](https://www.npmjs.com/package/gulp-s3-upload)

仕事でも、一時期前まではgulp-awspublishを利用していたのですが、
最近社内でのAWSの運用方針が変わり、
Node.jsで可能なACCESS KEYとSECRET ACCESS KEYだけで認証する方法が使えなくなってしまいました。

参考: [AssumeRole が面倒な人向け簡易 shell script - Qiita](http://qiita.com/u-minor/items/4eca27cce64d3f4248ba)

# 実装

[冒頭で紹介したページ](http://dev.classmethod.jp/cloud/aws/aws-cli-supports-assume-role-credentials-provider-and-mfa/)では、 `~/.aws/config` に `role_arn` の記述をして、 `aws --profile （プロフィール名）` のようにオプションをつければ、Assume
Roleによる自動クレデンシャル取得でのawsコマンド実行が可能になります。

なお、awsのコマンドを事前にインストールする必要ありです。
[aws cli install mac - Qiita](http://qiita.com/maimai-swap/items/999eb69b7a4420d6ab64)


```~/.aws/config
[profile sample-site]
# 111122223333
role_arn = arn:aws:iam::111122223333:role/role-name
source_profile = default
[default]
output = json
region = us-west-2
```

```~/.aws/credentials
[default]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

```
aws --profile sample-site s3 sync ../../public s3://site.example.com/ --delete --acl public-read --cache-control 'no-cache'
```

これをNode.jsで実行するには、ルートディレクトリーで `package.json` に以下のような `script` を記述することで、 `npm run publish` というコマンドを叩けばS3にアップロードできます。

参考: [aws s3へフォルダ毎でダウンロードとアップロードする方法｜ prophet STAFF BLOG](http://blog.prophet.jp/1327)
参考: [AWS S3のCLI(コマンドラインインターフェース)を試してみる | もふもふ技術部](http://j-caw.co.jp/blog/?p=1342)

```json:package.json
{
  "name": "sample-site",
  "version": "0.0.1",
  "description": "SAMPLE SITE",
  "main": "gulpfile.js",
  "engines": {
    "node": ">=5.0.0"
  },
  "scripts": {
    "start": "gulp",
    "serve": "gulp serve",
    "build": "gulp build",
    "publish": "aws --profile sample-site s3 sync ../../public s3://site.example.com/ --delete --acl public-read --cache-control 'no-cache'"
  },
  ...
}
```

最終的に、Gulpコマンドではないものの、Node.jsでS3アップロードすることができました。
Dockerで"http: server gave HTTP response to HTTPS client"なるエラーが発生したときの対処法

HTTPSをサポートしていないDockerサーバに接続しようとした際に `http: server gave HTTP response to HTTPS client` なるエラーが発生することがあります。これは `DOCKER_CERT_PATH` と `DOCKER_TLS_VERIFY` 環境変数が設定されていることで発生します。

## 対処方法

環境変数を消す

```
unset DOCKER_TLS_VERIFY
unset DOCKER_CERT_PATH
```

これで接続できるようになります。
Raspberry PiのGPUで数値計算: (1)QPUと数値計算

# Raspberry PiのGPUで数値計算: (1)QPUと数値計算

## 自己紹介

B1です．Idein Inc. ( http://idein.jp/ ) でアルバイトとして働いています．数値計算プログラムの最適化や並列化，組み込みプログラミングや電子回路設計の経験があり，弊社でそのような仕事をしています．上記に加えて画像処理やアルゴリズムに興味があります．


## VideoCore IV QPU

Raspberry PiのSoCであるBCM2835(Raspberry Pi 1)，BCM2836(Raspberry Pi 2)およびBCM2837(Raspberry Pi 3)には，VideoCore IVというGPUが載っています．これはRaspberry Piの起動やファームウェアの実行やメディア処理等を主に行っています．

VideoCore IVにはQPUというSIMDプロセッサがあります．これはOpen GL/ESのshading languageを実行するために存在します．といっても結構柔軟なプロセッサなので，加算や乗算やメモリI/O等の一般的な処理を行うことができます．理論性能は32-bit floatなら24Gflop/sと，結構速いです．

QPUの命令セットが2012年に公開されて以来，何人かの人がこのプロセッサを使って画像処理だけでなく数値計算をしてきました．例えば，elorimer氏のSHA256 ( https://github.com/elorimer/rpi-playground/tree/master/QPU/SHA-256 ) やAndrew Holme氏のFFT ( https://github.com/raspberrypi/firmware/tree/master/opt/vc/src/hello_pi/hello_fft )，Jetpac Inc.のsgemm ( https://github.com/jetpacapp/DeepBeliefSDK )，nineties氏のsgemm ( https://github.com/nineties/py-videocore ) です．


## nineties氏のsgemm

nineties氏はQPUで数値計算をする例があまりにも少ないことや，あったとしても性能が低いことを憂いて，QPUのマルチコア・SIMD性を活かして高速なsgemmを書きました．詳しくは http://qiita.com/9_ties/items/15ab7fa198991a61a3a9 から始まる記事をご覧ください．

nineties氏のsgemmはアセンブラやドライバをPython内で完結させており，これを使えば簡単にQPUのプログラムを書いたり実行したりすることができます．

しかし，nineties氏のsgemmは，以下の点において不完全です．

### Raspberry Pi 1以降ではうまく動作しない

Raspberry Pi 1，2，3での実行結果を https://github.com/Terminus-IMRC/py-videocore/blob/relative/outputs.md に置いておきます．

Raspberry Pi 1以降で実行すると，結果の誤差が大きくなります．また，相対誤差を見ると，Raspberry Pi 1でさえうまく動作していないように見受けられます．絶対誤差は1e-4ほどと小さいのですが，それは結果の値が小さいからであり，情報落ちが発生する浮動小数点数に対しては相対誤差を使用したほうが良いでしょう．

さらに，QPUのクロックがより速いはずのRaspberry Pi 3での実行時間が1，2のものよりも長く，正しく動作しているとは考えにくいです．

### まだ最適化の余地がある

nineties氏のsgemmにはまだ最適化できそうな箇所があります．

ただし，nineties氏はアムダールの法則に従って，すなわちオーバーヘッドとなりそうなところだけチューニングしています．この精神は無駄な努力を省くためにとても重要です．自戒を込めて．


私は，以上の点を改善したsgemmを書こうと思いました．

http://qiita.com/Terminus-IMRC/items/c2b3ef492fe9c018d6ff に続きます．


## License

Copyright © 2016 Sugizaki Yukimasa. All rights reserved.

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Firefoxと戻るとJSONP

(2015年時点の古い記事になってしまいましたが、もったいなかったので公開します)

Firefoxで「戻る」と「戻りすぎる」という謎現象に出逢ったので、それについてのメモ。

結論から言うと、firefoxの正常な謎仕様です。setTimeoutでぶった斬りましょう。

## 現象

* バナー表示を行う
* バナーのリンクをクリックした時にJSONPでサーバと通信
* サーバでの処理完了を待って、location.hrefに値を入れてページ遷移

という処理を行っていました。

その状況で、firefoxでだけ、遷移後に「戻る」と、バナー表示を行ったページが飛ばされて、それより前に表示されていたページに戻る...つまり、戻りすぎるという現象が発生しました。

詳しくブラウザの表示履歴を見ると、バナークリックで遷移した後、バナー表示を行ったページの履歴が残っていない状態でした。

## 仕様のこと

ページがloading状態の時に、location.hrefで遷移した場合、そのページを「履歴に残さない」という仕様があるようです。location.replaceの動作になるイメージですね。ただ、location.assignもこの条件ではreplaceと同様の動作になるようです。

古き悪しきlocation.hrefでのリダイレクト実装への対処を行うための仕様..のように思われますが、詳細は不明です。

Firefoxはこの仕様を妙に厳格にとるのか、2015年の今日、ver42でも発生しています。

http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/

この実証コードでは、hashbangで動作を再現できるようになっています。(fails in firefox)と書かれた項目のリンクをクリックすると`#done_4`になりますが、「戻る」と、`#start_4`になりません。

## 対処のこと、内部の動作のこと

http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/

実証コードのページに対処法も載っています。`setTimeout`を使う方法ですね。

察するに...

JSONPの通信後、レスポンスのjsファイルから、コールバック用のメソッドが呼ばれて、レスポンス後の処理に入ります。このとき、jqueryのajaxコマンドに渡すsuccesメソッドに処理を書きますが、どうやらこれが、「jsファイルの地の文」の処理の流れから直接実行されているようです。

「jsファイル読み込み→jsファイルの地の文の実行→実行完了」までが読み込み処理とみなされるため、successメソッドで直接location.hrefを書き換えると、「読み込み処理中のページ遷移」とみなされます。

そこで、location.hrefの書き換えをsetTimeout(func, 0)の中で行うようにすると、それを呼び出した(読み込み中の)処理の流れから切り離されるので、「読み込み完了後」に遷移が発生したことになり、履歴は無事残るようになる...

ということらしい。

何故にJSONPの読み込みが、一度読み込み完了したはずのページ全体の「読み込み中」を引き起こすのかは若干納得がいきませんが...

## まとめ

- firefoxには、JSONPのコールバックでlocation.hrefを書き換えると、履歴が意図せずに消える謎仕様がある
- JSONPのコールバック内でページ遷移を起こしたい場合は、setTimeoutを使って処理を切る


## 参考

* http://d.hatena.ne.jp/tarao/20091126/1259206206
* https://bugzilla.mozilla.org/show_bug.cgi?id=368366
Unityとc#でクラスを書くメモ


unity初心者がメモしていきます。

## MonoBehaviourじゃない、ふつうのクラス
ふつうのクラス作る書き方と呼び出し方。

```csharp:class
using UnityEngine;
namespace Hoge//←パッケージ的なもの
{
    public class Fuga
    {
        public Fuga()
        {
           Debug.Log("Unko");
        }

        public void Hello()
        {
            Debug.Log("Hello");
        }
    }
}
```


```csharp:class_yobidasu
//インスタンス生成
using Hoge;
Fuga aaa = new Fuga();
```

## クラス継承
「:」でつなぐだけみたい。base でスーパークラス参照。

```csharp:extend
using UnityEngine;
using System.Collections;

public class Hoge : SuperClazz {

	public void Start () {
		base.Start();//スーパークラス参照
	}
}
```

## オーバーライド
元の関数にはvirtual, 上書き関数はoverride をつける

```csharp:extend 
class Animal {
	public virtual void AnimalFunction() {
		Debug.Log("アニマルクラスです");
	}
}
 
class Hiyoko : Animal {
	public override void AnimalFunction() {
		Debug.Log("ひよこクラスです");
	}
```
 
 
## アクセス修飾子 private,public,protected
関数・変数の前につけるやつ。

* public - どこからでも使える
* private - そのクラスしか使えない
* protected - 子クラスからはつかえる。継承する時つかう
* virtual - オーバーライドする元の関数につける
* abstract - 実体はない、インターフェイス的にベースクラスに定義するものっぽい


## Monobihaviorシングルトンの書き方

参考　http://albatrus.com/main/unity/7517

```
//DataManagerの部分は、シングルトンにするクラス名を指定して下さい。
static public DataManager instance
void Awake ()
{
 if (instance == null) {
 
     instance = this;
     DontDestroyOnLoad (gameObject);
 }
 else {
 
     Destroy (gameObject);
 }
 
}
```

```
//使うとき
DataManager.instance.score = 100;
```
Mac OS Xでbochsをインストールする方法

自作OSづくりに欠かせない（と自分では思っている）BochsをMacで使う！



# bochsの入手

[Bochs](http://bochs.sourceforge.net)のページに行きとりあえず、最新版を入手する。
Mac版のバイナリがないので、ソースコードを入手して、コンパイルします。

# SDLのインストール

なぜか、x11でコンパイルするとうまくいかなかったのでSDL(Simple DirectMedia Layer)をインストールします。

```bash
$ brew install sdl
```

# bochsのコンパイル

```bash
$ mkdir work
$ cd work
$ mv ~/Downloads/bochs-2.6.8.tar.gz .
$ tar zxvf bochs-2.6.8.tar.gz
$ cd bochs-2.6.8
$ ./configure --enable-ne2000 \
            --enable-all-optimizations \
            --enable-cpu-level=6 \
            --enable-x86-64 \
            --enable-vmx=2 \
            --enable-pci \
            --enable-usb \
            --enable-usb-ohci \
            --enable-e1000 \
            --enable-debugger \
            --enable-disasm \
            --disable-debugger-gui \
            --with-sdl \
            --prefix=$HOME/opt/bochs
$ make
$ make install
```

オプションは適当に変更してください。でも、`--with-sdl --disable-debugger-gui`この辺は必須ですね。

で、このままだと、`$HOME/opt/bochs`にインストールされるので、パスを通しておく必要があります。

```bash
export BXSHARE="$HOME/opt/bochs/share/bochs"
export PATH="$PATH:$HOME/opt/bochs/bin"
```
をbashrcとかその辺に追加しておく必要があります。

autoconfあたりでエラーが出たりした場合は、気合でbrewでどんどんインストール！

# 参考URL
http://stackoverflow.com/questions/1677324/compiling-bochs-on-mac-os-x-snow-leopard
Riotjsで簡単なfilter機能を実装してみた。

なにかと使ってみたいFilter機能。
githubにいくつかexamplesがあがっていて、そのソース等を元に自分なりにもう少しわかりやすくしてみました。これが正しい実装なのかはちょっとあれですが。他にわかりやすい書き方があるといいな。
[https://github.com/riot/examples](https://github.com/riot/examples)


# 簡単な説明
* まずテキストをまとめた配列 filterList を用意。
* 初回起動時に呼ばれる mount の処理で、 originArr に格納。
* filterList にある title を表示する。（この時点ではすべて表示）
* テキストボックスに入力すると filter() 関数が呼ばれ、入力された値が originArr の中に含まれているかを判定し、その結果を updateArr に格納。
* 文字入力のイベントで、update が動くのでそのタイミングで filterList の値を updateArr に替える。
* filterで絞り込みした結果が表示される。

↑日本語があやしいかもなので、下記ソースを参照。

# サンプルソース
コピペでどうぞ。

```:filter.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

<app></app>

<script type="riot/tag">
<app>
    <h3>Filter Demo</h3>
    <input type="text" name="searchFilter" onkeyup={ this.filter } placeholder="ここに入力してね..."/>
    <ul>
        <li each={ target , i in filterList }>
            <a href="{ target.url }">{ target.title }</a>
        </li>
    </ul>

    var originArr = [] //リスト全てを格納
    var updateArr = [] //filterした結果を格納

    //onkeyup時に呼ぶ関数
    filter() {
        var keyword = this.searchFilter.value
        if (updateArr != undefined){
            updateArr = Array.prototype.filter.call(originArr, function(e){
                if (e.title.indexOf(keyword) > -1) {
                    return true
                } else {
                    return false
                }
                return true
            })
        }
    }

    //mount時にすべての配列を originArr にセット
    this.on('mount', function(){
        originArr = this.filterList
    })

    //関数で処理した結果を filterList に反映させる。
    this.on('update', function(){
        if (originArr!=""){
            this.filterList = updateArr
        }
    })

    //検索対象のリスト
    this.filterList = [
        {url:'/link1/', title:'あか'},
        {url:'/link2/', title:'あお'},
        {url:'/link3/', title:'きいろ'},
        {url:'/link4/', title:'しろ'},
        {url:'/link5/', title:'くろ'},
    ]
</app>
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/riot/2.6.0/riot+compiler.min.js"></script>
<script>riot.mount('*')</script>
</body>
</html>
```
remi の php70 パッケージについて調べてみた


# 前書き

CentOS 7.x で新たに Laravel の開発環境を作ろうとしていますが、php は今からだとやっぱり 7 系だよねー
ということで、epel+remi リポジトリを入れて、php の 7 系を入れてみました。

remi にした経緯：[CentOS 7.x で php-7.x を入れるためのリポジトリの比較](http://qiita.com/hotta/items/a94e27aa34649b7fa1b0)

上記のページを見ていただくとわかりますが、パッケージ名としての "php" は、CentOS7 では php-5.4 系を指します。なので、php7 系を入れるためには php70-* というパッケージを導入することになります。
# 導入したパッケージ

現時点で入れたパッケージは以下の通りです。最終的にはもう少し増えるかもしれません。

```bash
vagrant@localhost:~$ rpm -qa | grep php
php70-runtime-1.0-5.el7.remi.x86_64
php70-php-cli-7.0.9-1.el7.remi.x86_64
php70-php-mbstring-7.0.9-1.el7.remi.x86_64
php70-php-json-7.0.9-1.el7.remi.x86_64
php70-php-pdo-7.0.9-1.el7.remi.x86_64
php70-1.0-5.el7.remi.x86_64
php70-php-xml-7.0.9-1.el7.remi.x86_64
php70-php-fpm-7.0.9-1.el7.remi.x86_64
php70-php-common-7.0.9-1.el7.remi.x86_64
php70-php-pgsql-7.0.9-1.el7.remi.x86_64
```

# /etc/php.ini はいずこ？

次に設定をやろうとしたら（正確には、環境を作るための ansible-playbook を作っていますが）、ことごとくパスが異なります。まず、大前提としての /etc/php.ini がない。

```bash
vagrant@localhost:~$ sudo ls /etc/php*
ls: cannot access /etc/php*: No such file or directory
```

php.ini どころか、/etc 直下には php と名の付くものが一切ありません。

思うに、php70-* パッケージシリーズは、php-* パッケージと共存できるように作られているようです。/etc/php* は phpパッケージが使っているであろうから、この名前空間を汚さないようにしているのだと考えられます。

# php70 パッケージとは

php70 自体は仮想パッケージのような扱いで、中身（ファイル）がありません。

```bash
vagrant@localhost:~$ rpm -ql php70-1.0
(contains no files)
```

ただ、こいつを入れると、もれなく scl-package が合わせて入ってきます。

```bash
vagrant@localhost:~$ rpm -q --provides php70-1.0
scl-package(php70)
php70 = 1.0-5.el7.remi
php70(x86-64) = 1.0-5.el7.remi
```

SCL は、Software Collections という、複数バージョンを共存させるための仕組みとのことです。PHP 以外にも、同じ仕組みで複数のコンポーネントがサポートされているようです。

[Software Collections (SCL) を CentOS に入れてみた](http://qiita.com/murachi1208/items/202bff84964188619f57)

# で、結局のところ、/etc/php.ini はいずこ？

ここにありました。

```bash
vagrant@localhost:~$ rpm -ql php70-php-common | grep php.ini
/etc/opt/remi/php70/php.ini
/opt/remi/php70/root/usr/share/doc/php70-php-common-7.0.9/php.ini-development
/opt/remi/php70/root/usr/share/doc/php70-php-common-7.0.9/php.ini-production
```
（別解）

```bash
vagrant@localhost:~$ php70 -i | grep php.ini
Configuration File (php.ini) Path => /etc/opt/remi/php70
Loaded Configuration File => /etc/opt/remi/php70/php.ini
```

remi で入れたものは、/etc/opt/remi/php70/ を /etc と読み替えるとよそさそうです。

```bash
vagrant@localhost:~$ ls /etc/opt/remi/php70/
opt    php-fpm.conf  php.ini  pm    sysconfig  xdg
php.d  php-fpm.d     pki      skel  X11        xinetd.d
```

同様に、以下のような読み替えが必要です：

| 標準の場所 | remiの場合 |
|:--|:--|
| /etc  | /etc/opt/remi/php70/  |
| /var  | /var/opt/remi/php70  |
| /usr/share  | /opt/remi/php70/root/usr/share/  |
| /usr/bin/php  | /usr/bin/php70  |

/usr/bin/php70 はさすがに面倒でかつ間違えそうなので、個人的には以下のようなシンボリックリンクを張るようにしました。

```bash
vagrant@localhost:~$ ls -l /usr/bin/php
lrwxrwxrwx. 1 root root 21 Aug 25 10:35 /usr/bin/php -> /etc/alternatives/php
vagrant@localhost:~$ ls -l /etc/alternatives/php
lrwxrwxrwx. 1 root root 14 Aug 25 10:35 /etc/alternatives/php -> /usr/bin/php70
vagrant@localhost:~$ php -v
PHP 7.0.9 (cli) (built: Jul 20 2016 16:58:48) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
```

現場からは以上です。