OmniAICreator/Qiita-1.07M huggingface dataset:
Capybara  | have_selector で disabled なフィールドを検証する

こういうページがある場合。

```html
<input type="input" id="message" name="thanks_to_you" disabled="disabled">
```

have_selector で id で指定しても name で指定しても成功する。

```rb
it { expect(page).to have_field 'message', disabled: true } # => true
it { expect(page).to have_field 'thanks_to_you', disabled: true } # => true
```

逆に `disabled: true` を指定しないと、falseも返さず落ちるので注意。(ちょっとはまった)

```rb
it { expect(page).to have_field 'message' } # => RSpec::Expectations::ExpectationNotMetError
it { expect(page).to have_field 'thanks_to_you' } # => RSpec::Expectations::ExpectationNotMetError
```


# 参考

- https://github.com/jnicklas/capybara/issues/982

# 環境

- capybara (2.7.1)
- rspec (3.4.0)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
WHATWG Streams の Back pressure

# 概要

[WHATWG Streams](https://streams.spec.whatwg.org/) のことを何回かに分けて書く。[Kyoto.js #11](http://kyotojs.connpass.com/event/39462/) の『 [WHATWG Streams をためした](http://bouzuya.net/slides/2016-10-22/) 』という発表のために調べたものだ。発表だけで終わらせるのはもったいないので、再整理して共有する。

前回は『 [WHATWG Streams の Lock - Qiita](http://qiita.com/bouzuya/items/886db88cfef498272356) 』。今回は Back pressure のことを書く。

## Back pressure (バックプレッシャー) とは？

- 背圧
- 流量制御
- 例: 書き込み速度よりはやく読み込まれ続けると詰まるので、読み込みを止める

## WHATWG Streams におけるバックプレッシャー

- Promise で待たせる
  - Source や Sink のメソッドで Promise を返して解決を待たせる
- QueuingStrategy で待たせる
  - queue size で Source の `pull()` を待たせる

### Promise で待たせる

- Source / Sink の各メソッドは Promise を返しても良い
- Promise を返した場合は、それに続く処理は Promise の解決まで待つ
    - 例: `pull()` が Promise を返した場合、次の `pull()` は Promise の解決後に呼び出される

```javascript
let index = 0;
new ReadableStream({
  pull(controller) {
    index += 1;
    controller.enqueue(index);
    // pull() は Promise の解決を待って (50+ ms 待って) 呼ばれる
    return new Promise((ok) => setTimeout(ok, 50));
  }
})
  .pipeTo(new WritableStream({
    write(chunk) {
      console.log(chunk);
      // write() は Promise の解決を待って (100+ ms 待って) 呼ばれる
      return new Promise((ok) => setTimeout(ok, 100));
    }
  }));
```

### QueuingStrategy で待たせる

- ReadableStream の内部キューをどうためるかという戦略
- `get highWaterMark(): number` と `size(chunk: any): number` を持つ
    - `highWaterMark` プロパティ (HWM) は queue size の上限
    - `size()` メソッドは chunk の size を計算する
- QueueingStrategy で指定された上限を超えると ReadableStream が Source の `pull()` を呼ばなくなる
- **Source は ReadableStream の内部キューの余裕を無視して enqueue し続けることもできる**
    - Back pressure の考慮は Source の実装者の責任

```javascript
class CountQueuingStrategy {
  constructor(options: { highWaterMark: number; });
  get highWaterMark(): number; // queue size の限界。
  size(_chunk: any): number; // chunk size の計算。このクラスでは常に 1 。
}

class ByteLengthQueuingStrategy {
  constructor(options: { highWaterMark: number; });
  get highWaterMark(): number;
  size(chunk: { byteLength: number; }): number;
}
```

```javascript
// Source が queue の size を気にしながら enqueue する例
new ReadableStream({
  start(controller) {
    setTimeout(() => {
      let index = 0;
      while (controller.desiredSize > 0) { // queue に余裕がある限り enqueue
        controller.enqueue(index++);
      }
      controller.close();
    });
  }
}, new CountQueuingStrategy({ highWaterMark: 10 })) // queue は 10 個まで
  .pipeTo(new WritableStream(...));
```
# 参考

- [WHATWG Streams](https://streams.spec.whatwg.org/)
- [WHATWG Streams をためした](http://bouzuya.net/slides/2016-10-22/)
raspberry pi 1 model bで、node-red　その１０

#概要
raspberry pi 1 model bの、node-redで、websocketでLチカしてみた。
#開発環境
raspberry pi 1 model b
raspbian 2016_09_23 jessie lite
#写真
![ras13.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/e977a863-fc72-00e9-8451-496117e6628f.jpeg)

#サンプルコード
```
[{"id":"a6f9f4a2.4c3f08","type":"debug","z":"4f4f703e.a2a9d","name":"","active":true,"console":"false","complete":"false","x":333,"y":158,"wires":[]},{"id":"95e1c015.9b192","type":"websocket in","z":"4f4f703e.a2a9d","name":"","server":"e03edb20.595448","client":"","x":123,"y":189,"wires":[["a6f9f4a2.4c3f08","ab990cde.150e9"]]},{"id":"ab990cde.150e9","type":"rpi-gpio out","z":"4f4f703e.a2a9d","name":"gpio4","pin":"7","set":"","level":"0","out":"out","x":318,"y":239,"wires":[]},{"id":"e03edb20.595448","type":"websocket-listener","z":"4f4f703e.a2a9d","path":"/led","wholemsg":"false"}]
```

#コントローラ
http://jsdo.it/ohisama1/gWDQ

```

<br>
<a href="JavaScript:on()">
    <img src="http://jsrun.it/assets/i/S/a/1/iSa1M">
</a>
<a href="JavaScript:off()">
    <img src="http://jsrun.it/assets/j/j/Z/u/jjZu9">
</a>
<br>
<br>
<img id="led" src="http://jsrun.it/assets/f/Z/R/F/fZRFP.png">
<script>
var websocket = new WebSocket("ws://192.168.11.7:1880/led");
websocket.onopen = function() {
    alert("ok");
}
websocket.onerror = function(e) {
    alert("ng");
}
websocket.onmessage = function(e) {
    alert("msg: " + e.data);
};
var pub = function(val) {
    websocket.send(val);
}
function off() {
    led.src = "http://jsrun.it/assets/f/Z/R/F/fZRFP.png";
    pub(1);
}
function on() {
    led.src = "http://jsrun.it/assets/5/O/1/U/5O1Uy.png";
    pub(0);
}
</script>

```
CentOS7に導入したTomcatに複数の環境を用意する方法について

CentOS7を導入したサーバー上にTomcat8を導入して8080ポートでアクセス可能な状態にしています。

また、ローカルのWindows10のPC上で、Eclipseで開発した動的Webプロジェクトが存在し、このプロジェクトは、プロジェクト内に配置したXMLファイルの設定を参照して稼動する仕組みになっています。
仮に、プロジェクト名を「Web01」とします。

このプロジェクトについて、EclipseでWARファイルをエクスポートしたもの（Web01.war）を、前述のCentOS7上のTomcat8に配置して稼動できることを確認している状況です。
http://server01:8080/Web01/Servlet01

実施したいのは同一のCentOS7のTomcat8の環境で、XMLの設定内容を変更した環境を複数作りたいのですが、具体的な実現方法がわかりません。

たとえば、以下のようなイメージです。

１．担当者１が検証する環境
http://server01:8080/Web01Tantou01/Servlet01

２．担当者２が検証する環境
http://server01:8080/Web01Tantou02/Servlet01

上記のような環境を作成する方法について情報提供をお願いできればと思います。
よろしくお願いします。
WindowsでCドライブとDドライブにパーティションを区切った環境でCドライブが枯渇したときの対策。


- MyDocument系をDドライブに移動
    - http://enjoypcblog.blog32.fc2.com/blog-entry-325.html
- 「hiberfil.sys」と「pagefile.sys」の削除
    - ページングファイルは削除じゃなくてDドライブに作るようにしてる
    - https://pctrouble.net/running/delete_hiberfilsys_pagefilesys.html
- Tempファイル系を削除
- ディスククリーンアップでWindows Updateの不要になったファイルを削除
- DiskInfoを使って容量を使っているところを地道に探す
    - http://www.vector.co.jp/soft/dl/winnt/util/se475617.html

実行するときは自己責任で。
GitHub Desktopのインストール方法(Win7)

日時　2016/2/22
環境　Windows７
　　　　IE8

GitHub Desktopの公式サイトからインストーラを落としてくる
https://desktop.github.com/

 

普通にインストールしようとすると

「Error: An error occurred trying to download 'http://github-windows.s3.amazonaws.com/GitHub.application'.」

のエラーで止まる。

 

proxy 通らないっぽいのでこちらのサイトを参考に設定する。

http://www.0x00.to/post/2012/12/31/How-to-use-ClickOnce-with-proxy-authentication
1.Download http://www.0x00.to/FILES%2f2012%2f12%2fClickOnceWithProxySupport_v0.1.zip.axdx
2.解凍する
3.ClickOnceProxySettings.xml に自分の認証情報書く(ユーザID、パスワード、プロキシサーバのアドレス)
4.C:\Windows\Microsoft.NET にClickOnceProxySettings.xml を配置する
5.C:\Windows\Microsoft.NET\Framework\v2.0.50727 に 解凍した Build\netfx2-Release\dfsvc.exe をコピー
6.C:\Windows\Microsoft.NET\Framework\v4.0.30319 に 解凍した Build\netfx4-Release\dfsvc.exe をコピー


IEで github-windows.s3.amazonaws.com/GitHub.application をアドレスバーに入力してEnter

待てばダウンロード始まる。

 

これでインストール完了。
jQueryで数の合計を算出する関数作ったった

Rails等で複数の金額入力フィールドがあるような画面で、
金額が変更されたらonChangeで、合計金額をリアルタイムに変更したい

という要望はよくあると思う

毎回ゴリゴリjavascript書いてて、面倒になってきたので、jQueryに関数を追加して対応

```application.js.coffee
  jQuery.extend
    # selectorの要素の値をsumする
    # ex. $.sum('.amount input[type=text]')
    sum: (selector) ->
      sum = 0
      jQuery(selector).each ->
        value = $(this).number_of_val()
        sum += value
      sum

  jQuery.fn.extend
    # カンマを取り除いた数値の値を返す
    # 主に金額のinputに対して使用する
    # ex. $('#hoge').number_of_val()
    number_of_val: (selector) ->
      value = 0
      if $(this).val()
        value = parseInt($(this).val().replace(/,/g, ''), 10)
      else if $(this).html()
        value = parseInt($(this).html().replace(/,/g, ''), 10)

      return if !isNaN(value) then value else 0

```

こんなのを書いておいて、
`$.sum('.amount')` で合計金額を算出できるので、

```
$(document).on('change', '.amount', function(event) {
  $('#amount_sum').val( $.sum('.amount') );
});
```
で簡単に合計をリアルタイムに更新できる。
まぁ今時`Vue`や`React`使えって話なんですが・・・・
Windowsで複数のXAMPPを共存させる

インストーラ版とzip版を共存させる。
インストーラ版が既に C:\xampp568 に存在している場合。

1. ZIP版を解凍してディレクトリをリネーム。（今回はxampp709）

2. C直下に配置。

3. /xampp を /xampp709 に切り替えるシンボリックリンクを作成。
管理者権限でコマンドプロンプトを起動しコマンド実行

```
mklink /d c:\xampp c:\xampp709

```

これでXAMPPの各種設定ファイルに含まれる /xampp というパスが /xampp709 を読みに行くようになる。

4. ポート変更
インストーラ版と競合しないようにポートを変更する。
デフォルトだと80と443を使っているのでそれ以外。
JSONとJSONPとクロスドメイン規約について

#JSON（ジェイソン）とは
「JavaScript Object Notation」の略。
 JSONは、数値や文字列や配列やオブジェクトなどのデータを、文字列で表現できる軽量なフォーマット。


#JSONP（ジェイソンピー）とは
「JavaScript Object Notation with padding」の略。
JSONPとは、scriptタグを使用してクロスドメインなデータを取得する仕組みのことである。
HTMLのscriptタグ、JavaScript（関数）、JSONを組み合わせて実現される。
JSONPでは、関数に引数として JSONオブジェクトを指定した形式になります。


#クロスドメイン制約
クロスドメイン制約は「ブラウザ上で実行されるJavaScriptは同じドメインにしかリクエストの送信やクッキーの編集を行えない」という制限で、悪意あるサイトにアクセスした際に情報が漏洩することを防ぐためにブラウザが提供する仕組み。

クロスドメイン制約が重要なのは、悪意あるJavaScriptがユーザーのブラウザ上で実行され、銀行などのサーバーにアクセスして機密情報を盗み出す事を防ぐためであり、このおかげで、悪意のあるJavaScriptが実行されても、機密情報にはアクセスできない。


　



```
[参考]　同一生成元ポリシー
Webページは通常、自分を生成したドメイン以外のドメインのサーバと通信することはできない。
しかし、HTMLのscriptタグのsrc属性には別ドメインのURLを指定して通信することができるという点を
利用することによって別ドメインのサーバからデータを取得することが可能になる。
```

#まとめ
そこで先ほど紹介したJSONPでは、クロスドメイン制約を回避して通信するため、わざわざサーバー側で対応が必要になる。

JSONPのAPIをわざわざ用意するということは、そこで提供される情報は機密情報ではないはずなので、クロスドメインなデータも取得できる。

だから、クロスドメイン対応 ➡︎ JSONP　のようだ。
LibreOffice Calc の表をRedmine wiki記法(Textile記法) に変換するマクロ

## Redmine に表を書きたい
　Redmine では wiki記法（Textile記法）で、表を書くことができるが、そのもととなるデータはExcelやLibreOffice Calc 等の表計算ソフトで作成していると思う。（合計の計算や分析が楽だし）

　出来上がった表データを wiki記法に変換するのが手作業では面倒だし、転記ミスも出そうなので、マクロを書いた。 結合したセルや、セル内に改行があるもの、色付けなどには未対応ですが、そこそこ楽にはなりそうなので、公開します。

## 使い方

　マクロのソースをマイマクロのStandard、Module1などに書いておき、変換したいセル範囲を選択してからマクロを実行させてください。

　マクロは選択範囲から右に２つめの列に一行ずつ変換後の文字列を書き込みます。
マクロが終了したら、出力された文字列を選択、コピー&ペーストで wiki に書き込み、適当に補正してください。

## MarkDown にするには
　wiki(Textile) じゃなく、Markdown にしたい場合は、ソースのアラインメントに関する部分（```>. <.```)と、ヘッダーに関する接頭文字（```_.```）を付けないように修正して、出力された文字列にアラインメント行を追加するなどしてください。


## マクロのソース（BASIC）

```vbnet:calc2redmine.bas
REM  *****  BASIC  *****

Sub Main
    Dim First As Boolean
    Dim str1 As String
    Dim oCtrl As Object
    DIm oSheet As Object
    Dim rangeAdd As Object
    Dim Row, sRow, eRow, Col, sCol, eCol, oCell, oCall2 As Object

    oCtrl = ThisComponent.CurrentController
    oSheet = oCtrl.ActiveSheet
    rangeAdd = ThisComponent.CurrentSelection.RangeAddress
    sRow = rangeAdd.StartRow
    eRow = rangeAdd.EndRow
    sCol = rangeAdd.StartColumn
    eCol = rangeAdd.EndColumn

    First = True
    For Row = sRow To eRow
        str1 = ""
        For Col = sCol To eCol
            oCell = oSheet.getCellByPosition(Col, Row)
            If First Then '1行目はタイトルとする（太字で中央寄せ）
                str1 = str1 & "|_. " & oCell.String
            Else
                Select Case oCell.Type  '数値だったら右寄せとする
                Case 1
                    str1 = str1 & "|>. " & oCell.String
                Case Else
                    str1 = str1 & "|<. " & oCell.String
                End Select
            End If
        Next
        First = False
        str1 = str1 & "|"
        oCell2 = oSheet.getCellByPosition(Col+1, Row)
        oCell2.String = str1
    Next

End Sub
```
標準地域コード現在値

地方自治体の URL 一覧は「全国地方公共団体コード」ベースで揃えれば大丈夫そうだということがわかった。「全国地方公共団体コード」データが欲しい。

「全国地方公共団体コード」のスーパーセットになっている「標準地域コード」は自治体単位ではなくて統計値撮りたい場所全て網羅的に設定されているので、「標準地域コード」ではホームページが対応しない地域がたくさん出る。これは過剰すぎる。

地域標準コードの RDF スキーマ自体はよくできていて、これを参考に「全国地方公共団体コード」もメンテできないかと考えてみた。現状だと [excel で配布](http://www.soumu.go.jp/denshijiti/code.html)されているので、例えば `pandas.read_excel` で読み込んで、ゴミを取り除きながら使うしかない。

ただ「標準地域コード」の `CurrentStandardAreaCode` の体系が、ちょっと「うーん」と思ってしまった。個人的には可能な限りデータは静的に設計したいと思っている。「現在の」みたいなダイナミックなデータをファイルに書いてしまうと将来的に嘘になってしまうのが難点。

で例えば `CurrentStandardAreaCode` を使わないとして、同等のものは計算で出せるかと試してみた。`CodeChangeEvent` で前後の変更が分かるので、生き残ってるコード群を出してみる。

```sparql
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX sac: <http://data.e-stat.go.jp/lod/sac/>
PREFIX sacs: <http://data.e-stat.go.jp/lod/terms/sacs#>
PREFIX sace: <http://data.e-stat.go.jp/lod/sace/>

SELECT DISTINCT ?s WHERE {
  ?s a sacs:StandardAreaCode .
  ?e a sacs:CodeChangeEvent ;
     org:resultingOrganization ?s .

  FILTER NOT EXISTS {
     ?e2 org:originalOrganization ?s .
  }
}
```

ところが、これは `CurrentStandardAreaCode` の数とは一致しない。[実行結果](https://gist.github.com/hkwi/bc125ace095e9add26b2cec2cc4c04ff)。原因を見ていくと、例えば「相模原市が政令都市に移行」は、「全国地方公共団体コード」での改正の記録はこうなっている。

|都道府県名|改正前コード|市区町村名|ふりがな|改正区分|改正年月日|改正後コード|市区町村名|ふりがな|事由等|
|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
|神奈川県|142093|相模原市|さがみはらし|欠番|H22.4.1|削除|削除|削除|政令指定都市へ移行|
|||||新設|〃|141500|相模原市|さがみはらし||
|||||〃|〃|141518|緑区|みどりく||
|||||〃|〃|141526|中央区|ちゅうおうく||
|||||〃|〃|141534|南区|みなみく||

「標準地域コード」での記録はこうなっている。

```turtle
sace:C5174
      rdf:type sacs:CodeChangeEvent ;
      sacs:reasonForChange sacr:shiftToDesignatedCity ;
      dcterms:date "2010-04-01"^^xsd:date ;
      dcterms:description "Sagamihara-shi(14209) shifts to a city designated by the Cabinet Order, and it becomes Sagamihara-shi(14150)."@en , "相模原市(14209)の相模原市(14150)への政令指定都市移行"@ja ;
      dcterms:identifier "5174" ;
      org:originalOrganization
              sac:C14209-20071201 ;
      org:resultingOrganization
              sac:C14209-20100401 , sac:C14150-20100401 .

sace:C5175
      rdf:type sacs:CodeChangeEvent ;
      sacs:reasonForChange sacr:establishmentOfWards ;
      dcterms:date "2010-04-01"^^xsd:date ;
      dcterms:description "Midori-ku(14151), Chuo-ku(14152) and Minami-ku(14153) are newly established in Sagamihara-shi."@en , "緑区(14151)、中央区(14152)、南区(14153)の新設"@ja ;
      dcterms:identifier "5175" ;
      org:resultingOrganization
              sac:C14151-20100401 , sac:C14152-20100401 , sac:C14153-20100401 .
```

「全国地方公共団体コード」を普通に読むと `sac:C14209-20100401` は必要なさそうに思える。なんで追加されているのか？なんでこんな体系になっているのか？クエリしてみると分かりそう。[実行結果](https://gist.github.com/hkwi/bc125ace095e9add26b2cec2cc4c04ff)。

```sparql
PREFIX sac: <http://data.e-stat.go.jp/lod/sac/>
select  * 
where {
      ?s ?p sac:C14209-20100401 .
} 
limit 10
```

当初 `14209` のコードで集計中のデータがあったときに、それを突然 `14150` に変更するわけにもいかない、ということだろうか。「標準地域コード」は郡・庁・局など地域的にも拡張されていたけれども、実は時間方向にもコードが拡張されているということが分かった。

なるほどねー。
`rbenv: cannot rehash: /usr/local/var/rbenv/shims/.rbenv-shim exists`が出た時の対処法

### 対策

本来消えるはずの一時ファイルが残ってしまってるだけなので消しましょう。

```.sh
rm /usr/local/var/rbenv/shims/.rbenv-shim
```

### 参考

https://github.com/rbenv/rbenv/issues/759
Null許容型でLINQでSumやらAverageするときに注意すべきコト

#どー言うことか？
`IEnumerable<Nullable<T>>`に対して、Sum（）やらAverage()やら使うと個人的に予想外の結果になったのでその備忘録。

#Nullableに関して
NumericなNullableに対して、BinaryOperationを実行した場合、片っぽがnullなら伝播して、結果はnullに成る。

```csharp

int? x=42;
int? y=114514;
int? z=null;

//114556が出力される。
Console.WriteLine((x + y)?.ToString() ?? "NULL");

//NULLが出力される。
Console.WriteLine((x + z)?.ToString() ?? "NULL");

```

#で、本題

さて、`Ienumerable<int?>`見たいなシーケンスに`Sum`やら`Average`を適用したらどうなるだろうかってのが今日のお題。
Nullが紛れ込んでなきゃ何の問題も無いけど、紛れ込んでいた場合を検証してみた。

```csharp

int?[] nonNullArray=Enumerable.Range(0,10).Select(x=>(int?)x).ToArray();
int?[] nullArray=nonNullArray.ToArray();
nullArray[9]=null;

int?[] allNullArray=Enumerable.Repeat((int?)null,10).ToArray();

//45
Console.WriteLine(nonNullArray.Sum());

//4.5
Console.WriteLine(nonNullArray.Average());

//9
Console.WriteLine(nonNullArray.Max());

//0
Console.WriteLine(nonNullArray.Min());

Console.WriteLine();

//36
Console.WriteLine(nullArray.Sum());

//4
Console.WriteLine(nullArray.Average());

//8
Console.WriteLine(nullArray.Max());

//0
Console.WriteLine(nullArray.Min());

Console.WriteLine();

//0
Console.WriteLine(allNullArray.Sum());

//null
Console.WriteLine(allNullArray.Average());

//null
Console.WriteLine(allNullArray.Min());

//null
Console.WriteLine(allNullArray.Max());
```

概ねこんなかんじになる。
以上のことから、

* 要素に`null`が有る場合、フィルタされる。
    * `Sum()`の場合、nullはフィルタされるので、nullの要素以外の合計となる。
    * `Average()`の場合、上記の合計を`null`以外の要素数で除した結果となる。
    * `Min()`、`Max()`は不感
* すべての要素が`null`の場合、`Sum()`は0を返す。
* `Average()`,`Max()`,`Min()`は`null`を返す。

#まとめ
以上の検証から、nullの要素は基本的にフィルタされて処理されることがわかった。
全要素がnullの場合は、Sum()は0を返し、Sum()以外はnullを返すので、ちょいと注意が必要かと。

要素にnullが存在する場合、結果がnullに成ることを企図したければ、事前にAnyあたりで、当たりを付けるか、Aggregateで処理するか、素直にforeachに展開するが良いかと思います。
RedHat Forum 2016 参加レポート(社内LT用)

# 概要
レッドハットフォーラム2016に参加したため、レポートとして残します。

#　レッドハットフォーラムとは
![red-hat-forum2016.jpg](https://qiita-image-store.s3.amazonaws.com/0/78250/925842bd-c1b5-b179-ea43-c1dbce546992.jpeg)

- レッドハット製品に絡んだ事例紹介
- レッドハットがSierで入った事例紹介もありました
- 中には、レッドハットに絡まないセッションもあった(アマゾン)
- 来場者の層としては、営業・プリセールス担当・情シス担当、が多かったイメージ
- エンジニアは少なめだったか

# セッション
## 旭製鉄
  - トヨタ向けの部品を提供している
  - IoT を導入し、相当なコストダウンを実現できた
  - 残業が相当減った
  - すみません具体的には、資料公開されてなく、、、ちょっと情報が曖昧ですみません
  - 工場では物理スペースが限られている
  - なので、有線LANも用意できないので、無線LANを活用
  - スティックPCと無線LANを活用し、既存の製造ラインを刷新した。

## MS
![Azure-logo.jpg](https://qiita-image-store.s3.amazonaws.com/0/78250/23975e3e-38b9-053b-86f2-a2a9d1a90398.jpeg)

  - エンタープライズ企業がAzureを選ぶ理由
  - MSとして、パソコン(ウィンドウズ)から、クラウド・モバイルコンピューティングにシフトしている
  - AzureのDCは100拠点に増えている
  - 国内では4リージョンになる
  - 地球22周分のダークファイバーを自前で所持している
  - サンパウロから東京まで、1万9000K で(地球半周)、1GB 9秒(下り)
  - じゃあ実際の事例としてどうなんだ。
  - エクスプレスルート。Azure の専用回線サービス。
  - 早稲田大学の CMS は Azure。たぶん WordPress。
  - MS とレッドハットの関係
  - MS は OSS に積極的。10年前から活動している
  - これまではあまり外に出せなかった。現在の CTO になってから、外に出しまくれの方針となった
  - GitHub のコントリビューターの数は、実は MS がナンバーワン。9000人いる。一大勢力
  - Azure の VM はほぼ半数はリナックス
  - MS と RedHat で契約締結。Azure で RedHat 製品をサポート。JBOSS などを Azure マーケットプレイスでそのまま利用可能
  - SQLServer on Linux もこれから
  - あくまでエンタープライズ向け。コンシューマ向けはまだまだ
  - DevOPS on Azure。導入支援サービス。Docker, Jenkins, Chef, Ansible 等々。

## Amazon
![AmazonWebservices_Logo.svg_.png](https://qiita-image-store.s3.amazonaws.com/0/78250/2d04672f-e005-95fb-5668-0ebe02f273e4.png)
  - AWS の起源は、アマゾン社内のITインフラの調達からだった
  - それを見たジェフベッソンは、フロントとインフラ部隊のMtg禁止。その代わりに、インフラ調達をAPI化しなさい、になった。それが後の AWS である
  - なので、アマゾン自体が社内でイノベーションを起こすために、AWS が必要だった
  - あと、社内インフラは結構イケていた。じゃあそれをサービス化しよう、で AWS がスタートした
  - 現在、IoT サービスが増えている
  - センサーを取り付けてクラウドでデータ解析
  - 2015年は1年間で700のサービス・機能をローンチした
  - 日本企業の利用では、20000社
  - 利用事例
  - 農業・農作機。最適な作物を作るために、200000もの農作機にセンサーを取り付けて、AWSでデータ解析・可視化。最適な水撒きタイミング、肥料まきタイミングを効率化。IoT 事例。
  - 自動車の保険会社。数百万の自動車にセンサーをつけて、リアルタイムに送付されるデータから、保険料の調整・プランの変更提案をしている。ブレーキの回数、速度の安定性などでドライバーの技量をIoTで判断。
  - クラウドのメリット、資産の調達が不要なので、失敗に強い。失敗のコストを最小限に。調達スピードが最強早い。AWSの強みである。
iPhoneアプリでのローディング画面フレームワーク一覧

## [SVProgressHUD](https://github.com/SVProgressHUD/SVProgressHUD)
![](https://camo.githubusercontent.com/6ed028acbf67707d622344e0ef1bc3b098425b50/687474703a2f2f662e636c2e6c792f6974656d732f32473146315a304d306b306832553356317033392f535650726f67726573734855442e676966)
有名どころですね。コード自体はObjective-Cで書かれてるみたいです。
Swift3.0に対応してます。

### Installation
* CocoaPods 
* Carthage

もちろんドラッグアンドドロップでも出来ます

### Usage
* ロード開始
    * `SVProgressHUD.show()`
    * パラメータにimageとかstatus(string)を入れられる

* 終了
    * `SVProgressHUD.dismiss()`
    * パラメータにtimeIntervalを設定できる

---
## [MBProgressHUD](https://github.com/jdg/MBProgressHUD)
![](https://dl.dropboxusercontent.com/u/378729/MBProgressHUD/v1/1.png)
こちらも有名だと思います。コードもObjective-Cで書かれてるみたいです。
Swift3.0に対応してます。

### Installation
* CocoaPods 
* Carthage

同じくドラッグアンドドロップでも出来ます

### Usage
* ロード開始

* ```swift
let HUD = MBProgressHUD.init()
self.view.addSubview(HUD)
HUD.show(animated: true)
```
    * HUDに対してimageとかstatus(string)を入れられる

* 終了
    * `HUD.hide(animated: true)`

---
## [KRProgressHUD](https://github.com/krimpedance/KRProgressHUD)
![styles.png](https://qiita-image-store.s3.amazonaws.com/0/119161/4472fc30-48dc-435f-bd60-d9c9e4bf62ac.png)
こちらは上記のフレームワークに影響受けて作られたもの(?)です。個人的には好きです。swiftで書かれています。
swift3.0に対応してます。

### Installation
* CocoaPods 
* Carthage

### Usage
* ロード開始
    * `KRProgressHUD.show()`
    * textの他に用意されているstyleを設定出来ます。
    * ~~imageは設定出来ません。~~
    * `KRProgressHUD.show(message: str, image: myImage)`みたいに出来るそうです。
* 終了
    * `KRProgressHUD.dismiss()`

---
何かあれば追加していきます。
Qiitaは日々のメモ用に

## Qiitaの目的
自分のメモ用です。
同じことを何度も調べているので、それなら自分のところにまとめようということで

## 内容
- python
    - 良いモジュールあれば
    - スクレイピング
    - jupyter
- C++
- javascript
- git, github
- ubuntu
- 機械学習(特にDeeplearning,強化学習)

とかになると思います。

## ここはtips保管庫
きれいにまとめたものとしては

- 晴耕雨読:http://saleslog.hatenadiary.jp/

にまとめ直すつもりです。
日々tipsをストックしていく感じにします。
[bash] diffでコマンドの出力の結果を直接比較する。

diffコマンドってLinuxのコンソール上で良く使うのですが、ファイル同士の比較だけしか出来ません。

# コマンドの結果を比較したい時ってあるよね！

たとえば、dir1とdir2のファイル構成を比較したいとき。

## 実直な方法。

$ ls dir1 > file_list.dir1.txt
$ ls dir2 > file_list.dir2.txt
$ diff file_list.dir1.txt file_list.dir2.txt

中間ファイルを作る方法です。
多分一番スタンダードですが、私はあまり中間ファイル残したくない人なので・・・。

## コマンドの結果を直接食う！！

コマンドの結果を次のコマンドに渡す手っ取り早い方法、それはパイプ！
でも1つしか使えないし、そもそもdiffはパイプの食わせ方がありません。

コマンドによっては - を指定すると標準入力から入力を待つのもありますが。
私が良く使う例。

```bash:ssh.sh
tar czf - * | ssh hoge@fuga.com "tar xzf -"
```

とか。
ネットの帯域が狭かったころに、圧縮してファイルを転送する方法です。

# パイプに結果を流す。

名前付きパイプと言うのがあるのですが、それの説明はまたそのうち。

結論から書くと、

```
diff <(ls dir1) <(ls dir2)
```

となります。
`<(...)` はコマンドの結果を(名前付き)パイプに放り込む方法で、名前付きパイプはファイルと同等の扱いをされます。
この結果、ls dir1の結果　と　ls dir2の結果　が名前付きパイプとしてファイル扱いされ、diffによって比較されることとなります。

# そんなに使うのかい・・・？

この　`<(...)`　って結構使えてですね。
ファイルしか入力に対応してないものとか、標準入力からの入力に対応してるけど複数食わせたいときとかに重宝します。

たとえばー。

```
cat <(grep -E "^hoge" file) <(grep -vE "^hoge" file) > hoge_head.txt
```

とかやって、hogeから始まる行だけを先頭にまとめるとか。
何か良い例が思いつきません！

# 最後に。

bashのコマンドはいろいろありすぎて全部知るのはなかなか大変ですね。
しかし知ってる知らないで結構手数が変わるのでいつか使ってみてください！
RailsでCSSの読み込む順番を制御する方法

# RailsでCSSの読み込む順番を制御する方法
application.cssで読み込み順序を制御可能です。

```app/assets/stylesheets/application.css
/*
 *= require_self
 *= require_tree .
 */
```

Asset Pipelineの仕組みによりここで読み込みの順番を制御しています。
この仕組はディレクティブと呼ばれます。

```
require_self
```

これは、このapplication.css自体を最終的なスタイルシートに含めることを指定しています。
この行がないと、このファイルに書かれたcssは無視されます。

```
require_tree .
```
がapp/assets/stylesheets以下の全CSSファイルを読み込むという意味になります。
しかし、読み込む順番は辞書順のため、hoge.cssよりもscaffold.cssは後に読まれることになります。

# 読み込む順番の指定方法
順番を変更したいCSSを以下のように個別のrequireを追加することで明示的に順番を指定することができます。

```app/assets/stylesheets/application.css
/*
 *= require_self
 *= require scaffolds.css
 *= require hoges.css
 *= require_tree .
 */
```
Ruby | ローカル変数 / インスタンス変数 / クラス変数を全て表示する

# 確認

```rb
class Example
  local = nil
  @instance = nil
  @@class = nil

  puts local_variables
  puts instance_variables
  puts class_variables
end
```

## 結果

```
local
@instance
@@class
```

# ちなみに

ローカル変数は宣言より前でも取れる。

```rb
class Example
  puts local_variables
  puts instance_variables
  puts class_variables

  local = nil
  @instance = nil
  @@class = nil
end
```

## 結果

```
local
```

# 環境

- Ruby 2.3.1

# 参考

- http://stackoverflow.com/questions/4487326/how-to-list-local-variables-in-ruby








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
2つのディレクトリ内の差分を見る。

bash限定ですが。

# 何のこと？

似たファイル構造を持つ2つのディレクトリがあるときに、その中にあるファイルの差分を見たいってことがあると思います。

具体的にどんなときかと言うと、SVN/gitとかからレポジトリをCheckout/cloneしてきて、
そっちのディレクトリは触らずに、自分用にコピーを作って、それを編集して反映するのに差分を見る、とかです。

## 要は。

gitなりSVNなり使ってれば別にいいじゃん！ってことですが。
それを言っちゃうと今回のお話終わっちゃうので！

# 普通の方法。

## まずはWindowsなら。

WinMergeさん最強です！

## bashの時は。

比較する2つのディレクトリが　dir1　と　dir2　とします。

```bash:directory_diff_1.sh
for file in `find dir1 -type f`
do
    diff $file ${file/dir1/dir2}
done
```

とかやるとファイルだけ全比較してくれます。
ファイル名も出してみるのがこちら。

```bash:directory_diff_2.sh
for file in `find dir1 -type f`
do
    echo "-----" $file "-----"
    diff $file ${file/dir1/dir2}
done
```

ただ、これだと**差がないファイル**もファイル名だけは出てしまって見づらいです。
なので、次の方法(私が良く使う方法)のご紹介！

```bash:directory_diff_3.sh
for file in `find dir1 -type f`
do
    diff -q $file ${file/dir1/dir2}
    if [ $? -ne 0 ]; then
        echo "-----" $file "-----"
        diff $file ${file/dir1/dir2}
    fi
done
```

2回diff取っちゃってますが、diffはファイルに違いがあると0以外を返すので、その終了コードを取って表示/非表示を切り替えてます。

実際に使う場合は最後にlessのパイプかませたりしてますけどね。

```bash:directory_diff_4.sh
for file in `find dir1 -type f`
do
    diff -q $file ${file/dir1/dir2}
    if [ $? -ne 0 ]; then
        echo -e "\n-----" $file "-----"
        diff $file ${file/dir1/dir2}
    fi
done | less
```

## Tips

上で使ってる技術のいくつか説明。

> find (ディレクトリ名) -type f

指定したディレクトリ以下のすべての**ファイルだけ**を列挙します。
`-type d` にするとディレクトリだけ。
なお、これ**シンボリックリンクはヒットしない**ので、
`-type f -or -type l`とかにしないといけないんじゃないかと思います。
 

> &#096;(コマンド)&#096;

コマンドを実行した結果を半角スペース区切りで一列に並べてくれます。
* でも良いこともあります。

たとえば、

```
$ ls
file1   file2
file3   file4
file5   file6
```
なときに、

```
$ echo `ls`
file1 file2 file3 file4 file5 file6
```
てな具合です。

同一のことをやってくれる別の表記としては　`$(...)` もあります。
&#096;...&#096;内で再度コマンドの結果を取りたいときにこの表記を使うとエスケープとか気にしないで良いので便利です。

> $?

直前のコマンドの終了コードを取ります。

> echo -e

改行とか入れたいときにはこのオプション付けるとOKです。

> ${変数名/置換前/置換後}

bashによる文字列置換です。
_変数名_で指定される変数が指す文字列に対し、_置換前_で指定される部分文字列を_置換後_に**最初に見つけた1つだけ**置き換えます。

もし全部置き換えたいときは　`${変数名//置換前/置換後}`　と_変数名_の後ろのスラッシュを2つ重ねます。

今回の目的は、2つのディレクトリを比較する、なので、最初のディレクトリ名だけ変わればOK！
むしろファイル名中にその文字列があるとそれも変わっちゃうとかは困るので、最初の置換だけにしてます。

> diff -q

違いがあるかどうかだけ見ます。
ファイルが大きい時に便利。

> diff \$file ${file/dir1/dir2}

上に書いた通りではあるのですが、

- diffの第1引数　＝　$file　＝　dir1の下のファイル名
- diffの第2引数　＝　${file/dir1/dir2}　＝　**dir2**の下のファイル名

となって、dir1とdir2の同じ階層にあるファイル同士を比較することになります。

# 最後に。

SVNとかgitとか使ってれば必要ない技術ですが、リリース版とテスト版をちょこちょこっと比較するには便利です！
UI > チェックボックスにTabStopを割当てるかどうか

```txt:動作環境
C++ Builder XE4
```

- 60個ほどのコンポーネントがあるフォーム
- 2割: チェックボックス
- さらに2割: テキストボックス

疑問点

- チェックボックスにTabStopを割当てるかどうか？

案

- 案1 >　チェックボックスにTabStopを割当てる
  - 利点: 遠隔操作時にマウスが死んでもキーボードで操作可能
  - 欠点: キーボードで操作時にTab操作回数が増える
- 案2 > チェックボックスにTabStopを割当てない
  - 利点: キーボードで操作時にTab操作回数を少なくできる
     - 例: テキスト入力項目だけTabStopを割当てる
  - 欠点: マウスが死んだ時にチェックボックス項目を変更できなくなる

マウスが死ぬというのは余程のトラブルで回収対象となるとしたら、案2を選択する、という考えもある。

### 検索用キーワード

- タブ順
- TabOrder
GoogleCloudで汎用Database構築1 - グランドデザイン -

GYAOのtsです。
我々のチームは、オールパブリッククラウドで、[Microservice Architecture](http://microservices.io/patterns/microservices.html)を採用した次期バックエンドを設計中です。

# 経緯

とあるPJでかなり抽象的なと言うか汎用的なデータベースが必要となった。
ずっと前から「やるやら」を繰り返している案件だが、
DMPも同時に推進していくということで、チーム内のモチベーションも高い。
オールパブリッククラウドということで、弊社にしてはかなりアグレッシブなデザインになった。。。
当然拡張性や高可用性が求められるわけだが、
チーム内で研鑽やピアレビュー、プロトタイピングを行っていく中である程度デザインのドラフトができた。

# グランドデザイン
![export.png](https://qiita-image-store.s3.amazonaws.com/0/114329/44189e09-e3fd-01b4-ff1f-37818f76cf6d.png)

## Gateway
Apigee or AmazonAPIGatewayを検討中。
すべてのサービスのエントリポイントとして使用する予定。
認証、ルーティングをここで管理したい。

## Bus
今後の拡張性も考慮して、マイクロサービス同士をつなぐものとして
機能させたい。subscriberを増やすことで同じメッセージがブロードキャストされるのは恩恵が受けられるかと思う。
トピックは

- meta
    - 永続化層に保存するデータ
- log
    - DMP用に行動ログを放り込む

の予定
以前、社内で同じようなシステムを構築した際は、[Apache kafka](https://kafka.apache.org/)を使用しました。
違いも含めてハンズオンしていきたい。

## Dataflow
pub/sub のsubscriberとして機能させる。
以下のjobを作成

- MetaStoreJob
    - Metaトピックから購読したメッセージ（meta）を永続化層（Datastore）に保存する。
- LogExportJob
    - 購読したメッセージ（log）を永続化層（Datastore）に一時保存する。バッチモードで定期的にファイルにして、AzureMachineLearningに食わせる。

とりあえずDataflowでやってみようということで、決定ではない。
もしかしたらアプリケーションを構築してkubernetesクラスタという形になるかもしれません。

## Storage
永続化層として使用。logも食わせるので、BigQueryの方がいいかもしれません。
metaはstorage、logはBigQueryにするとかかな。

# 次回
上記のプロトタイピングを進めていきたいと思います。
PHPで動的にオブジェクトの関数を実行しつつ、引数は連想配列で指定したい。

[Googleのアカウント登録時のバリデート処理を調べてみた](http://qiita.com/daijinload/items/d817bbddc02825ae3c60)

↑の記事で、GoogleのAPI設計が良いなぁと思ったので丸パクリしようとサーバーサイド実装をしていたのですが、掲題の件が出来ないとパクれないなぁということで、リフレクションを使用してサーバーサイド実装書いてみました。意外とググっても記事が無かったのでqiitaに書きます。

```php
// 実行したいクラスとメソッド
class Test {
    public function hoge(int $a, int $b) {
        return $a + $b;
    }
}
// newしたオブジェクトを渡して、メソッド名を指定しつつ、連想配列の$dataを引数にして実行したい。
function doMethod($object, $method, $data) {

    // 連想配列そのままだと、invokeArgsが動かなかったので、配列を作る。
    $args = [];
    $reflectionMethod = new \ReflectionMethod(get_class($object), $method);
    foreach ($reflectionMethod->getParameters() as $index => $paramater) {
      $args[] = $data[$paramater->getName()];
    }

    // 実行
    return $reflectionMethod->invokeArgs($object, $args);
}
// 実行（連想配列の順番は気にしたくない。メソッド引数と型があっていれば実行できるようにしたい。）
$result = doMethod(new Test(), 'hoge', [
    'b' => 111, 'ddd' => 'aaa', 'a' => 666
]);
var_dump($result); // int(777)
```

### 感想
---
出来たけど、ドキュメント見ていると他にも方法がありそう。PHPは方法が複数あってどれが良いのか？分かりづらいですね。。。「もっと良い方法あるよ」という方、コメントくださいm(_ _)m
セレクトボックスの選択されている項目の取得



```html
<select id="hoge" name="test">
	<option value=1>foo</option>
	<option value=2>bar</option>
	<option value=3>baz</option>
</select>
```

セレクトボックスの、選択されている項目をあらわすセレクタは、

`#hoge option:selected`

値(1,2,...)を取得するには、

```javascript
$("#hoge option:selected").val();
```

表示している文字列(foo,bar,...)の方を取得するには、

```javascript
$("#hoge option:selected").text();
```
リプライの文字数緩和が適応されてたので色々試してみた

なんか突然リプライの表示と仕様が変わってたので色々遊んでみた。
~~（いつものTwitter社によるランダム人柱ガチャに当選した）~~

##仕様変更の内容
[Twitter / Upcoming changes to Tweets の日本語訳 - Qiita](http://qiita.com/takke/items/89704183adcab037bed7)
これを見てもらうのが多分一番早いと思います。
リンク先にもあるけど正確な情報は原文見よう（私は読めない）

##具体的な見え方等
見え方の実験に使ったクライアント

- [Twitter for Android](https://play.google.com/store/apps/details?id=com.twitter.android&hl=ja)

- [SobaCha](https://play.google.com/store/apps/details?id=net.wakamesoba98.sobacha&hl=ja)：作者wakamesoba98氏
拡張ツイート対応してるクライアントで使いやすいので対象になった

- [じみったー（仮）](https://betas.to/RaWcGzHQ)：作者私　あとこれ人柱版 
拡張ツイートにはまだ未対応なのでその場合の確認として使用。誰か名前つけるセンスくれ。


###文字数緩和があるアカウントと無いアカウントでの違い
![Screenshot_20161028-075734.png](https://qiita-image-store.s3.amazonaws.com/0/89306/9bac93fd-8462-b0fc-0f06-e670211d86c1.png)
文字数制限緩和が無いとこのように10文字分オーバーしてしまってもちろん投稿ができない

![Screenshot_20161028-075818.png](https://qiita-image-store.s3.amazonaws.com/0/89306/eeb9b894-4116-8cad-1db3-7a2c6cc4d7ce.png)
制限が緩和されているアカウントだとリプライのボタンを押した際`@ID`が付与されず画面上に返信先として相手のスクリーンネームが表示される

なお複数の場合はここにその他というクリック可能なリンクが増え、会話に参加しているユーザ一覧として返信先を選択可能になっていた。

![Screenshot_20161028-075844.png](https://qiita-image-store.s3.amazonaws.com/0/89306/1c0aec43-9178-4bff-fbf1-8c2e17aabe01.png)
表示については緩和されていないアカウントからの閲覧でも公式クライアントなら問題は無い。

![Screenshot_20161028-080536.png](https://qiita-image-store.s3.amazonaws.com/0/89306/6b05b1b7-dd94-e33b-0643-7b6af93c57aa.png)
非公式クライアント(SobaCha)でも拡張ツイートに対応しているものは表示に問題は無し。

![Screenshot_20161028-080729.png](https://qiita-image-store.s3.amazonaws.com/0/89306/e09affa9-96a3-cb0a-fa4a-939cf101e87d.png)
拡張ツイートに対応してないと元のツイートへのリンクが増えて省略されたツイートになる。
これにより拡張ツイートへの対応が迫られる結果に。

![Screenshot_20161028-095553~2.png](https://qiita-image-store.s3.amazonaws.com/0/89306/77c8c476-92ce-5948-2466-dd9614798209.png)
複数人に送ろうが単独に送ろうが140字を'@ID'を含んで140字超えていようと問題ない。
だがこれ複数人に送ったツイートの詳細表示であるが、誰に送ったのかわかりにくすぎてここはぜひとも改善して欲しいところ。

![Screenshot_20161028-102646~2.png](https://qiita-image-store.s3.amazonaws.com/0/89306/10545d8b-ebc4-fed5-7477-719d32b40732.png)
投稿欄に直接'@ID'を付与すると緩和の対象にならないらしい。

##仕様変更されたリプライ表示の公式での扱い方を見て思ったこと
はっきり言うと、なれるまで誰に送ろうとしてるのかわかりにくいと思う。制限が緩和されるというのはとてもいいことだし、色んな人に一斉にリプライを送る人とかは重宝しそう。
なんだけど大体一斉にリプライを送る一通目は相手のIDを直接打ち込むはずなのでこのままでは微妙な印象。
以上、とりあえず色々試した結果でした。

##おまけ
返信先を追加するボタンとかいつの間にか増えてそう・・・
ところで開発者に寄り添う言っておきながら、投票APIとかグループDMAPIとかアクティビティAPIとかの開放まだですがTwitterさん？
VIOS&AIXコマンド対応一覧

##はじめに

IBM PowerSystemでファイバーとか、Etherの仮想化をするときに、VIOS(Virtual IO Server)を利用します。
あんまりさわらないけれど、いざさわるときに困るのが、VIOSのコマンド。
AIXと微妙に違う・・・

AIXとVIOSのコマンド比較表を作ってみました。
AIXのコマンドはある程度わかっている人向けです。

##最強の呪文
VIOS上でAIXのコマンドをそのまま使うときのコマンドです。
$oem_setup_env

これでroot権限でAIXのコマンドが利用できます。
ただし、これを利用しての設定はお勧めされていません。

## コマンド比較

###ディスク周りの確認コマンド
| コマンド概要| AIX | VIOS |
|:--|:--|:--|
| VGの確認  |  lsvg |  lsvg |
| VG内の物理ディスクの確認 |  lsvg -p |  lsvg -pv |
| VG内のLVの確認 | lsvg -l |  lsvg -lv |
| LV内のPVの確認 | lslv -l | lslv -pv |
| LVの作成 | mklv -y *LV名 VG名 LP数* | mklv -lv *LV名 VG名 LP数* |


###デバイス関連コマンド
| コマンド概要| AIX | VIOS |
|:--|:--|:--|
| ディスクの確認 | lspv | lspv |
| デバイスの確認 | lsdev | lsdev |
| デバイスのタイプ別確認 | lsdev -Cc *タイプ* | lsdev -type *タイプ*|
| デバイスの詳細確認 | lsattr -El *デバイス名* | lsdev -dev *デバイス名* -attr |
| デバイスの詳細確認 | lscfg -vl *デバイス名* | lsdev -dev *デバイス名* -vpd |
| デバイスの設定変更 | chdev -l *デバイス名* -a *設定項目*=*値* | chdev -dev *デバイス名* -attr *設定項目*=*値*|
| 仮想デバイスの確認 | N/A | lsdev -virtual |
| 仮想デバイスのマッピング確認 | N/A | lsmap -all|
| 仮想ディスクのマッピング | N/A | mkvdev -vdev *対象ディスク* -vadapter *仮想SCSI* -dev *任意のデバイス名*
| 仮想ファイバーのマッピング | N/A | vfcmap -vadapter *仮想FCアダプター* -fcp *物理FCポート*|


###ネットワークの確認

| コマンド概要| AIX | VIOS |
|:--|:--|:--|
| IPアドレス(名前解決)の確認 | netstat -i | lstcpip |
| IPアドレス(十進数表記)の確認 | netstat -in | lstcpip -num  |
| ルーティングテーブルの表示 | netstat -rn | netstat -routtabel |
| IPの追加 | mktcpip -h *ホスト名* -a *IPアドレス* -i *インターフェース* -m *ネットマスク* -s | mktcpip -hostname *ホスト名* -inetaddr *IPアドレス* –netmask *ネットマスク* -interface *インターフェース* –start |


###エラー確認
| コマンド概要| AIX | VIOS |
|:--|:--|:--|
| エラー表示 | errpt | errlog |
| エラー表示(詳細) | errpt -a | errlog -ls | 
| スナップ取得(一般情報) | snap -g | snap -general |

###smit
| コマンド概要| AIX | VIOS |
|:--|:--|:--|
| smit | smit | cfgassist |

###バージョン確認等
| コマンド概要| AIX | VIOS |
|:--|:--|:--|
|バージョン確認 | oslevel -s | ioslevel |
|ファイルセット確認 | lslpp -l | lssw |

## VIOSのスクリプトを書くときに

ssh等でリモートからVIOSのコマンドをスクリプトで動かす場合、コマンドの前に
ioslevel
もしくは
/usr/ios/cli/ioslevel
が必要です。

例)
$ ssh padmin@vios01 ioscli ioslevel
2.2.4.20
RailsでMaterial Designを使う （Material Design for Bootstrapの使い方）

# Material Design for Bootstrap
- マテリアルデザインをBootstrapで使うためのパッケージです
    - https://github.com/FezVrasta/bootstrap-material-design
# 導入方法
- NPMを用いてインストールします。
```
npm install bootstrap-material-design
```

```
dist/css/bootstrap-material-design.css
dist/css/ripples.min.css
```
上記２つを任意の場所に持って行きます。
ここでは
app/assets/stylesheets/material-design
に入れました。

以下のようにCSSを指定して読み込みます。

```application.css.scss
/*
 *= require_self
 *= require material-design/bootstrap-material-design
 *= require material-design/ripples.min
 *= require style
 */
```

```
material.js
material.min.js
ripples.min.js
```

この３つを
app/assets/javascripts/material-design
に入れます。

そしてapplication.jsに以下を追記します。

```application.js
//= require_tree ./material-design

$(document).on('ready page:load', function() {
    $.material.init();
});
```



# 関連リンク
- RailsでMaterialアイコンを使う (Material Icons for Rails)
    - http://qiita.com/takish/items/9b65f1dcf36cc242357f
nginxを使ったリバースプロキシ on Docker

# はじめに
Dockerを使っていく上でほぼ必須なリバースプロキシを構築します。
今回は素晴らしいコンテナが有ったので1からビルドせずそれを利用させてもらいます。

jwilder/nginx-proxy
https://hub.docker.com/r/jwilder/nginx-proxy/

このコンテナの素晴らしい所は同じネットワーク内にVIRTUAL_HOSTを指定して
コンテナを起動すればそれだけでリバースプロキシしてくれる所です。
confファイルの都度編集は不要です。

# 事前準備

## ディレクトリ構成
私はこんな感じに組みましたが環境に合わせてカスタマイズして下さい。

```
/etc
└docker-compose.d
 ├certs
 │├mydomain.com.crt
 │└mydomain.com.key
 ├proxy
 │└docker-compose.yml
 └service.name
  └docker-compose.yml
```

### certsディレクトリ

certsディレクトリにはSSL証明書を入れます。
mydomain.com.crt、mydomain.com.keyは自社ドメインに合わせてリネームして下さい。
今回はワイルドカード証明書を使うのでドメイン名だけでOKです。
もしサービス毎の証明書を使用する場合は
servicename.mydomain.com.crt
servicename.mydomain.com.key
等で個別に作成して下さい。

### proxyディレクトリ
ここにリバースプロキシ用docker-compose.ymlを作成します。

### その他
proxyディレクトリと同列にサービス用ディレクトリを作成し
docker-compose.ymlをガンガン作っていきます。

## リバースプロキシ

```/etc/docker-compose.d/proxy/docker-compose.yml
version: '2'
# proxy
services:

  proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /etc/docker-compose.d/certs:/etc/nginx/certs
      - /var/run/docker.sock:/tmp/docker.sock:ro
    restart: always

networks:
  default:
    external:
      name: common_link
```

### ポイント
今回サービス毎にdocker-compose.ymlを作成するのでネットワークを指定しています。
サービス用のdocker-compose.ymlと同じネットワークを指定して下さい。

## サービス用(例)

```/etc/docker-compose.d/service.name/docker-compose.yml
version: '2'
# service
services:

  web:
    image: nginx
    container_name: web
    environment:
      VIRTUAL_HOST: web.mydomain.com
    restart: always

networks:
  default:
    external:
      name: common_link
```

## 共通ネットワークの作成
docker-compose.ymlで指定したcommon_linkを作成します。

```sh
docker network create --driver bridge common_link
```

## 動作確認
コンテナを立ち上げる順番はproxyが先でもサービスが先でも大丈夫です。
proxyとサービスをdocker-compose up -dして下さい。
ブラウザから<https://web.mydomain.com>へアクセス出来れば成功です。
証明書が正しく読み込まれていればhttpでアクセスしてもhttpsへリダイレクトされます。
もしhttpでしか繋がらない場合は証明書に問題が有る可能性が高いです。

##追記2017/1/12
このリバースプロキシはデフォルトで100MBまでしかファイル転送できません。
必要が有れば下記の様にDockerfileを作成しビルドして下さい。
下記例では10GBまで拡張しています。

```Dockerfile
FROM jwilder/nginx-proxy
RUN { \
      echo 'server_tokens off;'; \
      echo 'client_max_body_size 100g;'; \
    } > /etc/nginx/conf.d/my_proxy.conf

```

## 最後に
この様な素晴らしいコンテナを提供してくれているjwilderさんに感謝です。
PowerShell で Cognitive Services の呼び出し方

先日 Cogbot 勉強会に行った日に試したメモ
あとでもう少し真面目に書く

```ps1
$EMOTION_API_KEY = '<Your API KEY>'
$URL = 'https://api.projectoxford.ai/emotion/v1.0/recognize'

$image = 'C:\Users\hoge\Desktop\1.jpg'

$result = Invoke-RestMethod `
    -Uri $URL `
    -Method Post `
    -ContentType 'application/octet-stream' `
    -Headers @{'Ocp-Apim-Subscription-Key' = $EMOTION_API_KEY } `
    -InFile $image 

$result | format-list *

faceRectangle : @{height=301; left=773; top=413; width=301}
scores        : @{anger=3.39188122E-10; contempt=6.80944259E-11; disgust=1.14517213E-08; fear=3.75176244E-11; happiness=1.
                0; neutral=8.258468E-10; sadness=2.64461564E-09; surprise=7.739051E-09}

faceRectangle : @{height=260; left=1304; top=502; width=260}
scores        : @{anger=1.08654437E-08; contempt=0.000370971655; disgust=3.1528856E-07; fear=3.752806E-09; happiness=0.990
                0218; neutral=0.009603429; sadness=3.0391775E-06; surprise=4.06609132E-07}
```
Chainerの基本オブジェクトについて〜Chain編〜

前回からChainerの基本オブジェクトについて，私が勉強したことを書いています．
今回はChainオブジェクトについて書いていきます．

#Chain
[前々回](http://qiita.com/moroku0519/items/6b2075b8c6facc36e7da)はfunctionsオブジェクト，[前回](http://qiita.com/moroku0519/items/d648bd2ed3d1001f7f16)はlinksオブジェクトを紹介しましたが，今回のChainオブジェクトはそれらで提供される関数を合成してパラメータの推定を行います．その合成関数こそがモデルを表現しています．

まず，以下の図のような3層からなるニューラルネットワークを考えます．
![Chain.png](https://qiita-image-store.s3.amazonaws.com/0/28622/8a14bc85-9363-5046-f6df-5322164bd06e.png)

第1層から第2層への変換は[linksオブジェクト](http://qiita.com/moroku0519/items/d648bd2ed3d1001f7f16)の際に紹介したように

```math
v = w_1x + b_1　...(1)
```

で表現することができます．（vは第2層時点での変数の状態）
次に，第2層から第3層への変換は

```math
y = w_2v + b_2 ...(2)
```

で表現することができます．
(1)(2)より，第1層から第3層への変換は

```math
y = w_2(w_1x + b_1) + b_2 ...(3)
```

で表すことができます．
しかし，第2層には活性化関数をそれぞれのノードで適応する必要があります．
よって，(3)は

```math
y = w_2δ(w_1x + b_1) + b_2
```

と表現されます．（δは活性化関数）

この関数はfunctionsとlinksの関数で表現することができます．
そのためにChainクラスを用います．

ここではChainクラスを継承したMyChainを使います．

まず，コンストラクタにて層から層への写像をlinksの関数によって列挙します．

```
class MyChain(Chain):
  def __init__(self):
     super(MyClass, self).__init__(
       l1 = L.linear(4, 3),
       l2 = L.linear(3, 3)
     )
```

そして，順方向の計算，すなわち活性化関数の処理をメソッドとして定義します．

```
def forward(self, x):
  return F.sigmoid(self.l1(x)):
```
そして，損失関数（誤差関数）を__call__に書きます．mean_squqred_errorは二乗誤差関数です．

```
def __call__(self, x, y):
  result = self.forward(x)
  loss = F.mean_squared_error(result, y)
  return loss
```

これで誤差の計算まで行うことができます．
今回はここまで．
次回はoptimizersについて書きます．

#参考
新納浩幸
Chainerによる実践深層学習～複雑なNNの実装方法～　オーム社
Pathname#mkdir_p は存在しないので Pathname#mkpath を使いましょう

`FileUtils`で`mkdir_p`をよく使っていたので`Pathname#mkdir`があるなら`Pathname#mkdir_p`もあるだろうと思ったので試してみたら「そんなメソッド無いよ。」と言われてたので調べてみました。

### 対策

`Pathname#mkpath`を使いましょう。以上です。

feature request は2年ほど前にされてますが弾かれてるようですね。

https://bugs.ruby-lang.org/issues/10381
[メモ] virtualbox+vagrantで、buildroot環境

## 概要
- https://buildroot.org/downloads/ をのぞいてみたら、`Vagrantfile`発見。むむむ。
- `buildroot` 身近になりましたね？
- (2017.1) 更新されてますな: 2016.11を使用: `Vagrantfile       2016-12-29 21:46  1.6K` 
- Vagrant + VirtualboxをWindowsにインストールは、こっちを。<br>=> [[メモ] Windowsで、Virtualbox+Vagrant(ヴェイグラント)環境](http://qiita.com/mt08/items/0ffa4059c112379c0c07)

## 環境
- ホストその１: 
    - Windows 10 (1607 - 14393.321)
    - virtualbox 5.0.28
    - vagrant 1.8.5
    - git for Windows 2.10.1.windows.1
- ホストその２:
    - Lubuntu 16.04 (64bit)
    - virtualbox 5.1.8
    - vagrant 1.8.6

## 手順
1. `Vagrantfile`を取得
2. `Vagrantfile`編集(メモリとか、CPUコアとか増やす)

    ```txt:Vagrantfile
...
VM_MEMORY=3072
VM_CORES=3
...
```
3. `vagrant up; vagrant ssh`
 => ゲストにログインしたら、`buildroot`のビルド環境

4. `buildroot`も取得されているので、すぐビルドできる

    ```bash
cd ~/buildroot-2016.08/
# ベースの設定
make raspberrypi2_defconfig    # らずぱい２
#make qemu_x86_defconfig        # qemu-x86とか。
# 設定など
make menuconfig
make uclibc-menuconfig
make busybox-menuconfig
make linux-menuconfig
#
time make
# -jN(並列)はやってはいけないらしいぞ。
```

### Windows 
1. vagrant, virtualboxのインストール
2. git bash をひらく
3. 以下、こぴぺ

    ```bash:適当なとこでbashをひらいてこぴぺ
DIR_WORK=/c/vagrant/buildroot
VAG_VM_MEMORY=3072
VAG_VM_CORES=3
#
mkdir -p ${DIR_WORK}
cd ${DIR_WORK}
powershell -Command "(new-object System.Net.WebClient).DownloadFile('https://buildroot.org/downloads/Vagrantfile','Vagrantfile')"
sed -e "s/VM_MEMORY=2048/VM_MEMORY=${VAG_VM_MEMORY}/g" -e "s/VM_CORES=1/VM_CORES=${VAG_VM_CORES}/g" -i Vagrantfile
vagrant up; vagrant ssh
```


### Linux
1. virtualboxのインストール
https://www.virtualbox.org/wiki/Linux_Downloads

    ```bash
## 
echo 'deb http://download.virtualbox.org/virtualbox/debian xenial contrib' | sudo tee -a /etc/apt/sources.list
wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
sudo apt-get update
sudo apt-get install virtualbox-5.1 -y
#
# ExtensionPack
VBOX_VER=5.1.8-111374
wget http://download.virtualbox.org/virtualbox/5.1.6/Oracle_VM_VirtualBox_Extension_Pack-${VBOX_VER}.vbox-extpack
sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-${VBOX_VER}.vbox-extpack
```

2. vagrant のインストール

    ```bash
VAGRANT_VER=1.8.6
wget https://releases.hashicorp.com/vagrant/${VAGRANT_VER}/vagrant_${VAGRANT_VER}_x86_64.deb
sudo dpkg --install ./vagrant_${VAGRANT_VER}_x86_64.deb
```

3. 以下こぴぺ

    ```bash
mkdir -p $HOME/vagrant/buildroot
cd  $HOME/vagrant/buildroot
wget https://buildroot.org/downloads/Vagrantfile
#vi Vagrantfile
sed -e "s/VM_MEMORY=2048/VM_MEMORY=${VAG_VM_MEMORY}/g" -e "s/VM_CORES=1/VM_CORES=${VAG_VM_CORES}/g" -i Vagrantfile
vagrant up ; vagraant ssh 
```


## 関連
- Qiita [[メモ] Raspberry Pi2 - buildrootで、wifiを使うまで。](http://qiita.com/mt08/items/7f775aba64d82067be04)
diffでファイルの差分のみ表示


qオプション！！

また忘れたので忘れないためにメモ

##コマンド

```
diff -rq ディレクトリ　ディレクトリ
```

##qオプションのhelpの説明

```
Output only whether files differ.
```

-q:ファイル名のみ

-r:ディレクトリを再帰的にたどる
-i:小文字大文字の違いを無視
gitのエラーでcannot do a partial commit during a merge.が出た時の対処法


pushをしようとすると以下のエラーコマンドが出る

```
fatal: cannot do a partial commit during a merge.
```

##対処法
###変更ファイルを

まずはaオプションをつけて行う。

```
git commit -a my_filename
```

それでもダメならiオプション(include)を付けて実行


```
git commit -i my_filename
```


こちらを参考にしました。
http://thomas-cokelaer.info/blog/2015/02/git-error-cannot-do-a-partial-commit-during-a-merge/
python > link > Mid-line comment in Python? > 名前付き引数を使うのがよいと教えていただいた。

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

TensorFlowというDeep Learningのフレームワーク？のコードを学習中。

```py
      summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))
```

上記で気になったのがfeed_dict(False)の「Falseは何か？」というソースリーディングのしにくさ。記憶にたよるコードは減らしたい。

Cの`fd_dct = feed_dict(/* train=*/ False);`のようなコメント形式はpythonでできないだろうか、と思った。

http://stackoverflow.com/questions/5617159/mid-line-comment-in-python
> You are correct, the answer is a big fat NO.
...
> Actually if you break your statement into multiple lines you can.

Mid-line commentはあきらめて、行末コメントにするというのも一案。

<hr>

@shiracamus さんに名前付き引数の使用を提案いただきました。
確かに分かりやすいですね。

情報感謝です。
TensorFlow > link > python / api_docs > 例としてshard5 > tf.cast.md

TensorFlowの学習中。

tf.cast()という構文を理解しようとして検索すると以下を見つけた。

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/api_docs/python/functions_and_classes/shard5/tf.cast.md

このドキュメントが最新版管理されているのかは不明。

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/g3doc/api_docs/python/functions_and_classes

shard0からshard9の分類については未消化。

以下から辿る方法もある。
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/api_docs/python/index.md
技術英語 > Testing is a means of detecting errors. Debugging is [a means] of diagnosing and correcting [the root cause of] errors.

@ Code Complete (No. 16240 / 36077)

> Testing is a means of detecting errors. Debugging is a means of diagnosing and correcting the root cause of errors.

テストとデバッグの違いの説明。

http://ejje.weblio.jp/content/means

http://ejje.weblio.jp/content/root+cause
Wikiをつくる（Optionテーブルの設計について)

[Wikiをつくる（ユーザーの招待機能について） - Qiita](http://qiita.com/toyoshi/items/53a38b7ee58783dd5670)の続き

## 欲しかったもの

サイトのタイトル、説明や何かのフラグなどを簡単に保存しておく方法が欲しかった。
やれることとしては「[config](https://github.com/railsconfig/config)」というgemが近いのだけど、これはYAMLにデータを保存する形式。変更しないデータについては便利なのだけど、アプリ利用者が更新するには向いていない。

使い方としては`Option.site_title`で参照できて、`Option.site_title = "hoge"`などで保存できるようなものがよい。

## 作ったもの

このようなTableはWordpressを参考にさせてもらい下記のようなものを用意した。`key`や`value`はMySQLの予約後なのでoptionというプリフィックスをつけた。

```
  create_table "options", force: :cascade do |t|
    t.string   "option_key",   default: "", null: false
    t.text     "option_value", default: "", null: false
    t.datetime "created_at",                null: false
    t.datetime "updated_at",                null: false
  end
```
	
そして、モデルをこのようにした。`method_missing`で拾う方式だ。
[lokka/option.rb at master · lokka/lokka](https://github.com/lokka/lokka/blob/master/lib/lokka/models/option.rb)でやっているのを参考にRailsで置き換えた。

```
class Option < ApplicationRecord
  def self.method_missing(method, *args)
    attribute = method.to_s
    if attribute =~ /=$/
      column = attribute[0, attribute.size - 1]
      o = self.find_or_initialize_by(option_key: column)
      o.option_value = args.first.to_s
      o.save
    else
      o = self.find_or_initialize_by(option_key: method.to_s)
      o.option_value
    end
  end
end
```

何か弊害がないか心配だった心配だったが特に問題なさそうなのでこのようにした。

次のように意図通り動くようになった

```
[16] pry(main)> Option.foo 
=> ""
[17] pry(main)> Option.foo = 'bar'  #代入してみる
=> "bar" 
[18] pry(main)> Option.foo  #参照できるようになった
=> "bar"
```
docker+pyenv-virtualenv+uwsgi+djangoで既存アプリをデプロイする

# はじめに
当記事はdocker、python、uwsgi、djangoについて、それぞれ単体ならばある程度扱える方を対象にしています。

# 目的

dockerコンテナとして一つのアプリケーションコンテナを作成し、そこに複数のアプリケーションをデプロイしたい。

* アプリケーションごとにpythonのバージョンを切り替えたい
* Dockerfileをほぼフルスクラッチかつなるべく楽にやりたい

# 手法

以下の手法により実現しました。

```階層構造
./
├── Dockerfile
├── data
│   ├── hogehogeapp1
│   │   ├── hogehogeapp1
│   │   │   └──wsgi.py
│   │   ├── data
│   │   ├── db.sqlite3
│   │   └── manage.py
│   ├── hogehogeapp2
│   │   ├── hogehogeapp2
│   │   │   └──wsgi.py
│   │   ├── data
│   │   ├── db.sqlite3
│   │   └── manage.py
│   ├── hogehogeapp1.ini
│   └── hogehogeapp2.ini
└── init.sh
```

```Bash:Dockerfile
FROM ubuntu:xenial #FROM ubuntu-xenial
MAINTAINER erscl

RUN apt-get -y update
RUN apt-get upgrade -yV
RUN apt-get update && apt-get install -y git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev

RUN cd /usr/local &&\
git clone git://github.com/yyuu/pyenv.git ./pyenv &&\
mkdir -p ./pyenv/versions ./pyenv/shims &&\
cd /usr/local/pyenv/plugins/ &&\
git clone git://github.com/yyuu/pyenv-virtualenv.git

RUN echo 'export PYENV_ROOT="/usr/local/pyenv"' | tee -a /etc/profile.d/pyenv.sh
RUN echo 'export PATH="${PYENV_ROOT}/shims:${PYENV_ROOT}/bin:${PATH}"' | tee -a /etc/profile.d/pyenv.sh
RUN export PYENV_ROOT="/usr/local/pyenv" &&\
export PATH="${PYENV_ROOT}/shims:${PYENV_ROOT}/bin:${PATH}" &&\
pyenv install -v 2.7.12 &&\
pyenv install -v 3.5.2 &&\
pyenv virtualenv 2.7.12 uwsgi-2.7 &&\
pyenv global uwsgi-2.7 &&\
pip install django==1.8.* django-bootstrap django-bootstrap-form django-registration uwsgi &&\
pyenv virtualenv 3.5.2 uwsgi-3.5 &&\
pyenv global uwsgi-3.5 &&\
pip install django django-bootstrap django-bootstrap-form uwsgi

RUN groupadd -g 1000 uwsgi && \
    useradd -g uwsgi -m -s /bin/bash uwsgi

RUN mkdir -p /var/log/uwsgi && chown uwsgi /var/log/uwsgi

RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

COPY init.sh /opt/init.sh

EXPOSE 8801 8802

CMD ["/bin/bash","/opt/init.sh"]
```
```Bash:init.sh
source /etc/profile.d/pyenv.sh
sudo -u uwsgi /usr/local/pyenv/versions/uwsgi-2.7/bin/uwsgi --ini /opt/data/hogehogeapp1.ini
sudo -u uwsgi /usr/local/pyenv/versions/uwsgi-3.5/bin/uwsgi --ini /opt/data/hogehogeapp2.ini
tail -f /dev/null
```

```data/hogehogeapp1.ini
[uwsgi]
http=x1.x2.x3.x4:8801
chdir=/opt/data/hogehogeapp1
wsgi-file=/opt/data/hogehogeapp1/hogehogeapp1/wsgi.py
module=hogehogeapp.wsgi:application
master=True
pidfile=/var/run/hogehogeapp1.pid
vacuum=True
max-requests=5000
daemonize=/var/log/uwsgi/hogehogeapp1.log
```

```data/hogehogeapp2.ini
[uwsgi]
http=x1.x2.x3.x4:8802
chdir=/opt/data/hogehogeapp2
wsgi-file=/opt/data/hogehogeapp2/hogehogeapp2/wsgi.py
module=hogehogeapp.wsgi:application
master=True
pidfile=/var/run/hogehogeapp2.pid
vacuum=True
max-requests=5000
daemonize=/var/log/uwsgi/hogehogeapp2.log
```
コンテナの起動時に `--volume /abs_path/data:/opt/data` を追加し、起動します