OmniAICreator/Qiita-1.07M huggingface dataset:
Mac OS X El Capitan で Docker for Mac を使ってみる #導入編


## 環境

使用するマシンはMBPで以下のスペック

| 名称 | 仕様 |
|-----|-----|
|OS|Mac OS X El Capitan|
|メモリ| 8GB |
|プロセッサ|2.9 GHz Intel Core i7|

## Docker for Mac の入手.インストール

`Docker Mac` でググる.


![google.png](https://qiita-image-store.s3.amazonaws.com/0/9988/0b6d90f7-c12e-d59c-34b4-8a1fd4b0c17c.png "google.png")

トップヒットの`Installation on Mac OS X - Docker` に行く.

![docker_1.png](https://qiita-image-store.s3.amazonaws.com/0/9988/67f0c580-358a-2e11-e683-1008479d647f.png "docker_1.png")

このページに必要スペック等が書いてある.

* Macの2010年以降のモデルを使ってくんろ
* OSはYosemite以降で頼むわ
* メモリは4GBで頼んます
* 古い VirtualBox が入っているようだったら削除しておいてね


![docker_2.png](https://qiita-image-store.s3.amazonaws.com/0/9988/a6a5b0d5-c27b-2f82-635a-1dee29c188f5.png "docker_2.png")

エゲレスの言葉でいっぱいのページですが, このページでは

* Stable 安定版
* Beta 最新の開発版

のどっちを使うかをユーザーに選択させています.今回は `Stable channel` を使うことにしました.

![stable.png](https://qiita-image-store.s3.amazonaws.com/0/9988/acb81e82-041b-def0-77e2-eff264284e78.png "stable.png")

早速, `Get Docker for Mac [stable]` のボタンを押してダウンロードをし、落とした `.dmg`をダブルクリックで開く. 

![install_Docker.png](https://qiita-image-store.s3.amazonaws.com/0/9988/997c9a4d-f3e7-1a04-93bb-75e6def0e125.png "install_Docker.png")

開いたら、クジラのアイコンを `Applications` ディレクトリにドラッグ.

これでインストールは完了です.

## 初回起動

初回起動時は, Welcomeメッセージや「Dockerは裏側で色々やっちゃうから許可してね」的なメッセージ, 許可の為のパスワード入力が求められる.

![one.png](https://qiita-image-store.s3.amazonaws.com/0/9988/8251dcff-ebc2-c3ab-7d72-f083ee333228.png "one.png")


![two.png](https://qiita-image-store.s3.amazonaws.com/0/9988/82ac0efb-726a-e042-1c2d-738cdaa2f1ce.png "two.png")


パスワードを入力し, 正常に動くようになったらこんなん出ます.

![three.png](https://qiita-image-store.s3.amazonaws.com/0/9988/794f773d-3bde-d5c8-e7c3-24ec1a4a67be.png "three.png")


これが出たら, `Got it!` をクリックして、ターミナルで

```sh
$ docker -v
```

を入力して動作を確認しよう.

![docker_run.png](https://qiita-image-store.s3.amazonaws.com/0/9988/61f7b2c8-0c81-4000-2e72-4c883eadf30b.png "docker_run.png")

バージョンが確認できたら,導入は完了です. お疲れ様でした
UICollectionViewでSelfSizingを行う

UICollectionViewのsizeForItemAtIndexPathで高さを動的に設定（systemLayoutSizeFittingSize）していると、
セルの数が増えるにつれ動作がもっさりしてきたので、代わりになるものとしてSelfSizingを使ってみます。

今回は、セルの最大横幅あり、高さ可変で表示します。
ポイントは以下の４つです。

0. estimatedItemSize（凡そのセルサイズ）を設定し、SelfSizingを有効にします
1. 最大横幅を設定します（横幅が固定値であればAutoLayoutでWidthを設定するだけ？）
2. AutoLayoutを上下左右に設定します（どこかが抜けると正しく表示されませんでした）
3. 最大横幅に合わせて文字を折り返すようにLinesを0に設定します 

実行結果
![スクリーンショット 2016-08-20 00.52.41.png](https://qiita-image-store.s3.amazonaws.com/0/104665/00e3016d-dc81-f8f2-b747-a5e2da7e923d.png)

上記のような画面を作っていきます。

## SelfSizing有効化
estimatedItemSize（凡そのセルサイズ）を設定し、SelfSizingを有効にします。
実際のセルサイズに近い値を設定したほうがよさそうな気はしますが、とりあえずw1h1にしています。
w0h0にするとSelfSizingは有効になりません。

```swift:ViewController
import UIKit

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    @IBOutlet var collectionView: UICollectionView!
    
    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        // Self-Sizingの有効化
        if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
            flowLayout.estimatedItemSize = CGSizeMake(1, 1)
        }
    }
    
    // MARK: UICollectionViewDataSource
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
    {
        return 100
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
    {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! LabelCollectionViewCell
        cell.configureWithIndexPath(indexPath)
        return cell
    }
}
```

## 最大横幅設定
ラベルの最大横幅を設定します。

```swift:LabelCollectionViewCell
import UIKit

class LabelCollectionViewCell: UICollectionViewCell {
    
    @IBOutlet weak var label: UILabel!
    
    func configureWithIndexPath(indexPath: NSIndexPath)
    {
        // 枠組み
        layer.borderWidth = 1
        layer.borderColor = UIColor.blackColor().CGColor
        backgroundColor = UIColor(red: 0.9, green: 0.9, blue: 0.9, alpha: 1.0)
        
        // テキスト作成
        label.text = labelTextWithNum(indexPath.item + 1)
        
        // 最大横幅設定 これが無いとエラーログが延々と…
        label.preferredMaxLayoutWidth = 50 //CGRectGetWidth(label.frame)
    }
    
    private func labelTextWithNum(num: Int) -> String
    {
        var text = "1"
        if num > 1 {
            for t in 2...num {
                text = text.stringByAppendingString(" \(t)")
            }
        }
        return text
    }
}
```
## AutoLayout設定
上下左右全てにAutoLayoutを設定します。
![スクリーンショット 2016-08-20 00.46.10.png](https://qiita-image-store.s3.amazonaws.com/0/104665/bc92db79-5cbb-540d-7820-fa425f317ead.png)

## 最大横幅に合わせて折り返し表示
ラベルのLinesを0に設定します。
![スクリーンショット 2016-08-20 00.46.52.png](https://qiita-image-store.s3.amazonaws.com/0/104665/cb3234a3-84bb-8492-19bf-7e9ffd85092d.png)

##最後に
systemLayoutSizeFittingSizeでセルサイズを計算するより早いのかまだ検証してません。

##参考
http://qiita.com/yuya_presto/items/08b0656f67a59c8c2d03
http://stackoverflow.com/questions/25947146/multiple-uilabels-inside-a-self-sizing-uitableviewcell
ADX2 LEを使った曲終了時の処理の実装

音ゲーで曲が終わったときに、リザルト画面への遷移をするためのコードのメモ。

#実行環境
・Windows 10
・Unity 5.4.0f3
・音関係はADX2 LEを使用

#実装
曲が終わったというフラグを取得するために、以下のコードを使う。

```
CriAtomSource.Status status = atomSourceBGM.status;
if(status == CriAtomSource.Status.PlayEnd) { //曲が終わったかどうかを判定

/*終わった時の処理を記述*/

}
```
atomSourceBGMについては、start()内で初期化しておく必要アリ


ここでは、if文内にResultシーンへの遷移コードを記述する。

```:transResult()
private void transResult() {
        CriAtomSource.Status status = atomSourceBGM.status;
        if(status == CriAtomSource.Status.PlayEnd) {
            SceneManager.LoadScene("Result"); //Resultシーンに遷移
        }
}
```
古いバージョンのUnityだとSceneManagerが使えないかもしれない。
(Application.LoadLevelは禁止カードみたいな扱いになっちゃった)
あと、はじめに*using UnityEngine.SceneManagement;*を書いておかないとエラーが出る。

Update内で常に呼び出して利用。

```:Update()
void Update() {
        transResult();
}
```

曲が終わってすぐにリザルト画面になるのもアレなので、コルーチンを使ってちょっと遅らせる予定。
Rails 5 (api mode) セットアップメモ

## 参考
http://maetoo11.hatenablog.com/entry/2016/03/04/144216
http://morizyun.github.io/blog/rails-api-5.0.0.beta.2/

## 手順

### 準備

プロジェクトルートのディレクトリを作成

```bash
$ mkdir abc
$ cd abc
```

rubyのversionを確認。使いたいバージョンにしておく。
rbenv使ってたので、こんな感じ

```bash
# 確認
$ ruby -v
$ rbenv versions

# 設定
$ rbenv global 2.3.1
$ rbenv rehash
```

(この時点からglobalじゃなくてlocalってすればいいのかも)

### railsのインストールまで

```bash
$ bundle init
```

Gemfileに以下の行を追加. 使いたいrailsのバージョンで。
`gem 'rails', '5.0.0.1'`

で、インストール
```bash
$ bundle install --path vendor/bundle --jobs=4
```

終わったらgitにコミットしたくなったので、git initして一旦vendor/をignoreして、コミットした。

```bash
$ git init
$ vi .gitignore
# /vendor を追加
$ git add .
$ git commit -m 'Initial commit (installing rails)'
```

### rails new
apiモードでnewした。 DBはmysqlで

```bash
bundle exec rails new . --api -d mysql
```
.gitignoreさっき作っちゃったからconflictとかでたけど、全部上書き。
あとで/vendorは足し直した。

APIモードで入っているのを確認して、commit

```bash
$ git add .
$ git commit -m 'Rails new --api'
```

さっきrbenvをlocalにしてなかったので、ここでやった。

```bash
$ rbenv local 2.3.1
# .ruby-version が作成される
$ git add .
$ git commit -m 'Add ruby-version'
```
初めてのバックエンド環境構築で詰まった諸々

HTMLコーダーがバックエンドを始めたばかりの日に詰まった時の記録.
言語は関係ないレベルで詰まったところが多いです.

#隠しファイル（.で始まる）が見つからない
`la`コマンドで隠しファイルが表示できる
.gitとか、finderから見えないいろいろなものが表示できる

#bachrcが見当たらない

`sorce`コマンドでbachrcを読み込み直す
`sorce　〇〇`すると、〇〇という名前のファイルに書かれた文字列を人力で全部上からタイプしたのと同じことが起こる

###　そもそもbachrc：「バッシュあーるしー」とは
いちいちコマンドを叩かなくても`bach`と打つだけで全部勝手にやってくれるように、設定をするためのファイルのこと。
いろいろな命令をファイルの中に書き込み`bach`すると、bachrcファイルが読み込間れる過程でファイル中の命令も全て実行される。
（gulpに似ていると思った）

#O/Rマッパーとはなんぞや
マッパー　＝　map作るもの

フレームワークやライブラリの総称,つまり初心者がsqlを簡単に使えるようになる便利フレーズ集のこと
デメリットはsql文を自分で書けなくなることらしい
→そもそも自分はsql文が書けないので今は深く考えないようにする

#タイプが遅い
↑keyでさっき打ったコマンドを再現できる

`mysql.server start`して、いろいろあってもっかいコマンド叩きたいときは、↑叩くとターミナルが入力補完してくれる！便利！

#プログラムの中の単語の意味と働きがわからない
・string 文字列のこと

・Interceptors 問題エラーの時に通るファイルのこと

・strconv 文字列を数字型にすること（逆もある） convはコンバート。
【cordova】android（crosswalk）で動作を軽くするcss設定

cssやjQueryでアニメーションさせる場合や、要素を動的に追加する場合などでは、その要素が大きいと動作が重くなります。
例えば、$("#id").append("xxx") などで動的に要素を追加する場面や、それをスクロールして表示する場面などです。
iosでは問題になりませんでしたが、（私のテスト環境の）androidではスクロールも重いし、途中で要素がホワイトアウトしてしまいました。ちなみに背景色・文字色によっても重さが違いました。

色々と試してみた結果、androidのみ対象要素に以下の設定を追加すると改善されました。
<pre><code>transform:translateZ(0);
</code></pre>

ただしiosだと動作が重くなってしまうので、場合わけが必要です。
プラットフォームがandroidかiosかの判別は、Cordova Device Plugin を使用します。プラグインを有効にすると、プラットフォームに応じて以下の変数に "Android" , "iOS" などが格納されます。

<pre><code>window.device.platform</code></pre>
※詳細は公式ドキュメント参照
http://cordova.apache.org/docs/en/6.x/reference/cordova-plugin-device/index.html#page-toc-source

よって、要素を動的に追加する際には以下のように、

<pre><code>
if ( window.device.platform.match(/Android/) ) {
   $(".your_class").css({
      "transform": "translateZ(0)",
      "-webkit-transform": "translateZ(0)",
    });
}

</code></pre>
などのようにして、androidのときのみcssを追加するようにします。

（※プラットフォームごとに動作を変えるケースが多い場合は、プラットフォームの判別部分は別途関数にしておいたほうがわかりやすいと思います。）

（※私の場合はこれで何とか解決しましたが、全ての端末での動作チェックをしたわけではありません。もしかしたら有効ではない場面も考えられますので注意してください）
【改造】DJI Phantom 3 Standard の脆弱性でWiFiダウンリンクの電波出力を上げる

ftpから設定を書き換えて無線出力を上げるハックがMITの論文で示されている。
2016/08/20時点での最新のファームウェアだけ確認。
また、2017年はじめごろリリースのファームウェア All-in-One firmware Version: v1.8.10 にアップデートしても、以下の説明で設置するバックドアのtelnetd はそのまま生きていた。

また、ミスるとWiFiが起き上がらなくなってbrick（文鎮化）する。
なお実験にあたっては、電波の漏洩しない電波暗室か、上げた出力が法令規制値内に収まる国でやること。
とはいえ、日本の電波法では無線LANは1Wの出力まで許可されている。27dBm は 500mW なのでセーフ。

論文は [Security Analysis of DJI Phantom 3 Standard](https://courses.csail.mit.edu/6.857/2016/files/9.pdf)

* https://www.youtube.com/watch?v=Ys-svvng5TU
* http://www.phantompilots.com/threads/phantom-3-standard-range-mod-lets-do-it-together.80721/page-15#post-840050
    * telnetで起動することを確認できるので安全性が高い

# 手順
FTPアクセス → telnetd を起動するようにする（ある種のバックドア） → telnet でWiFi設定を変更

## telnet起動まで
とりあえず、いじるためにドローンとコントローラでtelnetを起動させる。

* PCでドローンのコントローラーに接続。
* 192.168.1.1 (コントローラ) や 192.168.1.2 (ドローン) にFTPアクセスする
    * `root` / `Big~9China`
* 192.168.1.1 (コントローラ) や 192.168.1.2 (ドローン) でそれぞれ同じファイルを書き換え
    * `telnetd -l /bin/ash &` を `/sbin/djiled.sh` の2行目に追記する
* とりあえず `iw list` をしてみてWiFi出力が 20dBm （だったかな？）であることを確認

## 起動スクリプト書き換え
telnetが起動したら、いよいよ起動スクリプトを書き換える。
ここから`rcS`をいじるので文鎮化の危険あり。

```
sed -i 's/GB/OK/g' /etc/init.d/rcS
echo "iw reg set US" >>/etc/init.d/rcS
echo "iw dev wlan0 set txpower limit 2700" >>/etc/init.d/rcS
```

これでアメリカ合衆国用のWiFi出力となる。

最後に再起動したあと、telnetで `iw list` をしてみて 27dBm となっていたら成功。
また、`iw reg get` で以下のように country US になっていれば成功。

```
/ # iw reg get
country US: DFS-FCC
        (2402 - 2472 @ 40), (N/A, 30), (N/A)
        (5170 - 5250 @ 80), (N/A, 17), (N/A)
        (5250 - 5330 @ 80), (N/A, 23), (0 ms), DFS
        (5735 - 5835 @ 80), (N/A, 30), (N/A)
        (57240 - 63720 @ 2160), (N/A, 40), (N/A)
```

なにか抜けてるかもしれないので実験にあたっては原文やフォーラムを熟読のこと。


# P3Std 無線系について
* 上位のP3Adv, P3Proとは無線周りがかなり違う
    * 上位機種は2.4GHzではあるがLightbridgeでWiFiではない
    * これら機種ではコントローラの2本のアンテナを使って送受信
* コントロール周波数は日本仕様だけ 920MHz 、海外は5.8GHzとか
    * P3Sdのコントローラから生えてる1本のアンテナはコントロール用のこれ
    * アンテナの形状も違う
* ライブ映像や、ドローンの各種情報ダウンリンクはWiFi 2.4GHz
    * アンテナは平面アンテナがコントローラ内部に内蔵（ジンバルのノブがあったりするコントローラーの両肩の位置に計2つ）
    * 本実験ではこの部分をmodify
* ドローン本体、コントローラ（プロポ）共に 20MHz 幅の 2.4GHz WiFi
    * チャンネルは2だったが環境によって違うかもしれない
    * コントローラ側では、SSIDを発信するものとドローンと通信する部分が同じWiFiモジュールで動作している模様
jadeとsassで寿司を光らせる

## 集中線的な効果をコードで書けないかという試み
よくある集中線のエフェクトを画像を使わないで
HTMLで作れればいいな〜と思って試してみました。

## できた？
<img width="891" alt="スクリーンショット 2016-08-20 0.35.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/7193/e19dd6d4-1641-3455-d2d7-9b2852f7ac3d.png">
実装はCodepen参照
<p data-height="265" data-theme-id="0" data-slug-hash="pbexqd" data-default-tab="css,result" data-user="ampersand_xyz" data-embed-version="2" class="codepen">See the Pen <a href="http://codepen.io/ampersand_xyz/pen/pbexqd/">shining_sushi</a> by ampersand_xyz (<a href="http://codepen.io/ampersand_xyz">@ampersand_xyz</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script async src="//assets.codepen.io/assets/embed/ei.js"></script>

## 課題
太い線がイケてない結果になるので集中線の中心を消失点にして傾けたい。transform3dとか使ってうまく出来ないかな

## 結論
集中線のエフェクト、それっぽいものが出来なくはないけど素直に画像使ったほうが見栄えも工夫できるし動作も軽量だと思う
Bash on Ubuntu on Windows: デフォルトユーザを設定する

# やりかた

PowerShellなりcmdなりを起動して，`lxrun /setdefaultuser`を叩く．

```
lxrun /setdefaultuser <username>
```

新規ユーザーの場合，パスワード聞かれるので適当に入力する．
これでbash.exeを起動すると指定したユーザーで立ち上がる．

デフォルトユーザーにrootも設定できるぜ :hatching_chick: 

# おまけ☆lxrunのオプション
- /install
    - lxssをインスコする
- /uninstall
    - lxssをアンインストールする
    - 既存設定も全部ふっ飛ばしたいときは，さらに`/full`を追加するとよい．
- /setdefaultuser
- /update
    - `sudo apt-get update`と同じっぽい
認証を設定していないMongoDBに対してRockMongoで接続する



expressjsとMongoDBで開発していたところ、
PhpMoAdminがどうにも使いづらいので、
RockMongoというGUIツールをインストールしてみた。

しかし
![Kobito.DlMuxI.png](https://qiita-image-store.s3.amazonaws.com/0/50872/da09c9b3-5430-7949-274c-148307cbf7e2.png "Kobito.DlMuxI.png")

…？

そういえば、MongoDBにアカウントを設定した覚えがない。
適当に空文字を入れてもログインできなかったので、調べてみたら以下の設定値を変更する必要があるとのこと。


```rockmongo/config.php変更前
$MONGO["servers"][$i]["control_auth"] = true;
```

```rockmongo/config.php変更後
$MONGO["servers"][$i]["control_auth"] = false;
```

無事ログインできました。


![Kobito.u6U141.png](https://qiita-image-store.s3.amazonaws.com/0/50872/83f1f878-cde4-772a-71c3-f2f003ad3e98.png "Kobito.u6U141.png")

わぁ，つかいやすそう。

しばらくはこちらをつかいます。
C#のScrapySharpでスクレイピングする

# 概要
C#のスクレイピング用のライブラリ[ScrapySharp](https://www.nuget.org/packages/ScrapySharp/)の使い方を書いてる記事があまりなかったので、まとめておきます。
ScrapySharpは[HtmlAgilityPack](https://www.nuget.org/packages/HtmlAgilityPack)と組み合わせて使う形になります。


# 準備（ライブラリを読み込む）
まず、ScrapySharpとHtmlAgilityPackライブラリをプロジェクトに追加します。いつもの如くproject.jsonに次のように書いておき、NuGetからライブラリをプロジェクトに追加します。

```json

{
  "frameworks": {
    "net46": {
      "dependencies": {
        "HtmlAgilityPack": "1.4.9.4",
        "ScrapySharp": "2.6.2",
        "FSharp.Core": "4.0.0.1"
      }
    }
  }
}
```

# スクレイピングするコード例

ScrapySharpでは、`ScrapingBrowser`でスクレイピング対象のページを取得し、取得結果に対してCSSセレクタやXPathを適用してスクレイピング対象のデータを取り込む、という手順になります。

例えば、http://example.com/page.html で次のようなHTMLが得られるとします。

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>title</title>
</head>
<body>
  <ul>
    <li>hoge 1</li>
    <li>fuga 2</li>
    <li>piyo 3</li>
  </ul>

  <table>
    <tr>
      <td>weather</td>
      <td>sunny</td>
    </tr>
    <tr>
      <td>my location is</td>
      <td>Tokyo</td>
    </tr>
  </table>
</body>
</html>
```

そのようなページに対してスクレイピングをするコードの例は次の通りです。

```csharp
using System;
using HtmlAgilityPack;
using ScrapySharp.Extensions;
using ScrapySharp.Network;
using System.Linq;
using System.Text.RegularExpressions;

namespace ScrapySharpTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var browser = new ScrapingBrowser();
            browser.AllowAutoRedirect = true;
            browser.AllowMetaRedirect = true;

            //まずはスクレイピング対象のページを取得してくる。
            var pageResult = browser.NavigateToPage(new Uri("http://example.com/page.html"));

            //ページに対してCSSセレクタを適用し、該当するDOMノードの最初のものを取り出す。
            // → 「hoge 1」が返る
            pageResult.Html.CssSelect("ul li").First().InnerText;

            //ページに対してCSSセレクタを適用してDOMノード群を取り出し、ノード群の中からinnerTextに「fuga」が入っている最初のノードをLINQで絞り込む
            // → 「fuga 2」が返る
            pageResult.Html.CssSelect("ul li").First(elem => elem.InnerText.Contains("fuga")).InnerText;

            // <td>タグ内に「location」という文字が入っているノードの隣のノードをXPathで絞り込む
            // → 「Tokyo」が返る
            pageResult.Html.SelectNodes("//td[contains(text(),'location')]/following-sibling::td").First().InnerText;
        }
    }
}
```


# 備考

[上のコードのGistはこちら](https://gist.github.com/katz/b9725cf1debdc33793eeb8a53edcc305)
【今更】Zabbixのicmpping監視について

<p>Zabbixのicmppingですが、実際はfpingを実行して値を取得してます。</p>

<p>なので、icmpping監視を設定している場合、下記のようにpsコマンドを実行するとタイミングが合えばfpingのプロセス情報が取得できます。</p>


```
]# ps -ef|grep fping
zabbix   20186  1494  0 16:52 ?        00:00:00 sh -c /usr/sbin/fping -C3 2>&1 </tmp/zabbix_server_1494.pinger;/usr/sbin/fping6 -C3 2>&1 </tmp/zabbix_server_1494.pinger;
zabbix   20187 20186  0 16:52 ?        00:00:00 /usr/sbin/fping -C3
root     20189 20149  0 16:52 pts/0    00:00:00 grep fping
```

<p>因みにfping実行の際、複数ホストにpingを行う機能があり、Zabbixも利用しています。ホストのリストは「/tmp/zabbix_server_PID.pinger」というファイルが監視タイミングで作成されます。</p>

```
]# cat /tmp/zabbix_server_1494.pinger
192.168.xxx.101
192.168.xxx.102
127.0.0.1
```

<p>上記はicmppingの第１引数の\<target>以外の引数が同じicmppingを3つ登録した場合になります。</p>

<p>で、実際にfpingを実行すると、以下の様な情報が取得されます。</p>

```
]# /usr/sbin/fping -C3 2>&1 </tmp/test.tmp 
127.0.0.1       : [0], 96 bytes, 0.03 ms (0.03 avg, 0% loss)
192.168.xxx.101 : [0], 96 bytes, 0.02 ms (0.02 avg, 0% loss)
127.0.0.1       : [1], 96 bytes, 0.06 ms (0.04 avg, 0% loss)
192.168.xxx.101 : [1], 96 bytes, 0.02 ms (0.02 avg, 0% loss)
ICMP Host Unreachable from 192.168.xxx.xxx for ICMP Echo sent to 192.168.xxx.102
ICMP Host Unreachable from 192.168.xxx.xxx for ICMP Echo sent to 192.168.xxx.102
127.0.0.1       : [2], 96 bytes, 0.02 ms (0.03 avg, 0% loss)
192.168.xxx.101 : [2], 96 bytes, 0.02 ms (0.02 avg, 0% loss)

192.168.xxx.102 : - - -
127.0.0.1       : 0.03 0.06 0.02
192.168.xxx.101 : 0.02 0.02 0.02
```

<p>※：192.168.xxx.102は存在しないIPアドレスです。</p>

<p>上記結果で下記のフォーマとに一致し、回数が0から-C オプションに指定した回数までが一つでも存在する場合レスポンスがあったと判断します。</p>


```
               回数
IPアドレス  :  [n] …
```

<br>
icmpping監視には下記の３つがあります。

```
icmpping[<target>,<packets>,<interval>,<size>,<timeout>]
icmppingloss[<target>,<packets>,<interval>,<size>,<timeout>]
icmppingsec[<target>,<packets>,<interval>,<size>,<timeout>,<mode>]
```

<p>icmppingsec監視のみ第６引数があり、min、max、avg（デフォルト）のいずれか1つを指定します。</p>

<p>第２引数～第５引数のfpingオプションの対応は以下になります。
また、第２引数以外はZabbixのデフォルトとfpingのデフォルトは同一になります。
</p>

```
icmpping[<target>,<packets>,<interval>,<size>,<timeout>]
```

第２引数 \<packets>
　Zabbixのデフォルト:3回
　fpingのオプション -C

第３引数 \<interval>
　Zabbixのデフォルト:1000ミリ秒
　fpingのオプション -p

第４引数 \<size>
　Zabbixのデフォルト:68バイト
　fpingのオプション -b

第５引数 \<timeout>
　Zabbixのデフォルト:500ミリ秒
　fpingのオプション -t

<br>

```
icmpping[<target>,<packets>,<interval>,<size>,<timeout>]
```

icmpping監視は「IPアドレス : [n]」が
　1回でもあれば1
　1回も無ければ0
を返却します。

<br>

```
icmppingloss[<target>,<packets>,<interval>,<size>,<timeout>]
```

icmppingloss監視は「IPアドレス : [n]」の回数をカウントし、
　(-Cオプションの設定値 - 回数) / -Cオプションの設定値 * 100
を返却します。

<br>

```
icmppingsec[<target>,<packets>,<interval>,<size>,<timeout>,<mode>]
```

icmppingsec監視は「IPアドレス : [n]」の有効な応答時間からmin(最小)、max(最大)、avg（平均）を算出し、
　\<mode>に指定したmin max avgに対応する値を
を返却します。
但し、有効な応答時間が1回もなかった場合は0が返却されます。
[CodeIQ]「今週のお題：番号の対応表で作るグループ」をRuby（+11言語）で解いてみた

増井技術士事務所さんがCodeIQで出題されていた「[今週のお題：番号の対応表で作るグループ](https://codeiq.jp/q/2928)」をRubyで解いてみました。

問題の内容および解法は[@angel_p_57](https://twitter.com/angel_p_57)さんの[素敵な記事](http://ange1.hateblo.jp/entry/2016/08/16/202042)を参照していただくとして、参加人数が$m$人のときのグループ数の期待値は第$m$調和数（調和級数の第$m$部分和）になることが分かれば、あとは指定された期待値を超える$m$を見つかればよいのでした。

よって、解答のコードは以下のようになります。

```codeiq.2928.rb
i=s=0;n=gets.to_i;until s>n;i+=1;s+=1.0/i;end;p i
```

また、第$m$調和数は$\log m+\gamma \ (\gamma:Euler-Mascheroni \ constant)$で近似できることが[知られているので](http://mathworld.wolfram.com/Euler-MascheroniConstant.html)、期待値$n$をこれが超えるような最小の$m$は、

``` math
m= \lfloor\exp(n-\gamma)\rfloor+1
```
とすることで、$O(1)$で答えを見つけることができます。

今回は用意されていた期待値のテストケースがせいぜい6までだったので、以下のようにちょっとずるをして書くことができました。

``` codeiq.2928.approximation.rb
p Math.exp(gets.oct-0.577).round
```


## その他の言語での解答
$n=8$までは正常に動きます。
いろんな言語でgolfしてみようかと思ったけど、HardCodeしたほうが短く書けるという、、、

### C
``` codeiq.2928.c
float s;main(i,n){scanf("%d",&n);while(s<=n)s+=1./i++;printf("%d",i-1);}
```

``` codeiq.2928.approximation.c
main(n){scanf("%d",&n);printf("%d",lround(exp(n-.577)));}
```

### D
``` codeiq.2928.approximation.d
import std.stdio;import std.math;int n;void main(){readf("%d",&n);write(round(exp(n-.577)));}
```

### Go
``` codeiq.2928.approximation.go
package main;import(."fmt";."math");func main(){n:=.0;Scan(&n);Print(int(Exp(n-.577)+.5))}
```

### Haskell
``` codeiq.2928.approximation.hs
main=do
n<-readLn
putStr.show.round.exp$n-0.577
```

### PHP
``` codeiq.2928.approximation.php
<?=round(exp(fgets(STDIN)-.577));
```

### Perl
``` codeiq.2928.approximation.pl
print int exp(<>-.577)+.5
```

### Python
``` codeiq.2928.approximation.py
print int(2.718**(input()-.576)+.5)
```

### R
``` codeiq.2928.approximation.r
cat(round(exp(scan("stdin")-.577)))
```

### Scala
``` codeiq.2928.approximation.scala
import scala.math._;object Main extends App{println(round(exp(readInt-.577)))}
```

### Bash
``` codeiq.2928.approximation.sh
awk '{print int(exp($1-.577)+.5)}'</dev/stdin
```

### JavaScript(spidermonkey)
``` codeiq.2928.approximation.spidermonkey.js
print(Math.round(Math.exp(readline()-.577)))
```

## 参考
- [A000254](https://oeis.org/A000254)
- [A094310](https://oeis.org/A094310)
- [Harmonic Number - Wolfram MathWorld](http://mathworld.wolfram.com/HarmonicNumber.html)
- [Euler-Mascheroni Constant - Wolfram MathWorld](http://mathworld.wolfram.com/Euler-MascheroniConstant.html)
conf.d/以下の設定ファイルの正しい殺し方

OSデフォルトの設定で入れられるApacheなどでは、設定ファイルが一本になっていなくて、`conf.d`フォルダに入っているファイルを読み込んで追加設定する、という流れになっていることがよくあります。ただ、これを書き換える場合には注意が必要です。

# 設定変更してみた（とりあえず動いていた）
Apacheをインストールしてそのままの設定で使っていたところ、`/manual`でApacheのマニュアルが出てしまったり、ディレクトリリストが見られてしまったりと、何かと不要な設定が効いている状態でしたので、`conf.d/`以下で不要な`.conf`ファイルを、`mv manual.conf manual.conf.disabled`のように移動しておきました。大本になる`httpd.conf`では`Include conf.d/*.conf`のようになっているので、拡張子を変えれば設定ファイルとしては無効となります。

# トラブル発生！
そんな感じで問題なく運用していたのですが、セキュリティ上の問題が生じたので、`yum update httpd`としてアップデートをかけました。そうしてから再起動をかけてみると、なんと無効化したはずの設定が復活していたのでした。`conf.d/`の中を見てみると、名前を変えて消したはずの`manual.conf`ファイルが、バッチリ復活していました。

マニュアルが見えるくらいならサーバ自体は動きますしそこまで問題もないのですが、SSLの設定ファイルを別に用意していた場合には、`Listen 443`の行が複数になり、サーバ起動時点でエラーとなってしまいます。

# 正しい殺し方
ということで、ファイルをなくしてしまうと、次に`yum`でアップデートを掛ける際にファイルが新規作成されることとなってしまいます。必要ならバックアップを取った上で、無効化したい`*.conf`ファイルの中身を空、あるいは状況説明のコメントだけにしてしまいましょう。
【ライブラリ】カメラ


REVISION: '78'


全てのカメラのアップデート処理に言えることとして、
フレームレートは外部要因により変更される可能性があるので
正確な時間経過を測るために`THREE.Clock()`を使用するのが望ましい

```javascript:カメラのアップデートの方法
var clock = new THREE.Clock();

function render() {
    var delta = clock.getDelta();
    trackballControls.update(delta);
}
```

## TrackBallControls

[ソース](https://threejsdoc.appspot.com/doc/three.js/src.source/extras/controls/TrackballControls.js.html)

デモ：https://oreilly-japan.github.io/learning-three-js-2e-ja-support/chapter-09/04-trackball-controls-camera.html

```javascript
var trackballControls = new THREE.TrackballControls(camera);

trackballControls.rotateSpeed = 1.0;
trackballControls.zoomSpeed = 0.1;
trackballControls.panSpeed = 1.0;
trackballControls.noZoom = false;
trackballControls.noPan = false;
trackballControls.staticMoving = false;
trackballControls.dynamicDampingFactor = 0.3; // staticMoving = false のときの減衰量
trackballControls.minDistance = 100;
trackballControls.maxDistance = 400;

function render() {
    trackballControls.update(delta);
}
```


## OrbitControls

[ソース](https://gist.github.com/mrflix/8351020)

デモ：https://oreilly-japan.github.io/learning-three-js-2e-ja-support/chapter-09/08-controls-orbit.html

シーンの中心にあるオブジェクトの周りを回ったり、パンしたりするときに使う
TrackBallControlsと大差はない
※OrbitControls使用中はlookAt()が使えない

```javascript
var orbitControls = new THREE.OrbitControls(camera);
orbitControls.autoRotate = true;

orbitControls.minDistance = 30;
orbitControls.maxDistance = 300;

// 上下の振り幅
orbitControls.minPolarAngle = 0;
orbitControls.maxPolarAngle = Math.PI / 4;

// lookAt()の代わり
orbitControls.target = new THREE.Vector3(0,0,0);

function render() {
    orbitControls.update(delta);
}
```


## FlyControls

[ソース](https://threejsdoc.appspot.com/doc/three.js/src.source/extras/controls/FlyControls.js.html)

デモ：https://oreilly-japan.github.io/learning-three-js-2e-ja-support/chapter-09/05-fly-controls-camera.html

```javascript
var flyControls = new THREE.FlyControls(camera);

flyControls.movementSpeed = 15;
flyControls.domElement = document.querySelector("#WebGL-output"); // シーンが描画される要素
flyControls.rollSpeed = Math.PI / 12;
flyControls.autoForward = true;
flyControls.dragToLook = false; // ドラッグによる視点移動の禁止

function render() {
    flyControls.update(delta);
}
```


## FirstPersonControls

[ソース](https://threejsdoc.appspot.com/doc/three.js/src.source/extras/controls/FirstPersonControls.js.html)

デモ：https://oreilly-japan.github.io/learning-three-js-2e-ja-support/chapter-09/07-first-person-camera.html

基本動作：マウスで周りを見渡し、キーボードで移動する

プロパティが大量にある。動きが確認できたものを下記に記載。

```javascript
var camControls = new THREE.FirstPersonControls(camera);

camControls.lookSpeed = 0.2;
camControls.movementSpeed = 5;
camControls.noFly = true;
camControls.lookVertical = true; // false : 首を上下に振れない
camControls.autoForward = false;

camControls.activeLook = true; // false : 一方向しか見られない

 // 首を上下する角度
camControls.constrainVertical = true;
camControls.verticalMin = 1.0;
camControls.verticalMax = 2.0;

// カメラの初期方向
camControls.lon = -150;
camControls.lat = 120;

function render() {
    camControls.update(delta);
}
```
エラーが表示されずにデバッグが困難な状況に陥った

## プロローグ
なんだか様子がおかしい。
いつもと違う。というか、デバッグが辛い。
なぜだ・・・？ あれ？ エラー表示してなくない？ Chromeさん。

## 疑いの目
無実の自分のコードを疑った。（いや、エラーは何度も起きているけどね）
無実の babel を疑った。
無実の babelify を疑った。
無実の Chrome を疑った。
無実の Chrome の extension を疑った。
これは悪夢なんじゃないかと疑った。

## 感動の再会
我々スタッフが、一生懸命、一生懸命探しましたよ。
そしてね、見つかりましたよ、お母さん。

クライアントの共通テンプレートで読み込んでいたライブラリに、
この記述を見つけた時は、そのくらいの感動はあったと思う。

```js
onerror=function(){return true};
```

すかさず、自分のコード冒頭で

```js
onerror=null;
```

としたら帰ってきました、エラー表示。
いつもは見たくないと思っていたエラー表示がこんなにも可愛らしく感じるなんてね。
なんだか不思議だぜ。
コミットにうるさい私が考えていること

# はじめに
開発チームでGitとGitHubを利用してソフトウェア開発をしています。スムーズに開発をすすめることを目標としてコミットメッセージ、Issue、Pull Requestのフォーマットを決めたり、Emoji Prefix[^1]を導入したりしています。
[^1]: コミット粒度の指標、GitHub上での視認性向上のためにコミットサブジェクトの先頭に絵文字をつけること
チームや部署で意識を統一するのはとても難しいです。
そんななか、コミットタイトルも、メッセージも、プルリクも全く同じで投稿してあるのをみて😱 なんでー！😱という気持ちになって以下の文章を書きました。
これが正しいというわけでは全くありません。でも、一つの考え方のサンプルにはなるかもしれません。

# :memo:
コミットについて以下の様なコミットフォーマットを採用しています。

1行目: コミットサブジェクト[^2]
2行目: 空行
3行目以降: コミット理由を含む詳細な説明[^3]


[^2]: コミットメッセージ1行目のこと。`git log --oneline` などで表示される

[^3]: コミットメッセージ3行目以降の、コミットサブジェクトと空行で区切られたメッセージのこと。

# コミットサブジェクト
コミットサブジェクトはdiffを見る時の心構えをレビュワーに知らせるために作業内容を簡単に書きます。

`例1: :shower: Remove blank lines`

空白の行を取り除いたとあります。この場合diffは空行の削除だけのはずです。 空行はひと目で空行だとわかるのでレビューも楽です。

`例2: :art: Change variable name`

変数名を変更したとあります。この場合diffは気をつけてみなければいけません。その変数が出現している箇所すべてが新しい変数名に置き換わっているかどうか確認します。場合によっては変更前の変数名で検索をかけるかもしれません。

このようにコミットサブジェクトが適切だとレビュワーにdiffを見る前にどのようなコミットなのか予想させることができます。レビュワーは心の準備ができるのでメリハリをつけてレビューをすることができます。また、レビュー初心者に対しても注意して見るべきコミットを伝えることができます。

# コミットメッセージ
コミットメッセージにはその変更をした理由を詳しく書きます。どれだけ長くなっても良いです。その変更に関するIssueや発言があったらパーマリンクを貼り付けておきましょう。その変更をする理由を詳しく書いておきましょう。このとき、1年後にそのコミット(コミットメッセージとdiff)だけをみて、何がしたくてどのような作業をしたのかわかるようにしておくのがポイントです。こうすることで、変更意図がわからずSlackや口頭で直接本人に質問したり、退職した人が書いたコードでなんのことだかさっぱりわからなくてお手上げといった状況をなくすことができます。人はいつ死ぬかわからないし、コミットメッセージは毎回ちゃんと書いておきましょう。

# コミット粒度
ぜひ `git add .` ではなく `git add -p` を使いましょう。
インデント修正や空行の削除などプログラムの内容変更と関係ないコミットは、その他のプログラムの変更と一緒にしないでください。プログラムに影響のない箇所がハイライトされます。レビュワーがかわいそう :cry: 

emoji prefixなどの取り組みは、コミットの粒度を考えるきっかけになるはずです。

# Pull Request
複数のコミットで実装したことと実装に至った背景などを書いておきます。Pull Requestは最高です。いいPull Requestをみたら問題解決の方法と過程と答えがすべてわかります。最高。

# 失敗
コミットメッセージはコミット後でも変更できます。コミットメッセージやコミットの粒度を間違えたらたいていやり直せます。正確な情報をコミットに残しましょう。
コマンドが使えないのは知識がなくて怖いからです。やり方がわからなかったらググッてまずやってみてください。何回も失敗したらできるようになります。エラー文google翻訳したりしてちゃんと読むと答え書いてあります。周りに相談してください。ほんとうに失敗しちゃったら関係者に謝ってなんとか元に戻しましょう。

# おわりに
ぜひ一度、良いコミットメッセージや良いコミットの粒度について考えてみてください。メンバーひとりひとりが考えてみることが、GitとGitHubを使ったチーム開発をよくするきっかけになるはずです。

適切なコミット粒度のdiffとコミットメッセージは開発チームの宝です がんばりましょう
happy emojis :sparkles: :heartbeat: :skull:  :cherry_blossom: :dog: :apple: :candy:
Git のクライアントソフト メモ

# [GitHub Desktop](https://desktop.github.com/)

![setup-download.jpg](https://qiita-image-store.s3.amazonaws.com/0/28936/45f55a54-4dd1-24be-1971-5b57d8ac524a.jpeg)

* [GitHub](https://github.com/) が作ってるクライアントソフト。
* GitHub の機能との親和性がいい
    * GitHub のアカウントでログインすれば、自動で SSH を登録してくれる
    * コミットログなどで `#` と入力すれば、 Issue が保管されたりする
* ただ、Git の細かい機能は GUI 上にはなく、付属の Git Shell (CUI) を利用することになる


# [SourceTree](https://ja.atlassian.com/software/sourcetree)

![download.jpg](https://qiita-image-store.s3.amazonaws.com/0/28936/75fdc8db-c98c-ec53-2f94-cecfe2f96262.jpeg)

* [Bitbucket](https://bitbucket.org/) を運営している Atlassian が提供している Git のクライアントソフト
* Git の多くのコマンドを GUI から利用できる


# [TortoiseGit](https://tortoisegit.org/)

* Windows で Subversion を利用する場合の定番ツール [TortoiseSVN](https://tortoisesvn.net/) の Git 向けのクライアントソフト。
* TortoiseSVN をメインで使っていた人だと移行しやすい。

# [Git](https://git-scm.com/)

* 本家のクライアントソフト。
* コンソールしかない。
vagrantで共有フォルダ設定が反映されなったときの対処メモ

vagrant up したとき, Authentication failureと出ていたが, 立ち上がったので無視していたら共有フォルダが使えなかったので対処しました。

仮想環境内の公開鍵とvagrand upで生成されるホスト側の秘密鍵が合わないために生じたエラーらしいです。

以下のメモは, 適当に端折ったり, 書き換えたり, 個人の設定に依存したりしてますのでご了承を.

###### vagrant側で生成した秘密鍵を基に公開鍵を作成する。

```bash
$ cd /home/username/vagrantを使ってるフォルダ/.vagrant/machines/default/virtualbox/private_key
```
```bash
$ ssh-keygen -yf private_key > public_key
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0755 for 'private_key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "private_key": bad permissions
```

######権限が甘すぎると起こられたので変更
```bash
$ chmod 0600 private_key
```

######改めて公開鍵を生成
```bash
$ ssh-keygen -yf private_key > public_key
```

######作った鍵をscpを使って仮想環境へ送信。
```bash
$ vagrant status
Current machine states:

default                   running (virtualbox)
```

```bash
$ vagrant ssh-config
Host default
  HostName x.x.x.x
  Port yyyy
```

```bash
$ scp -P yyyy public_key vagrant@x.x.x.x:/home/vagrant/
....
public_key                                            100%  381    11.3KB/s   00:00

```

######vagrantに接続し、公開鍵を置き換える
```bash
$ vagrant ssh

[vagrant@localhost ~]$ mv public_key /home/vagrant/.ssh/authorized_keys
```

######vagrantを再起動
```bash
$ vagrant reload

==> default: Mounting shared folders...
    default: 仮想環境内の共有フォルダパス => ホスト側の共有フォルダパス
```

######ちゃんと共有フォルダが適用されました. 


###参考先:
http://tomy2002.hatenablog.com/entry/2016/04/06/005344
http://qiita.com/kobake@github/items/534297a1161fcccb06d6
http://blog.ruedap.com/2011/04/04/mac-ssh-key-copy-error
http://d.hatena.ne.jp/hidde/20090518/1242621452
SublimeText3 で Gulp を利用する際のパスの設定

[Preferences] - [Package Settings] - [Gulp] - [Settings User]

```json

{
  // Override your environment PATH
  "exec_args": { "path": "./.gradle/nodejs/node-v5.10.1-windows-x64/bin; ./node_modules/.bin" },
}
```
JSON 形式で node.js と Gulp の実行ファイルがあるディレクトリを指定すればよい。
＃相対パス指定が可能
heroku run rake db:migrateが出来なかった時の話（rails tutorial）

今回もrails tutorialで躓いた点の共有。

開発環境ではちゃんとmigrate出来たのですがherokuでできない。。。

`ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation テーブル名 does not exist`

heroku上ではテーブルがないよーとのこと。

色々ぐぐって漁ってみましたが、今回は
`heroku rake db:schema:load RAILS_ENV=production`
で解決。

その後、
`heroku rake db:migrate RAILS_ENV=production`
で一応本番環境対応指定で対応したらデプロイされ、きちんとテーブルが作成されコンソール出来るようになりました。

開発環境でも似たような状況に遭遇しましたが、migrationの順番？のようなものが必要なんですかね？

push上だと一括で行ってしまうから、今回のように個別に一つ一つ対応させないといけないとか…？

と思ってrake db:schema:load でググったらいっぱいでてきました。
でもやっぱり公式のドキュメントが一番ですね。
[Rails Document-Rake](http://railsdoc.com/rake)
説明部を読むと
`スキーマファイルでデータベースを作成する`
とあるので個別で読んでくれるようです。

エラーメッセージを頼りにひとつひとつ解決して力にしていきます。
Java で JSON を String に変換する(2)


ライブラリとして用意しました。
https://github.com/oyahiroki/json2string

Json2String を使う。

```java
package json2string;

public class Json2StringTestMain1 {

	public static void main(String[] args) {

		// Original JSON (ex. response of REST API)
		String json = "{\"msg\":\"Hello\"}";
		System.err.println("JSON: " + json);

		// Your configuration (in JavaScript)
		String configJS = "return json.msg;";
		System.err.println("CONFIG: " + configJS);

		// Hello message
		String msg = Json2String.format(json, configJS);

		// Hello
		System.err.println("OUTPUT: " + msg);
	}

}

```


JSON: {"msg":"Hello"}
CONFIG: return json.msg;
OUTPUT: Hello
Dockerfileを使ったイメージ作成 Docker入門


##Dockerfileによる自動構築のメリット

* 構築の手間を省力化
* ミスの低減
* 導入手順書になりうる


##Dockerfileの作成

####ファイル名
`Dockerfile`


####記載例

```
#Dockerイメージ名を指定
FROM centos:latest

#パッケージアップデートなどを実行させる
RUN yum update -y && yum clean all

#コンテナが外部に開放するポート番号指定
EXPOSE 80
```

####記載できるInstructions
```
FROM <image>
FROM <image>:<tag>

MAINTAINER <name>

RUN <command>
RUN /bin/bash -c 'source $HOME/.bashrc ; echo $HOME'

CMD ["executable","param1","param2"]
CMD [ "sh", "-c", "echo $HOME" ]

EXPOSE <port> [<port>...]
EXPOSE 80

ENV <key> <value>
ENV myName John Doe

COPY <src>... <dest>
COPY requirements.txt /tmp/

ADD <src>... <dest>
ADD http://example.com/big.tar.xz /usr/src/things/

ENTRYPOINT
ENTRYPOINT ["s3cmd"]

VOLUME ["/data"]

WORKDIR /tmp

```

##Dockerイメージのビルド
```
docker build -t <image_name> .

#Dockerfile指定する場合は -f <Dockerfile_path> オプション
```
####その他メモ
* キャッシュを使わない 2度めのbuildでyum等が行われない可能性を排除 --no-cache=true
* cdコマンドを使わない WORKDIR をつかう
* .dockerignore 無視したいファイル・ディレクトリを記載
* tarアーカイブへの保管 docker export web0001 > web0001.tar 停止しているコンテナを指定する

##参考
* [Best practices for writing Dockerfiles]
(https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#best-practices-for-writing-dockerfiles])
* Docker実践ガイド
BootstrapをSassでカスタマイズ


Bootstrap公式サイトの[ダウンロードページ](URL "http://getbootstrap.com/getting-started/#template")からSass用のソースをダウンロードします。
<img src="http://taiyaki-web.sakura.ne.jp/upload/img/Getting_started_·_Bootstrap_🔊_1D66EF67.png" alt="Getting_started_·_Bootstrap_🔊_1D66EF67.png"/>
ファイル構成は次のようになっています。
<img src="http://taiyaki-web.sakura.ne.jp/upload/img/bootstrap-sass-3_3_7_1D66F0A5.png" alt="bootstrap-sass-3_3_7_1D66F0A5.png"/>
`index.html`を作成してBootstrapのテンプレートを記述します。

```
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <title>Bootstrap 101 Template</title>

    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
    <h1>Hello, world!</h1>
    
    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>
```
ターミナルで次のコマンドを入力します。

```
$ cd assets/
$ compass init
```

こんなファイル構成です。

<img src="http://taiyaki-web.sakura.ne.jp/upload/img/スクリーンショット_2016_08_19_17_48_1D66FF83.png" alt="スクリーンショット_2016_08_19_17_48_1D66FF83.png"/>
`index.html`を次のように変更します。

```
<link href="css/bootstrap.min.css" rel="stylesheet">
```
を

```
<link href="assets/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css" />
```

<img src="http://taiyaki-web.sakura.ne.jp/upload/img/スクリーンショット_2016_08_19_18_25_1D670809.png" alt="スクリーンショット_2016_08_19_18_25_1D670809.png"/>

ここの`_bootstrap-variables.sass`を`stylesheets/`にコピーして、`_bootstrap-variables.scss`に変更します。

`screen.css`を編集します。

```
@import "compass/reset";
@import "_bootstrap-variables";
@import "../stylesheets/_bootstrap";
```


```
$ compass watch
```

サンプルをHTMLに貼っつけて確認します。

<img src="http://taiyaki-web.sakura.ne.jp/upload/img/Bootstrap_101_Template_1D67126A.png" alt="Bootstrap_101_Template_1D67126A.png"/>

ここからはBootstrapライフの始まりです。
jekyllでページネートを実装


jekyllでページネートを実装する際に少しつまずいたのでメモ

#ページネットの実装
[公式サイト](http://jekyllrb-ja.github.io/docs/pagination/)を参考に_config.ymlへ追加

```_config.yml
paginate: 5
```

でも下記エラー。。orz

```
Deprecation: You appear to have pagination turned on, but you haven't included the `jekyll-paginate` gem. Ensure you have `gems: [jekyll-paginate]` in your configuration file.
```

なぜ？

#jekyll-paginateのインストール
エラー文に焦らず英語を読めばそのまま書いてあった。
gemでjekyll-paginateを入れなさいと。

##jekyll-pagineteのインストール
```
$ gem install jekyll-paginate
```

##_config.ymlへの追加
```_config.yml
gems: [jekyll-paginate]
```

これでエラーなし！
img-src *としたのにChromeでblobの画像を読み込もうとしたらセキュリティーエラーになった。

以下のように指定して実行を行った所、IEやSafariでは表示されたのに、
Chromeだけセキュリティーエラーとなって画像が表示されなかった。


```html
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; connect-src *; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src *; media-src *">
```


## 原因

Chromeのバグのようで、* にblob:やdata:は含まれないみたいです。
なので、Chromeで表示する際は * にblob:やdata:を追加しないといけませんでした。

実際に修正した結果が以下です。

```html
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; connect-src *; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src * blob:; media-src *">
```
[Zaif]Pythonで簡単に仮想通貨の取引が出来るようにしてみた

#最初に
- 使う際には自己責任でお願いします。
- 問題あれば、プルリクください。

#なぜ作ったのか
- いろいろな情報が公開されていたので、試したかった。
- 通貨取引の業務を把握したかった。

#使い方
~~[githubのページ](https://github.com/Akira-Taniguchi/zaifapi)~~

~~[githubのページ(2017/04からこちらに引っ越しました)](https://github.com/techbureau/zaifapi)~~

[githubのページ(2020/08からこっちに戻しました。何かあったらこちらを修正していきます。)](https://github.com/Akira-Taniguchi/zaifapi)

1. 適当なvirtualenv環境を作成
2. pip install zaifapi
3. あとはこんな感じ

```
from zaifapi.impl import ZaifPublicApi, ZaifPrivateApi

#ビットコインと日本円の終値を取得
zaif = ZaifPublicApi()
print(zaif.last_price('btc_jpy'))

#残高などのアカウント情報を取得
zaif = ZaifTradeApi(key, secret)
print(zaif.get_info())
```

公開されているAPIはすべて呼べるようにしてあります。

#作ってみた感想
- やっぱり[requests](http://requests-docs-ja.readthedocs.io/en/latest/)は便利
- [cerberus](http://docs.python-cerberus.org/en/stable/)がいい感じだった
- 私のソースはJavaっぽい
bash,zsh,dashで256色を表示する

@k_uiさんの[記事](http://qiita.com/k_ui/items/b02b93e3af13023c0bfd)を基にした、256色をサンプル表示するスクリプトです。bash、zsh、dashで動作確認しました。

```bash
for c in $(seq 0 255); do printf "$(tput setaf ${c}) %03d" ${c} ; [ $(($c%16)) -eq 15 ] && echo;done;echo
```
bashではこんな感じ。

![bash_256.png](https://qiita-image-store.s3.amazonaws.com/0/44208/ca41f6c9-50aa-aa80-9ee7-6030345a362c.png)

ところで動作要件よく分かっていません。動かない例とか有れば教えてくださいね。
Mac OS Xで快適にREALFORCE91Uを使う

# きっかけ
MacBook AirにREALFORCE91Uをつなげて使っているのでとにかく快適にしたかった。
Windowsも捨てられずMacからリモートデスクトップを良くするのでこちらも快適に使いたかった。

# 利用したソフト
- [Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)

# private.xml 公開中
- GitHubにて設定ファイルを公開しました。誰かのお役に立てるとうれしいな。
- https://github.com/hanamiche/karabiner_realforce_setting

# 実は・・・
- GitHubがどうしても使いたかったのですよ・・・ :smile:
WebBluetoothAPIの公式ドキュメントを翻訳しました

## WebBluetoothAPIとは
このAPIは、ブラウザ上からBluetoothLE(BLE)デバイスを操作することが出来るAPIです。

これにより、従来は iOS や Android で専用のアプリを作っていたところ、
javascript だけでBLEを操作するアプリケーションの開発が可能になってきます。
このAPIは現在進行形で実装されており、つい先月にはMacからも利用出来るようになりました。
Google I/O では、Fetch API や Web MIDI とともに、次世代のweb技術として紹介もされています。
[What's next for the web? - GoogleI/O](https://events.google.com/io2016/schedule?sid=01631cfd-0bef-e511-a517-00155d5066d7#day1/01631cfd-0bef-e511-a517-00155d5066d7)

この WebBluetoothAPI を利用したライブラリの開発をしており、
半年ほどこのAPIを触ってきていますが、日本語の情報がほとんど無いので翻訳してみました。

Web Bluetooth API 日本語ドキュメント
[https://tkybpp.github.io/web-bluetooth-jp/](https://tkybpp.github.io/web-bluetooth-jp/)
(翻訳元)
[https://webbluetoothcg.github.io/web-bluetooth/](https://webbluetoothcg.github.io/web-bluetooth/)

なお、W3Cのコミュニティグループから翻訳の許可をいただいており、
公認ではありますが公式ではありません。
翻訳に間違いがあればご指摘いただけると幸いです。

## 目次

1. はじめに
 1. サンプル
2. セキュリティとプライバシーへの配慮
 1. 強力なデバイスへのアクセス
 2. 信頼されたサーバーは悪質なコードを提供できる
 3. デバイスへの攻撃
 4. Bluetooth デバイス識別子
     1. リモート Bluetooth デバイスの識別子
     2. UA の Bluetooth アドレス
3. デバイスの検索
  1. Permission API の統合
4. デバイスの表現
  1. グローバル Bluetooth デバイスプロパティ
  2. Bluetooth デバイス
     1. Advertising Events への応答
         1. BluetoothManufacturerDataMap
         2. BluetoothServiceDataMap
5. GATT インタラクション
  1. GATT 情報モデル
     1. Bluetooth cache
     2. Bluetooth 階層ナビゲーション
     3. Services, Characteristics, Descriptors 識別子
  2. BluetoothRemoteGATTServer
  3. BluetoothRemoteGATTService
  4. BluetoothRemoteGATTCharacteristic
     1. BluetoothCharacteristicProperties
  5. BluetoothRemoteGATTDescriptor
  6. イベント
     1. Bluetooth ツリー
     2. イベントタイプ
     3. 切断への応答
     4. Notifications と Indications への応答
     5. Service Changes への応答
     6. IDL イベントハンドラ
  7. エラーハンドリング
6. UUID
  1. 標準化された UUID
7. GATT ブラックリスト
8. ナビゲーションインタフェースの拡張
9. 用語と規則

Web Bluetooth API 日本語ドキュメント
[https://tkybpp.github.io/web-bluetooth-jp/](https://tkybpp.github.io/web-bluetooth-jp/)

## サンプル
APIの実装サンプルはこちらで書いてみました。
[WebBluetoothAPIを使ってブラウザからBLEデバイスを操作する](http://qiita.com/tky_bpp/items/f2db61ee8caac8eec031)
フォルダ内の画像ファイルからExif情報を取得し、テキストファイルに出力する


- Exif取得には[ExifTool by Phil Harvey](http://www.sno.phy.queensu.ca/~phil/exiftool/)を使用。  
例は35mm換算の焦点距離（と本来の焦点距離）情報が欲しかったので「FocalLength35efl」のみ指定。  
[Exif情報のTagName一覧](http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Composite.html)  

```sh
#!/bin/sh

for file in *.CR2
do
  echo $file
  exiftool -FocalLength35efl "./$file" |\
    sed -e 's/Focal Length                    : //g' |\
    sed -e 's/ mm (35 mm equivalent: /  /g' |\
    sed -e 's/ mm)//g' >> ./focallength.txt
done
```
CakePHPのログイン機能実装でハマったこと

先日、cakephpでログイン機能を実装していたときにハマりましたので共有します。

ログイン機能自体は他のサイトを見ながら実装し、ユーザー登録をしたあとにそのユーザでログインしたらできずに困っていました。


ログインのAuthにはBlowfishを使用

```php:User.php(Model)
    public function beforeSave($options = array()) {
        if (isset($this->data[$this->alias]['password'])) {
            $passwordHasher = new BlowfishPasswordHasher();
            $this->data[$this->alias]['password'] = $passwordHasher->hash(
                $this->data[$this->alias]['password'], 'blowfish'
            );
        }
        return true;
    }
```

blowfishを使って暗号化しデータベースに保存。
これだけではログインするときに暗号化したパスワードを解読できないみたいです。
そこで

```php:BaseAuthenticate.php
	public $settings = array(
		'fields' => array(
			'username' => 'username',
			'password' => 'password'
		),
		'userModel' => 'User',
		'userFields' => null,
		'scope' => array(),
		'recursive' => 0,
		'contain' => null,
                //ここがSimpleになっているので、Blowfishに変更
		//'passwordHasher' => 'Simple'
                'passwordHasher' => 'Blowfish'
	);

```

これでログインするときにパスワードをうまく解読してくれてログインできるようになるはずです！
AWS Amazon linuxにwordpressをインストール

wordpressをインストールしたので記録

#使用したバージョン

|パッケージ|バージョン|
|:--|:--|
|httpd|Apache/2.4.23 (Amazon)|
|php|5.6.24|
|mysql|5.6.32|
|wordpress|4.6|

#wordpress install
wordpressユーザーを作成してホームディレクトリにwordpressを置きます。

##必要なパッケージ

```
yum install -y httpd24 php56 mysql56-server
yum install -y php56-mcrypt php56-intl php56-mbstring php56-mysqlnd php56-opcache php56-devel
```


##ユーザー作成
rootユーザーで作成します。

```
sudo su
useradd wordpress
```

##wordpress インストール
wordpressユーザーでインストールします。

```
su wordpress
cd ~
wget https://ja.wordpress.org/wordpress-4.6-ja.zip
unzip wordpress-4.6-ja.zip
```

##権限設定
rootユーザーで権限を変えます。(apacheが読み込めるように設定しています。)

```
exit
chmod 770 /home/wordpress
chgrp apache -R /home/wordpress
find /home/wordpress -type d -exec chmod 0770 {} \;
find /home/wordpress -type f -exec chmod 0660 {} \;
```

##httpdの設定
root　ユーザーで設定をします。

```
vi /etc/httpd/conf.d/wordpress.conf
```

```text:wordpress.conf
ServerName [ドメインかIPを入力]
<VirtualHost *:80>
        Servername [ドメインかIPを入力]
　　　　 DocumentRoot /home/wordpress/wordpress

         <Directory "/home/wordpress/wordpress">
                Options FollowSymlinks
                AllowOverride All
                Require all granted
         </Directory>

        ErrorLog /var/log/httpd/wordpress-error_log
        CustomLog /var/log/httpd/wordpress-access_log common

</VirtualHost>
```

httpdの起動
`/etc/init.d/httpd start`

##mysqlの設定
root　ユーザーで設定をします。

例として
データベース：wordpress
ユーザー：wordpress
パスワード：wordpress
を作成します。

```
/etc/init.d/mysql start
mysql
create database wordpress CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON wordpress.* TO wordpress@localhost IDENTIFIED BY 'wordpress';
quit
```

##webで表示する
URLに`http://[ドメインかIP]/wp-admin/setup-config.php`と入れる
以下の画面が表示されるので、[さぁ始めましょう!]を選択
![キャャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/134267/3d1d781f-e25f-3809-9617-589c627b1a49.png)
データベース名やユーザー、パスワードが求められます
今回の例に合わせるとデータベース名、ユーザー名、パスワードすべてwordpressです。
(RDSを使用している場合はlocalhostのところにRDSのエンドポイントを入力。)

次に進むと以下の画像のように必要な情報が求められます。
![キャプ.PNG](https://qiita-image-store.s3.amazonaws.com/0/134267/d6d77932-1943-caaa-b985-a487875c8d48.png)
適当に入力しインストールして終了です。


もう使用しないwp-admin/setup-config.phpの権限をアパッチがアクセスできないように変えたほうがいいかも。
`chmod 600 /home/wordpress/wordpress/wp-admin/setup-config.php`
非表示時にfocus出来ないフェードイン・アウト要素をCSSで実装する

色々なサイトでよく見る一番上に戻るボタンのように、特定の条件を満たすとフェードインして別の条件でフェードアウトする要素をCSSで簡単に実装する。

## 背景

前述のようなコンポーネントを実装しようとすると、`opacity`をいじるだけではクリックできてしまうし、`transition`や`keyframes`には`display`が指定できないしで、いい方法が見つからず毎回苦戦していた。

いつもやってたのは`keyframes`で`height`を0から任意の数値まで`0%,1%,100%`のタイミングでアニメーションさせる方法だったが、煩雑なCSSになってしまいつらかった。

そんなときものすごくシンプルにCSSで書くことが出来る方法を学んだので残しておきます。

## 実装方法

```
.hoge {
  visibility: hidden;
  opacity: 0;
  transition: 1s visibility linear, 1s opacity linear;
}
.hoge.show {
  visibility: visible;
  opacity: 1;
}
```

ただし、`visibility:hidden`はfocus出来ないがレイアウト的には存在する要素となるため、`position:absolute`や`position:fixed`で使うことを前提として考えたほうがよさそう。

## 例：ある程度スクロールしたら一番上に戻るボタンを表示する

https://jsfiddle.net/81jndu1t/2/

## 解説

* [Visibilityプロパティのアニメーション時の振る舞い](http://qiita.com/bukurocci/items/08b972e60a3b8357fc50)
* [CSS3 transitions using visibility and delay](http://www.greywyvern.com/?post=337)

調べてみたらいくつか見つかった。どうやら`visibility`プロパティは`transition`でアニメーションさせようとすると、0sの時点では`hidden`で、それ以降の変化中の値は全て`visible`とみなすようだ。

## まとめ

* フェードイン・アウトは`visibility`と`opacity`の組み合わせで実装できる
* `visibility`は`transition`で利用できる
* `visibility:hidden`はレイアウト的に存在しているので`position:absolute`や`position:fixed`で使う
Unityでピンチイン・ピンチアウトを実装する

Unityでピンチイン・ピンチアウトの機能を実現するために作成しました。
今回は地図（GUITextureで作成したmapというオブジェクト）が拡大、縮小しているようにしていますが、実際はカメラの視角値を変えている方法をとっています。

#スクリプト
```csharp:C#
using UnityEngine;
using System.Collections;

public class PinchInOut : MonoBehaviour {
	
	//public Camera camera;
	public GUITexture map;
	
	//カメラ視覚の範囲
	float viewMin = 20.0f;
	float viewMax = 60.0f;

	float vMin = 1.0f;
	float vMax = 5.0f;
	
	//直前の2点間の距離.
	private float backDist = 0.0f;
	//初期値
	float view = 60.0f;
	float v = 1.0f;
	
	// Update is called once per frame
	void Update () {
		// マルチタッチかどうか確認
		if (Input.touchCount >= 2)
		{
			// タッチしている２点を取得
			Touch t1 = Input.GetTouch (0);
			Touch t2 = Input.GetTouch (1);
			
			//2点タッチ開始時の距離を記憶
			if (t2.phase == TouchPhase.Began)
			{
				backDist = Vector2.Distance (t1.position, t2.position);
			}
			else if (t1.phase == TouchPhase.Moved && t2.phase == TouchPhase.Moved)
			{
				// タッチ位置の移動後、長さを再測し、前回の距離からの相対値を取る。
				float newDist = Vector2.Distance (t1.position, t2.position);
				view = view + (backDist - newDist) / 100.0f;
				v = v + (newDist - backDist) / 1000.0f;

				// 限界値をオーバーした際の処理
				if(v > vMax)
				{
					v = vMax;
				}
				else if(v < vMin)
				{
					v = vMin;
				}
				
				// 相対値が変更した場合、カメラに相対値を反映させる
				if(v != 0)
				{
					map.transform.localScale = new Vector3(v, v, 1.0f);
				}
			}
		}
	}
}

```

今回はカメラの視角値を調整していますが、オブジェクトの大きさを変更する方法もできるかと思います。
値の大きさや速度、変更するコンテンツなどは作成するアプリにより最適な方法をお取りください。
データを変更するスクリプトを実行するrails runner


本番環境のデータを更新する時に、使うって教えてもらったのでメモ

# 実行方法

```
¥ RAILS_ENV=production bin/rails runner hogehoge.rb
```

# 環境変数を渡す場合
環境変数を渡す、渡さないでデータの更新を行う、行わないを制御するようにすると良い

```
¥ HONBAN=1 RAILS_ENV=production bin/rails runner hogehoge.rb
```

例えば、こんな感じのスクリプト

```ruby
# 全ユーザーの一部の設定を変更する
# 環境変数ある、無しでデータの更新を行うか設定する
honban = ENV['HONBAN']
puts 'テスト' unless honban
User.transaction do
  # 変更前の状態をcsvファイルに履いて万が一の時に備える
  CSV.open('before_user_info.csv', 'w') do |logger|
    logger << %w(id name hoge)
    User.all.each do |user|
      hoge = user.try(:hoge)
      if hoge.present?
        logger << [user.id, user.name, user.hoge]
        user.hoge = hoge2

        user.save if honban
      end
    end
  end
end
```