OmniAICreator/Qiita-1.07M huggingface dataset:
三日坊主防止用の超シンプルなWebアプリ？作った

![counter.JPG](https://qiita-image-store.s3.amazonaws.com/0/28302/840d3895-87ad-891a-750f-18a19dfa9d87.jpeg)

![counter.JPG](https://qiita-image-store.s3.amazonaws.com/0/28302/52ad0b9c-75c2-919d-13ff-6e60053f55b1.jpeg)

http://opengl-8080.github.io/counter/

ソース：https://github.com/opengl-8080/counter

- `Count Up` をクリックすると、カウントが１加算される。
- `Reset` をクリックすると、カウントが０になる。
- 最後にカウントアップしてから 27 時間カウントアップされないと、自動的にカウントが０になる。
    - 24 時間を制限にすると、徐々にクリックしないといけない時間が前にズレていくので、若干余裕を持たせて 27 時間にしている。
- カウントが上がるに連れて、徐々に文字が大きくなる。
- データはローカルストレージに保存する。
    - カウントと最終更新日時。
- 残り時間の表示は随時更新されており、１時間を切ると文字が赤くなる。

三日坊主を防止したい「作業」をしたら、毎日必ず `Count Up` をクリックする。
忘れたり、やらなかったらカウントアップしない→０に戻る。

日々増えていくカウントに、モチベーションが維持される。
せっかく溜まったカウントがゼロに戻る絶望感を味わわないようにするためには、毎日欠かさず「作業」をしてカウントアップしないといけない。

「作業」が具体的に何なのかは、使う人次第。

そんな感じ。

#参考
- [HTML - GitHubでWebページを公開する方法 - Qiita](http://qiita.com/Yuki_Yamashina/items/5d8208c450195b65344c)
- [HTML5のlocalStorageの使い方のまとめ: 小粋空間](http://www.koikikukan.com/archives/2014/06/09-005555.php)
pypiへの登録方法

Windowsでやっていますが、いくつか引っかかったのでメモ

# setup.pyを記述する
プロジェクト内にsetup.pyを作成して記述してください。
細かい記述内容はpython setup.pyでググレばたくさん出てくると思うのでそちらを参考に。
classfiersは[こちら](https://pypi.python.org/pypi?%3Aaction=list_classifiers)から選んで記述する必要があります。
また、setup.pyはdistutilsとsetuptoolsを使った書き方がありますが、setuptoolsを使用した書き方のほうが新しいようなので、setuptoolsで記述することをお勧めします。

# pypiへのユーザ登録
setup.pyの記述が終わったら

```
python setup.py register
```
コマンドを実行します。
pypiへ登録したことのない人は以下のようなメッセージが出ると思うので、2を選択してpypiへユーザ登録しましょう。

```
We need to know who you are, so please choose either:
1. use your existing login,
2. register as a new user,
3. have the server generate a new password for you (and email it to you), or
4. quit
```
登録が成功するとメールが飛んでくるので、そちらからリンクを踏んで登録を完了します。

# .pypircの作成
おそらくWindowsだと.pypircが作成されていないので環境変数で指定してあるHOMEディレクトリに.pypircを作成して以下を記述します。

```
[pypirc]
servers = pypi
[server-login]
username: <登録したユーザ名>
password: <登録したパスワード>
```

# pypiへのパッケージ登録
もう一度以下のコマンドを実行して、パッケージをpypiへ登録します。

```
python setup.py register
```

# pypiへのパッケージアップロード
以下のコマンドをたたいてパッケージをpypiへアップロードします

```
python setup.py sdist upload -r pypi
```

# 確認
しばらく時間がかかるのかわかりませんが、pypiで検索したりしても出てこない場合があります、pipであればすぐに確認が取れます。

```
pip install <パッケージ名>
```
でインストールができたら完了。
homebrewを用いてMacにOpenCVを導入

#概要
OpenCVをhomebrewを用いて環境構築した時のメモ.
初期設定〜サンプルの実行まで.

#環境
Mac mini(2012),OS X Yosemite(10.10.5)
OpenCV2

#初めに
homebrewをインストールしておきます.
`ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
xcodeを起動したことない人は


***You have not agreed to the Xcode license.
Before running the installer again please agree to the license by opening
Xcode.app or running:
    sudo xcodebuild -license***

というメッセージが出るので,xcodeを起動します.
#OpenCVとPythonのダウンロード&インストール

**Python**関連のインストール
`brew tap homebrew/science`
`brew install python`
`pip install numpy`


**OpenCV**関連のインストール
`brew install cmake automake celt faac fdk-aac git lame libass libtool libvorbis libvpx libvo-aacenc opencore-amr openjpeg opus sdl schroedinger shtool speex texi2html theora wget x264 xvid yasm`

`brew install ffmpeg --with-fdk-aac --with-libvo-aacenc --with-libvorbis --with-libvpx --with-openjpeg --with-theora --with-opencore-amr`

`brew install eigen`
`brew install jasper`
`brew install tbb`
`brew install qt`
`brew install opencv --with-eigen --with-jasper --with-libtiff --with-qt --with-tbb --with-ffmpeg`

#サンプルを試す
画像を読み込み,グレー画像に変換,出力.
※同じディレクトリに *test1.jpg* を置いておく.

```python:test.py
import cv2
import numpy as np
import sys

cv2.namedWindow('edge')
img = cv2.imread('test1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thrs1 =1000
thrs2 =10
edge = cv2.Canny(gray, thrs1, thrs2, apertureSize=5)
cv2.imshow('edge', edge)

cv2.waitKey(0)
cv2.destroyAllWindows()
```

無事に実行されたはずです.

#関連・参考
<a href="http://qiita.com/daxanya1/items/4709ad8454760e17148c">OS X に OpenCV を Homebrew で入れて python で動画入出力をする</a>
<a href="http://qiita.com/kon_yu/items/f3eed19f397f2226c32c">Homebrew でOpenCVをインストールする方法</a>
#その他

余談ですが,次はUbuntuのOpenCVの環境構築に挑戦したいと思います.
6500円でつくるスマートロック 電子工作編

[6500円でつくるスマートロック メカ作成編](http://qiita.com/toshi-saito/items/ef7fd9a2154f7db92831)の続きです。

今回は電子回路を作っていきます。

##️ 回路図

![SmartLock.png](https://qiita-image-store.s3.amazonaws.com/0/63235/bd89aca1-7391-fff2-38ca-469817b8327a.png)

## 図解
![IMG_1400.jpg](https://qiita-image-store.s3.amazonaws.com/0/63235/c49454a8-1a3c-0363-3906-89f728ad71b4.jpeg)
配線がゴチャゴチャしちゃうので、付け間違いさえ気をつければ半田づけの箇所はそんなに多くないので大丈夫！
ユニバーサル基板上に適当に配置して半田づけしてください。
BLE nanoは直接付けちゃうとファームウェアの書き換えができなくなっちゃうので、
分割ロングピンソケットを基板に半田付けして着脱できるようにしてください。
サーボもせっかくメス端子が付いてるので、基板上にピンヘッダ3本を半田付けして着脱できるようにしたほうがいいです。


# 実装の一例
![IMG_1402.jpg](https://qiita-image-store.s3.amazonaws.com/0/63235/a605e31f-ab8f-4353-ae45-73ec41d3b293.jpeg)
頑張ればこのくらい小さくまとめることもできます。

![IMG_1403.jpg](https://qiita-image-store.s3.amazonaws.com/0/63235/8707c9e9-c5fa-2db3-0625-adb36a5cfd01.jpeg)
裏側の配線はごっちゃごちゃです。（小さくしすぎて配線難しすぎた）

![IMG_1405.jpg](https://qiita-image-store.s3.amazonaws.com/0/63235/34a64da9-14a9-bbbd-5588-8aa1d34aa8f9.jpeg)
BLE nanoを取り外すとこんな感じ。
スペースの有効活用で、BLE nanoの下にトランジスタアレイを配置しています。

# 動作させる
ここまでできれば、あとは、ファームウェアを書き込んで、iOSアプリを入れてペアリングさせるだけです。

## ファームウェア
https://developer.mbed.org/users/toshiyukisaito/code/SmartLock-BLE-nano/compile
から
compileボタンを押すとhexファイルがダウンロードできます。
USBにBLE nanoを挿すとストレージとして認識されるので、そのストレージにコピーしてください。

ドラッグドロップでコピーすると、うまくいかないことがあるのでその時はcpコマンドでコピーしてください。
```bash:
cp -X ~/Download/SmartLock-BLE-nano.RBLAB_BLENANO.hex /Volumes/MBED
```

## iOS app
githubで公開してます。
https://github.com/toshi-saito/smartlock-ios-client/tree/ble-nano
ble-nanoブランチを使ってください！
masterブランチだとペアリングに失敗します。
Watch Appも入ってるけどApple Watch持ってないので動作確認してないです。

## 今後やりたいこと（TODO）
- 操作ログ
- 複数端末対応
- 鍵のシェア

IRKitと赤外線通信させて、wifi経由での鍵の開け閉め＆確認ができないかなと思っています。（そもそもIRKitが赤外線を任意で受信できるのか調べてない）
オーディオのレイテンシを計測してみる


[オーディオ出力からマイク入力のループバック回路](http://qiita.com/dsedb/items/449204497cab9ed0e3e2)
の続きです。前回作ったドングルを手元の iPhone6 にぶっ刺して、レイテンシを計測してみます。
計測プログラムは Unity でこしらえました。Audio の設定で DSP Buffer Size を変更して計測すると、実験そのものの妥当性もある程度は検証できそうです。

#計測アプリ

を作りました。Unity 5.1.1.f1 を使用。
[https://github.com/dsedb/audio_latency_check](https://github.com/dsedb/audio_latency_check)

##計測中画面
![IMG_1448.png](https://qiita-image-store.s3.amazonaws.com/0/90046/0c1c04ba-4be7-a383-951e-f4f46dab5473.png "")

##計測終了画面
![IMG_1447.png](https://qiita-image-store.s3.amazonaws.com/0/90046/da2f10f4-0547-eab8-5e45-ae51dd54ebfa.png "")

#こうなりました

iPhone6 iOS8.4.1

| DSP Buffer Size | 往復時間(ミリ秒) |
|:-----------:|:------------:|
|Best latency|140.2041|
|Good latency|200.9916|
|Best performance|329.0549|

それっぽい値が。計測できてそう。

#感想

140 msec ってどんなもんでしょうね。ここからマイク入力のレイテンシを引くので、もうすこし小さいわけではありますが。
鋭い人は気になってしまうかも。楽器アプリとか、どのぐらい成立するんだろうな。300 msec ともなると、かなり苦しそう。

まあ、タッチデバイスの時点で、わりとどうでもよくなっているのかもしれませんが。
別ストリームの現在値を使いたい

Rxで何でもかんでも`IObservable<T>`で書こうとすると
「`trigger`ストリームの発行タイミングで、`source`ストリームの最終値を後続に流したい」
ということがよくある。
例えば「ファイルに保存ボタンクリック」イベントストリームの発行タイミングで、「ファイル名」ストリームの現在値を後続に流したい。など。

適当に`latestValue`なるフィールドを用意して

```
source.Subscribe(x => latestValue = x);
trigger.Subscribe(_ => FooBar(latestValue));
```
こうしてやれば実現できるが、なるべくIObservableでやりたい気分のときどうするか。

#Sample()
似たような動きをするのが`Sample()`メソッドであるが、
こいつは`source`が値を発行しない間に`trigger`を数発発行しても、最初の一発しかサンプリングしてくれない。

```
Sample()メソッド:
source   ---1-------2------3------4--
trigger  -------o----o-o--o----o-----
          source.Sample(trigger)
         -------1----2---------3-----

やりたい方:
source   ---1-------2------3------4--
trigger  -------o----o-o--o----o-----
                  ???
         -------1----2-2--2----3-----
```

#CombineLatest()
triggerの分だけ発行してくれるが、sourceの変更でも発行してしまう。

```
source   ---1-------2--------3------4--
trigger  -------o-----o-o--o-----o-----
          source.CombineLatest(trigger,(s,t)=>s)
         -------1---2-2-2--2-3---3--4--
```
これではテキストボックスに文字打っただけで保存してしまう。

#Sample().CombineLatest()
目的のストリームが得られる。

```
source   ---1-------2------3------4--
trigger  -------o----o-o--o----o-----
         source.Sample(trigger)
         -------1----2---------3-----
         .CombineLatest(trigger,(s,t)=>s)
         -------1----2-2--2----3-----
```

# CombineLatest().DistictUntilChanged()

triggerをとにかく前回と違う値を流すストリームに変換して(例えばScan()でインクリメントさせる)
sourceとCombineLatest()して、trigger変換ストリームの値をキーにしてDistictUntilChanged()する。


```
source   ---1-------2--------3------4--------
trigger  -------o------o--o-----o------o-----
trigger' -------A------B--C-----D------E-----
         .CombineLatest(trigger,(s,t)=>new {src = s, trg = t})
         -------1A--2A-2B-2C-3C-3D--4D-4E----
         .DistictUntilChanged(x => x.trg)
         -------1A-----2B-2C----3D-----4E----
         .Select(x => x.src)
         -------1------2--2-----3------4-----
```




#おわり
定番パターン集みたいなのが少ないので、いまいち自分がまわりくどいor不確実な実装をしているような気がしてならない。
Prefabを改めて再考してみる

　Unityをしばらく使ってきたが、基本中の基本であるPrefabについて、よくわかったいなかったので再考してみました。

#Prefabかどうか
HierarchyのGameObject名が青色なものはPrefabとなります.
下図でいうと下のCubeがそれになります.
![is_prefab_hierachy.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/122d2b27-c492-9d32-59bb-9c2d26fcf0e7.png)

ちょっと色がわかりにくい場合はHierarchyからGameObjectを選択して、Inspectorに下記があればPrefabとなります.
![is_prefab_inspector.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/c93801cb-acd7-5117-72d1-0da1c1a429ee.png)

#作成
　HierarchyにあるGameObjectをProjectにD&DするとPrefabが作成されます.
HierarchyにあるGameObjectはPrefabの**インスタンス**となります.
ProjectにあるものはPrefabの**本体**となります.
インスタンスは本体の複製のようなものであり、一つの本体に対し複数のインスタンスをつくることができます.
以降、インスタンスと本体と明確に切り分けて説明します.

#本体の編集
　**本体をProject**で選択して、Inspectorを編集すると全てのインスタンスが本体で編集した内容になります. 下図は同じ本体のPrefabで作られたインスタンスです
![main_edit.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/52a988e4-50b0-56e7-2b8d-879d0ecf4a6b.png)
Inspectorは下記. ここのCubeのMeshを変更してみます.
![main_edit_inspector.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/c0664279-f535-601e-19bc-c0ae407570db.png)
変わりました.
![main_edit2.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/ddbdac67-8075-bd5e-5258-83d69667de3e.png)

#インスタンスの編集による影響
今度はインスタンスを編集してみます。3つcubeの下に編集用インスタンスを用意しました.
こいつだけ**Hierarchyから編集**してみます. meshを変更します.
![instance_edit.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/d8fcbf06-ee00-8c44-b8a7-7950d94b08cb.png)
編集してみました.
![inspector_edit2.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/82f74e0a-1910-9888-ed58-d3fad355933e.png)
ここで再度、**本体をProject**で選択して、Inspectorを編集するとどうなるでしょうか？
meshをsphereにする変更です.
先ほどだと、全てのインスタンスが本体で編集した内容になりました.
![inspector_edit3.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/f81ad3fd-0e43-b43d-ad62-f199ba61b3c0.png)
なんと、インスタンスを編集したやつは反映されないのです.

#インスタンスの編集による影響2
改めて**本体をProject**で選択して、Inspectorを編集します.
今度はMaterialです.
![instace_edit_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/cc6ec3c5-932e-204b-94bd-18ae5809b910.png)
この場合は、全てのインスタンスが本体で編集した内容になりました.

インスタンスの編集で変えたもの(Component単位？)は、本体の変更を無視するようです.

#Select、Revert、Apply
HierarchyからGameObjectを選択すると、Inspectorに下記の3ボタンが表示されます.
![is_prefab_inspector.PNG](https://qiita-image-store.s3.amazonaws.com/0/17192/c93801cb-acd7-5117-72d1-0da1c1a429ee.png)
###Select
Projectに飛んで本体を選択したような状態になります.
###Revert
インスタンスで編集した内容を全てリセットして本体を同じにします.
###Apply
インスタンスで編集した内容を本体に反映させます.
【不要】Yahoo!検索結果のSSL化対策まとめ（Google / Adobe Analytics）

<strong>Adobe / Googleの機能改修により、以下の手続きは一切不要になっています（2015/10/5追記）。</strong>

ついにYahoo!の検索結果ページのHTTPS化が始まった。今後すべての検索結果ページがHTTPSになっていく。

これに伴い、自然検索流入のキーワードを取得できなくなったのはともかく、それに加えてYahoo!のHTTPSの検索結果ページからの流入がアクセス解析ツールで**「自然検索流入」ではなく「Yahoo!からのリンク流入」**扱いでカウントされるようになった。

これはまずいのでYahoo!のHTTPSの検索結果ページからの流入を**自然検索扱いにしたい**。そのためのカスタマイズまとめ。

## Adobe Analyticsの場合

[Adobe AnalyticsをYahoo!検索SSL化に対応させる方法](http://google.cms-ia.info/sitecatalyst/jp/modify-ssl-yahoo-referrer)の通り。

s_code.jsの`doPlugins(s){...}`の中に以下を追記する。

```js
if (document.referrer == 'http://search.yahoo.co.jp' || document.referrer == 'http://search.yahoo.co.jp/') {
  s.referrer = document.referrer + 'search?p=::empty::';
}
```

具体的には以下のようになる。

```s_code.js
s.usePlugins=true;
function s_doPlugins(s) {

    :
  // すでに記述されている内容
    :

  if (document.referrer == 'http://search.yahoo.co.jp' || document.referrer == 'http://search.yahoo.co.jp/') {
    s.referrer = document.referrer + 'search?p=::empty::';
  }

}
s.doPlugins=s_doPlugins;
```

（参考）
http://google.cms-ia.info/sitecatalyst/jp/modify-ssl-yahoo-referrer


## Google Analyticsの場合

「参照元 / メディア」の「search.yahoo.co.jp / referral」を「yahoo / organic」に書き換えることによって実現する。これにはビューのフィルタ（管理画面上だけ）で書き換える方法と、タグだけで書き換える方法がある。

### ビューのフィルタで書き換える場合

[Googleアナリティクスで [search.yahoo.co.jp / referral] を [yahoo / organic] として計測する方法](http://www.ayudante.jp/column/2015-08-28/13-03/)の通り。

ただし**実際に設定するのは1.と2.まで**にとどめておいたほうがいい。
3.を実装してしまうと、まだキーワードを取得できるケース（徐々に減少していくが）のキーワードも消してしまうことになる。

### トラッキングコードで書き換える場合

実はタグの書き換えだけで実装することも可能。

トラッキングコードの`ga('create', 'UA-XXXXXXX-Y', 'auto');`と`ga('send', 'pageview');`の間に以下を挿入する。

```js
if (document.referrer == 'http://search.yahoo.co.jp' || document.referrer == 'http://search.yahoo.co.jp/'){
  var s = window.location.search;
  s.indexOf('utm_source=') == -1 && ga('set', 'campaignSource', 'yahoo');
  s.indexOf('utm_medium=') == -1 && ga('set', 'campaignMedium', 'organic');
  s.indexOf('utm_term=') == -1 && ga('set', 'campaignKeyword', '(not provided)');
}
```

`document.referrer`が該当する条件のときに、*`utm_***`のパラメータがなければ書き換える。*
あればそちらの内容を優先して適用する。

具体的には以下のようになる。

```html
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-XXXXXXX-Y', 'auto');
    :
  // 既存の設定があればここに記述
    :
  if (document.referrer == 'http://search.yahoo.co.jp' || document.referrer == 'http://search.yahoo.co.jp/'){
    var s = window.location.search;
    s.indexOf('utm_source=') == -1 && ga('set', 'campaignSource', 'yahoo');
    s.indexOf('utm_medium=') == -1 && ga('set', 'campaignMedium', 'organic');
    s.indexOf('utm_term=') == -1 && ga('set', 'campaignKeyword', '(not provided)');
  }
  ga('send', 'pageview');
</script>
```
plotly > 始めました > ファイルの消し方が分からない > 分かった

グラフを描画するサービスplotly

Tricoderプロジェクトの人が小型のセンサーからデータをuploadしていたのを見たのがplotlyを知った時だった。UIが良さそうな感じだった。

色々なグラフが描画できそう。
https://plot.ly/feed/

描画したデータはJSON形式で取り出せそう。ただし、REST APIやStreaming APIというよく分からないものを使わないとUnityのC#からは読み取りできなさそう。

とりあえずグラフを作ってみた。
https://plot.ly/9/~7of9/

グラフの消し方がわかりません。
google検索してもそれらしきものが見つからなかった。

ヘルプに問い合わせしたけど、回答あるだろうか。

<hr>

15分前に問い合わせたものに対して、5分前に回答が来ていた。

以下がファイル削除の手順

1. https://plot.ly/organize/home を開く (または ログイン後に Organizeをクリック)
2. 消したいファイルの上にマウスカーソルをあわせる (ゴミ箱アイコンなどが表示される)
3. ゴミ箱アイコンをクリックして消せる


![image.png](https://qiita-image-store.s3.amazonaws.com/0/32870/aa789bfb-123d-b030-e332-730bbee4bae6.png)
iOS 9.0 の ATS 調査結果（iOS 9.0 beta5）

# iOS 9.0 の ATS

以下の記事で iOS 9.0 から導入される ATS やべぇ、と思って調査した覚書です。

* [iOS9のWebviewでNSURLErrorDomainとなる場合の対処法(ATS)](http://qiita.com/peromasamune/items/f5b72c4dbd33b5019611)

# 調査したこと

* ATS の挙動
* Apple のドキュメント
* 対策

# 結論

## ATS の挙動

私が確認した iOS 9.0 beta5 では、ATS の挙動は確認できませんでした。

上記記事は iOS 9.0 beta3 時点での記事で、本記事執筆時点では iOS 9.0 beta5 です。そして beta5 では ATS による強制的な SSL/TSL 通信は行われませんでした。

## Apple のドキュメント

ATS のドキュメントが 2015/08/24 に改定されています。

* [App Transport Security Technote: Document Revision History](https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/RevisionHistory.html#//apple_ref/doc/uid/TP40016240-CH99-SW1)

内容は以下のとおりです。

> New document that describes the exception mechanism developer can use to override the default behaviors of App Transport Security for web services connections.

要約すると：

> Web サービス接続のための ATS のデフォルト挙動を上書きするために使用できる例外メカニズムに関する新規ドキュメントを記述。

です。

ここで述べられているデフォルトの挙動を抜粋します。

> All connections using the NSURLConnection, CFURL, or NSURLSession APIs use App Transport Security default behavior in apps built for iOS 9.0 or later, and OS X 10.11 or later.

内容は以下のとおりです。

> iOS 9.0 以降と OS X 10.11 以降向けにビルドされたアプリでは、NSURLConnection、CFURL、NSURLSession を使用するすべての接続は ATS デフォルトの挙動になる。

つまり、ATS による SSL/TSL 通信は、Xcode の Deployment Target または Base SDK のいずれかを（おそらく Base SDK と思われます）iOS 9.0 にすると有効になるようです。

## 対策

Base SDK を iOS 9.0 に設定しない限り ATS は有効にはならないため、既存アプリはひとまず安心です。ただし、iOS 9.0 に対応しなければアプリのバージョンアップが行えなくなる、という制限が将来課せられる可能性は十分にあります。

Base SDK は設定を Latest iOS とすることが推奨されているため、Xcode のバージョンアップ等で気が付かないうちに iOS 9.0 になってしまう可能性があるため注意する必要があります。

また、iOS 9.0 は beta 版であるため、今後仕様が改定される可能性があることも付け加えておきます。
NSSメモ(01)

※記載内容はメモとして作成しているため、修正が必要な部分があるかもしれません。


####**NSS（Name Servie Swith）**

PCは名前解決が可能ないくつかの機能を持っている。

①DNSリゾルバキャッシュ情報

②hostsファイル記述情報

③DNSサーバへの問い合わせ

※NIS・LDAP指定可能


その優先順位を指定するファイルが　/etc/nsswith.conf　ファイルである。


**記述例**

<pre>hosts:   files    dns</pre>
最初にホストファイルを参照、　マッチしなければ　DNSに問い合わせを行う。
unity > android > Bundle Identifier has not been set up correctly > 数値や_で始めたらだめ

```txt:動作確認
Unity 5.1.2-f1 on MacOS X 10.8.5
```

作ったアプリをandroidで動かそうとして以下のエラーがでた。

```
Bundle Identifier has not been set up correctly
```

設定していたBundle Identifierは以下

```
com.unity3d.2dHideLineOnPanel
```

何が問題かよくわからなかったが、エラーのメッセージをよく見ると「数値や_で始めたらだめ」という表記があった。

以下のように変更したらうまくいった。 (Product Nameも"hideLine"に変更)

```
com.unity3d.hideLine
```

## 検索用キーワード　
- bundleIdentifier
laravelでscssを使ってみる

## 手順1. composerでscssをインストールしておく

```json:composer.json
"require"{
    "panique/laravel-sass": "dev-master"
}
```

## 手順2. composer updateの実行

```
composer update
```

## 手順3. index.phpでscssをcssにするコード追記

```php:public/index.php
SassCompiler::run("scss/", "css/");
```


## 手順4. scssとcssディレクトリを作る


```
$ mkdir public/css
$ mkdir public/scss
```

## 手順5. scssファイルの作成と読み込み

```scss:public/scss/style.scss
body {
         margin:0;
         font-family:'Lato', sans-serif;
         text-align:center;
         color: #999;
  }
  .welcome {
         width: 300px;
         height: 200px;
         position: absolute;
         left: 50%;
         top: 50%;
         margin-left: -150px;
         margin-top: -100px;
  }
 
   a, a:visited {
         text-decoration:none;
   }
   
   h1 {                         
         font-size: 32px;
         margin: 16px 0 0 0;
   }
```

welcome.blade.phpでstyle.cssを読み込む形に変える

```php:welcome.blade.php
<!DOCTYPE html>
<html>
  <head>
    <title>Laravel</title>
    <link href="/css/style.css" rel="stylesheet" type="text/css">
  </head>
</head>

<body>
  <div class="container">
    <div class="content">
      <div class="title">Laravel 5</div>
    </div>
  </div>
</body>
</html>
```

これで、実際にwebページにアクセスしてみます。
`scss/style.scss`が自動的にコンパイルされ、`css/style.css`が生成されていると思います。
電子回路 > OPアンプ > B級プッシュプル回路

OPアンプの本を読んでいたところ、「B級プッシュプル回路」なる用語に出くわした。

以下、調べた。

<hr>
http://www-nh.scphys.kyoto-u.ac.jp/~enyo/kougi/elec/node30.html

> B級というのは動作点をずらし 信号の片側のみ増幅するようなものです。
...
> 入力が正の方に振れると上側が、負の方に振れると 下側のトランジスタが動作領域に入ります。入力信号がないときにはどちらも OFFですので電力消費はありません。これを純コンプリメンタリB級プッシュプル 回路とよびます。

まだよく分からない。

<hr>
以下はA級からD級の違いをグラフで示していてわかりやすい。

http://www.phileweb.com/magazine/audio-course/archives/2007/11/29.html

> 効率のよい順は...
D級 => C級 => B級 => A級

...

>信号の歪みの多い順は...
D級 => C級 => B級 => A級

<hr>
以下を見ていると、「オープンドレイン」と「プッシュプル」が対比で説明されている。
オープンドレインでないマイコンのI/Oの出力はプッシュプルということだろうか。

http://q.hatena.ne.jp/1168254163
【qibiuld】C/C++プログラムをpepper用にコンパイル


## 概要

C/C++モジュールをpepper用にコンパイルできるようにするまでの手順です。

## 環境

* Mac OSX Yosemite
* C++ naoqi SDK 2.0.5.3

コンパイラが入ってない場合はXcodeのcommand line toolsをインストールしてください。

## 手順

* toolchain取ってくる
* C++ SDKをダウロード
* qibuildを設定
* toolchainを設定
* プロジェクトを作成
* ビルド

### ・toolchainを取ってくる

以下からダウンロード

https://community.aldebaran.com/en/resources/software

アルデバランアカウントが必要です。
真ん中らへんにある
**Cross Toolchain 2.0.5 Mac 64**
をダウンロードする。

qibuildが日本語のパスを認識できないのでhome下に置くといいです。

### ・C++ SDKをダウンロード

以下からダウンロード

https://community.aldebaran.com/en/resources/software

**C++ SDK 2.0.5 Mac 64**
をダウンロードする。

qibuildが日本語のパスを認識できないのでhome下に置くといいです。

## PC向け設定

### ・qibuildを設定

PC用のビルド設定です。
pepperで動作確認する場合は別手順です。

```shell-session
$ cd ~/naoqi-sdk-2.0.5.3-mac64
$ qibuild init
```

### ・toolchainの設定

```shell-session
$ qitoolchain create naoqi-sdk ~/naoqi-sdk-2.0.5.3-mac64/toolchain.xml
$ qibuild add-config naoqi-sdk --toolchain naoqi-sdk
```

### ・プロジェクト作成

```shell-session
$ qisrc create helloworld
```

### ・ビルド

```shell-session
$ qibuild configure -c naoqi-sdk helloworld
$ qibuild make -c naoqi-sdk helloworld
```

qibuild makeを実行したあと
プロジェクト内のbuild-naoqi-sdk/sdk/bin/
下にバイナリファイルが出来上がります。


## ロボット向け設定

ロボット用のビルド設定です。
pepperで動作確認する場合は別手順です。

### ・toolchainの設定

```shell-session
$ qitoolchain create cross-atom ~/mac64-atom-pub-v2.0.5.4/toolchain.xml
$ qibuild add-config cross-atom --toolchain cross-atom
```

### ・初期化

```shell-session
$ qibuild init
```

### ・プロジェクト作成

```shell-session
$ qisrc create helloworld
```

### ・ビルド

```shell-session
$ qibuild configure -c cross-atom helloworld
$ qibuild make -c cross-atom
```

qibuild makeを実行したあと
プロジェクト内のbuild-cross-atom/sdk/bin/
下にバイナリファイルが出来上がります。

出来上がったバイナリファイルをftpとかでpepperにputして

```shell-session
$ chmod 777 helloworld
$ ./helloworld
```
などとすることで動作確認ができます。
unity > show/hide line on Panelの実装

```txt:動作確認
Unity 5.1.2-f1 on MacOS X 10.8.5
```
## 前置き

http://qiita.com/7of9/items/60bffb5a0810d9aabd1f
にてPanel上にグラフを描画できるところまでできた。

そこで、気になるのが
http://qiita.com/7of9/items/95813013d0e18eb54a95
で実装した、Panelごとshow / hideする実装が有効かどうか。


##やってみた

以下のような実装を準備。

![Main_unity_-_150907-2dHideLineOnPanel_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/9b604a3e-9cba-2f27-8e85-c8d18885a9ff.jpeg)

Hide Panelsボタンを押したところ以下となった。
InputFieldとToggleは隠れているが、グラフは隠れていない。

![Main_unity_-_150907-2dHideLineOnPanel_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/53fbdcd3-3b79-f404-35c9-dfc99a977bd1.jpeg)

理由としてはlinerendererは UIのコンポーネントでないため、Maskが効かない。

結果として、Panelを隠した時にグラフが描画されたままという、ショボーンな実装が完成する。


## 修正版

graphDrawControl.csにおいて、以下のように isHide(panel)を追加して、PanelがHide状態にある場合は、drawGraphをスキップするようにした。

[v0.5 @ github](https://github.com/yasokada/unity-150907-2dHideLineOnPanel/releases/tag/v0.5)

```graphDrawControl.cs
...
	bool isHide(GameObject panel) {
		RectTransform rect = panel.GetComponent (typeof(RectTransform)) as RectTransform;
		Vector2 scale = rect.localScale;
		if (scale.x < 0.1) {
			return true;
		}
		return false;
	}

	void drawGraph(List<Vector2> my2DVec, GameObject panel) {
		if (isHide (panel)) {
			return;
		}

		lineGroup = new GameObject ("LineGroup");

		for (int idx=0; idx < my2DVec.Count - 1; idx++) {
			DrawLine (my2DVec, /* startPos=*/idx);
		}

		lineGroup.transform.parent = panel.transform; // to belong to panel
	}
...
```

### 結果

Hideボタンを押した結果。

描画を更新しているCosineの方は隠すことができた。
描画を更新しない左側のSineのグラフは隠れていない。こちらは別の考慮が必要であるが、とりあえずUpdate()時に再描画しているグラフのHideのみの対応としておく。

![Main_unity_-_150907-2dHideLineOnPanel_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/34af9a29-7202-d010-e93a-107cbf8dfe4a.jpeg)
Scrape and Get Informations of Books

某大手ネット書店のサイトをスクレイピングして、書籍名, 出版社名, 出版日, ISBN を JSON (またはCSV, YAML) 形式で得ます。

```rb
require 'open-uri' # URL を、普通のファイルのように開く
require 'nokogiri' # HTML 解析器
require 'unf'      # ユニコード正規化
require 'date'
require 'csv'
require 'json'
require 'yaml'
# require 'robotex' # robot.txt 処理

SEARCH = '夏目漱石' # 検索ワード
PAGES = 3
OUTPUT = :json
# OUTPUT = :csv
# OUTPUT = :yaml

# robots.txt を読んでクロールできるかどうか確認する
# robotex = Robotex.new
# p robotex.allowed?(URL)

USER_AGENT = # 'USER_AGNET' 偽装用
  'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) '\
  'Chrome/28.0.1500.63 Safari/537.36'

class String # ユニコード正規化の拡張
  def normalize
    UNF::Normalizer.normalize self, :nfkc
  end
end

def encode_url(url)
  URI.encode url.encode('EUCJP')
end

def books(page)
  # スクレイピング対象
  url =
    "http://search.books.rakuten.co.jp/bksearch/nm?"\
    "g=001&sitem=#{SEARCH}&o=#{page * 30}"

  # HTML 取得
  charset = nil
  html = open(encode_url(url), 'User-Agent' => USER_AGENT) do |f|
    charset = f.charset
    f.read
  end

  # HTML 解析
  doc = Nokogiri::HTML.parse(html, nil, charset)

  # 書籍の配列を得る
  res = []
  doc.css('#rightContents div.rbcomp__item-list__item__details').each do |i|
    # ISBN が無ければスキップ
    isbn = i.css('p.rbcomp__item-list__item__isbn').text.sub(/^ISBN：/, '')
    next unless isbn.ascii_only?

    title = i.css('h3 > a').text.normalize.strip # 書籍名

    # 出版社名と出版日
    subtexts = i.css('p.rbcomp__item-list__item__subtext').text.split('／')
    publish = subtexts[1].normalize.strip
    published = subtexts[0].match(/(\d+)年(\d+)月((\d+)日)?/) do |md|
      Date.new(md[1].to_i, md[2].to_i, md[4] ? md[4].to_i : 1)
    end

    price = i.css('.rbcomp__item-list__item__price').text.delete(',').to_i

    res << {
      title: title,
      price: price,
      publish: publish,
      published: published,
      isbn: isbn
    }
  end

  res
end

b = []
(0...PAGES).each do |i|
  b += books(i)
end

case OUTPUT
when :json
  # 要素番号を追加
  books_with_index = []
  b.each_with_index { |x, i| books_with_index << { id: i + 1, **x } }
  puts books_with_index.to_json

when :csv
  csv =
    CSV.new(STDOUT, headers: %w(title price publish published isbn),
            write_headers: true)

  b.each do |i|
    csv << i.values
  end

when :yaml
  # isbn をキーにしたハッシュ作成
  res = {}
  b.each do |i|
    string_key_hash = {}
    i.each { |key, value| string_key_hash[key.to_s] = value }
    res["isbn_#{i[:isbn].to_s}"] = string_key_hash
  end

  puts res.to_yaml
end
```

以下を参考にしました。
https://github.com/ZIGExN/ruby-trailning/wiki/Web%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E6%A4%9C%E7%B4%A2%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A9%E6%A7%8B%E7%AF%89%E5%85%A5%E9%96%80
rbenvをgit submoduleで入れようとした時に起こった問題と解決(pyenvも)

はじめてrbenv使ってみた。いままで使う機会がなかった。
これまでこの手のバージョン管理はnvmとかpyenvとか使ってたので、いつもどおりにぼくのdotfiles置いてるホームディレクトリにgit submoduleで入れちゃえ〜（これでmac, linux, freebsd, とにかくどの環境でもどんと来い！）

```shell-session
% cd ~
% git submodule add https://github.com/sstephenson/rbenv.git ~/.rbenv
```

```common/.shrc
~

# ruby

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

~
```

おうおう。pyenvと全く同じやなあ（いやこっちが本家）。
よし。つぎにruby-buildが必要とな。
あれ？ ~/.rbenv/plugins/ に入れるだと、、？

```shell-session
% git submodule add https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

The following path is ignored by one of your .gitignore files:
/Users/masayuki.ishikawa/.rbenv/plugins/ruby-build
Use -f if you really want to add it.
```

ですよね。そうなりますよね。

うーん、rbenvをsubmoduleで入れるのにruby-buildをcloneでそれぞれ入れるなんかやりたくない。
rbenvをforkして.gitignoreを編集するなどもってのほか。
別の場所に置いてplugins/にシンボリックリンク置くのもなあ。
いい方法ないかなあとググったけどやっぱり同じように思っているひとを見かけたり。
（**pyenvだったらこんなことない**のになあ。）

しかたなく別の場所にgit submodule addしてセットアップスクリプトでシンボリックリンクを作らせる案に。

```shell-session
mkdir -p ~/.rbenv-plugins
git submodule add https://github.com/sstephenson/ruby-build.git ~/.rbenv-plugins/ruby-build
ln -s ~/.rbenv-plugins/ruby-build ~/.rbenv/plugins/
```

lnのとこはdotfilesに入れてるsetup.shに入れちゃう。

```bin/setup.sh
~

# rbenv
if [ -d ~/.rbenv-plugins/ruby-build -a ! -d ~/.rbenv/plugins/ruby-build ]; then
    ln -s ~/.rbenv-plugins/ruby-build ~/.rbenv/plugins/ruby-build
fi

~
```

と。
。。。あれ？pyenvの記述がsetup.shにすでにある...

```bin/setup.sh
~

# pyenv
if [ -d ~/.pyenv-virtualenv -a ! -d ~/.pyenv/plugins/pyenv-virtualenv ]; then
    ln -s ~/.pyenv-virtualenv ~/.pyenv/plugins/pyenv-virtualenv
fi

~
```

なんだ！pyenvでも全く同じことしてるやんvirtualenvで！！！

rbenvさんちょっとだけdisってごめんなさい。


さて。ここに書いたらrubyistの誰かが(pythonistaの誰かが)もっといい方法を教えてくれるかもしれないというのを期待しよう〜(・ω<)
Boilerplate + gulp / typescript / sassのセットアップを行うコマンドを作ってみた


Github公開パスはこちら
https://github.com/kazu1107/npm-firepan


# npm-firepan

Boilerplate をベースにプロジェクトディレクトリを作成します。
同時に次のツールをセットアップします。
* Boilerplate ( Classic / Responsive / Bootstrap )
	http://www.initializr.com/
* Webpack
* TypeScript ( + tsd )
* Sass
* Gulp
* Bower
* .gitignore

## インストール
* node.js (v0.11以上)  
  パスが通った状態までインストール(適当な記事を参照してください)

  ** インストール確認 **
  
  ```plane
  $ npm i -g webpack typescript tsd gulp bower
  ```
  
* Webpack / Typescript / tsd / gulp / bower のインストール

  ```
  $ npm i -g webpack typescript tsd gulp bower
  ```
  
## 使い方
プロジェクトディレクトリを起きたい場所でコマンドを叩く
  
```plane
$ firepan
What's project name? : **YOUR PROJECT NAME**

Who is the author? : **AUTHOR NAME**

Do you use any type?
[c] Clasic HTML5Boilerplate
[r] Responsive
[b] Bootstrap
[n] no HTML5Boilerplate
type : ** SELECT ( c / r / b / n ) **

```

## 参考リンク
一部スクリプト引用させていただきました
http://kuroeveryday.blogspot.jp/2015/05/typescript-development.html
http://qiita.com/yokoh9/items/91aad4055f3b78e9a1e2

## 今後の予定
Coffee scriptくらいはサポートしたい。
PHP-FPM をインストールして Nginxに設定

#参考サイト
[PHP-FPMのインストールと設定](http://webkaru.net/linux/php-fpm-install/)

###PHP-FPMをremi経由でインストール

```
sudo yum --enablerepo=remi install php php-fpm -y
```

###設定ファイルを編集

```
sudo cp /etc/php-fpm.d/www.conf  /etc/php-fpm.d/www.conf.org

sudo vim /etc/php-fpm.d/www.conf

```

```www.conf

# apache から nginx に変更
user = nginx
group = nginx

```


###サービスを起動して自動起動をON

```
sudo service php-fpm start

sudo chkconfig php-fpm on
```

## nginx の設定

```
vim /etc/nginx/conf.d/default.conf

```

```default.conf
server {
    listen       80 default_server;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        #root   /usr/share/nginx/html;
        root /var/www/vhosts/default/public;
        index  index.html index.htm index.php;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
        location ~ \.php$ {
        root /var/www/vhosts/default/public;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        include fastcgi_params;
        }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
```

###nginx を再起動

```
sudo service nginx restart
```

以上
hello world!をconsole.logで出力

#hello world!をconsole.logで出力

javascriptでほとんどの人が最初に習う記述。

```js:alert
alert("hello world!");
```


知っての通り実行するとアラートがでます。

![スクリーンショット 2015-09-07 19.27.45.png](https://qiita-image-store.s3.amazonaws.com/0/33813/0fc03036-fc75-2fa0-b733-eb59cab42ff7.png)


JS記述のDEBUGに使おうとするといちいちウィンドが立ち上がり邪魔です。


##「alert」の代わりに「console.log」

JSのDEBUGで使うなら「console.log」が便利です。


```js:console.log
console.log("hello world!");
```

実行しても一見なにも変化がありません。

どこに表示されるかというと、開発ツールのコンソールに表示されます。


![スクリーンショット 2015-09-07 19.34.32.png](https://qiita-image-store.s3.amazonaws.com/0/33813/8885ce81-caa5-dd42-04e5-075b269da230.png)

一般ユーザーがコンソールを見ることはないので、記述の消し忘れがあっても気づかれません。

読み込み順の確認や、変数の中身の確認に便利です。


##例

```html:console.logのテスト
<!doctype html>
<html lang="ja">
<head>
	<meta charset="UTF-8" />
	<title>Document</title>
	<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
</head>
<body>
<script>
	console.log("hello world!");

	console.log("実行順01");

	window.onload=function(){
		console.log("実行順04");
		for (var i=0; i<9; i++) {
			console.log("i = "+i);
			if(i == 5){
				console.log("iが5です。");
			}
		}
	}

	jQuery(function($){
		console.log("実行順03");
	});

	console.log("実行順02");

</script>
</body>
</html>

```


実行結果

![スクリーンショット 2015-09-07 19.52.38.png](https://qiita-image-store.s3.amazonaws.com/0/33813/3d7be45d-6a8c-3a8b-bdeb-686bf5e1ddea.png)
capistrano2で独自のビルドスクリプトを走らせる

# やりたいこと
githubから取ってきたソースを圧縮してデプロイ先に転送する時に、javascriptをbuildした結果を一緒に送りたい。

# 前提
- 諸事情によりcapistrano2
- javascriptは`app/assets`以下ではなく、`front`フォルダ以下で管理して、ES6で書いてる
- 最終的には`app/assets`以下にbabelでビルドした結果を置いて、assets pipelineに載せたい(digestつけたい)

# 解決策
`build_script`を使おう。
http://www.rubydoc.info/gems/capistrano/2.15.0/Capistrano/Deploy/Strategy/Copy

```rb:deploy.rb
set :build_script, 'cp -r node_modulesのインストール先 node_modules && npm install && gulp build && cp -r node_modules node_modulesのインストール先'
```

`build_script`は、ソースをgzして転送する前に取得したソースのルートディレクトリ上で任意のコマンドを実行できる。githubをリポジトリとして使っているのであれば、`git clone`したものを圧縮する前に`build_script`で指定した任意のスクリプトを走らせられるイメージ。

`git clone`してきたものは`/tmp`フォルダ以下に保存され、デプロイが終わるとディレクトリごと消される。つまり、`npm install`すると0からインストールしなおすことになりいまいち。そこで、あらかじめ`/tmp`以外の場所にデプロイ時に使うモジュールをインストールするディレクトリを用意しておき、`build_script`内で都度コピーしてきている。

シンボリックリンクを使わない理由は、gulp build時のモジュールの依存解決ができずmodule not foundになるものがあったため。うまい方法がわからず、とりあえず実ファイルをコピーするようにした。

## capistrano3では？
そもそもcapistranoがnpmに対応しているので、きっとこんなことやらんでも済むのかなー。
https://github.com/capistrano/npm/
Redisをインストール

epel経由でredisをインストール

```
sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

sudo yum --enablerepo=epel -y install redis

sudo /etc/init.d/redis start

sudo chkconfig redis on
```
外部からの接続を許可しておく

```
sudo cp /etc/redis.conf /etc/redis.conf.org
sudo vim /etc/redis.conf
```

```redis.conf

-bind 127.0.0.0
+bind 0.0.0.0

```
動作確認だけして終わり

```
redis-cli

# redis 127.0.0.1:6379> exit
``

以上
別々のサーバでファイルの同期を行うために


## rsync
ファイルの同期を取るためのコマンドにrsyncというのがある。
それをRubyのコードから利用する方法を紹介します。

### ruby-rsync
[Githubリポジトリ](https://github.com/jbussdieker/ruby-rsync)

exampleは以下の通り

```ruby:rsync.rb
require "rsync"

Rsync.run("/path/to/src", "/path/to/dest") do |result|
  if result.success?
    result.changes.each do |change|
      puts "#{change.filename} (#{change.summary})"
    end
  else
    puts result.error
  end
end
```

ただしこれだと同一サーバ内での同期になってしまうので、タイトルにある通り別サーバ間でのファイル同期を行う方法が以下のとおり。

runメソッドの引数にsshユーザとドメインとファイルパスを文字列として渡してやることで別サーバ間でのファイル同期が行われる。
ただし、パスワード入力が必要な場合は手動で入力しなくてはならないため、パスワード認証ではなく[鍵認証でssh](http://qiita.com/HamaTech/items/21bb9761f326c4d4aa65)できるように設定が必要

```ruby:rsync.rb
require "rsync"
# Rsync.run("コピー元", "コピー先")
# 第1引数説明   sshユーザ名@サーバドメイン or IP:ファイルパス
Rsync.run("vagrant@192.168.33.10:/tmp/vagrant10/sync_doc", "/tmp/sync1/sync_doc") do |result|
  if result.success?
    result.changes.each do |change|
      puts "#{change.filename} (#{change.summary})"
    end
  else
    puts result.error
  end
end
```
さくらのVPSでローカル接続環境を作成

# スイッチ機能を使って契約中のサーバー同士をローカル接続できるようにする

#参考サイト
[スイッチを使ってローカルネットワークを構築してみよう ](http://knowledge.sakura.ad.jp/beginner/1272/)
[さくらVPSをWebサーバとDB用に2台借りてローカルネットワーク接続してみた](http://tanaka8.com/2014/11/sakura-vps-localnetwork-setting/)



/etc/sysconfig/network-scripts/ifcfg-eth1 を作成してipadressを設定する
```
sudo vim /etc/sysconfig/network-scripts/ifcfg-eth1
```

```
DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
TYPE="Ethernet"
NETMASK=255.255.255.0
IPADDR=192.168.0.1
```

ネットワーク構成を反映させる

```
/etc/rc.d/init.d/network restart

ifconfig

```

以上
unity > 2D / 3D プロジェクト > Screen Space - Cameraにした時に、CanvasのScaleが2Dと3Dで異なる

```txt:動作確認
Unity 5.1.2-f1 on MacOS X 10.8.5
```

## 状況

http://qiita.com/7of9/items/60bffb5a0810d9aabd1f
で作成したものを元に、さらなる処理を実装しようとしてひっかかったこと。

上記のリンクの処理は canvasRect.localScale.x (と.y)にもとづき計算をするのだが、プロジェクトを以下のいずれかで作ったかによってうまくいなかくなる。

- 2Dで作った時 (成功)
- 3Dで作った時 (失敗)

## 再現手順

### 手順 (2Dプロジェクト)
1. 新規プロジェクトをつくる (2D を選択)
2. UI > Panelを追加する (Canvasが自動生成される)
3. Canvas > Canvas > Render Moderを Screen Space - Cameraにしてから、Render Cameraに Main Camera を関連付ける (下図)
4. こうすると Canvasの Scaleが2Dプロジェクトの場合 0.02915になる。

![Main_unity_-_150907-2dproj_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/19cc6fac-0b75-15ea-d30a-1ff2199ab947.jpeg)

### 手順 (3Dプロジェクト)
手順は 2Dプロジェクトと同じで結果は以下の通り。

![Main_unity_-_150907-3dproj_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/6dead751-d758-2a33-eeb5-dea668268427.jpeg)

3Dプロジェクトの場合、CanvasのScaleが 0.33664となり、2Dプロジェクトの場合 (0.02915)のだいたい10倍くらいになっている。

以上の理由により、2Dプロジェクトで作成したグラフ描画が3Dプロジェクトで失敗する (Panel枠内におさまらない)
ある属性に紐付いたkeyからある属性に紐付いたvalueを、O(1)で参照するデータ構造



## なにこれ
`Hash`使ってると「valueからkeyを参照したい…」と思うことがあって、

```ruby:
h.find{|k,v| v == hoge }[0]
```
とか書いたらできるのですが、これは計算量O(N)であるという欠点があって、要素数が多くなってくると性能が落ちていきます。
なので要素数の増加に強く、キー→値の一方通行ではなく双方向、しかも複数の属性を行き来できるようなデータ構造があるといいなと。

## Example

```ruby:
f = HashFrame.new

# キーを登録（予め登録されていないキーを参照するとエラーになる
f.regist("fruit", "price")

# 項目の挿入
docs = [
  {"fruit" => "apple" , "price" => 200}, 
  {"fruit" => "orange", "price" => 140},
]
f.set(*docs)

# オレンジ(果物) の 値段 を参照
f.get "price", of: [ "fruit", "orange" ] # => 140

# オレンジ(果物) を含む項目を削除
f.delete "fruit", "orange"

# 既存の項目を更新: りんご(果物) について 1980円(値段) にする
f.attach ["price", 1980], to: ["fruit", "apple"]
```

## コード
属性の値を全部`Hash`のキーとしてやればO(1)できるんじゃないか、という安直な発想で作ってみました。挿入では値を2次元配列上にマッピングして、値を参照する際には、`Hash`によってその番地を特定します。

ユルい実装でなんとかするため、キーを登録制としています。
インターフェースを磨きあげれば使い物になるかも。

```ruby:
# O(1)で属性間のアクセス
class HashFrame
  def initialize(*reg_keys)
    @reg_keys = reg_keys
    @key_index = reg_keys.map.with_index{|k, i| [k,i] }.to_h
    @table  = []
    @cur_index = reg_keys.map{|k| [k,{}] }.to_h
  end

  # 項目の挿入
  def set(*documents)
    checks = [
      documents.all? {|d| (d.keys & @reg_keys).size == d.keys.size },
      @reg_keys.all? {|key| (documents.map{|d| d[key] } & values(key)).empty? },
    ]
    raise "Invalid document Error" unless checks.all?

    documents.each do |doc|
      a = @reg_keys.map{|k| doc[k] }
      cursor = ( @table << a ).size - 1
      doc.each{|k, v| @cur_index[k][v] = cursor }
    end

    true
  end

  # 項目の更新
  def attach( v = [ 'v-key', 'v-value' ], to: [ 'k-key', 'k-value' ] )
    raise 'Unregistered Key Error' unless ( @reg_keys & [ v[0], to[0] ] ).size == 2

    i = @cur_index[to[0]][to[1]]
    j = @key_index[v[0]]

    @cur_index[v[0]][v[1]] = i
    @table[i][j] = v[1]

    true
  end

  # 値の参照
  def get( target_key, of: [ 'k-key', 'k-value' ] )
    raise 'Unregistered Key Error' unless ( @reg_keys & [ target_key, of[0] ] ).size == 2

    i = @cur_index[of[0]][of[1]]
    j = @key_index[target_key]

    @table[i][j]
  end

  # 該当要素を含む項目を削除
  def delete(kkey, kval)
    raise 'Unregistered Key Error' unless @reg_keys.include?(kkey)

    i = @cur_index[kkey][kval]
    @table[i] = []

    true
  end

  # キーを登録（予め登録されていないキーを参照するとエラーになる
  def regist(*keys)
    raise 'Key Already exist Error' unless (@reg_keys & keys).empty?

    keys.each do |key|
      @reg_keys << key
      @key_index[key] = @key_index.size
      @cur_index[key] = {}
    end

    true
  end

  def table
    [ @reg_keys, *@table.reject(&:empty?) ]
  end

  def size
    @table.count{|a| !a.empty? }
  end

  def keys
    @reg_keys
  end

  def values(key)
    i = @key_index[key]
    @table.reject(&:empty?).map{|a| a[i] }
  end
end
```
GitHubのプルリクでoutdated diffへのコメントが閉じてるのを全部開く

## だいたいなんか閉じてる
![Screen Shot 2015-09-07 at 18.57.42.png](https://qiita-image-store.s3.amazonaws.com/0/27895/792b4398-3d76-5cf6-502e-149aef57f990.png)
`Show outdated diff`　とかで。

## このブックマークレットで全部開くことができる
```
javascript:Array.from(document.getElementsByClassName('outdated-comment')).forEach(l => l.classList.add('open'));
```
[memo] vim

筆者は emacs 愛好者です。SSH 先で file を編集する必要に駆られて、さらに、異文化体験をしたいという気持ちで、 vim を学んでいます。

# command 

- G　最後の行に行く。
- nG 第 n 行に行く。n >= 1. n = -3 で最後から3行目を指す、みたいな ruby の配列の index のようなことはできない。
- :e file を開く。 Emacs 的な補完がしたい。いま開いている file が未保存だと警告が出るので、そんなときは :e! を使う。
- :ls buffer list を表示。
- :bn 第 n の buffer を表示。
- df[char] 次の [char] まで削除。「次の [char]」 も消える。
- . 最後の編集 command を repeat。cursor 移動の repeat には使えない。
- y yank。 dd や dw で消した内容をはりつける。さすがに他の内容もはりつけられると思うが、いま知っているのはこれだけ。
- D cursor 位置から行末まで消す。
- :split 画面を分割する。
- C-w C-w 画面分割時、他の画面に行く。
- di[, di] [] の内側を消す。 [] 自体は消えない。cursor が [] の上に乗っていても使える。
- da[, da] [] とその内側を消す。
- :s/foo/bar/g 置換。sed command そのまま。美しい気がする。これは行内限定で働く。全ての行に働かせたいならば %s/foo/bar/g 。
- :noh 検索結果の highlight を中止する。

# VimFiler
- o : tree を開く。

# .vimrc

- noremap
  - 大文字小文字は区別しない？
  - key 割当の best practice がわからない。 Emacs で言う、 C-c から始まる key assign は user のために開放しておく、みたいな。

# したいこと
- 色分けをしたい。 -> できた。
- Dvorak 排列愛用者なので dhtn で cursor 移動したいが、ここを変えると全体の keybind の秩序が崩れるだろうから手軽にはできない。
- VimFiler で pwd を表示したい。

# その他 memo
- color scheme file は ~/.vim/colors に置く。この path が変更できるかは不明。

- http://qiita.com/zwirky/items/0209579a635b4f9c95ee NERDTree という dired のようなものがあるようだ。けれど自分は error が出て install できなかった。
- vimfiler というものもある。

- unite というものがある。

- : 打ったあと ↑↓ で履歴を辿れる。
- 検索履歴とかcommand 履歴は vim を終了してまた起動しても保存されている。どの file に格納されている？
- d で消した文字列を :s/... に貼るにはどうする？
- minibuffer, modeline という emacs 用語は vim でも使える？
- frame, window の語義は emacs と同じ？
- :q は emacs で言う kill-buffer. では、 kill-emacs は？

# 迷い
 emacs では 

- C-d を backward-char
- C-S-d を backward-word 

としている。つまり、 Shift を「働きを強める」 key として使っているのだが、この流儀を vim に持ち込んで良いものか。
格安の専用サーバ欲しくないですか！？あります！月額500円以下の専用物理サーバ！（4core,RAM2GB,SSD50GB)


#scaleway
https://www.scaleway.com/
![スクリーンショット 2015-09-07 18.30.40.png](https://qiita-image-store.s3.amazonaws.com/0/54922/7dfc6c46-5c72-a3c7-785f-2f17179ab507.png)

スペック

##C1サーバ
4 Dedicated ARM Cores

2GB Memory

50GB SSD Disk

1 Reserved public IPv4

200Mbit/s Unmetered bandwidth

##値段
 €2.99 /month

##オプション
€1 /month  per additional 50GB of SSD


##利用可能OS

Ubuntu/openSUSE/Gentoo/Fedora/Debian/Arch/Alpine

##そのうち利用可能になるかも

CoreOS
CentOS
FreeBSD
Android


#感想
ARMプロセッサがどれぐらい捌けるのかはわから無いが格安サーバを探しているならこれで決定！
jsメモ   配列の追加・取り出しに関する4つのメソッド（unshift, shift, pop, push）

```js:filename
var a = [1, 2, 3];                                                                                                                                                                                          
var b = a.unshift(0);
console.log(a); //[0, 1, 2, 3]
console.log(b); //4（結果配列の要素数）

var a = [1, 2, 3];
var b = a.shift();
console.log(a); //[2, 3]
console.log(b); //1

var a = [1, 2, 3];
var b = a.pop();
console.log(a); //[1, 2]
console.log(b); //3

var a = [1, 2, 3];
var b = a.push(4);
console.log(a); //[1, 2, 3, 4]
console.log(b); //4（結果配列の要素数）

```
Fluentd on Windows with Ruby 2.2


## Introduction

You may know, fluentd works on Windows (but not production ready). This article explain how to run (for testing).

## RubyInstaller

Download Ruby and DevKit from [RubyInstallre Downloads](http://rubyinstaller.org/downloads/).

* Ruby 2.2.x (x64)
  * Check "Add Ruby executables to your PATH"
* DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe
  * run `ruby dk.rb init`
  * edit config.yml
  * run `ruby dk.rb install`

## Git

Get git installer from [Download for Windows](http://www.git-scm.com/) and run it.
During install, specify "Run Git from the Windows Command Prompt" on "Adjusting your PATH environment" screen.

## Fluentd v12 for Windows

gem is not prepared yet. Therefore you need to make a gem and install as following.

```dos
git clone https://github.com/fluent/fluentd.git
cd fluentd
gem install bundler
bundle
bundle exec rake build
gem install pkg\fluentd-0.12.25.gem
```

Note: If the last command failed, browse to 'fluentd\pkg' to determine the current build number. For instance, the correct command could look like the following.
```
gem install pkg\fluentd-0.14.0.gem
```

Now you successfully installed.

## Run!

Prepate configuration and run it.

```dos
fluentd -c ./example/in_forward.conf
```

## Conclusion

Fluentd works on Windows but still needs more testers. If you find any bugs on testing, please report it on [GitHub](https://github.com/fluent/fluentd)!
OpenStack Novaのpolicy.jsonで設定可能な項目

https://github.com/openstack/nova/commit/9c917816048482e3a42aa06e2aa4933a1a6f7f8c

実はこんなにあるんじゃん(´Д｀)
書いておいてよ(´Д｀)
ソース読みたくないよ(´Д｀)

```json:policy.json
"compute:get_instance_metadata": "is_admin:True",
"compute:update_instance_metadata": "is_admin:True",
"compute:delete_instance_metadata": "is_admin:True",
```

のようにすると、Admin APIを使えるユーザーだけがメタデータを更新できる。

```
$ nova meta instance1 set key1=value1
ERROR (Forbidden): Policy doesn't allow compute:update_instance_metadata to be performed. (HTTP 403) (Request-ID: req-050efc1b-539b-4df8-ba68-5616342d7044)
```

Policyのドキュメント誰か増やして欲しいなーﾁﾗｯﾁﾗｯ
MognoDBの最新版(執筆時点では3.0.6)をインストール

# 参考サイト
[mongoDB本家](http://docs.mongodb.org/master/tutorial/install-mongodb-on-red-hat/?_ga=1.215538903.1739739801.1440140716)

/etc/yum.repos.d/mongodb-org-3.0.repo を作成する

```

sudo vim /etc/yum.repos.d/mongodb-org-3.0.repo

```

```mongodb-org-3.0.repo
[mongodb-org-3.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.0/x86_64/
gpgcheck=0
enabled=1

```

yum でインストール

```
sudo yum install -y mongodb-org
```

起動して確認

```
sudo service mongod start
sudo chkconfig mongod on
mongo -version

```

以上

###追記
##古いサーバーにmongodb2.6.0 がインストールされていたので3.0.6にアップグレードしてみた時のお話

今回はとりあえず、使っていなかったのでデータのバックアップとかリストラとかは除外します

とりあえず、mongodbを止める

```
sudo service mongod stop
```


yumでインストールされているmongodb関連のパッケージを調べる

```
yum list installed | grep mongo
```

なんかいろいろいろ出てきたけど全部消します

```
sudo yum erase mongo-10gen mongo-10gen-server mongo-10gen-shell mongo-10gen-tools
```

上記の手順で3.0.6をインストール&起動

しかし、起動自体はできたのですが、shellに入れない。。。

```
W NETWORK  Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused....
```

repair コマンド使ってみる

```
sudo mongod --repair
```

またエラーが…

```
# sudo mongod --repair
2015-09-11T14:04:08.566+0900 I STORAGE  [initandlisten] exception in initAndListen: 29 Data directory /data/db not found., terminating
2015-09-11T14:04:08.567+0900 I CONTROL  [initandlisten] dbexit:  rc: 100
```

うーん どうやら `/data/db` がないのがいけないらしいので作ってみる

```
sudo mkdir -p /data/db
sudo mongod --repair
```

できた！！

shellにも接続できるようになりました。
範囲選択した文字列を修飾する

マウスで範囲選択した箇所の文字サイズを変えたり、背景色を変えて強調するなどを、javascriptでやる方法。

```js
//実用には、以下のスクリプトをEventListenerに登録して、何かしらのイベント時に動くようにする必要がある。
// 選択範囲の背景を青くする
function blinkBlue(){
  var sel = window.getSelection();
  if(!sel.rangeCount) return; //範囲選択されている箇所がない場合は何もせず終了

  var range = sel.getRangeAt(0);
  var newNode = document.createElement('span');
  newNode.setAttribute('style', 'background-color: blue;'); //範囲選択箇所の背景を青にする
  newNode.innerHTML = sel.toString();
  range.deleteContents();    // 範囲選択箇所を一旦削除
  range.insertNode(newNode); // 範囲選択箇所の先頭から、修飾したspanを挿入
}

//実用にはEventListenerに登録して、何かしらのイベント時に動くようにする必要がある。
//以下では、仮に何かしらのキーが押された時に動くようにした。
window.addEventListener('keydown', blinkBlue)
```

上記の例では、ブラウザ上で範囲選択した文字列を修飾しています。
適用範囲を絞りたければ

```js
var sel = window.getEelementByID('hoge').getSelection();
```

みたいにすればよさそう。

もっとバリバリ範囲修正したいなら、ContentEditable属性を使うのが簡単です。

```html
<div contenteditable="true">
contenteditable="true"で囲まれたなかの文字列をCtrl-bで太字にしたり色々できる。
javascriptでcontenteditableを操作すれば、編集ON/OFFが切り替えられる。
</div>
```

# Ref.

- MDN
  - [selection](https://developer.mozilla.org/ja/docs/Web/API/Selection) ... ユーザーが選択した 1つないし複数のrange
  - [range](https://developer.mozilla.org/ja/docs/Web/API/range) ...  documentの断片を表すオブジェクト
  - [Content Editable](https://developer.mozilla.org/ja/docs/Web/HTML/Content_Editable) ... Nodeを編集可能にする属性
- Qiita
  - [たった一行でブラウザをメモ帳に変える不思議なコード / @KENJU](http://qiita.com/KENJU/items/68bcec1181f84a4c6aa8) ... Content Editableの面白い使い方