OmniAICreator/Qiita-1.07M huggingface dataset:
GMO ALTUSでCentOS 7.2 64bit with Plesk12.5にデータディスクを追加＋FTP接続できるようにする

今後この作業を何回かすることになりそうなのでメモ。

# 前提
* ALTUSの利用登録などは完了している
* Plesk利用ができるのはBasicのみなのでBasicでサーバ作成
* 必要なリソースなどはすでに購入済み
* テンプレからCentOS 7.2 64bit with Plesk12.5でサーバの作成は完了している
* 追加するデータディスクのアタッチまでは終わっている

# アタッチした追加データディスクをマウントする
公式でPlesk利用OSへのマウント方法が載っているのはCentOS 6の場合のみ。
【Pleskテンプレート利用時のディスクマウント】
https://support.gmocloud.com/pf/guide/basic/useful/plesk.html

公式に問い合わせたところ、以下の方法で可能とのこと。
__※自己責任でお願いします。__
基本的には上記リンクに記載されているCentOS 6での作業と同じだが

* CentOS 7のISOインストールはサポートされていないのでISOリストにない
* レスキューモードの起動方法がCentOS 6とは異なる
この2点に対応する必要がある

## 手順
１. まずはCentOS 7のISOのリンクをメモしておく
２.  ALTUS BasicのコンソールからCentOS 7のISOを追加([公式ページ](https://support.gmocloud.com/pf/guide/basic/console/template_iso.html))
３.  マウント手順公式ページのSTEP1①～⑤までを行う
４.  ⑥の部分で以下操作(レスキューモードでの起動)を行う

```
1.
コンソールにてアクセス時

 CentOS 7

Install CentOS 7
Test this media & install CentOS 7

Troubleshooting

の選択画面で「Troubleshooting」を選択

次の画面で
「Rescue a CentOS system」を選択
--------------------------------------------------------
2.
Rescue メニュー内で

数字1とEnterで「1) Continue 」を選択
--------------------------------------------------------
3.
Rescue Mountメニュー内で

Enterキーでプロンプトに遷移
```

５. STEP2以降は公式ページ通りでOK  


# FTPクライアントから接続できるようにする
Pleskの管理画面からFTPアクセスでユーザの設定を行っただけではアクセスできなかったのでPASV接続できるよう設定を追加

*  ALTUS設定管理画面のファイアウォールで適用しているセキュリティグループにPASV接続用のハイポート`50000-50050`を追加
* コンソールから`/etc/proftpd.conf`に以下を追記

```
PassivePorts 50000　50050
```

__ファイアウォールと`/etc/proftpd.conf`の記述がそろっていればポート番号は任意__
【UE4】マテリアルノードのifについて

UE4のマテリアル内で使用されるif表現式が個人的には少し直感的では無く、初見で少し迷った覚えがあるので備忘録として把握している内容をメモ。

-------------------------------------------------------------------------------

[【Math 表現式】ifについて](https://docs.unrealengine.com/latest/JPN/Engine/Rendering/Materials/ExpressionReference/Math/index.html#if)

挙動としては、予め比較結果に応じて渡す値を「(A > B)」「(A == B)」「(A < B)」の3つの入力ピンより指定しておき、AとBが比較される際に、その結果に応じて各ピンに入力している値が出力ピンより渡されるイメージ。
  
例えば下記の様にA = 5, B = 3で比較した場合は、A > Bが成立するので(A > B)ピンに入れている値「1,0,0」が出力ピンより渡される。

![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/80207/8384e8ba-bb48-235c-f7d2-970239083db0.png)


また、別の例を挙げるとA = 0, B = 2で比較した場合には、A < Bが成立するので(A < B)ピンに入れている値「0,1,0」が出力ピンより渡される。

![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/80207/125a3de8-6804-3489-20d4-898ddb365d71.png)


-------------------------------------------------------------------------------

プログラミング言語っぽく書くと下記の様なイメージになるかと思われる。
→return で返される値が出力ピンより渡される値

```cpp
if(A > B)
{
    return /* (A > B)の入力ピンに入れた値 */
}
else if(A == B)
{
    return /* (A == B)の入力ピンに入れた値 */
}
else if(A < B)
{
    return /* (A < B)の入力ピンに入れた値 */
}
```


なお、(A == B)が未指定の場合は(A > B)が(A >= B)の扱いになる模様

```cpp
if(A >= B)
{
    return /* (A > B)の入力ピンのに入れた値 */
}
else if(A < B)
{
    return /* (A < B)の入力ピンに入れた値 */
}
```

![sample3.png](https://qiita-image-store.s3.amazonaws.com/0/80207/e1a0f28c-258e-ca0e-5176-26818d0c0b20.png)
cookie、session、webStorageについてまとめ

# cookieとは
- 有効期限を指定できる
- 容量すくない、４KB
- 別々のタブで開いていても情報は共有される
    - **Q.前回みた商品の情報が広告で上がってくるのってここに入っている情報をみてるのか**


- アプリケーション側ではリクエストヘッダに入っている

> Cookieを受け取ったあとでも、Cookieを受け取ったサーバとは異なるWebサーバに対してはCookieを送らない。(意図しない情報がほかのWebサーバーに送られるのを防ぐ)


## session
- javascriptから操作することはできない

# web storageとは
- cookieよりも保存できる容量が多い
- keyとvalueで値を保持
- 2種類ある
    - sessionStorage
        - ウィンドウやタブ単位で開いている間のみ保持されるデータ
        - 別windowで開いていても共有されない
            - **Q.ログイン系の状態はここではないのね、じゃぁどこにはいってるの？**
    - localstorage
        - オリジン単位でデータを永続的に保存するストレージ
        - **別windowでも共有される**
        - ブラウザを閉じても**消えない**


>localStorageでは、ローカル環境に5MBまでのデータを永続的に保存でき、 ユーザーのアクセスの度にデータがサーバーに送信されることがありません。 ウェブメールの例で言えば、localStorageなら送受信データをローカル環境に保存でき、 オフラインウェブアプリケーションと組み合わせることで、オフラインでのメール閲覧なども可能となるでしょう。

**Q,gmailはインターネットが切れてもメールを見ることができるのはローカルストレージに情報をためているからか?**


## web storageに対してできること
- 取得
- セット
- 削除
- 全部削除

## web storageのイベント
データの追加、上書き、削除、全部削除を行うとstorageイベントが発火するそう
そのときにとれる情報が
- key:更新されたkey名
- oldValue:古いvalue
- newValue:新しいvalue
- url: keyが更新された文書のURL
- storageArea：更新によって影響を受けたStorageオブジェクト

最後の2つが不明。


## web storageのまとめ
- 1オリジン ５MBと情報が多い
- keyとvalueで値を持てる
- sessionStorageはタブやウィンドウ毎に違う情報持てる
- localStorageはオリジン単位で永続的に情報を持てる

これよりsessionStorageは会員登録STEP1~3のように段階的に情報を入力するなど、限定的な状態の持ち回しを行う場面での活躍ができる。こういった場合は別のタブやwindowへ影響を及ぼすべきでないため。

**Q,セキュリティ的にはこのように扱うことによる問題はあるのか？**

localStorageは、オリジン単位でデータを永続的に保持することができる、ので思いつくのはeコマースの「カート」機能だった。
カートに入れっぱなしにしておいて購入したらlocalstorageの値を消すという風にできるか。
ただそれだと、ログインアカウントを変更しても同じ情報が入ってしまうか。
gmailだけなのか？もっと身近に使われる場面に遭遇するんじゃないか？
**Q,localStorageはどのような場面で使われているのか？**







# オリジンとは
プロトコル://ドメイン:ポートのこと

**Q,CORS クロスオリジンリソースシェアリングってなんだ**





# 参考
- [WebStorageとは](http://www.htmq.com/webstorage/)
- [javascriptでセッション？HTML5 SessionStorageの使い方](http://wp.tech-style.info/archives/787)
pandasのDataFrameの複数列を同時にastypeで型変換

知っている人にとっては常識だったのだろうが、`.astype()`の引数は辞書で指定できる。

```python
from numpy.random import rand
from pandas import DataFrame

df = DataFrame(rand(3, 3), columns=[list('abc')])
df.dtypes
```

```
a    float64
b    float64
c    float64
dtype: object
```

```python
print(df.astype({'a': int, 'c': str}))
```

```
   a         b                 c
0  0  0.692601   0.0963216888725
1  0  0.873724  0.00960078591002
2  0  0.536855    0.639548536613
```

```python
print(df.astype({'a': int, 'c': str}).dtypes)
```

```
a      int64
b    float64
c     object
dtype: object
```
ChainerのLinkのパラメータ数を求める

`Link.params()` を使う．

```py3
>>> import chainer.links as L
>>> model = L.Linear(3, 4)
>>> model.W.data.size
12
>>> model.b.data.size
4
>>> sum(p.data.size for p in model.params())
16
```

`chainer.Chain` でもいける．

```py3
>>> import chainer
>>> model = chainer.Chain(a=L.Linear(3, 4), b=L.Linear(2, 3))
>>> sum(p.data.size for p in model.params())
25
```
Apexバッチ

####バッチクラス
バッチ用インターフェースを継承する
 
```java
global class XxxBatch 
  implements Database.Batchable<sObject>, Database.Stateful {
//Database.Statefulを付けると、Batchクラスのインスタンス変数(またはプロパティ)の値がトランザクション内（start -> execute -> finish）で引き継がれるようになる
//付けない場合はインスタンス変数は呼出し毎に初期化されることに注意（クラス変数も同じ扱い）

//この形式の場合は Iterable start()メソッドの実装が必要となる。sObjectレコード以外でバッチ処理を使う場合はこちら
global class XxxBatch 
  implements Database.Batchable<XXX__c>, Database.Stateful {

```

所定のインターフェースを実装する

```java
/*
 * バッチ処理開始時に最初に呼び出される
 * バッチ処理対象のレコードを返却するQueryLocatorを返す
 */ 
global Database.QueryLocator start(Database.BatchableContext bc) {
    String query = 'SELECT ** FROM XX';
    return Database.getQueryLocator(query);
}

/*
 * バッチ処理の終了時に呼び出される
 * 終了処理を実装する
 */
global void finish(Database.BatchableContext bc) {
    ....
}

/*
 * バッチサイズで指定されたレコード数単位で executeが呼び出される
 *  targetRecords: 対象となるレコード
 */
global void execute(Database.BatchableContext bc, List<sObject> targetRecords) {
    ....
}

```
<font color="red">execute()メソッドからExceptionが投げられるとトランザクションがロールバックされる。メールを投げる処理も内部的にはトランザクション管理されているので、結果的にメールが飛ばないことに注意（エラー時にメールを投げるような実装をする場合はtry-catchで例外を掴まえてExceptionを投げないようにする必要がある）</font>

####スケジューラクラス
スケジュールの設定は[設定] - [開発] - [Apexクラス] or コマンド実行で。 

```java
public class DailyBatchScheduler implements Schedulable {
    private final Integer BATCH_SIZE = 200;
  
    public void execute(SchedulableContext ctx) {
        DailyBatch b = new DailyBatch();
        Database.executeBatch(b, BATCH_SIZE);
    }
}
```

####Apexからのバッチ実行
```java 
Xxx batch = new XxxBatch();
Database.executeBatch(batch, 500);  //バッチサイズは500レコード

```

####物理的にレコードを削除
```java
//データをハードデリートする方法
  delete scope;   
  Database.emptyRecycleBin(scope); 
```
AWS EC2 のバーストパフォーマンスインスタンスのバースト時の性能の試算方法

t2.xlarge はベースライン90%で vCPU 4 だから4.4倍のバースト、t2.2xlarge はベースライン135%で vCPU 8 だから、5.9倍のバーストとなる。
参考： http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/t2-instances.html#t2-instance-limits
Stringの長さを指定するMaxLength/StringLength属性はどう違うのか

DBに入れたタイミングでチェックする(MaxLength)か、ユーザが画面から入力した際にチェックする(StringLength)か、の違い。

> MaxLength is used for the Entity Framework to decide how large to make a string value field when it creates the database.
> From MSDN:
>> Specifies the maximum length of array or string data allowed in a property.
>
> StringLength is a data annotation that will be used for validation of user input.
> From MSDN:
> > Specifies the minimum and maximum length of characters that are allowed in a data field.
>
> [StringLength vs MaxLength attributes ASP.NET MVC with Entity Framework EF Code First](http://stackoverflow.com/questions/5717033/stringlength-vs-maxlength-attributes-asp-net-mvc-with-entity-framework-ef-code-f)
> 

最小入力値のチェックはMaxLength属性はMinLength属性にて、StringLength属性はMinimumLengthプロパティで設定。

<pre><code class="c">
        [MaxLength(100)]
        [MinLength(5)]
        [StringLength(100,MinimumLength =5)]
        public string updateByName { get; set; }
</code></pre>

ErrorMessageの変数は以下の通り。
- {0} = Property Name
- {1} = Max Length
- {2} = Min Length

StringLength vs MaxLength attributes ASP.NET MVC with Entity Framework EF Code First - Stack Overflow
http://stackoverflow.com/questions/5717033/stringlength-vs-maxlength-attributes-asp-net-mvc-with-entity-framework-ef-code-f
userAgent


```javascript:UA.js
//w3g.jp/blog/js_browser_sniffing2015

export default class {

  constructor(opts={}) {

    this.HTML = document.documentElement;
    this.BODY = document.body;

    this._initSetting();

  }

  get() {

    const ua = window.navigator.userAgent.toLowerCase();
    const ver = window.navigator.appVersion.toLowerCase();

    const isMSIE = (ua.indexOf('msie') != -1) && (ua.indexOf('opera') == -1);
    const isIE11 = (ua.indexOf('trident/7') != -1);

    return {
      Tablet:(ua.indexOf("windows") != -1 && ua.indexOf("touch") != -1 && ua.indexOf("tablet pc") == -1)
      || ua.indexOf("ipad") != -1
      || (ua.indexOf("android") != -1 && ua.indexOf("mobile") == -1)
      || (ua.indexOf("firefox") != -1 && ua.indexOf("tablet") != -1)
      || ua.indexOf("kindle") != -1
      || ua.indexOf("silk") != -1
      || ua.indexOf("playbook") != -1,
      Mobile:(ua.indexOf("windows") != -1 && ua.indexOf("phone") != -1)
      || ua.indexOf("iphone") != -1
      || ua.indexOf("ipod") != -1
      || (ua.indexOf("android") != -1 && ua.indexOf("mobile") != -1)
      || (ua.indexOf("firefox") != -1 && ua.indexOf("mobile") != -1)
      || ua.indexOf("blackberry") != -1,
      iOS: (ua.indexOf("iphone") != -1) || (ua.indexOf("ipod") != -1) || (ua.indexOf("ipad") != -1),
      iPad: ua.indexOf("ipad") != -1,
      iPhone: ua.indexOf("iphone") != -1,
      Android: ua.indexOf("android") != -1,
      MSIE : isMSIE, // IE11以外
      IE6 : isMSIE && (ver.indexOf('msie 6.') != -1),
      IE7 : isMSIE && (ver.indexOf('msie 7.') != -1),
      IE8 : isMSIE && (ver.indexOf('msie 8.') != -1),
      IE9 : isMSIE && (ver.indexOf('msie 9.') != -1),
      IE10 : isMSIE && (ver.indexOf('msie 10.') != -1),
      IE11 : isIE11,
      IE : isMSIE || isIE11,
      Edge : (ua.indexOf('edge') != -1),
      Chrome : (ua.indexOf('chrome') != -1) && (ua.indexOf('edge') == -1),
      Firefox : (ua.indexOf('firefox') != -1),
      Safari : (ua.indexOf('safari') != -1) && (ua.indexOf('chrome') == -1),
      Opera : (ua.indexOf('opera') != -1)
    }

  }

  _initSetting() {

    const _ua  = this.get();

    if (_ua.Mobile) {
      this.HTML.setAttribute('data-env', 'sp');
    } else if (_ua.Tablet) {
      this.HTML.setAttribute('data-env', 'tablet');
    } else {
      this.HTML.setAttribute('data-env', 'pc');
    }

    if (_ua.iPad) this.HTML.setAttribute('data-device', 'ipad');
    if (_ua.iPhone) this.HTML.setAttribute('data-device', 'iphone');
    if (_ua.Android) this.HTML.setAttribute('data-device', 'android');

    if (_ua.IE) this.HTML.setAttribute('data-browser', 'ie');
    if (_ua.Edge) this.HTML.setAttribute('data-browser', 'edge');
    if (_ua.Chrome) this.HTML.setAttribute('data-browser', 'chrome');
    if (_ua.Firefox) this.HTML.setAttribute('data-browser', 'firefox');
    if (_ua.Safari) this.HTML.setAttribute('data-browser', 'safari');
    if (_ua.Opera) this.HTML.setAttribute('data-browser', 'opera');

  }

}
```
BLS署名の紹介と実装

# 初めに
今回はペアリングを用いたBLS署名を紹介して実装します。
この署名はTLSなどでよく使われる楕円曲線を用いた署名ECDSAと違って秘密分散と相性がよく、いろいろ面白いことができます。

# BLS署名
BLS署名はBoneh, Lynn, Shachamが提案したペアリングを使った署名です。

## 記号の準備
まずアルゴリズムに必要な記号を用意します。
rを素数とし、r個の要素からなる巡回群G1, G2, GTと

```math
e : G_1 \times G_2 \rightarrow G_T
```

というペアリングを考えます。ペアリングについては[ペアリングの双線形性をmclを用いて確認する](http://qiita.com/herumi/items/1575ad08e13af5dc9da7)や『[クラウドを支えるこれからの暗号技術](https://www.amazon.co.jp/gp/product/479804413X)』を参照してください。

そして文字列からG1へのハッシュ関数H : {文字列} → G1とG2の点Qを一つ固定し、みなで共有します。準備はこれで終わりです。

## BLS署名のアルゴリズム

1. 鍵生成 : 0以上r未満の乱数sを一つ取り秘密鍵とします。公開鍵はsQです。
2. 署名 : メッセージmに対してそのハッシュ値H(m)をとり、秘密鍵s倍して署名s H(m)を作ります。
3. 検証 : メッセージmと署名σをもらった人は自分でハッシュ値H(m)を計算し公開鍵sQを使って

```math
e(σ, Q) = e(H(m), sQ) 
```

が成り立つかどうかを確認します。成立するなら署名は正しく、そうでなければ不正です。

σが正しい署名のときはσ = s H(m)ですから、ペアリングの双線形性$e(aP, bQ)=e(P,Q)^{ab}$から

```math
e(σ, Q) = e(s H(m), Q) = e(H(m), Q)^s = e(H(m), sQ)
```
となり等号が成り立ちます。
適切なパラメータの元では、秘密鍵sを知らない第三者がs H(m)を作れないと考えられています。

意外とシンプルなアルゴリズムなことに驚かれたでしょうか。これだけで署名になるのはちょっと不思議ですね。なんと署名時に乱数を使いません。確定的な署名アルゴリズムです。

# BLS署名の実装
[mcl](https://github.com/herumi/mcl)を使ってBLS署名を試してみましょう。

## 初期化
G2の点Qを固定します。[G1, G2の点P, Qの設定](http://qiita.com/herumi/items/1575ad08e13af5dc9da7#g1-g2%E3%81%AE%E7%82%B9p-q%E3%81%AE%E8%A8%AD%E5%AE%9A)と同じでもよいですが今回は違う方法でQを決めました。

```C++
bn256init();
G2 Q;
BN::mapToG2(Q, 1);
```

`BN::mapToG2`は0でない適当な整数をG2の元に割り当てるハッシュ関数です。決定的なので毎回同じ値になります。アルゴリズムは[Indifferentiable Hashing to. Barreto–Naehrig Curves](https://www.di.ens.fr/~fouque/pub/latincrypt12.pdf)を用いています。

## 鍵生成

0以上r未満の整数をランダムに選んで秘密鍵とします。乱数は暗号論的擬似乱数でなければなりません。C++11以降なら`std::random_device`を使います。ただし規格的にはこの値が非決定的とは限らないので注意が必要です。

```C++
std::random_device rd;
Fr s;
s.setRand(rd);
```

`Fr::setRand`に乱数生成のインスタンスを渡すとそれを使って乱数を設定します。
公開鍵pubはQをs倍したものです。

```C++
G2 pub;
G2::mul(pub, Q, s); // pub = sQ
```

## 署名
まず文字列からG1へのハッシュ関数H : {文字列} → G1を作ります。
メッセージmのハッシュをとってFpの元を作り、それをもとに`BN::mapToG1`を使っ
てG1の元を作ります。

```C++
void Hash(G1& P, const std::string& m)
{
    Fp t;
    t.setMsg(m);
    BN::mapToG1(P, t);
}

```

この関数を使って署名します。

```C++
G1 Hm;
Hash(Hm, m);
G1::mul(sign, Hm, s); // sign = s H(m)
```

## 検証
最後にVerify関数を作りましょう。
公開鍵(Q, sQ = pub)と署名signとメッセージmから二つのペアリングを作り同じかどうかをみます。

```C++
bool Verify(const G1& sign, const G2& Q, const G2& pub, const std::string& m)
{
    Fp12 e1, e2;
    G1 Hm;
    Hash(Hm, m);
    BN::pairing(e1, sign, Q); // e1 = e(sign, Q)
    BN::pairing(e2, Hm, pub); // e2 = e(Hm, sQ)
    return e1 == e2;
}
```

全部を行うサンプルは[bin/bls_sig.cpp](https://github.com/herumi/mcl/blob/master/sample/bls_sig.cpp)にあります。Linuxならmclのディレクトリで

```
make bin/bls_sig.exe
```

とすればビルドされます。

# まとめと次回

今回はBLS署名の基本を紹介しました。

BLS署名はペアリングとハッシュ関数を除けば○○倍するという操作しかない実に簡単なアルゴリズムです。したがって容易に秘密分散と組み合わせられます。

そうすると、たとえば秘密鍵を100人に分散して配布し、それぞれが署名したものが50個集まれば、元の署名が復元できるといったことができます。
これはブロックチェーン系の多数決と相性がよいのでいろいろ面白いことができそうです。そのあたりについては次回（か次々回）紹介しましょう。
Azureのリモートデスクトップで指定するドメインはどれ？

Azureへ会社のPCからログインしようとしたらはじかれた。
どうやらドメインとログインユーザが会社のやつになってしまっている。

・・・Azureのドメインってなんだ？

と思ったのでやり方をメモ

**１．Azureのポータル画面で「Azure Active Directory」を選択**
![ディレクトリ１.png](https://qiita-image-store.s3.amazonaws.com/0/143913/be1bcbdf-5779-809c-fddf-9934e0c7aa68.png)

**２．左側のメニューから「ドメイン名」を選択**
![ディレクトリ2.png](https://qiita-image-store.s3.amazonaws.com/0/143913/996013fe-a44e-10a7-f467-ba13c8529652.png)

**３．ドメイン名が表示されるので、これを使ってログインする**
![ディレクトリ3.png](https://qiita-image-store.s3.amazonaws.com/0/143913/717377d2-6ec9-334b-9a4c-b3ad901a8136.png)


**リモートデスクトップでドメインはどう変更する？**
ユーザ名のところで、「ドメイン名\ユーザ名」でＯＫ
Cisco IOSでコマンド実行ログを出力して検証を楽にする

Ansibleなどの構成ツールや自動化ツールでネットワーク機器を操作するケースも増えてきました。Cisco IOS装置（ルータやスイッチ）上でのコマンド実行を自動化する検証やテストの際、実行された一連のコマンドを出力する設定をあらかじめIOSで行っておくと便利です。ただし、変更を伴うExecコマンドに対して有効ですが、showコマンドなどの状態確認やpingなどの実行コマンドについては対象外となります。

```cisco:cisco
Router#show run | section archive
archive
 log config
  logging enable
  logging size 1000
  notify syslog contenttype plaintext
  hidekeys
Rotuer#
```

例えば、Ansibleで、以下のようなPlaybookを実行する場合。

```yaml:playbook
  tasks:

    - name: Configure extended ACL to device
      ios_config:
        provider: "{{ cli }}"
        lines:
          - 10 permit ip host 1.1.1.1 any log
          - 20 permit ip host 2.2.2.2 any log
        parents: ip access-list extended test-ansible
        before: no ip access-list extended test-ansible
        match: exact
        timeout: 30
      register: result
```

Cisco Router上では以下のように出力されるので、コマンドが実行されたログがリアルタイムに確認できて便利です。

```cisco:cisco
Router#
Feb 15 03:11:31.828: %PARSER-5-CFGLOG_LOGGEDCMD: User:cisco  logged command:!exec: enable
Feb 15 03:11:32.352: %PARSER-5-CFGLOG_LOGGEDCMD: User:cisco  logged command:no ip access-list extended test-ansible
Feb 15 03:11:32.445: %PARSER-5-CFGLOG_LOGGEDCMD: User:cisco  logged command:ip access-list extended test-ansible
Feb 15 03:11:32.521: %PARSER-5-CFGLOG_LOGGEDCMD: User:cisco  logged command:10 permit ip host 1.1.1.1 any log 
Feb 15 03:11:32.592: %PARSER-5-CFGLOG_LOGGEDCMD: User:cisco  logged command
Router#:20 permit ip host 2.2.2.2 any log 
Feb 15 03:11:32.627: %SYS-5-CONFIG_I: Configured from console by cisco on vty1 (10.70.233.120)
Router#
```

※Cisco IOSのArchiveセクションでは、他にも便利なオプションがあります。

```cisco:cisco
Router(config-archive)#?
Archive configuration commands:
  default       Set a command to its defaults
  exit          Exit from archive configuration mode
  log           Logging commands
  maximum       maximum number of backup copies
  no            Negate a command or set its defaults
  path          path for backups
  rollback      Rollback parameters
  time-period   Period of time in minutes to automatically archive the
                running-config
  write-memory  Enable automatic backup generation during write memory

Router(config-archive)#log config 
Router(config-archive-log-cfg)#?
commands for controlling config logging:
  default   Set a command to its defaults
  exit      Exit from the log config submode
  hidekeys  suppress output (e.g. passwords) when displaying logged commands
  logging   Modify config logging parameters
  no        Negate a command or set its defaults
  notify    Send logged commands to target applications
  record    What to record in the config logger
```
Power BI (Web)で自動更新する

PowerBIのレポートを共有して、各種データの最新状況を把握するために、いくつか方法があります。

各サブスクリプションレベルで利用できる更新方法は[PowerBIのドキュメント](https://powerbi.microsoft.com/ja-jp/documentation/powerbi-refresh-data/)に明記されています。

## Importの場合

Importの場合はデータセットの設定から行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/92d312d7-3101-74dd-a909-49d5aac9bbda.png)

設定したいデータセットを選び、「データを最新の状態に保つ」をオンにします。頻度と、時刻を設定して終わりです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/fb8ae810-4487-c5bd-e500-15ccfec495ea.png)

ちなみに、時刻を最大８つ設定できるので、最速で3時間おきのリフレッシュが可能です。これ以上の頻度を求める場合はDirectQueryなどを用いることになります。

## DirectQueryの場合

DirectQueryの場合は、この設定は必要ありません。

[Power BI Forums](https://community.powerbi.com/t5/Service/Direct-Query-Browser-Refresh/m-p/87268/highlight/true#M15388)に報告があるように、実際には即時のリフレッシュはなされず15分おき（実際には２０分程度になっている）のタイルリフレッシュが行われます。

実際の更新ログがこちらです。おなじデータセットの設定から見れます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/e529ad2f-0ed0-b086-6eb6-668eece7bb55.png)

## Live Connectの場合
Direct Queryと混同しがちですが、Live Connectというモードがあります。これはSSASなどの分析サービスへ直接つなぎ、その結果をビューするだけのモードということになります。実質的にDirect Queryと同じかもしれませんが。

## On premise データの場合

ローカルのCSVファイルやSQL Serverなどの場合は、[オンプレミスデータゲートウェイ](https://powerbi.microsoft.com/ja-jp/documentation/powerbi-gateway-onprem/)をインストールすれば解決します。

## Stream の場合
いくつか直接ストリームを流し込む方法があります。

### Stream Analytics から流す
[Steam Analytics](https://azure.microsoft.com/ja-jp/services/stream-analytics/)は、Azureの分析系サービスの機関サービスで、EventHub等のコネクターからイベントを受け取り簡単なSQLによるフィルタをかけて、各種シンクに流すためのストリーム環境です。Apache Stormと比較されたりしますが、もっと自由度の低い簡易なものです。この出力としてPowerBIを直接指定できます。


### PUB NUB / REST API

[Power BIでより簡単にリアルタイムデータを扱う](http://memo.tyoshida.me/office-365/power-bi-realtime-easier-than-ever/)などに詳しいですが、PUBNUBからのストリームや、REST APIを直接公開しアプリケーションから直接PowerBIへイベントを放り込むことが可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/d9da2877-77d1-fe50-e1a3-30172f7f0b4d.png)
Django で、バッチ(コマンド)結果をHTMLで逐次表示する

(PHPでいう、output_buffering を切った感じです)

StreamingHttpResponse を使います。

StreamingHttpResponse の第一引数はジェネレータなので、バッチをジェネレータで書きます。

今回の例は、シェルコマンドをジェネレータにしています。


```python
import subprocess

from django.http import StreamingHttpResponse
from django.utils.encoding import smart_str
from django.utils.html import escape
from django.views import View


def run_process_as_generator(*args, **kwargs):
    """
    サブプロセス結果をジェネレータで返す
    :rtype: generator
    """
    kwargs.setdefault('stdout', subprocess.PIPE)
    kwargs.setdefault('stderr', subprocess.STDOUT)

    popen = subprocess.Popen(*args, **kwargs)

    while True:
        line = popen.stdout.readline()
        if line:
            yield line

        if not line and popen.poll() is not None:
            break


def linebreaksbr(gen):
    """
    ジェネレータの各行に<br />をつける
    念のため smart_str
    :type gen: generator
    :rtype: generator
    """
    for line in gen:
        yield '{}<br />\n'.format(escape(smart_str(line)))


def task():
    """
    バッチを実行
    :rtype: generator
    """
    return linebreaksbr(
        run_process_as_generator(
            "for i in {1..10}; do sleep 1s; echo ${i}; done",
            shell=True
        ))


class SlowCommandView(View):
    """
    task() の結果を少しずつブラウザに返すビュー
    """
    def get(self, request, *args, **kwargs):
        response = StreamingHttpResponse(
            task(),
            content_type="text/html; charset=utf-8")

        return response
```

Python でバッチを書く場合は、print でログを書くかわりに yield を使うと良いと思います。

```python
def task():
    yield 'start'
    ...
    yield 'phase-1'
    ...
    for xx in xxx:
         yield xx
    yield 'end'
```

参考:
[Pythonのsubprocessで標準出力をリアルタイムに取得する - Qiita](http://qiita.com/megmogmog1965/items/5f95b35539ed6b3cfa17)

[Request and response objects | Django documentation | Django](https://docs.djangoproject.com/en/1.10/ref/request-response/#django.http.StreamingHttpResponse)
LaravelとMovable Typeを共存させる

### 環境

* Laravel 5.3
* PHP 5.6.12
* Postgresql 9.5.4
* mysql 5.1.73
* MovableType 6.3.2

LaravelやMovableTypeの導入に必要なドライバー等のインストールは既に完了しているものとする。

### 何がしたいか

* 既にLaravelでふつうにサイト構築しているものとする。
* http://example.com/ にアクセスすれば、welcome画面が表示されるとかそういうイメージ。
* ここで、http://example.com/cms にアクセスすれば、Movable Typeのログイン画面が表示され、あとはMTの管理画面でどうこうできるとかそんな感じ

### 考え方

Laravelはpublicの中にあるディレクトリは特にルーティングしなくても読み込んでくれる。
publicの中にcmsというディレクトリを作り、index.htmlを置いて、
http://example.com/cms/index.html にアクセスすれば、そのHTMLファイルが表示される。
ならば、このcmsというディレクトリをシンボリックリンクにして、MTのファイルを読み込むようにすればMTが動くのでは、と考えた。で、出来ました。

### ディレクトリ構造

```
/var/www/program <- Laravel
/var/www/cgi-bin/mt <- MovableType
```

ドキュメントルートは /var/www/program/public

### 導入

###### シンボリックリンク作成

root権限で行ってください

```
ln -s /var/www/cgi-bin/mt /var/www/program/public/cms
```

まずはこの状態で http://example.com/cms/index.html にアクセスしてみる。
/var/www/cgi-bin/mt/index.html が読み込まれて、MTのログイン画面が表示されるはず。

次に、 http://example.com/cms にアクセスしてみると、
今度はLaravelの404エラーが出るはず。
これは /cms にアクセスした時にindex.htmlを読み込む設定をしていないため。
なので、Laravelのルーティングでindex.htmlを読み込むように設定する。

###### ルーティング

```
Route::get('/cms', function() { include public_path() . '/cms/index.html'; });
```

これで http://example.com/cms にアクセスしたらMTのログイン画面が表示されるはず。

###### パーミッション付与

MTがmysqlとかの設定をウィザードでちゃんとできるようにするために、書き込み権限を付与。
また、htmlを吐き出す場所も書き込めるようにする。

```
chown -R apache:apache /var/www/cgi-bin/mt/
chown -R apache:apache /var/www/program/public/test/
```

###### データベース作成

```
mysql -u root -p
CREATE DATABASE mt_test;
GRANT ALL PRIVILEGES ON mt_test.* to mt_test@localhost IDENTIFIED BY 'mt_test';
```

###### ウィザード実行

ここまでできたら後はMovable Typeのセットアップウィザードに従い、適切な情報を入力していく。

パス情報は次のような感じに

ウェブサイトURL：http://example.com/test/

ウェブサイトパス：/var/www/program/public/test

筆者が設定した情報(mt-config.cgi)はこんな感じ

```
#======== REQUIRED SETTINGS ==========

CGIPath        /cms/
StaticWebPath  /cms/mt-static/
StaticFilePath /var/www/program/public/cms/mt-static

#======== DATABASE SETTINGS ==========

ObjectDriver DBI::mysql
Database mt_test
DBUser mt_test
DBPassword mt_test
DBHost localhost

#======== MAIL =======================
EmailAddressMain aaa@example.com
MailTransfer sendmail
SendMailPath /usr/lib/sendmail
    
DefaultLanguage ja

ImageDriver ImageMagick
```

###### ログイン

MTの管理画面が表示されたら完了。
なんかMTで記事作ったら、
http://example.com/test/2017/02/index.html とかにそういうHTMLファイルが入ってくるような感じ。
あとはよしなに。
WebApp on Linux でビルトインのコンテナ使った場合に apache 側で http to https リダイレクトする

## 結論

.htaccess に以下の内容を書けばOK

```.htaccess
RewriteEngine On
RewriteCond %{HTTP:X-ARR-SSL} ^$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
```

## 補足

- WebApp on Linux では IIS ARR が Front で、apache がアプリケーションコンテナ側で動いている  
- IIS ARR を経由すると、HTTP Header にいくつかの情報が付加される  
- [MS の ARR の概要](https://technet.microsoft.com/ja-jp/library/ee886279.aspx) を読むと通常の IIS では SSL オフロードがデフォルト有効で、WebApp を検証した限りでも IIS と apache 間は HTTP でやりとりされている模様

## 最後に
コンテナの中身次第になるので本来は `Web.config` で書くのがよい気がしますが、ググってたどり着くやり方では動かず、よくわかりませんでした。
ご存じの方いらっしゃいましたらぜひ教えてください。
Gemのふわっとした捉え方 - ソウルジェム 編

<br>さきほどふわっと理解したGemの話を文系の仲間に伝えようと思う。

## Gemって、ソウルジェム？

Gemってのは、あれだ。[ソウルジェム](http://dic.pixiv.net/a/%E3%82%BD%E3%82%A6%E3%83%AB%E3%82%B8%E3%82%A7%E3%83%A0)のジェムだ。
ソウルジェムは、ソウルを入れる箱だ。

## Gemって、ライブラリジェム？
rubyにもGemって出てくるでしょう。あれも、ただの箱だ。
Gemは箱なんだって。

まどマギでは、ジェムにソウルを入れて、穢れがっ！( ﾟдﾟ)ﾊｯ
って感じでしょ。

rubyでは、ジェムにライブラリを入れて、使いやすいっ！( ﾟдﾟ)ﾊｯ
って感じ。

ライブラリがいっぱい入った箱、それがGemだ。

つまり、ソウルジェム風に言うと、ライブラリジェムだ。
ライブラリジェム、略して、カッコよくして、Gemだ。


## 感想
何言ってるか書いてる途中でわからんくなったが、文系の仲間がGemについてふわっと理解することの一助になることに特化した記事なので、いいんだ。
Watson IoT Platform - IoTダッシュボードを作ってみる

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。
IoTデータを可視化するダッシュボードを作ってみます。
だいたいこんな感じを目指します。
![スクリーンショット 2017-02-15 11.48.23.png](https://qiita-image-store.s3.amazonaws.com/0/125842/882070c3-1a41-61ca-86b1-641badf3bce0.png)

#画面の枠を準備
1. [ダッシュボードの枠を準備](http://qiita.com/egplnt/items/62b6072cf1267c2f400d)
2. [DB読み取り要求を送付する画面を準備](http://qiita.com/egplnt/items/5cb30118e56cb215d3eb)
3. [DBから取得したIoTデータを表示する](http://qiita.com/egplnt/items/e93eea7fed4ed52d64e4)
4. [デバイスからのIoTデータをリアルタイムで表示](http://qiita.com/egplnt/items/c157653ef3f45f996383)
5. [背景画を追加](http://qiita.com/egplnt/items/a6691bbbe09c8451f1ee)
6. [センサーをdrag&dropで追加しリアルタイム値に応じて色を変化](http://qiita.com/egplnt/items/65304fffebb82bba840f)
7. [スマホ向けに出します](http://qiita.com/egplnt/items/d9492a22fe51a51c9fb6)
cssで下線アニメ―ション時、IEで下線が親要素をはみ出す

要素にマウスオーバーした際に、下線がビョ～ンてなるアニメーションを、センターから広がるように実装してたのだけど、
IEの時にアニメーション中に
下線が親要素を突き抜けてから親要素の100%幅に収まる、
という謎挙動をしてしまった

#問題のおきたコード
```sass
a{
  display:inline-block;
  position:relative;
  height:50px;

  &:after{
  content: "";
  width: 0; /* 初めはゼロ */
  height: 2px; /*2pxの高さの*/
  background-color: #f00; /*赤背景*/
  position: absolute;
  bottom: -2px;
  left: 50%;　/*relative要素を起点に左に50%*/
  transition: .3s;
  transform: translate(-50%, 0); /*要素を左に半分ズラす*/

  &:hover{
    &:after{
      width:100%;　/* 0.3sかけて100%になる */
    }
  }
}
```

:after疑似要素を border使わず、中央揃えも position:absoluteしてtransform を使うなど、複合的な要因でIEで起きる例かもしれません。
margin:0 auto で中央揃えというのもあるのですが、
bottom の位置を調整したかったので上記の実装になりました。

#解決
謎挙動を解決するには、
width: 0 → width: 100%
width: **0%** → width: 100%

と単位を揃えることで解決しました。
scaleなどを使って拡大したほうが確実かもしれません

参考：[CSS で underline に animation をつける](http://qiita.com/bouzuya/items/cacdab4f9989efe245ca#_reference-ee9ce696ecb075bcb93b)
Network > Link > 誤り検知 > BCC(Block Checking Character)

RS-232C通信など、通信において文字化けやパケットロスが発生した場合のエラー検知を検討している。

その中で、キーワードとなるのが**BCC(Block Checking Character)**。

### BCCの定義

BCCの定義について良さそうな資料は以下。

福福電子工房さん
http://www.fukufukudenshi.jp/v2/RS-232C/#Step15

LINEEYE. CO. LTD
http://www.lineeye.co.jp/html/term_ayamari.html

Chiaki Komiyaさん
http://www5e.biglobe.ne.jp/~komichan/network/n1_CRC.html

BCCは「水平パリティ」特有の用語なのか、「サムチェック」「巡回符号(CRC)」にも関連するのかは、それぞれの説明で扱いが違うように思う。この点は未消化。

### `<ETX>`をBCCに含めるか

http://stackoverflow.com/questions/891664/calculate-block-check-character-bcc-for-serial-communication
>  it must be performed over all chars. excluding the STX and ETX.

http://stackoverflow.com/questions/1406974/function-to-calculate-block-check-characterbcc-in-c-sharp
> From what I know is that BCC is XOR of all the bytes in a given byte stream excluding the first SOH or STX till first ETX or EOT. ETX is included in the BCC.

`<ETX>`を{含める/含めない}についても異なる意見がある。
【Android】マルチウインドウ環境でのウインドウサイズの取得

# この記事について
Android N のマルチウインドウ環境で、ウインドウサイズを取得するとどのような値が返ってくるかについて説明します。

具体的には次の API の返す値を調査しました。

- getActivity().getWindowManager().getDefaultDisplay().getSize(out);
  - 以下、Display.getSize() と記載します。
- getActivity().getWindowManager().getDefaultDisplay().getRealSize(out);
  - 以下、Display.getRealSize() と記載します。

これらの API Reference は次の通りです。

- [Display.getSize()](https://developer.android.com/reference/android/view/Display.html#getSize(android.graphics.Point))
- [Display.getRealSize()](https://developer.android.com/reference/android/view/Display.html#getRealSize(android.graphics.Point))

# 結論
- Display.getSize()
  - マルチウインドウ状況に応じたウインドウサイズが取得できる
  - 非マルチウインドウではステータスバーのサイズが含まれている一方、マルチウインドウ状況ではこれが含まれない
- Display.getRealSize()
  - マルチウインドウ状況に影響をうけず端末のディスプレイサイズが取得できる

# 条件
## 環境
- 機種：Nexus 6P
- OS：Android 7.1.1
- 端末のディスプレイサイズ：2560 x 1440

## コード
それぞれの API の値を画面に表示するアプリを作りました。
https://github.com/hshiozawa/MultiWindowLifecycleTester


表示部分のコードは次の Java ファイル内にあります。
https://github.com/hshiozawa/MultiWindowLifecycleTester/blob/master/app/src/main/java/com/hjm/multiwindowtester/fragment/BaseFragment.java

__補足__
マルチウインドウ状況でのこれらの値を取得するためには、onMultiWindowModeChanged() で値を取得したほうがよさそうです。通常の Fragment のライフルサイクル上では、マルチウインドウの状況が正しく取得出来ないケースがあります。
ref: https://commonsware.com/blog/2016/06/07/isinmultiwindowmode-race-condition.html



# 結果
## 非マルチウインドウ環境
### ポートレイト
非マルチウインドウのポートレイトでは各 API のサイズは次のようになりました。

- getSize()：w=1440, h=2392（赤枠）
- getRealSize(), w=1440, h=2560（緑枠）

<img src='https://qiita-image-store.s3.amazonaws.com/0/41604/b53311a0-71d2-43c8-8c6c-46c906117ef1.jpeg' width=400>

### ランドスケープ
非マルチウインドウのランドスケープでは各 API のサイズは次のようになりました。

- getSize()：w=2392, h=1440（赤枠）
- getRealSize(), w=2560, h=1440（緑枠）

<img src='https://qiita-image-store.s3.amazonaws.com/0/41604/ea6dc948-eb79-bd39-60f9-37cb7aa12c94.jpeg' width=800>

## マルチウインドウ環境
### ポートレイト・ウインドウ上部
マルチウインドウのポートレイトで、上部にウインドウを表示した場合、各 API のサイズは次のようになりました。

- getSize()：w=1439, h=1134（赤枠）
- getRealSize(), w=1440, h=2560（緑枠）

<img src='https://qiita-image-store.s3.amazonaws.com/0/41604/ca0b098e-9a13-1efa-9b87-7a5dc21f04af.jpeg' width=400>

### ポートレイト・ウインドウ下部
マルチウインドウのポートレイトで、下部にウインドウを表示した場合、各 API のサイズは次のようになりました。

- getSize()：w=1439, h=1134（赤枠）
- getRealSize(), w=1440, h=2560（緑枠）

<img src='https://qiita-image-store.s3.amazonaws.com/0/41604/3d9c4528-60ff-1ecc-9206-3d85b4f8082a.jpeg' width=400>


### ランドスケープ・ウインドウ右側
マルチウインドウのランドスケープで、右側にウインドウを表示した場合、各 API のサイズは次のようになりました。

- getSize()：w=1176, h=1355（赤枠）
- getRealSize(), w=2560, h=1440（緑枠）

<img src='https://qiita-image-store.s3.amazonaws.com/0/41604/3f95722b-96bf-b1a4-83e0-ee1a5d697a6f.jpeg' width=800>


### ランドスケープ・ウインドウ左側
マルチウインドウのランドスケープで、左側にウインドウを表示した場合、各 API のサイズは次のようになりました。

- getSize()：w=1176, h=1355（赤枠）
- getRealSize(), w=2560, h=1440（緑枠）

<img src='https://qiita-image-store.s3.amazonaws.com/0/41604/7ea710c8-fec7-73d6-4584-db464b6c9237.jpeg' width=800>
Qiitaの「いいね」を「すごーい！」に変える

# すごーい！
Qiitaのいいねをすごーい！に変えるChrome拡張を作りました！
![スクリーンショット 2017-02-15 10.58.04.png](https://qiita-image-store.s3.amazonaws.com/0/113692/457ce1e1-d81b-ae7f-bac8-94b2a4335d3f.png)

コメントも変わってる！ふしぎー
![スクリーンショット 2017-02-15 11.03.35.png](https://qiita-image-store.s3.amazonaws.com/0/113692/e1475f4f-b6c7-3d38-30f3-f06befced525.png)

# ふしぎー
これで変わるんだって。ふしぎー

```css:sugoi.css
.LikeButton > .p-button::after {
    content: "すごーい！";
}

.LikeButton > .p-button > span:not(.fa) {
    display: none;
}

.itemsShowHeaderStock_statusList > li:first-child > .itemsShowHeaderStock_countText::after{
  content: "すごーい！";
  font-size: 12px;
}

.itemsShowHeaderStock_statusList > li:first-child > .itemsShowHeaderStock_countText{
  font-size: 0px;
}

.LikeLabel__text::after {
    content: "すごーい！";
    font-size: 16px;
}

.LikeLabel__text {
    font-size: 0;
}
```

# 使い方だよ(mac)
- git cloneする

```zsh
$ git clone https://github.com/xsota/qiita-sugoi.git
```
- chrome起動
- ⌘+, で設定を開く
- 拡張機能を選択
- デベロッパーモードにチェックをいれる
- パッケージ化されていない拡張機能を読み込む
- さっきcloneしたディレクトリを選択
- すごーい！


# おわり
GitHub
https://github.com/xsota/qiita-sugoi

参考
http://qiita.com/kubosho_/items/9751e18e743360b522ad
Vagrant/CentOS7でのディスク拡張

Vagrant上のCentOS7のディスク容量の際、一手間かかったのでメモ。

参考。
http://qiita.com/koitaro/items/c8bf8eb1e67e78890a5c

Vagrantから起動してログイン、確認。

```
[root@localhost vagrant]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root   8.3G  2.0G  6.4G   24% /
devtmpfs                  911M     0  911M    0% /dev
tmpfs                     921M     0  921M    0% /dev/shm
tmpfs                     921M  8.3M  912M    1% /run
tmpfs                     921M     0  921M    0% /sys/fs/cgroup
/dev/sda1                 497M  164M  334M   33% /boot
none                      931G  212G  719G   23% /vagrant
tmpfs                     185M     0  185M    0% /run/user/1000
```

```
[root@localhost vagrant]# lvextend -l +100%FREE /dev/mapper/centos-root
  Size of logical volume centos/root changed from 8.26 GiB (2114 extents) to 18.53 GiB (4744 extents).
  Logical volume root successfully resized.
```

```
[root@localhost vagrant]# xfs_growfs /dev/mapper/centos-root
meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=541184 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=2164736, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2164736 to 4857856
```

無事に拡がりました。

```
[root@localhost vagrant]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root    19G  2.0G   17G   11% /
devtmpfs                  911M     0  911M    0% /dev
tmpfs                     921M     0  921M    0% /dev/shm
tmpfs                     921M  8.3M  912M    1% /run
tmpfs                     921M     0  921M    0% /sys/fs/cgroup
/dev/sda1                 497M  164M  334M   33% /boot
none                      931G  212G  719G   23% /vagrant
tmpfs                     185M     0  185M    0% /run/user/1000
```

参考：
http://qiita.com/fetaro/items/d7dc74262633ba474bc8
バレンタインなのでStanで絵を描いた

こちら、LOVE Equationです。理系のカップルが送ったりするそうです。

```{math}
x^2 + \left(y - \sqrt[3]{x^2}\right)^2 = 1
```


僕も、Stanで描いてみました。

```{cpp:heart.stan}
data {
  real<lower=0> lambda;
}

parameters {
  real x;
  real y;
}

model {
  target += -lambda*(x^2.0 + (y - (x^2.0)^(1.0/3.0))^2.0 - 1)^2;
}
```

```{r:heart.R}
library(rstan)
library(ggplot2)

pars <- c("x", "y")
warmup <- 1000
iter <- 3000
seed <- 87
chains <- 4
src <- "heart.stan"
lambda <- 100

basefit <- stan(file = src, 
                data = list(lambda = lambda), pars = pars,
                seed = seed, chains = chains,
                warmup = warmup, iter = iter, verbose = FALSE)


d <- NULL
for (lambda in c(1, 10, 100, 1000))
{
  fit <- stan(fit = basefit,
              data = list(lambda = lambda), pars = pars,
              seed = seed, chains = chains,
              warmup = warmup, iter = iter, verbose = FALSE)
  tmp <- as.data.frame(fit)
  tmp$lambda <- lambda
  d <- rbind(d, tmp)
}


ggplot(d, aes(x, y)) + 
  geom_point(color = "red") + 
  facet_wrap(~lambda) + coord_fixed() + theme_bw()
```

![Rplot03.png](https://qiita-image-store.s3.amazonaws.com/0/80588/af1c1964-141a-4e2c-1768-9abe899ccda4.png)
Digdagからsh>でEmbulk起動時にプラグインバージョンを固定(ローカルgemなし版)

ローカルgemファイル(自作プラグイン等)を含まない場合はbundle機能を使うのが正式かと思う

```
$ embulk --version
embulk 0.8.16
$ digdag version
2017-02-15 11:11:19 +0900: Digdag v0.9.4
Client version: 0.9.4
Server version: 0.9.4
$ cd digdagtest1
$ mkdir embulk_bundle
$ vi embulk_bundle/Gemfile
$ cat embulk_bundle/Gemfile
source 'https://rubygems.org/'
gem 'embulk-input-td',  '= 0.1.0' # 範囲指定も出来る
gem 'embulk-output-td', '= 0.3.12'
$ cat embulk_gem_install.sh
mkdir -p /digsv_nfs/embulk_bundle/digdagtest1
cp -r embulk_bundle/Gemfile /digsv_nfs/embulk_bundle/digdagtest1
cd /digsv_nfs/embulk_bundle/digdagtest1
/usr/local/bin/embulk bundle --path .
$ cat a.dig
+embulk_gem_install:
  sh>: embulk_gem_install.sh
+task1:
  sh>: /usr/local/bin/embulk run --bundle /digsv_nfs/embulk_bundle/digdagtest1 task1.yml.liquid
```

以上をDigdagサーバにpushして実行すると
Digdagサーバ間で共有しているNFSディレクトリにEmbulkプラグインをインストールする
(同じDigdagサーバにpushされた他プロジェクトとGemfileを上書きし合わないようにプロジェクト名のサブディレクトリを切っている)
実行の度にembulk bundleが実行されるが許容する

NFSディレクトリにインストールする理由
---------------------------------

複数サーバでプラグインを共有するため
embulk bundleが1号機で実行されてembulk runが2号機で実行されても大丈夫 → [NFSの必要性](http://qiita.com/pilot/items/69cbae56d85a443fb623#nfs%E3%81%AE%E5%BF%85%E8%A6%81%E6%80%A7)の理由1

サーバが1台ならホームディレクトリにインストールしても良い(bundle時の--pathを取る)
その場合、複数プロジェクトから同一プラグインの同一バージョンは共用される
また、複数プロジェクトから同一プラグインのバージョン違いがインストールされても自プロジェクトのGemfileに記載されたバージョンが使用される

pushサイズ制限
-------------

クライアントでdigdagプロジェクトディレクトリ内にインストールしてからpushすることも試したが、プラグイン数が多い(7個とか)場合にpushサイズ制限にひっかかった

```
error: Status code 400: {"message":"Size of the uploaded archive file exceeds limit (2097152 bytes)","status":400}
$ du -sh embulk_bundle
21M     embulk_bundle/
```

事前インストール
--------------

dig内でembulk bundleしてるが、Digdagサーバに入る権限があれば事前にDigdagサーバ上でembulk bundleしておけば良い
各サーバ上で作業すればNFSディレクトリにインストールする必要もない(ホームディレクトリとか)

ローカルgemがある場合
-------------------

[別記事](http://qiita.com/pilot/items/78b15cc98d6fd88d8896)にて
php 5.2.17をCentOS7,Ubuntu16.04でビルド

[CentOS7にphp5.2をインストール - blog.youyo.info](http://blog.youyo.info/post/2016/02/10/php52-centos7/)の記事に感謝。

* https://github.com/tukiyo/mysql4.0php5.2

## CentOS7

* いくつかハマりポイントがあったので乗り越えた。
    * libmcyptのインストール (epel)
    * configureオプション 64bit対応
    * configureオプション apxsのpath
    * gmp.patch へのパッチ (手修正だったのでpatch化)
    * php_functions.patch へのパッチ (手修正だったのでpatch化、同名のファイルが2つありどちらなのかという件。)

```sh:build
docker build . --no-cache=false -f Dockerfile.centos7
```

## ubuntu

* phpのconfigureに`--with-libdir=/lib/x86_64-linux-gnu`を発見するのに苦労した。
    * [Ubuntu16.04でmysql4.0.30ビルド - Qiita](http://qiita.com/tukiyo3/items/bb82590f28ba4672f0dd)
    * [How to install PHP 5.3 and 5.2 together on Ubuntu 12.04 :: Change(b)log](http://zgadzaj.com/how-to-install-php-53-and-52-together-on-ubuntu-1204)


## mysqld初期設定

* [Ubuntu16.04でmysql4.0.30ビルド - Qiita](http://qiita.com/tukiyo3/items/bb82590f28ba4672f0dd)

```sh:初期設定
cd /opt/mysql
# mysqlユーザー、グループ作成
sudo adduser --system --group mysql --home /opt/mysql
sudo mkdir /opt/mysql/var/
sudo chown -R mysql:mysql /opt/mysql
#
sudo -u mysql ./mysqld_safe
sudo -u mysql ./mysql_install_db
# mysqld起動
sudo -u mysql /opt/mysql/bin/mysqld_safe &
```

```sh:接続
alias mysql='/opt/mysql/bin/mysql -uroot --default-character-set=sjis'
mysql test
```
Safariでinline-blockの幅が足りず改行されるバグ?

Safari、iOSのSafariでのみ、inline-blockで幅が足りずに文字が一文字ほど改行されてしまうことがある。

![画面キャプチャ](http://img.tvbok.com/g/2017-02/iphone6-02.png)

#原因
結論からいうと font-feature-settings: "palt" を指定してあると起こる

参考：[iPhone6 で inline-block が勝手に改行されちゃう場合のチェックポイント](http://web.tvbok.com/web/css/iphone_inline-block.html)

#解決
+ 諦めて font-feature-settings: "pkna" と指定する
+ 諦めて widthを指定する

参考サイトによると
>iPhoneはクソ。もしくはsafari はクソ。
>font-feature-settings:"palt"; はクソ。

とのことです。

##補足
要素に width: max-content を指定すると直るという事例もあるようだが、上記の場合改善しなかった
参考：[`display: inline-block`で最後の文字だけ落ちてしまう問題](http://qiita.com/eturlt/items/a7a4418906d15b0569c7)

max-content で改善しなかった場合の参考まで。
Powershellでfirewallのremoteipアドレスを設定する


````
$rc=0
$inifile="c:\work/list.ini"
$rule="Windows Remote Management (HTTPS-In)"


Write-Output "

処理開始

---------------------
"

if (Test-Path $inifile) {
    Write-Host $inifile is found!
} else {
    Write-Host $inifile is not found!
    $rc=1
    exit $rc
}

if (-not(Get-NetFirewallRule | Where-Object DisplayName -eq $rule)) {
    Write-Host firewall rule is not found!
    $rc=1
    exit $rc
} else {
    Write-Host firewall rule is found!
}

$remoteip=Get-NetFirewallRule | Where-Object DisplayName -eq $rule | Get-NetFirewallAddressFilter  | Select-Object RemoteAddress
$currentip=$remoteip.RemoteAddress | Sort-Object
$newip=Get-Content $inifile | Sort-Object
$diff=Compare-Object $currentip $newip

if($null -eq $diff){
    Write-Output '
    
    no difference
    
    ' 
}
else{
    Write-Output $diff 
}

$title = "実行確認"
$message = "実行してよろしいですか？"
$objYes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes","YES"
$objNo = New-Object System.Management.Automation.Host.ChoiceDescription "&No","NO"
$objOptions = [System.Management.Automation.Host.ChoiceDescription[]]($objYes, $objNo)
$resultVal = $host.ui.PromptForChoice($title, $message, $objOptions, 1)
if ($resultVal -ne 0) { exit }

Get-NetFirewallRule -Enabled True | Where-Object {$_.DisplayName -eq $rule} | Set-NetFirewallRule -RemoteAddress $newip

Write-Output "


--------------result--------------


"
$currentip

write-host END
A-FrameをIE11に対応させる方法

MozillaのWebVRフレームワークA-FrameはInternet Explorer上でそのままでは実行できませんが、以下の関数をa-sceneタグより前で実行することでInternet Explorer11上で実行することができます。
(IE10以下は[WebGLに対応していない](http://caniuse.com/#feat=webgl)のでどうにもなりません)

```
function PolyfillIE(){
  if ( typeof window.CustomEvent === "function" ) return false;
  
  function CustomEvent ( event, params ) {
    params = params || { bubbles: false, cancelable: false, detail: undefined };
    var evt = document.createEvent( 'CustomEvent' );
    evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
    return evt;
  }
  CustomEvent.prototype = window.Event.prototype;
      
  window.CustomEvent = CustomEvent;
}
```

参考：https://github.com/aframevr/aframe/issues/1475
Windows 10 > Link > プリンタ > このプリンターを通常使うプリンターに設定すると、Windowsは通常使うプリンターの管理を停止します。 > の意味

```txt:動作環境
Windows 10 Pro (64bit) Anniversary Update適用済
```

プリンタドライバをインストールして「通常使うプリンター」に設定しようとしたら、以下のダイアログが表示された。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/47119f33-70cd-cd72-9e21-ac177b69fc29.png)

どういう意味かは、以下のリンク先の回答で理解しました。

https://answers.microsoft.com/ja-jp/windows/forum/windows_10-hardware/windows-10/13009e29-c926-4b26-9925-bb8e70ad1ce6?auth=1
左利きがWindowsからMacへTeamviewer接続するときに設定するとよいautohotkey設定


表題のような、極めてマニアックな状況において便利です！

```
#IfWinActive ahk_class TV_CClientWindowClass

^Ins::Send, {LWin down}c{LWin up} ;左利きコピー
+Ins::Send, {LWin down}v{LWin up} ;左利き張り付き
+Del::Send, {LWin down}x{LWin up} ;左利き切り取り

^s::Send, {LWin down}s{LWin up} ;保存
^z::Send, {LWin down}z{LWin up} ;undo
^y::Send, {LWin down}y{LWin up} ;redo ?

vkF3sc029::Send, ^+{Space} ;半角/全角切り替え
vkF4sc029::Send, ^+{Space} ;半角/全角切り替え

#IfWinActive

```

Autohotkey
https://autohotkey.com/
Xcode 不使用リソースを抽出する

長いことプロジェクトをやっていると、削除し忘れたクラスや画像が埋もれていきます。
そんなunusedな、unreferencedなリソースを見つけ出して、プロジェクトを大掃除しましょう！

# 準備

xcodeutilsをクローン
https://github.com/arun80/xcodeutils

# スクリプトを叩く

`sh ./find-unused-resources.sh path-to-project > report-name`

* pathは、`.xcodeproj`ファイルがあるディレクトリを指定する
* レポートはHTML形式で出力されるので、`.html`とか付けておく

# 結果

結構出てきた。ほんとにこんなに使ってないのか……？

<img src="https://qiita-image-store.s3.amazonaws.com/0/75329/b0f0d97a-945a-9b43-773f-92368bbcb946.png" alt="result" width=400>

……ほんと？？

Swiftも混ざったプロジェクトなんだけど、
Swiftには対応してないのかな？ どうなのかな？

# まとめ

* 画像リソースでおよそ3MB分使っていないものがあるようなので、削除してみる
* Swift化を進めてきたが、削除し忘れのObjective-Cクラスがいくつもあったので削除する

さ、みなさんも大掃除！！

# その後……

作業してみると、このスクリプトでは、コードからの参照についてはチェックしていないことがわかりました！！
つまり、 `let image = UIImage(named: "image_name")`というような記述はチェックしていないようです……。
ファイルを削除する前に、プロジェクト全体にファイル名のテキストサーチをかけて、本当に使用していないか（= xcodeprojからのみ参照されていること）を確認してから、削除するのが良いでしょう。
認証トークンをCookieに保存するのは卒業しよう

Webアプリケーションの認証トークン（セッション）はCookieヘッダで送信するのが一般的だとは思いますが、
そろそろこのCookieに依存した方法は負の遺産ではないでしょうか？

認証トークンの送信はRFC 7235で規定されている`Authorization`ヘッダを使うと良いです。Basic認証とかDigest認証で使うやつですね。
実は`Basic`や`Digest`の他にRFC 6750で`Bearer`というスキームが登録されています。単一の文字列を認証情報として送信するためのスキームで、トークンを送信するのにピッタリです。

```
Authorization: Bearer <token>
```

参考: [トークンを利用した認証・認可 API を実装するとき Authorization: Bearer ヘッダを使っていいのか調べた](http://qiita.com/uasi/items/cfb60588daa18c2ec6f5)

その場合は、認証トークンはCookieではなくlocalStrage（またはsessionStorage）に保存することになると思います。
既に十分普及している仕様ですので、今後はこちらをスタンダードにしていきたいですね。

# なぜ？
APIサーバとの相性が良いから。

[APIサーバを立てるためのCORS設定決定版](http://qiita.com/hirohero/items/886733f50f37404235db)では触れませんでしたが、
コメントで指摘してもらったとおり、"Credential"な情報を扱うためには`Access-Control-Allow-Credentials: true`の指定が必要になります。Cookieを送信する場合はこの"Credential"な情報を扱う場合に該当します。
その場合の制限として`Access-Control-Allow-Origin: *`が使えなくなります。何かしらのOrigin URLを指定する必要があります。

しかしながら、`Authorization: Bearer`で認証トークンを送信する場合は、この制限に引っかかりませんので、`Access-Control-Allow-Credentials: true`は不要になり、Originの設定も必要なくなります。

# （APIサーバにとって）Access-Control-Allow-Origin設定は必要か？
**お断り: 以下の内容はあくまでも個人の見解です。**

APIサーバの観点から見ると不要ではないか？　と考えています。

そもそもSOP制約はクライアント（ブラウザ）側のセキュリティを守るためのものであって、第三者によって仕込まれたスクリプトなどが（本人から見て気が付かないうちに）別のサーバに送信されてしまうのを防ぐのが目的だったはずです。
（とはいえ回避策が溢れているので、もはや形骸化しているような気がしますが。）

サーバ側から見ると、クライアントから送られてきたリクエストは常に認証・validateしなければならないわけで、SOPは関係ないはずです。
ちゃんとクライアントを認証したいのであれば、IPアドレスではじくとか、トークンの検証[^1]を行うとか、ちゃんとした手段で認証するべきです。
[^1]: 存在性・有効性チェックは当然として、IPチェックによるセッションハイジャック対策も含みます。

有効性が怪しく、半ば形骸化しているセキュリティ機構を使って、セキュリティが向上したと思い込んでしまう方が危険かな？　と思うので、そういうのは避けたいところです。
それを理解した上で、お作法として`Access-Control-Allow-Origin`を指定するのは良いとは思います。
自分用コマンドメモ

## ログイン中のユーザー確認
```
$ w
 10:19:13 up 2219 days, 13:53, 22 users,  load average: 0.00, 0.01, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
user1  pts/6    153.231.215.8    25Jan17 19days  0.01s  0.01s -bash
user2  pts/8    123.123.123.234   Mon18   15:46m  0.15s  0.00s -bash
user3  pts/10   :pts/34:S.0      08:50    3days  0.17s  0.17s /bin/bash
user4  pts/14   222.111.123.123    25Jan17 15:16m 25:36   4.11s command-hoge
user5  pts/15   :pts/34:S.1      08:50    3days  0.07s  1:05m command-hoge

表示項目
・ユーザ名
・端末名
・接続元IPアドレス
・ログイン時刻
・ユーザが操作を行っていないアイドル時間
・ユーザが実行したプロセスがCPUを使用した時間
・カレントプロセスが使用したCPU時間
・ユーザが現在実行しているプロセス
```


## ログイン中の自分のIP確認
```
who am i | cut -d '(' -f 2 | sed -e 's/)//g'
```

## 依存関係を調べる
```
rpm -q --whatrequires git
```


## ファイル／ディレクトリの圧縮・解凍
### gzipはファイルを操作する
```
# 使用例
# 圧縮
$ gzip file
# 解凍
$ gzip -d file.gz
```

### tarはファイルとディレクトリが操作できる
```
# 使用例
# gzip圧縮してアーカイブを作成する
$ tar zcfp archive.tar.gz dir
# gzip圧縮したアーカイブを展開する
$ tar zxfp archive.tar.gz
```
My Alexa の知見3 Deregistering my device

#はじめに
この投稿は私がラズパイで自作Alexaを開発した知見を投稿するシリーズです。
同じ現象に当たった時の助けになればいいなと思ったので、始めることにしました。

#ちょっとしたこと
<img width="1319" alt="スクリーンショット 2017-02-15 9.21.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/63805e11-095d-a935-6d63-0977266d476e.png">

<img width="1303" alt="スクリーンショット 2017-02-15 9.21.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/4b792d7e-87e6-8265-9031-6426efc407a1.png">

Alexa と戯れたり、自分でデバイスを作ったりすると、[Alexa App](https://itunes.apple.com/us/app/amazon-alexa/id944011620?mt=8) に見えます。（画像はブラウザで見たもの）

デバイスが見えるのはいいのですが。。。。

**デバイスを削除する項目がない！！！！** 

> 本物の（といったらおかしいですが） Amazon Echo、Amazon dot など、Amazon 純正のデバイスは alexa app から解除できます。

Amazon Echoを選択したところ

<img width="999" alt="スクリーンショット 2017-02-15 15.31.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/c7a84b57-c4c8-29e3-9713-ca8d0bf307b9.png">

。。。安心してください。デバイスの登録は解除できます。

# やり方
1. Amazon.comのページにいって、

<img width="1515" alt="スクリーンショット 2017-02-15 9.25.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/b0041baf-1f54-c63d-2b5d-6d0c1bb5217e.png">

2. Manage Your Content and Devicesを開き、

<img width="1540" alt="スクリーンショット 2017-02-15 9.25.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/9c77a808-7c45-255e-b1f7-e74d8d295622.png">
. Amazon.comのページにいって、

3. デバイスタブを見ると、

<img width="1521" alt="スクリーンショット 2017-02-15 9.25.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/fbfb4360-1a77-988a-dc02-99f15ce3e8c2.png">

出てきましたね。登録したデバイスが。

ちなみに、amazon.co.jpのアカウントでは、Kindleしか表示されません。


4. 各デバイスの一番左のボタンをクリックすると。。

<img width="1530" alt="スクリーンショット 2017-02-15 9.25.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/cff01e93-7908-242b-2465-a35a381e5f87.png">

ありましたね。**Deregister** の文字。

Deregisterをクリックすると、alexa app 側でも登録が解除されています。


#ここまでの道のり
ラズパイにalexa入れて遊びまくっていたら、いつのまにかalexa app にデバイスが増えて、管理できなくなってたんですね。途中で[こんな現象](http://qiita.com/haruharuharuby/items/65b492c16ef9985629ab)にもハマって、一旦クリーンにしようと思ったのがきっかけです。

deviceやスキルの登録は、developer.amazon.com でする。 
amazon.comは、developer.amazon.comで作成したセキュリティプロファイルへのアクセスを認可する機構なので、amazon.com 側にデバイスのコピーがあるんじゃないかと疑って探しだしたのが始まり。

この仮説は見事に当たり、一度きれいさっぱり、alexa app を掃除することができました。